jazz-tools 0.19.0 → 0.19.2
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.
- package/.turbo/turbo-build.log +53 -53
- package/CHANGELOG.md +21 -0
- package/dist/{chunk-P3YLNFN4.js → chunk-NCNM6UDZ.js} +61 -22
- package/dist/chunk-NCNM6UDZ.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/inspector/{custom-element-QESCMFY7.js → custom-element-ABVPHX53.js} +1118 -465
- package/dist/inspector/custom-element-ABVPHX53.js.map +1 -0
- package/dist/inspector/index.js +1090 -437
- package/dist/inspector/index.js.map +1 -1
- package/dist/inspector/register-custom-element.js +1 -1
- package/dist/inspector/tests/utils/history.test.d.ts +2 -0
- package/dist/inspector/tests/utils/history.test.d.ts.map +1 -0
- package/dist/inspector/tests/viewer/co-value-editor.test.d.ts +2 -0
- package/dist/inspector/tests/viewer/co-value-editor.test.d.ts.map +1 -0
- package/dist/inspector/tests/viewer/comap-view.test.d.ts +2 -0
- package/dist/inspector/tests/viewer/comap-view.test.d.ts.map +1 -0
- package/dist/inspector/ui/icon.d.ts +6 -0
- package/dist/inspector/ui/icon.d.ts.map +1 -1
- package/dist/inspector/ui/icons/add-icon.d.ts +2 -0
- package/dist/inspector/ui/icons/add-icon.d.ts.map +1 -0
- package/dist/inspector/ui/icons/edit-icon.d.ts +2 -0
- package/dist/inspector/ui/icons/edit-icon.d.ts.map +1 -0
- package/dist/inspector/ui/icons/history.d.ts +2 -0
- package/dist/inspector/ui/icons/history.d.ts.map +1 -0
- package/dist/inspector/utils/history.d.ts +3 -0
- package/dist/inspector/utils/history.d.ts.map +1 -0
- package/dist/inspector/utils/transactions-changes.d.ts +38 -0
- package/dist/inspector/utils/transactions-changes.d.ts.map +1 -0
- package/dist/inspector/viewer/co-map-view.d.ts +9 -0
- package/dist/inspector/viewer/co-map-view.d.ts.map +1 -0
- package/dist/inspector/viewer/co-value-editor.d.ts +10 -0
- package/dist/inspector/viewer/co-value-editor.d.ts.map +1 -0
- package/dist/inspector/viewer/grid-view.d.ts +3 -2
- package/dist/inspector/viewer/grid-view.d.ts.map +1 -1
- package/dist/inspector/viewer/history-view.d.ts.map +1 -1
- package/dist/inspector/viewer/page.d.ts.map +1 -1
- package/dist/testing.js +1 -1
- package/dist/tools/coValues/CoFieldInit.d.ts +2 -1
- package/dist/tools/coValues/CoFieldInit.d.ts.map +1 -1
- package/dist/tools/coValues/deepLoading.d.ts +8 -7
- package/dist/tools/coValues/deepLoading.d.ts.map +1 -1
- package/dist/tools/coValues/interfaces.d.ts +3 -3
- package/dist/tools/coValues/interfaces.d.ts.map +1 -1
- package/dist/tools/coValues/schemaUnion.d.ts +6 -9
- package/dist/tools/coValues/schemaUnion.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.d.ts +18 -7
- package/dist/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/typeConverters/CoFieldSchemaInit.d.ts +3 -2
- package/dist/tools/implementation/zodSchema/typeConverters/CoFieldSchemaInit.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/unionUtils.d.ts.map +1 -1
- package/dist/tools/subscribe/SubscriptionScope.d.ts +1 -0
- package/dist/tools/subscribe/SubscriptionScope.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/inspector/tests/utils/history.test.ts +401 -0
- package/src/inspector/tests/viewer/co-value-editor.test.tsx +903 -0
- package/src/inspector/tests/viewer/comap-view.test.tsx +581 -0
- package/src/inspector/ui/icon.tsx +6 -0
- package/src/inspector/ui/icons/add-icon.tsx +21 -0
- package/src/inspector/ui/icons/edit-icon.tsx +17 -0
- package/src/inspector/ui/icons/history.tsx +28 -0
- package/src/inspector/ui/modal.tsx +3 -3
- package/src/inspector/utils/history.ts +49 -0
- package/src/inspector/utils/transactions-changes.ts +98 -0
- package/src/inspector/viewer/co-map-view.tsx +312 -0
- package/src/inspector/viewer/co-value-editor.tsx +164 -0
- package/src/inspector/viewer/grid-view.tsx +139 -10
- package/src/inspector/viewer/history-view.tsx +16 -118
- package/src/inspector/viewer/page.tsx +13 -0
- package/src/react-core/tests/usePassPhraseAuth.test.ts +1 -1
- package/src/tools/coValues/CoFieldInit.ts +6 -3
- package/src/tools/coValues/coList.ts +1 -1
- package/src/tools/coValues/deepLoading.ts +85 -71
- package/src/tools/coValues/interfaces.ts +3 -3
- package/src/tools/coValues/schemaUnion.ts +19 -14
- package/src/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.ts +69 -9
- package/src/tools/implementation/zodSchema/typeConverters/CoFieldSchemaInit.ts +12 -7
- package/src/tools/implementation/zodSchema/unionUtils.ts +35 -4
- package/src/tools/subscribe/SubscriptionScope.ts +3 -14
- package/src/tools/tests/coDiscriminatedUnion.test.ts +347 -5
- package/src/tools/tests/coVector.test.ts +43 -0
- package/src/tools/tests/deepLoading.test.ts +55 -59
- package/src/tools/tests/schema.resolved.test.ts +70 -1
- package/dist/chunk-P3YLNFN4.js.map +0 -1
- package/dist/inspector/custom-element-QESCMFY7.js.map +0 -1
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
import { assert, describe, expect, it } from "vitest";
|
|
2
|
+
import { createJazzTestAccount, setupJazzTestSync } from "jazz-tools/testing";
|
|
3
|
+
import { co, z } from "jazz-tools";
|
|
4
|
+
import { restoreCoMapToTimestamp } from "../../utils/history";
|
|
5
|
+
import { JsonObject } from "cojson";
|
|
6
|
+
import { loadCoValueOrFail, waitFor } from "../../../tools/tests/utils";
|
|
7
|
+
|
|
8
|
+
const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
9
|
+
|
|
10
|
+
describe("restoreCoMapToTimestamp", async () => {
|
|
11
|
+
const account = await setupJazzTestSync();
|
|
12
|
+
|
|
13
|
+
it("should restore CoMap to a previous timestamp", async () => {
|
|
14
|
+
const value = co
|
|
15
|
+
.map({
|
|
16
|
+
pet: z.string(),
|
|
17
|
+
age: z.number(),
|
|
18
|
+
})
|
|
19
|
+
.create({ pet: "dog", age: 10 }, account);
|
|
20
|
+
|
|
21
|
+
await sleep(2);
|
|
22
|
+
value.$jazz.set("pet", "cat");
|
|
23
|
+
value.$jazz.set("age", 20);
|
|
24
|
+
|
|
25
|
+
const timestamps = value.$jazz.raw.core.verifiedTransactions.map(
|
|
26
|
+
(tx) => tx.madeAt,
|
|
27
|
+
);
|
|
28
|
+
const initialTimestamp = timestamps[0]!;
|
|
29
|
+
|
|
30
|
+
expect(value.pet).toBe("cat");
|
|
31
|
+
expect(value.age).toBe(20);
|
|
32
|
+
|
|
33
|
+
restoreCoMapToTimestamp(value.$jazz.raw, initialTimestamp, false);
|
|
34
|
+
|
|
35
|
+
expect(value.pet).toBe("dog");
|
|
36
|
+
expect(value.age).toBe(10);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it("should restore single property change", async () => {
|
|
40
|
+
const value = co
|
|
41
|
+
.map({
|
|
42
|
+
pet: z.string(),
|
|
43
|
+
})
|
|
44
|
+
.create({ pet: "dog" }, account);
|
|
45
|
+
|
|
46
|
+
await sleep(2);
|
|
47
|
+
value.$jazz.set("pet", "cat");
|
|
48
|
+
|
|
49
|
+
const timestamps = value.$jazz.raw.core.verifiedTransactions.map(
|
|
50
|
+
(tx) => tx.madeAt,
|
|
51
|
+
);
|
|
52
|
+
const initialTimestamp = timestamps[0]!;
|
|
53
|
+
|
|
54
|
+
expect(value.pet).toBe("cat");
|
|
55
|
+
|
|
56
|
+
restoreCoMapToTimestamp(value.$jazz.raw, initialTimestamp, false);
|
|
57
|
+
|
|
58
|
+
expect(value.pet).toBe("dog");
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it("should restore multiple property changes at different times", async () => {
|
|
62
|
+
const value = co
|
|
63
|
+
.map({
|
|
64
|
+
a: z.string(),
|
|
65
|
+
b: z.string(),
|
|
66
|
+
c: z.string(),
|
|
67
|
+
})
|
|
68
|
+
.create({ a: "1", b: "2", c: "3" }, account);
|
|
69
|
+
|
|
70
|
+
await sleep(2);
|
|
71
|
+
value.$jazz.set("a", "4");
|
|
72
|
+
await sleep(2);
|
|
73
|
+
value.$jazz.set("b", "5");
|
|
74
|
+
await sleep(2);
|
|
75
|
+
value.$jazz.set("c", "6");
|
|
76
|
+
|
|
77
|
+
const timestamps = value.$jazz.raw.core.verifiedTransactions.map(
|
|
78
|
+
(tx) => tx.madeAt,
|
|
79
|
+
);
|
|
80
|
+
const initialTimestamp = timestamps[0]!;
|
|
81
|
+
|
|
82
|
+
expect(value.a).toBe("4");
|
|
83
|
+
expect(value.b).toBe("5");
|
|
84
|
+
expect(value.c).toBe("6");
|
|
85
|
+
|
|
86
|
+
restoreCoMapToTimestamp(value.$jazz.raw, initialTimestamp, false);
|
|
87
|
+
|
|
88
|
+
expect(value.a).toBe("1");
|
|
89
|
+
expect(value.b).toBe("2");
|
|
90
|
+
expect(value.c).toBe("3");
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it("should not remove unknown properties when flag is false", async () => {
|
|
94
|
+
const value = co
|
|
95
|
+
.map({
|
|
96
|
+
pet: z.string(),
|
|
97
|
+
age: z.number().optional(),
|
|
98
|
+
})
|
|
99
|
+
.create({ pet: "dog" }, account);
|
|
100
|
+
|
|
101
|
+
await sleep(2);
|
|
102
|
+
value.$jazz.set("age", 10);
|
|
103
|
+
await sleep(2);
|
|
104
|
+
value.$jazz.set("pet", "cat");
|
|
105
|
+
|
|
106
|
+
const timestamps = value.$jazz.raw.core.verifiedTransactions.map(
|
|
107
|
+
(tx) => tx.madeAt,
|
|
108
|
+
);
|
|
109
|
+
const initialTimestamp = timestamps[0]!;
|
|
110
|
+
|
|
111
|
+
expect(value.pet).toBe("cat");
|
|
112
|
+
expect(value.age).toBe(10);
|
|
113
|
+
|
|
114
|
+
restoreCoMapToTimestamp(value.$jazz.raw, initialTimestamp, false);
|
|
115
|
+
|
|
116
|
+
expect(value.pet).toBe("dog");
|
|
117
|
+
expect(value.age).toBe(10);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it("should remove unknown properties when flag is true", async () => {
|
|
121
|
+
const value = co
|
|
122
|
+
.map({
|
|
123
|
+
pet: z.string(),
|
|
124
|
+
age: z.number().optional(),
|
|
125
|
+
})
|
|
126
|
+
.create({ pet: "dog" }, account);
|
|
127
|
+
|
|
128
|
+
await sleep(2);
|
|
129
|
+
value.$jazz.set("age", 10);
|
|
130
|
+
await sleep(2);
|
|
131
|
+
value.$jazz.set("pet", "cat");
|
|
132
|
+
|
|
133
|
+
const timestamps = value.$jazz.raw.core.verifiedTransactions.map(
|
|
134
|
+
(tx) => tx.madeAt,
|
|
135
|
+
);
|
|
136
|
+
const initialTimestamp = timestamps[0]!;
|
|
137
|
+
|
|
138
|
+
expect(value.pet).toBe("cat");
|
|
139
|
+
expect(value.age).toBe(10);
|
|
140
|
+
|
|
141
|
+
restoreCoMapToTimestamp(value.$jazz.raw, initialTimestamp, true);
|
|
142
|
+
|
|
143
|
+
expect(value.pet).toBe("dog");
|
|
144
|
+
expect(value.age).toBeUndefined();
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it("should remove multiple unknown properties when flag is true", async () => {
|
|
148
|
+
const value = co
|
|
149
|
+
.map({
|
|
150
|
+
a: z.string(),
|
|
151
|
+
b: z.string().optional(),
|
|
152
|
+
c: z.string().optional(),
|
|
153
|
+
})
|
|
154
|
+
.create({ a: "1" }, account);
|
|
155
|
+
|
|
156
|
+
await sleep(2);
|
|
157
|
+
value.$jazz.set("b", "2");
|
|
158
|
+
await sleep(2);
|
|
159
|
+
value.$jazz.set("c", "3");
|
|
160
|
+
await sleep(2);
|
|
161
|
+
value.$jazz.set("a", "4");
|
|
162
|
+
|
|
163
|
+
const timestamps = value.$jazz.raw.core.verifiedTransactions.map(
|
|
164
|
+
(tx) => tx.madeAt,
|
|
165
|
+
);
|
|
166
|
+
const initialTimestamp = timestamps[0]!;
|
|
167
|
+
|
|
168
|
+
expect(value.a).toBe("4");
|
|
169
|
+
expect(value.b).toBe("2");
|
|
170
|
+
expect(value.c).toBe("3");
|
|
171
|
+
|
|
172
|
+
restoreCoMapToTimestamp(value.$jazz.raw, initialTimestamp, true);
|
|
173
|
+
|
|
174
|
+
expect(value.a).toBe("1");
|
|
175
|
+
expect(value.b).toBeUndefined();
|
|
176
|
+
expect(value.c).toBeUndefined();
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
it("should handle empty CoMap", async () => {
|
|
180
|
+
const value = co.map({}).create({}, account);
|
|
181
|
+
|
|
182
|
+
const timestamps = value.$jazz.raw.core.verifiedTransactions.map(
|
|
183
|
+
(tx) => tx.madeAt,
|
|
184
|
+
);
|
|
185
|
+
const initialTimestamp = timestamps[0]!;
|
|
186
|
+
|
|
187
|
+
const currentState = value.$jazz.raw.toJSON() as JsonObject;
|
|
188
|
+
expect(Object.keys(currentState).length).toBe(0);
|
|
189
|
+
|
|
190
|
+
restoreCoMapToTimestamp(value.$jazz.raw, initialTimestamp, false);
|
|
191
|
+
|
|
192
|
+
const restoredState = value.$jazz.raw.toJSON() as JsonObject;
|
|
193
|
+
expect(Object.keys(restoredState).length).toBe(0);
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
it("should handle restoring to same state (no changes)", async () => {
|
|
197
|
+
const value = co
|
|
198
|
+
.map({
|
|
199
|
+
pet: z.string(),
|
|
200
|
+
})
|
|
201
|
+
.create({ pet: "dog" }, account);
|
|
202
|
+
|
|
203
|
+
const timestamps = value.$jazz.raw.core.verifiedTransactions.map(
|
|
204
|
+
(tx) => tx.madeAt,
|
|
205
|
+
);
|
|
206
|
+
const latestTimestamp = timestamps[timestamps.length - 1]!;
|
|
207
|
+
|
|
208
|
+
expect(value.pet).toBe("dog");
|
|
209
|
+
|
|
210
|
+
restoreCoMapToTimestamp(value.$jazz.raw, latestTimestamp, false);
|
|
211
|
+
|
|
212
|
+
expect(value.pet).toBe("dog");
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
it("should handle complex data types", async () => {
|
|
216
|
+
const value = co
|
|
217
|
+
.map({
|
|
218
|
+
obj: z.object({
|
|
219
|
+
name: z.string(),
|
|
220
|
+
count: z.number(),
|
|
221
|
+
}),
|
|
222
|
+
date: z.date(),
|
|
223
|
+
bool: z.boolean(),
|
|
224
|
+
})
|
|
225
|
+
.create(
|
|
226
|
+
{
|
|
227
|
+
obj: { name: "test", count: 42 },
|
|
228
|
+
date: new Date("2024-01-01"),
|
|
229
|
+
bool: true,
|
|
230
|
+
},
|
|
231
|
+
account,
|
|
232
|
+
);
|
|
233
|
+
|
|
234
|
+
await sleep(2);
|
|
235
|
+
value.$jazz.set("obj", { name: "updated", count: 100 });
|
|
236
|
+
value.$jazz.set("bool", false);
|
|
237
|
+
|
|
238
|
+
const timestamps = value.$jazz.raw.core.verifiedTransactions.map(
|
|
239
|
+
(tx) => tx.madeAt,
|
|
240
|
+
);
|
|
241
|
+
const initialTimestamp = timestamps[0]!;
|
|
242
|
+
|
|
243
|
+
expect(value.obj.name).toBe("updated");
|
|
244
|
+
expect(value.obj.count).toBe(100);
|
|
245
|
+
expect(value.bool).toBe(false);
|
|
246
|
+
|
|
247
|
+
restoreCoMapToTimestamp(value.$jazz.raw, initialTimestamp, false);
|
|
248
|
+
|
|
249
|
+
expect(value.obj.name).toBe("test");
|
|
250
|
+
expect(value.obj.count).toBe(42);
|
|
251
|
+
expect(value.bool).toBe(true);
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
it("should handle restoring to intermediate timestamp", async () => {
|
|
255
|
+
const value = co
|
|
256
|
+
.map({
|
|
257
|
+
counter: z.number(),
|
|
258
|
+
})
|
|
259
|
+
.create({ counter: 1 }, account);
|
|
260
|
+
|
|
261
|
+
await sleep(2);
|
|
262
|
+
value.$jazz.set("counter", 2);
|
|
263
|
+
await sleep(2);
|
|
264
|
+
value.$jazz.set("counter", 3);
|
|
265
|
+
await sleep(2);
|
|
266
|
+
value.$jazz.set("counter", 4);
|
|
267
|
+
|
|
268
|
+
const timestamps = value.$jazz.raw.core.verifiedTransactions.map(
|
|
269
|
+
(tx) => tx.madeAt,
|
|
270
|
+
);
|
|
271
|
+
const intermediateTimestamp = timestamps[2]!;
|
|
272
|
+
|
|
273
|
+
expect(value.counter).toBe(4);
|
|
274
|
+
|
|
275
|
+
restoreCoMapToTimestamp(value.$jazz.raw, intermediateTimestamp, false);
|
|
276
|
+
|
|
277
|
+
expect(value.counter).toBe(3);
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
it("should handle null value at timestamp (should return early)", async () => {
|
|
281
|
+
const value = co
|
|
282
|
+
.map({
|
|
283
|
+
pet: z.string(),
|
|
284
|
+
})
|
|
285
|
+
.create({ pet: "dog" }, account);
|
|
286
|
+
|
|
287
|
+
const invalidTimestamp = 0;
|
|
288
|
+
|
|
289
|
+
const beforeRestore = value.pet;
|
|
290
|
+
|
|
291
|
+
restoreCoMapToTimestamp(value.$jazz.raw, invalidTimestamp, false);
|
|
292
|
+
|
|
293
|
+
expect(value.pet).toBe(beforeRestore);
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
it("should update changed properties correctly", async () => {
|
|
297
|
+
const value = co
|
|
298
|
+
.map({
|
|
299
|
+
pet: z.string(),
|
|
300
|
+
age: z.number(),
|
|
301
|
+
})
|
|
302
|
+
.create({ pet: "dog", age: 10 }, account);
|
|
303
|
+
|
|
304
|
+
await sleep(2);
|
|
305
|
+
value.$jazz.set("pet", "cat");
|
|
306
|
+
value.$jazz.set("age", 20);
|
|
307
|
+
|
|
308
|
+
const timestamps = value.$jazz.raw.core.verifiedTransactions.map(
|
|
309
|
+
(tx) => tx.madeAt,
|
|
310
|
+
);
|
|
311
|
+
const initialTimestamp = timestamps[0]!;
|
|
312
|
+
|
|
313
|
+
restoreCoMapToTimestamp(value.$jazz.raw, initialTimestamp, false);
|
|
314
|
+
|
|
315
|
+
const restoredState = value.$jazz.raw.toJSON() as JsonObject;
|
|
316
|
+
expect(restoredState.pet).toBe("dog");
|
|
317
|
+
expect(restoredState.age).toBe(10);
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
it("should handle partial property updates", async () => {
|
|
321
|
+
const value = co
|
|
322
|
+
.map({
|
|
323
|
+
a: z.string(),
|
|
324
|
+
b: z.string(),
|
|
325
|
+
c: z.string(),
|
|
326
|
+
})
|
|
327
|
+
.create({ a: "1", b: "2", c: "3" }, account);
|
|
328
|
+
|
|
329
|
+
await sleep(2);
|
|
330
|
+
value.$jazz.set("a", "4");
|
|
331
|
+
|
|
332
|
+
const timestamps = value.$jazz.raw.core.verifiedTransactions.map(
|
|
333
|
+
(tx) => tx.madeAt,
|
|
334
|
+
);
|
|
335
|
+
const initialTimestamp = timestamps[0]!;
|
|
336
|
+
|
|
337
|
+
expect(value.a).toBe("4");
|
|
338
|
+
expect(value.b).toBe("2");
|
|
339
|
+
expect(value.c).toBe("3");
|
|
340
|
+
|
|
341
|
+
restoreCoMapToTimestamp(value.$jazz.raw, initialTimestamp, false);
|
|
342
|
+
|
|
343
|
+
expect(value.a).toBe("1");
|
|
344
|
+
expect(value.b).toBe("2");
|
|
345
|
+
expect(value.c).toBe("3");
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
it("should handle restoring as writer account", async () => {
|
|
349
|
+
const writer = await createJazzTestAccount();
|
|
350
|
+
const groupOnAdmin = co.group().create({ owner: account });
|
|
351
|
+
groupOnAdmin.addMember(writer, "writer");
|
|
352
|
+
|
|
353
|
+
const schema = co.map({
|
|
354
|
+
pet: z.string(),
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
const value = schema.create({ pet: "dog" }, groupOnAdmin);
|
|
358
|
+
|
|
359
|
+
await sleep(2);
|
|
360
|
+
value.$jazz.set("pet", "cat");
|
|
361
|
+
|
|
362
|
+
const initialTimestamp =
|
|
363
|
+
value.$jazz.raw.core.verifiedTransactions.at(0)!.madeAt;
|
|
364
|
+
|
|
365
|
+
const valueOnWriter = await schema.load(value.$jazz.id, {
|
|
366
|
+
loadAs: writer,
|
|
367
|
+
});
|
|
368
|
+
assert(valueOnWriter.$isLoaded);
|
|
369
|
+
|
|
370
|
+
restoreCoMapToTimestamp(valueOnWriter.$jazz.raw, initialTimestamp, false);
|
|
371
|
+
|
|
372
|
+
expect(valueOnWriter.pet).toBe("dog");
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
it("should not restore if account cannot write", async () => {
|
|
376
|
+
const reader = await createJazzTestAccount();
|
|
377
|
+
const groupOnAdmin = co.group().create({ owner: account });
|
|
378
|
+
groupOnAdmin.addMember(reader, "reader");
|
|
379
|
+
|
|
380
|
+
const schema = co.map({
|
|
381
|
+
pet: z.string(),
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
const value = schema.create({ pet: "dog" }, groupOnAdmin);
|
|
385
|
+
|
|
386
|
+
await sleep(2);
|
|
387
|
+
value.$jazz.set("pet", "cat");
|
|
388
|
+
|
|
389
|
+
const initialTimestamp =
|
|
390
|
+
value.$jazz.raw.core.verifiedTransactions.at(0)!.madeAt;
|
|
391
|
+
|
|
392
|
+
const valueOnReader = await schema.load(value.$jazz.id, {
|
|
393
|
+
loadAs: reader,
|
|
394
|
+
});
|
|
395
|
+
assert(valueOnReader.$isLoaded);
|
|
396
|
+
|
|
397
|
+
restoreCoMapToTimestamp(valueOnReader.$jazz.raw, initialTimestamp, false);
|
|
398
|
+
|
|
399
|
+
expect(valueOnReader.pet).toBe("cat");
|
|
400
|
+
});
|
|
401
|
+
});
|