Skip to content
Snippets Groups Projects
moduleLoader.js 2.89 KiB
Newer Older
clemo's avatar
clemo committed
import url from 'url';
import debug from 'debug';
import path from 'path';
clemo's avatar
clemo committed

clemo's avatar
clemo committed
import mkdirp from 'mkdirp';
import express from 'express';
clemo's avatar
clemo committed
import serveFavicon from 'serve-favicon';
clemo's avatar
clemo committed

const log = debug('helper:express:module:info');
const error = debug('helper:express:module:error');
clemo's avatar
clemo committed
const dbug = debug('helper:express:module:debug');
clemo's avatar
clemo committed
const routes = {};
clemo's avatar
clemo committed
/**
 * 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
 */
clemo's avatar
clemo committed
export const moduleLoader = function(app, config, ...args) {
clemo's avatar
clemo committed
  if('undefined' !== typeof config.url.favicon){
    dbug('favicon was defined,'+config.url.favicon);
    app.use(serveFavicon(config.url.favicon));
  }
clemo's avatar
clemo committed
  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) {
clemo's avatar
clemo committed
    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;
    }
clemo's avatar
clemo committed
  }
  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);
zwarag's avatar
zwarag committed
    if ("undefined" !== typeof config.locals) { // todo merge deep
clemo's avatar
clemo committed
      dbug("set view vars", JSON.stringify(config.locals, null, 2));
      res.locals = config.locals;
    }
clemo's avatar
clemo committed
    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
clemo's avatar
clemo committed
      }
      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);
    }
clemo's avatar
clemo committed
    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'));
    }
clemo's avatar
clemo committed
  }
  app.set('views', views);

};
exports.default = moduleLoader;