UNPKG

@dipscope/type-manager

Version:

Transform JSON strings or plain objects into JS class instances.

530 lines 24.9 kB
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