lib-tools
Version:
The lib-tools helps you simplify the build, bundle, test and npm packaging workflows for Typescript, JavaScript, Angular library projects and assets module projects.
155 lines • 21.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const webpack = require("webpack");
const webpackDevMiddleware = require("webpack-dev-middleware");
const yargs = require("yargs");
const helpers_1 = require("../helpers");
const utils_1 = require("../utils");
const configs_1 = require("../webpack/configs");
const failure_karma_webpack_plugin_1 = require("../webpack/plugins/failure-karma-webpack-plugin");
const turn_off_watch_webpack_plugin_1 = require("../webpack/plugins/turn-off-watch-webpack-plugin");
let blocked = [];
let isBlocked = false;
let webpackMiddleware;
function requestBlocker() {
return (_1, _2, next) => {
if (isBlocked) {
blocked.push(next);
}
else {
next();
}
};
}
function fallbackMiddleware() {
return (req, res, next) => {
if (webpackMiddleware) {
const webpackUrl = `/_karma_webpack_${req.url}`;
const webpackReq = Object.assign(Object.assign({}, req), { url: webpackUrl });
webpackMiddleware(webpackReq, res, next);
}
else {
next();
}
};
}
const init = async (config, emitter, customFileHandlers) => {
const logger = new utils_1.Logger({ logLevel: 'info' });
config.customContextFile = `${__dirname}/karma-context.html`;
config.customDebugFile = `${__dirname}/karma-debug.html`;
config.beforeMiddleware = config.beforeMiddleware || [];
config.beforeMiddleware.push('lib-tools--blocker');
config.middleware = config.middleware || [];
config.middleware.push('lib-tools--fallback');
const webpackMiddlewareConfig = {
publicPath: '/_karma_webpack_/'
};
const compilationErrorCallback = (_, errors) => {
emitter.emit('compile_error', errors);
emitter.emit('run_complete', [], { exitCode: 1 });
unblock();
};
let webpackConfig;
if (config.webpackConfig) {
webpackConfig = config.webpackConfig;
}
else {
const args = process.argv.length > 4 && /(\\|\/)?karma(\.js)?$/i.test(process.argv[1]) ? process.argv.slice(4) : [];
const commandOptions = yargs(args)
.option('browsers', {
type: 'string'
})
.option('reporters', {
type: 'string'
})
.option('codeCoverageExclude', {
type: 'string'
}).argv;
const testConfig = await helpers_1.getTestConfigFromKarma(config, commandOptions);
if (!testConfig) {
throw new Error('Could not load workflow test config.');
}
if (commandOptions.reporters == null && testConfig.reporters != null) {
config.reporters = testConfig.reporters;
}
if (commandOptions.browsers == null && testConfig.browsers != null) {
config.browsers = testConfig.browsers;
}
webpackConfig = await configs_1.getWebpackTestConfig(testConfig, commandOptions);
}
webpackConfig.plugins = webpackConfig.plugins || [];
webpackConfig.plugins.push(new failure_karma_webpack_plugin_1.FailureKarmaWebpackPlugin(compilationErrorCallback));
webpackConfig.watch = !config.singleRun;
if (config.singleRun) {
webpackConfig.plugins.unshift(new turn_off_watch_webpack_plugin_1.TurnOffWatchWebpackPlugin());
}
function unblock() {
isBlocked = false;
blocked.forEach((cb) => cb());
blocked = [];
}
let compiler;
try {
compiler = webpack(webpackConfig);
}
catch (e) {
logger.error(e.stack || e);
if (e.details) {
logger.error(e.details);
}
throw e;
}
function handler(callback) {
isBlocked = true;
if (typeof callback === 'function') {
callback();
}
}
compiler.hooks.invalid.tap('karma', () => handler());
compiler.hooks.watchRun.tapAsync('karma', (_, callback) => handler(callback));
compiler.hooks.run.tapAsync('karma', (_, callback) => handler(callback));
let lastCompilationHash;
compiler.hooks.done.tap('karma', (stats) => {
if (stats.compilation.errors.length > 0) {
logger.error(stats.toString('errors-only'));
lastCompilationHash = undefined;
}
else if (stats.hash !== lastCompilationHash) {
lastCompilationHash = stats.hash;
emitter.refreshFiles();
}
unblock();
});
webpackMiddleware = webpackDevMiddleware(compiler, webpackMiddlewareConfig);
customFileHandlers.push({
urlRegex: /^\/_karma_webpack_\/.*/,
handler: (req, res) => {
webpackMiddleware(req, res, function () {
const alwaysServe = [
'/_karma_webpack_/runtime.js',
'/_karma_webpack_/polyfills.js',
'/_karma_webpack_/vendor.js'
];
if (alwaysServe.includes(req.url)) {
res.statusCode = 200;
res.end();
}
else {
res.statusCode = 404;
res.end('Not found');
}
});
}
});
emitter.on('exit', (done) => {
webpackMiddleware.close();
done();
});
};
init.$inject = ['config', 'emitter', 'customFileHandlers'];
module.exports = {
'framework:lib-tools': ['factory', init],
'middleware:lib-tools--blocker': ['factory', requestBlocker],
'middleware:lib-tools--fallback': ['factory', fallbackMiddleware]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiLi8iLCJzb3VyY2VzIjpbImthcm1hLXBsdWdpbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLG1DQUFtQztBQUNuQywrREFBK0Q7QUFDL0QsK0JBQStCO0FBRS9CLHdDQUFvRDtBQUNwRCxvQ0FBa0M7QUFFbEMsZ0RBQTBEO0FBQzFELGtHQUE0RjtBQUM1RixvR0FBNkY7QUFVN0YsSUFBSSxPQUFPLEdBQW1CLEVBQUUsQ0FBQztBQUNqQyxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7QUFDdEIsSUFBSSxpQkFBaUYsQ0FBQztBQUV0RixTQUFTLGNBQWM7SUFDbkIsT0FBTyxDQUFDLEVBQW1CLEVBQUUsRUFBdUIsRUFBRSxJQUFnQixFQUFFLEVBQUU7UUFDdEUsSUFBSSxTQUFTLEVBQUU7WUFDWCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3RCO2FBQU07WUFDSCxJQUFJLEVBQUUsQ0FBQztTQUNWO0lBQ0wsQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQUVELFNBQVMsa0JBQWtCO0lBQ3ZCLE9BQU8sQ0FBQyxHQUFvQixFQUFFLEdBQXdCLEVBQUUsSUFBZ0IsRUFBRSxFQUFFO1FBQ3hFLElBQUksaUJBQWlCLEVBQUU7WUFDbkIsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNoRCxNQUFNLFVBQVUsbUNBQVEsR0FBRyxLQUFFLEdBQUcsRUFBRSxVQUFVLEdBQUUsQ0FBQztZQUMvQyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzVDO2FBQU07WUFDSCxJQUFJLEVBQUUsQ0FBQztTQUNWO0lBQ0wsQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQUVELE1BQU0sSUFBSSxHQUFHLEtBQUssRUFDZCxNQUFxQixFQUNyQixPQUlDLEVBQ0Qsa0JBQXVFLEVBQ3pFLEVBQUU7SUFDQSxNQUFNLE1BQU0sR0FBRyxJ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QU07b0JBQ0gsR0FBRyxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7b0JBQ3JCLEdBQUcsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQ3hCO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0tBQ0osQ0FBQyxDQUFDO0lBRUgsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUN4QixpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMxQixJQUFJLEVBQUUsQ0FBQztJQUNYLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDO0FBRUYsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztBQUUzRCxNQUFNLENBQUMsT0FBTyxHQUFHO0lBQ2IscUJBQXFCLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDO0lBQ3hDLCtCQUErQixFQUFFLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQztJQUM1RCxnQ0FBZ0MsRUFBRSxDQUFDLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQztDQUNwRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaHR0cCBmcm9tICdodHRwJztcblxuaW1wb3J0IHsgQ29uZmlnT3B0aW9ucyBhcyBLYXJtYUNvbmZpZ09wdGlvbnMgfSBmcm9tICdrYXJtYSc7XG5pbXBvcnQgKiBhcyB3ZWJwYWNrIGZyb20gJ3dlYnBhY2snO1xuaW1wb3J0ICogYXMgd2VicGFja0Rldk1pZGRsZXdhcmUgZnJvbSAnd2VicGFjay1kZXYtbWlkZGxld2FyZSc7XG5pbXBvcnQgKiBhcyB5YXJncyBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGdldFRlc3RDb25maWdGcm9tS2FybWEgfSBmcm9tICcuLi9oZWxwZXJzJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL3V0aWxzJztcblxuaW1wb3J0IHsgZ2V0V2VicGFja1Rlc3RDb25maWcgfSBmcm9tICcuLi93ZWJwYWNrL2NvbmZpZ3MnO1xuaW1wb3J0IHsgRmFpbHVyZUthcm1hV2VicGFja1BsdWdpbiB9IGZyb20gJy4uL3dlYnBhY2svcGx1Z2lucy9mYWlsdXJlLWthcm1hLXdlYnBhY2stcGx1Z2luJztcbmltcG9ydCB7IFR1cm5PZmZXYXRjaFdlYnBhY2tQbHVnaW4gfSBmcm9tICcuLi93ZWJwYWNrL3BsdWdpbnMvdHVybi1vZmYtd2F0Y2gtd2VicGFjay1wbHVnaW4nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbk9wdGlvbnMgZXh0ZW5kcyBLYXJtYUNvbmZpZ09wdGlvbnMge1xuICAgIGNvbmZpZ0ZpbGU6IHN0cmluZztcbiAgICB3ZWJwYWNrQ29uZmlnPzogd2VicGFjay5Db25maWd1cmF0aW9uO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IHR5cGUgTmV4dEhhbmRsZUZ1bmN0aW9uID0gKHJlcTogYW55LCByZXM6IGh0dHAuU2VydmVyUmVzcG9uc2UsIG5leHQ6IChlcnI/OiB1bmtub3duKSA9PiB2b2lkKSA9PiB2b2lkO1xuXG5sZXQgYmxvY2tlZDogKCgpID0+IHZvaWQpW10gPSBbXTtcbmxldCBpc0Jsb2NrZWQgPSBmYWxzZTtcbmxldCB3ZWJwYWNrTWlkZGxld2FyZTogd2VicGFja0Rldk1pZGRsZXdhcmUuV2VicGFja0Rldk1pZGRsZXdhcmUgJiBOZXh0SGFuZGxlRnVuY3Rpb247XG5cbmZ1bmN0aW9uIHJlcXVlc3RCbG9ja2VyKCkge1xuICAgIHJldHVybiAoXzE6IHsgdXJsOiBzdHJpbmcgfSwgXzI6IGh0dHAuU2VydmVyUmVzcG9uc2UsIG5leHQ6ICgpID0+IHZvaWQpID0+IHtcbiAgICAgICAgaWYgKGlzQmxvY2tlZCkge1xuICAgICAgICAgICAgYmxvY2tlZC5wdXNoKG5leHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZmFsbGJhY2tNaWRkbGV3YXJlKCkge1xuICAgIHJldHVybiAocmVxOiB7IHVybDogc3RyaW5nIH0sIHJlczogaHR0cC5TZXJ2ZXJSZXNwb25zZSwgbmV4dDogKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgICBpZiAod2VicGFja01pZGRsZXdhcmUpIHtcbiAgICAgICAgICAgIGNvbnN0IHdlYnBhY2tVcmwgPSBgL19rYXJtYV93ZWJwYWNrXyR7cmVxLnVybH1gO1xuICAgICAgICAgICAgY29uc3Qgd2VicGFja1JlcSA9IHsgLi4ucmVxLCB1cmw6IHdlYnBhY2tVcmwgfTtcbiAgICAgICAgICAgIHdlYnBhY2tNaWRkbGV3YXJlKHdlYnBhY2tSZXEsIHJlcywgbmV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5jb25zdCBpbml0ID0gYXN5bmMgKFxuICAgIGNvbmZpZzogUGx1Z2luT3B0aW9ucyxcbiAgICBlbWl0dGVyOiB7XG4gICAgICAgIG9uOiAoZXZlbnROYW1lOiBzdHJpbmcsIGNiOiAoZG9uZUZuOiAoKSA9PiB2b2lkKSA9PiB2b2lkKSA9PiB2b2lkO1xuICAgICAgICBlbWl0OiAoZXZlbnROYW1lOiBzdHJpbmcsIG1lc3NhZ2VzOiBzdHJpbmdbXSwgb3B0aW9ucz86IHsgZXhpdENvZGU6IG51bWJlciB9KSA9PiB2b2lkO1xuICAgICAgICByZWZyZXNoRmlsZXM6ICgpID0+IHZvaWQ7XG4gICAgfSxcbiAgICBjdXN0b21GaWxlSGFuZGxlcnM6IHsgdXJsUmVnZXg6IFJlZ0V4cDsgaGFuZGxlcjogTmV4dEhhbmRsZUZ1bmN0aW9uIH1bXVxuKSA9PiB7XG4gICAgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcih7IGxvZ0xldmVsOiAnaW5mbycgfSk7XG5cbiAgICBjb25maWcuY3VzdG9tQ29udGV4dEZpbGUgPSBgJHtfX2Rpcm5hbWV9L2thcm1hLWNvbnRleHQuaHRtbGA7XG4gICAgY29uZmlnLmN1c3RvbURlYnVnRmlsZSA9IGAke19fZGlybmFtZX0va2FybWEtZGVidWcuaHRtbGA7XG5cbiAgICBjb25maWcuYmVmb3JlTWlkZGxld2FyZSA9IGNvbmZpZy5iZWZvcmVNaWRkbGV3YXJlIHx8IFtdO1xuICAgIGNvbmZpZy5iZWZvcmVNaWRkbGV3YXJlLnB1c2goJ2xpYi10b29scy0tYmxvY2tlcicpO1xuICAgIGNvbmZpZy5taWRkbGV3YXJlID0gY29uZmlnLm1pZGRsZXdhcmUgfHwgW107XG4gICAgY29uZmlnLm1pZGRsZXdhcmUucHVzaCgnbGliLXRvb2xzLS1mYWxsYmFjaycpO1xuXG4gICAgY29uc3Qgd2VicGFja01pZGRsZXdhcmVDb25maWc6IHdlYnBhY2tEZXZNaWRkbGV3YXJlLk9wdGlvbnMgPSB7XG4gICAgICAgIHB1YmxpY1BhdGg6ICcvX2thcm1hX3dlYnBhY2tfLydcbiAgICB9O1xuXG4gICAgY29uc3QgY29tcGlsYXRpb25FcnJvckNhbGxiYWNrID0gKF86IHN0cmluZyB8IHVuZGVmaW5lZCwgZXJyb3JzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICBlbWl0dGVyLmVtaXQoJ2NvbXBpbGVfZXJyb3InLCBlcnJvcnMpO1xuICAgICAgICBlbWl0dGVyLmVtaXQoJ3J1bl9jb21wbGV0ZScsIFtdLCB7IGV4aXRDb2RlOiAxIH0pO1xuICAgICAgICB1bmJsb2NrKCk7XG4gICAgfTtcblxuICAgIGxldCB3ZWJwYWNrQ29uZmlnOiB3ZWJwYWNrLkNvbmZpZ3VyYXRpb247XG5cbiAgICBpZiAoY29uZmlnLndlYnBhY2tDb25maWcpIHtcbiAgICAgICAgd2VicGFja0NvbmZpZyA9IGNvbmZpZy53ZWJwYWNrQ29uZmlnO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPVxuICAgICAgICAgICAgcHJvY2Vzcy5hcmd2Lmxlbmd0aCA+IDQgJiYgLyhcXFxcfFxcLyk/a2FybWEoXFwuanMpPyQvaS50ZXN0KHByb2Nlc3MuYXJndlsxXSkgPyBwcm9jZXNzLmFyZ3Yuc2xpY2UoNCkgOiBbXTtcblxuICAgICAgICBjb25zdCBjb21tYW5kT3B0aW9ucyA9IHlhcmdzKGFyZ3MpXG4gICAgICAgICAgICAub3B0aW9uKCdicm93c2VycycsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vcHRpb24oJ3JlcG9ydGVycycsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vcHRpb24oJ2NvZGVDb3ZlcmFnZUV4Y2x1ZGUnLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZydcbiAgICAgICAgICAgIH0pLmFyZ3Y7XG5cbiAgICAgICAgY29uc3QgdGVzdENvbmZpZyA9IGF3YWl0IGdldFRlc3RDb25maWdGcm9tS2FybWEoY29uZmlnLCBjb21tYW5kT3B0aW9ucyk7XG4gICAgICAgIGlmICghdGVzdENvbmZpZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCB3b3JrZmxvdyB0ZXN0IGNvbmZpZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kT3B0aW9ucy5yZXBvcnRlcnMgPT0gbnVsbCAmJiB0ZXN0Q29uZmlnLnJlcG9ydGVycyAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25maWcucmVwb3J0ZXJzID0gdGVzdENvbmZpZy5yZXBvcnRlcnM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZE9wdGlvbnMuYnJvd3NlcnMgPT0gbnVsbCAmJiB0ZXN0Q29uZmlnLmJyb3dzZXJzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbmZpZy5icm93c2VycyA9IHRlc3RDb25maWcuYnJvd3NlcnM7XG4gICAgICAgIH1cblxuICAgICAgICB3ZWJwYWNrQ29uZmlnID0gYXdhaXQgZ2V0V2VicGFja1Rlc3RDb25maWcodGVzdENvbmZpZywgY29tbWFuZE9wdGlvbnMpO1xuICAgIH1cblxuICAgIHdlYnBhY2tDb25maWcucGx1Z2lucyA9IHdlYnBhY2tDb25maWcucGx1Z2lucyB8fCBbXTtcbiAgICB3ZWJwYWNrQ29uZmlnLnBsdWdpbnMucHVzaChuZXcgRmFpbHVyZUthcm1hV2VicGFja1BsdWdpbihjb21waWxhdGlvbkVycm9yQ2FsbGJhY2spKTtcbiAgICB3ZWJwYWNrQ29uZmlnLndhdGNoID0gIWNvbmZpZy5zaW5nbGVSdW47XG4gICAgaWYgKGNvbmZpZy5zaW5nbGVSdW4pIHtcbiAgICAgICAgd2VicGFja0NvbmZpZy5wbHVnaW5zLnVuc2hpZnQobmV3IFR1cm5PZmZXYXRjaFdlYnBhY2tQbHVnaW4oKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdW5ibG9jaygpOiB2b2lkIHtcbiAgICAgICAgaXNCbG9ja2VkID0gZmFsc2U7XG4gICAgICAgIGJsb2NrZWQuZm9yRWFjaCgoY2IpID0+IGNiKCkpO1xuICAgICAgICBibG9ja2VkID0gW107XG4gICAgfVxuXG4gICAgbGV0IGNvbXBpbGVyOiB3ZWJwYWNrLkNvbXBpbGVyO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbXBpbGVyID0gd2VicGFjayh3ZWJwYWNrQ29uZmlnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcigoZSBhcyBFcnJvcikuc3RhY2sgfHwgZSk7XG4gICAgICAgIGlmICgoZSBhcyB7IGRldGFpbHM6IHN0cmluZyB9KS5kZXRhaWxzKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoKGUgYXMgeyBkZXRhaWxzOiBzdHJpbmcgfSkuZGV0YWlscyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZXIoY2FsbGJhY2s/OiAoKSA9PiB2b2lkKSB7XG4gICAgICAgIGlzQmxvY2tlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBpbGVyLmhvb2tzLmludmFsaWQudGFwKCdrYXJtYScsICgpID0+IGhhbmRsZXIoKSk7XG4gICAgY29tcGlsZXIuaG9va3Mud2F0Y2hSdW4udGFwQXN5bmMoJ2thcm1hJywgKF8sIGNhbGxiYWNrOiAoKSA9PiB2b2lkKSA9PiBoYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgY29tcGlsZXIuaG9va3MucnVuLnRhcEFzeW5jKCdrYXJtYScsIChfLCBjYWxsYmFjazogKCkgPT4gdm9pZCkgPT4gaGFuZGxlcihjYWxsYmFjaykpO1xuXG4gICAgbGV0IGxhc3RDb21waWxhdGlvbkhhc2g6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBjb21waWxlci5ob29rcy5kb25lLnRhcCgna2FybWEnLCAoc3RhdHMpID0+IHtcbiAgICAgICAgaWYgKHN0YXRzLmNvbXBpbGF0aW9uLmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc3RhdHMudG9TdHJpbmcoJ2Vycm9ycy1vbmx5JykpO1xuICAgICAgICAgICAgbGFzdENvbXBpbGF0aW9uSGFzaCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0cy5oYXNoICE9PSBsYXN0Q29tcGlsYXRpb25IYXNoKSB7XG4gICAgICAgICAgICBsYXN0Q29tcGlsYXRpb25IYXNoID0gc3RhdHMuaGFzaDtcbiAgICAgICAgICAgIGVtaXR0ZXIucmVmcmVzaEZpbGVzKCk7XG4gICAgICAgIH1cblxuICAgICAgICB1bmJsb2NrKCk7XG4gICAgfSk7XG5cbiAgICB3ZWJwYWNrTWlkZGxld2FyZSA9IHdlYnBhY2tEZXZNaWRkbGV3YXJlKGNvbXBpbGVyLCB3ZWJwYWNrTWlkZGxld2FyZUNvbmZpZyk7XG5cbiAgICBjdXN0b21GaWxlSGFuZGxlcnMucHVzaCh7XG4gICAgICAgIHVybFJlZ2V4OiAvXlxcL19rYXJtYV93ZWJwYWNrX1xcLy4qLyxcbiAgICAgICAgaGFuZGxlcjogKHJlcTogeyB1cmw6IHN0cmluZyB9LCByZXM6IGh0dHAuU2VydmVyUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHdlYnBhY2tNaWRkbGV3YXJlKHJlcSwgcmVzLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWx3YXlzU2VydmUgPSBbXG4gICAgICAgICAgICAgICAgICAgICcvX2thcm1hX3dlYnBhY2tfL3J1bnRpbWUuanMnLFxuICAgICAgICAgICAgICAgICAgICAnL19rYXJtYV93ZWJwYWNrXy9wb2x5ZmlsbHMuanMnLFxuICAgICAgICAgICAgICAgICAgICAnL19rYXJtYV93ZWJwYWNrXy92ZW5kb3IuanMnXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBpZiAoYWx3YXlzU2VydmUuaW5jbHVkZXMocmVxLnVybCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSAyMDA7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXMuc3RhdHVzQ29kZSA9IDQwNDtcbiAgICAgICAgICAgICAgICAgICAgcmVzLmVuZCgnTm90IGZvdW5kJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGVtaXR0ZXIub24oJ2V4aXQnLCAoZG9uZSkgPT4ge1xuICAgICAgICB3ZWJwYWNrTWlkZGxld2FyZS5jbG9zZSgpO1xuICAgICAgICBkb25lKCk7XG4gICAgfSk7XG59O1xuXG5pbml0LiRpbmplY3QgPSBbJ2NvbmZpZycsICdlbWl0dGVyJywgJ2N1c3RvbUZpbGVIYW5kbGVycyddO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAnZnJhbWV3b3JrOmxpYi10b29scyc6IFsnZmFjdG9yeScsIGluaXRdLFxuICAgICdtaWRkbGV3YXJlOmxpYi10b29scy0tYmxvY2tlcic6IFsnZmFjdG9yeScsIHJlcXVlc3RCbG9ja2VyXSxcbiAgICAnbWlkZGxld2FyZTpsaWItdG9vbHMtLWZhbGxiYWNrJzogWydmYWN0b3J5JywgZmFsbGJhY2tNaWRkbGV3YXJlXVxufTtcbiJdfQ==