@dipscope/type-manager
Version:
Transform JSON strings or plain objects into JS class instances.
132 lines • 7.48 kB
JavaScript
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