@colyseus/schema 4.0.1 → 4.0.3

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 (190) hide show
  1. package/{lib → build}/Metadata.d.ts +2 -2
  2. package/{lib → build}/Reflection.d.ts +13 -13
  3. package/{lib → build}/Schema.d.ts +10 -10
  4. package/{lib → build}/annotations.d.ts +10 -10
  5. package/build/codegen/languages/cpp.d.ts +3 -0
  6. package/build/codegen/languages/csharp.d.ts +4 -0
  7. package/build/codegen/languages/haxe.d.ts +3 -0
  8. package/{lib → build}/codegen/languages/java.d.ts +2 -2
  9. package/build/codegen/languages/js.d.ts +3 -0
  10. package/build/codegen/languages/lua.d.ts +3 -0
  11. package/build/codegen/languages/ts.d.ts +3 -0
  12. package/{lib → build}/codegen/parser.d.ts +1 -1
  13. package/{lib → build}/decoder/DecodeOperation.d.ts +5 -5
  14. package/{lib → build}/decoder/Decoder.d.ts +7 -7
  15. package/{lib → build}/decoder/ReferenceTracker.d.ts +1 -1
  16. package/{lib → build}/decoder/strategy/Callbacks.d.ts +11 -11
  17. package/{lib → build}/decoder/strategy/RawChanges.d.ts +2 -2
  18. package/{lib → build}/decoder/strategy/getDecoderStateCallbacks.d.ts +3 -3
  19. package/{lib → build}/encoder/ChangeTree.d.ts +11 -11
  20. package/{lib → build}/encoder/EncodeOperation.d.ts +5 -5
  21. package/{lib → build}/encoder/Encoder.d.ts +6 -6
  22. package/{lib → build}/encoder/Root.d.ts +2 -2
  23. package/{lib → build}/encoder/StateView.d.ts +1 -1
  24. package/{lib → build}/encoding/assert.d.ts +6 -6
  25. package/{lib → build}/encoding/decode.d.ts +1 -1
  26. package/{lib → build}/encoding/encode.d.ts +1 -1
  27. package/build/{cjs/index.js → index.cjs} +1 -1
  28. package/build/index.cjs.map +1 -0
  29. package/build/index.d.ts +32 -0
  30. package/build/index.mjs.map +1 -0
  31. package/{lib → build}/types/HelperTypes.d.ts +6 -6
  32. package/{lib → build}/types/TypeContext.d.ts +1 -1
  33. package/{lib → build}/types/custom/ArraySchema.d.ts +8 -8
  34. package/{lib → build}/types/custom/CollectionSchema.d.ts +7 -7
  35. package/{lib → build}/types/custom/MapSchema.d.ts +7 -7
  36. package/{lib → build}/types/custom/SetSchema.d.ts +7 -7
  37. package/{lib → build}/types/registry.d.ts +2 -2
  38. package/{lib → build}/utils.d.ts +1 -1
  39. package/package.json +15 -14
  40. package/src/Metadata.ts +5 -5
  41. package/src/Reflection.ts +7 -7
  42. package/src/Schema.ts +11 -11
  43. package/src/annotations.ts +13 -13
  44. package/src/codegen/api.ts +10 -3
  45. package/src/codegen/cli.ts +2 -2
  46. package/src/codegen/languages/cpp.ts +2 -2
  47. package/src/codegen/languages/csharp.ts +3 -3
  48. package/src/codegen/languages/haxe.ts +2 -2
  49. package/src/codegen/languages/java.ts +2 -2
  50. package/src/codegen/languages/js.ts +2 -2
  51. package/src/codegen/languages/lua.ts +2 -2
  52. package/src/codegen/languages/ts.ts +2 -2
  53. package/src/codegen/parser.ts +7 -2
  54. package/src/codegen/types.ts +5 -0
  55. package/src/decoder/DecodeOperation.ts +14 -14
  56. package/src/decoder/Decoder.ts +11 -11
  57. package/src/decoder/ReferenceTracker.ts +8 -8
  58. package/src/decoder/strategy/Callbacks.ts +12 -12
  59. package/src/decoder/strategy/RawChanges.ts +2 -2
  60. package/src/decoder/strategy/getDecoderStateCallbacks.ts +10 -10
  61. package/src/encoder/ChangeTree.ts +13 -13
  62. package/src/encoder/EncodeOperation.ts +9 -9
  63. package/src/encoder/Encoder.ts +10 -10
  64. package/src/encoder/Root.ts +4 -4
  65. package/src/encoder/StateView.ts +7 -7
  66. package/src/encoding/assert.ts +6 -6
  67. package/src/encoding/decode.ts +1 -1
  68. package/src/encoding/encode.ts +1 -1
  69. package/src/index.ts +27 -27
  70. package/src/types/HelperTypes.ts +6 -6
  71. package/src/types/TypeContext.ts +3 -3
  72. package/src/types/custom/ArraySchema.ts +11 -11
  73. package/src/types/custom/CollectionSchema.ts +9 -9
  74. package/src/types/custom/MapSchema.ts +10 -10
  75. package/src/types/custom/SetSchema.ts +9 -9
  76. package/src/types/registry.ts +3 -3
  77. package/src/utils.ts +3 -3
  78. package/src/v3_bench.ts +1 -1
  79. package/build/cjs/index.js.map +0 -1
  80. package/build/esm/index.mjs.map +0 -1
  81. package/lib/Metadata.js +0 -260
  82. package/lib/Metadata.js.map +0 -1
  83. package/lib/Reflection.js +0 -182
  84. package/lib/Reflection.js.map +0 -1
  85. package/lib/Schema.js +0 -356
  86. package/lib/Schema.js.map +0 -1
  87. package/lib/annotations.js +0 -484
  88. package/lib/annotations.js.map +0 -1
  89. package/lib/bench_encode.d.ts +0 -1
  90. package/lib/bench_encode.js +0 -126
  91. package/lib/bench_encode.js.map +0 -1
  92. package/lib/codegen/api.js +0 -87
  93. package/lib/codegen/api.js.map +0 -1
  94. package/lib/codegen/argv.js +0 -41
  95. package/lib/codegen/argv.js.map +0 -1
  96. package/lib/codegen/cli.js +0 -63
  97. package/lib/codegen/cli.js.map +0 -1
  98. package/lib/codegen/languages/cpp.d.ts +0 -3
  99. package/lib/codegen/languages/cpp.js +0 -261
  100. package/lib/codegen/languages/cpp.js.map +0 -1
  101. package/lib/codegen/languages/csharp.d.ts +0 -4
  102. package/lib/codegen/languages/csharp.js +0 -157
  103. package/lib/codegen/languages/csharp.js.map +0 -1
  104. package/lib/codegen/languages/haxe.d.ts +0 -3
  105. package/lib/codegen/languages/haxe.js +0 -103
  106. package/lib/codegen/languages/haxe.js.map +0 -1
  107. package/lib/codegen/languages/java.js +0 -103
  108. package/lib/codegen/languages/java.js.map +0 -1
  109. package/lib/codegen/languages/js.d.ts +0 -3
  110. package/lib/codegen/languages/js.js +0 -104
  111. package/lib/codegen/languages/js.js.map +0 -1
  112. package/lib/codegen/languages/lua.d.ts +0 -3
  113. package/lib/codegen/languages/lua.js +0 -106
  114. package/lib/codegen/languages/lua.js.map +0 -1
  115. package/lib/codegen/languages/ts.d.ts +0 -3
  116. package/lib/codegen/languages/ts.js +0 -119
  117. package/lib/codegen/languages/ts.js.map +0 -1
  118. package/lib/codegen/parser.js +0 -364
  119. package/lib/codegen/parser.js.map +0 -1
  120. package/lib/codegen/types.js +0 -181
  121. package/lib/codegen/types.js.map +0 -1
  122. package/lib/decoder/DecodeOperation.js +0 -255
  123. package/lib/decoder/DecodeOperation.js.map +0 -1
  124. package/lib/decoder/Decoder.js +0 -118
  125. package/lib/decoder/Decoder.js.map +0 -1
  126. package/lib/decoder/ReferenceTracker.js +0 -139
  127. package/lib/decoder/ReferenceTracker.js.map +0 -1
  128. package/lib/decoder/strategy/Callbacks.js +0 -340
  129. package/lib/decoder/strategy/Callbacks.js.map +0 -1
  130. package/lib/decoder/strategy/RawChanges.js +0 -7
  131. package/lib/decoder/strategy/RawChanges.js.map +0 -1
  132. package/lib/decoder/strategy/getDecoderStateCallbacks.js +0 -277
  133. package/lib/decoder/strategy/getDecoderStateCallbacks.js.map +0 -1
  134. package/lib/encoder/ChangeTree.js +0 -542
  135. package/lib/encoder/ChangeTree.js.map +0 -1
  136. package/lib/encoder/EncodeOperation.js +0 -139
  137. package/lib/encoder/EncodeOperation.js.map +0 -1
  138. package/lib/encoder/Encoder.js +0 -208
  139. package/lib/encoder/Encoder.js.map +0 -1
  140. package/lib/encoder/Root.js +0 -233
  141. package/lib/encoder/Root.js.map +0 -1
  142. package/lib/encoder/StateView.js +0 -284
  143. package/lib/encoder/StateView.js.map +0 -1
  144. package/lib/encoding/assert.js +0 -55
  145. package/lib/encoding/assert.js.map +0 -1
  146. package/lib/encoding/decode.js +0 -221
  147. package/lib/encoding/decode.js.map +0 -1
  148. package/lib/encoding/encode.js +0 -282
  149. package/lib/encoding/encode.js.map +0 -1
  150. package/lib/encoding/spec.js +0 -29
  151. package/lib/encoding/spec.js.map +0 -1
  152. package/lib/index.d.ts +0 -32
  153. package/lib/index.js +0 -81
  154. package/lib/index.js.map +0 -1
  155. package/lib/symbol.shim.js +0 -4
  156. package/lib/symbol.shim.js.map +0 -1
  157. package/lib/types/HelperTypes.js +0 -3
  158. package/lib/types/HelperTypes.js.map +0 -1
  159. package/lib/types/TypeContext.js +0 -147
  160. package/lib/types/TypeContext.js.map +0 -1
  161. package/lib/types/custom/ArraySchema.js +0 -737
  162. package/lib/types/custom/ArraySchema.js.map +0 -1
  163. package/lib/types/custom/CollectionSchema.js +0 -174
  164. package/lib/types/custom/CollectionSchema.js.map +0 -1
  165. package/lib/types/custom/MapSchema.js +0 -226
  166. package/lib/types/custom/MapSchema.js.map +0 -1
  167. package/lib/types/custom/SetSchema.js +0 -182
  168. package/lib/types/custom/SetSchema.js.map +0 -1
  169. package/lib/types/registry.js +0 -37
  170. package/lib/types/registry.js.map +0 -1
  171. package/lib/types/symbols.js +0 -37
  172. package/lib/types/symbols.js.map +0 -1
  173. package/lib/types/utils.js +0 -16
  174. package/lib/types/utils.js.map +0 -1
  175. package/lib/utils.js +0 -54
  176. package/lib/utils.js.map +0 -1
  177. package/lib/v3_bench.js +0 -130
  178. package/lib/v3_bench.js.map +0 -1
  179. package/src/bench_encode.ts +0 -64
  180. /package/{lib → build}/codegen/api.d.ts +0 -0
  181. /package/{lib → build}/codegen/argv.d.ts +0 -0
  182. /package/{lib → build}/codegen/cli.d.ts +0 -0
  183. /package/{lib → build}/codegen/types.d.ts +0 -0
  184. /package/{lib → build}/encoding/spec.d.ts +0 -0
  185. /package/build/{umd/index.js → index.js} +0 -0
  186. /package/build/{esm/index.mjs → index.mjs} +0 -0
  187. /package/{lib → build}/symbol.shim.d.ts +0 -0
  188. /package/{lib → build}/types/symbols.d.ts +0 -0
  189. /package/{lib → build}/types/utils.d.ts +0 -0
  190. /package/{lib → build}/v3_bench.d.ts +0 -0
