@colyseus/schema 2.0.4 → 2.0.6

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 (107) hide show
  1. package/README.md +0 -4
  2. package/build/cjs/index.js +48 -48
  3. package/build/cjs/index.js.map +1 -1
  4. package/build/esm/index.mjs +130 -104
  5. package/build/esm/index.mjs.map +1 -1
  6. package/build/umd/index.js +50 -50
  7. package/lib/Reflection.js +87 -119
  8. package/lib/Reflection.js.map +1 -1
  9. package/lib/Schema.js +195 -257
  10. package/lib/Schema.js.map +1 -1
  11. package/lib/annotations.d.ts +6 -6
  12. package/lib/annotations.js +64 -92
  13. package/lib/annotations.js.map +1 -1
  14. package/lib/changes/ChangeTree.d.ts +1 -1
  15. package/lib/changes/ChangeTree.js +63 -70
  16. package/lib/changes/ChangeTree.js.map +1 -1
  17. package/lib/changes/ReferenceTracker.js +24 -27
  18. package/lib/changes/ReferenceTracker.js.map +1 -1
  19. package/lib/codegen/api.js +9 -9
  20. package/lib/codegen/api.js.map +1 -1
  21. package/lib/codegen/argv.d.ts +1 -1
  22. package/lib/codegen/argv.js +11 -11
  23. package/lib/codegen/argv.js.map +1 -1
  24. package/lib/codegen/cli.js +21 -10
  25. package/lib/codegen/cli.js.map +1 -1
  26. package/lib/codegen/languages/cpp.js +126 -77
  27. package/lib/codegen/languages/cpp.js.map +1 -1
  28. package/lib/codegen/languages/csharp.js +121 -62
  29. package/lib/codegen/languages/csharp.js.map +1 -1
  30. package/lib/codegen/languages/haxe.js +34 -26
  31. package/lib/codegen/languages/haxe.js.map +1 -1
  32. package/lib/codegen/languages/java.js +39 -27
  33. package/lib/codegen/languages/java.js.map +1 -1
  34. package/lib/codegen/languages/js.js +48 -32
  35. package/lib/codegen/languages/js.js.map +1 -1
  36. package/lib/codegen/languages/lua.js +35 -24
  37. package/lib/codegen/languages/lua.js.map +1 -1
  38. package/lib/codegen/languages/ts.js +63 -68
  39. package/lib/codegen/languages/ts.js.map +1 -1
  40. package/lib/codegen/parser.d.ts +9 -1
  41. package/lib/codegen/parser.js +88 -46
  42. package/lib/codegen/parser.js.map +1 -1
  43. package/lib/codegen/types.d.ts +8 -0
  44. package/lib/codegen/types.js +64 -54
  45. package/lib/codegen/types.js.map +1 -1
  46. package/lib/encoding/decode.js +15 -15
  47. package/lib/encoding/decode.js.map +1 -1
  48. package/lib/encoding/encode.js +14 -14
  49. package/lib/encoding/encode.js.map +1 -1
  50. package/lib/events/EventEmitter.d.ts +1 -1
  51. package/lib/events/EventEmitter.js +16 -47
  52. package/lib/events/EventEmitter.js.map +1 -1
  53. package/lib/filters/index.js +7 -8
  54. package/lib/filters/index.js.map +1 -1
  55. package/lib/index.js +11 -11
  56. package/lib/index.js.map +1 -1
  57. package/lib/types/ArraySchema.d.ts +1 -1
  58. package/lib/types/ArraySchema.js +161 -219
  59. package/lib/types/ArraySchema.js.map +1 -1
  60. package/lib/types/CollectionSchema.d.ts +1 -1
  61. package/lib/types/CollectionSchema.js +63 -71
  62. package/lib/types/CollectionSchema.js.map +1 -1
  63. package/lib/types/HelperTypes.d.ts +9 -9
  64. package/lib/types/MapSchema.d.ts +16 -16
  65. package/lib/types/MapSchema.js +68 -78
  66. package/lib/types/MapSchema.js.map +1 -1
  67. package/lib/types/SetSchema.js +62 -71
  68. package/lib/types/SetSchema.js.map +1 -1
  69. package/lib/types/index.js +1 -1
  70. package/lib/types/index.js.map +1 -1
  71. package/lib/types/typeRegistry.js +1 -1
  72. package/lib/types/typeRegistry.js.map +1 -1
  73. package/lib/types/utils.js +9 -10
  74. package/lib/types/utils.js.map +1 -1
  75. package/lib/utils.js +10 -13
  76. package/lib/utils.js.map +1 -1
  77. package/package.json +18 -15
  78. package/src/Reflection.ts +159 -0
  79. package/src/Schema.ts +1024 -0
  80. package/src/annotations.ts +400 -0
  81. package/src/changes/ChangeTree.ts +295 -0
  82. package/src/changes/ReferenceTracker.ts +81 -0
  83. package/src/codegen/api.ts +46 -0
  84. package/src/codegen/argv.ts +40 -0
  85. package/src/codegen/cli.ts +65 -0
  86. package/src/codegen/languages/cpp.ts +297 -0
  87. package/src/codegen/languages/csharp.ts +208 -0
  88. package/src/codegen/languages/haxe.ts +110 -0
  89. package/src/codegen/languages/java.ts +115 -0
  90. package/src/codegen/languages/js.ts +115 -0
  91. package/src/codegen/languages/lua.ts +125 -0
  92. package/src/codegen/languages/ts.ts +129 -0
  93. package/src/codegen/parser.ts +299 -0
  94. package/src/codegen/types.ts +177 -0
  95. package/src/encoding/decode.ts +278 -0
  96. package/src/encoding/encode.ts +283 -0
  97. package/src/filters/index.ts +23 -0
  98. package/src/index.ts +59 -0
  99. package/src/spec.ts +49 -0
  100. package/src/types/ArraySchema.ts +612 -0
  101. package/src/types/CollectionSchema.ts +199 -0
  102. package/src/types/HelperTypes.ts +34 -0
  103. package/src/types/MapSchema.ts +268 -0
  104. package/src/types/SetSchema.ts +208 -0
  105. package/src/types/typeRegistry.ts +19 -0
  106. package/src/types/utils.ts +62 -0
  107. package/src/utils.ts +28 -0
