CDI
Cool Dependency Injection
A lightweight, powerful and very easy to use dependency injection framework.
Support singleton, prototype and custom scopes, configuration injection and handling of 
multiple instances of modules. 
Usage
npm install --save cdiand code:
let path = require('path');
let CDI = require('cdi');
let cdi = new cdi({
    moduleSrc: [path.join(__dirname, 'src')]
});
let myMainModule = cdi.getInstance('MainModule');
myMainModule.nowDoMyStuff();
// as i promised, simple as hell :Dsimple example with module and configuration injection
src/wheels.js:
class Wheels {
    constructor(size) {
        this.size = size;
    }
}
module.exports = Wheels;
module.exports.inject = ['config:bike:wheels.size'];src/bike.js:
class Bike {
    constructor(wheels) {
        this.wheels = wheels;
    }
}
module.exports = Bike;
module.exports.inject = ['Wheels'];main.js:
const path = require('path');
const CDI = require('cdi');
const bikeConfig = {
    wheels: {
        size: 26
    }
};
let cdi = new CDI({
    moduleSrc: [path.join(__dirname, 'src')],
    cacheFile: path.join(__dirname, 'cache', 'cdi.json'),
    configurations: {
        bike: bikeConfig
    }
});
let myBike = cdi.getInstance('Bike');
// now you got your bike with injected wheels, which got the size information injectedready for more?
more complex example with active usage of dependency trees
src/speed.js:
class Speed {
    constructor() {
        this.speed = 0;
    }
    setSpeed(speed) {
        this.speed = speed;
    }
}
module.exports = Speed;src/wheel.js:
class Wheel {
    constructor(size, speed) {
        this.size = size;
        this.position = module.exports.tree;
        this.speed = speed;
    }
}
module.exports = Wheel;
module.exports.inject = ['config:bike:wheels.size', 'Speed:root'];src/bike.js:
class Bike {
    constructor(frontWheel, backWheel) {
        this.wheels = {frontWheel, backWheel};
    }
}
module.exports = Bike;
module.exports.inject = ['Wheel:front', 'Wheel:back'];main.js:
const path = require('path');
const CDI = require('cdi');
const bikeConfig = {
    wheels: {
        size: 26
    }
};
let cdi = new CDI({
    moduleSrc: [path.join(__dirname, 'src')],
    cacheFile: path.join(__dirname, 'cache', 'cdi.json'),
    configurations: {
        bike: bikeConfig
    }
});
let myBike = cdi.getInstance('Bike');
// now you got your bike with two injected wheels, which got the size information injected 
// and share one common speed instanceDocumentation
So you're still on it? :) great!! A good start is Options
Contribute
You want to make the world a better place and want to start with this module? awesome :D
Please read the contribution guidelines to get started and i'm looking forward to new stuff.