import url from 'url'; import debug from 'debug'; import path from 'path'; import mkdirp from 'mkdirp'; import express from 'express'; import serveFavicon from 'serve-favicon'; const log = debug('helper:express:module:info'); const error = debug('helper:express:module:error'); const dbug = debug('helper:express:module:debug'); const routes = {}; /** * Load a devcontrol-module * @extends Express * @param {Object} app - expressjs object. * @param {Object} config - helper.config instace. * @param {string} ...args - will be redirected to route method of module */ export const moduleLoader = function(app, config, ...args) { if('undefined' !== typeof config.url.favicon){ dbug('favicon was defined,'+config.url.favicon); app.use(serveFavicon(config.url.favicon)); } if ('undefined' !== typeof config.url.prependurl) { for (let m in config.url.modules[m]) { config.url.modules[m] = config.url.prependurl + config.url.modules[m]; } } for (let m in config.modules) { try{ dbug('require module',m); routes[m] = require(process.env.PWD + '/modules/' + m + '/route.js').default; }catch(e){ dbug('require module from npm',m); routes[m] = require(m).default; } } app.use((req, res, next) => { log(req.method, req.url); if ('undefined' === typeof res.locals) { res.locals = {}; } // res.locals.baseHost = url.parse(config.url.baseurl); if ("undefined" !== typeof config.locals) { // todo merge deep dbug("set view vars", JSON.stringify(config.locals, null, 2)); res.locals = config.locals; } res.locals.url = config.url; res.locals.user = req.user; next(); }); app.get('/', (req, res) => { res.redirect(config.url.home); }); function setConfig(config, m) { return function(req, res, next) { req.config = config.modules[m]; if ('undefined' === typeof res.locals) { res.locals = {}; // todo merge modules locals } next(); } } app.set('view engine', 'pug'); let views = [ path.join(process.env.PWD, './views') ]; for (let m in config.modules) { views.push(path.join(__dirname, m, 'views')); let moduleconfig = Object.assign({url : config.url}, config.modules[m], {baseurl : config.url.modules[m]}); let rout = routes[m](moduleconfig, ...args); rout.use(setConfig(config, m)); if (moduleconfig.use) { app.use(moduleconfig.baseurl, moduleconfig.use, rout); } else { app.use(moduleconfig.baseurl, rout); } try{ dbug('use static['+m+']','try local'); rout.use('/static', express.static(process.env.PWD + '/modules/' + m + '/static')); }catch(e){ dbug('use static['+m+'] try node_modules,because of',e); rout.use('/static', express.static(process.env.PWD + '/modules/' + m + '/static')); } } app.set('views', views); }; exports.default = moduleLoader;