xrequire

eXtended Require: Folder requires and index.js toolkit.

XREQUIRE

XREQUIRE is your index.js folder loader swiss army knife.

$ npm install xrequire --save
  • Implement your index.js in a single line:
require('xrequire')(module)
  • Or the more common style found with other libs:
module.exports = require('xrequire')(__dirname)
  • Post-process modules on the fly by passing a map function:
require('xrequire')(module, function(exportsnamebasename) {
 
  // hidden base class 
  function Base() { }
  Base.prototype = new Object();
 
  // inject base class and other shared dependencies 
  return exports(Base, require('underscore'), require('async'));
 
});
  • Filters module by passing a filter function:
require('xrequire')(module,
  { filter:
    function(name) {
      return name[0] !== '_'; // modules with _ prefix should be hidden 
    }
  }
);
  • Or reject works too:
require('xrequire')(module,
  { reject:
    function(name) {
      return name[0] === '_'; // modules with _ prefix should be hidden 
    }
  }
);
  • Append (or prepend) a namespace-specific name to your classes without having long filenames:
// assume we have roles/admin.js roles/staff.js and roles/guest.js 
// we'll get adminRole, staffRole and guestRole exports 
 
require('xrequire')(module, { append: 'Role' });
  • Transform your file names into ClassNames dasherized-name or even "Titleized Long Strings Keys" via an integrated pksunkara/inflect hook:
require('xrequire')(module, { inflect: 'classify' }); // or ... 
require('xrequire')(module, { inflect: 'dasherize' }); // or ... 
require('xrequire')(module, { inflect: 'titleize' }); // or ... 
// other i.hooks works too. 
  • The last two options together provide some nice naming capability out of the box:
require('xrequire')(module, { inflect: 'classify', append: 'Role' })
 
// assume we have roles/admin.js roles/staff.js and roles/guest.js 
// we'll get AdminRole, StaffRole and GuestRole all neat and clean :) 
  • Implemented in pure JS with 100% test coverage (yeah, there wasn't much to be tested anyway.)
$ make cover

OPTIONS

{ filter: null  // function : return true to include only wanted modules 
, reject: null  // function : return true to reject only select modules 
, map: null     // function : transform module exports before re-exporting it 
 
, prepend: ''   // string   : prepend to module names before exported 
, append: ''    // string   : append to module names before exported 
, inflect: ''   // string   : name of inflection method to use 
, magic: true   // boolean  : set to false to prevent module.exports magic 
}

DEVELOPMENT

Test xrequire by running

$ make test

and generate coverage reports by running

$ make cover
  • Subfolder requires.
  • Support for folder requires without needing to implement index.js.
  • More inflection tests and validation.
  • Direct name transform function.

LICENSE

BSD

SUPPORT

Just open a GitHub issue or ping me on twitter @chakrit