eggnog
v1.3.0
Published
What Require() should be
Downloads
38
Maintainers
Readme
eggnog
What require() should be.
See the wiki for complete documentation.
eggnog is a simple, lightweight dependency injection framework for NodeJs
- Designed for making modular applications easy to write
- Minimal boilerplate -- Convention over configuration
- No config files or factories to maintain -- eggnog crawls your project for you
- Dependency injection allow for easier testing
- No need to require any special dependencies in your files -- eggnog acts more like a spec than a library
Current Version: 1.3.0
Let's assume this is file structure for our application:
index.js
package.json
node_modules/
express/
...
src/
server/
index.js
utils/
config.js
Here's what our src/server/index.js
module might look like:
module.exports = function(
/* utils/config.serverPort */ serverPort,
/* lib::express */ express,
/* global::console */ console
/* core::os */ os) {
// This is pretty much the Express.js Hello World app, verbatim.
// The only difference is that we use arguments to the exported function
// instead of using require().
// The inline comments next to the arguments direct eggnog what to
// provide for the arguments.
// (Also, I'm including os just to show how to load core modules.)
var app = express();
app.get('/', function (req, res) {
res.send('Hello World!');
});
var server = app.listen(serverPort, function () {
var host = server.address().address;
var port = server.address().port;
console.log('Example app listening at http://%s:%s on %s', host, port, os.type());
});
return app;
};
Our src/utils/config.js
looks like this:
// Note, this file doesn't have any dependencies, so no arguments
// to its export function
module.exports = function() {
return {
serverPort: 8080,
foo: true,
barUser: 'Mikey',
...
};
};
Finally, index.js
pulls everything together
// Note! This file needs to be at the root of our project, alongside the
// node_modules and 'src' directories!
var eggnog = require('eggnog');
// All of our source files are ./src
var context = new eggnog.Context('./src');
// context.loadModule('server/index') will find the "server/index" module in the
// 'src' directory, load it and any transitive dependencies, and then execute its
// function, automatically supplying its transitive dependencies as the arguments.
// It returns whatever the 'server/index' module returned after it loaded.
var app = context.loadModule('server/index');
Launching our application is nothing special:
node index.js
That's it! eggnog will handle the rest.
What about unit testing?
var eggnog = require('eggnog');
var sinon = require('sinon');
var context = new eggnog.TestContext('/src');
var express = sinon.spy();
// Set up express spy
...
var app = context.createModule('server/index', {
'utils/config.serverPort': 8080,
'lib::express': express,
'global::console': { log: function() {} }
});
// Assertions follow...
...