Skip to content

Commit

Permalink
fix: async service instantiating
Browse files Browse the repository at this point in the history
  • Loading branch information
matuszeman committed Jun 16, 2017
1 parent bc4d143 commit 64a44c7
Show file tree
Hide file tree
Showing 6 changed files with 347 additions and 36 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -490,7 +490,7 @@ Creates an alias for existing container instance.

**Example**
```js
dic.instance('one', 1);
dic.instance('one', {some: 'instance'});
dic.alias('one', 'oneAgain');

dic.get('one') === dic.get('oneAgain')
Expand Down
145 changes: 145 additions & 0 deletions es5/dic-loader.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
'use strict';

var _getIterator2 = require('babel-runtime/core-js/get-iterator');

var _getIterator3 = _interopRequireDefault(_getIterator2);

var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');

var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);

var _createClass2 = require('babel-runtime/helpers/createClass');

var _createClass3 = _interopRequireDefault(_createClass2);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var _ = require('lodash');
var nodePath = require('path');
var globby = require('globby');

/**
* Dic loader
*
* @example
* const {Dic, DicLoader} = require('bb-dic');
* const dic = new Dic()
*
* const loader = new DicLoader({
* rootDir: __dirname //if not specified process.cwd() is used
* });
*
* //loads all .js files under src folder
* loader.loadPath('src/*.js');
*/

var DicLoader = function () {
/**
* @param {Object} opts
* @param {string} opts.rootDir Absolute path to root folder of source files. Default: `process.cwd()`
*/
function DicLoader() {
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
(0, _classCallCheck3.default)(this, DicLoader);

this.options = _.defaults(opts, {
rootDir: process.cwd(),
debug: false
});
}

/**
* Load all instances/factories/classes to {@link Dic}.
*
* File types and what they should export
* - name.js -> class
* - name.factory.js -> factory
* - name.async-factory.js -> async factory
* - name.instance.js -> instance
*
*
* File name dictates what name the service will be registered as.
* E.g. `my-service.js` service would become registered as `myService` => file name is camelCased.
*
* @example // Registers all services under `CWD/src` folder.
*
* const {Dic, DicLoader} = require('bb-dic');
* const dic = new Dic();
* const loader = new DicLoader();
* loader.loadPath(dic, 'src/*.js');
*
* module.exports = dic;
*
* @param {Dic} dic
* @param {string} path glob expression {@link https://www.npmjs.com/package/globby}
*/


(0, _createClass3.default)(DicLoader, [{
key: 'loadPath',
value: function loadPath(dic, path) {
var ret = globby.sync(path, {
cwd: this.options.rootDir
});
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;

try {
for (var _iterator = (0, _getIterator3.default)(ret), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var p = _step.value;

var _path = this.options.rootDir + '/' + p;
var mod = require(_path);
var basename = nodePath.basename(p, '.js');

var type = 'class';
var name = _.camelCase(basename);

var match = basename.match(/(.*)\.(factory|async-factory|instance)$/);
if (match) {
name = _.camelCase(match[1]);
type = match[2];
}

if (this.options.debug) {
console.log('DicLoader: ' + name + ' [' + type + '] -> ' + _path);
}

switch (type) {
case 'class':
dic.registerClass(name, mod);
break;
case 'async-factory':
dic.asyncFactory(name, mod);
break;
case 'factory':
dic.factory(name, mod);
break;
case 'instance':
dic.instance(name, mod);
break;
default:
throw new Error('Type ' + type + ' not supported');
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
}
}]);
return DicLoader;
}();

module.exports = DicLoader;
132 changes: 111 additions & 21 deletions es5/dic.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
'use strict';

var _getIterator2 = require('babel-runtime/core-js/get-iterator');

var _getIterator3 = _interopRequireDefault(_getIterator2);

var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');

var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
Expand Down Expand Up @@ -595,7 +599,7 @@ var Dic = function () {
* Creates an alias for existing container instance.
*
* @example
* dic.instance('one', 1);
* dic.instance('one', {some: 'instance'});
* dic.alias('one', 'oneAgain');
*
* dic.get('one') === dic.get('oneAgain')
Expand Down Expand Up @@ -745,10 +749,10 @@ var Dic = function () {
this.throwError('Use dic.createInstanceAsync() instead', opts.stack);
break;
case 'factory':
return (_def = def).factory.apply(_def, (0, _toConsumableArray3.default)(this.getServices(def, opts)));
return (_def = def).factory.apply(_def, (0, _toConsumableArray3.default)(this._getServices(def, opts)));
break;
case 'class':
return new (Function.prototype.bind.apply(def.class, [null].concat((0, _toConsumableArray3.default)(this.getServices(def, opts)))))();
return new (Function.prototype.bind.apply(def.class, [null].concat((0, _toConsumableArray3.default)(this._getServices(def, opts)))))();
break;
default:
this.throwError('Unknown instance def type: ' + def.type, opts.stack);
Expand Down Expand Up @@ -790,7 +794,7 @@ var Dic = function () {
_context3.t2 = _def2;
_context3.t3 = _toConsumableArray3.default;
_context3.next = 9;
return this.getServicesAsync(def, opts);
return this._getServicesAsync(def, opts);

case 9:
_context3.t4 = _context3.sent;
Expand All @@ -806,7 +810,7 @@ var Dic = function () {
_context3.t7 = _def3;
_context3.t8 = _toConsumableArray3.default;
_context3.next = 20;
return this.getServicesAsync(def, opts);
return this._getServicesAsync(def, opts);

case 20:
_context3.t9 = _context3.sent;
Expand All @@ -819,7 +823,7 @@ var Dic = function () {
_context3.t13 = [null];
_context3.t14 = _toConsumableArray3.default;
_context3.next = 30;
return this.getServicesAsync(def, opts);
return this._getServicesAsync(def, opts);

case 30:
_context3.t15 = _context3.sent;
Expand Down Expand Up @@ -913,8 +917,8 @@ var Dic = function () {
return def;
}
}, {
key: 'getServices',
value: function getServices(def) {
key: '_getServices',
value: function _getServices(def) {
var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var container = def.container;

Expand All @@ -927,21 +931,107 @@ var Dic = function () {
});
}
}, {
key: 'getServicesAsync',
value: function getServicesAsync(def) {
var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var container = def.container;
key: '_getServicesAsync',
value: function () {
var _ref4 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee4(def) {
var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

var params = this._getDefParams(def);
var servicesPromises = params.map(function (param) {
if (def.inject[param]) {
return def.inject[param];
}
return container.getAsync(param, opts);
});
var container, params, ret, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, param;

return _promise2.default.all(servicesPromises);
}
return _regenerator2.default.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
container = def.container;
params = this._getDefParams(def);
ret = [];
_iteratorNormalCompletion = true;
_didIteratorError = false;
_iteratorError = undefined;
_context4.prev = 6;
_iterator = (0, _getIterator3.default)(params);

case 8:
if (_iteratorNormalCompletion = (_step = _iterator.next()).done) {
_context4.next = 20;
break;
}

param = _step.value;

if (!def.inject[param]) {
_context4.next = 12;
break;
}

return _context4.abrupt('return', def.inject[param]);

case 12:
_context4.t0 = ret;
_context4.next = 15;
return container.getAsync(param, opts);

case 15:
_context4.t1 = _context4.sent;

_context4.t0.push.call(_context4.t0, _context4.t1);

case 17:
_iteratorNormalCompletion = true;
_context4.next = 8;
break;

case 20:
_context4.next = 26;
break;

case 22:
_context4.prev = 22;
_context4.t2 = _context4['catch'](6);
_didIteratorError = true;
_iteratorError = _context4.t2;

case 26:
_context4.prev = 26;
_context4.prev = 27;

if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}

case 29:
_context4.prev = 29;

if (!_didIteratorError) {
_context4.next = 32;
break;
}

throw _iteratorError;

case 32:
return _context4.finish(29);

case 33:
return _context4.finish(26);

case 34:
return _context4.abrupt('return', ret);

case 35:
case 'end':
return _context4.stop();
}
}
}, _callee4, this, [[6, 22, 26, 34], [27,, 29, 33]]);
}));

function _getServicesAsync(_x13) {
return _ref4.apply(this, arguments);
}

return _getServicesAsync;
}()
}, {
key: '_getDefParams',
value: function _getDefParams(def) {
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
{
"name": "bb-dic",
"version": "1.0.0",
"version": "1.0.1",
"description": "A dependency injection container",
"main": "src/index.js",
"scripts": {
"test": "mocha --harmony 'src/**/*.spec.js'",
"test-watch": "mocha --harmony --watch 'src/**/*.spec.js'",
"test:watch": "mocha --harmony --watch 'src/**/*.spec.js'",
"build": "npm run es5 && npm run docs",
"es5": "babel src -d es5 --ignore '**/*.spec.js'",
"docs": "jsdoc2md --configure jsdoc.json --template README.hbs.md \"src/**/*.js\" > README.md"
Expand Down
Loading

0 comments on commit 64a44c7

Please sign in to comment.