@verdant-web/common 2.2.0 → 2.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 (161) hide show
  1. package/dist/esm/EventSubscriber.d.ts +1 -1
  2. package/dist/esm/EventSubscriber.js.map +1 -1
  3. package/dist/esm/baseline.d.ts +1 -1
  4. package/dist/esm/batching.js.map +1 -1
  5. package/dist/esm/error.d.ts +1 -0
  6. package/dist/esm/error.js +2 -1
  7. package/dist/esm/error.js.map +1 -1
  8. package/dist/esm/files.d.ts +3 -2
  9. package/dist/esm/indexes.d.ts +2 -2
  10. package/dist/esm/indexes.js.map +1 -1
  11. package/dist/esm/memo.js.map +1 -1
  12. package/dist/esm/migration.d.ts +23 -23
  13. package/dist/esm/migration.js.map +1 -1
  14. package/dist/esm/oids.d.ts +1 -1
  15. package/dist/esm/oids.js.map +1 -1
  16. package/dist/esm/operation.d.ts +8 -8
  17. package/dist/esm/operation.js.map +1 -1
  18. package/dist/esm/patch.js.map +1 -1
  19. package/dist/esm/protocol.d.ts +18 -18
  20. package/dist/esm/refs.d.ts +1 -1
  21. package/dist/esm/replica.js +1 -1
  22. package/dist/esm/replica.js.map +1 -1
  23. package/dist/esm/schema/children.js.map +1 -1
  24. package/dist/esm/schema/fieldHelpers.d.ts +5 -5
  25. package/dist/esm/schema/fields.js.map +1 -1
  26. package/dist/esm/schema/index.js.map +1 -1
  27. package/dist/esm/schema/types/collection.d.ts +1 -1
  28. package/dist/esm/schema/types/compounds.d.ts +4 -4
  29. package/dist/esm/schema/types/fields.d.ts +11 -11
  30. package/dist/esm/schema/types/filters.d.ts +7 -7
  31. package/dist/esm/schema/types/shapes.d.ts +10 -9
  32. package/dist/esm/schema/types/synthetics.d.ts +12 -12
  33. package/dist/esm/schema/types.d.ts +3 -3
  34. package/dist/esm/schema/validation.d.ts +1 -1
  35. package/dist/esm/schema/validation.js.map +1 -1
  36. package/dist/esm/timestamp.js.map +1 -1
  37. package/dist/esm/timestamp.test.js.map +1 -1
  38. package/dist/esm/undo.js.map +1 -1
  39. package/dist/esm/utils.js.map +1 -1
  40. package/package.json +5 -8
  41. package/src/error.ts +1 -0
  42. package/src/protocol.ts +1 -1
  43. package/dist/cjs/EventSubscriber.d.ts +0 -18
  44. package/dist/cjs/EventSubscriber.js +0 -70
  45. package/dist/cjs/EventSubscriber.js.map +0 -1
  46. package/dist/cjs/baseline.d.ts +0 -5
  47. package/dist/cjs/baseline.js +0 -3
  48. package/dist/cjs/baseline.js.map +0 -1
  49. package/dist/cjs/batching.d.ts +0 -43
  50. package/dist/cjs/batching.js +0 -98
  51. package/dist/cjs/batching.js.map +0 -1
  52. package/dist/cjs/error.d.ts +0 -21
  53. package/dist/cjs/error.js +0 -42
  54. package/dist/cjs/error.js.map +0 -1
  55. package/dist/cjs/files.d.ts +0 -19
  56. package/dist/cjs/files.js +0 -19
  57. package/dist/cjs/files.js.map +0 -1
  58. package/dist/cjs/index.d.ts +0 -21
  59. package/dist/cjs/index.js +0 -44
  60. package/dist/cjs/index.js.map +0 -1
  61. package/dist/cjs/indexes.d.ts +0 -17
  62. package/dist/cjs/indexes.js +0 -146
  63. package/dist/cjs/indexes.js.map +0 -1
  64. package/dist/cjs/indexes.test.d.ts +0 -1
  65. package/dist/cjs/indexes.test.js +0 -156
  66. package/dist/cjs/indexes.test.js.map +0 -1
  67. package/dist/cjs/memo.d.ts +0 -6
  68. package/dist/cjs/memo.js +0 -25
  69. package/dist/cjs/memo.js.map +0 -1
  70. package/dist/cjs/memo.test.d.ts +0 -1
  71. package/dist/cjs/memo.test.js +0 -29
  72. package/dist/cjs/memo.test.js.map +0 -1
  73. package/dist/cjs/migration.d.ts +0 -174
  74. package/dist/cjs/migration.js +0 -310
  75. package/dist/cjs/migration.js.map +0 -1
  76. package/dist/cjs/oids.d.ts +0 -101
  77. package/dist/cjs/oids.js +0 -466
  78. package/dist/cjs/oids.js.map +0 -1
  79. package/dist/cjs/oids.test.d.ts +0 -1
  80. package/dist/cjs/oids.test.js +0 -409
  81. package/dist/cjs/oids.test.js.map +0 -1
  82. package/dist/cjs/operation.d.ts +0 -142
  83. package/dist/cjs/operation.js +0 -549
  84. package/dist/cjs/operation.js.map +0 -1
  85. package/dist/cjs/operation.test.d.ts +0 -1
  86. package/dist/cjs/operation.test.js +0 -977
  87. package/dist/cjs/operation.test.js.map +0 -1
  88. package/dist/cjs/patch.d.ts +0 -28
  89. package/dist/cjs/patch.js +0 -230
  90. package/dist/cjs/patch.js.map +0 -1
  91. package/dist/cjs/presence.d.ts +0 -29
  92. package/dist/cjs/presence.js +0 -3
  93. package/dist/cjs/presence.js.map +0 -1
  94. package/dist/cjs/protocol.d.ts +0 -145
  95. package/dist/cjs/protocol.js +0 -4
  96. package/dist/cjs/protocol.js.map +0 -1
  97. package/dist/cjs/refs.d.ts +0 -7
  98. package/dist/cjs/refs.js +0 -30
  99. package/dist/cjs/refs.js.map +0 -1
  100. package/dist/cjs/replica.d.ts +0 -28
  101. package/dist/cjs/replica.js +0 -29
  102. package/dist/cjs/replica.js.map +0 -1
  103. package/dist/cjs/schema/children.d.ts +0 -2
  104. package/dist/cjs/schema/children.js +0 -24
  105. package/dist/cjs/schema/children.js.map +0 -1
  106. package/dist/cjs/schema/defaults.test.d.ts +0 -1
  107. package/dist/cjs/schema/defaults.test.js +0 -34
  108. package/dist/cjs/schema/defaults.test.js.map +0 -1
  109. package/dist/cjs/schema/fieldHelpers.d.ts +0 -35
  110. package/dist/cjs/schema/fieldHelpers.js +0 -38
  111. package/dist/cjs/schema/fieldHelpers.js.map +0 -1
  112. package/dist/cjs/schema/fields.d.ts +0 -10
  113. package/dist/cjs/schema/fields.js +0 -172
  114. package/dist/cjs/schema/fields.js.map +0 -1
  115. package/dist/cjs/schema/index.d.ts +0 -54
  116. package/dist/cjs/schema/index.js +0 -63
  117. package/dist/cjs/schema/index.js.map +0 -1
  118. package/dist/cjs/schema/indexFilters.d.ts +0 -6
  119. package/dist/cjs/schema/indexFilters.js +0 -31
  120. package/dist/cjs/schema/indexFilters.js.map +0 -1
  121. package/dist/cjs/schema/types/collection.d.ts +0 -23
  122. package/dist/cjs/schema/types/collection.js +0 -3
  123. package/dist/cjs/schema/types/collection.js.map +0 -1
  124. package/dist/cjs/schema/types/compounds.d.ts +0 -11
  125. package/dist/cjs/schema/types/compounds.js +0 -3
  126. package/dist/cjs/schema/types/compounds.js.map +0 -1
  127. package/dist/cjs/schema/types/fields.d.ts +0 -55
  128. package/dist/cjs/schema/types/fields.js +0 -3
  129. package/dist/cjs/schema/types/fields.js.map +0 -1
  130. package/dist/cjs/schema/types/filters.d.ts +0 -29
  131. package/dist/cjs/schema/types/filters.js +0 -3
  132. package/dist/cjs/schema/types/filters.js.map +0 -1
  133. package/dist/cjs/schema/types/shapes.d.ts +0 -24
  134. package/dist/cjs/schema/types/shapes.js +0 -3
  135. package/dist/cjs/schema/types/shapes.js.map +0 -1
  136. package/dist/cjs/schema/types/synthetics.d.ts +0 -37
  137. package/dist/cjs/schema/types/synthetics.js +0 -3
  138. package/dist/cjs/schema/types/synthetics.js.map +0 -1
  139. package/dist/cjs/schema/types.d.ts +0 -18
  140. package/dist/cjs/schema/types.js +0 -23
  141. package/dist/cjs/schema/types.js.map +0 -1
  142. package/dist/cjs/schema/validation.d.ts +0 -14
  143. package/dist/cjs/schema/validation.js +0 -158
  144. package/dist/cjs/schema/validation.js.map +0 -1
  145. package/dist/cjs/timestamp.d.ts +0 -51
  146. package/dist/cjs/timestamp.js +0 -254
  147. package/dist/cjs/timestamp.js.map +0 -1
  148. package/dist/cjs/timestamp.test.d.ts +0 -1
  149. package/dist/cjs/timestamp.test.js +0 -105
  150. package/dist/cjs/timestamp.test.js.map +0 -1
  151. package/dist/cjs/undo.d.ts +0 -3
  152. package/dist/cjs/undo.js +0 -201
  153. package/dist/cjs/undo.js.map +0 -1
  154. package/dist/cjs/utils.d.ts +0 -20
  155. package/dist/cjs/utils.js +0 -146
  156. package/dist/cjs/utils.js.map +0 -1
  157. package/dist/cjs/utils.test.d.ts +0 -1
  158. package/dist/cjs/utils.test.js +0 -37
  159. package/dist/cjs/utils.test.js.map +0 -1
  160. package/dist/tsconfig-cjs.tsbuildinfo +0 -1
  161. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,977 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const vitest_1 = require("vitest");
