@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.
Files changed (241) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/EventSubscriber.d.ts +17 -0
  3. package/dist/cjs/EventSubscriber.js +67 -0
  4. package/dist/cjs/EventSubscriber.js.map +1 -0
  5. package/dist/cjs/baseline.d.ts +5 -0
  6. package/dist/cjs/baseline.js +3 -0
  7. package/dist/cjs/baseline.js.map +1 -0
  8. package/dist/cjs/batching.d.ts +41 -0
  9. package/dist/cjs/batching.js +89 -0
  10. package/dist/cjs/batching.js.map +1 -0
  11. package/dist/cjs/files.d.ts +19 -0
  12. package/dist/cjs/files.js +19 -0
  13. package/dist/cjs/files.js.map +1 -0
  14. package/dist/cjs/files.test.d.ts +1 -0
  15. package/dist/cjs/files.test.js +81 -0
  16. package/dist/cjs/files.test.js.map +1 -0
  17. package/dist/cjs/index.d.ts +18 -0
  18. package/dist/cjs/index.js +36 -0
  19. package/dist/cjs/index.js.map +1 -0
  20. package/dist/cjs/indexes.d.ts +14 -0
  21. package/dist/cjs/indexes.js +116 -0
  22. package/dist/cjs/indexes.js.map +1 -0
  23. package/dist/cjs/indexes.test.d.ts +1 -0
  24. package/dist/cjs/indexes.test.js +128 -0
  25. package/dist/cjs/indexes.test.js.map +1 -0
  26. package/dist/cjs/migration.d.ts +98 -0
  27. package/dist/cjs/migration.js +128 -0
  28. package/dist/cjs/migration.js.map +1 -0
  29. package/dist/cjs/oids.d.ts +87 -0
  30. package/dist/cjs/oids.js +375 -0
  31. package/dist/cjs/oids.js.map +1 -0
  32. package/dist/cjs/oids.test.d.ts +1 -0
  33. package/dist/cjs/oids.test.js +282 -0
  34. package/dist/cjs/oids.test.js.map +1 -0
  35. package/dist/cjs/operation.d.ts +139 -0
  36. package/dist/cjs/operation.js +533 -0
  37. package/dist/cjs/operation.js.map +1 -0
  38. package/dist/cjs/operation.test.d.ts +1 -0
  39. package/dist/cjs/operation.test.js +827 -0
  40. package/dist/cjs/operation.test.js.map +1 -0
  41. package/dist/cjs/patch.d.ts +26 -0
  42. package/dist/cjs/patch.js +227 -0
  43. package/dist/cjs/patch.js.map +1 -0
  44. package/dist/cjs/presence.d.ts +27 -0
  45. package/dist/cjs/presence.js +3 -0
  46. package/dist/cjs/presence.js.map +1 -0
  47. package/dist/cjs/protocol.d.ts +145 -0
  48. package/dist/cjs/protocol.js +4 -0
  49. package/dist/cjs/protocol.js.map +1 -0
  50. package/dist/cjs/refs.d.ts +5 -0
  51. package/dist/cjs/refs.js +22 -0
  52. package/dist/cjs/refs.js.map +1 -0
  53. package/dist/cjs/replica.d.ts +28 -0
  54. package/dist/cjs/replica.js +29 -0
  55. package/dist/cjs/replica.js.map +1 -0
  56. package/dist/cjs/schema/defaults.d.ts +4 -0
  57. package/dist/cjs/schema/defaults.js +72 -0
  58. package/dist/cjs/schema/defaults.js.map +1 -0
  59. package/dist/cjs/schema/defaults.test.d.ts +1 -0
  60. package/dist/cjs/schema/defaults.test.js +21 -0
  61. package/dist/cjs/schema/defaults.test.js.map +1 -0
  62. package/dist/cjs/schema/index.d.ts +8 -0
  63. package/dist/cjs/schema/index.js +29 -0
  64. package/dist/cjs/schema/index.js.map +1 -0
  65. package/dist/cjs/schema/indexFilters.d.ts +6 -0
  66. package/dist/cjs/schema/indexFilters.js +31 -0
  67. package/dist/cjs/schema/indexFilters.js.map +1 -0
  68. package/dist/cjs/schema/types/collection.d.ts +51 -0
  69. package/dist/cjs/schema/types/collection.js +3 -0
  70. package/dist/cjs/schema/types/collection.js.map +1 -0
  71. package/dist/cjs/schema/types/compounds.d.ts +12 -0
  72. package/dist/cjs/schema/types/compounds.js +3 -0
  73. package/dist/cjs/schema/types/compounds.js.map +1 -0
  74. package/dist/cjs/schema/types/fields.d.ts +59 -0
  75. package/dist/cjs/schema/types/fields.js +3 -0
  76. package/dist/cjs/schema/types/fields.js.map +1 -0
  77. package/dist/cjs/schema/types/filters.d.ts +29 -0
  78. package/dist/cjs/schema/types/filters.js +3 -0
  79. package/dist/cjs/schema/types/filters.js.map +1 -0
  80. package/dist/cjs/schema/types/shapes.d.ts +21 -0
  81. package/dist/cjs/schema/types/shapes.js +3 -0
  82. package/dist/cjs/schema/types/shapes.js.map +1 -0
  83. package/dist/cjs/schema/types/synthetics.d.ts +28 -0
  84. package/dist/cjs/schema/types/synthetics.js +3 -0
  85. package/dist/cjs/schema/types/synthetics.js.map +1 -0
  86. package/dist/cjs/schema/types.d.ts +18 -0
  87. package/dist/cjs/schema/types.js +23 -0
  88. package/dist/cjs/schema/types.js.map +1 -0
  89. package/dist/cjs/timestamp.d.ts +48 -0
  90. package/dist/cjs/timestamp.js +244 -0
  91. package/dist/cjs/timestamp.js.map +1 -0
  92. package/dist/cjs/timestamp.test.d.ts +1 -0
  93. package/dist/cjs/timestamp.test.js +94 -0
  94. package/dist/cjs/timestamp.test.js.map +1 -0
  95. package/dist/cjs/undo.d.ts +3 -0
  96. package/dist/cjs/undo.js +199 -0
  97. package/dist/cjs/undo.js.map +1 -0
  98. package/dist/cjs/utils.d.ts +15 -0
  99. package/dist/cjs/utils.js +128 -0
  100. package/dist/cjs/utils.js.map +1 -0
  101. package/dist/cjs/utils.test.d.ts +1 -0
  102. package/dist/cjs/utils.test.js +37 -0
  103. package/dist/cjs/utils.test.js.map +1 -0
  104. package/dist/esm/EventSubscriber.d.ts +17 -0
  105. package/dist/esm/EventSubscriber.js +63 -0
  106. package/dist/esm/EventSubscriber.js.map +1 -0
  107. package/dist/esm/baseline.d.ts +5 -0
  108. package/dist/esm/baseline.js +2 -0
  109. package/dist/esm/baseline.js.map +1 -0
  110. package/dist/esm/batching.d.ts +41 -0
  111. package/dist/esm/batching.js +84 -0
  112. package/dist/esm/batching.js.map +1 -0
  113. package/dist/esm/files.d.ts +19 -0
  114. package/dist/esm/files.js +13 -0
  115. package/dist/esm/files.js.map +1 -0
  116. package/dist/esm/files.test.d.ts +1 -0
  117. package/dist/esm/files.test.js +79 -0
  118. package/dist/esm/files.test.js.map +1 -0
  119. package/dist/esm/index.d.ts +18 -0
  120. package/dist/esm/index.js +16 -0
  121. package/dist/esm/index.js.map +1 -0
  122. package/dist/esm/indexes.d.ts +14 -0
  123. package/dist/esm/indexes.js +106 -0
  124. package/dist/esm/indexes.js.map +1 -0
  125. package/dist/esm/indexes.test.d.ts +1 -0
  126. package/dist/esm/indexes.test.js +126 -0
  127. package/dist/esm/indexes.test.js.map +1 -0
  128. package/dist/esm/migration.d.ts +98 -0
  129. package/dist/esm/migration.js +122 -0
  130. package/dist/esm/migration.js.map +1 -0
  131. package/dist/esm/oids.d.ts +87 -0
  132. package/dist/esm/oids.js +348 -0
  133. package/dist/esm/oids.js.map +1 -0
  134. package/dist/esm/oids.test.d.ts +1 -0
  135. package/dist/esm/oids.test.js +280 -0
  136. package/dist/esm/oids.test.js.map +1 -0
  137. package/dist/esm/operation.d.ts +139 -0
  138. package/dist/esm/operation.js +518 -0
  139. package/dist/esm/operation.js.map +1 -0
  140. package/dist/esm/operation.test.d.ts +1 -0
  141. package/dist/esm/operation.test.js +825 -0
  142. package/dist/esm/operation.test.js.map +1 -0
  143. package/dist/esm/patch.d.ts +26 -0
  144. package/dist/esm/patch.js +223 -0
  145. package/dist/esm/patch.js.map +1 -0
  146. package/dist/esm/presence.d.ts +27 -0
  147. package/dist/esm/presence.js +2 -0
  148. package/dist/esm/presence.js.map +1 -0
  149. package/dist/esm/protocol.d.ts +145 -0
  150. package/dist/esm/protocol.js +3 -0
  151. package/dist/esm/protocol.js.map +1 -0
  152. package/dist/esm/refs.d.ts +5 -0
  153. package/dist/esm/refs.js +17 -0
  154. package/dist/esm/refs.js.map +1 -0
  155. package/dist/esm/replica.d.ts +28 -0
  156. package/dist/esm/replica.js +26 -0
  157. package/dist/esm/replica.js.map +1 -0
  158. package/dist/esm/schema/defaults.d.ts +4 -0
  159. package/dist/esm/schema/defaults.js +66 -0
  160. package/dist/esm/schema/defaults.js.map +1 -0
  161. package/dist/esm/schema/defaults.test.d.ts +1 -0
  162. package/dist/esm/schema/defaults.test.js +19 -0
  163. package/dist/esm/schema/defaults.test.js.map +1 -0
  164. package/dist/esm/schema/index.d.ts +8 -0
  165. package/dist/esm/schema/index.js +10 -0
  166. package/dist/esm/schema/index.js.map +1 -0
  167. package/dist/esm/schema/indexFilters.d.ts +6 -0
  168. package/dist/esm/schema/indexFilters.js +23 -0
  169. package/dist/esm/schema/indexFilters.js.map +1 -0
  170. package/dist/esm/schema/types/collection.d.ts +51 -0
  171. package/dist/esm/schema/types/collection.js +2 -0
  172. package/dist/esm/schema/types/collection.js.map +1 -0
  173. package/dist/esm/schema/types/compounds.d.ts +12 -0
  174. package/dist/esm/schema/types/compounds.js +2 -0
  175. package/dist/esm/schema/types/compounds.js.map +1 -0
  176. package/dist/esm/schema/types/fields.d.ts +59 -0
  177. package/dist/esm/schema/types/fields.js +2 -0
  178. package/dist/esm/schema/types/fields.js.map +1 -0
  179. package/dist/esm/schema/types/filters.d.ts +29 -0
  180. package/dist/esm/schema/types/filters.js +2 -0
  181. package/dist/esm/schema/types/filters.js.map +1 -0
  182. package/dist/esm/schema/types/shapes.d.ts +21 -0
  183. package/dist/esm/schema/types/shapes.js +2 -0
  184. package/dist/esm/schema/types/shapes.js.map +1 -0
  185. package/dist/esm/schema/types/synthetics.d.ts +28 -0
  186. package/dist/esm/schema/types/synthetics.js +2 -0
  187. package/dist/esm/schema/types/synthetics.js.map +1 -0
  188. package/dist/esm/schema/types.d.ts +18 -0
  189. package/dist/esm/schema/types.js +7 -0
  190. package/dist/esm/schema/types.js.map +1 -0
  191. package/dist/esm/timestamp.d.ts +48 -0
  192. package/dist/esm/timestamp.js +229 -0
  193. package/dist/esm/timestamp.js.map +1 -0
  194. package/dist/esm/timestamp.test.d.ts +1 -0
  195. package/dist/esm/timestamp.test.js +92 -0
  196. package/dist/esm/timestamp.test.js.map +1 -0
  197. package/dist/esm/undo.d.ts +3 -0
  198. package/dist/esm/undo.js +195 -0
  199. package/dist/esm/undo.js.map +1 -0
  200. package/dist/esm/utils.d.ts +15 -0
  201. package/dist/esm/utils.js +114 -0
  202. package/dist/esm/utils.js.map +1 -0
  203. package/dist/esm/utils.test.d.ts +1 -0
  204. package/dist/esm/utils.test.js +35 -0
  205. package/dist/esm/utils.test.js.map +1 -0
  206. package/dist/tsconfig-cjs.tsbuildinfo +1 -0
  207. package/dist/tsconfig.tsbuildinfo +1 -0
  208. package/package.json +38 -0
  209. package/src/EventSubscriber.ts +81 -0
  210. package/src/baseline.ts +9 -0
  211. package/src/batching.ts +135 -0
  212. package/src/files.ts +34 -0
  213. package/src/index.ts +26 -0
  214. package/src/indexes.test.ts +158 -0
  215. package/src/indexes.ts +151 -0
  216. package/src/migration.ts +391 -0
  217. package/src/oids.test.ts +395 -0
  218. package/src/oids.ts +442 -0
  219. package/src/operation.test.ts +966 -0
  220. package/src/operation.ts +755 -0
  221. package/src/patch.ts +277 -0
  222. package/src/presence.ts +29 -0
  223. package/src/protocol.ts +184 -0
  224. package/src/refs.ts +16 -0
  225. package/src/replica.ts +29 -0
  226. package/src/schema/defaults.test.ts +19 -0
  227. package/src/schema/defaults.ts +72 -0
  228. package/src/schema/index.ts +28 -0
  229. package/src/schema/indexFilters.ts +49 -0
  230. package/src/schema/types/collection.ts +133 -0
  231. package/src/schema/types/compounds.ts +33 -0
  232. package/src/schema/types/fields.ts +85 -0
  233. package/src/schema/types/filters.ts +39 -0
  234. package/src/schema/types/shapes.ts +83 -0
  235. package/src/schema/types/synthetics.ts +45 -0
  236. package/src/schema/types.ts +28 -0
  237. package/src/timestamp.test.ts +113 -0
  238. package/src/timestamp.ts +284 -0
  239. package/src/undo.ts +205 -0
  240. package/src/utils.test.ts +38 -0
  241. package/src/utils.ts +137 -0
