@colyseus/schema 3.0.0-alpha.37 → 3.0.0-alpha.39
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.
- package/build/cjs/index.js +142 -32
- package/build/cjs/index.js.map +1 -1
- package/build/esm/index.mjs +142 -33
- package/build/esm/index.mjs.map +1 -1
- package/build/umd/index.js +142 -32
- package/lib/Metadata.d.ts +3 -2
- package/lib/Metadata.js +57 -15
- package/lib/Metadata.js.map +1 -1
- package/lib/Reflection.d.ts +4 -3
- package/lib/Reflection.js +36 -11
- package/lib/Reflection.js.map +1 -1
- package/lib/Schema.d.ts +2 -2
- package/lib/Schema.js.map +1 -1
- package/lib/annotations.d.ts +29 -12
- package/lib/annotations.js +36 -3
- package/lib/annotations.js.map +1 -1
- package/lib/codegen/parser.js +83 -0
- package/lib/codegen/parser.js.map +1 -1
- package/lib/codegen/types.js +3 -0
- package/lib/codegen/types.js.map +1 -1
- package/lib/decoder/DecodeOperation.js +4 -0
- package/lib/decoder/DecodeOperation.js.map +1 -1
- package/lib/decoder/strategy/StateCallbacks.js.map +1 -1
- package/lib/encoder/EncodeOperation.js +2 -2
- package/lib/encoder/EncodeOperation.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -1
- package/lib/index.js.map +1 -1
- package/lib/types/HelperTypes.d.ts +34 -2
- package/lib/types/HelperTypes.js.map +1 -1
- package/lib/types/TypeContext.js +9 -1
- package/lib/types/TypeContext.js.map +1 -1
- package/package.json +1 -1
- package/src/Metadata.ts +62 -16
- package/src/Reflection.ts +43 -16
- package/src/Schema.ts +2 -3
- package/src/annotations.ts +68 -18
- package/src/codegen/parser.ts +107 -0
- package/src/codegen/types.ts +1 -0
- package/src/decoder/DecodeOperation.ts +4 -0
- package/src/decoder/strategy/StateCallbacks.ts +1 -1
- package/src/encoder/EncodeOperation.ts +4 -2
- package/src/index.ts +1 -1
- package/src/types/HelperTypes.ts +54 -2
- package/src/types/TypeContext.ts +11 -1
package/build/umd/index.js
CHANGED
|
@@ -119,7 +119,7 @@
|
|
|
119
119
|
// Workaround to allow using an empty Schema (with no `@type()` fields)
|
|
120
120
|
//
|
|
121
121
|
if (schema[Symbol.metadata] === undefined) {
|
|
122
|
-
Metadata.
|
|
122
|
+
Metadata.initialize(schema);
|
|
123
123
|
}
|
|
124
124
|
this.schemas.set(schema, typeid);
|
|
125
125
|
return true;
|
|
@@ -135,6 +135,14 @@
|
|
|
135
135
|
TypeContext.inheritedTypes.get(klass)?.forEach((child) => {
|
|
136
136
|
this.discoverTypes(child, parentIndex, parentFieldViewTag);
|
|
137
137
|
});
|
|
138
|
+
// add parent classes
|
|
139
|
+
let parent = klass;
|
|
140
|
+
while ((parent = Object.getPrototypeOf(parent)) &&
|
|
141
|
+
parent !== Schema && // stop at root (Schema)
|
|
142
|
+
parent !== Function.prototype // stop at root (non-Schema)
|
|
143
|
+
) {
|
|
144
|
+
this.discoverTypes(parent);
|
|
145
|
+
}
|
|
138
146
|
const metadata = (klass[Symbol.metadata] ??= {});
|
|
139
147
|
// if any schema/field has filters, mark "context" as having filters.
|
|
140
148
|
if (metadata[$viewFieldIndexes]) {
|
|
@@ -173,6 +181,13 @@
|
|
|
173
181
|
}
|
|
174
182
|
}
|
|
175
183
|
|
|
184
|
+
function getNormalizedType(type) {
|
|
185
|
+
return (Array.isArray(type))
|
|
186
|
+
? { array: type[0] }
|
|
187
|
+
: (typeof (type['type']) !== "undefined")
|
|
188
|
+
? type['type']
|
|
189
|
+
: type;
|
|
190
|
+
}
|
|
176
191
|
const Metadata = {
|
|
177
192
|
addField(metadata, index, name, type, descriptor) {
|
|
178
193
|
if (index > 64) {
|
|
@@ -180,14 +195,16 @@
|
|
|
180
195
|
}
|
|
181
196
|
metadata[index] = Object.assign(metadata[index] || {}, // avoid overwriting previous field metadata (@owned / @deprecated)
|
|
182
197
|
{
|
|
183
|
-
type: (
|
|
184
|
-
? { array: type[0] }
|
|
185
|
-
: type,
|
|
198
|
+
type: getNormalizedType(type),
|
|
186
199
|
index,
|
|
187
200
|
name,
|
|
188
201
|
});
|
|
189
202
|
// create "descriptors" map
|
|
190
|
-
metadata
|
|
203
|
+
Object.defineProperty(metadata, $descriptors, {
|
|
204
|
+
value: metadata[$descriptors] || {},
|
|
205
|
+
enumerable: false,
|
|
206
|
+
configurable: true,
|
|
207
|
+
});
|
|
191
208
|
if (descriptor) {
|
|
192
209
|
// for encoder
|
|
193
210
|
metadata[$descriptors][name] = descriptor;
|
|
@@ -262,7 +279,7 @@
|
|
|
262
279
|
TypeContext.register(constructor);
|
|
263
280
|
const parentClass = Object.getPrototypeOf(constructor);
|
|
264
281
|
const parentMetadata = parentClass && parentClass[Symbol.metadata];
|
|
265
|
-
const metadata = Metadata.initialize(constructor
|
|
282
|
+
const metadata = Metadata.initialize(constructor);
|
|
266
283
|
// Use Schema's methods if not defined in the class
|
|
267
284
|
if (!constructor[$track]) {
|
|
268
285
|
constructor[$track] = Schema[$track];
|
|
@@ -285,11 +302,15 @@
|
|
|
285
302
|
fieldIndex++;
|
|
286
303
|
for (const field in fields) {
|
|
287
304
|
const type = fields[field];
|
|
305
|
+
const normalizedType = getNormalizedType(type);
|
|
288
306
|
// FIXME: this code is duplicated from @type() annotation
|
|
289
307
|
const complexTypeKlass = (Array.isArray(type))
|
|
290
308
|
? getType("array")
|
|
291
309
|
: (typeof (Object.keys(type)[0]) === "string") && getType(Object.keys(type)[0]);
|
|
292
|
-
|
|
310
|
+
const childType = (complexTypeKlass)
|
|
311
|
+
? Object.values(type)[0]
|
|
312
|
+
: normalizedType;
|
|
313
|
+
Metadata.addField(metadata, fieldIndex, field, type, getPropertyDescriptor(`_${field}`, fieldIndex, childType, complexTypeKlass));
|
|
293
314
|
fieldIndex++;
|
|
294
315
|
}
|
|
295
316
|
return target;
|
|
@@ -310,24 +331,52 @@
|
|
|
310
331
|
configurable: true,
|
|
311
332
|
});
|
|
312
333
|
},
|
|
313
|
-
initialize(constructor
|
|
334
|
+
initialize(constructor) {
|
|
335
|
+
const parentClass = Object.getPrototypeOf(constructor);
|
|
336
|
+
const parentMetadata = parentClass[Symbol.metadata];
|
|
314
337
|
let metadata = constructor[Symbol.metadata] ?? Object.create(null);
|
|
315
338
|
// make sure inherited classes have their own metadata object.
|
|
316
|
-
if (
|
|
339
|
+
if (parentClass !== Schema && metadata === parentMetadata) {
|
|
317
340
|
metadata = Object.create(null);
|
|
318
341
|
if (parentMetadata) {
|
|
342
|
+
//
|
|
319
343
|
// assign parent metadata to current
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
344
|
+
//
|
|
345
|
+
Object.setPrototypeOf(metadata, parentMetadata);
|
|
346
|
+
// $numFields
|
|
347
|
+
Object.defineProperty(metadata, $numFields, {
|
|
348
|
+
value: parentMetadata[$numFields],
|
|
349
|
+
enumerable: false,
|
|
350
|
+
configurable: true,
|
|
351
|
+
writable: true,
|
|
352
|
+
});
|
|
353
|
+
// $viewFieldIndexes / $fieldIndexesByViewTag
|
|
354
|
+
if (parentMetadata[$viewFieldIndexes] !== undefined) {
|
|
355
|
+
Object.defineProperty(metadata, $viewFieldIndexes, {
|
|
356
|
+
value: [...parentMetadata[$viewFieldIndexes]],
|
|
325
357
|
enumerable: false,
|
|
326
358
|
configurable: true,
|
|
359
|
+
writable: true,
|
|
360
|
+
});
|
|
361
|
+
Object.defineProperty(metadata, $fieldIndexesByViewTag, {
|
|
362
|
+
value: { ...parentMetadata[$fieldIndexesByViewTag] },
|
|
363
|
+
enumerable: false,
|
|
364
|
+
configurable: true,
|
|
365
|
+
writable: true,
|
|
327
366
|
});
|
|
328
367
|
}
|
|
329
|
-
|
|
330
|
-
|
|
368
|
+
// $refTypeFieldIndexes
|
|
369
|
+
if (parentMetadata[$refTypeFieldIndexes] !== undefined) {
|
|
370
|
+
Object.defineProperty(metadata, $refTypeFieldIndexes, {
|
|
371
|
+
value: [...parentMetadata[$refTypeFieldIndexes]],
|
|
372
|
+
enumerable: false,
|
|
373
|
+
configurable: true,
|
|
374
|
+
writable: true,
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
// $descriptors
|
|
378
|
+
Object.defineProperty(metadata, $descriptors, {
|
|
379
|
+
value: { ...parentMetadata[$descriptors] },
|
|
331
380
|
enumerable: false,
|
|
332
381
|
configurable: true,
|
|
333
382
|
writable: true,
|
|
@@ -1102,7 +1151,6 @@
|
|
|
1102
1151
|
return;
|
|
1103
1152
|
}
|
|
1104
1153
|
const ref = changeTree.ref;
|
|
1105
|
-
// const metadata: Metadata = ref.constructor[Symbol.metadata];
|
|
1106
1154
|
const field = metadata[index];
|
|
1107
1155
|
// TODO: inline this function call small performance gain
|
|
1108
1156
|
encodeValue(encoder, bytes, metadata[index].type, ref[field.name], operation, it);
|
|
@@ -1177,7 +1225,8 @@
|
|
|
1177
1225
|
// encode operation
|
|
1178
1226
|
bytes[it.offset++] = operation & 255;
|
|
1179
1227
|
// custom operations
|
|
1180
|
-
if (operation === exports.OPERATION.CLEAR
|
|
1228
|
+
if (operation === exports.OPERATION.CLEAR ||
|
|
1229
|
+
operation === exports.OPERATION.REVERSE) {
|
|
1181
1230
|
return;
|
|
1182
1231
|
}
|
|
1183
1232
|
// encode index
|
|
@@ -1655,6 +1704,10 @@
|
|
|
1655
1704
|
ref.clear();
|
|
1656
1705
|
return;
|
|
1657
1706
|
}
|
|
1707
|
+
else if (operation === exports.OPERATION.REVERSE) {
|
|
1708
|
+
ref.reverse();
|
|
1709
|
+
return;
|
|
1710
|
+
}
|
|
1658
1711
|
else if (operation === exports.OPERATION.DELETE_BY_REFID) {
|
|
1659
1712
|
// TODO: refactor here, try to follow same flow as below
|
|
1660
1713
|
const refId = number(bytes, it);
|
|
@@ -2774,13 +2827,13 @@
|
|
|
2774
2827
|
// for inheritance support
|
|
2775
2828
|
TypeContext.register(constructor);
|
|
2776
2829
|
const parentClass = Object.getPrototypeOf(constructor);
|
|
2777
|
-
const parentMetadata = parentClass
|
|
2778
|
-
const metadata = Metadata.initialize(constructor
|
|
2830
|
+
const parentMetadata = parentClass[Symbol.metadata];
|
|
2831
|
+
const metadata = Metadata.initialize(constructor);
|
|
2779
2832
|
let fieldIndex = metadata[field];
|
|
2780
2833
|
/**
|
|
2781
2834
|
* skip if descriptor already exists for this field (`@deprecated()`)
|
|
2782
2835
|
*/
|
|
2783
|
-
if (metadata[fieldIndex]) {
|
|
2836
|
+
if (metadata[fieldIndex] !== undefined) {
|
|
2784
2837
|
if (metadata[fieldIndex].deprecated) {
|
|
2785
2838
|
// do not create accessors for deprecated properties.
|
|
2786
2839
|
return;
|
|
@@ -2930,6 +2983,37 @@
|
|
|
2930
2983
|
}
|
|
2931
2984
|
return target;
|
|
2932
2985
|
}
|
|
2986
|
+
function schema(fields, name, inherits = Schema) {
|
|
2987
|
+
const defaultValues = {};
|
|
2988
|
+
const viewTagFields = {};
|
|
2989
|
+
for (let fieldName in fields) {
|
|
2990
|
+
const field = fields[fieldName];
|
|
2991
|
+
if (typeof (field) === "object") {
|
|
2992
|
+
if (field['default'] !== undefined) {
|
|
2993
|
+
defaultValues[fieldName] = field['default'];
|
|
2994
|
+
}
|
|
2995
|
+
if (field['view'] !== undefined) {
|
|
2996
|
+
viewTagFields[fieldName] = (typeof (field['view']) === "boolean")
|
|
2997
|
+
? DEFAULT_VIEW_TAG
|
|
2998
|
+
: field['view'];
|
|
2999
|
+
}
|
|
3000
|
+
}
|
|
3001
|
+
}
|
|
3002
|
+
const klass = Metadata.setFields(class extends inherits {
|
|
3003
|
+
constructor(...args) {
|
|
3004
|
+
args[0] = Object.assign({}, defaultValues, args[0]);
|
|
3005
|
+
super(...args);
|
|
3006
|
+
}
|
|
3007
|
+
}, fields);
|
|
3008
|
+
for (let fieldName in viewTagFields) {
|
|
3009
|
+
view(viewTagFields[fieldName])(klass.prototype, fieldName);
|
|
3010
|
+
}
|
|
3011
|
+
if (name) {
|
|
3012
|
+
Object.defineProperty(klass, "name", { value: name });
|
|
3013
|
+
}
|
|
3014
|
+
klass.extends = (fields, name) => schema(fields, name, klass);
|
|
3015
|
+
return klass;
|
|
3016
|
+
}
|
|
2933
3017
|
|
|
2934
3018
|
function getIndent(level) {
|
|
2935
3019
|
return (new Array(level).fill(0)).map((_, i) => (i === level - 1) ? `└─ ` : ` `).join("");
|
|
@@ -4177,13 +4261,20 @@
|
|
|
4177
4261
|
/**
|
|
4178
4262
|
* Encodes the TypeContext of an Encoder into a buffer.
|
|
4179
4263
|
*
|
|
4180
|
-
* @param
|
|
4264
|
+
* @param encoder Encoder instance
|
|
4181
4265
|
* @param it
|
|
4182
4266
|
* @returns
|
|
4183
4267
|
*/
|
|
4184
|
-
static encode(
|
|
4268
|
+
static encode(encoder, it = { offset: 0 }) {
|
|
4269
|
+
const context = encoder.context;
|
|
4185
4270
|
const reflection = new Reflection();
|
|
4186
4271
|
const reflectionEncoder = new Encoder(reflection);
|
|
4272
|
+
// rootType is usually the first schema passed to the Encoder
|
|
4273
|
+
// (unless it inherits from another schema)
|
|
4274
|
+
const rootType = context.schemas.get(encoder.state.constructor);
|
|
4275
|
+
if (rootType > 0) {
|
|
4276
|
+
reflection.rootType = rootType;
|
|
4277
|
+
}
|
|
4187
4278
|
const buildType = (currentType, metadata) => {
|
|
4188
4279
|
for (const fieldIndex in metadata) {
|
|
4189
4280
|
const index = Number(fieldIndex);
|
|
@@ -4257,18 +4348,14 @@
|
|
|
4257
4348
|
const parentClass = typeContext.get(reflectionType.extendsId) ?? Schema;
|
|
4258
4349
|
const schema = class _ extends parentClass {
|
|
4259
4350
|
};
|
|
4260
|
-
const parentMetadata = parentClass[Symbol.metadata];
|
|
4261
4351
|
// register for inheritance support
|
|
4262
4352
|
TypeContext.register(schema);
|
|
4263
|
-
// for inheritance support
|
|
4264
|
-
Metadata.initialize(schema
|
|
4353
|
+
// // for inheritance support
|
|
4354
|
+
// Metadata.initialize(schema);
|
|
4265
4355
|
typeContext.add(schema, reflectionType.id);
|
|
4266
4356
|
}, {});
|
|
4267
|
-
//
|
|
4268
|
-
|
|
4269
|
-
const schemaType = typeContext.get(reflectionType.id);
|
|
4270
|
-
const metadata = schemaType[Symbol.metadata];
|
|
4271
|
-
const parentFieldIndex = 0;
|
|
4357
|
+
// define fields
|
|
4358
|
+
const addFields = (metadata, reflectionType, parentFieldIndex) => {
|
|
4272
4359
|
reflectionType.fields.forEach((field, i) => {
|
|
4273
4360
|
const fieldIndex = parentFieldIndex + i;
|
|
4274
4361
|
if (field.referencedType !== undefined) {
|
|
@@ -4291,14 +4378,36 @@
|
|
|
4291
4378
|
Metadata.addField(metadata, fieldIndex, field.name, field.type);
|
|
4292
4379
|
}
|
|
4293
4380
|
});
|
|
4381
|
+
};
|
|
4382
|
+
// 2nd pass, set fields
|
|
4383
|
+
reflection.types.forEach((reflectionType) => {
|
|
4384
|
+
const schema = typeContext.get(reflectionType.id);
|
|
4385
|
+
// for inheritance support
|
|
4386
|
+
const metadata = Metadata.initialize(schema);
|
|
4387
|
+
const inheritedTypes = [];
|
|
4388
|
+
let parentType = reflectionType;
|
|
4389
|
+
do {
|
|
4390
|
+
inheritedTypes.push(parentType);
|
|
4391
|
+
parentType = reflection.types.find((t) => t.id === parentType.extendsId);
|
|
4392
|
+
} while (parentType);
|
|
4393
|
+
let parentFieldIndex = 0;
|
|
4394
|
+
inheritedTypes.reverse().forEach((reflectionType) => {
|
|
4395
|
+
// add fields from all inherited classes
|
|
4396
|
+
// TODO: refactor this to avoid adding fields from parent classes
|
|
4397
|
+
addFields(metadata, reflectionType, parentFieldIndex);
|
|
4398
|
+
parentFieldIndex += reflectionType.fields.length;
|
|
4399
|
+
});
|
|
4294
4400
|
});
|
|
4295
|
-
const state = new (typeContext.get(0))();
|
|
4401
|
+
const state = new (typeContext.get(reflection.rootType || 0))();
|
|
4296
4402
|
return new Decoder(state, typeContext);
|
|
4297
4403
|
}
|
|
4298
4404
|
}
|
|
4299
4405
|
__decorate([
|
|
4300
4406
|
type([ReflectionType])
|
|
4301
4407
|
], Reflection.prototype, "types", void 0);
|
|
4408
|
+
__decorate([
|
|
4409
|
+
type("number")
|
|
4410
|
+
], Reflection.prototype, "rootType", void 0);
|
|
4302
4411
|
|
|
4303
4412
|
function getDecoderStateCallbacks(decoder) {
|
|
4304
4413
|
const $root = decoder.root;
|
|
@@ -4771,6 +4880,7 @@
|
|
|
4771
4880
|
exports.getDecoderStateCallbacks = getDecoderStateCallbacks;
|
|
4772
4881
|
exports.getRawChangesCallback = getRawChangesCallback;
|
|
4773
4882
|
exports.registerType = registerType;
|
|
4883
|
+
exports.schema = schema;
|
|
4774
4884
|
exports.type = type;
|
|
4775
4885
|
exports.view = view;
|
|
4776
4886
|
|
package/lib/Metadata.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DefinitionType } from "./annotations";
|
|
2
2
|
import { $descriptors, $fieldIndexesByViewTag, $numFields, $refTypeFieldIndexes, $viewFieldIndexes } from "./types/symbols";
|
|
3
3
|
export type MetadataField = {
|
|
4
4
|
type: DefinitionType;
|
|
@@ -33,6 +33,7 @@ export type Metadata = {
|
|
|
33
33
|
[field: string]: PropertyDescriptor;
|
|
34
34
|
};
|
|
35
35
|
};
|
|
36
|
+
export declare function getNormalizedType(type: DefinitionType): DefinitionType;
|
|
36
37
|
export declare const Metadata: {
|
|
37
38
|
addField(metadata: any, index: number, name: string, type: DefinitionType, descriptor?: PropertyDescriptor): void;
|
|
38
39
|
setTag(metadata: Metadata, fieldName: string, tag: number): void;
|
|
@@ -41,7 +42,7 @@ export declare const Metadata: {
|
|
|
41
42
|
}): any;
|
|
42
43
|
isDeprecated(metadata: any, field: string): boolean;
|
|
43
44
|
init(klass: any): void;
|
|
44
|
-
initialize(constructor: any
|
|
45
|
+
initialize(constructor: any): Metadata;
|
|
45
46
|
isValidInstance(klass: any): boolean;
|
|
46
47
|
getFields(klass: any): {};
|
|
47
48
|
};
|
package/lib/Metadata.js
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Metadata = void 0;
|
|
4
|
+
exports.getNormalizedType = getNormalizedType;
|
|
4
5
|
const annotations_1 = require("./annotations");
|
|
5
6
|
const Schema_1 = require("./Schema");
|
|
6
7
|
const registry_1 = require("./types/registry");
|
|
7
8
|
const symbols_1 = require("./types/symbols");
|
|
8
9
|
const TypeContext_1 = require("./types/TypeContext");
|
|
10
|
+
function getNormalizedType(type) {
|
|
11
|
+
return (Array.isArray(type))
|
|
12
|
+
? { array: type[0] }
|
|
13
|
+
: (typeof (type['type']) !== "undefined")
|
|
14
|
+
? type['type']
|
|
15
|
+
: type;
|
|
16
|
+
}
|
|
9
17
|
exports.Metadata = {
|
|
10
18
|
addField(metadata, index, name, type, descriptor) {
|
|
11
19
|
if (index > 64) {
|
|
@@ -13,14 +21,16 @@ exports.Metadata = {
|
|
|
13
21
|
}
|
|
14
22
|
metadata[index] = Object.assign(metadata[index] || {}, // avoid overwriting previous field metadata (@owned / @deprecated)
|
|
15
23
|
{
|
|
16
|
-
type: (
|
|
17
|
-
? { array: type[0] }
|
|
18
|
-
: type,
|
|
24
|
+
type: getNormalizedType(type),
|
|
19
25
|
index,
|
|
20
26
|
name,
|
|
21
27
|
});
|
|
22
28
|
// create "descriptors" map
|
|
23
|
-
metadata
|
|
29
|
+
Object.defineProperty(metadata, symbols_1.$descriptors, {
|
|
30
|
+
value: metadata[symbols_1.$descriptors] || {},
|
|
31
|
+
enumerable: false,
|
|
32
|
+
configurable: true,
|
|
33
|
+
});
|
|
24
34
|
if (descriptor) {
|
|
25
35
|
// for encoder
|
|
26
36
|
metadata[symbols_1.$descriptors][name] = descriptor;
|
|
@@ -95,7 +105,7 @@ exports.Metadata = {
|
|
|
95
105
|
TypeContext_1.TypeContext.register(constructor);
|
|
96
106
|
const parentClass = Object.getPrototypeOf(constructor);
|
|
97
107
|
const parentMetadata = parentClass && parentClass[Symbol.metadata];
|
|
98
|
-
const metadata = exports.Metadata.initialize(constructor
|
|
108
|
+
const metadata = exports.Metadata.initialize(constructor);
|
|
99
109
|
// Use Schema's methods if not defined in the class
|
|
100
110
|
if (!constructor[symbols_1.$track]) {
|
|
101
111
|
constructor[symbols_1.$track] = Schema_1.Schema[symbols_1.$track];
|
|
@@ -118,11 +128,15 @@ exports.Metadata = {
|
|
|
118
128
|
fieldIndex++;
|
|
119
129
|
for (const field in fields) {
|
|
120
130
|
const type = fields[field];
|
|
131
|
+
const normalizedType = getNormalizedType(type);
|
|
121
132
|
// FIXME: this code is duplicated from @type() annotation
|
|
122
133
|
const complexTypeKlass = (Array.isArray(type))
|
|
123
134
|
? (0, registry_1.getType)("array")
|
|
124
135
|
: (typeof (Object.keys(type)[0]) === "string") && (0, registry_1.getType)(Object.keys(type)[0]);
|
|
125
|
-
|
|
136
|
+
const childType = (complexTypeKlass)
|
|
137
|
+
? Object.values(type)[0]
|
|
138
|
+
: normalizedType;
|
|
139
|
+
exports.Metadata.addField(metadata, fieldIndex, field, type, (0, annotations_1.getPropertyDescriptor)(`_${field}`, fieldIndex, childType, complexTypeKlass));
|
|
126
140
|
fieldIndex++;
|
|
127
141
|
}
|
|
128
142
|
return target;
|
|
@@ -143,24 +157,52 @@ exports.Metadata = {
|
|
|
143
157
|
configurable: true,
|
|
144
158
|
});
|
|
145
159
|
},
|
|
146
|
-
initialize(constructor
|
|
160
|
+
initialize(constructor) {
|
|
161
|
+
const parentClass = Object.getPrototypeOf(constructor);
|
|
162
|
+
const parentMetadata = parentClass[Symbol.metadata];
|
|
147
163
|
let metadata = constructor[Symbol.metadata] ?? Object.create(null);
|
|
148
164
|
// make sure inherited classes have their own metadata object.
|
|
149
|
-
if (
|
|
165
|
+
if (parentClass !== Schema_1.Schema && metadata === parentMetadata) {
|
|
150
166
|
metadata = Object.create(null);
|
|
151
167
|
if (parentMetadata) {
|
|
168
|
+
//
|
|
152
169
|
// assign parent metadata to current
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
170
|
+
//
|
|
171
|
+
Object.setPrototypeOf(metadata, parentMetadata);
|
|
172
|
+
// $numFields
|
|
173
|
+
Object.defineProperty(metadata, symbols_1.$numFields, {
|
|
174
|
+
value: parentMetadata[symbols_1.$numFields],
|
|
175
|
+
enumerable: false,
|
|
176
|
+
configurable: true,
|
|
177
|
+
writable: true,
|
|
178
|
+
});
|
|
179
|
+
// $viewFieldIndexes / $fieldIndexesByViewTag
|
|
180
|
+
if (parentMetadata[symbols_1.$viewFieldIndexes] !== undefined) {
|
|
181
|
+
Object.defineProperty(metadata, symbols_1.$viewFieldIndexes, {
|
|
182
|
+
value: [...parentMetadata[symbols_1.$viewFieldIndexes]],
|
|
158
183
|
enumerable: false,
|
|
159
184
|
configurable: true,
|
|
185
|
+
writable: true,
|
|
186
|
+
});
|
|
187
|
+
Object.defineProperty(metadata, symbols_1.$fieldIndexesByViewTag, {
|
|
188
|
+
value: { ...parentMetadata[symbols_1.$fieldIndexesByViewTag] },
|
|
189
|
+
enumerable: false,
|
|
190
|
+
configurable: true,
|
|
191
|
+
writable: true,
|
|
160
192
|
});
|
|
161
193
|
}
|
|
162
|
-
|
|
163
|
-
|
|
194
|
+
// $refTypeFieldIndexes
|
|
195
|
+
if (parentMetadata[symbols_1.$refTypeFieldIndexes] !== undefined) {
|
|
196
|
+
Object.defineProperty(metadata, symbols_1.$refTypeFieldIndexes, {
|
|
197
|
+
value: [...parentMetadata[symbols_1.$refTypeFieldIndexes]],
|
|
198
|
+
enumerable: false,
|
|
199
|
+
configurable: true,
|
|
200
|
+
writable: true,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
// $descriptors
|
|
204
|
+
Object.defineProperty(metadata, symbols_1.$descriptors, {
|
|
205
|
+
value: { ...parentMetadata[symbols_1.$descriptors] },
|
|
164
206
|
enumerable: false,
|
|
165
207
|
configurable: true,
|
|
166
208
|
writable: true,
|
package/lib/Metadata.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Metadata.js","sourceRoot":"","sources":["../src/Metadata.ts"],"names":[],"mappings":"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","sourcesContent":["import { getPropertyDescriptor, type DefinitionType } 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 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: (Array.isArray(type))\n ? { array: type[0] }\n : type,\n index,\n name,\n }\n );\n\n // create \"descriptors\" map\n metadata[$descriptors] ??= {};\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, parentMetadata);\n\n // Use Schema's methods if not defined in the class\n if (!constructor[$track]) { constructor[$track] = Schema[$track]; }\n if (!constructor[$encoder]) { constructor[$encoder] = Schema[$encoder]; }\n if (!constructor[$decoder]) { constructor[$decoder] = Schema[$decoder]; }\n if (!constructor.prototype.toJSON) { constructor.prototype.toJSON = Schema.prototype.toJSON; }\n\n //\n // detect index for this field, considering inheritance\n //\n let fieldIndex = metadata[$numFields] // current structure already has fields defined\n ?? (parentMetadata && parentMetadata[$numFields]) // parent structure has fields defined\n ?? -1; // no fields defined\n\n fieldIndex++;\n\n for (const field in fields) {\n const type = fields[field];\n\n // FIXME: this code is duplicated from @type() annotation\n const complexTypeKlass = (Array.isArray(type))\n ? getType(\"array\")\n : (typeof(Object.keys(type)[0]) === \"string\") && getType(Object.keys(type)[0]);\n\n Metadata.addField(\n metadata,\n fieldIndex,\n field,\n type,\n getPropertyDescriptor(`_${field}`, fieldIndex, type, 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, parentMetadata?: Metadata) {\n let metadata: Metadata = constructor[Symbol.metadata] ?? Object.create(null);\n\n // make sure inherited classes have their own metadata object.\n if (constructor[Symbol.metadata] === parentMetadata) {\n metadata = Object.create(null);\n\n if (parentMetadata) {\n // assign parent metadata to current\n Object.assign(metadata, parentMetadata);\n\n for (let i = 0; i <= parentMetadata[$numFields]; i++) {\n const fieldName = parentMetadata[i].name;\n Object.defineProperty(metadata, fieldName, {\n value: parentMetadata[fieldName],\n enumerable: false,\n configurable: true,\n });\n }\n\n Object.defineProperty(metadata, $numFields, {\n value: parentMetadata[$numFields],\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 { 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}"]}
|
package/lib/Reflection.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { TypeContext } from "./types/TypeContext";
|
|
2
1
|
import { ArraySchema } from "./types/custom/ArraySchema";
|
|
3
2
|
import { Iterator } from "./encoding/decode";
|
|
3
|
+
import { Encoder } from "./encoder/Encoder";
|
|
4
4
|
import { Decoder } from "./decoder/Decoder";
|
|
5
5
|
import { Schema } from "./Schema";
|
|
6
6
|
/**
|
|
@@ -18,14 +18,15 @@ export declare class ReflectionType extends Schema {
|
|
|
18
18
|
}
|
|
19
19
|
export declare class Reflection extends Schema {
|
|
20
20
|
types: ArraySchema<ReflectionType>;
|
|
21
|
+
rootType: number;
|
|
21
22
|
/**
|
|
22
23
|
* Encodes the TypeContext of an Encoder into a buffer.
|
|
23
24
|
*
|
|
24
|
-
* @param
|
|
25
|
+
* @param encoder Encoder instance
|
|
25
26
|
* @param it
|
|
26
27
|
* @returns
|
|
27
28
|
*/
|
|
28
|
-
static encode(
|
|
29
|
+
static encode(encoder: Encoder, it?: Iterator): Buffer;
|
|
29
30
|
/**
|
|
30
31
|
* Decodes the TypeContext from a buffer into a Decoder instance.
|
|
31
32
|
*
|
package/lib/Reflection.js
CHANGED
|
@@ -53,13 +53,20 @@ class Reflection extends Schema_1.Schema {
|
|
|
53
53
|
/**
|
|
54
54
|
* Encodes the TypeContext of an Encoder into a buffer.
|
|
55
55
|
*
|
|
56
|
-
* @param
|
|
56
|
+
* @param encoder Encoder instance
|
|
57
57
|
* @param it
|
|
58
58
|
* @returns
|
|
59
59
|
*/
|
|
60
|
-
static encode(
|
|
60
|
+
static encode(encoder, it = { offset: 0 }) {
|
|
61
|
+
const context = encoder.context;
|
|
61
62
|
const reflection = new Reflection();
|
|
62
63
|
const reflectionEncoder = new Encoder_1.Encoder(reflection);
|
|
64
|
+
// rootType is usually the first schema passed to the Encoder
|
|
65
|
+
// (unless it inherits from another schema)
|
|
66
|
+
const rootType = context.schemas.get(encoder.state.constructor);
|
|
67
|
+
if (rootType > 0) {
|
|
68
|
+
reflection.rootType = rootType;
|
|
69
|
+
}
|
|
63
70
|
const buildType = (currentType, metadata) => {
|
|
64
71
|
for (const fieldIndex in metadata) {
|
|
65
72
|
const index = Number(fieldIndex);
|
|
@@ -133,18 +140,14 @@ class Reflection extends Schema_1.Schema {
|
|
|
133
140
|
const parentClass = typeContext.get(reflectionType.extendsId) ?? Schema_1.Schema;
|
|
134
141
|
const schema = class _ extends parentClass {
|
|
135
142
|
};
|
|
136
|
-
const parentMetadata = parentClass[Symbol.metadata];
|
|
137
143
|
// register for inheritance support
|
|
138
144
|
TypeContext_1.TypeContext.register(schema);
|
|
139
|
-
// for inheritance support
|
|
140
|
-
|
|
145
|
+
// // for inheritance support
|
|
146
|
+
// Metadata.initialize(schema);
|
|
141
147
|
typeContext.add(schema, reflectionType.id);
|
|
142
148
|
}, {});
|
|
143
|
-
//
|
|
144
|
-
|
|
145
|
-
const schemaType = typeContext.get(reflectionType.id);
|
|
146
|
-
const metadata = schemaType[Symbol.metadata];
|
|
147
|
-
const parentFieldIndex = 0;
|
|
149
|
+
// define fields
|
|
150
|
+
const addFields = (metadata, reflectionType, parentFieldIndex) => {
|
|
148
151
|
reflectionType.fields.forEach((field, i) => {
|
|
149
152
|
const fieldIndex = parentFieldIndex + i;
|
|
150
153
|
if (field.referencedType !== undefined) {
|
|
@@ -167,8 +170,27 @@ class Reflection extends Schema_1.Schema {
|
|
|
167
170
|
Metadata_1.Metadata.addField(metadata, fieldIndex, field.name, field.type);
|
|
168
171
|
}
|
|
169
172
|
});
|
|
173
|
+
};
|
|
174
|
+
// 2nd pass, set fields
|
|
175
|
+
reflection.types.forEach((reflectionType) => {
|
|
176
|
+
const schema = typeContext.get(reflectionType.id);
|
|
177
|
+
// for inheritance support
|
|
178
|
+
const metadata = Metadata_1.Metadata.initialize(schema);
|
|
179
|
+
const inheritedTypes = [];
|
|
180
|
+
let parentType = reflectionType;
|
|
181
|
+
do {
|
|
182
|
+
inheritedTypes.push(parentType);
|
|
183
|
+
parentType = reflection.types.find((t) => t.id === parentType.extendsId);
|
|
184
|
+
} while (parentType);
|
|
185
|
+
let parentFieldIndex = 0;
|
|
186
|
+
inheritedTypes.reverse().forEach((reflectionType) => {
|
|
187
|
+
// add fields from all inherited classes
|
|
188
|
+
// TODO: refactor this to avoid adding fields from parent classes
|
|
189
|
+
addFields(metadata, reflectionType, parentFieldIndex);
|
|
190
|
+
parentFieldIndex += reflectionType.fields.length;
|
|
191
|
+
});
|
|
170
192
|
});
|
|
171
|
-
const state = new (typeContext.get(0))();
|
|
193
|
+
const state = new (typeContext.get(reflection.rootType || 0))();
|
|
172
194
|
return new Decoder_1.Decoder(state, typeContext);
|
|
173
195
|
}
|
|
174
196
|
}
|
|
@@ -176,4 +198,7 @@ exports.Reflection = Reflection;
|
|
|
176
198
|
__decorate([
|
|
177
199
|
(0, annotations_1.type)([ReflectionType])
|
|
178
200
|
], Reflection.prototype, "types", void 0);
|
|
201
|
+
__decorate([
|
|
202
|
+
(0, annotations_1.type)("number")
|
|
203
|
+
], Reflection.prototype, "rootType", void 0);
|
|
179
204
|
//# sourceMappingURL=Reflection.js.map
|