@livestore/common 0.0.58-dev.6 → 0.0.58-dev.8

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 (117) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/adapter-types.d.ts +29 -3
  3. package/dist/adapter-types.d.ts.map +1 -1
  4. package/dist/adapter-types.js +5 -0
  5. package/dist/adapter-types.js.map +1 -1
  6. package/dist/debug-info.d.ts +8 -8
  7. package/dist/derived-mutations.d.ts +4 -4
  8. package/dist/derived-mutations.d.ts.map +1 -1
  9. package/dist/derived-mutations.test.js +1 -0
  10. package/dist/derived-mutations.test.js.map +1 -1
  11. package/dist/devtools/devtools-bridge.d.ts +1 -1
  12. package/dist/devtools/devtools-bridge.d.ts.map +1 -1
  13. package/dist/devtools/devtools-messages.d.ts +99 -21
  14. package/dist/devtools/devtools-messages.d.ts.map +1 -1
  15. package/dist/devtools/devtools-messages.js +13 -4
  16. package/dist/devtools/devtools-messages.js.map +1 -1
  17. package/dist/devtools/index.d.ts +1 -0
  18. package/dist/devtools/index.d.ts.map +1 -1
  19. package/dist/devtools/index.js +2 -0
  20. package/dist/devtools/index.js.map +1 -1
  21. package/dist/rehydrate-from-mutationlog.d.ts.map +1 -1
  22. package/dist/rehydrate-from-mutationlog.js +11 -5
  23. package/dist/rehydrate-from-mutationlog.js.map +1 -1
  24. package/dist/schema/mutations.d.ts +137 -18
  25. package/dist/schema/mutations.d.ts.map +1 -1
  26. package/dist/schema/mutations.js +41 -16
  27. package/dist/schema/mutations.js.map +1 -1
  28. package/dist/schema/system-tables.d.ts +121 -8
  29. package/dist/schema/system-tables.d.ts.map +1 -1
  30. package/dist/schema/system-tables.js +22 -8
  31. package/dist/schema/system-tables.js.map +1 -1
  32. package/dist/schema/table-def.d.ts +1 -1
  33. package/dist/schema-management/migrations.js +1 -1
  34. package/dist/schema-management/migrations.js.map +1 -1
  35. package/dist/sql-queries/types.d.ts +1 -1
  36. package/dist/sql-queries/types.d.ts.map +1 -1
  37. package/dist/sync/next/compact-events.d.ts +15 -0
  38. package/dist/sync/next/compact-events.d.ts.map +1 -0
  39. package/dist/sync/next/compact-events.js +176 -0
  40. package/dist/sync/next/compact-events.js.map +1 -0
  41. package/dist/sync/next/facts.d.ts +37 -0
  42. package/dist/sync/next/facts.d.ts.map +1 -0
  43. package/dist/sync/next/facts.js +155 -0
  44. package/dist/sync/next/facts.js.map +1 -0
  45. package/dist/sync/next/graphology.d.ts +8 -0
  46. package/dist/sync/next/graphology.d.ts.map +1 -0
  47. package/dist/sync/next/graphology.js +36 -0
  48. package/dist/sync/next/graphology.js.map +1 -0
  49. package/dist/sync/next/graphology_.d.ts +3 -0
  50. package/dist/sync/next/graphology_.d.ts.map +1 -0
  51. package/dist/sync/next/graphology_.js +3 -0
  52. package/dist/sync/next/graphology_.js.map +1 -0
  53. package/dist/sync/next/history-dag.d.ts +30 -0
  54. package/dist/sync/next/history-dag.d.ts.map +1 -0
  55. package/dist/sync/next/history-dag.js +69 -0
  56. package/dist/sync/next/history-dag.js.map +1 -0
  57. package/dist/sync/next/mod.d.ts +5 -0
  58. package/dist/sync/next/mod.d.ts.map +1 -0
  59. package/dist/sync/next/mod.js +5 -0
  60. package/dist/sync/next/mod.js.map +1 -0
  61. package/dist/sync/next/mutation-fixtures.d.ts +73 -0
  62. package/dist/sync/next/mutation-fixtures.d.ts.map +1 -0
  63. package/dist/sync/next/mutation-fixtures.js +160 -0
  64. package/dist/sync/next/mutation-fixtures.js.map +1 -0
  65. package/dist/sync/next/rebase-events.d.ts +27 -0
  66. package/dist/sync/next/rebase-events.d.ts.map +1 -0
  67. package/dist/sync/next/rebase-events.js +41 -0
  68. package/dist/sync/next/rebase-events.js.map +1 -0
  69. package/dist/sync/next/test/compact-events.calculator.test.d.ts +2 -0
  70. package/dist/sync/next/test/compact-events.calculator.test.d.ts.map +1 -0
  71. package/dist/sync/next/test/compact-events.calculator.test.js +101 -0
  72. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -0
  73. package/dist/sync/next/test/compact-events.test.d.ts +2 -0
  74. package/dist/sync/next/test/compact-events.test.d.ts.map +1 -0
  75. package/dist/sync/next/test/compact-events.test.js +201 -0
  76. package/dist/sync/next/test/compact-events.test.js.map +1 -0
  77. package/dist/sync/next/test/mod.d.ts +2 -0
  78. package/dist/sync/next/test/mod.d.ts.map +1 -0
  79. package/dist/sync/next/test/mod.js +2 -0
  80. package/dist/sync/next/test/mod.js.map +1 -0
  81. package/dist/sync/next/test/mutation-fixtures.d.ts +73 -0
  82. package/dist/sync/next/test/mutation-fixtures.d.ts.map +1 -0
  83. package/dist/sync/next/test/mutation-fixtures.js +161 -0
  84. package/dist/sync/next/test/mutation-fixtures.js.map +1 -0
  85. package/dist/sync/sync.d.ts +5 -4
  86. package/dist/sync/sync.d.ts.map +1 -1
  87. package/dist/sync/sync.js.map +1 -1
  88. package/package.json +21 -4
  89. package/src/adapter-types.ts +27 -3
  90. package/src/derived-mutations.test.ts +2 -1
  91. package/src/derived-mutations.ts +5 -5
  92. package/src/devtools/devtools-bridge.ts +1 -1
  93. package/src/devtools/devtools-messages.ts +12 -2
  94. package/src/devtools/index.ts +2 -0
  95. package/src/rehydrate-from-mutationlog.ts +16 -7
  96. package/src/schema/mutations.ts +171 -30
  97. package/src/schema/system-tables.ts +30 -8
  98. package/src/schema-management/migrations.ts +1 -1
  99. package/src/sql-queries/types.ts +1 -1
  100. package/src/sync/next/ambient.d.ts +3 -0
  101. package/src/sync/next/compact-events.ts +218 -0
  102. package/src/sync/next/facts.ts +228 -0
  103. package/src/sync/next/graphology.ts +49 -0
  104. package/src/sync/next/graphology_.ts +2 -0
  105. package/src/sync/next/history-dag.ts +109 -0
  106. package/src/sync/next/mod.ts +4 -0
  107. package/src/sync/next/rebase-events.ts +97 -0
  108. package/src/sync/next/test/compact-events.calculator.test.ts +121 -0
  109. package/src/sync/next/test/compact-events.test.ts +232 -0
  110. package/src/sync/next/test/mod.ts +1 -0
  111. package/src/sync/next/test/mutation-fixtures.ts +230 -0
  112. package/src/sync/sync.ts +10 -4
  113. package/dist/global-types.d.ts +0 -7
  114. package/dist/global-types.d.ts.map +0 -1
  115. package/dist/global-types.js +0 -2
  116. package/dist/global-types.js.map +0 -1
  117. package/src/global-types.d.ts +0 -5
