@verdant-web/common 1.11.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 +21 -0
- package/dist/cjs/EventSubscriber.d.ts +17 -0
- package/dist/cjs/EventSubscriber.js +67 -0
- package/dist/cjs/EventSubscriber.js.map +1 -0
- package/dist/cjs/baseline.d.ts +5 -0
- package/dist/cjs/baseline.js +3 -0
- package/dist/cjs/baseline.js.map +1 -0
- package/dist/cjs/batching.d.ts +41 -0
- package/dist/cjs/batching.js +89 -0
- package/dist/cjs/batching.js.map +1 -0
- package/dist/cjs/files.d.ts +19 -0
- package/dist/cjs/files.js +19 -0
- package/dist/cjs/files.js.map +1 -0
- package/dist/cjs/files.test.d.ts +1 -0
- package/dist/cjs/files.test.js +81 -0
- package/dist/cjs/files.test.js.map +1 -0
- package/dist/cjs/index.d.ts +18 -0
- package/dist/cjs/index.js +36 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/indexes.d.ts +14 -0
- package/dist/cjs/indexes.js +116 -0
- package/dist/cjs/indexes.js.map +1 -0
- package/dist/cjs/indexes.test.d.ts +1 -0
- package/dist/cjs/indexes.test.js +128 -0
- package/dist/cjs/indexes.test.js.map +1 -0
- package/dist/cjs/migration.d.ts +98 -0
- package/dist/cjs/migration.js +128 -0
- package/dist/cjs/migration.js.map +1 -0
- package/dist/cjs/oids.d.ts +87 -0
- package/dist/cjs/oids.js +375 -0
- package/dist/cjs/oids.js.map +1 -0
- package/dist/cjs/oids.test.d.ts +1 -0
- package/dist/cjs/oids.test.js +282 -0
- package/dist/cjs/oids.test.js.map +1 -0
- package/dist/cjs/operation.d.ts +139 -0
- package/dist/cjs/operation.js +533 -0
- package/dist/cjs/operation.js.map +1 -0
- package/dist/cjs/operation.test.d.ts +1 -0
- package/dist/cjs/operation.test.js +827 -0
- package/dist/cjs/operation.test.js.map +1 -0
- package/dist/cjs/patch.d.ts +26 -0
- package/dist/cjs/patch.js +227 -0
- package/dist/cjs/patch.js.map +1 -0
- package/dist/cjs/presence.d.ts +27 -0
- package/dist/cjs/presence.js +3 -0
- package/dist/cjs/presence.js.map +1 -0
- package/dist/cjs/protocol.d.ts +145 -0
- package/dist/cjs/protocol.js +4 -0
- package/dist/cjs/protocol.js.map +1 -0
- package/dist/cjs/refs.d.ts +5 -0
- package/dist/cjs/refs.js +22 -0
- package/dist/cjs/refs.js.map +1 -0
- package/dist/cjs/replica.d.ts +28 -0
- package/dist/cjs/replica.js +29 -0
- package/dist/cjs/replica.js.map +1 -0
- package/dist/cjs/schema/defaults.d.ts +4 -0
- package/dist/cjs/schema/defaults.js +72 -0
- package/dist/cjs/schema/defaults.js.map +1 -0
- package/dist/cjs/schema/defaults.test.d.ts +1 -0
- package/dist/cjs/schema/defaults.test.js +21 -0
- package/dist/cjs/schema/defaults.test.js.map +1 -0
- package/dist/cjs/schema/index.d.ts +8 -0
- package/dist/cjs/schema/index.js +29 -0
- package/dist/cjs/schema/index.js.map +1 -0
- package/dist/cjs/schema/indexFilters.d.ts +6 -0
- package/dist/cjs/schema/indexFilters.js +31 -0
- package/dist/cjs/schema/indexFilters.js.map +1 -0
- package/dist/cjs/schema/types/collection.d.ts +51 -0
- package/dist/cjs/schema/types/collection.js +3 -0
- package/dist/cjs/schema/types/collection.js.map +1 -0
- package/dist/cjs/schema/types/compounds.d.ts +12 -0
- package/dist/cjs/schema/types/compounds.js +3 -0
- package/dist/cjs/schema/types/compounds.js.map +1 -0
- package/dist/cjs/schema/types/fields.d.ts +59 -0
- package/dist/cjs/schema/types/fields.js +3 -0
- package/dist/cjs/schema/types/fields.js.map +1 -0
- package/dist/cjs/schema/types/filters.d.ts +29 -0
- package/dist/cjs/schema/types/filters.js +3 -0
- package/dist/cjs/schema/types/filters.js.map +1 -0
- package/dist/cjs/schema/types/shapes.d.ts +21 -0
- package/dist/cjs/schema/types/shapes.js +3 -0
- package/dist/cjs/schema/types/shapes.js.map +1 -0
- package/dist/cjs/schema/types/synthetics.d.ts +28 -0
- package/dist/cjs/schema/types/synthetics.js +3 -0
- package/dist/cjs/schema/types/synthetics.js.map +1 -0
- package/dist/cjs/schema/types.d.ts +18 -0
- package/dist/cjs/schema/types.js +23 -0
- package/dist/cjs/schema/types.js.map +1 -0
- package/dist/cjs/timestamp.d.ts +48 -0
- package/dist/cjs/timestamp.js +244 -0
- package/dist/cjs/timestamp.js.map +1 -0
- package/dist/cjs/timestamp.test.d.ts +1 -0
- package/dist/cjs/timestamp.test.js +94 -0
- package/dist/cjs/timestamp.test.js.map +1 -0
- package/dist/cjs/undo.d.ts +3 -0
- package/dist/cjs/undo.js +199 -0
- package/dist/cjs/undo.js.map +1 -0
- package/dist/cjs/utils.d.ts +15 -0
- package/dist/cjs/utils.js +128 -0
- package/dist/cjs/utils.js.map +1 -0
- package/dist/cjs/utils.test.d.ts +1 -0
- package/dist/cjs/utils.test.js +37 -0
- package/dist/cjs/utils.test.js.map +1 -0
- package/dist/esm/EventSubscriber.d.ts +17 -0
- package/dist/esm/EventSubscriber.js +63 -0
- package/dist/esm/EventSubscriber.js.map +1 -0
- package/dist/esm/baseline.d.ts +5 -0
- package/dist/esm/baseline.js +2 -0
- package/dist/esm/baseline.js.map +1 -0
- package/dist/esm/batching.d.ts +41 -0
- package/dist/esm/batching.js +84 -0
- package/dist/esm/batching.js.map +1 -0
- package/dist/esm/files.d.ts +19 -0
- package/dist/esm/files.js +13 -0
- package/dist/esm/files.js.map +1 -0
- package/dist/esm/files.test.d.ts +1 -0
- package/dist/esm/files.test.js +79 -0
- package/dist/esm/files.test.js.map +1 -0
- package/dist/esm/index.d.ts +18 -0
- package/dist/esm/index.js +16 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/indexes.d.ts +14 -0
- package/dist/esm/indexes.js +106 -0
- package/dist/esm/indexes.js.map +1 -0
- package/dist/esm/indexes.test.d.ts +1 -0
- package/dist/esm/indexes.test.js +126 -0
- package/dist/esm/indexes.test.js.map +1 -0
- package/dist/esm/migration.d.ts +98 -0
- package/dist/esm/migration.js +122 -0
- package/dist/esm/migration.js.map +1 -0
- package/dist/esm/oids.d.ts +87 -0
- package/dist/esm/oids.js +348 -0
- package/dist/esm/oids.js.map +1 -0
- package/dist/esm/oids.test.d.ts +1 -0
- package/dist/esm/oids.test.js +280 -0
- package/dist/esm/oids.test.js.map +1 -0
- package/dist/esm/operation.d.ts +139 -0
- package/dist/esm/operation.js +518 -0
- package/dist/esm/operation.js.map +1 -0
- package/dist/esm/operation.test.d.ts +1 -0
- package/dist/esm/operation.test.js +825 -0
- package/dist/esm/operation.test.js.map +1 -0
- package/dist/esm/patch.d.ts +26 -0
- package/dist/esm/patch.js +223 -0
- package/dist/esm/patch.js.map +1 -0
- package/dist/esm/presence.d.ts +27 -0
- package/dist/esm/presence.js +2 -0
- package/dist/esm/presence.js.map +1 -0
- package/dist/esm/protocol.d.ts +145 -0
- package/dist/esm/protocol.js +3 -0
- package/dist/esm/protocol.js.map +1 -0
- package/dist/esm/refs.d.ts +5 -0
- package/dist/esm/refs.js +17 -0
- package/dist/esm/refs.js.map +1 -0
- package/dist/esm/replica.d.ts +28 -0
- package/dist/esm/replica.js +26 -0
- package/dist/esm/replica.js.map +1 -0
- package/dist/esm/schema/defaults.d.ts +4 -0
- package/dist/esm/schema/defaults.js +66 -0
- package/dist/esm/schema/defaults.js.map +1 -0
- package/dist/esm/schema/defaults.test.d.ts +1 -0
- package/dist/esm/schema/defaults.test.js +19 -0
- package/dist/esm/schema/defaults.test.js.map +1 -0
- package/dist/esm/schema/index.d.ts +8 -0
- package/dist/esm/schema/index.js +10 -0
- package/dist/esm/schema/index.js.map +1 -0
- package/dist/esm/schema/indexFilters.d.ts +6 -0
- package/dist/esm/schema/indexFilters.js +23 -0
- package/dist/esm/schema/indexFilters.js.map +1 -0
- package/dist/esm/schema/types/collection.d.ts +51 -0
- package/dist/esm/schema/types/collection.js +2 -0
- package/dist/esm/schema/types/collection.js.map +1 -0
- package/dist/esm/schema/types/compounds.d.ts +12 -0
- package/dist/esm/schema/types/compounds.js +2 -0
- package/dist/esm/schema/types/compounds.js.map +1 -0
- package/dist/esm/schema/types/fields.d.ts +59 -0
- package/dist/esm/schema/types/fields.js +2 -0
- package/dist/esm/schema/types/fields.js.map +1 -0
- package/dist/esm/schema/types/filters.d.ts +29 -0
- package/dist/esm/schema/types/filters.js +2 -0
- package/dist/esm/schema/types/filters.js.map +1 -0
- package/dist/esm/schema/types/shapes.d.ts +21 -0
- package/dist/esm/schema/types/shapes.js +2 -0
- package/dist/esm/schema/types/shapes.js.map +1 -0
- package/dist/esm/schema/types/synthetics.d.ts +28 -0
- package/dist/esm/schema/types/synthetics.js +2 -0
- package/dist/esm/schema/types/synthetics.js.map +1 -0
- package/dist/esm/schema/types.d.ts +18 -0
- package/dist/esm/schema/types.js +7 -0
- package/dist/esm/schema/types.js.map +1 -0
- package/dist/esm/timestamp.d.ts +48 -0
- package/dist/esm/timestamp.js +229 -0
- package/dist/esm/timestamp.js.map +1 -0
- package/dist/esm/timestamp.test.d.ts +1 -0
- package/dist/esm/timestamp.test.js +92 -0
- package/dist/esm/timestamp.test.js.map +1 -0
- package/dist/esm/undo.d.ts +3 -0
- package/dist/esm/undo.js +195 -0
- package/dist/esm/undo.js.map +1 -0
- package/dist/esm/utils.d.ts +15 -0
- package/dist/esm/utils.js +114 -0
- package/dist/esm/utils.js.map +1 -0
- package/dist/esm/utils.test.d.ts +1 -0
- package/dist/esm/utils.test.js +35 -0
- package/dist/esm/utils.test.js.map +1 -0
- package/dist/tsconfig-cjs.tsbuildinfo +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +38 -0
- package/src/EventSubscriber.ts +81 -0
- package/src/baseline.ts +9 -0
- package/src/batching.ts +135 -0
- package/src/files.ts +34 -0
- package/src/index.ts +26 -0
- package/src/indexes.test.ts +158 -0
- package/src/indexes.ts +151 -0
- package/src/migration.ts +391 -0
- package/src/oids.test.ts +395 -0
- package/src/oids.ts +442 -0
- package/src/operation.test.ts +966 -0
- package/src/operation.ts +755 -0
- package/src/patch.ts +277 -0
- package/src/presence.ts +29 -0
- package/src/protocol.ts +184 -0
- package/src/refs.ts +16 -0
- package/src/replica.ts +29 -0
- package/src/schema/defaults.test.ts +19 -0
- package/src/schema/defaults.ts +72 -0
- package/src/schema/index.ts +28 -0
- package/src/schema/indexFilters.ts +49 -0
- package/src/schema/types/collection.ts +133 -0
- package/src/schema/types/compounds.ts +33 -0
- package/src/schema/types/fields.ts +85 -0
- package/src/schema/types/filters.ts +39 -0
- package/src/schema/types/shapes.ts +83 -0
- package/src/schema/types/synthetics.ts +45 -0
- package/src/schema/types.ts +28 -0
- package/src/timestamp.test.ts +113 -0
- package/src/timestamp.ts +284 -0
- package/src/undo.ts +205 -0
- package/src/utils.test.ts +38 -0
- package/src/utils.ts +137 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oids.test.js","sourceRoot":"","sources":["../../src/oids.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { DocumentBaseline } from './baseline.js';
|
|
2
|
+
import { FileRef } from './files.js';
|
|
3
|
+
import { KeyPath, ObjectIdentifier } from './oids.js';
|
|
4
|
+
export declare type ObjectRef = {
|
|
5
|
+
'@@type': 'ref';
|
|
6
|
+
id: ObjectIdentifier;
|
|
7
|
+
};
|
|
8
|
+
export declare function isObjectRef(obj: any): obj is ObjectRef;
|
|
9
|
+
export declare type Normalized<T> = {
|
|
10
|
+
[key in keyof T]: T[key] extends Object ? ObjectRef : T[key];
|
|
11
|
+
};
|
|
12
|
+
export declare type PropertyName = string | number;
|
|
13
|
+
/**
|
|
14
|
+
* List patches can target a particular child list or
|
|
15
|
+
* nested lists. The first path item is the property path
|
|
16
|
+
* of the first child list, any subsequent values are nested
|
|
17
|
+
* list indices.
|
|
18
|
+
*/
|
|
19
|
+
export declare type PropertyValue = string | number | boolean | null | undefined | ObjectRef;
|
|
20
|
+
interface BaseOperationPatch {
|
|
21
|
+
}
|
|
22
|
+
export interface OperationPatchInitialize extends BaseOperationPatch {
|
|
23
|
+
op: 'initialize';
|
|
24
|
+
value: any;
|
|
25
|
+
}
|
|
26
|
+
export interface OperationPatchSet extends BaseOperationPatch {
|
|
27
|
+
op: 'set';
|
|
28
|
+
name: PropertyName;
|
|
29
|
+
value: PropertyValue;
|
|
30
|
+
}
|
|
31
|
+
export interface OperationPatchRemove extends BaseOperationPatch {
|
|
32
|
+
op: 'remove';
|
|
33
|
+
name: PropertyName;
|
|
34
|
+
}
|
|
35
|
+
export interface OperationPatchListPush extends BaseOperationPatch {
|
|
36
|
+
op: 'list-push';
|
|
37
|
+
value: PropertyValue;
|
|
38
|
+
}
|
|
39
|
+
export interface OperationPatchListInsert extends BaseOperationPatch {
|
|
40
|
+
op: 'list-insert';
|
|
41
|
+
index: number;
|
|
42
|
+
value?: PropertyValue;
|
|
43
|
+
values?: PropertyValue[];
|
|
44
|
+
}
|
|
45
|
+
export interface OperationPatchListDelete extends BaseOperationPatch {
|
|
46
|
+
op: 'list-delete';
|
|
47
|
+
index: number;
|
|
48
|
+
count: number;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Optimal for lists of object references. Moves
|
|
52
|
+
* the selected item to the target index even if it
|
|
53
|
+
* is not at the original index anymore.
|
|
54
|
+
*/
|
|
55
|
+
export interface OperationPatchListMoveByRef extends BaseOperationPatch {
|
|
56
|
+
op: 'list-move-by-ref';
|
|
57
|
+
value: ObjectRef;
|
|
58
|
+
index: number;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Suitable for any list move, whether object lists
|
|
62
|
+
* or primitive lists.
|
|
63
|
+
*/
|
|
64
|
+
export interface OperationPatchListMoveByIndex extends BaseOperationPatch {
|
|
65
|
+
op: 'list-move-by-index';
|
|
66
|
+
from: number;
|
|
67
|
+
to: number;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Removes all instances of the value from
|
|
71
|
+
* the list. Good for set behavior or removing
|
|
72
|
+
* a specific item even if it changes index
|
|
73
|
+
* from conflicts.
|
|
74
|
+
*/
|
|
75
|
+
export interface OperationPatchListRemove extends BaseOperationPatch {
|
|
76
|
+
op: 'list-remove';
|
|
77
|
+
value: PropertyValue;
|
|
78
|
+
only?: 'first' | 'last';
|
|
79
|
+
}
|
|
80
|
+
export interface OperationPatchListAdd extends BaseOperationPatch {
|
|
81
|
+
op: 'list-add';
|
|
82
|
+
value: PropertyValue;
|
|
83
|
+
}
|
|
84
|
+
export interface OperationPatchDelete extends BaseOperationPatch {
|
|
85
|
+
op: 'delete';
|
|
86
|
+
}
|
|
87
|
+
export declare type OperationPatch = OperationPatchInitialize | OperationPatchSet | OperationPatchRemove | OperationPatchListPush | OperationPatchListInsert | OperationPatchListDelete | OperationPatchListMoveByRef | OperationPatchListMoveByIndex | OperationPatchListRemove | OperationPatchDelete | OperationPatchListAdd;
|
|
88
|
+
export declare type Operation = {
|
|
89
|
+
oid: ObjectIdentifier;
|
|
90
|
+
timestamp: string;
|
|
91
|
+
data: OperationPatch;
|
|
92
|
+
};
|
|
93
|
+
export declare function diffToPatches<T extends {
|
|
94
|
+
[key: string]: any;
|
|
95
|
+
} | any[]>(from: T, to: T, getNow: () => string, keyPath: KeyPath, createSubId?: () => string, patches?: Operation[], options?: {
|
|
96
|
+
/**
|
|
97
|
+
* If an object is merged with another and the new one does not
|
|
98
|
+
* have an OID assigned, assume it is the same identity as previous
|
|
99
|
+
*/
|
|
100
|
+
mergeUnknownObjects?: boolean;
|
|
101
|
+
/**
|
|
102
|
+
* If an incoming value is not assigned on the new object, use the previous value.
|
|
103
|
+
* If false, undefined properties will erase the previous value.
|
|
104
|
+
*/
|
|
105
|
+
defaultUndefined?: boolean;
|
|
106
|
+
}): Operation[];
|
|
107
|
+
export declare function shallowDiffToPatches(from: any, to: any, getNow: () => string, patches?: Operation[]): Operation[];
|
|
108
|
+
/**
|
|
109
|
+
* Takes a basic object and constructs a patch list to create it and
|
|
110
|
+
* all of its nested objects.
|
|
111
|
+
*/
|
|
112
|
+
export declare function initialToPatches(initial: any, rootOid: ObjectIdentifier, getNow: () => string, createSubId?: () => string, patches?: Operation[]): Operation[];
|
|
113
|
+
export declare function shallowInitialToPatches(initial: any, rootOid: ObjectIdentifier, getNow: () => string, patches?: Operation[]): Operation[];
|
|
114
|
+
export declare function groupPatchesByIdentifier(patches: Operation[]): Record<string, Operation[]>;
|
|
115
|
+
export declare function groupPatchesByRootOid(patches: Operation[]): Record<string, Operation[]>;
|
|
116
|
+
export declare function groupBaselinesByRootOid(baselines: DocumentBaseline[]): Record<string, DocumentBaseline<any>[]>;
|
|
117
|
+
export declare type NormalizedObject = {
|
|
118
|
+
[key: PropertyName]: PropertyValue;
|
|
119
|
+
} | Array<PropertyValue>;
|
|
120
|
+
/**
|
|
121
|
+
* The incoming object should already be normalized!
|
|
122
|
+
* This function will mutate the base object.
|
|
123
|
+
*/
|
|
124
|
+
export declare function applyPatch<T extends NormalizedObject>(base: T | undefined, patch: OperationPatch,
|
|
125
|
+
/**
|
|
126
|
+
* Optionally supply a list to which any refs which
|
|
127
|
+
* are removed during the patch will be appended.
|
|
128
|
+
*/
|
|
129
|
+
deletedRefs?: (FileRef | ObjectRef)[]): T | undefined;
|
|
130
|
+
export declare function applyOperations<T extends NormalizedObject>(base: T | undefined, operations: Operation[], deletedRefs?: (ObjectRef | FileRef)[]): T | undefined;
|
|
131
|
+
/**
|
|
132
|
+
* Mutates the original object in place. Returns all referenced
|
|
133
|
+
* objects oids.
|
|
134
|
+
*/
|
|
135
|
+
export declare function substituteRefsWithObjects(base: any, refs: Map<ObjectIdentifier, any>, used?: ObjectIdentifier[]): ObjectIdentifier[];
|
|
136
|
+
export declare function substituteFirstLevelObjectsWithRefs<Base extends {
|
|
137
|
+
[key: string]: any;
|
|
138
|
+
} | any[]>(base: Base, refObjects?: Map<ObjectIdentifier, any>): Map<ObjectIdentifier, any>;
|
|
139
|
+
export {};
|
|
@@ -0,0 +1,533 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.substituteFirstLevelObjectsWithRefs = exports.substituteRefsWithObjects = exports.applyOperations = exports.applyPatch = exports.groupBaselinesByRootOid = exports.groupPatchesByRootOid = exports.groupPatchesByIdentifier = exports.shallowInitialToPatches = exports.initialToPatches = exports.shallowDiffToPatches = exports.diffToPatches = exports.isObjectRef = void 0;
|
|
4
|
+
const oids_js_1 = require("./oids.js");
|
|
5
|
+
const refs_js_1 = require("./refs.js");
|
|
6
|
+
const utils_js_1 = require("./utils.js");
|
|
7
|
+
function isObjectRef(obj) {
|
|
8
|
+
return obj && typeof obj === 'object' && obj['@@type'] === 'ref';
|
|
9
|
+
}
|
|
10
|
+
exports.isObjectRef = isObjectRef;
|
|
11
|
+
function isDiffableObject(val) {
|
|
12
|
+
return (0, utils_js_1.isObject)(val) && !(0, refs_js_1.isRef)(val);
|
|
13
|
+
}
|
|
14
|
+
function compareNonDiffable(a, b) {
|
|
15
|
+
if (a === b)
|
|
16
|
+
return true;
|
|
17
|
+
if ((0, refs_js_1.isRef)(a) && (0, refs_js_1.isRef)(b))
|
|
18
|
+
return (0, refs_js_1.compareRefs)(a, b);
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
function diffToPatches(from, to, getNow, keyPath, createSubId, patches = [], options = {}) {
|
|
22
|
+
const oid = (0, oids_js_1.getOid)(from);
|
|
23
|
+
function diffItems(key, value, oldValue) {
|
|
24
|
+
if (!isDiffableObject(value)) {
|
|
25
|
+
// for primitive fields, we can use plain sets and
|
|
26
|
+
// do not need to recurse, of course
|
|
27
|
+
if (!compareNonDiffable(value, oldValue)) {
|
|
28
|
+
patches.push({
|
|
29
|
+
oid,
|
|
30
|
+
timestamp: getNow(),
|
|
31
|
+
data: {
|
|
32
|
+
op: 'set',
|
|
33
|
+
name: key,
|
|
34
|
+
value,
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
const oldValueOid = (0, oids_js_1.maybeGetOid)(oldValue);
|
|
41
|
+
let valueOid;
|
|
42
|
+
if (!options.mergeUnknownObjects) {
|
|
43
|
+
valueOid = (0, oids_js_1.ensureOid)(value, oid, key, createSubId);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// if merge unknown objects is requested, we copy the previous value's oid
|
|
47
|
+
// to any mirrored new value if it doesn't have one assigned already.
|
|
48
|
+
valueOid = (0, oids_js_1.maybeGetOid)(value);
|
|
49
|
+
if (!valueOid && oldValueOid) {
|
|
50
|
+
(0, oids_js_1.assignOid)(value, oldValueOid);
|
|
51
|
+
valueOid = oldValueOid;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
valueOid = (0, oids_js_1.ensureOid)(value, oid, key, createSubId);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (oldValue === undefined || valueOid !== oldValueOid) {
|
|
58
|
+
// first case: previous value exists but the OIDs are different,
|
|
59
|
+
// meaning the object identity has changed
|
|
60
|
+
// we add the whole new object and also update the reference on this
|
|
61
|
+
// key of the parent to point to the new object
|
|
62
|
+
initialToPatches(value, valueOid, getNow, createSubId, patches);
|
|
63
|
+
patches.push({
|
|
64
|
+
oid,
|
|
65
|
+
timestamp: getNow(),
|
|
66
|
+
data: {
|
|
67
|
+
op: 'set',
|
|
68
|
+
name: key,
|
|
69
|
+
value: (0, oids_js_1.createRef)(valueOid),
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
// if there was an old value, we need to delete it altogether.
|
|
73
|
+
if (oldValueOid !== undefined) {
|
|
74
|
+
patches.push({
|
|
75
|
+
oid: oldValueOid,
|
|
76
|
+
timestamp: getNow(),
|
|
77
|
+
data: {
|
|
78
|
+
op: 'delete',
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
// third case: OIDs are the same, meaning the identity is the same,
|
|
85
|
+
// and we must diff the objects
|
|
86
|
+
diffToPatches(oldValue, value, getNow, [...keyPath, key], createSubId, patches, options);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (Array.isArray(from) && Array.isArray(to)) {
|
|
91
|
+
// diffing is more naive than native array operations.
|
|
92
|
+
// we can only look at each element and decide if it should
|
|
93
|
+
// be replaced or removed - no moves or pushes, etc.
|
|
94
|
+
for (let i = 0; i < to.length; i++) {
|
|
95
|
+
const value = to[i];
|
|
96
|
+
const oldValue = from[i];
|
|
97
|
+
diffItems(i, value, oldValue);
|
|
98
|
+
}
|
|
99
|
+
// remove any remaining items at the end of the array
|
|
100
|
+
const deletedItemsAtEnd = from.length - to.length;
|
|
101
|
+
if (deletedItemsAtEnd > 0) {
|
|
102
|
+
// if sub-items were objects, we need to delete them all
|
|
103
|
+
for (let i = to.length; i < from.length; i++) {
|
|
104
|
+
const value = from[i];
|
|
105
|
+
const valueOid = (0, oids_js_1.maybeGetOid)(value);
|
|
106
|
+
if (valueOid) {
|
|
107
|
+
patches.push({
|
|
108
|
+
oid: valueOid,
|
|
109
|
+
timestamp: getNow(),
|
|
110
|
+
data: {
|
|
111
|
+
op: 'delete',
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// push the list-delete for the deleted items
|
|
117
|
+
patches.push({
|
|
118
|
+
oid,
|
|
119
|
+
timestamp: getNow(),
|
|
120
|
+
data: {
|
|
121
|
+
op: 'list-delete',
|
|
122
|
+
index: to.length,
|
|
123
|
+
count: deletedItemsAtEnd,
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else if (Array.isArray(from) || Array.isArray(to)) {
|
|
129
|
+
throw new Error('Cannot diff an array with an object');
|
|
130
|
+
}
|
|
131
|
+
else if (isDiffableObject(from) && isDiffableObject(to)) {
|
|
132
|
+
const oldKeys = new Set(Object.keys(from));
|
|
133
|
+
for (const [key, value] of Object.entries(to)) {
|
|
134
|
+
if (value === undefined && options.defaultUndefined)
|
|
135
|
+
continue;
|
|
136
|
+
oldKeys.delete(key);
|
|
137
|
+
if ((0, oids_js_1.isOidKey)(key))
|
|
138
|
+
continue;
|
|
139
|
+
const oldValue = from[key];
|
|
140
|
+
diffItems(key, value, oldValue);
|
|
141
|
+
}
|
|
142
|
+
// this set now only contains keys which were not in the new object
|
|
143
|
+
if (!options.defaultUndefined) {
|
|
144
|
+
for (const key of oldKeys) {
|
|
145
|
+
if ((0, oids_js_1.isOidKey)(key))
|
|
146
|
+
continue;
|
|
147
|
+
// push the delete for the property
|
|
148
|
+
patches.push({
|
|
149
|
+
oid,
|
|
150
|
+
timestamp: getNow(),
|
|
151
|
+
data: {
|
|
152
|
+
op: 'remove',
|
|
153
|
+
name: key,
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return patches;
|
|
160
|
+
}
|
|
161
|
+
exports.diffToPatches = diffToPatches;
|
|
162
|
+
function shallowDiffToPatches(from, to, getNow, patches = []) {
|
|
163
|
+
const oid = (0, oids_js_1.getOid)(from);
|
|
164
|
+
function diffItems(key, value, oldValue) {
|
|
165
|
+
if (!isDiffableObject(value)) {
|
|
166
|
+
// for primitive fields, we can use plain sets and
|
|
167
|
+
// do not need to recurse, of course
|
|
168
|
+
if (!compareNonDiffable(value, oldValue)) {
|
|
169
|
+
patches.push({
|
|
170
|
+
oid,
|
|
171
|
+
timestamp: getNow(),
|
|
172
|
+
data: {
|
|
173
|
+
op: 'set',
|
|
174
|
+
name: key,
|
|
175
|
+
value,
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
throw new Error('Shallow diff was given a nested object. This is an error in verdant!');
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (Array.isArray(from) && Array.isArray(to)) {
|
|
185
|
+
// diffing is more naive than native array operations.
|
|
186
|
+
// we can only look at each element and decide if it should
|
|
187
|
+
// be replaced or removed - no moves or pushes, etc.
|
|
188
|
+
for (let i = 0; i < to.length; i++) {
|
|
189
|
+
const value = to[i];
|
|
190
|
+
const oldValue = from[i];
|
|
191
|
+
diffItems(i, value, oldValue);
|
|
192
|
+
}
|
|
193
|
+
// remove any remaining items at the end of the array
|
|
194
|
+
const deletedItemsAtEnd = from.length - to.length;
|
|
195
|
+
if (deletedItemsAtEnd > 0) {
|
|
196
|
+
// push the list-delete for the deleted items
|
|
197
|
+
patches.push({
|
|
198
|
+
oid,
|
|
199
|
+
timestamp: getNow(),
|
|
200
|
+
data: {
|
|
201
|
+
op: 'list-delete',
|
|
202
|
+
index: to.length,
|
|
203
|
+
count: deletedItemsAtEnd,
|
|
204
|
+
},
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
else if (Array.isArray(from) || Array.isArray(to)) {
|
|
209
|
+
throw new Error('Cannot diff an array with an object');
|
|
210
|
+
}
|
|
211
|
+
else if (isDiffableObject(from) && isDiffableObject(to)) {
|
|
212
|
+
const oldKeys = new Set(Object.keys(from));
|
|
213
|
+
for (const [key, value] of Object.entries(to)) {
|
|
214
|
+
oldKeys.delete(key);
|
|
215
|
+
if ((0, oids_js_1.isOidKey)(key))
|
|
216
|
+
continue;
|
|
217
|
+
const oldValue = from[key];
|
|
218
|
+
diffItems(key, value, oldValue);
|
|
219
|
+
}
|
|
220
|
+
// this set now only contains keys which were not in the new object
|
|
221
|
+
for (const key of oldKeys) {
|
|
222
|
+
if ((0, oids_js_1.isOidKey)(key))
|
|
223
|
+
continue;
|
|
224
|
+
// push the delete for the property
|
|
225
|
+
patches.push({
|
|
226
|
+
oid,
|
|
227
|
+
timestamp: getNow(),
|
|
228
|
+
data: {
|
|
229
|
+
op: 'remove',
|
|
230
|
+
name: key,
|
|
231
|
+
},
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return patches;
|
|
236
|
+
}
|
|
237
|
+
exports.shallowDiffToPatches = shallowDiffToPatches;
|
|
238
|
+
/**
|
|
239
|
+
* Takes a basic object and constructs a patch list to create it and
|
|
240
|
+
* all of its nested objects.
|
|
241
|
+
*/
|
|
242
|
+
function initialToPatches(initial, rootOid, getNow, createSubId, patches = []) {
|
|
243
|
+
(0, oids_js_1.assignOid)(initial, rootOid);
|
|
244
|
+
(0, oids_js_1.assignOidsToAllSubObjects)(initial, createSubId);
|
|
245
|
+
const normalized = (0, oids_js_1.normalize)(initial);
|
|
246
|
+
for (const key of normalized.keys()) {
|
|
247
|
+
const value = normalized.get(key);
|
|
248
|
+
patches.push({
|
|
249
|
+
oid: key,
|
|
250
|
+
timestamp: getNow(),
|
|
251
|
+
data: {
|
|
252
|
+
op: 'initialize',
|
|
253
|
+
value: (0, oids_js_1.removeOid)(value),
|
|
254
|
+
},
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
return patches;
|
|
258
|
+
}
|
|
259
|
+
exports.initialToPatches = initialToPatches;
|
|
260
|
+
function shallowInitialToPatches(initial, rootOid, getNow, patches = []) {
|
|
261
|
+
patches.push({
|
|
262
|
+
oid: rootOid,
|
|
263
|
+
timestamp: getNow(),
|
|
264
|
+
data: {
|
|
265
|
+
op: 'initialize',
|
|
266
|
+
value: initial,
|
|
267
|
+
},
|
|
268
|
+
});
|
|
269
|
+
return patches;
|
|
270
|
+
}
|
|
271
|
+
exports.shallowInitialToPatches = shallowInitialToPatches;
|
|
272
|
+
function groupPatchesByIdentifier(patches) {
|
|
273
|
+
const grouped = {};
|
|
274
|
+
for (const patch of patches) {
|
|
275
|
+
if (patch.oid in grouped) {
|
|
276
|
+
grouped[patch.oid].push(patch);
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
grouped[patch.oid] = [patch];
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return grouped;
|
|
283
|
+
}
|
|
284
|
+
exports.groupPatchesByIdentifier = groupPatchesByIdentifier;
|
|
285
|
+
function groupPatchesByRootOid(patches) {
|
|
286
|
+
const grouped = {};
|
|
287
|
+
for (const patch of patches) {
|
|
288
|
+
const root = (0, oids_js_1.getOidRoot)(patch.oid);
|
|
289
|
+
if (root in grouped) {
|
|
290
|
+
grouped[root].push(patch);
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
grouped[root] = [patch];
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return grouped;
|
|
297
|
+
}
|
|
298
|
+
exports.groupPatchesByRootOid = groupPatchesByRootOid;
|
|
299
|
+
function groupBaselinesByRootOid(baselines) {
|
|
300
|
+
const grouped = {};
|
|
301
|
+
for (const patch of baselines) {
|
|
302
|
+
const root = (0, oids_js_1.getOidRoot)(patch.oid);
|
|
303
|
+
if (root in grouped) {
|
|
304
|
+
grouped[root].push(patch);
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
grouped[root] = [patch];
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
return grouped;
|
|
311
|
+
}
|
|
312
|
+
exports.groupBaselinesByRootOid = groupBaselinesByRootOid;
|
|
313
|
+
function listCheck(obj) {
|
|
314
|
+
if (!Array.isArray(obj)) {
|
|
315
|
+
console.error(`Cannot apply list patch; expected array, received ${JSON.stringify(obj)}. This suggests your data is changing from a list to an object over time. (OID: ${(0, oids_js_1.maybeGetOid)(obj)})`);
|
|
316
|
+
return false;
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
return true;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* The incoming object should already be normalized!
|
|
324
|
+
* This function will mutate the base object.
|
|
325
|
+
*/
|
|
326
|
+
function applyPatch(base, patch,
|
|
327
|
+
/**
|
|
328
|
+
* Optionally supply a list to which any refs which
|
|
329
|
+
* are removed during the patch will be appended.
|
|
330
|
+
*/
|
|
331
|
+
deletedRefs) {
|
|
332
|
+
// deleted objects are represented by undefined
|
|
333
|
+
// and remain deleted unless re-initialized
|
|
334
|
+
if ((base === undefined || base === null) && patch.op !== 'initialize') {
|
|
335
|
+
return base;
|
|
336
|
+
}
|
|
337
|
+
// ditch typing internally.
|
|
338
|
+
const baseAsAny = base;
|
|
339
|
+
let index;
|
|
340
|
+
let spliceResult;
|
|
341
|
+
// a helper, pass it a value which is about
|
|
342
|
+
// to be removed and it will append it to the list
|
|
343
|
+
// if it was a ref
|
|
344
|
+
function checkRef(field) {
|
|
345
|
+
// don't bother if not supplied
|
|
346
|
+
if (!deletedRefs)
|
|
347
|
+
return;
|
|
348
|
+
if ((0, refs_js_1.isRef)(field)) {
|
|
349
|
+
deletedRefs.push(field);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
switch (patch.op) {
|
|
353
|
+
case 'set':
|
|
354
|
+
checkRef(baseAsAny[patch.name]);
|
|
355
|
+
baseAsAny[patch.name] = patch.value;
|
|
356
|
+
break;
|
|
357
|
+
case 'remove':
|
|
358
|
+
checkRef(baseAsAny[patch.name]);
|
|
359
|
+
delete baseAsAny[patch.name];
|
|
360
|
+
break;
|
|
361
|
+
case 'list-push':
|
|
362
|
+
if (listCheck(base)) {
|
|
363
|
+
base.push(patch.value);
|
|
364
|
+
}
|
|
365
|
+
break;
|
|
366
|
+
case 'list-delete':
|
|
367
|
+
if (listCheck(base)) {
|
|
368
|
+
checkRef(base[patch.index]);
|
|
369
|
+
base.splice(patch.index, patch.count);
|
|
370
|
+
}
|
|
371
|
+
break;
|
|
372
|
+
case 'list-move-by-index':
|
|
373
|
+
if (listCheck(base)) {
|
|
374
|
+
spliceResult = base.splice(patch.from, 1);
|
|
375
|
+
base.splice(patch.to, 0, spliceResult[0]);
|
|
376
|
+
}
|
|
377
|
+
break;
|
|
378
|
+
case 'list-remove':
|
|
379
|
+
if (listCheck(base)) {
|
|
380
|
+
do {
|
|
381
|
+
const valueToRemove = patch.value;
|
|
382
|
+
if (patch.only === 'last') {
|
|
383
|
+
if (isObjectRef(valueToRemove)) {
|
|
384
|
+
index = (0, utils_js_1.findLastIndex)(base, (item) => item.id === valueToRemove.id);
|
|
385
|
+
}
|
|
386
|
+
else {
|
|
387
|
+
index = base.lastIndexOf(valueToRemove);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
if (isObjectRef(valueToRemove)) {
|
|
392
|
+
index = base.findIndex((item) => item.id === valueToRemove.id);
|
|
393
|
+
}
|
|
394
|
+
else {
|
|
395
|
+
index = base.indexOf(valueToRemove);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
if (index !== -1) {
|
|
399
|
+
checkRef(base[index]);
|
|
400
|
+
base.splice(index, 1);
|
|
401
|
+
}
|
|
402
|
+
} while (!patch.only && index !== -1);
|
|
403
|
+
}
|
|
404
|
+
break;
|
|
405
|
+
case 'list-add':
|
|
406
|
+
if (listCheck(base)) {
|
|
407
|
+
const alreadyHas = base.some((item) => {
|
|
408
|
+
if (isObjectRef(item) && isObjectRef(patch.value)) {
|
|
409
|
+
return item.id === patch.value.id;
|
|
410
|
+
}
|
|
411
|
+
else {
|
|
412
|
+
return item === patch.value;
|
|
413
|
+
}
|
|
414
|
+
});
|
|
415
|
+
if (!alreadyHas) {
|
|
416
|
+
base.push(patch.value);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
break;
|
|
420
|
+
case 'list-move-by-ref':
|
|
421
|
+
if (listCheck(base)) {
|
|
422
|
+
index = base.indexOf(patch.value);
|
|
423
|
+
spliceResult = base.splice(index, 1);
|
|
424
|
+
base.splice(patch.index, 0, spliceResult[0]);
|
|
425
|
+
}
|
|
426
|
+
break;
|
|
427
|
+
case 'list-insert':
|
|
428
|
+
if (listCheck(base)) {
|
|
429
|
+
if (!patch.value && !patch.values) {
|
|
430
|
+
throw new Error(`Cannot apply list insert patch; expected value or values, received ${JSON.stringify(patch)}`);
|
|
431
|
+
}
|
|
432
|
+
if (patch.value) {
|
|
433
|
+
base.splice(patch.index, 0, patch.value);
|
|
434
|
+
}
|
|
435
|
+
else {
|
|
436
|
+
base.splice(patch.index, 0, ...patch.values);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
break;
|
|
440
|
+
case 'delete':
|
|
441
|
+
// collect all refs that are deleted
|
|
442
|
+
if (Array.isArray(base)) {
|
|
443
|
+
base.forEach(checkRef);
|
|
444
|
+
}
|
|
445
|
+
else if ((0, utils_js_1.isObject)(base)) {
|
|
446
|
+
Object.values(base || {}).forEach(checkRef);
|
|
447
|
+
}
|
|
448
|
+
return undefined;
|
|
449
|
+
case 'initialize':
|
|
450
|
+
return (0, utils_js_1.cloneDeep)(patch.value);
|
|
451
|
+
default:
|
|
452
|
+
throw new Error(`Unsupported patch operation: ${patch.op}`);
|
|
453
|
+
}
|
|
454
|
+
return base;
|
|
455
|
+
}
|
|
456
|
+
exports.applyPatch = applyPatch;
|
|
457
|
+
function applyOperations(base, operations, deletedRefs) {
|
|
458
|
+
let cur = base;
|
|
459
|
+
for (const op of operations) {
|
|
460
|
+
cur = applyPatch(cur, op.data, deletedRefs);
|
|
461
|
+
}
|
|
462
|
+
return cur;
|
|
463
|
+
}
|
|
464
|
+
exports.applyOperations = applyOperations;
|
|
465
|
+
/**
|
|
466
|
+
* Mutates the original object in place. Returns all referenced
|
|
467
|
+
* objects oids.
|
|
468
|
+
*/
|
|
469
|
+
function substituteRefsWithObjects(base, refs, used = []) {
|
|
470
|
+
if (Array.isArray(base)) {
|
|
471
|
+
for (let i = 0; i < base.length; i++) {
|
|
472
|
+
const item = base[i];
|
|
473
|
+
base[i] = dereference(item, refs, used);
|
|
474
|
+
if ((0, utils_js_1.isObject)(base[i])) {
|
|
475
|
+
substituteRefsWithObjects(base[i], refs, used);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
else if ((0, utils_js_1.isObject)(base)) {
|
|
480
|
+
// not sure where to put this assertion but it's important to make
|
|
481
|
+
// sure all nested objects include an OID
|
|
482
|
+
(0, utils_js_1.assert)((0, oids_js_1.maybeGetOid)(base), `Object ${JSON.stringify(base)} must have an oid`);
|
|
483
|
+
for (const key of Object.keys(base)) {
|
|
484
|
+
base[key] = dereference(base[key], refs, used);
|
|
485
|
+
// now that objects are in place, recursively substitute
|
|
486
|
+
if ((0, utils_js_1.isObject)(base[key])) {
|
|
487
|
+
substituteRefsWithObjects(base[key], refs, used);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
return used;
|
|
492
|
+
}
|
|
493
|
+
exports.substituteRefsWithObjects = substituteRefsWithObjects;
|
|
494
|
+
function dereference(input, refs, used) {
|
|
495
|
+
if (isObjectRef(input)) {
|
|
496
|
+
used.push(input.id);
|
|
497
|
+
const resolved = refs.get(input.id);
|
|
498
|
+
(0, utils_js_1.assert)(!!resolved, `No value was found in object map for ${input.id}`);
|
|
499
|
+
return (0, oids_js_1.assignOid)(resolved, input.id);
|
|
500
|
+
}
|
|
501
|
+
else {
|
|
502
|
+
return input;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
function substituteFirstLevelObjectsWithRefs(base, refObjects = new Map()) {
|
|
506
|
+
if (Array.isArray(base)) {
|
|
507
|
+
for (let i = 0; i < base.length; i++) {
|
|
508
|
+
const item = base[i];
|
|
509
|
+
if ((0, utils_js_1.isObject)(item)) {
|
|
510
|
+
const oid = (0, oids_js_1.getOid)(item);
|
|
511
|
+
base[i] = {
|
|
512
|
+
'@@type': 'ref',
|
|
513
|
+
id: oid,
|
|
514
|
+
};
|
|
515
|
+
refObjects.set(oid, item);
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
else {
|
|
520
|
+
for (const [key, value] of Object.entries(base)) {
|
|
521
|
+
if ((0, utils_js_1.isObject)(value)) {
|
|
522
|
+
base[key] = {
|
|
523
|
+
'@@type': 'ref',
|
|
524
|
+
id: (0, oids_js_1.getOid)(value),
|
|
525
|
+
};
|
|
526
|
+
refObjects.set((0, oids_js_1.getOid)(value), value);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
return refObjects;
|
|
531
|
+
}
|
|
532
|
+
exports.substituteFirstLevelObjectsWithRefs = substituteFirstLevelObjectsWithRefs;
|
|
533
|
+
//# sourceMappingURL=operation.js.map
|