inversify
Version:
A powerful and lightweight inversion of control container for JavaScript and Node.js apps powered by TypeScript.
56 lines (55 loc) • 2.42 kB
JavaScript
;
var METADATA_KEY = require("../constants/metadata_keys");
var ERROR_MSGS = require("../constants/error_msgs");
function tagParameter(annotationTarget, propertyName, parameterIndex, metadata) {
var metadataKey = METADATA_KEY.TAGGED;
return _tagParameterOrProperty(metadataKey, annotationTarget, propertyName, metadata, parameterIndex);
}
exports.tagParameter = tagParameter;
function tagProperty(annotationTarget, propertyName, metadata) {
var metadataKey = METADATA_KEY.TAGGED_PROP;
return _tagParameterOrProperty(metadataKey, annotationTarget.constructor, propertyName, metadata);
}
exports.tagProperty = tagProperty;
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);
}
}
exports.decorate = decorate;