@verdant-web/common 1.11.0 → 1.12.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 (159) hide show
  1. package/dist/cjs/EventSubscriber.d.ts +17 -17
  2. package/dist/cjs/EventSubscriber.js +66 -66
  3. package/dist/cjs/baseline.d.ts +5 -5
  4. package/dist/cjs/baseline.js +2 -2
  5. package/dist/cjs/batching.d.ts +41 -41
  6. package/dist/cjs/batching.js +88 -88
  7. package/dist/cjs/files.d.ts +19 -19
  8. package/dist/cjs/files.js +18 -18
  9. package/dist/cjs/index.d.ts +18 -18
  10. package/dist/cjs/index.js +35 -35
  11. package/dist/cjs/indexes.d.ts +14 -14
  12. package/dist/cjs/indexes.js +115 -115
  13. package/dist/cjs/indexes.test.d.ts +1 -1
  14. package/dist/cjs/indexes.test.js +127 -127
  15. package/dist/cjs/migration.d.ts +98 -98
  16. package/dist/cjs/migration.js +127 -127
  17. package/dist/cjs/oids.d.ts +85 -87
  18. package/dist/cjs/oids.js +363 -374
  19. package/dist/cjs/oids.js.map +1 -1
  20. package/dist/cjs/oids.test.d.ts +1 -1
  21. package/dist/cjs/oids.test.js +269 -251
  22. package/dist/cjs/oids.test.js.map +1 -1
  23. package/dist/cjs/operation.d.ts +139 -139
  24. package/dist/cjs/operation.js +532 -532
  25. package/dist/cjs/operation.js.map +1 -1
  26. package/dist/cjs/operation.test.d.ts +1 -1
  27. package/dist/cjs/operation.test.js +505 -505
  28. package/dist/cjs/operation.test.js.map +1 -1
  29. package/dist/cjs/patch.d.ts +26 -26
  30. package/dist/cjs/patch.js +226 -226
  31. package/dist/cjs/patch.js.map +1 -1
  32. package/dist/cjs/presence.d.ts +27 -27
  33. package/dist/cjs/presence.js +2 -2
  34. package/dist/cjs/protocol.d.ts +145 -145
  35. package/dist/cjs/protocol.js +3 -3
  36. package/dist/cjs/refs.d.ts +5 -5
  37. package/dist/cjs/refs.js +21 -21
  38. package/dist/cjs/replica.d.ts +28 -28
  39. package/dist/cjs/replica.js +28 -28
  40. package/dist/cjs/schema/defaults.d.ts +4 -4
  41. package/dist/cjs/schema/defaults.js +71 -71
  42. package/dist/cjs/schema/defaults.test.d.ts +1 -1
  43. package/dist/cjs/schema/defaults.test.js +20 -20
  44. package/dist/cjs/schema/defaults.test.js.map +1 -1
  45. package/dist/cjs/schema/index.d.ts +8 -8
  46. package/dist/cjs/schema/index.js +28 -28
  47. package/dist/cjs/schema/indexFilters.d.ts +6 -6
  48. package/dist/cjs/schema/indexFilters.js +30 -30
  49. package/dist/cjs/schema/types/collection.d.ts +51 -51
  50. package/dist/cjs/schema/types/collection.js +2 -2
  51. package/dist/cjs/schema/types/compounds.d.ts +12 -12
  52. package/dist/cjs/schema/types/compounds.js +2 -2
  53. package/dist/cjs/schema/types/fields.d.ts +59 -59
  54. package/dist/cjs/schema/types/fields.js +2 -2
  55. package/dist/cjs/schema/types/filters.d.ts +29 -29
  56. package/dist/cjs/schema/types/filters.js +2 -2
  57. package/dist/cjs/schema/types/shapes.d.ts +21 -21
  58. package/dist/cjs/schema/types/shapes.js +2 -2
  59. package/dist/cjs/schema/types/synthetics.d.ts +28 -28
  60. package/dist/cjs/schema/types/synthetics.js +2 -2
  61. package/dist/cjs/schema/types.d.ts +18 -18
  62. package/dist/cjs/schema/types.js +22 -22
  63. package/dist/cjs/timestamp.d.ts +48 -48
  64. package/dist/cjs/timestamp.js +243 -243
  65. package/dist/cjs/timestamp.test.d.ts +1 -1
  66. package/dist/cjs/timestamp.test.js +93 -93
  67. package/dist/cjs/undo.d.ts +3 -3
  68. package/dist/cjs/undo.js +198 -198
  69. package/dist/cjs/utils.d.ts +15 -15
  70. package/dist/cjs/utils.js +127 -127
  71. package/dist/cjs/utils.test.d.ts +1 -1
  72. package/dist/cjs/utils.test.js +36 -36
  73. package/dist/esm/EventSubscriber.d.ts +17 -17
  74. package/dist/esm/EventSubscriber.js +62 -62
  75. package/dist/esm/baseline.d.ts +5 -5
  76. package/dist/esm/baseline.js +1 -1
  77. package/dist/esm/batching.d.ts +41 -41
  78. package/dist/esm/batching.js +83 -83
  79. package/dist/esm/files.d.ts +19 -19
  80. package/dist/esm/files.js +12 -12
  81. package/dist/esm/index.d.ts +18 -18
  82. package/dist/esm/index.js +15 -15
  83. package/dist/esm/indexes.d.ts +14 -14
  84. package/dist/esm/indexes.js +105 -105
  85. package/dist/esm/indexes.test.d.ts +1 -1
  86. package/dist/esm/indexes.test.js +125 -125
  87. package/dist/esm/migration.d.ts +98 -98
  88. package/dist/esm/migration.js +121 -121
  89. package/dist/esm/oids.d.ts +85 -87
  90. package/dist/esm/oids.js +336 -347
  91. package/dist/esm/oids.js.map +1 -1
  92. package/dist/esm/oids.test.d.ts +1 -1
  93. package/dist/esm/oids.test.js +267 -249
  94. package/dist/esm/oids.test.js.map +1 -1
  95. package/dist/esm/operation.d.ts +139 -139
  96. package/dist/esm/operation.js +517 -517
  97. package/dist/esm/operation.js.map +1 -1
  98. package/dist/esm/operation.test.d.ts +1 -1
  99. package/dist/esm/operation.test.js +503 -503
  100. package/dist/esm/operation.test.js.map +1 -1
  101. package/dist/esm/patch.d.ts +26 -26
  102. package/dist/esm/patch.js +222 -222
  103. package/dist/esm/patch.js.map +1 -1
  104. package/dist/esm/presence.d.ts +27 -27
  105. package/dist/esm/presence.js +1 -1
  106. package/dist/esm/protocol.d.ts +145 -145
  107. package/dist/esm/protocol.js +2 -2
  108. package/dist/esm/refs.d.ts +5 -5
  109. package/dist/esm/refs.js +16 -16
  110. package/dist/esm/replica.d.ts +28 -28
  111. package/dist/esm/replica.js +25 -25
  112. package/dist/esm/schema/defaults.d.ts +4 -4
  113. package/dist/esm/schema/defaults.js +65 -65
  114. package/dist/esm/schema/defaults.test.d.ts +1 -1
  115. package/dist/esm/schema/defaults.test.js +18 -18
  116. package/dist/esm/schema/defaults.test.js.map +1 -1
  117. package/dist/esm/schema/index.d.ts +8 -8
  118. package/dist/esm/schema/index.js +9 -9
  119. package/dist/esm/schema/indexFilters.d.ts +6 -6
  120. package/dist/esm/schema/indexFilters.js +22 -22
  121. package/dist/esm/schema/types/collection.d.ts +51 -51
  122. package/dist/esm/schema/types/collection.js +1 -1
  123. package/dist/esm/schema/types/compounds.d.ts +12 -12
  124. package/dist/esm/schema/types/compounds.js +1 -1
  125. package/dist/esm/schema/types/fields.d.ts +59 -59
  126. package/dist/esm/schema/types/fields.js +1 -1
  127. package/dist/esm/schema/types/filters.d.ts +29 -29
  128. package/dist/esm/schema/types/filters.js +1 -1
  129. package/dist/esm/schema/types/shapes.d.ts +21 -21
  130. package/dist/esm/schema/types/shapes.js +1 -1
  131. package/dist/esm/schema/types/synthetics.d.ts +28 -28
  132. package/dist/esm/schema/types/synthetics.js +1 -1
  133. package/dist/esm/schema/types.d.ts +18 -18
  134. package/dist/esm/schema/types.js +6 -6
  135. package/dist/esm/timestamp.d.ts +48 -48
  136. package/dist/esm/timestamp.js +228 -228
  137. package/dist/esm/timestamp.test.d.ts +1 -1
  138. package/dist/esm/timestamp.test.js +91 -91
  139. package/dist/esm/undo.d.ts +3 -3
  140. package/dist/esm/undo.js +194 -194
  141. package/dist/esm/utils.d.ts +15 -15
  142. package/dist/esm/utils.js +113 -113
  143. package/dist/esm/utils.test.d.ts +1 -1
  144. package/dist/esm/utils.test.js +34 -34
  145. package/dist/tsconfig-cjs.tsbuildinfo +1 -1
  146. package/dist/tsconfig.tsbuildinfo +1 -1
  147. package/package.json +1 -1
  148. package/src/oids.test.ts +62 -51
  149. package/src/oids.ts +7 -26
  150. package/src/operation.test.ts +32 -40
  151. package/src/operation.ts +4 -16
  152. package/src/patch.ts +5 -15
  153. package/src/schema/defaults.test.ts +1 -1
  154. package/dist/cjs/files.test.d.ts +0 -1
  155. package/dist/cjs/files.test.js +0 -81
  156. package/dist/cjs/files.test.js.map +0 -1
  157. package/dist/esm/files.test.d.ts +0 -1
  158. package/dist/esm/files.test.js +0 -79
  159. package/dist/esm/files.test.js.map +0 -1
