node-mocker-server
Version:
File based Node REST API mock server
134 lines (111 loc) • 3.33 kB
JavaScript
;
var express = require('express');
var https = require('https');
var openBrowser = require('react-dev-utils/openBrowser');
var app = express();
var log = require('chip')();
var util = require('util');
var extend = util._extend;
var Utils = require('../Utils');
var getCertificate = require('../getCertificate');
var _defaults = require('../defaults/options-defaults');
var AppControllerSingleton;
/**
*
* @class AppController
* @param {object} options
* @constructor
*
*/
function AppController(options) {
this.init(options);
}
AppController.prototype = extend(AppController.prototype, Utils.prototype);
AppController.prototype = extend(AppController.prototype, {
constructor: AppController,
_defaults: _defaults,
/**
*
* @method init
* called by constructor
* @param {object} options
* @param {string} options.dirName
* @param {object} options.swaggerImport
* @param {string} options.privateKey
* @param {string} options.certificate
* @param {boolean} options.open
* @param {boolean} options.useTrailingSlashes
* @param {string|undefined} options.jsVersion
* @public
*/
init: function (options) {
var _this = this;
options = extend(this._defaults, options || {});
var logFunc = function () {
if (process.env.NODE_ENV !== 'test') {
log.info('server started at port ' + options.port);
if (options.open) {
openBrowser(options.urlBase + options.uiPath);
}
}
if (typeof options.onServerStarted === 'function') {
options.onServerStarted(_this.app, _this.server);
}
};
this.options = options;
this.app = app;
if (!this.options.dirName) {
log.error('options.dirName is required (dirName: __dirname)');
return;
}
if (this.options.swaggerImport) {
this.options.swaggerImport.dirName = this.options.dirName;
}
if (this.options.expressMiddleware instanceof Array) {
this.options.expressMiddleware.forEach(function (middlewareCallback) {
var args = middlewareCallback(express);
if (args instanceof Array) {
if (args.length === 1) {
app.use(args[0]);
} else if (args.length === 2) {
app.use(args[0], args[1]);
} else if (args.length === 3) {
app.use(args[0], args[1], args[2]);
}
} else if (typeof args === 'function') {
app.use(args);
}
});
}
app.use('/src', express.static(__dirname + '/../../src'));
app.use('/node_modules', express.static(__dirname + '/../../node_modules'));
app.use(express.json({ limit: '50mb' }));
app.use(express.urlencoded({ extended: true }));
app.set('view engine', 'ejs');
app.set('views', __dirname + '/../../views');
if (this.options.privateKey && this.options.certificate) {
this.server = https.createServer({
key: getCertificate(this.options.privateKey),
cert: getCertificate(this.options.certificate),
}, app).listen(this.options.port, logFunc);
return;
}
this.server = app.listen(this.options.port, logFunc);
},
});
// eslint-disable-next-line
AppControllerSingleton = (function () {
var instance;
function createInstance(options) {
return new AppController(options);
}
return {
getInstance: function (options) {
if (!instance && options) {
instance = createInstance(options);
}
return instance;
},
};
})();
module.exports = AppControllerSingleton;