@colyseus/schema 3.0.11 → 3.0.13

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 (38) hide show
  1. package/build/cjs/index.js +99 -108
  2. package/build/cjs/index.js.map +1 -1
  3. package/build/esm/index.mjs +99 -108
  4. package/build/esm/index.mjs.map +1 -1
  5. package/build/umd/index.js +99 -108
  6. package/lib/Metadata.js +1 -2
  7. package/lib/Metadata.js.map +1 -1
  8. package/lib/annotations.js +4 -3
  9. package/lib/annotations.js.map +1 -1
  10. package/lib/decoder/DecodeOperation.js +0 -13
  11. package/lib/decoder/DecodeOperation.js.map +1 -1
  12. package/lib/encoder/ChangeTree.d.ts +1 -1
  13. package/lib/encoder/ChangeTree.js +1 -0
  14. package/lib/encoder/ChangeTree.js.map +1 -1
  15. package/lib/encoder/Encoder.d.ts +0 -1
  16. package/lib/encoder/Encoder.js +27 -33
  17. package/lib/encoder/Encoder.js.map +1 -1
  18. package/lib/encoder/Root.d.ts +1 -1
  19. package/lib/encoder/Root.js +1 -0
  20. package/lib/encoder/Root.js.map +1 -1
  21. package/lib/encoder/StateView.d.ts +4 -4
  22. package/lib/encoder/StateView.js +33 -21
  23. package/lib/encoder/StateView.js.map +1 -1
  24. package/lib/types/custom/ArraySchema.js +5 -1
  25. package/lib/types/custom/ArraySchema.js.map +1 -1
  26. package/lib/types/custom/MapSchema.d.ts +3 -0
  27. package/lib/types/custom/MapSchema.js +28 -35
  28. package/lib/types/custom/MapSchema.js.map +1 -1
  29. package/package.json +1 -1
  30. package/src/Metadata.ts +1 -2
  31. package/src/annotations.ts +4 -4
  32. package/src/decoder/DecodeOperation.ts +0 -14
  33. package/src/encoder/ChangeTree.ts +2 -2
  34. package/src/encoder/Encoder.ts +31 -44
  35. package/src/encoder/Root.ts +1 -0
  36. package/src/encoder/StateView.ts +34 -22
  37. package/src/types/custom/ArraySchema.ts +8 -1
  38. package/src/types/custom/MapSchema.ts +29 -43
@@ -863,14 +863,13 @@
863
863
  fieldIndex++;
864
864
  for (const field in fields) {
865
865
  const type = fields[field];
866
- const normalizedType = getNormalizedType(type);
867
866
  // FIXME: this code is duplicated from @type() annotation
868
867
  const complexTypeKlass = (Array.isArray(type))
869
868
  ? getType("array")
870
869
  : (typeof (Object.keys(type)[0]) === "string") && getType(Object.keys(type)[0]);
871
870
  const childType = (complexTypeKlass)
872
871
  ? Object.values(type)[0]
873
- : normalizedType;
872
+ : getNormalizedType(type);
874
873
  Metadata.addField(metadata, fieldIndex, field, type, getPropertyDescriptor(`_${field}`, fieldIndex, childType, complexTypeKlass));
875
874
  fieldIndex++;
876
875
  }
@@ -1253,6 +1252,7 @@
1253
1252
  else {
1254
1253
  enqueueChangeTree(this.root, this, 'changes');
1255
1254
  }
1255
+ return previousValue;
1256
1256
  }
1257
1257
  endEncode() {
1258
1258
  this.indexedOperations = {};
@@ -1537,19 +1537,6 @@
1537
1537
  //
1538
1538
  if (operation !== exports.OPERATION.DELETE_AND_ADD) {
1539
1539
  ref[$deleteByIndex](index);
1540
- // //
1541
- // // FIXME: is this in the correct place?
1542
- // // (This is sounding like a workaround just for ArraySchema, see
1543
- // // "should splice and move" test on ArraySchema.test.ts)
1544
- // //
1545
- // allChanges.push({
1546
- // ref,
1547
- // refId: decoder.currentRefId,
1548
- // op: OPERATION.DELETE,
1549
- // field: index as unknown as string,
1550
- // value: undefined,
1551
- // previousValue,
1552
- // });
1553
1540
  }
1554
1541
  value = undefined;
1555
1542
  }
@@ -1897,7 +1884,8 @@
1897
1884
  else {
1898
1885
  if (setValue[$changes]) {
1899
1886
  assertInstanceType(setValue, obj[$childType], obj, key);
1900
- if (obj.items[key] !== undefined) {
1887
+ const previousValue = obj.items[key];
1888
+ if (previousValue !== undefined) {
1901
1889
  if (setValue[$changes].isNew) {
1902
1890
  this[$changes].indexedOperation(Number(key), exports.OPERATION.MOVE_AND_ADD);
1903
1891
  }
@@ -1909,10 +1897,13 @@
1909
1897
  this[$changes].indexedOperation(Number(key), exports.OPERATION.MOVE);
1910
1898
  }
1911
1899
  }
1900
+ // remove root reference from previous value
1901
+ previousValue[$changes].root?.remove(previousValue[$changes]);
1912
1902
  }
1913
1903
  else if (setValue[$changes].isNew) {
1914
1904
  this[$changes].indexedOperation(Number(key), exports.OPERATION.ADD);
1915
1905
  }
1906
+ setValue[$changes].setParent(this, obj[$changes].root, key);
1916
1907
  }
