UNPKG

sgapps-server

Version:
804 lines (710 loc) 30.7 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>decorators/nodejs-mvc-bootstrap.js - SGApps Server - Framework</title> <meta name="description" content="SGApps Server for high performance results" /> <meta name="keywords" content="javascript, js, application-prototype, prototype" /> <meta name="keyword" content="javascript, js, application-prototype, prototype" /> <meta property="og:title" content="SGApps Server - Framework"/> <meta property="og:type" content="website"/> <meta property="og:image" content=""/> <meta property="og:url" content="https://labs.sgapps.io/open-source/sgapps-server"/> <script src="scripts/prettify/prettify.js"></script> <script src="scripts/prettify/lang-css.js"></script> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> <link type="text/css" rel="stylesheet" href="styles/prettify.css"> <link type="text/css" rel="stylesheet" href="styles/jsdoc.css"> <script src="scripts/nav.js" defer></script> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <input type="checkbox" id="nav-trigger" class="nav-trigger" /> <label for="nav-trigger" class="navicon-button x"> <div class="navicon"></div> </label> <label for="nav-trigger" class="overlay"></label> <nav class="wrap"> <input type="text" id="nav-search" placeholder="Search" /> <h2><a href="index.html">Home</a></h2><h2><a href="https://labs.sgapps.io/open-source/sgapps-server" target="_blank" class="menu-item" id="website_link" >Project Page ( Git Lab )</a></h2><h2><a href="http://gordienco.net/" target="_blank" class="menu-item" id="website_link" >About Me</a></h2><h2><a href="https://labs.sgapps.io/open-source/sgapps-server" target="_blank" class="menu-item" id="github_link" >GitHub</a></h2><h3>Classes</h3><ul><li><a href="AccessLogger.html">AccessLogger</a><ul class='methods'><li data-type='method' style='display: none;'><a href="AccessLogger.html#formattedDate">formattedDate</a></li><li data-type='method' style='display: none;'><a href="AccessLogger.html#getProtocol">getProtocol</a></li><li data-type='method' style='display: none;'><a href="AccessLogger.html#getReferer">getReferer</a></li><li data-type='method' style='display: none;'><a href="AccessLogger.html#getRemoteIp">getRemoteIp</a></li><li data-type='method' style='display: none;'><a href="AccessLogger.html#getSize">getSize</a></li><li data-type='method' style='display: none;'><a href="AccessLogger.html#getUsername">getUsername</a></li><li data-type='method' style='display: none;'><a href="AccessLogger.html#logRequest">logRequest</a></li></ul></li><li><a href="FaceboxTemplate.html">FaceboxTemplate</a><ul class='methods'><li data-type='method' style='display: none;'><a href="FaceboxTemplate.html#render">render</a></li><li data-type='method' style='display: none;'><a href="FaceboxTemplate.html#renderCode">renderCode</a></li><li data-type='method' style='display: none;'><a href="FaceboxTemplate.html#renderFile">renderFile</a></li></ul></li><li><a href="FSLibrary.html">FSLibrary</a></li><li><a href="LoggerBuilder.html">LoggerBuilder</a><ul class='methods'><li data-type='method' style='display: none;'><a href="LoggerBuilder.html#decorateGlobalLogger">decorateGlobalLogger</a></li><li data-type='method' style='display: none;'><a href="LoggerBuilder.html#error">error</a></li><li data-type='method' style='display: none;'><a href="LoggerBuilder.html#info">info</a></li><li data-type='method' style='display: none;'><a href="LoggerBuilder.html#log">log</a></li><li data-type='method' style='display: none;'><a href="LoggerBuilder.html#prettyCli">prettyCli</a></li><li data-type='method' style='display: none;'><a href="LoggerBuilder.html#prompt">prompt</a></li><li data-type='method' style='display: none;'><a href="LoggerBuilder.html#warn">warn</a></li></ul></li><li><a href="SGAppsServer.html">SGAppsServer</a><ul class='methods'><li data-type='method' style='display: none;'><a href="SGAppsServer.html#all">all</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#connect">connect</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#delete">delete</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#Email">Email</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#finalHandler">finalHandler</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#get">get</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#handle">handle</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#handleErrorRequest">handleErrorRequest</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#handlePostData">handlePostData</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#handleRequest">handleRequest</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#handleStaticRequest">handleStaticRequest</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#head">head</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#options">options</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#patch">patch</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#post">post</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#put">put</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#server">server</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#trace">trace</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#use">use</a></li></ul></li><li><a href="SGAppsServer.NodeJsMvc.html">NodeJsMvc</a></li><li class="level-hide"><a href="SGAppsServer.NodeJsMvc.Controller.html">Controller</a><ul class='methods'><li data-type='method' style='display: none;'><a href="SGAppsServer.NodeJsMvc.Controller.html#actionExists">actionExists</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.NodeJsMvc.Controller.html#addAction">addAction</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.NodeJsMvc.Controller.html#addView">addView</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.NodeJsMvc.Controller.html#getAction">getAction</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.NodeJsMvc.Controller.html#getView">getView</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.NodeJsMvc.Controller.html#removeAction">removeAction</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.NodeJsMvc.Controller.html#removeView">removeView</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.NodeJsMvc.Controller.html#render">render</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.NodeJsMvc.Controller.html#viewExists">viewExists</a></li></ul></li><li class="level-hide"><a href="SGAppsServer.NodeJsMvc.Controller.Action.html">Action</a><ul class='methods'><li data-type='method' style='display: none;'><a href="SGAppsServer.NodeJsMvc.Controller.Action.html#run">run</a></li></ul></li><li><a href="SGAppsServerDecoratorsLibrary.html">SGAppsServerDecoratorsLibrary</a><ul class='methods'><li data-type='method' style='display: none;'><a href="SGAppsServerDecoratorsLibrary.html#.AccessLoggerDecorator">AccessLoggerDecorator</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerDecoratorsLibrary.html#.NodeJsMvcDecorator">NodeJsMvcDecorator</a></li></ul></li><li><a href="SGAppsServerDictionary.html">SGAppsServerDictionary</a><ul class='methods'><li data-type='method' style='display: none;'><a href="SGAppsServerDictionary.html#generatePathKey">generatePathKey</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerDictionary.html#push">push</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerDictionary.html#run">run</a></li></ul></li><li><a href="SGAppsServerEmail.html">SGAppsServerEmail</a><ul class='methods'><li data-type='method' style='display: none;'><a href="SGAppsServerEmail.html#.from">from</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerEmail.html#.isValidAddress">isValidAddress</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerEmail.html#.timeout">timeout</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerEmail.html#send">send</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerEmail.html#valid">valid</a></li></ul></li><li><a href="SGAppsServerRequest.html">SGAppsServerRequest</a><ul class='methods'><li data-type='method' style='display: none;'><a href="SGAppsServerRequest.html#_parseDeepFieldName">_parseDeepFieldName</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerRequest.html#getMountUpdatedUrl">getMountUpdatedUrl</a></li></ul></li><li><a href="SGAppsServerRequestCookie.html">SGAppsServerRequestCookie</a><ul class='methods'><li data-type='method' style='display: none;'><a href="SGAppsServerRequestCookie.html#get">get</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerRequestCookie.html#set">set</a></li></ul></li><li><a href="SGAppsServerRequestSession.html">SGAppsServerRequestSession</a><ul class='methods'><li data-type='method' style='display: none;'><a href="SGAppsServerRequestSession.html#destroy">destroy</a></li></ul></li><li><a href="SGAppsServerResponse.html">SGAppsServerResponse</a><ul class='methods'><li data-type='method' style='display: none;'><a href="SGAppsServerResponse.html#pipeFile">pipeFile</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerResponse.html#pipeFileStatic">pipeFileStatic</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerResponse.html#redirect">redirect</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerResponse.html#send">send</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerResponse.html#sendError">sendError</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerResponse.html#sendStatusCode">sendStatusCode</a></li></ul></li><li><a href="SGAppsServerShared.html">SGAppsServerShared</a></li><li><a href="SGAppsSessionManager.html">SGAppsSessionManager</a><ul class='methods'><li data-type='method' style='display: none;'><a href="SGAppsSessionManager.html#handleRequest">handleRequest</a></li><li data-type='method' style='display: none;'><a href="SGAppsSessionManager.html#removeExpiredSessions">removeExpiredSessions</a></li></ul></li><li><a href="TemplateManager.html">TemplateManager</a><ul class='methods'><li data-type='method' style='display: none;'><a href="TemplateManager.html#add">add</a></li><li data-type='method' style='display: none;'><a href="TemplateManager.html#addList">addList</a></li><li data-type='method' style='display: none;'><a href="TemplateManager.html#get">get</a></li><li data-type='method' style='display: none;'><a href="TemplateManager.html#remove">remove</a></li><li data-type='method' style='display: none;'><a href="TemplateManager.html#render">render</a></li><li data-type='method' style='display: none;'><a href="TemplateManager.html#templateExists">templateExists</a></li></ul></li><li><a href="TemplateManagerViewer.html">TemplateManagerViewer</a><ul class='methods'><li data-type='method' style='display: none;'><a href="TemplateManagerViewer.html#render">render</a></li><li data-type='method' style='display: none;'><a href="TemplateManagerViewer.html#renderCode">renderCode</a></li></ul></li></ul><h3>Global</h3><ul><li><a href="global.html#LoggerBuilderPrompt">LoggerBuilderPrompt</a></li><li><a href="global.html#MountUpdatedURL">MountUpdatedURL</a></li><li><a href="global.html#RequestHandler">RequestHandler</a></li><li><a href="global.html#RequestPathStructure">RequestPathStructure</a></li><li><a href="global.html#RequestPathStructureMap">RequestPathStructureMap</a></li><li><a href="global.html#RequestSessionDecorator">RequestSessionDecorator</a></li><li><a href="global.html#ResourcesExtensions">ResourcesExtensions</a></li><li><a href="global.html#routeMatch">routeMatch</a></li><li><a href="global.html#SGAppsServerDecorator">SGAppsServerDecorator</a></li><li><a href="global.html#SGAppsServerDictionaryRunCallBack">SGAppsServerDictionaryRunCallBack</a></li><li><a href="global.html#SGAppsServerErrorCallBack">SGAppsServerErrorCallBack</a></li><li><a href="global.html#SGAppsServerErrorOnlyCallback">SGAppsServerErrorOnlyCallback</a></li><li><a href="global.html#SGAppsServerHandlerPostData">SGAppsServerHandlerPostData</a></li><li><a href="global.html#SGAppsServerOptions">SGAppsServerOptions</a></li><li><a href="global.html#SGAppsServerRequestFile">SGAppsServerRequestFile</a></li><li><a href="global.html#SGAppsServerRequestPostDataItem">SGAppsServerRequestPostDataItem</a></li><li><a href="global.html#SGAppsServerRequestSessionCache">SGAppsServerRequestSessionCache</a></li><li><a href="global.html#SGAppsSessionManagerOptions">SGAppsSessionManagerOptions</a></li><li><a href="global.html#TemplateManagerRenderOptions">TemplateManagerRenderOptions</a></li><li><a href="global.html#TemplateManagerTemplate">TemplateManagerTemplate</a></li></ul> </nav> <div id="main"> <h1 class="page-title">decorators/nodejs-mvc-bootstrap.js</h1> <section> <article> <pre class="prettyprint source linenums"><code>const TemplateManagerViewer = require("../prototypes/server/extend/template-manager/viewer"); /** * @memberof SGAppsServer.NodeJsMvc.Controller * @typedef {object} View * @property {string} name * @property {string} path * @property {string} code */; /** * @memberof SGAppsServer.NodeJsMvc.Controller.Action * @callback OptionCapture * @param {SGAppsServerRequest} request * @param {SGAppsServerResponse} response * @param {SGAppsServer} server * @param {SGAppsServer.NodeJsMvc.Controller} controller * @param {SGAppsServer.NodeJsMvc.Controller.Action} action */ /** * @memberof SGAppsServer.NodeJsMvc.Controller.Action * @typedef {object} Options * @property {boolean} public * @property {boolean} postData * @property {number} maxPostSize * @property {SGAppsServer.NodeJsMvc.Controller.Action.OptionCapture} [capture] */; /** * @memberof SGAppsServer.NodeJsMvc.Controller * @class * @name Action * @param {string} actionName * @param {SGAppsServer.NodeJsMvc.Controller} controller * @param {SGAppsServer.NodeJsMvc.Controller.Action.Options} options * @param {SGAppsServer} server */ function NodeJsMvcAction(actionName, controller, options, server ) { var _config = Object.assign( { public: false, postData: false, maxPostSize: server.MAX_POST_SIZE, capture: null }, options || {} ); /** * @private * @type {SGAppsServer.NodeJsMvc.Controller.Action} */ //@ts-ignore var actionObject = { /** * @memberof SGAppsServer.NodeJsMvc.Controller.Action# * @name controller * @type {SGAppsServer.NodeJsMvc.Controller} */ controller : controller, /** * @memberof SGAppsServer.NodeJsMvc.Controller.Action# * @name name * @type {string} */ name : actionName, /** * @memberof SGAppsServer.NodeJsMvc.Controller.Action# * @method run * @param {SGAppsServerRequest} request * @param {SGAppsServerResponse} response */ run : function(request, response) { if ( ('capture' in _config) &amp;&amp; _config.capture ) { _config.capture( request, response, server, controller, actionObject ); } else { response.sendError(Error('[Server.NodeJsMvc.Controller.Action] is empty')); } } }; /** * @memberof SGAppsServer.NodeJsMvc.Controller.Action# * @name public * @type {boolean} */ Object.defineProperty( actionObject, 'public', { get: () => _config.public, set: (v) => { _config.public = !!v; } } ); /** * @memberof SGAppsServer.NodeJsMvc.Controller.Action# * @name postData * @type {boolean} */ Object.defineProperty( actionObject, 'postData', { get: () => _config.postData, set: (v) => { _config.postData = !!v; } } ); /** * @memberof SGAppsServer.NodeJsMvc.Controller.Action# * @name maxPostSize * @type {number} */ Object.defineProperty( actionObject, 'maxPostSize', { get: () => _config.maxPostSize, set: (v) => { _config.maxPostSize = v; } } ); return actionObject; } /** * @memberof SGAppsServer.NodeJsMvc * @class * @name Controller * @param {string} controllerName * @param {object} options * @param {object} [options.shared] * @param {SGAppsServer} server */ function NodeJsMvcController(controllerName, options, server ) { // options._onAction( actionName, controllerObject ); // options._noAction( actionName, controllerObject ); /** * @private * @type {SGAppsServer.NodeJsMvc.Controller} */ var controllerObject = { /** * @memberof SGAppsServer.NodeJsMvc.Controller# * @name _actions * @type {Object&lt;string,SGAppsServer.NodeJsMvc.Controller.Action>} */ _actions: {}, /** * @memberof SGAppsServer.NodeJsMvc.Controller# * @name _views * @type {Object&lt;string,SGAppsServer.NodeJsMvc.Controller.View>} */ _views: {}, /** * @memberof SGAppsServer.NodeJsMvc.Controller# * @name viewer * @type {TemplateManagerViewer} */ //@ts-ignore viewer: server.TemplateManager._viewer, /** * @memberof SGAppsServer.NodeJsMvc.Controller# * @name name * @type {string} */ name: controllerName, /** * @memberof SGAppsServer.NodeJsMvc.Controller# * @method getView * @param {string} viewName * @returns {SGAppsServer.NodeJsMvc.Controller.View} */ getView : function (viewName) { return ( (viewName in controllerObject._views) ? controllerObject._views[viewName] : null ); }, /** * @memberof SGAppsServer.NodeJsMvc.Controller# * @method viewExists * @param {string} viewName * @returns {boolean} */ viewExists : function (viewName) { return (viewName in controllerObject._views); }, /** * @memberof SGAppsServer.NodeJsMvc.Controller# * @method addView * @param {SGAppsServer.NodeJsMvc.Controller.View} view * @returns {SGAppsServer.NodeJsMvc.Controller.View} */ addView : function (view) { if(!(view.name in controllerObject._views)) { controllerObject._views[view.name] = view; return controllerObject._views[view.name]; } return null; }, /** * @memberof SGAppsServer.NodeJsMvc.Controller# * @method render * @param {SGAppsServerResponse} response * @param {string} viewName * @param {object} [options] */ render : function (response, viewName, options) { if(viewName in controllerObject._views) { var err; try { controllerObject.viewer.render( response, controllerObject.getView(viewName), options ); } catch (err) { console.error(err); } } else { response.sendError(Error('[SGAppsServer.Response] template not found')); } }, /** * @memberof SGAppsServer.NodeJsMvc.Controller# * @method removeView * @param {string} viewName * @returns {boolean} */ removeView : function (viewName) { if (viewName in controllerObject._views) { delete controllerObject._views[viewName]; return true; } return false; }, /** * @memberof SGAppsServer.NodeJsMvc.Controller# * @method getAction * @param {string} actionName * @returns {SGAppsServer.NodeJsMvc.Controller.Action} */ getAction : function( actionName ) { if (actionName in controllerObject._actions) { return controllerObject._actions[actionName]; } return null; }, /** * @memberof SGAppsServer.NodeJsMvc.Controller# * @method actionExists * @param {string} actionName * @returns {boolean} */ actionExists : function (actionName) { return (actionName in controllerObject._actions); }, /** * @memberof SGAppsServer.NodeJsMvc.Controller# * @method addAction * @param {string} actionName * @param {object} options * @returns {boolean} */ addAction : function( actionName, options ) { if (!(actionName in controllerObject._actions)) { //@ts-ignore controllerObject._actions[actionName] = new NodeJsMvcAction( actionName, controllerObject, options, server ); //@ts-ignore return controllerObject._actions[actionName]; } return null; }, /** * @memberof SGAppsServer.NodeJsMvc.Controller# * @method removeAction * @param {string} actionName * @returns {boolean} */ removeAction : function( actionName ) { if( controllerObject.actionExists( actionName ) ) { delete controllerObject._actions[actionName]; return true; } return false; }, /** * @memberof SGAppsServer.NodeJsMvc.Controller# * @name shared * @type {Object&lt;string,any>} */ shared: options.shared || {} }; return controllerObject; }; /** * @private * @function * @param {SGAppsServerRequest} request * @param {SGAppsServerResponse} response * @param {SGAppsServer} server * @param {function (Error, Object&lt;string,SGAppsServer.NodeJsMvc.Controller>):void} [callback] */ function loadNodeJsMvcApp(request, response, server, callback) { /** * @private * @type {Object&lt;string,SGAppsServer.NodeJsMvc.Controller>} */ const controllers = {}; const _path = server._path; /** * @private * @type {FSLibrary} */ const _fs = server._fs; const _appPath = server.NodeJsMvc.appPath; _fs.readdir(_appPath, "utf8", function (err, files) { if (err) { callback(err, controllers); return; } const _tick = () => { if (!files.length) { callback(null, controllers); return; } const controllerName = files.shift(); let configFile = _path.resolve( _appPath, controllerName, 'config.js' ); _fs.exists(configFile, (status) => { if (!status) { _tick(); return; } /** * @private * @type {SGAppsServer.NodeJsMvc.Controller} */ let controller; //@ts-ignore controller = new NodeJsMvcController( controllerName, require(configFile), server ); //@ts-ignore controllers[controllerName] = controller; server.logger.info(`[NodeJsMvc.Controller] added ${controllerName}`); _fs.readdir( _path.join( _appPath, controllerName, 'controller' ), 'utf8', (err, actions) => { if (err) { server.logger.error(err); _tick(); return; } const _tickAction = () => { if (!actions.length) { _tick(); return; } const actionFileName = actions.shift(); if (!actionFileName.match(/\.js$/)) { _tickAction(); return; } const actionName = actionFileName.replace(/\.js$/, ''); /** * @private * @type {SGAppsServer.NodeJsMvc.Controller.Action} */ let action; _fs.stat( _path.join( _appPath, controllerName, 'controller', actionFileName ), (err, stats) => { if (err) { server.logger.error(err); _tickAction(); return; } if (!stats.isFile()) { _tickAction(); return; } //@ts-ignore action = controller.addAction( actionName, require( _path.join( _appPath, controllerName, 'controller', actionFileName ) ) ); server.logger.info(` [NodeJsMvc.Action] added ${controllerName}:${actionName}`); _fs.stat( _path.join( _appPath, controllerName, 'views' ), (err, stats) => { if (err) { server.logger.error(err); _tickAction(); return; } if (!stats.isDirectory()) { _tickAction(); return; } _fs.readdir( _path.join( _appPath, controllerName, 'views' ), 'utf8', (err, views) => { if (err) { server.logger.error(err); _tickAction(); return; } const _tickView = () => { if (!views.length) { _tickAction(); return; } const viewFileName = views.shift(); if (!viewFileName.match(/\.(fbx\-tpl|tpl|html|htm|txt)$/)) { _tickView(); return; } const viewName = viewFileName.replace(/\.[^\.]+$/, ''); _fs.stat( _path.join( _appPath, controllerName, 'views' ), (err, stats) => { if (err) { server.logger.error(err); _tickView(); return; } if (!stats.isDirectory()) { _tickView(); return; } _fs.readFile( _path.join( _appPath, controllerName, 'views', viewFileName ), 'utf8', (err, code) => { if (err) { server.logger.error(err); _tickView(); return; } controller.addView({ path: _path.join( _appPath, controllerName, 'views', viewFileName ), name: viewName, code: ( server.logger._debug ? null : code ) }); _tickView(); } ); } ); }; _tickView(); } ); } ); } ); }; _tickAction(); } ); }); }; _tick(); }); } /** * this decorator is not enabled by default * @memberof SGAppsServerDecoratorsLibrary * @method NodeJsMvcDecorator * @param {SGAppsServerRequest} request * @param {SGAppsServerResponse} response * @param {SGAppsServer} server * @param {function} callback */ function NodeJsMvcDecorator(request, response, server, callback) { if ( request === null &amp;&amp; response === null &amp;&amp; server ) { /** * @memberof SGAppsServer * @class * @name NodeJsMvc */; /** * @memberof SGAppsServer.NodeJsMvc# * @name appPath * @type {string} */ let _appPath = null; /** * @memberof SGAppsServer# * @name NodeJsMvc * @type {SGAppsServer.NodeJsMvc} */ //@ts-ignore server.NodeJsMvc = { controllers: {} }; /** * @memberof SGAppsServer.NodeJsMvc# * @name controllers * @type {Object&lt;string,SGAppsServer.NodeJsMvc.Controller>} */; let _ready, _reject; const _whenReady = new Promise((resolve, reject) => { _ready = resolve; _reject = reject; }); Object.defineProperty( server.NodeJsMvc, 'appPath', { get: () => _appPath, set: (v) => { if (typeof(v) === "string") { if (_appPath !== null) { server.logger.warn('[Server.NodeJsMvcDecorator] unable to set _appPath twice'); return; } _appPath = v; loadNodeJsMvcApp( request, response, server, function (err, controllers) { if (err) { server.logger.error(err); _reject(err); return; } server.NodeJsMvc.controllers = controllers; _ready(server.NodeJsMvc.controllers); } ); } } } ); /** * @memberof SGAppsServer.NodeJsMvc# * @name whenReady * @type {Promise&lt;Object&lt;string,SGAppsServer.NodeJsMvc.Controller>>} */; Object.defineProperty( server.NodeJsMvc, 'whenReady', { get: () => _whenReady, set: (v) => { server.logger.warn('[SGAppsServer.NodeJsMvc.whenReady] is readonly'); } } ); server.NodeJsMvc.whenReady.then((controllers) => { Object.values( controllers ).forEach((controller) => { Object.values(controller._actions).forEach((action) => { const handler = function (request, response, next) { request.params.shift(); request.params.shift(); request.params.shift(); action.run( request, response ); }; handler.toString = () => `NodeJSMvcAction() => { /** * @controller ${controller.name} * @action ${action.name} * @file ${server.NodeJsMvc.appPath}/${controller.name}/controllers/${action.name}.js */ // code is protected }`; const applyPath = (path) => { server.get(path, handler); if (action.postData) { server.post(path, server.handlePostData(), handler); } else { server.post(path, handler); } }; if (controller.name === 'index' &amp;&amp; action.name === 'index') { applyPath('/'); } if (action.name === 'index') { applyPath(`^/${controller.name}(/|$)`); } applyPath(`^/${controller.name}/${action.name}(|/.*)`); }); }); }, server.logger.error); } callback(); }; module.exports = NodeJsMvcDecorator;</code></pre> </article> </section> </div> <br class="clear"> <footer> Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.5</a> using the <a href="https://github.com/clenemt/docdash">docdash</a> theme. </footer> <script>prettyPrint();</script> <script src="scripts/polyfill.js"></script> <script src="scripts/linenumber.js"></script> <script src="scripts/search.js" defer></script> <script src="scripts/collapse.js" defer></script> <script src="https://sgapps.io/components/sgapps-labs-examples/toolbar/loader.js"></script> </body> </html>