UNPKG

@dipscope/type-manager

Version:

Transform JSON strings or plain objects into JS class instances.

132 lines 7.48 kB
var TypeSerializer = (function () { function TypeSerializer() { } TypeSerializer.prototype.serialize = function (x, serializerContext) { if (x === undefined) { return serializerContext.serializedDefaultValue; } if (x === null) { return serializerContext.serializedNullValue; } if (typeof x === 'object') { return serializerContext.defineReference(x, function () { var type = x; var typeSerializerContext = serializerContext.polymorphic ? serializerContext.definePolymorphicSerializerContext(x.constructor) : serializerContext; var typeState = typeSerializerContext.typeState; var beforeSerializeCallback = typeState.beforeSerializeCallback; if (typeof beforeSerializeCallback === 'string' && typeof type[beforeSerializeCallback] === 'function') { type[beforeSerializeCallback](); } else if (typeof beforeSerializeCallback === 'function') { beforeSerializeCallback(type); } var propertySerializerContext = typeSerializerContext.defineChildSerializerContext(); var object = {}; propertySerializerContext.referenceValueSetter = function (v, k) { var declaringObject = propertySerializerContext.referenceMap.get(type); if (declaringObject !== undefined) { declaringObject[k] = v; } }; for (var i = 0; i < typeState.sortedPropertyMetadatas.length; i++) { var propertyMetadata = typeState.sortedPropertyMetadatas[i]; var propertyState = propertyMetadata.propertyState; if (!propertyState.serializable) { continue; } var serializedPropertyName = propertyState.serializedPropertyName; var deserializedPropertyName = propertyState.deserializedPropertyName; var propertyValue = type[deserializedPropertyName]; propertySerializerContext.jsonPathKey = serializedPropertyName; propertySerializerContext.propertyState = propertyState; propertySerializerContext.typeState = propertyState.typeMetadata.typeState; propertySerializerContext.genericMetadatas = propertyState.genericMetadatas; var serializer = propertySerializerContext.serializer; var value = serializer.serialize(propertyValue, propertySerializerContext); object[serializedPropertyName] = value; } if (typeState.preserveDiscriminator) { object[typeState.discriminator] = typeState.discriminant; } else if (object.hasOwnProperty(typeState.discriminator)) { delete object[typeState.discriminator]; } return object; }); } serializerContext.logger.error('TypeSerializer', "".concat(serializerContext.jsonPath, ": cannot serialize value as type."), x); return undefined; }; TypeSerializer.prototype.deserialize = function (x, serializerContext) { if (x === undefined) { return serializerContext.deserializedDefaultValue; } if (x === null) { return serializerContext.deserializedNullValue; } if (typeof x === 'object') { return serializerContext.restoreReference(x, function () { var object = x; var typeSerializerContext = serializerContext.polymorphic ? serializerContext.definePolymorphicSerializerContext(x) : serializerContext; var propertySerializerContext = typeSerializerContext.defineChildSerializerContext(); var typeState = typeSerializerContext.typeState; var typeEntryMap = new Map(); propertySerializerContext.referenceValueSetter = function (v, k) { var declaringType = propertySerializerContext.referenceMap.get(object); if (declaringType !== undefined) { declaringType[k] = v; } }; for (var i = 0; i < typeState.sortedPropertyMetadatas.length; i++) { var propertyMetadata = typeState.sortedPropertyMetadatas[i]; var propertyState = propertyMetadata.propertyState; if (!propertyState.deserializable) { continue; } var serializedPropertyName = propertyState.serializedPropertyName; var deserializedPropertyName = propertyState.deserializedPropertyName; var propertyValue = object[serializedPropertyName]; propertySerializerContext.jsonPathKey = serializedPropertyName; propertySerializerContext.propertyState = propertyState; propertySerializerContext.typeState = propertyState.typeMetadata.typeState; propertySerializerContext.genericMetadatas = propertyState.genericMetadatas; var serializer = propertySerializerContext.serializer; var value = serializer.deserialize(propertyValue, propertySerializerContext); typeEntryMap.set(deserializedPropertyName, { key: deserializedPropertyName, value: value, propertyMetadata: propertyMetadata }); typeEntryMap.set(serializedPropertyName, { key: serializedPropertyName, value: value, propertyMetadata: propertyMetadata }); } for (var propertyName in object) { if (object.hasOwnProperty(propertyName) && !typeEntryMap.has(propertyName)) { typeEntryMap.set(propertyName, { key: propertyName, value: object[propertyName] }); } } var factory = typeState.factory; var injector = typeState.injector; var type = factory.build(typeState.typeMetadata, typeEntryMap, injector); if (typeState.preserveDiscriminator) { type[typeState.discriminator] = typeState.discriminant; } else if (type.hasOwnProperty(typeState.discriminator)) { delete type[typeState.discriminator]; } var afterDeserializeCallback = typeState.afterDeserializeCallback; if (typeof afterDeserializeCallback === 'string' && typeof type[afterDeserializeCallback] === 'function') { type[afterDeserializeCallback](); } else if (typeof afterDeserializeCallback === 'function') { afterDeserializeCallback(type); } return type; }); } serializerContext.logger.error('TypeSerializer', "".concat(serializerContext.jsonPath, ": cannot deserialize value as type."), x); return undefined; }; return TypeSerializer; }()); export { TypeSerializer }; //# sourceMappingURL=type-serializer.js.map