voila-fs-di
v1.0.1
Published
A library for creating a di graph from modules on the file system
Downloads
2
Readme
Voilà File System Dependency Graph
A library for creating a DI graph from modules on the file system
Common usage, with main.js as follows.
If using a build step, the globs should be written to be correct in the transpiled code
const promise = fsGraph({
globs: [
`src/controllers/**/*Controller.{js,ts}`,
`src/daos/**/*Dao.{js,ts}`,
`src/services/**/*Service.{js,ts}`
],
deriveKey: func => func.name
});
And with the file system arranged as follows.
root
└─┬src
├─┬controllers
| └──resourceController.js
├─┬daos
| └──resourceDao.js
├─┬services
| └──resourceService.js
└──main.js
And with the file contents as follows.
resourceController.js
export default function resourceController(resourceService) {
return {
doControllerAction(request, reply) {
// [... transport logic]
return resourceService.doServiceAction(request.params).then(reply);
}
};
}
fsGraph
expects that modules that match the glob patterns export a function as module.exports
or default
. Each function is passed to the deriveKey
option to determine its di key. The
function arguments are parsed and should coincide with the other keys in the graph--this does not
work with transpiled destructuring.
resourceService.js
modules.exports = function resourceService(resourceDao) {
return {
doServiceAction(params) {
// [... business logic]
return resourceDao.doDaoAction(params);
}
};
}
resourceDao.js
export default function resourceDao(/* someClient */) {
return {
doDaoAction(params) {
// [... dao logic]
// someClient.send(params);
}
};
}
This setup will produce a dependency graph, for use with voila-di, as follows.
import fsGraph from 'voila-fs-di';
const promise = fsGraph({
globs: [
`src/controllers/**/*Controller.{js,ts}`,
`src/daos/**/*Dao.{js,ts}`,
`src/services/**/*Service.{js,ts}`
],
deriveKey: func => func.name
});
promise.then(console.log);
// { resourceController:
// { dependencies: [ 'resourceService' ],
// provider: [Function: resourceController] },
// resourceDao:
// { dependencies: [],
// provider: [Function: resourceDao] },
// resourceService:
// { dependencies: [ 'resourceDao' ],
// provider: [Function: resourceService] } }
And this is what the integration looks like.
import fsGraph from 'voila-fs-di';
import di from 'voila-di';
const promise = fsGraph({
globs: [
`src/controllers/**/*Controller.{js,ts}`,
`src/daos/**/*Dao.{js,ts}`,
`src/services/**/*Service.{js,ts}`
],
deriveKey: func => func.name
});
promise
// Validate here if you'd like
.then(graph => di(graph).get('resourceController'))
.then(console.log);
// => { doControllerAction: [Function: doControllerAction] }