package/lib/Schema.js DELETED
@@ -1,356 +0,0 @@
1
- "use strict";
2
- var _a, _b;
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.Schema = void 0;
5
- const spec_1 = require("./encoding/spec");
6
- const annotations_1 = require("./annotations");
7
- const ChangeTree_1 = require("./encoder/ChangeTree");
8
- const symbols_1 = require("./types/symbols");
9
- const EncodeOperation_1 = require("./encoder/EncodeOperation");
10
- const DecodeOperation_1 = require("./decoder/DecodeOperation");
11
- const utils_1 = require("./utils");
12
- /**
13
- * Schema encoder / decoder
14
- */
15
- class Schema {
16
- static { this[_a] = EncodeOperation_1.encodeSchemaOperation; }
17
- static { this[_b] = DecodeOperation_1.decodeSchemaOperation; }
18
- /**
19
- * Assign the property descriptors required to track changes on this instance.
20
- * @param instance
21
- */
22
- static initialize(instance) {
23
- Object.defineProperty(instance, symbols_1.$changes, {
24
- value: new ChangeTree_1.ChangeTree(instance),
25
- enumerable: false,
26
- writable: true
27
- });
28
- Object.defineProperties(instance, instance.constructor[Symbol.metadata]?.[symbols_1.$descriptors] || {});
29
- }
30
- static is(type) {
31
- return typeof (type[Symbol.metadata]) === "object";
32
- }
33
- /**
34
- * Track property changes
35
- */
36
- static [(Symbol.metadata, _a = symbols_1.$encoder, _b = symbols_1.$decoder, symbols_1.$track)](changeTree, index, operation = spec_1.OPERATION.ADD) {
37
- changeTree.change(index, operation);
38
- }
39
- /**
40
- * Determine if a property must be filtered.
41
- * - If returns false, the property is NOT going to be encoded.
42
- * - If returns true, the property is going to be encoded.
43
- *
44
- * Encoding with "filters" happens in two steps:
45
- * - First, the encoder iterates over all "not owned" properties and encodes them.
46
- * - Then, the encoder iterates over all "owned" properties per instance and encodes them.
47
- */
48
- static [symbols_1.$filter](ref, index, view) {
49
- const metadata = ref.constructor[Symbol.metadata];
50
- const tag = metadata[index]?.tag;
51
- if (view === undefined) {
52
- // shared pass/encode: encode if doesn't have a tag
53
- return tag === undefined;
54
- }
55
- else if (tag === undefined) {
56
- // view pass: no tag
57
- return true;
58
- }
59
- else if (tag === annotations_1.DEFAULT_VIEW_TAG) {
60
- // view pass: default tag
61
- return view.isChangeTreeVisible(ref[symbols_1.$changes]);
62
- }
63
- else {
64
- // view pass: custom tag
65
- const tags = view.tags?.get(ref[symbols_1.$changes]);
66
- return tags && tags.has(tag);
67
- }
68
- }
69
- // allow inherited classes to have a constructor
70
- constructor(arg) {
71
- //
72
- // inline
73
- // Schema.initialize(this);
74
- //
75
- Schema.initialize(this);
76
- //
77
- // Assign initial values
78
- //
79
- if (arg) {
80
- Object.assign(this, arg);
81
- }
82
- }
83
- /**
84
- * Assign properties to the instance.
85
- * @param props Properties to assign to the instance
86
- * @returns
87
- */
88
- assign(props) {
89
- Object.assign(this, props);
90
- return this;
91
- }
92
- /**
93
- * Restore the instance from JSON data.
94
- * @param jsonData JSON data to restore the instance from
95
- * @returns
96
- */
97
- restore(jsonData) {
98
- const metadata = this.constructor[Symbol.metadata];
99
- for (const fieldIndex in metadata) {
100
- const field = metadata[fieldIndex];
101
- const fieldName = field.name;
102
- const fieldType = field.type;
103
- const value = jsonData[fieldName];
104
- if (value === undefined || value === null) {
105
- continue;
106
- }
107
- if (typeof fieldType === "string") {
108
- // Primitive type: assign directly
109
- this[fieldName] = value;
110
- }
111
- else if (Schema.is(fieldType)) {
112
- // Schema type: create instance and restore
113
- const instance = new fieldType();
114
- instance.restore(value);
115
- this[fieldName] = instance;
116
- }
117
- else if (typeof fieldType === "object") {
118
- // Collection types: { map: ... }, { array: ... }, etc.
119
- const collectionType = Object.keys(fieldType)[0];
120
- const childType = fieldType[collectionType];
121
- if (collectionType === "map") {
122
- const mapSchema = this[fieldName];
123
- for (const key in value) {
124
- if (Schema.is(childType)) {
125
- const childInstance = new childType();
126
- childInstance.restore(value[key]);
127
- mapSchema.set(key, childInstance);
128
- }
129
- else {
130
- mapSchema.set(key, value[key]);
131
- }
132
- }
133
- }
134
- else if (collectionType === "array") {
135
- const arraySchema = this[fieldName];
136
- for (let i = 0; i < value.length; i++) {
137
- if (Schema.is(childType)) {
138
- const childInstance = new childType();
139
- childInstance.restore(value[i]);
140
- arraySchema.push(childInstance);
141
- }
142
- else {
143
- arraySchema.push(value[i]);
144
- }
145
- }
146
- }
147
- }
148
- }
149
- return this;
150
- }
151
- /**
152
- * (Server-side): Flag a property to be encoded for the next patch.
153
- * @param instance Schema instance
154
- * @param property string representing the property name, or number representing the index of the property.
155
- * @param operation OPERATION to perform (detected automatically)
156
- */
157
- setDirty(property, operation) {
158
- const metadata = this.constructor[Symbol.metadata];
159
- this[symbols_1.$changes].change(metadata[metadata[property]].index, operation);
160
- }
161
- clone() {
162
- // Create instance without calling custom constructor
163
- const cloned = Object.create(this.constructor.prototype);
164
- Schema.initialize(cloned);
165
- const metadata = this.constructor[Symbol.metadata];
166
- //
167
- // TODO: clone all properties, not only annotated ones
168
- //
169
- // for (const field in this) {
170
- for (const fieldIndex in metadata) {
171
- const field = metadata[fieldIndex].name;
172
- if (typeof (this[field]) === "object" &&
173
- typeof (this[field]?.clone) === "function") {
174
- // deep clone
175
- cloned[field] = this[field].clone();
176
- }
177
- else {
178
- // primitive values
179
- cloned[field] = this[field];
180
- }
181
- }
182
- return cloned;
183
- }
184
- toJSON() {
185
- const obj = {};
186
- const metadata = this.constructor[Symbol.metadata];
187
- for (const index in metadata) {
188
- const field = metadata[index];
189
- const fieldName = field.name;
190
- if (!field.deprecated && this[fieldName] !== null && typeof (this[fieldName]) !== "undefined") {
191
- obj[fieldName] = (typeof (this[fieldName]['toJSON']) === "function")
192
- ? this[fieldName]['toJSON']()
193
- : this[fieldName];
194
- }
195
- }
196
- return obj;
197
- }
198
- /**
199
- * Used in tests only
200
- * @internal
201
- */
202
- discardAllChanges() {
203
- this[symbols_1.$changes].discardAll();
204
- }
205
- [symbols_1.$getByIndex](index) {
206
- const metadata = this.constructor[Symbol.metadata];
207
- return this[metadata[index].name];
208
- }
209
- [symbols_1.$deleteByIndex](index) {
210
- const metadata = this.constructor[Symbol.metadata];
211
- this[metadata[index].name] = undefined;
212
- }
213
- /**
214
- * Inspect the `refId` of all Schema instances in the tree. Optionally display the contents of the instance.
215
- *
216
- * @param ref Schema instance
217
- * @param showContents display JSON contents of the instance
218
- * @returns
219
- */
220
- static debugRefIds(ref, showContents = false, level = 0, decoder, keyPrefix = "") {
221
- const contents = (showContents) ? ` - ${JSON.stringify(ref.toJSON())}` : "";
222
- const changeTree = ref[symbols_1.$changes];
223
- const refId = ref[symbols_1.$refId];
224
- const root = (decoder) ? decoder.root : changeTree.root;
225
- // log reference count if > 1
226
- const refCount = (root?.refCount?.[refId] > 1)
227
- ? ` [×${root.refCount[refId]}]`
228
- : '';
229
- let output = `${(0, utils_1.getIndent)(level)}${keyPrefix}${ref.constructor.name} (refId: ${refId})${refCount}${contents}\n`;
230
- changeTree.forEachChild((childChangeTree, indexOrKey) => {
231
- let key = indexOrKey;
232
- if (typeof indexOrKey === 'number' && ref['$indexes']) {
233
- // MapSchema
234
- key = ref['$indexes'].get(indexOrKey) ?? indexOrKey;
235
- }
236
- const keyPrefix = (ref['forEach'] !== undefined && key !== undefined) ? `["${key}"]: ` : "";
237
- output += this.debugRefIds(childChangeTree.ref, showContents, level + 1, decoder, keyPrefix);
238
- });
239
- return output;
240
- }
241
- static debugRefIdEncodingOrder(ref, changeSet = 'allChanges') {
242
- let encodeOrder = [];
243
- let current = ref[symbols_1.$changes].root[changeSet].next;
244
- while (current) {
245
- if (current.changeTree) {
246
- encodeOrder.push(current.changeTree.ref[symbols_1.$refId]);
247
- }
248
- current = current.next;
249
- }
250
- return encodeOrder;
251
- }
252
- static debugRefIdsFromDecoder(decoder) {
253
- return this.debugRefIds(decoder.state, false, 0, decoder);
254
- }
255
- /**
256
- * Return a string representation of the changes on a Schema instance.
257
- * The list of changes is cleared after each encode.
258
- *
259
- * @param instance Schema instance
260
- * @param isEncodeAll Return "full encode" instead of current change set.
261
- * @returns
262
- */
263
- static debugChanges(instance, isEncodeAll = false) {
264
- const changeTree = instance[symbols_1.$changes];
265
- const changeSet = (isEncodeAll) ? changeTree.allChanges : changeTree.changes;
266
- const changeSetName = (isEncodeAll) ? "allChanges" : "changes";
267
- let output = `${instance.constructor.name} (${instance[symbols_1.$refId]}) -> .${changeSetName}:\n`;
268
- function dumpChangeSet(changeSet) {
269
- changeSet.operations
270
- .filter(op => op)
271
- .forEach((index) => {
272
- const operation = changeTree.indexedOperations[index];
273
- output += `- [${index}]: ${spec_1.OPERATION[operation]} (${JSON.stringify(changeTree.getValue(Number(index), isEncodeAll))})\n`;
274
- });
275
- }
276
- dumpChangeSet(changeSet);
277
- // display filtered changes
278
- if (!isEncodeAll &&
279
- changeTree.filteredChanges &&
280
- (changeTree.filteredChanges.operations).filter(op => op).length > 0) {
281
- output += `${instance.constructor.name} (${instance[symbols_1.$refId]}) -> .filteredChanges:\n`;
282
- dumpChangeSet(changeTree.filteredChanges);
283
- }
284
- // display filtered changes
285
- if (isEncodeAll &&
286
- changeTree.allFilteredChanges &&
287
- (changeTree.allFilteredChanges.operations).filter(op => op).length > 0) {
288
- output += `${instance.constructor.name} (${instance[symbols_1.$refId]}) -> .allFilteredChanges:\n`;
289
- dumpChangeSet(changeTree.allFilteredChanges);
290
- }
291
- return output;
292
- }
293
- static debugChangesDeep(ref, changeSetName = "changes") {
294
- let output = "";
295
- const rootChangeTree = ref[symbols_1.$changes];
296
- const root = rootChangeTree.root;
297
- const changeTrees = new Map();
298
- const instanceRefIds = [];
299
- let totalOperations = 0;
300
- // TODO: FIXME: this method is not working as expected
301
- for (const [refId, changes] of Object.entries(root[changeSetName])) {
302
- const changeTree = root.changeTrees[refId];
303
- if (!changeTree) {
304
- continue;
305
- }
306
- let includeChangeTree = false;
307
- let parentChangeTrees = [];
308
- let parentChangeTree = changeTree.parent?.[symbols_1.$changes];
309
- if (changeTree === rootChangeTree) {
310
- includeChangeTree = true;
311
- }
312
- else {
313
- while (parentChangeTree !== undefined) {
314
- parentChangeTrees.push(parentChangeTree);
315
- if (parentChangeTree.ref === ref) {
316
- includeChangeTree = true;
317
- break;
318
- }
319
- parentChangeTree = parentChangeTree.parent?.[symbols_1.$changes];
320
- }
321
- }
322
- if (includeChangeTree) {
323
- instanceRefIds.push(changeTree.ref[symbols_1.$refId]);
324
- totalOperations += Object.keys(changes).length;
325
- changeTrees.set(changeTree, parentChangeTrees.reverse());
326
- }
327
- }
328
- output += "---\n";
329
- output += `root refId: ${rootChangeTree.ref[symbols_1.$refId]}\n`;
330
- output += `Total instances: ${instanceRefIds.length} (refIds: ${instanceRefIds.join(", ")})\n`;
331
- output += `Total changes: ${totalOperations}\n`;
332
- output += "---\n";
333
- // based on root.changes, display a tree of changes that has the "ref" instance as parent
334
- const visitedParents = new WeakSet();
335
- for (const [changeTree, parentChangeTrees] of changeTrees.entries()) {
336
- parentChangeTrees.forEach((parentChangeTree, level) => {
337
- if (!visitedParents.has(parentChangeTree)) {
338
- output += `${(0, utils_1.getIndent)(level)}${parentChangeTree.ref.constructor.name} (refId: ${parentChangeTree.ref[symbols_1.$refId]})\n`;
339
- visitedParents.add(parentChangeTree);
340
- }
341
- });
342
- const changes = changeTree.indexedOperations;
343
- const level = parentChangeTrees.length;
344
- const indent = (0, utils_1.getIndent)(level);
345
- const parentIndex = (level > 0) ? `(${changeTree.parentIndex}) ` : "";
346
- output += `${indent}${parentIndex}${changeTree.ref.constructor.name} (refId: ${changeTree.ref[symbols_1.$refId]}) - changes: ${Object.keys(changes).length}\n`;
347
- for (const index in changes) {
348
- const operation = changes[index];
349
- output += `${(0, utils_1.getIndent)(level + 1)}${spec_1.OPERATION[operation]}: ${index}\n`;
350
- }
351
- }
352
- return `${output}`;
353
- }
354
- }
355
- exports.Schema = Schema;
356
- //# sourceMappingURL=Schema.js.map
package/lib/Schema.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"Schema.js","sourceRoot":"","sources":["../src/Schema.ts"],"names":[],"mappings":";;;;AAAA,0CAA4C;AAC5C,+CAAsE;AAItE,qDAAuF;AACvF,6CAAmI;AAGnI,+DAAkE;AAClE,+DAAkE;AAIlE,mCAAoC;AAEpC;;GAEG;AACH,MAAa,MAAM;aAER,QAAU,GAAG,uCAAqB,CAAC;aACnC,QAAU,GAAG,uCAAqB,CAAC;IAI1C;;;OAGG;IACH,MAAM,CAAC,UAAU,CAAC,QAAa;QAC3B,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,kBAAQ,EAAE;YACtC,KAAK,EAAE,IAAI,uBAAU,CAAC,QAAQ,CAAC;YAC/B,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,IAAI;SACjB,CAAC,CAAC;QAEH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,sBAAY,CAAC,IAAI,EAAE,CAAC,CAAC;IACnG,CAAC;IAED,MAAM,CAAC,EAAE,CAAC,IAAoB;QAC1B,OAAO,OAAM,CAAE,IAAsB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,QAAQ,CAAC;IACzE,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,EA3BC,MAAM,CAAC,QAAQ,OACf,kBAAQ,OACR,kBAAQ,EAyBR,gBAAM,EAAC,CAAE,UAAsB,EAAE,KAAa,EAAE,YAAuB,gBAAS,CAAC,GAAG;QACxF,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACxC,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,CAAC,iBAAO,CAAC,CAAE,GAAW,EAAE,KAAa,EAAE,IAAe;QACzD,MAAM,QAAQ,GAAc,GAAG,CAAC,WAA6B,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/E,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC;QAEjC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACrB,mDAAmD;YACnD,OAAO,GAAG,KAAK,SAAS,CAAC;QAE7B,CAAC;aAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YAC3B,oBAAoB;YACpB,OAAO,IAAI,CAAC;QAEhB,CAAC;aAAM,IAAI,GAAG,KAAK,8BAAgB,EAAE,CAAC;YAClC,yBAAyB;YACzB,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,kBAAQ,CAAC,CAAC,CAAC;QAEnD,CAAC;aAAM,CAAC;YACJ,wBAAwB;YACxB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,kBAAQ,CAAC,CAAC,CAAC;YAC3C,OAAO,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;IACL,CAAC;IAED,gDAAgD;IAChD,YAAY,GAAO;QACf,EAAE;QACF,SAAS;QACT,2BAA2B;QAC3B,EAAE;QACF,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAExB,EAAE;QACF,wBAAwB;QACxB,EAAE;QACF,IAAI,GAAG,EAAE,CAAC;YACN,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC7B,CAAC;IACL,CAAC;IAED;;;;OAIG;IACI,MAAM,CAA0B,KAAyB;QAC5D,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACI,OAAO,CAAC,QAAsB;QACjC,MAAM,QAAQ,GAAc,IAAI,CAAC,WAA6B,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEhF,KAAK,MAAM,UAAU,IAAI,QAAQ,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,UAA2B,CAAC,CAAC;YACpD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAkB,CAAC;YAC3C,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;YAC7B,MAAM,KAAK,GAAI,QAAgB,CAAC,SAAS,CAAC,CAAC;YAE3C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACxC,SAAS;YACb,CAAC;YAED,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAChC,kCAAkC;gBAClC,IAAI,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;YAE5B,CAAC;iBAAM,IAAI,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9B,2CAA2C;gBAC3C,MAAM,QAAQ,GAAG,IAAK,SAA2B,EAAE,CAAC;gBACpD,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACxB,IAAI,CAAC,SAAS,CAAC,GAAG,QAAe,CAAC;YAEtC,CAAC;iBAAM,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;gBACvC,uDAAuD;gBACvD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAW,CAAC;gBAC3D,MAAM,SAAS,GAAI,SAAiB,CAAC,cAAc,CAAC,CAAC;gBAErD,IAAI,cAAc,KAAK,KAAK,EAAE,CAAC;oBAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAQ,CAAC;oBACzC,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;wBACtB,IAAI,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;4BACvB,MAAM,aAAa,GAAG,IAAK,SAA2B,EAAE,CAAC;4BACzD,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;4BAClC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;wBACtC,CAAC;6BAAM,CAAC;4BACJ,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;wBACnC,CAAC;oBACL,CAAC;gBAEL,CAAC;qBAAM,IAAI,cAAc,KAAK,OAAO,EAAE,CAAC;oBACpC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAQ,CAAC;oBAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBACpC,IAAI,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;4BACvB,MAAM,aAAa,GAAG,IAAK,SAA2B,EAAE,CAAC;4BACzD,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;4BAChC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;wBACpC,CAAC;6BAAM,CAAC;4BACJ,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC/B,CAAC;oBACL,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACI,QAAQ,CAAuC,QAAoB,EAAE,SAAqB;QAC7F,MAAM,QAAQ,GAAc,IAAI,CAAC,WAA6B,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChF,IAAI,CAAC,kBAAQ,CAAC,CAAC,MAAM,CACjB,QAAQ,CAAC,QAAQ,CAAC,QAAkB,CAAC,CAAC,CAAC,KAAK,EAC5C,SAAS,CACZ,CAAC;IACN,CAAC;IAED,KAAK;QACD,qDAAqD;QACrD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACzD,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAE1B,MAAM,QAAQ,GAAc,IAAI,CAAC,WAA6B,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEhF,EAAE;QACF,sDAAsD;QACtD,EAAE;QACF,8BAA8B;QAC9B,KAAK,MAAM,UAAU,IAAI,QAAQ,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,UAA2B,CAAC,CAAC,IAAkB,CAAC;YAEvE,IACI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,QAAQ;gBACjC,OAAO,CAAE,IAAI,CAAC,KAAK,CAAS,EAAE,KAAK,CAAC,KAAK,UAAU,EACrD,CAAC;gBACC,aAAa;gBACb,MAAM,CAAC,KAAK,CAAC,GAAI,IAAI,CAAC,KAAK,CAAS,CAAC,KAAK,EAAE,CAAC;YAEjD,CAAC;iBAAM,CAAC;gBACJ,mBAAmB;gBACnB,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,MAAM;QACF,MAAM,GAAG,GAAQ,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnD,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAkB,CAAC;YAC/C,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,WAAW,EAAE,CAAC;gBAC5F,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,UAAU,CAAC;oBAChE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,EAAE;oBAC7B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1B,CAAC;QACL,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IAED;;;OAGG;IACH,iBAAiB;QACb,IAAI,CAAC,kBAAQ,CAAC,CAAC,UAAU,EAAE,CAAC;IAChC,CAAC;IAED,CAAC,qBAAW,CAAC,CAAC,KAAa;QACvB,MAAM,QAAQ,GAAc,IAAI,CAAC,WAA6B,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChF,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAkB,CAAC,CAAC;IACpD,CAAC;IAED,CAAC,wBAAc,CAAC,CAAC,KAAa;QAC1B,MAAM,QAAQ,GAAc,IAAI,CAAC,WAA6B,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChF,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAkB,CAAC,GAAG,SAAS,CAAC;IACzD,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,WAAW,CAAmB,GAAM,EAAE,eAAwB,KAAK,EAAE,QAAgB,CAAC,EAAE,OAAiB,EAAE,YAAoB,EAAE;QACpI,MAAM,QAAQ,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,MAAM,UAAU,GAAe,GAAG,CAAC,kBAAQ,CAAC,CAAC;QAE7C,MAAM,KAAK,GAAI,GAAY,CAAC,gBAAM,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;QAEvD,6BAA6B;QAC9B,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1C,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG;YAC/B,CAAC,CAAC,EAAE,CAAC;QAET,IAAI,MAAM,GAAG,GAAG,IAAA,iBAAS,EAAC,KAAK,CAAC,GAAG,SAAS,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,YAAY,KAAK,IAAI,QAAQ,GAAG,QAAQ,IAAI,CAAC;QAEhH,UAAU,CAAC,YAAY,CAAC,CAAC,eAAe,EAAE,UAAU,EAAE,EAAE;YACpD,IAAI,GAAG,GAAG,UAAU,CAAC;YACrB,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAK,GAAW,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7D,YAAY;gBACZ,GAAG,GAAI,GAAW,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC;YACjE,CAAC;YACD,MAAM,SAAS,GAAG,CAAE,GAAW,CAAC,SAAS,CAAC,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YACrG,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,GAAG,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QACjG,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,uBAAuB,CAAgB,GAAM,EAAE,YAA2B,YAAY;QACzF,IAAI,WAAW,GAAa,EAAE,CAAC;QAC/B,IAAI,OAAO,GAAG,GAAG,CAAC,kBAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC;QACjD,OAAO,OAAO,EAAE,CAAC;YACb,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACrB,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,gBAAM,CAAC,CAAC,CAAC;YACrD,CAAC;YACD,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;QAC3B,CAAC;QACD,OAAO,WAAW,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,sBAAsB,CAAC,OAAgB;QAC1C,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,YAAY,CAAgB,QAAW,EAAE,cAAuB,KAAK;QACxE,MAAM,UAAU,GAAe,QAAQ,CAAC,kBAAQ,CAAC,CAAC;QAElD,MAAM,SAAS,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;QAC7E,MAAM,aAAa,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;QAE/D,IAAI,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,QAAQ,CAAC,gBAAM,CAAC,SAAS,aAAa,KAAK,CAAC;QAE1F,SAAS,aAAa,CAAC,SAAoB;YACvC,SAAS,CAAC,UAAU;iBACf,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;iBAChB,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBACf,MAAM,SAAS,GAAG,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBACtD,MAAM,IAAI,MAAM,KAAK,MAAM,gBAAS,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC,KAAK,CAAA;YAC5H,CAAC,CAAC,CAAC;QACX,CAAC;QAED,aAAa,CAAC,SAAS,CAAC,CAAC;QAEzB,2BAA2B;QAC3B,IACI,CAAC,WAAW;YACZ,UAAU,CAAC,eAAe;YAC1B,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EACrE,CAAC;YACC,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,QAAQ,CAAC,gBAAM,CAAC,0BAA0B,CAAC;YACtF,aAAa,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;QAC9C,CAAC;QAED,2BAA2B;QAC3B,IACI,WAAW;YACX,UAAU,CAAC,kBAAkB;YAC7B,CAAC,UAAU,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EACxE,CAAC;YACC,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,QAAQ,CAAC,gBAAM,CAAC,6BAA6B,CAAC;YACzF,aAAa,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAmB,GAAM,EAAE,gBAAqF,SAAS;QAC5I,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,MAAM,cAAc,GAAe,GAAG,CAAC,kBAAQ,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC;QACjC,MAAM,WAAW,GAAkC,IAAI,GAAG,EAAE,CAAC;QAE7D,MAAM,cAAc,GAAG,EAAE,CAAC;QAC1B,IAAI,eAAe,GAAG,CAAC,CAAC;QAExB,sDAAsD;QACtD,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;YACjE,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,KAAsB,CAAC,CAAC;YAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;gBAAC,SAAS;YAAC,CAAC;YAE9B,IAAI,iBAAiB,GAAG,KAAK,CAAC;YAC9B,IAAI,iBAAiB,GAAiB,EAAE,CAAC;YACzC,IAAI,gBAAgB,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,kBAAQ,CAAC,CAAC;YAErD,IAAI,UAAU,KAAK,cAAc,EAAE,CAAC;gBAChC,iBAAiB,GAAG,IAAI,CAAC;YAE7B,CAAC;iBAAM,CAAC;gBACJ,OAAO,gBAAgB,KAAK,SAAS,EAAE,CAAC;oBACpC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;oBACzC,IAAI,gBAAgB,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;wBAC/B,iBAAiB,GAAG,IAAI,CAAC;wBACzB,MAAM;oBACV,CAAC;oBACD,gBAAgB,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,kBAAQ,CAAC,CAAC;gBAC3D,CAAC;YACL,CAAC;YAED,IAAI,iBAAiB,EAAE,CAAC;gBACpB,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,gBAAM,CAAC,CAAC,CAAC;gBAC5C,eAAe,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;gBAC/C,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,iBAAiB,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7D,CAAC;QACL,CAAC;QAED,MAAM,IAAI,OAAO,CAAA;QACjB,MAAM,IAAI,eAAe,cAAc,CAAC,GAAG,CAAC,gBAAM,CAAC,IAAI,CAAC;QACxD,MAAM,IAAI,oBAAoB,cAAc,CAAC,MAAM,aAAa,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAC/F,MAAM,IAAI,kBAAkB,eAAe,IAAI,CAAC;QAChD,MAAM,IAAI,OAAO,CAAA;QAEjB,yFAAyF;QACzF,MAAM,cAAc,GAAG,IAAI,OAAO,EAAc,CAAC;QACjD,KAAK,MAAM,CAAC,UAAU,EAAE,iBAAiB,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;YAClE,iBAAiB,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,KAAK,EAAE,EAAE;gBAClD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBACxC,MAAM,IAAI,GAAG,IAAA,iBAAS,EAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,YAAY,gBAAgB,CAAC,GAAG,CAAC,gBAAM,CAAC,KAAK,CAAC;oBACnH,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;gBACzC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,UAAU,CAAC,iBAAiB,CAAC;YAC7C,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC;YACvC,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC,KAAK,CAAC,CAAC;YAEhC,MAAM,WAAW,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,MAAM,IAAI,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,YAAY,UAAU,CAAC,GAAG,CAAC,gBAAM,CAAC,gBAAgB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC;YAErJ,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC1B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjC,MAAM,IAAI,GAAG,IAAA,iBAAS,EAAC,KAAK,GAAG,CAAC,CAAC,GAAG,gBAAS,CAAC,SAAS,CAAC,KAAK,KAAK,IAAI,CAAC;YAC3E,CAAC;QACL,CAAC;QAED,OAAO,GAAG,MAAM,EAAE,CAAC;IACvB,CAAC;;AAhZL,wBAmZC","sourcesContent":["import { OPERATION } from './encoding/spec';\nimport { DEFAULT_VIEW_TAG, type DefinitionType } from \"./annotations\";\n\nimport { AssignableProps, NonFunctionPropNames, ToJSON } from './types/HelperTypes';\n\nimport { ChangeSet, ChangeSetName, ChangeTree, IRef, Ref } from './encoder/ChangeTree';\nimport { $changes, $decoder, $deleteByIndex, $descriptors, $encoder, $filter, $getByIndex, $refId, $track } from './types/symbols';\nimport { StateView } from './encoder/StateView';\n\nimport { encodeSchemaOperation } from './encoder/EncodeOperation';\nimport { decodeSchemaOperation } from './decoder/DecodeOperation';\n\nimport type { Decoder } from './decoder/Decoder';\nimport type { Metadata, MetadataField } from './Metadata';\nimport { getIndent } from './utils';\n\n/**\n * Schema encoder / decoder\n */\nexport class Schema<C = any> implements IRef {\n static [Symbol.metadata]: Metadata;\n static [$encoder] = encodeSchemaOperation;\n static [$decoder] = decodeSchemaOperation;\n\n [$refId]?: number;\n\n /**\n * Assign the property descriptors required to track changes on this instance.\n * @param instance\n */\n static initialize(instance: any) {\n Object.defineProperty(instance, $changes, {\n value: new ChangeTree(instance),\n enumerable: false,\n writable: true\n });\n\n Object.defineProperties(instance, instance.constructor[Symbol.metadata]?.[$descriptors] || {});\n }\n\n static is(type: DefinitionType) {\n return typeof((type as typeof Schema)[Symbol.metadata]) === \"object\";\n }\n\n /**\n * Track property changes\n */\n static [$track] (changeTree: ChangeTree, index: number, operation: OPERATION = OPERATION.ADD) {\n changeTree.change(index, operation);\n }\n\n /**\n * Determine if a property must be filtered.\n * - If returns false, the property is NOT going to be encoded.\n * - If returns true, the property is going to be encoded.\n *\n * Encoding with \"filters\" happens in two steps:\n * - First, the encoder iterates over all \"not owned\" properties and encodes them.\n * - Then, the encoder iterates over all \"owned\" properties per instance and encodes them.\n */\n static [$filter] (ref: Schema, index: number, view: StateView) {\n const metadata: Metadata = (ref.constructor as typeof Schema)[Symbol.metadata];\n const tag = metadata[index]?.tag;\n\n if (view === undefined) {\n // shared pass/encode: encode if doesn't have a tag\n return tag === undefined;\n\n } else if (tag === undefined) {\n // view pass: no tag\n return true;\n\n } else if (tag === DEFAULT_VIEW_TAG) {\n // view pass: default tag\n return view.isChangeTreeVisible(ref[$changes]);\n\n } else {\n // view pass: custom tag\n const tags = view.tags?.get(ref[$changes]);\n return tags && tags.has(tag);\n }\n }\n\n // allow inherited classes to have a constructor\n constructor(arg?: C) {\n //\n // inline\n // Schema.initialize(this);\n //\n Schema.initialize(this);\n\n //\n // Assign initial values\n //\n if (arg) {\n Object.assign(this, arg);\n }\n }\n\n /**\n * Assign properties to the instance.\n * @param props Properties to assign to the instance\n * @returns\n */\n public assign<T extends Partial<this>>(props: AssignableProps<T>,): this {\n Object.assign(this, props);\n return this;\n }\n\n /**\n * Restore the instance from JSON data.\n * @param jsonData JSON data to restore the instance from\n * @returns\n */\n public restore(jsonData: ToJSON<this>): this {\n const metadata: Metadata = (this.constructor as typeof Schema)[Symbol.metadata];\n\n for (const fieldIndex in metadata) {\n const field = metadata[fieldIndex as any as number];\n const fieldName = field.name as keyof this;\n const fieldType = field.type;\n const value = (jsonData as any)[fieldName];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n if (typeof fieldType === \"string\") {\n // Primitive type: assign directly\n this[fieldName] = value;\n\n } else if (Schema.is(fieldType)) {\n // Schema type: create instance and restore\n const instance = new (fieldType as typeof Schema)();\n instance.restore(value);\n this[fieldName] = instance as any;\n\n } else if (typeof fieldType === \"object\") {\n // Collection types: { map: ... }, { array: ... }, etc.\n const collectionType = Object.keys(fieldType)[0] as string;\n const childType = (fieldType as any)[collectionType];\n\n if (collectionType === \"map\") {\n const mapSchema = this[fieldName] as any;\n for (const key in value) {\n if (Schema.is(childType)) {\n const childInstance = new (childType as typeof Schema)();\n childInstance.restore(value[key]);\n mapSchema.set(key, childInstance);\n } else {\n mapSchema.set(key, value[key]);\n }\n }\n\n } else if (collectionType === \"array\") {\n const arraySchema = this[fieldName] as any;\n for (let i = 0; i < value.length; i++) {\n if (Schema.is(childType)) {\n const childInstance = new (childType as typeof Schema)();\n childInstance.restore(value[i]);\n arraySchema.push(childInstance);\n } else {\n arraySchema.push(value[i]);\n }\n }\n }\n }\n }\n\n return this;\n }\n\n /**\n * (Server-side): Flag a property to be encoded for the next patch.\n * @param instance Schema instance\n * @param property string representing the property name, or number representing the index of the property.\n * @param operation OPERATION to perform (detected automatically)\n */\n public setDirty<K extends NonFunctionPropNames<this>>(property: K | number, operation?: OPERATION) {\n const metadata: Metadata = (this.constructor as typeof Schema)[Symbol.metadata];\n this[$changes].change(\n metadata[metadata[property as string]].index,\n operation\n );\n }\n\n clone (): this {\n // Create instance without calling custom constructor\n const cloned = Object.create(this.constructor.prototype);\n Schema.initialize(cloned);\n\n const metadata: Metadata = (this.constructor as typeof Schema)[Symbol.metadata];\n\n //\n // TODO: clone all properties, not only annotated ones\n //\n // for (const field in this) {\n for (const fieldIndex in metadata) {\n const field = metadata[fieldIndex as any as number].name as keyof this;\n\n if (\n typeof (this[field]) === \"object\" &&\n typeof ((this[field] as any)?.clone) === \"function\"\n ) {\n // deep clone\n cloned[field] = (this[field] as any).clone();\n\n } else {\n // primitive values\n cloned[field] = this[field];\n }\n }\n\n return cloned;\n }\n\n toJSON (this: any): ToJSON<this> {\n const obj: any = {};\n const metadata = this.constructor[Symbol.metadata];\n for (const index in metadata) {\n const field = metadata[index] as MetadataField;\n const fieldName = field.name;\n if (!field.deprecated && this[fieldName] !== null && typeof (this[fieldName]) !== \"undefined\") {\n obj[fieldName] = (typeof (this[fieldName]['toJSON']) === \"function\")\n ? this[fieldName]['toJSON']()\n : this[fieldName];\n }\n }\n return obj;\n }\n\n /**\n * Used in tests only\n * @internal\n */\n discardAllChanges() {\n this[$changes].discardAll();\n }\n\n [$getByIndex](index: number): any {\n const metadata: Metadata = (this.constructor as typeof Schema)[Symbol.metadata];\n return this[metadata[index].name as keyof this];\n }\n\n [$deleteByIndex](index: number): void {\n const metadata: Metadata = (this.constructor as typeof Schema)[Symbol.metadata];\n this[metadata[index].name as keyof this] = undefined;\n }\n\n /**\n * Inspect the `refId` of all Schema instances in the tree. Optionally display the contents of the instance.\n *\n * @param ref Schema instance\n * @param showContents display JSON contents of the instance\n * @returns\n */\n static debugRefIds<T extends Schema>(ref: T, showContents: boolean = false, level: number = 0, decoder?: Decoder, keyPrefix: string = \"\") {\n const contents = (showContents) ? ` - ${JSON.stringify(ref.toJSON())}` : \"\";\n const changeTree: ChangeTree = ref[$changes];\n\n const refId = (ref as IRef)[$refId];\n const root = (decoder) ? decoder.root : changeTree.root;\n\n // log reference count if > 1\n const refCount = (root?.refCount?.[refId] > 1)\n ? ` [×${root.refCount[refId]}]`\n : '';\n\n let output = `${getIndent(level)}${keyPrefix}${ref.constructor.name} (refId: ${refId})${refCount}${contents}\\n`;\n\n changeTree.forEachChild((childChangeTree, indexOrKey) => {\n let key = indexOrKey;\n if (typeof indexOrKey === 'number' && (ref as any)['$indexes']) {\n // MapSchema\n key = (ref as any)['$indexes'].get(indexOrKey) ?? indexOrKey;\n }\n const keyPrefix = ((ref as any)['forEach'] !== undefined && key !== undefined) ? `[\"${key}\"]: ` : \"\";\n output += this.debugRefIds(childChangeTree.ref, showContents, level + 1, decoder, keyPrefix);\n });\n\n return output;\n }\n\n static debugRefIdEncodingOrder<T extends Ref>(ref: T, changeSet: ChangeSetName = 'allChanges') {\n let encodeOrder: number[] = [];\n let current = ref[$changes].root[changeSet].next;\n while (current) {\n if (current.changeTree) {\n encodeOrder.push(current.changeTree.ref[$refId]);\n }\n current = current.next;\n }\n return encodeOrder;\n }\n\n static debugRefIdsFromDecoder(decoder: Decoder) {\n return this.debugRefIds(decoder.state, false, 0, decoder);\n }\n\n /**\n * Return a string representation of the changes on a Schema instance.\n * The list of changes is cleared after each encode.\n *\n * @param instance Schema instance\n * @param isEncodeAll Return \"full encode\" instead of current change set.\n * @returns\n */\n static debugChanges<T extends Ref>(instance: T, isEncodeAll: boolean = false) {\n const changeTree: ChangeTree = instance[$changes];\n\n const changeSet = (isEncodeAll) ? changeTree.allChanges : changeTree.changes;\n const changeSetName = (isEncodeAll) ? \"allChanges\" : \"changes\";\n\n let output = `${instance.constructor.name} (${instance[$refId]}) -> .${changeSetName}:\\n`;\n\n function dumpChangeSet(changeSet: ChangeSet) {\n changeSet.operations\n .filter(op => op)\n .forEach((index) => {\n const operation = changeTree.indexedOperations[index];\n output += `- [${index}]: ${OPERATION[operation]} (${JSON.stringify(changeTree.getValue(Number(index), isEncodeAll))})\\n`\n });\n }\n\n dumpChangeSet(changeSet);\n\n // display filtered changes\n if (\n !isEncodeAll &&\n changeTree.filteredChanges &&\n (changeTree.filteredChanges.operations).filter(op => op).length > 0\n ) {\n output += `${instance.constructor.name} (${instance[$refId]}) -> .filteredChanges:\\n`;\n dumpChangeSet(changeTree.filteredChanges);\n }\n\n // display filtered changes\n if (\n isEncodeAll &&\n changeTree.allFilteredChanges &&\n (changeTree.allFilteredChanges.operations).filter(op => op).length > 0\n ) {\n output += `${instance.constructor.name} (${instance[$refId]}) -> .allFilteredChanges:\\n`;\n dumpChangeSet(changeTree.allFilteredChanges);\n }\n\n return output;\n }\n\n static debugChangesDeep<T extends Schema>(ref: T, changeSetName: \"changes\" | \"allChanges\" | \"allFilteredChanges\" | \"filteredChanges\" = \"changes\") {\n let output = \"\";\n\n const rootChangeTree: ChangeTree = ref[$changes];\n const root = rootChangeTree.root;\n const changeTrees: Map<ChangeTree, ChangeTree[]> = new Map();\n\n const instanceRefIds = [];\n let totalOperations = 0;\n\n // TODO: FIXME: this method is not working as expected\n for (const [refId, changes] of Object.entries(root[changeSetName])) {\n const changeTree = root.changeTrees[refId as any as number];\n if (!changeTree) { continue; }\n\n let includeChangeTree = false;\n let parentChangeTrees: ChangeTree[] = [];\n let parentChangeTree = changeTree.parent?.[$changes];\n\n if (changeTree === rootChangeTree) {\n includeChangeTree = true;\n\n } else {\n while (parentChangeTree !== undefined) {\n parentChangeTrees.push(parentChangeTree);\n if (parentChangeTree.ref === ref) {\n includeChangeTree = true;\n break;\n }\n parentChangeTree = parentChangeTree.parent?.[$changes];\n }\n }\n\n if (includeChangeTree) {\n instanceRefIds.push(changeTree.ref[$refId]);\n totalOperations += Object.keys(changes).length;\n changeTrees.set(changeTree, parentChangeTrees.reverse());\n }\n }\n\n output += \"---\\n\"\n output += `root refId: ${rootChangeTree.ref[$refId]}\\n`;\n output += `Total instances: ${instanceRefIds.length} (refIds: ${instanceRefIds.join(\", \")})\\n`;\n output += `Total changes: ${totalOperations}\\n`;\n output += \"---\\n\"\n\n // based on root.changes, display a tree of changes that has the \"ref\" instance as parent\n const visitedParents = new WeakSet<ChangeTree>();\n for (const [changeTree, parentChangeTrees] of changeTrees.entries()) {\n parentChangeTrees.forEach((parentChangeTree, level) => {\n if (!visitedParents.has(parentChangeTree)) {\n output += `${getIndent(level)}${parentChangeTree.ref.constructor.name} (refId: ${parentChangeTree.ref[$refId]})\\n`;\n visitedParents.add(parentChangeTree);\n }\n });\n\n const changes = changeTree.indexedOperations;\n const level = parentChangeTrees.length;\n const indent = getIndent(level);\n\n const parentIndex = (level > 0) ? `(${changeTree.parentIndex}) ` : \"\";\n output += `${indent}${parentIndex}${changeTree.ref.constructor.name} (refId: ${changeTree.ref[$refId]}) - changes: ${Object.keys(changes).length}\\n`;\n\n for (const index in changes) {\n const operation = changes[index];\n output += `${getIndent(level + 1)}${OPERATION[operation]}: ${index}\\n`;\n }\n }\n\n return `${output}`;\n }\n\n\n}\n\n"]}