Have ideas to improve npm?Join in the discussion! »

    injecting

    2.8.2 • Public • Published

    Build Status npm version Dependency Status JavaScript Style Guide

    Injecting

    A simple javascript dependency inject processor, work great with Promise.

    Example

    simple injection:

    var injecting = require('injecting');
    var app = injecting();
    app.register('name', 'jack');
    app.register('person', function(name) {
        this.name = name;
    });
     
    app.invoke(function(person) {
        console.log(person.name); // jack
    });

    recursive injection:

    var injecting = require('injecting');
    var app = injecting();
    app.register('place', 'pacific');
    app.register('cat', function() {
        this.name = "white cat";
    });
    app.register('person', function(cat) {
        this.name = "robot";
        this.pet = cat;
    });
    app.register('story', function(place, person){
        return {
            place: place,
            person: person.name,
            pet: person.pet.name
        };
    });
    app.invoke(function(story){
        console.log(story);
        /* should be
        {
            place: 'pacific',
            person: 'robot',
            pet: 'white cat'
        };
        */
    });
     

    Async Function

     
    var injecting = require('injecting');
    var app = injecting();
    function sleep(ms) {
      return new Promise(function(resolve) {
        setTimeout(function () {
          resolve('');
        }, ms);
      });
    }
     
    // function that return a promise
    app.register('name', function() {
      return sleep(1000).then(() =>'jack');
    });
     
    // generator as async function and inject `name`
    app.register('person', function* (name) {
      yield sleep(1000);
      return {name: name, age: 10};
    });
     
    app
      .get('person')
      .then(function(person) {
        console.log(person); // should be {name: 'jack', age: 10}
      });

    Anti Minification

    The code shows above does not robust enough when our source code is minified. For example:

    app.register('person', 'jack');
    app.invoke(function(person) {
      console.log(person);
    });
    // will be minified as
    app.invoke(function(a) {
      console.log(a);
    });
    // it will lead to app crush in such case since `a` is not registered.

    Solution

    There are several method to avoid minification problem. Look at the code below:

    // invoke a function with predefined injections
    app.invoke(['person', 'job', function(p, j) {
      console.log(p, j);
    });
    // register a dep with predefined injections
    app.register('person', ['name', 'age', function (n, a) {
      return {name: n, age: a};
    });

    Please refer to the test cases for more examples.

    methods

    constant(name, value)

    register a constant as dependency.

    service(name, constructor)

    register a service as dependency. notice you have to pass a function for it. injecting will call the constructor and return the instance the first time you inject. It will return the same instance for later use.

    register(name, obj|fn)

    register the argument as dependency. automatically register as constant if the second argument is object|string|number, and register as service if the second argument is function.

    invoke(fn)

    invoke a function and automatically inject for its arguments. Expect to return a promise.

    get(name)

    get a particular injection in promise form.

    License

    MIT

    Install

    npm i injecting

    DownloadsWeekly Downloads

    6

    Version

    2.8.2

    License

    MIT

    Unpacked Size

    34.9 kB

    Total Files

    8

    Last publish

    Collaborators

    • avatar
    • avatar