@dipscope/type-manager
Version:
Transform JSON strings or plain objects into JS class instances.
530 lines • 24.9 kB
JavaScript
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var __values = (this && this.__values) || function(o) {
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
if (m) return m.call(o);
if (o && typeof o.length === "number") return {
next: function () {
if (o && i >= o.length) o = void 0;
return { value: o && o[i++], done: !o };
}
};
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
};
import { DEFAULT_VALUE_RESOLVER } from './constants/default-value-resolver';
import { EMPTY_ARRAY } from './constants/empty-array';
import { EMPTY_MAP } from './constants/empty-map';
import { NULL_VALUE_RESOLVER } from './constants/null-value-resolver';
import { getReflectMetadata } from './functions/get-reflect-metadata';
import { Metadata } from './metadata';
import { PROPERTY_EXTENSION_METADATA_CTOR_SET_KEY } from './property-extension-metadata-ctor-set-key';
import { ResolvedPropertyState } from './property-states/resolved-property-state';
import { UnresolvedPropertyState } from './property-states/unresolved-property-state';
var PropertyMetadata = (function (_super) {
__extends(PropertyMetadata, _super);
function PropertyMetadata(typeManager, typeFnMap, declaringTypeMetadata, propertyName, propertyOptions) {
var _this = _super.call(this, typeManager, typeFnMap) || this;
_this.declaringTypeMetadata = declaringTypeMetadata;
_this.propertyName = propertyName;
_this.normalizedPropertyName = propertyName.toLocaleLowerCase();
_this.reflectTypeFn = getReflectMetadata('design:type', declaringTypeMetadata.typeFn.prototype, propertyName);
_this.propertyOptions = _this.constructPropertyOptions(propertyOptions);
_this.currentPropertyState = new UnresolvedPropertyState(_this);
_this.configure(propertyOptions);
return _this;
}
Object.defineProperty(PropertyMetadata.prototype, "propertyState", {
get: function () {
return this.currentPropertyState;
},
enumerable: false,
configurable: true
});
Object.defineProperty(PropertyMetadata.prototype, "alias", {
get: function () {
return this.currentPropertyState.alias;
},
enumerable: false,
configurable: true
});
Object.defineProperty(PropertyMetadata.prototype, "customValueMap", {
get: function () {
return this.currentPropertyState.customValueMap;
},
enumerable: false,
configurable: true
});
Object.defineProperty(PropertyMetadata.prototype, "serializedNullValue", {
get: function () {
return this.currentPropertyState.serializedNullValueResolver();
},
enumerable: false,
configurable: true
});
Object.defineProperty(PropertyMetadata.prototype, "serializedDefaultValue", {
get: function () {
return this.currentPropertyState.serializedDefaultValueResolver();
},
enumerable: false,
configurable: true
});
Object.defineProperty(PropertyMetadata.prototype, "deserializedNullValue", {
get: function () {
return this.currentPropertyState.deserializedNullValueResolver();
},
enumerable: false,
configurable: true
});
Object.defineProperty(PropertyMetadata.prototype, "deserializedDefaultValue", {
get: function () {
return this.currentPropertyState.deserializedDefaultValueResolver();
},
enumerable: false,
configurable: true
});
Object.defineProperty(PropertyMetadata.prototype, "serializedPropertyName", {
get: function () {
return this.currentPropertyState.serializedPropertyName;
},
enumerable: false,
configurable: true
});
Object.defineProperty(PropertyMetadata.prototype, "deserializedPropertyName", {
get: function () {
return this.currentPropertyState.deserializedPropertyName;
},
enumerable: false,
configurable: true
});
Object.defineProperty(PropertyMetadata.prototype, "deserializable", {
get: function () {
return this.currentPropertyState.deserializable;
},
enumerable: false,
configurable: true
});
Object.defineProperty(PropertyMetadata.prototype, "genericArguments", {
get: function () {
return this.currentPropertyState.genericArguments;
},
enumerable: false,
configurable: true
});
Object.defineProperty(PropertyMetadata.prototype, "genericMetadatas", {
get: function () {
return this.currentPropertyState.genericMetadatas;
},
enumerable: false,
configurable: true
});
Object.defineProperty(PropertyMetadata.prototype, "namingConvention", {
get: function () {
return this.currentPropertyState.namingConvention;
},
enumerable: false,
configurable: true
});
Object.defineProperty(PropertyMetadata.prototype, "referenceHandler", {
get: function () {
return this.currentPropertyState.referenceHandler;
},
enumerable: false,
configurable: true
});
Object.defineProperty(PropertyMetadata.prototype, "serializable", {
get: function () {
return this.currentPropertyState.serializable;
},
enumerable: false,
configurable: true
});
Object.defineProperty(PropertyMetadata.prototype, "serializer", {
get: function () {
return this.currentPropertyState.serializer;
},
enumerable: false,
configurable: true
});
Object.defineProperty(PropertyMetadata.prototype, "typeArgument", {
get: function () {
return this.currentPropertyState.typeArgument;
},
enumerable: false,
configurable: true
});
Object.defineProperty(PropertyMetadata.prototype, "typeMetadata", {
get: function () {
return this.currentPropertyState.typeMetadata;
},
enumerable: false,
configurable: true
});
Object.defineProperty(PropertyMetadata.prototype, "preserveNull", {
get: function () {
return this.currentPropertyState.preserveNull;
},
enumerable: false,
configurable: true
});
Object.defineProperty(PropertyMetadata.prototype, "useDefaultValue", {
get: function () {
return this.currentPropertyState.useDefaultValue;
},
enumerable: false,
configurable: true
});
Object.defineProperty(PropertyMetadata.prototype, "useImplicitConversion", {
get: function () {
return this.currentPropertyState.useImplicitConversion;
},
enumerable: false,
configurable: true
});
PropertyMetadata.prototype.constructPropertyOptions = function (propertyOptions) {
if (propertyOptions.customValueMap === undefined) {
propertyOptions.customValueMap = new Map();
}
return propertyOptions;
};
PropertyMetadata.prototype.configurePropertyExtensionMetadata = function (propertyExtensionMetadataCtor, propertyExtensionOptions) {
var propertyExtensionMetadataCtorSet = this.extractPropertyExtensionMetadataCtorSet();
if (!propertyExtensionMetadataCtorSet.has(propertyExtensionMetadataCtor)) {
propertyExtensionMetadataCtorSet.add(propertyExtensionMetadataCtor);
}
var initialPropertyExtensionOptions = propertyExtensionOptions !== null && propertyExtensionOptions !== void 0 ? propertyExtensionOptions : {};
var propertyExtensionMetadata = new propertyExtensionMetadataCtor(this, initialPropertyExtensionOptions);
return propertyExtensionMetadata;
};
PropertyMetadata.prototype.extractPropertyExtensionMetadata = function (propertyExtensionMetadataCtor) {
var propertyExtensionMetadataCtorSet = this.extractPropertyExtensionMetadataCtorSet();
if (!propertyExtensionMetadataCtorSet.has(propertyExtensionMetadataCtor)) {
return undefined;
}
var initialPropertyExtensionOptions = {};
var propertyExtensionMetadata = new propertyExtensionMetadataCtor(this, initialPropertyExtensionOptions);
return propertyExtensionMetadata;
};
PropertyMetadata.prototype.extractPropertyExtensionMetadataCtorSet = function () {
var customValueMap = this.propertyOptions.customValueMap;
if (customValueMap === undefined) {
customValueMap = new Map();
this.propertyOptions.customValueMap = customValueMap;
}
var propertyExtensionMetadataCtorSet = customValueMap.get(PROPERTY_EXTENSION_METADATA_CTOR_SET_KEY);
if (propertyExtensionMetadataCtorSet === undefined) {
propertyExtensionMetadataCtorSet = new Set();
customValueMap.set(PROPERTY_EXTENSION_METADATA_CTOR_SET_KEY, propertyExtensionMetadataCtorSet);
}
return propertyExtensionMetadataCtorSet;
};
PropertyMetadata.prototype.resolvePropertyState = function () {
var propertyOptions = this.propertyOptions;
var propertyName = this.propertyName;
var alias = propertyOptions.alias;
var deserializedPropertyName = propertyName;
var typeArgument = propertyOptions.typeArgument === undefined
? this.reflectTypeFn
: propertyOptions.typeArgument;
var typeMetadata = this.resolveTypeMetadata(typeArgument);
var typeState = typeMetadata.typeState;
var customValueMap = this.resolveCustomValueMap(typeState);
var preserveNull = propertyOptions.preserveNull === undefined
? typeState.preserveNull
: propertyOptions.preserveNull;
var useDefaultValue = propertyOptions.useDefaultValue === undefined
? typeState.useDefaultValue
: propertyOptions.useDefaultValue;
var useImplicitConversion = propertyOptions.useImplicitConversion === undefined
? typeState.useImplicitConversion
: propertyOptions.useImplicitConversion;
var serializedDefaultValue = propertyOptions.defaultValue === undefined
? (propertyOptions.serializedDefaultValue === undefined ? typeState.serializedDefaultValue : propertyOptions.serializedDefaultValue)
: propertyOptions.defaultValue;
var serializedDefaultValueResolver = useDefaultValue
? (typeof serializedDefaultValue === 'function' ? serializedDefaultValue : function () { return serializedDefaultValue; })
: DEFAULT_VALUE_RESOLVER;
var serializedNullValueResolver = preserveNull
? NULL_VALUE_RESOLVER
: serializedDefaultValueResolver;
var deserializedDefaultValue = propertyOptions.defaultValue === undefined
? (propertyOptions.deserializedDefaultValue === undefined ? typeState.deserializedDefaultValue : propertyOptions.deserializedDefaultValue)
: propertyOptions.defaultValue;
var deserializedDefaultValueResolver = useDefaultValue
? (typeof deserializedDefaultValue === 'function' ? deserializedDefaultValue : function () { return deserializedDefaultValue; })
: DEFAULT_VALUE_RESOLVER;
var deserializedNullValueResolver = preserveNull
? NULL_VALUE_RESOLVER
: deserializedDefaultValueResolver;
var namingConvention = propertyOptions.namingConvention === undefined
? this.declaringTypeMetadata.typeState.namingConvention
: propertyOptions.namingConvention;
var serializedPropertyName = alias === undefined
? (namingConvention === undefined ? propertyName : namingConvention.convert(propertyName))
: alias;
var useDefaultSerialization = propertyOptions.serializable === undefined
&& propertyOptions.deserializable === undefined;
var serializable = useDefaultSerialization
|| propertyOptions.serializable === true;
var deserializable = useDefaultSerialization
|| propertyOptions.deserializable === true;
var genericArguments = propertyOptions.genericArguments === undefined
? EMPTY_ARRAY
: propertyOptions.genericArguments;
var genericMetadatas = this.resolveGenericMetadatas(genericArguments);
var referenceHandler = propertyOptions.referenceHandler === undefined
? typeState.referenceHandler
: propertyOptions.referenceHandler;
var serializer = propertyOptions.serializer === undefined
? typeState.serializer
: propertyOptions.serializer;
var resolvedPropertyState = new ResolvedPropertyState(this, alias, customValueMap, serializedNullValueResolver, serializedDefaultValueResolver, deserializedNullValueResolver, deserializedDefaultValueResolver, serializedPropertyName, deserializedPropertyName, serializable, deserializable, genericArguments, genericMetadatas, namingConvention, referenceHandler, serializer, typeArgument, typeMetadata, preserveNull, useDefaultValue, useImplicitConversion);
this.currentPropertyState = resolvedPropertyState;
return resolvedPropertyState;
};
PropertyMetadata.prototype.unresolvePropertyState = function () {
var unresolvedPropertyState = new UnresolvedPropertyState(this);
this.currentPropertyState = unresolvedPropertyState;
return unresolvedPropertyState;
};
PropertyMetadata.prototype.resolveCustomValueMap = function (typeState) {
var e_1, _a;
var propertyOptions = this.propertyOptions;
var customValueMap = new Map();
if (propertyOptions.customValueMap === undefined) {
return customValueMap;
}
var typeCustomValueMap = typeState.customValueMap === undefined
? EMPTY_MAP
: typeState.customValueMap;
try {
for (var _b = __values(propertyOptions.customValueMap), _c = _b.next(); !_c.done; _c = _b.next()) {
var _d = __read(_c.value, 2), customKey = _d[0], customValue = _d[1];
if (customValue === undefined) {
customValueMap.set(customKey, typeCustomValueMap.get(customKey));
continue;
}
customValueMap.set(customKey, customValue);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
return customValueMap;
};
PropertyMetadata.prototype.hasAlias = function (alias) {
this.propertyOptions.alias = alias;
this.currentPropertyState = new UnresolvedPropertyState(this);
return this;
};
PropertyMetadata.prototype.hasCustomValueMap = function (customValueMap) {
var e_2, _a;
var currentCustomValueMap = this.propertyOptions.customValueMap;
if (currentCustomValueMap === undefined) {
currentCustomValueMap = new Map();
this.propertyOptions.customValueMap = currentCustomValueMap;
}
if (customValueMap !== undefined) {
if (currentCustomValueMap !== customValueMap) {
currentCustomValueMap.clear();
}
try {
for (var customValueMap_1 = __values(customValueMap), customValueMap_1_1 = customValueMap_1.next(); !customValueMap_1_1.done; customValueMap_1_1 = customValueMap_1.next()) {
var _b = __read(customValueMap_1_1.value, 2), customKey = _b[0], customValue = _b[1];
currentCustomValueMap.set(customKey, customValue);
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (customValueMap_1_1 && !customValueMap_1_1.done && (_a = customValueMap_1.return)) _a.call(customValueMap_1);
}
finally { if (e_2) throw e_2.error; }
}
}
this.currentPropertyState = new UnresolvedPropertyState(this);
return this;
};
PropertyMetadata.prototype.hasCustomValue = function (customKey, customValue) {
var customValueMap = this.propertyOptions.customValueMap;
if (customValueMap === undefined) {
customValueMap = new Map();
this.propertyOptions.customValueMap = customValueMap;
}
customValueMap.set(customKey, customValue);
this.currentPropertyState = new UnresolvedPropertyState(this);
return this;
};
PropertyMetadata.prototype.extractCustomValue = function (customKey) {
var customValue = this.propertyState.customValueMap.get(customKey);
if (customValue === undefined && customKey.customValueResolver !== undefined) {
customValue = customKey.customValueResolver();
}
return customValue;
};
PropertyMetadata.prototype.hasCustomOptions = function (customOptions) {
var customValueMap = this.propertyOptions.customValueMap;
if (customValueMap === undefined) {
customValueMap = new Map();
this.propertyOptions.customValueMap = customValueMap;
}
for (var i = 0; i < customOptions.length; i++) {
customValueMap.set(customOptions[i][0], customOptions[i][1]);
}
this.currentPropertyState = new UnresolvedPropertyState(this);
return this;
};
PropertyMetadata.prototype.hasDefaultValue = function (defaultValue) {
this.propertyOptions.defaultValue = defaultValue;
this.currentPropertyState = new UnresolvedPropertyState(this);
return this;
};
PropertyMetadata.prototype.hasSerializedDefaultValue = function (serializedDefaultValue) {
this.propertyOptions.serializedDefaultValue = serializedDefaultValue;
this.currentPropertyState = new UnresolvedPropertyState(this);
return this;
};
PropertyMetadata.prototype.hasDeserializedDefaultValue = function (deserializedDefaultValue) {
this.propertyOptions.deserializedDefaultValue = deserializedDefaultValue;
this.currentPropertyState = new UnresolvedPropertyState(this);
return this;
};
PropertyMetadata.prototype.isDeserializable = function (deserializable) {
if (deserializable === void 0) { deserializable = true; }
this.propertyOptions.deserializable = deserializable;
this.currentPropertyState = new UnresolvedPropertyState(this);
return this;
};
PropertyMetadata.prototype.isSerializable = function (serializable) {
if (serializable === void 0) { serializable = true; }
this.propertyOptions.serializable = serializable;
this.currentPropertyState = new UnresolvedPropertyState(this);
return this;
};
PropertyMetadata.prototype.hasGenericArguments = function (genericArguments) {
this.propertyOptions.genericArguments = genericArguments;
this.currentPropertyState = new UnresolvedPropertyState(this);
return this;
};
PropertyMetadata.prototype.hasNamingConvention = function (namingConvention) {
this.propertyOptions.namingConvention = namingConvention;
this.currentPropertyState = new UnresolvedPropertyState(this);
return this;
};
PropertyMetadata.prototype.hasReferenceHandler = function (referenceHandler) {
this.propertyOptions.referenceHandler = referenceHandler;
this.currentPropertyState = new UnresolvedPropertyState(this);
return this;
};
PropertyMetadata.prototype.hasSerializer = function (serializer) {
this.propertyOptions.serializer = serializer;
this.currentPropertyState = new UnresolvedPropertyState(this);
return this;
};
PropertyMetadata.prototype.hasTypeArgument = function (typeArgument) {
this.propertyOptions.typeArgument = typeArgument !== null && typeArgument !== void 0 ? typeArgument : this.reflectTypeFn;
this.currentPropertyState = new UnresolvedPropertyState(this);
return this;
};
PropertyMetadata.prototype.shouldPreserveNull = function (preserveNull) {
if (preserveNull === void 0) { preserveNull = true; }
this.propertyOptions.preserveNull = preserveNull;
this.currentPropertyState = new UnresolvedPropertyState(this);
return this;
};
PropertyMetadata.prototype.shouldUseDefaultValue = function (useDefaultValue) {
if (useDefaultValue === void 0) { useDefaultValue = true; }
this.propertyOptions.useDefaultValue = useDefaultValue;
this.currentPropertyState = new UnresolvedPropertyState(this);
return this;
};
PropertyMetadata.prototype.shouldUseImplicitConversion = function (useImplicitConversion) {
if (useImplicitConversion === void 0) { useImplicitConversion = true; }
this.propertyOptions.useImplicitConversion = useImplicitConversion;
this.currentPropertyState = new UnresolvedPropertyState(this);
return this;
};
PropertyMetadata.prototype.configure = function (propertyOptions) {
if (propertyOptions.alias !== undefined) {
this.hasAlias(propertyOptions.alias);
}
if (propertyOptions.customValueMap !== undefined) {
this.hasCustomValueMap(propertyOptions.customValueMap);
}
if (propertyOptions.defaultValue !== undefined) {
this.hasDefaultValue(propertyOptions.defaultValue);
}
if (propertyOptions.serializedDefaultValue !== undefined) {
this.hasSerializedDefaultValue(propertyOptions.serializedDefaultValue);
}
if (propertyOptions.deserializedDefaultValue !== undefined) {
this.hasDeserializedDefaultValue(propertyOptions.deserializedDefaultValue);
}
if (propertyOptions.deserializable !== undefined) {
this.isDeserializable(propertyOptions.deserializable);
}
if (propertyOptions.genericArguments !== undefined) {
this.hasGenericArguments(propertyOptions.genericArguments);
}
if (propertyOptions.namingConvention !== undefined) {
this.hasNamingConvention(propertyOptions.namingConvention);
}
if (propertyOptions.referenceHandler !== undefined) {
this.hasReferenceHandler(propertyOptions.referenceHandler);
}
if (propertyOptions.serializable !== undefined) {
this.isSerializable(propertyOptions.serializable);
}
if (propertyOptions.serializer !== undefined) {
this.hasSerializer(propertyOptions.serializer);
}
if (propertyOptions.typeArgument !== undefined) {
this.hasTypeArgument(propertyOptions.typeArgument);
}
if (propertyOptions.preserveNull !== undefined) {
this.shouldPreserveNull(propertyOptions.preserveNull);
}
if (propertyOptions.useDefaultValue !== undefined) {
this.shouldUseDefaultValue(propertyOptions.useDefaultValue);
}
if (propertyOptions.useImplicitConversion !== undefined) {
this.shouldUseImplicitConversion(propertyOptions.useImplicitConversion);
}
return this;
};
return PropertyMetadata;
}(Metadata));
export { PropertyMetadata };
//# sourceMappingURL=property-metadata.js.map