cider-di
Version:
Minimal Dependency Injection Framework for javascript
81 lines (80 loc) • 2.27 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
;
function createInjector(mod) {
const dependencies = {};
const providers = {};
const context = {};
const injecting = {};
let injectingCounter = 0;
Object.keys(mod).forEach(key => {
const binding = mod[key];
providers[key] = function () {
if (injecting[key]) {
const graph = Object.keys(injecting)
.map(key => ({
name: key,
ord: injecting[key]
}))
.filter(({ ord }) => ord !== undefined)
.sort((l, r) => (l.ord || 0) - (r.ord || 0))
.map(({ name }) => name)
.join('=>');
throw new Error(`Detected Circular Dependency ${graph}=>${key}`);
}
injecting[key] = injectingCounter++;
const r = binding.call(this, dependencies, providers, context);
injecting[key] = undefined;
injectingCounter--;
return r;
};
providers[key].tags = binding.tags || [];
Object.defineProperty(dependencies, key, {
enumerable: true,
get: providers[key]
});
});
return {
dependencies: dependencies,
providers: providers,
context
};
}
exports.createInjector = createInjector;
let singletonId = 0;
function singleton(binding) {
const id = `singleton_${singletonId++}`;
const s = function (dependencies, providers, context) {
if (context[id] === undefined) {
context[id] = binding.call(this, dependencies, providers, context);
}
return context[id];
};
s.tags = binding.tags;
return s;
}
exports.singleton = singleton;
function instance(v) {
return () => {
return v;
};
}
exports.instance = instance;
function tagged(tags, binding) {
binding.tags = (binding.tags || []).concat(tags);
return binding;
}
exports.tagged = tagged;
function alias(name) {
return function (_, providers) {
return providers[name]();
};
}
exports.alias = alias;
exports.default = {
createInjector,
singleton,
instance,
tagged,
alias
};