inversify-binding-decorators
Version:
An utility that allows developers to declare InversifyJS bindings using ES2016 decorators
34 lines (33 loc) • 1.5 kB
JavaScript
import { decorate, injectable, METADATA_KEY as inversify_METADATA_KEY } from "inversify";
import { METADATA_KEY } from "../constants";
function provide(serviceIdentifier, force) {
return function (target) {
var isAlreadyDecorated = Reflect.hasOwnMetadata(inversify_METADATA_KEY.PARAM_TYPES, target);
var redecorateWithInject = force === true;
if (redecorateWithInject === true && isAlreadyDecorated === false) {
decorate(injectable(), target);
}
else if (redecorateWithInject === true && isAlreadyDecorated === true) {
// Do nothing
}
else {
try {
decorate(injectable(), target);
}
catch (e) {
throw new Error("Cannot apply @provide decorator multiple times but is has been used " +
("multiple times in " + target.name + " ") +
"Please use @provide(ID, true) if you are trying to declare multiple bindings!");
}
}
var currentMetadata = {
constraint: function (bind, bindTarget) { return bind(serviceIdentifier).to(bindTarget); },
implementationType: target
};
var previousMetadata = Reflect.getMetadata(METADATA_KEY.provide, Reflect) || [];
var newMetadata = [currentMetadata].concat(previousMetadata);
Reflect.defineMetadata(METADATA_KEY.provide, newMetadata, Reflect);
return target;
};
}
export default provide;