UNPKG

yahoi

Version:

Yet Another Highly Opinionated Isomorphic Framework

304 lines (251 loc) 11.5 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = undefined; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); require('./conditional-babel-polyfill'); var _express = require('express'); var _express2 = _interopRequireDefault(_express); var _readdir = require('readdir'); var _readdir2 = _interopRequireDefault(_readdir); var _bodyParser = require('body-parser'); var _bodyParser2 = _interopRequireDefault(_bodyParser); var _cookieParser = require('cookie-parser'); var _cookieParser2 = _interopRequireDefault(_cookieParser); var _compression = require('compression'); var _compression2 = _interopRequireDefault(_compression); var _path = require('path'); var _path2 = _interopRequireDefault(_path); var _ErrorController = require('./../Controller/ErrorController'); var _ErrorController2 = _interopRequireDefault(_ErrorController); var _TranslationController = require('./../Controller/TranslationController'); var _TranslationController2 = _interopRequireDefault(_TranslationController); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var ENVIRONMENT_PATH = "Environments/"; var ROUTERS_PATH = "Routing/"; var Controller_PATH = "Controller/"; var Services_PATH = "Services/"; var Server = function () { function Server(props) { _classCallCheck(this, Server); this.__props = props; this.__environment = this.loadEnvironment(props.env); this.__services = this.loadServices(props.env); this.__controller = this.loadController(props.env); // Default Error Controller var defaultErrorController = new _ErrorController2.default({ app: this }); defaultErrorController.setViewDirectory(_path2.default.resolve(__dirname, '..', 'Views')); defaultErrorController.setProjectDirectory(_path2.default.resolve(__dirname, '..')); defaultErrorController.setComponentDirectory(_path2.default.resolve(__dirname, '..', 'Components')); defaultErrorController.setContainerDirectory(_path2.default.resolve(__dirname, '..', 'Containers')); this.__controller['__defaultErrorController'] = defaultErrorController; // Default Translation Controller var defaultTranslationController = new _TranslationController2.default({ app: this }); defaultTranslationController.setViewDirectory(_path2.default.resolve(__dirname, '..', 'Views')); defaultTranslationController.setProjectDirectory(_path2.default.resolve(__dirname, '..')); defaultTranslationController.setComponentDirectory(_path2.default.resolve(__dirname, '..', 'Components')); defaultTranslationController.setContainerDirectory(_path2.default.resolve(__dirname, '..', 'Containers')); this.__controller['DefaultTranslation'] = defaultTranslationController; this.__routers = this.loadRouters(props.env); this.__expressApp = (0, _express2.default)(); this.__expressApp.use(_bodyParser2.default.urlencoded({ extended: true })); this.__expressApp.use(_bodyParser2.default.json()); this.__expressApp.use((0, _cookieParser2.default)()); this.getController = this.getController.bind(this); this.__defaultRouter = new this.__routers['Default']({ app: this }); this.__defaultRouter.addRoute({ path: '/Translations', router: 'DefaultTranslation' }); if (typeof process.env.NODE_ENV != 'undefined' && process.env.NODE_ENV == 'development') { // Development var enableHmrMidWare = require('./dev/expressMiddleware.js'); enableHmrMidWare(this, this.__expressApp); } else { // Production this.__expressApp.use((0, _compression2.default)()); } } _createClass(Server, [{ key: 'getDefaultRouter', value: function getDefaultRouter() { return this.__defaultRouter; } }, { key: 'getController', value: function getController(name) { if (typeof this.__controller[name] == 'undefined') { throw Error('Controller could not be found: ' + name); } return this.__controller[name]; } }, { key: 'getService', value: function getService(name) { return this.__services[name]; } }, { key: 'loadRouters', value: function loadRouters() { var _this = this; try { var routers = {}; _readdir2.default.readSync(this.getProjectPath() + '/' + ROUTERS_PATH).map(function (routerFile) { if (routerFile.indexOf('.js') > 0) { var routerName = routerFile.substr(0, routerFile.length - 9); routers[routerName] = require(_this.getProjectPath() + '/' + ROUTERS_PATH + routerFile).default; } }); // build-in _readdir2.default.readSync(__dirname + '/../Routing').map(function (routerFile) { if (routerFile.indexOf('.js') > 0) { var routerName = routerFile.substr(0, routerFile.length - 9); routers[routerName] = require(__dirname + '/../Routing/' + routerFile).default; } }); // console.log('initialized routers', routers); return routers; } catch (e) { throw e; } } }, { key: 'loadController', value: function loadController() { var _this2 = this; try { var controller = {}; _readdir2.default.readSync(this.getProjectPath() + '/' + Controller_PATH).map(function (controllerFile) { if (controllerFile.indexOf('Controller.js') > 0) { var cntrlName = controllerFile.substr(0, controllerFile.length - 13); var controllerObj = new (require(_this2.getProjectPath() + '/' + Controller_PATH + controllerFile).default)({ app: _this2 }); controllerObj.setViewDirectory(_path2.default.resolve(_this2.getProjectPath(), 'Views')); controllerObj.setProjectDirectory(_this2.getProjectPath()); controllerObj.setComponentDirectory(_path2.default.resolve(_this2.getProjectPath(), 'Components')); controllerObj.setContainerDirectory(_path2.default.resolve(_this2.getProjectPath(), 'Containers')); controller[cntrlName] = controllerObj; } }); return controller; } catch (e) { throw e; } } }, { key: 'loadServices', value: function loadServices() { var _this3 = this; try { var services = {}; _readdir2.default.readSync(this.getProjectPath() + '/' + Services_PATH).map(function (serviceFile) { if (serviceFile.indexOf('Service.js') > 0) { var serviceName = serviceFile.substr(0, serviceFile.length - 10); var serviceObj = new (require(_this3.getProjectPath() + '/' + Services_PATH + serviceFile).default)({ app: _this3 }); // controllerObj.setViewDirectory(path.resolve(this.getProjectPath(), 'Views')); serviceObj.setProjectDirectory(_this3.getProjectPath()); serviceObj.setComponentDirectory(_path2.default.resolve(_this3.getProjectPath(), 'Components')); serviceObj.setContainerDirectory(_path2.default.resolve(_this3.getProjectPath(), 'Containers')); services[serviceName] = serviceObj; } }); return services; } catch (e) { throw e; } } }, { key: 'createRouter', value: function createRouter(name, props) { if (typeof this.__routers[name] == 'undefined') { throw Error('Router ' + name + ' not found'); } return new this.__routers[name](props); } }, { key: 'getProjectPath', value: function getProjectPath() { return this.__props.projectPath; } }, { key: 'getEnvironment', value: function getEnvironment() { return this.__environment; } }, { key: 'loadEnvironment', value: function loadEnvironment(name) { try { return require(this.getProjectPath() + '/' + ENVIRONMENT_PATH + name).default; } catch (e) { throw e; } } }, { key: 'start', value: function start() { var _this4 = this; this.__expressApp.use('/Public', _express2.default.static(this.getProjectPath() + '/Public')); /* this.__expressApp.use('/Translations/get', (req, res) => { this.getController('__defaultTranslationController') .renderAction('get', req, res) .then(actionContext => { try { actionContext.getResponse().respond(req, res); } catch(e) { res.send('[1] Internal Server Error: ' + String(e)); } }) .catch(e => { res.send('[2] Internal Server Error: ' + String(e)); }) }) */ //this.__expressApp.use('/Translations', express.static(`${this.getProjectPath()}/Translations`)) this.__expressApp.all("*", function (req, res) { var matchResult = _this4.getDefaultRouter().match(req); if (matchResult) { matchResult.route.renderAction(req, res, matchResult).then(function (actionContext) { try { actionContext.getResponse().respond(req, res); } catch (e) { res.send('Error: ' + String(e)); } }).catch(function (e) { req.query = { error: e, controllerName: matchResult.route.getControllerName(), actionName: matchResult.route.getActionName() }; _this4.getController('__defaultErrorController').renderAction('actionError', req, res).then(function (actionContext) { try { actionContext.getResponse().respond(req, res); } catch (e) { res.send('[1] Internal Server Error: ' + String(e)); } }).catch(function (e) { res.send('[2] Internal Server Error: ' + String(e)); }); }); } else { _this4.getController('__defaultErrorController').renderAction('noRoute', req, res).then(function (actionContext) { try { actionContext.getResponse().respond(req, res); } catch (e) { console.log('Internal Server Error:', e); res.send('Internal Server Error: ' + String(e)); } }).catch(function (e) { console.log('renderedError', e); }); } }); this.__expressApp.listen(this.getEnvironment().server.port, function () { console.log('Server started: ' + process.env.NODE_ENV); console.log('Project Path: ', _this4.getProjectPath()); console.log('Port: ', _this4.getEnvironment().server.port); }); } }]); return Server; }(); exports.default = Server;