@@ -0,0 +1,201 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { compactEvents } from '../compact-events.js';
3
+ import { EMPTY_FACT_VALUE, historyDagFromNodes } from '../history-dag.js';
4
+ import { mutations, toEventNodes } from './mutation-fixtures.js';
5
+ const customStringify = (value) => {
6
+ if (value === null) {
7
+ return 'null';
8
+ }
9
+ const type = typeof value;
10
+ if (type === 'string') {
11
+ return JSON.stringify(value);
12
+ }
13
+ if (type === 'number' || type === 'boolean') {
14
+ return String(value);
15
+ }
16
+ if (Array.isArray(value)) {
17
+ const elements = value.map((el) => customStringify(el));
18
+ return `[${elements.join(', ')}]`;
19
+ }
20
+ if (value instanceof Set) {
21
+ const elements = Array.from(value).map((el) => customStringify(el));
22
+ return `[${elements.join(', ')}]`;
23
+ }
24
+ if (value instanceof Map) {
25
+ const keys = Array.from(value.keys()).map(customStringify).join(', ');
26
+ return `[${keys}]`;
27
+ }
28
+ if (type === 'object') {
29
+ const entries = Object.keys(value).map((key) => {
30
+ const val = value[key];
31
+ const valStr = key === 'facts'
32
+ ? `"${factsToString(val)}"`
33
+ : (key === 'id' || key === 'parentId') && Object.keys(val).length === 2 && val.local === 0
34
+ ? val.global
35
+ : customStringify(val);
36
+ return `${key}: ${valStr}`;
37
+ });
38
+ return `{ ${entries.join(', ')} }`;
39
+ }
40
+ return String(value);
41
+ };
42
+ const factsToString = (facts) => [
43
+ factsSetToString(facts.depRequire, '↖'),
44
+ factsSetToString(facts.depRead, '?'),
45
+ factsSetToString(facts.modifySet, '+'),
46
+ factsSetToString(facts.modifyUnset, '-'),
47
+ ]
48
+ .flat()
49
+ .join(' ');
50
+ const factsSetToString = (facts, prefix) => Array.from(facts.entries()).map(([key, value]) => prefix + key + (value === EMPTY_FACT_VALUE ? '' : `=${value}`));
51
+ export const customSerializer = {
52
+ test: (val) => Array.isArray(val),
53
+ print: (val, _serialize) => {
54
+ return '[\n' + val.map((item) => ' ' + customStringify(item)).join('\n') + '\n]';
55
+ },
56
+ };
57
+ expect.addSnapshotSerializer(customSerializer);
58
+ const compact = (events) => {
59
+ const dag = historyDagFromNodes(toEventNodes(events, mutations));
60
+ const compacted = compactEvents(dag);
61
+ return Array.from(compacted.dag.nodeEntries())
62
+ .map((_) => _.attributes)
63
+ .map(({ factsGroup, ...rest }) => ({ ...rest, facts: factsGroup }))
64
+ .slice(1);
65
+ };
66
+ describe('compactEvents todo app', () => {
67
+ it('completeTodo', () => {
68
+ const expected = compact([
69
+ mutations.createTodo({ id: 'A', text: 'buy milk' }), // 0
70
+ mutations.completeTodo({ id: 'A' }), // 1
71
+ mutations.completeTodo({ id: 'A' }), // 2
72
+ ]);
73
+ expect(expected).toMatchInlineSnapshot(`
74
+ [
75
+ { id: 0, parentId: -1, mutation: "createTodo", args: { id: "A", text: "buy milk" }, facts: "+todo-exists-A +todo-is-writeable-A=true +todo-completed-A=false" }
76
+ { id: 2, parentId: 0, mutation: "completeTodo", args: { id: "A" }, facts: "↖todo-exists-A ↖todo-is-writeable-A=true +todo-completed-A=true" }
77
+ ]
78
+ `);
79
+ });
80
+ it('toggleTodo', () => {
81
+ const expected = compact([
82
+ mutations.createTodo({ id: 'A', text: 'buy milk' }), // 0
83
+ mutations.toggleTodo({ id: 'A' }), // 1
84
+ mutations.toggleTodo({ id: 'A' }), // 2
85
+ mutations.toggleTodo({ id: 'A' }), // 3
86
+ ]);
87
+ expect(expected).toMatchInlineSnapshot(`
88
+ [
89
+ { id: 0, parentId: -1, mutation: "createTodo", args: { id: "A", text: "buy milk" }, facts: "+todo-exists-A +todo-is-writeable-A=true +todo-completed-A=false" }
90
+ { id: 1, parentId: 0, mutation: "toggleTodo", args: { id: "A" }, facts: "↖todo-exists-A ↖todo-is-writeable-A=true ?todo-completed-A +todo-completed-A=true" }
91
+ { id: 2, parentId: 1, mutation: "toggleTodo", args: { id: "A" }, facts: "↖todo-exists-A ↖todo-is-writeable-A=true ?todo-completed-A +todo-completed-A=false" }
92
+ { id: 3, parentId: 2, mutation: "toggleTodo", args: { id: "A" }, facts: "↖todo-exists-A ↖todo-is-writeable-A=true ?todo-completed-A +todo-completed-A=true" }
93
+ ]
94
+ `);
95
+ });
96
+ it('completeTodo / toggleTodo', () => {
97
+ const expected = compact([
98
+ mutations.createTodo({ id: 'A', text: 'buy milk' }), // 0
99
+ mutations.toggleTodo({ id: 'A' }), // 1
100
+ mutations.toggleTodo({ id: 'A' }), // 2
101
+ mutations.completeTodo({ id: 'A' }), // 3
102
+ mutations.completeTodo({ id: 'A' }), // 4
103
+ mutations.toggleTodo({ id: 'A' }), // 5
104
+ ]);
105
+ expect(expected).toMatchInlineSnapshot(`
106
+ [
107
+ { id: 0, parentId: -1, mutation: "createTodo", args: { id: "A", text: "buy milk" }, facts: "+todo-exists-A +todo-is-writeable-A=true +todo-completed-A=false" }
108
+ { id: 4, parentId: 0, mutation: "completeTodo", args: { id: "A" }, facts: "↖todo-exists-A ↖todo-is-writeable-A=true +todo-completed-A=true" }
109
+ { id: 5, parentId: 4, mutation: "toggleTodo", args: { id: "A" }, facts: "↖todo-exists-A ↖todo-is-writeable-A=true ?todo-completed-A +todo-completed-A=false" }
110
+ ]
111
+ `);
112
+ });
113
+ it('readonly setTextTodo', () => {
114
+ const expected = compact([
115
+ mutations.createTodo({ id: 'A', text: 'buy milk' }), // 0
116
+ mutations.setReadonlyTodo({ id: 'A', readonly: false }), // 1
117
+ mutations.setTextTodo({ id: 'A', text: 'buy soy milk' }), // 2
118
+ mutations.setReadonlyTodo({ id: 'A', readonly: true }), // 3
119
+ ]);
120
+ expect(expected).toMatchInlineSnapshot(`
121
+ [
122
+ { id: 0, parentId: -1, mutation: "createTodo", args: { id: "A", text: "buy milk" }, facts: "+todo-exists-A +todo-is-writeable-A=true +todo-completed-A=false" }
123
+ { id: 1, parentId: 0, mutation: "setReadonlyTodo", args: { id: "A", readonly: false }, facts: "↖todo-exists-A +todo-is-writeable-A=true" }
124
+ { id: 2, parentId: 1, mutation: "setTextTodo", args: { id: "A", text: "buy soy milk" }, facts: "↖todo-exists-A ↖todo-is-writeable-A=true +todo-text-updated-A" }
125
+ { id: 3, parentId: 2, mutation: "setReadonlyTodo", args: { id: "A", readonly: true }, facts: "↖todo-exists-A +todo-is-writeable-A=false" }
126
+ ]
127
+ `);
128
+ });
129
+ it('readonly setTextTodo 2', () => {
130
+ const expected = compact([
131
+ mutations.createTodo({ id: 'A', text: 'buy milk' }), // 0
132
+ mutations.setReadonlyTodo({ id: 'A', readonly: false }), // 1
133
+ mutations.completeTodo({ id: 'A' }), // 2
134
+ mutations.setTextTodo({ id: 'A', text: 'buy soy milk' }), // 3
135
+ mutations.setReadonlyTodo({ id: 'A', readonly: true }), // 4
136
+ ]);
137
+ expect(expected).toMatchInlineSnapshot(`
138
+ [
139
+ { id: 0, parentId: -1, mutation: "createTodo", args: { id: "A", text: "buy milk" }, facts: "+todo-exists-A +todo-is-writeable-A=true +todo-completed-A=false" }
140
+ { id: 1, parentId: 0, mutation: "setReadonlyTodo", args: { id: "A", readonly: false }, facts: "↖todo-exists-A +todo-is-writeable-A=true" }
141
+ { id: 2, parentId: 1, mutation: "completeTodo", args: { id: "A" }, facts: "↖todo-exists-A ↖todo-is-writeable-A=true +todo-completed-A=true" }
142
+ { id: 3, parentId: 2, mutation: "setTextTodo", args: { id: "A", text: "buy soy milk" }, facts: "↖todo-exists-A ↖todo-is-writeable-A=true +todo-text-updated-A" }
143
+ { id: 4, parentId: 3, mutation: "setReadonlyTodo", args: { id: "A", readonly: true }, facts: "↖todo-exists-A +todo-is-writeable-A=false" }
144
+ ]
145
+ `);
146
+ });
147
+ it('readonly setTextTodo - should fail', () => {
148
+ const expected = () => compact([
149
+ mutations.createTodo({ id: 'A', text: 'buy milk' }), // 0
150
+ mutations.setReadonlyTodo({ id: 'A', readonly: false }), // 1
151
+ mutations.setTextTodo({ id: 'A', text: 'buy soy milk' }), // 2
152
+ mutations.setReadonlyTodo({ id: 'A', readonly: true }), // 3
153
+ mutations.setTextTodo({ id: 'A', text: 'buy oat milk' }), // 4
154
+ ]);
155
+ expect(expected).toThrowErrorMatchingInlineSnapshot(`
156
+ [Error: Mutation setTextTodo requires facts that have not been set yet.
157
+ Requires: todo-exists-A, todo-is-writeable-A=true
158
+ Facts Snapshot: todo-exists-A, todo-is-writeable-A=false, todo-completed-A=false, todo-text-updated-A]
159
+ `);
160
+ });
161
+ it('completeTodos', () => {
162
+ const expected = compact([
163
+ mutations.createTodo({ id: 'A', text: 'buy milk' }), // 0
164
+ mutations.createTodo({ id: 'B', text: 'buy bread' }), // 1
165
+ mutations.createTodo({ id: 'C', text: 'buy cheese' }), // 2
166
+ mutations.completeTodos({ ids: ['A', 'B', 'C'] }), // 3
167
+ mutations.toggleTodo({ id: 'A' }), // 4
168
+ mutations.completeTodo({ id: 'A' }), // 5
169
+ ]);
170
+ expect(expected).toMatchInlineSnapshot(`
171
+ [
172
+ { id: 0, parentId: -1, mutation: "createTodo", args: { id: "A", text: "buy milk" }, facts: "+todo-exists-A +todo-is-writeable-A=true +todo-completed-A=false" }
173
+ { id: 1, parentId: 0, mutation: "createTodo", args: { id: "B", text: "buy bread" }, facts: "+todo-exists-B +todo-is-writeable-B=true +todo-completed-B=false" }
174
+ { id: 2, parentId: 1, mutation: "createTodo", args: { id: "C", text: "buy cheese" }, facts: "+todo-exists-C +todo-is-writeable-C=true +todo-completed-C=false" }
175
+ { id: 3, parentId: 2, mutation: "completeTodos", args: { ids: ["A", "B", "C"] }, facts: "↖todo-exists-A ↖todo-is-writeable-A=true ↖todo-exists-B ↖todo-is-writeable-B=true ↖todo-exists-C ↖todo-is-writeable-C=true +todo-completed-A=true +todo-completed-B=true +todo-completed-C=true" }
176
+ { id: 5, parentId: 3, mutation: "completeTodo", args: { id: "A" }, facts: "↖todo-exists-A ↖todo-is-writeable-A=true +todo-completed-A=true" }
177
+ ]
178
+ `);
179
+ });
180
+ it('completeTodos 2', () => {
181
+ const expected = compact([
182
+ mutations.createTodo({ id: 'A', text: 'buy milk' }), // 0
183
+ mutations.createTodo({ id: 'B', text: 'buy bread' }), // 1
184
+ mutations.createTodo({ id: 'C', text: 'buy cheese' }), // 2
185
+ mutations.toggleTodo({ id: 'A' }), // 3
186
+ mutations.completeTodos({ ids: ['A', 'B', 'C'] }), // 4
187
+ mutations.toggleTodo({ id: 'A' }), // 5
188
+ mutations.completeTodo({ id: 'A' }), // 6
189
+ ]);
190
+ expect(expected).toMatchInlineSnapshot(`
191
+ [
192
+ { id: 0, parentId: -1, mutation: "createTodo", args: { id: "A", text: "buy milk" }, facts: "+todo-exists-A +todo-is-writeable-A=true +todo-completed-A=false" }
193
+ { id: 1, parentId: 0, mutation: "createTodo", args: { id: "B", text: "buy bread" }, facts: "+todo-exists-B +todo-is-writeable-B=true +todo-completed-B=false" }
194
+ { id: 2, parentId: 1, mutation: "createTodo", args: { id: "C", text: "buy cheese" }, facts: "+todo-exists-C +todo-is-writeable-C=true +todo-completed-C=false" }
195
+ { id: 4, parentId: 2, mutation: "completeTodos", args: { ids: ["A", "B", "C"] }, facts: "↖todo-exists-A ↖todo-is-writeable-A=true ↖todo-exists-B ↖todo-is-writeable-B=true ↖todo-exists-C ↖todo-is-writeable-C=true +todo-completed-A=true +todo-completed-B=true +todo-completed-C=true" }
196
+ { id: 6, parentId: 4, mutation: "completeTodo", args: { id: "A" }, facts: "↖todo-exists-A ↖todo-is-writeable-A=true +todo-completed-A=true" }
197
+ ]
198
+ `);
199
+ });
200
+ });
201
+ //# sourceMappingURL=compact-events.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compact-events.test.js","sourceRoot":"","sources":["../../../../src/sync/next/test/compact-events.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './mutation-fixtures.js';
2
+ //# sourceMappingURL=mod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../../../src/sync/next/test/mod.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './mutation-fixtures.js';
2
+ //# sourceMappingURL=mod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.js","sourceRoot":"","sources":["../../../../src/sync/next/test/mod.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAA"}
@@ -0,0 +1,73 @@
1
+ import type { MutationDef } from '../../../schema/mutations.js';
2
+ import type { HistoryDagNode } from '../history-dag.js';
3
+ /** Used for conflict detection and event history compaction */
4
+ export declare const facts: {
5
+ todoExists: (id: string) => string;
6
+ todoIsWriteable: (id: string, writeable: boolean) => [string, boolean];
7
+ todoCompleted: (id: string, completed: boolean) => [string, boolean];
8
+ todoTextUpdated: (id: string) => string;
9
+ inputValue: (id: string) => string;
10
+ };
11
+ export declare const mutations: {
12
+ createTodo: MutationDef<"createTodo", {
13
+ readonly text: string;
14
+ readonly id: string;
15
+ }, {
16
+ readonly text: string;
17
+ readonly id: string;
18
+ }>;
19
+ upsertTodo: MutationDef<"upsertTodo", {
20
+ readonly id: string;
21
+ readonly text?: string | undefined;
22
+ }, {
23
+ readonly text?: string | undefined;
24
+ readonly id: string;
25
+ }>;
26
+ completeTodo: MutationDef<"completeTodo", {
27
+ readonly id: string;
28
+ }, {
29
+ readonly id: string;
30
+ }>;
31
+ uncompleteTodo: MutationDef<"uncompleteTodo", {
32
+ readonly id: string;
33
+ }, {
34
+ readonly id: string;
35
+ }>;
36
+ completeTodos: MutationDef<"completeTodos", {
37
+ readonly ids: readonly string[];
38
+ }, {
39
+ readonly ids: readonly string[];
40
+ }>;
41
+ toggleTodo: MutationDef<"toggleTodo", {
42
+ readonly id: string;
43
+ }, {
44
+ readonly id: string;
45
+ }>;
46
+ setReadonlyTodo: MutationDef<"setReadonlyTodo", {
47
+ readonly id: string;
48
+ readonly readonly: boolean;
49
+ }, {
50
+ readonly id: string;
51
+ readonly readonly: boolean;
52
+ }>;
53
+ setTextTodo: MutationDef<"setTextTodo", {
54
+ readonly text: string;
55
+ readonly id: string;
56
+ }, {
57
+ readonly text: string;
58
+ readonly id: string;
59
+ }>;
60
+ setInputValue: MutationDef<"setInputValue", {
61
+ readonly text: string;
62
+ readonly id: string;
63
+ }, {
64
+ readonly text: string;
65
+ readonly id: string;
66
+ }>;
67
+ };
68
+ export type PartialEvent = {
69
+ mutation: string;
70
+ args: any;
71
+ };
72
+ export declare const toEventNodes: (partialEvents: PartialEvent[], mutationDefs: Record<string, MutationDef.Any>) => HistoryDagNode[];
73
+ //# sourceMappingURL=mutation-fixtures.d.ts.map
@@ -0,0 +1 @@
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;AAG/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAGvD,+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,kBACR,YAAY,EAAE,gBACf,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,KAC5C,cAAc,EAkFhB,CAAA"}
@@ -0,0 +1,161 @@
1
+ import { Schema } from '@livestore/utils/effect';
2
+ import { ROOT_ID } from '../../../adapter-types.js';
3
+ import { defineFacts, defineMutation } from '../../../schema/mutations.js';
4
+ import { factsSnapshotForDag, getFactsGroupForMutationArgs } from '../facts.js';
5
+ import { historyDagFromNodes, rootEventNode } from '../history-dag.js';
6
+ /** Used for conflict detection and event history compaction */
7
+ export const facts = defineFacts({
8
+ todoExists: (id) => `todo-exists-${id}`,
9
+ todoIsWriteable: (id, writeable) => [`todo-is-writeable-${id}`, writeable],
10
+ todoCompleted: (id, completed) => [`todo-completed-${id}`, completed],
11
+ todoTextUpdated: (id) => `todo-text-updated-${id}`,
12
+ inputValue: (id) => `input-value-${id}`,
13
+ });
14
+ export const mutations = {
15
+ createTodo: defineMutation('createTodo', Schema.Struct({ id: Schema.String, text: Schema.String }), 'INSERT INTO todos (id, text) VALUES ($id, $text)', {
16
+ facts: ({ id }) => ({
17
+ modify: {
18
+ set: [facts.todoExists(id), facts.todoIsWriteable(id, true), facts.todoCompleted(id, false)],
19
+ },
20
+ }),
21
+ }),
22
+ upsertTodo: defineMutation('upsertTodo', Schema.Struct({ id: Schema.String, text: Schema.optional(Schema.String) }), 'INSERT INTO todos (id, text) VALUES ($id, $text) ON CONFLICT (id) DO UPDATE SET text = $text', {
23
+ facts: ({ id }, currentFacts) =>
24
+ // TODO enable an API along the lines of `map.has(key, value)`
25
+ currentFacts.has(facts.todoExists(id)) && currentFacts.get(facts.todoIsWriteable(id, true)[0]) === false
26
+ ? { require: [facts.todoExists(id), facts.todoIsWriteable(id, true)] }
27
+ : { modify: { set: [facts.todoExists(id), facts.todoIsWriteable(id, true), facts.todoTextUpdated(id)] } },
28
+ }),
29
+ completeTodo: defineMutation('completeTodo', Schema.Struct({ id: Schema.String }),
30
+ // consider `RETURNING` to validate before applying facts
31
+ 'UPDATE todos SET completed = true WHERE id = $id', {
32
+ // prewrite assertions from DB
33
+ // enables more concurrency
34
+ // turning database inside out
35
+ // similar to upsert semantics
36
+ facts: ({ id }) => ({
37
+ require: [facts.todoExists(id), facts.todoIsWriteable(id, true)],
38
+ modify: { set: [facts.todoCompleted(id, true)] },
39
+ }),
40
+ }),
41
+ uncompleteTodo: defineMutation('uncompleteTodo', Schema.Struct({ id: Schema.String }), 'UPDATE todos SET completed = false WHERE id = $id', {
42
+ facts: ({ id }) => ({
43
+ require: [facts.todoExists(id), facts.todoIsWriteable(id, true)],
44
+ modify: { set: [facts.todoCompleted(id, false)] },
45
+ }),
46
+ }),
47
+ completeTodos: defineMutation('completeTodos', Schema.Struct({ ids: Schema.Array(Schema.String) }), 'UPDATE todos SET completed = true WHERE id IN ($ids:csv)', {
48
+ facts: ({ ids }) => ({
49
+ require: ids.flatMap((id) => [facts.todoExists(id), facts.todoIsWriteable(id, true)]),
50
+ modify: { set: ids.map((id) => facts.todoCompleted(id, true)) },
51
+ }),
52
+ }),
53
+ toggleTodo: defineMutation('toggleTodo', Schema.Struct({ id: Schema.String }), 'UPDATE todos SET completed = NOT completed WHERE id = $id', {
54
+ facts: ({ id }, currentFacts) => {
55
+ const currentIsCompleted = currentFacts.get(facts.todoCompleted(id, true)[0]) === true;
56
+ return {
57
+ require: [facts.todoExists(id), facts.todoIsWriteable(id, true)],
58
+ modify: {
59
+ // remove: [facts.todoCompleted(id, currentIsCompleted)],
60
+ set: [facts.todoCompleted(id, !currentIsCompleted)],
61
+ },
62
+ };
63
+ },
64
+ }),
65
+ setReadonlyTodo: defineMutation('setReadonlyTodo', Schema.Struct({ id: Schema.String, readonly: Schema.Boolean }), 'UPDATE todos SET readonly = $readonly WHERE id = $id', {
66
+ facts: ({ id, readonly }) => ({
67
+ require: [facts.todoExists(id)],
68
+ modify: { set: [facts.todoIsWriteable(id, !readonly)] },
69
+ }),
70
+ }),
71
+ setTextTodo: defineMutation('setTextTodo', Schema.Struct({ id: Schema.String, text: Schema.String }), 'UPDATE todos SET text = $text WHERE id = $id', {
72
+ facts: ({ id }) => ({
73
+ require: [facts.todoExists(id), facts.todoIsWriteable(id, true)],
74
+ modify: { set: [facts.todoTextUpdated(id)] },
75
+ }),
76
+ }),
77
+ setInputValue: defineMutation('setInputValue', Schema.Struct({ id: Schema.String, text: Schema.String }), 'UPDATE todos SET text = $text WHERE id = $id', {
78
+ localOnly: true,
79
+ facts: ({ id }) => ({ modify: { set: [facts.inputValue(id)] } }),
80
+ }),
81
+ };
82
+ export const toEventNodes = (partialEvents, mutationDefs) => {
83
+ const nodesAcc = [rootEventNode];
84
+ let currentEventId = ROOT_ID;
85
+ const getNextEventId = (mutationDef) => {
86
+ if (mutationDef.options.localOnly) {
87
+ return { global: currentEventId.global, local: currentEventId.local + 1 };
88
+ }
89
+ return { global: currentEventId.global + 1, local: 0 };
90
+ };
91
+ const eventNodes = partialEvents.map((partialEvent) => {
92
+ const mutationDef = mutationDefs[partialEvent.mutation];
93
+ const eventId = getNextEventId(mutationDef);
94
+ currentEventId = eventId;
95
+ const factsSnapshot = factsSnapshotForDag(historyDagFromNodes(nodesAcc, { skipFactsCheck: true }), undefined);
96
+ // console.log('factsSnapshot', eventId, factsSnapshot)
97
+ // const depRead: MutationEventFactsSnapshot = new Map<string, any>()
98
+ // const factsSnapshotProxy = new Proxy(factsSnapshot, {
99
+ // get: (target, prop) => {
100
+ // if (prop === 'has') {
101
+ // return (key: string) => {
102
+ // depRead.set(key, EMPTY_FACT_VALUE)
103
+ // return target.has(key)
104
+ // }
105
+ // } else if (prop === 'get') {
106
+ // return (key: string) => {
107
+ // depRead.set(key, EMPTY_FACT_VALUE)
108
+ // return target.get(key)
109
+ // }
110
+ // }
111
+ // notYetImplemented(`toEventNodes: ${prop.toString()} is not yet implemented`)
112
+ // },
113
+ // })
114
+ // const factsRes = mutationDef.options.facts?.(partialEvent.args, factsSnapshotProxy)
115
+ // console.log('factsRes', factsRes?.modify, factsRes?.require)
116
+ // const iterableToMap = (iterable: Iterable<MutationEventFactInput>) => {
117
+ // const map = new Map()
118
+ // for (const item of iterable) {
119
+ // if (typeof item === 'string') {
120
+ // map.set(item, EMPTY_FACT_VALUE)
121
+ // } else {
122
+ // map.set(item[0], item[1])
123
+ // }
124
+ // }
125
+ // return map
126
+ // }
127
+ // const facts = {
128
+ // modifyAdd: factsRes?.modify.add ? iterableToMap(factsRes.modify.add) : new Map(),
129
+ // modifyRemove: factsRes?.modify.remove ? iterableToMap(factsRes.modify.remove) : new Map(),
130
+ // depRequire: factsRes?.require ? iterableToMap(factsRes.require) : new Map(),
131
+ // depRead,
132
+ // } satisfies MutationEventFactsGroup
133
+ // applyFactGroup(facts, factsSnapshot)
134
+ const facts = getFactsGroupForMutationArgs({
135
+ factsCallback: mutationDef.options.facts,
136
+ args: partialEvent.args,
137
+ currentFacts: factsSnapshot,
138
+ });
139
+ const node = {
140
+ id: eventId,
141
+ parentId: getParentId(eventId),
142
+ mutation: partialEvent.mutation,
143
+ args: partialEvent.args,
144
+ factsGroup: facts,
145
+ };
146
+ nodesAcc.push(node);
147
+ return node;
148
+ });
149
+ eventNodes.unshift(rootEventNode);
150
+ // console.log('eventNodes', eventNodes)
151
+ return eventNodes;
152
+ };
153
+ const getParentId = (eventId) => {
154
+ const globalParentId = eventId.global;
155
+ const localParentId = eventId.local - 1;
156
+ if (localParentId < 0) {
157
+ return { global: globalParentId - 1, local: 0 };
158
+ }
159
+ return { global: globalParentId, local: localParentId };
160
+ };
161
+ //# sourceMappingURL=mutation-fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-fixtures.js","sourceRoot":"","sources":["../../../../src/sync/next/test/mutation-fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,OAAO,EAAgB,OAAO,EAAE,MAAM,2BAA2B,CAAA;AAEjE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC1E,OAAO,EAAE,mBAAmB,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAA;AAE/E,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEtE,+DAA+D;AAC/D,MAAM,CAAC,MAAM,KAAK,GAAG,WAAW,CAAC;IAC/B,UAAU,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,eAAe,EAAE,EAAE;IAC/C,eAAe,EAAE,CAAC,EAAU,EAAE,SAAkB,EAAE,EAAE,CAAC,CAAC,qBAAqB,EAAE,EAAE,EAAE,SAAS,CAAC;IAC3F,aAAa,EAAE,CAAC,EAAU,EAAE,SAAkB,EAAE,EAAE,CAAC,CAAC,kBAAkB,EAAE,EAAE,EAAE,SAAS,CAAC;IACtF,eAAe,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,qBAAqB,EAAE,EAAE;IAC1D,UAAU,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,eAAe,EAAE,EAAE;CAChD,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,UAAU,EAAE,cAAc,CACxB,YAAY,EACZ,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EACzD,kDAAkD,EAClD;QACE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YAClB,MAAM,EAAE;gBACN,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;aAC7F;SACF,CAAC;KACH,CACF;IACD,UAAU,EAAE,cAAc,CACxB,YAAY,EACZ,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAC1E,8FAA8F,EAC9F;QACE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE;QAC9B,8DAA8D;QAC9D,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK;YACtG,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,EAAE;YACtE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;KAC9G,CACF;IACD,YAAY,EAAE,cAAc,CAC1B,cAAc,EACd,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACpC,yDAAyD;IACzD,kDAAkD,EAClD;QACE,8BAA8B;QAC9B,2BAA2B;QAC3B,8BAA8B;QAC9B,8BAA8B;QAC9B,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YAClB,OAAO,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAChE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,EAAE;SACjD,CAAC;KACH,CACF;IACD,cAAc,EAAE,cAAc,CAC5B,gBAAgB,EAChB,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EACpC,mDAAmD,EACnD;QACE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YAClB,OAAO,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAChE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE;SAClD,CAAC;KACH,CACF;IACD,aAAa,EAAE,cAAc,CAC3B,eAAe,EACf,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EACnD,0DAA0D,EAC1D;QACE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YACnB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;YACrF,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,EAAE;SAChE,CAAC;KACH,CACF;IACD,UAAU,EAAE,cAAc,CACxB,YAAY,EACZ,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EACpC,2DAA2D,EAC3D;QACE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE;YAC9B,MAAM,kBAAkB,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;YACtF,OAAO;gBACL,OAAO,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;gBAChE,MAAM,EAAE;oBACN,yDAAyD;oBACzD,GAAG,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC;iBACpD;aACF,CAAA;QACH,CAAC;KACF,CACF;IACD,eAAe,EAAE,cAAc,CAC7B,iBAAiB,EACjB,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,EAC9D,sDAAsD,EACtD;QACE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5B,OAAO,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC/B,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE;SACxD,CAAC;KACH,CACF;IACD,WAAW,EAAE,cAAc,CACzB,aAAa,EACb,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EACzD,8CAA8C,EAC9C;QACE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YAClB,OAAO,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAChE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE;SAC7C,CAAC;KACH,CACF;IACD,aAAa,EAAE,cAAc,CAC3B,eAAe,EACf,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EACzD,8CAA8C,EAC9C;QACE,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;KACjE,CACF;CACF,CAAA;AAID,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,aAA6B,EAC7B,YAA6C,EAC3B,EAAE;IACpB,MAAM,QAAQ,GAAqB,CAAC,aAAa,CAAC,CAAA;IAElD,IAAI,cAAc,GAAY,OAAO,CAAA;IAErC,MAAM,cAAc,GAAG,CAAC,WAA4B,EAAW,EAAE;QAC/D,IAAI,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YAClC,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,GAAG,CAAC,EAAE,CAAA;QAC3E,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAA;IACxD,CAAC,CAAA;IAED,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE;QACpD,MAAM,WAAW,GAAG,YAAY,CAAC,YAAY,CAAC,QAAQ,CAAE,CAAA;QACxD,MAAM,OAAO,GAAG,cAAc,CAAC,WAAW,CAAC,CAAA;QAC3C,cAAc,GAAG,OAAO,CAAA;QAExB,MAAM,aAAa,GAAG,mBAAmB,CAAC,mBAAmB,CAAC,QAAQ,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,CAAA;QAC7G,uDAAuD;QACvD,qEAAqE;QACrE,wDAAwD;QACxD,6BAA6B;QAC7B,4BAA4B;QAC5B,kCAAkC;QAClC,6CAA6C;QAC7C,iCAAiC;QACjC,UAAU;QACV,mCAAmC;QACnC,kCAAkC;QAClC,6CAA6C;QAC7C,iCAAiC;QACjC,UAAU;QACV,QAAQ;QAER,mFAAmF;QACnF,OAAO;QACP,KAAK;QAEL,sFAAsF;QACtF,+DAA+D;QAC/D,0EAA0E;QAC1E,0BAA0B;QAC1B,mCAAmC;QACnC,sCAAsC;QACtC,wCAAwC;QACxC,eAAe;QACf,kCAAkC;QAClC,QAAQ;QACR,MAAM;QACN,eAAe;QACf,IAAI;QACJ,kBAAkB;QAClB,sFAAsF;QACtF,+FAA+F;QAC/F,iFAAiF;QACjF,aAAa;QACb,sCAAsC;QAEtC,uCAAuC;QAEvC,MAAM,KAAK,GAAG,4BAA4B,CAAC;YACzC,aAAa,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK;YACxC,IAAI,EAAE,YAAY,CAAC,IAAI;YACvB,YAAY,EAAE,aAAa;SAC5B,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG;YACX,EAAE,EAAE,OAAO;YACX,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC;YAC9B,QAAQ,EAAE,YAAY,CAAC,QAAQ;YAC/B,IAAI,EAAE,YAAY,CAAC,IAAI;YACvB,UAAU,EAAE,KAAK;SACO,CAAA;QAC1B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnB,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IAEF,UAAU,CAAC,OAAO,CAAC,aAAsB,CAAC,CAAA;IAE1C,wCAAwC;IAExC,OAAO,UAAU,CAAA;AACnB,CAAC,CAAA;AAED,MAAM,WAAW,GAAG,CAAC,OAAgB,EAAW,EAAE;IAChD,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAA;IACrC,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAA;IAEvC,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,MAAM,EAAE,cAAc,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAA;IACjD,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,CAAA;AACzD,CAAC,CAAA"}
@@ -1,5 +1,6 @@
1
- import type { Effect, Option, Stream, SubscriptionRef } from '@livestore/utils/effect';
1
+ import type { Effect, HttpClient, Option, Stream, SubscriptionRef } from '@livestore/utils/effect';
2
2
  import { Schema } from '@livestore/utils/effect';