@@ -0,0 +1,395 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { createFileRef } from './files.js';
3
+ import {
4
+ assignOid,
5
+ assignOidPropertiesToAllSubObjects,
6
+ assignOidProperty,
7
+ assignOidsToAllSubObjects,
8
+ createOid,
9
+ decomposeOid,
10
+ getOid,
11
+ getOidRange,
12
+ hasOid,
13
+ maybeGetOidProperty,
14
+ normalize,
15
+ normalizeFirstLevel,
16
+ ObjectIdentifier,
17
+ removeOidPropertiesFromAllSubObjects,
18
+ } from './oids.js';
19
+
20
+ describe('normalizing an object', () => {
21
+ it('should return a map of sub-objects with relationships replaced by refs', () => {
22
+ let i = 0;
23
+ function createSubId() {
24
+ return (i++).toString();
25
+ }
26
+
27
+ const initial = {
28
+ foo: {
29
+ bar: 1,
30
+ baz: [2, 3],
31
+ },
32
+ qux: [
33
+ {
34
+ corge: true,
35
+ },
36
+ {
37
+ grault: {
38
+ garply: 4,
39
+ },
40
+ },
41
+ ],
42
+ };
43
+ assignOid(initial, 'test/a');
44
+ assignOidsToAllSubObjects(initial, createSubId);
45
+
46
+ const result = normalize(initial);
47
+
48
+ expect(result.get('test/a')).toEqual(
49
+ assignOid(
50
+ {
51
+ foo: {
52
+ '@@type': 'ref',
53
+ id: 'test/a.foo:0',
54
+ },
55
+ qux: {
56
+ '@@type': 'ref',
57
+ id: 'test/a.qux:2',
58
+ },
59
+ },
60
+ 'test/a',
61
+ ),
62
+ );
63
+ expect(result.get('test/a.foo:0')).toEqual(
64
+ assignOid(
65
+ {
66
+ bar: 1,
67
+ baz: {
68
+ '@@type': 'ref',
69
+ id: 'test/a.foo.baz:1',
70
+ },
71
+ },
72
+ 'test/a.foo:0',
73
+ ),
74
+ );
75
+ expect(result.get('test/a.foo.baz:1')).toEqual(
76
+ assignOid([2, 3], 'test/a.foo.baz:1'),
77
+ );
78
+ expect(result.get('test/a.qux:2')).toEqual(
79
+ assignOid(
80
+ [
81
+ {
82
+ '@@type': 'ref',
83
+ id: 'test/a.qux.#:3',
84
+ },
85
+ {
86
+ '@@type': 'ref',
87
+ id: 'test/a.qux.#:4',
88
+ },
89
+ ],
90
+ 'test/a.qux:2',
91
+ ),
92
+ );
93
+ expect(result.get('test/a.qux.#:3')).toEqual(
94
+ assignOid(
95
+ {
96
+ corge: true,
97
+ },
98
+ 'test/a.qux.#:3',
99
+ ),
100
+ );
101
+ expect(result.get('test/a.qux.#:4')).toEqual(
102
+ assignOid(
103
+ {
104
+ grault: {
105
+ '@@type': 'ref',
106
+ id: 'test/a.qux.#.grault:5',
107
+ },
108
+ },
109
+ 'test/a.qux.#:4',
110
+ ),
111
+ );
112
+ expect(result.get('test/a.qux.#.grault:5')).toEqual(
113
+ assignOid(
114
+ {
115
+ garply: 4,
116
+ },
117
+ 'test/a.qux.#.grault:5',
118
+ ),
119
+ );
120
+ });
121
+
122
+ it('should handle file references and not replace them with refs or attempt to normalize them', () => {
123
+ let i = 0;
124
+ function createSubId() {
125
+ return (i++).toString();
126
+ }
127
+
128
+ const initial = {
129
+ foo: {
130
+ bar: 1,
131
+ file: createFileRef('abcd123'),
132
+ },
133
+ qux: [createFileRef('efgh456'), createFileRef('ijkl789')],
134
+ };
135
+ assignOid(initial, 'test/a');
136
+ assignOidsToAllSubObjects(initial, createSubId);
137
+
138
+ const result = normalize(initial);
139
+
140
+ expect(result.size).toBe(3);
141
+
142
+ expect(result.get('test/a')).toEqual(
143
+ assignOid(
144
+ {
145
+ foo: {
146
+ '@@type': 'ref',
147
+ id: 'test/a.foo:0',
148
+ },
149
+ qux: {
150
+ '@@type': 'ref',
151
+ id: 'test/a.qux:1',
152
+ },
153
+ },
154
+ 'test/a',
155
+ ),
156
+ );
157
+ expect(result.get('test/a.foo:0')).toEqual(
158
+ assignOid(
159
+ {
160
+ bar: 1,
161
+ file: {
162
+ '@@type': 'file',
163
+ id: 'abcd123',
164
+ },
165
+ },
166
+ 'test/a.foo:0',
167
+ ),
168
+ );
169
+ expect(result.get('test/a.qux:1')).toEqual(
170
+ assignOid(
171
+ [
172
+ {
173
+ '@@type': 'file',
174
+ id: 'efgh456',
175
+ },
176
+ {
177
+ '@@type': 'file',
178
+ id: 'ijkl789',
179
+ },
180
+ ],
181
+ 'test/a.qux:2',
182
+ ),
183
+ );
184
+ });
185
+ });
186
+
187
+ describe('normalizing the first level of an object', () => {
188
+ it('collects all top-level sub-objects', () => {
189
+ let i = 0;
190
+ function createSubId() {
191
+ return (i++).toString();
192
+ }
193
+
194
+ const initial = {
195
+ foo: {
196
+ bar: 1,
197
+ baz: [2, 3],
198
+ },
199
+ qux: [
200
+ {
201
+ corge: true,
202
+ },
203
+ {
204
+ grault: {
205
+ garply: 4,
206
+ },
207
+ },
208
+ ],
209
+ };
210
+ assignOid(initial, 'test/a');
211
+ assignOidsToAllSubObjects(initial, createSubId);
212
+
213
+ const { refs: result } = normalizeFirstLevel(initial);
214
+
215
+ expect(result.get('test/a')).toMatchInlineSnapshot(`
216
+ {
217
+ "foo": {
218
+ "@@type": "ref",
219
+ "id": "test/a.foo:0",
220
+ },
221
+ "qux": {
222
+ "@@type": "ref",
223
+ "id": "test/a.qux:2",
224
+ },
225
+ }
226
+ `);
227
+ expect(result.get('test/a:0')).toMatchInlineSnapshot('undefined');
228
+ expect(result.get('test/a:1')).toBeUndefined();
229
+ expect(result.get('test/a:2')).toMatchInlineSnapshot('undefined');
230
+ expect(result.get('test/a:3')).toBeUndefined();
231
+ expect(result.get('test/a:4')).toBeUndefined();
232
+ expect(result.get('test/a:5')).toBeUndefined();
233
+ });
234
+ });
235
+
236
+ describe('computing a range of oids for a whole object set', () => {
237
+ function isWithin(
238
+ oid: ObjectIdentifier,
239
+ start: ObjectIdentifier,
240
+ end: ObjectIdentifier,
241
+ ) {
242
+ return oid >= start && oid <= end;
243
+ }
244
+ it('should include the root object and any possible sub object oid', () => {
245
+ const [start, end] = getOidRange('test/a');
246
+ expect(start).toEqual('test/a');
247
+ expect(end).toEqual('test/a:\uffff');
248
+ expect(start < end).toBe(true);
249
+ expect(isWithin('test/a', start, end)).toBe(true);
250
+ expect(isWithin('test/a:0', start, end)).toBe(true);
251
+ expect(isWithin('test/a:1', start, end)).toBe(true);
252
+ expect(isWithin('test/a:zzzzzzzzzzzzzzzzzzzzzzz', start, end)).toBe(true);
253
+ expect(isWithin('test/a:\uffff', start, end)).toBe(true);
254
+ expect(isWithin('test1/a', start, end)).toBe(false);
255
+ expect(isWithin('test/b', start, end)).toBe(false);
256
+ expect(isWithin('test/ ', start, end)).toBe(false);
257
+ });
258
+ });
259
+
260
+ describe('assigning OIDs as properties', () => {
261
+ it('should assign to all sub-objects', () => {
262
+ let i = 0;
263
+ function createSubId() {
264
+ return (i++).toString();
265
+ }
266
+
267
+ const initial = {
268
+ foo: {
269
+ bar: 1,
270
+ baz: [2, 3],
271
+ },
272
+ qux: [
273
+ {
274
+ corge: true,
275
+ },
276
+ {
277
+ grault: {
278
+ garply: 4,
279
+ },
280
+ },
281
+ ],
282
+ };
283
+ assignOid(initial, 'test/a');
284
+ assignOidsToAllSubObjects(initial, createSubId);
285
+ assignOidPropertiesToAllSubObjects(initial);
286
+
287
+ expect(initial).toMatchInlineSnapshot(`
288
+ {
289
+ "@@id": "test/a",
290
+ "foo": {
291
+ "@@id": "test/a.foo:0",
292
+ "bar": 1,
293
+ "baz": [
294
+ 2,
295
+ 3,
296
+ ],
297
+ },
298
+ "qux": [
299
+ {
300
+ "@@id": "test/a.qux.#:3",
301
+ "corge": true,
302
+ },
303
+ {
304
+ "@@id": "test/a.qux.#:4",
305
+ "grault": {
306
+ "@@id": "test/a.qux.#.grault:5",
307
+ "garply": 4,
308
+ },
309
+ },
310
+ ],
311
+ }
312
+ `);
313
+ // extra check needed for array since it doesn't serialize in the snapshot
314
+ expect(maybeGetOidProperty(initial.qux)).toBe('test/a.qux:2');
315
+ });
316
+
317
+ it('should transfer assigned OID properties to the memory system', () => {
318
+ const initial = assignOidProperty(
319
+ {
320
+ foo: assignOidProperty(
321
+ {
322
+ bar: 1,
323
+ },
324
+ 'test/a.foo:1',
325
+ ),
326
+ qux: assignOidProperty(
327
+ [
328
+ assignOidProperty(
329
+ {
330
+ corge: true,
331
+ },
332
+ 'test/a.qux.#:2',
333
+ ),
334
+ assignOidProperty(
335
+ {
336
+ grault: assignOidProperty(
337
+ {
338
+ garply: 4,
339
+ },
340
+ 'test/a.qux.#.grault:3',
341
+ ),
342
+ },
343
+ 'test/a.qux.#:4',
344
+ ),
345
+ ],
346
+ 'test/a.qux:2',
347
+ ),
348
+ },
349
+ 'test/a',
350
+ );
351
+
352
+ removeOidPropertiesFromAllSubObjects(initial);
353
+
354
+ expect(getOid(initial)).toEqual('test/a');
355
+ expect(getOid(initial.foo)).toEqual('test/a.foo:1');
356
+ expect(getOid(initial.qux)).toEqual('test/a.qux:2');
357
+ expect(getOid(initial.qux[0])).toEqual('test/a.qux.#:2');
358
+ expect(getOid(initial.qux[1])).toEqual('test/a.qux.#:4');
359
+ expect(getOid(initial.qux[1].grault)).toEqual('test/a.qux.#.grault:3');
360
+ });
361
+ });
362
+
363
+ it('should handle special characters in document id or collection', () => {
364
+ expect(
365
+ decomposeOid(
366
+ createOid(
367
+ 'test.teesssst/asdf::',
368
+ 'foo/bar (.) : huh:',
369
+ ['baz?.quoo:/', 'qux'],
370
+ 'corge',
371
+ ),
372
+ ),
373
+ ).toEqual({
374
+ collection: 'test.teesssst/asdf::',
375
+ id: 'foo/bar (.) : huh:',
376
+ keyPath: ['baz?.quoo:/', 'qux'],
377
+ subId: 'corge',
378
+ });
379
+ });
380
+
381
+ describe('assigning OIDs to sub-objects', () => {
382
+ it('should not assign oids to refs', () => {
383
+ const obj = {
384
+ foo: {
385
+ file: createFileRef('1a'),
386
+ },
387
+ bar: [createFileRef('2a')],
388
+ };
389
+ assignOid(obj, 'test/a');
390
+ assignOidsToAllSubObjects(obj);
391
+
392
+ expect(hasOid(obj.foo.file)).toBe(false);
393
+ expect(hasOid(obj.bar[0])).toBe(false);
394
+ });
395
+ });