UNPKG

inversify

Version:

A powerful and lightweight inversion of control container for JavaScript and Node.js apps powered by TypeScript.

53 lines (52 loc) 2.36 kB
import * as METADATA_KEY from "../constants/metadata_keys"; import * as ERROR_MSGS from "../constants/error_msgs"; function tagParameter(annotationTarget, propertyName, parameterIndex, metadata) { var metadataKey = METADATA_KEY.TAGGED; return _tagParameterOrProperty(metadataKey, annotationTarget, propertyName, metadata, parameterIndex); } function tagProperty(annotationTarget, propertyName, metadata) { var metadataKey = METADATA_KEY.TAGGED_PROP; return _tagParameterOrProperty(metadataKey, annotationTarget.constructor, propertyName, metadata); } function _tagParameterOrProperty(metadataKey, annotationTarget, propertyName, metadata, parameterIndex) { var paramsOrPropertiesMetadata = {}; var isParameterDecorator = (typeof parameterIndex === "number"); var key = (parameterIndex !== undefined && isParameterDecorator) ? parameterIndex.toString() : propertyName; if (isParameterDecorator === true && propertyName !== undefined) { throw new Error(ERROR_MSGS.INVALID_DECORATOR_OPERATION); } if (Reflect.hasOwnMetadata(metadataKey, annotationTarget) === true) { paramsOrPropertiesMetadata = Reflect.getMetadata(metadataKey, annotationTarget); } var paramOrPropertyMetadata = paramsOrPropertiesMetadata[key]; if (Array.isArray(paramOrPropertyMetadata) !== true) { paramOrPropertyMetadata = []; } else { for (var i = 0; i < paramOrPropertyMetadata.length; i++) { var m = paramOrPropertyMetadata[i]; if (m.key === metadata.key) { throw new Error(ERROR_MSGS.DUPLICATED_METADATA + " " + m.key); } } } paramOrPropertyMetadata.push(metadata); paramsOrPropertiesMetadata[key] = paramOrPropertyMetadata; Reflect.defineMetadata(metadataKey, paramsOrPropertiesMetadata, annotationTarget); return annotationTarget; } function _decorate(decorators, target) { Reflect.decorate(decorators, target); } function _param(paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); }; } function decorate(decorator, target, parameterIndex) { if (typeof parameterIndex === "number") { _decorate([_param(parameterIndex, decorator)], target); } else { _decorate([decorator], target); } } export { decorate, tagParameter, tagProperty };