UNPKG

electron-forge

Version:

A complete tool for building modern Electron applications

296 lines (230 loc) 25.6 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _getIterator2 = require('babel-runtime/core-js/get-iterator'); var _getIterator3 = _interopRequireDefault(_getIterator2); var _assign = require('babel-runtime/core-js/object/assign'); var _assign2 = _interopRequireDefault(_assign); var _bluebird = require('bluebird'); require('colors'); var _fsExtra = require('fs-extra'); var _fsExtra2 = _interopRequireDefault(_fsExtra); var _path = require('path'); var _path2 = _interopRequireDefault(_path); var _targets = require('electron-packager/targets'); var _oraHandler = require('../util/ora-handler'); var _oraHandler2 = _interopRequireDefault(_oraHandler); var _getElectronVersion = require('../util/get-electron-version'); var _getElectronVersion2 = _interopRequireDefault(_getElectronVersion); var _forgeConfig = require('../util/forge-config'); var _forgeConfig2 = _interopRequireDefault(_forgeConfig); var _hook = require('../util/hook'); var _hook2 = _interopRequireDefault(_hook); var _messages = require('../util/messages'); var _parseArchs = require('../util/parse-archs'); var _parseArchs2 = _interopRequireDefault(_parseArchs); var _readPackageJson = require('../util/read-package-json'); var _readPackageJson2 = _interopRequireDefault(_readPackageJson); var _requireSearch = require('../util/require-search'); var _resolveDir = require('../util/resolve-dir'); var _resolveDir2 = _interopRequireDefault(_resolveDir); var _outDir = require('../util/out-dir'); var _outDir2 = _interopRequireDefault(_outDir); var _package = require('./package'); var _package2 = _interopRequireDefault(_package); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * @typedef {Object} MakeOptions * @property {string} [dir=process.cwd()] The path to the app from which distributables are generated * @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually * @property {boolean} [skipPackage=false] Whether to skip the pre-make packaging step * @property {Array<string>} [overrideTargets] An array of make targets to override your forge config * @property {string} [arch=host architecture] The target architecture * @property {string} [platform=process.platform] The target platform. * @property {string} [outDir=`${dir}/out`] The path to the directory containing generated distributables */ /** * @typedef {Object} MakeResult * @property {Array<string>} artifacts An array of paths to artifacts generated for this make run * @property {Object} packageJSON The state of the package.json file when the make happened * @property {string} platform The platform this make run was for * @property {string} arch The arch this make run was for */ /** * Make distributables for an Electron application. * * @param {MakeOptions} providedOptions - Options for the make method * @return {Promise<Array<MakeResult>>} Will resolve when the make process is complete */ exports.default = (() => { var _ref = (0, _bluebird.coroutine)(function* (providedOptions = {}) { // eslint-disable-next-line prefer-const, no-unused-vars var _Object$assign = (0, _assign2.default)({ dir: process.cwd(), interactive: false, skipPackage: false, arch: (0, _targets.hostArch)(), platform: process.platform }, providedOptions); let dir = _Object$assign.dir, interactive = _Object$assign.interactive, skipPackage = _Object$assign.skipPackage, overrideTargets = _Object$assign.overrideTargets, arch = _Object$assign.arch, platform = _Object$assign.platform; _oraHandler2.default.interactive = interactive; let forgeConfig; yield (0, _oraHandler2.default)('Resolving Forge Config', (0, _bluebird.coroutine)(function* () { dir = yield (0, _resolveDir2.default)(dir); if (!dir) { throw 'Failed to locate makeable Electron application'; } forgeConfig = yield (0, _forgeConfig2.default)(dir); })); const outDir = providedOptions.outDir || (0, _outDir2.default)(dir, forgeConfig); const actualTargetPlatform = platform; platform = platform === 'mas' ? 'darwin' : platform; if (!['darwin', 'win32', 'linux', 'mas'].includes(actualTargetPlatform)) { throw new Error(`'${actualTargetPlatform}' is an invalid platform. Choices are 'darwin', 'mas', 'win32' or 'linux'`); } const makers = {}; const targets = overrideTargets || forgeConfig.make_targets[platform]; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = (0, _getIterator3.default)(targets), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { const target = _step.value; const maker = (0, _requireSearch.requireSearchRaw)(__dirname, [`../makers/${platform}/${target}.js`, `../makers/generic/${target}.js`, `electron-forge-maker-${target}`, target, _path2.default.resolve(dir, target), _path2.default.resolve(dir, 'node_modules', target)]); if (!maker) { throw new Error(['Could not find a build target with the name: ', `${target} for the platform: ${actualTargetPlatform}`].join('')); } if (!maker.isSupportedOnCurrentPlatform) { throw new Error([`Maker for target ${target} is incompatible with this version of `, 'electron-forge, please upgrade or contact the maintainer ', '(needs to implement \'isSupportedOnCurrentPlatform)\')'].join('')); } if (!(yield maker.isSupportedOnCurrentPlatform())) { throw new Error([`Cannot build for ${platform} target ${target}: the maker declared `, `that it cannot run on ${process.platform}`].join('')); } makers[target] = maker.default || maker; } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } if (!skipPackage) { (0, _messages.info)(interactive, 'We need to package your application before we can make it'.green); yield (0, _package2.default)({ dir, interactive, arch, outDir, platform: actualTargetPlatform }); } else { (0, _messages.warn)(interactive, 'WARNING: Skipping the packaging step, this could result in an out of date build'.red); } (0, _messages.info)(interactive, 'Making for the following targets:', `${targets.join(', ')}`.cyan); const packageJSON = yield (0, _readPackageJson2.default)(dir); const appName = forgeConfig.electronPackagerConfig.name || packageJSON.productName || packageJSON.name; let outputs = []; yield (0, _hook2.default)(forgeConfig, 'preMake'); const electronVersion = yield (0, _getElectronVersion2.default)(dir); var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = (0, _getIterator3.default)((0, _parseArchs2.default)(platform, arch, electronVersion)), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { const targetArch = _step2.value; const packageDir = _path2.default.resolve(outDir, `${appName}-${actualTargetPlatform}-${targetArch}`); if (!(yield _fsExtra2.default.pathExists(packageDir))) { throw new Error(`Couldn't find packaged app at: ${packageDir}`); } var _iteratorNormalCompletion3 = true; var _didIteratorError3 = false; var _iteratorError3 = undefined; try { for (var _iterator3 = (0, _getIterator3.default)(targets), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { const target = _step3.value; const maker = makers[target]; // eslint-disable-next-line no-loop-func yield (0, _oraHandler2.default)(`Making for target: ${target.cyan} - On platform: ${actualTargetPlatform.cyan} - For arch: ${targetArch.cyan}`, (0, _bluebird.coroutine)(function* () { try { const artifacts = yield maker({ dir: packageDir, appName, targetPlatform: actualTargetPlatform, targetArch, forgeConfig, packageJSON }); outputs.push({ artifacts, packageJSON, platform: actualTargetPlatform, arch: targetArch }); } catch (err) { if (err) { throw { message: `An error occured while making for target: ${target}`, stack: `${err.message}\n${err.stack}` }; } else { throw new Error(`An unknown error occured while making for target: ${target}`); } } })); } } catch (err) { _didIteratorError3 = true; _iteratorError3 = err; } finally { try { if (!_iteratorNormalCompletion3 && _iterator3.return) { _iterator3.return(); } } finally { if (_didIteratorError3) { throw _iteratorError3; } } } } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } const result = yield (0, _hook2.default)(forgeConfig, 'postMake', outputs); // If the postMake hooks modifies the locations / names of the outputs it must return // the new locations so that the publish step knows where to look if (Array.isArray(result)) { outputs = result; } return outputs; }); return function () { return _ref.apply(this, arguments); }; })(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwaS9tYWtlLmpzIl0sIm5hbWVzIjpbInByb3ZpZGVkT3B0aW9ucyIsImRpciIsInByb2Nlc3MiLCJjd2QiLCJpbnRlcmFjdGl2ZSIsInNraXBQYWNrYWdlIiwiYXJjaCIsInBsYXRmb3JtIiwib3ZlcnJpZGVUYXJnZXRzIiwiYXN5bmNPcmEiLCJmb3JnZUNvbmZpZyIsIm91dERpciIsImFjdHVhbFRhcmdldFBsYXRmb3JtIiwiaW5jbHVkZXMiLCJFcnJvciIsIm1ha2VycyIsInRhcmdldHMiLCJtYWtlX3RhcmdldHMiLCJ0YXJnZXQiLCJtYWtlciIsIl9fZGlybmFtZSIsInBhdGgiLCJyZXNvbHZlIiwiam9pbiIsImlzU3VwcG9ydGVkT25DdXJyZW50UGxhdGZvcm0iLCJkZWZhdWx0IiwiZ3JlZW4iLCJyZWQiLCJjeWFuIiwicGFja2FnZUpTT04iLCJhcHBOYW1lIiwiZWxlY3Ryb25QYWNrYWdlckNvbmZpZyIsIm5hbWUiLCJwcm9kdWN0TmFtZSIsIm91dHB1dHMiLCJlbGVjdHJvblZlcnNpb24iLCJ0YXJnZXRBcmNoIiwicGFja2FnZURpciIsImZzIiwicGF0aEV4aXN0cyIsImFydGlmYWN0cyIsInRhcmdldFBsYXRmb3JtIiwicHVzaCIsImVyciIsIm1lc3NhZ2UiLCJzdGFjayIsInJlc3VsdCIsIkFycmF5IiwiaXNBcnJheSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFFQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7OztBQUNBOzs7O0FBRUE7Ozs7OztBQUVBOzs7Ozs7Ozs7OztBQVdBOzs7Ozs7OztBQVFBOzs7Ozs7O3NDQU1lLFdBQU9BLGtCQUFrQixFQUF6QixFQUFnQztBQUM3QztBQUQ2Qyx5QkFFNEIsc0JBQWM7QUFDckZDLFdBQUtDLFFBQVFDLEdBQVIsRUFEZ0Y7QUFFckZDLG1CQUFhLEtBRndFO0FBR3JGQyxt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QUFjRixNQUFkLENBQUosRUFBMkI7QUFDekJaLGdCQUFVWSxNQUFWO0FBQ0Q7O0FBRUQsV0FBT1osT0FBUDtBQUNELEciLCJmaWxlIjoiYXBpL21ha2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ2NvbG9ycyc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBob3N0QXJjaCB9IGZyb20gJ2VsZWN0cm9uLXBhY2thZ2VyL3RhcmdldHMnO1xuXG5pbXBvcnQgYXN5bmNPcmEgZnJvbSAnLi4vdXRpbC9vcmEtaGFuZGxlcic7XG5pbXBvcnQgZ2V0RWxlY3Ryb25WZXJzaW9uIGZyb20gJy4uL3V0aWwvZ2V0LWVsZWN0cm9uLXZlcnNpb24nO1xuaW1wb3J0IGdldEZvcmdlQ29uZmlnIGZyb20gJy4uL3V0aWwvZm9yZ2UtY29uZmlnJztcbmltcG9ydCBydW5Ib29rIGZyb20gJy4uL3V0aWwvaG9vayc7XG5pbXBvcnQgeyBpbmZvLCB3YXJuIH0gZnJvbSAnLi4vdXRpbC9tZXNzYWdlcyc7XG5pbXBvcnQgcGFyc2VBcmNocyBmcm9tICcuLi91dGlsL3BhcnNlLWFyY2hzJztcbmltcG9ydCByZWFkUGFja2FnZUpTT04gZnJvbSAnLi4vdXRpbC9yZWFkLXBhY2thZ2UtanNvbic7XG5pbXBvcnQgeyByZXF1aXJlU2VhcmNoUmF3IH0gZnJvbSAnLi4vdXRpbC9yZXF1aXJlLXNlYXJjaCc7XG5pbXBvcnQgcmVzb2x2ZURpciBmcm9tICcuLi91dGlsL3Jlc29sdmUtZGlyJztcbmltcG9ydCBnZXRDdXJyZW50T3V0RGlyIGZyb20gJy4uL3V0aWwvb3V0LWRpcic7XG5cbmltcG9ydCBwYWNrYWdlciBmcm9tICcuL3BhY2thZ2UnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1ha2VPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Rpcj1wcm9jZXNzLmN3ZCgpXSBUaGUgcGF0aCB0byB0aGUgYXBwIGZyb20gd2hpY2ggZGlzdHJpYnV0YWJsZXMgYXJlIGdlbmVyYXRlZFxuICogQHByb3BlcnR5IHtib29sZWFufSBbaW50ZXJhY3RpdmU9ZmFsc2VdIFdoZXRoZXIgdG8gdXNlIHNlbnNpYmxlIGRlZmF1bHRzIG9yIHByb21wdCB0aGUgdXNlciB2aXN1YWxseVxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2tpcFBhY2thZ2U9ZmFsc2VdIFdoZXRoZXIgdG8gc2tpcCB0aGUgcHJlLW1ha2UgcGFja2FnaW5nIHN0ZXBcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nPn0gW292ZXJyaWRlVGFyZ2V0c10gQW4gYXJyYXkgb2YgbWFrZSB0YXJnZXRzIHRvIG92ZXJyaWRlIHlvdXIgZm9yZ2UgY29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FyY2g9aG9zdCBhcmNoaXRlY3R1cmVdIFRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3BsYXRmb3JtPXByb2Nlc3MucGxhdGZvcm1dIFRoZSB0YXJnZXQgcGxhdGZvcm0uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW291dERpcj1gJHtkaXJ9L291dGBdIFRoZSBwYXRoIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBnZW5lcmF0ZWQgZGlzdHJpYnV0YWJsZXNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1ha2VSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nPn0gYXJ0aWZhY3RzIEFuIGFycmF5IG9mIHBhdGhzIHRvIGFydGlmYWN0cyBnZW5lcmF0ZWQgZm9yIHRoaXMgbWFrZSBydW5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYWNrYWdlSlNPTiBUaGUgc3RhdGUgb2YgdGhlIHBhY2thZ2UuanNvbiBmaWxlIHdoZW4gdGhlIG1ha2UgaGFwcGVuZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwbGF0Zm9ybSBUaGUgcGxhdGZvcm0gdGhpcyBtYWtlIHJ1biB3YXMgZm9yXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXJjaCBUaGUgYXJjaCB0aGlzIG1ha2UgcnVuIHdhcyBmb3JcbiAqL1xuXG4vKipcbiAqIE1ha2UgZGlzdHJpYnV0YWJsZXMgZm9yIGFuIEVsZWN0cm9uIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7TWFrZU9wdGlvbnN9IHByb3ZpZGVkT3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBtYWtlIG1ldGhvZFxuICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxNYWtlUmVzdWx0Pj59IFdpbGwgcmVzb2x2ZSB3aGVuIHRoZSBtYWtlIHByb2Nlc3MgaXMgY29tcGxldGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgKHByb3ZpZGVkT3B0aW9ucyA9IHt9KSA9PiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3QsIG5vLXVudXNlZC12YXJzXG4gIGxldCB7IGRpciwgaW50ZXJhY3RpdmUsIHNraXBQYWNrYWdlLCBvdmVycmlkZVRhcmdldHMsIGFyY2gsIHBsYXRmb3JtIH0gPSBPYmplY3QuYXNzaWduKHtcbiAgICBkaXI6IHByb2Nlc3MuY3dkKCksXG4gICAgaW50ZXJhY3RpdmU6IGZhbHNlLFxuICAgIHNraXBQYWNrYWdlOiBmYWxzZSxcbiAgICBhcmNoOiBob3N0QXJjaCgpLFxuICAgIHBsYXRmb3JtOiBwcm9jZXNzLnBsYXRmb3JtLFxuICB9LCBwcm92aWRlZE9wdGlvbnMpO1xuXG4gIGFzeW5jT3JhLmludGVyYWN0aXZlID0gaW50ZXJhY3RpdmU7XG5cbiAgbGV0IGZvcmdlQ29uZmlnO1xuICBhd2FpdCBhc3luY09yYSgnUmVzb2x2aW5nIEZvcmdlIENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBkaXIgPSBhd2FpdCByZXNvbHZlRGlyKGRpcik7XG4gICAgaWYgKCFkaXIpIHtcbiAgICAgIHRocm93ICdGYWlsZWQgdG8gbG9jYXRlIG1ha2VhYmxlIEVsZWN0cm9uIGFwcGxpY2F0aW9uJztcbiAgICB9XG5cbiAgICBmb3JnZUNvbmZpZyA9IGF3YWl0IGdldEZvcmdlQ29uZmlnKGRpcik7XG4gIH0pO1xuXG4gIGNvbnN0IG91dERpciA9IHByb3ZpZGVkT3B0aW9ucy5vdXREaXIgfHwgZ2V0Q3VycmVudE91dERpcihkaXIsIGZvcmdlQ29uZmlnKTtcblxuICBjb25zdCBhY3R1YWxUYXJnZXRQbGF0Zm9ybSA9IHBsYXRmb3JtO1xuICBwbGF0Zm9ybSA9IHBsYXRmb3JtID09PSAnbWFzJyA/ICdkYXJ3aW4nIDogcGxhdGZvcm07XG4gIGlmICghWydkYXJ3aW4nLCAnd2luMzInLCAnbGludXgnLCAnbWFzJ10uaW5jbHVkZXMoYWN0dWFsVGFyZ2V0UGxhdGZvcm0pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnJHthY3R1YWxUYXJnZXRQbGF0Zm9ybX0nIGlzIGFuIGludmFsaWQgcGxhdGZvcm0uIENob2ljZXMgYXJlICdkYXJ3aW4nLCAnbWFzJywgJ3dpbjMyJyBvciAnbGludXgnYCk7XG4gIH1cblxuICBjb25zdCBtYWtlcnMgPSB7fTtcbiAgY29uc3QgdGFyZ2V0cyA9IG92ZXJyaWRlVGFyZ2V0cyB8fCBmb3JnZUNvbmZpZy5tYWtlX3RhcmdldHNbcGxhdGZvcm1dO1xuXG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICBjb25zdCBtYWtlciA9IHJlcXVpcmVTZWFyY2hSYXcoX19kaXJuYW1lLCBbXG4gICAgICBgLi4vbWFrZXJzLyR7cGxhdGZvcm19LyR7dGFyZ2V0fS5qc2AsXG4gICAgICBgLi4vbWFrZXJzL2dlbmVyaWMvJHt0YXJnZXR9LmpzYCxcbiAgICAgIGBlbGVjdHJvbi1mb3JnZS1tYWtlci0ke3RhcmdldH1gLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcGF0aC5yZXNvbHZlKGRpciwgdGFyZ2V0KSxcbiAgICAgIHBhdGgucmVzb2x2ZShkaXIsICdub2RlX21vZHVsZXMnLCB0YXJnZXQpLFxuICAgIF0pO1xuXG4gICAgaWYgKCFtYWtlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFtcbiAgICAgICAgJ0NvdWxkIG5vdCBmaW5kIGEgYnVpbGQgdGFyZ2V0IHdpdGggdGhlIG5hbWU6ICcsXG4gICAgICAgIGAke3RhcmdldH0gZm9yIHRoZSBwbGF0Zm9ybTogJHthY3R1YWxUYXJnZXRQbGF0Zm9ybX1gLFxuICAgICAgXS5qb2luKCcnKSk7XG4gICAgfVxuXG4gICAgaWYgKCFtYWtlci5pc1N1cHBvcnRlZE9uQ3VycmVudFBsYXRmb3JtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoW1xuICAgICAgICBgTWFrZXIgZm9yIHRhcmdldCAke3RhcmdldH0gaXMgaW5jb21wYXRpYmxlIHdpdGggdGhpcyB2ZXJzaW9uIG9mIGAsXG4gICAgICAgICdlbGVjdHJvbi1mb3JnZSwgcGxlYXNlIHVwZ3JhZGUgb3IgY29udGFjdCB0aGUgbWFpbnRhaW5lciAnLFxuICAgICAgICAnKG5lZWRzIHRvIGltcGxlbWVudCBcXCdpc1N1cHBvcnRlZE9uQ3VycmVudFBsYXRmb3JtKVxcJyknLFxuICAgICAgXS5qb2luKCcnKSk7XG4gICAgfVxuXG4gICAgaWYgKCFhd2FpdCBtYWtlci5pc1N1cHBvcnRlZE9uQ3VycmVudFBsYXRmb3JtKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihbXG4gICAgICAgIGBDYW5ub3QgYnVpbGQgZm9yICR7cGxhdGZvcm19IHRhcmdldCAke3RhcmdldH06IHRoZSBtYWtlciBkZWNsYXJlZCBgLFxuICAgICAgICBgdGhhdCBpdCBjYW5ub3QgcnVuIG9uICR7cHJvY2Vzcy5wbGF0Zm9ybX1gLFxuICAgICAgXS5qb2luKCcnKSk7XG4gICAgfVxuXG4gICAgbWFrZXJzW3RhcmdldF0gPSBtYWtlci5kZWZhdWx0IHx8IG1ha2VyO1xuICB9XG5cbiAgaWYgKCFza2lwUGFja2FnZSkge1xuICAgIGluZm8oaW50ZXJhY3RpdmUsICdXZSBuZWVkIHRvIHBhY2thZ2UgeW91ciBhcHBsaWNhdGlvbiBiZWZvcmUgd2UgY2FuIG1ha2UgaXQnLmdyZWVuKTtcbiAgICBhd2FpdCBwYWNrYWdlcih7XG4gICAgICBkaXIsXG4gICAgICBpbnRlcmFjdGl2ZSxcbiAgICAgIGFyY2gsXG4gICAgICBvdXREaXIsXG4gICAgICBwbGF0Zm9ybTogYWN0dWFsVGFyZ2V0UGxhdGZvcm0sXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgd2FybihpbnRlcmFjdGl2ZSwgJ1dBUk5JTkc6IFNraXBwaW5nIHRoZSBwYWNrYWdpbmcgc3RlcCwgdGhpcyBjb3VsZCByZXN1bHQgaW4gYW4gb3V0IG9mIGRhdGUgYnVpbGQnLnJlZCk7XG4gIH1cblxuICBpbmZvKGludGVyYWN0aXZlLCAnTWFraW5nIGZvciB0aGUgZm9sbG93aW5nIHRhcmdldHM6JywgYCR7dGFyZ2V0cy5qb2luKCcsICcpfWAuY3lhbik7XG5cbiAgY29uc3QgcGFja2FnZUpTT04gPSBhd2FpdCByZWFkUGFja2FnZUpTT04oZGlyKTtcbiAgY29uc3QgYXBwTmFtZSA9IGZvcmdlQ29uZmlnLmVsZWN0cm9uUGFja2FnZXJDb25maWcubmFtZSB8fCBwYWNrYWdlSlNPTi5wcm9kdWN0TmFtZSB8fCBwYWNrYWdlSlNPTi5uYW1lO1xuICBsZXQgb3V0cHV0cyA9IFtdO1xuXG4gIGF3YWl0IHJ1bkhvb2soZm9yZ2VDb25maWcsICdwcmVNYWtlJyk7XG5cbiAgY29uc3QgZWxlY3Ryb25WZXJzaW9uID0gYXdhaXQgZ2V0RWxlY3Ryb25WZXJzaW9uKGRpcik7XG4gIGZvciAoY29uc3QgdGFyZ2V0QXJjaCBvZiBwYXJzZUFyY2hzKHBsYXRmb3JtLCBhcmNoLCBlbGVjdHJvblZlcnNpb24pKSB7XG4gICAgY29uc3QgcGFja2FnZURpciA9IHBhdGgucmVzb2x2ZShvdXREaXIsIGAke2FwcE5hbWV9LSR7YWN0dWFsVGFyZ2V0UGxhdGZvcm19LSR7dGFyZ2V0QXJjaH1gKTtcbiAgICBpZiAoIShhd2FpdCBmcy5wYXRoRXhpc3RzKHBhY2thZ2VEaXIpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIHBhY2thZ2VkIGFwcCBhdDogJHtwYWNrYWdlRGlyfWApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgIGNvbnN0IG1ha2VyID0gbWFrZXJzW3RhcmdldF07XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sb29wLWZ1bmNcbiAgICAgIGF3YWl0IGFzeW5jT3JhKGBNYWtpbmcgZm9yIHRhcmdldDogJHt0YXJnZXQuY3lhbn0gLSBPbiBwbGF0Zm9ybTogJHthY3R1YWxUYXJnZXRQbGF0Zm9ybS5jeWFufSAtIEZvciBhcmNoOiAke3RhcmdldEFyY2guY3lhbn1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYXJ0aWZhY3RzID0gYXdhaXQgbWFrZXIoe1xuICAgICAgICAgICAgZGlyOiBwYWNrYWdlRGlyLFxuICAgICAgICAgICAgYXBwTmFtZSxcbiAgICAgICAgICAgIHRhcmdldFBsYXRmb3JtOiBhY3R1YWxUYXJnZXRQbGF0Zm9ybSxcbiAgICAgICAgICAgIHRhcmdldEFyY2gsXG4gICAgICAgICAgICBmb3JnZUNvbmZpZyxcbiAgICAgICAgICAgIHBhY2thZ2VKU09OLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFydGlmYWN0cyxcbiAgICAgICAgICAgIHBhY2thZ2VKU09OLFxuICAgICAgICAgICAgcGxhdGZvcm06IGFjdHVhbFRhcmdldFBsYXRmb3JtLFxuICAgICAgICAgICAgYXJjaDogdGFyZ2V0QXJjaCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgdGhyb3cge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBgQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBtYWtpbmcgZm9yIHRhcmdldDogJHt0YXJnZXR9YCxcbiAgICAgICAgICAgICAgc3RhY2s6IGAke2Vyci5tZXNzYWdlfVxcbiR7ZXJyLnN0YWNrfWAsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFuIHVua25vd24gZXJyb3Igb2NjdXJlZCB3aGlsZSBtYWtpbmcgZm9yIHRhcmdldDogJHt0YXJnZXR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW5Ib29rKGZvcmdlQ29uZmlnLCAncG9zdE1ha2UnLCBvdXRwdXRzKTtcbiAgLy8gSWYgdGhlIHBvc3RNYWtlIGhvb2tzIG1vZGlmaWVzIHRoZSBsb2NhdGlvbnMgLyBuYW1lcyBvZiB0aGUgb3V0cHV0cyBpdCBtdXN0IHJldHVyblxuICAvLyB0aGUgbmV3IGxvY2F0aW9ucyBzbyB0aGF0IHRoZSBwdWJsaXNoIHN0ZXAga25vd3Mgd2hlcmUgdG8gbG9va1xuICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgb3V0cHV0cyA9IHJlc3VsdDtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXRzO1xufTtcbiJdfQ==