@booxood/mocker-api
Version:
This is dev support mock RESTful API.
158 lines (122 loc) • 16.3 kB
JavaScript
;
var _path = _interopRequireDefault(require("path"));
var _fs = require("fs");
var _prepareUrls = _interopRequireDefault(require("local-ip-url/prepareUrls"));
var _detectPort = _interopRequireDefault(require("detect-port"));
var _safe = _interopRequireDefault(require("colors-cli/safe"));
var _express = _interopRequireDefault(require("express"));
var _minimist = _interopRequireDefault(require("minimist"));
var _ = _interopRequireDefault(require("../"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const CWD = process.cwd();
const PKG_PATH = _path.default.resolve(CWD, './package.json');
const DEFAULT_MOCKER_CONFIG_PATH = _path.default.resolve(CWD, './mocker.config.json');
const DEFAULT_MOCK_PATH = ['./mock'];
const DEFAULT_CONFIG = {
host: '0.0.0.0',
port: 3721
};
(async () => {
const argvs = (0, _minimist.default)(process.argv.slice(2));
if (argvs.h || argvs.help) {
console.log('\n Usage: mocker <path> [--config] [--help|h]');
console.log('\n Displays help information.');
console.log('\n Options:');
console.log(' --config <path>', 'Simple configuration');
console.log('\n Example:');
console.log(' mocker mock/index.js');
console.log(' mocker mock/index.js --port 7788');
console.log(' mocker mock/index.js --host 0.0.0.0');
console.log(' mocker mock/m1.js test/m2.js');
console.log(' mocker mock/m1.js --config mocker.config.json');
console.log('\n');
return;
} // Fix type errors
const {
version
} = require('../../package.json');
if (argvs.v || argvs.version) {
console.log(version);
return;
}
const paths = argvs['_'];
if (paths.length === 0) {
console.log(_safe.default.red('Error: Need to pass parameters!'));
console.log(`E.g: ${_safe.default.yellow('mocker <File path>')}\n`);
return;
}
const entryFiles = paths || DEFAULT_MOCK_PATH;
let mockConfigPath = argvs.config || DEFAULT_MOCKER_CONFIG_PATH;
let mockerConfig = DEFAULT_CONFIG;
if (argvs.config) {
mockConfigPath = argvs.config;
}
if (!(0, _fs.existsSync)(_path.default.resolve(mockConfigPath))) {
mockerConfig.host = process.env.HOST ? process.env.HOST : mockerConfig.host;
mockerConfig.port = await (0, _detectPort.default)(mockerConfig.port);
} else {
mockerConfig = require(_path.default.resolve(mockConfigPath));
}
/**
* Support setting configuration on package.json
* https://github.com/jaywcjlove/mocker-api/issues/144
*/
if ((0, _fs.existsSync)(PKG_PATH)) {
const pkgConf = require(PKG_PATH);
if (pkgConf.mocker) {
Object.assign(mockerConfig, pkgConf.mocker);
}
}
if (argvs.host) {
mockerConfig.host = argvs.host;
}
if (argvs.port) {
mockerConfig.port = argvs.port;
}
const DEFAULT_PORT = mockerConfig.port;
const DEFAULT_HOST = mockerConfig.host;
const app = (0, _express.default)();
app.all('/*', (req, res, next) => {
console.log(`${_safe.default.green(req.method)} - ${req.url}`);
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Content-Type,Content-Length,Authorization,Accept,X-Requested-With');
res.header('Access-Control-Allow-Methods', 'PUT,POST,GET,DELETE,OPTIONS');
next();
});
delete mockerConfig.port;
delete mockerConfig.host;
(0, _.default)(app, entryFiles, { ...mockerConfig
});
app.listen(DEFAULT_PORT, () => {
const localIpUrl = (0, _prepareUrls.default)({
protocol: 'http',
host: DEFAULT_HOST,
port: DEFAULT_PORT
});
console.log(`> Server Listening at Local: ${_safe.default.green(localIpUrl.localUrl)}`);
console.log(`> On Your Network: ${_safe.default.green(localIpUrl.lanUrl)}\n`);
});
/**
* Event listener for HTTP server "error" event.
*/
app.on('error', error => {
if (error.syscall !== 'listen') {
throw error;
}
const bind = typeof DEFAULT_PORT === 'string' ? `Pipe ${DEFAULT_PORT}` : `Port ${DEFAULT_PORT}`; // handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(`${bind} requires elevated privileges`); // eslint-disable-line
process.exit(1);
break;
case 'EADDRINUSE':
console.error(`${bind} is already in use`); // eslint-disable-line
process.exit(1);
break;
default:
throw error;
}
});
})();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vbW9ja2VyLnRzIl0sIm5hbWVzIjpbIkNXRCIsInByb2Nlc3MiLCJjd2QiLCJQS0dfUEFUSCIsInBhdGgiLCJyZXNvbHZlIiwiREVGQVVMVF9NT0NLRVJfQ09ORklHX1BBVEgiLCJERUZBVUxUX01PQ0tfUEFUSCIsIkRFRkFVTFRfQ09ORklHIiwiaG9zdCIsInBvcnQiLCJhcmd2cyIsImFyZ3YiLCJzbGljZSIsImgiLCJoZWxwIiwiY29uc29sZSIsImxvZyIsInZlcnNpb24iLCJyZXF1aXJlIiwidiIsInBhdGhzIiwibGVuZ3RoIiwiY29sb3IiLCJyZWQiLCJ5ZWxsb3ciLCJlbnRyeUZpbGVzIiwibW9ja0NvbmZpZ1BhdGgiLCJjb25maWciLCJtb2NrZXJDb25maWciLCJlbnYiLCJIT1NUIiwicGtnQ29uZiIsIm1vY2tlciIsIk9iamVjdCIsImFzc2lnbiIsIkRFRkFVTFRfUE9SVCIsIkRFRkFVTFRfSE9TVCIsImFwcCIsImFsbCIsInJlcSIsInJlcyIsIm5leHQiLCJncmVlbiIsIm1ldGhvZCIsInVybCIsImhlYWRlciIsImxpc3RlbiIsImxvY2FsSXBVcmwiLCJwcm90b2NvbCIsImxvY2FsVXJsIiwibGFuVXJsIiwib24iLCJlcnJvciIsInN5c2NhbGwiLCJiaW5kIiwiY29kZSIsImV4aXQiXSwibWFwcGluZ3MiOiJBQUFBOzs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQU9BLE1BQU1BLEdBQUcsR0FBR0MsT0FBTyxDQUFDQyxHQUFSLEVBQVo7O0FBQ0EsTUFBTUMsUUFBUSxHQUFHQyxjQUFLQyxPQUFMLENBQWFMLEdBQWIsRUFBa0IsZ0JBQWxCLENBQWpCOztBQUNBLE1BQU1NLDBCQUEwQixHQUFHRixjQUFLQyxPQUFMLENBQWFMLEdBQWIsRUFBa0Isc0JBQWxCLENBQW5DOztBQUNBLE1BQU1PLGlCQUFpQixHQUFHLENBQUMsUUFBRCxDQUExQjtBQUNBLE1BQU1DLGNBQTRCLEdBQUc7QUFDbkNDLEVBQUFBLElBQUksRUFBRSxTQUQ2QjtBQUVuQ0MsRUFBQUEsSUFBSSxFQUFFO0FBRjZCLENBQXJDOztBQUtBLENBQUMsWUFBWTtBQUNYLFFBQU1DLEtBQUssR0FBRyx1QkFBU1YsT0FBTyxDQUFDVyxJQUFSLENBQWFDLEtBQWIsQ0FBbUIsQ0FBbkIsQ0FBVCxDQUFkOztBQUVBLE1BQUlGLEtBQUssQ0FBQ0csQ0FBTixJQUFXSCxLQUFLLENBQUNJLElBQXJCLEVBQTJCO0FBQ3pCQyxJQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWSxnREFBWjtBQUNBRCxJQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWSxnQ0FBWjtBQUNBRCxJQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWSxjQUFaO0FBQ0FELElBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZLHFCQUFaLEVBQW1DLHNCQUFuQztBQUNBRCxJQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWSxjQUFaO0FBQ0FELElBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZLDBCQUFaO0FBQ0FELElBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZLHNDQUFaO0FBQ0FELElBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZLHlDQUFaO0FBQ0FELElBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZLGtDQUFaO0FBQ0FELElBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZLG1EQUFaO0FBQ0FELElBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZLElBQVo7QUFDQTtBQUNELEdBaEJVLENBaUJYOzs7QUFDQSxRQUFNO0FBQUVDLElBQUFBO0FBQUYsTUFBY0MsT0FBTyxDQUFDLG9CQUFELENBQTNCOztBQUVBLE1BQUlSLEtBQUssQ0FBQ1MsQ0FBTixJQUFXVCxLQUFLLENBQUNPLE9BQXJCLEVBQThCO0FBQzVCRixJQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWUMsT0FBWjtBQUNBO0FBQ0Q7O0FBRUQsUUFBTUcsS0FBSyxHQUFHVixLQUFLLENBQUMsR0FBRCxDQUFuQjs7QUFFQSxNQUFJVSxLQUFLLENBQUNDLE1BQU4sS0FBaUIsQ0FBckIsRUFBd0I7QUFDdEJOLElBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZTSxjQUFNQyxHQUFOLENBQVUsaUNBQVYsQ0FBWjtBQUNBUixJQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBYSxRQUFPTSxjQUFNRSxNQUFOLENBQWEsb0JBQWIsQ0FBbUMsSUFBdkQ7QUFDQTtBQUNEOztBQUVELFFBQU1DLFVBQVUsR0FBR0wsS0FBSyxJQUFJZCxpQkFBNUI7QUFFQSxNQUFJb0IsY0FBYyxHQUFHaEIsS0FBSyxDQUFDaUIsTUFBTixJQUFnQnRCLDBCQUFyQztBQUNBLE1BQUl1QixZQUFZLEdBQUdyQixjQUFuQjs7QUFFQSxNQUFJRyxLQUFLLENBQUNpQixNQUFWLEVBQWtCO0FBQ2hCRCxJQUFBQSxjQUFjLEdBQUdoQixLQUFLLENBQUNpQixNQUF2QjtBQUNEOztBQUVELE1BQUksQ0FBQyxvQkFBV3hCLGNBQUtDLE9BQUwsQ0FBYXNCLGNBQWIsQ0FBWCxDQUFMLEVBQStDO0FBQzdDRSxJQUFBQSxZQUFZLENBQUNwQixJQUFiLEdBQW9CUixPQUFPLENBQUM2QixHQUFSLENBQVlDLElBQVosR0FBbUI5QixPQUFPLENBQUM2QixHQUFSLENBQVlDLElBQS9CLEdBQXNDRixZQUFZLENBQUNwQixJQUF2RTtBQUNBb0IsSUFBQUEsWUFBWSxDQUFDbkIsSUFBYixHQUFvQixNQUFNLHlCQUFPbUIsWUFBWSxDQUFDbkIsSUFBcEIsQ0FBMUI7QUFDRCxHQUhELE1BR087QUFDTG1CLElBQUFBLFlBQVksR0FBR1YsT0FBTyxDQUFDZixjQUFLQyxPQUFMLENBQWFzQixjQUFiLENBQUQsQ0FBdEI7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBOzs7QUFDRSxNQUFJLG9CQUFXeEIsUUFBWCxDQUFKLEVBQTBCO0FBQ3hCLFVBQU02QixPQUFPLEdBQUdiLE9BQU8sQ0FBQ2hCLFFBQUQsQ0FBdkI7O0FBQ0EsUUFBSTZCLE9BQU8sQ0FBQ0MsTUFBWixFQUFvQjtBQUNsQkMsTUFBQUEsTUFBTSxDQUFDQyxNQUFQLENBQWNOLFlBQWQsRUFBNEJHLE9BQU8sQ0FBQ0MsTUFBcEM7QUFDRDtBQUNGOztBQUVELE1BQUl0QixLQUFLLENBQUNGLElBQVYsRUFBZ0I7QUFDZG9CLElBQUFBLFlBQVksQ0FBQ3BCLElBQWIsR0FBb0JFLEtBQUssQ0FBQ0YsSUFBMUI7QUFDRDs7QUFFRCxNQUFJRSxLQUFLLENBQUNELElBQVYsRUFBZ0I7QUFDZG1CLElBQUFBLFlBQVksQ0FBQ25CLElBQWIsR0FBb0JDLEtBQUssQ0FBQ0QsSUFBMUI7QUFDRDs7QUFFRCxRQUFNMEIsWUFBWSxHQUFHUCxZQUFZLENBQUNuQixJQUFsQztBQUNBLFFBQU0yQixZQUFZLEdBQUdSLFlBQVksQ0FBQ3BCLElBQWxDO0FBQ0EsUUFBTTZCLEdBQUcsR0FBRyx1QkFBWjtBQUVBQSxFQUFBQSxHQUFHLENBQUNDLEdBQUosQ0FBUSxJQUFSLEVBQWMsQ0FBQ0MsR0FBRCxFQUFNQyxHQUFOLEVBQVdDLElBQVgsS0FBb0I7QUFDaEMxQixJQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBYSxHQUFFTSxjQUFNb0IsS0FBTixDQUFZSCxHQUFHLENBQUNJLE1BQWhCLENBQXdCLE1BQUtKLEdBQUcsQ0FBQ0ssR0FBSSxFQUFwRDtBQUNBSixJQUFBQSxHQUFHLENBQUNLLE1BQUosQ0FBVyw2QkFBWCxFQUEwQyxHQUExQztBQUNBTCxJQUFBQSxHQUFHLENBQUNLLE1BQUosQ0FBVyw4QkFBWCxFQUEyQyxtRUFBM0M7QUFDQUwsSUFBQUEsR0FBRyxDQUFDSyxNQUFKLENBQVcsOEJBQVgsRUFBMkMsNkJBQTNDO0FBQ0FKLElBQUFBLElBQUk7QUFDTCxHQU5EO0FBUUEsU0FBT2IsWUFBWSxDQUFDbkIsSUFBcEI7QUFDQSxTQUFPbUIsWUFBWSxDQUFDcEIsSUFBcEI7QUFDQSxpQkFBVTZCLEdBQVYsRUFBZVosVUFBZixFQUEyQixFQUFFLEdBQUdHO0FBQUwsR0FBM0I7QUFFQVMsRUFBQUEsR0FBRyxDQUFDUyxNQUFKLENBQVdYLFlBQVgsRUFBeUIsTUFBTTtBQUM3QixVQUFNWSxVQUFVLEdBQUcsMEJBQVk7QUFDN0JDLE1BQUFBLFFBQVEsRUFBRSxNQURtQjtBQUU3QnhDLE1BQUFBLElBQUksRUFBRTRCLFlBRnVCO0FBRzdCM0IsTUFBQUEsSUFBSSxFQUFFMEI7QUFIdUIsS0FBWixDQUFuQjtBQUtBcEIsSUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQWEsZ0NBQStCTSxjQUFNb0IsS0FBTixDQUFZSyxVQUFVLENBQUNFLFFBQXZCLENBQWlDLEVBQTdFO0FBQ0FsQyxJQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBYSxnQ0FBK0JNLGNBQU1vQixLQUFOLENBQVlLLFVBQVUsQ0FBQ0csTUFBdkIsQ0FBK0IsSUFBM0U7QUFDRCxHQVJEO0FBU0E7QUFDRjtBQUNBOztBQUNFYixFQUFBQSxHQUFHLENBQUNjLEVBQUosQ0FBTyxPQUFQLEVBQWlCQyxLQUFELElBQWdCO0FBQzlCLFFBQUlBLEtBQUssQ0FBQ0MsT0FBTixLQUFrQixRQUF0QixFQUFnQztBQUM5QixZQUFNRCxLQUFOO0FBQ0Q7O0FBQ0QsVUFBTUUsSUFBSSxHQUFHLE9BQU9uQixZQUFQLEtBQXdCLFFBQXhCLEdBQW9DLFFBQU9BLFlBQWEsRUFBeEQsR0FBNkQsUUFBT0EsWUFBYSxFQUE5RixDQUo4QixDQUs5Qjs7QUFDQSxZQUFRaUIsS0FBSyxDQUFDRyxJQUFkO0FBQ0UsV0FBSyxRQUFMO0FBQ0V4QyxRQUFBQSxPQUFPLENBQUNxQyxLQUFSLENBQWUsR0FBRUUsSUFBSywrQkFBdEIsRUFERixDQUN5RDs7QUFDdkR0RCxRQUFBQSxPQUFPLENBQUN3RCxJQUFSLENBQWEsQ0FBYjtBQUNBOztBQUNGLFdBQUssWUFBTDtBQUNFekMsUUFBQUEsT0FBTyxDQUFDcUMsS0FBUixDQUFlLEdBQUVFLElBQUssb0JBQXRCLEVBREYsQ0FDOEM7O0FBQzVDdEQsUUFBQUEsT0FBTyxDQUFDd0QsSUFBUixDQUFhLENBQWI7QUFDQTs7QUFDRjtBQUNFLGNBQU1KLEtBQU47QUFWSjtBQVlELEdBbEJEO0FBbUJELENBbkhEIiwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0IHByZXBhcmVVcmxzIGZyb20gJ2xvY2FsLWlwLXVybC9wcmVwYXJlVXJscyc7XG5pbXBvcnQgZGV0ZWN0IGZyb20gJ2RldGVjdC1wb3J0JztcbmltcG9ydCBjb2xvciBmcm9tICdjb2xvcnMtY2xpL3NhZmUnO1xuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgbWluaW1pc3QgZnJvbSAnbWluaW1pc3QnO1xuaW1wb3J0IGFwaU1vY2tlciwgeyBNb2NrZXJPcHRpb24gfSBmcm9tICcuLi8nO1xuXG5pbnRlcmZhY2UgTW9ja2VyQ29uZmlnIGV4dGVuZHMgTW9ja2VyT3B0aW9uIHtcbiAgaG9zdDogc3RyaW5nO1xuICBwb3J0OiBudW1iZXI7XG59XG5cbmNvbnN0IENXRCA9IHByb2Nlc3MuY3dkKCk7XG5jb25zdCBQS0dfUEFUSCA9IHBhdGgucmVzb2x2ZShDV0QsICcuL3BhY2thZ2UuanNvbicpO1xuY29uc3QgREVGQVVMVF9NT0NLRVJfQ09ORklHX1BBVEggPSBwYXRoLnJlc29sdmUoQ1dELCAnLi9tb2NrZXIuY29uZmlnLmpzb24nKTtcbmNvbnN0IERFRkFVTFRfTU9DS19QQVRIID0gWycuL21vY2snXTtcbmNvbnN0IERFRkFVTFRfQ09ORklHOiBNb2NrZXJDb25maWcgPSB7XG4gIGhvc3Q6ICcwLjAuMC4wJyxcbiAgcG9ydDogMzcyMVxufTtcblxuKGFzeW5jICgpID0+IHtcbiAgY29uc3QgYXJndnMgPSBtaW5pbWlzdChwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpO1xuXG4gIGlmIChhcmd2cy5oIHx8IGFyZ3ZzLmhlbHApIHtcbiAgICBjb25zb2xlLmxvZygnXFxuICBVc2FnZTogbW9ja2VyIDxwYXRoPiBbLS1jb25maWddIFstLWhlbHB8aF0nKVxuICAgIGNvbnNvbGUubG9nKCdcXG4gIERpc3BsYXlzIGhlbHAgaW5mb3JtYXRpb24uJylcbiAgICBjb25zb2xlLmxvZygnXFxuICBPcHRpb25zOicpXG4gICAgY29uc29sZS5sb2coJyAgICAtLWNvbmZpZyA8cGF0aD4nLCAnU2ltcGxlIGNvbmZpZ3VyYXRpb24nKVxuICAgIGNvbnNvbGUubG9nKCdcXG4gIEV4YW1wbGU6JylcbiAgICBjb25zb2xlLmxvZygnICAgIG1vY2tlciBtb2NrL2luZGV4LmpzJylcbiAgICBjb25zb2xlLmxvZygnICAgIG1vY2tlciBtb2NrL2luZGV4LmpzIC0tcG9ydCA3Nzg4JylcbiAgICBjb25zb2xlLmxvZygnICAgIG1vY2tlciBtb2NrL2luZGV4LmpzIC0taG9zdCAwLjAuMC4wJylcbiAgICBjb25zb2xlLmxvZygnICAgIG1vY2tlciBtb2NrL20xLmpzIHRlc3QvbTIuanMnKVxuICAgIGNvbnNvbGUubG9nKCcgICAgbW9ja2VyIG1vY2svbTEuanMgLS1jb25maWcgbW9ja2VyLmNvbmZpZy5qc29uJylcbiAgICBjb25zb2xlLmxvZygnXFxuJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIEZpeCB0eXBlIGVycm9yc1xuICBjb25zdCB7IHZlcnNpb24gfSA9IHJlcXVpcmUoJy4uLy4uL3BhY2thZ2UuanNvbicpO1xuXG4gIGlmIChhcmd2cy52IHx8IGFyZ3ZzLnZlcnNpb24pIHtcbiAgICBjb25zb2xlLmxvZyh2ZXJzaW9uKTtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHBhdGhzID0gYXJndnNbJ18nXTtcblxuICBpZiAocGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5sb2coY29sb3IucmVkKCdFcnJvcjogTmVlZCB0byBwYXNzIHBhcmFtZXRlcnMhJykpO1xuICAgIGNvbnNvbGUubG9nKGBFLmc6ICR7Y29sb3IueWVsbG93KCdtb2NrZXIgPEZpbGUgcGF0aD4nKX1cXG5gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBlbnRyeUZpbGVzID0gcGF0aHMgfHwgREVGQVVMVF9NT0NLX1BBVEg7XG5cbiAgbGV0IG1vY2tDb25maWdQYXRoID0gYXJndnMuY29uZmlnIHx8IERFRkFVTFRfTU9DS0VSX0NPTkZJR19QQVRIO1xuICBsZXQgbW9ja2VyQ29uZmlnID0gREVGQVVMVF9DT05GSUc7XG5cbiAgaWYgKGFyZ3ZzLmNvbmZpZykge1xuICAgIG1vY2tDb25maWdQYXRoID0gYXJndnMuY29uZmlnO1xuICB9XG5cbiAgaWYgKCFleGlzdHNTeW5jKHBhdGgucmVzb2x2ZShtb2NrQ29uZmlnUGF0aCkpKSB7XG4gICAgbW9ja2VyQ29uZmlnLmhvc3QgPSBwcm9jZXNzLmVudi5IT1NUID8gcHJvY2Vzcy5lbnYuSE9TVCA6IG1vY2tlckNvbmZpZy5ob3N0O1xuICAgIG1vY2tlckNvbmZpZy5wb3J0ID0gYXdhaXQgZGV0ZWN0KG1vY2tlckNvbmZpZy5wb3J0KTtcbiAgfSBlbHNlIHtcbiAgICBtb2NrZXJDb25maWcgPSByZXF1aXJlKHBhdGgucmVzb2x2ZShtb2NrQ29uZmlnUGF0aCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1cHBvcnQgc2V0dGluZyBjb25maWd1cmF0aW9uIG9uIHBhY2thZ2UuanNvblxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vamF5d2NqbG92ZS9tb2NrZXItYXBpL2lzc3Vlcy8xNDRcbiAgICovXG4gIGlmIChleGlzdHNTeW5jKFBLR19QQVRIKSkge1xuICAgIGNvbnN0IHBrZ0NvbmYgPSByZXF1aXJlKFBLR19QQVRIKTtcbiAgICBpZiAocGtnQ29uZi5tb2NrZXIpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24obW9ja2VyQ29uZmlnLCBwa2dDb25mLm1vY2tlcik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGFyZ3ZzLmhvc3QpIHtcbiAgICBtb2NrZXJDb25maWcuaG9zdCA9IGFyZ3ZzLmhvc3Q7XG4gIH1cblxuICBpZiAoYXJndnMucG9ydCkge1xuICAgIG1vY2tlckNvbmZpZy5wb3J0ID0gYXJndnMucG9ydDtcbiAgfVxuXG4gIGNvbnN0IERFRkFVTFRfUE9SVCA9IG1vY2tlckNvbmZpZy5wb3J0O1xuICBjb25zdCBERUZBVUxUX0hPU1QgPSBtb2NrZXJDb25maWcuaG9zdDtcbiAgY29uc3QgYXBwID0gZXhwcmVzcygpO1xuXG4gIGFwcC5hbGwoJy8qJywgKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgY29uc29sZS5sb2coYCR7Y29sb3IuZ3JlZW4ocmVxLm1ldGhvZCl9IC0gJHtyZXEudXJsfWApO1xuICAgIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbicsICcqJyk7XG4gICAgcmVzLmhlYWRlcignQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVycycsICdDb250ZW50LVR5cGUsQ29udGVudC1MZW5ndGgsQXV0aG9yaXphdGlvbixBY2NlcHQsWC1SZXF1ZXN0ZWQtV2l0aCcpO1xuICAgIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMnLCAnUFVULFBPU1QsR0VULERFTEVURSxPUFRJT05TJyk7XG4gICAgbmV4dCgpO1xuICB9KTtcblxuICBkZWxldGUgbW9ja2VyQ29uZmlnLnBvcnQ7XG4gIGRlbGV0ZSBtb2NrZXJDb25maWcuaG9zdDtcbiAgYXBpTW9ja2VyKGFwcCwgZW50cnlGaWxlcywgeyAuLi5tb2NrZXJDb25maWcgfSk7XG5cbiAgYXBwLmxpc3RlbihERUZBVUxUX1BPUlQsICgpID0+IHtcbiAgICBjb25zdCBsb2NhbElwVXJsID0gcHJlcGFyZVVybHMoe1xuICAgICAgcHJvdG9jb2w6ICdodHRwJyxcbiAgICAgIGhvc3Q6IERFRkFVTFRfSE9TVCxcbiAgICAgIHBvcnQ6IERFRkFVTFRfUE9SVCxcbiAgICB9KTtcbiAgICBjb25zb2xlLmxvZyhgPiBTZXJ2ZXIgTGlzdGVuaW5nIGF0IExvY2FsOiAke2NvbG9yLmdyZWVuKGxvY2FsSXBVcmwubG9jYWxVcmwpfWApO1xuICAgIGNvbnNvbGUubG9nKGA+ICAgICAgICAgICBPbiBZb3VyIE5ldHdvcms6ICR7Y29sb3IuZ3JlZW4obG9jYWxJcFVybC5sYW5VcmwpfVxcbmApO1xuICB9KTtcbiAgLyoqXG4gICAqIEV2ZW50IGxpc3RlbmVyIGZvciBIVFRQIHNlcnZlciBcImVycm9yXCIgZXZlbnQuXG4gICAqL1xuICBhcHAub24oJ2Vycm9yJywgKGVycm9yOiBhbnkpID0+IHtcbiAgICBpZiAoZXJyb3Iuc3lzY2FsbCAhPT0gJ2xpc3RlbicpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBjb25zdCBiaW5kID0gdHlwZW9mIERFRkFVTFRfUE9SVCA9PT0gJ3N0cmluZycgPyBgUGlwZSAke0RFRkFVTFRfUE9SVH1gIDogYFBvcnQgJHtERUZBVUxUX1BPUlR9YDtcbiAgICAvLyBoYW5kbGUgc3BlY2lmaWMgbGlzdGVuIGVycm9ycyB3aXRoIGZyaWVuZGx5IG1lc3NhZ2VzXG4gICAgc3dpdGNoIChlcnJvci5jb2RlKSB7XG4gICAgICBjYXNlICdFQUNDRVMnOlxuICAgICAgICBjb25zb2xlLmVycm9yKGAke2JpbmR9IHJlcXVpcmVzIGVsZXZhdGVkIHByaXZpbGVnZXNgKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRUFERFJJTlVTRSc6XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7YmluZH0gaXMgYWxyZWFkeSBpbiB1c2VgKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9KTtcbn0pKCk7XG4iXX0=