@colyseus/schema 3.0.0-alpha.9 → 3.0.1

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 (202) hide show
  1. package/README.md +148 -62
  2. package/bin/schema-debug +94 -0
  3. package/build/cjs/index.js +2222 -1513
  4. package/build/cjs/index.js.map +1 -1
  5. package/build/esm/index.mjs +2223 -1516
  6. package/build/esm/index.mjs.map +1 -1
  7. package/build/umd/index.js +2225 -1516
  8. package/lib/Metadata.d.ts +21 -9
  9. package/lib/Metadata.js +169 -32
  10. package/lib/Metadata.js.map +1 -1
  11. package/lib/Reflection.d.ts +19 -4
  12. package/lib/Reflection.js +66 -31
  13. package/lib/Reflection.js.map +1 -1
  14. package/lib/Schema.d.ts +12 -5
  15. package/lib/Schema.js +57 -56
  16. package/lib/Schema.js.map +1 -1
  17. package/lib/annotations.d.ts +31 -34
  18. package/lib/annotations.js +110 -160
  19. package/lib/annotations.js.map +1 -1
  20. package/lib/codegen/api.js +1 -2
  21. package/lib/codegen/api.js.map +1 -1
  22. package/lib/codegen/languages/cpp.js +1 -2
  23. package/lib/codegen/languages/cpp.js.map +1 -1
  24. package/lib/codegen/languages/csharp.js +9 -46
  25. package/lib/codegen/languages/csharp.js.map +1 -1
  26. package/lib/codegen/languages/haxe.js +4 -2
  27. package/lib/codegen/languages/haxe.js.map +1 -1
  28. package/lib/codegen/languages/java.js +1 -2
  29. package/lib/codegen/languages/java.js.map +1 -1
  30. package/lib/codegen/languages/js.js +1 -2
  31. package/lib/codegen/languages/js.js.map +1 -1
  32. package/lib/codegen/languages/lua.js +23 -25
  33. package/lib/codegen/languages/lua.js.map +1 -1
  34. package/lib/codegen/languages/ts.js +1 -2
  35. package/lib/codegen/languages/ts.js.map +1 -1
  36. package/lib/codegen/parser.js +85 -3
  37. package/lib/codegen/parser.js.map +1 -1
  38. package/lib/codegen/types.js +6 -3
  39. package/lib/codegen/types.js.map +1 -1
  40. package/lib/decoder/DecodeOperation.d.ts +3 -4
  41. package/lib/decoder/DecodeOperation.js +35 -17
  42. package/lib/decoder/DecodeOperation.js.map +1 -1
  43. package/lib/decoder/Decoder.d.ts +5 -6
  44. package/lib/decoder/Decoder.js +10 -10
  45. package/lib/decoder/Decoder.js.map +1 -1
  46. package/lib/decoder/ReferenceTracker.js +4 -2
  47. package/lib/decoder/ReferenceTracker.js.map +1 -1
  48. package/lib/decoder/strategy/RawChanges.js +1 -2
  49. package/lib/decoder/strategy/RawChanges.js.map +1 -1
  50. package/lib/decoder/strategy/StateCallbacks.d.ts +44 -11
  51. package/lib/decoder/strategy/StateCallbacks.js +74 -64
  52. package/lib/decoder/strategy/StateCallbacks.js.map +1 -1
  53. package/lib/encoder/ChangeTree.d.ts +28 -20
  54. package/lib/encoder/ChangeTree.js +242 -188
  55. package/lib/encoder/ChangeTree.js.map +1 -1
  56. package/lib/encoder/EncodeOperation.d.ts +3 -6
  57. package/lib/encoder/EncodeOperation.js +51 -65
  58. package/lib/encoder/EncodeOperation.js.map +1 -1
  59. package/lib/encoder/Encoder.d.ts +8 -7
  60. package/lib/encoder/Encoder.js +128 -79
  61. package/lib/encoder/Encoder.js.map +1 -1
  62. package/lib/encoder/Root.d.ts +22 -0
  63. package/lib/encoder/Root.js +81 -0
  64. package/lib/encoder/Root.js.map +1 -0
  65. package/lib/encoder/StateView.d.ts +7 -7
  66. package/lib/encoder/StateView.js +72 -74
  67. package/lib/encoder/StateView.js.map +1 -1
  68. package/lib/encoding/assert.d.ts +7 -6
  69. package/lib/encoding/assert.js +13 -5
  70. package/lib/encoding/assert.js.map +1 -1
  71. package/lib/encoding/decode.d.ts +36 -19
  72. package/lib/encoding/decode.js +54 -84
  73. package/lib/encoding/decode.js.map +1 -1
  74. package/lib/encoding/encode.d.ts +36 -18
  75. package/lib/encoding/encode.js +61 -48
  76. package/lib/encoding/encode.js.map +1 -1
  77. package/lib/encoding/spec.d.ts +4 -5
  78. package/lib/encoding/spec.js +1 -2
  79. package/lib/encoding/spec.js.map +1 -1
  80. package/lib/index.d.ts +10 -9
  81. package/lib/index.js +24 -17
  82. package/lib/index.js.map +1 -1
  83. package/lib/types/HelperTypes.d.ts +34 -2
  84. package/lib/types/HelperTypes.js.map +1 -1
  85. package/lib/types/TypeContext.d.ts +29 -0
  86. package/lib/types/TypeContext.js +151 -0
  87. package/lib/types/TypeContext.js.map +1 -0
  88. package/lib/types/custom/ArraySchema.d.ts +2 -2
  89. package/lib/types/custom/ArraySchema.js +33 -22
  90. package/lib/types/custom/ArraySchema.js.map +1 -1
  91. package/lib/types/custom/CollectionSchema.d.ts +2 -2
  92. package/lib/types/custom/CollectionSchema.js +1 -0
  93. package/lib/types/custom/CollectionSchema.js.map +1 -1
  94. package/lib/types/custom/MapSchema.d.ts +18 -16
  95. package/lib/types/custom/MapSchema.js +12 -4
  96. package/lib/types/custom/MapSchema.js.map +1 -1
  97. package/lib/types/custom/SetSchema.d.ts +2 -2
  98. package/lib/types/custom/SetSchema.js +1 -0
  99. package/lib/types/custom/SetSchema.js.map +1 -1
  100. package/lib/types/registry.d.ts +8 -1
  101. package/lib/types/registry.js +23 -6
  102. package/lib/types/registry.js.map +1 -1
  103. package/lib/types/symbols.d.ts +8 -5
  104. package/lib/types/symbols.js +9 -6
  105. package/lib/types/symbols.js.map +1 -1
  106. package/lib/types/utils.js +1 -2
  107. package/lib/types/utils.js.map +1 -1
  108. package/lib/utils.js +9 -7
  109. package/lib/utils.js.map +1 -1
  110. package/package.json +19 -18
  111. package/src/Metadata.ts +190 -42
  112. package/src/Reflection.ts +76 -38
  113. package/src/Schema.ts +72 -70
  114. package/src/annotations.ts +156 -202
  115. package/src/codegen/languages/csharp.ts +8 -47
  116. package/src/codegen/languages/haxe.ts +4 -0
  117. package/src/codegen/languages/lua.ts +19 -27
  118. package/src/codegen/parser.ts +107 -0
  119. package/src/codegen/types.ts +1 -0
  120. package/src/decoder/DecodeOperation.ts +43 -15
  121. package/src/decoder/Decoder.ts +12 -10
  122. package/src/decoder/ReferenceTracker.ts +5 -3
  123. package/src/decoder/strategy/StateCallbacks.ts +152 -81
  124. package/src/encoder/ChangeTree.ts +282 -209
  125. package/src/encoder/EncodeOperation.ts +78 -78
  126. package/src/encoder/Encoder.ts +152 -88
  127. package/src/encoder/Root.ts +93 -0
  128. package/src/encoder/StateView.ts +80 -88
  129. package/src/encoding/assert.ts +17 -8
  130. package/src/encoding/decode.ts +73 -93
  131. package/src/encoding/encode.ts +76 -45
  132. package/src/encoding/spec.ts +3 -5
  133. package/src/index.ts +12 -20
  134. package/src/types/HelperTypes.ts +54 -2
  135. package/src/types/TypeContext.ts +175 -0
  136. package/src/types/custom/ArraySchema.ts +49 -19
  137. package/src/types/custom/CollectionSchema.ts +1 -0
  138. package/src/types/custom/MapSchema.ts +30 -17
  139. package/src/types/custom/SetSchema.ts +1 -0
  140. package/src/types/registry.ts +22 -3
  141. package/src/types/symbols.ts +10 -7
  142. package/src/utils.ts +7 -3
  143. package/lib/Decoder.d.ts +0 -16
  144. package/lib/Decoder.js +0 -182
  145. package/lib/Decoder.js.map +0 -1
  146. package/lib/Encoder.d.ts +0 -13
  147. package/lib/Encoder.js +0 -79
  148. package/lib/Encoder.js.map +0 -1
  149. package/lib/changes/ChangeSet.d.ts +0 -12
  150. package/lib/changes/ChangeSet.js +0 -35
  151. package/lib/changes/ChangeSet.js.map +0 -1
  152. package/lib/changes/ChangeTree.d.ts +0 -53
  153. package/lib/changes/ChangeTree.js +0 -202
  154. package/lib/changes/ChangeTree.js.map +0 -1
  155. package/lib/changes/DecodeOperation.d.ts +0 -15
  156. package/lib/changes/DecodeOperation.js +0 -186
  157. package/lib/changes/DecodeOperation.js.map +0 -1
  158. package/lib/changes/EncodeOperation.d.ts +0 -18
  159. package/lib/changes/EncodeOperation.js +0 -130
  160. package/lib/changes/EncodeOperation.js.map +0 -1
  161. package/lib/changes/ReferenceTracker.d.ts +0 -14
  162. package/lib/changes/ReferenceTracker.js +0 -83
  163. package/lib/changes/ReferenceTracker.js.map +0 -1
  164. package/lib/changes/consts.d.ts +0 -14
  165. package/lib/changes/consts.js +0 -18
  166. package/lib/changes/consts.js.map +0 -1
  167. package/lib/decoding/decode.d.ts +0 -48
  168. package/lib/decoding/decode.js +0 -267
  169. package/lib/decoding/decode.js.map +0 -1
  170. package/lib/ecs.d.ts +0 -11
  171. package/lib/ecs.js +0 -160
  172. package/lib/ecs.js.map +0 -1
  173. package/lib/filters/index.d.ts +0 -8
  174. package/lib/filters/index.js +0 -24
  175. package/lib/filters/index.js.map +0 -1
  176. package/lib/spec.d.ts +0 -13
  177. package/lib/spec.js +0 -42
  178. package/lib/spec.js.map +0 -1
  179. package/lib/types/ArraySchema.d.ts +0 -238
  180. package/lib/types/ArraySchema.js +0 -555
  181. package/lib/types/ArraySchema.js.map +0 -1
  182. package/lib/types/CollectionSchema.d.ts +0 -35
  183. package/lib/types/CollectionSchema.js +0 -150
  184. package/lib/types/CollectionSchema.js.map +0 -1
  185. package/lib/types/MapSchema.d.ts +0 -38
  186. package/lib/types/MapSchema.js +0 -215
  187. package/lib/types/MapSchema.js.map +0 -1
  188. package/lib/types/SetSchema.d.ts +0 -32
  189. package/lib/types/SetSchema.js +0 -162
  190. package/lib/types/SetSchema.js.map +0 -1
  191. package/lib/types/typeRegistry.d.ts +0 -5
  192. package/lib/types/typeRegistry.js +0 -13
  193. package/lib/types/typeRegistry.js.map +0 -1
  194. package/lib/usage.d.ts +0 -1
  195. package/lib/usage.js +0 -22
  196. package/lib/usage.js.map +0 -1
  197. package/lib/v3.d.ts +0 -1
  198. package/lib/v3.js +0 -427
  199. package/lib/v3.js.map +0 -1
  200. package/lib/v3_experiment.d.ts +0 -1
  201. package/lib/v3_experiment.js +0 -407
  202. package/lib/v3_experiment.js.map +0 -1
