1.0.2 • Published 6 years ago

dijay v1.0.2

Weekly downloads
-
License
MIT
Repository
-
Last release
6 years ago

Dependency Injection

Powerful, simple, and lightweight inversion of control or dependency injection. It's only about 110 lines, works in node and the browser, even with webpack.

Usage

Lets define a module in dir/modA/index.js

module.exports = {
  name: 'modA'
}

And another one in in dir/modB

module.exports = async function(require) {
  return {
    name: 'modB',
    modA: await require('dir/modA'),
    myMod: await require('MyModuleName'),
  }
}

Note that your module can be anything, but if it's a function, it will be passed a require function which you can use to require other modules you have defined.

We now need to set up the container: (in ./index.js)

const Dijay = require('dijay')

let di = Dijay()

// Lets define a module
di.define('MyModuleName', {
  name: 'MyModuleName'
})
// Now we can require 'MyModuleName'

// This will mount all js files from the directory you pass in
di.mountDir(__dirname)
// now we have defined `dir/modA` (or `dir/modA/index`) and `dir/modB`

// This will allow you to require from `node_modules` as well
di.mountModules()

// You can also overwrite any previously defined module (Extremely useful for testing)
di.define('dir/modA', () => ({
  name: 'NotActuallyModA'
}))

// Start the container
await di.inject()

const ModB = di.get('dir/modB')
// ModB is now
{
  name: 'modB',
  modA: { name: 'NotActuallyModA' },
  myMod: { name: 'MyModuleName' }
}

Usage with webpack

Webpack's require behaves differently. Since webpack configurations vary a lot, the following should serve you as an example:

const di = DependencyInjection()

let context = require.context('.', true, /\.js$/)
context.keys().forEach(function (key) {
  const mod = context(key)
  const name = key.slice(2, -3) // strip leading `./` and trailing `.js`
  di.define(name, mod.default)
})

await di.inject()
1.0.2

6 years ago

1.0.1

6 years ago

1.0.0

6 years ago