UNPKG

dora

Version:

A fully pluggable server for development.

170 lines (134 loc) 4.86 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray'); var _slicedToArray3 = _interopRequireDefault(_slicedToArray2); exports.resolvePlugin = resolvePlugin; exports.resolvePlugins = resolvePlugins; exports.applyPlugins = applyPlugins; var _loaderUtils = require('loader-utils'); var _path = require('path'); var _isPlainObject = require('is-plain-object'); var _isPlainObject2 = _interopRequireDefault(_isPlainObject); var _resolve = require('./resolve'); var _resolve2 = _interopRequireDefault(_resolve); var _spmLog = require('spm-log'); var _spmLog2 = _interopRequireDefault(_spmLog); var _reduceAsync = require('./reduceAsync'); var _reduceAsync2 = _interopRequireDefault(_reduceAsync); var _isGeneratorFn = require('is-generator-fn'); var _isGeneratorFn2 = _interopRequireDefault(_isGeneratorFn); var _co = require('co'); var _co2 = _interopRequireDefault(_co); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function isRelative(filepath) { return filepath.charAt(0) === '.'; } function isAbsolute(filepath) { return filepath.charAt(0) === '/'; } function resolvePlugin(_pluginName, resolveDir) { var cwd = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : process.cwd(); var plugin = void 0; var query = {}; var originQuery = void 0; var name = void 0; if (typeof _pluginName === 'string') { var _pluginName$split = _pluginName.split('?'), _pluginName$split2 = (0, _slicedToArray3.default)(_pluginName$split, 2), pluginName = _pluginName$split2[0], _query = _pluginName$split2[1]; if (_query) { originQuery = '?' + _query; query = (0, _loaderUtils.parseQuery)(originQuery); } name = pluginName; if (isRelative(pluginName)) { plugin = require((0, _path.join)(cwd, pluginName)); } else if (isAbsolute(pluginName)) { plugin = require(pluginName); } else { // is Module var pluginPath = (0, _resolve2.default)(pluginName, resolveDir); if (!pluginPath) { throw new Error('[Error] ' + pluginName + ' not found in ' + resolveDir); } plugin = require(pluginPath); } } else if ((0, _isPlainObject2.default)(_pluginName)) { plugin = _pluginName; } else if (Array.isArray(_pluginName)) { name = _pluginName[0]; query = _pluginName[1]; var _pluginPath = (0, _resolve2.default)(name, resolveDir); if (!_pluginPath) { throw new Error('[Error] ' + name + ' not found in ' + resolveDir); } plugin = require(_pluginPath); } else { throw Error('[Error] pluginName must be string or object or [string, object]'); } return (0, _extends3.default)({ name: name, originQuery: originQuery, query: query }, plugin); } function resolvePlugins(pluginNames, resolveDir, cwd) { return pluginNames.map(function (pluginName) { return resolvePlugin(pluginName, resolveDir, cwd); }); } function applyPlugins(plugins, name, context, pluginArgs) { var _callback = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : function noop() {}; var ret = void 0; var contextModify = context; (0, _reduceAsync2.default)(plugins, pluginArgs, function (memo, plugin, callback) { var func = plugin[name]; if (!func) return callback(null, memo); var log = ['debug', 'info', 'warn', 'error'].reduce(function (_memo, key) { var m = _memo; m[key] = function (msg) { _spmLog2.default[key](plugin.name, msg); }; return m; }, {}); // Add more context api contextModify.plugins = plugins; contextModify.query = plugin.query; contextModify.log = log; contextModify.callback = callback; contextModify.restart = function () { console.log(); _spmLog2.default.info('dora', 'try to restart...'); process.send('restart'); }; if (name === 'middleware') { contextModify.app.use(func.call(contextModify)); callback(); } else if ((0, _isGeneratorFn2.default)(func)) { _co2.default.wrap(func).call(contextModify).then(function (val) { callback(null, val); }, callback); } else { var funcResult = func.call(contextModify, memo); if (funcResult && funcResult.then) { funcResult.then(function (result) { callback(null, result); }).catch(callback).catch(function (err) { throw new Error(err); }); } else { callback(null, funcResult); } } }, function (err, result) { ret = result; if (_callback) _callback(err, result); }); // For all sync plugins. return ret; }