okam-build
Version:
The build tool for Okam develop framework
101 lines (85 loc) • 2.17 kB
JavaScript
/**
* @file Dev server
* @author sparklewhy@gmail.com
*/
;
const customRequire = require('../util').require;
const SERVER = {
koa: {
path: './KoaServer',
deps: ['koa']
},
express: {
path: './ExpressServer',
deps: ['express']
},
connect: {
path: './ConnectServer',
deps: ['connect']
}
};
function normalizeMiddlewares(mws, root) {
if (!Array.isArray(mws)) {
return;
}
let result = [];
let deps = [];
mws.forEach(item => {
let name;
let options;
if (Array.isArray(item)) {
name = item[0];
options = item[1];
}
else if (typeof item === 'object') {
name = item.name;
options = item.options;
}
else if (typeof item === 'function') {
result.push(item);
return;
}
else {
// ignore invalidated middlware
return;
}
if (!deps.includes(name)) {
customRequire.ensure(name, [name], root);
deps.push(name);
result.push(customRequire(name, root)(options));
}
});
return result;
}
/* eslint-disable fecs-camelcase */
let _instance;
function createDevServer(options) {
if (_instance) {
return _instance;
}
let {port, logger, middlewares, type = 'connect', root} = options;
port || (port = process.env.PORT || 8080);
let serverInfo = SERVER[type];
if (!serverInfo) {
throw new Error(`unknow server type: ${type}`);
}
let deps = serverInfo.deps;
try {
customRequire.ensure(type, deps, root);
middlewares = normalizeMiddlewares(middlewares, root);
}
catch (ex) {
logger.error(ex.stack || ex.toString());
process.exit(1);
}
let Server = require(serverInfo.path);
let devServer = new Server({
port, logger, middlewares, dep: customRequire(deps[0], root)
});
_instance = devServer;
return devServer;
}
module.exports = exports = createDevServer;
exports.getInstance = function () {
return _instance;
};