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

import path from 'path';
import mkdirp from 'mkdirp';
import express from 'express';

const log = debug('helper:express:module:info');
const error = debug('helper:express:module:error');
const routes = {};

export const moduleLoader = function(app, config, ...args) {
  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) {
    routes[m] =
        require(process.env.PWD + '/modules/' + m + '/route.js').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 (config.locals) { // todo merge deep
      res.locals = config.locals;
    }
clemo's avatar
clemo committed
    res.locals.url = config.url;
    res.locals.user = req.user;
clemo's avatar
clemo committed
    next();
  });
  app.get('/', (req, res) => { res.redirect(config.url.home); });

  // devcontrol middleware
  /*
  view
  */
  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);
    }
    rout.use('/static',
             express.static(process.env.PWD + '/modules/' + m + '/static'));
clemo's avatar
clemo committed
  }
  app.set('views', views);

};
exports.default = moduleLoader;