UNPKG

cider-di

Version:

Minimal Dependency Injection Framework for javascript

81 lines (80 loc) 2.27 kB
"use strict"; 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 };