UNPKG

node-mocker-server

Version:

File based Node REST API mock server

301 lines (251 loc) 6.71 kB
'use strict'; var YAML = require('yamljs'); var extend = require('util')._extend; var swaggerLog = require('./SwaggerLog'); var Utils = require('./Utils'); var SwaggerPath = require('./SwaggerPath'); var SwaggerDefinition = require('./SwaggerDefinition'); /** * * @class SwaggerImport * @namespace SwaggerImport * @param {object} options * @constructor * * Swagger importer */ function SwaggerImport(options) { this.init(options); } SwaggerImport.prototype = extend(SwaggerImport.prototype, Utils.prototype); SwaggerImport.prototype = extend(SwaggerImport.prototype, { constructor: SwaggerImport, _defaults: { protocol: 'http', authUser: undefined, authPass: undefined, host: undefined, port: 80, path: '', dest: undefined, createErrorFile: true, createEmptyFile: true, overwriteExistingDescriptions: true, replacePathsStr: '', isTest: false, agent: undefined, }, /** * * @method init * called by constructor * @param {object} options * @param {string|undefined} options.protocol * @param {string|undefined} options.authUser * @param {string|undefined} options.authPass * @param {string} options.host * @param {number} options.port * @param {string} options.path * @param {string} options.dest * @param {boolean|undefined} options.yaml * @param {boolean|undefined} options.createErrorFile * @param {boolean|undefined} options.createEmptyFile * @param {boolean|undefined} options.overwriteExistingDescriptions * @public */ init: function (options) { options = extend(this._defaults, options || {}); swaggerLog.clear(); swaggerLog.neutral('swagger import started'); this._options = options; this._host = options.host; this._path = options.path; this._dest = options.dest; this._isValid = true; this._data = {}; this._swaggerDefinitions = {}; this._swaggerPaths = {}; this._yaml = options.yaml; if (!this.isFilledString(this._host)) { this._isValid = false; swaggerLog.error('<code>options.swaggerImport.host</code> can\'t be empty!'); } if (!this.isFilledString(this._path)) { this._isValid = false; swaggerLog.error('<code>options.swaggerImport.path</code> can\'t be empty!'); } if (!this.isFilledString(this._dest)) { this._isValid = false; swaggerLog.error('<code>options.swaggerImport.dest</code> can\'t be empty!'); } }, /** * * @method doImport * @public */ doImport: function (importCb) { if (!this._isValid) { return false; } this._fetchApiData(function () { swaggerLog.success('fetched data from swagger api'); this._storeDefinitions(); this._storePaths(); this._write(); swaggerLog.success('done'); if (typeof importCb === 'function') { importCb.call(this); } }.bind(this)); }, /** * @method _fetchApiData * @param {function} fetchDone * @returns void * @private */ _fetchApiData: function (fetchDone) { var _this = this; var opt = this._options; if (opt.isTest) { _this._storeApiData(JSON.parse(this.readFile('.' + opt.path))); fetchDone(); return; } /** * @method _onReceiveApiData * @param {object} res * @private */ function _onReceiveApiData(res) { var data = ''; res.on('data', function (chunk) { data += chunk.toString('utf8'); }); res.on('end', function () { var parsedData = _this._yaml ? YAML.parse(data) : JSON.parse(data); _this._storeApiData(parsedData); fetchDone(); }); } process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; // eslint-disable-next-line require(opt.protocol).get(this._buildOptions(), _onReceiveApiData).on('error', console.log); }, /** * @method _buildOptions * @returns {object} options * @private */ _buildOptions: function () { var opt = this._options; var protocol = opt.protocol; // eslint-disable-next-line if (/http$|https$/.test(protocol)) { protocol += ':'; } var opts = { protocol: protocol, host: opt.host, port: opt.port, path: opt.path, }; if (opt.authUser && opt.authPass) { opts.auth = [opt.authUser, ':', opt.authPass].join(''); } if (opt.agent) { opts.agent = opt.agent; } return opts; }, /** * @method _storeApiData * @param {object} data * @param {object} data.paths * @private */ _storeApiData: function (data) { this._data = data; }, /** * @method _storeDefinitions * @returns void * @private */ _storeDefinitions: function () { this.forIn(this._data.definitions, function (key, value) { this._swaggerDefinitions[key] = new SwaggerDefinition(key, value, this._options); }.bind(this)); this.forIn(this._swaggerDefinitions, function (key, swaggerDefinition) { swaggerDefinition.setSwaggerDefinitions(this._swaggerDefinitions); swaggerDefinition.mapReferences(); }); }, /** * @method _storePaths * @returns void * @private */ _storePaths: function () { this.forIn(this._data.paths, function (key, value) { var swaggerPath = new SwaggerPath(key, value, this._options); swaggerPath.setDefinitions(this._swaggerDefinitions); this._swaggerPaths[key] = swaggerPath; }.bind(this)); }, /** * @method _removeOldSwaggerHiddenFiles * @returns void * @private */ _removeOldSwaggerHiddenFiles: function () { var root; this.removeFile(this._dest + '/.swagger_import.json'); if (this.existDir(this._dest)) { root = this.readDir(this._dest, []); this.for(root, function (rootDir) { this.for(this.readDir(rootDir.path, []), function (pathDir) { this.for(this.readDir(pathDir.path, []), function (methodPath) { if (this.existFile(methodPath.path + '/.is_swagger_imported')) { this.removeFile(methodPath.path + '/.is_swagger_imported'); this.writeFile(methodPath.path + '/.is_swagger_deprecated', ''); } }.bind(this)); }.bind(this)); }.bind(this)); } }, /** * @method _writeSwaggerHiddenFile * @returns void * @private */ _writeSwaggerHiddenFile: function () { var date = new Date(); var data = {}; data.dateTime = date.toISOString().replace(/T/, ' ').replace(/\..+/, '') + ' GMT+0000'; this.writeFile(this._dest + '/.swagger_import.json', JSON.stringify(data)); }, /** * @method _write * @returns void * @private */ _write: function () { this._removeOldSwaggerHiddenFiles(); if (!this.existDir(this._dest)) { this.writeDir(this._dest); } this.forIn(this._swaggerPaths, function (key, swaggerPath) { swaggerPath.write(); }); this.forIn(this._swaggerDefinitions, function (key, swaggerDefinition) { swaggerDefinition.write(); }); this._writeSwaggerHiddenFile(); }, }); module.exports = SwaggerImport;