@@ -1,33 +1,12 @@
1
1
  "use strict";
2
- var __read = (this && this.__read) || function (o, n) {
3
- var m = typeof Symbol === "function" && o[Symbol.iterator];
4
- if (!m) return o;
5
- var i = m.call(o), r, ar = [], e;
6
- try {
7
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
8
- }
9
- catch (error) { e = { error: error }; }
10
- finally {
11
- try {
12
- if (r && !r.done && (m = i["return"])) m.call(i);
13
- }
14
- finally { if (e) throw e.error; }
15
- }
16
- return ar;
17
- };
18
- var __spreadArray = (this && this.__spreadArray) || function (to, from) {
19
- for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
20
- to[j] = from[i];
21
- return to;
22
- };
23
2
  Object.defineProperty(exports, "__esModule", { value: true });
24
3
  exports.defineTypes = exports.deprecated = exports.filterChildren = exports.filter = exports.type = exports.globalContext = exports.Context = exports.hasFilter = exports.SchemaDefinition = void 0;
25
- var Schema_1 = require("./Schema");
26
- var ArraySchema_1 = require("./types/ArraySchema");
27
- var MapSchema_1 = require("./types/MapSchema");
28
- var typeRegistry_1 = require("./types/typeRegistry");
29
- var SchemaDefinition = /** @class */ (function () {
30
- function SchemaDefinition() {
4
+ const Schema_1 = require("./Schema");
5
+ const ArraySchema_1 = require("./types/ArraySchema");
6
+ const MapSchema_1 = require("./types/MapSchema");
7
+ const typeRegistry_1 = require("./types/typeRegistry");
8
+ class SchemaDefinition {
9
+ constructor() {
31
10
  //
32
11
  // TODO: use a "field" structure combining all these properties per-field.
33
12
  //
@@ -36,8 +15,8 @@ var SchemaDefinition = /** @class */ (function () {
36
15
  this.deprecated = {};
37
16
  this.descriptors = {};
38
17
  }
39
- SchemaDefinition.create = function (parent) {
40
- var definition = new SchemaDefinition();
18
+ static create(parent) {
19
+ const definition = new SchemaDefinition();
41
20
  // support inheritance
42
21
  definition.schema = Object.assign({}, parent && parent.schema || {});
43
22
  definition.indexes = Object.assign({}, parent && parent.indexes || {});
@@ -45,19 +24,19 @@ var SchemaDefinition = /** @class */ (function () {
45
24
  definition.descriptors = Object.assign({}, parent && parent.descriptors || {});
46
25
  definition.deprecated = Object.assign({}, parent && parent.deprecated || {});
47
26
  return definition;
48
- };
49
- SchemaDefinition.prototype.addField = function (field, type) {
50
- var index = this.getNextFieldIndex();
27
+ }
28
+ addField(field, type) {
29
+ const index = this.getNextFieldIndex();
51
30
  this.fieldsByIndex[index] = field;
52
31
  this.indexes[field] = index;
53
32
  this.schema[field] = (Array.isArray(type))
54
33
  ? { array: type[0] }
55
34
  : type;
56
- };
57
- SchemaDefinition.prototype.hasField = function (field) {
35
+ }
36
+ hasField(field) {
58
37
  return this.indexes[field] !== undefined;
59
- };
60
- SchemaDefinition.prototype.addFilter = function (field, cb) {
38
+ }
39
+ addFilter(field, cb) {
61
40
  if (!this.filters) {
62
41
  this.filters = {};
63
42
  this.indexesWithFilters = [];
@@ -65,11 +44,11 @@ var SchemaDefinition = /** @class */ (function () {
65
44
  this.filters[this.indexes[field]] = cb;
66
45
  this.indexesWithFilters.push(this.indexes[field]);
67
46
  return true;
68
- };
69
- SchemaDefinition.prototype.addChildrenFilter = function (field, cb) {
70
- var index = this.indexes[field];
71
- var type = this.schema[field];
72
- if (typeRegistry_1.getType(Object.keys(type)[0])) {
47
+ }
48
+ addChildrenFilter(field, cb) {
49
+ const index = this.indexes[field];
50
+ const type = this.schema[field];
51
+ if ((0, typeRegistry_1.getType)(Object.keys(type)[0])) {
73
52
  if (!this.childFilters) {
74
53
  this.childFilters = {};
75
54
  }
@@ -77,54 +56,50 @@ var SchemaDefinition = /** @class */ (function () {
77
56
  return true;
78
57
  }
79
58
  else {
80
- console.warn("@filterChildren: field '" + field + "' can't have children. Ignoring filter.");
59
+ console.warn(`@filterChildren: field '${field}' can't have children. Ignoring filter.`);
81
60
  }
82
- };
83
- SchemaDefinition.prototype.getChildrenFilter = function (field) {
61
+ }
62
+ getChildrenFilter(field) {
84
63
  return this.childFilters && this.childFilters[this.indexes[field]];
85
- };
86
- SchemaDefinition.prototype.getNextFieldIndex = function () {
64
+ }
65
+ getNextFieldIndex() {
87
66
  return Object.keys(this.schema || {}).length;
88
- };
89
- return SchemaDefinition;
90
- }());
67
+ }
68
+ }
91
69
  exports.SchemaDefinition = SchemaDefinition;
92
70
  function hasFilter(klass) {
93
71
  return klass._context && klass._context.useFilters;
94
72
  }
95
73
  exports.hasFilter = hasFilter;
96
- var Context = /** @class */ (function () {
97
- function Context() {
74
+ class Context {
75
+ constructor() {
98
76
  this.types = {};
99
77
  this.schemas = new Map();
100
78
  this.useFilters = false;
101
79
  }
102
- Context.prototype.has = function (schema) {
80
+ has(schema) {
103
81
  return this.schemas.has(schema);
104
- };
105
- Context.prototype.get = function (typeid) {
82
+ }
83
+ get(typeid) {
106
84
  return this.types[typeid];
107
- };
108
- Context.prototype.add = function (schema, typeid) {
109
- if (typeid === void 0) { typeid = this.schemas.size; }
85
+ }
86
+ add(schema, typeid = this.schemas.size) {
110
87
  // FIXME: move this to somewhere else?
111
88
  // support inheritance
112
89
  schema._definition = SchemaDefinition.create(schema._definition);
113
90
  schema._typeid = typeid;
114
91
  this.types[typeid] = schema;
115
92
  this.schemas.set(schema, typeid);
116
- };
117
- Context.create = function (options) {
118
- if (options === void 0) { options = {}; }
93
+ }
94
+ static create(options = {}) {
119
95
  return function (definition) {
120
96
  if (!options.context) {
121
97
  options.context = new Context();
122
98
  }
123
99
  return type(definition, options);
124
100
  };
125
- };
126
- return Context;
127
- }());
101
+ }
102
+ }
128
103
  exports.Context = Context;
129
104
  exports.globalContext = new Context();
130
105
  /**
@@ -143,14 +118,13 @@ exports.globalContext = new Context();
143
118
  * \@type("string", { manual: true })
144
119
  * ```
145
120
  */
146
- function type(type, options) {
147
- if (options === void 0) { options = {}; }
121
+ function type(type, options = {}) {
148
122
  return function (target, field) {
149
- var context = options.context || exports.globalContext;
150
- var constructor = target.constructor;
123
+ const context = options.context || exports.globalContext;
124
+ const constructor = target.constructor;
151
125
  constructor._context = context;
152
126
  if (!type) {
153
- throw new Error(constructor.name + ": @type() reference provided for \"" + field + "\" is undefined. Make sure you don't have any circular dependencies.");
127
+ throw new Error(`${constructor.name}: @type() reference provided for "${field}" is undefined. Make sure you don't have any circular dependencies.`);
154
128
  }
155
129
  /*
156
130
  * static schema
@@ -158,7 +132,7 @@ function type(type, options) {
158
132
  if (!context.has(constructor)) {
159
133
  context.add(constructor);
160
134
  }
161
- var definition = constructor._definition;
135
+ const definition = constructor._definition;
162
136
  definition.addField(field, type);
163
137
  /**
164
138
  * skip if descriptor already exists for this field (`@deprecated()`)
@@ -172,21 +146,21 @@ function type(type, options) {
172
146
  // trying to define same property multiple times across inheritance.
173
147
  // https://github.com/colyseus/colyseus-unity3d/issues/131#issuecomment-814308572
174
148
  try {
175
- throw new Error("@colyseus/schema: Duplicate '" + field + "' definition on '" + constructor.name + "'.\nCheck @type() annotation");
149
+ throw new Error(`@colyseus/schema: Duplicate '${field}' definition on '${constructor.name}'.\nCheck @type() annotation`);
176
150
  }
177
151
  catch (e) {
178
- var definitionAtLine = e.stack.split("\n")[4].trim();
179
- throw new Error(e.message + " " + definitionAtLine);
152
+ const definitionAtLine = e.stack.split("\n")[4].trim();
153
+ throw new Error(`${e.message} ${definitionAtLine}`);
180
154
  }
181
155
  }
182
156
  }
183
- var isArray = ArraySchema_1.ArraySchema.is(type);
184
- var isMap = !isArray && MapSchema_1.MapSchema.is(type);
157
+ const isArray = ArraySchema_1.ArraySchema.is(type);
158
+ const isMap = !isArray && MapSchema_1.MapSchema.is(type);
185
159
  // TODO: refactor me.
186
160
  // Allow abstract intermediary classes with no fields to be serialized
187
161
  // (See "should support an inheritance with a Schema type without fields" test)
188
162
  if (typeof (type) !== "string" && !Schema_1.Schema.is(type)) {
189
- var childType = Object.values(type)[0];
163
+ const childType = Object.values(type)[0];
190
164
  if (typeof (childType) !== "string" && !context.has(childType)) {
191
165
  context.add(childType);
192
166
  }
@@ -200,7 +174,7 @@ function type(type, options) {
200
174
  };
201
175
  return;
202
176
  }
203
- var fieldCached = "_" + field;
177
+ const fieldCached = `_${field}`;
204
178
  definition.descriptors[fieldCached] = {
205
179
  enumerable: false,
206
180
  configurable: false,
@@ -222,7 +196,7 @@ function type(type, options) {
222
196
  value !== null) {
223
197
  // automaticallty transform Array into ArraySchema
224
198
  if (isArray && !(value instanceof ArraySchema_1.ArraySchema)) {
225
- value = new (ArraySchema_1.ArraySchema.bind.apply(ArraySchema_1.ArraySchema, __spreadArray([void 0], __read(value))))();
199
+ value = new ArraySchema_1.ArraySchema(...value);
226
200
  }
227
201
  // automaticallty transform Map into MapSchema
228
202
  if (isMap && !(value instanceof MapSchema_1.MapSchema)) {
@@ -231,10 +205,10 @@ function type(type, options) {
231
205
  // try to turn provided structure into a Proxy
232
206
  if (value['$proxy'] === undefined) {
233
207
  if (isMap) {
234
- value = MapSchema_1.getMapProxy(value);
208
+ value = (0, MapSchema_1.getMapProxy)(value);
235
209
  }
236
210
  else if (isArray) {
237
- value = ArraySchema_1.getArrayProxy(value);
211
+ value = (0, ArraySchema_1.getArrayProxy)(value);
238
212
  }
239
213
  }
240
214
  // flag the change for encoding.
@@ -247,7 +221,7 @@ function type(type, options) {
247
221
  value['$changes'].setParent(this, this.$changes.root, this._definition.indexes[field]);
248
222
  }
249
223
  }
250
- else {
224
+ else if (this[fieldCached]) {
251
225
  //
252
226
  // Setting a field to `null` or `undefined` will delete it.
253
227
  //
@@ -266,8 +240,8 @@ exports.type = type;
266
240
  */
267
241
  function filter(cb) {
268
242
  return function (target, field) {
269
- var constructor = target.constructor;
270
- var definition = constructor._definition;
243
+ const constructor = target.constructor;
244
+ const definition = constructor._definition;
271
245
  if (definition.addFilter(field, cb)) {
272
246
  constructor._context.useFilters = true;
273
247
  }
@@ -276,8 +250,8 @@ function filter(cb) {
276
250
  exports.filter = filter;
277
251
  function filterChildren(cb) {
278
252
  return function (target, field) {
279
- var constructor = target.constructor;
280
- var definition = constructor._definition;
253
+ const constructor = target.constructor;
254
+ const definition = constructor._definition;
281
255
  if (definition.addChildrenFilter(field, cb)) {
282
256
  constructor._context.useFilters = true;
283
257
  }
@@ -288,15 +262,14 @@ exports.filterChildren = filterChildren;
288
262
  * `@deprecated()` flag a field as deprecated.
289
263
  * The previous `@type()` annotation should remain along with this one.
290
264
  */
291
- function deprecated(throws) {
292
- if (throws === void 0) { throws = true; }
265
+ function deprecated(throws = true) {
293
266
  return function (target, field) {
294
- var constructor = target.constructor;
295
- var definition = constructor._definition;
267
+ const constructor = target.constructor;
268
+ const definition = constructor._definition;
296
269
  definition.deprecated[field] = true;
297
270
  if (throws) {
298
271
  definition.descriptors[field] = {
299
- get: function () { throw new Error(field + " is deprecated."); },
272
+ get: function () { throw new Error(`${field} is deprecated.`); },
300
273
  set: function (value) { },
301
274
  enumerable: false,
302
275
  configurable: true
@@ -305,12 +278,11 @@ function deprecated(throws) {
305
278
  };
306
279
  }
307
280
  exports.deprecated = deprecated;
308
- function defineTypes(target, fields, options) {
309
- if (options === void 0) { options = {}; }
281
+ function defineTypes(target, fields, options = {}) {
310
282
  if (!options.context) {
311
283
  options.context = target._context || options.context || exports.globalContext;
312
284
  }
313
- for (var field in fields) {
285
+ for (let field in fields) {
314
286
  type(fields[field], options)(target.prototype, field);
315
287
  }
316
288
  return target;
@@ -1 +1 @@
1
- {"version":3,"file":"annotations.js","sourceRoot":"","sources":["../src/annotations.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeTree } from './changes/ChangeTree';\nimport { Schema } from './Schema';\nimport { ArraySchema, getArrayProxy } from './types/ArraySchema';\nimport { MapSchema, getMapProxy } from './types/MapSchema';\nimport { getType } from './types/typeRegistry';\n\n/**\n * Data types\n */\nexport type PrimitiveType =\n \"string\" |\n \"number\" |\n \"boolean\" |\n \"int8\" |\n \"uint8\" |\n \"int16\" |\n \"uint16\" |\n \"int32\" |\n \"uint32\" |\n \"int64\" |\n \"uint64\" |\n \"float32\" |\n \"float64\" |\n typeof Schema;\n\nexport type DefinitionType = PrimitiveType\n | PrimitiveType[]\n | { array: PrimitiveType }\n | { map: PrimitiveType }\n | { collection: PrimitiveType }\n | { set: PrimitiveType };\n\nexport type Definition = { [field: string]: DefinitionType };\nexport type FilterCallback<\n T extends Schema = any,\n V = any,\n R extends Schema = any\n> = (\n ((this: T, client: ClientWithSessionId, value: V) => boolean) |\n ((this: T, client: ClientWithSessionId, value: V, root: R) => boolean)\n);\n\nexport type FilterChildrenCallback<\n T extends Schema = any,\n K = any,\n V = any,\n R extends Schema = any\n> = (\n ((this: T, client: ClientWithSessionId, key: K, value: V) => boolean) |\n ((this: T, client: ClientWithSessionId, key: K, value: V, root: R) => boolean)\n)\n\nexport class SchemaDefinition {\n schema: Definition;\n\n //\n // TODO: use a \"field\" structure combining all these properties per-field.\n //\n\n indexes: { [field: string]: number } = {};\n fieldsByIndex: { [index: number]: string } = {};\n\n filters: { [field: string]: FilterCallback };\n indexesWithFilters: number[];\n childFilters: { [field: string]: FilterChildrenCallback }; // childFilters are used on Map, Array, Set items.\n\n deprecated: { [field: string]: boolean } = {};\n descriptors: PropertyDescriptorMap & ThisType<any> = {};\n\n static create(parent?: SchemaDefinition) {\n const definition = new SchemaDefinition();\n\n // support inheritance\n definition.schema = Object.assign({}, parent && parent.schema || {});\n definition.indexes = Object.assign({}, parent && parent.indexes || {});\n definition.fieldsByIndex = Object.assign({}, parent && parent.fieldsByIndex || {});\n definition.descriptors = Object.assign({}, parent && parent.descriptors || {});\n definition.deprecated = Object.assign({}, parent && parent.deprecated || {});\n\n return definition;\n }\n\n addField(field: string, type: DefinitionType) {\n const index = this.getNextFieldIndex();\n this.fieldsByIndex[index] = field;\n this.indexes[field] = index;\n this.schema[field] = (Array.isArray(type))\n ? { array: type[0] }\n : type;\n }\n\n hasField(field: string) {\n return this.indexes[field] !== undefined;\n }\n\n addFilter(field: string, cb: FilterCallback) {\n if (!this.filters) {\n this.filters = {};\n this.indexesWithFilters = [];\n }\n this.filters[this.indexes[field]] = cb;\n this.indexesWithFilters.push(this.indexes[field]);\n return true;\n }\n\n addChildrenFilter(field: string, cb: FilterChildrenCallback) {\n const index = this.indexes[field];\n const type = this.schema[field];\n\n if (getType(Object.keys(type)[0])) {\n if (!this.childFilters) { this.childFilters = {}; }\n\n this.childFilters[index] = cb;\n return true;\n\n } else {\n console.warn(`@filterChildren: field '${field}' can't have children. Ignoring filter.`);\n }\n }\n\n getChildrenFilter(field: string) {\n return this.childFilters && this.childFilters[this.indexes[field]];\n }\n\n getNextFieldIndex() {\n return Object.keys(this.schema || {}).length;\n }\n}\n\nexport function hasFilter(klass: typeof Schema) {\n return klass._context && klass._context.useFilters;\n}\n\n// Colyseus integration\nexport type ClientWithSessionId = { sessionId: string } & any;\n\nexport interface TypeOptions {\n manual?: boolean,\n context?: Context,\n}\n\nexport class Context {\n types: {[id: number]: typeof Schema} = {};\n schemas = new Map<typeof Schema, number>();\n useFilters = false;\n\n has(schema: typeof Schema) {\n return this.schemas.has(schema);\n }\n\n get(typeid: number) {\n return this.types[typeid];\n }\n\n add(schema: typeof Schema, typeid: number = this.schemas.size) {\n // FIXME: move this to somewhere else?\n // support inheritance\n schema._definition = SchemaDefinition.create(schema._definition);\n\n schema._typeid = typeid;\n this.types[typeid] = schema;\n this.schemas.set(schema, typeid);\n }\n\n\n static create(options: TypeOptions = {}) {\n return function (definition: DefinitionType) {\n if (!options.context) {\n options.context = new Context();\n }\n return type(definition, options);\n }\n }\n}\n\nexport const globalContext = new Context();\n\n/**\n * [See documentation](https://docs.colyseus.io/state/schema/)\n *\n * Annotate a Schema property to be serializeable.\n * \\@type()'d fields are automatically flagged as \"dirty\" for the next patch.\n *\n * @example Standard usage, with automatic change tracking.\n * ```\n * \\@type(\"string\") propertyName: string;\n * ```\n *\n * @example You can provide the \"manual\" option if you'd like to manually control your patches via .setDirty().\n * ```\n * \\@type(\"string\", { manual: true })\n * ```\n */\nexport function type (\n type: DefinitionType,\n options: TypeOptions = {}\n): PropertyDecorator {\n return function (target: typeof Schema, field: string) {\n const context = options.context || globalContext;\n const constructor = target.constructor as typeof Schema;\n constructor._context = context;\n\n if (!type) {\n throw new Error(`${constructor.name}: @type() reference provided for \"${field}\" is undefined. Make sure you don't have any circular dependencies.`);\n }\n\n /*\n * static schema\n */\n if (!context.has(constructor)) {\n context.add(constructor);\n }\n\n const definition = constructor._definition;\n definition.addField(field, type);\n\n /**\n * skip if descriptor already exists for this field (`@deprecated()`)\n */\n if (definition.descriptors[field]) {\n if (definition.deprecated[field]) {\n // do not create accessors for deprecated properties.\n return;\n\n } else {\n // trying to define same property multiple times across inheritance.\n // https://github.com/colyseus/colyseus-unity3d/issues/131#issuecomment-814308572\n try {\n throw new Error(`@colyseus/schema: Duplicate '${field}' definition on '${constructor.name}'.\\nCheck @type() annotation`);\n\n } catch (e) {\n const definitionAtLine = e.stack.split(\"\\n\")[4].trim();\n throw new Error(`${e.message} ${definitionAtLine}`);\n }\n }\n }\n\n const isArray = ArraySchema.is(type);\n const isMap = !isArray && MapSchema.is(type);\n\n // TODO: refactor me.\n // Allow abstract intermediary classes with no fields to be serialized\n // (See \"should support an inheritance with a Schema type without fields\" test)\n if (typeof (type) !== \"string\" && !Schema.is(type)) {\n const childType = Object.values(type)[0];\n if (typeof (childType) !== \"string\" && !context.has(childType)) {\n context.add(childType);\n }\n }\n\n if (options.manual) {\n // do not declare getter/setter descriptor\n definition.descriptors[field] = {\n enumerable: true,\n configurable: true,\n writable: true,\n };\n return;\n }\n\n const fieldCached = `_${field}`;\n definition.descriptors[fieldCached] = {\n enumerable: false,\n configurable: false,\n writable: true,\n };\n\n definition.descriptors[field] = {\n get: function () {\n return this[fieldCached];\n },\n\n set: function (this: Schema, value: any) {\n /**\n * Create Proxy for array or map items\n */\n\n // skip if value is the same as cached.\n if (value === this[fieldCached]) {\n return;\n }\n\n if (\n value !== undefined &&\n value !== null\n ) {\n // automaticallty transform Array into ArraySchema\n if (isArray && !(value instanceof ArraySchema)) {\n value = new ArraySchema(...value);\n }\n\n // automaticallty transform Map into MapSchema\n if (isMap && !(value instanceof MapSchema)) {\n value = new MapSchema(value);\n }\n\n // try to turn provided structure into a Proxy\n if (value['$proxy'] === undefined) {\n if (isMap) {\n value = getMapProxy(value);\n\n } else if (isArray) {\n value = getArrayProxy(value);\n }\n }\n\n // flag the change for encoding.\n this.$changes.change(field);\n\n //\n // call setParent() recursively for this and its child\n // structures.\n //\n if (value['$changes']) {\n (value['$changes'] as ChangeTree).setParent(\n this,\n this.$changes.root,\n this._definition.indexes[field],\n );\n }\n\n } else {\n //\n // Setting a field to `null` or `undefined` will delete it.\n //\n this.$changes.delete(field);\n }\n\n this[fieldCached] = value;\n },\n\n enumerable: true,\n configurable: true\n };\n }\n}\n\n/**\n * `@filter()` decorator for defining data filters per client\n */\n\nexport function filter<T extends Schema, V, R extends Schema>(cb: FilterCallback<T, V, R>): PropertyDecorator {\n return function (target: any, field: string) {\n const constructor = target.constructor as typeof Schema;\n const definition = constructor._definition;\n\n if (definition.addFilter(field, cb)) {\n constructor._context.useFilters = true;\n }\n }\n}\n\nexport function filterChildren<T extends Schema, K, V, R extends Schema>(cb: FilterChildrenCallback<T, K, V, R>): PropertyDecorator {\n return function (target: any, field: string) {\n const constructor = target.constructor as typeof Schema;\n const definition = constructor._definition;\n if (definition.addChildrenFilter(field, cb)) {\n constructor._context.useFilters = true;\n }\n }\n}\n\n\n/**\n * `@deprecated()` flag a field as deprecated.\n * The previous `@type()` annotation should remain along with this one.\n */\n\nexport function deprecated(throws: boolean = true): PropertyDecorator {\n return function (target: typeof Schema, field: string) {\n const constructor = target.constructor as typeof Schema;\n const definition = constructor._definition;\n\n definition.deprecated[field] = true;\n\n if (throws) {\n definition.descriptors[field] = {\n get: function () { throw new Error(`${field} is deprecated.`); },\n set: function (this: Schema, value: any) { /* throw new Error(`${field} is deprecated.`); */ },\n enumerable: false,\n configurable: true\n };\n }\n }\n}\n\nexport function defineTypes(\n target: typeof Schema,\n fields: { [property: string]: DefinitionType },\n options: TypeOptions = {}\n) {\n if (!options.context) {\n options.context = target._context || options.context || globalContext;\n }\n\n for (let field in fields) {\n type(fields[field], options)(target.prototype, field);\n }\n return target;\n}\n"]}
1
+ {"version":3,"file":"annotations.js","sourceRoot":"","sources":["../src/annotations.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeTree } from './changes/ChangeTree';\nimport { Schema } from './Schema';\nimport { ArraySchema, getArrayProxy } from './types/ArraySchema';\nimport { MapSchema, getMapProxy } from './types/MapSchema';\nimport { getType } from './types/typeRegistry';\n\n/**\n * Data types\n */\nexport type PrimitiveType =\n \"string\" |\n \"number\" |\n \"boolean\" |\n \"int8\" |\n \"uint8\" |\n \"int16\" |\n \"uint16\" |\n \"int32\" |\n \"uint32\" |\n \"int64\" |\n \"uint64\" |\n \"float32\" |\n \"float64\" |\n typeof Schema;\n\nexport type DefinitionType = PrimitiveType\n | PrimitiveType[]\n | { array: PrimitiveType }\n | { map: PrimitiveType }\n | { collection: PrimitiveType }\n | { set: PrimitiveType };\n\nexport type Definition = { [field: string]: DefinitionType };\nexport type FilterCallback<\n T extends Schema = any,\n V = any,\n R extends Schema = any\n> = (\n ((this: T, client: ClientWithSessionId, value: V) => boolean) |\n ((this: T, client: ClientWithSessionId, value: V, root: R) => boolean)\n);\n\nexport type FilterChildrenCallback<\n T extends Schema = any,\n K = any,\n V = any,\n R extends Schema = any\n> = (\n ((this: T, client: ClientWithSessionId, key: K, value: V) => boolean) |\n ((this: T, client: ClientWithSessionId, key: K, value: V, root: R) => boolean)\n)\n\nexport class SchemaDefinition {\n schema: Definition;\n\n //\n // TODO: use a \"field\" structure combining all these properties per-field.\n //\n\n indexes: { [field: string]: number } = {};\n fieldsByIndex: { [index: number]: string } = {};\n\n filters: { [field: string]: FilterCallback };\n indexesWithFilters: number[];\n childFilters: { [field: string]: FilterChildrenCallback }; // childFilters are used on Map, Array, Set items.\n\n deprecated: { [field: string]: boolean } = {};\n descriptors: PropertyDescriptorMap & ThisType<any> = {};\n\n static create(parent?: SchemaDefinition) {\n const definition = new SchemaDefinition();\n\n // support inheritance\n definition.schema = Object.assign({}, parent && parent.schema || {});\n definition.indexes = Object.assign({}, parent && parent.indexes || {});\n definition.fieldsByIndex = Object.assign({}, parent && parent.fieldsByIndex || {});\n definition.descriptors = Object.assign({}, parent && parent.descriptors || {});\n definition.deprecated = Object.assign({}, parent && parent.deprecated || {});\n\n return definition;\n }\n\n addField(field: string, type: DefinitionType) {\n const index = this.getNextFieldIndex();\n this.fieldsByIndex[index] = field;\n this.indexes[field] = index;\n this.schema[field] = (Array.isArray(type))\n ? { array: type[0] }\n : type;\n }\n\n hasField(field: string) {\n return this.indexes[field] !== undefined;\n }\n\n addFilter(field: string, cb: FilterCallback) {\n if (!this.filters) {\n this.filters = {};\n this.indexesWithFilters = [];\n }\n this.filters[this.indexes[field]] = cb;\n this.indexesWithFilters.push(this.indexes[field]);\n return true;\n }\n\n addChildrenFilter(field: string, cb: FilterChildrenCallback) {\n const index = this.indexes[field];\n const type = this.schema[field];\n\n if (getType(Object.keys(type)[0])) {\n if (!this.childFilters) { this.childFilters = {}; }\n\n this.childFilters[index] = cb;\n return true;\n\n } else {\n console.warn(`@filterChildren: field '${field}' can't have children. Ignoring filter.`);\n }\n }\n\n getChildrenFilter(field: string) {\n return this.childFilters && this.childFilters[this.indexes[field]];\n }\n\n getNextFieldIndex() {\n return Object.keys(this.schema || {}).length;\n }\n}\n\nexport function hasFilter(klass: typeof Schema) {\n return klass._context && klass._context.useFilters;\n}\n\n// Colyseus integration\nexport type ClientWithSessionId = { sessionId: string } & any;\n\nexport interface TypeOptions {\n manual?: boolean,\n context?: Context,\n}\n\nexport class Context {\n types: {[id: number]: typeof Schema} = {};\n schemas = new Map<typeof Schema, number>();\n useFilters = false;\n\n has(schema: typeof Schema) {\n return this.schemas.has(schema);\n }\n\n get(typeid: number) {\n return this.types[typeid];\n }\n\n add(schema: typeof Schema, typeid: number = this.schemas.size) {\n // FIXME: move this to somewhere else?\n // support inheritance\n schema._definition = SchemaDefinition.create(schema._definition);\n\n schema._typeid = typeid;\n this.types[typeid] = schema;\n this.schemas.set(schema, typeid);\n }\n\n\n static create(options: TypeOptions = {}) {\n return function (definition: DefinitionType) {\n if (!options.context) {\n options.context = new Context();\n }\n return type(definition, options);\n }\n }\n}\n\nexport const globalContext = new Context();\n\n/**\n * [See documentation](https://docs.colyseus.io/state/schema/)\n *\n * Annotate a Schema property to be serializeable.\n * \\@type()'d fields are automatically flagged as \"dirty\" for the next patch.\n *\n * @example Standard usage, with automatic change tracking.\n * ```\n * \\@type(\"string\") propertyName: string;\n * ```\n *\n * @example You can provide the \"manual\" option if you'd like to manually control your patches via .setDirty().\n * ```\n * \\@type(\"string\", { manual: true })\n * ```\n */\nexport function type (\n type: DefinitionType,\n options: TypeOptions = {}\n): PropertyDecorator {\n return function (target: typeof Schema, field: string) {\n const context = options.context || globalContext;\n const constructor = target.constructor as typeof Schema;\n constructor._context = context;\n\n if (!type) {\n throw new Error(`${constructor.name}: @type() reference provided for \"${field}\" is undefined. Make sure you don't have any circular dependencies.`);\n }\n\n /*\n * static schema\n */\n if (!context.has(constructor)) {\n context.add(constructor);\n }\n\n const definition = constructor._definition;\n definition.addField(field, type);\n\n /**\n * skip if descriptor already exists for this field (`@deprecated()`)\n */\n if (definition.descriptors[field]) {\n if (definition.deprecated[field]) {\n // do not create accessors for deprecated properties.\n return;\n\n } else {\n // trying to define same property multiple times across inheritance.\n // https://github.com/colyseus/colyseus-unity3d/issues/131#issuecomment-814308572\n try {\n throw new Error(`@colyseus/schema: Duplicate '${field}' definition on '${constructor.name}'.\\nCheck @type() annotation`);\n\n } catch (e) {\n const definitionAtLine = e.stack.split(\"\\n\")[4].trim();\n throw new Error(`${e.message} ${definitionAtLine}`);\n }\n }\n }\n\n const isArray = ArraySchema.is(type);\n const isMap = !isArray && MapSchema.is(type);\n\n // TODO: refactor me.\n // Allow abstract intermediary classes with no fields to be serialized\n // (See \"should support an inheritance with a Schema type without fields\" test)\n if (typeof (type) !== \"string\" && !Schema.is(type)) {\n const childType = Object.values(type)[0];\n if (typeof (childType) !== \"string\" && !context.has(childType)) {\n context.add(childType);\n }\n }\n\n if (options.manual) {\n // do not declare getter/setter descriptor\n definition.descriptors[field] = {\n enumerable: true,\n configurable: true,\n writable: true,\n };\n return;\n }\n\n const fieldCached = `_${field}`;\n definition.descriptors[fieldCached] = {\n enumerable: false,\n configurable: false,\n writable: true,\n };\n\n definition.descriptors[field] = {\n get: function () {\n return this[fieldCached];\n },\n\n set: function (this: Schema, value: any) {\n /**\n * Create Proxy for array or map items\n */\n\n // skip if value is the same as cached.\n if (value === this[fieldCached]) {\n return;\n }\n\n if (\n value !== undefined &&\n value !== null\n ) {\n // automaticallty transform Array into ArraySchema\n if (isArray && !(value instanceof ArraySchema)) {\n value = new ArraySchema(...value);\n }\n\n // automaticallty transform Map into MapSchema\n if (isMap && !(value instanceof MapSchema)) {\n value = new MapSchema(value);\n }\n\n // try to turn provided structure into a Proxy\n if (value['$proxy'] === undefined) {\n if (isMap) {\n value = getMapProxy(value);\n\n } else if (isArray) {\n value = getArrayProxy(value);\n }\n }\n\n // flag the change for encoding.\n this.$changes.change(field);\n\n //\n // call setParent() recursively for this and its child\n // structures.\n //\n if (value['$changes']) {\n (value['$changes'] as ChangeTree).setParent(\n this,\n this.$changes.root,\n this._definition.indexes[field],\n );\n }\n\n } else if (this[fieldCached]) {\n //\n // Setting a field to `null` or `undefined` will delete it.\n //\n this.$changes.delete(field);\n }\n\n this[fieldCached] = value;\n },\n\n enumerable: true,\n configurable: true\n };\n }\n}\n\n/**\n * `@filter()` decorator for defining data filters per client\n */\n\nexport function filter<T extends Schema, V, R extends Schema>(cb: FilterCallback<T, V, R>): PropertyDecorator {\n return function (target: any, field: string) {\n const constructor = target.constructor as typeof Schema;\n const definition = constructor._definition;\n\n if (definition.addFilter(field, cb)) {\n constructor._context.useFilters = true;\n }\n }\n}\n\nexport function filterChildren<T extends Schema, K, V, R extends Schema>(cb: FilterChildrenCallback<T, K, V, R>): PropertyDecorator {\n return function (target: any, field: string) {\n const constructor = target.constructor as typeof Schema;\n const definition = constructor._definition;\n if (definition.addChildrenFilter(field, cb)) {\n constructor._context.useFilters = true;\n }\n }\n}\n\n\n/**\n * `@deprecated()` flag a field as deprecated.\n * The previous `@type()` annotation should remain along with this one.\n */\n\nexport function deprecated(throws: boolean = true): PropertyDecorator {\n return function (target: typeof Schema, field: string) {\n const constructor = target.constructor as typeof Schema;\n const definition = constructor._definition;\n\n definition.deprecated[field] = true;\n\n if (throws) {\n definition.descriptors[field] = {\n get: function () { throw new Error(`${field} is deprecated.`); },\n set: function (this: Schema, value: any) { /* throw new Error(`${field} is deprecated.`); */ },\n enumerable: false,\n configurable: true\n };\n }\n }\n}\n\nexport function defineTypes(\n target: typeof Schema,\n fields: { [property: string]: DefinitionType },\n options: TypeOptions = {}\n) {\n if (!options.context) {\n options.context = target._context || options.context || globalContext;\n }\n\n for (let field in fields) {\n type(fields[field], options)(target.prototype, field);\n }\n return target;\n}\n"]}
@@ -6,7 +6,7 @@ import { ArraySchema } from "../types/ArraySchema";
6
6
  import { CollectionSchema } from "../types/CollectionSchema";
7
7
  import { SetSchema } from "../types/SetSchema";
8
8
  import { ReferenceTracker } from "./ReferenceTracker";
9
- export declare type Ref = Schema | ArraySchema | MapSchema | CollectionSchema | SetSchema;
9
+ export type Ref = Schema | ArraySchema | MapSchema | CollectionSchema | SetSchema;
10
10
  export interface ChangeOperation {
11
11
  op: OPERATION;
12
12
  index: number;