@colyseus/schema 3.0.0-alpha.42 → 3.0.0-alpha.44

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.
@@ -621,6 +621,11 @@
621
621
  this.hasFilters = false;
622
622
  this.parentFiltered = {};
623
623
  if (rootClass) {
624
+ //
625
+ // TODO:
626
+ // cache "discoverTypes" results for each rootClass
627
+ // to avoid re-discovering types for each new context/room
628
+ //
624
629
  this.discoverTypes(rootClass);
625
630
  }
626
631
  }
@@ -648,13 +653,17 @@
648
653
  getTypeId(klass) {
649
654
  return this.schemas.get(klass);
650
655
  }
651
- discoverTypes(klass, parentIndex, parentFieldViewTag) {
656
+ discoverTypes(klass, parentType, parentIndex, parentHasViewTag) {
657
+ if (parentHasViewTag) {
658
+ this.registerFilteredByParent(klass, parentType, parentIndex);
659
+ }
660
+ // skip if already registered
652
661
  if (!this.add(klass)) {
653
662
  return;
654
663
  }
655
664
  // add classes inherited from this base class
656
665
  TypeContext.inheritedTypes.get(klass)?.forEach((child) => {
657
- this.discoverTypes(child, parentIndex, parentFieldViewTag);
666
+ this.discoverTypes(child, klass, parentIndex, parentHasViewTag);
658
667
  });
659
668
  // add parent classes
660
669
  let parent = klass;
@@ -669,13 +678,10 @@
669
678
  if (metadata[$viewFieldIndexes]) {
670
679
  this.hasFilters = true;
671
680
  }
672
- if (parentFieldViewTag !== undefined) {
673
- this.parentFiltered[`${this.schemas.get(klass)}-${parentIndex}`] = true;
674
- }
675
681
  for (const fieldIndex in metadata) {
676
682
  const index = fieldIndex;
677
683
  const fieldType = metadata[index].type;
678
- const viewTag = metadata[index].tag;
684
+ const fieldHasViewTag = (metadata[index].tag !== undefined);
679
685
  if (typeof (fieldType) === "string") {
680
686
  continue;
681
687
  }
@@ -685,10 +691,10 @@
685
691
  if (type === "string") {
686
692
  continue;
687
693
  }
688
- this.discoverTypes(type, index, viewTag);
694
+ this.discoverTypes(type, klass, index, parentHasViewTag || fieldHasViewTag);
689
695
  }
690
696
  else if (typeof (fieldType) === "function") {
691
- this.discoverTypes(fieldType, viewTag);
697
+ this.discoverTypes(fieldType, klass, index, parentHasViewTag || fieldHasViewTag);
692
698
  }
693
699
  else {
694
700
  const type = Object.values(fieldType)[0];
@@ -696,10 +702,44 @@
696
702
  if (typeof (type) === "string") {
697
703
  continue;
698
704
  }
699
- this.discoverTypes(type, index, viewTag);
705
+ this.discoverTypes(type, klass, index, parentHasViewTag || fieldHasViewTag);
700
706
  }
701
707
  }
702
708
  }
709
+ /**
710
+ * Keep track of which classes have filters applied.
711
+ * Format: `${typeid}-${parentTypeid}-${parentIndex}`
712
+ */
713
+ registerFilteredByParent(schema, parentType, parentIndex) {
714
+ const typeid = this.schemas.get(schema) ?? this.schemas.size;
715
+ let key = `${typeid}`;
716
+ if (parentType) {
717
+ key += `-${this.schemas.get(parentType)}`;
718
+ }
719
+ key += `-${parentIndex}`;
720
+ this.parentFiltered[key] = true;
721
+ }
722
+ debug() {
723
+ let parentFiltered = "";
724
+ for (const key in this.parentFiltered) {
725
+ const keys = key.split("-").map(Number);
726
+ const fieldIndex = keys.pop();
727
+ parentFiltered += `\n\t\t`;
728
+ parentFiltered += `${key}: ${keys.reverse().map((id, i) => {
729
+ const klass = this.types[id];
730
+ const metadata = klass[Symbol.metadata];
731
+ let txt = klass.name;
732
+ if (i === 0) {
733
+ txt += `[${metadata[fieldIndex].name}]`;
734
+ }
735
+ return `${txt}`;
736
+ }).join(" -> ")}`;
737
+ }
738
+ return `TypeContext ->\n` +
739
+ `\tSchema types: ${this.schemas.size}\n` +
740
+ `\thasFilters: ${this.hasFilters}\n` +
741
+ `\tparentFiltered:${parentFiltered}`;
742
+ }
703
743
  }
