This package has been deprecated

Author message:

flip-flop is being replace by @flipflop/core and @flipflop/node

flip-flop

0.0.18 • Public • Published

Flip Flop

Just Another IOC Library

flipflops

This Package is Deprecated, please use @flipflop/core and @flipflop/node packages

Thanks to everyone that tried out flip flop. This package wasn't browser friendly so I've decided to break out the dependency injection code from the node-centric stuff for better modularity and clarity. Tentatively there will be a @flipflop/core module and a @flipflop/node module. @flipflop/browser and @flipflop/server modules are on the roadmap as well but may not see the light of day for a while.

flip-flop is just another ioc library

* in progress

Install

npm install --save flip-flop

Usage

Tell flipflop where your dependencies are

let flipflop = require('flip-flop');
 
flipflop('./dist/*.js')
  .load(function(){
    console.log('everything loaded!');
  });

flipflop loads your files and takes care of supplying your (a)sync dependencies when they're ready.

Just export a function in your js files

module.exports = function(flipflop){
  app('my.module')
    .modules('my.otherModule')
    .collections('collection1', 'collection2')
    .when(function(myOtherModule, collection1, collection2){
      // do something with your dependencies
    })
}

return an A+ compliant thenable (a promise) if your module has to do some async stuff

module.exports = function(app){
  app.module('d')
    .when(function(){
      return new Promise(function(resolve, reject){
        setTimeout(function(){
          resolve('D');
        }, 3000);
      });
    });
  });
}

Why?

let email = require('../../../../../../../lib/modules/components/settings/email.js');

That's why.

You can probably come up with a glob to match all of your project files in a few seconds so just tell flip-flop what you want and stop worrying about where your code is.

Features

Asyncronous Dependencies

As long as your module constructor returns an A+ compliant thenable then any modules that depend on it won't load until it resolves.

log.txt
This is useful log output
a.js
module.exports = function(app){
  app('a')
    .when(function(){
      return new Promise(function(resolve, reject){
        fs.readFile('log.txt', 'utf8', function(err, file){
          if(err){
            return reject(err);
          }
          return resolve(file);
        });
      });
    });
};
b.js
module.exports = function(a){
  app('b')
    .modules('a')
    .when(function(a){
      console.log(a); // This is useful log output
    });
};

Returning anything but a promise lets flip-flop know that your module is ready right away.

Collections

With flip-flop you register and depend on collections. This is useful when you want to create multiple modules that share something in common

server.js
module.exports = function(app){
  app('restify')
    .collections('controllers')
    .when(function(controllers){
      return new Promise(function(resolve, reject){
        var restify = require('restify');
        var server  = restify.createServer();
        server.get('/c1', controllers[0].value);
        server.get('/c2', controllers[1].value);
        server.listen(8080, function(){
          resolve(server);
        });
      });
    });
};
controller1.js
module.exports = function(app){
  app('hello-controller')
    .when(function(){
      return function(req, res, next){
        res.send('hello');
      }
    })
};
controller2.js
module.exports = function(app){
  app('goodbye-controller')
    .when(function(){
      return function(req, res, next){
        res.send('goodbye');
      }
    })
};

API

flipflop(String) | FlipFlop

Pass a file glob to flipflop which matches all of the files you wish to load. A FlipFlop instance will be returned with methods for loading your files and configuring your settings

const flipflop = require('flipflop');
const fl = flipflop('**/*.js');

flipflop(Array) | FlipFlop

Pass an array of file globs to flipflop which matches all of the files you wish to load. A FlipFlop instance will be returned with methods for loading your files and configuring your settings

const flipflop = require('flipflop');
const fl = flipflop([
  'dist/**/*.js',
  'vendor/some-file/some-file.js'
]);

flipflop uses glob-all to parse your globs

[FlipFlop].options(Object) | [FlipFlop]

TODO

  • Better Reject() logic
  • Write Tests
  • Make it Global
  • Support for a config file instead of options
  • Travis
  • Coveralls See See

Package Sidebar

Install

npm i flip-flop

Weekly Downloads

1

Version

0.0.18

License

MIT

Last publish

Collaborators

  • craigplafferty