package/dist/cjs/oids.js CHANGED
@@ -1,375 +1,364 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getRoots = exports.getOidRange = exports.getOidRoot = exports.normalizeFirstLevel = exports.normalize = exports.createRef = exports.createOidSubId = exports.removeOidsFromAllSubObjects = exports.removeOidPropertiesFromAllSubObjects = exports.assignOidPropertiesToAllSubObjects = exports.maybeGetOidProperty = exports.assignOidProperty = exports.assignOidsToAllSubObjects = exports.assertAllLevelsHaveOids = exports.decomposeOid = exports.createSubOid = exports.createOid = exports.ensureOid = exports.isOidKey = exports.removeOid = exports.hasOid = exports.assignOid = exports.maybeGetOid = exports.getOid = exports.OID_KEY = exports.LEGACY_OID_KEY = void 0;
4
- const uuid_1 = require("uuid");
5
- const files_js_1 = require("./files.js");
6
- const operation_js_1 = require("./operation.js");
7
- const refs_js_1 = require("./refs.js");
8
- const utils_js_1 = require("./utils.js");
9
- exports.LEGACY_OID_KEY = '__@@oid_do_not_use';
10
- exports.OID_KEY = '@@id';
11
- const KEY_PATH_SEPARATOR = '.';
12
- const COLLECTION_SEPARATOR = '/';
13
- const RANDOM_SEPARATOR = ':';
14
- /**
15
- * This is the global, in-memory storage for all OIDs. It is used to
16
- * associate JS objects with OIDs without modifying the objects themselves.
17
- */
18
- const oidMap = new WeakMap();
19
- function getOid(obj) {
20
- const oid = maybeGetOid(obj);
21
- (0, utils_js_1.assert)(!!oid, `Object ${JSON.stringify(obj)} does not have an OID assigned to it`);
22
- return oid;
23
- }
24
- exports.getOid = getOid;
25
- function maybeGetOid(obj) {
26
- var _a, _b;
27
- if (!(0, utils_js_1.isObject)(obj)) {
28
- return undefined;
29
- }
30
- return (_b = (_a = oidMap.get(obj)) !== null && _a !== void 0 ? _a : obj[exports.OID_KEY]) !== null && _b !== void 0 ? _b : obj[exports.LEGACY_OID_KEY];
31
- }
32
- exports.maybeGetOid = maybeGetOid;
33
- function assignOid(obj, oid) {
34
- (0, utils_js_1.assert)((0, utils_js_1.isObject)(obj), `Only objects can be assigned OIDs, received ${JSON.stringify(obj)}`);
35
- oidMap.set(obj, oid);
36
- return obj;
37
- }
38
- exports.assignOid = assignOid;
39
- function hasOid(obj) {
40
- return !!maybeGetOid(obj);
41
- }
42
- exports.hasOid = hasOid;
43
- function removeOid(obj) {
44
- oidMap.delete(obj);
45
- return obj;
46
- }
47
- exports.removeOid = removeOid;
48
- function isOidKey(key) {
49
- return key === exports.OID_KEY || key === exports.LEGACY_OID_KEY;
50
- }
51
- exports.isOidKey = isOidKey;
52
- /**
53
- * For sub-objects, assign a random sub-OID if no OID
54
- * is already assigned.
55
- */
56
- function ensureOid(obj, rootOid, key, createSubId) {
57
- if (!hasOid(obj)) {
58
- const oid = createSubOid(rootOid, key, createSubId);
59
- assignOid(obj, oid);
60
- return oid;
61
- }
62
- else {
63
- return getOid(obj);
64
- }
65
- }
66
- exports.ensureOid = ensureOid;
67
- const SANTIIZE_PLACEHOLDERS = {
68
- '.': '˙',
69
- '/': '&slash;',
70
- ':': ':',
71
- };
72
- function sanitizeFragment(id) {
73
- // replaces separator characters with placeholders
74
- return id
75
- .replace(/[/]/g, SANTIIZE_PLACEHOLDERS['/'])
76
- .replace(/[:]/g, SANTIIZE_PLACEHOLDERS[':'])
77
- .replace(/[.]/g, SANTIIZE_PLACEHOLDERS['.']);
78
- }
79
- function unsanitizeFragment(id) {
80
- // replaces placeholders with separator characters
81
- return id
82
- .replace(/&slash;/g, '/')
83
- .replace(/:/g, ':')
84
- .replace(/˙/g, '.');
85
- }
86
- function createOid(collection, documentId, keyPath = [], subId) {
87
- let oid = sanitizeFragment(collection) +
88
- COLLECTION_SEPARATOR +
89
- sanitizeFragment(documentId);
90
- if (subId) {
91
- const keyPathItems = keyPath.map((k) => typeof k === 'number' ? '#' : sanitizeFragment(k));
92
- oid += KEY_PATH_SEPARATOR + keyPathItems.join(KEY_PATH_SEPARATOR);
93
- oid += RANDOM_SEPARATOR + subId;
94
- }
95
- return oid;
96
- }
97
- exports.createOid = createOid;
98
- function createSubOid(root, key, createSubId = createOidSubId) {
99
- const { collection, id, keyPath } = decomposeOid(root);
100
- return createOid(collection, id, [...keyPath, key], createSubId());
101
- }
102
- exports.createSubOid = createSubOid;
103
- function decomposeOid(oid) {
104
- const [core, random] = oid.split(RANDOM_SEPARATOR);
105
- const [collection, paths] = core.split('/');
106
- const [id, ...keyPath] = paths.split(KEY_PATH_SEPARATOR);
107
- return {
108
- collection: unsanitizeFragment(collection),
109
- id: unsanitizeFragment(id),
110
- subId: random,
111
- keyPath: keyPath.map(unsanitizeFragment),
112
- };
113
- }
114
- exports.decomposeOid = decomposeOid;
115
- function assertAllLevelsHaveOids(obj, root) {
116
- (0, utils_js_1.assert)(getOid(obj), `Object ${JSON.stringify(obj)} must have an oid (child of ${JSON.stringify(root)})`);
117
- if (Array.isArray(obj)) {
118
- for (const item of obj) {
119
- assertAllLevelsHaveOids(item, root || obj);
120
- }
121
- }
122
- else if ((0, utils_js_1.isObject)(obj)) {
123
- for (const key of Object.keys(obj)) {
124
- assertAllLevelsHaveOids(obj[key], root || obj);
125
- }
126
- }
127
- }
128
- exports.assertAllLevelsHaveOids = assertAllLevelsHaveOids;
129
- function assignOidsToAllSubObjects(obj, createSubId) {
130
- const rootOid = getOid(obj);
131
- if (Array.isArray(obj)) {
132
- let item;
133
- for (let i = 0; i < obj.length; i++) {
134
- item = obj[i];
135
- if ((0, utils_js_1.isObject)(item) && !(0, refs_js_1.isRef)(item)) {
136
- ensureOid(item, rootOid, i, createSubId);
137
- assignOidsToAllSubObjects(item, createSubId);
138
- }
139
- }
140
- }
141
- else if ((0, utils_js_1.isObject)(obj) && !(0, refs_js_1.isRef)(obj)) {
142
- for (const key of Object.keys(obj)) {
143
- if ((0, utils_js_1.isObject)(obj[key]) && !(0, refs_js_1.isRef)(obj[key])) {
144
- ensureOid(obj[key], rootOid, key, createSubId);
145
- assignOidsToAllSubObjects(obj[key], createSubId);
146
- }
147
- }
148
- }
149
- }
150
- exports.assignOidsToAllSubObjects = assignOidsToAllSubObjects;
151
- function assignOidProperty(obj, oid) {
152
- (0, utils_js_1.assert)((0, utils_js_1.isObject)(obj), `Only objects can be assigned OIDs, received ${JSON.stringify(obj)}`);
153
- obj[exports.OID_KEY] = oid;
154
- return obj;
155
- }
156
- exports.assignOidProperty = assignOidProperty;
157
- function maybeGetOidProperty(obj) {
158
- if (!(0, utils_js_1.isObject)(obj)) {
159
- return undefined;
160
- }
161
- return obj[exports.OID_KEY] || obj[exports.LEGACY_OID_KEY];
162
- }
163
- exports.maybeGetOidProperty = maybeGetOidProperty;
164
- function hasOidProperty(obj) {
165
- return !!maybeGetOidProperty(obj);
166
- }
167
- function removeOidProperty(obj) {
168
- if (!(0, utils_js_1.isObject)(obj)) {
169
- return obj;
170
- }
171
- delete obj[exports.LEGACY_OID_KEY];
172
- delete obj[exports.OID_KEY];
173
- return obj;
174
- }
175
- function transferOidFromSystemToProperty(obj) {
176
- const oid = maybeGetOid(obj);
177
- if (oid) {
178
- assignOidProperty(obj, oid);
179
- }
180
- }
181
- /**
182
- * Assigns a special property to all objects in the given object
183
- * which have an OID
184
- */
185
- function assignOidPropertiesToAllSubObjects(obj) {
186
- transferOidFromSystemToProperty(obj);
187
- if (Array.isArray(obj)) {
188
- for (let i = 0; i < obj.length; i++) {
189
- assignOidPropertiesToAllSubObjects(obj[i]);
190
- }
191
- }
192
- else if ((0, utils_js_1.isObject)(obj)) {
193
- for (const key of Object.keys(obj)) {
194
- assignOidPropertiesToAllSubObjects(obj[key]);
195
- }
196
- }
197
- }
198
- exports.assignOidPropertiesToAllSubObjects = assignOidPropertiesToAllSubObjects;
199
- function copyOidFromPropertyToSystem(obj) {
200
- const oid = maybeGetOidProperty(obj);
201
- if (oid) {
202
- assignOid(obj, oid);
203
- }
204
- }
205
- /**
206
- *
207
- * Removes the special property from all objects in the given object
208
- * which have an OID, transferring the OID from the property to the OID
209
- * system in-memory.
210
- */
211
- function removeOidPropertiesFromAllSubObjects(obj) {
212
- copyOidFromPropertyToSystem(obj);
213
- removeOidProperty(obj);
214
- if (Array.isArray(obj)) {
215
- for (let i = 0; i < obj.length; i++) {
216
- removeOidPropertiesFromAllSubObjects(obj[i]);
217
- }
218
- }
219
- else if ((0, utils_js_1.isObject)(obj)) {
220
- for (const key of Object.keys(obj)) {
221
- removeOidPropertiesFromAllSubObjects(obj[key]);
222
- }
223
- }
224
- }
225
- exports.removeOidPropertiesFromAllSubObjects = removeOidPropertiesFromAllSubObjects;
226
- function removeOidsFromAllSubObjects(obj) {
227
- removeOid(obj);
228
- if (Array.isArray(obj)) {
229
- for (let i = 0; i < obj.length; i++) {
230
- removeOidsFromAllSubObjects(obj[i]);
231
- }
232
- }
233
- else if ((0, utils_js_1.isObject)(obj)) {
234
- for (const key of Object.keys(obj)) {
235
- removeOidsFromAllSubObjects(obj[key]);
236
- }
237
- }
238
- }
239
- exports.removeOidsFromAllSubObjects = removeOidsFromAllSubObjects;
240
- function createOidSubId() {
241
- return (0, uuid_1.v4)().slice(0, 8);
242
- }
243
- exports.createOidSubId = createOidSubId;
244
- function createRef(oid) {
245
- return {
246
- '@@type': 'ref',
247
- id: oid,
248
- };
249
- }
250
- exports.createRef = createRef;
251
- function normalize(obj, refs = new Map()) {
252
- if (Array.isArray(obj)) {
253
- const oid = getOid(obj);
254
- const copy = assignOid([], oid);
255
- for (let i = 0; i < obj.length; i++) {
256
- const value = obj[i];
257
- if ((0, utils_js_1.isObject)(value)) {
258
- if ((0, operation_js_1.isObjectRef)(value)) {
259
- throw new Error('An attempt was made to normalize an already normalized object! This is an error in verdant itself.');
260
- }
261
- else if ((0, files_js_1.isFileRef)(value)) {
262
- copy[i] = value;
263
- continue;
264
- }
265
- else {
266
- const itemOid = getOid(value);
267
- copy[i] = createRef(itemOid);
268
- normalize(value, refs);
269
- }
270
- }
271
- else {
272
- copy[i] = value;
273
- }
274
- }
275
- refs.set(oid, copy);
276
- }
277
- else if ((0, utils_js_1.isObject)(obj) && !(0, refs_js_1.isRef)(obj)) {
278
- const oid = getOid(obj);
279
- const copy = assignOid({}, oid);
280
- for (const key of Object.keys(obj)) {
281
- const value = obj[key];
282
- if ((0, utils_js_1.isObject)(value)) {
283
- if ((0, operation_js_1.isObjectRef)(value)) {
284
- throw new Error('An attempt was made to normalize an already normalized object! This is an error in verdant itself.');
285
- }
286
- else if ((0, files_js_1.isFileRef)(value)) {
287
- // stop here
288
- copy[key] = value;
289
- }
290
- else {
291
- const itemOid = getOid(value);
292
- copy[key] = createRef(itemOid);
293
- normalize(value, refs);
294
- }
295
- }
296
- else {
297
- copy[key] = value;
298
- }
299
- }
300
- refs.set(oid, copy);
301
- }
302
- else if ((0, refs_js_1.isRef)(obj)) {
303
- }
304
- return refs;
305
- }
306
- exports.normalize = normalize;
307
- /**
308
- * Only normalizes direct children. The created map
309
- * of objects will still have nested objects.
310
- */
311
- function normalizeFirstLevel(obj) {
312
- const refs = new Map();
313
- const oidKeyPairs = new Map();
314
- if (Array.isArray(obj)) {
315
- const oid = getOid(obj);
316
- const copy = assignOid([], oid);
317
- for (let i = 0; i < obj.length; i++) {
318
- const value = obj[i];
319
- if ((0, utils_js_1.isObject)(value)) {
320
- const itemOid = getOid(value);
321
- copy[i] = createRef(itemOid);
322
- refs.set(itemOid, value);
323
- oidKeyPairs.set(itemOid, i);
324
- }
325
- else {
326
- copy[i] = value;
327
- }
328
- }
329
- refs.set(oid, copy);
330
- }
331
- else if ((0, utils_js_1.isObject)(obj)) {
332
- const oid = getOid(obj);
333
- const copy = assignOid({}, oid);
334
- for (const key of Object.keys(obj)) {
335
- const value = obj[key];
336
- if ((0, utils_js_1.isObject)(value)) {
337
- const itemOid = getOid(value);
338
- copy[key] = createRef(itemOid);
339
- refs.set(itemOid, value);
340
- oidKeyPairs.set(itemOid, key);
341
- }
342
- else {
343
- copy[key] = value;
344
- }
345
- }
346
- refs.set(oid, copy);
347
- }
348
- return { refs, oidKeyPairs };
349
- }
350
- exports.normalizeFirstLevel = normalizeFirstLevel;
351
- function getOidRoot(oid) {
352
- const [collection, idAndPaths] = oid.split(RANDOM_SEPARATOR)[0].split('/');
353
- const sepIdx = idAndPaths.indexOf(KEY_PATH_SEPARATOR);
354
- const id = sepIdx !== -1 ? idAndPaths.substring(0, sepIdx) : idAndPaths;
355
- return `${collection}/${id}`;
356
- }
357
- exports.getOidRoot = getOidRoot;
358
- /**
359
- * Returns an inclusive range of OIDs that represent
360
- * a root object and all of its sub-objects.
361
- */
362
- function getOidRange(oid) {
363
- const root = getOidRoot(oid);
364
- return [root, `${root}${RANDOM_SEPARATOR}\uffff`];
365
- }
366
- exports.getOidRange = getOidRange;
367
- function getRoots(oids) {
368
- const set = new Set();
369
- for (const oid of oids) {
370
- set.add(getOidRoot(oid));
371
- }
372
- return Array.from(set);
373
- }
374
- exports.getRoots = getRoots;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getRoots = exports.getOidRange = exports.getOidRoot = exports.normalizeFirstLevel = exports.normalize = exports.createRef = exports.createOidSubId = exports.removeOidsFromAllSubObjects = exports.removeOidPropertiesFromAllSubObjects = exports.assignOidPropertiesToAllSubObjects = exports.maybeGetOidProperty = exports.assignOidProperty = exports.assignOidsToAllSubObjects = exports.assertAllLevelsHaveOids = exports.decomposeOid = exports.createSubOid = exports.createOid = exports.ensureOid = exports.isOidKey = exports.removeOid = exports.hasOid = exports.assignOid = exports.maybeGetOid = exports.getOid = exports.OID_KEY = exports.LEGACY_OID_KEY = void 0;
4
+ const uuid_1 = require("uuid");
5
+ const files_js_1 = require("./files.js");
6
+ const operation_js_1 = require("./operation.js");
7
+ const refs_js_1 = require("./refs.js");
8
+ const utils_js_1 = require("./utils.js");
9
+ exports.LEGACY_OID_KEY = '__@@oid_do_not_use';
10
+ exports.OID_KEY = '@@id';
11
+ const COLLECTION_SEPARATOR = '/';
12
+ const RANDOM_SEPARATOR = ':';
13
+ /**
14
+ * This is the global, in-memory storage for all OIDs. It is used to
15
+ * associate JS objects with OIDs without modifying the objects themselves.
16
+ */
17
+ const oidMap = new WeakMap();
18
+ function getOid(obj) {
19
+ const oid = maybeGetOid(obj);
20
+ (0, utils_js_1.assert)(!!oid, `Object ${JSON.stringify(obj)} does not have an OID assigned to it`);
21
+ return oid;
22
+ }
23
+ exports.getOid = getOid;
24
+ function maybeGetOid(obj) {
25
+ var _a, _b;
26
+ if (!(0, utils_js_1.isObject)(obj)) {
27
+ return undefined;
28
+ }
29
+ return (_b = (_a = oidMap.get(obj)) !== null && _a !== void 0 ? _a : obj[exports.OID_KEY]) !== null && _b !== void 0 ? _b : obj[exports.LEGACY_OID_KEY];
30
+ }
31
+ exports.maybeGetOid = maybeGetOid;
32
+ function assignOid(obj, oid) {
33
+ (0, utils_js_1.assert)((0, utils_js_1.isObject)(obj), `Only objects can be assigned OIDs, received ${JSON.stringify(obj)}`);
34
+ oidMap.set(obj, oid);
35
+ return obj;
36
+ }
37
+ exports.assignOid = assignOid;
38
+ function hasOid(obj) {
39
+ return !!maybeGetOid(obj);
40
+ }
41
+ exports.hasOid = hasOid;
42
+ function removeOid(obj) {
43
+ oidMap.delete(obj);
44
+ return obj;
45
+ }
46
+ exports.removeOid = removeOid;
47
+ function isOidKey(key) {
48
+ return key === exports.OID_KEY || key === exports.LEGACY_OID_KEY;
49
+ }
50
+ exports.isOidKey = isOidKey;
51
+ /**
52
+ * For sub-objects, assign a random sub-OID if no OID
53
+ * is already assigned.
54
+ */
55
+ function ensureOid(obj, rootOid, createSubId) {
56
+ if (!hasOid(obj)) {
57
+ const oid = createSubOid(rootOid, createSubId);
58
+ assignOid(obj, oid);
59
+ return oid;
60
+ }
61
+ else {
62
+ return getOid(obj);
63
+ }
64
+ }
65
+ exports.ensureOid = ensureOid;
66
+ const SANTIIZE_PLACEHOLDERS = {
67
+ '.': '&dot;',
68
+ '/': '&slash;',
69
+ ':': '&colon;',
70
+ };
71
+ function sanitizeFragment(id) {
72
+ // replaces separator characters with placeholders
73
+ return id
74
+ .replace(/[/]/g, SANTIIZE_PLACEHOLDERS['/'])
75
+ .replace(/[:]/g, SANTIIZE_PLACEHOLDERS[':'])
76
+ .replace(/[.]/g, SANTIIZE_PLACEHOLDERS['.']);
77
+ }
78
+ function unsanitizeFragment(id) {
79
+ // replaces placeholders with separator characters
80
+ return id
81
+ .replace(/&slash;/g, '/')
82
+ .replace(/&colon;/g, ':')
83
+ .replace(/&dot;/g, '.');
84
+ }
85
+ function createOid(collection, documentId, subId) {
86
+ let oid = sanitizeFragment(collection) +
87
+ COLLECTION_SEPARATOR +
88
+ sanitizeFragment(documentId);
89
+ if (subId) {
90
+ oid += RANDOM_SEPARATOR + subId;
91
+ }
92
+ return oid;
93
+ }
94
+ exports.createOid = createOid;
95
+ function createSubOid(root, createSubId = createOidSubId) {
96
+ const { collection, id } = decomposeOid(root);
97
+ return createOid(collection, id, createSubId());
98
+ }
99
+ exports.createSubOid = createSubOid;
100
+ function decomposeOid(oid) {
101
+ const [core, random] = oid.split(RANDOM_SEPARATOR);
102
+ const [collection, id] = core.split('/');
103
+ return {
104
+ collection: unsanitizeFragment(collection),
105
+ id: unsanitizeFragment(id),
106
+ subId: random,
107
+ };
108
+ }
109
+ exports.decomposeOid = decomposeOid;
110
+ function assertAllLevelsHaveOids(obj, root) {
111
+ (0, utils_js_1.assert)(getOid(obj), `Object ${JSON.stringify(obj)} must have an oid (child of ${JSON.stringify(root)})`);
112
+ if (Array.isArray(obj)) {
113
+ for (const item of obj) {
114
+ assertAllLevelsHaveOids(item, root || obj);
115
+ }
116
+ }
117
+ else if ((0, utils_js_1.isObject)(obj)) {
118
+ for (const key of Object.keys(obj)) {
119
+ assertAllLevelsHaveOids(obj[key], root || obj);
120
+ }
121
+ }
122
+ }
123
+ exports.assertAllLevelsHaveOids = assertAllLevelsHaveOids;
124
+ function assignOidsToAllSubObjects(obj, createSubId) {
125
+ const rootOid = getOid(obj);
126
+ if (Array.isArray(obj)) {
127
+ let item;
128
+ for (let i = 0; i < obj.length; i++) {
129
+ item = obj[i];
130
+ if ((0, utils_js_1.isObject)(item) && !(0, refs_js_1.isRef)(item)) {
131
+ ensureOid(item, rootOid, createSubId);
132
+ assignOidsToAllSubObjects(item, createSubId);
133
+ }
134
+ }
135
+ }
136
+ else if ((0, utils_js_1.isObject)(obj) && !(0, refs_js_1.isRef)(obj)) {
137
+ for (const key of Object.keys(obj)) {
138
+ if ((0, utils_js_1.isObject)(obj[key]) && !(0, refs_js_1.isRef)(obj[key])) {
139
+ ensureOid(obj[key], rootOid, createSubId);
140
+ assignOidsToAllSubObjects(obj[key], createSubId);
141
+ }
142
+ }
143
+ }
144
+ }
145
+ exports.assignOidsToAllSubObjects = assignOidsToAllSubObjects;
146
+ function assignOidProperty(obj, oid) {
147
+ (0, utils_js_1.assert)((0, utils_js_1.isObject)(obj), `Only objects can be assigned OIDs, received ${JSON.stringify(obj)}`);
148
+ obj[exports.OID_KEY] = oid;
149
+ return obj;
150
+ }
151
+ exports.assignOidProperty = assignOidProperty;
152
+ function maybeGetOidProperty(obj) {
153
+ if (!(0, utils_js_1.isObject)(obj)) {
154
+ return undefined;
155
+ }
156
+ return obj[exports.OID_KEY] || obj[exports.LEGACY_OID_KEY];
157
+ }
158
+ exports.maybeGetOidProperty = maybeGetOidProperty;
159
+ function removeOidProperty(obj) {
160
+ if (!(0, utils_js_1.isObject)(obj)) {
161
+ return obj;
162
+ }
163
+ delete obj[exports.LEGACY_OID_KEY];
164
+ delete obj[exports.OID_KEY];
165
+ return obj;
166
+ }
167
+ function transferOidFromSystemToProperty(obj) {
168
+ const oid = maybeGetOid(obj);
169
+ if (oid) {
170
+ assignOidProperty(obj, oid);
171
+ }
172
+ }
173
+ /**
174
+ * Assigns a special property to all objects in the given object
175
+ * which have an OID
176
+ */
177
+ function assignOidPropertiesToAllSubObjects(obj) {
178
+ transferOidFromSystemToProperty(obj);
179
+ if (Array.isArray(obj)) {
180
+ for (let i = 0; i < obj.length; i++) {
181
+ assignOidPropertiesToAllSubObjects(obj[i]);
182
+ }
183
+ }
184
+ else if ((0, utils_js_1.isObject)(obj)) {
185
+ for (const key of Object.keys(obj)) {
186
+ assignOidPropertiesToAllSubObjects(obj[key]);
187
+ }
188
+ }
189
+ }
190
+ exports.assignOidPropertiesToAllSubObjects = assignOidPropertiesToAllSubObjects;
191
+ function copyOidFromPropertyToSystem(obj) {
192
+ const oid = maybeGetOidProperty(obj);
193
+ if (oid) {
194
+ assignOid(obj, oid);
195
+ }
196
+ }
197
+ /**
198
+ *
199
+ * Removes the special property from all objects in the given object
200
+ * which have an OID, transferring the OID from the property to the OID
201
+ * system in-memory.
202
+ */
203
+ function removeOidPropertiesFromAllSubObjects(obj) {
204
+ copyOidFromPropertyToSystem(obj);
205
+ removeOidProperty(obj);
206
+ if (Array.isArray(obj)) {
207
+ for (let i = 0; i < obj.length; i++) {
208
+ removeOidPropertiesFromAllSubObjects(obj[i]);
209
+ }
210
+ }
211
+ else if ((0, utils_js_1.isObject)(obj)) {
212
+ for (const key of Object.keys(obj)) {
213
+ removeOidPropertiesFromAllSubObjects(obj[key]);
214
+ }
215
+ }
216
+ }
217
+ exports.removeOidPropertiesFromAllSubObjects = removeOidPropertiesFromAllSubObjects;
218
+ function removeOidsFromAllSubObjects(obj) {
219
+ removeOid(obj);
220
+ if (Array.isArray(obj)) {
221
+ for (let i = 0; i < obj.length; i++) {
222
+ removeOidsFromAllSubObjects(obj[i]);
223
+ }
224
+ }
225
+ else if ((0, utils_js_1.isObject)(obj)) {
226
+ for (const key of Object.keys(obj)) {
227
+ removeOidsFromAllSubObjects(obj[key]);
228
+ }
229
+ }
230
+ }
231
+ exports.removeOidsFromAllSubObjects = removeOidsFromAllSubObjects;
232
+ function createOidSubId() {
233
+ return (0, uuid_1.v4)().slice(0, 8);
234
+ }
235
+ exports.createOidSubId = createOidSubId;
236
+ function createRef(oid) {
237
+ return {
238
+ '@@type': 'ref',
239
+ id: oid,
240
+ };
241
+ }
242
+ exports.createRef = createRef;
243
+ function normalize(obj, refs = new Map()) {
244
+ if (Array.isArray(obj)) {
245
+ const oid = getOid(obj);
246
+ const copy = assignOid([], oid);
247
+ for (let i = 0; i < obj.length; i++) {
248
+ const value = obj[i];
249
+ if ((0, utils_js_1.isObject)(value)) {
250
+ if ((0, operation_js_1.isObjectRef)(value)) {
251
+ throw new Error('An attempt was made to normalize an already normalized object! This is an error in verdant itself.');
252
+ }
253
+ else if ((0, files_js_1.isFileRef)(value)) {
254
+ copy[i] = value;
255
+ continue;
256
+ }
257
+ else {
258
+ const itemOid = getOid(value);
259
+ copy[i] = createRef(itemOid);
260
+ normalize(value, refs);
261
+ }
262
+ }
263
+ else {
264
+ copy[i] = value;
265
+ }
266
+ }
267
+ refs.set(oid, copy);
268
+ }
269
+ else if ((0, utils_js_1.isObject)(obj) && !(0, refs_js_1.isRef)(obj)) {
270
+ const oid = getOid(obj);
271
+ const copy = assignOid({}, oid);
272
+ for (const key of Object.keys(obj)) {
273
+ const value = obj[key];
274
+ if ((0, utils_js_1.isObject)(value)) {
275
+ if ((0, operation_js_1.isObjectRef)(value)) {
276
+ throw new Error('An attempt was made to normalize an already normalized object! This is an error in verdant itself.');
277
+ }
278
+ else if ((0, files_js_1.isFileRef)(value)) {
279
+ // stop here
280
+ copy[key] = value;
281
+ }
282
+ else {
283
+ const itemOid = getOid(value);
284
+ copy[key] = createRef(itemOid);
285
+ normalize(value, refs);
286
+ }
287
+ }
288
+ else {
289
+ copy[key] = value;
290
+ }
291
+ }
292
+ refs.set(oid, copy);
293
+ }
294
+ else if ((0, refs_js_1.isRef)(obj)) {
295
+ }
296
+ return refs;
297
+ }
298
+ exports.normalize = normalize;
299
+ /**
300
+ * Only normalizes direct children. The created map
301
+ * of objects will still have nested objects.
302
+ */
303
+ function normalizeFirstLevel(obj) {
304
+ const refs = new Map();
305
+ const oidKeyPairs = new Map();
306
+ if (Array.isArray(obj)) {
307
+ const oid = getOid(obj);
308
+ const copy = assignOid([], oid);
309
+ for (let i = 0; i < obj.length; i++) {
310
+ const value = obj[i];
311
+ if ((0, utils_js_1.isObject)(value)) {
312
+ const itemOid = getOid(value);
313
+ copy[i] = createRef(itemOid);
314
+ refs.set(itemOid, value);
315
+ oidKeyPairs.set(itemOid, i);
316
+ }
317
+ else {
318
+ copy[i] = value;
319
+ }
320
+ }
321
+ refs.set(oid, copy);
322
+ }
323
+ else if ((0, utils_js_1.isObject)(obj)) {
324
+ const oid = getOid(obj);
325
+ const copy = assignOid({}, oid);
326
+ for (const key of Object.keys(obj)) {
327
+ const value = obj[key];
328
+ if ((0, utils_js_1.isObject)(value)) {
329
+ const itemOid = getOid(value);
330
+ copy[key] = createRef(itemOid);
331
+ refs.set(itemOid, value);
332
+ oidKeyPairs.set(itemOid, key);
333
+ }
334
+ else {
335
+ copy[key] = value;
336
+ }
337
+ }
338
+ refs.set(oid, copy);
339
+ }
340
+ return { refs, oidKeyPairs };
341
+ }
342
+ exports.normalizeFirstLevel = normalizeFirstLevel;
343
+ function getOidRoot(oid) {
344
+ return oid.split(RANDOM_SEPARATOR)[0];
345
+ }
346
+ exports.getOidRoot = getOidRoot;
347
+ /**
348
+ * Returns an inclusive range of OIDs that represent
349
+ * a root object and all of its sub-objects.
350
+ */
351
+ function getOidRange(oid) {
352
+ const root = getOidRoot(oid);
353
+ return [root, `${root}${RANDOM_SEPARATOR}\uffff`];
354
+ }
355
+ exports.getOidRange = getOidRange;
356
+ function getRoots(oids) {
357
+ const set = new Set();
358
+ for (const oid of oids) {
359
+ set.add(getOidRoot(oid));
360
+ }
361
+ return Array.from(set);
362
+ }
363
+ exports.getRoots = getRoots;
375
364
  //# sourceMappingURL=oids.js.map