704
744
 
705
745
  function getNormalizedType(type) {
@@ -944,8 +984,10 @@
944
984
  }
945
985
  class ChangeTree {
946
986
  constructor(ref) {
987
+ /**
988
+ * Whether this structure is parent of a filtered structure.
989
+ */
947
990
  this.isFiltered = false;
948
- this.isPartiallyFiltered = false;
949
991
  this.indexedOperations = {};
950
992
  //
951
993
  // TODO:
@@ -964,37 +1006,17 @@
964
1006
  //
965
1007
  // Does this structure have "filters" declared?
966
1008
  //
967
- if (ref.constructor[Symbol.metadata]?.[$viewFieldIndexes]) {
1009
+ const metadata = ref.constructor[Symbol.metadata];
1010
+ if (metadata?.[$viewFieldIndexes]) {
968
1011
  this.allFilteredChanges = { indexes: {}, operations: [] };
969
1012
  this.filteredChanges = { indexes: {}, operations: [] };
970
1013
  }
971
1014
  }
972
1015
  setRoot(root) {
973
1016
  this.root = root;
974
- const isNewChangeTree = this.root.add(this);
975
- const metadata = this.ref.constructor[Symbol.metadata];
976
- if (this.root.types.hasFilters) {
977
- //
978
- // At Schema initialization, the "root" structure might not be available
979
- // yet, as it only does once the "Encoder" has been set up.
980
- //
981
- // So the "parent" may be already set without a "root".
982
- //
983
- this.checkIsFiltered(metadata, this.parent, this.parentIndex);
984
- if (this.isFiltered || this.isPartiallyFiltered) {
985
- enqueueChangeTree(root, this, 'filteredChanges');
986
- if (isNewChangeTree) {
987
- this.root.allFilteredChanges.push(this);
988
- }
989
- }
990
- }
991
- if (!this.isFiltered) {
992
- enqueueChangeTree(root, this, 'changes');
993
- if (isNewChangeTree) {
994
- this.root.allChanges.push(this);
995
- }
996
- }
1017
+ this.checkIsFiltered(this.parent, this.parentIndex);
997
1018
  // Recursively set root on child structures
1019
+ const metadata = this.ref.constructor[Symbol.metadata];
998
1020
  if (metadata) {
999
1021
  metadata[$refTypeFieldIndexes]?.forEach((index) => {
1000
1022
  const field = metadata[index];
@@ -1016,39 +1038,21 @@
1016
1038
  if (!root) {
1017
1039
  return;
1018
1040
  }
1019
- const metadata = this.ref.constructor[Symbol.metadata];
1020
1041
  // skip if parent is already set
1021
1042
  if (root !== this.root) {
1022
1043
  this.root = root;
1023
- const isNewChangeTree = root.add(this);
1024
- if (root.types.hasFilters) {
1025
- this.checkIsFiltered(metadata, parent, parentIndex);
1026
- if (this.isFiltered || this.isPartiallyFiltered) {
1027
- enqueueChangeTree(root, this, 'filteredChanges');
1028
- if (isNewChangeTree) {
1029
- this.root.allFilteredChanges.push(this);
1030
- }
1031
- }
1032
- }
1033
- if (!this.isFiltered) {
1034
- enqueueChangeTree(root, this, 'changes');
1035
- if (isNewChangeTree) {
1036
- this.root.allChanges.push(this);
1037
- }
1038
- }
1044
+ this.checkIsFiltered(parent, parentIndex);
1039
1045
  }
1040
1046
  else {
1041
1047
  root.add(this);
1042
1048
  }
1043
1049
  // assign same parent on child structures
1050
+ const metadata = this.ref.constructor[Symbol.metadata];
1044
1051
  if (metadata) {
1045
1052
  metadata[$refTypeFieldIndexes]?.forEach((index) => {
1046
1053
  const field = metadata[index];
1047
1054
  const value = this.ref[field.name];
1048
1055
  value?.[$changes].setParent(this.ref, root, index);
1049
- // try { throw new Error(); } catch (e) {
1050
- // console.log(e.stack);
1051
- // }
1052
1056
  });
1053
1057
  }
1054
1058
  else if (this.ref[$childType] && typeof (this.ref[$childType]) !== "string") {
@@ -1141,7 +1145,7 @@
1141
1145
  //
1142
1146
  // - ArraySchema#splice()
1143
1147
  //
1144
- if (this.isFiltered || this.isPartiallyFiltered) {
1148
+ if (this.filteredChanges !== undefined) {
1145
1149
  this._shiftAllChangeIndexes(shiftIndex, startIndex, this.allFilteredChanges);
1146
1150
  this._shiftAllChangeIndexes(shiftIndex, startIndex, this.allChanges);
1147
1151
  }
@@ -1170,7 +1174,7 @@
1170
1174
  }
1171
1175
  indexedOperation(index, operation, allChangesIndex = index) {
1172
1176
  this.indexedOperations[index] = operation;
1173
- if (this.filteredChanges) {
1177
+ if (this.filteredChanges !== undefined) {
1174
1178
  setOperationAtIndex(this.allFilteredChanges, allChangesIndex);
1175
1179
  setOperationAtIndex(this.filteredChanges, index);
1176
1180
  enqueueChangeTree(this.root, this, 'filteredChanges');
@@ -1218,7 +1222,7 @@
1218
1222
  }
1219
1223
  return;
1220
1224
  }
1221
- const changeSet = (this.filteredChanges)
1225
+ const changeSet = (this.filteredChanges !== undefined)
1222
1226
  ? this.filteredChanges
1223
1227
  : this.changes;
1224
1228
  this.indexedOperations[index] = operation ?? exports.OPERATION.DELETE;
@@ -1234,14 +1238,14 @@
1234
1238
  // - This is due to using the concrete Schema class at decoding time.
1235
1239
  // - "Reflected" structures do not have this problem.
1236
1240
  //
1237
- // (the property descriptors should NOT be used at decoding time. only at encoding time.)
1241
+ // (The property descriptors should NOT be used at decoding time. only at encoding time.)
1238
1242
  //
1239
1243
  this.root?.remove(previousValue[$changes]);
1240
1244
  }
1241
1245
  //
1242
1246
  // FIXME: this is looking a ugly and repeated
1243
1247
  //
1244
- if (this.filteredChanges) {
1248
+ if (this.filteredChanges !== undefined) {
1245
1249
  deleteOperationAtIndex(this.allFilteredChanges, allChangesIndex);
1246
1250
  enqueueChangeTree(this.root, this, 'filteredChanges');
1247
1251
  }
@@ -1310,29 +1314,59 @@
1310
1314
  get changed() {
1311
1315
  return (Object.entries(this.indexedOperations).length > 0);
1312
1316
  }
1313
- checkIsFiltered(metadata, parent, parentIndex) {
1314
- // Detect if current structure has "filters" declared
1315
- this.isPartiallyFiltered = metadata?.[$viewFieldIndexes] !== undefined;
1316
- if (this.isPartiallyFiltered) {
1317
- this.filteredChanges = this.filteredChanges || { indexes: {}, operations: [] };
1318
- this.allFilteredChanges = this.allFilteredChanges || { indexes: {}, operations: [] };
1317
+ checkIsFiltered(parent, parentIndex) {
1318
+ const isNewChangeTree = this.root.add(this);
1319
+ if (this.root.types.hasFilters) {
1320
+ //
1321
+ // At Schema initialization, the "root" structure might not be available
1322
+ // yet, as it only does once the "Encoder" has been set up.
1323
+ //
1324
+ // So the "parent" may be already set without a "root".
1325
+ //
1326
+ this._checkFilteredByParent(parent, parentIndex);
1327
+ if (this.filteredChanges !== undefined) {
1328
+ enqueueChangeTree(this.root, this, 'filteredChanges');
1329
+ if (isNewChangeTree) {
1330
+ this.root.allFilteredChanges.push(this);
1331
+ }
1332
+ }
1319
1333
  }
1334
+ if (!this.isFiltered) {
1335
+ enqueueChangeTree(this.root, this, 'changes');
1336
+ if (isNewChangeTree) {
1337
+ this.root.allChanges.push(this);
1338
+ }
1339
+ }
1340
+ }
1341
+ _checkFilteredByParent(parent, parentIndex) {
1320
1342
  // skip if parent is not set
1321
1343
  if (!parent) {
1322
1344
  return;
1323
1345
  }
1346
+ // ArraySchema | MapSchema - get the child type
1347
+ const ref = Metadata.isValidInstance(this.ref)
1348
+ ? this.ref
1349
+ : new this.ref[$childType];
1324
1350
  if (!Metadata.isValidInstance(parent)) {
1325
1351
  const parentChangeTree = parent[$changes];
1326
1352
  parent = parentChangeTree.parent;
1327
1353
  parentIndex = parentChangeTree.parentIndex;
1328
1354
  }
1329
- const parentMetadata = parent.constructor?.[Symbol.metadata];
1330
- this.isFiltered = parentMetadata?.[$viewFieldIndexes]?.includes(parentIndex);
1355
+ const parentConstructor = parent.constructor;
1356
+ let key = `${this.root.types.getTypeId(ref.constructor)}`;
1357
+ if (parentConstructor) {
1358
+ key += `-${this.root.types.schemas.get(parentConstructor)}`;
1359
+ }
1360
+ key += `-${parentIndex}`;
1361
+ this.isFiltered = this.root.types.parentFiltered[key];
1362
+ // const parentMetadata = parentConstructor?.[Symbol.metadata];
1363
+ // this.isFiltered = parentMetadata?.[$viewFieldIndexes]?.includes(parentIndex) || this.root.types.parentFiltered[key];
1331
1364
  //
1332
1365
  // TODO: refactor this!
1333
1366
  //
1334
1367
  // swapping `changes` and `filteredChanges` is required here
1335
1368
  // because "isFiltered" may not be imedialely available on `change()`
1369
+ // (this happens when instance is detached from root or parent)
1336
1370
  //
1337
1371
  if (this.isFiltered) {
1338
1372
  this.filteredChanges = { indexes: {}, operations: [] };
@@ -1346,10 +1380,6 @@
1346
1380
  const allFilteredChanges = this.allFilteredChanges;
1347
1381
  this.allFilteredChanges = this.allChanges;
1348
1382
  this.allChanges = allFilteredChanges;
1349
- // console.log("SWAP =>", {
1350
- // "this.allFilteredChanges": this.allFilteredChanges,
1351
- // "this.allChanges": this.allChanges
1352
- // })
1353
1383
  }
1354
1384
  }
1355
1385
  }
@@ -3237,7 +3267,7 @@
3237
3267
  const rootChangeTree = ref[$changes];
3238
3268
  const root = rootChangeTree.root;
3239
3269
  const changeTrees = new Map();
3240
- let totalInstances = 0;
3270
+ const instanceRefIds = [];
3241
3271
  let totalOperations = 0;
3242
3272
  for (const [refId, changes] of Object.entries(root[changeSetName])) {
3243
3273
  const changeTree = root.changeTrees[refId];
@@ -3258,14 +3288,14 @@
3258
3288
  }
3259
3289
  }
3260
3290
  if (includeChangeTree) {
3261
- totalInstances += 1;
3291
+ instanceRefIds.push(changeTree.refId);
3262
3292
  totalOperations += Object.keys(changes).length;
3263
3293
  changeTrees.set(changeTree, parentChangeTrees.reverse());
3264
3294
  }
3265
3295
  }
3266
3296
  output += "---\n";
3267
3297
  output += `root refId: ${rootChangeTree.refId}\n`;
3268
- output += `Total instances: ${totalInstances}\n`;
3298
+ output += `Total instances: ${instanceRefIds.length} (refIds: ${instanceRefIds.join(", ")})\n`;
3269
3299
  output += `Total changes: ${totalOperations}\n`;
3270
3300
  output += "---\n";
3271
3301
  // based on root.changes, display a tree of changes that has the "ref" instance as parent
@@ -3706,7 +3736,7 @@
3706
3736
  delete this.changeTrees[changeTree.refId];
3707
3737
  this.removeChangeFromChangeSet("allChanges", changeTree);
3708
3738
  this.removeChangeFromChangeSet("changes", changeTree);
3709
- if (changeTree.isFiltered || changeTree.isPartiallyFiltered) {
3739
+ if (changeTree.filteredChanges) {
3710
3740
  this.removeChangeFromChangeSet("allFilteredChanges", changeTree);
3711
3741
  this.removeChangeFromChangeSet("filteredChanges", changeTree);
3712
3742
  }
@@ -4052,6 +4082,7 @@
4052
4082
  clearRefs() {
4053
4083
  this.refs.clear();
4054
4084
  this.deletedRefs.clear();
4085
+ this.callbacks = {};
4055
4086
  this.refCounts = {};
4056
4087
  }
4057
4088
  // for decoding
@@ -4716,7 +4747,7 @@
4716
4747
  }
4717
4748
  else {
4718
4749
  const isInvisible = this.invisible.has(changeTree);
4719
- const changeSet = (changeTree.isFiltered || changeTree.isPartiallyFiltered)
4750
+ const changeSet = (changeTree.filteredChanges !== undefined)
4720
4751
  ? changeTree.allFilteredChanges
4721
4752
  : changeTree.allChanges;
4722
4753
  for (let i = 0, len = changeSet.operations.length; i < len; i++) {
@@ -4724,7 +4755,7 @@
4724
4755
  if (index === undefined) {
4725
4756
  continue;
4726
4757
  } // skip "undefined" indexes
4727
- const op = changeTree.indexedOperations[index];
4758
+ const op = changeTree.indexedOperations[index] ?? exports.OPERATION.ADD;
4728
4759
  const tagAtIndex = metadata?.[index].tag;
4729
4760
  if ((isInvisible || // if "invisible", include all
4730
4761
  tagAtIndex === undefined || // "all change" with no tag
@@ -4738,7 +4769,9 @@
4738
4769
  // Add children of this ChangeTree to this view
4739
4770
  changeTree.forEachChild((change, index) => {
4740
4771
  // Do not ADD children that don't have the same tag
4741
- if (metadata && metadata[index].tag !== tag) {
4772
+ if (metadata &&
4773
+ metadata[index].tag !== undefined &&
4774
+ metadata[index].tag !== tag) {
4742
4775
  return;
4743
4776
  }
4744
4777
  this.add(change.ref, tag, false);
@@ -4750,7 +4783,7 @@
4750
4783
  this.items.add(changeTree);
4751
4784
  // add parent's parent
4752
4785
  const parentChangeTree = changeTree.parent?.[$changes];
4753
- if (parentChangeTree && (parentChangeTree.isFiltered || parentChangeTree.isPartiallyFiltered)) {
4786
+ if (parentChangeTree && (parentChangeTree.filteredChanges !== undefined)) {
4754
4787
  this.addParent(parentChangeTree, changeTree.parentIndex, tag);
4755
4788
  }
4756
4789
  // parent is already available, no need to add it!
@@ -1 +1 @@
1
- {"version":3,"file":"Metadata.js","sourceRoot":"","sources":["../src/Metadata.ts"],"names":[],"mappings":"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","sourcesContent":["import { Definition, 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 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}"]}
package/lib/Schema.js CHANGED
@@ -197,7 +197,7 @@ class Schema {
197
197
  const rootChangeTree = ref[symbols_1.$changes];
198
198
  const root = rootChangeTree.root;
199
199
  const changeTrees = new Map();
200
- let totalInstances = 0;
200
+ const instanceRefIds = [];
201
201
  let totalOperations = 0;
202
202
  for (const [refId, changes] of Object.entries(root[changeSetName])) {
203
203
  const changeTree = root.changeTrees[refId];
@@ -218,14 +218,14 @@ class Schema {
218
218
  }
219
219
  }
220
220
  if (includeChangeTree) {
221
- totalInstances += 1;
221
+ instanceRefIds.push(changeTree.refId);
222
222
  totalOperations += Object.keys(changes).length;
223
223
  changeTrees.set(changeTree, parentChangeTrees.reverse());
224
224
  }
225
225
  }
226
226
  output += "---\n";
227
227
  output += `root refId: ${rootChangeTree.refId}\n`;
228
- output += `Total instances: ${totalInstances}\n`;
228
+ output += `Total instances: ${instanceRefIds.length} (refIds: ${instanceRefIds.join(", ")})\n`;
229
229
  output += `Total changes: ${totalOperations}\n`;
230
230
  output += "---\n";
231
231
  // based on root.changes, display a tree of changes that has the "ref" instance as parent
package/lib/Schema.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Schema.js","sourceRoot":"","sources":["../src/Schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { OPERATION } from './encoding/spec';\nimport { DEFAULT_VIEW_TAG, type DefinitionType } from \"./annotations\";\n\nimport { NonFunctionPropNames, ToJSON } from './types/HelperTypes';\n\nimport { ChangeSet, ChangeTree, Ref } from './encoder/ChangeTree';\nimport { $changes, $decoder, $deleteByIndex, $descriptors, $encoder, $filter, $getByIndex, $track } from './types/symbols';\nimport { StateView } from './encoder/StateView';\n\nimport { encodeSchemaOperation } from './encoder/EncodeOperation';\nimport { decodeSchemaOperation } from './decoder/DecodeOperation';\nimport type { Metadata } from './Metadata';\nimport { getIndent } from './utils';\n\n/**\n * Schema encoder / decoder\n */\nexport class Schema {\n static [$encoder] = encodeSchemaOperation;\n static [$decoder] = decodeSchemaOperation;\n\n // public [$changes]: ChangeTree;\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[Symbol.metadata]) === \"object\";\n // const metadata = type[Symbol.metadata];\n // return metadata && Object.prototype.hasOwnProperty.call(metadata, -1);\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[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.items.has(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(...args: any[]) {\n //\n // inline\n // Schema.initialize(this);\n //\n Schema.initialize(this);\n\n //\n // Assign initial values\n //\n if (args[0]) {\n Object.assign(this, args[0]);\n }\n }\n\n public assign(\n props: { [prop in NonFunctionPropNames<this>]?: this[prop] } | ToJSON<this>,\n ) {\n Object.assign(this, props);\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[Symbol.metadata];\n this[$changes].change(\n metadata[metadata[property as string]].index,\n operation\n );\n }\n\n clone (): this {\n const cloned = new ((this as any).constructor);\n const metadata: Metadata = this.constructor[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[metadata[fieldIndex]].name;\n const field = metadata[fieldIndex as any as number].name;\n\n if (\n typeof (this[field]) === \"object\" &&\n typeof (this[field]?.clone) === \"function\"\n ) {\n // deep clone\n cloned[field] = this[field].clone();\n\n } else {\n // primitive values\n cloned[field] = this[field];\n }\n }\n\n return cloned;\n }\n\n toJSON () {\n const obj: unknown = {};\n const metadata = this.constructor[Symbol.metadata];\n for (const index in metadata) {\n const field = metadata[index];\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 as ToJSON<typeof this>;\n }\n\n discardAllChanges() {\n this[$changes].discardAll();\n }\n\n protected [$getByIndex](index: number) {\n const metadata: Metadata = this.constructor[Symbol.metadata];\n return this[metadata[index].name];\n }\n\n protected [$deleteByIndex](index: number) {\n const metadata: Metadata = this.constructor[Symbol.metadata];\n this[metadata[index].name] = undefined;\n }\n\n static debugRefIds(instance: Ref, jsonContents: boolean = true, level: number = 0) {\n const ref = instance;\n const changeTree = ref[$changes];\n\n const contents = (jsonContents) ? ` - ${JSON.stringify(ref.toJSON())}` : \"\";\n\n let output = \"\";\n output += `${getIndent(level)}${ref.constructor.name} (refId: ${ref[$changes].refId})${contents}\\n`;\n\n changeTree.forEachChild((childChangeTree) =>\n output += this.debugRefIds(childChangeTree.ref, jsonContents, level + 1));\n\n return output;\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(instance: Ref, 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} (${changeTree.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 console.log({ index, operation })\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} (${changeTree.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} (${changeTree.refId}) -> .allFilteredChanges:\\n`;\n dumpChangeSet(changeTree.allFilteredChanges);\n }\n\n return output;\n }\n\n static debugChangesDeep(ref: Ref, changeSetName: \"changes\" | \"allChanges\" | \"allFilteredChanges\" | \"filteredChanges\" = \"changes\") {\n let output = \"\";\n\n const rootChangeTree = ref[$changes];\n const root = rootChangeTree.root;\n const changeTrees: Map<ChangeTree, ChangeTree[]> = new Map();\n\n let totalInstances = 0;\n let totalOperations = 0;\n\n for (const [refId, changes] of Object.entries(root[changeSetName])) {\n const changeTree = root.changeTrees[refId];\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 totalInstances += 1;\n totalOperations += Object.keys(changes).length;\n changeTrees.set(changeTree, parentChangeTrees.reverse());\n }\n }\n\n output += \"---\\n\"\n output += `root refId: ${rootChangeTree.refId}\\n`;\n output += `Total instances: ${totalInstances}\\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.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.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"]}
1
+ {"version":3,"file":"Schema.js","sourceRoot":"","sources":["../src/Schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { OPERATION } from './encoding/spec';\nimport { DEFAULT_VIEW_TAG, type DefinitionType } from \"./annotations\";\n\nimport { NonFunctionPropNames, ToJSON } from './types/HelperTypes';\n\nimport { ChangeSet, ChangeTree, Ref } from './encoder/ChangeTree';\nimport { $changes, $decoder, $deleteByIndex, $descriptors, $encoder, $filter, $getByIndex, $track } from './types/symbols';\nimport { StateView } from './encoder/StateView';\n\nimport { encodeSchemaOperation } from './encoder/EncodeOperation';\nimport { decodeSchemaOperation } from './decoder/DecodeOperation';\nimport type { Metadata } from './Metadata';\nimport { getIndent } from './utils';\n\n/**\n * Schema encoder / decoder\n */\nexport class Schema {\n static [$encoder] = encodeSchemaOperation;\n static [$decoder] = decodeSchemaOperation;\n\n // public [$changes]: ChangeTree;\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[Symbol.metadata]) === \"object\";\n // const metadata = type[Symbol.metadata];\n // return metadata && Object.prototype.hasOwnProperty.call(metadata, -1);\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[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.items.has(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(...args: any[]) {\n //\n // inline\n // Schema.initialize(this);\n //\n Schema.initialize(this);\n\n //\n // Assign initial values\n //\n if (args[0]) {\n Object.assign(this, args[0]);\n }\n }\n\n public assign(\n props: { [prop in NonFunctionPropNames<this>]?: this[prop] } | ToJSON<this>,\n ) {\n Object.assign(this, props);\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[Symbol.metadata];\n this[$changes].change(\n metadata[metadata[property as string]].index,\n operation\n );\n }\n\n clone (): this {\n const cloned = new ((this as any).constructor);\n const metadata: Metadata = this.constructor[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[metadata[fieldIndex]].name;\n const field = metadata[fieldIndex as any as number].name;\n\n if (\n typeof (this[field]) === \"object\" &&\n typeof (this[field]?.clone) === \"function\"\n ) {\n // deep clone\n cloned[field] = this[field].clone();\n\n } else {\n // primitive values\n cloned[field] = this[field];\n }\n }\n\n return cloned;\n }\n\n toJSON () {\n const obj: unknown = {};\n const metadata = this.constructor[Symbol.metadata];\n for (const index in metadata) {\n const field = metadata[index];\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 as ToJSON<typeof this>;\n }\n\n discardAllChanges() {\n this[$changes].discardAll();\n }\n\n protected [$getByIndex](index: number) {\n const metadata: Metadata = this.constructor[Symbol.metadata];\n return this[metadata[index].name];\n }\n\n protected [$deleteByIndex](index: number) {\n const metadata: Metadata = this.constructor[Symbol.metadata];\n this[metadata[index].name] = undefined;\n }\n\n static debugRefIds(instance: Ref, jsonContents: boolean = true, level: number = 0) {\n const ref = instance;\n const changeTree = ref[$changes];\n\n const contents = (jsonContents) ? ` - ${JSON.stringify(ref.toJSON())}` : \"\";\n\n let output = \"\";\n output += `${getIndent(level)}${ref.constructor.name} (refId: ${ref[$changes].refId})${contents}\\n`;\n\n changeTree.forEachChild((childChangeTree) =>\n output += this.debugRefIds(childChangeTree.ref, jsonContents, level + 1));\n\n return output;\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(instance: Ref, 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} (${changeTree.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 console.log({ index, operation })\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} (${changeTree.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} (${changeTree.refId}) -> .allFilteredChanges:\\n`;\n dumpChangeSet(changeTree.allFilteredChanges);\n }\n\n return output;\n }\n\n static debugChangesDeep(ref: Ref, changeSetName: \"changes\" | \"allChanges\" | \"allFilteredChanges\" | \"filteredChanges\" = \"changes\") {\n let output = \"\";\n\n const rootChangeTree = 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 for (const [refId, changes] of Object.entries(root[changeSetName])) {\n const changeTree = root.changeTrees[refId];\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.refId);\n totalOperations += Object.keys(changes).length;\n changeTrees.set(changeTree, parentChangeTrees.reverse());\n }\n }\n\n output += \"---\\n\"\n output += `root refId: ${rootChangeTree.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.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.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"]}
@@ -95,6 +95,7 @@ function generateProperty(prop) {
95
95
  langType = typeMaps[prop.type];
96
96
  initializer = typeInitializer[prop.type];
97
97
  }
98
- return `\t@:type(${typeArgs})\n\tpublic var ${prop.name}: ${langType} = ${initializer};\n`;
98
+ // return `\t@:type(${typeArgs})\n\tpublic var ${prop.name}: ${langType} = ${initializer};\n`
99
+ return `\t@:type(${typeArgs})\n\tpublic var ${prop.name}: ${langType};\n`;
99
100
  }
100
101
  //# sourceMappingURL=haxe.js.map