UNPKG

@dipscope/type-manager

Version:

Transform JSON strings or plain objects into JS class instances.

176 lines 7.98 kB
export class SerializerContext { constructor($, referenceMap, referenceCallbackMap, parentSerializerContext, jsonPathKey, typeState, genericMetadatas, propertyState, referenceValueSetter) { this.$ = $; this.referenceMap = referenceMap, this.referenceCallbackMap = referenceCallbackMap; this.parentSerializerContext = parentSerializerContext; this.jsonPathKey = jsonPathKey; this.typeState = typeState; this.genericMetadatas = genericMetadatas; this.propertyState = propertyState; this.referenceValueSetter = referenceValueSetter; return; } get jsonPath() { const jsonPathKey = this.jsonPathKey; const parentSerializerContext = this.parentSerializerContext; if (parentSerializerContext === undefined) { return `${jsonPathKey}`; } if (typeof jsonPathKey === 'number') { return `${parentSerializerContext.jsonPath}[${jsonPathKey}]`; } return `${parentSerializerContext.jsonPath}['${jsonPathKey}']`; } get serializedNullValue() { if (this.preserveNull) { return null; } return this.serializedDefaultValue; } get serializedDefaultValue() { var _a, _b; if (this.useDefaultValue) { return (_b = (_a = this.propertyState) === null || _a === void 0 ? void 0 : _a.serializedDefaultValueResolver()) !== null && _b !== void 0 ? _b : this.typeState.serializedDefaultValueResolver(); } return undefined; } get deserializedNullValue() { if (this.preserveNull) { return null; } return this.deserializedDefaultValue; } get deserializedDefaultValue() { var _a, _b; if (this.useDefaultValue) { return (_b = (_a = this.propertyState) === null || _a === void 0 ? void 0 : _a.deserializedDefaultValueResolver()) !== null && _b !== void 0 ? _b : this.typeState.deserializedDefaultValueResolver(); } return undefined; } get discriminant() { return this.typeState.discriminant; } get discriminator() { return this.typeState.discriminator; } get factory() { return this.typeState.factory; } get injector() { return this.typeState.injector; } get logger() { return this.typeState.logger; } get polymorphic() { return this.typeState.polymorphic; } get preserveDiscriminator() { return this.typeState.preserveDiscriminator; } get referenceHandler() { var _a, _b; return (_b = (_a = this.propertyState) === null || _a === void 0 ? void 0 : _a.referenceHandler) !== null && _b !== void 0 ? _b : this.typeState.referenceHandler; } get serializer() { var _a, _b; return (_b = (_a = this.propertyState) === null || _a === void 0 ? void 0 : _a.serializer) !== null && _b !== void 0 ? _b : this.typeState.serializer; } get typeMetadata() { return this.typeState.typeMetadata; } get preserveNull() { var _a, _b; return (_b = (_a = this.propertyState) === null || _a === void 0 ? void 0 : _a.preserveNull) !== null && _b !== void 0 ? _b : this.typeState.preserveNull; } get useDefaultValue() { var _a, _b; return (_b = (_a = this.propertyState) === null || _a === void 0 ? void 0 : _a.useDefaultValue) !== null && _b !== void 0 ? _b : this.typeState.useDefaultValue; } get useImplicitConversion() { var _a, _b; return (_b = (_a = this.propertyState) === null || _a === void 0 ? void 0 : _a.useImplicitConversion) !== null && _b !== void 0 ? _b : this.typeState.useImplicitConversion; } serialize(x) { return this.serializer.serialize(x, this); } deserialize(x) { return this.serializer.deserialize(x, this); } defineReference(referenceKey, referenceValueGetter) { return this.referenceHandler.define(this, referenceKey, referenceValueGetter); } restoreReference(referenceKey, referenceValueGetter) { return this.referenceHandler.restore(this, referenceKey, referenceValueGetter); } registerReferenceCallback(referenceKey) { const referenceValueSetter = this.referenceValueSetter; if (referenceValueSetter === undefined) { return; } const jsonPathKey = this.jsonPathKey; this.pushReferenceCallback(referenceKey, () => { const referenceValue = this.referenceMap.get(referenceKey); referenceValueSetter(referenceValue, jsonPathKey); }); return; } pushReferenceCallback(referenceKey, referenceCallback) { let referenceCallbacks = this.referenceCallbackMap.get(referenceKey); if (referenceCallbacks === undefined) { referenceCallbacks = new Array(); this.referenceCallbackMap.set(referenceKey, referenceCallbacks); } referenceCallbacks.push(referenceCallback); return; } resolveReferenceCallbacks(referenceKey) { const referenceCallbacks = this.referenceCallbackMap.get(referenceKey); if (referenceCallbacks === undefined) { return; } for (let i = 0; i < referenceCallbacks.length; i++) { referenceCallbacks[i](); } return; } defineChildSerializerContext() { return new SerializerContext(this.$, this.referenceMap, this.referenceCallbackMap, this, this.jsonPathKey, this.typeState, this.genericMetadatas, this.propertyState, this.referenceValueSetter); } defineGenericSerializerContext(genericIndex) { const genericMetadata = this.genericMetadatas[genericIndex]; if (genericMetadata === undefined) { throw new Error(`${this.jsonPath}: cannot define generic metadata for index ${genericIndex}. This is usually caused by invalid configuration.`); } const typeMetadata = genericMetadata[0]; const genericMetadatas = genericMetadata[1]; return new SerializerContext(this.$, this.referenceMap, this.referenceCallbackMap, this.parentSerializerContext, this.jsonPath, typeMetadata.typeState, genericMetadatas, undefined, this.referenceValueSetter); } definePolymorphicSerializerContext(x) { if (typeof x === 'function') { return this.definePolymorphicSerializerContextByTypeFn(x); } return this.definePolymorphicSerializerContextByDiscriminant(x); } definePolymorphicSerializerContextByTypeFn(x) { const typeFn = x; const typeMetadata = this.typeState.typeMetadataMap.get(typeFn); if (typeMetadata === undefined) { throw new Error(`${this.jsonPath}: cannot define discriminant of polymorphic type. This is usually caused by invalid configuration.`); } return new SerializerContext(this.$, this.referenceMap, this.referenceCallbackMap, this.parentSerializerContext, this.jsonPathKey, typeMetadata.typeState, this.genericMetadatas, this.propertyState, this.referenceValueSetter); } definePolymorphicSerializerContextByDiscriminant(x) { const record = x; const childTypeMetadatas = this.typeState.childTypeMetadatas; for (let i = 0; i < childTypeMetadatas.length; i++) { const childTypeState = childTypeMetadatas[i].typeState; if (record[childTypeState.discriminator] === childTypeState.discriminant) { return new SerializerContext(this.$, this.referenceMap, this.referenceCallbackMap, this.parentSerializerContext, this.jsonPathKey, childTypeState, this.genericMetadatas, this.propertyState, this.referenceValueSetter); } } throw new Error(`${this.jsonPath}: cannot define discriminant of polymorphic type. This is usually caused by invalid configuration.`); } } //# sourceMappingURL=serializer-context.js.map