4
- const files_js_1 = require("./files.js");
5
- const oids_js_1 = require("./oids.js");
6
- const operation_js_1 = require("./operation.js");
7
- function createClock(init = 0) {
8
- let i = init;
9
- const clock = () => (i++).toString();
10
- Object.defineProperty(clock, 'current', {
11
- get() {
12
- return i;
13
- },
14
- });
15
- return clock;
16
- }
17
- (0, vitest_1.describe)('creating diff patch operations', () => {
18
- (0, vitest_1.describe)('on flat objects', () => {
19
- (0, vitest_1.it)('generates and applies set and remove operations', () => {
20
- const from = { foo: 'bar', baz: 'qux', zing: 1 };
21
- (0, oids_js_1.assignOid)(from, 'test/a');
22
- const to = { foo: 'bar', baz: 'pop' };
23
- (0, oids_js_1.assignOid)(to, 'test/a');
24
- const ops = (0, operation_js_1.diffToPatches)(from, to, createClock());
25
- (0, vitest_1.expect)(ops).toMatchInlineSnapshot(`
26
- [
27
- {
28
- "data": {
29
- "name": "baz",
30
- "op": "set",
31
- "value": "pop",
32
- },
33
- "oid": "test/a",
34
- "timestamp": "0",
35
- },
36
- {
37
- "data": {
38
- "name": "zing",
39
- "op": "remove",
40
- },
41
- "oid": "test/a",
42
- "timestamp": "1",
43
- },
44
- ]
45
- `);
46
- const result = (0, operation_js_1.applyOperations)(from, ops);
47
- (0, vitest_1.expect)(result).toEqual(to);
48
- });
49
- });
50
- (0, vitest_1.describe)('on nested objects', () => {
51
- (0, vitest_1.it)('replaces whole nested objects', () => {
52
- const from = (0, oids_js_1.assignOid)({
53
- foo: 'bar',
54
- baz: (0, oids_js_1.assignOid)({ qux: 'corge' }, 'test/a:0'),
55
- }, 'test/a');
56
- const to = (0, oids_js_1.assignOid)({
57
- foo: 'bar',
58
- baz: (0, oids_js_1.assignOid)({ qux: 'grault' }, 'test/a:1'),
59
- }, 'test/a');
60
- const patches = (0, operation_js_1.diffToPatches)(from, to, createClock());
61
- (0, vitest_1.expect)(patches).toMatchInlineSnapshot(`
62
- [
63
- {
64
- "data": {
65
- "op": "initialize",
66
- "value": {
67
- "qux": "grault",
68
- },
69
- },
70
- "oid": "test/a:1",
71
- "timestamp": "0",
72
- },
73
- {
74
- "data": {
75
- "name": "baz",
76
- "op": "set",
77
- "value": {
78
- "@@type": "ref",
79
- "id": "test/a:1",
80
- },
81
- },
82
- "oid": "test/a",
83
- "timestamp": "1",
84
- },
85
- {
86
- "data": {
87
- "op": "delete",
88
- },
89
- "oid": "test/a:0",
90
- "timestamp": "2",
91
- },
92
- ]
93
- `);
94
- });
95
- (0, vitest_1.it)('replaces whole nested objects with different ids even if fields are the same', () => {
96
- const from = {
97
- foo: 'bar',
98
- baz: { qux: 'corge' },
99
- };
100
- (0, oids_js_1.assignOid)(from, 'test/a');
101
- (0, oids_js_1.assignOid)(from.baz, 'test/a:0');
102
- const to = {
103
- foo: 'bar',
104
- baz: { qux: 'corge' },
105
- };
106
- (0, oids_js_1.assignOid)(to, 'test/a');
107
- (0, oids_js_1.assignOid)(to.baz, 'test/a:1');
108
- const patches = (0, operation_js_1.diffToPatches)(from, to, createClock());
109
- (0, vitest_1.expect)(patches).toMatchInlineSnapshot(`
110
- [
111
- {
112
- "data": {
113
- "op": "initialize",
114
- "value": {
115
- "qux": "corge",
116
- },
117
- },
118
- "oid": "test/a:1",
119
- "timestamp": "0",
120
- },
121
- {
122
- "data": {
123
- "name": "baz",
124
- "op": "set",
125
- "value": {
126
- "@@type": "ref",
127
- "id": "test/a:1",
128
- },
129
- },
130
- "oid": "test/a",
131
- "timestamp": "1",
132
- },
133
- {
134
- "data": {
135
- "op": "delete",
136
- },
137
- "oid": "test/a:0",
138
- "timestamp": "2",
139
- },
140
- ]
141
- `);
142
- });
143
- (0, vitest_1.it)('does not replace objects with the same identity and same fields', () => {
144
- const from = {
145
- foo: 'bar',
146
- baz: { qux: 'corge' },
147
- };
148
- (0, oids_js_1.assignOid)(from, 'test/a');
149
- (0, oids_js_1.assignOid)(from.baz, 'test/a:0');
150
- const to = {
151
- foo: 'bar',
152
- baz: { qux: 'corge' },
153
- };
154
- (0, oids_js_1.assignOid)(to, 'test/a');
155
- (0, oids_js_1.assignOid)(to.baz, 'test/a:0');
156
- const patches = (0, operation_js_1.diffToPatches)(from, to, createClock());
157
- (0, vitest_1.expect)(patches).toEqual([]);
158
- });
159
- (0, vitest_1.it)('patches sub-objects with same identity', () => {
160
- const from = {
161
- foo: 'bar',
162
- baz: { qux: 'corge' },
163
- };
164
- (0, oids_js_1.assignOid)(from, 'test/a');
165
- (0, oids_js_1.assignOid)(from.baz, 'test/a:0');
166
- const to = {
167
- foo: 'bar',
168
- baz: { qux: 'fig' },
169
- };
170
- (0, oids_js_1.assignOid)(to, 'test/a');
171
- (0, oids_js_1.assignOid)(to.baz, 'test/a:0');
172
- const patches = (0, operation_js_1.diffToPatches)(from, to, createClock());
173
- (0, vitest_1.expect)(patches).toMatchInlineSnapshot(`
174
- [
175
- {
176
- "data": {
177
- "name": "qux",
178
- "op": "set",
179
- "value": "fig",
180
- },
181
- "oid": "test/a:0",
182
- "timestamp": "0",
183
- },
184
- ]
185
- `);
186
- });
187
- (0, vitest_1.it)('retains keys which are undefined in new object if defaultUndefined is set', () => {
188
- const from = {
189
- foo: 'bar',
190
- baz: { qux: 'corge' },
191
- };
192
- (0, oids_js_1.assignOid)(from, 'test/a');
193
- (0, oids_js_1.assignOid)(from.baz, 'test/a:0');
194
- const to = {
195
- foo: 'bip',
196
- };
197
- (0, oids_js_1.assignOid)(to, 'test/a');
198
- const patches = (0, operation_js_1.diffToPatches)(from, to, createClock(), undefined, [], {
199
- defaultUndefined: true,
200
- mergeUnknownObjects: true,
201
- });
202
- (0, vitest_1.expect)(patches).toMatchInlineSnapshot(`
203
- [
204
- {
205
- "data": {
206
- "name": "foo",
207
- "op": "set",
208
- "value": "bip",
209
- },
210
- "oid": "test/a",
211
- "timestamp": "0",
212
- },
213
- ]
214
- `);
215
- });
216
- });
217
- (0, vitest_1.describe)('on lists of primitives', () => {
218
- (0, vitest_1.it)('pushes items', async () => {
219
- (0, vitest_1.expect)((0, operation_js_1.applyOperations)((0, oids_js_1.assignOid)(['foo', 'bar'], 'test/a'), [
220
- {
221
- oid: 'test/a',
222
- timestamp: 'meh',
223
- data: {
224
- op: 'list-push',
225
- value: 'baz',
226
- },
227
- },
228
- ])).toEqual((0, oids_js_1.assignOid)(['foo', 'bar', 'baz'], 'test/a'));
229
- });
230
- vitest_1.it.todo('sets items');
231
- vitest_1.it.todo('inserts items');
232
- vitest_1.it.todo('removes items by index');
233
- vitest_1.it.todo('removes items by value');
234
- vitest_1.it.todo('moves items by index');
235
- vitest_1.it.todo('moves items by value');
236
- });
237
- vitest_1.describe.todo('on lists of objects', () => {
238
- vitest_1.it.todo('pushes items');
239
- vitest_1.it.todo('moves objects by identity');
240
- vitest_1.it.todo('removes objects by identity');
241
- });
242
- vitest_1.describe.todo('on lists of lists', () => {
243
- vitest_1.it.todo('rejects operations by value or identity');
244
- });
245
- (0, vitest_1.it)('should work for complex nested arrays and objects', () => {
246
- const from = {
247
- foo: {
248
- bar: [1, 2, 3],
249
- },
250
- baz: [
251
- {
252
- corge: true,
253
- },
254
- ],
255
- };
256
- (0, oids_js_1.assignOid)(from, 'test/a');
257
- (0, oids_js_1.assignOid)(from.foo, 'test/a:1');
258
- (0, oids_js_1.assignOid)(from.foo.bar, 'test/a:2');
259
- (0, oids_js_1.assignOid)(from.baz, 'test/a:3');
260
- (0, oids_js_1.assignOid)(from.baz[0], 'test/a:4');
261
- const to = {
262
- foo: {
263
- bar: [1, 2],
264
- bop: [0],
265
- },
266
- baz: [
267
- {
268
- corge: false,
269
- },
270
- {
271
- corge: false,
272
- },
273
- ],
274
- };
275
- (0, oids_js_1.assignOid)(to, 'test/a');
276
- (0, oids_js_1.assignOid)(to.foo, 'test/a:1');
277
- (0, oids_js_1.assignOid)(to.foo.bar, 'test/a:2');
278
- (0, oids_js_1.assignOid)(to.foo.bop, 'test/a:6');
279
- (0, oids_js_1.assignOid)(to.baz, 'test/a:3');
280
- (0, oids_js_1.assignOid)(to.baz[0], 'test/a:4');
281
- (0, oids_js_1.assignOid)(to.baz[1], 'test/a:5');
282
- (0, vitest_1.expect)((0, operation_js_1.diffToPatches)(from, to, createClock())).toMatchInlineSnapshot(`
283
- [
284
- {
285
- "data": {
286
- "count": 1,
287
- "index": 2,
288
- "op": "list-delete",
289
- },
290
- "oid": "test/a:2",
291
- "timestamp": "0",
292
- },
293
- {
294
- "data": {
295
- "op": "initialize",
296
- "value": [
297
- 0,
298
- ],
299
- },
300
- "oid": "test/a:6",
301
- "timestamp": "1",
302
- },
303
- {
304
- "data": {
305
- "name": "bop",
306
- "op": "set",
307
- "value": {
308
- "@@type": "ref",
309
- "id": "test/a:6",
310
- },
311
- },
312
- "oid": "test/a:1",
313
- "timestamp": "2",
314
- },
315
- {
316
- "data": {
317
- "name": "corge",
318
- "op": "set",
319
- "value": false,
320
- },
321
- "oid": "test/a:4",
322
- "timestamp": "3",
323
- },
324
- {
325
- "data": {
326
- "op": "initialize",
327
- "value": {
328
- "corge": false,
329
- },
330
- },
331
- "oid": "test/a:5",
332
- "timestamp": "4",
333
- },
334
- {
335
- "data": {
336
- "name": 1,
337
- "op": "set",
338
- "value": {
339
- "@@type": "ref",
340
- "id": "test/a:5",
341
- },
342
- },
343
- "oid": "test/a:3",
344
- "timestamp": "5",
345
- },
346
- ]
347
- `);
348
- });
349
- (0, vitest_1.it)('should try to merge unknown objects if specified to do so', () => {
350
- const from = {
351
- foo: {
352
- bar: [1, 2, 3],
353
- },
354
- baz: [
355
- {
356
- corge: true,
357
- },
358
- ],
359
- };
360
- (0, oids_js_1.assignOid)(from, 'test/a');
361
- (0, oids_js_1.assignOidsToAllSubObjects)(from, createClock());
362
- const to = {
363
- foo: {
364
- bar: [1, 2],
365
- bop: [0],
366
- },
367
- baz: [
368
- {
369
- corge: false,
370
- },
371
- {
372
- corge: false,
373
- },
374
- ],
375
- };
376
- (0, vitest_1.expect)((0, operation_js_1.diffToPatches)(from, to, createClock(), createClock(5), [], {
377
- mergeUnknownObjects: true,
378
- })).toMatchInlineSnapshot(`
379
- [
380
- {
381
- "data": {
382
- "count": 1,
383
- "index": 2,
384
- "op": "list-delete",
385
- },
386
- "oid": "test/a:1",
387
- "timestamp": "0",
388
- },
389
- {
390
- "data": {
391
- "op": "initialize",
392
- "value": [
393
- 0,
394
- ],
395
- },
396
- "oid": "test/a:5",
397
- "timestamp": "1",
398
- },
399
- {
400
- "data": {
401
- "name": "bop",
402
- "op": "set",
403
- "value": {
404
- "@@type": "ref",
405
- "id": "test/a:5",
406
- },
407
- },
408
- "oid": "test/a:0",
409
- "timestamp": "2",
410
- },
411
- {
412
- "data": {
413
- "name": "corge",
414
- "op": "set",
415
- "value": false,
416
- },
417
- "oid": "test/a:3",
418
- "timestamp": "3",
419
- },
420
- {
421
- "data": {
422
- "op": "initialize",
423
- "value": {
424
- "corge": false,
425
- },
426
- },
427
- "oid": "test/a:6",
428
- "timestamp": "4",
429
- },
430
- {
431
- "data": {
432
- "name": 1,
433
- "op": "set",
434
- "value": {
435
- "@@type": "ref",
436
- "id": "test/a:6",
437
- },
438
- },
439
- "oid": "test/a:2",
440
- "timestamp": "5",
441
- },
442
- ]
443
- `);
444
- });
445
- (0, vitest_1.it)('should not diff file refs', () => {
446
- const from = {
447
- foo: {
448
- file: (0, files_js_1.createFileRef)('abc123'),
449
- },
450
- bar: [(0, files_js_1.createFileRef)('def456'), (0, files_js_1.createFileRef)('ghi789')],
451
- };
452
- (0, oids_js_1.assignOid)(from, 'test/a');
453
- (0, oids_js_1.assignOidsToAllSubObjects)(from, createClock());
454
- const to = {
455
- foo: {
456
- file: (0, files_js_1.createFileRef)('abc456'),
457
- },
458
- bar: [(0, files_js_1.createFileRef)('def456')],
459
- };
460
- (0, vitest_1.expect)((0, operation_js_1.diffToPatches)(from, to, createClock(), createClock(5), [], {
461
- mergeUnknownObjects: true,
462
- })).toMatchInlineSnapshot(`
463
- [
464
- {
465
- "data": {
466
- "name": "file",
467
- "op": "set",
468
- "value": {
469
- "@@type": "file",
470
- "id": "abc456",
471
- },
472
- },
473
- "oid": "test/a:0",
474
- "timestamp": "0",
475
- },
476
- {
477
- "data": {
478
- "count": 1,
479
- "index": 1,
480
- "op": "list-delete",
481
- },
482
- "oid": "test/a:1",
483
- "timestamp": "1",
484
- },
485
- ]
486
- `);
487
- });
488
- (0, vitest_1.it)('should assign a new OID to objects which had an incompatible existing OID', () => {
489
- const from = {
490
- foo: {
491
- bar: [1, 2, 3],
492
- },
493
- };
494
- (0, oids_js_1.assignOid)(from, 'test/a');
495
- (0, oids_js_1.assignOidsToAllSubObjects)(from, createClock());
496
- const to = {
497
- foo: {
498
- bar: [1, 2],
499
- },
500
- };
501
- (0, oids_js_1.assignOid)(to, 'test/a');
502
- (0, oids_js_1.assignOid)(to.foo, 'uff/b');
503
- (0, oids_js_1.assignOidsToAllSubObjects)(to.foo, createClock());
504
- (0, vitest_1.expect)((0, operation_js_1.diffToPatches)(from, to, createClock(), createClock(5), [], {
505
- mergeUnknownObjects: true,
506
- })).toMatchInlineSnapshot(`
507
- [
508
- {
509
- "data": {
510
- "op": "initialize",
511
- "value": [
512
- 1,
513
- 2,
514
- ],
515
- },
516
- "oid": "test/a:6",
517
- "timestamp": "0",
518
- },
519
- {
520
- "data": {
521
- "op": "initialize",
522
- "value": {
523
- "bar": {
524
- "@@type": "ref",
525
- "id": "test/a:6",
526
- },
527
- },
528
- },
529
- "oid": "test/a:5",
530
- "timestamp": "1",
531
- },
532
- {
533
- "data": {
534
- "name": "foo",
535
- "op": "set",
536
- "value": {
537
- "@@type": "ref",
538
- "id": "test/a:5",
539
- },
540
- },
541
- "oid": "test/a",
542
- "timestamp": "2",
543
- },
544
- {
545
- "data": {
546
- "op": "delete",
547
- },
548
- "oid": "test/a:0",
549
- "timestamp": "3",
550
- },
551
- ]
552
- `);
553
- });
554
- // an edge case - if a subobject which contains nested objects changes identity,
555
- // this gets written as a new init patch tree - we want to ensure all init subobjects
556
- // in that tree have compatible OIDs.
557
- (0, vitest_1.it)('should assign a new OID to objects which have an incompatible OID when parent identity changes', () => {
558
- const from = {
559
- bar: [],
560
- };
561
- (0, oids_js_1.assignOid)(from, 'test/a');
562
- (0, oids_js_1.assignOid)(from.bar, 'test/random');
563
- const to = {
564
- bar: [{ baz: 1 }, { baz: 2 }],
565
- };
566
- (0, oids_js_1.assignOid)(to, 'test/a');
567
- (0, oids_js_1.assignOidsToAllSubObjects)(to, createClock());
568
- (0, oids_js_1.assignOid)(to.bar[0], 'uff/b');
569
- (0, vitest_1.expect)((0, operation_js_1.diffToPatches)(from, to, createClock(), createClock(5), [], {
570
- mergeUnknownObjects: true,
571
- })).toMatchInlineSnapshot(`
572
- [
573
- {
574
- "data": {
575
- "op": "initialize",
576
- "value": {
577
- "baz": 1,
578
- },
579
- },
580
- "oid": "test/a:5",
581
- "timestamp": "0",
582
- },
583
- {
584
- "data": {
585
- "op": "initialize",
586
- "value": {
587
- "baz": 2,
588
- },
589
- },
590
- "oid": "test/a:2",
591
- "timestamp": "1",
592
- },
593
- {
594
- "data": {
595
- "op": "initialize",
596
- "value": [
597
- {
598
- "@@type": "ref",
599
- "id": "test/a:5",
600
- },
601
- {
602
- "@@type": "ref",
603
- "id": "test/a:2",
604
- },
605
- ],
606
- },
607
- "oid": "test/a:0",
608
- "timestamp": "2",
609
- },
610
- {
611
- "data": {
612
- "name": "bar",
613
- "op": "set",
614
- "value": {
615
- "@@type": "ref",
616
- "id": "test/a:0",
617
- },
618
- },
619
- "oid": "test/a",
620
- "timestamp": "3",
621
- },
622
- {
623
- "data": {
624
- "op": "delete",
625
- },
626
- "oid": "test/random",
627
- "timestamp": "4",
628
- },
629
- ]
630
- `);
631
- });
632
- });
633
- (0, vitest_1.describe)('substituting refs with objects', () => {
634
- (0, vitest_1.it)('does nothing when no refs exist', () => {
635
- const root = {
636
- foo: 'bar',
637
- };
638
- (0, oids_js_1.assignOid)(root, 'test/a');
639
- const substituted = (0, operation_js_1.substituteRefsWithObjects)(root, new Map());
640
- (0, vitest_1.expect)(root).toEqual((0, oids_js_1.assignOid)({
641
- foo: 'bar',
642
- }, 'test/a'));
643
- (0, vitest_1.expect)(substituted).toEqual([]);
644
- });
645
- (0, vitest_1.it)('inserts top level objects with oids', () => {
646
- const root = {
647
- foo: {
648
- '@@type': 'ref',
649
- id: 'test/1:a',
650
- },
651
- qux: 1,
652
- };
653
- (0, oids_js_1.assignOid)(root, 'test/1');
654
- const substituted = (0, operation_js_1.substituteRefsWithObjects)(root, new Map([['test/1:a', { foo: 'bar' }]]));
655
- (0, vitest_1.expect)(root).toEqual((0, oids_js_1.assignOid)({
656
- foo: (0, oids_js_1.assignOid)({
657
- foo: 'bar',
658
- }, 'test/1:a'),
659
- qux: 1,
660
- }, 'test/1'));
661
- (0, vitest_1.expect)(substituted).toEqual(['test/1:a']);
662
- (0, vitest_1.expect)((0, oids_js_1.getOid)(root)).toEqual('test/1');
663
- (0, vitest_1.expect)((0, oids_js_1.getOid)(root.foo)).toEqual('test/1:a');
664
- });
665
- (0, vitest_1.it)('inserts nested objects with oids', () => {
666
- const root = {
667
- foo: {
668
- '@@type': 'ref',
669
- id: 'test/1:a',
670
- },
671
- };
672
- (0, oids_js_1.assignOid)(root, 'test/1');
673
- const substituted = (0, operation_js_1.substituteRefsWithObjects)(root, new Map([
674
- [
675
- 'test/1:a',
676
- {
677
- foo: 'bar',
678
- baz: {
679
- '@@type': 'ref',
680
- id: 'test/1:b',
681
- },
682
- },
683
- ],
684
- [
685
- 'test/1:b',
686
- {
687
- qux: 'corge',
688
- },
689
- ],
690
- ]));
691
- (0, vitest_1.expect)(root).toEqual((0, oids_js_1.assignOid)({
692
- foo: (0, oids_js_1.assignOid)({
693
- foo: 'bar',
694
- baz: (0, oids_js_1.assignOid)({
695
- qux: 'corge',
696
- }, 'test/1:b'),
697
- }, 'test/1:a'),
698
- }, 'test/1'));
699
- (0, vitest_1.expect)(substituted).toEqual(['test/1:a', 'test/1:b']);
700
- (0, vitest_1.expect)((0, oids_js_1.getOid)(root)).toEqual('test/1');
701
- (0, vitest_1.expect)((0, oids_js_1.getOid)(root.foo)).toEqual('test/1:a');
702
- (0, vitest_1.expect)((0, oids_js_1.getOid)(root.foo.baz)).toEqual('test/1:b');
703
- });
704
- (0, vitest_1.it)('substitutes arrays of objects', () => {
705
- const root = {
706
- foo: {
707
- '@@type': 'ref',
708
- id: 'test/1:c',
709
- },
710
- };
711
- (0, oids_js_1.assignOid)(root, 'test/1');
712
- const substituted = (0, operation_js_1.substituteRefsWithObjects)(root, new Map([
713
- [
714
- 'test/1:c',
715
- [
716
- {
717
- '@@type': 'ref',
718
- id: 'test/1:a',
719
- },
720
- {
721
- '@@type': 'ref',
722
- id: 'test/1:b',
723
- },
724
- ],
725
- ],
726
- [
727
- 'test/1:a',
728
- {
729
- foo: 'bar',
730
- },
731
- ],
732
- [
733
- 'test/1:b',
734
- {
735
- qux: 'corge',
736
- },
737
- ],
738
- ]));
739
- (0, vitest_1.expect)(root).toEqual({
740
- foo: (0, oids_js_1.assignOid)([
741
- (0, oids_js_1.assignOid)({
742
- foo: 'bar',
743
- }, 'test/1:a'),
744
- (0, oids_js_1.assignOid)({
745
- qux: 'corge',
746
- }, 'test/1:b'),
747
- ], 'test/1:c'),
748
- });
749
- (0, vitest_1.expect)(substituted).toEqual(['test/1:c', 'test/1:a', 'test/1:b']);
750
- (0, vitest_1.expect)((0, oids_js_1.getOid)(root)).toEqual('test/1');
751
- (0, vitest_1.expect)((0, oids_js_1.getOid)(root.foo)).toEqual('test/1:c');
752
- (0, vitest_1.expect)((0, oids_js_1.getOid)(root.foo[0])).toEqual('test/1:a');
753
- (0, vitest_1.expect)((0, oids_js_1.getOid)(root.foo[1])).toEqual('test/1:b');
754
- });
755
- vitest_1.it.todo('substitutes arrays of arrays of objects');
756
- });
757
- (0, vitest_1.describe)('creating patches from initial state', () => {
758
- (0, vitest_1.it)('adds oids to all sub-objects', async () => {
759
- let i = 0;
760
- function createSubId() {
761
- return (i++).toString();
762
- }
763
- const result = (0, operation_js_1.initialToPatches)({
764
- foo: {
765
- bar: 'baz',
766
- },
767
- qux: [
768
- {
769
- corge: 'grault',
770
- },
771
- {
772
- bin: {
773
- oof: 1,
774
- },
775
- },
776
- ],
777
- }, 'test/a', createClock(), createSubId);
778
- /**
779
- * Patches should not include assigned OID property
780
- */
781
- (0, vitest_1.expect)(result).toMatchInlineSnapshot(`
782
- [
783
- {
784
- "data": {
785
- "op": "initialize",
786
- "value": {
787
- "bar": "baz",
788
- },
789
- },
790
- "oid": "test/a:0",
791
- "timestamp": "0",
792
- },
793
- {
794
- "data": {
795
- "op": "initialize",
796
- "value": {
797
- "corge": "grault",
798
- },
799
- },
800
- "oid": "test/a:2",
801
- "timestamp": "1",
802
- },
803
- {
804
- "data": {
805
- "op": "initialize",
806
- "value": {
807
- "oof": 1,
808
- },
809
- },
810
- "oid": "test/a:4",
811
- "timestamp": "2",
812
- },
813
- {
814
- "data": {
815
- "op": "initialize",
816
- "value": {
817
- "bin": {
818
- "@@type": "ref",
819
- "id": "test/a:4",
820
- },
821
- },
822
- },
823
- "oid": "test/a:3",
824
- "timestamp": "3",
825
- },
826
- {
827
- "data": {
828
- "op": "initialize",
829
- "value": [
830
- {
831
- "@@type": "ref",
832
- "id": "test/a:2",
833
- },
834
- {
835
- "@@type": "ref",
836
- "id": "test/a:3",
837
- },
838
- ],
839
- },
840
- "oid": "test/a:1",
841
- "timestamp": "4",
842
- },
843
- {
844
- "data": {
845
- "op": "initialize",
846
- "value": {
847
- "foo": {
848
- "@@type": "ref",
849
- "id": "test/a:0",
850
- },
851
- "qux": {
852
- "@@type": "ref",
853
- "id": "test/a:1",
854
- },
855
- },
856
- },
857
- "oid": "test/a",
858
- "timestamp": "5",
859
- },
860
- ]
861
- `);
862
- });
863
- });
864
- (0, vitest_1.describe)('applying individual operations', () => {
865
- (0, vitest_1.it)('applies a list-remove of only the last instance', () => {
866
- (0, vitest_1.expect)((0, operation_js_1.applyPatch)(['a', 'b', 'c', 'a', 'b'], {
867
- op: 'list-remove',
868
- value: 'a',
869
- only: 'last',
870
- })).toEqual(['a', 'b', 'c', 'b']);
871
- });
872
- (0, vitest_1.it)('applies a list-remove of only the first instance', () => {
873
- (0, vitest_1.expect)((0, operation_js_1.applyPatch)(['a', 'b', 'c', 'a', 'b'], {
874
- op: 'list-remove',
875
- value: 'a',
876
- only: 'first',
877
- })).toEqual(['b', 'c', 'a', 'b']);
878
- });
879
- (0, vitest_1.it)('applies a list-remove of all instances', () => {
880
- (0, vitest_1.expect)((0, operation_js_1.applyPatch)(['a', 'b', 'c', 'a', 'b'], {
881
- op: 'list-remove',
882
- value: 'a',
883
- })).toEqual(['b', 'c', 'b']);
884
- });
885
- (0, vitest_1.it)('applies a list-remove of an object ref', () => {
886
- (0, vitest_1.expect)((0, operation_js_1.applyPatch)([
887
- (0, oids_js_1.createRef)('a'),
888
- (0, oids_js_1.createRef)('b'),
889
- (0, oids_js_1.createRef)('c'),
890
- (0, oids_js_1.createRef)('a'),
891
- (0, oids_js_1.createRef)('b'),
892
- ], {
893
- op: 'list-remove',
894
- value: (0, oids_js_1.createRef)('a'),
895
- only: 'last',
896
- })).toEqual([(0, oids_js_1.createRef)('a'), (0, oids_js_1.createRef)('b'), (0, oids_js_1.createRef)('c'), (0, oids_js_1.createRef)('b')]);
897
- });
898
- (0, vitest_1.it)('applies a list-add of a nonexistent item', () => {
899
- (0, vitest_1.expect)((0, operation_js_1.applyPatch)(['a', 'b', 'c'], {
900
- op: 'list-add',
901
- value: 'd',
902
- })).toEqual(['a', 'b', 'c', 'd']);
903
- });
904
- (0, vitest_1.it)('does not apply a list-add if the item is already present', () => {
905
- (0, vitest_1.expect)((0, operation_js_1.applyPatch)(['a', 'b', 'c'], {
906
- op: 'list-add',
907
- value: 'b',
908
- })).toEqual(['a', 'b', 'c']);
909
- });
910
- });
911
- (0, vitest_1.describe)('collecting deleted refs during patch application', () => {
912
- (0, vitest_1.it)('collects refs that are removed from a list', () => {
913
- const refs = [];
914
- (0, vitest_1.expect)((0, operation_js_1.applyPatch)([
915
- (0, oids_js_1.createRef)('a'),
916
- (0, oids_js_1.createRef)('b'),
917
- (0, oids_js_1.createRef)('c'),
918
- (0, oids_js_1.createRef)('d'),
919
- (0, oids_js_1.createRef)('e'),
920
- ], {
921
- op: 'list-remove',
922
- value: (0, oids_js_1.createRef)('c'),
923
- }, refs)).toEqual([(0, oids_js_1.createRef)('a'), (0, oids_js_1.createRef)('b'), (0, oids_js_1.createRef)('d'), (0, oids_js_1.createRef)('e')]);
924
- (0, vitest_1.expect)(refs).toEqual([(0, oids_js_1.createRef)('c')]);
925
- });
926
- (0, vitest_1.it)('collects a deleted ref field from an object', () => {
927
- const refs = [];
928
- (0, vitest_1.expect)((0, operation_js_1.applyPatch)({
929
- a: (0, oids_js_1.createRef)('a'),
930
- b: (0, oids_js_1.createRef)('b'),
931
- c: (0, oids_js_1.createRef)('c'),
932
- }, {
933
- op: 'remove',
934
- name: 'b',
935
- }, refs)).toEqual({
936
- a: (0, oids_js_1.createRef)('a'),
937
- c: (0, oids_js_1.createRef)('c'),
938
- });
939
- (0, vitest_1.expect)(refs).toEqual([(0, oids_js_1.createRef)('b')]);
940
- });
941
- (0, vitest_1.it)('collects all refs in a deleted object', () => {
942
- const refs = [];
943
- (0, vitest_1.expect)((0, operation_js_1.applyPatch)({
944
- a: (0, oids_js_1.createRef)('a'),
945
- b: (0, oids_js_1.createRef)('b'),
946
- c: (0, oids_js_1.createRef)('c'),
947
- }, {
948
- op: 'delete',
949
- }, refs)).toEqual(undefined);
950
- (0, vitest_1.expect)(refs).toEqual([(0, oids_js_1.createRef)('a'), (0, oids_js_1.createRef)('b'), (0, oids_js_1.createRef)('c')]);
951
- });
952
- (0, vitest_1.it)('collects all refs in a deleted list', () => {
953
- const refs = [];
954
- (0, vitest_1.expect)((0, operation_js_1.applyPatch)([(0, oids_js_1.createRef)('a'), (0, oids_js_1.createRef)('b'), (0, oids_js_1.createRef)('c')], {
955
- op: 'delete',
956
- }, refs)).toEqual(undefined);
957
- (0, vitest_1.expect)(refs).toEqual([(0, oids_js_1.createRef)('a'), (0, oids_js_1.createRef)('b'), (0, oids_js_1.createRef)('c')]);
958
- });
959
- (0, vitest_1.it)('collects a ref in a replaced field', () => {
960
- const refs = [];
961
- (0, vitest_1.expect)((0, operation_js_1.applyPatch)({
962
- a: (0, oids_js_1.createRef)('a'),
963
- b: (0, oids_js_1.createRef)('b'),
964
- c: (0, oids_js_1.createRef)('c'),
965
- }, {
966
- op: 'set',
967
- name: 'b',
968
- value: (0, oids_js_1.createRef)('d'),
969
- }, refs)).toEqual({
970
- a: (0, oids_js_1.createRef)('a'),
971
- b: (0, oids_js_1.createRef)('d'),
972
- c: (0, oids_js_1.createRef)('c'),
973
- });
974
- (0, vitest_1.expect)(refs).toEqual([(0, oids_js_1.createRef)('b')]);
975
- });
976
- });
977
- //# sourceMappingURL=operation.test.js.map