package/lib/Schema.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { OPERATION } from './encoding/spec';
2
- import { DefinitionType } from "./annotations";
2
+ import { type DefinitionType } from "./annotations";
3
3
  import { NonFunctionPropNames, ToJSON } from './types/HelperTypes';
4
4
  import { ChangeTree, Ref } from './encoder/ChangeTree';
5
5
  import { $decoder, $deleteByIndex, $encoder, $filter, $getByIndex, $track } from './types/symbols';
@@ -7,7 +7,7 @@ import { StateView } from './encoder/StateView';
7
7
  /**
8
8
  * Schema encoder / decoder
9
9
  */
10
- export declare abstract class Schema {
10
+ export declare class Schema {
11
11
  static [$encoder]: import("./encoder/EncodeOperation").EncodeOperation<any>;
12
12
  static [$decoder]: import("./decoder/DecodeOperation").DecodeOperation<any>;
13
13
  /**
@@ -42,11 +42,18 @@ export declare abstract class Schema {
42
42
  */
43
43
  setDirty<K extends NonFunctionPropNames<this>>(property: K | number, operation?: OPERATION): void;
44
44
  clone(): this;
45
- toJSON(): ToJSON<this>;
45
+ toJSON(): ToJSON<typeof this>;
46
46
  discardAllChanges(): void;
47
47
  protected [$getByIndex](index: number): any;
48
48
  protected [$deleteByIndex](index: number): void;
49
- static debugRefIds(instance: Ref, jsonContents?: boolean, level?: number): string;
49
+ /**
50
+ * Inspect the `refId` of all Schema instances in the tree. Optionally display the contents of the instance.
51
+ *
52
+ * @param instance Schema instance
53
+ * @param showContents display JSON contents of the instance
54
+ * @returns
55
+ */
56
+ static debugRefIds(instance: Ref, showContents?: boolean, level?: number): string;
50
57
  /**
51
58
  * Return a string representation of the changes on a Schema instance.
52
59
  * The list of changes is cleared after each encode.
@@ -56,5 +63,5 @@ export declare abstract class Schema {
56
63
  * @returns
57
64
  */
58
65
  static debugChanges(instance: Ref, isEncodeAll?: boolean): string;
59
- static debugChangesDeep(ref: Ref): string;
66
+ static debugChangesDeep(ref: Ref, changeSetName?: "changes" | "allChanges" | "allFilteredChanges" | "filteredChanges"): string;
60
67
  }
package/lib/Schema.js CHANGED
@@ -15,6 +15,7 @@ const utils_1 = require("./utils");
15
15
  class Schema {
16
16
  static { this[_a] = EncodeOperation_1.encodeSchemaOperation; }
17
17
  static { this[_b] = DecodeOperation_1.decodeSchemaOperation; }
18
+ // public [$changes]: ChangeTree;
18
19
  /**
19
20
  * Assign the property descriptors required to track changes on this instance.
20
21
  * @param instance
@@ -25,35 +26,7 @@ class Schema {
25
26
  enumerable: false,
26
27
  writable: true
27
28
  });
28
- const metadata = instance.constructor[Symbol.metadata];
29
- // Define property descriptors
30
- for (const field in metadata) {
31
- if (metadata[field].descriptor) {
32
- // for encoder
33
- Object.defineProperty(instance, `_${field}`, {
34
- value: undefined,
35
- writable: true,
36
- enumerable: false,
37
- configurable: true,
38
- });
39
- Object.defineProperty(instance, field, metadata[field].descriptor);
40
- }
41
- else {
42
- // for decoder
43
- Object.defineProperty(instance, field, {
44
- value: undefined,
45
- writable: true,
46
- enumerable: true,
47
- configurable: true,
48
- });
49
- }
50
- // Object.defineProperty(instance, field, {
51
- // ...instance.constructor[Symbol.metadata][field].descriptor
52
- // });
53
- // if (args[0]?.hasOwnProperty(field)) {
54
- // instance[field] = args[0][field];
55
- // }
56
- }
29
+ Object.defineProperties(instance, instance.constructor[Symbol.metadata]?.[symbols_1.$descriptors] || {});
57
30
  }
58
31
  static is(type) {
59
32
  return typeof (type[Symbol.metadata]) === "object";
@@ -77,7 +50,7 @@ class Schema {
77
50
  */
78
51
  static [symbols_1.$filter](ref, index, view) {
79
52
  const metadata = ref.constructor[Symbol.metadata];
80
- const tag = metadata[metadata[index]].tag;
53
+ const tag = metadata[index]?.tag;
81
54
  if (view === undefined) {
82
55
  // shared pass/encode: encode if doesn't have a tag
83
56
  return tag === undefined;
@@ -98,12 +71,16 @@ class Schema {
98
71
  }
99
72
  // allow inherited classes to have a constructor
100
73
  constructor(...args) {
74
+ //
75
+ // inline
76
+ // Schema.initialize(this);
77
+ //
101
78
  Schema.initialize(this);
102
79
  //
103
80
  // Assign initial values
104
81
  //
105
82
  if (args[0]) {
106
- this.assign(args[0]);
83
+ Object.assign(this, args[0]);
107
84
  }
108
85
  }
109
86
  assign(props) {
@@ -117,7 +94,8 @@ class Schema {
117
94
  * @param operation OPERATION to perform (detected automatically)
118
95
  */
119
96
  setDirty(property, operation) {
120
- this[symbols_1.$changes].change(this.constructor[Symbol.metadata][property].index, operation);
97
+ const metadata = this.constructor[Symbol.metadata];
98
+ this[symbols_1.$changes].change(metadata[metadata[property]].index, operation);
121
99
  }
122
100
  clone() {
123
101
  const cloned = new (this.constructor);
@@ -126,7 +104,9 @@ class Schema {
126
104
  // TODO: clone all properties, not only annotated ones
127
105
  //
128
106
  // for (const field in this) {
129
- for (const field in metadata) {
107
+ for (const fieldIndex in metadata) {
108
+ // const field = metadata[metadata[fieldIndex]].name;
109
+ const field = metadata[fieldIndex].name;
130
110
  if (typeof (this[field]) === "object" &&
131
111
  typeof (this[field]?.clone) === "function") {
132
112
  // deep clone
@@ -140,10 +120,11 @@ class Schema {
140
120
  return cloned;
141
121
  }
142
122
  toJSON() {
143
- const metadata = this.constructor[Symbol.metadata];
144
123
  const obj = {};
145
- for (const fieldName in metadata) {
146
- const field = metadata[fieldName];
124
+ const metadata = this.constructor[Symbol.metadata];
125
+ for (const index in metadata) {
126
+ const field = metadata[index];
127
+ const fieldName = field.name;
147
128
  if (!field.deprecated && this[fieldName] !== null && typeof (this[fieldName]) !== "undefined") {
148
129
  obj[fieldName] = (typeof (this[fieldName]['toJSON']) === "function")
149
130
  ? this[fieldName]['toJSON']()
@@ -156,18 +137,27 @@ class Schema {
156
137
  this[symbols_1.$changes].discardAll();
157
138
  }
158
139
  [symbols_1.$getByIndex](index) {
159
- return this[this.constructor[Symbol.metadata][index]];
140
+ const metadata = this.constructor[Symbol.metadata];
141
+ return this[metadata[index].name];
160
142
  }
161
143
  [symbols_1.$deleteByIndex](index) {
162
- this[this.constructor[Symbol.metadata][index]] = undefined;
144
+ const metadata = this.constructor[Symbol.metadata];
145
+ this[metadata[index].name] = undefined;
163
146
  }
164
- static debugRefIds(instance, jsonContents = true, level = 0) {
147
+ /**
148
+ * Inspect the `refId` of all Schema instances in the tree. Optionally display the contents of the instance.
149
+ *
150
+ * @param instance Schema instance
151
+ * @param showContents display JSON contents of the instance
152
+ * @returns
153
+ */
154
+ static debugRefIds(instance, showContents = false, level = 0) {
165
155
  const ref = instance;
166
156
  const changeTree = ref[symbols_1.$changes];
167
- const contents = (jsonContents) ? ` - ${JSON.stringify(ref.toJSON())}` : "";
157
+ const contents = (showContents) ? ` - ${JSON.stringify(ref.toJSON())}` : "";
168
158
  let output = "";
169
- output += `${(0, utils_1.getIndent)(level)}${ref.constructor.name} (${ref[symbols_1.$changes].refId})${contents}\n`;
170
- changeTree.forEachChild((childChangeTree) => output += this.debugRefIds(childChangeTree.ref, jsonContents, level + 1));
159
+ output += `${(0, utils_1.getIndent)(level)}${ref.constructor.name} (refId: ${ref[symbols_1.$changes].refId})${contents}\n`;
160
+ changeTree.forEachChild((childChangeTree) => output += this.debugRefIds(childChangeTree.ref, showContents, level + 1));
171
161
  return output;
172
162
  }
173
163
  /**
@@ -184,30 +174,40 @@ class Schema {
184
174
  const changeSetName = (isEncodeAll) ? "allChanges" : "changes";
185
175
  let output = `${instance.constructor.name} (${changeTree.refId}) -> .${changeSetName}:\n`;
186
176
  function dumpChangeSet(changeSet) {
187
- Array.from(changeSet)
188
- .sort((a, b) => a[0] - b[0])
189
- .forEach(([index, operation]) => output += `- [${index}]: ${spec_1.OPERATION[operation]} (${JSON.stringify(changeTree.getValue(index, isEncodeAll))})\n`);
177
+ changeSet.operations
178
+ .filter(op => op)
179
+ .forEach((index) => {
180
+ const operation = changeTree.indexedOperations[index];
181
+ console.log({ index, operation });
182
+ output += `- [${index}]: ${spec_1.OPERATION[operation]} (${JSON.stringify(changeTree.getValue(Number(index), isEncodeAll))})\n`;
183
+ });
190
184
  }
191
185
  dumpChangeSet(changeSet);
192
186
  // display filtered changes
193
- if (!isEncodeAll && changeTree.filteredChanges?.size > 0) {
187
+ if (!isEncodeAll &&
188
+ changeTree.filteredChanges &&
189
+ (changeTree.filteredChanges.operations).filter(op => op).length > 0) {
194
190
  output += `${instance.constructor.name} (${changeTree.refId}) -> .filteredChanges:\n`;
195
191
  dumpChangeSet(changeTree.filteredChanges);
196
192
  }
197
193
  // display filtered changes
198
- if (isEncodeAll && changeTree.allFilteredChanges?.size > 0) {
194
+ if (isEncodeAll &&
195
+ changeTree.allFilteredChanges &&
196
+ (changeTree.allFilteredChanges.operations).filter(op => op).length > 0) {
199
197
  output += `${instance.constructor.name} (${changeTree.refId}) -> .allFilteredChanges:\n`;
200
198
  dumpChangeSet(changeTree.allFilteredChanges);
201
199
  }
202
200
  return output;
203
201
  }
204
- static debugChangesDeep(ref) {
202
+ static debugChangesDeep(ref, changeSetName = "changes") {
205
203
  let output = "";
206
204
  const rootChangeTree = ref[symbols_1.$changes];
205
+ const root = rootChangeTree.root;
207
206
  const changeTrees = new Map();
208
- let totalInstances = 0;
207
+ const instanceRefIds = [];
209
208
  let totalOperations = 0;
210
- for (const [changeTree, changes] of (rootChangeTree.root.changes.entries())) {
209
+ for (const [refId, changes] of Object.entries(root[changeSetName])) {
210
+ const changeTree = root.changeTrees[refId];
211
211
  let includeChangeTree = false;
212
212
  let parentChangeTrees = [];
213
213
  let parentChangeTree = changeTree.parent?.[symbols_1.$changes];
@@ -225,14 +225,14 @@ class Schema {
225
225
  }
226
226
  }
227
227
  if (includeChangeTree) {
228
- totalInstances += 1;
229
- totalOperations += changes.size;
228
+ instanceRefIds.push(changeTree.refId);
229
+ totalOperations += Object.keys(changes).length;
230
230
  changeTrees.set(changeTree, parentChangeTrees.reverse());
231
231
  }
232
232
  }
233
233
  output += "---\n";
234
234
  output += `root refId: ${rootChangeTree.refId}\n`;
235
- output += `Total instances: ${totalInstances}\n`;
235
+ output += `Total instances: ${instanceRefIds.length} (refIds: ${instanceRefIds.join(", ")})\n`;
236
236
  output += `Total changes: ${totalOperations}\n`;
237
237
  output += "---\n";
238
238
  // based on root.changes, display a tree of changes that has the "ref" instance as parent
@@ -244,12 +244,13 @@ class Schema {
244
244
  visitedParents.add(parentChangeTree);
245
245
  }
246
246
  });
247
- const changes = changeTree.changes;
247
+ const changes = changeTree.indexedOperations;
248
248
  const level = parentChangeTrees.length;
249
249
  const indent = (0, utils_1.getIndent)(level);
250
250
  const parentIndex = (level > 0) ? `(${changeTree.parentIndex}) ` : "";
251
- output += `${indent}${parentIndex}${changeTree.ref.constructor.name} (refId: ${changeTree.refId}) - changes: ${changes.size}\n`;
252
- for (const [index, operation] of changes) {
251
+ output += `${indent}${parentIndex}${changeTree.ref.constructor.name} (refId: ${changeTree.refId}) - changes: ${Object.keys(changes).length}\n`;
252
+ for (const index in changes) {
253
+ const operation = changes[index];
253
254
  output += `${(0, utils_1.getIndent)(level + 1)}${spec_1.OPERATION[operation]}: ${index}\n`;
254
255
  }
255
256
  }
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, DefinitionType } from \"./annotations\";\n\nimport { NonFunctionPropNames, ToJSON } from './types/HelperTypes';\n\nimport { ChangeTree, Ref } from './encoder/ChangeTree';\nimport { $changes, $decoder, $deleteByIndex, $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 abstract class Schema {\n\n static [$encoder] = encodeSchemaOperation;\n static [$decoder] = decodeSchemaOperation;\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 const metadata = instance.constructor[Symbol.metadata];\n\n // Define property descriptors\n for (const field in metadata) {\n if (metadata[field].descriptor) {\n // for encoder\n Object.defineProperty(instance, `_${field}`, {\n value: undefined,\n writable: true,\n enumerable: false,\n configurable: true,\n });\n Object.defineProperty(instance, field, metadata[field].descriptor);\n\n } else {\n // for decoder\n Object.defineProperty(instance, field, {\n value: undefined,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n\n // Object.defineProperty(instance, field, {\n // ...instance.constructor[Symbol.metadata][field].descriptor\n // });\n // if (args[0]?.hasOwnProperty(field)) {\n // instance[field] = args[0][field];\n // }\n }\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[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 Schema.initialize(this);\n\n //\n // Assign initial values\n //\n if (args[0]) {\n this.assign(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 this[$changes].change(\n this.constructor[Symbol.metadata][property as string].index,\n operation\n );\n }\n\n clone (): this {\n const cloned = new ((this as any).constructor);\n const 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 field in metadata) {\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 return cloned;\n }\n\n toJSON () {\n const metadata = this.constructor[Symbol.metadata];\n\n const obj: unknown = {};\n for (const fieldName in metadata) {\n const field = metadata[fieldName];\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 return this[this.constructor[Symbol.metadata][index]];\n }\n\n protected [$deleteByIndex](index: number) {\n this[this.constructor[Symbol.metadata][index]] = 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} (${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 = 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: Map<number, OPERATION>) {\n Array.from(changeSet)\n .sort((a, b) => a[0] - b[0])\n .forEach(([index, operation]) =>\n output += `- [${index}]: ${OPERATION[operation]} (${JSON.stringify(changeTree.getValue(index, isEncodeAll))})\\n`\n );\n }\n\n dumpChangeSet(changeSet);\n\n // display filtered changes\n if (!isEncodeAll && changeTree.filteredChanges?.size > 0) {\n output += `${instance.constructor.name} (${changeTree.refId}) -> .filteredChanges:\\n`;\n dumpChangeSet(changeTree.filteredChanges);\n }\n\n // display filtered changes\n if (isEncodeAll && changeTree.allFilteredChanges?.size > 0) {\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) {\n let output = \"\";\n\n const rootChangeTree = ref[$changes];\n const changeTrees: Map<ChangeTree, ChangeTree[]> = new Map();\n\n let totalInstances = 0;\n let totalOperations = 0;\n\n for (const [changeTree, changes] of (rootChangeTree.root.changes.entries())) {\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 += changes.size;\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.changes;\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: ${changes.size}\\n`;\n\n for (const [index, operation] of changes) {\n output += `${getIndent(level + 1)}${OPERATION[operation]}: ${index}\\n`;\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 /**\n * Inspect the `refId` of all Schema instances in the tree. Optionally display the contents of the instance.\n *\n * @param instance Schema instance\n * @param showContents display JSON contents of the instance\n * @returns\n */\n static debugRefIds(instance: Ref, showContents: boolean = false, level: number = 0) {\n const ref = instance;\n const changeTree = ref[$changes];\n\n const contents = (showContents) ? ` - ${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, showContents, 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"]}
@@ -1,19 +1,33 @@
1
1
  import "./symbol.shim";
2
2
  import { Schema } from './Schema';
3
- import { Metadata } from "./Metadata";
3
+ import { ArraySchema } from './types/custom/ArraySchema';
4
+ import { MapSchema } from './types/custom/MapSchema';
4
5
  import { TypeDefinition } from "./types/registry";
5
- /**
6
- * Data types
7
- */
8
- export type PrimitiveType = "string" | "number" | "boolean" | "int8" | "uint8" | "int16" | "uint16" | "int32" | "uint32" | "int64" | "uint64" | "float32" | "float64" | typeof Schema | object;
9
- export type DefinitionType = PrimitiveType | PrimitiveType[] | {
10
- array: PrimitiveType;
6
+ import type { DefinedSchemaType, InferValueType } from "./types/HelperTypes";
7
+ import type { CollectionSchema } from "./types/custom/CollectionSchema";
8
+ import type { SetSchema } from "./types/custom/SetSchema";
9
+ export type RawPrimitiveType = "string" | "number" | "boolean" | "int8" | "uint8" | "int16" | "uint16" | "int32" | "uint32" | "int64" | "uint64" | "float32" | "float64" | "bigint64" | "biguint64";
10
+ export type PrimitiveType = RawPrimitiveType | typeof Schema | object;
11
+ export type DefinitionType<T extends PrimitiveType = PrimitiveType> = T | T[] | {
12
+ type: T;
13
+ default?: InferValueType<T>;
14
+ view?: boolean | number;
15
+ } | {
16
+ array: T;
17
+ default?: ArraySchema<InferValueType<T>>;
18
+ view?: boolean | number;
11
19
  } | {
12
- map: PrimitiveType;
20
+ map: T;
21
+ default?: MapSchema<InferValueType<T>>;
22
+ view?: boolean | number;
13
23
  } | {
14
- collection: PrimitiveType;
24
+ collection: T;
25
+ default?: CollectionSchema<InferValueType<T>>;
26
+ view?: boolean | number;
15
27
  } | {
16
- set: PrimitiveType;
28
+ set: T;
29
+ default?: SetSchema<InferValueType<T>>;
30
+ view?: boolean | number;
17
31
  };
18
32
  export type Definition = {
19
33
  [field: string]: DefinitionType;
@@ -22,26 +36,7 @@ export interface TypeOptions {
22
36
  manual?: boolean;
23
37
  }
24
38
  export declare const DEFAULT_VIEW_TAG = -1;
25
- export declare class TypeContext {
26
- types: {
27
- [id: number]: typeof Schema;
28
- };
29
- schemas: Map<typeof Schema, number>;
30
- hasFilters: boolean;
31
- /**
32
- * For inheritance support
33
- * Keeps track of which classes extends which. (parent -> children)
34
- */
35
- static inheritedTypes: Map<typeof Schema, Set<typeof Schema>>;
36
- static register(target: typeof Schema): void;
37
- constructor(rootClass?: typeof Schema);
38
- has(schema: typeof Schema): boolean;
39
- get(typeid: number): typeof Schema;
40
- add(schema: typeof Schema, typeid?: number): boolean;
41
- getTypeId(klass: typeof Schema): number;
42
- private discoverTypes;
43
- }
44
- export declare function entity(constructor: any, context: ClassDecoratorContext): any;
39
+ export declare function entity(constructor: any): any;
45
40
  /**
46
41
  * [See documentation](https://docs.colyseus.io/state/schema/)
47
42
  *
@@ -61,7 +56,7 @@ export declare function entity(constructor: any, context: ClassDecoratorContext)
61
56
  export declare function view<T>(tag?: number): (target: T, fieldName: string) => void;
62
57
  export declare function unreliable<T>(target: T, field: string): void;
63
58
  export declare function type(type: DefinitionType, options?: TypeOptions): PropertyDecorator;
64
- export declare function getPropertyDescriptor(fieldCached: string, fieldIndex: number, type: DefinitionType, complexTypeKlass: TypeDefinition, metadata: Metadata, field: string): {
59
+ export declare function getPropertyDescriptor(fieldCached: string, fieldIndex: number, type: DefinitionType, complexTypeKlass: TypeDefinition): {
65
60
  get: () => any;
66
61
  set: (this: Schema, value: any) => void;
67
62
  enumerable: boolean;
@@ -72,6 +67,8 @@ export declare function getPropertyDescriptor(fieldCached: string, fieldIndex: n
72
67
  * The previous `@type()` annotation should remain along with this one.
73
68
  */
74
69
  export declare function deprecated(throws?: boolean): PropertyDecorator;
75
- export declare function defineTypes(target: typeof Schema, fields: {
76
- [property: string]: DefinitionType;
77
- }, options?: TypeOptions): typeof Schema;
70
+ export declare function defineTypes(target: typeof Schema, fields: Definition, options?: TypeOptions): typeof Schema;
71
+ export interface SchemaWithExtends<T extends Definition, P extends typeof Schema> extends DefinedSchemaType<T, P> {
72
+ extends: <T2 extends Definition>(fields: T2, name?: string) => SchemaWithExtends<T & T2, typeof this>;
73
+ }
74
+ export declare function schema<T extends Definition, P extends typeof Schema = typeof Schema>(fields: T, name?: string, inherits?: P): SchemaWithExtends<T, P>;