@verdant-web/common 2.3.3 → 2.4.0-next.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.
- package/LICENSE +650 -21
- package/dist/esm/authz.d.ts +25 -0
- package/dist/esm/authz.js +54 -0
- package/dist/esm/authz.js.map +1 -0
- package/dist/esm/baseline.d.ts +1 -0
- package/dist/esm/baseline.js +3 -0
- package/dist/esm/baseline.js.map +1 -1
- package/dist/esm/files.d.ts +4 -0
- package/dist/esm/files.js +18 -0
- package/dist/esm/files.js.map +1 -1
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/indexes.js +1 -1
- package/dist/esm/indexes.js.map +1 -1
- package/dist/esm/indexes.test.js +1 -1
- package/dist/esm/indexes.test.js.map +1 -1
- package/dist/esm/migration.d.ts +4 -2
- package/dist/esm/migration.js.map +1 -1
- package/dist/esm/oids.d.ts +6 -24
- package/dist/esm/oids.js +18 -107
- package/dist/esm/oids.js.map +1 -1
- package/dist/esm/oids.test.js +1 -188
- package/dist/esm/oids.test.js.map +1 -1
- package/dist/esm/oidsLegacy.d.ts +18 -0
- package/dist/esm/oidsLegacy.js +72 -0
- package/dist/esm/oidsLegacy.js.map +1 -0
- package/dist/esm/oidsLegacy.test.d.ts +1 -0
- package/dist/esm/oidsLegacy.test.js +115 -0
- package/dist/esm/oidsLegacy.test.js.map +1 -0
- package/dist/esm/operation.d.ts +28 -4
- package/dist/esm/operation.js +70 -35
- package/dist/esm/operation.js.map +1 -1
- package/dist/esm/operation.test.js.map +1 -1
- package/dist/esm/presence.d.ts +0 -2
- package/dist/esm/schema/fields.js +1 -1
- package/dist/esm/schema/fields.js.map +1 -1
- package/dist/esm/schema/validation.js +14 -7
- package/dist/esm/schema/validation.js.map +1 -1
- package/dist/esm/utils.d.ts +1 -0
- package/dist/esm/utils.js +21 -0
- package/dist/esm/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/authz.ts +67 -0
- package/src/baseline.ts +5 -4
- package/src/files.ts +25 -0
- package/src/index.ts +2 -0
- package/src/indexes.test.ts +1 -1
- package/src/indexes.ts +1 -1
- package/src/migration.ts +5 -1
- package/src/oids.test.ts +0 -241
- package/src/oids.ts +24 -122
- package/src/oidsLegacy.test.ts +147 -0
- package/src/oidsLegacy.ts +87 -0
- package/src/operation.test.ts +0 -1
- package/src/operation.ts +202 -103
- package/src/presence.ts +0 -2
- package/src/schema/fields.ts +1 -1
- package/src/schema/validation.ts +23 -14
- package/src/utils.ts +26 -0
package/dist/esm/utils.js
CHANGED
|
@@ -125,4 +125,25 @@ export function debounce(fn, wait) {
|
|
|
125
125
|
timeout = setTimeout(() => fn.apply(context, args), wait);
|
|
126
126
|
};
|
|
127
127
|
}
|
|
128
|
+
export function throttle(fn, wait) {
|
|
129
|
+
let lastTime = 0;
|
|
130
|
+
// invoke once for the last call
|
|
131
|
+
let trailingTimeout;
|
|
132
|
+
return function (...args) {
|
|
133
|
+
const context = this;
|
|
134
|
+
const now = Date.now();
|
|
135
|
+
if (now - lastTime >= wait) {
|
|
136
|
+
lastTime = now;
|
|
137
|
+
fn.apply(context, args);
|
|
138
|
+
clearTimeout(trailingTimeout);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
clearTimeout(trailingTimeout);
|
|
142
|
+
trailingTimeout = setTimeout(() => {
|
|
143
|
+
lastTime = now;
|
|
144
|
+
fn.apply(context, args);
|
|
145
|
+
}, wait);
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
}
|
|
128
149
|
//# sourceMappingURL=utils.js.map
|
package/dist/esm/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/authz.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { DocumentBaseline } from './baseline.js';
|
|
2
|
+
import { Operation } from './operation.js';
|
|
3
|
+
|
|
4
|
+
function encode(str: string): AuthorizationKey {
|
|
5
|
+
const val = Buffer.from(str).toString('base64');
|
|
6
|
+
return val as AuthorizationKey;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function decode(str: string): string {
|
|
10
|
+
return Buffer.from(str, 'base64').toString();
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export type AuthorizationKey = string & {
|
|
14
|
+
'@@type': 'authz';
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export const authz = {
|
|
18
|
+
onlyUser: (userId: string): AuthorizationKey => encode(`u:${userId}:*`),
|
|
19
|
+
onlyMe: (): AuthorizationKey => authz.onlyUser(ORIGINATOR_SUBJECT),
|
|
20
|
+
decode: (encoded: string) => {
|
|
21
|
+
const decoded = decode(encoded);
|
|
22
|
+
const parts = decoded.split(':');
|
|
23
|
+
if (parts.length !== 3) {
|
|
24
|
+
throw new Error('Invalid authz string');
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
scope: parts[0],
|
|
28
|
+
subject: parts[1],
|
|
29
|
+
action: parts[2],
|
|
30
|
+
};
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export const ORIGINATOR_SUBJECT = '$$_originator_$$';
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Rewrites the special "originator" constant subject (used by
|
|
38
|
+
* local-only clients) to the given user ID.
|
|
39
|
+
*
|
|
40
|
+
* Used to initialize a library from a local-only replica
|
|
41
|
+
*/
|
|
42
|
+
export function rewriteAuthzOriginator(
|
|
43
|
+
data: { operations?: Operation[]; baselines?: DocumentBaseline[] },
|
|
44
|
+
newSubject: string,
|
|
45
|
+
) {
|
|
46
|
+
const { operations, baselines } = data;
|
|
47
|
+
if (operations) {
|
|
48
|
+
for (const op of operations) {
|
|
49
|
+
if (op.authz) {
|
|
50
|
+
const decoded = authz.decode(op.authz);
|
|
51
|
+
if (decoded.subject === ORIGINATOR_SUBJECT) {
|
|
52
|
+
op.authz = authz.onlyUser(newSubject);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (baselines) {
|
|
58
|
+
for (const baseline of baselines) {
|
|
59
|
+
if (baseline.authz) {
|
|
60
|
+
const decoded = authz.decode(baseline.authz);
|
|
61
|
+
if (decoded.subject === ORIGINATOR_SUBJECT) {
|
|
62
|
+
baseline.authz = authz.onlyUser(newSubject);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
package/src/baseline.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
// A: Docs without a base state don't have a baseline, it's
|
|
2
|
+
// written upon rebasing. If you apply ops to an undefined
|
|
3
|
+
// snapshot without an initialize, it remains undefined.
|
|
4
|
+
|
|
1
5
|
export type DocumentBaseline<T extends any = any> = {
|
|
2
6
|
oid: string;
|
|
3
7
|
snapshot: T;
|
|
4
8
|
timestamp: string;
|
|
5
|
-
|
|
6
|
-
// a document which was snapshotted in a deleted state, vs
|
|
7
|
-
// one without a base state at all? what happens if you apply
|
|
8
|
-
// ops onto an undefined snapshot (which aren't initialize)?
|
|
9
|
+
authz?: string;
|
|
9
10
|
};
|
package/src/files.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { isObject } from './utils.js';
|
|
2
|
+
|
|
1
3
|
export type FileRef = {
|
|
2
4
|
'@@type': 'file';
|
|
3
5
|
id: string;
|
|
@@ -22,7 +24,9 @@ export type FileData = {
|
|
|
22
24
|
remote: boolean;
|
|
23
25
|
name: string;
|
|
24
26
|
type: string;
|
|
27
|
+
/** A local File instance, if available. */
|
|
25
28
|
file?: Blob;
|
|
29
|
+
/** The server URL of this file. */
|
|
26
30
|
url?: string;
|
|
27
31
|
};
|
|
28
32
|
|
|
@@ -32,3 +36,24 @@ export function getAllFileFields(snapshot: any): [string, FileRef][] {
|
|
|
32
36
|
FileRef,
|
|
33
37
|
][];
|
|
34
38
|
}
|
|
39
|
+
|
|
40
|
+
export function isFile(value: any) {
|
|
41
|
+
if (typeof File !== 'undefined' && value instanceof File) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
if (typeof Blob !== 'undefined' && value instanceof Blob) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function isFileData(value: any): value is FileData {
|
|
51
|
+
return (
|
|
52
|
+
value &&
|
|
53
|
+
isObject(value) &&
|
|
54
|
+
typeof value.id === 'string' &&
|
|
55
|
+
typeof value.remote === 'boolean' &&
|
|
56
|
+
typeof value.name === 'string' &&
|
|
57
|
+
typeof value.type === 'string'
|
|
58
|
+
);
|
|
59
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -20,6 +20,7 @@ export type {
|
|
|
20
20
|
export type { UserInfo } from './presence.js';
|
|
21
21
|
export * from './patch.js';
|
|
22
22
|
export * from './oids.js';
|
|
23
|
+
export * from './oidsLegacy.js';
|
|
23
24
|
export * from './EventSubscriber.js';
|
|
24
25
|
export * from './undo.js';
|
|
25
26
|
export * from './batching.js';
|
|
@@ -28,3 +29,4 @@ export type { Ref } from './refs.js';
|
|
|
28
29
|
export { makeObjectRef, makeFileRef, isRef, compareRefs } from './refs.js';
|
|
29
30
|
export * from './memo.js';
|
|
30
31
|
export * from './error.js';
|
|
32
|
+
export * from './authz.js';
|
package/src/indexes.test.ts
CHANGED
package/src/indexes.ts
CHANGED
package/src/migration.ts
CHANGED
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
getOid,
|
|
14
14
|
hasDefault,
|
|
15
15
|
validateEntity,
|
|
16
|
+
AuthorizationKey,
|
|
16
17
|
} from './index.js';
|
|
17
18
|
|
|
18
19
|
/**@deprecated */
|
|
@@ -473,7 +474,10 @@ type MigrationQueries<Old extends SchemaDocuments> = {
|
|
|
473
474
|
};
|
|
474
475
|
type MigrationMutations<New extends SchemaDocuments> = {
|
|
475
476
|
[Key in keyof New]: {
|
|
476
|
-
put(
|
|
477
|
+
put(
|
|
478
|
+
document: New[Key]['init'],
|
|
479
|
+
options?: { access?: AuthorizationKey },
|
|
480
|
+
): Promise<New[Key]['snapshot']>;
|
|
477
481
|
delete(primaryKey: string): Promise<void>;
|
|
478
482
|
};
|
|
479
483
|
};
|
package/src/oids.test.ts
CHANGED
|
@@ -1,27 +1,15 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
2
|
import { createFileRef } from './files.js';
|
|
3
3
|
import {
|
|
4
|
-
areOidsRelated,
|
|
5
4
|
assignOid,
|
|
6
|
-
assignOidPropertiesToAllSubObjects,
|
|
7
|
-
assignOidProperty,
|
|
8
5
|
assignOidsToAllSubObjects,
|
|
9
6
|
createOid,
|
|
10
|
-
createSubOid,
|
|
11
7
|
decomposeOid,
|
|
12
|
-
getOid,
|
|
13
8
|
getOidSubIdRange,
|
|
14
|
-
getOidRoot,
|
|
15
9
|
hasOid,
|
|
16
|
-
maybeGetOidProperty,
|
|
17
10
|
normalize,
|
|
18
11
|
normalizeFirstLevel,
|
|
19
12
|
ObjectIdentifier,
|
|
20
|
-
removeOidPropertiesFromAllSubObjects,
|
|
21
|
-
getLegacyDotOidSubIdRange,
|
|
22
|
-
replaceLegacyOidsInJsonString,
|
|
23
|
-
MATCH_LEGACY_OID_JSON_STRING,
|
|
24
|
-
replaceLegacyOidsInObject,
|
|
25
13
|
} from './oids.js';
|
|
26
14
|
|
|
27
15
|
describe('normalizing an object', () => {
|
|
@@ -280,127 +268,6 @@ describe('computing a range of oids for a whole object set', () => {
|
|
|
280
268
|
expect(isWithin('test/a1', start, end)).toBe(false);
|
|
281
269
|
expect(isWithin('test/a1:3', start, end)).toBe(false);
|
|
282
270
|
});
|
|
283
|
-
it('should accommodate legacy dot style oids', () => {
|
|
284
|
-
const [start, end] = getLegacyDotOidSubIdRange('test/a.foo:barrrr');
|
|
285
|
-
expect(start).toEqual('test/a.');
|
|
286
|
-
expect(end).toEqual('test/a.\uffff');
|
|
287
|
-
expect(start < end).toBe(true);
|
|
288
|
-
expect(isWithin('test/a.foo:0', start, end)).toBe(true);
|
|
289
|
-
expect(isWithin('test/a.foo:1', start, end)).toBe(true);
|
|
290
|
-
expect(isWithin('test/a.bar:zzzzzzzzzzzzzzzzzzzzzzz', start, end)).toBe(
|
|
291
|
-
true,
|
|
292
|
-
);
|
|
293
|
-
expect(isWithin('test/a.aff:\uffff', start, end)).toBe(true);
|
|
294
|
-
expect(isWithin('test1/a', start, end)).toBe(false);
|
|
295
|
-
expect(isWithin('test/b', start, end)).toBe(false);
|
|
296
|
-
expect(isWithin('test/ ', start, end)).toBe(false);
|
|
297
|
-
expect(isWithin('test/a1', start, end)).toBe(false);
|
|
298
|
-
expect(isWithin('test/a1:3', start, end)).toBe(false);
|
|
299
|
-
expect(isWithin('test/a.foo:barrrr', start, end)).toBe(true);
|
|
300
|
-
});
|
|
301
|
-
});
|
|
302
|
-
|
|
303
|
-
describe('assigning OIDs as properties', () => {
|
|
304
|
-
it('should assign to all sub-objects', () => {
|
|
305
|
-
let i = 0;
|
|
306
|
-
function createSubId() {
|
|
307
|
-
return (i++).toString();
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
const initial = {
|
|
311
|
-
foo: {
|
|
312
|
-
bar: 1,
|
|
313
|
-
baz: [2, 3],
|
|
314
|
-
},
|
|
315
|
-
qux: [
|
|
316
|
-
{
|
|
317
|
-
corge: true,
|
|
318
|
-
},
|
|
319
|
-
{
|
|
320
|
-
grault: {
|
|
321
|
-
garply: 4,
|
|
322
|
-
},
|
|
323
|
-
},
|
|
324
|
-
],
|
|
325
|
-
};
|
|
326
|
-
assignOid(initial, 'test/a');
|
|
327
|
-
assignOidsToAllSubObjects(initial, createSubId);
|
|
328
|
-
assignOidPropertiesToAllSubObjects(initial);
|
|
329
|
-
|
|
330
|
-
expect(initial).toMatchInlineSnapshot(`
|
|
331
|
-
{
|
|
332
|
-
"@@id": "test/a",
|
|
333
|
-
"foo": {
|
|
334
|
-
"@@id": "test/a:0",
|
|
335
|
-
"bar": 1,
|
|
336
|
-
"baz": [
|
|
337
|
-
2,
|
|
338
|
-
3,
|
|
339
|
-
],
|
|
340
|
-
},
|
|
341
|
-
"qux": [
|
|
342
|
-
{
|
|
343
|
-
"@@id": "test/a:3",
|
|
344
|
-
"corge": true,
|
|
345
|
-
},
|
|
346
|
-
{
|
|
347
|
-
"@@id": "test/a:4",
|
|
348
|
-
"grault": {
|
|
349
|
-
"@@id": "test/a:5",
|
|
350
|
-
"garply": 4,
|
|
351
|
-
},
|
|
352
|
-
},
|
|
353
|
-
],
|
|
354
|
-
}
|
|
355
|
-
`);
|
|
356
|
-
// extra check needed for array since it doesn't serialize in the snapshot
|
|
357
|
-
expect(maybeGetOidProperty(initial.qux)).toBe('test/a:2');
|
|
358
|
-
});
|
|
359
|
-
|
|
360
|
-
it('should transfer assigned OID properties to the memory system', () => {
|
|
361
|
-
const initial = assignOidProperty(
|
|
362
|
-
{
|
|
363
|
-
foo: assignOidProperty(
|
|
364
|
-
{
|
|
365
|
-
bar: 1,
|
|
366
|
-
},
|
|
367
|
-
'test/a:1',
|
|
368
|
-
),
|
|
369
|
-
qux: assignOidProperty(
|
|
370
|
-
[
|
|
371
|
-
assignOidProperty(
|
|
372
|
-
{
|
|
373
|
-
corge: true,
|
|
374
|
-
},
|
|
375
|
-
'test/a:2',
|
|
376
|
-
),
|
|
377
|
-
assignOidProperty(
|
|
378
|
-
{
|
|
379
|
-
grault: assignOidProperty(
|
|
380
|
-
{
|
|
381
|
-
garply: 4,
|
|
382
|
-
},
|
|
383
|
-
'test/a:3',
|
|
384
|
-
),
|
|
385
|
-
},
|
|
386
|
-
'test/a:4',
|
|
387
|
-
),
|
|
388
|
-
],
|
|
389
|
-
'test/a:2',
|
|
390
|
-
),
|
|
391
|
-
},
|
|
392
|
-
'test/a',
|
|
393
|
-
);
|
|
394
|
-
|
|
395
|
-
removeOidPropertiesFromAllSubObjects(initial);
|
|
396
|
-
|
|
397
|
-
expect(getOid(initial)).toEqual('test/a');
|
|
398
|
-
expect(getOid(initial.foo)).toEqual('test/a:1');
|
|
399
|
-
expect(getOid(initial.qux)).toEqual('test/a:2');
|
|
400
|
-
expect(getOid(initial.qux[0])).toEqual('test/a:2');
|
|
401
|
-
expect(getOid(initial.qux[1])).toEqual('test/a:4');
|
|
402
|
-
expect(getOid(initial.qux[1].grault)).toEqual('test/a:3');
|
|
403
|
-
});
|
|
404
271
|
});
|
|
405
272
|
|
|
406
273
|
it('should handle special characters in document id or collection', () => {
|
|
@@ -430,111 +297,3 @@ describe('assigning OIDs to sub-objects', () => {
|
|
|
430
297
|
expect(hasOid(obj.bar[0])).toBe(false);
|
|
431
298
|
});
|
|
432
299
|
});
|
|
433
|
-
|
|
434
|
-
describe('handling legacy OIDs', () => {
|
|
435
|
-
it('should get the root OID for a legacy OID', () => {
|
|
436
|
-
expect(getOidRoot('items/clabgyjfh00003968qycsq3ld.inputs.#')).toEqual(
|
|
437
|
-
'items/clabgyjfh00003968qycsq3ld',
|
|
438
|
-
);
|
|
439
|
-
});
|
|
440
|
-
it('should create sub-ids for legacy OIDs in new format', () => {
|
|
441
|
-
expect(
|
|
442
|
-
createSubOid(
|
|
443
|
-
'items/clabgyjfh00003968qycsq3ld.inputs.#',
|
|
444
|
-
() => 'pseudorandom',
|
|
445
|
-
),
|
|
446
|
-
).toEqual('items/clabgyjfh00003968qycsq3ld:pseudorandom');
|
|
447
|
-
});
|
|
448
|
-
it('should identify new sub-OIDs as related to the legacy root OID', () => {
|
|
449
|
-
expect(
|
|
450
|
-
areOidsRelated(
|
|
451
|
-
'items/clabgyjfh00003968qycsq3ld.inputs.#',
|
|
452
|
-
'items/clabgyjfh00003968qycsq3ld:pseudorandom',
|
|
453
|
-
),
|
|
454
|
-
).toBe(true);
|
|
455
|
-
});
|
|
456
|
-
it.each([
|
|
457
|
-
['items/clabgyjfh00003968qycsq3ld.inputs.#:baz', true],
|
|
458
|
-
// include more unicode chars
|
|
459
|
-
['items/clabgyjfh00003968qycsq3ld\ufea3.inputs\u39fc.#:baz!!!', true],
|
|
460
|
-
// not matching new oids
|
|
461
|
-
['items/clabgyjfh00003968qycsq3ld', false],
|
|
462
|
-
['items/clabgyjfh00003968qycsq3ld:baz', false],
|
|
463
|
-
['items/clabgyjfh00003968qycsq3ld:baz1111', false],
|
|
464
|
-
// not matching anything else
|
|
465
|
-
[
|
|
466
|
-
'PREPARE SOUS VIDE BATH: Fill container or pot with water. Set the temperature to 130F/54.4C – 132F/55.5C (for very moist and tender) and allow water to heat to that temperature.Tip: start with hot tap water instead of cold water to reduce heating time. Note 4 for other temperatures.',
|
|
467
|
-
false,
|
|
468
|
-
],
|
|
469
|
-
])('matches legacy oids', (oid, match) => {
|
|
470
|
-
expect(MATCH_LEGACY_OID_JSON_STRING.test('"' + oid + '"'), oid).toBe(match);
|
|
471
|
-
// regex are stateful 🙄
|
|
472
|
-
MATCH_LEGACY_OID_JSON_STRING.lastIndex = 0;
|
|
473
|
-
});
|
|
474
|
-
it.each([
|
|
475
|
-
[
|
|
476
|
-
{ op: 'delete', oid: 'items/clabgyjfh00003968qycsq3ld.inputs.#:baz' },
|
|
477
|
-
{ op: 'delete', oid: 'items/clabgyjfh00003968qycsq3ld:baz' },
|
|
478
|
-
],
|
|
479
|
-
[
|
|
480
|
-
{
|
|
481
|
-
op: 'list-push',
|
|
482
|
-
oid: 'items/clabgyjfh00003968qycsq3ld.inputs.#:baz',
|
|
483
|
-
value: {
|
|
484
|
-
'@@type': 'ref',
|
|
485
|
-
id: 'items/clabgyjfh00003968qycsq3ld.inputs.#:qux',
|
|
486
|
-
},
|
|
487
|
-
},
|
|
488
|
-
{
|
|
489
|
-
op: 'list-push',
|
|
490
|
-
oid: 'items/clabgyjfh00003968qycsq3ld:baz',
|
|
491
|
-
value: { '@@type': 'ref', id: 'items/clabgyjfh00003968qycsq3ld:qux' },
|
|
492
|
-
},
|
|
493
|
-
],
|
|
494
|
-
[
|
|
495
|
-
{
|
|
496
|
-
op: 'list-remove',
|
|
497
|
-
oid: 'items/clabgyjfh00003968qycsq3ld.inputs.#:baz',
|
|
498
|
-
value: {
|
|
499
|
-
'@@type': 'ref',
|
|
500
|
-
id: 'items/clabgyjfh00003968qycsq3ld.inputs.#:qux',
|
|
501
|
-
},
|
|
502
|
-
},
|
|
503
|
-
{
|
|
504
|
-
op: 'list-remove',
|
|
505
|
-
oid: 'items/clabgyjfh00003968qycsq3ld:baz',
|
|
506
|
-
value: { '@@type': 'ref', id: 'items/clabgyjfh00003968qycsq3ld:qux' },
|
|
507
|
-
},
|
|
508
|
-
],
|
|
509
|
-
[
|
|
510
|
-
{
|
|
511
|
-
oid: 'items/clabgyjfh00003968qycsq3ld.inputs.#:baz',
|
|
512
|
-
timestamp: '2021-03-04T21:00:00.000Z',
|
|
513
|
-
snapshot: {
|
|
514
|
-
foo: 1,
|
|
515
|
-
bar: {
|
|
516
|
-
'@@type': 'ref',
|
|
517
|
-
id: 'items/clabgyjfh00003968qycsq3ld.inputs.#:qux',
|
|
518
|
-
},
|
|
519
|
-
},
|
|
520
|
-
},
|
|
521
|
-
{
|
|
522
|
-
oid: 'items/clabgyjfh00003968qycsq3ld:baz',
|
|
523
|
-
timestamp: '2021-03-04T21:00:00.000Z',
|
|
524
|
-
snapshot: {
|
|
525
|
-
foo: 1,
|
|
526
|
-
bar: { '@@type': 'ref', id: 'items/clabgyjfh00003968qycsq3ld:qux' },
|
|
527
|
-
},
|
|
528
|
-
},
|
|
529
|
-
],
|
|
530
|
-
[
|
|
531
|
-
{ oid: 'test/what if.boo.blah so what:fajsdfj' },
|
|
532
|
-
{ oid: 'test/what if:fajsdfj' },
|
|
533
|
-
],
|
|
534
|
-
])(
|
|
535
|
-
'should replace legacy OIDs in a JSON string with new OIDs',
|
|
536
|
-
(from, to) => {
|
|
537
|
-
expect(replaceLegacyOidsInObject(from), JSON.stringify(from)).toEqual(to);
|
|
538
|
-
},
|
|
539
|
-
);
|
|
540
|
-
});
|