3
+ import type { EventId } from '../adapter-types.js';
3
4
  import type { MutationEvent } from '../schema/mutations.js';
4
5
  export interface SyncBackendOptionsBase {
5
6
  type: string;
@@ -7,7 +8,7 @@ export interface SyncBackendOptionsBase {
7
8
  }
8
9
  export type SyncBackend<TSyncMetadata = Schema.JsonValue> = {
9
10
  pull: (args: Option.Option<{
10
- cursor: string;
11
+ cursor: EventId;
11
12
  metadata: Option.Option<TSyncMetadata>;
12
13
  }>, options: {
13
14
  listenForNew: boolean;
@@ -15,10 +16,10 @@ export type SyncBackend<TSyncMetadata = Schema.JsonValue> = {
15
16
  mutationEventEncoded: MutationEvent.AnyEncoded;
16
17
  metadata: Option.Option<TSyncMetadata>;
17
18
  persisted: boolean;
18
- }, IsOfflineError | InvalidPullError>;
19
+ }, IsOfflineError | InvalidPullError, HttpClient.HttpClient>;
19
20
  push: (mutationEventEncoded: MutationEvent.AnyEncoded, persisted: boolean) => Effect.Effect<{
20
21
  metadata: Option.Option<TSyncMetadata>;
21
- }, IsOfflineError | InvalidPushError>;
22
+ }, IsOfflineError | InvalidPushError, HttpClient.HttpClient>;
22
23
  isConnected: SubscriptionRef.SubscriptionRef<boolean>;
23
24
  };
24
25
  declare const IsOfflineError_base: Schema.TaggedErrorClass<IsOfflineError, "IsOfflineError", {
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACtF,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAE3D,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,SAAS,CAAA;CAChC;AAED,MAAM,MAAM,WAAW,CAAC,aAAa,GAAG,MAAM,CAAC,SAAS,IAAI;IAC1D,IAAI,EAAE,CACJ,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAA;QACd,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;KACvC,CAAC,EACF,OAAO,EAAE;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,KAC/B,MAAM,CAAC,MAAM,CAChB;QACE,oBAAoB,EAAE,aAAa,CAAC,UAAU,CAAA;QAC9C,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;QACtC,SAAS,EAAE,OAAO,CAAA;KACnB,EACD,cAAc,GAAG,gBAAgB,CAClC,CAAA;IAED,IAAI,EAAE,CACJ,oBAAoB,EAAE,aAAa,CAAC,UAAU,EAC9C,SAAS,EAAE,OAAO,KACf,MAAM,CAAC,MAAM,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;KAAE,EAAE,cAAc,GAAG,gBAAgB,CAAC,CAAA;IACjG,WAAW,EAAE,eAAe,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;CACtD,CAAA;;;;AAED,qBAAa,cAAe,SAAQ,mBAA0D;CAAG;;;;;;AACjG,qBAAa,gBAAiB,SAAQ,qBAEpC;CAAG;;;;;;AACL,qBAAa,gBAAiB,SAAQ,qBAEpC;CAAG"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAClG,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAE3D,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,SAAS,CAAA;CAChC;AAED,MAAM,MAAM,WAAW,CAAC,aAAa,GAAG,MAAM,CAAC,SAAS,IAAI;IAC1D,IAAI,EAAE,CACJ,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;QAClB,MAAM,EAAE,OAAO,CAAA;QACf,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;KACvC,CAAC,EACF,OAAO,EAAE;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,KAC/B,MAAM,CAAC,MAAM,CAChB;QACE,oBAAoB,EAAE,aAAa,CAAC,UAAU,CAAA;QAC9C,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;QACtC,SAAS,EAAE,OAAO,CAAA;KACnB,EACD,cAAc,GAAG,gBAAgB,EACjC,UAAU,CAAC,UAAU,CACtB,CAAA;IAED,IAAI,EAAE,CACJ,oBAAoB,EAAE,aAAa,CAAC,UAAU,EAC9C,SAAS,EAAE,OAAO,KACf,MAAM,CAAC,MAAM,CAChB;QAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;KAAE,EAC1C,cAAc,GAAG,gBAAgB,EACjC,UAAU,CAAC,UAAU,CACtB,CAAA;IACD,WAAW,EAAE,eAAe,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;CACtD,CAAA;;;;AAED,qBAAa,cAAe,SAAQ,mBAA0D;CAAG;;;;;;AACjG,qBAAa,gBAAiB,SAAQ,qBAEpC;CAAG;;;;;;AACL,qBAAa,gBAAiB,SAAQ,qBAEpC;CAAG"}
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAgChD,MAAM,OAAO,cAAe,SAAQ,MAAM,CAAC,WAAW,EAAkB,CAAC,gBAAgB,EAAE,EAAE,CAAC;CAAG;AACjG,MAAM,OAAO,gBAAiB,SAAQ,MAAM,CAAC,WAAW,EAAoB,CAAC,kBAAkB,EAAE;IAC/F,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CAAC;CAAG;AACL,MAAM,OAAO,gBAAiB,SAAQ,MAAM,CAAC,WAAW,EAAoB,CAAC,kBAAkB,EAAE;IAC/F,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CAAC;CAAG"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAsChD,MAAM,OAAO,cAAe,SAAQ,MAAM,CAAC,WAAW,EAAkB,CAAC,gBAAgB,EAAE,EAAE,CAAC;CAAG;AACjG,MAAM,OAAO,gBAAiB,SAAQ,MAAM,CAAC,WAAW,EAAoB,CAAC,kBAAkB,EAAE;IAC/F,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CAAC;CAAG;AACL,MAAM,OAAO,gBAAiB,SAAQ,MAAM,CAAC,WAAW,EAAoB,CAAC,kBAAkB,EAAE;IAC/F,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CAAC;CAAG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@livestore/common",
3
- "version": "0.0.58-dev.6",
3
+ "version": "0.0.58-dev.8",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -14,6 +14,14 @@
14
14
  "./schema": {
15
15
  "types": "./dist/schema/index.d.ts",
16
16
  "default": "./dist/schema/index.js"
17
+ },
18
+ "./sync/next": {
19
+ "types": "./dist/sync/next/mod.d.ts",
20
+ "default": "./dist/sync/next/mod.js"
21
+ },
22
+ "./sync/next/test": {
23
+ "types": "./dist/sync/next/test/mod.d.ts",
24
+ "default": "./dist/sync/next/test/mod.js"
17
25
  }
18
26
  },
19
27
  "types": "./dist/index.d.ts",
@@ -24,16 +32,25 @@
24
32
  ],
25
33
  "sql-queries": [
26
34
  "./dist/sql-queries/index.d.ts"
35
+ ],
36
+ "sync/next": [
37
+ "./dist/sync/next/mod.d.ts"
38
+ ],
39
+ "sync/next/test": [
40
+ "./dist/sync/next/test/mod.d.ts"
27
41
  ]
28
42
  }
29
43
  },
30
44
  "dependencies": {
31
45
  "@opentelemetry/api": "^1.9.0",
32
- "@livestore/utils": "0.0.58-dev.6",
33
- "effect-db-schema": "0.0.58-dev.6"
46
+ "graphology": "0.26.0-alpha1",
47
+ "graphology-dag": "0.4.1",
48
+ "graphology-types": "0.24.7",
49
+ "@livestore/utils": "0.0.58-dev.8",
50
+ "effect-db-schema": "0.0.58-dev.8"
34
51
  },
35
52
  "devDependencies": {
36
- "vitest": "^2.0.4"
53
+ "vitest": "^2.1.4"
37
54
  },
38
55
  "publishConfig": {
39
56
  "access": "public"