1917
1908
  else {
1918
1909
  obj.$changeAt(Number(key), setValue);
@@ -2507,7 +2498,7 @@
2507
2498
  static [(_a$3 = $encoder, _b$3 = $decoder, $filter)](ref, index, view) {
2508
2499
  return (!view ||
2509
2500
  typeof (ref[$childType]) === "string" ||
2510
- view.items.has(ref[$getByIndex](index)[$changes]));
2501
+ view.items.has((ref[$getByIndex](index) ?? ref.deletedItems[index])[$changes]));
2511
2502
  }
2512
2503
  static is(type) {
2513
2504
  return type['map'] !== undefined;
@@ -2515,6 +2506,7 @@
2515
2506
  constructor(initialValues) {
2516
2507
  this.$items = new Map();
2517
2508
  this.$indexes = new Map();
2509
+ this.deletedItems = {};
2518
2510
  this[$changes] = new ChangeTree(this);
2519
2511
  this[$changes].indexes = {};
2520
2512
  if (initialValues) {
@@ -2550,33 +2542,34 @@
2550
2542
  // See: https://github.com/colyseus/colyseus/issues/561#issuecomment-1646733468
2551
2543
  key = key.toString();
2552
2544
  const changeTree = this[$changes];
2553
- // get "index" for this value.
2554
- const isReplace = typeof (changeTree.indexes[key]) !== "undefined";
2555
- const index = (isReplace)
2556
- ? changeTree.indexes[key]
2557
- : changeTree.indexes[$numFields] ?? 0;
2558
- let operation = (isReplace)
2559
- ? exports.OPERATION.REPLACE
2560
- : exports.OPERATION.ADD;
2561
2545
  const isRef = (value[$changes]) !== undefined;
2562
- //
2563
- // (encoding)
2564
- // set a unique id to relate directly with this key/value.
2565
- //
2566
- if (!isReplace) {
2546
+ let index;
2547
+ let operation;
2548
+ // IS REPLACE?
2549
+ if (typeof (changeTree.indexes[key]) !== "undefined") {
2550
+ index = changeTree.indexes[key];
2551
+ operation = exports.OPERATION.REPLACE;
2552
+ const previousValue = this.$items.get(key);
2553
+ if (previousValue === value) {
2554
+ // if value is the same, avoid re-encoding it.
2555
+ return;
2556
+ }
2557
+ else if (isRef) {
2558
+ // if is schema, force ADD operation if value differ from previous one.
2559
+ operation = exports.OPERATION.DELETE_AND_ADD;
2560
+ // remove reference from previous value
2561
+ if (previousValue !== undefined) {
2562
+ previousValue[$changes].root?.remove(previousValue[$changes]);
2563
+ }
2564
+ }
2565
+ }
2566
+ else {
2567
+ index = changeTree.indexes[$numFields] ?? 0;
2568
+ operation = exports.OPERATION.ADD;
2567
2569
  this.$indexes.set(index, key);
2568
2570
  changeTree.indexes[key] = index;
2569
2571
  changeTree.indexes[$numFields] = index + 1;
2570
2572
  }
2571
- else if (!isRef &&
2572
- this.$items.get(key) === value) {
2573
- // if value is the same, avoid re-encoding it.
2574
- return;
2575
- }
2576
- else if (isRef && // if is schema, force ADD operation if value differ from previous one.
2577
- this.$items.get(key) !== value) {
2578
- operation = exports.OPERATION.ADD;
2579
- }
2580
2573
  this.$items.set(key, value);
2581
2574
  changeTree.change(index, operation);
2582
2575
  //
@@ -2593,7 +2586,7 @@
2593
2586
  }
2594
2587
  delete(key) {
2595
2588
  const index = this[$changes].indexes[key];
2596
- this[$changes].delete(index);
2589
+ this.deletedItems[index] = this[$changes].delete(index);
2597
2590
  return this.$items.delete(key);
2598
2591
  }
2599
2592
  clear() {
@@ -2640,17 +2633,7 @@
2640
2633
  this.$indexes.delete(index);
2641
2634
  }
2642
2635
  [$onEncodeEnd]() {
2643
- const changeTree = this[$changes];
2644
- const keys = Object.keys(changeTree.indexedOperations);
2645
- for (let i = 0, len = keys.length; i < len; i++) {
2646
- const key = keys[i];
2647
- const fieldIndex = Number(key);
2648
- const operation = changeTree.indexedOperations[key];
2649
- if (operation === exports.OPERATION.DELETE) {
2650
- const index = this[$getByIndex](fieldIndex);
2651
- delete changeTree.indexes[index];
2652
- }
2653
- }
2636
+ this.deletedItems = {};
2654
2637
  }
2655
2638
  toJSON() {
2656
2639
  const map = {};
@@ -2948,13 +2931,14 @@
2948
2931
  const changeTree = this[$changes];
2949
2932
  //
2950
2933
  // Replacing existing "ref", remove it from root.
2951
- // TODO: if there are other references to this instance, we should not remove it from root.
2952
2934
  //
2953
2935
  if (previousValue !== undefined && previousValue[$changes]) {
2954
2936
  changeTree.root?.remove(previousValue[$changes]);
2937
+ this.constructor[$track](changeTree, fieldIndex, exports.OPERATION.DELETE_AND_ADD);
2938
+ }
2939
+ else {
2940
+ this.constructor[$track](changeTree, fieldIndex, exports.OPERATION.ADD);
2955
2941
  }
2956
- // flag the change for encoding.
2957
- this.constructor[$track](changeTree, fieldIndex, exports.OPERATION.ADD);
2958
2942
  //
2959
2943
  // call setParent() recursively for this and its child
2960
2944
  // structures.
@@ -3777,6 +3761,7 @@
3777
3761
  if (spliceOne(changeSet, changeSet.indexOf(changeTree))) {
3778
3762
  changeTree[changeSetName].queueRootIndex = -1;
3779
3763
  // changeSet[index] = undefined;
3764
+ return true;
3780
3765
  }
3781
3766
  }
3782
3767
  clear() {
@@ -3812,12 +3797,6 @@
3812
3797
  const changeTrees = this.root[changeSetName];
3813
3798
  for (let i = 0, numChangeTrees = changeTrees.length; i < numChangeTrees; i++) {
3814
3799
  const changeTree = changeTrees[i];
3815
- const operations = changeTree[changeSetName];
3816
- const ref = changeTree.ref;
3817
- const ctor = ref.constructor;
3818
- const encoder = ctor[$encoder];
3819
- const filter = ctor[$filter];
3820
- const metadata = ctor[Symbol.metadata];
3821
3800
  if (hasView) {
3822
3801
  if (!view.items.has(changeTree)) {
3823
3802
  view.invisible.add(changeTree);
@@ -3827,13 +3806,24 @@
3827
3806
  view.invisible.delete(changeTree); // remove from invisible list
3828
3807
  }
3829
3808
  }
3809
+ const operations = changeTree[changeSetName];
3810
+ const ref = changeTree.ref;
3811
+ // TODO: avoid iterating over change tree if no changes were made
3812
+ const numChanges = operations.operations.length;
3813
+ if (numChanges === 0) {
3814
+ continue;
3815
+ }
3816
+ const ctor = ref.constructor;
3817
+ const encoder = ctor[$encoder];
3818
+ const filter = ctor[$filter];
3819
+ const metadata = ctor[Symbol.metadata];
3830
3820
  // skip root `refId` if it's the first change tree
3831
3821
  // (unless it "hasView", which will need to revisit the root)
3832
3822
  if (hasView || it.offset > initialOffset || changeTree !== rootChangeTree) {
3833
3823
  buffer[it.offset++] = SWITCH_TO_STRUCTURE & 255;
3834
3824
  encode.number(buffer, changeTree.refId, it);
3835
3825
  }
3836
- for (let j = 0, numChanges = operations.operations.length; j < numChanges; j++) {
3826
+ for (let j = 0; j < numChanges; j++) {
3837
3827
  const fieldIndex = operations.operations[j];
3838
3828
  const operation = (fieldIndex < 0)
3839
3829
  ? Math.abs(fieldIndex) // "pure" operation without fieldIndex (e.g. CLEAR, REVERSE, etc.)
@@ -3930,14 +3920,16 @@
3930
3920
  encodeView(view, sharedOffset, it, bytes = this.sharedBuffer) {
3931
3921
  const viewOffset = it.offset;
3932
3922
  // encode visibility changes (add/remove for this view)
3933
- const refIds = Object.keys(view.changes);
3934
- for (let i = 0, numRefIds = refIds.length; i < numRefIds; i++) {
3935
- const refId = refIds[i];
3936
- const changes = view.changes[refId];
3923
+ for (const [refId, changes] of view.changes) {
3937
3924
  const changeTree = this.root.changeTrees[refId];
3938
- if (changeTree === undefined ||
3939
- Object.keys(changes).length === 0 // FIXME: avoid having empty changes if no changes were made
3940
- ) {
3925
+ if (changeTree === undefined) {
3926
+ // detached instance, remove from view and skip.
3927
+ view.changes.delete(refId);
3928
+ continue;
3929
+ }
3930
+ const keys = Object.keys(changes);
3931
+ if (keys.length === 0) {
3932
+ // FIXME: avoid having empty changes if no changes were made
3941
3933
  // console.log("changes.size === 0, skip", changeTree.ref.constructor.name);
3942
3934
  continue;
3943
3935
  }
@@ -3947,13 +3939,14 @@
3947
3939
  const metadata = ctor[Symbol.metadata];
3948
3940
  bytes[it.offset++] = SWITCH_TO_STRUCTURE & 255;
3949
3941
  encode.number(bytes, changeTree.refId, it);
3950
- const keys = Object.keys(changes);
3951
3942
  for (let i = 0, numChanges = keys.length; i < numChanges; i++) {
3952
- const key = keys[i];
3953
- const operation = changes[key];
3943
+ const index = Number(keys[i]);
3944
+ // workaround when using view.add() on item that has been deleted from state (see test "adding to view item that has been removed from state")
3945
+ const value = changeTree.ref[$getByIndex](index);
3946
+ const operation = (value !== undefined && changes[index]) || exports.OPERATION.DELETE;
3954
3947
  // isEncodeAll = false
3955
3948
  // hasView = true
3956
- encoder(this, bytes, changeTree, Number(key), operation, it, false, true, metadata);
3949
+ encoder(this, bytes, changeTree, index, operation, it, false, true, metadata);
3957
3950
  }
3958
3951
  }
3959
3952
  //
@@ -3961,7 +3954,7 @@
3961
3954
  // (to allow re-using StateView's for multiple clients)
3962
3955
  //
3963
3956
  // clear "view" changes after encoding
3964
- view.changes = {};
3957
+ view.changes.clear();
3965
3958
  // try to encode "filtered" changes
3966
3959
  this.encode(it, view, bytes, "filteredChanges", false, viewOffset);
3967
3960
  return Buffer.concat([
@@ -3969,20 +3962,6 @@
3969
3962
  bytes.subarray(viewOffset, it.offset)
3970
3963
  ]);
3971
3964
  }
3972
- onEndEncode(changeTrees = this.root.changes) {
3973
- // changeTrees.forEach(function(changeTree) {
3974
- // changeTree.endEncode();
3975
- // });
3976
- // for (const refId in changeTrees) {
3977
- // const changeTree = this.root.changeTrees[refId];
3978
- // changeTree.endEncode();
3979
- // // changeTree.changes.clear();
3980
- // // // ArraySchema and MapSchema have a custom "encode end" method
3981
- // // changeTree.ref[$onEncodeEnd]?.();
3982
- // // // Not a new instance anymore
3983
- // // delete changeTree[$isNew];
3984
- // }
3985
- }
3986
3965
  discardChanges() {
3987
3966
  // discard shared changes
3988
3967
  let length = this.root.changes.length;
@@ -4714,7 +4693,8 @@
4714
4693
  * Manual "ADD" operations for changes per ChangeTree, specific to this view.
4715
4694
  * (This is used to force encoding a property, even if it was not changed)
4716
4695
  */
4717
- this.changes = {};
4696
+ // TODO: use map here!? may fix encode ordering issue
4697
+ this.changes = new Map();
4718
4698
  }
4719
4699
  // TODO: allow to set multiple tags at once
4720
4700
  add(obj, tag = DEFAULT_VIEW_TAG, checkIncludeParent = true) {
@@ -4730,16 +4710,16 @@
4730
4710
  // - if it was invisible to this view
4731
4711
  // - if it were previously filtered out
4732
4712
  if (checkIncludeParent && changeTree.parent) {
4733
- this.addParent(changeTree.parent[$changes], changeTree.parentIndex, tag);
4713
+ this.addParentOf(changeTree, tag);
4734
4714
  }
4735
4715
  //
4736
4716
  // TODO: when adding an item of a MapSchema, the changes may not
4737
4717
  // be set (only the parent's changes are set)
4738
4718
  //
4739
- let changes = this.changes[changeTree.refId];
4719
+ let changes = this.changes.get(changeTree.refId);
4740
4720
  if (changes === undefined) {
4741
4721
  changes = {};
4742
- this.changes[changeTree.refId] = changes;
4722
+ this.changes.set(changeTree.refId, changes);
4743
4723
  }
4744
4724
  // set tag
4745
4725
  if (tag !== DEFAULT_VIEW_TAG) {
@@ -4795,24 +4775,28 @@
4795
4775
  });
4796
4776
  return this;
4797
4777
  }
4798
- addParent(changeTree, parentIndex, tag) {
4799
- // view must have all "changeTree" parent tree
4800
- this.items.add(changeTree);
4801
- // add parent's parent
4802
- const parentChangeTree = changeTree.parent?.[$changes];
4803
- if (parentChangeTree && (parentChangeTree.filteredChanges !== undefined)) {
4804
- this.addParent(parentChangeTree, changeTree.parentIndex, tag);
4805
- }
4806
- // parent is already available, no need to add it!
4807
- if (!this.invisible.has(changeTree)) {
4808
- return;
4778
+ addParentOf(childChangeTree, tag) {
4779
+ const changeTree = childChangeTree.parent[$changes];
4780
+ const parentIndex = childChangeTree.parentIndex;
4781
+ if (!this.items.has(changeTree)) {
4782
+ // view must have all "changeTree" parent tree
4783
+ this.items.add(changeTree);
4784
+ // add parent's parent
4785
+ const parentChangeTree = changeTree.parent?.[$changes];
4786
+ if (parentChangeTree && (parentChangeTree.filteredChanges !== undefined)) {
4787
+ this.addParentOf(changeTree, tag);
4788
+ }
4789
+ // parent is already available, no need to add it!
4790
+ if (!this.invisible.has(changeTree)) {
4791
+ return;
4792
+ }
4809
4793
  }
4810
4794
  // add parent's tag properties
4811
4795
  if (changeTree.getChange(parentIndex) !== exports.OPERATION.DELETE) {
4812
- let changes = this.changes[changeTree.refId];
4796
+ let changes = this.changes.get(changeTree.refId);
4813
4797
  if (changes === undefined) {
4814
4798
  changes = {};
4815
- this.changes[changeTree.refId] = changes;
4799
+ this.changes.set(changeTree.refId, changes);
4816
4800
  }
4817
4801
  if (!this.tags) {
4818
4802
  this.tags = new WeakMap();
@@ -4838,20 +4822,20 @@
4838
4822
  this.items.delete(changeTree);
4839
4823
  const ref = changeTree.ref;
4840
4824
  const metadata = ref.constructor[Symbol.metadata];
4841
- let changes = this.changes[changeTree.refId];
4825
+ let changes = this.changes.get(changeTree.refId);
4842
4826
  if (changes === undefined) {
4843
4827
  changes = {};
4844
- this.changes[changeTree.refId] = changes;
4828
+ this.changes.set(changeTree.refId, changes);
4845
4829
  }
4846
4830
  if (tag === DEFAULT_VIEW_TAG) {
4847
4831
  // parent is collection (Map/Array)
4848
4832
  const parent = changeTree.parent;
4849
4833
  if (!Metadata.isValidInstance(parent)) {
4850
4834
  const parentChangeTree = parent[$changes];
4851
- let changes = this.changes[parentChangeTree.refId];
4835
+ let changes = this.changes.get(parentChangeTree.refId);
4852
4836
  if (changes === undefined) {
4853
4837
  changes = {};
4854
- this.changes[parentChangeTree.refId] = changes;
4838
+ this.changes.set(parentChangeTree.refId, changes);
4855
4839
  }
4856
4840
  // DELETE / DELETE BY REF ID
4857
4841
  changes[changeTree.parentIndex] = exports.OPERATION.DELETE;
@@ -4883,6 +4867,13 @@
4883
4867
  }
4884
4868
  return this;
4885
4869
  }
4870
+ has(obj) {
4871
+ return this.items.has(obj[$changes]);
4872
+ }
4873
+ hasTag(ob, tag = DEFAULT_VIEW_TAG) {
4874
+ const tags = this.tags?.get(ob[$changes]);
4875
+ return tags?.has(tag) ?? false;
4876
+ }
4886
4877
  }
4887
4878
 
4888
4879
  registerType("map", { constructor: MapSchema });
package/lib/Metadata.js CHANGED
@@ -128,14 +128,13 @@ exports.Metadata = {
128
128
  fieldIndex++;
129
129
  for (const field in fields) {
130
130
  const type = fields[field];
131
- const normalizedType = getNormalizedType(type);
132
131
  // FIXME: this code is duplicated from @type() annotation
133
132
  const complexTypeKlass = (Array.isArray(type))
134
133
  ? (0, registry_1.getType)("array")
135
134
  : (typeof (Object.keys(type)[0]) === "string") && (0, registry_1.getType)(Object.keys(type)[0]);
136
135
  const childType = (complexTypeKlass)
137
136
  ? Object.values(type)[0]
138
- : normalizedType;
137
+ : getNormalizedType(type);
139
138
  exports.Metadata.addField(metadata, fieldIndex, field, type, (0, annotations_1.getPropertyDescriptor)(`_${field}`, fieldIndex, childType, complexTypeKlass));
140
139
  fieldIndex++;
141
140
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Metadata.js","sourceRoot":"","sources":["../src/Metadata.ts"],"names":[],"mappings":"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","sourcesContent":["import { DefinitionType, getPropertyDescriptor } from \"./annotations\";\nimport { Schema } from \"./Schema\";\nimport { getType } from \"./types/registry\";\nimport { $decoder, $descriptors, $encoder, $fieldIndexesByViewTag, $numFields, $refTypeFieldIndexes, $track, $viewFieldIndexes } from \"./types/symbols\";\nimport { TypeContext } from \"./types/TypeContext\";\n\nexport type MetadataField = {\n type: DefinitionType,\n name: string,\n index: number,\n tag?: number,\n unreliable?: boolean,\n deprecated?: boolean,\n};\n\nexport type Metadata =\n { [$numFields]: number; } & // number of fields\n { [$viewFieldIndexes]: number[]; } & // all field indexes with \"view\" tag\n { [$fieldIndexesByViewTag]: {[tag: number]: number[]}; } & // field indexes by \"view\" tag\n { [$refTypeFieldIndexes]: number[]; } & // all field indexes containing Ref types (Schema, ArraySchema, MapSchema, etc)\n { [field: number]: MetadataField; } & // index => field name\n { [field: string]: number; } & // field name => field metadata\n { [$descriptors]: { [field: string]: PropertyDescriptor } } // property descriptors\n\nexport function getNormalizedType(type: DefinitionType): DefinitionType {\n return (Array.isArray(type))\n ? { array: type[0] }\n : (typeof(type['type']) !== \"undefined\")\n ? type['type']\n : type;\n}\n\nexport const Metadata = {\n\n addField(metadata: any, index: number, name: string, type: DefinitionType, descriptor?: PropertyDescriptor) {\n if (index > 64) {\n throw new Error(`Can't define field '${name}'.\\nSchema instances may only have up to 64 fields.`);\n }\n\n metadata[index] = Object.assign(\n metadata[index] || {}, // avoid overwriting previous field metadata (@owned / @deprecated)\n {\n type: getNormalizedType(type),\n index,\n name,\n }\n );\n\n // create \"descriptors\" map\n Object.defineProperty(metadata, $descriptors, {\n value: metadata[$descriptors] || {},\n enumerable: false,\n configurable: true,\n });\n\n if (descriptor) {\n // for encoder\n metadata[$descriptors][name] = descriptor;\n metadata[$descriptors][`_${name}`] = {\n value: undefined,\n writable: true,\n enumerable: false,\n configurable: true,\n };\n } else {\n // for decoder\n metadata[$descriptors][name] = {\n value: undefined,\n writable: true,\n enumerable: true,\n configurable: true,\n };\n }\n\n // map -1 as last field index\n Object.defineProperty(metadata, $numFields, {\n value: index,\n enumerable: false,\n configurable: true\n });\n\n // map field name => index (non enumerable)\n Object.defineProperty(metadata, name, {\n value: index,\n enumerable: false,\n configurable: true,\n });\n\n // if child Ref/complex type, add to -4\n if (typeof (metadata[index].type) !== \"string\") {\n if (metadata[$refTypeFieldIndexes] === undefined) {\n Object.defineProperty(metadata, $refTypeFieldIndexes, {\n value: [],\n enumerable: false,\n configurable: true,\n });\n }\n metadata[$refTypeFieldIndexes].push(index);\n }\n },\n\n setTag(metadata: Metadata, fieldName: string, tag: number) {\n const index = metadata[fieldName];\n const field = metadata[index];\n\n // add 'tag' to the field\n field.tag = tag;\n\n if (!metadata[$viewFieldIndexes]) {\n // -2: all field indexes with \"view\" tag\n Object.defineProperty(metadata, $viewFieldIndexes, {\n value: [],\n enumerable: false,\n configurable: true\n });\n\n // -3: field indexes by \"view\" tag\n Object.defineProperty(metadata, $fieldIndexesByViewTag, {\n value: {},\n enumerable: false,\n configurable: true\n });\n }\n\n metadata[$viewFieldIndexes].push(index);\n\n if (!metadata[$fieldIndexesByViewTag][tag]) {\n metadata[$fieldIndexesByViewTag][tag] = [];\n }\n\n metadata[$fieldIndexesByViewTag][tag].push(index);\n },\n\n setFields(target: any, fields: { [field: string]: DefinitionType }) {\n // for inheritance support\n const constructor = target.prototype.constructor;\n TypeContext.register(constructor);\n\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata = parentClass && parentClass[Symbol.metadata];\n const metadata = Metadata.initialize(constructor);\n\n // Use Schema's methods if not defined in the class\n if (!constructor[$track]) { constructor[$track] = Schema[$track]; }\n if (!constructor[$encoder]) { constructor[$encoder] = Schema[$encoder]; }\n if (!constructor[$decoder]) { constructor[$decoder] = Schema[$decoder]; }\n if (!constructor.prototype.toJSON) { constructor.prototype.toJSON = Schema.prototype.toJSON; }\n\n //\n // detect index for this field, considering inheritance\n //\n let fieldIndex = metadata[$numFields] // current structure already has fields defined\n ?? (parentMetadata && parentMetadata[$numFields]) // parent structure has fields defined\n ?? -1; // no fields defined\n\n fieldIndex++;\n\n for (const field in fields) {\n const type = fields[field];\n const normalizedType = getNormalizedType(type);\n\n // FIXME: this code is duplicated from @type() annotation\n const complexTypeKlass = (Array.isArray(type))\n ? getType(\"array\")\n : (typeof(Object.keys(type)[0]) === \"string\") && getType(Object.keys(type)[0]);\n\n const childType = (complexTypeKlass)\n ? Object.values(type)[0]\n : normalizedType;\n\n Metadata.addField(\n metadata,\n fieldIndex,\n field,\n type,\n getPropertyDescriptor(`_${field}`, fieldIndex, childType, complexTypeKlass)\n );\n\n fieldIndex++;\n }\n\n return target;\n },\n\n isDeprecated(metadata: any, field: string) {\n return metadata[field].deprecated === true;\n },\n\n init(klass: any) {\n //\n // Used only to initialize an empty Schema (Encoder#constructor)\n // TODO: remove/refactor this...\n //\n const metadata = {};\n klass[Symbol.metadata] = metadata;\n Object.defineProperty(metadata, $numFields, {\n value: 0,\n enumerable: false,\n configurable: true,\n });\n },\n\n initialize(constructor: any) {\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata: Metadata = parentClass[Symbol.metadata];\n\n let metadata: Metadata = constructor[Symbol.metadata] ?? Object.create(null);\n\n // make sure inherited classes have their own metadata object.\n if (parentClass !== Schema && metadata === parentMetadata) {\n metadata = Object.create(null);\n\n if (parentMetadata) {\n //\n // assign parent metadata to current\n //\n Object.setPrototypeOf(metadata, parentMetadata);\n\n // $numFields\n Object.defineProperty(metadata, $numFields, {\n value: parentMetadata[$numFields],\n enumerable: false,\n configurable: true,\n writable: true,\n });\n\n // $viewFieldIndexes / $fieldIndexesByViewTag\n if (parentMetadata[$viewFieldIndexes] !== undefined) {\n Object.defineProperty(metadata, $viewFieldIndexes, {\n value: [...parentMetadata[$viewFieldIndexes]],\n enumerable: false,\n configurable: true,\n writable: true,\n });\n Object.defineProperty(metadata, $fieldIndexesByViewTag, {\n value: { ...parentMetadata[$fieldIndexesByViewTag] },\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n\n // $refTypeFieldIndexes\n if (parentMetadata[$refTypeFieldIndexes] !== undefined) {\n Object.defineProperty(metadata, $refTypeFieldIndexes, {\n value: [...parentMetadata[$refTypeFieldIndexes]],\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n\n // $descriptors\n Object.defineProperty(metadata, $descriptors, {\n value: { ...parentMetadata[$descriptors] },\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n }\n\n constructor[Symbol.metadata] = metadata;\n\n return metadata;\n },\n\n isValidInstance(klass: any) {\n return (\n klass.constructor[Symbol.metadata] &&\n Object.prototype.hasOwnProperty.call(klass.constructor[Symbol.metadata], $numFields) as boolean\n );\n },\n\n getFields(klass: any) {\n const metadata: Metadata = klass[Symbol.metadata];\n const fields = {};\n for (let i = 0; i <= metadata[$numFields]; i++) {\n fields[metadata[i].name] = metadata[i].type;\n }\n return fields;\n }\n}"]}
1
+ {"version":3,"file":"Metadata.js","sourceRoot":"","sources":["../src/Metadata.ts"],"names":[],"mappings":"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","sourcesContent":["import { DefinitionType, getPropertyDescriptor } from \"./annotations\";\nimport { Schema } from \"./Schema\";\nimport { getType } from \"./types/registry\";\nimport { $decoder, $descriptors, $encoder, $fieldIndexesByViewTag, $numFields, $refTypeFieldIndexes, $track, $viewFieldIndexes } from \"./types/symbols\";\nimport { TypeContext } from \"./types/TypeContext\";\n\nexport type MetadataField = {\n type: DefinitionType,\n name: string,\n index: number,\n tag?: number,\n unreliable?: boolean,\n deprecated?: boolean,\n};\n\nexport type Metadata =\n { [$numFields]: number; } & // number of fields\n { [$viewFieldIndexes]: number[]; } & // all field indexes with \"view\" tag\n { [$fieldIndexesByViewTag]: {[tag: number]: number[]}; } & // field indexes by \"view\" tag\n { [$refTypeFieldIndexes]: number[]; } & // all field indexes containing Ref types (Schema, ArraySchema, MapSchema, etc)\n { [field: number]: MetadataField; } & // index => field name\n { [field: string]: number; } & // field name => field metadata\n { [$descriptors]: { [field: string]: PropertyDescriptor } } // property descriptors\n\nexport function getNormalizedType(type: DefinitionType): DefinitionType {\n return (Array.isArray(type))\n ? { array: type[0] }\n : (typeof(type['type']) !== \"undefined\")\n ? type['type']\n : type;\n}\n\nexport const Metadata = {\n\n addField(metadata: any, index: number, name: string, type: DefinitionType, descriptor?: PropertyDescriptor) {\n if (index > 64) {\n throw new Error(`Can't define field '${name}'.\\nSchema instances may only have up to 64 fields.`);\n }\n\n metadata[index] = Object.assign(\n metadata[index] || {}, // avoid overwriting previous field metadata (@owned / @deprecated)\n {\n type: getNormalizedType(type),\n index,\n name,\n }\n );\n\n // create \"descriptors\" map\n Object.defineProperty(metadata, $descriptors, {\n value: metadata[$descriptors] || {},\n enumerable: false,\n configurable: true,\n });\n\n if (descriptor) {\n // for encoder\n metadata[$descriptors][name] = descriptor;\n metadata[$descriptors][`_${name}`] = {\n value: undefined,\n writable: true,\n enumerable: false,\n configurable: true,\n };\n } else {\n // for decoder\n metadata[$descriptors][name] = {\n value: undefined,\n writable: true,\n enumerable: true,\n configurable: true,\n };\n }\n\n // map -1 as last field index\n Object.defineProperty(metadata, $numFields, {\n value: index,\n enumerable: false,\n configurable: true\n });\n\n // map field name => index (non enumerable)\n Object.defineProperty(metadata, name, {\n value: index,\n enumerable: false,\n configurable: true,\n });\n\n // if child Ref/complex type, add to -4\n if (typeof (metadata[index].type) !== \"string\") {\n if (metadata[$refTypeFieldIndexes] === undefined) {\n Object.defineProperty(metadata, $refTypeFieldIndexes, {\n value: [],\n enumerable: false,\n configurable: true,\n });\n }\n metadata[$refTypeFieldIndexes].push(index);\n }\n },\n\n setTag(metadata: Metadata, fieldName: string, tag: number) {\n const index = metadata[fieldName];\n const field = metadata[index];\n\n // add 'tag' to the field\n field.tag = tag;\n\n if (!metadata[$viewFieldIndexes]) {\n // -2: all field indexes with \"view\" tag\n Object.defineProperty(metadata, $viewFieldIndexes, {\n value: [],\n enumerable: false,\n configurable: true\n });\n\n // -3: field indexes by \"view\" tag\n Object.defineProperty(metadata, $fieldIndexesByViewTag, {\n value: {},\n enumerable: false,\n configurable: true\n });\n }\n\n metadata[$viewFieldIndexes].push(index);\n\n if (!metadata[$fieldIndexesByViewTag][tag]) {\n metadata[$fieldIndexesByViewTag][tag] = [];\n }\n\n metadata[$fieldIndexesByViewTag][tag].push(index);\n },\n\n setFields(target: any, fields: { [field: string]: DefinitionType }) {\n // for inheritance support\n const constructor = target.prototype.constructor;\n TypeContext.register(constructor);\n\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata = parentClass && parentClass[Symbol.metadata];\n const metadata = Metadata.initialize(constructor);\n\n // Use Schema's methods if not defined in the class\n if (!constructor[$track]) { constructor[$track] = Schema[$track]; }\n if (!constructor[$encoder]) { constructor[$encoder] = Schema[$encoder]; }\n if (!constructor[$decoder]) { constructor[$decoder] = Schema[$decoder]; }\n if (!constructor.prototype.toJSON) { constructor.prototype.toJSON = Schema.prototype.toJSON; }\n\n //\n // detect index for this field, considering inheritance\n //\n let fieldIndex = metadata[$numFields] // current structure already has fields defined\n ?? (parentMetadata && parentMetadata[$numFields]) // parent structure has fields defined\n ?? -1; // no fields defined\n\n fieldIndex++;\n\n for (const field in fields) {\n const type = fields[field];\n\n // FIXME: this code is duplicated from @type() annotation\n const complexTypeKlass = (Array.isArray(type))\n ? getType(\"array\")\n : (typeof(Object.keys(type)[0]) === \"string\") && getType(Object.keys(type)[0]);\n\n const childType = (complexTypeKlass)\n ? Object.values(type)[0]\n : getNormalizedType(type);\n\n Metadata.addField(\n metadata,\n fieldIndex,\n field,\n type,\n getPropertyDescriptor(`_${field}`, fieldIndex, childType, complexTypeKlass)\n );\n\n fieldIndex++;\n }\n\n return target;\n },\n\n isDeprecated(metadata: any, field: string) {\n return metadata[field].deprecated === true;\n },\n\n init(klass: any) {\n //\n // Used only to initialize an empty Schema (Encoder#constructor)\n // TODO: remove/refactor this...\n //\n const metadata = {};\n klass[Symbol.metadata] = metadata;\n Object.defineProperty(metadata, $numFields, {\n value: 0,\n enumerable: false,\n configurable: true,\n });\n },\n\n initialize(constructor: any) {\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata: Metadata = parentClass[Symbol.metadata];\n\n let metadata: Metadata = constructor[Symbol.metadata] ?? Object.create(null);\n\n // make sure inherited classes have their own metadata object.\n if (parentClass !== Schema && metadata === parentMetadata) {\n metadata = Object.create(null);\n\n if (parentMetadata) {\n //\n // assign parent metadata to current\n //\n Object.setPrototypeOf(metadata, parentMetadata);\n\n // $numFields\n Object.defineProperty(metadata, $numFields, {\n value: parentMetadata[$numFields],\n enumerable: false,\n configurable: true,\n writable: true,\n });\n\n // $viewFieldIndexes / $fieldIndexesByViewTag\n if (parentMetadata[$viewFieldIndexes] !== undefined) {\n Object.defineProperty(metadata, $viewFieldIndexes, {\n value: [...parentMetadata[$viewFieldIndexes]],\n enumerable: false,\n configurable: true,\n writable: true,\n });\n Object.defineProperty(metadata, $fieldIndexesByViewTag, {\n value: { ...parentMetadata[$fieldIndexesByViewTag] },\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n\n // $refTypeFieldIndexes\n if (parentMetadata[$refTypeFieldIndexes] !== undefined) {\n Object.defineProperty(metadata, $refTypeFieldIndexes, {\n value: [...parentMetadata[$refTypeFieldIndexes]],\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n\n // $descriptors\n Object.defineProperty(metadata, $descriptors, {\n value: { ...parentMetadata[$descriptors] },\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n }\n\n constructor[Symbol.metadata] = metadata;\n\n return metadata;\n },\n\n isValidInstance(klass: any) {\n return (\n klass.constructor[Symbol.metadata] &&\n Object.prototype.hasOwnProperty.call(klass.constructor[Symbol.metadata], $numFields) as boolean\n );\n },\n\n getFields(klass: any) {\n const metadata: Metadata = klass[Symbol.metadata];\n const fields = {};\n for (let i = 0; i <= metadata[$numFields]; i++) {\n fields[metadata[i].name] = metadata[i].type;\n }\n return fields;\n }\n}"]}
@@ -302,13 +302,14 @@ function getPropertyDescriptor(fieldCached, fieldIndex, type, complexTypeKlass)
302
302
  const changeTree = this[symbols_1.$changes];
303
303
  //
304
304
  // Replacing existing "ref", remove it from root.
305
- // TODO: if there are other references to this instance, we should not remove it from root.
306
305
  //
307
306
  if (previousValue !== undefined && previousValue[symbols_1.$changes]) {
308
307
  changeTree.root?.remove(previousValue[symbols_1.$changes]);
308
+ this.constructor[symbols_1.$track](changeTree, fieldIndex, spec_1.OPERATION.DELETE_AND_ADD);
309
+ }
310
+ else {
311
+ this.constructor[symbols_1.$track](changeTree, fieldIndex, spec_1.OPERATION.ADD);
309
312
  }
310
- // flag the change for encoding.
311
- this.constructor[symbols_1.$track](changeTree, fieldIndex, spec_1.OPERATION.ADD);
312
313
  //
313
314
  // call setParent() recursively for this and its child
314
315
  // structures.