UNPKG

@dipscope/type-manager

Version:

Transform JSON strings or plain objects into JS class instances.

69 lines 2.86 kB
import { EMPTY_ARRAY } from './constants/empty-array'; import { Unknown } from './unknown'; export class Metadata { constructor(typeManager, typeFnMap) { this.typeManager = typeManager; this.typeFnMap = typeFnMap; return; } resolveTypeMetadatas(typeArguments) { const typeMetadatas = new Array(typeArguments.length); for (let i = 0; i < typeArguments.length; i++) { typeMetadatas[i] = this.resolveTypeMetadata(typeArguments[i]); } return typeMetadatas; } resolveTypeMetadata(typeArgument) { if (typeof typeArgument === 'function') { if (typeArgument.name === '') { return this.resolveTypeMetadataUsingTypeResolver(typeArgument); } return this.resolveTypeMetadataUsingTypeFn(typeArgument); } if (typeof typeArgument === 'string') { return this.resolveTypeMetadataUsingAlias(typeArgument); } return this.resolveTypeMetadataUsingUnknownTypeFn(); } resolveTypeMetadataUsingTypeResolver(typeArgument) { const typeResolver = typeArgument; return this.typeManager.extractTypeMetadata(typeResolver()); } resolveTypeMetadataUsingTypeFn(typeArgument) { const typeFn = typeArgument; return this.typeManager.extractTypeMetadata(typeFn); } resolveTypeMetadataUsingAlias(typeArgument) { const alias = typeArgument; const typeFn = this.typeFnMap.get(alias); if (typeFn === undefined) { this.typeManager.logger.error('Metadata', 'Cannot resolve type metadata for provided type alias.', alias); this.typeManager.logger.info('Metadata', 'Check if a type exists that defines such an alias. In the meantime, metadata for an unknown type will be used.'); return this.resolveTypeMetadataUsingUnknownTypeFn(); } return this.typeManager.extractTypeMetadata(typeFn); } resolveTypeMetadataUsingUnknownTypeFn() { const typeFn = Unknown; return this.typeManager.extractTypeMetadata(typeFn); } resolveGenericMetadatas(genericArguments) { const genericMetadatas = new Array(genericArguments.length); for (let i = 0; i < genericArguments.length; i++) { const genericArgument = genericArguments[i]; if (Array.isArray(genericArgument)) { genericMetadatas[i] = [ this.resolveTypeMetadata(genericArgument[0]), this.resolveGenericMetadatas(genericArgument[1]) ]; continue; } genericMetadatas[i] = [ this.resolveTypeMetadata(genericArgument), EMPTY_ARRAY ]; } return genericMetadatas; } } //# sourceMappingURL=metadata.js.map