From 4161babce106a32fb1ac50034c84d6804206ea86 Mon Sep 17 00:00:00 2001 From: "p.mikolajczak@tkhtechnology.com" Date: Tue, 4 Apr 2023 15:14:23 +0200 Subject: [PATCH 1/3] fix: Mitigate production vulnrabilities --- .gitignore | 1 - dist/bin/cli.js | 224 ++ dist/binaryModulesDetector.js | 80 + dist/defaultDependencies.js | 8 + dist/dependenciesManager.js | 181 ++ dist/desktop.js | 271 ++ dist/electron.js | 61 + dist/electronApp.js | 876 ++++++ dist/electronAppScaffold.js | 142 + dist/electronBuilder.js | 384 +++ dist/env.js | 239 ++ dist/index.js | 247 ++ dist/log.js | 75 + dist/meteorApp.js | 923 ++++++ dist/meteorManager.js | 147 + dist/packager.js | 142 + dist/scripts/addToScripts.js | 24 + dist/scripts/propagateVersion.js | 21 + dist/scripts/utils/addScript.js | 50 + dist/skeletonDependencies.js | 24 + dist/utils.js | 328 +++ lib/electronApp.js | 21 +- lib/meteorApp.js | 10 +- package-lock.json | 2718 +++++++++++------- package.json | 49 +- plugins/bundler/bundler.js | 21 +- tests/functional/electronApp.test.js | 2 +- tests/functional/modules/localServer.test.js | 8 +- tests/unit/meteorApp.test.js | 2 +- 29 files changed, 6164 insertions(+), 1115 deletions(-) create mode 100644 dist/bin/cli.js create mode 100644 dist/binaryModulesDetector.js create mode 100644 dist/defaultDependencies.js create mode 100644 dist/dependenciesManager.js create mode 100644 dist/desktop.js create mode 100644 dist/electron.js create mode 100644 dist/electronApp.js create mode 100644 dist/electronAppScaffold.js create mode 100644 dist/electronBuilder.js create mode 100644 dist/env.js create mode 100644 dist/index.js create mode 100644 dist/log.js create mode 100644 dist/meteorApp.js create mode 100644 dist/meteorManager.js create mode 100644 dist/packager.js create mode 100644 dist/scripts/addToScripts.js create mode 100644 dist/scripts/propagateVersion.js create mode 100644 dist/scripts/utils/addScript.js create mode 100644 dist/skeletonDependencies.js create mode 100644 dist/utils.js diff --git a/.gitignore b/.gitignore index fd027d5c..28f46c1a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ node_modules .idea -dist tests/_tmp_ tests/.__tmp_int .npm diff --git a/dist/bin/cli.js b/dist/bin/cli.js new file mode 100644 index 00000000..683607e0 --- /dev/null +++ b/dist/bin/cli.js @@ -0,0 +1,224 @@ +#!/usr/bin/env node + +/* eslint-disable global-require */ +"use strict"; + +var _fs = _interopRequireDefault(require("fs")); + +var _path = _interopRequireDefault(require("path")); + +var _assignIn = _interopRequireDefault(require("lodash/assignIn")); + +var _commander = _interopRequireDefault(require("commander")); + +var _shelljs = _interopRequireDefault(require("shelljs")); + +var _ = _interopRequireDefault(require("../..")); + +var _addScript = _interopRequireDefault(require("../scripts/utils/addScript")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const { + join +} = _path.default; +const cmd = process.argv[2]; +/* eslint-disable no-console */ + +const { + log, + error, + info, + warn +} = console; +/* eslint-enable no-console */ + +/** + * Looks for .meteor directory. + * @param {string} appPath - Meteor app path + */ + +function isMeteorApp(appPath) { + const meteorPath = join(appPath, '.meteor'); + + try { + return _fs.default.statSync(meteorPath).isDirectory(); + } catch (e) { + return false; + } +} +/** + * Just ensures a ddp url is set. + * + * @param {string|null} ddpUrl - the url that Meteor app connects to + * @returns {string|null} + */ + + +function getDdpUrl(ddpUrl = null) { + if (!ddpUrl && _commander.default.buildMeteor) { + info('no ddp_url specified, setting default: http://127.0.0.1:3000'); + return 'http://127.0.0.1:3000'; + } + + return ddpUrl; +} // -------------------------- + + +function collect(val, memo) { + memo.push(val); + return memo; +} + +_commander.default.option('-b, --build-meteor', 'runs meteor to obtain the mobile build, kills it after').option('-t, --build-timeout ', 'timeout value when waiting for ' + 'meteor to build, default 600sec').option('-p, --port ', 'port on which meteor is running, when with -b this will be passed to meteor when obtaining the build').option('--production', 'builds meteor app with the production switch, uglifies contents ' + 'of .desktop, packs app to app.asar').option('-a, --android', 'force adding android as a mobile platform instead of ios').option('-s, --scaffold', 'will scaffold .desktop if not present').option('-i, --ignore-stderr [string]', 'only with -b, strings that when found will not terminate meteor build', collect, []).option('--meteor-settings ', 'only with -b, adds --settings options to meteor').option('--prod-debug', 'forces adding dev tools to a production build').option('--ia32', 'generate 32bit installer/package').option('--all-archs', 'generate 32bit and 64bit installers').option('--win', 'generate Windows installer').option('--linux', 'generate Linux installer').option('--mac', 'generate Mac installer').option('-d, --debug', 'run electron with debug switch'); + +_commander.default.usage('[command] [options]').version(require('./../../package.json').version, '-V, --version').on('--help', () => { + log(' [ddp_url] - pass a ddp url if you want to use different one than used in meteor\'s --mobile-server'); + log(' this will also work with -b'); + log(' '); + log(' Examples:'); + log(''); + log(' ', ['# cd into meteor dir first', 'cd /your/meteor/app', 'meteor --mobile-server=127.0.0.1:3000', '', '# open new terminal, assuming you have done npm install --save-dev @meteor-community/meteor-desktop', 'npm run desktop -- init', 'npm run desktop'].join('\n ')); + log('\n'); +}); + +function verifyArgsSyntax() { + if (process.env.npm_config_argv) { + let npmArgv; + + try { + const args = ['-b', '--build-meteor', '-t', '--build-timeout', '-p', '--port', '--production', '-a', '--android', '-s', '--scaffold', '--ia32', '--win', '--linux', '--all-archs', '--win', '--mac', '--meteor-settings']; + npmArgv = JSON.parse(process.env.npm_config_argv); + + if (npmArgv.remain.length === 0 && npmArgv.original.length > 2) { + if (npmArgv.original.some(arg => !!~args.indexOf(arg))) { + warn('WARNING: seems that you might used the wrong console syntax, no ` --' + ' ` delimiter was found, be sure you are invoking meteor-desktop with' + ' it when passing commands or options -> ' + '`npm run desktop -- command --option`\n'); + } + } + } catch (e) {// Not sure if `npm_config_argv` is always present... + } + } +} + +function meteorDesktopFactory(ddpUrl, production = false) { + info(`METEOR-DESKTOP v${require('./../../package.json').version}\n`); + verifyArgsSyntax(); + const input = process.cwd(); + + if (!isMeteorApp(input)) { + error(`not in a meteor app dir\n ${input}`); + process.exit(); + } + + if (!_commander.default.output) { + _commander.default.output = input; + } + + if (production && !_commander.default.production) { + info('package/build-installer implies setting --production, setting it for you'); + } + + if (!_commander.default.buildMeteor) { + _commander.default.port = _commander.default.port || 3000; + info(`REMINDER: your Meteor project should be running now on port ${_commander.default.port}\n`); + } + + if (_commander.default.prodDebug) { + info('!! WARNING: You are adding devTools to a production build !!\n'); + } + + const options = { + ddpUrl, + skipMobileBuild: _commander.default.buildMeteor ? !_commander.default.buildMeteor : true, + production: _commander.default.production || production + }; + (0, _assignIn.default)(options, _commander.default); + return (0, _.default)(input, _commander.default.output, options); +} + +function run(ddpUrl) { + meteorDesktopFactory(getDdpUrl(ddpUrl)).run(); +} + +function build(ddpUrl) { + meteorDesktopFactory(getDdpUrl(ddpUrl)).build(); +} + +function init() { + meteorDesktopFactory().init(); +} + +function justRun() { + meteorDesktopFactory().justRun(); +} + +function runPackager(ddpUrl) { + meteorDesktopFactory(getDdpUrl(ddpUrl), true).runPackager(); +} + +function buildInstaller(ddpUrl) { + meteorDesktopFactory(getDdpUrl(ddpUrl), true).buildInstaller(); +} + +function initTestsSupport() { + log('installing cross-env, ava, meteor-desktop-test-suite and spectron'); + log('running `meteor npm install --save-dev cross-env ava spectron meteor-desktop-test-suite`'); + + const { + code + } = _shelljs.default.exec('meteor npm install --save-dev cross-env ava spectron meteor-desktop-test-suite'); + + if (code !== 0) { + warn('could not add cross-env, ava and spectron to your `devDependencies`, please do it' + ' manually'); + } + + const test = 'cross-env NODE_ENV=test ava .desktop/**/*.test.js -s --verbose'; + const testWatch = 'cross-env NODE_ENV=test ava .desktop/**/*.test.js -s --verbose' + ' --watch --source .desktop'; + + function fail() { + error('\ncould not add entries to `scripts` in package.json'); + log('please try to add it manually\n'); + log(`test-desktop: ${test}`); + log(`test-desktop-watch: ${testWatch}`); + } + + const packageJsonPath = _path.default.resolve(_path.default.join(process.cwd(), 'package.json')); + + (0, _addScript.default)('test-desktop', test, packageJsonPath, fail); + (0, _addScript.default)('test-desktop-watch', testWatch, packageJsonPath, fail); + log('\nadded test-desktop and test-desktop-watch entries'); + log('run the test with `npm run test-desktop`'); +} + +_commander.default.command('init').description('scaffolds .desktop dir in the meteor app').action(init); + +_commander.default.command('run [ddp_url]').description('(default) builds and runs desktop app').action(run); + +_commander.default.command('build [ddp_url]').description('builds your desktop app').action(build); + +_commander.default.command('build-installer [ddp_url]').description('creates the installer').action(buildInstaller); + +_commander.default.command('just-run').description('alias for running `electron .` in `.meteor/desktop-build`').action(justRun); + +_commander.default.command('package [ddp_url]').description('runs electron packager').action(runPackager); + +_commander.default.command('init-tests-support').description('prepares project for running functional tests of desktop app').action(initTestsSupport); + +if (process.argv.length === 2 || !~'-h|--help|run|init|build|build-installer|just-run|init-tests-support|package'.indexOf(cmd)) { + let { + argv + } = process; + + if (process.argv.length === 2) { + argv.push('run'); + } else { + let command = argv.splice(0, 2); + command = command.concat('run', argv); + argv = command; + } + + _commander.default.parse(argv); +} else { + _commander.default.parse(process.argv); +} +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJqb2luIiwicGF0aCIsImNtZCIsInByb2Nlc3MiLCJhcmd2IiwibG9nIiwiZXJyb3IiLCJpbmZvIiwid2FybiIsImNvbnNvbGUiLCJpc01ldGVvckFwcCIsImFwcFBhdGgiLCJtZXRlb3JQYXRoIiwiZnMiLCJzdGF0U3luYyIsImlzRGlyZWN0b3J5IiwiZSIsImdldERkcFVybCIsImRkcFVybCIsInByb2dyYW0iLCJidWlsZE1ldGVvciIsImNvbGxlY3QiLCJ2YWwiLCJtZW1vIiwicHVzaCIsIm9wdGlvbiIsInVzYWdlIiwidmVyc2lvbiIsInJlcXVpcmUiLCJvbiIsInZlcmlmeUFyZ3NTeW50YXgiLCJlbnYiLCJucG1fY29uZmlnX2FyZ3YiLCJucG1Bcmd2IiwiYXJncyIsIkpTT04iLCJwYXJzZSIsInJlbWFpbiIsImxlbmd0aCIsIm9yaWdpbmFsIiwic29tZSIsImFyZyIsImluZGV4T2YiLCJtZXRlb3JEZXNrdG9wRmFjdG9yeSIsInByb2R1Y3Rpb24iLCJpbnB1dCIsImN3ZCIsImV4aXQiLCJvdXRwdXQiLCJwb3J0IiwicHJvZERlYnVnIiwib3B0aW9ucyIsInNraXBNb2JpbGVCdWlsZCIsImFzc2lnbkluIiwibWV0ZW9yRGVza3RvcCIsInJ1biIsImJ1aWxkIiwiaW5pdCIsImp1c3RSdW4iLCJydW5QYWNrYWdlciIsImJ1aWxkSW5zdGFsbGVyIiwiaW5pdFRlc3RzU3VwcG9ydCIsImNvZGUiLCJzaGVsbCIsImV4ZWMiLCJ0ZXN0IiwidGVzdFdhdGNoIiwiZmFpbCIsInBhY2thZ2VKc29uUGF0aCIsInJlc29sdmUiLCJhZGRTY3JpcHQiLCJjb21tYW5kIiwiZGVzY3JpcHRpb24iLCJhY3Rpb24iLCJzcGxpY2UiLCJjb25jYXQiXSwic291cmNlcyI6WyIuLi8uLi9saWIvYmluL2NsaS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG4vKiBlc2xpbnQtZGlzYWJsZSBnbG9iYWwtcmVxdWlyZSAqL1xuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGFzc2lnbkluIGZyb20gJ2xvZGFzaC9hc3NpZ25Jbic7XG5pbXBvcnQgcHJvZ3JhbSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHNoZWxsIGZyb20gJ3NoZWxsanMnO1xuXG5pbXBvcnQgbWV0ZW9yRGVza3RvcCBmcm9tICcuLi8uLic7XG5pbXBvcnQgYWRkU2NyaXB0IGZyb20gJy4uL3NjcmlwdHMvdXRpbHMvYWRkU2NyaXB0JztcblxuY29uc3QgeyBqb2luIH0gPSBwYXRoO1xuY29uc3QgY21kID0gcHJvY2Vzcy5hcmd2WzJdO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5jb25zdCB7XG4gICAgbG9nLCBlcnJvciwgaW5mbywgd2FyblxufSA9IGNvbnNvbGU7XG5cbi8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuXG4vKipcbiAqIExvb2tzIGZvciAubWV0ZW9yIGRpcmVjdG9yeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBQYXRoIC0gTWV0ZW9yIGFwcCBwYXRoXG4gKi9cbmZ1bmN0aW9uIGlzTWV0ZW9yQXBwKGFwcFBhdGgpIHtcbiAgICBjb25zdCBtZXRlb3JQYXRoID0gam9pbihhcHBQYXRoLCAnLm1ldGVvcicpO1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBmcy5zdGF0U3luYyhtZXRlb3JQYXRoKS5pc0RpcmVjdG9yeSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBKdXN0IGVuc3VyZXMgYSBkZHAgdXJsIGlzIHNldC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBkZHBVcmwgLSB0aGUgdXJsIHRoYXQgTWV0ZW9yIGFwcCBjb25uZWN0cyB0b1xuICogQHJldHVybnMge3N0cmluZ3xudWxsfVxuICovXG5mdW5jdGlvbiBnZXREZHBVcmwoZGRwVXJsID0gbnVsbCkge1xuICAgIGlmICghZGRwVXJsICYmIHByb2dyYW0uYnVpbGRNZXRlb3IpIHtcbiAgICAgICAgaW5mbygnbm8gZGRwX3VybCBzcGVjaWZpZWQsIHNldHRpbmcgZGVmYXVsdDogaHR0cDovLzEyNy4wLjAuMTozMDAwJyk7XG4gICAgICAgIHJldHVybiAnaHR0cDovLzEyNy4wLjAuMTozMDAwJztcbiAgICB9XG4gICAgcmV0dXJuIGRkcFVybDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gY29sbGVjdCh2YWwsIG1lbW8pIHtcbiAgICBtZW1vLnB1c2godmFsKTtcbiAgICByZXR1cm4gbWVtbztcbn1cblxucHJvZ3JhbVxuICAgIC5vcHRpb24oJy1iLCAtLWJ1aWxkLW1ldGVvcicsICdydW5zIG1ldGVvciB0byBvYnRhaW4gdGhlIG1vYmlsZSBidWlsZCwga2lsbHMgaXQgYWZ0ZXInKVxuICAgIC5vcHRpb24oJy10LCAtLWJ1aWxkLXRpbWVvdXQgPHRpbWVvdXRfaW5fc2VjPicsICd0aW1lb3V0IHZhbHVlIHdoZW4gd2FpdGluZyBmb3IgJyArXG4gICAgICAgICdtZXRlb3IgdG8gYnVpbGQsIGRlZmF1bHQgNjAwc2VjJylcbiAgICAub3B0aW9uKCctcCwgLS1wb3J0IDxwb3J0PicsICdwb3J0IG9uIHdoaWNoIG1ldGVvciBpcyBydW5uaW5nLCB3aGVuIHdpdGggLWIgdGhpcyB3aWxsIGJlIHBhc3NlZCB0byBtZXRlb3Igd2hlbiBvYnRhaW5pbmcgdGhlIGJ1aWxkJylcbiAgICAub3B0aW9uKCctLXByb2R1Y3Rpb24nLCAnYnVpbGRzIG1ldGVvciBhcHAgd2l0aCB0aGUgcHJvZHVjdGlvbiBzd2l0Y2gsIHVnbGlmaWVzIGNvbnRlbnRzICcgK1xuICAgICAgICAnb2YgLmRlc2t0b3AsIHBhY2tzIGFwcCB0byBhcHAuYXNhcicpXG4gICAgLm9wdGlvbignLWEsIC0tYW5kcm9pZCcsICdmb3JjZSBhZGRpbmcgYW5kcm9pZCBhcyBhIG1vYmlsZSBwbGF0Zm9ybSBpbnN0ZWFkIG9mIGlvcycpXG4gICAgLm9wdGlvbignLXMsIC0tc2NhZmZvbGQnLCAnd2lsbCBzY2FmZm9sZCAuZGVza3RvcCBpZiBub3QgcHJlc2VudCcpXG4gICAgLm9wdGlvbignLWksIC0taWdub3JlLXN0ZGVyciBbc3RyaW5nXScsICdvbmx5IHdpdGggLWIsIHN0cmluZ3MgdGhhdCB3aGVuIGZvdW5kIHdpbGwgbm90IHRlcm1pbmF0ZSBtZXRlb3IgYnVpbGQnLCBjb2xsZWN0LCBbXSlcbiAgICAub3B0aW9uKCctLW1ldGVvci1zZXR0aW5ncyA8cGF0aD4nLCAnb25seSB3aXRoIC1iLCBhZGRzIC0tc2V0dGluZ3Mgb3B0aW9ucyB0byBtZXRlb3InKVxuICAgIC5vcHRpb24oJy0tcHJvZC1kZWJ1ZycsICdmb3JjZXMgYWRkaW5nIGRldiB0b29scyB0byBhIHByb2R1Y3Rpb24gYnVpbGQnKVxuICAgIC5vcHRpb24oJy0taWEzMicsICdnZW5lcmF0ZSAzMmJpdCBpbnN0YWxsZXIvcGFja2FnZScpXG4gICAgLm9wdGlvbignLS1hbGwtYXJjaHMnLCAnZ2VuZXJhdGUgMzJiaXQgYW5kIDY0Yml0IGluc3RhbGxlcnMnKVxuICAgIC5vcHRpb24oJy0td2luJywgJ2dlbmVyYXRlIFdpbmRvd3MgaW5zdGFsbGVyJylcbiAgICAub3B0aW9uKCctLWxpbnV4JywgJ2dlbmVyYXRlIExpbnV4IGluc3RhbGxlcicpXG4gICAgLm9wdGlvbignLS1tYWMnLCAnZ2VuZXJhdGUgTWFjIGluc3RhbGxlcicpXG4gICAgLm9wdGlvbignLWQsIC0tZGVidWcnLCAncnVuIGVsZWN0cm9uIHdpdGggZGVidWcgc3dpdGNoJyk7XG5cblxucHJvZ3JhbVxuICAgIC51c2FnZSgnW2NvbW1hbmRdIFtvcHRpb25zXScpXG4gICAgLnZlcnNpb24ocmVxdWlyZSgnLi8uLi8uLi9wYWNrYWdlLmpzb24nKS52ZXJzaW9uLCAnLVYsIC0tdmVyc2lvbicpXG4gICAgLm9uKCctLWhlbHAnLCAoKSA9PiB7XG4gICAgICAgIGxvZygnICBbZGRwX3VybF0gLSBwYXNzIGEgZGRwIHVybCBpZiB5b3Ugd2FudCB0byB1c2UgZGlmZmVyZW50IG9uZSB0aGFuIHVzZWQgaW4gbWV0ZW9yXFwncyAtLW1vYmlsZS1zZXJ2ZXInKTtcbiAgICAgICAgbG9nKCcgICAgICAgICAgICAgIHRoaXMgd2lsbCBhbHNvIHdvcmsgd2l0aCAtYicpO1xuICAgICAgICBsb2coJyAgICAnKTtcbiAgICAgICAgbG9nKCcgIEV4YW1wbGVzOicpO1xuICAgICAgICBsb2coJycpO1xuICAgICAgICBsb2coXG4gICAgICAgICAgICAnICAgJyxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAnIyBjZCBpbnRvIG1ldGVvciBkaXIgZmlyc3QnLFxuICAgICAgICAgICAgICAgICdjZCAveW91ci9tZXRlb3IvYXBwJyxcbiAgICAgICAgICAgICAgICAnbWV0ZW9yIC0tbW9iaWxlLXNlcnZlcj0xMjcuMC4wLjE6MzAwMCcsXG4gICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgJyMgb3BlbiBuZXcgdGVybWluYWwsIGFzc3VtaW5nIHlvdSBoYXZlIGRvbmUgbnBtIGluc3RhbGwgLS1zYXZlLWRldiBAbWV0ZW9yLWNvbW11bml0eS9tZXRlb3ItZGVza3RvcCcsXG4gICAgICAgICAgICAgICAgJ25wbSBydW4gZGVza3RvcCAtLSBpbml0JyxcbiAgICAgICAgICAgICAgICAnbnBtIHJ1biBkZXNrdG9wJ1xuICAgICAgICAgICAgXS5qb2luKCdcXG4gICAgJylcbiAgICAgICAgKTtcbiAgICAgICAgbG9nKCdcXG4nKTtcbiAgICB9KTtcblxuXG5mdW5jdGlvbiB2ZXJpZnlBcmdzU3ludGF4KCkge1xuICAgIGlmIChwcm9jZXNzLmVudi5ucG1fY29uZmlnX2FyZ3YpIHtcbiAgICAgICAgbGV0IG5wbUFyZ3Y7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBhcmdzID0gWyctYicsICctLWJ1aWxkLW1ldGVvcicsICctdCcsICctLWJ1aWxkLXRpbWVvdXQnLCAnLXAnLCAnLS1wb3J0JyxcbiAgICAgICAgICAgICAgICAnLS1wcm9kdWN0aW9uJywgJy1hJywgJy0tYW5kcm9pZCcsICctcycsICctLXNjYWZmb2xkJywgJy0taWEzMicsICctLXdpbicsXG4gICAgICAgICAgICAgICAgJy0tbGludXgnLCAnLS1hbGwtYXJjaHMnLCAnLS13aW4nLCAnLS1tYWMnLCAnLS1tZXRlb3Itc2V0dGluZ3MnXTtcbiAgICAgICAgICAgIG5wbUFyZ3YgPSBKU09OLnBhcnNlKHByb2Nlc3MuZW52Lm5wbV9jb25maWdfYXJndik7XG4gICAgICAgICAgICBpZiAobnBtQXJndi5yZW1haW4ubGVuZ3RoID09PSAwICYmIG5wbUFyZ3Yub3JpZ2luYWwubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgICAgIGlmIChucG1Bcmd2Lm9yaWdpbmFsLnNvbWUoYXJnID0+ICEhfmFyZ3MuaW5kZXhPZihhcmcpKSkge1xuICAgICAgICAgICAgICAgICAgICB3YXJuKCdXQVJOSU5HOiBzZWVtcyB0aGF0IHlvdSBtaWdodCB1c2VkIHRoZSB3cm9uZyBjb25zb2xlIHN5bnRheCwgbm8gYCAtLScgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyBgIGRlbGltaXRlciB3YXMgZm91bmQsIGJlIHN1cmUgeW91IGFyZSBpbnZva2luZyBtZXRlb3ItZGVza3RvcCB3aXRoJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnIGl0IHdoZW4gcGFzc2luZyBjb21tYW5kcyBvciBvcHRpb25zIC0+ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2BucG0gcnVuIGRlc2t0b3AgLS0gY29tbWFuZCAtLW9wdGlvbmBcXG4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIE5vdCBzdXJlIGlmIGBucG1fY29uZmlnX2FyZ3ZgIGlzIGFsd2F5cyBwcmVzZW50Li4uXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIG1ldGVvckRlc2t0b3BGYWN0b3J5KGRkcFVybCwgcHJvZHVjdGlvbiA9IGZhbHNlKSB7XG4gICAgaW5mbyhgTUVURU9SLURFU0tUT1AgdiR7cmVxdWlyZSgnLi8uLi8uLi9wYWNrYWdlLmpzb24nKS52ZXJzaW9ufVxcbmApO1xuXG4gICAgdmVyaWZ5QXJnc1N5bnRheCgpO1xuXG4gICAgY29uc3QgaW5wdXQgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gICAgaWYgKCFpc01ldGVvckFwcChpbnB1dCkpIHtcbiAgICAgICAgZXJyb3IoYG5vdCBpbiBhIG1ldGVvciBhcHAgZGlyXFxuICR7aW5wdXR9YCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgpO1xuICAgIH1cblxuICAgIGlmICghcHJvZ3JhbS5vdXRwdXQpIHtcbiAgICAgICAgcHJvZ3JhbS5vdXRwdXQgPSBpbnB1dDtcbiAgICB9XG5cbiAgICBpZiAocHJvZHVjdGlvbiAmJiAhcHJvZ3JhbS5wcm9kdWN0aW9uKSB7XG4gICAgICAgIGluZm8oJ3BhY2thZ2UvYnVpbGQtaW5zdGFsbGVyIGltcGxpZXMgc2V0dGluZyAtLXByb2R1Y3Rpb24sIHNldHRpbmcgaXQgZm9yIHlvdScpO1xuICAgIH1cblxuICAgIGlmICghcHJvZ3JhbS5idWlsZE1ldGVvcikge1xuICAgICAgICBwcm9ncmFtLnBvcnQgPSBwcm9ncmFtLnBvcnQgfHwgMzAwMDtcbiAgICAgICAgaW5mbyhgUkVNSU5ERVI6IHlvdXIgTWV0ZW9yIHByb2plY3Qgc2hvdWxkIGJlIHJ1bm5pbmcgbm93IG9uIHBvcnQgJHtwcm9ncmFtLnBvcnR9XFxuYCk7XG4gICAgfVxuXG4gICAgaWYgKHByb2dyYW0ucHJvZERlYnVnKSB7XG4gICAgICAgIGluZm8oJyEhIFdBUk5JTkc6IFlvdSBhcmUgYWRkaW5nIGRldlRvb2xzIHRvIGEgcHJvZHVjdGlvbiBidWlsZCAhIVxcbicpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIGRkcFVybCxcbiAgICAgICAgc2tpcE1vYmlsZUJ1aWxkOiBwcm9ncmFtLmJ1aWxkTWV0ZW9yID8gIXByb2dyYW0uYnVpbGRNZXRlb3IgOiB0cnVlLFxuICAgICAgICBwcm9kdWN0aW9uOiBwcm9ncmFtLnByb2R1Y3Rpb24gfHwgcHJvZHVjdGlvblxuICAgIH07XG5cbiAgICBhc3NpZ25JbihvcHRpb25zLCBwcm9ncmFtKTtcblxuICAgIHJldHVybiBtZXRlb3JEZXNrdG9wKFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgcHJvZ3JhbS5vdXRwdXQsXG4gICAgICAgIG9wdGlvbnNcbiAgICApO1xufVxuXG5mdW5jdGlvbiBydW4oZGRwVXJsKSB7XG4gICAgbWV0ZW9yRGVza3RvcEZhY3RvcnkoZ2V0RGRwVXJsKGRkcFVybCkpLnJ1bigpO1xufVxuXG5mdW5jdGlvbiBidWlsZChkZHBVcmwpIHtcbiAgICBtZXRlb3JEZXNrdG9wRmFjdG9yeShnZXREZHBVcmwoZGRwVXJsKSkuYnVpbGQoKTtcbn1cblxuZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBtZXRlb3JEZXNrdG9wRmFjdG9yeSgpLmluaXQoKTtcbn1cblxuZnVuY3Rpb24ganVzdFJ1bigpIHtcbiAgICBtZXRlb3JEZXNrdG9wRmFjdG9yeSgpLmp1c3RSdW4oKTtcbn1cblxuZnVuY3Rpb24gcnVuUGFja2FnZXIoZGRwVXJsKSB7XG4gICAgbWV0ZW9yRGVza3RvcEZhY3RvcnkoZ2V0RGRwVXJsKGRkcFVybCksIHRydWUpLnJ1blBhY2thZ2VyKCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSW5zdGFsbGVyKGRkcFVybCkge1xuICAgIG1ldGVvckRlc2t0b3BGYWN0b3J5KGdldERkcFVybChkZHBVcmwpLCB0cnVlKS5idWlsZEluc3RhbGxlcigpO1xufVxuXG5mdW5jdGlvbiBpbml0VGVzdHNTdXBwb3J0KCkge1xuICAgIGxvZygnaW5zdGFsbGluZyBjcm9zcy1lbnYsIGF2YSwgbWV0ZW9yLWRlc2t0b3AtdGVzdC1zdWl0ZSBhbmQgc3BlY3Ryb24nKTtcbiAgICBsb2coJ3J1bm5pbmcgYG1ldGVvciBucG0gaW5zdGFsbCAtLXNhdmUtZGV2IGNyb3NzLWVudiBhdmEgc3BlY3Ryb24gbWV0ZW9yLWRlc2t0b3AtdGVzdC1zdWl0ZWAnKTtcblxuICAgIGNvbnN0IHsgY29kZSB9ID0gc2hlbGwuZXhlYygnbWV0ZW9yIG5wbSBpbnN0YWxsIC0tc2F2ZS1kZXYgY3Jvc3MtZW52IGF2YSBzcGVjdHJvbiBtZXRlb3ItZGVza3RvcC10ZXN0LXN1aXRlJyk7XG5cbiAgICBpZiAoY29kZSAhPT0gMCkge1xuICAgICAgICB3YXJuKCdjb3VsZCBub3QgYWRkIGNyb3NzLWVudiwgYXZhIGFuZCBzcGVjdHJvbiB0byB5b3VyIGBkZXZEZXBlbmRlbmNpZXNgLCBwbGVhc2UgZG8gaXQnICtcbiAgICAgICAgICAgICcgbWFudWFsbHknKTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXN0ID0gJ2Nyb3NzLWVudiBOT0RFX0VOVj10ZXN0IGF2YSAuZGVza3RvcC8qKi8qLnRlc3QuanMgLXMgLS12ZXJib3NlJztcbiAgICBjb25zdCB0ZXN0V2F0Y2ggPSAnY3Jvc3MtZW52IE5PREVfRU5WPXRlc3QgYXZhIC5kZXNrdG9wLyoqLyoudGVzdC5qcyAtcyAtLXZlcmJvc2UnICtcbiAgICAgICAgJyAtLXdhdGNoIC0tc291cmNlIC5kZXNrdG9wJztcblxuICAgIGZ1bmN0aW9uIGZhaWwoKSB7XG4gICAgICAgIGVycm9yKCdcXG5jb3VsZCBub3QgYWRkIGVudHJpZXMgdG8gYHNjcmlwdHNgIGluIHBhY2thZ2UuanNvbicpO1xuICAgICAgICBsb2coJ3BsZWFzZSB0cnkgdG8gYWRkIGl0IG1hbnVhbGx5XFxuJyk7XG4gICAgICAgIGxvZyhgdGVzdC1kZXNrdG9wOiAke3Rlc3R9YCk7XG4gICAgICAgIGxvZyhgdGVzdC1kZXNrdG9wLXdhdGNoOiAke3Rlc3RXYXRjaH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAncGFja2FnZS5qc29uJylcbiAgICApO1xuXG4gICAgYWRkU2NyaXB0KCd0ZXN0LWRlc2t0b3AnLCB0ZXN0LCBwYWNrYWdlSnNvblBhdGgsIGZhaWwpO1xuICAgIGFkZFNjcmlwdCgndGVzdC1kZXNrdG9wLXdhdGNoJywgdGVzdFdhdGNoLCBwYWNrYWdlSnNvblBhdGgsIGZhaWwpO1xuXG4gICAgbG9nKCdcXG5hZGRlZCB0ZXN0LWRlc2t0b3AgYW5kIHRlc3QtZGVza3RvcC13YXRjaCBlbnRyaWVzJyk7XG4gICAgbG9nKCdydW4gdGhlIHRlc3Qgd2l0aCBgbnBtIHJ1biB0ZXN0LWRlc2t0b3BgJyk7XG59XG5cbnByb2dyYW1cbiAgICAuY29tbWFuZCgnaW5pdCcpXG4gICAgLmRlc2NyaXB0aW9uKCdzY2FmZm9sZHMgLmRlc2t0b3AgZGlyIGluIHRoZSBtZXRlb3IgYXBwJylcbiAgICAuYWN0aW9uKGluaXQpO1xuXG5wcm9ncmFtXG4gICAgLmNvbW1hbmQoJ3J1biBbZGRwX3VybF0nKVxuICAgIC5kZXNjcmlwdGlvbignKGRlZmF1bHQpIGJ1aWxkcyBhbmQgcnVucyBkZXNrdG9wIGFwcCcpXG4gICAgLmFjdGlvbihydW4pO1xuXG5wcm9ncmFtXG4gICAgLmNvbW1hbmQoJ2J1aWxkIFtkZHBfdXJsXScpXG4gICAgLmRlc2NyaXB0aW9uKCdidWlsZHMgeW91ciBkZXNrdG9wIGFwcCcpXG4gICAgLmFjdGlvbihidWlsZCk7XG5cbnByb2dyYW1cbiAgICAuY29tbWFuZCgnYnVpbGQtaW5zdGFsbGVyIFtkZHBfdXJsXScpXG4gICAgLmRlc2NyaXB0aW9uKCdjcmVhdGVzIHRoZSBpbnN0YWxsZXInKVxuICAgIC5hY3Rpb24oYnVpbGRJbnN0YWxsZXIpO1xuXG5wcm9ncmFtXG4gICAgLmNvbW1hbmQoJ2p1c3QtcnVuJylcbiAgICAuZGVzY3JpcHRpb24oJ2FsaWFzIGZvciBydW5uaW5nIGBlbGVjdHJvbiAuYCBpbiBgLm1ldGVvci9kZXNrdG9wLWJ1aWxkYCcpXG4gICAgLmFjdGlvbihqdXN0UnVuKTtcblxucHJvZ3JhbVxuICAgIC5jb21tYW5kKCdwYWNrYWdlIFtkZHBfdXJsXScpXG4gICAgLmRlc2NyaXB0aW9uKCdydW5zIGVsZWN0cm9uIHBhY2thZ2VyJylcbiAgICAuYWN0aW9uKHJ1blBhY2thZ2VyKTtcblxucHJvZ3JhbVxuICAgIC5jb21tYW5kKCdpbml0LXRlc3RzLXN1cHBvcnQnKVxuICAgIC5kZXNjcmlwdGlvbigncHJlcGFyZXMgcHJvamVjdCBmb3IgcnVubmluZyBmdW5jdGlvbmFsIHRlc3RzIG9mIGRlc2t0b3AgYXBwJylcbiAgICAuYWN0aW9uKGluaXRUZXN0c1N1cHBvcnQpO1xuXG5pZiAocHJvY2Vzcy5hcmd2Lmxlbmd0aCA9PT0gMiB8fCAhfignLWh8LS1oZWxwfHJ1bnxpbml0fGJ1aWxkfGJ1aWxkLWluc3RhbGxlcnxqdXN0LXJ1bnxpbml0LXRlc3RzLXN1cHBvcnR8cGFja2FnZScuaW5kZXhPZihjbWQpKVxuKSB7XG4gICAgbGV0IHsgYXJndiB9ID0gcHJvY2VzcztcbiAgICBpZiAocHJvY2Vzcy5hcmd2Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICBhcmd2LnB1c2goJ3J1bicpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBjb21tYW5kID0gYXJndi5zcGxpY2UoMCwgMik7XG4gICAgICAgIGNvbW1hbmQgPSBjb21tYW5kLmNvbmNhdCgncnVuJywgYXJndik7XG4gICAgICAgIGFyZ3YgPSBjb21tYW5kO1xuICAgIH1cbiAgICBwcm9ncmFtLnBhcnNlKGFyZ3YpO1xufSBlbHNlIHtcbiAgICBwcm9ncmFtLnBhcnNlKHByb2Nlc3MuYXJndik7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBOzs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7OztBQUVBLE1BQU07RUFBRUE7QUFBRixJQUFXQyxhQUFqQjtBQUNBLE1BQU1DLEdBQUcsR0FBR0MsT0FBTyxDQUFDQyxJQUFSLENBQWEsQ0FBYixDQUFaO0FBRUE7O0FBQ0EsTUFBTTtFQUNGQyxHQURFO0VBQ0dDLEtBREg7RUFDVUMsSUFEVjtFQUNnQkM7QUFEaEIsSUFFRkMsT0FG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 \ No newline at end of file diff --git a/dist/binaryModulesDetector.js b/dist/binaryModulesDetector.js new file mode 100644 index 00000000..a074f7bb --- /dev/null +++ b/dist/binaryModulesDetector.js @@ -0,0 +1,80 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _path = _interopRequireDefault(require("path")); + +var _isbinaryfile = _interopRequireDefault(require("isbinaryfile")); + +var _shelljs = _interopRequireDefault(require("shelljs")); + +var _log = _interopRequireDefault(require("./log")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +_shelljs.default.config.fatal = true; +/** + * Experimental module for detecting modules containing binary files. + * Based on the same functionality from electron-builder. + * + * @property {MeteorDesktop} $ + * @class + */ + +class BinaryModulesDetector { + /** + * @constructor + */ + constructor(nodeModulesPath) { + this.log = new _log.default('binaryModulesDetector'); + this.nodeModulesPath = nodeModulesPath; + } // TODO: make asynchronous + + + detect() { + this.log.verbose('detecting node modules with binary files'); + + const files = _shelljs.default.ls('-RAl', this.nodeModulesPath); + + const extract = []; + files.forEach(file => { + const pathSplit = file.name.split(_path.default.posix.sep); + const dir = pathSplit[0]; + const filename = pathSplit.pop(); + + if (extract.indexOf(dir) === -1 && !BinaryModulesDetector.shouldBeIgnored(dir, filename)) { + if (file.isFile()) { + let shouldUnpack = false; + + if (file.name.endsWith('.dll') || file.name.endsWith('.exe') || file.name.endsWith('.dylib')) { + shouldUnpack = true; + } else if (_path.default.extname(file.name) === '') { + shouldUnpack = _isbinaryfile.default.sync(_path.default.join(this.nodeModulesPath, file.name)); + } + + if (shouldUnpack) { + this.log.debug(`binary file: ${file.name}`); + extract.push(dir); + } + } + } + }); + + if (extract.length > 0) { + this.log.verbose(`detected modules to be extracted: ${extract.join(', ')}`); + } + + return extract; + } + + static shouldBeIgnored(dir, filename) { + return dir === '.bin' || filename === '.DS_Store' || filename === 'LICENSE' || filename === 'README'; + } + +} + +exports.default = BinaryModulesDetector; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzaGVsbCIsImNvbmZpZyIsImZhdGFsIiwiQmluYXJ5TW9kdWxlc0RldGVjdG9yIiwiY29uc3RydWN0b3IiLCJub2RlTW9kdWxlc1BhdGgiLCJsb2ciLCJMb2ciLCJkZXRlY3QiLCJ2ZXJib3NlIiwiZmlsZXMiLCJscyIsImV4dHJhY3QiLCJmb3JFYWNoIiwiZmlsZSIsInBhdGhTcGxpdCIsIm5hbWUiLCJzcGxpdCIsInBhdGgiLCJwb3NpeCIsInNlcCIsImRpciIsImZpbGVuYW1lIiwicG9wIiwiaW5kZXhPZiIsInNob3VsZEJlSWdub3JlZCIsImlzRmlsZSIsInNob3VsZFVucGFjayIsImVuZHNXaXRoIiwiZXh0bmFtZSIsImlzQmluYXJ5RmlsZSIsInN5bmMiLCJqb2luIiwiZGVidWciLCJwdXNoIiwibGVuZ3RoIl0sInNvdXJjZXMiOlsiLi4vbGliL2JpbmFyeU1vZHVsZXNEZXRlY3Rvci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBpc0JpbmFyeUZpbGUgZnJvbSAnaXNiaW5hcnlmaWxlJztcbmltcG9ydCBzaGVsbCBmcm9tICdzaGVsbGpzJztcblxuaW1wb3J0IExvZyBmcm9tICcuL2xvZyc7XG5cbnNoZWxsLmNvbmZpZy5mYXRhbCA9IHRydWU7XG4vKipcbiAqIEV4cGVyaW1lbnRhbCBtb2R1bGUgZm9yIGRldGVjdGluZyBtb2R1bGVzIGNvbnRhaW5pbmcgYmluYXJ5IGZpbGVzLlxuICogQmFzZWQgb24gdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBmcm9tIGVsZWN0cm9uLWJ1aWxkZXIuXG4gKlxuICogQHByb3BlcnR5IHtNZXRlb3JEZXNrdG9wfSAkXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmluYXJ5TW9kdWxlc0RldGVjdG9yIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihub2RlTW9kdWxlc1BhdGgpIHtcbiAgICAgICAgdGhpcy5sb2cgPSBuZXcgTG9nKCdiaW5hcnlNb2R1bGVzRGV0ZWN0b3InKTtcbiAgICAgICAgdGhpcy5ub2RlTW9kdWxlc1BhdGggPSBub2RlTW9kdWxlc1BhdGg7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogbWFrZSBhc3luY2hyb25vdXNcbiAgICBkZXRlY3QoKSB7XG4gICAgICAgIHRoaXMubG9nLnZlcmJvc2UoJ2RldGVjdGluZyBub2RlIG1vZHVsZXMgd2l0aCBiaW5hcnkgZmlsZXMnKTtcbiAgICAgICAgY29uc3QgZmlsZXMgPSBzaGVsbC5scygnLVJBbCcsIHRoaXMubm9kZU1vZHVsZXNQYXRoKTtcblxuICAgICAgICBjb25zdCBleHRyYWN0ID0gW107XG5cbiAgICAgICAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF0aFNwbGl0ID0gZmlsZS5uYW1lLnNwbGl0KHBhdGgucG9zaXguc2VwKTtcbiAgICAgICAgICAgIGNvbnN0IGRpciA9IHBhdGhTcGxpdFswXTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aFNwbGl0LnBvcCgpO1xuXG4gICAgICAgICAgICBpZiAoZXh0cmFjdC5pbmRleE9mKGRpcikgPT09IC0xICYmXG4gICAgICAgICAgICAgICAgIUJpbmFyeU1vZHVsZXNEZXRlY3Rvci5zaG91bGRCZUlnbm9yZWQoZGlyLCBmaWxlbmFtZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGlmIChmaWxlLmlzRmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzaG91bGRVbnBhY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUubmFtZS5lbmRzV2l0aCgnLmRsbCcpIHx8IGZpbGUubmFtZS5lbmRzV2l0aCgnLmV4ZScpIHx8IGZpbGUubmFtZS5lbmRzV2l0aCgnLmR5bGliJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFVucGFjayA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aC5leHRuYW1lKGZpbGUubmFtZSkgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRVbnBhY2sgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQmluYXJ5RmlsZS5zeW5jKHBhdGguam9pbih0aGlzLm5vZGVNb2R1bGVzUGF0aCwgZmlsZS5uYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFVucGFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoYGJpbmFyeSBmaWxlOiAke2ZpbGUubmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3QucHVzaChkaXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGV4dHJhY3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5sb2cudmVyYm9zZShgZGV0ZWN0ZWQgbW9kdWxlcyB0byBiZSBleHRyYWN0ZWQ6ICR7ZXh0cmFjdC5qb2luKCcsICcpfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBleHRyYWN0O1xuICAgIH1cblxuICAgIHN0YXRpYyBzaG91bGRCZUlnbm9yZWQoZGlyLCBmaWxlbmFtZSkge1xuICAgICAgICByZXR1cm4gZGlyID09PSAnLmJpbicgfHwgZmlsZW5hbWUgPT09ICcuRFNfU3RvcmUnIHx8IGZpbGVuYW1lID09PSAnTElDRU5TRScgfHwgZmlsZW5hbWUgPT09ICdSRUFETUUnO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUVBOzs7O0FBRUFBLGdCQUFBLENBQU1DLE1BQU4sQ0FBYUMsS0FBYixHQUFxQixJQUFyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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 \ No newline at end of file diff --git a/dist/defaultDependencies.js b/dist/defaultDependencies.js new file mode 100644 index 00000000..c5232dcc --- /dev/null +++ b/dist/defaultDependencies.js @@ -0,0 +1,8 @@ +"use strict"; + +module.exports = { + electron: '11.5.0', + 'electron-builder': '23.3.1', + 'electron-packager': '15.4.0' +}; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwiZWxlY3Ryb24iXSwic291cmNlcyI6WyIuLi9saWIvZGVmYXVsdERlcGVuZGVuY2llcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBlbGVjdHJvbjogJzExLjUuMCcsXG4gICAgJ2VsZWN0cm9uLWJ1aWxkZXInOiAnMjMuMy4xJyxcbiAgICAnZWxlY3Ryb24tcGFja2FnZXInOiAnMTUuNC4wJ1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQUEsTUFBTSxDQUFDQyxPQUFQLEdBQWlCO0VBQ2JDLFFBQVEsRUFBRSxRQURHO0VBRWIsb0JBQW9CLFFBRlA7RUFHYixxQkFBcUI7QUFIUixDQUFqQiJ9 \ No newline at end of file diff --git a/dist/dependenciesManager.js b/dist/dependenciesManager.js new file mode 100644 index 00000000..d5d4ac90 --- /dev/null +++ b/dist/dependenciesManager.js @@ -0,0 +1,181 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime")); + +var _lodash = require("lodash"); + +var _log = _interopRequireDefault(require("./log")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// eslint-disable-next-line no-unused-vars + +/** + * Utility class designed for merging dependencies list with simple validation and duplicate + * detection. + * + * @class + */ +class DependenciesManager { + /** + * @param {MeteorDesktop} $ - context + * @param {Object} defaultDependencies - core dependencies list + * @constructor + */ + constructor($, defaultDependencies) { + this.log = new _log.default('dependenciesManager'); + this.$ = $; + this.dependencies = defaultDependencies; // Regexes for matching certain types of dependencies version. + // https://docs.npmjs.com/files/package.json#dependencies + + this.regexes = { + local: /^(\.\.\/|~\/|\.\/|\/)/, + git: /^git(\+(ssh|http)s?)?/, + github: /^\w+-?\w+(?!-)\//, + http: /^https?.+tar\.gz/, + file: /^file:/ + }; // Check for commit hashes. + + const gitCheck = { + type: 'regex', + regex: /#[a-f0-9]{7,40}/, + test: 'match', + message: 'git or github link must have a commit hash' + }; // Check for displaying warnings when npm package from local path is used. + + const localCheck = { + onceName: 'localCheck', + type: 'warning', + message: 'using dependencies from local paths is permitted' + ' but dangerous - read more in README.md' + }; + this.checks = { + local: localCheck, + file: localCheck, + git: gitCheck, + github: gitCheck, + version: { + type: 'regex', + // Matches all the semver ranges operators, empty strings and `*`. + regex: /[\^|><= ~-]|\.x|^$|^\*$/, + test: 'do not match', + message: 'semver ranges are forbidden, please specify exact version' + } + }; + } + /** + * Just a public getter. + * @returns {Object} + */ + + + getDependencies() { + return this.dependencies; + } + /** + * Returns local dependencies. + * @returns {Object} + */ + + + getLocalDependencies() { + return Object.keys(this.dependencies).filter(dependency => this.regexes.local.test(this.dependencies[dependency]) || this.regexes.file.test(this.dependencies[dependency])).reduce((localDependencies, currentDependency) => Object.assign(localDependencies, { + [currentDependency]: this.dependencies[currentDependency] + }), {}); + } + /** + * Returns remote dependencies. + * @returns {Object} + */ + + + getRemoteDependencies() { + return Object.keys(this.dependencies).filter(dependency => !this.regexes.local.test(this.dependencies[dependency]) && !this.regexes.file.test(this.dependencies[dependency])).reduce((localDependencies, currentDependency) => Object.assign(localDependencies, { + [currentDependency]: this.dependencies[currentDependency] + }), {}); + } + /** + * Merges dependencies into one list. + * + * @param {string} from - describes where the dependencies were set + * @param {Object} dependencies - dependencies list + */ + + + mergeDependencies(from, dependencies) { + if (this.validateDependenciesVersions(from, dependencies)) { + this.detectDuplicatedDependencies(from, dependencies); + (0, _lodash.assignIn)(this.dependencies, dependencies); + } + } + /** + * Detects dependency version type. + * @param {string} version - version string of the dependency + * @return {string} + */ + + + detectDependencyVersionType(version) { + const type = Object.keys(this.regexes).find(dependencyType => this.regexes[dependencyType].test(version)); + return type || 'version'; + } + /** + * Validates semver and detect ranges. + * + * @param {string} from - describes where the dependencies were set + * @param {Object} dependencies - dependencies list + */ + + + validateDependenciesVersions(from, dependencies) { + const warningsShown = {}; + (0, _lodash.forEach)(dependencies, (version, name) => { + const type = this.detectDependencyVersionType(version); + + if (this.checks[type]) { + const check = this.checks[type]; + + if (check.type === 'regex') { + const checkResult = check.test === 'match' ? this.checks[type].regex.test(version) : !this.checks[type].regex.test(version); + + if (!checkResult) { + throw new Error(`dependency ${name}:${version} from ${from} failed version ` + `check with message: ${this.checks[type].message}`); + } + } + + if (check.type === 'warning' && !warningsShown[check.onceName]) { + warningsShown[check.onceName] = true; + this.log.warn(`dependency ${name}:${version} from ${from} caused a` + ` warning: ${check.message}`); + } + } + }); + return true; + } + /** + * Detects duplicates. + * + * @param {string} from - describes where the dependencies were set + * @param {Object} dependencies - dependencies list + */ + + + detectDuplicatedDependencies(from, dependencies) { + const duplicates = (0, _lodash.intersection)(Object.keys(dependencies), Object.keys(this.dependencies)); + + if (duplicates.length > 0) { + duplicates.forEach(name => { + if (dependencies[name] !== this.dependencies[name]) { + throw new Error(`While processing dependencies from ${from}, a dependency ` + `${name}: ${dependencies[name]} was found to be conflicting with a ` + `dependency (${this.dependencies[name]}) that was already declared in ` + 'other module or it is used in core of the electron app.'); + } + }); + } + } + +} + +exports.default = DependenciesManager; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEZXBlbmRlbmNpZXNNYW5hZ2VyIiwiY29uc3RydWN0b3IiLCIkIiwiZGVmYXVsdERlcGVuZGVuY2llcyIsImxvZyIsIkxvZyIsImRlcGVuZGVuY2llcyIsInJlZ2V4ZXMiLCJsb2NhbCIsImdpdCIsImdpdGh1YiIsImh0dHAiLCJmaWxlIiwiZ2l0Q2hlY2siLCJ0eXBlIiwicmVnZXgiLCJ0ZXN0IiwibWVzc2FnZSIsImxvY2FsQ2hlY2siLCJvbmNlTmFtZSIsImNoZWNrcyIsInZlcnNpb24iLCJnZXREZXBlbmRlbmNpZXMiLCJnZXRMb2NhbERlcGVuZGVuY2llcyIsIk9iamVjdCIsImtleXMiLCJmaWx0ZXIiLCJkZXBlbmRlbmN5IiwicmVkdWNlIiwibG9jYWxEZXBlbmRlbmNpZXMiLCJjdXJyZW50RGVwZW5kZW5jeSIsImFzc2lnbiIsImdldFJlbW90ZURlcGVuZGVuY2llcyIsIm1lcmdlRGVwZW5kZW5jaWVzIiwiZnJvbSIsInZhbGlkYXRlRGVwZW5kZW5jaWVzVmVyc2lvbnMiLCJkZXRlY3REdXBsaWNhdGVkRGVwZW5kZW5jaWVzIiwiYXNzaWduSW4iLCJkZXRlY3REZXBlbmRlbmN5VmVyc2lvblR5cGUiLCJmaW5kIiwiZGVwZW5kZW5jeVR5cGUiLCJ3YXJuaW5nc1Nob3duIiwiZm9yRWFjaCIsIm5hbWUiLCJjaGVjayIsImNoZWNrUmVzdWx0IiwiRXJyb3IiLCJ3YXJuIiwiZHVwbGljYXRlcyIsImludGVyc2VjdGlvbiIsImxlbmd0aCJdLCJzb3VyY2VzIjpbIi4uL2xpYi9kZXBlbmRlbmNpZXNNYW5hZ2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuaW1wb3J0IHJlZ2VuZXJhdG9yUnVudGltZSBmcm9tICdyZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUnO1xuaW1wb3J0IHsgZm9yRWFjaCwgYXNzaWduSW4sIGludGVyc2VjdGlvbiB9IGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCBMb2cgZnJvbSAnLi9sb2cnO1xuXG4vKipcbiAqIFV0aWxpdHkgY2xhc3MgZGVzaWduZWQgZm9yIG1lcmdpbmcgZGVwZW5kZW5jaWVzIGxpc3Qgd2l0aCBzaW1wbGUgdmFsaWRhdGlvbiBhbmQgZHVwbGljYXRlXG4gKiBkZXRlY3Rpb24uXG4gKlxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERlcGVuZGVuY2llc01hbmFnZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TWV0ZW9yRGVza3RvcH0gJCAgICAgICAgICAgICAgICAgICAtIGNvbnRleHRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gICAgICAgIGRlZmF1bHREZXBlbmRlbmNpZXMgLSBjb3JlIGRlcGVuZGVuY2llcyBsaXN0XG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoJCwgZGVmYXVsdERlcGVuZGVuY2llcykge1xuICAgICAgICB0aGlzLmxvZyA9IG5ldyBMb2coJ2RlcGVuZGVuY2llc01hbmFnZXInKTtcbiAgICAgICAgdGhpcy4kID0gJDtcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBkZWZhdWx0RGVwZW5kZW5jaWVzO1xuXG4gICAgICAgIC8vIFJlZ2V4ZXMgZm9yIG1hdGNoaW5nIGNlcnRhaW4gdHlwZXMgb2YgZGVwZW5kZW5jaWVzIHZlcnNpb24uXG4gICAgICAgIC8vIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vZmlsZXMvcGFja2FnZS5qc29uI2RlcGVuZGVuY2llc1xuICAgICAgICB0aGlzLnJlZ2V4ZXMgPSB7XG4gICAgICAgICAgICBsb2NhbDogL14oXFwuXFwuXFwvfH5cXC98XFwuXFwvfFxcLykvLFxuICAgICAgICAgICAgZ2l0OiAvXmdpdChcXCsoc3NofGh0dHApcz8pPy8sXG4gICAgICAgICAgICBnaXRodWI6IC9eXFx3Ky0/XFx3Kyg/IS0pXFwvLyxcbiAgICAgICAgICAgIGh0dHA6IC9eaHR0cHM/Lit0YXJcXC5nei8sXG4gICAgICAgICAgICBmaWxlOiAvXmZpbGU6L1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBjb21taXQgaGFzaGVzLlxuICAgICAgICBjb25zdCBnaXRDaGVjayA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdyZWdleCcsXG4gICAgICAgICAgICByZWdleDogLyNbYS1mMC05XXs3LDQwfS8sXG4gICAgICAgICAgICB0ZXN0OiAnbWF0Y2gnLFxuICAgICAgICAgICAgbWVzc2FnZTogJ2dpdCBvciBnaXRodWIgbGluayBtdXN0IGhhdmUgYSBjb21taXQgaGFzaCdcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBDaGVjayBmb3IgZGlzcGxheWluZyB3YXJuaW5ncyB3aGVuIG5wbSBwYWNrYWdlIGZyb20gbG9jYWwgcGF0aCBpcyB1c2VkLlxuICAgICAgICBjb25zdCBsb2NhbENoZWNrID0ge1xuICAgICAgICAgICAgb25jZU5hbWU6ICdsb2NhbENoZWNrJyxcbiAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICd1c2luZyBkZXBlbmRlbmNpZXMgZnJvbSBsb2NhbCBwYXRocyBpcyBwZXJtaXR0ZWQnICtcbiAgICAgICAgICAgICcgYnV0IGRhbmdlcm91cyAtIHJlYWQgbW9yZSBpbiBSRUFETUUubWQnXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5jaGVja3MgPSB7XG4gICAgICAgICAgICBsb2NhbDogbG9jYWxDaGVjayxcbiAgICAgICAgICAgIGZpbGU6IGxvY2FsQ2hlY2ssXG4gICAgICAgICAgICBnaXQ6IGdpdENoZWNrLFxuICAgICAgICAgICAgZ2l0aHViOiBnaXRDaGVjayxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAncmVnZXgnLFxuICAgICAgICAgICAgICAgIC8vIE1hdGNoZXMgYWxsIHRoZSBzZW12ZXIgcmFuZ2VzIG9wZXJhdG9ycywgZW1wdHkgc3RyaW5ncyBhbmQgYCpgLlxuICAgICAgICAgICAgICAgIHJlZ2V4OiAvW1xcXnw+PD0gfi1dfFxcLnh8XiR8XlxcKiQvLFxuICAgICAgICAgICAgICAgIHRlc3Q6ICdkbyBub3QgbWF0Y2gnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdzZW12ZXIgcmFuZ2VzIGFyZSBmb3JiaWRkZW4sIHBsZWFzZSBzcGVjaWZ5IGV4YWN0IHZlcnNpb24nXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSnVzdCBhIHB1YmxpYyBnZXR0ZXIuXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBnZXREZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlcGVuZGVuY2llcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGxvY2FsIGRlcGVuZGVuY2llcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGdldExvY2FsRGVwZW5kZW5jaWVzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0XG4gICAgICAgICAgICAua2V5cyh0aGlzLmRlcGVuZGVuY2llcylcbiAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgZGVwZW5kZW5jeSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2V4ZXMubG9jYWwudGVzdCh0aGlzLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWdleGVzLmZpbGUudGVzdCh0aGlzLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKGxvY2FsRGVwZW5kZW5jaWVzLCBjdXJyZW50RGVwZW5kZW5jeSkgPT5cbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGVwZW5kZW5jaWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBbY3VycmVudERlcGVuZGVuY3ldOiB0aGlzLmRlcGVuZGVuY2llc1tjdXJyZW50RGVwZW5kZW5jeV0gfVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHt9XG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgcmVtb3RlIGRlcGVuZGVuY2llcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGdldFJlbW90ZURlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdFxuICAgICAgICAgICAgLmtleXModGhpcy5kZXBlbmRlbmNpZXMpXG4gICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kgPT5cbiAgICAgICAgICAgICAgICAgICAgIXRoaXMucmVnZXhlcy5sb2NhbC50ZXN0KHRoaXMuZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSAmJlxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5yZWdleGVzLmZpbGUudGVzdCh0aGlzLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKGxvY2FsRGVwZW5kZW5jaWVzLCBjdXJyZW50RGVwZW5kZW5jeSkgPT5cbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGVwZW5kZW5jaWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBbY3VycmVudERlcGVuZGVuY3ldOiB0aGlzLmRlcGVuZGVuY2llc1tjdXJyZW50RGVwZW5kZW5jeV0gfVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHt9XG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlcyBkZXBlbmRlbmNpZXMgaW50byBvbmUgbGlzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tICAgICAgICAgLSBkZXNjcmliZXMgd2hlcmUgdGhlIGRlcGVuZGVuY2llcyB3ZXJlIHNldFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXBlbmRlbmNpZXMgLSBkZXBlbmRlbmNpZXMgbGlzdFxuICAgICAqL1xuICAgIG1lcmdlRGVwZW5kZW5jaWVzKGZyb20sIGRlcGVuZGVuY2llcykge1xuICAgICAgICBpZiAodGhpcy52YWxpZGF0ZURlcGVuZGVuY2llc1ZlcnNpb25zKGZyb20sIGRlcGVuZGVuY2llcykpIHtcbiAgICAgICAgICAgIHRoaXMuZGV0ZWN0RHVwbGljYXRlZERlcGVuZGVuY2llcyhmcm9tLCBkZXBlbmRlbmNpZXMpO1xuICAgICAgICAgICAgYXNzaWduSW4odGhpcy5kZXBlbmRlbmNpZXMsIGRlcGVuZGVuY2llcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlY3RzIGRlcGVuZGVuY3kgdmVyc2lvbiB0eXBlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gdmVyc2lvbiBzdHJpbmcgb2YgdGhlIGRlcGVuZGVuY3lcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICovXG4gICAgZGV0ZWN0RGVwZW5kZW5jeVZlcnNpb25UeXBlKHZlcnNpb24pIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IE9iamVjdC5rZXlzKHRoaXMucmVnZXhlcylcbiAgICAgICAgICAgIC5maW5kKGRlcGVuZGVuY3lUeXBlID0+IHRoaXMucmVnZXhlc1tkZXBlbmRlbmN5VHlwZV0udGVzdCh2ZXJzaW9uKSk7XG4gICAgICAgIHJldHVybiB0eXBlIHx8ICd2ZXJzaW9uJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZXMgc2VtdmVyIGFuZCBkZXRlY3QgcmFuZ2VzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZyb20gICAgICAgICAtIGRlc2NyaWJlcyB3aGVyZSB0aGUgZGVwZW5kZW5jaWVzIHdlcmUgc2V0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRlcGVuZGVuY2llcyAtIGRlcGVuZGVuY2llcyBsaXN0XG4gICAgICovXG4gICAgdmFsaWRhdGVEZXBlbmRlbmNpZXNWZXJzaW9ucyhmcm9tLCBkZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgY29uc3Qgd2FybmluZ3NTaG93biA9IHt9O1xuICAgICAgICBmb3JFYWNoKGRlcGVuZGVuY2llcywgKHZlcnNpb24sIG5hbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLmRldGVjdERlcGVuZGVuY3lWZXJzaW9uVHlwZSh2ZXJzaW9uKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrc1t0eXBlXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrID0gdGhpcy5jaGVja3NbdHlwZV07XG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrLnR5cGUgPT09ICdyZWdleCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tSZXN1bHQgPSBjaGVjay50ZXN0ID09PSAnbWF0Y2gnID9cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tzW3R5cGVdLnJlZ2V4LnRlc3QodmVyc2lvbikgOlxuICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuY2hlY2tzW3R5cGVdLnJlZ2V4LnRlc3QodmVyc2lvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2tSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZGVwZW5kZW5jeSAke25hbWV9OiR7dmVyc2lvbn0gZnJvbSAke2Zyb219IGZhaWxlZCB2ZXJzaW9uIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBjaGVjayB3aXRoIG1lc3NhZ2U6ICR7dGhpcy5jaGVja3NbdHlwZV0ubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2hlY2sudHlwZSA9PT0gJ3dhcm5pbmcnICYmICF3YXJuaW5nc1Nob3duW2NoZWNrLm9uY2VOYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICB3YXJuaW5nc1Nob3duW2NoZWNrLm9uY2VOYW1lXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLndhcm4oYGRlcGVuZGVuY3kgJHtuYW1lfToke3ZlcnNpb259IGZyb20gJHtmcm9tfSBjYXVzZWQgYWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCB3YXJuaW5nOiAke2NoZWNrLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZWN0cyBkdXBsaWNhdGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZyb20gICAgICAgICAtIGRlc2NyaWJlcyB3aGVyZSB0aGUgZGVwZW5kZW5jaWVzIHdlcmUgc2V0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRlcGVuZGVuY2llcyAtIGRlcGVuZGVuY2llcyBsaXN0XG4gICAgICovXG4gICAgZGV0ZWN0RHVwbGljYXRlZERlcGVuZGVuY2llcyhmcm9tLCBkZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgY29uc3QgZHVwbGljYXRlcyA9IGludGVyc2VjdGlvbihPYmplY3Qua2V5cyhkZXBlbmRlbmNpZXMpLCBPYmplY3Qua2V5cyh0aGlzLmRlcGVuZGVuY2llcykpO1xuICAgICAgICBpZiAoZHVwbGljYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkdXBsaWNhdGVzLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzW25hbWVdICE9PSB0aGlzLmRlcGVuZGVuY2llc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFdoaWxlIHByb2Nlc3NpbmcgZGVwZW5kZW5jaWVzIGZyb20gJHtmcm9tfSwgYSBkZXBlbmRlbmN5IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCR7bmFtZX06ICR7ZGVwZW5kZW5jaWVzW25hbWVdfSB3YXMgZm91bmQgdG8gYmUgY29uZmxpY3Rpbmcgd2l0aCBhIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYGRlcGVuZGVuY3kgKCR7dGhpcy5kZXBlbmRlbmNpZXNbbmFtZV19KSB0aGF0IHdhcyBhbHJlYWR5IGRlY2xhcmVkIGluIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ290aGVyIG1vZHVsZSBvciBpdCBpcyB1c2VkIGluIGNvcmUgb2YgdGhlIGVsZWN0cm9uIGFwcC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUNBOztBQUNBOztBQUVBOzs7O0FBSkE7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2UsTUFBTUEsbUJBQU4sQ0FBMEI7RUFDckM7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUNJQyxXQUFXLENBQUNDLENBQUQsRUFBSUMsbUJBQUosRUFBeUI7SUFDaEMsS0FBS0MsR0FBTCxHQUFXLElBQUlDLFlBQUosQ0FBUSxxQkFBUixDQUFYO0lBQ0EsS0FBS0gsQ0FBTCxHQUFTQSxDQUFUO0lBQ0EsS0FBS0ksWUFBTCxHQUFvQkgsbUJBQXBCLENBSGdDLENBS2hDO0lBQ0E7O0lBQ0EsS0FBS0ksT0FBTCxHQUFlO01BQ1hDLEtBQUssRUFBRSx1QkFESTtNQUVYQyxHQUFHLEVBQUUsdUJBRk07TUFHWEMsTUFBTSxFQUFFLGtCQUhHO01BSVhDLElBQUksRUFBRSxrQkFKSztNQUtYQyxJQUFJLEVBQUU7SUFMSyxDQUFmLENBUGdDLENBZWhDOztJQUNBLE1BQU1DLFFBQVEsR0FBRztNQUNiQyxJQUFJ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 \ No newline at end of file diff --git a/dist/desktop.js b/dist/desktop.js new file mode 100644 index 00000000..3a5f1cd9 --- /dev/null +++ b/dist/desktop.js @@ -0,0 +1,271 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime")); + +var _shelljs = _interopRequireDefault(require("shelljs")); + +var _fs = _interopRequireDefault(require("fs")); + +var _path = _interopRequireDefault(require("path")); + +var _log = _interopRequireDefault(require("./log")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// eslint-disable-next-line no-unused-vars +_shelljs.default.config.fatal = true; +/** + * Checks if the path is empty. + * @param {string} searchPath + * @returns {boolean} + */ + +function isEmptySync(searchPath) { + let stat; + + try { + stat = _fs.default.statSync(searchPath); + } catch (e) { + return true; + } + + if (stat.isDirectory()) { + const items = _fs.default.readdirSync(searchPath); + + return !items || !items.length; + } + + return false; +} +/** + * Represents the .desktop directory. + * @class + * @property {desktopSettings} settings + */ + + +class Desktop { + /** + * @param {MeteorDesktop} $ - context + * + * @constructor + */ + constructor($) { + this.$ = $; + this.log = new _log.default('desktop'); + this.settings = null; + this.dependencies = null; + } + /** + * Tries to read and returns settings.json contents from .desktop dir. + * + * @returns {desktopSettings|null} + */ + + + getSettings() { + if (!this.settings) { + try { + this.settings = JSON.parse(_fs.default.readFileSync(this.$.env.paths.desktop.settings, 'UTF-8')); + } catch (e) { + this.log.error('error while trying to read \'.desktop/settings.json\': ', e); + process.exit(1); + } + } + + return this.settings; + } + /** + * Returns a version hash representing current .desktop contents. + * @returns {string} + */ + + + async getHashVersion() { + this.log.info('calculating hash version from .desktop contents'); + const version = await this.$.utils.readFilesAndComputeHash(this.$.env.paths.desktop.root); + this.log.verbose(`calculated .desktop hash version is ${version.hash}`); + return version.hash; + } + /** + * Tries to read a module.json file from a module at provided path. + * + * @param {string} modulePath - path to the module dir + * @returns {Object} + */ + + + getModuleConfig(modulePath) { + let moduleConfig = {}; + + try { + moduleConfig = JSON.parse(_fs.default.readFileSync(_path.default.join(modulePath, 'module.json'), 'UTF-8')); + } catch (e) { + this.log.error(`error while trying to read 'module.json' from '${modulePath}' module: `, e); + process.exit(1); + } + + if (!('name' in moduleConfig)) { + this.log.error(`no 'name' field defined in 'module.json' in '${modulePath}' module.`); + process.exit(1); + } + + return moduleConfig; + } + /** + * Scans all modules for module.json and gathers this configuration altogether. + * + * @returns {[]} + */ + + + gatherModuleConfigs() { + const configs = []; + + if (!isEmptySync(this.$.env.paths.desktop.modules)) { + _shelljs.default.ls('-d', _path.default.join(this.$.env.paths.desktop.modules, '*')).forEach(module => { + if (_fs.default.lstatSync(module).isDirectory()) { + const moduleConfig = this.getModuleConfig(module); + moduleConfig.dirName = _path.default.parse(module).name; + configs.push(moduleConfig); + } + }); + } + + return configs; + } + /** + * Summarizes all dependencies defined in .desktop. + * + * @params {Object} settings - settings.json + * @params {boolean} checkModules - whether to gather modules dependencies + * @params {boolean} refresh - recompute + * @returns {{fromSettings: {}, plugins: {}, modules: {}}} + */ + + + getDependencies(settings = null, checkModules = true, refresh = false) { + if (!refresh && this.dependencies) { + return this.dependencies; + } + + const dependencies = { + fromSettings: {}, + plugins: {}, + modules: {} + }; + /** @type {desktopSettings} * */ + + const settingsJson = settings || this.getSettings(); // Settings can have a 'dependencies' field. + + if ('dependencies' in settingsJson) { + dependencies.fromSettings = settingsJson.dependencies; + } // Plugins are also a npm packages. + + + if ('plugins' in settingsJson) { + dependencies.plugins = Object.keys(settingsJson.plugins).reduce((plugins, plugin) => { + /* eslint-disable no-param-reassign */ + if (typeof settingsJson.plugins[plugin] === 'object') { + plugins[plugin] = settingsJson.plugins[plugin].version; + } else { + plugins[plugin] = settingsJson.plugins[plugin]; + } + + return plugins; + }, {}); + } // Each module can have its own dependencies defined. + + + const moduleDependencies = {}; + + if (checkModules) { + const configs = this.gatherModuleConfigs(); + configs.forEach(moduleConfig => { + if (!('dependencies' in moduleConfig)) { + moduleConfig.dependencies = {}; + } + + if (moduleConfig.name in moduleDependencies) { + this.log.error(`duplicate name '${moduleConfig.name}' in 'module.json' in ` + `'${moduleConfig.dirName}' - another module already registered the same name.`); + process.exit(1); + } + + moduleDependencies[moduleConfig.name] = moduleConfig.dependencies; + }); + } + + dependencies.modules = moduleDependencies; + this.dependencies = dependencies; + return dependencies; + } + /** + * Copies the .desktop scaffold into the meteor app dir. + * Adds entry to .meteor/.gitignore. + */ + + + scaffold() { + this.log.info('creating .desktop scaffold in your project'); + + if (this.$.utils.exists(this.$.env.paths.desktop.root)) { + this.log.warn('.desktop already exists - delete it if you want a new one to be ' + 'created'); + return; + } + + _shelljs.default.cp('-r', this.$.env.paths.scaffold, this.$.env.paths.desktop.root); + + _shelljs.default.mkdir(this.$.env.paths.desktop.import); + + this.log.info('.desktop directory prepared'); + } + /** + * Verifies if all mandatory files are present in the .desktop. + * + * @returns {boolean} + */ + + + check() { + this.log.verbose('checking .desktop existence'); + return !!(this.$.utils.exists(this.$.env.paths.desktop.root) && this.$.utils.exists(this.$.env.paths.desktop.settings) && this.$.utils.exists(this.$.env.paths.desktop.desktop)); + } + +} +/** + * @typedef {Object} desktopSettings + * @property {string} name + * @property {string} projectName + * @property {boolean} devTools + * @property {boolean} devtron + * @property {boolean} desktopHCP + * @property {Object} squirrel + * @property {string} squirrel.autoUpdateFeedUrl + * @property {Object} squirrel.autoUpdateFeedHeaders + * @property {Object} squirrel.autoUpdateCheckOnStart + * @property {Object} desktopHCPSettings + * @property {boolean} desktopHCPSettings.ignoreCompatibilityVersion + * @property {boolean} desktopHCPSettings.blockAppUpdateOnDesktopIncompatibility + * @property {number} webAppStartupTimeout + * @property {Array} linkPackages + * @property {Array} exposedModules + * @property {Object} window + * @property {Object} windowDev + * @property {Object} packageJsonFields + * @property {Object} builderOptions + * @property {Object} builderCliOptions + * @property {Object} packagerOptions + * @property {Object} plugins + * @property {Object} dependencies + * @property {boolean} uglify + * @property {string} version + * */ + + +exports.default = Desktop; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzaGVsbCIsImNvbmZpZyIsImZhdGFsIiwiaXNFbXB0eVN5bmMiLCJzZWFyY2hQYXRoIiwic3RhdCIsImZzIiwic3RhdFN5bmMiLCJlIiwiaXNEaXJlY3RvcnkiLCJpdGVtcyIsInJlYWRkaXJTeW5jIiwibGVuZ3RoIiwiRGVza3RvcCIsImNvbnN0cnVjdG9yIiwiJCIsImxvZyIsIkxvZyIsInNldHRpbmdzIiwiZGVwZW5kZW5jaWVzIiwiZ2V0U2V0dGluZ3MiLCJKU09OIiwicGFyc2UiLCJyZWFkRmlsZVN5bmMiLCJlbnYiLCJwYXRocyIsImRlc2t0b3AiLCJlcnJvciIsInByb2Nlc3MiLCJleGl0IiwiZ2V0SGFzaFZlcnNpb24iLCJpbmZvIiwidmVyc2lvbiIsInV0aWxzIiwicmVhZEZpbGVzQW5kQ29tcHV0ZUhhc2giLCJyb290IiwidmVyYm9zZSIsImhhc2giLCJnZXRNb2R1bGVDb25maWciLCJtb2R1bGVQYXRoIiwibW9kdWxlQ29uZmlnIiwicGF0aCIsImpvaW4iLCJnYXRoZXJNb2R1bGVDb25maWdzIiwiY29uZmlncyIsIm1vZHVsZXMiLCJscyIsImZvckVhY2giLCJtb2R1bGUiLCJsc3RhdFN5bmMiLCJkaXJOYW1lIiwibmFtZSIsInB1c2giLCJnZXREZXBlbmRlbmNpZXMiLCJjaGVja01vZHVsZXMiLCJyZWZyZXNoIiwiZnJvbVNldHRpbmdzIiwicGx1Z2lucyIsInNldHRpbmdzSnNvbiIsIk9iamVjdCIsImtleXMiLCJyZWR1Y2UiLCJwbHVnaW4iLCJtb2R1bGVEZXBlbmRlbmNpZXMiLCJzY2FmZm9sZCIsImV4aXN0cyIsIndhcm4iLCJjcCIsIm1rZGlyIiwiaW1wb3J0IiwiY2hlY2siXSwic291cmNlcyI6WyIuLi9saWIvZGVza3RvcC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmltcG9ydCByZWdlbmVyYXRvclJ1bnRpbWUgZnJvbSAncmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lJztcbmltcG9ydCBzaGVsbCBmcm9tICdzaGVsbGpzJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IExvZyBmcm9tICcuL2xvZyc7XG5cbnNoZWxsLmNvbmZpZy5mYXRhbCA9IHRydWU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBwYXRoIGlzIGVtcHR5LlxuICogQHBhcmFtIHtzdHJpbmd9IHNlYXJjaFBhdGhcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0VtcHR5U3luYyhzZWFyY2hQYXRoKSB7XG4gICAgbGV0IHN0YXQ7XG4gICAgdHJ5IHtcbiAgICAgICAgc3RhdCA9IGZzLnN0YXRTeW5jKHNlYXJjaFBhdGgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBmcy5yZWFkZGlyU3luYyhzZWFyY2hQYXRoKTtcbiAgICAgICAgcmV0dXJuICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgLmRlc2t0b3AgZGlyZWN0b3J5LlxuICogQGNsYXNzXG4gKiBAcHJvcGVydHkge2Rlc2t0b3BTZXR0aW5nc30gc2V0dGluZ3NcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGVza3RvcCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNZXRlb3JEZXNrdG9wfSAkIC0gY29udGV4dFxuICAgICAqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoJCkge1xuICAgICAgICB0aGlzLiQgPSAkO1xuICAgICAgICB0aGlzLmxvZyA9IG5ldyBMb2coJ2Rlc2t0b3AnKTtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IG51bGw7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmllcyB0byByZWFkIGFuZCByZXR1cm5zIHNldHRpbmdzLmpzb24gY29udGVudHMgZnJvbSAuZGVza3RvcCBkaXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7ZGVza3RvcFNldHRpbmdzfG51bGx9XG4gICAgICovXG4gICAgZ2V0U2V0dGluZ3MoKSB7XG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5ncykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgICAgICAgZnMucmVhZEZpbGVTeW5jKHRoaXMuJC5lbnYucGF0aHMuZGVza3RvcC5zZXR0aW5ncywgJ1VURi04JylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKCdlcnJvciB3aGlsZSB0cnlpbmcgdG8gcmVhZCBcXCcuZGVza3RvcC9zZXR0aW5ncy5qc29uXFwnOiAnLCBlKTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHZlcnNpb24gaGFzaCByZXByZXNlbnRpbmcgY3VycmVudCAuZGVza3RvcCBjb250ZW50cy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIGFzeW5jIGdldEhhc2hWZXJzaW9uKCkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdjYWxjdWxhdGluZyBoYXNoIHZlcnNpb24gZnJvbSAuZGVza3RvcCBjb250ZW50cycpO1xuXG4gICAgICAgIGNvbnN0IHZlcnNpb24gPSBhd2FpdCB0aGlzLiQudXRpbHMucmVhZEZpbGVzQW5kQ29tcHV0ZUhhc2godGhpcy4kLmVudi5wYXRocy5kZXNrdG9wLnJvb3QpO1xuXG4gICAgICAgIHRoaXMubG9nLnZlcmJvc2UoYGNhbGN1bGF0ZWQgLmRlc2t0b3AgaGFzaCB2ZXJzaW9uIGlzICR7dmVyc2lvbi5oYXNofWApO1xuICAgICAgICByZXR1cm4gdmVyc2lvbi5oYXNoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWVzIHRvIHJlYWQgYSBtb2R1bGUuanNvbiBmaWxlIGZyb20gYSBtb2R1bGUgYXQgcHJvdmlkZWQgcGF0aC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVQYXRoIC0gcGF0aCB0byB0aGUgbW9kdWxlIGRpclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgZ2V0TW9kdWxlQ29uZmlnKG1vZHVsZVBhdGgpIHtcbiAgICAgICAgbGV0IG1vZHVsZUNvbmZpZyA9IHt9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbW9kdWxlQ29uZmlnID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKG1vZHVsZVBhdGgsICdtb2R1bGUuanNvbicpLCAnVVRGLTgnKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgICAgICAgYGVycm9yIHdoaWxlIHRyeWluZyB0byByZWFkICdtb2R1bGUuanNvbicgZnJvbSAnJHttb2R1bGVQYXRofScgbW9kdWxlOiBgLFxuICAgICAgICAgICAgICAgIGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoJ25hbWUnIGluIG1vZHVsZUNvbmZpZykpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGBubyAnbmFtZScgZmllbGQgZGVmaW5lZCBpbiAnbW9kdWxlLmpzb24nIGluICcke21vZHVsZVBhdGh9JyBtb2R1bGUuYCk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1vZHVsZUNvbmZpZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTY2FucyBhbGwgbW9kdWxlcyBmb3IgbW9kdWxlLmpzb24gYW5kIGdhdGhlcnMgdGhpcyBjb25maWd1cmF0aW9uIGFsdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7W119XG4gICAgICovXG4gICAgZ2F0aGVyTW9kdWxlQ29uZmlncygpIHtcbiAgICAgICAgY29uc3QgY29uZmlncyA9IFtdO1xuXG4gICAgICAgIGlmICghaXNFbXB0eVN5bmModGhpcy4kLmVudi5wYXRocy5kZXNrdG9wLm1vZHVsZXMpKSB7XG4gICAgICAgICAgICBzaGVsbC5scygnLWQnLCBwYXRoLmpvaW4odGhpcy4kLmVudi5wYXRocy5kZXNrdG9wLm1vZHVsZXMsICcqJykpLmZvckVhY2goXG4gICAgICAgICAgICAgICAgKG1vZHVsZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZnMubHN0YXRTeW5jKG1vZHVsZSkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlQ29uZmlnID0gdGhpcy5nZXRNb2R1bGVDb25maWcobW9kdWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZUNvbmZpZy5kaXJOYW1lID0gcGF0aC5wYXJzZShtb2R1bGUpLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWdzLnB1c2gobW9kdWxlQ29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmZpZ3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3VtbWFyaXplcyBhbGwgZGVwZW5kZW5jaWVzIGRlZmluZWQgaW4gLmRlc2t0b3AuXG4gICAgICpcbiAgICAgKiBAcGFyYW1zIHtPYmplY3R9IHNldHRpbmdzICAgICAgLSBzZXR0aW5ncy5qc29uXG4gICAgICogQHBhcmFtcyB7Ym9vbGVhbn0gY2hlY2tNb2R1bGVzIC0gd2hldGhlciB0byBnYXRoZXIgbW9kdWxlcyBkZXBlbmRlbmNpZXNcbiAgICAgKiBAcGFyYW1zIHtib29sZWFufSByZWZyZXNoICAgICAgLSByZWNvbXB1dGVcbiAgICAgKiBAcmV0dXJucyB7e2Zyb21TZXR0aW5nczoge30sIHBsdWdpbnM6IHt9LCBtb2R1bGVzOiB7fX19XG4gICAgICovXG4gICAgZ2V0RGVwZW5kZW5jaWVzKHNldHRpbmdzID0gbnVsbCwgY2hlY2tNb2R1bGVzID0gdHJ1ZSwgcmVmcmVzaCA9IGZhbHNlKSB7XG4gICAgICAgIGlmICghcmVmcmVzaCAmJiB0aGlzLmRlcGVuZGVuY2llcykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICAgICAgICAgICAgZnJvbVNldHRpbmdzOiB7fSxcbiAgICAgICAgICAgIHBsdWdpbnM6IHt9LFxuICAgICAgICAgICAgbW9kdWxlczoge31cbiAgICAgICAgfTtcbiAgICAgICAgLyoqIEB0eXBlIHtkZXNrdG9wU2V0dGluZ3N9ICogKi9cbiAgICAgICAgY29uc3Qgc2V0dGluZ3NKc29uID0gc2V0dGluZ3MgfHwgdGhpcy5nZXRTZXR0aW5ncygpO1xuXG4gICAgICAgIC8vIFNldHRpbmdzIGNhbiBoYXZlIGEgJ2RlcGVuZGVuY2llcycgZmllbGQuXG4gICAgICAgIGlmICgnZGVwZW5kZW5jaWVzJyBpbiBzZXR0aW5nc0pzb24pIHtcbiAgICAgICAgICAgIGRlcGVuZGVuY2llcy5mcm9tU2V0dGluZ3MgPSBzZXR0aW5nc0pzb24uZGVwZW5kZW5jaWVzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGx1Z2lucyBhcmUgYWxzbyBhIG5wbSBwYWNrYWdlcy5cbiAgICAgICAgaWYgKCdwbHVnaW5zJyBpbiBzZXR0aW5nc0pzb24pIHtcbiAgICAgICAgICAgIGRlcGVuZGVuY2llcy5wbHVnaW5zID0gT2JqZWN0LmtleXMoc2V0dGluZ3NKc29uLnBsdWdpbnMpLnJlZHVjZSgocGx1Z2lucywgcGx1Z2luKSA9PiB7XG4gICAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNldHRpbmdzSnNvbi5wbHVnaW5zW3BsdWdpbl0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIHBsdWdpbnNbcGx1Z2luXSA9IHNldHRpbmdzSnNvbi5wbHVnaW5zW3BsdWdpbl0udmVyc2lvbjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwbHVnaW5zW3BsdWdpbl0gPSBzZXR0aW5nc0pzb24ucGx1Z2luc1twbHVnaW5dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcGx1Z2lucztcbiAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVhY2ggbW9kdWxlIGNhbiBoYXZlIGl0cyBvd24gZGVwZW5kZW5jaWVzIGRlZmluZWQuXG4gICAgICAgIGNvbnN0IG1vZHVsZURlcGVuZGVuY2llcyA9IHt9O1xuICAgICAgICBpZiAoY2hlY2tNb2R1bGVzKSB7XG4gICAgICAgICAgICBjb25zdCBjb25maWdzID0gdGhpcy5nYXRoZXJNb2R1bGVDb25maWdzKCk7XG5cbiAgICAgICAgICAgIGNvbmZpZ3MuZm9yRWFjaChcbiAgICAgICAgICAgICAgICAobW9kdWxlQ29uZmlnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKCdkZXBlbmRlbmNpZXMnIGluIG1vZHVsZUNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZUNvbmZpZy5kZXBlbmRlbmNpZXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobW9kdWxlQ29uZmlnLm5hbWUgaW4gbW9kdWxlRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihgZHVwbGljYXRlIG5hbWUgJyR7bW9kdWxlQ29uZmlnLm5hbWV9JyBpbiAnbW9kdWxlLmpzb24nIGluIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAnJHttb2R1bGVDb25maWcuZGlyTmFtZX0nIC0gYW5vdGhlciBtb2R1bGUgYWxyZWFkeSByZWdpc3RlcmVkIHRoZSBzYW1lIG5hbWUuYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlRGVwZW5kZW5jaWVzW21vZHVsZUNvbmZpZy5uYW1lXSA9IG1vZHVsZUNvbmZpZy5kZXBlbmRlbmNpZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlcGVuZGVuY2llcy5tb2R1bGVzID0gbW9kdWxlRGVwZW5kZW5jaWVzO1xuICAgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcztcbiAgICAgICAgcmV0dXJuIGRlcGVuZGVuY2llcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgdGhlIC5kZXNrdG9wIHNjYWZmb2xkIGludG8gdGhlIG1ldGVvciBhcHAgZGlyLlxuICAgICAqIEFkZHMgZW50cnkgdG8gLm1ldGVvci8uZ2l0aWdub3JlLlxuICAgICAqL1xuICAgIHNjYWZmb2xkKCkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdjcmVhdGluZyAuZGVza3RvcCBzY2FmZm9sZCBpbiB5b3VyIHByb2plY3QnKTtcblxuICAgICAgICBpZiAodGhpcy4kLnV0aWxzLmV4aXN0cyh0aGlzLiQuZW52LnBhdGhzLmRlc2t0b3Aucm9vdCkpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLndhcm4oJy5kZXNrdG9wIGFscmVhZHkgZXhpc3RzIC0gZGVsZXRlIGl0IGlmIHlvdSB3YW50IGEgbmV3IG9uZSB0byBiZSAnICtcbiAgICAgICAgICAgICAgICAnY3JlYXRlZCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc2hlbGwuY3AoJy1yJywgdGhpcy4kLmVudi5wYXRocy5zY2FmZm9sZCwgdGhpcy4kLmVudi5wYXRocy5kZXNrdG9wLnJvb3QpO1xuICAgICAgICBzaGVsbC5ta2Rpcih0aGlzLiQuZW52LnBhdGhzLmRlc2t0b3AuaW1wb3J0KTtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnLmRlc2t0b3AgZGlyZWN0b3J5IHByZXBhcmVkJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmVyaWZpZXMgaWYgYWxsIG1hbmRhdG9yeSBmaWxlcyBhcmUgcHJlc2VudCBpbiB0aGUgLmRlc2t0b3AuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBjaGVjaygpIHtcbiAgICAgICAgdGhpcy5sb2cudmVyYm9zZSgnY2hlY2tpbmcgLmRlc2t0b3AgZXhpc3RlbmNlJyk7XG4gICAgICAgIHJldHVybiAhISh0aGlzLiQudXRpbHMuZXhpc3RzKHRoaXMuJC5lbnYucGF0aHMuZGVza3RvcC5yb290KSAmJlxuICAgICAgICAgICAgdGhpcy4kLnV0aWxzLmV4aXN0cyh0aGlzLiQuZW52LnBhdGhzLmRlc2t0b3Auc2V0dGluZ3MpICYmXG4gICAgICAgICAgICB0aGlzLiQudXRpbHMuZXhpc3RzKHRoaXMuJC5lbnYucGF0aHMuZGVza3RvcC5kZXNrdG9wKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IGRlc2t0b3BTZXR0aW5nc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9qZWN0TmFtZVxuICogQHByb3BlcnR5IHtib29sZWFufSBkZXZUb29sc1xuICogQHByb3BlcnR5IHtib29sZWFufSBkZXZ0cm9uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGRlc2t0b3BIQ1BcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBzcXVpcnJlbFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNxdWlycmVsLmF1dG9VcGRhdGVGZWVkVXJsXG4gKiBAcHJvcGVydHkge09iamVjdH0gc3F1aXJyZWwuYXV0b1VwZGF0ZUZlZWRIZWFkZXJzXG4gKiBAcHJvcGVydHkge09iamVjdH0gc3F1aXJyZWwuYXV0b1VwZGF0ZUNoZWNrT25TdGFydFxuICogQHByb3BlcnR5IHtPYmplY3R9IGRlc2t0b3BIQ1BTZXR0aW5nc1xuICogQHByb3BlcnR5IHtib29sZWFufSBkZXNrdG9wSENQU2V0dGluZ3MuaWdub3JlQ29tcGF0aWJpbGl0eVZlcnNpb25cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZGVza3RvcEhDUFNldHRpbmdzLmJsb2NrQXBwVXBkYXRlT25EZXNrdG9wSW5jb21wYXRpYmlsaXR5XG4gKiBAcHJvcGVydHkge251bWJlcn0gd2ViQXBwU3RhcnR1cFRpbWVvdXRcbiAqIEBwcm9wZXJ0eSB7QXJyYXl9IGxpbmtQYWNrYWdlc1xuICogQHByb3BlcnR5IHtBcnJheX0gZXhwb3NlZE1vZHVsZXNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB3aW5kb3dcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB3aW5kb3dEZXZcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYWNrYWdlSnNvbkZpZWxkc1xuICogQHByb3BlcnR5IHtPYmplY3R9IGJ1aWxkZXJPcHRpb25zXG4gKiBAcHJvcGVydHkge09iamVjdH0gYnVpbGRlckNsaU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYWNrYWdlck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwbHVnaW5zXG4gKiBAcHJvcGVydHkge09iamVjdH0gZGVwZW5kZW5jaWVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVnbGlmeVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb25cbiAqICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7OztBQU5BO0FBUUFBLGdCQUFBLENBQU1DLE1BQU4sQ0FBYUMsS0FBYixHQUFxQixJQUFyQjtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsU0FBU0MsV0FBVCxDQUFxQkMsVUFBckIsRUFBaUM7RUFDN0IsSUFBSUMsSUFBSjs7RUFDQSxJQUFJO0lBQ0FBLElBQUksR0FBR0MsV0FBQSxDQUFHQyxRQUFILENBQVlILFVBQVosQ0FBUDtFQUNILENBRkQsQ0FFRSxPQUFPSSxDQUFQLEVBQVU7SUFDUixPQUFPLElBQVA7RUFDSDs7RUFDRCxJQUFJSCxJQUFJLENBQUNJLFdBQUwsRUFBSixFQUF3QjtJQUNwQixNQUFNQyxLQUFLLEdBQUdKLFdBQUEsQ0FBR0ssV0FBSCxDQUFlUCxVQUFmLENBQWQ7O0lBQ0EsT0FBTyxDQUFDTSxLQUFELElBQVUsQ0FBQ0EsS0FBSyxDQUFDRSxNQUF4QjtFQUNIOztFQUNELE9BQU8sS0FBUDtBQUNIO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ2UsTUFBTUMsT0FBTixDQUFjO0VBQ3pCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFDSUMsV0FBVyxDQUFDQyxDQUFELEVBQUk7SUFDWCxLQUFLQSxDQUFMLEdBQVNBLENBQVQ7SUFDQSxLQUFLQyxHQUFMLEdBQVcsSUFBSUMsWUFBSixDQUFRLFNBQVIsQ0FBWDtJQUNBLEtBQUtDLFFBQUwsR0FBZ0IsSUFBaEI7SUFDQSxLQUFLQyxZQUFMLEdBQW9CLElBQXBCO0VBQ0g7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBOzs7RUFDSUMsV0FBVyxHQUFHO0lBQ1YsSUFBSSxDQUFDLEtBQUtGLFFBQVYsRUFBb0I7TUFDaEIsSUFBSTtRQUNBLEtBQUtBLFFBQUwsR0FBZ0JHLElBQUks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 \ No newline at end of file diff --git a/dist/electron.js b/dist/electron.js new file mode 100644 index 00000000..4b4a584d --- /dev/null +++ b/dist/electron.js @@ -0,0 +1,61 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime")); + +var _crossSpawn = _interopRequireDefault(require("cross-spawn")); + +var _log = _interopRequireDefault(require("./log")); + +var _defaultDependencies = _interopRequireDefault(require("./defaultDependencies")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Simple Electron runner. Runs the project with the bin provided by the 'electron' package. + * @class + */ +class Electron { + constructor($) { + this.log = new _log.default('electron'); + this.$ = $; + } + + async init() { + this.electron = await this.$.getDependency('electron', _defaultDependencies.default.electron); + } + + run() { + // Until: https://github.com/electron-userland/electron-prebuilt/pull/118 + const { + env + } = process; + env.ELECTRON_ENV = 'development'; + const cmd = []; + + if (this.$.env.options.debug) { + cmd.push('--debug=5858'); + } + + cmd.push('.'); + const child = (0, _crossSpawn.default)(this.electron.dependency, cmd, { + cwd: this.$.env.paths.electronApp.root, + env + }); // TODO: check if we can configure piping in spawn options + + child.stdout.on('data', chunk => { + process.stdout.write(chunk); + }); + child.stderr.on('data', chunk => { + process.stderr.write(chunk); + }); + } + +} + +exports.default = Electron; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFbGVjdHJvbiIsImNvbnN0cnVjdG9yIiwiJCIsImxvZyIsIkxvZyIsImluaXQiLCJlbGVjdHJvbiIsImdldERlcGVuZGVuY3kiLCJkZWZhdWx0RGVwZW5kZW5jaWVzIiwicnVuIiwiZW52IiwicHJvY2VzcyIsIkVMRUNUUk9OX0VOViIsImNtZCIsIm9wdGlvbnMiLCJkZWJ1ZyIsInB1c2giLCJjaGlsZCIsInNwYXduIiwiZGVwZW5kZW5jeSIsImN3ZCIsInBhdGhzIiwiZWxlY3Ryb25BcHAiLCJyb290Iiwic3Rkb3V0Iiwib24iLCJjaHVuayIsIndyaXRlIiwic3RkZXJyIl0sInNvdXJjZXMiOlsiLi4vbGliL2VsZWN0cm9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByZWdlbmVyYXRvclJ1bnRpbWUgZnJvbSAncmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lJztcbmltcG9ydCBzcGF3biBmcm9tICdjcm9zcy1zcGF3bic7XG5cbmltcG9ydCBMb2cgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IGRlZmF1bHREZXBlbmRlbmNpZXMgZnJvbSAnLi9kZWZhdWx0RGVwZW5kZW5jaWVzJztcblxuLyoqXG4gKiBTaW1wbGUgRWxlY3Ryb24gcnVubmVyLiBSdW5zIHRoZSBwcm9qZWN0IHdpdGggdGhlIGJpbiBwcm92aWRlZCBieSB0aGUgJ2VsZWN0cm9uJyBwYWNrYWdlLlxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVsZWN0cm9uIHtcbiAgICBjb25zdHJ1Y3RvcigkKSB7XG4gICAgICAgIHRoaXMubG9nID0gbmV3IExvZygnZWxlY3Ryb24nKTtcbiAgICAgICAgdGhpcy4kID0gJDtcbiAgICB9XG5cbiAgICBhc3luYyBpbml0KCkge1xuICAgICAgICB0aGlzLmVsZWN0cm9uID0gYXdhaXQgdGhpcy4kLmdldERlcGVuZGVuY3koJ2VsZWN0cm9uJywgZGVmYXVsdERlcGVuZGVuY2llcy5lbGVjdHJvbik7XG4gICAgfVxuXG4gICAgcnVuKCkge1xuICAgICAgICAvLyBVbnRpbDogaHR0cHM6Ly9naXRodWIuY29tL2VsZWN0cm9uLXVzZXJsYW5kL2VsZWN0cm9uLXByZWJ1aWx0L3B1bGwvMTE4XG4gICAgICAgIGNvbnN0IHsgZW52IH0gPSBwcm9jZXNzO1xuICAgICAgICBlbnYuRUxFQ1RST05fRU5WID0gJ2RldmVsb3BtZW50JztcblxuICAgICAgICBjb25zdCBjbWQgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy4kLmVudi5vcHRpb25zLmRlYnVnKSB7XG4gICAgICAgICAgICBjbWQucHVzaCgnLS1kZWJ1Zz01ODU4Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjbWQucHVzaCgnLicpO1xuXG4gICAgICAgIGNvbnN0IGNoaWxkID0gc3Bhd24odGhpcy5lbGVjdHJvbi5kZXBlbmRlbmN5LCBjbWQsIHtcbiAgICAgICAgICAgIGN3ZDogdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5yb290LFxuICAgICAgICAgICAgZW52XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRPRE86IGNoZWNrIGlmIHdlIGNhbiBjb25maWd1cmUgcGlwaW5nIGluIHNwYXduIG9wdGlvbnNcbiAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShjaHVuayk7XG4gICAgICAgIH0pO1xuICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICAgICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGNodW5rKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBRUE7O0FBQ0E7Ozs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNlLE1BQU1BLFFBQU4sQ0FBZTtFQUMxQkMsV0FBVyxDQUFDQyxDQUFELEVBQUk7SUFDWCxLQUFLQyxHQUFMLEdBQVcsSUFBSUMsWUFBSixDQUFRLFVBQVIsQ0FBWDtJQUNBLEtBQUtGLENBQUwsR0FBU0EsQ0FBVDtFQUNIOztFQUVTLE1BQUpHLElBQUksR0FBRztJQUNULEtBQUtDLFFBQUwsR0FBZ0IsTUFBTSxLQUFLSixDQUFMLENBQU9LLGFBQVAsQ0FBcUIsVUFBckIsRUFBaUNDLDRCQUFBLENBQW9CRixRQUFyRCxDQUF0QjtFQUNIOztFQUVERyxHQUFHLEdBQUc7SUFDRjtJQUNBLE1BQU07TUFBRUM7SUFBRixJQUFVQyxPQUFoQjtJQUNBRCxHQUFHLENBQUNFLFlBQUosR0FBbUIsYUFBbkI7SUFFQSxNQUFNQyxHQUFHLEdBQUcsRUFBWjs7SUFFQSxJQUFJLEtBQUtYLENBQUwsQ0FBT1EsR0FBUCxDQUFXSSxPQUFYLENBQW1CQyxLQUF2QixFQUE4QjtNQUMxQkYsR0FBRyxDQUFDRyxJQUFKLENBQVMsY0FBVDtJQUNIOztJQUVESCxHQUFHLENBQUNHLElBQUosQ0FBUyxHQUFUO0lBRUEsTUFBTUMsS0FBSyxHQUFHLElBQUFDLG1CQUFBLEVBQU0sS0FBS1osUUFBTCxDQUFjYSxVQUFwQixFQUFnQ04sR0FBaEMsRUFBcUM7TUFDL0NPLEdBQUcsRUFBRSxLQUFLbEIsQ0FBTCxDQUFPUSxHQUFQLENBQVdXLEtBQVgsQ0FBaUJDLFdBQWpCLENBQTZCQyxJQURhO01BRS9DYjtJQUYrQyxDQUFyQyxDQUFkLENBYkUsQ0FrQkY7O0lBQ0FPLEtBQUssQ0FBQ08sTUFBTixDQUFhQyxFQUFiLENBQWdCLE1BQWhCLEVBQXlCQyxLQUFELElBQVc7TUFDL0JmLE9BQU8sQ0FBQ2EsTUFBUixDQUFlRyxLQUFmLENBQXFCRCxLQUFyQjtJQUNILENBRkQ7SUFHQVQsS0FBSyxDQUFDVyxNQUFOLENBQWFILEVBQWIsQ0FBZ0IsTUFBaEIsRUFBeUJDLEtBQUQsSUFBVztNQUMvQmYsT0FBTyxDQUFDaUIsTUFBUixDQUFlRCxLQUFmLENBQXFCRCxLQUFyQjtJQUNILENBRkQ7RUFHSDs7QUFuQ3lCIn0= \ No newline at end of file diff --git a/dist/electronApp.js b/dist/electronApp.js new file mode 100644 index 00000000..6e7966c3 --- /dev/null +++ b/dist/electronApp.js @@ -0,0 +1,876 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime")); + +var _asar = _interopRequireDefault(require("@electron/asar")); + +var _assignIn = _interopRequireDefault(require("lodash/assignIn")); + +var _lodash = _interopRequireDefault(require("lodash")); + +var _installLocal = require("install-local"); + +var _core = require("@babel/core"); + +var _crypto = _interopRequireDefault(require("crypto")); + +var _del = _interopRequireDefault(require("del")); + +var _presetEnv = _interopRequireDefault(require("@babel/preset-env")); + +var _fs = _interopRequireDefault(require("fs")); + +var _path = _interopRequireDefault(require("path")); + +var _shelljs = _interopRequireDefault(require("shelljs")); + +var _semver = _interopRequireDefault(require("semver")); + +var _terser = _interopRequireDefault(require("terser")); + +var _log = _interopRequireDefault(require("./log")); + +var _electronAppScaffold = _interopRequireDefault(require("./electronAppScaffold")); + +var _dependenciesManager = _interopRequireDefault(require("./dependenciesManager")); + +var _binaryModulesDetector = _interopRequireDefault(require("./binaryModulesDetector")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// eslint-disable-next-line no-unused-vars +_shelljs.default.config.fatal = true; +/** + * Represents the .desktop dir scaffold. + * @class + */ + +class ElectronApp { + /** + * @param {MeteorDesktop} $ - context + * @constructor + */ + constructor($) { + this.log = new _log.default('electronApp'); + this.scaffold = new _electronAppScaffold.default($); + this.depsManager = new _dependenciesManager.default($, this.scaffold.getDefaultPackageJson().dependencies); + this.$ = $; + this.meteorApp = this.$.meteorApp; + this.packageJson = null; + this.version = null; + this.compatibilityVersion = null; + this.deprectatedPlugins = ['meteor-desktop-localstorage']; + } + /** + * Makes an app.asar from the skeleton app. + * @property {Array} excludeFromDel - list of paths to exclude from deleting + * @returns {Promise} + */ + + + packSkeletonToAsar(excludeFromDel = []) { + this.log.info('packing skeleton app and node_modules to asar archive'); + return new Promise(resolve => { + const extract = this.getModulesToExtract(); // We want to pack skeleton app and node_modules together, so we need to temporarily + // move node_modules to app dir. + + this.log.debug('moving node_modules to app dir'); + + _fs.default.renameSync(this.$.env.paths.electronApp.nodeModules, _path.default.join(this.$.env.paths.electronApp.appRoot, 'node_modules')); + + let extracted = false; + extracted = this.extractModules(extract); + this.log.debug('packing'); + + _asar.default.createPackage(this.$.env.paths.electronApp.appRoot, this.$.env.paths.electronApp.appAsar).then(() => { + // Lets move the node_modules back. + this.log.debug('moving node_modules back from app dir'); + + _shelljs.default.mv(_path.default.join(this.$.env.paths.electronApp.appRoot, 'node_modules'), this.$.env.paths.electronApp.nodeModules); + + if (extracted) { + // We need to create a full node modules back. In other words we want + // the extracted modules back. + extract.forEach(module => _shelljs.default.cp('-rf', _path.default.join(this.$.env.paths.electronApp.extractedNodeModules, module), _path.default.join(this.$.env.paths.electronApp.nodeModules, module))); // Get the .bin back. + + if (this.$.utils.exists(this.$.env.paths.electronApp.extractedNodeModulesBin)) { + _shelljs.default.cp(_path.default.join(this.$.env.paths.electronApp.extractedNodeModulesBin, '*'), _path.default.join(this.$.env.paths.electronApp.nodeModules, '.bin')); + } + } + + this.log.debug('deleting source files'); + const exclude = [this.$.env.paths.electronApp.nodeModules].concat([this.$.env.paths.electronApp.appAsar, this.$.env.paths.electronApp.packageJson], excludeFromDel); + + _del.default.sync([`${this.$.env.paths.electronApp.root}${_path.default.sep}*`].concat(exclude.map(pathToExclude => `!${pathToExclude}`)), { + force: true + }); + + resolve(); + }); + }); + } + /** + * Moves specified node modules to a separate directory. + * @param {Array} extract + * @returns {boolean} + */ + + + extractModules(extract) { + const ext = ['.js', '.bat', '.sh', '.cmd', '']; + + if (extract.length > 0) { + if (this.$.utils.exists(this.$.env.paths.electronApp.extractedNodeModules)) { + _shelljs.default.rm('-rf', this.$.env.paths.electronApp.extractedNodeModules); + } + + _fs.default.mkdirSync(this.$.env.paths.electronApp.extractedNodeModules); + + _fs.default.mkdirSync(this.$.env.paths.electronApp.extractedNodeModulesBin); + + extract.forEach(module => { + _fs.default.renameSync(_path.default.join(this.$.env.paths.electronApp.appRoot, 'node_modules', module), _path.default.join(this.$.env.paths.electronApp.extractedNodeModules, module)); // Move bins. + + + this.extractBin(module, ext); + }); + return true; + } + + return false; + } + /** + * Extracts the bin files associated with a certain node modules. + * + * @param module + * @param ext + */ + + + extractBin(module, ext) { + let packageJson; + + try { + packageJson = JSON.parse(_fs.default.readFileSync(_path.default.join(this.$.env.paths.electronApp.extractedNodeModules, module, 'package.json'), 'utf8')); + } catch (e) { + packageJson = {}; + } + + const bins = 'bin' in packageJson && typeof packageJson.bin === 'object' ? Object.keys(packageJson.bin) : []; + + if (bins.length > 0) { + bins.forEach(bin => { + ext.forEach(extension => { + const binFilePath = _path.default.join(this.$.env.paths.electronApp.appRoot, 'node_modules', '.bin', `${bin}${extension}`); + + if (this.$.utils.exists(binFilePath) || this.$.utils.symlinkExists(binFilePath)) { + _fs.default.renameSync(binFilePath, _path.default.join(this.$.env.paths.electronApp.extractedNodeModulesBin, `${bin}${extension}`)); + } + }); + }); + } + } + /** + * Merges the `extract` field with automatically detected modules. + */ + + + getModulesToExtract() { + const binaryModulesDetector = new _binaryModulesDetector.default(this.$.env.paths.electronApp.nodeModules); + const toBeExtracted = binaryModulesDetector.detect(); + let { + extract + } = this.$.desktop.getSettings(); + + if (!Array.isArray(extract)) { + extract = []; + } + + const merge = {}; + toBeExtracted.concat(extract).forEach(module => { + merge[module] = true; + }); + extract = Object.keys(merge); + + if (extract.length > 0) { + this.log.verbose(`resultant modules to extract list is: ${extract.join(', ')}`); + } + + return extract; + } + /** + * Calculates a md5 from all dependencies. + */ + + + calculateCompatibilityVersion() { + this.log.verbose('calculating compatibility version'); + const settings = this.$.desktop.getSettings(); + + if ('desktopHCPCompatibilityVersion' in settings) { + this.compatibilityVersion = `${settings.desktopHCPCompatibilityVersion}`; + this.log.warn(`compatibility version overridden to ${this.compatibilityVersion}`); + return; + } + + const md5 = _crypto.default.createHash('md5'); + + let dependencies = this.depsManager.getDependencies(); + const dependenciesSorted = Object.keys(dependencies).sort(); + dependencies = dependenciesSorted.map(dependency => `${dependency}:${dependencies[dependency]}`); + const mainCompatibilityVersion = this.$.getVersion().split('.'); + this.log.debug('meteor-desktop compatibility version is ', `${mainCompatibilityVersion[0]}`); + dependencies.push(`meteor-desktop:${mainCompatibilityVersion[0]}`); + const desktopCompatibilityVersion = settings.version.split('.')[0]; + this.log.debug('.desktop compatibility version is ', desktopCompatibilityVersion); + dependencies.push(`desktop-app:${desktopCompatibilityVersion}`); + + if (process.env.METEOR_DESKTOP_DEBUG_DESKTOP_COMPATIBILITY_VERSION || process.env.METEOR_DESKTOP_DEBUG) { + this.log.debug(`compatibility version calculated from ${JSON.stringify(dependencies)}`); + } + + md5.update(JSON.stringify(dependencies)); + this.compatibilityVersion = md5.digest('hex'); + } + + async init() { + try { + await this.$.electron.init(); + await this.$.electronBuilder.init(); + } catch (e) { + this.log.warn('error occurred while initialising electron and electron-builder integration', e); + process.exit(1); + } + } + /** + * Runs all necessary tasks to build the desktopified app. + */ + + + async build(run = false) { + // TODO: refactor to a task runner + this.log.info('scaffolding'); + + if (!this.$.desktop.check()) { + if (!this.$.env.options.scaffold) { + this.log.error('seems that you do not have a .desktop dir in your project or it is' + ' corrupted. Run \'npm run desktop -- init\' to get a new one.'); // Do not fail, so that npm will not print his error stuff to console. + + process.exit(0); + } else { + this.$.desktop.scaffold(); + this.$.meteorApp.updateGitIgnore(); + } + } + + await this.init(); + + try { + this.$.meteorApp.updateGitIgnore(); + } catch (e) { + this.log.warn(`error occurred while adding ${this.$.env.paths.electronApp.rootName}` + 'to .gitignore: ', e); + } + + try { + await this.$.meteorApp.removeDeprecatedPackages(); + } catch (e) { + this.log.error('error while removing deprecated packages: ', e); + process.exit(1); + } + + try { + await this.$.meteorApp.ensureDesktopHCPPackages(); + } catch (e) { + this.log.error('error while checking for required packages: ', e); + process.exit(1); + } + + try { + await this.scaffold.make(); + } catch (e) { + this.log.error('error while scaffolding: ', e); + process.exit(1); + } + + try { + const fileName = '.npmrc'; + const dirName = '.meteor/desktop-build'; + + if (_fs.default.existsSync(dirName) && _fs.default.existsSync(fileName)) { + _fs.default.copyFileSync(fileName, `${dirName}/${fileName}`); + } + } catch (e) { + this.log.warn('error while copying .npmrc', e); + } + + try { + await this.exposeElectronModules(); + } catch (e) { + this.log.error('error while exposing electron modules: ', e); + process.exit(1); + } + + try { + this.updatePackageJsonFields(); + } catch (e) { + this.log.error('error while updating package.json: ', e); + } + + try { + this.updateDependenciesList(); + } catch (e) { + this.log.error('error while merging dependencies list: ', e); + } + + try { + this.calculateCompatibilityVersion(); + } catch (e) { + this.log.error('error while calculating compatibility version: ', e); + process.exit(1); + } + + try { + await this.handleTemporaryNodeModules(); + } catch (e) { + this.log.error('error occurred while handling temporary node_modules: ', e); + process.exit(1); + } + + let nodeModulesRemoved; + + try { + nodeModulesRemoved = await this.handleStateOfNodeModules(); + } catch (e) { + this.log.error('error occurred while clearing node_modules: ', e); + process.exit(1); + } + + try { + await this.rebuildDeps(true); + } catch (e) { + this.log.error('error occurred while installing node_modules: ', e); + process.exit(1); + } + + if (!nodeModulesRemoved) { + try { + await this.rebuildDeps(); + } catch (e) { + this.log.error('error occurred while rebuilding native node modules: ', e); + process.exit(1); + } + } + + try { + await this.linkNpmPackages(); + } catch (e) { + this.log.error(`linking packages failed: ${e}`); + process.exit(1); + } + + try { + await this.installLocalNodeModules(); + } catch (e) { + this.log.error('error occurred while installing local node modules: ', e); + process.exit(1); + } + + try { + await this.ensureMeteorDependencies(); + } catch (e) { + this.log.error('error occurred while ensuring meteor dependencies are installed: ', e); + process.exit(1); + } + + if (this.$.env.isProductionBuild()) { + try { + await this.packSkeletonToAsar(); + } catch (e) { + this.log.error('error while packing skeleton to asar: ', e); + process.exit(1); + } + } // TODO: find a way to avoid copying .desktop to a temp location + + + try { + this.copyDesktopToDesktopTemp(); + } catch (e) { + this.log.error('error while copying .desktop to a temporary location: ', e); + process.exit(1); + } + + try { + await this.updateSettingsJsonFields(); + } catch (e) { + this.log.error('error while updating settings.json: ', e); + process.exit(1); + } + + try { + await this.excludeFilesFromArchive(); + } catch (e) { + this.log.error('error while excluding files from packing to asar: ', e); + process.exit(1); + } + + try { + await this.transpileAndMinify(); + } catch (e) { + this.log.error('error while transpiling or minifying: ', e); + } + + try { + await this.packDesktopToAsar(); + } catch (e) { + this.log.error('error occurred while packing .desktop to asar: ', e); + process.exit(1); + } + + try { + await this.getMeteorClientBuild(); + } catch (e) { + this.log.error('error occurred during getting meteor mobile build: ', e); + } + + if (run) { + this.log.info('running'); + this.$.electron.run(); + } else { + this.log.info('built'); + } + } + /** + * Copies the `exposedModules` setting from `settings.json` into `preload.js` modifying its code + * so that the script will have it hardcoded. + */ + + + exposeElectronModules() { + const { + exposedModules + } = this.$.desktop.getSettings(); + + if (exposedModules && Array.isArray(exposedModules) && exposedModules.length > 0) { + let preload = _fs.default.readFileSync(this.$.env.paths.electronApp.preload, 'utf8'); + + const modules = this.$.desktop.getSettings().exposedModules.reduce( // eslint-disable-next-line no-return-assign,no-param-reassign + (prev, module) => (prev += `'${module}', `, prev), ''); + preload = preload.replace('const exposedModules = [', `const exposedModules = [${modules}`); + + _fs.default.writeFileSync(this.$.env.paths.electronApp.preload, preload); + } + } + /** + * Ensures all required dependencies are added to the Meteor project. + * @returns {Promise.} + */ + + + async ensureMeteorDependencies() { + let packages = []; + const packagesWithVersion = []; + let plugins = 'plugins ['; + Object.keys(this.$.desktop.getDependencies().plugins).forEach(plugin => { + // Read package.json of the plugin. + const packageJson = JSON.parse(_fs.default.readFileSync(_path.default.join(this.$.env.paths.electronApp.nodeModules, plugin, 'package.json'), 'utf8')); + + if ('meteorDependencies' in packageJson && typeof packageJson.meteorDependencies === 'object') { + plugins += `${plugin}, `; + packages.unshift(...Object.keys(packageJson.meteorDependencies)); + packagesWithVersion.unshift(...packages.map(packageName => { + if (packageJson.meteorDependencies[packageName] === '@version') { + return `${packageName}@${packageJson.version}`; + } + + return `${packageName}@${packageJson.meteorDependencies[packageName]}`; + })); + } + }); + const packagesCount = packages.length; + packages = packages.filter(value => !this.deprectatedPlugins.includes(value)); + + if (packagesCount !== packages.length) { + this.log.warn('you have some deprecated meteor desktop plugins in your settings, please remove ' + `them (deprecated plugins: ${this.deprectatedPlugins.join(', ')})`); + } + + if (packages.length > 0) { + plugins = `${plugins.substr(0, plugins.length - 2)}]`; + + try { + await this.$.meteorApp.meteorManager.ensurePackages(packages, packagesWithVersion, plugins); + } catch (e) { + throw new Error(e); + } + } + } + /** + * Builds meteor app. + */ + + + async getMeteorClientBuild() { + await this.$.meteorApp.build(); + } + /** + * Removes node_modules if needed. + * @returns {Promise} + */ + + + async handleStateOfNodeModules() { + if (this.$.env.isProductionBuild() || this.$.env.options.ia32) { + if (!this.$.env.isProductionBuild()) { + this.log.info('clearing node_modules because we need to have it clear for ia32 rebuild'); + } else { + this.log.info('clearing node_modules because this is a production build'); + } + + try { + await this.$.utils.rmWithRetries('-rf', this.$.env.paths.electronApp.nodeModules); + } catch (e) { + throw new Error(e); + } + + return true; + } + + return false; + } + /** + * If there is a temporary node_modules folder and no node_modules folder, we will + * restore it, as it might be a leftover from an interrupted flow. + * @returns {Promise} + */ + + + async handleTemporaryNodeModules() { + if (this.$.utils.exists(this.$.env.paths.electronApp.tmpNodeModules)) { + if (!this.$.utils.exists(this.$.env.paths.electronApp.nodeModules)) { + this.log.debug('moving temp node_modules back'); + + _shelljs.default.mv(this.$.env.paths.electronApp.tmpNodeModules, this.$.env.paths.electronApp.nodeModules); + } else { + // If there is a node_modules folder, we should clear the temporary one. + this.log.debug('clearing temp node_modules because new one is already created'); + + try { + await this.$.utils.rmWithRetries('-rf', this.$.env.paths.electronApp.tmpNodeModules); + } catch (e) { + throw new Error(e); + } + } + } + } + /** + * Runs npm link for every package specified in settings.json->linkPackages. + */ + + + async linkNpmPackages() { + if (this.$.env.isProductionBuild()) { + return; + } + + const settings = this.$.desktop.getSettings(); + const promises = []; + + if ('linkPackages' in this.$.desktop.getSettings()) { + if (Array.isArray(settings.linkPackages)) { + settings.linkPackages.forEach(packageName => promises.push(this.$.meteorApp.runNpm(['link', packageName], undefined, this.$.env.paths.electronApp.root))); + } + } + + await Promise.all(promises); + } + /** + * Runs npm in the electron app to get the dependencies installed. + * @returns {Promise} + */ + + + async ensureDeps() { + this.log.info('installing dependencies'); + + if (this.$.utils.exists(this.$.env.paths.electronApp.nodeModules)) { + this.log.debug('running npm prune to wipe unneeded dependencies'); + + try { + await this.runNpm(['prune']); + } catch (e) { + throw new Error(e); + } + } + + try { + await this.runNpm(['install'], this.$.env.stdio); + } catch (e) { + throw new Error(e); + } + } + /** + * Warns if plugins version are outdated in compare to the newest scaffold. + * @param {Object} pluginsVersions - current plugins versions from settings.json + */ + + + checkPluginsVersion(pluginsVersions) { + const settingsJson = JSON.parse(_fs.default.readFileSync(_path.default.join(this.$.env.paths.scaffold, 'settings.json'))); + const scaffoldPluginsVersion = this.$.desktop.getDependencies(settingsJson, false).plugins; + Object.keys(pluginsVersions).forEach(pluginName => { + if (pluginName in scaffoldPluginsVersion && scaffoldPluginsVersion[pluginName] !== pluginsVersions[pluginName] && _semver.default.lt(pluginsVersions[pluginName], scaffoldPluginsVersion[pluginName])) { + this.log.warn(`you are using outdated version ${pluginsVersions[pluginName]} of ` + `${pluginName}, the suggested version to use is ` + `${scaffoldPluginsVersion[pluginName]}`); + } + }); + } + /** + * Merges core dependency list with the dependencies from .desktop. + */ + + + updateDependenciesList() { + this.log.info('updating list of package.json\'s dependencies'); + const desktopDependencies = this.$.desktop.getDependencies(); + this.checkPluginsVersion(desktopDependencies.plugins); + this.log.debug('merging settings.json[dependencies]'); + this.depsManager.mergeDependencies('settings.json[dependencies]', desktopDependencies.fromSettings); + this.log.debug('merging settings.json[plugins]'); + this.depsManager.mergeDependencies('settings.json[plugins]', desktopDependencies.plugins); + this.log.debug('merging dependencies from modules'); + Object.keys(desktopDependencies.modules).forEach(module => this.depsManager.mergeDependencies(`module[${module}]`, desktopDependencies.modules[module])); + this.packageJson.dependencies = this.depsManager.getRemoteDependencies(); + this.packageJson.localDependencies = this.depsManager.getLocalDependencies(); + this.log.debug('writing updated package.json'); + + _fs.default.writeFileSync(this.$.env.paths.electronApp.packageJson, JSON.stringify(this.packageJson, null, 2)); + } + /** + * Install node modules from local paths using local-install. + * + * @param {string} arch + * @returns {Promise} + */ + + + installLocalNodeModules(arch = this.$.env.options.ia32 || process.arch === 'ia32' ? 'ia32' : 'x64') { + const localDependencies = _lodash.default.values(this.packageJson.localDependencies); + + if (localDependencies.length === 0) { + return Promise.resolve(); + } + + this.log.info('installing local node modules'); + const lastRebuild = this.$.electronBuilder.prepareLastRebuildObject(arch); + const env = this.$.electronBuilder.getGypEnv(lastRebuild.frameworkInfo, lastRebuild.platform, lastRebuild.arch); + const installer = new _installLocal.LocalInstaller({ + [this.$.env.paths.electronApp.root]: localDependencies + }, { + npmEnv: env + }); + (0, _installLocal.progress)(installer); + return installer.install(); + } + /** + * Rebuild binary dependencies against Electron's node headers. + * @returns {Promise} + */ + + + rebuildDeps(install = false) { + if (install) { + this.log.info('issuing node_modules install from electron-builder'); + } else { + this.log.info('issuing native modules rebuild from electron-builder'); + } + + const arch = this.$.env.options.ia32 || process.arch === 'ia32' ? 'ia32' : 'x64'; + + if (this.$.env.options.ia32) { + this.log.verbose('forcing rebuild for 32bit'); + } else { + this.log.verbose(`rebuilding for ${arch}`); + } + + return this.$.electronBuilder.installOrRebuild(arch, undefined, install); + } + /** + * Update package.json fields accordingly to what is set in settings.json. + * + * packageJson.name = settings.projectName + * packageJson.version = settings.version + * packageJson.* = settings.packageJsonFields + */ + + + updatePackageJsonFields() { + this.log.verbose('updating package.json fields'); + const settings = this.$.desktop.getSettings(); + /** @type {desktopSettings} */ + + const packageJson = this.scaffold.getDefaultPackageJson(); + packageJson.version = settings.version; + + if ('packageJsonFields' in settings) { + (0, _assignIn.default)(packageJson, settings.packageJsonFields); + } + + (0, _assignIn.default)(packageJson, { + name: settings.projectName + }); + this.log.debug('writing updated package.json'); + + _fs.default.writeFileSync(this.$.env.paths.electronApp.packageJson, JSON.stringify(packageJson, null, 4)); + + this.packageJson = packageJson; + } + /** + * Updates settings.json with env (prod/dev) information and versions. + */ + + + async updateSettingsJsonFields() { + this.log.debug('updating settings.json fields'); + const settings = this.$.desktop.getSettings(); // Save versions. + + settings.compatibilityVersion = this.compatibilityVersion; // Pass information about build type to the settings.json. + + settings.env = this.$.env.isProductionBuild() ? 'prod' : 'dev'; + const version = await this.$.desktop.getHashVersion(); + settings.desktopVersion = `${version}_${settings.env}`; + settings.meteorDesktopVersion = this.$.getVersion(); + + if (this.$.env.options.prodDebug) { + settings.prodDebug = true; + } + + _fs.default.writeFileSync(this.$.env.paths.desktopTmp.settings, JSON.stringify(settings, null, 4)); + } + /** + * Copies files from prepared .desktop to desktop.asar in electron app. + */ + + + packDesktopToAsar() { + this.log.info('packing .desktop to asar'); + return new Promise((resolve, reject) => { + _asar.default.createPackage(this.$.env.paths.desktopTmp.root, this.$.env.paths.electronApp.desktopAsar).then(() => { + this.log.verbose('clearing temporary .desktop'); + this.$.utils.rmWithRetries('-rf', this.$.env.paths.desktopTmp.root).then(() => { + resolve(); + }).catch(e => { + reject(e); + }); + resolve(); + }); + }); + } + /** + * Makes a temporary copy of .desktop. + */ + + + copyDesktopToDesktopTemp() { + this.log.verbose('copying .desktop to temporary location'); + + _shelljs.default.cp('-rf', this.$.env.paths.desktop.root, this.$.env.paths.desktopTmp.root); // Remove test files. + + + _del.default.sync([_path.default.join(this.$.env.paths.desktopTmp.root, '**', '*.test.js')], { + force: true + }); + } + /** + * Runs babel and uglify over .desktop if requested. + */ + + + async transpileAndMinify() { + this.log.info('transpiling and uglifying'); + const settings = this.$.desktop.getSettings(); + const options = 'uglifyOptions' in settings ? settings.uglifyOptions : {}; + const uglifyingEnabled = 'uglify' in settings && !!settings.uglify; + const preset = (0, _presetEnv.default)({ + assertVersion: () => {} + }, { + targets: { + node: '12' + } + }); + const { + data: files + } = await this.$.utils.readDir(this.$.env.paths.desktopTmp.root); + files.forEach(file => { + if (file.endsWith('.js')) { + let { + code + } = (0, _core.transformFileSync)(file, { + presets: [preset] + }); + let error; + + if (settings.env === 'prod' && uglifyingEnabled) { + ({ + code, + error + } = _terser.default.minify(code, options)); + } + + if (error) { + throw new Error(error); + } + + _fs.default.writeFileSync(file, code); + } + }); + } + /** + * Moves all the files that should not be packed into asar into a safe location which is the + * 'extracted' dir in the electron app. + */ + + + async excludeFilesFromArchive() { + this.log.info('excluding files from packing'); // Ensure empty `extracted` dir + + try { + await this.$.utils.rmWithRetries('-rf', this.$.env.paths.electronApp.extracted); + } catch (e) { + throw new Error(e); + } + + _shelljs.default.mkdir(this.$.env.paths.electronApp.extracted); + + const configs = this.$.desktop.gatherModuleConfigs(); // Move files that should not be asar'ed. + + configs.forEach(config => { + const moduleConfig = config; + + if ('extract' in moduleConfig) { + if (!Array.isArray(moduleConfig.extract)) { + moduleConfig.extract = [moduleConfig.extract]; + } + + moduleConfig.extract.forEach(file => { + this.log.debug(`excluding ${file} from ${config.name}`); + + const filePath = _path.default.join(this.$.env.paths.desktopTmp.modules, moduleConfig.dirName, file); + + const destinationPath = _path.default.join(this.$.env.paths.electronApp.extracted, moduleConfig.dirName); + + if (!this.$.utils.exists(destinationPath)) { + _shelljs.default.mkdir(destinationPath); + } + + _shelljs.default.mv(filePath, destinationPath); + }); + } + }); + } + +} + +exports.default = ElectronApp; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzaGVsbCIsImNvbmZpZyIsImZhdGFsIiwiRWxlY3Ryb25BcHAiLCJjb25zdHJ1Y3RvciIsIiQiLCJsb2ciLCJMb2ciLCJzY2FmZm9sZCIsIkVsZWN0cm9uQXBwU2NhZmZvbGQiLCJkZXBzTWFuYWdlciIsIkRlcGVuZGVuY2llc01hbmFnZXIiLCJnZXREZWZhdWx0UGFja2FnZUpzb24iLCJkZXBlbmRlbmNpZXMiLCJtZXRlb3JBcHAiLCJwYWNrYWdlSnNvbiIsInZlcnNpb24iLCJjb21wYXRpYmlsaXR5VmVyc2lvbiIsImRlcHJlY3RhdGVkUGx1Z2lucyIsInBhY2tTa2VsZXRvblRvQXNhciIsImV4Y2x1ZGVGcm9tRGVsIiwiaW5mbyIsIlByb21pc2UiLCJyZXNvbHZlIiwiZXh0cmFjdCIsImdldE1vZHVsZXNUb0V4dHJhY3QiLCJkZWJ1ZyIsImZzIiwicmVuYW1lU3luYyIsImVudiIsInBhdGhzIiwiZWxlY3Ryb25BcHAiLCJub2RlTW9kdWxlcyIsInBhdGgiLCJqb2luIiwiYXBwUm9vdCIsImV4dHJhY3RlZCIsImV4dHJhY3RNb2R1bGVzIiwiYXNhciIsImNyZWF0ZVBhY2thZ2UiLCJhcHBBc2FyIiwidGhlbiIsIm12IiwiZm9yRWFjaCIsIm1vZHVsZSIsImNwIiwiZXh0cmFjdGVkTm9kZU1vZHVsZXMiLCJ1dGlscyIsImV4aXN0cyIsImV4dHJhY3RlZE5vZGVNb2R1bGVzQmluIiwiZXhjbHVkZSIsImNvbmNhdCIsImRlbCIsInN5bmMiLCJyb290Iiwic2VwIiwibWFwIiwicGF0aFRvRXhjbHVkZSIsImZvcmNlIiwiZXh0IiwibGVuZ3RoIiwicm0iLCJta2RpclN5bmMiLCJleHRyYWN0QmluIiwiSlNPTiIsInBhcnNlIiwicmVhZEZpbGVTeW5jIiwiZSIsImJpbnMiLCJiaW4iLCJPYmplY3QiLCJrZXlzIiwiZXh0ZW5zaW9uIiwiYmluRmlsZVBhdGgiLCJzeW1saW5rRXhpc3RzIiwiYmluYXJ5TW9kdWxlc0RldGVjdG9yIiwiQmluYXJ5TW9kdWxlRGV0ZWN0b3IiLCJ0b0JlRXh0cmFjdGVkIiwiZGV0ZWN0IiwiZGVza3RvcCIsImdldFNldHRpbmdzIiwiQXJyYXkiLCJpc0FycmF5IiwibWVyZ2UiLCJ2ZXJib3NlIiwiY2FsY3VsYXRlQ29tcGF0aWJpbGl0eVZlcnNpb24iLCJzZXR0aW5ncyIsImRlc2t0b3BIQ1BDb21wYXRpYmlsaXR5VmVyc2lvbiIsIndhcm4iLCJtZDUiLCJjcnlwdG8iLCJjcmVhdGVIYXNoIiwiZ2V0RGVwZW5kZW5jaWVzIiwiZGVwZW5kZW5jaWVzU29ydGVkIiwic29ydCIsImRlcGVuZGVuY3kiLCJtYWluQ29tcGF0aWJpbGl0eVZlcnNpb24iLCJnZXRWZXJzaW9uIiwic3BsaXQiLCJwdXNoIiwiZGVza3RvcENvbXBhdGliaWxpdHlWZXJzaW9uIiwicHJvY2VzcyIsIk1FVEVPUl9ERVNLVE9QX0RFQlVHX0RFU0tUT1BfQ09NUEFUSUJJTElUWV9WRVJTSU9OIiwiTUVURU9SX0RFU0tUT1BfREVCVUciLCJzdHJpbmdpZnkiLCJ1cGRhdGUiLCJkaWdlc3QiLCJpbml0IiwiZWxlY3Ryb24iLCJlbGVjdHJvbkJ1aWxkZXIiLCJleGl0IiwiYnVpbGQiLCJydW4iLCJjaGVjayIsIm9wdGlvbnMiLCJlcnJvciIsInVwZGF0ZUdpdElnbm9yZSIsInJvb3ROYW1lIiwicmVtb3ZlRGVwcmVjYXRlZFBhY2thZ2VzIiwiZW5zdXJlRGVza3RvcEhDUFBhY2thZ2VzIiwibWFrZSIsImZpbGVOYW1lIiwiZGlyTmFtZSIsImV4aXN0c1N5bmMiLCJjb3B5RmlsZVN5bmMiLCJleHBvc2VFbGVjdHJvbk1vZHVsZXMiLCJ1cGRhdGVQYWNrYWdlSnNvbkZpZWxkcyIsInVwZGF0ZURlcGVuZGVuY2llc0xpc3QiLCJoYW5kbGVUZW1wb3JhcnlOb2RlTW9kdWxlcyIsIm5vZGVNb2R1bGVzUmVtb3ZlZCIsImhhbmRsZVN0YXRlT2ZOb2RlTW9kdWxlcyIsInJlYnVpbGREZXBzIiwibGlua05wbVBhY2thZ2VzIiwiaW5zdGFsbExvY2FsTm9kZU1vZHVsZXMiLCJlbnN1cmVNZXRlb3JEZXBlbmRlbmNpZXMiLCJpc1Byb2R1Y3Rpb25CdWlsZCIsImNvcHlEZXNrdG9wVG9EZXNrdG9wVGVtcCIsInVwZGF0ZVNldHRpbmdzSnNvbkZpZWxkcyIsImV4Y2x1ZGVGaWxlc0Zyb21BcmNoaXZlIiwidHJhbnNwaWxlQW5kTWluaWZ5IiwicGFja0Rlc2t0b3BUb0FzYXIiLCJnZXRNZXRlb3JDbGllbnRCdWlsZCIsImV4cG9zZWRNb2R1bGVzIiwicHJlbG9hZCIsIm1vZHVsZXMiLCJyZWR1Y2UiLCJwcmV2IiwicmVwbGFjZSIsIndyaXRlRmlsZVN5bmMiLCJwYWNrYWdlcyIsInBhY2thZ2VzV2l0aFZlcnNpb24iLCJwbHVnaW5zIiwicGx1Z2luIiwibWV0ZW9yRGVwZW5kZW5jaWVzIiwidW5zaGlmdCIsInBhY2thZ2VOYW1lIiwicGFja2FnZXNDb3VudCIsImZpbHRlciIsInZhbHVlIiwiaW5jbHVkZXMiLCJzdWJzdHIiLCJtZXRlb3JNYW5hZ2VyIiwiZW5zdXJlUGFja2FnZXMiLCJFcnJvciIsImlhMzIiLCJybVdpdGhSZXRyaWVzIiwidG1wTm9kZU1vZHVsZXMiLCJwcm9taXNlcyIsImxpbmtQYWNrYWdlcyIsInJ1bk5wbSIsInVuZGVmaW5lZCIsImFsbCIsImVuc3VyZURlcHMiLCJzdGRpbyIsImNoZWNrUGx1Z2luc1ZlcnNpb24iLCJwbHVnaW5zVmVyc2lvbnMiLCJzZXR0aW5nc0pzb24iLCJzY2FmZm9sZFBsdWdpbnNWZXJzaW9uIiwicGx1Z2luTmFtZSIsInNlbXZlciIsImx0IiwiZGVza3RvcERlcGVuZGVuY2llcyIsIm1lcmdlRGVwZW5kZW5jaWVzIiwiZnJvbVNldHRpbmdzIiwiZ2V0UmVtb3RlRGVwZW5kZW5jaWVzIiwibG9jYWxEZXBlbmRlbmNpZXMiLCJnZXRMb2NhbERlcGVuZGVuY2llcyIsImFyY2giLCJfIiwidmFsdWVzIiwibGFzdFJlYnVpbGQiLCJwcmVwYXJlTGFzdFJlYnVpbGRPYmplY3QiLCJnZXRHeXBFbnYiLCJmcmFtZXdvcmtJbmZvIiwicGxhdGZvcm0iLCJpbnN0YWxsZXIiLCJMb2NhbEluc3RhbGxlciIsIm5wbUVudiIsInByb2dyZXNzIiwiaW5zdGFsbCIsImluc3RhbGxPclJlYnVpbGQiLCJhc3NpZ25JbiIsInBhY2thZ2VKc29uRmllbGRzIiwibmFtZSIsInByb2plY3ROYW1lIiwiZ2V0SGFzaFZlcnNpb24iLCJkZXNrdG9wVmVyc2lvbiIsIm1ldGVvckRlc2t0b3BWZXJzaW9uIiwicHJvZERlYnVnIiwiZGVza3RvcFRtcCIsInJlamVjdCIsImRlc2t0b3BBc2FyIiwiY2F0Y2giLCJ1Z2xpZnlPcHRpb25zIiwidWdsaWZ5aW5nRW5hYmxlZCIsInVnbGlmeSIsInByZXNldCIsInByZXNldEVudiIsImFzc2VydFZlcnNpb24iLCJ0YXJnZXRzIiwibm9kZSIsImRhdGEiLCJmaWxlcyIsInJlYWREaXIiLCJmaWxlIiwiZW5kc1dpdGgiLCJjb2RlIiwidHJhbnNmb3JtRmlsZVN5bmMiLCJwcmVzZXRzIiwibWluaWZ5IiwibWtkaXIiLCJjb25maWdzIiwiZ2F0aGVyTW9kdWxlQ29uZmlncyIsIm1vZHVsZUNvbmZpZyIsImZpbGVQYXRoIiwiZGVzdGluYXRpb25QYXRoIl0sInNvdXJjZXMiOlsiLi4vbGliL2VsZWN0cm9uQXBwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuaW1wb3J0IHJlZ2VuZXJhdG9yUnVudGltZSBmcm9tICdyZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUnO1xuaW1wb3J0IGFzYXIgZnJvbSAnQGVsZWN0cm9uL2FzYXInO1xuaW1wb3J0IGFzc2lnbkluIGZyb20gJ2xvZGFzaC9hc3NpZ25Jbic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgTG9jYWxJbnN0YWxsZXIsIHByb2dyZXNzIH0gZnJvbSAnaW5zdGFsbC1sb2NhbCc7XG5pbXBvcnQgeyB0cmFuc2Zvcm1GaWxlU3luYyB9IGZyb20gJ0BiYWJlbC9jb3JlJztcbmltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCBkZWwgZnJvbSAnZGVsJztcbmltcG9ydCBwcmVzZXRFbnYgZnJvbSAnQGJhYmVsL3ByZXNldC1lbnYnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHNoZWxsIGZyb20gJ3NoZWxsanMnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHVnbGlmeSBmcm9tICd0ZXJzZXInO1xuXG5pbXBvcnQgTG9nIGZyb20gJy4vbG9nJztcbmltcG9ydCBFbGVjdHJvbkFwcFNjYWZmb2xkIGZyb20gJy4vZWxlY3Ryb25BcHBTY2FmZm9sZCc7XG5pbXBvcnQgRGVwZW5kZW5jaWVzTWFuYWdlciBmcm9tICcuL2RlcGVuZGVuY2llc01hbmFnZXInO1xuaW1wb3J0IEJpbmFyeU1vZHVsZURldGVjdG9yIGZyb20gJy4vYmluYXJ5TW9kdWxlc0RldGVjdG9yJztcblxuc2hlbGwuY29uZmlnLmZhdGFsID0gdHJ1ZTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSAuZGVza3RvcCBkaXIgc2NhZmZvbGQuXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWxlY3Ryb25BcHAge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TWV0ZW9yRGVza3RvcH0gJCAtIGNvbnRleHRcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigkKSB7XG4gICAgICAgIHRoaXMubG9nID0gbmV3IExvZygnZWxlY3Ryb25BcHAnKTtcbiAgICAgICAgdGhpcy5zY2FmZm9sZCA9IG5ldyBFbGVjdHJvbkFwcFNjYWZmb2xkKCQpO1xuICAgICAgICB0aGlzLmRlcHNNYW5hZ2VyID0gbmV3IERlcGVuZGVuY2llc01hbmFnZXIoXG4gICAgICAgICAgICAkLFxuICAgICAgICAgICAgdGhpcy5zY2FmZm9sZC5nZXREZWZhdWx0UGFja2FnZUpzb24oKS5kZXBlbmRlbmNpZXNcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy4kID0gJDtcbiAgICAgICAgdGhpcy5tZXRlb3JBcHAgPSB0aGlzLiQubWV0ZW9yQXBwO1xuICAgICAgICB0aGlzLnBhY2thZ2VKc29uID0gbnVsbDtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb21wYXRpYmlsaXR5VmVyc2lvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuZGVwcmVjdGF0ZWRQbHVnaW5zID0gWydtZXRlb3ItZGVza3RvcC1sb2NhbHN0b3JhZ2UnXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYWtlcyBhbiBhcHAuYXNhciBmcm9tIHRoZSBza2VsZXRvbiBhcHAuXG4gICAgICogQHByb3BlcnR5IHtBcnJheX0gZXhjbHVkZUZyb21EZWwgLSBsaXN0IG9mIHBhdGhzIHRvIGV4Y2x1ZGUgZnJvbSBkZWxldGluZ1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIHBhY2tTa2VsZXRvblRvQXNhcihleGNsdWRlRnJvbURlbCA9IFtdKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ3BhY2tpbmcgc2tlbGV0b24gYXBwIGFuZCBub2RlX21vZHVsZXMgdG8gYXNhciBhcmNoaXZlJyk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXh0cmFjdCA9IHRoaXMuZ2V0TW9kdWxlc1RvRXh0cmFjdCgpO1xuXG4gICAgICAgICAgICAvLyBXZSB3YW50IHRvIHBhY2sgc2tlbGV0b24gYXBwIGFuZCBub2RlX21vZHVsZXMgdG9nZXRoZXIsIHNvIHdlIG5lZWQgdG8gdGVtcG9yYXJpbHlcbiAgICAgICAgICAgIC8vIG1vdmUgbm9kZV9tb2R1bGVzIHRvIGFwcCBkaXIuXG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZygnbW92aW5nIG5vZGVfbW9kdWxlcyB0byBhcHAgZGlyJyk7XG5cbiAgICAgICAgICAgIGZzLnJlbmFtZVN5bmMoXG4gICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5ub2RlTW9kdWxlcyxcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5hcHBSb290LCAnbm9kZV9tb2R1bGVzJylcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGxldCBleHRyYWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGV4dHJhY3RlZCA9IHRoaXMuZXh0cmFjdE1vZHVsZXMoZXh0cmFjdCk7XG5cbiAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKCdwYWNraW5nJyk7XG4gICAgICAgICAgICBhc2FyLmNyZWF0ZVBhY2thZ2UoXG4gICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5hcHBSb290LFxuICAgICAgICAgICAgICAgIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuYXBwQXNhclxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTGV0cyBtb3ZlIHRoZSBub2RlX21vZHVsZXMgYmFjay5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoJ21vdmluZyBub2RlX21vZHVsZXMgYmFjayBmcm9tIGFwcCBkaXInKTtcblxuICAgICAgICAgICAgICAgICAgICBzaGVsbC5tdihcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguam9pbih0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLmFwcFJvb3QsICdub2RlX21vZHVsZXMnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubm9kZU1vZHVsZXNcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGNyZWF0ZSBhIGZ1bGwgbm9kZSBtb2R1bGVzIGJhY2suIEluIG90aGVyIHdvcmRzIHdlIHdhbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBleHRyYWN0ZWQgbW9kdWxlcyBiYWNrLlxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdC5mb3JFYWNoKG1vZHVsZSA9PiBzaGVsbC5jcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLXJmJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5leHRyYWN0ZWROb2RlTW9kdWxlcywgbW9kdWxlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5ub2RlTW9kdWxlcywgbW9kdWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgLmJpbiBiYWNrLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuJC51dGlscy5leGlzdHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5leHRyYWN0ZWROb2RlTW9kdWxlc0JpblxuICAgICAgICAgICAgICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWxsLmNwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5leHRyYWN0ZWROb2RlTW9kdWxlc0JpbiwgJyonKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubm9kZU1vZHVsZXMsICcuYmluJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoJ2RlbGV0aW5nIHNvdXJjZSBmaWxlcycpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGNsdWRlID0gW3RoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubm9kZU1vZHVsZXNdLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLmFwcEFzYXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5wYWNrYWdlSnNvblxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVGcm9tRGVsXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgZGVsLnN5bmMoXG4gICAgICAgICAgICAgICAgICAgICAgICBbYCR7dGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5yb290fSR7cGF0aC5zZXB9KmBdLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlLm1hcChwYXRoVG9FeGNsdWRlID0+IGAhJHtwYXRoVG9FeGNsdWRlfWApXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBmb3JjZTogdHJ1ZSB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgc3BlY2lmaWVkIG5vZGUgbW9kdWxlcyB0byBhIHNlcGFyYXRlIGRpcmVjdG9yeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBleHRyYWN0XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgZXh0cmFjdE1vZHVsZXMoZXh0cmFjdCkge1xuICAgICAgICBjb25zdCBleHQgPSBbJy5qcycsICcuYmF0JywgJy5zaCcsICcuY21kJywgJyddO1xuXG4gICAgICAgIGlmIChleHRyYWN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiQudXRpbHMuZXhpc3RzKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuZXh0cmFjdGVkTm9kZU1vZHVsZXMpKSB7XG4gICAgICAgICAgICAgICAgc2hlbGwucm0oJy1yZicsIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuZXh0cmFjdGVkTm9kZU1vZHVsZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuZXh0cmFjdGVkTm9kZU1vZHVsZXMpO1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuZXh0cmFjdGVkTm9kZU1vZHVsZXNCaW4pO1xuXG4gICAgICAgICAgICBleHRyYWN0LmZvckVhY2goKG1vZHVsZSkgPT4ge1xuICAgICAgICAgICAgICAgIGZzLnJlbmFtZVN5bmMoXG4gICAgICAgICAgICAgICAgICAgIHBhdGguam9pbih0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLmFwcFJvb3QsICdub2RlX21vZHVsZXMnLCBtb2R1bGUpLFxuICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5leHRyYWN0ZWROb2RlTW9kdWxlcywgbW9kdWxlKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIC8vIE1vdmUgYmlucy5cbiAgICAgICAgICAgICAgICB0aGlzLmV4dHJhY3RCaW4obW9kdWxlLCBleHQpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyB0aGUgYmluIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBhIGNlcnRhaW4gbm9kZSBtb2R1bGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vZHVsZVxuICAgICAqIEBwYXJhbSBleHRcbiAgICAgKi9cbiAgICBleHRyYWN0QmluKG1vZHVsZSwgZXh0KSB7XG4gICAgICAgIGxldCBwYWNrYWdlSnNvbjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgICBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgICAgIHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuZXh0cmFjdGVkTm9kZU1vZHVsZXMsIG1vZHVsZSwgJ3BhY2thZ2UuanNvbidcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgJ3V0ZjgnXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcGFja2FnZUpzb24gPSB7fTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgY29uc3QgYmlucyA9ICgnYmluJyBpbiBwYWNrYWdlSnNvbiAmJiB0eXBlb2YgcGFja2FnZUpzb24uYmluID09PSAnb2JqZWN0JykgPyBPYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5iaW4pIDogW107XG5cbiAgICAgICAgaWYgKGJpbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYmlucy5mb3JFYWNoKChiaW4pID0+IHtcbiAgICAgICAgICAgICAgICBleHQuZm9yRWFjaCgoZXh0ZW5zaW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpbkZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5hcHBSb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgJ25vZGVfbW9kdWxlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAnLmJpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtiaW59JHtleHRlbnNpb259YFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4kLnV0aWxzLmV4aXN0cyhiaW5GaWxlUGF0aCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJC51dGlscy5zeW1saW5rRXhpc3RzKGJpbkZpbGVQYXRoKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZzLnJlbmFtZVN5bmMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLmV4dHJhY3RlZE5vZGVNb2R1bGVzQmluLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtiaW59JHtleHRlbnNpb259YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWVyZ2VzIHRoZSBgZXh0cmFjdGAgZmllbGQgd2l0aCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIG1vZHVsZXMuXG4gICAgICovXG4gICAgZ2V0TW9kdWxlc1RvRXh0cmFjdCgpIHtcbiAgICAgICAgY29uc3QgYmluYXJ5TW9kdWxlc0RldGVjdG9yID1cbiAgICAgICAgICAgIG5ldyBCaW5hcnlNb2R1bGVEZXRlY3Rvcih0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLm5vZGVNb2R1bGVzKTtcbiAgICAgICAgY29uc3QgdG9CZUV4dHJhY3RlZCA9IGJpbmFyeU1vZHVsZXNEZXRlY3Rvci5kZXRlY3QoKTtcblxuICAgICAgICBsZXQgeyBleHRyYWN0IH0gPSB0aGlzLiQuZGVza3RvcC5nZXRTZXR0aW5ncygpO1xuXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShleHRyYWN0KSkge1xuICAgICAgICAgICAgZXh0cmFjdCA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWVyZ2UgPSB7fTtcbiAgICAgICAgdG9CZUV4dHJhY3RlZC5jb25jYXQoZXh0cmFjdCkuZm9yRWFjaCgobW9kdWxlKSA9PiB7XG4gICAgICAgICAgICBtZXJnZVttb2R1bGVdID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGV4dHJhY3QgPSBPYmplY3Qua2V5cyhtZXJnZSk7XG4gICAgICAgIGlmIChleHRyYWN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMubG9nLnZlcmJvc2UoYHJlc3VsdGFudCBtb2R1bGVzIHRvIGV4dHJhY3QgbGlzdCBpczogJHtleHRyYWN0LmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4dHJhY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyBhIG1kNSBmcm9tIGFsbCBkZXBlbmRlbmNpZXMuXG4gICAgICovXG4gICAgY2FsY3VsYXRlQ29tcGF0aWJpbGl0eVZlcnNpb24oKSB7XG4gICAgICAgIHRoaXMubG9nLnZlcmJvc2UoJ2NhbGN1bGF0aW5nIGNvbXBhdGliaWxpdHkgdmVyc2lvbicpO1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuJC5kZXNrdG9wLmdldFNldHRpbmdzKCk7XG5cbiAgICAgICAgaWYgKCgnZGVza3RvcEhDUENvbXBhdGliaWxpdHlWZXJzaW9uJyBpbiBzZXR0aW5ncykpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcGF0aWJpbGl0eVZlcnNpb24gPSBgJHtzZXR0aW5ncy5kZXNrdG9wSENQQ29tcGF0aWJpbGl0eVZlcnNpb259YDtcbiAgICAgICAgICAgIHRoaXMubG9nLndhcm4oYGNvbXBhdGliaWxpdHkgdmVyc2lvbiBvdmVycmlkZGVuIHRvICR7dGhpcy5jb21wYXRpYmlsaXR5VmVyc2lvbn1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1kNSA9IGNyeXB0by5jcmVhdGVIYXNoKCdtZDUnKTtcbiAgICAgICAgbGV0IGRlcGVuZGVuY2llcyA9IHRoaXMuZGVwc01hbmFnZXIuZ2V0RGVwZW5kZW5jaWVzKCk7XG4gICAgICAgIGNvbnN0IGRlcGVuZGVuY2llc1NvcnRlZCA9IE9iamVjdC5rZXlzKGRlcGVuZGVuY2llcykuc29ydCgpO1xuICAgICAgICBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXNTb3J0ZWQubWFwKGRlcGVuZGVuY3kgPT5cbiAgICAgICAgICAgIGAke2RlcGVuZGVuY3l9OiR7ZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldfWApO1xuICAgICAgICBjb25zdCBtYWluQ29tcGF0aWJpbGl0eVZlcnNpb24gPSB0aGlzLiQuZ2V0VmVyc2lvbigpLnNwbGl0KCcuJyk7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKCdtZXRlb3ItZGVza3RvcCBjb21wYXRpYmlsaXR5IHZlcnNpb24gaXMgJyxcbiAgICAgICAgICAgIGAke21haW5Db21wYXRpYmlsaXR5VmVyc2lvblswXX1gKTtcbiAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goXG4gICAgICAgICAgICBgbWV0ZW9yLWRlc2t0b3A6JHttYWluQ29tcGF0aWJpbGl0eVZlcnNpb25bMF19YFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGRlc2t0b3BDb21wYXRpYmlsaXR5VmVyc2lvbiA9IHNldHRpbmdzLnZlcnNpb24uc3BsaXQoJy4nKVswXTtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoJy5kZXNrdG9wIGNvbXBhdGliaWxpdHkgdmVyc2lvbiBpcyAnLCBkZXNrdG9wQ29tcGF0aWJpbGl0eVZlcnNpb24pO1xuICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChcbiAgICAgICAgICAgIGBkZXNrdG9wLWFwcDoke2Rlc2t0b3BDb21wYXRpYmlsaXR5VmVyc2lvbn1gXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk1FVEVPUl9ERVNLVE9QX0RFQlVHX0RFU0tUT1BfQ09NUEFUSUJJTElUWV9WRVJTSU9OIHx8XG4gICAgICAgICAgICBwcm9jZXNzLmVudi5NRVRFT1JfREVTS1RPUF9ERUJVR1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBjb21wYXRpYmlsaXR5IHZlcnNpb24gY2FsY3VsYXRlZCBmcm9tICR7SlNPTi5zdHJpbmdpZnkoZGVwZW5kZW5jaWVzKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1kNS51cGRhdGUoSlNPTi5zdHJpbmdpZnkoZGVwZW5kZW5jaWVzKSk7XG5cbiAgICAgICAgdGhpcy5jb21wYXRpYmlsaXR5VmVyc2lvbiA9IG1kNS5kaWdlc3QoJ2hleCcpO1xuICAgIH1cblxuICAgIGFzeW5jIGluaXQoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiQuZWxlY3Ryb24uaW5pdCgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4kLmVsZWN0cm9uQnVpbGRlci5pbml0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLndhcm4oJ2Vycm9yIG9jY3VycmVkIHdoaWxlIGluaXRpYWxpc2luZyBlbGVjdHJvbiBhbmQgZWxlY3Ryb24tYnVpbGRlciBpbnRlZ3JhdGlvbicsIGUpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVucyBhbGwgbmVjZXNzYXJ5IHRhc2tzIHRvIGJ1aWxkIHRoZSBkZXNrdG9waWZpZWQgYXBwLlxuICAgICAqL1xuICAgIGFzeW5jIGJ1aWxkKHJ1biA9IGZhbHNlKSB7XG4gICAgICAgIC8vIFRPRE86IHJlZmFjdG9yIHRvIGEgdGFzayBydW5uZXJcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnc2NhZmZvbGRpbmcnKTtcblxuICAgICAgICBpZiAoIXRoaXMuJC5kZXNrdG9wLmNoZWNrKCkpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy4kLmVudi5vcHRpb25zLnNjYWZmb2xkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ3NlZW1zIHRoYXQgeW91IGRvIG5vdCBoYXZlIGEgLmRlc2t0b3AgZGlyIGluIHlvdXIgcHJvamVjdCBvciBpdCBpcycgK1xuICAgICAgICAgICAgICAgICAgICAnIGNvcnJ1cHRlZC4gUnVuIFxcJ25wbSBydW4gZGVza3RvcCAtLSBpbml0XFwnIHRvIGdldCBhIG5ldyBvbmUuJyk7XG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IGZhaWwsIHNvIHRoYXQgbnBtIHdpbGwgbm90IHByaW50IGhpcyBlcnJvciBzdHVmZiB0byBjb25zb2xlLlxuICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kLmRlc2t0b3Auc2NhZmZvbGQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLiQubWV0ZW9yQXBwLnVwZGF0ZUdpdElnbm9yZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy4kLm1ldGVvckFwcC51cGRhdGVHaXRJZ25vcmUoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cud2FybihgZXJyb3Igb2NjdXJyZWQgd2hpbGUgYWRkaW5nICR7dGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5yb290TmFtZX1gICtcbiAgICAgICAgICAgICAgICAndG8gLmdpdGlnbm9yZTogJywgZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4kLm1ldGVvckFwcC5yZW1vdmVEZXByZWNhdGVkUGFja2FnZXMoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ2Vycm9yIHdoaWxlIHJlbW92aW5nIGRlcHJlY2F0ZWQgcGFja2FnZXM6ICcsIGUpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuJC5tZXRlb3JBcHAuZW5zdXJlRGVza3RvcEhDUFBhY2thZ2VzKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKCdlcnJvciB3aGlsZSBjaGVja2luZyBmb3IgcmVxdWlyZWQgcGFja2FnZXM6ICcsIGUpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2NhZmZvbGQubWFrZSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igd2hpbGUgc2NhZmZvbGRpbmc6ICcsIGUpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gJy5ucG1yYyc7XG4gICAgICAgICAgICBjb25zdCBkaXJOYW1lID0gJy5tZXRlb3IvZGVza3RvcC1idWlsZCc7XG4gICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJOYW1lKSAmJiBmcy5leGlzdHNTeW5jKGZpbGVOYW1lKSkge1xuICAgICAgICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhmaWxlTmFtZSwgYCR7ZGlyTmFtZX0vJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cud2FybignZXJyb3Igd2hpbGUgY29weWluZyAubnBtcmMnLCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmV4cG9zZUVsZWN0cm9uTW9kdWxlcygpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igd2hpbGUgZXhwb3NpbmcgZWxlY3Ryb24gbW9kdWxlczogJywgZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVQYWNrYWdlSnNvbkZpZWxkcygpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igd2hpbGUgdXBkYXRpbmcgcGFja2FnZS5qc29uOiAnLCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURlcGVuZGVuY2llc0xpc3QoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ2Vycm9yIHdoaWxlIG1lcmdpbmcgZGVwZW5kZW5jaWVzIGxpc3Q6ICcsIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlQ29tcGF0aWJpbGl0eVZlcnNpb24oKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ2Vycm9yIHdoaWxlIGNhbGN1bGF0aW5nIGNvbXBhdGliaWxpdHkgdmVyc2lvbjogJywgZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVUZW1wb3JhcnlOb2RlTW9kdWxlcygpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGVtcG9yYXJ5IG5vZGVfbW9kdWxlczogJywgZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbm9kZU1vZHVsZXNSZW1vdmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbm9kZU1vZHVsZXNSZW1vdmVkID0gYXdhaXQgdGhpcy5oYW5kbGVTdGF0ZU9mTm9kZU1vZHVsZXMoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ2Vycm9yIG9jY3VycmVkIHdoaWxlIGNsZWFyaW5nIG5vZGVfbW9kdWxlczogJywgZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWJ1aWxkRGVwcyh0cnVlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ2Vycm9yIG9jY3VycmVkIHdoaWxlIGluc3RhbGxpbmcgbm9kZV9tb2R1bGVzOiAnLCBlKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbm9kZU1vZHVsZXNSZW1vdmVkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVidWlsZERlcHMoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igb2NjdXJyZWQgd2hpbGUgcmVidWlsZGluZyBuYXRpdmUgbm9kZSBtb2R1bGVzOiAnLCBlKTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5saW5rTnBtUGFja2FnZXMoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoYGxpbmtpbmcgcGFja2FnZXMgZmFpbGVkOiAke2V9YCk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbnN0YWxsTG9jYWxOb2RlTW9kdWxlcygpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igb2NjdXJyZWQgd2hpbGUgaW5zdGFsbGluZyBsb2NhbCBub2RlIG1vZHVsZXM6ICcsIGUpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVNZXRlb3JEZXBlbmRlbmNpZXMoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ2Vycm9yIG9jY3VycmVkIHdoaWxlIGVuc3VyaW5nIG1ldGVvciBkZXBlbmRlbmNpZXMgYXJlIGluc3RhbGxlZDogJywgZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGlmICh0aGlzLiQuZW52LmlzUHJvZHVjdGlvbkJ1aWxkKCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wYWNrU2tlbGV0b25Ub0FzYXIoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igd2hpbGUgcGFja2luZyBza2VsZXRvbiB0byBhc2FyOiAnLCBlKTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBmaW5kIGEgd2F5IHRvIGF2b2lkIGNvcHlpbmcgLmRlc2t0b3AgdG8gYSB0ZW1wIGxvY2F0aW9uXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmNvcHlEZXNrdG9wVG9EZXNrdG9wVGVtcCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igd2hpbGUgY29weWluZyAuZGVza3RvcCB0byBhIHRlbXBvcmFyeSBsb2NhdGlvbjogJywgZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVTZXR0aW5nc0pzb25GaWVsZHMoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ2Vycm9yIHdoaWxlIHVwZGF0aW5nIHNldHRpbmdzLmpzb246ICcsIGUpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZXhjbHVkZUZpbGVzRnJvbUFyY2hpdmUoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ2Vycm9yIHdoaWxlIGV4Y2x1ZGluZyBmaWxlcyBmcm9tIHBhY2tpbmcgdG8gYXNhcjogJywgZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy50cmFuc3BpbGVBbmRNaW5pZnkoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ2Vycm9yIHdoaWxlIHRyYW5zcGlsaW5nIG9yIG1pbmlmeWluZzogJywgZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wYWNrRGVza3RvcFRvQXNhcigpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igb2NjdXJyZWQgd2hpbGUgcGFja2luZyAuZGVza3RvcCB0byBhc2FyOiAnLCBlKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdldE1ldGVvckNsaWVudEJ1aWxkKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKCdlcnJvciBvY2N1cnJlZCBkdXJpbmcgZ2V0dGluZyBtZXRlb3IgbW9iaWxlIGJ1aWxkOiAnLCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChydW4pIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ3J1bm5pbmcnKTtcbiAgICAgICAgICAgIHRoaXMuJC5lbGVjdHJvbi5ydW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ2J1aWx0Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgdGhlIGBleHBvc2VkTW9kdWxlc2Agc2V0dGluZyBmcm9tIGBzZXR0aW5ncy5qc29uYCBpbnRvIGBwcmVsb2FkLmpzYCBtb2RpZnlpbmcgaXRzIGNvZGVcbiAgICAgKiBzbyB0aGF0IHRoZSBzY3JpcHQgd2lsbCBoYXZlIGl0IGhhcmRjb2RlZC5cbiAgICAgKi9cbiAgICBleHBvc2VFbGVjdHJvbk1vZHVsZXMoKSB7XG4gICAgICAgIGNvbnN0IHsgZXhwb3NlZE1vZHVsZXMgfSA9IHRoaXMuJC5kZXNrdG9wLmdldFNldHRpbmdzKCk7XG4gICAgICAgIGlmIChleHBvc2VkTW9kdWxlcyAmJiBBcnJheS5pc0FycmF5KGV4cG9zZWRNb2R1bGVzKSAmJiBleHBvc2VkTW9kdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcHJlbG9hZCA9IGZzLnJlYWRGaWxlU3luYyh0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnByZWxvYWQsICd1dGY4Jyk7XG4gICAgICAgICAgICBjb25zdCBtb2R1bGVzID0gdGhpcy4kLmRlc2t0b3AuZ2V0U2V0dGluZ3MoKVxuICAgICAgICAgICAgICAgIC5leHBvc2VkTW9kdWxlc1xuICAgICAgICAgICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXR1cm4tYXNzaWduLG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgICAgIChwcmV2LCBtb2R1bGUpID0+IChwcmV2ICs9IGAnJHttb2R1bGV9JywgYCwgcHJldiksICcnXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgcHJlbG9hZCA9IHByZWxvYWQucmVwbGFjZSgnY29uc3QgZXhwb3NlZE1vZHVsZXMgPSBbJywgYGNvbnN0IGV4cG9zZWRNb2R1bGVzID0gWyR7bW9kdWxlc31gKTtcbiAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5wcmVsb2FkLCBwcmVsb2FkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuc3VyZXMgYWxsIHJlcXVpcmVkIGRlcGVuZGVuY2llcyBhcmUgYWRkZWQgdG8gdGhlIE1ldGVvciBwcm9qZWN0LlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlLjx2b2lkPn1cbiAgICAgKi9cbiAgICBhc3luYyBlbnN1cmVNZXRlb3JEZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIGxldCBwYWNrYWdlcyA9IFtdO1xuICAgICAgICBjb25zdCBwYWNrYWdlc1dpdGhWZXJzaW9uID0gW107XG4gICAgICAgIGxldCBwbHVnaW5zID0gJ3BsdWdpbnMgWyc7XG5cbiAgICAgICAgT2JqZWN0LmtleXModGhpcy4kLmRlc2t0b3AuZ2V0RGVwZW5kZW5jaWVzKCkucGx1Z2lucykuZm9yRWFjaCgocGx1Z2luKSA9PiB7XG4gICAgICAgICAgICAvLyBSZWFkIHBhY2thZ2UuanNvbiBvZiB0aGUgcGx1Z2luLlxuICAgICAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPVxuICAgICAgICAgICAgICAgIEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLm5vZGVNb2R1bGVzLCBwbHVnaW4sICdwYWNrYWdlLmpzb24nXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3V0ZjgnXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoJ21ldGVvckRlcGVuZGVuY2llcycgaW4gcGFja2FnZUpzb24gJiYgdHlwZW9mIHBhY2thZ2VKc29uLm1ldGVvckRlcGVuZGVuY2llcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBwbHVnaW5zICs9IGAke3BsdWdpbn0sIGA7XG4gICAgICAgICAgICAgICAgcGFja2FnZXMudW5zaGlmdCguLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5tZXRlb3JEZXBlbmRlbmNpZXMpKTtcbiAgICAgICAgICAgICAgICBwYWNrYWdlc1dpdGhWZXJzaW9uLnVuc2hpZnQoLi4ucGFja2FnZXMubWFwKChwYWNrYWdlTmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFja2FnZUpzb24ubWV0ZW9yRGVwZW5kZW5jaWVzW3BhY2thZ2VOYW1lXSA9PT0gJ0B2ZXJzaW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke3BhY2thZ2VOYW1lfUAke3BhY2thZ2VKc29uLnZlcnNpb259YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7cGFja2FnZU5hbWV9QCR7cGFja2FnZUpzb24ubWV0ZW9yRGVwZW5kZW5jaWVzW3BhY2thZ2VOYW1lXX1gO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcGFja2FnZXNDb3VudCA9IHBhY2thZ2VzLmxlbmd0aDtcbiAgICAgICAgcGFja2FnZXMgPSBwYWNrYWdlcy5maWx0ZXIodmFsdWUgPT4gIXRoaXMuZGVwcmVjdGF0ZWRQbHVnaW5zLmluY2x1ZGVzKHZhbHVlKSk7XG4gICAgICAgIGlmIChwYWNrYWdlc0NvdW50ICE9PSBwYWNrYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLndhcm4oJ3lvdSBoYXZlIHNvbWUgZGVwcmVjYXRlZCBtZXRlb3IgZGVza3RvcCBwbHVnaW5zIGluIHlvdXIgc2V0dGluZ3MsIHBsZWFzZSByZW1vdmUgJyArXG4gICAgICAgICAgICAgICAgYHRoZW0gKGRlcHJlY2F0ZWQgcGx1Z2luczogJHt0aGlzLmRlcHJlY3RhdGVkUGx1Z2lucy5qb2luKCcsICcpfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBwbHVnaW5zID0gYCR7cGx1Z2lucy5zdWJzdHIoMCwgcGx1Z2lucy5sZW5ndGggLSAyKX1dYDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4kLm1ldGVvckFwcC5tZXRlb3JNYW5hZ2VyLmVuc3VyZVBhY2thZ2VzKFxuICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcywgcGFja2FnZXNXaXRoVmVyc2lvbiwgcGx1Z2luc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIG1ldGVvciBhcHAuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0TWV0ZW9yQ2xpZW50QnVpbGQoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuJC5tZXRlb3JBcHAuYnVpbGQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIG5vZGVfbW9kdWxlcyBpZiBuZWVkZWQuXG4gICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgYXN5bmMgaGFuZGxlU3RhdGVPZk5vZGVNb2R1bGVzKCkge1xuICAgICAgICBpZiAodGhpcy4kLmVudi5pc1Byb2R1Y3Rpb25CdWlsZCgpIHx8IHRoaXMuJC5lbnYub3B0aW9ucy5pYTMyKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuJC5lbnYuaXNQcm9kdWN0aW9uQnVpbGQoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ2NsZWFyaW5nIG5vZGVfbW9kdWxlcyBiZWNhdXNlIHdlIG5lZWQgdG8gaGF2ZSBpdCBjbGVhciBmb3IgaWEzMiByZWJ1aWxkJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ2NsZWFyaW5nIG5vZGVfbW9kdWxlcyBiZWNhdXNlIHRoaXMgaXMgYSBwcm9kdWN0aW9uIGJ1aWxkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuJC51dGlscy5ybVdpdGhSZXRyaWVzKFxuICAgICAgICAgICAgICAgICAgICAnLXJmJywgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5ub2RlTW9kdWxlc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoZXJlIGlzIGEgdGVtcG9yYXJ5IG5vZGVfbW9kdWxlcyBmb2xkZXIgYW5kIG5vIG5vZGVfbW9kdWxlcyBmb2xkZXIsIHdlIHdpbGxcbiAgICAgKiByZXN0b3JlIGl0LCBhcyBpdCBtaWdodCBiZSBhIGxlZnRvdmVyIGZyb20gYW4gaW50ZXJydXB0ZWQgZmxvdy5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBhc3luYyBoYW5kbGVUZW1wb3JhcnlOb2RlTW9kdWxlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuJC51dGlscy5leGlzdHModGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC50bXBOb2RlTW9kdWxlcykpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy4kLnV0aWxzLmV4aXN0cyh0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLm5vZGVNb2R1bGVzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKCdtb3ZpbmcgdGVtcCBub2RlX21vZHVsZXMgYmFjaycpO1xuICAgICAgICAgICAgICAgIHNoZWxsLm12KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnRtcE5vZGVNb2R1bGVzLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLm5vZGVNb2R1bGVzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBub2RlX21vZHVsZXMgZm9sZGVyLCB3ZSBzaG91bGQgY2xlYXIgdGhlIHRlbXBvcmFyeSBvbmUuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoJ2NsZWFyaW5nIHRlbXAgbm9kZV9tb2R1bGVzIGJlY2F1c2UgbmV3IG9uZSBpcyBhbHJlYWR5IGNyZWF0ZWQnKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiQudXRpbHMucm1XaXRoUmV0cmllcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICctcmYnLCB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnRtcE5vZGVNb2R1bGVzXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVucyBucG0gbGluayBmb3IgZXZlcnkgcGFja2FnZSBzcGVjaWZpZWQgaW4gc2V0dGluZ3MuanNvbi0+bGlua1BhY2thZ2VzLlxuICAgICAqL1xuICAgIGFzeW5jIGxpbmtOcG1QYWNrYWdlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuJC5lbnYuaXNQcm9kdWN0aW9uQnVpbGQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy4kLmRlc2t0b3AuZ2V0U2V0dGluZ3MoKTtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgaWYgKCdsaW5rUGFja2FnZXMnIGluIHRoaXMuJC5kZXNrdG9wLmdldFNldHRpbmdzKCkpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNldHRpbmdzLmxpbmtQYWNrYWdlcykpIHtcbiAgICAgICAgICAgICAgICBzZXR0aW5ncy5saW5rUGFja2FnZXMuZm9yRWFjaChwYWNrYWdlTmFtZSA9PlxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kLm1ldGVvckFwcC5ydW5OcG0oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWydsaW5rJywgcGFja2FnZU5hbWVdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnJvb3RcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1bnMgbnBtIGluIHRoZSBlbGVjdHJvbiBhcHAgdG8gZ2V0IHRoZSBkZXBlbmRlbmNpZXMgaW5zdGFsbGVkLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGFzeW5jIGVuc3VyZURlcHMoKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ2luc3RhbGxpbmcgZGVwZW5kZW5jaWVzJyk7XG4gICAgICAgIGlmICh0aGlzLiQudXRpbHMuZXhpc3RzKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubm9kZU1vZHVsZXMpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZygncnVubmluZyBucG0gcHJ1bmUgdG8gd2lwZSB1bm5lZWRlZCBkZXBlbmRlbmNpZXMnKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW5OcG0oWydwcnVuZSddKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucnVuTnBtKFsnaW5zdGFsbCddLCB0aGlzLiQuZW52LnN0ZGlvKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2FybnMgaWYgcGx1Z2lucyB2ZXJzaW9uIGFyZSBvdXRkYXRlZCBpbiBjb21wYXJlIHRvIHRoZSBuZXdlc3Qgc2NhZmZvbGQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBsdWdpbnNWZXJzaW9ucyAtIGN1cnJlbnQgcGx1Z2lucyB2ZXJzaW9ucyBmcm9tIHNldHRpbmdzLmpzb25cbiAgICAgKi9cbiAgICBjaGVja1BsdWdpbnNWZXJzaW9uKHBsdWdpbnNWZXJzaW9ucykge1xuICAgICAgICBjb25zdCBzZXR0aW5nc0pzb24gPSBKU09OLnBhcnNlKFxuICAgICAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih0aGlzLiQuZW52LnBhdGhzLnNjYWZmb2xkLCAnc2V0dGluZ3MuanNvbicpKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzY2FmZm9sZFBsdWdpbnNWZXJzaW9uID0gdGhpcy4kLmRlc2t0b3AuZ2V0RGVwZW5kZW5jaWVzKHNldHRpbmdzSnNvbiwgZmFsc2UpLnBsdWdpbnM7XG4gICAgICAgIE9iamVjdC5rZXlzKHBsdWdpbnNWZXJzaW9ucykuZm9yRWFjaCgocGx1Z2luTmFtZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHBsdWdpbk5hbWUgaW4gc2NhZmZvbGRQbHVnaW5zVmVyc2lvbiAmJlxuICAgICAgICAgICAgICAgIHNjYWZmb2xkUGx1Z2luc1ZlcnNpb25bcGx1Z2luTmFtZV0gIT09IHBsdWdpbnNWZXJzaW9uc1twbHVnaW5OYW1lXSAmJlxuICAgICAgICAgICAgICAgIHNlbXZlci5sdChwbHVnaW5zVmVyc2lvbnNbcGx1Z2luTmFtZV0sIHNjYWZmb2xkUGx1Z2luc1ZlcnNpb25bcGx1Z2luTmFtZV0pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy53YXJuKGB5b3UgYXJlIHVzaW5nIG91dGRhdGVkIHZlcnNpb24gJHtwbHVnaW5zVmVyc2lvbnNbcGx1Z2luTmFtZV19IG9mIGAgK1xuICAgICAgICAgICAgICAgICAgICBgJHtwbHVnaW5OYW1lfSwgdGhlIHN1Z2dlc3RlZCB2ZXJzaW9uIHRvIHVzZSBpcyBgICtcbiAgICAgICAgICAgICAgICAgICAgYCR7c2NhZmZvbGRQbHVnaW5zVmVyc2lvbltwbHVnaW5OYW1lXX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWVyZ2VzIGNvcmUgZGVwZW5kZW5jeSBsaXN0IHdpdGggdGhlIGRlcGVuZGVuY2llcyBmcm9tIC5kZXNrdG9wLlxuICAgICAqL1xuICAgIHVwZGF0ZURlcGVuZGVuY2llc0xpc3QoKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ3VwZGF0aW5nIGxpc3Qgb2YgcGFja2FnZS5qc29uXFwncyBkZXBlbmRlbmNpZXMnKTtcbiAgICAgICAgY29uc3QgZGVza3RvcERlcGVuZGVuY2llcyA9IHRoaXMuJC5kZXNrdG9wLmdldERlcGVuZGVuY2llcygpO1xuXG4gICAgICAgIHRoaXMuY2hlY2tQbHVnaW5zVmVyc2lvbihkZXNrdG9wRGVwZW5kZW5jaWVzLnBsdWdpbnMpO1xuXG4gICAgICAgIHRoaXMubG9nLmRlYnVnKCdtZXJnaW5nIHNldHRpbmdzLmpzb25bZGVwZW5kZW5jaWVzXScpO1xuICAgICAgICB0aGlzLmRlcHNNYW5hZ2VyLm1lcmdlRGVwZW5kZW5jaWVzKFxuICAgICAgICAgICAgJ3NldHRpbmdzLmpzb25bZGVwZW5kZW5jaWVzXScsXG4gICAgICAgICAgICBkZXNrdG9wRGVwZW5kZW5jaWVzLmZyb21TZXR0aW5nc1xuICAgICAgICApO1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZygnbWVyZ2luZyBzZXR0aW5ncy5qc29uW3BsdWdpbnNdJyk7XG4gICAgICAgIHRoaXMuZGVwc01hbmFnZXIubWVyZ2VEZXBlbmRlbmNpZXMoXG4gICAgICAgICAgICAnc2V0dGluZ3MuanNvbltwbHVnaW5zXScsXG4gICAgICAgICAgICBkZXNrdG9wRGVwZW5kZW5jaWVzLnBsdWdpbnNcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmxvZy5kZWJ1ZygnbWVyZ2luZyBkZXBlbmRlbmNpZXMgZnJvbSBtb2R1bGVzJyk7XG4gICAgICAgIE9iamVjdC5rZXlzKGRlc2t0b3BEZXBlbmRlbmNpZXMubW9kdWxlcykuZm9yRWFjaChtb2R1bGUgPT5cbiAgICAgICAgICAgIHRoaXMuZGVwc01hbmFnZXIubWVyZ2VEZXBlbmRlbmNpZXMoXG4gICAgICAgICAgICAgICAgYG1vZHVsZVske21vZHVsZX1dYCxcbiAgICAgICAgICAgICAgICBkZXNrdG9wRGVwZW5kZW5jaWVzLm1vZHVsZXNbbW9kdWxlXVxuICAgICAgICAgICAgKSk7XG5cbiAgICAgICAgdGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPSB0aGlzLmRlcHNNYW5hZ2VyLmdldFJlbW90ZURlcGVuZGVuY2llcygpO1xuICAgICAgICB0aGlzLnBhY2thZ2VKc29uLmxvY2FsRGVwZW5kZW5jaWVzID0gdGhpcy5kZXBzTWFuYWdlci5nZXRMb2NhbERlcGVuZGVuY2llcygpO1xuXG4gICAgICAgIHRoaXMubG9nLmRlYnVnKCd3cml0aW5nIHVwZGF0ZWQgcGFja2FnZS5qc29uJyk7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnBhY2thZ2VKc29uLCBKU09OLnN0cmluZ2lmeSh0aGlzLnBhY2thZ2VKc29uLCBudWxsLCAyKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc3RhbGwgbm9kZSBtb2R1bGVzIGZyb20gbG9jYWwgcGF0aHMgdXNpbmcgbG9jYWwtaW5zdGFsbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhcmNoXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgaW5zdGFsbExvY2FsTm9kZU1vZHVsZXMoYXJjaCA9IHRoaXMuJC5lbnYub3B0aW9ucy5pYTMyIHx8IHByb2Nlc3MuYXJjaCA9PT0gJ2lhMzInID8gJ2lhMzInIDogJ3g2NCcpIHtcbiAgICAgICAgY29uc3QgbG9jYWxEZXBlbmRlbmNpZXMgPSBfLnZhbHVlcyh0aGlzLnBhY2thZ2VKc29uLmxvY2FsRGVwZW5kZW5jaWVzKTtcbiAgICAgICAgaWYgKGxvY2FsRGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ2luc3RhbGxpbmcgbG9jYWwgbm9kZSBtb2R1bGVzJyk7XG4gICAgICAgIGNvbnN0IGxhc3RSZWJ1aWxkID0gdGhpcy4kLmVsZWN0cm9uQnVpbGRlci5wcmVwYXJlTGFzdFJlYnVpbGRPYmplY3QoYXJjaCk7XG4gICAgICAgIGNvbnN0IGVudiA9IHRoaXMuJC5lbGVjdHJvbkJ1aWxkZXIuZ2V0R3lwRW52KGxhc3RSZWJ1aWxkLmZyYW1ld29ya0luZm8sIGxhc3RSZWJ1aWxkLnBsYXRmb3JtLCBsYXN0UmVidWlsZC5hcmNoKTtcbiAgICAgICAgY29uc3QgaW5zdGFsbGVyID0gbmV3IExvY2FsSW5zdGFsbGVyKFxuICAgICAgICAgICAgeyBbdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5yb290XTogbG9jYWxEZXBlbmRlbmNpZXMgfSxcbiAgICAgICAgICAgIHsgbnBtRW52OiBlbnYgfVxuICAgICAgICApO1xuICAgICAgICBwcm9ncmVzcyhpbnN0YWxsZXIpO1xuICAgICAgICByZXR1cm4gaW5zdGFsbGVyLmluc3RhbGwoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWJ1aWxkIGJpbmFyeSBkZXBlbmRlbmNpZXMgYWdhaW5zdCBFbGVjdHJvbidzIG5vZGUgaGVhZGVycy5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICByZWJ1aWxkRGVwcyhpbnN0YWxsID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGluc3RhbGwpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ2lzc3Vpbmcgbm9kZV9tb2R1bGVzIGluc3RhbGwgZnJvbSBlbGVjdHJvbi1idWlsZGVyJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdpc3N1aW5nIG5hdGl2ZSBtb2R1bGVzIHJlYnVpbGQgZnJvbSBlbGVjdHJvbi1idWlsZGVyJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcmNoID0gdGhpcy4kLmVudi5vcHRpb25zLmlhMzIgfHwgcHJvY2Vzcy5hcmNoID09PSAnaWEzMicgPyAnaWEzMicgOiAneDY0JztcblxuICAgICAgICBpZiAodGhpcy4kLmVudi5vcHRpb25zLmlhMzIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLnZlcmJvc2UoJ2ZvcmNpbmcgcmVidWlsZCBmb3IgMzJiaXQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9nLnZlcmJvc2UoYHJlYnVpbGRpbmcgZm9yICR7YXJjaH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLiQuZWxlY3Ryb25CdWlsZGVyLmluc3RhbGxPclJlYnVpbGQoYXJjaCwgdW5kZWZpbmVkLCBpbnN0YWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgcGFja2FnZS5qc29uIGZpZWxkcyBhY2NvcmRpbmdseSB0byB3aGF0IGlzIHNldCBpbiBzZXR0aW5ncy5qc29uLlxuICAgICAqXG4gICAgICogcGFja2FnZUpzb24ubmFtZSA9IHNldHRpbmdzLnByb2plY3ROYW1lXG4gICAgICogcGFja2FnZUpzb24udmVyc2lvbiA9IHNldHRpbmdzLnZlcnNpb25cbiAgICAgKiBwYWNrYWdlSnNvbi4qID0gc2V0dGluZ3MucGFja2FnZUpzb25GaWVsZHNcbiAgICAgKi9cbiAgICB1cGRhdGVQYWNrYWdlSnNvbkZpZWxkcygpIHtcbiAgICAgICAgdGhpcy5sb2cudmVyYm9zZSgndXBkYXRpbmcgcGFja2FnZS5qc29uIGZpZWxkcycpO1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuJC5kZXNrdG9wLmdldFNldHRpbmdzKCk7XG4gICAgICAgIC8qKiBAdHlwZSB7ZGVza3RvcFNldHRpbmdzfSAqL1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IHRoaXMuc2NhZmZvbGQuZ2V0RGVmYXVsdFBhY2thZ2VKc29uKCk7XG5cbiAgICAgICAgcGFja2FnZUpzb24udmVyc2lvbiA9IHNldHRpbmdzLnZlcnNpb247XG4gICAgICAgIGlmICgncGFja2FnZUpzb25GaWVsZHMnIGluIHNldHRpbmdzKSB7XG4gICAgICAgICAgICBhc3NpZ25JbihwYWNrYWdlSnNvbiwgc2V0dGluZ3MucGFja2FnZUpzb25GaWVsZHMpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2lnbkluKHBhY2thZ2VKc29uLCB7IG5hbWU6IHNldHRpbmdzLnByb2plY3ROYW1lIH0pO1xuXG4gICAgICAgIHRoaXMubG9nLmRlYnVnKCd3cml0aW5nIHVwZGF0ZWQgcGFja2FnZS5qc29uJyk7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnBhY2thZ2VKc29uLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgbnVsbCwgNClcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5wYWNrYWdlSnNvbiA9IHBhY2thZ2VKc29uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgc2V0dGluZ3MuanNvbiB3aXRoIGVudiAocHJvZC9kZXYpIGluZm9ybWF0aW9uIGFuZCB2ZXJzaW9ucy5cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVTZXR0aW5nc0pzb25GaWVsZHMoKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKCd1cGRhdGluZyBzZXR0aW5ncy5qc29uIGZpZWxkcycpO1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuJC5kZXNrdG9wLmdldFNldHRpbmdzKCk7XG5cbiAgICAgICAgLy8gU2F2ZSB2ZXJzaW9ucy5cbiAgICAgICAgc2V0dGluZ3MuY29tcGF0aWJpbGl0eVZlcnNpb24gPSB0aGlzLmNvbXBhdGliaWxpdHlWZXJzaW9uO1xuXG4gICAgICAgIC8vIFBhc3MgaW5mb3JtYXRpb24gYWJvdXQgYnVpbGQgdHlwZSB0byB0aGUgc2V0dGluZ3MuanNvbi5cbiAgICAgICAgc2V0dGluZ3MuZW52ID0gKHRoaXMuJC5lbnYuaXNQcm9kdWN0aW9uQnVpbGQoKSkgP1xuICAgICAgICAgICAgJ3Byb2QnIDogJ2Rldic7XG5cbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IHRoaXMuJC5kZXNrdG9wLmdldEhhc2hWZXJzaW9uKCk7XG4gICAgICAgIHNldHRpbmdzLmRlc2t0b3BWZXJzaW9uID0gYCR7dmVyc2lvbn1fJHtzZXR0aW5ncy5lbnZ9YDtcblxuICAgICAgICBzZXR0aW5ncy5tZXRlb3JEZXNrdG9wVmVyc2lvbiA9IHRoaXMuJC5nZXRWZXJzaW9uKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuJC5lbnYub3B0aW9ucy5wcm9kRGVidWcpIHtcbiAgICAgICAgICAgIHNldHRpbmdzLnByb2REZWJ1ZyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5kZXNrdG9wVG1wLnNldHRpbmdzLCBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgbnVsbCwgNClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgZmlsZXMgZnJvbSBwcmVwYXJlZCAuZGVza3RvcCB0byBkZXNrdG9wLmFzYXIgaW4gZWxlY3Ryb24gYXBwLlxuICAgICAqL1xuICAgIHBhY2tEZXNrdG9wVG9Bc2FyKCkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdwYWNraW5nIC5kZXNrdG9wIHRvIGFzYXInKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGFzYXIuY3JlYXRlUGFja2FnZShcbiAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmRlc2t0b3BUbXAucm9vdCxcbiAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLmRlc2t0b3BBc2FyXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZy52ZXJib3NlKCdjbGVhcmluZyB0ZW1wb3JhcnkgLmRlc2t0b3AnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kLnV0aWxzXG4gICAgICAgICAgICAgICAgICAgICAgICAucm1XaXRoUmV0cmllcygnLXJmJywgdGhpcy4kLmVudi5wYXRocy5kZXNrdG9wVG1wLnJvb3QpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1ha2VzIGEgdGVtcG9yYXJ5IGNvcHkgb2YgLmRlc2t0b3AuXG4gICAgICovXG4gICAgY29weURlc2t0b3BUb0Rlc2t0b3BUZW1wKCkge1xuICAgICAgICB0aGlzLmxvZy52ZXJib3NlKCdjb3B5aW5nIC5kZXNrdG9wIHRvIHRlbXBvcmFyeSBsb2NhdGlvbicpO1xuICAgICAgICBzaGVsbC5jcCgnLXJmJywgdGhpcy4kLmVudi5wYXRocy5kZXNrdG9wLnJvb3QsIHRoaXMuJC5lbnYucGF0aHMuZGVza3RvcFRtcC5yb290KTtcbiAgICAgICAgLy8gUmVtb3ZlIHRlc3QgZmlsZXMuXG4gICAgICAgIGRlbC5zeW5jKFtcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLiQuZW52LnBhdGhzLmRlc2t0b3BUbXAucm9vdCwgJyoqJywgJyoudGVzdC5qcycpXG4gICAgICAgIF0sIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBSdW5zIGJhYmVsIGFuZCB1Z2xpZnkgb3ZlciAuZGVza3RvcCBpZiByZXF1ZXN0ZWQuXG4gICAgICovXG4gICAgYXN5bmMgdHJhbnNwaWxlQW5kTWluaWZ5KCkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCd0cmFuc3BpbGluZyBhbmQgdWdsaWZ5aW5nJyk7XG5cbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLiQuZGVza3RvcC5nZXRTZXR0aW5ncygpO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gJ3VnbGlmeU9wdGlvbnMnIGluIHNldHRpbmdzID8gc2V0dGluZ3MudWdsaWZ5T3B0aW9ucyA6IHt9O1xuXG4gICAgICAgIGNvbnN0IHVnbGlmeWluZ0VuYWJsZWQgPSAndWdsaWZ5JyBpbiBzZXR0aW5ncyAmJiAhIXNldHRpbmdzLnVnbGlmeTtcblxuICAgICAgICBjb25zdCBwcmVzZXQgPSBwcmVzZXRFbnYoeyBhc3NlcnRWZXJzaW9uOiAoKSA9PiB7IH0gfSwgeyB0YXJnZXRzOiB7IG5vZGU6ICcxMicgfSB9KTtcblxuICAgICAgICBjb25zdCB7IGRhdGE6IGZpbGVzIH0gPSBhd2FpdCB0aGlzLiQudXRpbHMucmVhZERpcih0aGlzLiQuZW52LnBhdGhzLmRlc2t0b3BUbXAucm9vdCk7XG5cbiAgICAgICAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGZpbGUuZW5kc1dpdGgoJy5qcycpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgY29kZSB9ID0gdHJhbnNmb3JtRmlsZVN5bmMoZmlsZSwge1xuICAgICAgICAgICAgICAgICAgICBwcmVzZXRzOiBbcHJlc2V0XVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxldCBlcnJvcjtcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuZW52ID09PSAncHJvZCcgJiYgdWdsaWZ5aW5nRW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAoeyBjb2RlLCBlcnJvciB9ID0gdWdsaWZ5Lm1pbmlmeShjb2RlLCBvcHRpb25zKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGUsIGNvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlcyBhbGwgdGhlIGZpbGVzIHRoYXQgc2hvdWxkIG5vdCBiZSBwYWNrZWQgaW50byBhc2FyIGludG8gYSBzYWZlIGxvY2F0aW9uIHdoaWNoIGlzIHRoZVxuICAgICAqICdleHRyYWN0ZWQnIGRpciBpbiB0aGUgZWxlY3Ryb24gYXBwLlxuICAgICAqL1xuICAgIGFzeW5jIGV4Y2x1ZGVGaWxlc0Zyb21BcmNoaXZlKCkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdleGNsdWRpbmcgZmlsZXMgZnJvbSBwYWNraW5nJyk7XG5cbiAgICAgICAgLy8gRW5zdXJlIGVtcHR5IGBleHRyYWN0ZWRgIGRpclxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiQudXRpbHMucm1XaXRoUmV0cmllcygnLXJmJywgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5leHRyYWN0ZWQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzaGVsbC5ta2Rpcih0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLmV4dHJhY3RlZCk7XG5cbiAgICAgICAgY29uc3QgY29uZmlncyA9IHRoaXMuJC5kZXNrdG9wLmdhdGhlck1vZHVsZUNvbmZpZ3MoKTtcblxuICAgICAgICAvLyBNb3ZlIGZpbGVzIHRoYXQgc2hvdWxkIG5vdCBiZSBhc2FyJ2VkLlxuICAgICAgICBjb25maWdzLmZvckVhY2goKGNvbmZpZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbW9kdWxlQ29uZmlnID0gY29uZmlnO1xuICAgICAgICAgICAgaWYgKCdleHRyYWN0JyBpbiBtb2R1bGVDb25maWcpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobW9kdWxlQ29uZmlnLmV4dHJhY3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZUNvbmZpZy5leHRyYWN0ID0gW21vZHVsZUNvbmZpZy5leHRyYWN0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbW9kdWxlQ29uZmlnLmV4dHJhY3QuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgZXhjbHVkaW5nICR7ZmlsZX0gZnJvbSAke2NvbmZpZy5uYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJC5lbnYucGF0aHMuZGVza3RvcFRtcC5tb2R1bGVzLCBtb2R1bGVDb25maWcuZGlyTmFtZSwgZmlsZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvblBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLmV4dHJhY3RlZCwgbW9kdWxlQ29uZmlnLmRpck5hbWVcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuJC51dGlscy5leGlzdHMoZGVzdGluYXRpb25QYXRoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hlbGwubWtkaXIoZGVzdGluYXRpb25QYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzaGVsbC5tdihmaWxlUGF0aCwgZGVzdGluYXRpb25QYXRoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFuQkE7QUFxQkFBLGdCQUFBLENBQU1DLE1BQU4sQ0FBYUMsS0FBYixHQUFxQixJQUFyQjtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUNlLE1BQU1DLFdBQU4sQ0FBa0I7RUFDN0I7QUFDSjtBQUNBO0FBQ0E7RUFDSUMsV0FBVyxDQUFDQyxDQUFELEVBQUk7SUFDWCxLQUFLQyxHQUFMLEdBQVcsSUFBSUMsWUFBSixDQUFRLGFBQVIsQ0FBWDtJQUNB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 \ No newline at end of file diff --git a/dist/electronAppScaffold.js b/dist/electronAppScaffold.js new file mode 100644 index 00000000..d108be14 --- /dev/null +++ b/dist/electronAppScaffold.js @@ -0,0 +1,142 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime")); + +var _fs = _interopRequireDefault(require("fs")); + +var _del = _interopRequireDefault(require("del")); + +var _shelljs = _interopRequireDefault(require("shelljs")); + +var _path = _interopRequireDefault(require("path")); + +var _log = _interopRequireDefault(require("./log")); + +var _skeletonDependencies = _interopRequireDefault(require("./skeletonDependencies")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// eslint-disable-next-line no-unused-vars +const { + join +} = _path.default; +_shelljs.default.config.fatal = true; +/** + * Represents the .desktop dir scaffold. + */ + +class ElectronAppScaffold { + /** + * @param {MeteorDesktop} $ - context + * @constructor + */ + constructor($) { + this.log = new _log.default('electronAppScaffold'); + this.$ = $; + this.packageJson = { + name: 'MyMeteorApp', + main: this.$.env.isProductionBuild() ? 'app.asar/index.js' : 'app/index.js', + dependencies: Object.assign({}, _skeletonDependencies.default) + }; + + if (!this.$.env.isProductionBuild() || this.$.env.options.prodDebug) { + this.packageJson.dependencies.devtron = '1.4.0'; + this.packageJson.dependencies['electron-debug'] = '1.5.0'; + } + } + /** + * Just a public getter from the default package.json object. + * @returns {Object} + */ + + + getDefaultPackageJson() { + return Object.assign({}, this.packageJson); + } + /** + * Clear the electron app. Removes everything except the node_modules which would be a waste + * to delete. Later `npm prune` will keep it clear. + */ + + + clear() { + if (!this.$.utils.exists(this.$.env.paths.electronApp.root)) { + this.log.verbose(`creating ${this.$.env.paths.electronApp.rootName}`); + + _shelljs.default.mkdir(this.$.env.paths.electronApp.root); + } + + return (0, _del.default)([`${this.$.env.paths.electronApp.root}${_path.default.sep}*`, `!${this.$.env.paths.electronApp.nodeModules}`], { + force: true + }); + } + /** + * Just copies the Skeleton App into the electron app. + */ + + + copySkeletonApp() { + this.log.verbose('copying skeleton app'); + + try { + _shelljs.default.cp('-rf', join(this.$.env.paths.meteorDesktop.skeleton, '*'), this.$.env.paths.electronApp.appRoot + _path.default.sep); + } catch (e) { + this.log.error('error while copying skeleton app:', e); + process.exit(1); + } + } + /** + * After clearing the electron app path, copies a fresh skeleton. + */ + + + async make() { + try { + this.log.verbose(`clearing ${this.$.env.paths.electronApp.rootName}`); + await this.clear(); + } catch (e) { + this.log.error(`error while removing ${this.$.env.paths.electronApp.root}: `, e); + process.exit(1); + } + + this.createAppRoot(); + this.copySkeletonApp(); // TODO: hey, wait, .gitignore is not needed - right? + + /* + this.log.debug('creating .gitignore'); + fs.writeFileSync(this.$.env.paths.electronApp.gitIgnore, [ + 'node_modules' + ].join('\n')); + */ + + this.log.verbose('writing package.json'); + + _fs.default.writeFileSync(this.$.env.paths.electronApp.packageJson, JSON.stringify(this.packageJson, null, 2)); + } + /** + * Creates the app directory in the electron app. + */ + + + createAppRoot() { + try { + this.log.verbose(`creating ${this.$.env.paths.electronApp.appRoot}`); + + _fs.default.mkdirSync(this.$.env.paths.electronApp.appRoot); + } catch (e) { + if (e.code !== 'EEXIST') { + this.log.error(`error while creating dir: ${this.$.env.paths.electronApp.appRoot}: `, e); + process.exit(1); + } + } + } + +} + +exports.default = ElectronAppScaffold; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJqb2luIiwicGF0aCIsInNoZWxsIiwiY29uZmlnIiwiZmF0YWwiLCJFbGVjdHJvbkFwcFNjYWZmb2xkIiwiY29uc3RydWN0b3IiLCIkIiwibG9nIiwiTG9nIiwicGFja2FnZUpzb24iLCJuYW1lIiwibWFpbiIsImVudiIsImlzUHJvZHVjdGlvbkJ1aWxkIiwiZGVwZW5kZW5jaWVzIiwiT2JqZWN0IiwiYXNzaWduIiwib3B0aW9ucyIsInByb2REZWJ1ZyIsImRldnRyb24iLCJnZXREZWZhdWx0UGFja2FnZUpzb24iLCJjbGVhciIsInV0aWxzIiwiZXhpc3RzIiwicGF0aHMiLCJlbGVjdHJvbkFwcCIsInJvb3QiLCJ2ZXJib3NlIiwicm9vdE5hbWUiLCJta2RpciIsImRlbCIsInNlcCIsIm5vZGVNb2R1bGVzIiwiZm9yY2UiLCJjb3B5U2tlbGV0b25BcHAiLCJjcCIsIm1ldGVvckRlc2t0b3AiLCJza2VsZXRvbiIsImFwcFJvb3QiLCJlIiwiZXJyb3IiLCJwcm9jZXNzIiwiZXhpdCIsIm1ha2UiLCJjcmVhdGVBcHBSb290IiwiZnMiLCJ3cml0ZUZpbGVTeW5jIiwiSlNPTiIsInN0cmluZ2lmeSIsIm1rZGlyU3luYyIsImNvZGUiXSwic291cmNlcyI6WyIuLi9saWIvZWxlY3Ryb25BcHBTY2FmZm9sZC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmltcG9ydCByZWdlbmVyYXRvclJ1bnRpbWUgZnJvbSAncmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgZGVsIGZyb20gJ2RlbCc7XG5pbXBvcnQgc2hlbGwgZnJvbSAnc2hlbGxqcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IExvZyBmcm9tICcuL2xvZyc7XG5pbXBvcnQgZGVwZW5kZW5jaWVzIGZyb20gJy4vc2tlbGV0b25EZXBlbmRlbmNpZXMnO1xuXG5jb25zdCB7IGpvaW4gfSA9IHBhdGg7XG5zaGVsbC5jb25maWcuZmF0YWwgPSB0cnVlO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIC5kZXNrdG9wIGRpciBzY2FmZm9sZC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWxlY3Ryb25BcHBTY2FmZm9sZCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNZXRlb3JEZXNrdG9wfSAkIC0gY29udGV4dFxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCQpIHtcbiAgICAgICAgdGhpcy5sb2cgPSBuZXcgTG9nKCdlbGVjdHJvbkFwcFNjYWZmb2xkJyk7XG4gICAgICAgIHRoaXMuJCA9ICQ7XG5cbiAgICAgICAgdGhpcy5wYWNrYWdlSnNvbiA9IHtcbiAgICAgICAgICAgIG5hbWU6ICdNeU1ldGVvckFwcCcsXG4gICAgICAgICAgICBtYWluOiAodGhpcy4kLmVudi5pc1Byb2R1Y3Rpb25CdWlsZCgpKSA/XG4gICAgICAgICAgICAgICAgJ2FwcC5hc2FyL2luZGV4LmpzJyA6ICdhcHAvaW5kZXguanMnLFxuICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiBPYmplY3QuYXNzaWduKHt9LCBkZXBlbmRlbmNpZXMpXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCF0aGlzLiQuZW52LmlzUHJvZHVjdGlvbkJ1aWxkKCkgfHwgdGhpcy4kLmVudi5vcHRpb25zLnByb2REZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMuZGV2dHJvbiA9ICcxLjQuMCc7XG4gICAgICAgICAgICB0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llc1snZWxlY3Ryb24tZGVidWcnXSA9ICcxLjUuMCc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKdXN0IGEgcHVibGljIGdldHRlciBmcm9tIHRoZSBkZWZhdWx0IHBhY2thZ2UuanNvbiBvYmplY3QuXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBnZXREZWZhdWx0UGFja2FnZUpzb24oKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciB0aGUgZWxlY3Ryb24gYXBwLiBSZW1vdmVzIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBub2RlX21vZHVsZXMgd2hpY2ggd291bGQgYmUgYSB3YXN0ZVxuICAgICAqIHRvIGRlbGV0ZS4gTGF0ZXIgYG5wbSBwcnVuZWAgd2lsbCBrZWVwIGl0IGNsZWFyLlxuICAgICAqL1xuICAgIGNsZWFyKCkge1xuICAgICAgICBpZiAoIXRoaXMuJC51dGlscy5leGlzdHModGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5yb290KSkge1xuICAgICAgICAgICAgdGhpcy5sb2cudmVyYm9zZShgY3JlYXRpbmcgJHt0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnJvb3ROYW1lfWApO1xuICAgICAgICAgICAgc2hlbGwubWtkaXIodGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5yb290KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWwoW1xuICAgICAgICAgICAgYCR7dGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5yb290fSR7cGF0aC5zZXB9KmAsXG4gICAgICAgICAgICBgISR7dGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5ub2RlTW9kdWxlc31gXG4gICAgICAgIF0sIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSnVzdCBjb3BpZXMgdGhlIFNrZWxldG9uIEFwcCBpbnRvIHRoZSBlbGVjdHJvbiBhcHAuXG4gICAgICovXG4gICAgY29weVNrZWxldG9uQXBwKCkge1xuICAgICAgICB0aGlzLmxvZy52ZXJib3NlKCdjb3B5aW5nIHNrZWxldG9uIGFwcCcpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2hlbGwuY3AoXG4gICAgICAgICAgICAgICAgJy1yZicsXG4gICAgICAgICAgICAgICAgam9pbih0aGlzLiQuZW52LnBhdGhzLm1ldGVvckRlc2t0b3Auc2tlbGV0b24sICcqJyksXG4gICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5hcHBSb290ICsgcGF0aC5zZXBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKCdlcnJvciB3aGlsZSBjb3B5aW5nIHNrZWxldG9uIGFwcDonLCBlKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFmdGVyIGNsZWFyaW5nIHRoZSBlbGVjdHJvbiBhcHAgcGF0aCwgY29waWVzIGEgZnJlc2ggc2tlbGV0b24uXG4gICAgICovXG4gICAgYXN5bmMgbWFrZSgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMubG9nLnZlcmJvc2UoYGNsZWFyaW5nICR7dGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5yb290TmFtZX1gKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xlYXIoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgICAgICAgYGVycm9yIHdoaWxlIHJlbW92aW5nICR7dGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5yb290fTogYCwgZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3JlYXRlQXBwUm9vdCgpO1xuXG4gICAgICAgIHRoaXMuY29weVNrZWxldG9uQXBwKCk7XG5cbiAgICAgICAgLy8gVE9ETzogaGV5LCB3YWl0LCAuZ2l0aWdub3JlIGlzIG5vdCBuZWVkZWQgLSByaWdodD9cbiAgICAgICAgLypcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoJ2NyZWF0aW5nIC5naXRpZ25vcmUnKTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLmdpdElnbm9yZSwgW1xuICAgICAgICAgICAgJ25vZGVfbW9kdWxlcydcbiAgICAgICAgXS5qb2luKCdcXG4nKSk7XG4gICAgICAgICovXG4gICAgICAgIHRoaXMubG9nLnZlcmJvc2UoJ3dyaXRpbmcgcGFja2FnZS5qc29uJyk7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnBhY2thZ2VKc29uLCBKU09OLnN0cmluZ2lmeSh0aGlzLnBhY2thZ2VKc29uLCBudWxsLCAyKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIGFwcCBkaXJlY3RvcnkgaW4gdGhlIGVsZWN0cm9uIGFwcC5cbiAgICAgKi9cbiAgICBjcmVhdGVBcHBSb290KCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5sb2cudmVyYm9zZShgY3JlYXRpbmcgJHt0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLmFwcFJvb3R9YCk7XG4gICAgICAgICAgICBmcy5ta2RpclN5bmModGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5hcHBSb290KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUuY29kZSAhPT0gJ0VFWElTVCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYGVycm9yIHdoaWxlIGNyZWF0aW5nIGRpcjogJHt0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLmFwcFJvb3R9OiBgLCBlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICB9XG4gICAg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 \ No newline at end of file diff --git a/dist/electronBuilder.js b/dist/electronBuilder.js new file mode 100644 index 00000000..d4438f23 --- /dev/null +++ b/dist/electronBuilder.js @@ -0,0 +1,384 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime")); + +var _shelljs = _interopRequireDefault(require("shelljs")); + +var _path = _interopRequireDefault(require("path")); + +var _fs = _interopRequireDefault(require("fs")); + +var _rimraf = _interopRequireDefault(require("rimraf")); + +var _crossSpawn = _interopRequireDefault(require("cross-spawn")); + +var _log = _interopRequireDefault(require("./log")); + +var _defaultDependencies = _interopRequireDefault(require("./defaultDependencies")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// eslint-disable-next-line no-unused-vars + +/** + * Promisfied rimraf. + * + * @param {string} dirPath - path to the dir to be deleted + * @param {number} delay - delay the task by ms + * @returns {Promise} + */ +function removeDir(dirPath, delay = 0) { + return new Promise((resolve, reject) => { + setTimeout(() => { + (0, _rimraf.default)(dirPath, { + maxBusyTries: 100 + }, err => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }, delay); + }); +} +/** + * Wrapper for electron-builder. + */ + + +class InstallerBuilder { + /** + * @param {MeteorDesktop} $ - context + * + * @constructor + */ + constructor($) { + this.log = new _log.default('electronBuilder'); + this.$ = $; + this.firstPass = true; + this.lastRebuild = {}; + this.currentContext = null; + this.installerDir = _path.default.join(this.$.env.options.output, this.$.env.paths.installerDir); + this.platforms = []; + } + + async init() { + this.builder = await this.$.getDependency('electron-builder', _defaultDependencies.default['electron-builder']); + const appBuilder = await this.$.getDependency('app-builder-lib', _defaultDependencies.default['electron-builder'], false); + this.yarn = require(_path.default.join(appBuilder.path, 'out', 'util', 'yarn')); + this.getGypEnv = this.yarn.getGypEnv; + this.packageDependencies = require(_path.default.join(appBuilder.path, 'out', 'util', 'packageDependencies')); + } + /** + * Prepares the last rebuild object for electron-builder. + * + * @param {string} arch + * @param {string} platform + * @returns {Object} + */ + + + prepareLastRebuildObject(arch, platform = process.platform) { + const productionDeps = this.packageDependencies.createLazyProductionDeps(this.$.env.paths.electronApp.root); + this.lastRebuild = { + frameworkInfo: { + version: this.$.getElectronVersion(), + useCustomDist: true + }, + platform, + arch, + productionDeps + }; + return this.lastRebuild; + } + /** + * Calls npm rebuild from electron-builder. + * @param {string} arch + * @param {string} platform + * @param {boolean} install + * @returns {Promise} + */ + + + async installOrRebuild(arch, platform = process.platform, install = false) { + this.log.debug(`calling installOrRebuild from electron-builder for arch ${arch}`); + this.prepareLastRebuildObject(arch, platform); + await this.yarn.installOrRebuild(this.$.desktop.getSettings().builderOptions || {}, this.$.env.paths.electronApp.root, this.lastRebuild, install); + } + /** + * Callback invoked before build is made. Ensures that app.asar have the right rebuilt + * node_modules. + * + * @param {Object} context + * @returns {Promise} + */ + + + beforeBuild(context) { + this.currentContext = Object.assign({}, context); + return new Promise((resolve, reject) => { + const platformMatches = process.platform === context.platform.nodeName; + const rebuild = platformMatches && context.arch !== this.lastRebuild.arch; + + if (!platformMatches) { + this.log.warn('skipping dependencies rebuild because platform is different, if you have native ' + 'node modules as your app dependencies you should od the build on the target platform only'); + } + + if (!rebuild) { + this.moveNodeModulesOut().catch(e => reject(e)).then(() => setTimeout(() => resolve(false), 2000)); // Timeout helps on Windows to clear the file locks. + } else { + // Lets rebuild the node_modules for different arch. + this.installOrRebuild(context.arch, context.platform.nodeName).catch(e => reject(e)).then(() => this.$.electronApp.installLocalNodeModules(context.arch)).catch(e => reject(e)).then(() => { + this.$.electronApp.scaffold.createAppRoot(); + this.$.electronApp.scaffold.copySkeletonApp(); + return this.$.electronApp.packSkeletonToAsar([this.$.env.paths.electronApp.meteorAsar, this.$.env.paths.electronApp.desktopAsar, this.$.env.paths.electronApp.extracted]); + }).catch(e => reject(e)).then(() => this.moveNodeModulesOut()).catch(e => reject(e)).then(() => resolve(false)); + } + }); + } + /** + * Callback to be invoked after packing. Restores node_modules to the .desktop-build. + * @returns {Promise} + */ + + + afterPack(context) { + this.platforms = this.platforms.filter(platform => platform !== context.electronPlatformName); + + if (this.platforms.length !== 0) { + return Promise.resolve(); + } + + return new Promise((resolve, reject) => { + _shelljs.default.config.fatal = true; + + if (this.$.utils.exists(this.$.env.paths.electronApp.extractedNodeModules)) { + this.log.debug('injecting extracted modules'); + + _shelljs.default.cp('-Rf', this.$.env.paths.electronApp.extractedNodeModules, _path.default.join(this.getPackagedAppPath(context), 'node_modules')); + } + + this.log.debug('moving node_modules back'); // Move node_modules back. + + try { + _shelljs.default.mv(this.$.env.paths.electronApp.tmpNodeModules, this.$.env.paths.electronApp.nodeModules); + } catch (e) { + reject(e); + return; + } finally { + _shelljs.default.config.reset(); + } + + if (this.firstPass) { + this.firstPass = false; + } + + this.log.debug('node_modules moved back'); + this.wait().catch(e => reject(e)).then(() => resolve()); + }); + } + /** + * This command kills orphaned MSBuild.exe processes. + * Sometime after native node_modules compilation they are still writing some logs, + * prevent node_modules from being deleted. + */ + + + killMSBuild() { + if (this.currentContext.platform.nodeName !== 'win32') { + return; + } + + try { + const out = _crossSpawn.default.sync('wmic', ['process', 'where', 'caption="MSBuild.exe"', 'get', 'processid']).stdout.toString('utf-8').split('\n'); + + const regex = new RegExp(/(\d+)/, 'gm'); // No we will check for those with the matching params. + + out.forEach(line => { + const match = regex.exec(line) || false; + + if (match) { + this.log.debug(`killing MSBuild.exe at pid: ${match[1]}`); + + _crossSpawn.default.sync('taskkill', ['/pid', match[1], '/f', '/t']); + } + + regex.lastIndex = 0; + }); + } catch (e) { + this.log.debug('kill MSBuild failed'); + } + } + /** + * Returns the path to packaged app. + * @returns {string} + */ + + + getPackagedAppPath(context = {}) { + if (this.currentContext.platform.nodeName === 'darwin') { + return _path.default.join(this.installerDir, 'mac', `${context.packager.appInfo.productFilename}.app`, 'Contents', 'Resources', 'app'); + } + + const platformDir = `${this.currentContext.platform.nodeName === 'win32' ? 'win' : 'linux'}-${this.currentContext.arch === 'ia32' ? 'ia32-' : ''}unpacked`; + return _path.default.join(this.installerDir, platformDir, 'resources', 'app'); + } + /** + * On Windows it waits for the app.asar in the packed app to be free (no file locks). + * @returns {*} + */ + + + wait() { + if (this.currentContext.platform.nodeName !== 'win32') { + return Promise.resolve(); + } + + const appAsarPath = _path.default.join(this.getPackagedAppPath(), 'app.asar'); + + let retries = 0; + const self = this; + return new Promise((resolve, reject) => { + function check() { + _fs.default.open(appAsarPath, 'r+', (err, fd) => { + retries += 1; + + if (err) { + if (err.code !== 'ENOENT') { + self.log.debug(`waiting for app.asar to be readable, ${'code' in err ? `currently reading it returns ${err.code}` : ''}`); + + if (retries < 6) { + setTimeout(() => check(), 4000); + } else { + reject(`file is locked: ${appAsarPath}`); + } + } else { + resolve(); + } + } else { + _fs.default.closeSync(fd); + + resolve(); + } + }); + } + + check(); + }); + } + /** + * Prepares the target object passed to the electron-builder. + * + * @returns {Map>>} + */ + + + prepareTargets() { + let arch = this.$.env.options.ia32 ? 'ia32' : 'x64'; + arch = this.$.env.options.allArchs ? 'all' : arch; + const targets = []; + + if (this.$.env.options.win) { + targets.push(this.builder.dependency.Platform.WINDOWS); + } + + if (this.$.env.options.linux) { + targets.push(this.builder.dependency.Platform.LINUX); + } + + if (this.$.env.options.mac) { + targets.push(this.builder.dependency.Platform.MAC); + } + + if (targets.length === 0) { + if (this.$.env.os.isWindows) { + targets.push(this.builder.dependency.Platform.WINDOWS); + } else if (this.$.env.os.isLinux) { + targets.push(this.builder.dependency.Platform.LINUX); + } else { + targets.push(this.builder.dependency.Platform.MAC); + } + } + + return this.builder.dependency.createTargets(targets, null, arch); + } + + async build() { + const settings = this.$.desktop.getSettings(); + + if (!('builderOptions' in settings)) { + this.log.error('no builderOptions in settings.json, aborting'); + process.exit(1); + } + + const builderOptions = Object.assign({}, settings.builderOptions); + builderOptions.asar = false; + builderOptions.npmRebuild = true; + builderOptions.beforeBuild = this.beforeBuild.bind(this); + builderOptions.afterPack = this.afterPack.bind(this); + builderOptions.electronVersion = this.$.getElectronVersion(); + builderOptions.directories = { + app: this.$.env.paths.electronApp.root, + output: _path.default.join(this.$.env.options.output, this.$.env.paths.installerDir) + }; + + if ('mac' in builderOptions && 'target' in builderOptions.mac) { + if (builderOptions.mac.target.includes('mas')) { + this.platforms = ['darwin', 'mas']; + } + } + + try { + this.log.debug('calling build from electron-builder'); + await this.builder.dependency.build(Object.assign({ + targets: this.prepareTargets(), + config: builderOptions + }, settings.builderCliOptions)); + + if (this.$.utils.exists(this.$.env.paths.electronApp.extractedNodeModules)) { + _shelljs.default.rm('-rf', this.$.env.paths.electronApp.extractedNodeModules); + } + } catch (e) { + this.log.error('error while building installer: ', e); + } + } + /** + * Moves node_modules out of the app because while the app will be packaged + * we do not want it to be there. + * @returns {Promise} + */ + + + moveNodeModulesOut() { + return new Promise((resolve, reject) => { + this.log.debug('moving node_modules out, because we have them already in' + ' app.asar'); + this.killMSBuild(); + removeDir(this.$.env.paths.electronApp.tmpNodeModules).catch(e => reject(e)).then(() => { + _shelljs.default.config.fatal = true; + _shelljs.default.config.verbose = true; + + try { + _shelljs.default.mv(this.$.env.paths.electronApp.nodeModules, this.$.env.paths.electronApp.tmpNodeModules); + + _shelljs.default.config.reset(); + + return this.wait(); + } catch (e) { + _shelljs.default.config.reset(); + + return Promise.reject(e); + } + }).catch(e => reject(e)).then(() => removeDir(this.$.env.paths.electronApp.nodeModules, 1000)).catch(e => reject(e)).then(() => this.wait()).catch(reject).then(resolve); + }); + } + +} + +exports.default = InstallerBuilder; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZW1vdmVEaXIiLCJkaXJQYXRoIiwiZGVsYXkiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNldFRpbWVvdXQiLCJyaW1yYWYiLCJtYXhCdXN5VHJpZXMiLCJlcnIiLCJJbnN0YWxsZXJCdWlsZGVyIiwiY29uc3RydWN0b3IiLCIkIiwibG9nIiwiTG9nIiwiZmlyc3RQYXNzIiwibGFzdFJlYnVpbGQiLCJjdXJyZW50Q29udGV4dCIsImluc3RhbGxlckRpciIsInBhdGgiLCJqb2luIiwiZW52Iiwib3B0aW9ucyIsIm91dHB1dCIsInBhdGhzIiwicGxhdGZvcm1zIiwiaW5pdCIsImJ1aWxkZXIiLCJnZXREZXBlbmRlbmN5IiwiZGVmYXVsdERlcGVuZGVuY2llcyIsImFwcEJ1aWxkZXIiLCJ5YXJuIiwicmVxdWlyZSIsImdldEd5cEVudiIsInBhY2thZ2VEZXBlbmRlbmNpZXMiLCJwcmVwYXJlTGFzdFJlYnVpbGRPYmplY3QiLCJhcmNoIiwicGxhdGZvcm0iLCJwcm9jZXNzIiwicHJvZHVjdGlvbkRlcHMiLCJjcmVhdGVMYXp5UHJvZHVjdGlvbkRlcHMiLCJlbGVjdHJvbkFwcCIsInJvb3QiLCJmcmFtZXdvcmtJbmZvIiwidmVyc2lvbiIsImdldEVsZWN0cm9uVmVyc2lvbiIsInVzZUN1c3RvbURpc3QiLCJpbnN0YWxsT3JSZWJ1aWxkIiwiaW5zdGFsbCIsImRlYnVnIiwiZGVza3RvcCIsImdldFNldHRpbmdzIiwiYnVpbGRlck9wdGlvbnMiLCJiZWZvcmVCdWlsZCIsImNvbnRleHQiLCJPYmplY3QiLCJhc3NpZ24iLCJwbGF0Zm9ybU1hdGNoZXMiLCJub2RlTmFtZSIsInJlYnVpbGQiLCJ3YXJuIiwibW92ZU5vZGVNb2R1bGVzT3V0IiwiY2F0Y2giLCJlIiwidGhlbiIsImluc3RhbGxMb2NhbE5vZGVNb2R1bGVzIiwic2NhZmZvbGQiLCJjcmVhdGVBcHBSb290IiwiY29weVNrZWxldG9uQXBwIiwicGFja1NrZWxldG9uVG9Bc2FyIiwibWV0ZW9yQXNhciIsImRlc2t0b3BBc2FyIiwiZXh0cmFjdGVkIiwiYWZ0ZXJQYWNrIiwiZmlsdGVyIiwiZWxlY3Ryb25QbGF0Zm9ybU5hbWUiLCJsZW5ndGgiLCJzaGVsbCIsImNvbmZpZyIsImZhdGFsIiwidXRpbHMiLCJleGlzdHMiLCJleHRyYWN0ZWROb2RlTW9kdWxlcyIsImNwIiwiZ2V0UGFja2FnZWRBcHBQYXRoIiwibXYiLCJ0bXBOb2RlTW9kdWxlcyIsIm5vZGVNb2R1bGVzIiwicmVzZXQiLCJ3YWl0Iiwia2lsbE1TQnVpbGQiLCJvdXQiLCJzcGF3biIsInN5bmMiLCJzdGRvdXQiLCJ0b1N0cmluZyIsInNwbGl0IiwicmVnZXgiLCJSZWdFeHAiLCJmb3JFYWNoIiwibGluZSIsIm1hdGNoIiwiZXhlYyIsImxhc3RJbmRleCIsInBhY2thZ2VyIiwiYXBwSW5mbyIsInByb2R1Y3RGaWxlbmFtZSIsInBsYXRmb3JtRGlyIiwiYXBwQXNhclBhdGgiLCJyZXRyaWVzIiwic2VsZiIsImNoZWNrIiwiZnMiLCJvcGVuIiwiZmQiLCJjb2RlIiwiY2xvc2VTeW5jIiwicHJlcGFyZVRhcmdldHMiLCJpYTMyIiwiYWxsQXJjaHMiLCJ0YXJnZXRzIiwid2luIiwicHVzaCIsImRlcGVuZGVuY3kiLCJQbGF0Zm9ybSIsIldJTkRPV1MiLCJsaW51eCIsIkxJTlVYIiwibWFjIiwiTUFDIiwib3MiLCJpc1dpbmRvd3MiLCJpc0xpbnV4IiwiY3JlYXRlVGFyZ2V0cyIsImJ1aWxkIiwic2V0dGluZ3MiLCJlcnJvciIsImV4aXQiLCJhc2FyIiwibnBtUmVidWlsZCIsImJpbmQiLCJlbGVjdHJvblZlcnNpb24iLCJkaXJlY3RvcmllcyIsImFwcCIsInRhcmdldCIsImluY2x1ZGVzIiwiYnVpbGRlckNsaU9wdGlvbnMiLCJybSIsInZlcmJvc2UiXSwic291cmNlcyI6WyIuLi9saWIvZWxlY3Ryb25CdWlsZGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuaW1wb3J0IHJlZ2VuZXJhdG9yUnVudGltZSBmcm9tICdyZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUnO1xuaW1wb3J0IHNoZWxsIGZyb20gJ3NoZWxsanMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHJpbXJhZiBmcm9tICdyaW1yYWYnO1xuaW1wb3J0IHNwYXduIGZyb20gJ2Nyb3NzLXNwYXduJztcbmltcG9ydCBMb2cgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IGRlZmF1bHREZXBlbmRlbmNpZXMgZnJvbSAnLi9kZWZhdWx0RGVwZW5kZW5jaWVzJztcblxuLyoqXG4gKiBQcm9taXNmaWVkIHJpbXJhZi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyUGF0aCAtIHBhdGggdG8gdGhlIGRpciB0byBiZSBkZWxldGVkXG4gKiBAcGFyYW0ge251bWJlcn0gZGVsYXkgLSBkZWxheSB0aGUgdGFzayBieSBtc1xuICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlRGlyKGRpclBhdGgsIGRlbGF5ID0gMCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgcmltcmFmKGRpclBhdGgsIHtcbiAgICAgICAgICAgICAgICBtYXhCdXN5VHJpZXM6IDEwMFxuICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBkZWxheSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogV3JhcHBlciBmb3IgZWxlY3Ryb24tYnVpbGRlci5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW5zdGFsbGVyQnVpbGRlciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNZXRlb3JEZXNrdG9wfSAkIC0gY29udGV4dFxuICAgICAqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoJCkge1xuICAgICAgICB0aGlzLmxvZyA9IG5ldyBMb2coJ2VsZWN0cm9uQnVpbGRlcicpO1xuICAgICAgICB0aGlzLiQgPSAkO1xuICAgICAgICB0aGlzLmZpcnN0UGFzcyA9IHRydWU7XG4gICAgICAgIHRoaXMubGFzdFJlYnVpbGQgPSB7fTtcbiAgICAgICAgdGhpcy5jdXJyZW50Q29udGV4dCA9IG51bGw7XG4gICAgICAgIHRoaXMuaW5zdGFsbGVyRGlyID0gcGF0aC5qb2luKHRoaXMuJC5lbnYub3B0aW9ucy5vdXRwdXQsIHRoaXMuJC5lbnYucGF0aHMuaW5zdGFsbGVyRGlyKTtcbiAgICAgICAgdGhpcy5wbGF0Zm9ybXMgPSBbXTtcbiAgICB9XG5cbiAgICBhc3luYyBpbml0KCkge1xuICAgICAgICB0aGlzLmJ1aWxkZXIgPSBhd2FpdCB0aGlzLiQuZ2V0RGVwZW5kZW5jeSgnZWxlY3Ryb24tYnVpbGRlcicsIGRlZmF1bHREZXBlbmRlbmNpZXNbJ2VsZWN0cm9uLWJ1aWxkZXInXSk7XG4gICAgICAgIGNvbnN0IGFwcEJ1aWxkZXIgPSBhd2FpdCB0aGlzLiQuZ2V0RGVwZW5kZW5jeSgnYXBwLWJ1aWxkZXItbGliJywgZGVmYXVsdERlcGVuZGVuY2llc1snZWxlY3Ryb24tYnVpbGRlciddLCBmYWxzZSk7XG5cbiAgICAgICAgdGhpcy55YXJuID0gcmVxdWlyZShwYXRoLmpvaW4oYXBwQnVpbGRlci5wYXRoLCAnb3V0JywgJ3V0aWwnLCAneWFybicpKTtcbiAgICAgICAgdGhpcy5nZXRHeXBFbnYgPSB0aGlzLnlhcm4uZ2V0R3lwRW52O1xuICAgICAgICB0aGlzLnBhY2thZ2VEZXBlbmRlbmNpZXMgPSByZXF1aXJlKHBhdGguam9pbihhcHBCdWlsZGVyLnBhdGgsICdvdXQnLCAndXRpbCcsICdwYWNrYWdlRGVwZW5kZW5jaWVzJykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZXBhcmVzIHRoZSBsYXN0IHJlYnVpbGQgb2JqZWN0IGZvciBlbGVjdHJvbi1idWlsZGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFyY2hcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGxhdGZvcm1cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHByZXBhcmVMYXN0UmVidWlsZE9iamVjdChhcmNoLCBwbGF0Zm9ybSA9IHByb2Nlc3MucGxhdGZvcm0pIHtcbiAgICAgICAgY29uc3QgcHJvZHVjdGlvbkRlcHMgPSB0aGlzLnBhY2thZ2VEZXBlbmRlbmNpZXNcbiAgICAgICAgICAgIC5jcmVhdGVMYXp5UHJvZHVjdGlvbkRlcHModGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5yb290KTtcbiAgICAgICAgdGhpcy5sYXN0UmVidWlsZCA9IHtcbiAgICAgICAgICAgIGZyYW1ld29ya0luZm86IHsgdmVyc2lvbjogdGhpcy4kLmdldEVsZWN0cm9uVmVyc2lvbigpLCB1c2VDdXN0b21EaXN0OiB0cnVlIH0sXG4gICAgICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgICAgIGFyY2gsXG4gICAgICAgICAgICBwcm9kdWN0aW9uRGVwc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5sYXN0UmVidWlsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxscyBucG0gcmVidWlsZCBmcm9tIGVsZWN0cm9uLWJ1aWxkZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFyY2hcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGxhdGZvcm1cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluc3RhbGxcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBhc3luYyBpbnN0YWxsT3JSZWJ1aWxkKGFyY2gsIHBsYXRmb3JtID0gcHJvY2Vzcy5wbGF0Zm9ybSwgaW5zdGFsbCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBjYWxsaW5nIGluc3RhbGxPclJlYnVpbGQgZnJvbSBlbGVjdHJvbi1idWlsZGVyIGZvciBhcmNoICR7YXJjaH1gKTtcbiAgICAgICAgdGhpcy5wcmVwYXJlTGFzdFJlYnVpbGRPYmplY3QoYXJjaCwgcGxhdGZvcm0pO1xuICAgICAgICBhd2FpdCB0aGlzLnlhcm4uaW5zdGFsbE9yUmVidWlsZCh0aGlzLiQuZGVza3RvcC5nZXRTZXR0aW5ncygpLmJ1aWxkZXJPcHRpb25zIHx8IHt9LFxuICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5yb290LCB0aGlzLmxhc3RSZWJ1aWxkLCBpbnN0YWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayBpbnZva2VkIGJlZm9yZSBidWlsZCBpcyBtYWRlLiBFbnN1cmVzIHRoYXQgYXBwLmFzYXIgaGF2ZSB0aGUgcmlnaHQgcmVidWlsdFxuICAgICAqIG5vZGVfbW9kdWxlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0XG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgYmVmb3JlQnVpbGQoY29udGV4dCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRDb250ZXh0ID0gT2JqZWN0LmFzc2lnbih7fSwgY29udGV4dCk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwbGF0Zm9ybU1hdGNoZXMgPSBwcm9jZXNzLnBsYXRmb3JtID09PSBjb250ZXh0LnBsYXRmb3JtLm5vZGVOYW1lO1xuICAgICAgICAgICAgY29uc3QgcmVidWlsZCA9IHBsYXRmb3JtTWF0Y2hlcyAmJiBjb250ZXh0LmFyY2ggIT09IHRoaXMubGFzdFJlYnVpbGQuYXJjaDtcbiAgICAgICAgICAgIGlmICghcGxhdGZvcm1NYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cud2Fybignc2tpcHBpbmcgZGVwZW5kZW5jaWVzIHJlYnVpbGQgYmVjYXVzZSBwbGF0Zm9ybSBpcyBkaWZmZXJlbnQsIGlmIHlvdSBoYXZlIG5hdGl2ZSAnICtcbiAgICAgICAgICAgICAgICAgICAgJ25vZGUgbW9kdWxlcyBhcyB5b3VyIGFwcCBkZXBlbmRlbmNpZXMgeW91IHNob3VsZCBvZCB0aGUgYnVpbGQgb24gdGhlIHRhcmdldCBwbGF0Zm9ybSBvbmx5Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghcmVidWlsZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubW92ZU5vZGVNb2R1bGVzT3V0KClcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGUgPT4gcmVqZWN0KGUpKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoZmFsc2UpLCAyMDAwKSk7XG4gICAgICAgICAgICAgICAgLy8gVGltZW91dCBoZWxwcyBvbiBXaW5kb3dzIHRvIGNsZWFyIHRoZSBmaWxlIGxvY2tzLlxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBMZXRzIHJlYnVpbGQgdGhlIG5vZGVfbW9kdWxlcyBmb3IgZGlmZmVyZW50IGFyY2guXG4gICAgICAgICAgICAgICAgdGhpcy5pbnN0YWxsT3JSZWJ1aWxkKGNvbnRleHQuYXJjaCwgY29udGV4dC5wbGF0Zm9ybS5ub2RlTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGUgPT4gcmVqZWN0KGUpKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLiQuZWxlY3Ryb25BcHAuaW5zdGFsbExvY2FsTm9kZU1vZHVsZXMoY29udGV4dC5hcmNoKSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGUgPT4gcmVqZWN0KGUpKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQuZWxlY3Ryb25BcHAuc2NhZmZvbGQuY3JlYXRlQXBwUm9vdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kLmVsZWN0cm9uQXBwLnNjYWZmb2xkLmNvcHlTa2VsZXRvbkFwcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJC5lbGVjdHJvbkFwcC5wYWNrU2tlbGV0b25Ub0FzYXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLm1ldGVvckFzYXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuZGVza3RvcEFzYXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuZXh0cmFjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGUgPT4gcmVqZWN0KGUpKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLm1vdmVOb2RlTW9kdWxlc091dCgpKVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZSA9PiByZWplY3QoZSkpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHJlc29sdmUoZmFsc2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgdG8gYmUgaW52b2tlZCBhZnRlciBwYWNraW5nLiBSZXN0b3JlcyBub2RlX21vZHVsZXMgdG8gdGhlIC5kZXNrdG9wLWJ1aWxkLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGFmdGVyUGFjayhjb250ZXh0KSB7XG4gICAgICAgIHRoaXMucGxhdGZvcm1zID0gdGhpcy5wbGF0Zm9ybXNcbiAgICAgICAgICAgIC5maWx0ZXIocGxhdGZvcm0gPT4gcGxhdGZvcm0gIT09IGNvbnRleHQuZWxlY3Ryb25QbGF0Zm9ybU5hbWUpO1xuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHNoZWxsLmNvbmZpZy5mYXRhbCA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLiQudXRpbHMuZXhpc3RzKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuZXh0cmFjdGVkTm9kZU1vZHVsZXMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoJ2luamVjdGluZyBleHRyYWN0ZWQgbW9kdWxlcycpO1xuICAgICAgICAgICAgICAgIHNoZWxsLmNwKFxuICAgICAgICAgICAgICAgICAgICAnLVJmJyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5leHRyYWN0ZWROb2RlTW9kdWxlcyxcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMuZ2V0UGFja2FnZWRBcHBQYXRoKGNvbnRleHQpLCAnbm9kZV9tb2R1bGVzJylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZygnbW92aW5nIG5vZGVfbW9kdWxlcyBiYWNrJyk7XG4gICAgICAgICAgICAvLyBNb3ZlIG5vZGVfbW9kdWxlcyBiYWNrLlxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHNoZWxsLm12KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnRtcE5vZGVNb2R1bGVzLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLm5vZGVNb2R1bGVzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBzaGVsbC5jb25maWcucmVzZXQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZmlyc3RQYXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdFBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKCdub2RlX21vZHVsZXMgbW92ZWQgYmFjaycpO1xuXG4gICAgICAgICAgICB0aGlzLndhaXQoKVxuICAgICAgICAgICAgICAgIC5jYXRjaChlID0+IHJlamVjdChlKSlcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiByZXNvbHZlKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGNvbW1hbmQga2lsbHMgb3JwaGFuZWQgTVNCdWlsZC5leGUgcHJvY2Vzc2VzLlxuICAgICAqIFNvbWV0aW1lIGFmdGVyIG5hdGl2ZSBub2RlX21vZHVsZXMgY29tcGlsYXRpb24gdGhleSBhcmUgc3RpbGwgd3JpdGluZyBzb21lIGxvZ3MsXG4gICAgICogcHJldmVudCBub2RlX21vZHVsZXMgZnJvbSBiZWluZyBkZWxldGVkLlxuICAgICAqL1xuICAgIGtpbGxNU0J1aWxkKCkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q29udGV4dC5wbGF0Zm9ybS5ub2RlTmFtZSAhPT0gJ3dpbjMyJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBvdXQgPSBzcGF3blxuICAgICAgICAgICAgICAgIC5zeW5jKFxuICAgICAgICAgICAgICAgICAgICAnd21pYycsXG4gICAgICAgICAgICAgICAgICAgIFsncHJvY2VzcycsICd3aGVyZScsICdjYXB0aW9uPVwiTVNCdWlsZC5leGVcIicsICdnZXQnLCAncHJvY2Vzc2lkJ11cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN0ZG91dC50b1N0cmluZygndXRmLTgnKVxuICAgICAgICAgICAgICAgIC5zcGxpdCgnXFxuJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cCgvKFxcZCspLywgJ2dtJyk7XG4gICAgICAgICAgICAvLyBObyB3ZSB3aWxsIGNoZWNrIGZvciB0aG9zZSB3aXRoIHRoZSBtYXRjaGluZyBwYXJhbXMuXG4gICAgICAgICAgICBvdXQuZm9yRWFjaCgobGluZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gcmVnZXguZXhlYyhsaW5lKSB8fCBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoYGtpbGxpbmcgTVNCdWlsZC5leGUgYXQgcGlkOiAke21hdGNoWzFdfWApO1xuICAgICAgICAgICAgICAgICAgICBzcGF3bi5zeW5jKCd0YXNra2lsbCcsIFsnL3BpZCcsIG1hdGNoWzFdLCAnL2YnLCAnL3QnXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlZ2V4Lmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoJ2tpbGwgTVNCdWlsZCBmYWlsZWQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHBhdGggdG8gcGFja2FnZWQgYXBwLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0UGFja2FnZWRBcHBQYXRoKGNvbnRleHQgPSB7fSkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q29udGV4dC5wbGF0Zm9ybS5ub2RlTmFtZSA9PT0gJ2RhcndpbicpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgdGhpcy5pbnN0YWxsZXJEaXIsXG4gICAgICAgICAgICAgICAgJ21hYycsXG4gICAgICAgICAgICAgICAgYCR7Y29udGV4dC5wYWNrYWdlci5hcHBJbmZvLnByb2R1Y3RGaWxlbmFtZX0uYXBwYCxcbiAgICAgICAgICAgICAgICAnQ29udGVudHMnLCAnUmVzb3VyY2VzJywgJ2FwcCdcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGxhdGZvcm1EaXIgPVxuICAgICAgICAgICAgYCR7dGhpcy5jdXJyZW50Q29udGV4dC5wbGF0Zm9ybS5ub2RlTmFtZSA9PT0gJ3dpbjMyJyA/ICd3aW4nIDogJ2xpbnV4J30tJHt0aGlzLmN1cnJlbnRDb250ZXh0LmFyY2ggPT09ICdpYTMyJyA/ICdpYTMyLScgOiAnJ311bnBhY2tlZGA7XG4gICAgICAgIHJldHVybiBwYXRoLmpvaW4oXG4gICAgICAgICAgICB0aGlzLmluc3RhbGxlckRpcixcbiAgICAgICAgICAgIHBsYXRmb3JtRGlyLFxuICAgICAgICAgICAgJ3Jlc291cmNlcycsICdhcHAnXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT24gV2luZG93cyBpdCB3YWl0cyBmb3IgdGhlIGFwcC5hc2FyIGluIHRoZSBwYWNrZWQgYXBwIHRvIGJlIGZyZWUgKG5vIGZpbGUgbG9ja3MpLlxuICAgICAqIEByZXR1cm5zIHsqfVxuICAgICAqL1xuICAgIHdhaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDb250ZXh0LnBsYXRmb3JtLm5vZGVOYW1lICE9PSAnd2luMzInKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBwQXNhclBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICB0aGlzLmdldFBhY2thZ2VkQXBwUGF0aCgpLFxuICAgICAgICAgICAgJ2FwcC5hc2FyJ1xuICAgICAgICApO1xuICAgICAgICBsZXQgcmV0cmllcyA9IDA7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgZnVuY3Rpb24gY2hlY2soKSB7XG4gICAgICAgICAgICAgICAgZnMub3BlbihhcHBBc2FyUGF0aCwgJ3IrJywgKGVyciwgZmQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0cmllcyArPSAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZGVidWcoYHdhaXRpbmcgZm9yIGFwcC5hc2FyIHRvIGJlIHJlYWRhYmxlLCAkeydjb2RlJyBpbiBlcnIgPyBgY3VycmVudGx5IHJlYWRpbmcgaXQgcmV0dXJucyAke2Vyci5jb2RlfWAgOiAnJ31gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0cmllcyA8IDYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBjaGVjaygpLCA0MDAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoYGZpbGUgaXMgbG9ja2VkOiAke2FwcEFzYXJQYXRofWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnMuY2xvc2VTeW5jKGZkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2hlY2soKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJlcGFyZXMgdGhlIHRhcmdldCBvYmplY3QgcGFzc2VkIHRvIHRoZSBlbGVjdHJvbi1idWlsZGVyLlxuICAgICAqXG4gICAgICogQHJldHVybnMge01hcDxQbGF0Zm9ybSwgTWFwPEFyY2gsIEFycmF5PHN0cmluZz4+Pn1cbiAgICAgKi9cbiAgICBwcmVwYXJlVGFyZ2V0cygpIHtcbiAgICAgICAgbGV0IGFyY2ggPSB0aGlzLiQuZW52Lm9wdGlvbnMuaWEzMiA/ICdpYTMyJyA6ICd4NjQnO1xuICAgICAgICBhcmNoID0gdGhpcy4kLmVudi5vcHRpb25zLmFsbEFyY2hzID8gJ2FsbCcgOiBhcmNoO1xuXG4gICAgICAgIGNvbnN0IHRhcmdldHMgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy4kLmVudi5vcHRpb25zLndpbikge1xuICAgICAgICAgICAgdGFyZ2V0cy5wdXNoKHRoaXMuYnVpbGRlci5kZXBlbmRlbmN5LlBsYXRmb3JtLldJTkRPV1MpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiQuZW52Lm9wdGlvbnMubGludXgpIHtcbiAgICAgICAgICAgIHRhcmdldHMucHVzaCh0aGlzLmJ1aWxkZXIuZGVwZW5kZW5jeS5QbGF0Zm9ybS5MSU5VWCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuJC5lbnYub3B0aW9ucy5tYWMpIHtcbiAgICAgICAgICAgIHRhcmdldHMucHVzaCh0aGlzLmJ1aWxkZXIuZGVwZW5kZW5jeS5QbGF0Zm9ybS5NQUMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4kLmVudi5vcy5pc1dpbmRvd3MpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRzLnB1c2godGhpcy5idWlsZGVyLmRlcGVuZGVuY3kuUGxhdGZvcm0uV0lORE9XUyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuJC5lbnYub3MuaXNMaW51eCkge1xuICAgICAgICAgICAgICAgIHRhcmdldHMucHVzaCh0aGlzLmJ1aWxkZXIuZGVwZW5kZW5jeS5QbGF0Zm9ybS5MSU5VWCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldHMucHVzaCh0aGlzLmJ1aWxkZXIuZGVwZW5kZW5jeS5QbGF0Zm9ybS5NQUMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkZXIuZGVwZW5kZW5jeS5jcmVhdGVUYXJnZXRzKHRhcmdldHMsIG51bGwsIGFyY2gpO1xuICAgIH1cblxuICAgIGFzeW5jIGJ1aWxkKCkge1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuJC5kZXNrdG9wLmdldFNldHRpbmdzKCk7XG4gICAgICAgIGlmICghKCdidWlsZGVyT3B0aW9ucycgaW4gc2V0dGluZ3MpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihcbiAgICAgICAgICAgICAgICAnbm8gYnVpbGRlck9wdGlvbnMgaW4gc2V0dGluZ3MuanNvbiwgYWJvcnRpbmcnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnVpbGRlck9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBzZXR0aW5ncy5idWlsZGVyT3B0aW9ucyk7XG5cbiAgICAgICAgYnVpbGRlck9wdGlvbnMuYXNhciA9IGZhbHNlO1xuICAgICAgICBidWlsZGVyT3B0aW9ucy5ucG1SZWJ1aWxkID0gdHJ1ZTtcblxuICAgICAgICBidWlsZGVyT3B0aW9ucy5iZWZvcmVCdWlsZCA9IHRoaXMuYmVmb3JlQnVpbGQuYmluZCh0aGlzKTtcbiAgICAgICAgYnVpbGRlck9wdGlvbnMuYWZ0ZXJQYWNrID0gdGhpcy5hZnRlclBhY2suYmluZCh0aGlzKTtcbiAgICAgICAgYnVpbGRlck9wdGlvbnMuZWxlY3Ryb25WZXJzaW9uID0gdGhpcy4kLmdldEVsZWN0cm9uVmVyc2lvbigpO1xuXG4gICAgICAgIGJ1aWxkZXJPcHRpb25zLmRpcmVjdG9yaWVzID0ge1xuICAgICAgICAgICAgYXBwOiB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnJvb3QsXG4gICAgICAgICAgICBvdXRwdXQ6IHBhdGguam9pbih0aGlzLiQuZW52Lm9wdGlvbnMub3V0cHV0LCB0aGlzLiQuZW52LnBhdGhzLmluc3RhbGxlckRpcilcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoJ21hYycgaW4gYnVpbGRlck9wdGlvbnMgJiYgJ3RhcmdldCcgaW4gYnVpbGRlck9wdGlvbnMubWFjKSB7XG4gICAgICAgICAgICBpZiAoYnVpbGRlck9wdGlvbnMubWFjLnRhcmdldC5pbmNsdWRlcygnbWFzJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXRmb3JtcyA9IFsnZGFyd2luJywgJ21hcyddO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKCdjYWxsaW5nIGJ1aWxkIGZyb20gZWxlY3Ryb24tYnVpbGRlcicpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5idWlsZGVyLmRlcGVuZGVuY3kuYnVpbGQoT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAgICAgdGFyZ2V0czogdGhpcy5wcmVwYXJlVGFyZ2V0cygpLFxuICAgICAgICAgICAgICAgIGNvbmZpZzogYnVpbGRlck9wdGlvbnNcbiAgICAgICAgICAgIH0sIHNldHRpbmdzLmJ1aWxkZXJDbGlPcHRpb25zKSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLiQudXRpbHMuZXhpc3RzKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuZXh0cmFjdGVkTm9kZU1vZHVsZXMpKSB7XG4gICAgICAgICAgICAgICAgc2hlbGwucm0oJy1yZicsIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuZXh0cmFjdGVkTm9kZU1vZHVsZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igd2hpbGUgYnVpbGRpbmcgaW5zdGFsbGVyOiAnLCBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIG5vZGVfbW9kdWxlcyBvdXQgb2YgdGhlIGFwcCBiZWNhdXNlIHdoaWxlIHRoZSBhcHAgd2lsbCBiZSBwYWNrYWdlZFxuICAgICAqIHdlIGRvIG5vdCB3YW50IGl0IHRvIGJlIHRoZXJlLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAgICovXG4gICAgbW92ZU5vZGVNb2R1bGVzT3V0KCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoJ21vdmluZyBub2RlX21vZHVsZXMgb3V0LCBiZWNhdXNlIHdlIGhhdmUgdGhlbSBhbHJlYWR5IGluJyArXG4gICAgICAgICAgICAgICAgJyBhcHAuYXNhcicpO1xuICAgICAgICAgICAgdGhpcy5raWxsTVNCdWlsZCgpO1xuICAgICAgICAgICAgcmVtb3ZlRGlyKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAudG1wTm9kZU1vZHVsZXMpXG4gICAgICAgICAgICAgICAgLmNhdGNoKGUgPT4gcmVqZWN0KGUpKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2hlbGwuY29uZmlnLmZhdGFsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgc2hlbGwuY29uZmlnLnZlcmJvc2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hlbGwubXYoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5ub2RlTW9kdWxlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnRtcE5vZGVNb2R1bGVzXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hlbGwuY29uZmlnLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53YWl0KCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoZWxsLmNvbmZpZy5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZSA9PiByZWplY3QoZSkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gcmVtb3ZlRGlyKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubm9kZU1vZHVsZXMsIDEwMDApKVxuICAgICAgICAgICAgICAgIC5jYXRjaChlID0+IHJlamVjdChlKSlcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLndhaXQoKSlcbiAgICAgICAgICAgICAgICAuY2F0Y2gocmVqZWN0KVxuICAgICAgICAgICAgICAgIC50aGVuKHJlc29sdmUpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQVJBOztBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsU0FBVCxDQUFtQkMsT0FBbkIsRUFBNEJDLEtBQUssR0FBRyxDQUFwQyxFQUF1QztFQUNuQyxPQUFPLElBQUlDLE9BQUosQ0FBWSxDQUFDQyxPQUFELEVBQVVDLE1BQVYsS0FBcUI7SUFDcENDLFVBQVUsQ0FBQyxNQUFNO01BQ2IsSUFBQUMsZUFBQSxFQUFPTixPQUFQLEVBQWdCO1FBQ1pPLFlBQVksRUFBRTtNQURGLENBQWhCLEVBRUlDLEdBQUQsSUFBUztRQUNSLElBQUlBLEdBQUosRUFBUztVQUNMSixNQUFNLENBQUNJLEdBQUQsQ0FBTjtRQUNILENBRkQsTUFFTztVQUNITCxPQUFPO1FBQ1Y7TUFDSixDQVJEO0lBU0gsQ0FWUyxFQVVQRixLQVZPLENBQVY7RUFXSCxDQVpNLENBQVA7QUFhSDtBQUVEO0FBQ0E7QUFDQTs7O0FBQ2UsTUFBTVEsZ0JBQU4sQ0FBdUI7RUFDbEM7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUNJQyxXQUFXLENBQUNDLENBQUQsRUFBSTtJQUNYLEtBQUtDLEdBQUwsR0FBVyxJQUFJQyxZQUFKLENBQVEsaUJBQVIsQ0FBWDtJQUNBLEtBQUtGLENBQUwsR0FBU0EsQ0FBVDtJQUNBLEtBQUtHLFNBQUwsR0FBaUIsSUFBakI7SUFDQSxLQUFLQyxXQUFMLEdBQW1CLEVBQW5CO0lBQ0EsS0FBS0MsY0FBTCxHQUFzQixJQUF0QjtJQUNBLEtBQUtDLFlBQUwsR0FBb0JDLGFBQUEsQ0FBS0MsSUFBTCxDQUFVLEtBQUtSLENBQUwsQ0FBT1MsR0FBUCxDQUFXQyxPQUFYLENBQW1C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 \ No newline at end of file diff --git a/dist/env.js b/dist/env.js new file mode 100644 index 00000000..8f8fd133 --- /dev/null +++ b/dist/env.js @@ -0,0 +1,239 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _path = _interopRequireDefault(require("path")); + +var _os = _interopRequireDefault(require("os")); + +var _assignIn = _interopRequireDefault(require("lodash/assignIn")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const { + join +} = _path.default; +/** + * @class + * @property {packagePaths} paths + */ + +class Env { + constructor(input, output, options) { + this.options = options; + + if (this.isProductionBuild()) { + process.env.NODE_ENV = 'production'; + } + + this.sys = { + platform: process.platform, + arch: process.arch + }; // Operational System. + + this.os = { + isWindows: process.platform === 'win32', + isLinux: process.platform === 'linux', + isOsx: process.platform === 'darwin' + }; + this.stdio = 'inherit'; + this.os.name = this.sys.platform === 'darwin' ? 'osx' : this.sys.platform; + this.os.home = process.env[this.os.isWindows ? 'USERPROFILE' : 'HOME']; + this.os.tmp = _os.default.tmpdir(); + /** @type {packagePaths} */ + + this.paths = {}; + /** @type {meteorDesktopPaths} */ + + this.paths.meteorDesktop = { + root: _path.default.resolve(__dirname, '..') + }; + this.paths.meteorDesktop.skeleton = join(this.paths.meteorDesktop.root, 'skeleton'); + /** @type {meteorAppPaths} */ + + this.paths.meteorApp = { + root: input + }; + /** @type {desktopPaths} */ + + this.paths.desktop = { + rootName: '.desktop', + root: join(this.paths.meteorApp.root, '.desktop') + }; + (0, _assignIn.default)(this.paths.desktop, { + modules: join(this.paths.desktop.root, 'modules'), + import: join(this.paths.desktop.root, 'import'), + assets: join(this.paths.desktop.root, 'assets'), + settings: join(this.paths.desktop.root, 'settings.json'), + desktop: join(this.paths.desktop.root, 'desktop.js') + }); + this.paths.desktop.splashScreen = join(this.paths.desktop.assets, 'splashScreen.png'); + this.paths.desktop.loadingGif = join(this.paths.desktop.assets, 'loading.gif'); + this.paths.desktop.meteorIco = join(this.paths.desktop.assets, 'meteor.ico'); + /** @type {electronAppPaths} */ + + this.paths.electronApp = { + rootName: 'desktop-build' + }; + this.paths.electronApp.root = join(this.paths.meteorApp.root, '.meteor', this.paths.electronApp.rootName); + this.paths.electronApp.tmpNodeModules = join(this.paths.meteorApp.root, '.meteor', '.desktop_node_modules'); + this.paths.cache = join(this.paths.meteorApp.root, '.meteor', 'local', 'desktop-cache'); + this.paths.electronApp.extractedNodeModules = join(this.paths.meteorApp.root, '.meteor', '.desktop_extracted_node_modules'); + this.paths.electronApp.extractedNodeModulesBin = join(this.paths.electronApp.extractedNodeModules, '.bin'); + this.paths.electronApp.appRoot = join(this.paths.electronApp.root, 'app'); + (0, _assignIn.default)(this.paths.electronApp, { + app: join(this.paths.electronApp.appRoot, 'app.js'), + cordova: join(this.paths.electronApp.appRoot, 'cordova.js'), + index: join(this.paths.electronApp.appRoot, 'index.js'), + preload: join(this.paths.electronApp.appRoot, 'preload.js'), + modules: join(this.paths.electronApp.appRoot, 'modules'), + desktopAsar: join(this.paths.electronApp.root, 'desktop.asar'), + extracted: join(this.paths.electronApp.root, 'extracted'), + appAsar: join(this.paths.electronApp.root, 'app.asar'), + import: join(this.paths.electronApp.root, 'import'), + assets: join(this.paths.electronApp.root, 'assets'), + packageJson: join(this.paths.electronApp.root, 'package.json'), + settings: join(this.paths.electronApp.root, 'settings.json'), + desktop: join(this.paths.electronApp.root, 'desktop.js'), + desktopTmp: join(this.paths.electronApp.root, '__desktop'), + nodeModules: join(this.paths.electronApp.root, 'node_modules'), + meteorAsar: join(this.paths.electronApp.root, 'meteor.asar'), + meteorApp: join(this.paths.electronApp.root, 'meteor'), + meteorAppIndex: join(this.paths.electronApp.root, 'meteor', 'index.html'), + meteorAppProgramJson: join(this.paths.electronApp.root, 'meteor', 'program.json'), + skeleton: join(this.paths.electronApp.root, 'skeleton') + }); + (0, _assignIn.default)(this.paths.meteorApp, { + platforms: join(this.paths.meteorApp.root, '.meteor', 'platforms'), + packages: join(this.paths.meteorApp.root, '.meteor', 'packages'), + versions: join(this.paths.meteorApp.root, '.meteor', 'versions'), + release: join(this.paths.meteorApp.root, '.meteor', 'release'), + packageJson: join(this.paths.meteorApp.root, 'package.json'), + gitIgnore: join(this.paths.meteorApp.root, '.meteor', '.gitignore'), + cordovaBuild: join(this.paths.meteorApp.root, '.meteor', 'local', 'cordova-build', 'www', 'application'), + webCordova: join(this.paths.meteorApp.root, '.meteor', 'local', 'build', 'programs', 'web.cordova') + }); + (0, _assignIn.default)(this.paths.meteorApp, { + cordovaBuildIndex: join(this.paths.meteorApp.cordovaBuild, 'index.html'), + cordovaBuildProgramJson: join(this.paths.meteorApp.cordovaBuild, 'program.json') + }); + (0, _assignIn.default)(this.paths.meteorApp, { + webCordovaProgramJson: join(this.paths.meteorApp.webCordova, 'program.json') + }); + /** @type {desktopTmpPaths} */ + + this.paths.desktopTmp = { + root: join(this.paths.electronApp.root, '__desktop') + }; + (0, _assignIn.default)(this.paths.desktopTmp, { + modules: join(this.paths.desktopTmp.root, 'modules'), + settings: join(this.paths.desktopTmp.root, 'settings.json') + }); + this.paths.packageDir = '.desktop-package'; + this.paths.installerDir = '.desktop-installer'; // Scaffold + + this.paths.scaffold = join(__dirname, '..', 'scaffold'); + } + /** + * @returns {boolean|*} + * @public + */ + + + isProductionBuild() { + return !!('production' in this.options && this.options.production); + } + +} + +exports.default = Env; +module.exports = Env; +/** + * @typedef {Object} desktopPaths + * @property {string} rootName + * @property {string} root + * @property {string} modules + * @property {string} import + * @property {string} assets + * @property {string} settings + * @property {string} desktop + * @property {string} splashScreen + * @property {string} loadingGif + * @property {string} meteorIco + */ + +/** + * @typedef {Object} meteorAppPaths + * @property {string} root + * @property {string} platforms + * @property {string} release + * @property {string} packages + * @property {string} versions + * @property {string} gitIgnore + * @property {string} packageJson + * @property {string} cordovaBuild + * @property {string} cordovaBuildIndex + * @property {string} cordovaBuildProgramJson + * @property {string} webCordova + * @property {string} webCordovaIndex + * @property {string} webCordovaProgramJson + */ + +/** + * @typedef {Object} electronAppPaths + * @property {string} rootName + * @property {string} root + * @property {Object} appRoot + * @property {string} appRoot.cordova + * @property {string} appRoot.index + * @property {string} appRoot.app + * @property {string} appRoot.modules + * @property {string} desktopAsar + * @property {string} extracted + * @property {string} appAsar + * @property {string} preload + * @property {string} import + * @property {string} assets + * @property {string} gitIgnore + * @property {string} packageJson + * @property {string} settings + * @property {string} desktop + * @property {string} desktopTmp + * @property {string} nodeModules + * @property {string} meteorAsar + * @property {string} meteorApp + * @property {string} meteorAppIndex + * @property {string} meteorAppProgramJson + * @property {string} skeleton + * @property {string} tmpNodeModules + * @property {string} extractedNodeModules + * @property {string} extractedNodeModulesBin + */ + +/** + * @typedef {Object} desktopTmpPaths + * @property {string} root + * @property {string} modules + * @property {string} settings + */ + +/** + * @typedef {Object} meteorDesktopPaths + * @property {string} root + * @property {string} skeleton + */ + +/** + * @typedef {Object} packagePaths + * @property {meteorAppPaths} meteorApp + * @property {desktopPaths} desktop + * @property {electronAppPaths} electronApp + * @property {desktopTmpPaths} desktopTmp + * @property {meteorDesktopPaths} meteorDesktop + * @property {string} packageDir + * @property {string} scaffold + */ +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJqb2luIiwicGF0aCIsIkVudiIsImNvbnN0cnVjdG9yIiwiaW5wdXQiLCJvdXRwdXQiLCJvcHRpb25zIiwiaXNQcm9kdWN0aW9uQnVpbGQiLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJzeXMiLCJwbGF0Zm9ybSIsImFyY2giLCJvcyIsImlzV2luZG93cyIsImlzTGludXgiLCJpc09zeCIsInN0ZGlvIiwibmFtZSIsImhvbWUiLCJ0bXAiLCJ0bXBkaXIiLCJwYXRocyIsIm1ldGVvckRlc2t0b3AiLCJyb290IiwicmVzb2x2ZSIsIl9fZGlybmFtZSIsInNrZWxldG9uIiwibWV0ZW9yQXBwIiwiZGVza3RvcCIsInJvb3ROYW1lIiwiYXNzaWduSW4iLCJtb2R1bGVzIiwiaW1wb3J0IiwiYXNzZXRzIiwic2V0dGluZ3MiLCJzcGxhc2hTY3JlZW4iLCJsb2FkaW5nR2lmIiwibWV0ZW9ySWNvIiwiZWxlY3Ryb25BcHAiLCJ0bXBOb2RlTW9kdWxlcyIsImNhY2hlIiwiZXh0cmFjdGVkTm9kZU1vZHVsZXMiLCJleHRyYWN0ZWROb2RlTW9kdWxlc0JpbiIsImFwcFJvb3QiLCJhcHAiLCJjb3Jkb3ZhIiwiaW5kZXgiLCJwcmVsb2FkIiwiZGVza3RvcEFzYXIiLCJleHRyYWN0ZWQiLCJhcHBBc2FyIiwicGFja2FnZUpzb24iLCJkZXNrdG9wVG1wIiwibm9kZU1vZHVsZXMiLCJtZXRlb3JBc2FyIiwibWV0ZW9yQXBwSW5kZXgiLCJtZXRlb3JBcHBQcm9ncmFtSnNvbiIsInBsYXRmb3JtcyIsInBhY2thZ2VzIiwidmVyc2lvbnMiLCJyZWxlYXNlIiwiZ2l0SWdub3JlIiwiY29yZG92YUJ1aWxkIiwid2ViQ29yZG92YSIsImNvcmRvdmFCdWlsZEluZGV4IiwiY29yZG92YUJ1aWxkUHJvZ3JhbUpzb24iLCJ3ZWJDb3Jkb3ZhUHJvZ3JhbUpzb24iLCJwYWNrYWdlRGlyIiwiaW5zdGFsbGVyRGlyIiwic2NhZmZvbGQiLCJwcm9kdWN0aW9uIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uL2xpYi9lbnYuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IGFzc2lnbkluIGZyb20gJ2xvZGFzaC9hc3NpZ25Jbic7XG5cbmNvbnN0IHsgam9pbiB9ID0gcGF0aDtcblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBwcm9wZXJ0eSB7cGFja2FnZVBhdGhzfSBwYXRoc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbnYge1xuICAgIGNvbnN0cnVjdG9yKGlucHV0LCBvdXRwdXQsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgICBpZiAodGhpcy5pc1Byb2R1Y3Rpb25CdWlsZCgpKSB7XG4gICAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViA9ICdwcm9kdWN0aW9uJztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3lzID0ge1xuICAgICAgICAgICAgcGxhdGZvcm06IHByb2Nlc3MucGxhdGZvcm0sXG4gICAgICAgICAgICBhcmNoOiBwcm9jZXNzLmFyY2hcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBPcGVyYXRpb25hbCBTeXN0ZW0uXG4gICAgICAgIHRoaXMub3MgPSB7XG4gICAgICAgICAgICBpc1dpbmRvd3M6IChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSxcbiAgICAgICAgICAgIGlzTGludXg6IChwcm9jZXNzLnBsYXRmb3JtID09PSAnbGludXgnKSxcbiAgICAgICAgICAgIGlzT3N4OiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicpXG5cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zdGRpbyA9ICdpbmhlcml0JztcblxuICAgICAgICB0aGlzLm9zLm5hbWUgPSAodGhpcy5zeXMucGxhdGZvcm0gPT09ICdkYXJ3aW4nID8gJ29zeCcgOiB0aGlzLnN5cy5wbGF0Zm9ybSk7XG4gICAgICAgIHRoaXMub3MuaG9tZSA9IHByb2Nlc3MuZW52Wyh0aGlzLm9zLmlzV2luZG93cyA/ICdVU0VSUFJPRklMRScgOiAnSE9NRScpXTtcbiAgICAgICAgdGhpcy5vcy50bXAgPSBvcy50bXBkaXIoKTtcblxuICAgICAgICAvKiogQHR5cGUge3BhY2thZ2VQYXRoc30gKi9cbiAgICAgICAgdGhpcy5wYXRocyA9IHt9O1xuXG4gICAgICAgIC8qKiBAdHlwZSB7bWV0ZW9yRGVza3RvcFBhdGhzfSAqL1xuICAgICAgICB0aGlzLnBhdGhzLm1ldGVvckRlc2t0b3AgPSB7XG4gICAgICAgICAgICByb290OiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi4nKVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMucGF0aHMubWV0ZW9yRGVza3RvcC5za2VsZXRvbiA9IGpvaW4odGhpcy5wYXRocy5tZXRlb3JEZXNrdG9wLnJvb3QsICdza2VsZXRvbicpO1xuXG4gICAgICAgIC8qKiBAdHlwZSB7bWV0ZW9yQXBwUGF0aHN9ICovXG4gICAgICAgIHRoaXMucGF0aHMubWV0ZW9yQXBwID0ge1xuICAgICAgICAgICAgcm9vdDogaW5wdXRcbiAgICAgICAgfTtcblxuICAgICAgICAvKiogQHR5cGUge2Rlc2t0b3BQYXRoc30gKi9cbiAgICAgICAgdGhpcy5wYXRocy5kZXNrdG9wID0ge1xuICAgICAgICAgICAgcm9vdE5hbWU6ICcuZGVza3RvcCcsXG4gICAgICAgICAgICByb290OiBqb2luKHRoaXMucGF0aHMubWV0ZW9yQXBwLnJvb3QsICcuZGVza3RvcCcpXG4gICAgICAgIH07XG5cbiAgICAgICAgYXNzaWduSW4odGhpcy5wYXRocy5kZXNrdG9wLCB7XG4gICAgICAgICAgICBtb2R1bGVzOiBqb2luKHRoaXMucGF0aHMuZGVza3RvcC5yb290LCAnbW9kdWxlcycpLFxuICAgICAgICAgICAgaW1wb3J0OiBqb2luKHRoaXMucGF0aHMuZGVza3RvcC5yb290LCAnaW1wb3J0JyksXG4gICAgICAgICAgICBhc3NldHM6IGpvaW4odGhpcy5wYXRocy5kZXNrdG9wLnJvb3QsICdhc3NldHMnKSxcbiAgICAgICAgICAgIHNldHRpbmdzOiBqb2luKHRoaXMucGF0aHMuZGVza3RvcC5yb290LCAnc2V0dGluZ3MuanNvbicpLFxuICAgICAgICAgICAgZGVza3RvcDogam9pbih0aGlzLnBhdGhzLmRlc2t0b3Aucm9vdCwgJ2Rlc2t0b3AuanMnKVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnBhdGhzLmRlc2t0b3Auc3BsYXNoU2NyZWVuID0gam9pbih0aGlzLnBhdGhzLmRlc2t0b3AuYXNzZXRzLCAnc3BsYXNoU2NyZWVuLnBuZycpO1xuICAgICAgICB0aGlzLnBhdGhzLmRlc2t0b3AubG9hZGluZ0dpZiA9IGpvaW4odGhpcy5wYXRocy5kZXNrdG9wLmFzc2V0cywgJ2xvYWRpbmcuZ2lmJyk7XG4gICAgICAgIHRoaXMucGF0aHMuZGVza3RvcC5tZXRlb3JJY28gPSBqb2luKHRoaXMucGF0aHMuZGVza3RvcC5hc3NldHMsICdtZXRlb3IuaWNvJyk7XG5cbiAgICAgICAgLyoqIEB0eXBlIHtlbGVjdHJvbkFwcFBhdGhzfSAqL1xuICAgICAgICB0aGlzLnBhdGhzLmVsZWN0cm9uQXBwID0ge1xuICAgICAgICAgICAgcm9vdE5hbWU6ICdkZXNrdG9wLWJ1aWxkJyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wYXRocy5lbGVjdHJvbkFwcC5yb290ID1cbiAgICAgICAgICAgIGpvaW4odGhpcy5wYXRocy5tZXRlb3JBcHAucm9vdCwgJy5tZXRlb3InLCB0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLnJvb3ROYW1lKTtcblxuICAgICAgICB0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLnRtcE5vZGVNb2R1bGVzID1cbiAgICAgICAgICAgIGpvaW4odGhpcy5wYXRocy5tZXRlb3JBcHAucm9vdCwgJy5tZXRlb3InLCAnLmRlc2t0b3Bfbm9kZV9tb2R1bGVzJyk7XG5cbiAgICAgICAgdGhpcy5wYXRocy5jYWNoZSA9XG4gICAgICAgICAgICBqb2luKHRoaXMucGF0aHMubWV0ZW9yQXBwLnJvb3QsICcubWV0ZW9yJywgJ2xvY2FsJywgJ2Rlc2t0b3AtY2FjaGUnKTtcblxuICAgICAgICB0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLmV4dHJhY3RlZE5vZGVNb2R1bGVzID1cbiAgICAgICAgICAgIGpvaW4odGhpcy5wYXRocy5tZXRlb3JBcHAucm9vdCwgJy5tZXRlb3InLCAnLmRlc2t0b3BfZXh0cmFjdGVkX25vZGVfbW9kdWxlcycpO1xuXG4gICAgICAgIHRoaXMucGF0aHMuZWxlY3Ryb25BcHAuZXh0cmFjdGVkTm9kZU1vZHVsZXNCaW4gPVxuICAgICAgICAgICAgam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLmV4dHJhY3RlZE5vZGVNb2R1bGVzLCAnLmJpbicpO1xuXG5cbiAgICAgICAgdGhpcy5wYXRocy5lbGVjdHJvbkFwcC5hcHBSb290ID1cbiAgICAgICAgICAgIGpvaW4odGhpcy5wYXRocy5lbGVjdHJvbkFwcC5yb290LCAnYXBwJyk7XG5cbiAgICAgICAgYXNzaWduSW4odGhpcy5wYXRocy5lbGVjdHJvbkFwcCwge1xuICAgICAgICAgICAgYXBwOiBqb2luKHRoaXMucGF0aHMuZWxlY3Ryb25BcHAuYXBwUm9vdCwgJ2FwcC5qcycpLFxuICAgICAgICAgICAgY29yZG92YTogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLmFwcFJvb3QsICdjb3Jkb3ZhLmpzJyksXG4gICAgICAgICAgICBpbmRleDogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLmFwcFJvb3QsICdpbmRleC5qcycpLFxuICAgICAgICAgICAgcHJlbG9hZDogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLmFwcFJvb3QsICdwcmVsb2FkLmpzJyksXG4gICAgICAgICAgICBtb2R1bGVzOiBqb2luKHRoaXMucGF0aHMuZWxlY3Ryb25BcHAuYXBwUm9vdCwgJ21vZHVsZXMnKSxcbiAgICAgICAgICAgIGRlc2t0b3BBc2FyOiBqb2luKHRoaXMucGF0aHMuZWxlY3Ryb25BcHAucm9vdCwgJ2Rlc2t0b3AuYXNhcicpLFxuICAgICAgICAgICAgZXh0cmFjdGVkOiBqb2luKHRoaXMucGF0aHMuZWxlY3Ryb25BcHAucm9vdCwgJ2V4dHJhY3RlZCcpLFxuICAgICAgICAgICAgYXBwQXNhcjogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLnJvb3QsICdhcHAuYXNhcicpLFxuICAgICAgICAgICAgaW1wb3J0OiBqb2luKHRoaXMucGF0aHMuZWxlY3Ryb25BcHAucm9vdCwgJ2ltcG9ydCcpLFxuICAgICAgICAgICAgYXNzZXRzOiBqb2luKHRoaXMucGF0aHMuZWxlY3Ryb25BcHAucm9vdCwgJ2Fzc2V0cycpLFxuICAgICAgICAgICAgcGFja2FnZUpzb246IGpvaW4odGhpcy5wYXRocy5lbGVjdHJvbkFwcC5yb290LCAncGFja2FnZS5qc29uJyksXG4gICAgICAgICAgICBzZXR0aW5nczogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLnJvb3QsICdzZXR0aW5ncy5qc29uJyksXG4gICAgICAgICAgICBkZXNrdG9wOiBqb2luKHRoaXMucGF0aHMuZWxlY3Ryb25BcHAucm9vdCwgJ2Rlc2t0b3AuanMnKSxcbiAgICAgICAgICAgIGRlc2t0b3BUbXA6IGpvaW4odGhpcy5wYXRocy5lbGVjdHJvbkFwcC5yb290LCAnX19kZXNrdG9wJyksXG4gICAgICAgICAgICBub2RlTW9kdWxlczogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLnJvb3QsICdub2RlX21vZHVsZXMnKSxcbiAgICAgICAgICAgIG1ldGVvckFzYXI6IGpvaW4odGhpcy5wYXRocy5lbGVjdHJvbkFwcC5yb290LCAnbWV0ZW9yLmFzYXInKSxcbiAgICAgICAgICAgIG1ldGVvckFwcDogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLnJvb3QsICdtZXRlb3InKSxcbiAgICAgICAgICAgIG1ldGVvckFwcEluZGV4OiBqb2luKHRoaXMucGF0aHMuZWxlY3Ryb25BcHAucm9vdCwgJ21ldGVvcicsICdpbmRleC5odG1sJyksXG4gICAgICAgICAgICBtZXRlb3JBcHBQcm9ncmFtSnNvbjogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLnJvb3QsICdtZXRlb3InLCAncHJvZ3JhbS5qc29uJyksXG4gICAgICAgICAgICBza2VsZXRvbjogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLnJvb3QsICdza2VsZXRvbicpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFzc2lnbkluKHRoaXMucGF0aHMubWV0ZW9yQXBwLCB7XG4gICAgICAgICAgICBwbGF0Zm9ybXM6IGpvaW4odGhpcy5wYXRocy5tZXRlb3JBcHAucm9vdCwgJy5tZXRlb3InLCAncGxhdGZvcm1zJyksXG4gICAgICAgICAgICBwYWNrYWdlczogam9pbih0aGlzLnBhdGhzLm1ldGVvckFwcC5yb290LCAnLm1ldGVvcicsICdwYWNrYWdlcycpLFxuICAgICAgICAgICAgdmVyc2lvbnM6IGpvaW4odGhpcy5wYXRocy5tZXRlb3JBcHAucm9vdCwgJy5tZXRlb3InLCAndmVyc2lvbnMnKSxcbiAgICAgICAgICAgIHJlbGVhc2U6IGpvaW4odGhpcy5wYXRocy5tZXRlb3JBcHAucm9vdCwgJy5tZXRlb3InLCAncmVsZWFzZScpLFxuICAgICAgICAgICAgcGFja2FnZUpzb246IGpvaW4odGhpcy5wYXRocy5tZXRlb3JBcHAucm9vdCwgJ3BhY2thZ2UuanNvbicpLFxuICAgICAgICAgICAgZ2l0SWdub3JlOiBqb2luKHRoaXMucGF0aHMubWV0ZW9yQXBwLnJvb3QsICcubWV0ZW9yJywgJy5naXRpZ25vcmUnKSxcbiAgICAgICAgICAgIGNvcmRvdmFCdWlsZDogam9pbihcbiAgICAgICAgICAgICAgICB0aGlzLnBhdGhzLm1ldGVvckFwcC5yb290LFxuICAgICAgICAgICAgICAgICcubWV0ZW9yJyxcbiAgICAgICAgICAgICAgICAnbG9jYWwnLFxuICAgICAgICAgICAgICAgICdjb3Jkb3ZhLWJ1aWxkJyxcbiAgICAgICAgICAgICAgICAnd3d3JyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgd2ViQ29yZG92YTogam9pbihcbiAgICAgICAgICAgICAgICB0aGlzLnBhdGhzLm1ldGVvckFwcC5yb290LFxuICAgICAgICAgICAgICAgICcubWV0ZW9yJyxcbiAgICAgICAgICAgICAgICAnbG9jYWwnLFxuICAgICAgICAgICAgICAgICdidWlsZCcsXG4gICAgICAgICAgICAgICAgJ3Byb2dyYW1zJyxcbiAgICAgICAgICAgICAgICAnd2ViLmNvcmRvdmEnXG4gICAgICAgICAgICApXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFzc2lnbkluKHRoaXMucGF0aHMubWV0ZW9yQXBwLCB7XG4gICAgICAgICAgICBjb3Jkb3ZhQnVpbGRJbmRleDogam9pbihcbiAgICAgICAgICAgICAgICB0aGlzLnBhdGhzLm1ldGVvckFwcC5jb3Jkb3ZhQnVpbGQsICdpbmRleC5odG1sJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGNvcmRvdmFCdWlsZFByb2dyYW1Kc29uOiBqb2luKFxuICAgICAgICAgICAgICAgIHRoaXMucGF0aHMubWV0ZW9yQXBwLmNvcmRvdmFCdWlsZCwgJ3Byb2dyYW0uanNvbidcbiAgICAgICAgICAgIClcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXNzaWduSW4odGhpcy5wYXRocy5tZXRlb3JBcHAsIHtcbiAgICAgICAgICAgIHdlYkNvcmRvdmFQcm9ncmFtSnNvbjogam9pbihcbiAgICAgICAgICAgICAgICB0aGlzLnBhdGhzLm1ldGVvckFwcC53ZWJDb3Jkb3ZhLCAncHJvZ3JhbS5qc29uJ1xuICAgICAgICAgICAgKVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIC8qKiBAdHlwZSB7ZGVza3RvcFRtcFBhdGhzfSAqL1xuICAgICAgICB0aGlzLnBhdGhzLmRlc2t0b3BUbXAgPSB7XG4gICAgICAgICAgICByb290OiBqb2luKHRoaXMucGF0aHMuZWxlY3Ryb25BcHAucm9vdCwgJ19fZGVza3RvcCcpLFxuICAgICAgICB9O1xuXG4gICAgICAgIGFzc2lnbkluKHRoaXMucGF0aHMuZGVza3RvcFRtcCwge1xuICAgICAgICAgICAgbW9kdWxlczogam9pbih0aGlzLnBhdGhzLmRlc2t0b3BUbXAucm9vdCwgJ21vZHVsZXMnKSxcbiAgICAgICAgICAgIHNldHRpbmdzOiBqb2luKHRoaXMucGF0aHMuZGVza3RvcFRtcC5yb290LCAnc2V0dGluZ3MuanNvbicpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucGF0aHMucGFja2FnZURpciA9ICcuZGVza3RvcC1wYWNrYWdlJztcbiAgICAgICAgdGhpcy5wYXRocy5pbnN0YWxsZXJEaXIgPSAnLmRlc2t0b3AtaW5zdGFsbGVyJztcblxuICAgICAgICAvLyBTY2FmZm9sZFxuICAgICAgICB0aGlzLnBhdGhzLnNjYWZmb2xkID0gam9pbihfX2Rpcm5hbWUsICcuLicsICdzY2FmZm9sZCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufCp9XG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIGlzUHJvZHVjdGlvbkJ1aWxkKCkge1xuICAgICAgICByZXR1cm4gISEoJ3Byb2R1Y3Rpb24nIGluIHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMucHJvZHVjdGlvbik7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEVudjtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBkZXNrdG9wUGF0aHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByb290TmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJvb3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2R1bGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaW1wb3J0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXNzZXRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2V0dGluZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXNrdG9wXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3BsYXNoU2NyZWVuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbG9hZGluZ0dpZlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1ldGVvckljb1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gbWV0ZW9yQXBwUGF0aHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByb290XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGxhdGZvcm1zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVsZWFzZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhY2thZ2VzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBnaXRJZ25vcmVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYWNrYWdlSnNvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvcmRvdmFCdWlsZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvcmRvdmFCdWlsZEluZGV4XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29yZG92YUJ1aWxkUHJvZ3JhbUpzb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB3ZWJDb3Jkb3ZhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2ViQ29yZG92YUluZGV4XG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2ViQ29yZG92YVByb2dyYW1Kc29uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBlbGVjdHJvbkFwcFBhdGhzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcm9vdE5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByb290XG4gKiBAcHJvcGVydHkge09iamVjdH0gYXBwUm9vdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcFJvb3QuY29yZG92YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcFJvb3QuaW5kZXhcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBSb290LmFwcFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcFJvb3QubW9kdWxlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlc2t0b3BBc2FyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXh0cmFjdGVkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwQXNhclxuICogQHByb3BlcnR5IHtzdHJpbmd9IHByZWxvYWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbXBvcnRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhc3NldHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBnaXRJZ25vcmVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYWNrYWdlSnNvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNldHRpbmdzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVza3RvcFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlc2t0b3BUbXBcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBub2RlTW9kdWxlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IG1ldGVvckFzYXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZXRlb3JBcHBcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZXRlb3JBcHBJbmRleFxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1ldGVvckFwcFByb2dyYW1Kc29uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2tlbGV0b25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0bXBOb2RlTW9kdWxlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dHJhY3RlZE5vZGVNb2R1bGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXh0cmFjdGVkTm9kZU1vZHVsZXNCaW5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IGRlc2t0b3BUbXBQYXRoc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHJvb3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2R1bGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2V0dGluZ3NcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IG1ldGVvckRlc2t0b3BQYXRoc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHJvb3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBza2VsZXRvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gcGFja2FnZVBhdGhzXG4gKiBAcHJvcGVydHkge21ldGVvckFwcFBhdGhzfSBtZXRlb3JBcHBcbiAqIEBwcm9wZXJ0eSB7ZGVza3RvcFBhdGhzfSBkZXNrdG9wXG4gKiBAcHJvcGVydHkge2VsZWN0cm9uQXBwUGF0aHN9IGVsZWN0cm9uQXBwXG4gKiBAcHJvcGVydHkge2Rlc2t0b3BUbXBQYXRoc30gZGVza3RvcFRtcFxuICogQHByb3BlcnR5IHttZXRlb3JEZXNrdG9wUGF0aHN9IG1ldGVvckRlc2t0b3BcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYWNrYWdlRGlyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2NhZmZvbGRcbiAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7Ozs7QUFFQSxNQUFNO0VBQUVBO0FBQUYsSUFBV0MsYUFBakI7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFDZSxNQUFNQyxHQUFOLENBQVU7RUFDckJDLFdBQVcsQ0FBQ0MsS0FBRCxFQUFRQyxNQUFSLEVBQWdCQyxPQUFoQixFQUF5QjtJQUNoQyxLQUFLQSxPQUFMLEdBQWVBLE9BQWY7O0lBRUEsSUFBSSxLQUFLQyxpQkFBTCxFQUFKLEVBQThCO01BQzFCQyxPQUFPLENBQUNDLEdBQVIsQ0FBWUMsUUFBWixHQUF1QixZQUF2QjtJQUNIOztJQUVELEtBQUtDLEdBQUwsR0FBVztNQUNQQyxRQUFRLEVBQUVKLE9BQU8sQ0FBQ0ksUUFEWDtNQUVQQyxJQUFJLEVBQUVMLE9BQU8sQ0FBQ0s7SUFGUCxDQUFYLENBUGdDLENBWWhDOztJQUNBLEtBQUtDLEVBQUwsR0FBVTtNQUNOQyxTQUFTLEVBQUdQLE9BQU8sQ0FBQ0ksUUFBUixLQUFxQixPQUQzQjtNQUVOSSxPQUFPLEVBQUdSLE9BQU8sQ0FBQ0ksUUFBUixLQUFxQixPQUZ6QjtNQUdOSyxLQUFLLEVBQUdULE9B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Y0FEVjtJQURBLENBQS9CO0lBT0E7O0lBQ0EsS0FBSzFDLEtBQUwsQ0FBVytCLFVBQVgsR0FBd0I7TUFDcEI3QixJQUFJLEVBQUV6QixJQUFJLENBQUMsS0FBS3VCLEtBQUwsQ0FBV2lCLFdBQVgsQ0FBdUJmLElBQXhCLEVBQThCLFdBQTlCO0lBRFUsQ0FBeEI7SUFJQSxJQUFBTyxpQkFBQSxFQUFTLEtBQUtULEtBQUwsQ0FBVytCLFVBQXBCLEVBQWdDO01BQzVCckIsT0FBTyxFQUFFakMsSUFBSSxDQUFDLEtBQUt1QixLQUFMLENBQVcrQixVQUFYLENBQXNCN0IsSUFBdkIsRUFBNkIsU0FBN0IsQ0FEZTtNQUU1QlcsUUFBUSxFQUFFcEMsSUFBSSxDQUFDLEtBQUt1QixLQUFMLENBQVcrQixVQUFYLENBQXNCN0IsSUFBdkIsRUFBNkIsZUFBN0I7SUFGYyxDQUFoQztJQUtBLEtBQUtGLEtBQUwsQ0FBVzhDLFVBQVgsR0FBd0Isa0JBQXhCO0lBQ0EsS0FBSzlDLEtBQUwsQ0FBVytDLFlBQVgsR0FBMEIsb0JBQTFCLENBNUpnQyxDQThKaEM7O0lBQ0EsS0FBSy9DLEtBQUwsQ0FBV2dELFFBQVgsR0FBc0J2RSxJQUFJLENBQUMyQixTQUFELEVBQVksSUFBWixFQUFrQixVQUFsQixDQUExQjtFQUNIO0VBRUQ7QUFDSjtBQUNBO0FBQ0E7OztFQUNJcEIsaUJBQWlCLEdBQUc7SUFDaEIsT0FBTyxDQUFDLEVBQUUsZ0JBQWdCLEtBQUtELE9BQXJCLElBQWdDLEtBQUtBLE9BQUwsQ0FBYWtFLFVBQS9DLENBQVI7RUFDSDs7QUF6S29COzs7QUE0S3pCQyxNQUFNLENBQUNDLE9BQVAsR0FBaUJ4RSxHQUFqQjtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSJ9 \ No newline at end of file diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 00000000..44c7cecc --- /dev/null +++ b/dist/index.js @@ -0,0 +1,247 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = _exports; + +var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime")); + +var _fs = _interopRequireDefault(require("fs")); + +var _path = _interopRequireDefault(require("path")); + +var _shelljs = _interopRequireDefault(require("shelljs")); + +var _env = _interopRequireDefault(require("./env")); + +var _electron = _interopRequireDefault(require("./electron")); + +var _log = _interopRequireDefault(require("./log")); + +var _desktop = _interopRequireDefault(require("./desktop")); + +var _electronApp = _interopRequireDefault(require("./electronApp")); + +var _meteorApp = _interopRequireDefault(require("./meteorApp")); + +var _electronBuilder = _interopRequireDefault(require("./electronBuilder")); + +var _packager = _interopRequireDefault(require("./packager")); + +var _utils = _interopRequireDefault(require("./utils")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// eslint-disable-next-line no-unused-vars +_shelljs.default.config.fatal = true; +/** + * Main entity. + * @class + * @property {Env} env + * @property {Electron} electron + * @property {InstallerBuilder} installerBuilder + * @property {ElectronApp} electronApp + * @property {Desktop} desktop + * @property {MeteorApp} meteorApp + */ + +class MeteorDesktop { + /** + * @param {string} input - Meteor app dir + * @param {string} output - output dir for bundle/package/installer + * @param {Object} options - options from cli.js + * @param {Object} dependencies - dependencies object + * @constructor + */ + constructor(input, output, options, dependencies) { + const Log = dependencies.log; + this.log = new Log('index'); + this.version = this.getVersion(); + this.log.info('initializing'); + this.env = new _env.default(input, output, options); + this.electron = new _electron.default(this); + this.electronBuilder = new _electronBuilder.default(this); + this.electronApp = new _electronApp.default(this); + this.desktop = new _desktop.default(this); + this.meteorApp = new _meteorApp.default(this); + this.utils = _utils.default; + } + /** + * Tries to read the version from our own package.json. + * + * @returns {string} + */ + + + getVersion() { + if (this.version) { + return this.version; + } + + let version = null; + + try { + ({ + version + } = JSON.parse(_fs.default.readFileSync(_path.default.join(__dirname, '..', 'package.json'), 'UTF-8'))); + } catch (e) { + this.log.error(`error while trying to read ${_path.default.join(__dirname, 'package.json')}`, e); + process.exit(1); + } + + if (process.env.PLUGIN_VERSION && (version.includes('rc') || version.includes('beta') || version.includes('alpha'))) { + version = process.env.PLUGIN_VERSION; + } + + return version; + } + /** + * Tries to read the version from our own package.json. + * + * @returns {string} + */ + + + getElectronVersion() { + let version = null; + + try { + const { + dependencies = {}, + devDependencies = {} + } = JSON.parse(_fs.default.readFileSync(_path.default.join(this.env.paths.meteorApp.root, 'package.json'), 'UTF-8')); + + if (!('electron' in dependencies) && !('electron' in devDependencies)) { + this.log.error('electron not found in meteor project dependencies'); + process.exit(1); + } + + version = dependencies.electron || devDependencies.electron; + + if (this.electronApp.depsManager.checks.version.regex.test(version)) { + ({ + version + } = JSON.parse(_fs.default.readFileSync(_path.default.join(this.env.paths.meteorApp.root, 'node_modules', 'electron', 'package.json'), 'UTF-8'))); + } + } catch (e) { + this.log.error(`error while trying to read ${_path.default.join(this.env.paths.meteorApp.root, 'package.json')}`, e); + process.exit(1); + } + + return version; + } + + async init() { + this.desktop.scaffold(); + this.meteorApp.updateGitIgnore(); + await this.electronApp.init(); + } + + async buildInstaller(throwError = false) { + this.env.options.installerBuild = true; + await this.electronApp.build(); + + try { + await this.electronBuilder.build(); + } catch (e) { + this.log.error('error occurred while building installer', e); + + if (throwError) { + throw new Error(e); + } + } + } + + async run() { + await this.electronApp.build(true); + } + + async build() { + await this.electronApp.build(); + } + + justRun() { + this.electron.run(); + } + + async runPackager() { + this.packager = new _packager.default(this); + await this.packager.init(); + await this.electronApp.build(); + this.packager.packageApp().catch(e => { + this.log.error(`while trying to build a package an error occurred: ${e}`); + }); + } + + async getDependency(name, version, declarationCheck = true) { + if (declarationCheck) { + try { + const { + dependencies = {}, + devDependencies = {} + } = JSON.parse(_fs.default.readFileSync(_path.default.join(this.env.paths.meteorApp.root, 'package.json'), 'UTF-8')); + + if (!(name in dependencies) && !(name in devDependencies)) { + await this.meteorApp.runNpm(['i', '-D', '-E', '--only=dev', `${name}@${version}`], 'inherit'); + } + } catch (e) { + this.log.error(`could no read ${_path.default.join(this.env.paths.meteorApp.root, 'package.json')}`, e); + process.exit(1); + } + } + + const dependencyPath = _path.default.join(this.env.paths.meteorApp.root, 'node_modules', name); + + let dependency = null; + + try { + dependency = require(dependencyPath); + } catch (e) { + if (declarationCheck) { + this.log.warn(`could not find ${name}, installing the default version for you: ${name}@${version}`); + + try { + await this.meteorApp.runNpm(['i', '-D', '-E', '--only=dev', `${name}@${version}`], 'inherit'); + } catch (err) { + this.log.error(err); + process.exit(1); + } + } else { + this.log.warn(`could not find ${name}, exiting`); + process.exit(1); + } + } finally { + if (!dependency) { + dependency = require(dependencyPath); + } + } + + const dependencyVersion = require(_path.default.join(dependencyPath, 'package.json')).version; + + if (dependencyVersion !== version) { + if (dependencyVersion.split('.')[0] !== version.split('.')[0]) { + this.log.warn(`you are using a ${name}@${dependencyVersion} while the recommended version is ` + `${version}, the compatibility version is different, use at your own risk, be sure to report ` + 'that when submitting issues'); + } else { + this.log.warn(`you are using a ${name}@${dependencyVersion} while the recommended version is ` + `${version}, be sure to report that when submitting issues`); + } + } + + return { + dependency, + path: dependencyPath + }; + } + +} + +function _exports(input, output, options, { + log = _log.default +} = { + log: _log.default +}) { + return new MeteorDesktop(input, output, options, { + log + }); +} +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzaGVsbCIsImNvbmZpZyIsImZhdGFsIiwiTWV0ZW9yRGVza3RvcCIsImNvbnN0cnVjdG9yIiwiaW5wdXQiLCJvdXRwdXQiLCJvcHRpb25zIiwiZGVwZW5kZW5jaWVzIiwiTG9nIiwibG9nIiwidmVyc2lvbiIsImdldFZlcnNpb24iLCJpbmZvIiwiZW52IiwiRW52IiwiZWxlY3Ryb24iLCJFbGVjdHJvbiIsImVsZWN0cm9uQnVpbGRlciIsIkVsZWN0cm9uQnVpbGRlciIsImVsZWN0cm9uQXBwIiwiRWxlY3Ryb25BcHAiLCJkZXNrdG9wIiwiRGVza3RvcCIsIm1ldGVvckFwcCIsIk1ldGVvckFwcCIsInV0aWxzIiwiSlNPTiIsInBhcnNlIiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJwYXRoIiwiam9pbiIsIl9fZGlybmFtZSIsImUiLCJlcnJvciIsInByb2Nlc3MiLCJleGl0IiwiUExVR0lOX1ZFUlNJT04iLCJpbmNsdWRlcyIsImdldEVsZWN0cm9uVmVyc2lvbiIsImRldkRlcGVuZGVuY2llcyIsInBhdGhzIiwicm9vdCIsImRlcHNNYW5hZ2VyIiwiY2hlY2tzIiwicmVnZXgiLCJ0ZXN0IiwiaW5pdCIsInNjYWZmb2xkIiwidXBkYXRlR2l0SWdub3JlIiwiYnVpbGRJbnN0YWxsZXIiLCJ0aHJvd0Vycm9yIiwiaW5zdGFsbGVyQnVpbGQiLCJidWlsZCIsIkVycm9yIiwicnVuIiwianVzdFJ1biIsInJ1blBhY2thZ2VyIiwicGFja2FnZXIiLCJQYWNrYWdlciIsInBhY2thZ2VBcHAiLCJjYXRjaCIsImdldERlcGVuZGVuY3kiLCJuYW1lIiwiZGVjbGFyYXRpb25DaGVjayIsInJ1bk5wbSIsImRlcGVuZGVuY3lQYXRoIiwiZGVwZW5kZW5jeSIsInJlcXVpcmUiLCJ3YXJuIiwiZXJyIiwiZGVwZW5kZW5jeVZlcnNpb24iLCJzcGxpdCIsImV4cG9ydHMiLCJMb2dnZXIiXSwic291cmNlcyI6WyIuLi9saWIvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5pbXBvcnQgcmVnZW5lcmF0b3JSdW50aW1lIGZyb20gJ3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZSc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgc2hlbGwgZnJvbSAnc2hlbGxqcyc7XG5pbXBvcnQgRW52IGZyb20gJy4vZW52JztcbmltcG9ydCBFbGVjdHJvbiBmcm9tICcuL2VsZWN0cm9uJztcbmltcG9ydCBMb2dnZXIgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IERlc2t0b3AgZnJvbSAnLi9kZXNrdG9wJztcbmltcG9ydCBFbGVjdHJvbkFwcCBmcm9tICcuL2VsZWN0cm9uQXBwJztcbmltcG9ydCBNZXRlb3JBcHAgZnJvbSAnLi9tZXRlb3JBcHAnO1xuaW1wb3J0IEVsZWN0cm9uQnVpbGRlciBmcm9tICcuL2VsZWN0cm9uQnVpbGRlcic7XG5pbXBvcnQgUGFja2FnZXIgZnJvbSAnLi9wYWNrYWdlcic7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbnNoZWxsLmNvbmZpZy5mYXRhbCA9IHRydWU7XG5cbi8qKlxuICogTWFpbiBlbnRpdHkuXG4gKiBAY2xhc3NcbiAqIEBwcm9wZXJ0eSB7RW52fSBlbnZcbiAqIEBwcm9wZXJ0eSB7RWxlY3Ryb259IGVsZWN0cm9uXG4gKiBAcHJvcGVydHkge0luc3RhbGxlckJ1aWxkZXJ9IGluc3RhbGxlckJ1aWxkZXJcbiAqIEBwcm9wZXJ0eSB7RWxlY3Ryb25BcHB9IGVsZWN0cm9uQXBwXG4gKiBAcHJvcGVydHkge0Rlc2t0b3B9IGRlc2t0b3BcbiAqIEBwcm9wZXJ0eSB7TWV0ZW9yQXBwfSBtZXRlb3JBcHBcbiAqL1xuY2xhc3MgTWV0ZW9yRGVza3RvcCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0ICAgICAgICAtIE1ldGVvciBhcHAgZGlyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG91dHB1dCAgICAgICAtIG91dHB1dCBkaXIgZm9yIGJ1bmRsZS9wYWNrYWdlL2luc3RhbGxlclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zICAgICAgLSBvcHRpb25zIGZyb20gY2xpLmpzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRlcGVuZGVuY2llcyAtIGRlcGVuZGVuY2llcyBvYmplY3RcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihpbnB1dCwgb3V0cHV0LCBvcHRpb25zLCBkZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgY29uc3QgTG9nID0gZGVwZW5kZW5jaWVzLmxvZztcbiAgICAgICAgdGhpcy5sb2cgPSBuZXcgTG9nKCdpbmRleCcpO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSB0aGlzLmdldFZlcnNpb24oKTtcblxuICAgICAgICB0aGlzLmxvZy5pbmZvKCdpbml0aWFsaXppbmcnKTtcblxuICAgICAgICB0aGlzLmVudiA9IG5ldyBFbnYoaW5wdXQsIG91dHB1dCwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZWxlY3Ryb24gPSBuZXcgRWxlY3Ryb24odGhpcyk7XG4gICAgICAgIHRoaXMuZWxlY3Ryb25CdWlsZGVyID0gbmV3IEVsZWN0cm9uQnVpbGRlcih0aGlzKTtcbiAgICAgICAgdGhpcy5lbGVjdHJvbkFwcCA9IG5ldyBFbGVjdHJvbkFwcCh0aGlzKTtcbiAgICAgICAgdGhpcy5kZXNrdG9wID0gbmV3IERlc2t0b3AodGhpcyk7XG4gICAgICAgIHRoaXMubWV0ZW9yQXBwID0gbmV3IE1ldGVvckFwcCh0aGlzKTtcbiAgICAgICAgdGhpcy51dGlscyA9IHV0aWxzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWVzIHRvIHJlYWQgdGhlIHZlcnNpb24gZnJvbSBvdXIgb3duIHBhY2thZ2UuanNvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0VmVyc2lvbigpIHtcbiAgICAgICAgaWYgKHRoaXMudmVyc2lvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmVyc2lvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICh7IHZlcnNpb24gfSA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICdwYWNrYWdlLmpzb24nKSwgJ1VURi04JylcbiAgICAgICAgICAgICkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihgZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIHJlYWQgJHtwYXRoLmpvaW4oX19kaXJuYW1lLCAncGFja2FnZS5qc29uJyl9YCwgZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LlBMVUdJTl9WRVJTSU9OICYmXG4gICAgICAgICAgICAodmVyc2lvbi5pbmNsdWRlcygncmMnKSB8fCB2ZXJzaW9uLmluY2x1ZGVzKCdiZXRhJykgfHwgdmVyc2lvbi5pbmNsdWRlcygnYWxwaGEnKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB2ZXJzaW9uID0gcHJvY2Vzcy5lbnYuUExVR0lOX1ZFUlNJT047XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZlcnNpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZXMgdG8gcmVhZCB0aGUgdmVyc2lvbiBmcm9tIG91ciBvd24gcGFja2FnZS5qc29uLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRFbGVjdHJvblZlcnNpb24oKSB7XG4gICAgICAgIGxldCB2ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHsgZGVwZW5kZW5jaWVzID0ge30sIGRldkRlcGVuZGVuY2llcyA9IHt9IH0gPSBKU09OLnBhcnNlKFxuICAgICAgICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5lbnYucGF0aHMubWV0ZW9yQXBwLnJvb3QsICdwYWNrYWdlLmpzb24nKSwgJ1VURi04JylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoISgnZWxlY3Ryb24nIGluIGRlcGVuZGVuY2llcykgJiYgISgnZWxlY3Ryb24nIGluIGRldkRlcGVuZGVuY2llcykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZWxlY3Ryb24gbm90IGZvdW5kIGluIG1ldGVvciBwcm9qZWN0IGRlcGVuZGVuY2llcycpO1xuICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZlcnNpb24gPSBkZXBlbmRlbmNpZXMuZWxlY3Ryb24gfHwgZGV2RGVwZW5kZW5jaWVzLmVsZWN0cm9uO1xuICAgICAgICAgICAgaWYgKHRoaXMuZWxlY3Ryb25BcHAuZGVwc01hbmFnZXIuY2hlY2tzLnZlcnNpb24ucmVnZXgudGVzdCh2ZXJzaW9uKSkge1xuICAgICAgICAgICAgICAgICh7IHZlcnNpb24gfSA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5lbnYucGF0aHMubWV0ZW9yQXBwLnJvb3QsICdub2RlX21vZHVsZXMnLCAnZWxlY3Ryb24nLCAncGFja2FnZS5qc29uJyksICdVVEYtOCcpXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGBlcnJvciB3aGlsZSB0cnlpbmcgdG8gcmVhZCAke3BhdGguam9pbih0aGlzLmVudi5wYXRocy5tZXRlb3JBcHAucm9vdCwgJ3BhY2thZ2UuanNvbicpfWAsIGUpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2ZXJzaW9uO1xuICAgIH1cblxuICAgIGFzeW5jIGluaXQoKSB7XG4gICAgICAgIHRoaXMuZGVza3RvcC5zY2FmZm9sZCgpO1xuICAgICAgICB0aGlzLm1ldGVvckFwcC51cGRhdGVHaXRJZ25vcmUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5lbGVjdHJvbkFwcC5pbml0KCk7XG4gICAgfVxuXG4gICAgYXN5bmMgYnVpbGRJbnN0YWxsZXIodGhyb3dFcnJvciA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuZW52Lm9wdGlvbnMuaW5zdGFsbGVyQnVpbGQgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLmVsZWN0cm9uQXBwLmJ1aWxkKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmVsZWN0cm9uQnVpbGRlci5idWlsZCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igb2NjdXJyZWQgd2hpbGUgYnVpbGRpbmcgaW5zdGFsbGVyJywgZSk7XG4gICAgICAgICAgICBpZiAodGhyb3dFcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHJ1bigpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbGVjdHJvbkFwcC5idWlsZCh0cnVlKTtcbiAgICB9XG5cbiAgICBhc3luYyBidWlsZCgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbGVjdHJvbkFwcC5idWlsZCgpO1xuICAgIH1cblxuICAgIGp1c3RSdW4oKSB7XG4gICAgICAgIHRoaXMuZWxlY3Ryb24ucnVuKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgcnVuUGFja2FnZXIoKSB7XG4gICAgICAgIHRoaXMucGFja2FnZXIgPSBuZXcgUGFja2FnZXIodGhpcyk7XG4gICAgICAgIGF3YWl0IHRoaXMucGFja2FnZXIuaW5pdCgpO1xuICAgICAgICBhd2FpdCB0aGlzLmVsZWN0cm9uQXBwLmJ1aWxkKCk7XG5cbiAgICAgICAgdGhpcy5wYWNrYWdlci5wYWNrYWdlQXBwKCkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGB3aGlsZSB0cnlpbmcgdG8gYnVpbGQgYSBwYWNrYWdlIGFuIGVycm9yIG9jY3VycmVkOiAke2V9YCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIGdldERlcGVuZGVuY3kobmFtZSwgdmVyc2lvbiwgZGVjbGFyYXRpb25DaGVjayA9IHRydWUpIHtcbiAgICAgICAgaWYgKGRlY2xhcmF0aW9uQ2hlY2spIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkZXBlbmRlbmNpZXMgPSB7fSwgZGV2RGVwZW5kZW5jaWVzID0ge30gfSA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5lbnYucGF0aHMubWV0ZW9yQXBwLnJvb3QsICdwYWNrYWdlLmpzb24nKSwgJ1VURi04JylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICghKG5hbWUgaW4gZGVwZW5kZW5jaWVzKSAmJiAhKG5hbWUgaW4gZGV2RGVwZW5kZW5jaWVzKSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1ldGVvckFwcC5ydW5OcG0oWydpJywgJy1EJywgJy1FJywgJy0tb25seT1kZXYnLCBgJHtuYW1lfUAke3ZlcnNpb259YF0sICdpbmhlcml0Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGBjb3VsZCBubyByZWFkICR7cGF0aC5qb2luKHRoaXMuZW52LnBhdGhzLm1ldGVvckFwcC5yb290LCAncGFja2FnZS5qc29uJyl9YCwgZSk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVwZW5kZW5jeVBhdGggPSBwYXRoLmpvaW4odGhpcy5lbnYucGF0aHMubWV0ZW9yQXBwLnJvb3QsICdub2RlX21vZHVsZXMnLCBuYW1lKTtcbiAgICAgICAgbGV0IGRlcGVuZGVuY3kgPSBudWxsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZGVwZW5kZW5jeSA9IHJlcXVpcmUoZGVwZW5kZW5jeVBhdGgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb25DaGVjaykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLndhcm4oYGNvdWxkIG5vdCBmaW5kICR7bmFtZX0sIGluc3RhbGxpbmcgdGhlIGRlZmF1bHQgdmVyc2lvbiBmb3IgeW91OiAke25hbWV9QCR7dmVyc2lvbn1gKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1ldGVvckFwcC5ydW5OcG0oWydpJywgJy1EJywgJy1FJywgJy0tb25seT1kZXYnLCBgJHtuYW1lfUAke3ZlcnNpb259YF0sICdpbmhlcml0Jyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLndhcm4oYGNvdWxkIG5vdCBmaW5kICR7bmFtZX0sIGV4aXRpbmdgKTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoIWRlcGVuZGVuY3kpIHtcbiAgICAgICAgICAgICAgICBkZXBlbmRlbmN5ID0gcmVxdWlyZShkZXBlbmRlbmN5UGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVwZW5kZW5jeVZlcnNpb24gPSByZXF1aXJlKHBhdGguam9pbihkZXBlbmRlbmN5UGF0aCwgJ3BhY2thZ2UuanNvbicpKS52ZXJzaW9uO1xuXG4gICAgICAgIGlmIChkZXBlbmRlbmN5VmVyc2lvbiAhPT0gdmVyc2lvbikge1xuICAgICAgICAgICAgaWYgKGRlcGVuZGVuY3lWZXJzaW9uLnNwbGl0KCcuJylbMF0gIT09IHZlcnNpb24uc3BsaXQoJy4nKVswXSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLndhcm4oYHlvdSBhcmUgdXNpbmcgYSAke25hbWV9QCR7ZGVwZW5kZW5jeVZlcnNpb259IHdoaWxlIHRoZSByZWNvbW1lbmRlZCB2ZXJzaW9uIGlzIGAgK1xuICAgICAgICAgICAgICAgICAgICBgJHt2ZXJzaW9ufSwgdGhlIGNvbXBhdGliaWxpdHkgdmVyc2lvbiBpcyBkaWZmZXJlbnQsIHVzZSBhdCB5b3VyIG93biByaXNrLCBiZSBzdXJlIHRvIHJlcG9ydCBgICtcbiAgICAgICAgICAgICAgICAgICAgJ3RoYXQgd2hlbiBzdWJtaXR0aW5nIGlzc3VlcycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy53YXJuKGB5b3UgYXJlIHVzaW5nIGEgJHtuYW1lfUAke2RlcGVuZGVuY3lWZXJzaW9ufSB3aGlsZSB0aGUgcmVjb21tZW5kZWQgdmVyc2lvbiBpcyBgICtcbiAgICAgICAgICAgICAgICAgICAgYCR7dmVyc2lvbn0sIGJlIHN1cmUgdG8gcmVwb3J0IHRoYXQgd2hlbiBzdWJtaXR0aW5nIGlzc3Vlc2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRlcGVuZGVuY3ksIHBhdGg6IGRlcGVuZGVuY3lQYXRoIH07XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleHBvcnRzKGlucHV0LCBvdXRwdXQsIG9wdGlvbnMsIHsgbG9nID0gTG9nZ2VyIH0gPSB7IGxvZzogTG9nZ2VyIH0pIHtcbiAgICByZXR1cm4gbmV3IE1ldGVvckRlc2t0b3AoaW5wdXQsIG91dHB1dCwgb3B0aW9ucywgeyBsb2cgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQWJBO0FBZUFBLGdCQUFBLENBQU1DLE1BQU4sQ0FBYUMsS0FBYixHQUFxQixJQUFyQjtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE1BQU1DLGFBQU4sQ0FBb0I7RUFDaEI7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSUMsV0FBVyxDQUFDQyxLQUFELEVBQVFDLE1BQVIsRUFBZ0JDLE9BQWhCLEVBQXlCQyxZQUF6QixFQUF1QztJQUM5QyxNQUFNQyxHQUFHLEdBQUdELFlBQVksQ0FBQ0UsR0FBekI7SUFDQSxLQUFLQSxHQUFMLEdBQVcsSUFBSUQsR0FBSixDQUFRLE9BQVIsQ0FBWDtJQUNBLEtBQUtFLE9BQUwsR0FBZSxLQUFLQyxVQUFMLEVBQWY7SUFFQSxLQUFLRixHQUFMLENBQVNHLElBQVQsQ0FBYyxjQUFkO0lBRUEsS0FBS0MsR0FBTCxHQUFXLElBQUlDLFlBQUosQ0FBUVYsS0FBUixFQUFlQyxNQUFmLEVBQXVCQyxPQUF2QixDQUFYO0lBQ0EsS0FBS1MsUUFBTCxHQUFnQixJQUFJQyxpQkFBSixDQUFhLElBQWIsQ0FBaEI7SUFDQSxLQUFLQyxlQUFMLEdBQXVCLElBQUlDLHdCQUFKLENBQW9CLElBQXBCLENBQXZCO0lBQ0EsS0FBS0MsV0FBTCxHQUFtQixJQUFJQyxvQkFBSixDQUFnQixJQUFoQixDQUFuQjtJQUNBLEtBQUtDLE9BQUwsR0FBZSxJQUFJQyxnQkFBSixDQUFZ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 \ No newline at end of file diff --git a/dist/log.js b/dist/log.js new file mode 100644 index 00000000..5677ea1e --- /dev/null +++ b/dist/log.js @@ -0,0 +1,75 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +/* eslint-disable no-console */ + +/* + 0.OFF + 1.INFO + 2.WARN + 3.ERROR + 4.TRACE + 5.DEBUG + 6.ALL + */ +class Log { + constructor(prefix) { + this.prefix = prefix; + } + + static level() { + return process.env.MD_LOG_LEVEL || 'ALL'; + } + + static slice(args) { + return Array.prototype.slice.call(args, 0); + } + + log(type, args) { + console.log.apply(null, [`${type} ${this.prefix}: `].concat(Log.slice(args))); + } + + info(...args) { + if (/INFO|ALL/i.test(Log.level())) { + this.log('INFO', args); + } + } + + warn(...args) { + if (/WARN|ALL/i.test(Log.level())) { + this.log('WARN', args); + } + } + + error(...args) { + if (/ERROR|ALL/i.test(Log.level())) { + this.log('ERROR', args); + } + } + + debug(...args) { + if (/DEBUG|ALL/i.test(Log.level())) { + this.log('DEBUG', args); + } + } + + verbose(...args) { + if (/VERBOSE|ALL/i.test(Log.level())) { + this.log('VERBOSE', args); + } + } + + trace(...args) { + if (/TRACE|ALL/i.test(Log.level())) { + this.log('TRACE', args); + } + } + +} + +exports.default = Log; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMb2ciLCJjb25zdHJ1Y3RvciIsInByZWZpeCIsImxldmVsIiwicHJvY2VzcyIsImVudiIsIk1EX0xPR19MRVZFTCIsInNsaWNlIiwiYXJncyIsIkFycmF5IiwicHJvdG90eXBlIiwiY2FsbCIsImxvZyIsInR5cGUiLCJjb25zb2xlIiwiYXBwbHkiLCJjb25jYXQiLCJpbmZvIiwidGVzdCIsIndhcm4iLCJlcnJvciIsImRlYnVnIiwidmVyYm9zZSIsInRyYWNlIl0sInNvdXJjZXMiOlsiLi4vbGliL2xvZy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4vKlxuIDAuT0ZGXG4gMS5JTkZPXG4gMi5XQVJOXG4gMy5FUlJPUlxuIDQuVFJBQ0VcbiA1LkRFQlVHXG4gNi5BTExcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb2cge1xuICAgIGNvbnN0cnVjdG9yKHByZWZpeCkge1xuICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDtcbiAgICB9XG5cbiAgICBzdGF0aWMgbGV2ZWwoKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5NRF9MT0dfTEVWRUwgfHwgJ0FMTCc7XG4gICAgfVxuXG4gICAgc3RhdGljIHNsaWNlKGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3MsIDApO1xuICAgIH1cblxuICAgIGxvZyh0eXBlLCBhcmdzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nLmFwcGx5KG51bGwsIFtgJHt0eXBlfSAgJHt0aGlzLnByZWZpeH06IGBdLmNvbmNhdChMb2cuc2xpY2UoYXJncykpKTtcbiAgICB9XG5cbiAgICBpbmZvKC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKC9JTkZPfEFMTC9pLnRlc3QoTG9nLmxldmVsKCkpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZygnSU5GTycsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgd2FybiguLi5hcmdzKSB7XG4gICAgICAgIGlmICgvV0FSTnxBTEwvaS50ZXN0KExvZy5sZXZlbCgpKSkge1xuICAgICAgICAgICAgdGhpcy5sb2coJ1dBUk4nLCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVycm9yKC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKC9FUlJPUnxBTEwvaS50ZXN0KExvZy5sZXZlbCgpKSkge1xuICAgICAgICAgICAgdGhpcy5sb2coJ0VSUk9SJywgYXJncyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZWJ1ZyguLi5hcmdzKSB7XG4gICAgICAgIGlmICgvREVCVUd8QUxML2kudGVzdChMb2cubGV2ZWwoKSkpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKCdERUJVRycsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmVyYm9zZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICgvVkVSQk9TRXxBTEwvaS50ZXN0KExvZy5sZXZlbCgpKSkge1xuICAgICAgICAgICAgdGhpcy5sb2coJ1ZFUkJPU0UnLCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRyYWNlKC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKC9UUkFDRXxBTEwvaS50ZXN0KExvZy5sZXZlbCgpKSkge1xuICAgICAgICAgICAgdGhpcy5sb2coJ1RSQUNFJywgYXJncyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFZSxNQUFNQSxHQUFOLENBQVU7RUFDckJDLFdBQVcsQ0FBQ0MsTUFBRCxFQUFTO0lBQ2hCLEtBQUtBLE1BQUwsR0FBY0EsTUFBZDtFQUNIOztFQUVXLE9BQUxDLEtBQUssR0FBRztJQUNYLE9BQU9DLE9BQU8sQ0FBQ0MsR0FBUixDQUFZQyxZQUFaLElBQTRCLEtBQW5DO0VBQ0g7O0VBRVcsT0FBTEMsS0FBSyxDQUFDQyxJQUFELEVBQU87SUFDZixPQUFPQyxLQUFLLENBQUNDLFNBQU4sQ0FBZ0JILEtBQWhCLENBQXNCSSxJQUF0QixDQUEyQkgsSUFBM0IsRUFBaUMsQ0FBakMsQ0FBUDtFQUNIOztFQUVESSxHQUFHLENBQUNDLElBQUQsRUFBT0wsSUFBUCxFQUFhO0lBQ1pNLE9BQU8sQ0FBQ0YsR0FBUixDQUFZRyxLQUFaLENBQWtCLElBQWxCLEVBQXdCLENBQUUsR0FBRUYsSUFBSyxLQUFJLEtBQUtYLE1BQU8sSUFBekIsRUFBOEJjLE1BQTlCLENBQXFDaEIsR0FBRyxDQUFDTyxLQUFKLENBQVVDLElBQVYsQ0FBckMsQ0FBeEI7RUFDSDs7RUFFRFMsSUFBSSxDQUFDLEdBQUdULElBQUosRUFBVTtJQUNWLElBQUksWUFBWVUsSUFBWixDQUFpQmxCLEdBQUcsQ0FBQ0csS0FBSixFQUFqQixDQUFKLEVBQW1DO01BQy9CLEtBQUtTLEdBQUwsQ0FBUyxNQUFULEVBQWlCSixJQUFqQjtJQUNIO0VBQ0o7O0VBRURXLElBQUksQ0FBQyxHQUFHWCxJQUFKLEVBQVU7SUFDVixJQUFJLFlBQVlVLElBQVosQ0FBaUJsQixHQUFHLENBQUNHLEtBQUosRUFBakIsQ0FBSixFQUFtQztNQUMvQixLQUFLUyxHQUFMLENBQVMsTUFBVCxFQUFpQkosSUFBakI7SUFDSDtFQUNKOztFQUVEWSxLQUFLLENBQUMsR0FBR1osSUFBSixFQUFVO0lBQ1gsSUFBSSxhQUFhVSxJQUFiLENBQWtCbEIsR0FBRyxDQUFDRyxLQUFKLEVBQWxCLENBQUosRUFBb0M7TUFDaEMsS0FBS1MsR0FBTCxDQUFTLE9BQVQsRUFBa0JKLElBQWxCO0lBQ0g7RUFDSjs7RUFFRGEsS0FBSyxDQUFDLEdBQUdiLElBQUosRUFBVTtJQUNYLElBQUksYUFBYVUsSUFBYixDQUFrQmxCLEdBQUcsQ0FBQ0csS0FBSixFQUFsQixDQUFKLEVBQW9DO01BQ2hDLEtBQUtTLEdBQUwsQ0FBUyxPQUFULEVBQWtCSixJQUFsQjtJQUNIO0VBQ0o7O0VBRURjLE9BQU8sQ0FBQyxHQUFHZCxJQUFKLEVBQVU7SUFDYixJQUFJLGVBQWVVLElBQWYsQ0FBb0JsQixHQUFHLENBQUNHLEtBQUosRUFBcEIsQ0FBSixFQUFzQztNQUNsQyxLQUFLUyxHQUFMLENBQVMsU0FBVCxFQUFvQkosSUFBcEI7SUFDSDtFQUNKOztFQUVEZSxLQUFLLENBQUMsR0FBR2YsSUFBSixFQUFVO0lBQ1gsSUFBSSxhQUFhVSxJQUFiLENBQWtCbEIsR0FBRyxDQUFDRyxLQUFKLEVBQWxCLENBQUosRUFBb0M7TUFDaEMsS0FBS1MsR0FBTCxDQUFTLE9BQVQsRUFBa0JKLElBQWxCO0lBQ0g7RUFDSjs7QUFuRG9CIn0= \ No newline at end of file diff --git a/dist/meteorApp.js b/dist/meteorApp.js new file mode 100644 index 00000000..e4508bfe --- /dev/null +++ b/dist/meteorApp.js @@ -0,0 +1,923 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime")); + +var _fs = _interopRequireDefault(require("fs")); + +var _crossSpawn = _interopRequireDefault(require("cross-spawn")); + +var _semver = _interopRequireDefault(require("semver")); + +var _shelljs = _interopRequireDefault(require("shelljs")); + +var _path = _interopRequireDefault(require("path")); + +var _singleLineLog = _interopRequireDefault(require("single-line-log")); + +var _asar = _interopRequireDefault(require("@electron/asar")); + +var _nodeFetch = _interopRequireDefault(require("node-fetch")); + +var _isDesktopInjector = _interopRequireDefault(require("../skeleton/modules/autoupdate/isDesktopInjector")); + +var _log = _interopRequireDefault(require("./log")); + +var _meteorManager = _interopRequireDefault(require("./meteorManager")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// eslint-disable-next-line no-unused-vars +const { + join +} = _path.default; +const sll = _singleLineLog.default.stdout; // TODO: refactor all strategy ifs to one place + +/** + * Represents the Meteor app. + * @property {MeteorDesktop} $ + * @class + */ + +class MeteorApp { + /** + * @param {MeteorDesktop} $ - context + * @constructor + */ + constructor($) { + this.log = new _log.default('meteorApp'); + this.$ = $; + this.meteorManager = new _meteorManager.default($); + this.mobilePlatform = null; + this.oldManifest = null; + this.injector = new _isDesktopInjector.default(); + this.matcher = new RegExp('__meteor_runtime_config__ = JSON.parse\\(decodeURIComponent\\("([^"]*)"\\)\\)'); + this.replacer = new RegExp('(__meteor_runtime_config__ = JSON.parse\\(decodeURIComponent\\()"([^"]*)"(\\)\\))'); + this.meteorVersion = null; + this.indexHTMLstrategy = null; + this.indexHTMLStrategies = { + INDEX_FROM_CORDOVA_BUILD: 1, + INDEX_FROM_RUNNING_SERVER: 2 + }; + this.deprectatedPackages = ['omega:meteor-desktop-localstorage']; + } + /** + * Remove any deprecated packages from meteor project. + * @returns {Promise} + */ + + + async removeDeprecatedPackages() { + try { + if (this.meteorManager.checkPackages(this.deprectatedPackages)) { + this.log.info('deprecated meteor plugins found, removing them'); + await this.meteorManager.deletePackages(this.deprectatedPackages); + } + } catch (e) { + throw new Error(e); + } + } + /** + * Ensures that required packages are added to the Meteor app. + */ + + + async ensureDesktopHCPPackages() { + const desktopHCPPackages = ['communitypackages:meteor-desktop-watcher', 'communitypackages:meteor-desktop-bundler']; + + if (this.$.desktop.getSettings().desktopHCP) { + this.log.verbose('desktopHCP is enabled, checking for required packages'); + const packagesWithVersion = desktopHCPPackages.map(packageName => `${packageName}@${this.$.getVersion()}`); + + try { + await this.meteorManager.ensurePackages(desktopHCPPackages, packagesWithVersion, 'desktopHCP'); + } catch (e) { + throw new Error(e); + } + } else { + this.log.verbose('desktopHCP is not enabled, removing required packages'); + + try { + if (this.meteorManager.checkPackages(desktopHCPPackages)) { + await this.meteorManager.deletePackages(desktopHCPPackages); + } + } catch (e) { + throw new Error(e); + } + } + } + /** + * Adds entry to .meteor/.gitignore if necessary. + */ + + + updateGitIgnore() { + this.log.verbose('updating .meteor/.gitignore'); // Lets read the .meteor/.gitignore and filter out blank lines. + + const gitIgnore = _fs.default.readFileSync(this.$.env.paths.meteorApp.gitIgnore, 'UTF-8').split('\n').filter(ignoredPath => ignoredPath.trim() !== ''); + + if (!~gitIgnore.indexOf(this.$.env.paths.electronApp.rootName)) { + this.log.verbose(`adding ${this.$.env.paths.electronApp.rootName} to .meteor/.gitignore`); + gitIgnore.push(this.$.env.paths.electronApp.rootName); + + _fs.default.writeFileSync(this.$.env.paths.meteorApp.gitIgnore, gitIgnore.join('\n'), 'UTF-8'); + } + } + /** + * Reads the Meteor release version used in the app. + * @returns {string} + */ + + + getMeteorRelease() { + let release = _fs.default.readFileSync(this.$.env.paths.meteorApp.release, 'UTF-8').replace(/\r/gm, '').split('\n')[0]; + + [, release] = release.split('@'); // We do not care if it is beta. + + if (~release.indexOf('-')) { + [release] = release.split('-'); + } + + return release; + } + /** + * Cast Meteor release to semver version. + * @returns {string} + */ + + + castMeteorReleaseToSemver() { + return `${this.getMeteorRelease()}.0.0`.match(/(^\d+\.\d+\.\d+)/gmi)[0]; + } + /** + * Validate meteor version against a versionRange. + * @param {string} versionRange - semver version range + */ + + + checkMeteorVersion(versionRange) { + const release = this.castMeteorReleaseToSemver(); + + if (!_semver.default.satisfies(release, versionRange)) { + if (this.$.env.options.skipMobileBuild) { + this.log.error(`wrong meteor version (${release}) in project - only ` + `${versionRange} is supported`); + } else { + this.log.error(`wrong meteor version (${release}) in project - only ` + `${versionRange} is supported for automatic meteor builds (you can always ` + 'try with `--skip-mobile-build` if you are using meteor >= 1.2.1'); + } + + process.exit(1); + } + } + /** + * Decides which strategy to use while trying to get client build out of Meteor project. + * @returns {number} + */ + + + chooseStrategy() { + if (this.$.env.options.forceCordovaBuild) { + return this.indexHTMLStrategies.INDEX_FROM_CORDOVA_BUILD; + } + + const release = this.castMeteorReleaseToSemver(); + + if (_semver.default.satisfies(release, '> 1.3.4')) { + return this.indexHTMLStrategies.INDEX_FROM_RUNNING_SERVER; + } + + if (_semver.default.satisfies(release, '1.3.4')) { + const explodedVersion = this.getMeteorRelease().split('.'); + + if (explodedVersion.length >= 4) { + if (explodedVersion[3] > 1) { + return this.indexHTMLStrategies.INDEX_FROM_RUNNING_SERVER; + } + + return this.indexHTMLStrategies.INDEX_FROM_CORDOVA_BUILD; + } + } + + return this.indexHTMLStrategies.INDEX_FROM_CORDOVA_BUILD; + } + /** + * Checks required preconditions. + * - Meteor version + * - is mobile platform added + */ + + + async checkPreconditions() { + if (this.$.env.options.skipMobileBuild) { + this.checkMeteorVersion('>= 1.2.1'); + } else { + this.checkMeteorVersion('>= 1.3.3'); + this.indexHTMLstrategy = this.chooseStrategy(); + + if (this.indexHTMLstrategy === this.indexHTMLStrategies.INDEX_FROM_CORDOVA_BUILD) { + this.log.debug('meteor version is < 1.3.4.2 so the index.html from cordova-build will' + ' be used'); + } else { + this.log.debug('meteor version is >= 1.3.4.2 so the index.html will be downloaded ' + 'from __cordova/index.html'); + } + } + + if (!this.$.env.options.skipMobileBuild) { + const platforms = _fs.default.readFileSync(this.$.env.paths.meteorApp.platforms, 'UTF-8'); + + if (!~platforms.indexOf('android') && !~platforms.indexOf('ios')) { + if (!this.$.env.options.android) { + this.mobilePlatform = 'ios'; + } else { + this.mobilePlatform = 'android'; + } + + this.log.warn(`no mobile target detected - will add '${this.mobilePlatform}' ` + 'just to get a mobile build'); + + try { + await this.addMobilePlatform(this.mobilePlatform); + } catch (e) { + this.log.error('failed to add a mobile platform - please try to do it manually'); + process.exit(1); + } + } + } + } + /** + * Tries to add a mobile platform to meteor project. + * @param {string} platform - platform to add + * @returns {Promise} + */ + + + addMobilePlatform(platform) { + return new Promise((resolve, reject) => { + this.log.verbose(`adding mobile platform: ${platform}`); + (0, _crossSpawn.default)('meteor', ['add-platform', platform], { + cwd: this.$.env.paths.meteorApp.root, + stdio: this.$.env.stdio + }).on('exit', () => { + const platforms = _fs.default.readFileSync(this.$.env.paths.meteorApp.platforms, 'UTF-8'); + + if (!~platforms.indexOf('android') && !~platforms.indexOf('ios')) { + reject(); + } else { + resolve(); + } + }); + }); + } + /** + * Tries to remove a mobile platform from meteor project. + * @param {string} platform - platform to remove + * @returns {Promise} + */ + + + removeMobilePlatform(platform) { + if (this.$.env.options.skipRemoveMobilePlatform) { + return Promise.resolve(); + } + + return new Promise((resolve, reject) => { + this.log.verbose(`removing mobile platform: ${platform}`); + (0, _crossSpawn.default)('meteor', ['remove-platform', platform], { + cwd: this.$.env.paths.meteorApp.root, + stdio: this.$.env.stdio, + env: Object.assign({ + METEOR_PRETTY_OUTPUT: 0 + }, process.env) + }).on('exit', () => { + const platforms = _fs.default.readFileSync(this.$.env.paths.meteorApp.platforms, 'UTF-8'); + + if (~platforms.indexOf(platform)) { + reject(); + } else { + resolve(); + } + }); + }); + } + /** + * Just checks for index.html and program.json existence. + * @returns {boolean} + */ + + + isCordovaBuildReady() { + if (this.indexHTMLstrategy === this.indexHTMLStrategies.INDEX_FROM_CORDOVA_BUILD) { + return this.$.utils.exists(this.$.env.paths.meteorApp.cordovaBuildIndex) && this.$.utils.exists(this.$.env.paths.meteorApp.cordovaBuildProgramJson) && (!this.oldManifest || this.oldManifest && this.oldManifest !== _fs.default.readFileSync(this.$.env.paths.meteorApp.cordovaBuildProgramJson, 'UTF-8')); + } + + return this.$.utils.exists(this.$.env.paths.meteorApp.webCordovaProgramJson) && (!this.oldManifest || this.oldManifest && this.oldManifest !== _fs.default.readFileSync(this.$.env.paths.meteorApp.webCordovaProgramJson, 'UTF-8')); + } + /** + * Fetches index.html from running project. + * @returns {Promise.<*>} + */ + + + async acquireIndex() { + const port = this.$.env.options.port ? this.$.env.options.port : 3080; + this.log.info('acquiring index.html'); + const res = await (0, _nodeFetch.default)(`http://127.0.0.1:${port}/__cordova/index.html`); + const text = await res.text(); // Simple test if we really download index.html for web.cordova. + + if (~text.indexOf('src="/cordova.js"')) { + return text; + } + + return false; + } + /** + * Fetches mainfest.json from running project. + * @returns {Promise.} + */ + + + async acquireManifest() { + const port = this.$.env.options.port ? this.$.env.options.port : 3080; + this.log.info('acquiring manifest.json'); + const res = await (0, _nodeFetch.default)(`http://127.0.0.1:${port}/__cordova/manifest.json?meteor_dont_serve_index=true`); + const text = await res.text(); + return JSON.parse(text); + } + /** + * Tries to get a mobile build from meteor app. + * In case of failure leaves a meteor.log. + * A lot of stuff is happening here - but the main aim is to get a mobile build from + * .meteor/local/cordova-build/www/application and exit as soon as possible. + * + * @returns {Promise} + */ + + + buildMobileTarget() { + const programJson = this.indexHTMLstrategy === this.indexHTMLStrategies.INDEX_FROM_CORDOVA_BUILD ? this.$.env.paths.meteorApp.cordovaBuildProgramJson : this.$.env.paths.meteorApp.webCordovaProgramJson; + + if (this.$.utils.exists(programJson)) { + this.oldManifest = _fs.default.readFileSync(programJson, 'UTF-8'); + } + + return new Promise((resolve, reject) => { + const self = this; + let log = ''; + let desiredExit = false; + let buildTimeout = null; + let errorTimeout = null; + let messageTimeout = null; + let killTimeout = null; + let cordovaCheckInterval = null; + let portProblem = false; + + function windowsKill(pid) { + self.log.debug(`killing pid: ${pid}`); + + _crossSpawn.default.sync('taskkill', ['/pid', pid, '/f', '/t']); // We will look for other process which might have been created outside the + // process tree. + // Lets list all node.exe processes. + + + const out = _crossSpawn.default.sync('wmic', ['process', 'where', 'caption="node.exe"', 'get', 'commandline,processid']).stdout.toString('utf-8').split('\n'); + + const args = self.prepareArguments(); // Lets mount regex. + + const regexV1 = new RegExp(`${args.join('\\s+')}\\s+(\\d+)`, 'gm'); + const regexV2 = new RegExp(`"${args.join('"\\s+"')}"\\s+(\\d+)`, 'gm'); // No we will check for those with the matching params. + + out.forEach(line => { + const match = regexV1.exec(line) || regexV2.exec(line) || false; + + if (match) { + self.log.debug(`killing pid: ${match[1]}`); + + _crossSpawn.default.sync('taskkill', ['/pid', match[1], '/f', '/t']); + } + + regexV1.lastIndex = 0; + regexV2.lastIndex = 0; + }); + } + + function writeLog() { + _fs.default.writeFileSync('meteor.log', log, 'UTF-8'); + } + + function clearTimeoutsAndIntervals() { + clearInterval(cordovaCheckInterval); + clearTimeout(buildTimeout); + clearTimeout(errorTimeout); + clearTimeout(messageTimeout); + clearTimeout(killTimeout); + } + + const args = this.prepareArguments(); + this.log.info(`running "meteor ${args.join(' ')}"... this might take a while`); + const env = { + METEOR_PRETTY_OUTPUT: 0, + METEOR_NO_RELEASE_CHECK: 1 + }; + + if (this.$.env.options.prodDebug) { + env.METEOR_DESKOP_PROD_DEBUG = true; + } // Lets spawn meteor. + + + const child = (0, _crossSpawn.default)('meteor', args, { + env: Object.assign(env, process.env), + cwd: this.$.env.paths.meteorApp.root + }, { + shell: true + }); // Kills the currently running meteor command. + + function kill() { + sll(''); + child.kill('SIGKILL'); + + if (self.$.env.os.isWindows) { + windowsKill(child.pid); + } + } + + function exit() { + killTimeout = setTimeout(() => { + clearTimeoutsAndIntervals(); + desiredExit = true; + kill(); + resolve(); + }, 500); + } + + function copyBuild() { + self.copyBuild().then(() => { + exit(); + }).catch(() => { + clearTimeoutsAndIntervals(); + kill(); + writeLog(); + reject('copy'); + }); + } + + cordovaCheckInterval = setInterval(() => { + // Check if we already have cordova-build ready. + if (this.isCordovaBuildReady()) { + // If so, then exit immediately. + if (this.indexHTMLstrategy === this.indexHTMLStrategies.INDEX_FROM_CORDOVA_BUILD) { + copyBuild(); + } + } + }, 1000); + child.stderr.on('data', chunk => { + const line = chunk.toString('UTF-8'); + log += `${line}\n`; + + if (errorTimeout) { + clearTimeout(errorTimeout); + } // Do not exit if this is the warning for using --production. + // Output exceeds -> https://github.com/meteor/meteor/issues/8592 + + + if (!~line.indexOf('--production') && !~line.indexOf('Output exceeds ') && !~line.indexOf('Node#moveTo') && !~line.indexOf('Browserslist') && Array.isArray(self.$.env.options.ignoreStderr) && self.$.env.options.ignoreStderr.every(str => !~line.indexOf(str))) { + self.log.warn('STDERR:', line); // We will exit 1s after last error in stderr. + + errorTimeout = setTimeout(() => { + clearTimeoutsAndIntervals(); + kill(); + writeLog(); + reject('error'); + }, 1000); + } + }); + child.stdout.on('data', chunk => { + const line = chunk.toString('UTF-8'); + + if (!desiredExit && line.trim().replace(/[\n\r\t\v\f]+/gm, '') !== '') { + const linesToDisplay = line.trim().split('\n\r'); // Only display last line from the chunk. + + const sanitizedLine = linesToDisplay.pop().replace(/[\n\r\t\v\f]+/gm, ''); + sll(sanitizedLine); + } + + log += `${line}\n`; + + if (~line.indexOf('after_platform_add')) { + sll(''); + this.log.info('done... 10%'); + } + + if (~line.indexOf('Local package version')) { + if (messageTimeout) { + clearTimeout(messageTimeout); + } + + messageTimeout = setTimeout(() => { + sll(''); + this.log.info('building in progress...'); + }, 1500); + } + + if (~line.indexOf('Preparing Cordova project')) { + sll(''); + this.log.info('done... 60%'); + } + + if (~line.indexOf('Can\'t listen on port')) { + portProblem = true; + } + + if (~line.indexOf('Your application has errors')) { + if (errorTimeout) { + clearTimeout(errorTimeout); + } + + errorTimeout = setTimeout(() => { + clearTimeoutsAndIntervals(); + kill(); + writeLog(); + reject('errorInApp'); + }, 1000); + } + + if (~line.indexOf('App running at')) { + copyBuild(); + } + }); // When Meteor exits + + child.on('exit', () => { + sll(''); + clearTimeoutsAndIntervals(); + + if (!desiredExit) { + writeLog(); + + if (portProblem) { + reject('port'); + } else { + reject('exit'); + } + } + }); + buildTimeout = setTimeout(() => { + kill(); + writeLog(); + reject('timeout'); + }, this.$.env.options.buildTimeout ? this.$.env.options.buildTimeout * 1000 : 600000); + }); + } + /** + * Replaces the DDP url that was used originally when Meteor was building the client. + * @param {string} indexHtml - path to index.html from the client + */ + + + updateDdpUrl(indexHtml) { + let content; + let runtimeConfig; + + try { + content = _fs.default.readFileSync(indexHtml, 'UTF-8'); + } catch (e) { + this.log.error(`error loading index.html file: ${e.message}`); + process.exit(1); + } + + if (!this.matcher.test(content)) { + this.log.error('could not find runtime config in index file'); + process.exit(1); + } + + try { + const matches = content.match(this.matcher); + runtimeConfig = JSON.parse(decodeURIComponent(matches[1])); + } catch (e) { + this.log.error('could not find runtime config in index file'); + process.exit(1); + } + + if (this.$.env.options.ddpUrl.substr(-1, 1) !== '/') { + this.$.env.options.ddpUrl += '/'; + } + + runtimeConfig.ROOT_URL = this.$.env.options.ddpUrl; + runtimeConfig.DDP_DEFAULT_CONNECTION_URL = this.$.env.options.ddpUrl; + content = content.replace(this.replacer, `$1"${encodeURIComponent(JSON.stringify(runtimeConfig))}"$3`); + + try { + _fs.default.writeFileSync(indexHtml, content); + } catch (e) { + this.log.error(`error writing index.html file: ${e.message}`); + process.exit(1); + } + + this.log.info('successfully updated ddp string in the runtime config of a mobile build' + ` to ${this.$.env.options.ddpUrl}`); + } + /** + * Prepares the arguments passed to `meteor` command. + * @returns {string[]} + */ + + + prepareArguments() { + const args = ['run', '--verbose', `--mobile-server=${this.$.env.options.ddpUrl}`]; + + if (this.$.env.isProductionBuild()) { + args.push('--production'); + } + + args.push('-p'); + + if (this.$.env.options.port) { + args.push(this.$.env.options.port); + } else { + args.push('3080'); + } + + if (this.$.env.options.meteorSettings) { + args.push('--settings', this.$.env.options.meteorSettings); + } + + return args; + } + /** + * Validates the mobile build and copies it into electron app. + */ + + + async copyBuild() { + this.log.debug('clearing build dir'); + + try { + await this.$.utils.rmWithRetries('-rf', this.$.env.paths.electronApp.meteorApp); + } catch (e) { + throw new Error(e); + } + + let prefix = 'cordovaBuild'; + let copyPathPostfix = ''; + + if (this.indexHTMLstrategy === this.indexHTMLStrategies.INDEX_FROM_RUNNING_SERVER) { + prefix = 'webCordova'; + copyPathPostfix = `${_path.default.sep}*`; + let indexHtml; + + try { + _fs.default.mkdirSync(this.$.env.paths.electronApp.meteorApp); + + indexHtml = await this.acquireIndex(); + + _fs.default.writeFileSync(this.$.env.paths.electronApp.meteorAppIndex, indexHtml); + + this.log.info('successfully downloaded index.html from running meteor app'); + } catch (e) { + this.log.error('error while trying to download index.html for web.cordova, ' + 'be sure that you are running a mobile target or with' + ' --mobile-server: ', e); + throw e; + } + } + + const cordovaBuild = this.$.env.paths.meteorApp[prefix]; + const { + cordovaBuildIndex + } = this.$.env.paths.meteorApp; + const cordovaBuildProgramJson = this.$.env.paths.meteorApp[`${prefix}ProgramJson`]; + + if (!this.$.utils.exists(cordovaBuild)) { + this.log.error(`no mobile build found at ${cordovaBuild}`); + this.log.error('are you sure you did run meteor with --mobile-server?'); + throw new Error('required file not present'); + } + + if (!this.$.utils.exists(cordovaBuildProgramJson)) { + this.log.error('no program.json found in mobile build found at ' + `${cordovaBuild}`); + this.log.error('are you sure you did run meteor with --mobile-server?'); + throw new Error('required file not present'); + } + + if (this.indexHTMLstrategy !== this.indexHTMLStrategies.INDEX_FROM_RUNNING_SERVER) { + if (!this.$.utils.exists(cordovaBuildIndex)) { + this.log.error('no index.html found in cordova build found at ' + `${cordovaBuild}`); + this.log.error('are you sure you did run meteor with --mobile-server?'); + throw new Error('required file not present'); + } + } + + this.log.verbose('copying mobile build'); + + _shelljs.default.cp('-R', `${cordovaBuild}${copyPathPostfix}`, this.$.env.paths.electronApp.meteorApp); // Because of various permission problems here we try to clear te path by clearing + // all possible restrictions. + + + _shelljs.default.chmod('-R', '777', this.$.env.paths.electronApp.meteorApp); + + if (this.$.env.os.isWindows) { + _shelljs.default.exec(`attrib -r ${this.$.env.paths.electronApp.meteorApp}${_path.default.sep}*.* /s`); + } + + if (this.indexHTMLstrategy === this.indexHTMLStrategies.INDEX_FROM_RUNNING_SERVER) { + let programJson; + + try { + programJson = await this.acquireManifest(); + + _fs.default.writeFileSync(this.$.env.paths.electronApp.meteorAppProgramJson, JSON.stringify(programJson, null, 4)); + + this.log.info('successfully downloaded manifest.json from running meteor app'); + } catch (e) { + this.log.error('error while trying to download manifest.json for web.cordova,' + ' be sure that you are running a mobile target or with' + ' --mobile-server: ', e); + throw e; + } + } + + this.log.info('mobile build copied to electron app'); + this.log.debug('copy cordova.js to meteor build'); + + _shelljs.default.cp(join(__dirname, '..', 'skeleton', 'cordova.js'), this.$.env.paths.electronApp.meteorApp); + } + /** + * Injects Meteor.isDesktop + */ + + + injectIsDesktop() { + this.log.info('injecting isDesktop'); + let manifestJsonPath = this.$.env.paths.meteorApp.cordovaBuildProgramJson; + + if (this.indexHTMLstrategy === this.indexHTMLStrategies.INDEX_FROM_RUNNING_SERVER) { + manifestJsonPath = this.$.env.paths.meteorApp.webCordovaProgramJson; + } + + try { + const { + manifest + } = JSON.parse(_fs.default.readFileSync(manifestJsonPath, 'UTF-8')); + let injected = false; + let injectedStartupDidComplete = false; + let result = null; // We will search in every .js file in the manifest. + // We could probably detect whether this is a dev or production build and only search in + // the correct files, but for now this should be fine. + + manifest.forEach(file => { + let fileContents; // Hacky way of setting isDesktop. + + if (file.type === 'js') { + fileContents = _fs.default.readFileSync(join(this.$.env.paths.electronApp.meteorApp, file.path), 'UTF-8'); + result = this.injector.processFileContents(fileContents); + ({ + fileContents + } = result); + injectedStartupDidComplete = result.injectedStartupDidComplete ? true : injectedStartupDidComplete; + injected = result.injected ? true : injected; + + _fs.default.writeFileSync(join(this.$.env.paths.electronApp.meteorApp, file.path), fileContents); + } + }); + + if (!injected) { + this.log.error('error injecting isDesktop global var.'); + process.exit(1); + } + + if (!injectedStartupDidComplete) { + this.log.error('error injecting isDesktop for startupDidComplete'); + process.exit(1); + } + } catch (e) { + this.log.error('error occurred while injecting isDesktop: ', e); + process.exit(1); + } + + this.log.info('injected successfully'); + } + /** + * Builds, modifies and copies the meteor app to electron app. + */ + + + async build() { + this.log.info('checking for any mobile platform'); + + try { + await this.checkPreconditions(); + } catch (e) { + this.log.error('error occurred during checking preconditions: ', e); + process.exit(1); + } + + this.log.info('building meteor app'); + + if (!this.$.env.options.skipMobileBuild) { + try { + await this.buildMobileTarget(); + } catch (reason) { + switch (reason) { + case 'timeout': + this.log.error('timeout while building, log has been written to meteor.log'); + break; + + case 'error': + this.log.error('build was terminated by meteor-desktop as some errors were reported to stderr, you ' + 'should see it above, also check meteor.log for more info, to ignore it use the ' + '--ignore-stderr ""'); + break; + + case 'errorInApp': + this.log.error('your meteor app has errors - look into meteor.log for more' + ' info'); + break; + + case 'port': + this.log.error('your port 3080 is currently used (you probably have this or other ' + 'meteor project running?), use `-t` or `--meteor-port` to use ' + 'different port while building'); + break; + + case 'exit': + this.log.error('meteor cmd exited unexpectedly, log has been written to meteor.log'); + break; + + case 'copy': + this.log.error('error encountered when copying the build'); + break; + + default: + this.log.error('error occurred during building mobile target', reason); + } + + if (this.mobilePlatform) { + await this.removeMobilePlatform(this.mobilePlatform); + } + + process.exit(1); + } + } else { + this.indexHTMLstrategy = this.chooseStrategy(); + + try { + await this.copyBuild(); + } catch (e) { + process.exit(1); + } + } + + this.injectIsDesktop(); + this.changeDdpUrl(); + + try { + await this.packToAsar(); + } catch (e) { + this.log.error('error while packing meteor app to asar'); + process.exit(1); + } + + this.log.info('meteor build finished'); + + if (this.mobilePlatform) { + await this.removeMobilePlatform(this.mobilePlatform); + } + } + + changeDdpUrl() { + if (this.$.env.options.ddpUrl !== null) { + try { + this.updateDdpUrl(this.$.env.paths.electronApp.meteorAppIndex); + } catch (e) { + this.log.error(`error while trying to change the ddp url: ${e.message}`); + } + } + } + + packToAsar() { + this.log.info('packing meteor app to asar archive'); + return new Promise((resolve, reject) => _asar.default.createPackage(this.$.env.paths.electronApp.meteorApp, _path.default.join(this.$.env.paths.electronApp.root, 'meteor.asar')).then(() => { + // On Windows some files might still be blocked. Giving a tick for them to be + // ready for deletion. + setImmediate(() => { + this.log.verbose('clearing meteor app after packing'); + this.$.utils.rmWithRetries('-rf', this.$.env.paths.electronApp.meteorApp).then(() => { + resolve(); + }).catch(e => { + reject(e); + }); + }); + })); + } + /** + * Wrapper for spawning npm. + * @param {Array} commands - commands for spawn + * @param {string} stdio + * @param {string} cwd + * @return {Promise} + */ + + + runNpm(commands, stdio = 'ignore', cwd = this.$.env.paths.meteorApp.root) { + return new Promise((resolve, reject) => { + this.log.verbose(`executing meteor npm ${commands.join(' ')}`); + (0, _crossSpawn.default)('meteor', ['npm', ...commands], { + cwd, + stdio + }).on('exit', code => code === 0 ? resolve() : reject(new Error(`npm exit code was ${code}`))); + }); + } + +} + +exports.default = MeteorApp; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJqb2luIiwicGF0aCIsInNsbCIsInNpbmdsZUxpbmVMb2ciLCJzdGRvdXQiLCJNZXRlb3JBcHAiLCJjb25zdHJ1Y3RvciIsIiQiLCJsb2ciLCJMb2ciLCJtZXRlb3JNYW5hZ2VyIiwiTWV0ZW9yTWFuYWdlciIsIm1vYmlsZVBsYXRmb3JtIiwib2xkTWFuaWZlc3QiLCJpbmplY3RvciIsIklzRGVza3RvcEluamVjdG9yIiwibWF0Y2hlciIsIlJlZ0V4cCIsInJlcGxhY2VyIiwibWV0ZW9yVmVyc2lvbiIsImluZGV4SFRNTHN0cmF0ZWd5IiwiaW5kZXhIVE1MU3RyYXRlZ2llcyIsIklOREVYX0ZST01fQ09SRE9WQV9CVUlMRCIsIklOREVYX0ZST01fUlVOTklOR19TRVJWRVIiLCJkZXByZWN0YXRlZFBhY2thZ2VzIiwicmVtb3ZlRGVwcmVjYXRlZFBhY2thZ2VzIiwiY2hlY2tQYWNrYWdlcyIsImluZm8iLCJkZWxldGVQYWNrYWdlcyIsImUiLCJFcnJvciIsImVuc3VyZURlc2t0b3BIQ1BQYWNrYWdlcyIsImRlc2t0b3BIQ1BQYWNrYWdlcyIsImRlc2t0b3AiLCJnZXRTZXR0aW5ncyIsImRlc2t0b3BIQ1AiLCJ2ZXJib3NlIiwicGFja2FnZXNXaXRoVmVyc2lvbiIsIm1hcCIsInBhY2thZ2VOYW1lIiwiZ2V0VmVyc2lvbiIsImVuc3VyZVBhY2thZ2VzIiwidXBkYXRlR2l0SWdub3JlIiwiZ2l0SWdub3JlIiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJlbnYiLCJwYXRocyIsIm1ldGVvckFwcCIsInNwbGl0IiwiZmlsdGVyIiwiaWdub3JlZFBhdGgiLCJ0cmltIiwiaW5kZXhPZiIsImVsZWN0cm9uQXBwIiwicm9vdE5hbWUiLCJwdXNoIiwid3JpdGVGaWxlU3luYyIsImdldE1ldGVvclJlbGVhc2UiLCJyZWxlYXNlIiwicmVwbGFjZSIsImNhc3RNZXRlb3JSZWxlYXNlVG9TZW12ZXIiLCJtYXRjaCIsImNoZWNrTWV0ZW9yVmVyc2lvbiIsInZlcnNpb25SYW5nZSIsInNlbXZlciIsInNhdGlzZmllcyIsIm9wdGlvbnMiLCJza2lwTW9iaWxlQnVpbGQiLCJlcnJvciIsInByb2Nlc3MiLCJleGl0IiwiY2hvb3NlU3RyYXRlZ3kiLCJmb3JjZUNvcmRvdmFCdWlsZCIsImV4cGxvZGVkVmVyc2lvbiIsImxlbmd0aCIsImNoZWNrUHJlY29uZGl0aW9ucyIsImRlYnVnIiwicGxhdGZvcm1zIiwiYW5kcm9pZCIsIndhcm4iLCJhZGRNb2JpbGVQbGF0Zm9ybSIsInBsYXRmb3JtIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJzcGF3biIsImN3ZCIsInJvb3QiLCJzdGRpbyIsIm9uIiwicmVtb3ZlTW9iaWxlUGxhdGZvcm0iLCJza2lwUmVtb3ZlTW9iaWxlUGxhdGZvcm0iLCJPYmplY3QiLCJhc3NpZ24iLCJNRVRFT1JfUFJFVFRZX09VVFBVVCIsImlzQ29yZG92YUJ1aWxkUmVhZHkiLCJ1dGlscyIsImV4aXN0cyIsImNvcmRvdmFCdWlsZEluZGV4IiwiY29yZG92YUJ1aWxkUHJvZ3JhbUpzb24iLCJ3ZWJDb3Jkb3ZhUHJvZ3JhbUpzb24iLCJhY3F1aXJlSW5kZXgiLCJwb3J0IiwicmVzIiwiZmV0Y2giLCJ0ZXh0IiwiYWNxdWlyZU1hbmlmZXN0IiwiSlNPTiIsInBhcnNlIiwiYnVpbGRNb2JpbGVUYXJnZXQiLCJwcm9ncmFtSnNvbiIsInNlbGYiLCJkZXNpcmVkRXhpdCIsImJ1aWxkVGltZW91dCIsImVycm9yVGltZW91dCIsIm1lc3NhZ2VUaW1lb3V0Iiwia2lsbFRpbWVvdXQiLCJjb3Jkb3ZhQ2hlY2tJbnRlcnZhbCIsInBvcnRQcm9ibGVtIiwid2luZG93c0tpbGwiLCJwaWQiLCJzeW5jIiwib3V0IiwidG9TdHJpbmciLCJhcmdzIiwicHJlcGFyZUFyZ3VtZW50cyIsInJlZ2V4VjEiLCJyZWdleFYyIiwiZm9yRWFjaCIsImxpbmUiLCJleGVjIiwibGFzdEluZGV4Iiwid3JpdGVMb2ciLCJjbGVhclRpbWVvdXRzQW5kSW50ZXJ2YWxzIiwiY2xlYXJJbnRlcnZhbCIsImNsZWFyVGltZW91dCIsIk1FVEVPUl9OT19SRUxFQVNFX0NIRUNLIiwicHJvZERlYnVnIiwiTUVURU9SX0RFU0tPUF9QUk9EX0RFQlVHIiwiY2hpbGQiLCJzaGVsbCIsImtpbGwiLCJvcyIsImlzV2luZG93cyIsInNldFRpbWVvdXQiLCJjb3B5QnVpbGQiLCJ0aGVuIiwiY2F0Y2giLCJzZXRJbnRlcnZhbCIsInN0ZGVyciIsImNodW5rIiwiQXJyYXkiLCJpc0FycmF5IiwiaWdub3JlU3RkZXJyIiwiZXZlcnkiLCJzdHIiLCJsaW5lc1RvRGlzcGxheSIsInNhbml0aXplZExpbmUiLCJwb3AiLCJ1cGRhdGVEZHBVcmwiLCJpbmRleEh0bWwiLCJjb250ZW50IiwicnVudGltZUNvbmZpZyIsIm1lc3NhZ2UiLCJ0ZXN0IiwibWF0Y2hlcyIsImRlY29kZVVSSUNvbXBvbmVudCIsImRkcFVybCIsInN1YnN0ciIsIlJPT1RfVVJMIiwiRERQX0RFRkFVTFRfQ09OTkVDVElPTl9VUkwiLCJlbmNvZGVVUklDb21wb25lbnQiLCJzdHJpbmdpZnkiLCJpc1Byb2R1Y3Rpb25CdWlsZCIsIm1ldGVvclNldHRpbmdzIiwicm1XaXRoUmV0cmllcyIsInByZWZpeCIsImNvcHlQYXRoUG9zdGZpeCIsInNlcCIsIm1rZGlyU3luYyIsIm1ldGVvckFwcEluZGV4IiwiY29yZG92YUJ1aWxkIiwiY3AiLCJjaG1vZCIsIm1ldGVvckFwcFByb2dyYW1Kc29uIiwiX19kaXJuYW1lIiwiaW5qZWN0SXNEZXNrdG9wIiwibWFuaWZlc3RKc29uUGF0aCIsIm1hbmlmZXN0IiwiaW5qZWN0ZWQiLCJpbmplY3RlZFN0YXJ0dXBEaWRDb21wbGV0ZSIsInJlc3VsdCIsImZpbGUiLCJmaWxlQ29udGVudHMiLCJ0eXBlIiwicHJvY2Vzc0ZpbGVDb250ZW50cyIsImJ1aWxkIiwicmVhc29uIiwiY2hhbmdlRGRwVXJsIiwicGFja1RvQXNhciIsImFzYXIiLCJjcmVhdGVQYWNrYWdlIiwic2V0SW1tZWRpYXRlIiwicnVuTnBtIiwiY29tbWFuZHMiLCJjb2RlIl0sInNvdXJjZXMiOlsiLi4vbGliL21ldGVvckFwcC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmltcG9ydCByZWdlbmVyYXRvclJ1bnRpbWUgZnJvbSAncmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgc3Bhd24gZnJvbSAnY3Jvc3Mtc3Bhd24nO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHNoZWxsIGZyb20gJ3NoZWxsanMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgc2luZ2xlTGluZUxvZyBmcm9tICdzaW5nbGUtbGluZS1sb2cnO1xuaW1wb3J0IGFzYXIgZnJvbSAnQGVsZWN0cm9uL2FzYXInO1xuaW1wb3J0IGZldGNoIGZyb20gJ25vZGUtZmV0Y2gnO1xuXG5pbXBvcnQgSXNEZXNrdG9wSW5qZWN0b3IgZnJvbSAnLi4vc2tlbGV0b24vbW9kdWxlcy9hdXRvdXBkYXRlL2lzRGVza3RvcEluamVjdG9yJztcbmltcG9ydCBMb2cgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IE1ldGVvck1hbmFnZXIgZnJvbSAnLi9tZXRlb3JNYW5hZ2VyJztcblxuY29uc3QgeyBqb2luIH0gPSBwYXRoO1xuY29uc3Qgc2xsID0gc2luZ2xlTGluZUxvZy5zdGRvdXQ7XG5cbi8vIFRPRE86IHJlZmFjdG9yIGFsbCBzdHJhdGVneSBpZnMgdG8gb25lIHBsYWNlXG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgTWV0ZW9yIGFwcC5cbiAqIEBwcm9wZXJ0eSB7TWV0ZW9yRGVza3RvcH0gJFxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1ldGVvckFwcCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNZXRlb3JEZXNrdG9wfSAkIC0gY29udGV4dFxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCQpIHtcbiAgICAgICAgdGhpcy5sb2cgPSBuZXcgTG9nKCdtZXRlb3JBcHAnKTtcbiAgICAgICAgdGhpcy4kID0gJDtcbiAgICAgICAgdGhpcy5tZXRlb3JNYW5hZ2VyID0gbmV3IE1ldGVvck1hbmFnZXIoJCk7XG4gICAgICAgIHRoaXMubW9iaWxlUGxhdGZvcm0gPSBudWxsO1xuICAgICAgICB0aGlzLm9sZE1hbmlmZXN0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5pbmplY3RvciA9IG5ldyBJc0Rlc2t0b3BJbmplY3RvcigpO1xuICAgICAgICB0aGlzLm1hdGNoZXIgPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ19fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18gPSBKU09OLnBhcnNlXFxcXChkZWNvZGVVUklDb21wb25lbnRcXFxcKFwiKFteXCJdKilcIlxcXFwpXFxcXCknXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucmVwbGFjZXIgPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJyhfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fID0gSlNPTi5wYXJzZVxcXFwoZGVjb2RlVVJJQ29tcG9uZW50XFxcXCgpXCIoW15cIl0qKVwiKFxcXFwpXFxcXCkpJ1xuICAgICAgICApO1xuICAgICAgICB0aGlzLm1ldGVvclZlcnNpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmluZGV4SFRNTHN0cmF0ZWd5ID0gbnVsbDtcblxuICAgICAgICB0aGlzLmluZGV4SFRNTFN0cmF0ZWdpZXMgPSB7XG4gICAgICAgICAgICBJTkRFWF9GUk9NX0NPUkRPVkFfQlVJTEQ6IDEsXG4gICAgICAgICAgICBJTkRFWF9GUk9NX1JVTk5JTkdfU0VSVkVSOiAyXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5kZXByZWN0YXRlZFBhY2thZ2VzID0gWydvbWVnYTptZXRlb3ItZGVza3RvcC1sb2NhbHN0b3JhZ2UnXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYW55IGRlcHJlY2F0ZWQgcGFja2FnZXMgZnJvbSBtZXRlb3IgcHJvamVjdC5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBhc3luYyByZW1vdmVEZXByZWNhdGVkUGFja2FnZXMoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tZXRlb3JNYW5hZ2VyLmNoZWNrUGFja2FnZXModGhpcy5kZXByZWN0YXRlZFBhY2thZ2VzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ2RlcHJlY2F0ZWQgbWV0ZW9yIHBsdWdpbnMgZm91bmQsIHJlbW92aW5nIHRoZW0nKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1ldGVvck1hbmFnZXIuZGVsZXRlUGFja2FnZXModGhpcy5kZXByZWN0YXRlZFBhY2thZ2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5zdXJlcyB0aGF0IHJlcXVpcmVkIHBhY2thZ2VzIGFyZSBhZGRlZCB0byB0aGUgTWV0ZW9yIGFwcC5cbiAgICAgKi9cbiAgICBhc3luYyBlbnN1cmVEZXNrdG9wSENQUGFja2FnZXMoKSB7XG4gICAgICAgIGNvbnN0IGRlc2t0b3BIQ1BQYWNrYWdlcyA9IFsnY29tbXVuaXR5cGFja2FnZXM6bWV0ZW9yLWRlc2t0b3Atd2F0Y2hlcicsICdjb21tdW5pdHlwYWNrYWdlczptZXRlb3ItZGVza3RvcC1idW5kbGVyJ107XG4gICAgICAgIGlmICh0aGlzLiQuZGVza3RvcC5nZXRTZXR0aW5ncygpLmRlc2t0b3BIQ1ApIHtcbiAgICAgICAgICAgIHRoaXMubG9nLnZlcmJvc2UoJ2Rlc2t0b3BIQ1AgaXMgZW5hYmxlZCwgY2hlY2tpbmcgZm9yIHJlcXVpcmVkIHBhY2thZ2VzJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhY2thZ2VzV2l0aFZlcnNpb24gPSBkZXNrdG9wSENQUGFja2FnZXMubWFwKHBhY2thZ2VOYW1lID0+IGAke3BhY2thZ2VOYW1lfUAke3RoaXMuJC5nZXRWZXJzaW9uKCl9YCk7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5tZXRlb3JNYW5hZ2VyLmVuc3VyZVBhY2thZ2VzKGRlc2t0b3BIQ1BQYWNrYWdlcywgcGFja2FnZXNXaXRoVmVyc2lvbiwgJ2Rlc2t0b3BIQ1AnKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZy52ZXJib3NlKCdkZXNrdG9wSENQIGlzIG5vdCBlbmFibGVkLCByZW1vdmluZyByZXF1aXJlZCBwYWNrYWdlcycpO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1ldGVvck1hbmFnZXIuY2hlY2tQYWNrYWdlcyhkZXNrdG9wSENQUGFja2FnZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWV0ZW9yTWFuYWdlci5kZWxldGVQYWNrYWdlcyhkZXNrdG9wSENQUGFja2FnZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGVudHJ5IHRvIC5tZXRlb3IvLmdpdGlnbm9yZSBpZiBuZWNlc3NhcnkuXG4gICAgICovXG4gICAgdXBkYXRlR2l0SWdub3JlKCkge1xuICAgICAgICB0aGlzLmxvZy52ZXJib3NlKCd1cGRhdGluZyAubWV0ZW9yLy5naXRpZ25vcmUnKTtcbiAgICAgICAgLy8gTGV0cyByZWFkIHRoZSAubWV0ZW9yLy5naXRpZ25vcmUgYW5kIGZpbHRlciBvdXQgYmxhbmsgbGluZXMuXG4gICAgICAgIGNvbnN0IGdpdElnbm9yZSA9IGZzLnJlYWRGaWxlU3luYyh0aGlzLiQuZW52LnBhdGhzLm1ldGVvckFwcC5naXRJZ25vcmUsICdVVEYtOCcpXG4gICAgICAgICAgICAuc3BsaXQoJ1xcbicpLmZpbHRlcihpZ25vcmVkUGF0aCA9PiBpZ25vcmVkUGF0aC50cmltKCkgIT09ICcnKTtcblxuICAgICAgICBpZiAoIX5naXRJZ25vcmUuaW5kZXhPZih0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnJvb3ROYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5sb2cudmVyYm9zZShgYWRkaW5nICR7dGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5yb290TmFtZX0gdG8gLm1ldGVvci8uZ2l0aWdub3JlYCk7XG4gICAgICAgICAgICBnaXRJZ25vcmUucHVzaCh0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnJvb3ROYW1lKTtcblxuICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLiQuZW52LnBhdGhzLm1ldGVvckFwcC5naXRJZ25vcmUsIGdpdElnbm9yZS5qb2luKCdcXG4nKSwgJ1VURi04Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWFkcyB0aGUgTWV0ZW9yIHJlbGVhc2UgdmVyc2lvbiB1c2VkIGluIHRoZSBhcHAuXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRNZXRlb3JSZWxlYXNlKCkge1xuICAgICAgICBsZXQgcmVsZWFzZSA9IGZzLnJlYWRGaWxlU3luYyh0aGlzLiQuZW52LnBhdGhzLm1ldGVvckFwcC5yZWxlYXNlLCAnVVRGLTgnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcci9nbSwgJycpXG4gICAgICAgICAgICAuc3BsaXQoJ1xcbicpWzBdO1xuICAgICAgICAoWywgcmVsZWFzZV0gPSByZWxlYXNlLnNwbGl0KCdAJykpO1xuICAgICAgICAvLyBXZSBkbyBub3QgY2FyZSBpZiBpdCBpcyBiZXRhLlxuICAgICAgICBpZiAofnJlbGVhc2UuaW5kZXhPZignLScpKSB7XG4gICAgICAgICAgICAoW3JlbGVhc2VdID0gcmVsZWFzZS5zcGxpdCgnLScpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVsZWFzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0IE1ldGVvciByZWxlYXNlIHRvIHNlbXZlciB2ZXJzaW9uLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgY2FzdE1ldGVvclJlbGVhc2VUb1NlbXZlcigpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuZ2V0TWV0ZW9yUmVsZWFzZSgpfS4wLjBgLm1hdGNoKC8oXlxcZCtcXC5cXGQrXFwuXFxkKykvZ21pKVswXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBtZXRlb3IgdmVyc2lvbiBhZ2FpbnN0IGEgdmVyc2lvblJhbmdlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uUmFuZ2UgLSBzZW12ZXIgdmVyc2lvbiByYW5nZVxuICAgICAqL1xuICAgIGNoZWNrTWV0ZW9yVmVyc2lvbih2ZXJzaW9uUmFuZ2UpIHtcbiAgICAgICAgY29uc3QgcmVsZWFzZSA9IHRoaXMuY2FzdE1ldGVvclJlbGVhc2VUb1NlbXZlcigpO1xuICAgICAgICBpZiAoIXNlbXZlci5zYXRpc2ZpZXMocmVsZWFzZSwgdmVyc2lvblJhbmdlKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuJC5lbnYub3B0aW9ucy5za2lwTW9iaWxlQnVpbGQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihgd3JvbmcgbWV0ZW9yIHZlcnNpb24gKCR7cmVsZWFzZX0pIGluIHByb2plY3QgLSBvbmx5IGAgK1xuICAgICAgICAgICAgICAgICAgICBgJHt2ZXJzaW9uUmFuZ2V9IGlzIHN1cHBvcnRlZGApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihgd3JvbmcgbWV0ZW9yIHZlcnNpb24gKCR7cmVsZWFzZX0pIGluIHByb2plY3QgLSBvbmx5IGAgK1xuICAgICAgICAgICAgICAgICAgICBgJHt2ZXJzaW9uUmFuZ2V9IGlzIHN1cHBvcnRlZCBmb3IgYXV0b21hdGljIG1ldGVvciBidWlsZHMgKHlvdSBjYW4gYWx3YXlzIGAgK1xuICAgICAgICAgICAgICAgICAgICAndHJ5IHdpdGggYC0tc2tpcC1tb2JpbGUtYnVpbGRgIGlmIHlvdSBhcmUgdXNpbmcgbWV0ZW9yID49IDEuMi4xJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWNpZGVzIHdoaWNoIHN0cmF0ZWd5IHRvIHVzZSB3aGlsZSB0cnlpbmcgdG8gZ2V0IGNsaWVudCBidWlsZCBvdXQgb2YgTWV0ZW9yIHByb2plY3QuXG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKi9cbiAgICBjaG9vc2VTdHJhdGVneSgpIHtcbiAgICAgICAgaWYgKHRoaXMuJC5lbnYub3B0aW9ucy5mb3JjZUNvcmRvdmFCdWlsZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXhIVE1MU3RyYXRlZ2llcy5JTkRFWF9GUk9NX0NPUkRPVkFfQlVJTEQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWxlYXNlID0gdGhpcy5jYXN0TWV0ZW9yUmVsZWFzZVRvU2VtdmVyKCk7XG4gICAgICAgIGlmIChzZW12ZXIuc2F0aXNmaWVzKHJlbGVhc2UsICc+IDEuMy40JykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluZGV4SFRNTFN0cmF0ZWdpZXMuSU5ERVhfRlJPTV9SVU5OSU5HX1NFUlZFUjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VtdmVyLnNhdGlzZmllcyhyZWxlYXNlLCAnMS4zLjQnKSkge1xuICAgICAgICAgICAgY29uc3QgZXhwbG9kZWRWZXJzaW9uID0gdGhpcy5nZXRNZXRlb3JSZWxlYXNlKCkuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIGlmIChleHBsb2RlZFZlcnNpb24ubGVuZ3RoID49IDQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXhwbG9kZWRWZXJzaW9uWzNdID4gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbmRleEhUTUxTdHJhdGVnaWVzLklOREVYX0ZST01fUlVOTklOR19TRVJWRVI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluZGV4SFRNTFN0cmF0ZWdpZXMuSU5ERVhfRlJPTV9DT1JET1ZBX0JVSUxEO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4SFRNTFN0cmF0ZWdpZXMuSU5ERVhfRlJPTV9DT1JET1ZBX0JVSUxEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyByZXF1aXJlZCBwcmVjb25kaXRpb25zLlxuICAgICAqIC0gTWV0ZW9yIHZlcnNpb25cbiAgICAgKiAtIGlzIG1vYmlsZSBwbGF0Zm9ybSBhZGRlZFxuICAgICAqL1xuICAgIGFzeW5jIGNoZWNrUHJlY29uZGl0aW9ucygpIHtcbiAgICAgICAgaWYgKHRoaXMuJC5lbnYub3B0aW9ucy5za2lwTW9iaWxlQnVpbGQpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tNZXRlb3JWZXJzaW9uKCc+PSAxLjIuMScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jaGVja01ldGVvclZlcnNpb24oJz49IDEuMy4zJyk7XG4gICAgICAgICAgICB0aGlzLmluZGV4SFRNTHN0cmF0ZWd5ID0gdGhpcy5jaG9vc2VTdHJhdGVneSgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXhIVE1Mc3RyYXRlZ3kgPT09IHRoaXMuaW5kZXhIVE1MU3RyYXRlZ2llcy5JTkRFWF9GUk9NX0NPUkRPVkFfQlVJTEQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgJ21ldGVvciB2ZXJzaW9uIGlzIDwgMS4zLjQuMiBzbyB0aGUgaW5kZXguaHRtbCBmcm9tIGNvcmRvdmEtYnVpbGQgd2lsbCcgK1xuICAgICAgICAgICAgICAgICAgICAnIGJlIHVzZWQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICdtZXRlb3IgdmVyc2lvbiBpcyA+PSAxLjMuNC4yIHNvIHRoZSBpbmRleC5odG1sIHdpbGwgYmUgZG93bmxvYWRlZCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2Zyb20gX19jb3Jkb3ZhL2luZGV4Lmh0bWwnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy4kLmVudi5vcHRpb25zLnNraXBNb2JpbGVCdWlsZCkge1xuICAgICAgICAgICAgY29uc3QgcGxhdGZvcm1zID0gZnMucmVhZEZpbGVTeW5jKHRoaXMuJC5lbnYucGF0aHMubWV0ZW9yQXBwLnBsYXRmb3JtcywgJ1VURi04Jyk7XG4gICAgICAgICAgICBpZiAoIX5wbGF0Zm9ybXMuaW5kZXhPZignYW5kcm9pZCcpICYmICF+cGxhdGZvcm1zLmluZGV4T2YoJ2lvcycpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLiQuZW52Lm9wdGlvbnMuYW5kcm9pZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vYmlsZVBsYXRmb3JtID0gJ2lvcyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2JpbGVQbGF0Zm9ybSA9ICdhbmRyb2lkJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cud2Fybihgbm8gbW9iaWxlIHRhcmdldCBkZXRlY3RlZCAtIHdpbGwgYWRkICcke3RoaXMubW9iaWxlUGxhdGZvcm19JyBgICtcbiAgICAgICAgICAgICAgICAgICAgJ2p1c3QgdG8gZ2V0IGEgbW9iaWxlIGJ1aWxkJyk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRNb2JpbGVQbGF0Zm9ybSh0aGlzLm1vYmlsZVBsYXRmb3JtKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKCdmYWlsZWQgdG8gYWRkIGEgbW9iaWxlIHBsYXRmb3JtIC0gcGxlYXNlIHRyeSB0byBkbyBpdCBtYW51YWxseScpO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZXMgdG8gYWRkIGEgbW9iaWxlIHBsYXRmb3JtIHRvIG1ldGVvciBwcm9qZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwbGF0Zm9ybSAtIHBsYXRmb3JtIHRvIGFkZFxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGFkZE1vYmlsZVBsYXRmb3JtKHBsYXRmb3JtKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZy52ZXJib3NlKGBhZGRpbmcgbW9iaWxlIHBsYXRmb3JtOiAke3BsYXRmb3JtfWApO1xuICAgICAgICAgICAgc3Bhd24oJ21ldGVvcicsIFsnYWRkLXBsYXRmb3JtJywgcGxhdGZvcm1dLCB7XG4gICAgICAgICAgICAgICAgY3dkOiB0aGlzLiQuZW52LnBhdGhzLm1ldGVvckFwcC5yb290LFxuICAgICAgICAgICAgICAgIHN0ZGlvOiB0aGlzLiQuZW52LnN0ZGlvXG4gICAgICAgICAgICB9KS5vbignZXhpdCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwbGF0Zm9ybXMgPSBmcy5yZWFkRmlsZVN5bmModGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHAucGxhdGZvcm1zLCAnVVRGLTgnKTtcbiAgICAgICAgICAgICAgICBpZiAoIX5wbGF0Zm9ybXMuaW5kZXhPZignYW5kcm9pZCcpICYmICF+cGxhdGZvcm1zLmluZGV4T2YoJ2lvcycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZXMgdG8gcmVtb3ZlIGEgbW9iaWxlIHBsYXRmb3JtIGZyb20gbWV0ZW9yIHByb2plY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBsYXRmb3JtIC0gcGxhdGZvcm0gdG8gcmVtb3ZlXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgcmVtb3ZlTW9iaWxlUGxhdGZvcm0ocGxhdGZvcm0pIHtcbiAgICAgICAgaWYgKHRoaXMuJC5lbnYub3B0aW9ucy5za2lwUmVtb3ZlTW9iaWxlUGxhdGZvcm0pIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2cudmVyYm9zZShgcmVtb3ZpbmcgbW9iaWxlIHBsYXRmb3JtOiAke3BsYXRmb3JtfWApO1xuICAgICAgICAgICAgc3Bhd24oJ21ldGVvcicsIFsncmVtb3ZlLXBsYXRmb3JtJywgcGxhdGZvcm1dLCB7XG4gICAgICAgICAgICAgICAgY3dkOiB0aGlzLiQuZW52LnBhdGhzLm1ldGVvckFwcC5yb290LFxuICAgICAgICAgICAgICAgIHN0ZGlvOiB0aGlzLiQuZW52LnN0ZGlvLFxuICAgICAgICAgICAgICAgIGVudjogT2JqZWN0LmFzc2lnbih7IE1FVEVPUl9QUkVUVFlfT1VUUFVUOiAwIH0sIHByb2Nlc3MuZW52KVxuICAgICAgICAgICAgfSkub24oJ2V4aXQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGxhdGZvcm1zID0gZnMucmVhZEZpbGVTeW5jKHRoaXMuJC5lbnYucGF0aHMubWV0ZW9yQXBwLnBsYXRmb3JtcywgJ1VURi04Jyk7XG4gICAgICAgICAgICAgICAgaWYgKH5wbGF0Zm9ybXMuaW5kZXhPZihwbGF0Zm9ybSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKdXN0IGNoZWNrcyBmb3IgaW5kZXguaHRtbCBhbmQgcHJvZ3JhbS5qc29uIGV4aXN0ZW5jZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0NvcmRvdmFCdWlsZFJlYWR5KCkge1xuICAgICAgICBpZiAodGhpcy5pbmRleEhUTUxzdHJhdGVneSA9PT0gdGhpcy5pbmRleEhUTUxTdHJhdGVnaWVzLklOREVYX0ZST01fQ09SRE9WQV9CVUlMRCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuJC51dGlscy5leGlzdHModGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHAuY29yZG92YUJ1aWxkSW5kZXgpICYmXG4gICAgICAgICAgICAgICAgdGhpcy4kLnV0aWxzLmV4aXN0cyh0aGlzLiQuZW52LnBhdGhzLm1ldGVvckFwcC5jb3Jkb3ZhQnVpbGRQcm9ncmFtSnNvbikgJiZcbiAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICF0aGlzLm9sZE1hbmlmZXN0IHx8XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm9sZE1hbmlmZXN0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9sZE1hbmlmZXN0ICE9PSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHAuY29yZG92YUJ1aWxkUHJvZ3JhbUpzb24sICdVVEYtOCdcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuJC51dGlscy5leGlzdHModGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHAud2ViQ29yZG92YVByb2dyYW1Kc29uKSAmJlxuICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICF0aGlzLm9sZE1hbmlmZXN0IHx8XG4gICAgICAgICAgICAgICAgKHRoaXMub2xkTWFuaWZlc3QgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbGRNYW5pZmVzdCAhPT0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHAud2ViQ29yZG92YVByb2dyYW1Kc29uLCAnVVRGLTgnXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgaW5kZXguaHRtbCBmcm9tIHJ1bm5pbmcgcHJvamVjdC5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZS48Kj59XG4gICAgICovXG4gICAgYXN5bmMgYWNxdWlyZUluZGV4KCkge1xuICAgICAgICBjb25zdCBwb3J0ID0gKHRoaXMuJC5lbnYub3B0aW9ucy5wb3J0KSA/IHRoaXMuJC5lbnYub3B0aW9ucy5wb3J0IDogMzA4MDtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnYWNxdWlyaW5nIGluZGV4Lmh0bWwnKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYGh0dHA6Ly8xMjcuMC4wLjE6JHtwb3J0fS9fX2NvcmRvdmEvaW5kZXguaHRtbGApO1xuICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzLnRleHQoKTtcbiAgICAgICAgLy8gU2ltcGxlIHRlc3QgaWYgd2UgcmVhbGx5IGRvd25sb2FkIGluZGV4Lmh0bWwgZm9yIHdlYi5jb3Jkb3ZhLlxuICAgICAgICBpZiAofnRleHQuaW5kZXhPZignc3JjPVwiL2NvcmRvdmEuanNcIicpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBtYWluZmVzdC5qc29uIGZyb20gcnVubmluZyBwcm9qZWN0LlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlLjx2b2lkPn1cbiAgICAgKi9cbiAgICBhc3luYyBhY3F1aXJlTWFuaWZlc3QoKSB7XG4gICAgICAgIGNvbnN0IHBvcnQgPSAodGhpcy4kLmVudi5vcHRpb25zLnBvcnQpID8gdGhpcy4kLmVudi5vcHRpb25zLnBvcnQgOiAzMDgwO1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdhY3F1aXJpbmcgbWFuaWZlc3QuanNvbicpO1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgIGBodHRwOi8vMTI3LjAuMC4xOiR7cG9ydH0vX19jb3Jkb3ZhL21hbmlmZXN0Lmpzb24/bWV0ZW9yX2RvbnRfc2VydmVfaW5kZXg9dHJ1ZWBcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHRleHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWVzIHRvIGdldCBhIG1vYmlsZSBidWlsZCBmcm9tIG1ldGVvciBhcHAuXG4gICAgICogSW4gY2FzZSBvZiBmYWlsdXJlIGxlYXZlcyBhIG1ldGVvci5sb2cuXG4gICAgICogQSBsb3Qgb2Ygc3R1ZmYgaXMgaGFwcGVuaW5nIGhlcmUgLSBidXQgdGhlIG1haW4gYWltIGlzIHRvIGdldCBhIG1vYmlsZSBidWlsZCBmcm9tXG4gICAgICogLm1ldGVvci9sb2NhbC9jb3Jkb3ZhLWJ1aWxkL3d3dy9hcHBsaWNhdGlvbiBhbmQgZXhpdCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgYnVpbGRNb2JpbGVUYXJnZXQoKSB7XG4gICAgICAgIGNvbnN0IHByb2dyYW1Kc29uID1cbiAgICAgICAgICAgICh0aGlzLmluZGV4SFRNTHN0cmF0ZWd5ID09PSB0aGlzLmluZGV4SFRNTFN0cmF0ZWdpZXMuSU5ERVhfRlJPTV9DT1JET1ZBX0JVSUxEKSA/XG4gICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHAuY29yZG92YUJ1aWxkUHJvZ3JhbUpzb24gOlxuICAgICAgICAgICAgICAgIHRoaXMuJC5lbnYucGF0aHMubWV0ZW9yQXBwLndlYkNvcmRvdmFQcm9ncmFtSnNvbjtcblxuICAgICAgICBpZiAodGhpcy4kLnV0aWxzLmV4aXN0cyhwcm9ncmFtSnNvbikpIHtcbiAgICAgICAgICAgIHRoaXMub2xkTWFuaWZlc3QgPSBmcy5yZWFkRmlsZVN5bmMocHJvZ3JhbUpzb24sICdVVEYtOCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgbGV0IGxvZyA9ICcnO1xuICAgICAgICAgICAgbGV0IGRlc2lyZWRFeGl0ID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgYnVpbGRUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBlcnJvclRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgbGV0IG1lc3NhZ2VUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBraWxsVGltZW91dCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgY29yZG92YUNoZWNrSW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHBvcnRQcm9ibGVtID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIHdpbmRvd3NLaWxsKHBpZCkge1xuICAgICAgICAgICAgICAgIHNlbGYubG9nLmRlYnVnKGBraWxsaW5nIHBpZDogJHtwaWR9YCk7XG4gICAgICAgICAgICAgICAgc3Bhd24uc3luYygndGFza2tpbGwnLCBbJy9waWQnLCBwaWQsICcvZicsICcvdCddKTtcblxuICAgICAgICAgICAgICAgIC8vIFdlIHdpbGwgbG9vayBmb3Igb3RoZXIgcHJvY2VzcyB3aGljaCBtaWdodCBoYXZlIGJlZW4gY3JlYXRlZCBvdXRzaWRlIHRoZVxuICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgdHJlZS5cbiAgICAgICAgICAgICAgICAvLyBMZXRzIGxpc3QgYWxsIG5vZGUuZXhlIHByb2Nlc3Nlcy5cblxuICAgICAgICAgICAgICAgIGNvbnN0IG91dCA9IHNwYXduXG4gICAgICAgICAgICAgICAgICAgIC5zeW5jKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3dtaWMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgWydwcm9jZXNzJywgJ3doZXJlJywgJ2NhcHRpb249XCJub2RlLmV4ZVwiJywgJ2dldCcsICdjb21tYW5kbGluZSxwcm9jZXNzaWQnXVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIC5zdGRvdXQudG9TdHJpbmcoJ3V0Zi04JylcbiAgICAgICAgICAgICAgICAgICAgLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhcmdzID0gc2VsZi5wcmVwYXJlQXJndW1lbnRzKCk7XG4gICAgICAgICAgICAgICAgLy8gTGV0cyBtb3VudCByZWdleC5cbiAgICAgICAgICAgICAgICBjb25zdCByZWdleFYxID0gbmV3IFJlZ0V4cChgJHthcmdzLmpvaW4oJ1xcXFxzKycpfVxcXFxzKyhcXFxcZCspYCwgJ2dtJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVnZXhWMiA9IG5ldyBSZWdFeHAoYFwiJHthcmdzLmpvaW4oJ1wiXFxcXHMrXCInKX1cIlxcXFxzKyhcXFxcZCspYCwgJ2dtJyk7XG4gICAgICAgICAgICAgICAgLy8gTm8gd2Ugd2lsbCBjaGVjayBmb3IgdGhvc2Ugd2l0aCB0aGUgbWF0Y2hpbmcgcGFyYW1zLlxuICAgICAgICAgICAgICAgIG91dC5mb3JFYWNoKChsaW5lKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gcmVnZXhWMS5leGVjKGxpbmUpIHx8IHJlZ2V4VjIuZXhlYyhsaW5lKSB8fCBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5kZWJ1Zyhga2lsbGluZyBwaWQ6ICR7bWF0Y2hbMV19YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGF3bi5zeW5jKCd0YXNra2lsbCcsIFsnL3BpZCcsIG1hdGNoWzFdLCAnL2YnLCAnL3QnXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVnZXhWMS5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICByZWdleFYyLmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIHdyaXRlTG9nKCkge1xuICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoJ21ldGVvci5sb2cnLCBsb2csICdVVEYtOCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBjbGVhclRpbWVvdXRzQW5kSW50ZXJ2YWxzKCkge1xuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoY29yZG92YUNoZWNrSW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChidWlsZFRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChlcnJvclRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChtZXNzYWdlVGltZW91dCk7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGtpbGxUaW1lb3V0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYXJncyA9IHRoaXMucHJlcGFyZUFyZ3VtZW50cygpO1xuXG4gICAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBydW5uaW5nIFwibWV0ZW9yICR7YXJncy5qb2luKCcgJyl9XCIuLi4gdGhpcyBtaWdodCB0YWtlIGEgd2hpbGVgKTtcblxuICAgICAgICAgICAgY29uc3QgZW52ID0geyBNRVRFT1JfUFJFVFRZX09VVFBVVDogMCwgTUVURU9SX05PX1JFTEVBU0VfQ0hFQ0s6IDEgfTtcbiAgICAgICAgICAgIGlmICh0aGlzLiQuZW52Lm9wdGlvbnMucHJvZERlYnVnKSB7XG4gICAgICAgICAgICAgICAgZW52Lk1FVEVPUl9ERVNLT1BfUFJPRF9ERUJVRyA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIExldHMgc3Bhd24gbWV0ZW9yLlxuICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBzcGF3bihcbiAgICAgICAgICAgICAgICAnbWV0ZW9yJyxcbiAgICAgICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZW52OiBPYmplY3QuYXNzaWduKGVudiwgcHJvY2Vzcy5lbnYpLFxuICAgICAgICAgICAgICAgICAgICBjd2Q6IHRoaXMuJC5lbnYucGF0aHMubWV0ZW9yQXBwLnJvb3RcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHsgc2hlbGw6IHRydWUgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gS2lsbHMgdGhlIGN1cnJlbnRseSBydW5uaW5nIG1ldGVvciBjb21tYW5kLlxuICAgICAgICAgICAgZnVuY3Rpb24ga2lsbCgpIHtcbiAgICAgICAgICAgICAgICBzbGwoJycpO1xuICAgICAgICAgICAgICAgIGNoaWxkLmtpbGwoJ1NJR0tJTEwnKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi4kLmVudi5vcy5pc1dpbmRvd3MpIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93c0tpbGwoY2hpbGQucGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGV4aXQoKSB7XG4gICAgICAgICAgICAgICAga2lsbFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0c0FuZEludGVydmFscygpO1xuICAgICAgICAgICAgICAgICAgICBkZXNpcmVkRXhpdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGtpbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGNvcHlCdWlsZCgpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmNvcHlCdWlsZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBleGl0KCk7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXRzQW5kSW50ZXJ2YWxzKCk7XG4gICAgICAgICAgICAgICAgICAgIGtpbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVMb2coKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCdjb3B5Jyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvcmRvdmFDaGVja0ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBjb3Jkb3ZhLWJ1aWxkIHJlYWR5LlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQ29yZG92YUJ1aWxkUmVhZHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBzbywgdGhlbiBleGl0IGltbWVkaWF0ZWx5LlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbmRleEhUTUxzdHJhdGVneSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhIVE1MU3RyYXRlZ2llcy5JTkRFWF9GUk9NX0NPUkRPVkFfQlVJTEQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlCdWlsZCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgMTAwMCk7XG5cbiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIChjaHVuaykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBjaHVuay50b1N0cmluZygnVVRGLTgnKTtcbiAgICAgICAgICAgICAgICBsb2cgKz0gYCR7bGluZX1cXG5gO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvclRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGVycm9yVGltZW91dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIERvIG5vdCBleGl0IGlmIHRoaXMgaXMgdGhlIHdhcm5pbmcgZm9yIHVzaW5nIC0tcHJvZHVjdGlvbi5cbiAgICAgICAgICAgICAgICAvLyBPdXRwdXQgZXhjZWVkcyAtPiBodHRwczovL2dpdGh1Yi5jb20vbWV0ZW9yL21ldGVvci9pc3N1ZXMvODU5MlxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIX5saW5lLmluZGV4T2YoJy0tcHJvZHVjdGlvbicpICYmXG4gICAgICAgICAgICAgICAgICAgICF+bGluZS5pbmRleE9mKCdPdXRwdXQgZXhjZWVkcyAnKSAmJlxuICAgICAgICAgICAgICAgICAgICAhfmxpbmUuaW5kZXhPZignTm9kZSNtb3ZlVG8nKSAmJlxuICAgICAgICAgICAgICAgICAgICAhfmxpbmUuaW5kZXhPZignQnJvd3NlcnNsaXN0JykgJiZcbiAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShzZWxmLiQuZW52Lm9wdGlvbnMuaWdub3JlU3RkZXJyKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi4kLmVudi5vcHRpb25zLmlnbm9yZVN0ZGVyci5ldmVyeShzdHIgPT4gIX5saW5lLmluZGV4T2Yoc3RyKSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy53YXJuKCdTVERFUlI6JywgbGluZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIHdpbGwgZXhpdCAxcyBhZnRlciBsYXN0IGVycm9yIGluIHN0ZGVyci5cbiAgICAgICAgICAgICAgICAgICAgZXJyb3JUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXRzQW5kSW50ZXJ2YWxzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBraWxsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUxvZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCdlcnJvcicpO1xuICAgICAgICAgICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGluZSA9IGNodW5rLnRvU3RyaW5nKCdVVEYtOCcpO1xuICAgICAgICAgICAgICAgIGlmICghZGVzaXJlZEV4aXQgJiYgbGluZS50cmltKCkucmVwbGFjZSgvW1xcblxcclxcdFxcdlxcZl0rL2dtLCAnJykgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVzVG9EaXNwbGF5ID0gbGluZS50cmltKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zcGxpdCgnXFxuXFxyJyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgZGlzcGxheSBsYXN0IGxpbmUgZnJvbSB0aGUgY2h1bmsuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNhbml0aXplZExpbmUgPSBsaW5lc1RvRGlzcGxheS5wb3AoKS5yZXBsYWNlKC9bXFxuXFxyXFx0XFx2XFxmXSsvZ20sICcnKTtcbiAgICAgICAgICAgICAgICAgICAgc2xsKHNhbml0aXplZExpbmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2cgKz0gYCR7bGluZX1cXG5gO1xuICAgICAgICAgICAgICAgIGlmICh+bGluZS5pbmRleE9mKCdhZnRlcl9wbGF0Zm9ybV9hZGQnKSkge1xuICAgICAgICAgICAgICAgICAgICBzbGwoJycpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdkb25lLi4uIDEwJScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh+bGluZS5pbmRleE9mKCdMb2NhbCBwYWNrYWdlIHZlcnNpb24nKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZVRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChtZXNzYWdlVGltZW91dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsbCgnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdidWlsZGluZyBpbiBwcm9ncmVzcy4uLicpO1xuICAgICAgICAgICAgICAgICAgICB9LCAxNTAwKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAofmxpbmUuaW5kZXhPZignUHJlcGFyaW5nIENvcmRvdmEgcHJvamVjdCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHNsbCgnJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ2RvbmUuLi4gNjAlJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKH5saW5lLmluZGV4T2YoJ0NhblxcJ3QgbGlzdGVuIG9uIHBvcnQnKSkge1xuICAgICAgICAgICAgICAgICAgICBwb3J0UHJvYmxlbSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKH5saW5lLmluZGV4T2YoJ1lvdXIgYXBwbGljYXRpb24gaGFzIGVycm9ycycpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvclRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChlcnJvclRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVycm9yVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0c0FuZEludGVydmFscygpO1xuICAgICAgICAgICAgICAgICAgICAgICAga2lsbCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVMb2coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgnZXJyb3JJbkFwcCcpO1xuICAgICAgICAgICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAofmxpbmUuaW5kZXhPZignQXBwIHJ1bm5pbmcgYXQnKSkge1xuICAgICAgICAgICAgICAgICAgICBjb3B5QnVpbGQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gV2hlbiBNZXRlb3IgZXhpdHNcbiAgICAgICAgICAgIGNoaWxkLm9uKCdleGl0JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHNsbCgnJyk7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0c0FuZEludGVydmFscygpO1xuICAgICAgICAgICAgICAgIGlmICghZGVzaXJlZEV4aXQpIHtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVMb2coKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnRQcm9ibGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoJ3BvcnQnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgnZXhpdCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGJ1aWxkVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGtpbGwoKTtcbiAgICAgICAgICAgICAgICB3cml0ZUxvZygpO1xuICAgICAgICAgICAgICAgIHJlamVjdCgndGltZW91dCcpO1xuICAgICAgICAgICAgfSwgdGhpcy4kLmVudi5vcHRpb25zLmJ1aWxkVGltZW91dCA/IHRoaXMuJC5lbnYub3B0aW9ucy5idWlsZFRpbWVvdXQgKiAxMDAwIDogNjAwMDAwKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwbGFjZXMgdGhlIEREUCB1cmwgdGhhdCB3YXMgdXNlZCBvcmlnaW5hbGx5IHdoZW4gTWV0ZW9yIHdhcyBidWlsZGluZyB0aGUgY2xpZW50LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbmRleEh0bWwgLSBwYXRoIHRvIGluZGV4Lmh0bWwgZnJvbSB0aGUgY2xpZW50XG4gICAgICovXG4gICAgdXBkYXRlRGRwVXJsKGluZGV4SHRtbCkge1xuICAgICAgICBsZXQgY29udGVudDtcbiAgICAgICAgbGV0IHJ1bnRpbWVDb25maWc7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoaW5kZXhIdG1sLCAnVVRGLTgnKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoYGVycm9yIGxvYWRpbmcgaW5kZXguaHRtbCBmaWxlOiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMubWF0Y2hlci50ZXN0KGNvbnRlbnQpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignY291bGQgbm90IGZpbmQgcnVudGltZSBjb25maWcgaW4gaW5kZXggZmlsZScpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBjb250ZW50Lm1hdGNoKHRoaXMubWF0Y2hlcik7XG4gICAgICAgICAgICBydW50aW1lQ29uZmlnID0gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQobWF0Y2hlc1sxXSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignY291bGQgbm90IGZpbmQgcnVudGltZSBjb25maWcgaW4gaW5kZXggZmlsZScpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuJC5lbnYub3B0aW9ucy5kZHBVcmwuc3Vic3RyKC0xLCAxKSAhPT0gJy8nKSB7XG4gICAgICAgICAgICB0aGlzLiQuZW52Lm9wdGlvbnMuZGRwVXJsICs9ICcvJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJ1bnRpbWVDb25maWcuUk9PVF9VUkwgPSB0aGlzLiQuZW52Lm9wdGlvbnMuZGRwVXJsO1xuICAgICAgICBydW50aW1lQ29uZmlnLkREUF9ERUZBVUxUX0NPTk5FQ1RJT05fVVJMID0gdGhpcy4kLmVudi5vcHRpb25zLmRkcFVybDtcblxuICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKFxuICAgICAgICAgICAgdGhpcy5yZXBsYWNlciwgYCQxXCIke2VuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShydW50aW1lQ29uZmlnKSl9XCIkM2BcbiAgICAgICAgKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhpbmRleEh0bWwsIGNvbnRlbnQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihgZXJyb3Igd3JpdGluZyBpbmRleC5odG1sIGZpbGU6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ3N1Y2Nlc3NmdWxseSB1cGRhdGVkIGRkcCBzdHJpbmcgaW4gdGhlIHJ1bnRpbWUgY29uZmlnIG9mIGEgbW9iaWxlIGJ1aWxkJyArXG4gICAgICAgICAgICBgIHRvICR7dGhpcy4kLmVudi5vcHRpb25zLmRkcFVybH1gKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmVwYXJlcyB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byBgbWV0ZW9yYCBjb21tYW5kLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICAgKi9cbiAgICBwcmVwYXJlQXJndW1lbnRzKCkge1xuICAgICAgICBjb25zdCBhcmdzID0gWydydW4nLCAnLS12ZXJib3NlJywgYC0tbW9iaWxlLXNlcnZlcj0ke3RoaXMuJC5lbnYub3B0aW9ucy5kZHBVcmx9YF07XG4gICAgICAgIGlmICh0aGlzLiQuZW52LmlzUHJvZHVjdGlvbkJ1aWxkKCkpIHtcbiAgICAgICAgICAgIGFyZ3MucHVzaCgnLS1wcm9kdWN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgYXJncy5wdXNoKCctcCcpO1xuICAgICAgICBpZiAodGhpcy4kLmVudi5vcHRpb25zLnBvcnQpIHtcbiAgICAgICAgICAgIGFyZ3MucHVzaCh0aGlzLiQuZW52Lm9wdGlvbnMucG9ydCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcmdzLnB1c2goJzMwODAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4kLmVudi5vcHRpb25zLm1ldGVvclNldHRpbmdzKSB7XG4gICAgICAgICAgICBhcmdzLnB1c2goJy0tc2V0dGluZ3MnLCB0aGlzLiQuZW52Lm9wdGlvbnMubWV0ZW9yU2V0dGluZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcmdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlcyB0aGUgbW9iaWxlIGJ1aWxkIGFuZCBjb3BpZXMgaXQgaW50byBlbGVjdHJvbiBhcHAuXG4gICAgICovXG4gICAgYXN5bmMgY29weUJ1aWxkKCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZygnY2xlYXJpbmcgYnVpbGQgZGlyJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiQudXRpbHMucm1XaXRoUmV0cmllcygnLXJmJywgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5tZXRlb3JBcHApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcHJlZml4ID0gJ2NvcmRvdmFCdWlsZCc7XG4gICAgICAgIGxldCBjb3B5UGF0aFBvc3RmaXggPSAnJztcblxuICAgICAgICBpZiAodGhpcy5pbmRleEhUTUxzdHJhdGVneSA9PT0gdGhpcy5pbmRleEhUTUxTdHJhdGVnaWVzLklOREVYX0ZST01fUlVOTklOR19TRVJWRVIpIHtcbiAgICAgICAgICAgIHByZWZpeCA9ICd3ZWJDb3Jkb3ZhJztcbiAgICAgICAgICAgIGNvcHlQYXRoUG9zdGZpeCA9IGAke3BhdGguc2VwfSpgO1xuICAgICAgICAgICAgbGV0IGluZGV4SHRtbDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZnMubWtkaXJTeW5jKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubWV0ZW9yQXBwKTtcbiAgICAgICAgICAgICAgICBpbmRleEh0bWwgPSBhd2FpdCB0aGlzLmFjcXVpcmVJbmRleCgpO1xuICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5tZXRlb3JBcHBJbmRleCwgaW5kZXhIdG1sKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdzdWNjZXNzZnVsbHkgZG93bmxvYWRlZCBpbmRleC5odG1sIGZyb20gcnVubmluZyBtZXRlb3IgYXBwJyk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ2Vycm9yIHdoaWxlIHRyeWluZyB0byBkb3dubG9hZCBpbmRleC5odG1sIGZvciB3ZWIuY29yZG92YSwgJyArXG4gICAgICAgICAgICAgICAgICAgICdiZSBzdXJlIHRoYXQgeW91IGFyZSBydW5uaW5nIGEgbW9iaWxlIHRhcmdldCBvciB3aXRoJyArXG4gICAgICAgICAgICAgICAgICAgICcgLS1tb2JpbGUtc2VydmVyOiAnLCBlKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29yZG92YUJ1aWxkID0gdGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHBbcHJlZml4XTtcbiAgICAgICAgY29uc3QgeyBjb3Jkb3ZhQnVpbGRJbmRleCB9ID0gdGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHA7XG4gICAgICAgIGNvbnN0IGNvcmRvdmFCdWlsZFByb2dyYW1Kc29uID0gdGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHBbYCR7cHJlZml4fVByb2dyYW1Kc29uYF07XG5cbiAgICAgICAgaWYgKCF0aGlzLiQudXRpbHMuZXhpc3RzKGNvcmRvdmFCdWlsZCkpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGBubyBtb2JpbGUgYnVpbGQgZm91bmQgYXQgJHtjb3Jkb3ZhQnVpbGR9YCk7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignYXJlIHlvdSBzdXJlIHlvdSBkaWQgcnVuIG1ldGVvciB3aXRoIC0tbW9iaWxlLXNlcnZlcj8nKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgZmlsZSBub3QgcHJlc2VudCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLiQudXRpbHMuZXhpc3RzKGNvcmRvdmFCdWlsZFByb2dyYW1Kc29uKSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ25vIHByb2dyYW0uanNvbiBmb3VuZCBpbiBtb2JpbGUgYnVpbGQgZm91bmQgYXQgJyArXG4gICAgICAgICAgICAgICAgYCR7Y29yZG92YUJ1aWxkfWApO1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ2FyZSB5b3Ugc3VyZSB5b3UgZGlkIHJ1biBtZXRlb3Igd2l0aCAtLW1vYmlsZS1zZXJ2ZXI/Jyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIGZpbGUgbm90IHByZXNlbnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmluZGV4SFRNTHN0cmF0ZWd5ICE9PSB0aGlzLmluZGV4SFRNTFN0cmF0ZWdpZXMuSU5ERVhfRlJPTV9SVU5OSU5HX1NFUlZFUikge1xuICAgICAgICAgICAgaWYgKCF0aGlzLiQudXRpbHMuZXhpc3RzKGNvcmRvdmFCdWlsZEluZGV4KSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKCdubyBpbmRleC5odG1sIGZvdW5kIGluIGNvcmRvdmEgYnVpbGQgZm91bmQgYXQgJyArXG4gICAgICAgICAgICAgICAgICAgIGAke2NvcmRvdmFCdWlsZH1gKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignYXJlIHlvdSBzdXJlIHlvdSBkaWQgcnVuIG1ldGVvciB3aXRoIC0tbW9iaWxlLXNlcnZlcj8nKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIGZpbGUgbm90IHByZXNlbnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nLnZlcmJvc2UoJ2NvcHlpbmcgbW9iaWxlIGJ1aWxkJyk7XG4gICAgICAgIHNoZWxsLmNwKFxuICAgICAgICAgICAgJy1SJywgYCR7Y29yZG92YUJ1aWxkfSR7Y29weVBhdGhQb3N0Zml4fWAsIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubWV0ZW9yQXBwXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQmVjYXVzZSBvZiB2YXJpb3VzIHBlcm1pc3Npb24gcHJvYmxlbXMgaGVyZSB3ZSB0cnkgdG8gY2xlYXIgdGUgcGF0aCBieSBjbGVhcmluZ1xuICAgICAgICAvLyBhbGwgcG9zc2libGUgcmVzdHJpY3Rpb25zLlxuICAgICAgICBzaGVsbC5jaG1vZChcbiAgICAgICAgICAgICctUicsICc3NzcnLCB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLm1ldGVvckFwcFxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy4kLmVudi5vcy5pc1dpbmRvd3MpIHtcbiAgICAgICAgICAgIHNoZWxsLmV4ZWMoYGF0dHJpYiAtciAke3RoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubWV0ZW9yQXBwfSR7cGF0aC5zZXB9Ki4qIC9zYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pbmRleEhUTUxzdHJhdGVneSA9PT0gdGhpcy5pbmRleEhUTUxTdHJhdGVnaWVzLklOREVYX0ZST01fUlVOTklOR19TRVJWRVIpIHtcbiAgICAgICAgICAgIGxldCBwcm9ncmFtSnNvbjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcHJvZ3JhbUpzb24gPSBhd2FpdCB0aGlzLmFjcXVpcmVNYW5pZmVzdCgpO1xuICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubWV0ZW9yQXBwUHJvZ3JhbUpzb24sXG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHByb2dyYW1Kc29uLCBudWxsLCA0KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuaW5mbygnc3VjY2Vzc2Z1bGx5IGRvd25sb2FkZWQgbWFuaWZlc3QuanNvbiBmcm9tIHJ1bm5pbmcgbWV0ZW9yIGFwcCcpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKCdlcnJvciB3aGlsZSB0cnlpbmcgdG8gZG93bmxvYWQgbWFuaWZlc3QuanNvbiBmb3Igd2ViLmNvcmRvdmEsJyArXG4gICAgICAgICAgICAgICAgICAgICcgYmUgc3VyZSB0aGF0IHlvdSBhcmUgcnVubmluZyBhIG1vYmlsZSB0YXJnZXQgb3Igd2l0aCcgK1xuICAgICAgICAgICAgICAgICAgICAnIC0tbW9iaWxlLXNlcnZlcjogJywgZSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nLmluZm8oJ21vYmlsZSBidWlsZCBjb3BpZWQgdG8gZWxlY3Ryb24gYXBwJyk7XG5cbiAgICAgICAgdGhpcy5sb2cuZGVidWcoJ2NvcHkgY29yZG92YS5qcyB0byBtZXRlb3IgYnVpbGQnKTtcbiAgICAgICAgc2hlbGwuY3AoXG4gICAgICAgICAgICBqb2luKF9fZGlybmFtZSwgJy4uJywgJ3NrZWxldG9uJywgJ2NvcmRvdmEuanMnKSxcbiAgICAgICAgICAgIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubWV0ZW9yQXBwXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5qZWN0cyBNZXRlb3IuaXNEZXNrdG9wXG4gICAgICovXG4gICAgaW5qZWN0SXNEZXNrdG9wKCkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdpbmplY3RpbmcgaXNEZXNrdG9wJyk7XG5cbiAgICAgICAgbGV0IG1hbmlmZXN0SnNvblBhdGggPSB0aGlzLiQuZW52LnBhdGhzLm1ldGVvckFwcC5jb3Jkb3ZhQnVpbGRQcm9ncmFtSnNvbjtcbiAgICAgICAgaWYgKHRoaXMuaW5kZXhIVE1Mc3RyYXRlZ3kgPT09IHRoaXMuaW5kZXhIVE1MU3RyYXRlZ2llcy5JTkRFWF9GUk9NX1JVTk5JTkdfU0VSVkVSKSB7XG4gICAgICAgICAgICBtYW5pZmVzdEpzb25QYXRoID0gdGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHAud2ViQ29yZG92YVByb2dyYW1Kc29uO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHsgbWFuaWZlc3QgfSA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgZnMucmVhZEZpbGVTeW5jKG1hbmlmZXN0SnNvblBhdGgsICdVVEYtOCcpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbGV0IGluamVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgaW5qZWN0ZWRTdGFydHVwRGlkQ29tcGxldGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuXG4gICAgICAgICAgICAvLyBXZSB3aWxsIHNlYXJjaCBpbiBldmVyeSAuanMgZmlsZSBpbiB0aGUgbWFuaWZlc3QuXG4gICAgICAgICAgICAvLyBXZSBjb3VsZCBwcm9iYWJseSBkZXRlY3Qgd2hldGhlciB0aGlzIGlzIGEgZGV2IG9yIHByb2R1Y3Rpb24gYnVpbGQgYW5kIG9ubHkgc2VhcmNoIGluXG4gICAgICAgICAgICAvLyB0aGUgY29ycmVjdCBmaWxlcywgYnV0IGZvciBub3cgdGhpcyBzaG91bGQgYmUgZmluZS5cbiAgICAgICAgICAgIG1hbmlmZXN0LmZvckVhY2goKGZpbGUpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZmlsZUNvbnRlbnRzO1xuICAgICAgICAgICAgICAgIC8vIEhhY2t5IHdheSBvZiBzZXR0aW5nIGlzRGVza3RvcC5cbiAgICAgICAgICAgICAgICBpZiAoZmlsZS50eXBlID09PSAnanMnKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVDb250ZW50cyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4odGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5tZXRlb3JBcHAsIGZpbGUucGF0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICAnVVRGLTgnXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuaW5qZWN0b3IucHJvY2Vzc0ZpbGVDb250ZW50cyhmaWxlQ29udGVudHMpO1xuXG4gICAgICAgICAgICAgICAgICAgICh7IGZpbGVDb250ZW50cyB9ID0gcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgaW5qZWN0ZWRTdGFydHVwRGlkQ29tcGxldGUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmluamVjdGVkU3RhcnR1cERpZENvbXBsZXRlID8gdHJ1ZSA6IGluamVjdGVkU3RhcnR1cERpZENvbXBsZXRlO1xuICAgICAgICAgICAgICAgICAgICBpbmplY3RlZCA9IHJlc3VsdC5pbmplY3RlZCA/IHRydWUgOiBpbmplY3RlZDtcblxuICAgICAgICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICAgICAgICAgICAgICAgICAgam9pbih0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLm1ldGVvckFwcCwgZmlsZS5wYXRoKSwgZmlsZUNvbnRlbnRzXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghaW5qZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3IgaW5qZWN0aW5nIGlzRGVza3RvcCBnbG9iYWwgdmFyLicpO1xuICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaW5qZWN0ZWRTdGFydHVwRGlkQ29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3IgaW5qZWN0aW5nIGlzRGVza3RvcCBmb3Igc3RhcnR1cERpZENvbXBsZXRlJyk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igb2NjdXJyZWQgd2hpbGUgaW5qZWN0aW5nIGlzRGVza3RvcDogJywgZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2cuaW5mbygnaW5qZWN0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGRzLCBtb2RpZmllcyBhbmQgY29waWVzIHRoZSBtZXRlb3IgYXBwIHRvIGVsZWN0cm9uIGFwcC5cbiAgICAgKi9cbiAgICBhc3luYyBidWlsZCgpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnY2hlY2tpbmcgZm9yIGFueSBtb2JpbGUgcGxhdGZvcm0nKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2hlY2tQcmVjb25kaXRpb25zKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKCdlcnJvciBvY2N1cnJlZCBkdXJpbmcgY2hlY2tpbmcgcHJlY29uZGl0aW9uczogJywgZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZy5pbmZvKCdidWlsZGluZyBtZXRlb3IgYXBwJyk7XG5cbiAgICAgICAgaWYgKCF0aGlzLiQuZW52Lm9wdGlvbnMuc2tpcE1vYmlsZUJ1aWxkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYnVpbGRNb2JpbGVUYXJnZXQoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAocmVhc29uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RpbWVvdXQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RpbWVvdXQgd2hpbGUgYnVpbGRpbmcsIGxvZyBoYXMgYmVlbiB3cml0dGVuIHRvIG1ldGVvci5sb2cnXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWlsZCB3YXMgdGVybWluYXRlZCBieSBtZXRlb3ItZGVza3RvcCBhcyBzb21lIGVycm9ycyB3ZXJlIHJlcG9ydGVkIHRvIHN0ZGVyciwgeW91ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaG91bGQgc2VlIGl0IGFib3ZlLCBhbHNvIGNoZWNrIG1ldGVvci5sb2cgZm9yIG1vcmUgaW5mbywgdG8gaWdub3JlIGl0IHVzZSB0aGUgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0taWdub3JlLXN0ZGVyciBcIjxzdHJpbmc+XCInXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Vycm9ySW5BcHAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3lvdXIgbWV0ZW9yIGFwcCBoYXMgZXJyb3JzIC0gbG9vayBpbnRvIG1ldGVvci5sb2cgZm9yIG1vcmUnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGluZm8nXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3BvcnQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3lvdXIgcG9ydCAzMDgwIGlzIGN1cnJlbnRseSB1c2VkICh5b3UgcHJvYmFibHkgaGF2ZSB0aGlzIG9yIG90aGVyICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZXRlb3IgcHJvamVjdCBydW5uaW5nPyksIHVzZSBgLXRgIG9yIGAtLW1ldGVvci1wb3J0YCB0byB1c2UgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RpZmZlcmVudCBwb3J0IHdoaWxlIGJ1aWxkaW5nJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdleGl0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZXRlb3IgY21kIGV4aXRlZCB1bmV4cGVjdGVkbHksIGxvZyBoYXMgYmVlbiB3cml0dGVuIHRvIG1ldGVvci5sb2cnXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvcHknOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9yIGVuY291bnRlcmVkIHdoZW4gY29weWluZyB0aGUgYnVpbGQnXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGJ1aWxkaW5nIG1vYmlsZSB0YXJnZXQnLCByZWFzb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tb2JpbGVQbGF0Zm9ybSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZU1vYmlsZVBsYXRmb3JtKHRoaXMubW9iaWxlUGxhdGZvcm0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmluZGV4SFRNTHN0cmF0ZWd5ID0gdGhpcy5jaG9vc2VTdHJhdGVneSgpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvcHlCdWlsZCgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5qZWN0SXNEZXNrdG9wKCk7XG5cbiAgICAgICAgdGhpcy5jaGFuZ2VEZHBVcmwoKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wYWNrVG9Bc2FyKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKCdlcnJvciB3aGlsZSBwYWNraW5nIG1ldGVvciBhcHAgdG8gYXNhcicpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2cuaW5mbygnbWV0ZW9yIGJ1aWxkIGZpbmlzaGVkJyk7XG5cbiAgICAgICAgaWYgKHRoaXMubW9iaWxlUGxhdGZvcm0pIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlTW9iaWxlUGxhdGZvcm0odGhpcy5tb2JpbGVQbGF0Zm9ybSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjaGFuZ2VEZHBVcmwoKSB7XG4gICAgICAgIGlmICh0aGlzLiQuZW52Lm9wdGlvbnMuZGRwVXJsICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRGRwVXJsKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubWV0ZW9yQXBwSW5kZXgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGBlcnJvciB3aGlsZSB0cnlpbmcgdG8gY2hhbmdlIHRoZSBkZHAgdXJsOiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBhY2tUb0FzYXIoKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ3BhY2tpbmcgbWV0ZW9yIGFwcCB0byBhc2FyIGFyY2hpdmUnKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAgICAgICAgICBhc2FyLmNyZWF0ZVBhY2thZ2UoXG4gICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5tZXRlb3JBcHAsXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAucm9vdCwgJ21ldGVvci5hc2FyJylcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9uIFdpbmRvd3Mgc29tZSBmaWxlcyBtaWdodCBzdGlsbCBiZSBibG9ja2VkLiBHaXZpbmcgYSB0aWNrIGZvciB0aGVtIHRvIGJlXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlYWR5IGZvciBkZWxldGlvbi5cbiAgICAgICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLnZlcmJvc2UoJ2NsZWFyaW5nIG1ldGVvciBhcHAgYWZ0ZXIgcGFja2luZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kLnV0aWxzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJtV2l0aFJldHJpZXMoJy1yZicsIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubWV0ZW9yQXBwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdyYXBwZXIgZm9yIHNwYXduaW5nIG5wbS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSAgY29tbWFuZHMgLSBjb21tYW5kcyBmb3Igc3Bhd25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RkaW9cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY3dkXG4gICAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBydW5OcG0oY29tbWFuZHMsIHN0ZGlvID0gJ2lnbm9yZScsIGN3ZCA9IHRoaXMuJC5lbnYucGF0aHMubWV0ZW9yQXBwLnJvb3QpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nLnZlcmJvc2UoYGV4ZWN1dGluZyBtZXRlb3IgbnBtICR7Y29tbWFuZHMuam9pbignICcpfWApO1xuXG4gICAgICAgICAgICBzcGF3bignbWV0ZW9yJywgWyducG0nLCAuLi5jb21tYW5kc10sIHtcbiAgICAgICAgICAgICAgICBjd2QsXG4gICAgICAgICAgICAgICAgc3RkaW9cbiAgICAgICAgICAgIH0pLm9uKCdleGl0JywgY29kZSA9PiAoXG4gICAgICAgICAgICAgICAgKGNvZGUgPT09IDApID8gcmVzb2x2ZSgpIDogcmVqZWN0KG5ldyBFcnJvcihgbnBtIGV4aXQgY29kZSB3YXMgJHtjb2RlfWApKVxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOzs7O0FBYkE7QUFlQSxNQUFNO0VBQUVBO0FBQUYsSUFBV0Ms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 \ No newline at end of file diff --git a/dist/meteorManager.js b/dist/meteorManager.js new file mode 100644 index 00000000..098723b3 --- /dev/null +++ b/dist/meteorManager.js @@ -0,0 +1,147 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime")); + +var _fs = _interopRequireDefault(require("fs")); + +var _crossSpawn = _interopRequireDefault(require("cross-spawn")); + +var _log = _interopRequireDefault(require("./log")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// eslint-disable-next-line no-unused-vars + +/** + * Utility class designed for managing Meteor packages. + * + * @property {MeteorDesktop} $ + * @class + */ +class MeteorManager { + /** + * @param {MeteorDesktop} $ - context + * @constructor + */ + constructor($) { + this.log = new _log.default('meteorManager'); + this.$ = $; + } + /** + * Looks for specified packages in .meteor/packages. In other words checks if the project has + * specified packages added. + * @param {Array} packages + * @returns {boolean} + */ + + + checkPackages(packages) { + const usedPackages = _fs.default.readFileSync(this.$.env.paths.meteorApp.packages, 'UTF-8').replace(/\r/gm, '').split('\n').filter(line => !line.trim().startsWith('#')); + + return !packages.some(packageToFind => !usedPackages.some(meteorPackage => ~meteorPackage.indexOf(packageToFind))); + } + /** + * Looks for specified packages in .meteor/packages. In other words checks if the project has + * specified packages added. + * @param {Array} packages + * @returns {boolean} + */ + + + checkPackagesVersion(packages) { + const usedPackages = _fs.default.readFileSync(this.$.env.paths.meteorApp.versions, 'UTF-8').replace(/\r/gm, '').split('\n'); + + return !packages.some(packageToFind => !usedPackages.some(meteorPackage => meteorPackage === packageToFind)); + } + /** + * Ensures certain packages are added to meteor project and in correct version. + * @param {Array} packages + * @param {Array} packagesWithVersion + * @param {string} who - name of the entity that requests presence of thos packages (can be the + * integration itself or a plugin) + * @returns {Promise.} + */ + + + async ensurePackages(packages, packagesWithVersion, who) { + if (!this.checkPackages(packages)) { + this.log.warn(`${who} requires some packages that are not added to project, will try to add them now`); + + try { + await this.addPackages(packages, packagesWithVersion); + } catch (e) { + throw new Error(e); + } + } + + if (!this.checkPackagesVersion(packagesWithVersion)) { + this.log.warn(`${who} required packages version is different, fixing it`); + + try { + await this.addPackages(packages, packagesWithVersion); + } catch (e) { + throw new Error(e); + } + } + } + /** + * Removes packages from the meteor app. + * @param {Array} packages - array with names of the packages to remove + */ + + + deletePackages(packages) { + this.log.warn('removing packages from meteor project', ...packages); + return new Promise((resolve, reject) => { + (0, _crossSpawn.default)('meteor', ['remove'].concat(packages), { + cwd: this.$.env.paths.meteorApp.root, + stdio: ['pipe', 'pipe', process.stderr], + env: Object.assign({ + METEOR_PRETTY_OUTPUT: 0, + METEOR_NO_RELEASE_CHECK: 1 + }, process.env) + }).on('exit', code => { + if (code !== 0 || this.checkPackages(packages)) { + reject('removing packages failed'); + } else { + resolve(); + } + }); + }); + } + /** + * Adds packages to the meteor app. + * @param {Array} packages - array with names of the packages to add + * @param {Array} packagesWithVersion - array with names and versions of the packages to add + */ + + + addPackages(packages, packagesWithVersion) { + this.log.info('adding packages to meteor project', ...packagesWithVersion); + return new Promise((resolve, reject) => { + (0, _crossSpawn.default)('meteor', ['add'].concat(packagesWithVersion.map(packageName => packageName.replace('@', '@='))), { + cwd: this.$.env.paths.meteorApp.root, + stdio: ['pipe', 'pipe', process.stderr], + env: Object.assign({ + METEOR_PRETTY_OUTPUT: 0, + METEOR_NO_RELEASE_CHECK: 1 + }, process.env) + }).on('exit', code => { + if (code !== 0 || !this.checkPackages(packages)) { + reject('adding packages failed'); + } else { + resolve(); + } + }); + }); + } + +} + +exports.default = MeteorManager; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNZXRlb3JNYW5hZ2VyIiwiY29uc3RydWN0b3IiLCIkIiwibG9nIiwiTG9nIiwiY2hlY2tQYWNrYWdlcyIsInBhY2thZ2VzIiwidXNlZFBhY2thZ2VzIiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJlbnYiLCJwYXRocyIsIm1ldGVvckFwcCIsInJlcGxhY2UiLCJzcGxpdCIsImZpbHRlciIsImxpbmUiLCJ0cmltIiwic3RhcnRzV2l0aCIsInNvbWUiLCJwYWNrYWdlVG9GaW5kIiwibWV0ZW9yUGFja2FnZSIsImluZGV4T2YiLCJjaGVja1BhY2thZ2VzVmVyc2lvbiIsInZlcnNpb25zIiwiZW5zdXJlUGFja2FnZXMiLCJwYWNrYWdlc1dpdGhWZXJzaW9uIiwid2hvIiwid2FybiIsImFkZFBhY2thZ2VzIiwiZSIsIkVycm9yIiwiZGVsZXRlUGFja2FnZXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNwYXduIiwiY29uY2F0IiwiY3dkIiwicm9vdCIsInN0ZGlvIiwicHJvY2VzcyIsInN0ZGVyciIsIk9iamVjdCIsImFzc2lnbiIsIk1FVEVPUl9QUkVUVFlfT1VUUFVUIiwiTUVURU9SX05PX1JFTEVBU0VfQ0hFQ0siLCJvbiIsImNvZGUiLCJpbmZvIiwibWFwIiwicGFja2FnZU5hbWUiXSwic291cmNlcyI6WyIuLi9saWIvbWV0ZW9yTWFuYWdlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmltcG9ydCByZWdlbmVyYXRvclJ1bnRpbWUgZnJvbSAncmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgc3Bhd24gZnJvbSAnY3Jvc3Mtc3Bhd24nO1xuXG5pbXBvcnQgTG9nIGZyb20gJy4vbG9nJztcblxuLyoqXG4gKiBVdGlsaXR5IGNsYXNzIGRlc2lnbmVkIGZvciBtYW5hZ2luZyBNZXRlb3IgcGFja2FnZXMuXG4gKlxuICogQHByb3BlcnR5IHtNZXRlb3JEZXNrdG9wfSAkXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWV0ZW9yTWFuYWdlciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNZXRlb3JEZXNrdG9wfSAkIC0gY29udGV4dFxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCQpIHtcbiAgICAgICAgdGhpcy5sb2cgPSBuZXcgTG9nKCdtZXRlb3JNYW5hZ2VyJyk7XG4gICAgICAgIHRoaXMuJCA9ICQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9va3MgZm9yIHNwZWNpZmllZCBwYWNrYWdlcyBpbiAubWV0ZW9yL3BhY2thZ2VzLiBJbiBvdGhlciB3b3JkcyBjaGVja3MgaWYgdGhlIHByb2plY3QgaGFzXG4gICAgICogc3BlY2lmaWVkIHBhY2thZ2VzIGFkZGVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhY2thZ2VzXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgY2hlY2tQYWNrYWdlcyhwYWNrYWdlcykge1xuICAgICAgICBjb25zdCB1c2VkUGFja2FnZXMgPSBmc1xuICAgICAgICAgICAgLnJlYWRGaWxlU3luYyh0aGlzLiQuZW52LnBhdGhzLm1ldGVvckFwcC5wYWNrYWdlcywgJ1VURi04JylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXHIvZ20sICcnKVxuICAgICAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAgICAgLmZpbHRlcihsaW5lID0+ICFsaW5lLnRyaW0oKS5zdGFydHNXaXRoKCcjJykpO1xuICAgICAgICByZXR1cm4gIXBhY2thZ2VzLnNvbWUoXG4gICAgICAgICAgICBwYWNrYWdlVG9GaW5kID0+XG4gICAgICAgICAgICAgICAgIXVzZWRQYWNrYWdlcy5zb21lKG1ldGVvclBhY2thZ2UgPT4gfm1ldGVvclBhY2thZ2UuaW5kZXhPZihwYWNrYWdlVG9GaW5kKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb29rcyBmb3Igc3BlY2lmaWVkIHBhY2thZ2VzIGluIC5tZXRlb3IvcGFja2FnZXMuIEluIG90aGVyIHdvcmRzIGNoZWNrcyBpZiB0aGUgcHJvamVjdCBoYXNcbiAgICAgKiBzcGVjaWZpZWQgcGFja2FnZXMgYWRkZWQuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFja2FnZXNcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBjaGVja1BhY2thZ2VzVmVyc2lvbihwYWNrYWdlcykge1xuICAgICAgICBjb25zdCB1c2VkUGFja2FnZXMgPSBmcy5yZWFkRmlsZVN5bmModGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHAudmVyc2lvbnMsICdVVEYtOCcpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxyL2dtLCAnJylcbiAgICAgICAgICAgIC5zcGxpdCgnXFxuJyk7XG4gICAgICAgIHJldHVybiAhcGFja2FnZXMuc29tZShcbiAgICAgICAgICAgIHBhY2thZ2VUb0ZpbmQgPT4gIXVzZWRQYWNrYWdlcy5zb21lKG1ldGVvclBhY2thZ2UgPT4gbWV0ZW9yUGFja2FnZSA9PT0gcGFja2FnZVRvRmluZClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbnN1cmVzIGNlcnRhaW4gcGFja2FnZXMgYXJlIGFkZGVkIHRvIG1ldGVvciBwcm9qZWN0IGFuZCBpbiBjb3JyZWN0IHZlcnNpb24uXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFja2FnZXNcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWNrYWdlc1dpdGhWZXJzaW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHdobyAtIG5hbWUgb2YgdGhlIGVudGl0eSB0aGF0IHJlcXVlc3RzIHByZXNlbmNlIG9mIHRob3MgcGFja2FnZXMgKGNhbiBiZSB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdyYXRpb24gaXRzZWxmIG9yIGEgcGx1Z2luKVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlLjx2b2lkPn1cbiAgICAgKi9cbiAgICBhc3luYyBlbnN1cmVQYWNrYWdlcyhwYWNrYWdlcywgcGFja2FnZXNXaXRoVmVyc2lvbiwgd2hvKSB7XG4gICAgICAgIGlmICghdGhpcy5jaGVja1BhY2thZ2VzKHBhY2thZ2VzKSkge1xuICAgICAgICAgICAgdGhpcy5sb2cud2FybihgJHt3aG99IHJlcXVpcmVzIHNvbWUgcGFja2FnZXMgdGhhdCBhcmUgbm90IGFkZGVkIHRvIHByb2plY3QsIHdpbGwgdHJ5IHRvIGFkZCB0aGVtIG5vd2ApO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFkZFBhY2thZ2VzKHBhY2thZ2VzLCBwYWNrYWdlc1dpdGhWZXJzaW9uKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrUGFja2FnZXNWZXJzaW9uKHBhY2thZ2VzV2l0aFZlcnNpb24pKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy53YXJuKGAke3dob30gcmVxdWlyZWQgcGFja2FnZXMgdmVyc2lvbiBpcyBkaWZmZXJlbnQsIGZpeGluZyBpdGApO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFkZFBhY2thZ2VzKHBhY2thZ2VzLCBwYWNrYWdlc1dpdGhWZXJzaW9uKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHBhY2thZ2VzIGZyb20gdGhlIG1ldGVvciBhcHAuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFja2FnZXMgICAgICAgICAgICAtIGFycmF5IHdpdGggbmFtZXMgb2YgdGhlIHBhY2thZ2VzIHRvIHJlbW92ZVxuICAgICAqL1xuICAgIGRlbGV0ZVBhY2thZ2VzKHBhY2thZ2VzKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oJ3JlbW92aW5nIHBhY2thZ2VzIGZyb20gbWV0ZW9yIHByb2plY3QnLCAuLi5wYWNrYWdlcyk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBzcGF3bihcbiAgICAgICAgICAgICAgICAnbWV0ZW9yJyxcbiAgICAgICAgICAgICAgICBbJ3JlbW92ZSddLmNvbmNhdChwYWNrYWdlcyksIHtcbiAgICAgICAgICAgICAgICAgICAgY3dkOiB0aGlzLiQuZW52LnBhdGhzLm1ldGVvckFwcC5yb290LFxuICAgICAgICAgICAgICAgICAgICBzdGRpbzogWydwaXBlJywgJ3BpcGUnLCBwcm9jZXNzLnN0ZGVycl0sXG4gICAgICAgICAgICAgICAgICAgIGVudjogT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgTUVURU9SX1BSRVRUWV9PVVRQVVQ6IDAsIE1FVEVPUl9OT19SRUxFQVNFX0NIRUNLOiAxIH0sIHByb2Nlc3MuZW52XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLm9uKCdleGl0JywgKGNvZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSAhPT0gMCB8fCB0aGlzLmNoZWNrUGFja2FnZXMocGFja2FnZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgncmVtb3ZpbmcgcGFja2FnZXMgZmFpbGVkJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIHBhY2thZ2VzIHRvIHRoZSBtZXRlb3IgYXBwLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhY2thZ2VzICAgICAgICAgICAgLSBhcnJheSB3aXRoIG5hbWVzIG9mIHRoZSBwYWNrYWdlcyB0byBhZGRcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWNrYWdlc1dpdGhWZXJzaW9uIC0gYXJyYXkgd2l0aCBuYW1lcyBhbmQgdmVyc2lvbnMgb2YgdGhlIHBhY2thZ2VzIHRvIGFkZFxuICAgICAqL1xuICAgIGFkZFBhY2thZ2VzKHBhY2thZ2VzLCBwYWNrYWdlc1dpdGhWZXJzaW9uKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ2FkZGluZyBwYWNrYWdlcyB0byBtZXRlb3IgcHJvamVjdCcsIC4uLnBhY2thZ2VzV2l0aFZlcnNpb24pO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgc3Bhd24oXG4gICAgICAgICAgICAgICAgJ21ldGVvcicsXG4gICAgICAgICAgICAgICAgWydhZGQnXS5jb25jYXQoXG4gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzV2l0aFZlcnNpb24ubWFwKHBhY2thZ2VOYW1lID0+IHBhY2thZ2VOYW1lLnJlcGxhY2UoJ0AnLCAnQD0nKSlcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY3dkOiB0aGlzLiQuZW52LnBhdGhzLm1ldGVvckFwcC5yb290LFxuICAgICAgICAgICAgICAgICAgICBzdGRpbzogWydwaXBlJywgJ3BpcGUnLCBwcm9jZXNzLnN0ZGVycl0sXG4gICAgICAgICAgICAgICAgICAgIGVudjogT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgTUVURU9SX1BSRVRUWV9PVVRQVVQ6IDAsIE1FVEVPUl9OT19SRUxFQVNFX0NIRUNLOiAxIH0sIHByb2Nlc3MuZW52XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLm9uKCdleGl0JywgKGNvZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSAhPT0gMCB8fCAhdGhpcy5jaGVja1BhY2thZ2VzKHBhY2thZ2VzKSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoJ2FkZGluZyBwYWNrYWdlcyBmYWlsZWQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUNBOztBQUNBOztBQUNBOztBQUVBOzs7O0FBTEE7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2UsTUFBTUEsYUFBTixDQUFvQjtFQUMvQjtBQUNKO0FBQ0E7QUFDQTtFQUNJQyxXQUFXLENBQUNDLENBQUQsRUFBSTtJQUNYLEtBQUtDLEdBQUwsR0FBVyxJQUFJQyxZQUFKLENBQVEsZUFBUixDQUFYO0lBQ0EsS0FBS0YsQ0FBTCxHQUFTQSxDQUFUO0VBQ0g7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztFQUNJRyxhQUFhLENBQUNDLFFBQUQsRUFBVztJQUNwQixNQUFNQyxZQUFZLEdBQUdDLFdBQUEsQ0FDaEJDLFlBRGdCLENBQ0gsS0FBS1AsQ0FBTCxDQUFPUSxHQUFQLENBQVdDLEtBQVgsQ0FBaUJDLFNBQWpCLENBQTJCTixRQUR4QixFQUNrQyxPQURsQyxFQUVoQk8sT0FGZ0IsQ0FFUixNQUZRLEVBRUEsRUFGQSxFQUdoQkMsS0FIZ0IsQ0FHVixJQUhVLEVBSWhCQyxNQUpnQixDQUlUQyxJQUFJLElBQUksQ0FBQ0EsSUFBSSxDQUFDQyxJQUFMLEdBQVlDLFVBQVosQ0FBdUIsR0FBdkIsQ0FKQSxDQUFyQjs7SUFLQSxPQUFPLENBQUNaLFFBQVEsQ0FBQ2EsSUFBVCxDQUNKQyxhQUFhLElBQ1QsQ0FBQ2IsWUFBWSxDQUFD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 \ No newline at end of file diff --git a/dist/packager.js b/dist/packager.js new file mode 100644 index 00000000..5dc2f01f --- /dev/null +++ b/dist/packager.js @@ -0,0 +1,142 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime")); + +var _assignIn = _interopRequireDefault(require("lodash/assignIn")); + +var _path = _interopRequireDefault(require("path")); + +var _fs = _interopRequireDefault(require("fs")); + +var _shelljs = _interopRequireDefault(require("shelljs")); + +var _log = _interopRequireDefault(require("./log")); + +var _defaultDependencies = _interopRequireDefault(require("./defaultDependencies")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// eslint-disable-next-line no-unused-vars +const { + join +} = _path.default; +/** + * Wrapper around electron-packager. + * @class + */ + +class ElectronPackager { + constructor($) { + this.log = new _log.default('electron-packager'); + this.$ = $; + } + + async init() { + this.packager = (await this.$.getDependency('electron-packager', _defaultDependencies.default['electron-packager'])).dependency; + } + /** + * Runs the packager with provided arguments. + * + * @param {Object} args + * @returns {Promise} + */ + + + runPackager(args) { + return new Promise((resolve, reject) => { + this.packager(args, err => { + if (err) { + reject(err); + } else { + this.log.info(`wrote packaged app to ${this.$.env.paths.packageDir}`); + resolve(); + } + }); + }); + } + + async packageApp() { + const { + version + } = JSON.parse(_fs.default.readFileSync(join(this.$.env.paths.meteorApp.root, 'node_modules', 'electron', 'package.json'), 'UTF-8')); + const settings = this.$.desktop.getSettings(); + const { + name + } = settings; + + if (!name) { + this.log.error('`name` field in settings.json not set'); + process.exit(1); + } + + const arch = this.$.env.options.ia32 ? 'ia32' : 'x64'; + this.log.info(`packaging '${name}' for platform '${this.$.env.sys.platform}-${arch}'` + ` using electron v${version}`); + + try { + await this.$.utils.rmWithRetries('-rf', _path.default.join(this.$.env.options.output, this.$.env.paths.packageDir)); + } catch (e) { + throw new Error(e); + } + + const args = { + name, + arch, + prune: false, + electronVersion: version, + platform: this.$.env.sys.platform, + dir: this.$.env.paths.electronApp.root, + out: _path.default.join(this.$.env.options.output, this.$.env.paths.packageDir) + }; + + if ('packagerOptions' in settings) { + const { + packagerOptions + } = settings; + ['windows', 'linux', 'osx'].forEach(system => { + if (this.$.env.os[`is${system[0].toUpperCase()}${system.substring(1)}`] && `_${system}` in packagerOptions) { + (0, _assignIn.default)(packagerOptions, packagerOptions[`_${system}`]); + } + }); + Object.keys(packagerOptions).forEach(field => { + if (packagerOptions[field] === '@version') { + packagerOptions[field] = settings.version; + } + }); + (0, _assignIn.default)(args, packagerOptions); + } // Move node_modules away. We do not want to delete it, just temporarily remove it from + // our way. + + + _fs.default.renameSync(this.$.env.paths.electronApp.nodeModules, this.$.env.paths.electronApp.tmpNodeModules); + + let extracted = false; + + if (this.$.utils.exists(this.$.env.paths.electronApp.extractedNodeModules)) { + _fs.default.renameSync(this.$.env.paths.electronApp.extractedNodeModules, this.$.env.paths.electronApp.nodeModules); + + extracted = true; + } + + try { + await this.runPackager(args); + } finally { + if (extracted) { + _shelljs.default.rm('-rf', this.$.env.paths.electronApp.extractedNodeModules); + + _shelljs.default.rm('-rf', this.$.env.paths.electronApp.nodeModules); + } // Move node_modules back. + + + _fs.default.renameSync(this.$.env.paths.electronApp.tmpNodeModules, this.$.env.paths.electronApp.nodeModules); + } + } + +} + +exports.default = ElectronPackager; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJqb2luIiwicGF0aCIsIkVsZWN0cm9uUGFja2FnZXIiLCJjb25zdHJ1Y3RvciIsIiQiLCJsb2ciLCJMb2ciLCJpbml0IiwicGFja2FnZXIiLCJnZXREZXBlbmRlbmN5IiwiZGVmYXVsdERlcGVuZGVuY2llcyIsImRlcGVuZGVuY3kiLCJydW5QYWNrYWdlciIsImFyZ3MiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImVyciIsImluZm8iLCJlbnYiLCJwYXRocyIsInBhY2thZ2VEaXIiLCJwYWNrYWdlQXBwIiwidmVyc2lvbiIsIkpTT04iLCJwYXJzZSIsImZzIiwicmVhZEZpbGVTeW5jIiwibWV0ZW9yQXBwIiwicm9vdCIsInNldHRpbmdzIiwiZGVza3RvcCIsImdldFNldHRpbmdzIiwibmFtZSIsImVycm9yIiwicHJvY2VzcyIsImV4aXQiLCJhcmNoIiwib3B0aW9ucyIsImlhMzIiLCJzeXMiLCJwbGF0Zm9ybSIsInV0aWxzIiwicm1XaXRoUmV0cmllcyIsIm91dHB1dCIsImUiLCJFcnJvciIsInBydW5lIiwiZWxlY3Ryb25WZXJzaW9uIiwiZGlyIiwiZWxlY3Ryb25BcHAiLCJvdXQiLCJwYWNrYWdlck9wdGlvbnMiLCJmb3JFYWNoIiwic3lzdGVtIiwib3MiLCJ0b1VwcGVyQ2FzZSIsInN1YnN0cmluZyIsImFzc2lnbkluIiwiT2JqZWN0Iiwia2V5cyIsImZpZWxkIiwicmVuYW1lU3luYyIsIm5vZGVNb2R1bGVzIiwidG1wTm9kZU1vZHVsZXMiLCJleHRyYWN0ZWQiLCJleGlzdHMiLCJleHRyYWN0ZWROb2RlTW9kdWxlcyIsInNoZWxsIiwicm0iXSwic291cmNlcyI6WyIuLi9saWIvcGFja2FnZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5pbXBvcnQgcmVnZW5lcmF0b3JSdW50aW1lIGZyb20gJ3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZSc7XG5pbXBvcnQgYXNzaWduSW4gZnJvbSAnbG9kYXNoL2Fzc2lnbkluJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBzaGVsbCBmcm9tICdzaGVsbGpzJztcblxuaW1wb3J0IExvZyBmcm9tICcuL2xvZyc7XG5pbXBvcnQgZGVmYXVsdERlcGVuZGVuY2llcyBmcm9tICcuL2RlZmF1bHREZXBlbmRlbmNpZXMnO1xuXG5jb25zdCB7IGpvaW4gfSA9IHBhdGg7XG5cbi8qKlxuICogV3JhcHBlciBhcm91bmQgZWxlY3Ryb24tcGFja2FnZXIuXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWxlY3Ryb25QYWNrYWdlciB7XG4gICAgY29uc3RydWN0b3IoJCkge1xuICAgICAgICB0aGlzLmxvZyA9IG5ldyBMb2coJ2VsZWN0cm9uLXBhY2thZ2VyJyk7XG4gICAgICAgIHRoaXMuJCA9ICQ7XG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdCgpIHtcbiAgICAgICAgdGhpcy5wYWNrYWdlciA9IChhd2FpdCB0aGlzLiQuZ2V0RGVwZW5kZW5jeSgnZWxlY3Ryb24tcGFja2FnZXInLCBkZWZhdWx0RGVwZW5kZW5jaWVzWydlbGVjdHJvbi1wYWNrYWdlciddKSkuZGVwZW5kZW5jeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSdW5zIHRoZSBwYWNrYWdlciB3aXRoIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgcnVuUGFja2FnZXIoYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYWNrYWdlcihhcmdzLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZy5pbmZvKGB3cm90ZSBwYWNrYWdlZCBhcHAgdG8gJHt0aGlzLiQuZW52LnBhdGhzLnBhY2thZ2VEaXJ9YCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcGFja2FnZUFwcCgpIHtcbiAgICAgICAgY29uc3QgeyB2ZXJzaW9uIH0gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgIGpvaW4oXG4gICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHAucm9vdCxcbiAgICAgICAgICAgICAgICAnbm9kZV9tb2R1bGVzJyxcbiAgICAgICAgICAgICAgICAnZWxlY3Ryb24nLFxuICAgICAgICAgICAgICAgICdwYWNrYWdlLmpzb24nXG4gICAgICAgICAgICApLCAnVVRGLTgnXG4gICAgICAgICkpO1xuXG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy4kLmRlc2t0b3AuZ2V0U2V0dGluZ3MoKTtcbiAgICAgICAgY29uc3QgeyBuYW1lIH0gPSBzZXR0aW5ncztcbiAgICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignYG5hbWVgIGZpZWxkIGluIHNldHRpbmdzLmpzb24gbm90IHNldCcpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXJjaCA9IHRoaXMuJC5lbnYub3B0aW9ucy5pYTMyID8gJ2lhMzInIDogJ3g2NCc7XG5cbiAgICAgICAgdGhpcy5sb2cuaW5mbyhcbiAgICAgICAgICAgIGBwYWNrYWdpbmcgJyR7bmFtZX0nIGZvciBwbGF0Zm9ybSAnJHt0aGlzLiQuZW52LnN5cy5wbGF0Zm9ybX0tJHthcmNofSdgICtcbiAgICAgICAgICAgIGAgdXNpbmcgZWxlY3Ryb24gdiR7dmVyc2lvbn1gXG4gICAgICAgICk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuJC51dGlscy5ybVdpdGhSZXRyaWVzKFxuICAgICAgICAgICAgICAgICctcmYnLCBwYXRoLmpvaW4odGhpcy4kLmVudi5vcHRpb25zLm91dHB1dCwgdGhpcy4kLmVudi5wYXRocy5wYWNrYWdlRGlyKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXJncyA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBhcmNoLFxuICAgICAgICAgICAgcHJ1bmU6IGZhbHNlLFxuICAgICAgICAgICAgZWxlY3Ryb25WZXJzaW9uOiB2ZXJzaW9uLFxuICAgICAgICAgICAgcGxhdGZvcm06IHRoaXMuJC5lbnYuc3lzLnBsYXRmb3JtLFxuICAgICAgICAgICAgZGlyOiB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnJvb3QsXG4gICAgICAgICAgICBvdXQ6IHBhdGguam9pbih0aGlzLiQuZW52Lm9wdGlvbnMub3V0cHV0LCB0aGlzLiQuZW52LnBhdGhzLnBhY2thZ2VEaXIpXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCdwYWNrYWdlck9wdGlvbnMnIGluIHNldHRpbmdzKSB7XG4gICAgICAgICAgICBjb25zdCB7IHBhY2thZ2VyT3B0aW9ucyB9ID0gc2V0dGluZ3M7XG5cbiAgICAgICAgICAgIFsnd2luZG93cycsICdsaW51eCcsICdvc3gnXS5mb3JFYWNoKChzeXN0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJC5lbnYub3NbYGlzJHtzeXN0ZW1bMF0udG9VcHBlckNhc2UoKX0ke3N5c3RlbS5zdWJzdHJpbmcoMSl9YF0gJiZcbiAgICAgICAgICAgICAgICAgICAgKGBfJHtzeXN0ZW19YCkgaW4gcGFja2FnZXJPcHRpb25zXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGFzc2lnbkluKHBhY2thZ2VyT3B0aW9ucywgcGFja2FnZXJPcHRpb25zW2BfJHtzeXN0ZW19YF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhwYWNrYWdlck9wdGlvbnMpLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VyT3B0aW9uc1tmaWVsZF0gPT09ICdAdmVyc2lvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFja2FnZXJPcHRpb25zW2ZpZWxkXSA9IHNldHRpbmdzLnZlcnNpb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGFzc2lnbkluKGFyZ3MsIHBhY2thZ2VyT3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNb3ZlIG5vZGVfbW9kdWxlcyBhd2F5LiBXZSBkbyBub3Qgd2FudCB0byBkZWxldGUgaXQsIGp1c3QgdGVtcG9yYXJpbHkgcmVtb3ZlIGl0IGZyb21cbiAgICAgICAgLy8gb3VyIHdheS5cbiAgICAgICAgZnMucmVuYW1lU3luYyhcbiAgICAgICAgICAgIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubm9kZU1vZHVsZXMsXG4gICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnRtcE5vZGVNb2R1bGVzXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IGV4dHJhY3RlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLiQudXRpbHMuZXhpc3RzKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuZXh0cmFjdGVkTm9kZU1vZHVsZXMpKSB7XG4gICAgICAgICAgICBmcy5yZW5hbWVTeW5jKFxuICAgICAgICAgICAgICAgIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuZXh0cmFjdGVkTm9kZU1vZHVsZXMsXG4gICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5ub2RlTW9kdWxlc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGV4dHJhY3RlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW5QYWNrYWdlcihhcmdzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChleHRyYWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBzaGVsbC5ybSgnLXJmJywgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5leHRyYWN0ZWROb2RlTW9kdWxlcyk7XG4gICAgICAgICAgICAgICAgc2hlbGwucm0oJy1yZicsIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubm9kZU1vZHVsZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTW92ZSBub2RlX21vZHVsZXMgYmFjay5cbiAgICAgICAgICAgIGZzLnJlbmFtZVN5bmMoXG4gICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC50bXBOb2RlTW9kdWxlcyxcbiAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLm5vZGVNb2R1bGVzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7Ozs7QUFSQTtBQVVBLE1BQU07RUFBRUE7QUFBRixJQUFXQyxhQUFqQjtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUNlLE1BQU1DLGdCQUFOLENBQXVCO0VBQ2xDQyxXQUFXLENBQUNDLENBQUQsRUFBSTtJQUNYLEtBQUtDLEdBQUwsR0FBVyxJQUFJQyxZQUFKLENBQVEsbUJB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 \ No newline at end of file diff --git a/dist/scripts/addToScripts.js b/dist/scripts/addToScripts.js new file mode 100644 index 00000000..aa8d2507 --- /dev/null +++ b/dist/scripts/addToScripts.js @@ -0,0 +1,24 @@ +"use strict"; + +var _path = _interopRequireDefault(require("path")); + +var _addScript = _interopRequireDefault(require("./utils/addScript")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/* eslint-disable no-console */ + +/** + * This script adds a 'desktop' entry to 'scripts' in package.json. If the entry already exists + * it leaves it untouched. + */ +function fail() { + console.error('[meteor-desktop] failed to add meteor-desktop to your package.json scripts, ' + 'please add it manually as \'desktop\': \'meteor-desktop\''); + process.exit(0); +} + +const packageJsonPath = _path.default.resolve(_path.default.join(__dirname, '..', '..', '..', '..', 'package.json')); + +(0, _addScript.default)('desktop', 'meteor-desktop', packageJsonPath, fail); +console.log('[meteor-desktop] successfully added a \'desktop\' entry to your package.json' + ' scripts section.'); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmYWlsIiwiY29uc29sZSIsImVycm9yIiwicHJvY2VzcyIsImV4aXQiLCJwYWNrYWdlSnNvblBhdGgiLCJwYXRoIiwicmVzb2x2ZSIsImpvaW4iLCJfX2Rpcm5hbWUiLCJhZGRTY3JpcHQiLCJsb2ciXSwic291cmNlcyI6WyIuLi8uLi9saWIvc2NyaXB0cy9hZGRUb1NjcmlwdHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCBhZGRTY3JpcHQgZnJvbSAnLi91dGlscy9hZGRTY3JpcHQnO1xuLyoqXG4gKiBUaGlzIHNjcmlwdCBhZGRzIGEgJ2Rlc2t0b3AnIGVudHJ5IHRvICdzY3JpcHRzJyBpbiBwYWNrYWdlLmpzb24uIElmIHRoZSBlbnRyeSBhbHJlYWR5IGV4aXN0c1xuICogaXQgbGVhdmVzIGl0IHVudG91Y2hlZC5cbiAqL1xuZnVuY3Rpb24gZmFpbCgpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbbWV0ZW9yLWRlc2t0b3BdIGZhaWxlZCB0byBhZGQgbWV0ZW9yLWRlc2t0b3AgdG8geW91ciBwYWNrYWdlLmpzb24gc2NyaXB0cywgJyArXG4gICAgICAgICdwbGVhc2UgYWRkIGl0IG1hbnVhbGx5IGFzIFxcJ2Rlc2t0b3BcXCc6IFxcJ21ldGVvci1kZXNrdG9wXFwnJyk7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xufVxuXG5jb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpXG4pO1xuXG5hZGRTY3JpcHQoJ2Rlc2t0b3AnLCAnbWV0ZW9yLWRlc2t0b3AnLCBwYWNrYWdlSnNvblBhdGgsIGZhaWwpO1xuXG5jb25zb2xlLmxvZygnW21ldGVvci1kZXNrdG9wXSBzdWNjZXNzZnVsbHkgYWRkZWQgYSBcXCdkZXNrdG9wXFwnIGVudHJ5IHRvIHlvdXIgcGFja2FnZS5qc29uJyArXG4gICAgJyBzY3JpcHRzIHNlY3Rpb24uJyk7XG4iXSwibWFwcGluZ3MiOiI7O0FBQ0E7O0FBRUE7Ozs7QUFIQTs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLElBQVQsR0FBZ0I7RUFDWkMsT0FBTyxDQUFDQyxLQUFSLENBQWMsaUZBQ1YsMkRBREo7RUFFQUMsT0FBTyxDQUFDQyxJQUFSLENBQWEsQ0FBYjtBQUNIOztBQUVELE1BQU1DLGVBQWUsR0FBR0MsYUFBQSxDQUFLQyxPQUFMLENBQ3BCRCxhQUFBLENBQUtFLElBQUwsQ0FBVUMsU0FBVixFQUFxQixJQUFyQixFQUEyQixJQUEzQixFQUFpQyxJQUFqQyxFQUF1QyxJQUF2QyxFQUE2QyxjQUE3QyxDQURvQixDQUF4Qjs7QUFJQSxJQUFBQyxrQkFBQSxFQUFVLFNBQVYsRUFBcUIsZ0JBQXJCLEVBQXVDTCxlQUF2QyxFQUF3REwsSUFBeEQ7QUFFQUMsT0FBTyxDQUFDVSxHQUFSLENBQVksaUZBQ1IsbUJBREoifQ== \ No newline at end of file diff --git a/dist/scripts/propagateVersion.js b/dist/scripts/propagateVersion.js new file mode 100644 index 00000000..eb548ed1 --- /dev/null +++ b/dist/scripts/propagateVersion.js @@ -0,0 +1,21 @@ +"use strict"; + +// This propagates the version from package.json to Meteor plugins. +const { + version +} = require('../../package.json'); + +const fs = require('fs'); + +const paths = ['./plugins/bundler/package.js', './plugins/watcher/package.js']; +paths.forEach(path => { + let packageJs = fs.readFileSync(path, 'UTF-8'); + packageJs = packageJs.replace(/(version: ')([^']+)'/, `$1${version}'`); + + if (~path.indexOf('watcher')) { + packageJs = packageJs.replace(/(communitypackages:meteor-desktop-bundler@)([^']+)'/, `$1${version}'`); + } + + fs.writeFileSync(path, packageJs); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ2ZXJzaW9uIiwicmVxdWlyZSIsImZzIiwicGF0aHMiLCJmb3JFYWNoIiwicGF0aCIsInBhY2thZ2VKcyIsInJlYWRGaWxlU3luYyIsInJlcGxhY2UiLCJpbmRleE9mIiwid3JpdGVGaWxlU3luYyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9zY3JpcHRzL3Byb3BhZ2F0ZVZlcnNpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBwcm9wYWdhdGVzIHRoZSB2ZXJzaW9uIGZyb20gcGFja2FnZS5qc29uIHRvIE1ldGVvciBwbHVnaW5zLlxuXG5jb25zdCB7IHZlcnNpb24gfSA9IHJlcXVpcmUoJy4uLy4uL3BhY2thZ2UuanNvbicpO1xuY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuXG5jb25zdCBwYXRocyA9IFsnLi9wbHVnaW5zL2J1bmRsZXIvcGFja2FnZS5qcycsICcuL3BsdWdpbnMvd2F0Y2hlci9wYWNrYWdlLmpzJ107XG5wYXRocy5mb3JFYWNoKChwYXRoKSA9PiB7XG4gICAgbGV0IHBhY2thZ2VKcyA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLCAnVVRGLTgnKTtcbiAgICBwYWNrYWdlSnMgPSBwYWNrYWdlSnMucmVwbGFjZSgvKHZlcnNpb246ICcpKFteJ10rKScvLCBgJDEke3ZlcnNpb259J2ApO1xuICAgIGlmICh+cGF0aC5pbmRleE9mKCd3YXRjaGVyJykpIHtcbiAgICAgICAgcGFja2FnZUpzID0gcGFja2FnZUpzLnJlcGxhY2UoLyhjb21tdW5pdHlwYWNrYWdlczptZXRlb3ItZGVza3RvcC1idW5kbGVyQCkoW14nXSspJy8sIGAkMSR7dmVyc2lvbn0nYCk7XG4gICAgfVxuICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aCwgcGFja2FnZUpzKTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBRUEsTUFBTTtFQUFFQTtBQUFGLElBQWNDLE9BQU8sQ0FBQyxvQkFBRCxDQUEzQjs7QUFDQSxNQUFNQyxFQUFFLEdBQUdELE9BQU8sQ0FBQyxJQUFELENBQWxCOztBQUVBLE1BQU1FLEtBQUssR0FBRyxDQUFDLDhCQUFELEVBQWlDLDhCQUFqQyxDQUFkO0FBQ0FBLEtBQUssQ0FBQ0MsT0FBTixDQUFlQyxJQUFELElBQVU7RUFDcEIsSUFBSUMsU0FBUyxHQUFHSixFQUFFLENBQUNLLFlBQUgsQ0FBZ0JGLElBQWhCLEVBQXNCLE9BQXRCLENBQWhCO0VBQ0FDLFNBQVMsR0FBR0EsU0FBUyxDQUFDRSxPQUFWLENBQWtCLHNCQUFsQixFQUEyQyxLQUFJUixPQUFRLEdBQXZELENBQVo7O0VBQ0EsSUFBSSxDQUFDSyxJQUFJLENBQUNJLE9BQUwsQ0FBYSxTQUFiLENBQUwsRUFBOEI7SUFDMUJILFNBQVMsR0FBR0EsU0FBUyxDQUFDRSxPQUFWLENBQWtCLHFEQUFsQixFQUEwRSxLQUFJUixPQUFRLEdBQXRGLENBQVo7RUFDSDs7RUFDREUsRUFBRSxDQUFDUSxhQUFILENBQWlCTCxJQUFqQixFQUF1QkMsU0FBdkI7QUFDSCxDQVBEIn0= \ No newline at end of file diff --git a/dist/scripts/utils/addScript.js b/dist/scripts/utils/addScript.js new file mode 100644 index 00000000..3e6b47e5 --- /dev/null +++ b/dist/scripts/utils/addScript.js @@ -0,0 +1,50 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = addScript; + +var _fs = _interopRequireDefault(require("fs")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function readJsonFile(jsonFilePath) { + try { + return JSON.parse(_fs.default.readFileSync(jsonFilePath, 'UTF-8')); + } catch (e) { + return false; + } +} + +function writeJsonFile(jsonFilePath, jsonContents) { + try { + _fs.default.writeFileSync(jsonFilePath, JSON.stringify(jsonContents, null, 2)); + } catch (e) { + return false; + } + + return true; +} + +function addScript(name, script, packageJsonPath, fail) { + const packageJson = readJsonFile(packageJsonPath); + + if (!(packageJson && packageJson.name)) { + fail(); + return; + } + + if (!('scripts' in packageJson)) { + packageJson.scripts = {}; + } + + if (!(name in packageJson.scripts)) { + packageJson.scripts[name] = script; + } + + if (!writeJsonFile(packageJsonPath, packageJson)) { + fail(); + } +} +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZWFkSnNvbkZpbGUiLCJqc29uRmlsZVBhdGgiLCJKU09OIiwicGFyc2UiLCJmcyIsInJlYWRGaWxlU3luYyIsImUiLCJ3cml0ZUpzb25GaWxlIiwianNvbkNvbnRlbnRzIiwid3JpdGVGaWxlU3luYyIsInN0cmluZ2lmeSIsImFkZFNjcmlwdCIsIm5hbWUiLCJzY3JpcHQiLCJwYWNrYWdlSnNvblBhdGgiLCJmYWlsIiwicGFja2FnZUpzb24iLCJzY3JpcHRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL3NjcmlwdHMvdXRpbHMvYWRkU2NyaXB0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdmcyc7XG5cbmZ1bmN0aW9uIHJlYWRKc29uRmlsZShqc29uRmlsZVBhdGgpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoanNvbkZpbGVQYXRoLCAnVVRGLTgnKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB3cml0ZUpzb25GaWxlKGpzb25GaWxlUGF0aCwganNvbkNvbnRlbnRzKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhqc29uRmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KGpzb25Db250ZW50cywgbnVsbCwgMikpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYWRkU2NyaXB0KG5hbWUsIHNjcmlwdCwgcGFja2FnZUpzb25QYXRoLCBmYWlsKSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSByZWFkSnNvbkZpbGUocGFja2FnZUpzb25QYXRoKTtcbiAgICBpZiAoIShwYWNrYWdlSnNvbiAmJiBwYWNrYWdlSnNvbi5uYW1lKSkge1xuICAgICAgICBmYWlsKCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoISgnc2NyaXB0cycgaW4gcGFja2FnZUpzb24pKSB7XG4gICAgICAgIHBhY2thZ2VKc29uLnNjcmlwdHMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIShuYW1lIGluIHBhY2thZ2VKc29uLnNjcmlwdHMpKSB7XG4gICAgICAgIHBhY2thZ2VKc29uLnNjcmlwdHNbbmFtZV0gPSBzY3JpcHQ7XG4gICAgfVxuXG4gICAgaWYgKCF3cml0ZUpzb25GaWxlKHBhY2thZ2VKc29uUGF0aCwgcGFja2FnZUpzb24pKSB7XG4gICAgICAgIGZhaWwoKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7OztBQUVBLFNBQVNBLFlBQVQsQ0FBc0JDLFlBQXRCLEVBQW9DO0VBQ2hDLElBQUk7SUFDQSxPQUFPQyxJQUFJLENBQUNDLEtBQUwsQ0FBV0MsV0FBQSxDQUFHQyxZQUFILENBQWdCSixZQUFoQixFQUE4QixPQUE5QixDQUFYLENBQVA7RUFDSCxDQUZELENBRUUsT0FBT0ssQ0FBUCxFQUFVO0lBQ1IsT0FBTyxLQUFQO0VBQ0g7QUFDSjs7QUFFRCxTQUFTQyxhQUFULENBQXVCTixZQUF2QixFQUFxQ08sWUFBckMsRUFBbUQ7RUFDL0MsSUFBSTtJQUNBSixXQUFBLENBQUdLLGFBQUgsQ0FBaUJSLFlBQWpCLEVBQStCQyxJQUFJLENBQUNRLFNBQUwsQ0FBZUYsWUFBZixFQUE2QixJQUE3QixFQUFtQyxDQUFuQyxDQUEvQjtFQUNILENBRkQsQ0FFRSxPQUFPRixDQUFQLEVBQVU7SUFDUixPQUFPLEtBQVA7RUFDSDs7RUFDRCxPQUFPLElBQVA7QUFDSDs7QUFFYyxTQUFTSyxTQUFULENBQW1CQyxJQUFuQixFQUF5QkMsTUFBekIsRUFBaUNDLGVBQWpDLEVBQWtEQyxJQUFsRCxFQUF3RDtFQUNuRSxNQUFNQyxXQUFXLEdBQUdoQixZQUFZLENBQUNjLGVBQUQsQ0FBaEM7O0VBQ0EsSUFBSSxFQUFFRSxXQUFXLElBQUlBLFdBQVcsQ0FBQ0osSUFBN0IsQ0FBSixFQUF3QztJQUNwQ0csSUFBSTtJQUNKO0VBQ0g7O0VBRUQsSUFBSSxFQUFFLGFBQWFDLFdBQWYsQ0FBSixFQUFpQztJQUM3QkEsV0FBVyxDQUFDQyxPQUFaLEdBQXNCLEVBQXRCO0VBQ0g7O0VBRUQsSUFBSSxFQUFFTCxJQUFJLElBQUlJLFdBQVcsQ0FBQ0MsT0FBdEIsQ0FBSixFQUFvQztJQUNoQ0QsV0FBVyxDQUFDQyxPQUFaLENBQW9CTCxJQUFwQixJQUE0QkMsTUFBNUI7RUFDSDs7RUFFRCxJQUFJLENBQUNOLGFBQWEsQ0FBQ08sZUFBRCxFQUFrQkUsV0FBbEIsQ0FBbEIsRUFBa0Q7SUFDOUNELElBQUk7RUFDUDtBQUNKIn0= \ No newline at end of file diff --git a/dist/skeletonDependencies.js b/dist/skeletonDependencies.js new file mode 100644 index 00000000..31e6e13d --- /dev/null +++ b/dist/skeletonDependencies.js @@ -0,0 +1,24 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _default = { + connect: '3.6.6', + 'server-destroy': '1.0.1', + winston: '2.3.0', + 'find-port': '2.0.1', + rimraf: '2.6.2', + shelljs: '0.7.5', + lodash: '4.17.15', + request: '2.88.0', + queue: '4.0.1', + reify: '0.17.3', + send: '0.16.2', + mime: '2.0.3', + 'fs-extra': '3.0.1', + 'fs-plus': '2.9.3' +}; +exports.default = _default; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb25uZWN0Iiwid2luc3RvbiIsInJpbXJhZiIsInNoZWxsanMiLCJsb2Rhc2giLCJyZXF1ZXN0IiwicXVldWUiLCJyZWlmeSIsInNlbmQiLCJtaW1lIl0sInNvdXJjZXMiOlsiLi4vbGliL3NrZWxldG9uRGVwZW5kZW5jaWVzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IHtcbiAgICBjb25uZWN0OiAnMy42LjYnLFxuICAgICdzZXJ2ZXItZGVzdHJveSc6ICcxLjAuMScsXG4gICAgd2luc3RvbjogJzIuMy4wJyxcbiAgICAnZmluZC1wb3J0JzogJzIuMC4xJyxcbiAgICByaW1yYWY6ICcyLjYuMicsXG4gICAgc2hlbGxqczogJzAuNy41JyxcbiAgICBsb2Rhc2g6ICc0LjE3LjE1JyxcbiAgICByZXF1ZXN0OiAnMi44OC4wJyxcbiAgICBxdWV1ZTogJzQuMC4xJyxcbiAgICByZWlmeTogJzAuMTcuMycsXG4gICAgc2VuZDogJzAuMTYuMicsXG4gICAgbWltZTogJzIuMC4zJyxcbiAgICAnZnMtZXh0cmEnOiAnMy4wLjEnLFxuICAgICdmcy1wbHVzJzogJzIuOS4zJ1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O2VBQWU7RUFDWEEsT0FBTyxFQUFFLE9BREU7RUFFWCxrQkFBa0IsT0FGUDtFQUdYQyxPQUFPLEVBQUUsT0FIRTtFQUlYLGFBQWEsT0FKRjtFQUtYQyxNQUFNLEVBQUUsT0FMRztFQU1YQyxPQUFPLEVBQUUsT0FORTtFQU9YQyxNQUFNLEVBQUUsU0FQRztFQVFYQyxPQUFPLEVBQUUsUUFSRTtFQVNYQyxLQUFLLEVBQUUsT0FUSTtFQVVYQyxLQUFLLEVBQUUsUUFWSTtFQVdYQyxJQUFJLEVBQUUsUUFYSztFQVlYQyxJQUFJLEVBQUUsT0FaSztFQWFYLFlBQVksT0FiRDtFQWNYLFdBQVc7QUFkQSxDIn0= \ No newline at end of file diff --git a/dist/utils.js b/dist/utils.js new file mode 100644 index 00000000..f931f672 --- /dev/null +++ b/dist/utils.js @@ -0,0 +1,328 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.computeHashForHashesSet = computeHashForHashesSet; +exports.default = void 0; +exports.exists = exists; +exports.getFileList = getFileList; +exports.readAndGetFileHash = readAndGetFileHash; +exports.readAndHashFiles = readAndHashFiles; +exports.readDir = readDir; +exports.readFilesAndComputeHash = readFilesAndComputeHash; +exports.rmWithRetries = rmWithRetries; +exports.symlinkExists = symlinkExists; + +var _path = _interopRequireDefault(require("path")); + +var _fs = _interopRequireDefault(require("fs")); + +var _crypto = _interopRequireDefault(require("crypto")); + +var _shelljs = _interopRequireDefault(require("shelljs")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/* eslint-disable consistent-return */ + +/** + * Exists + * @param {string} pathToCheck + * @returns {boolean} + */ +function exists(pathToCheck) { + try { + _fs.default.accessSync(pathToCheck); + + return true; + } catch (e) { + return false; + } +} +/** + * Simple wrapper for shelljs.rm with additional retries in case of failure. + * It is useful when something is concurrently reading the dir you want to remove. + */ + + +function rmWithRetries(...args) { + let retries = 0; + return new Promise((resolve, reject) => { + function rm(...rmArgs) { + try { + _shelljs.default.config.fatal = true; + + _shelljs.default.rm(...rmArgs); + + _shelljs.default.config.reset(); + + resolve(); + } catch (e) { + retries += 1; + + if (retries < 5) { + setTimeout(() => { + rm(...rmArgs); + }, 100); + } else { + _shelljs.default.config.reset(); + + reject(e); + } + } + } + + rm(...args); + }); +} + +function readDir(dir, callback) { + if (!callback) { + return new Promise((resolve, reject) => { + readDir(dir, (err, data, stats) => { + if (err) { + reject(err); + } else { + resolve({ + data, + stats + }); + } + }); + }); + } + + let list = []; + let allStats = {}; + + _fs.default.readdir(dir, (err, files) => { + if (err) { + return callback(err); + } + + let pending = files.length; + + if (!pending) { + return callback(null, list, allStats); + } + + files.forEach(file => { + const filePath = _path.default.join(dir, file); + + _fs.default.stat(filePath, (_err, stats) => { + if (_err) { + return callback(_err); + } + + if (stats.isDirectory()) { + readDir(filePath, (__err, res, _allStats) => { + if (__err) { + return callback(__err); + } + + list = list.concat(res); + allStats = Object.assign(allStats, _allStats); + pending -= 1; + + if (!pending) { + return callback(null, list, allStats); + } + }); + } else { + list.push(filePath); + allStats[filePath] = { + size: stats.size, + dates: [stats.birthtime.getTime(), stats.ctime.getTime(), stats.mtime.getTime()] + }; + pending -= 1; + + if (!pending) { + return callback(null, list, allStats); + } + } + }); + }); + }); +} +/** + * Returns a file list from a directory. + * @param {string} dir - dir path + * @param {boolean} sort - whether to apply sort + * @returns {Promise} + */ + + +function getFileList(dir, sort = false) { + return new Promise((resolve, reject) => { + readDir(dir, (error, files) => { + if (error) { + reject(error); + return; + } // eslint-disable-next-line no-param-reassign + + + let resultantFilesList; + + if (sort) { + const stripLength = dir.substr(0, 2) === './' ? dir.length - 1 : dir.length + 1; + let pathsUnified = files.map(pth => pth.substr(stripLength).replace(/[\\/]/gm, '-')); + const temporaryIndex = {}; + files.forEach((file, i) => { + temporaryIndex[pathsUnified[i]] = file; + }); + pathsUnified = pathsUnified.sort(); + const filesSorted = []; + pathsUnified.forEach(key => { + filesSorted.push(temporaryIndex[key]); + }); + resultantFilesList = filesSorted; + } else { + resultantFilesList = files; + } + + resolve(resultantFilesList); + }); + }); +} +/** + * Returns file's hash. + * @param {string} file - file path + * @param {boolean} returnFileContents - include file contents in the resultant object + * @returns {Promise} + */ + + +function readAndGetFileHash(file, returnFileContents = false) { + return new Promise((resolve, reject) => { + _fs.default.readFile(file, (err, data) => { + if (err) { + reject(err); + return; + } + + const hash = _crypto.default.createHash('sha1'); + + hash.update(data); + const returnObject = { + hash: hash.digest('hex') + }; + + if (returnFileContents) { + returnObject.contents = data.toString('utf8'); + } + + resolve(returnObject); + }); + }); +} +/** + * Calculates a hash from objects values in specified order. + * @param {Array} orderOfKeys + * @param {Object} hashSet + * @param {Function} keyFilter + * @returns {string} + */ + + +function computeHashForHashesSet(orderOfKeys, hashSet, keyFilter = key => key) { + const hash = _crypto.default.createHash('sha1'); + + const hashesJoined = orderOfKeys.reduce( // eslint-disable-next-line no-param-reassign,no-return-assign + (tmpHash, key) => (tmpHash += hashSet[keyFilter(key)], tmpHash), ''); + hash.update(hashesJoined); + return hash.digest('hex'); +} +/** + * Reads files from disk and computes hashes for them. + * @param {Array} files - array with file paths + * @returns {Promise} + */ + + +function readAndHashFiles(files, fileFilter) { + const fileHashes = {}; + const fileContents = {}; + const promises = []; + + function readSingleFile(file) { + return new Promise((resolve, reject) => { + readAndGetFileHash(file, file.endsWith('.js') && !file.endsWith('.test.js')).then(result => { + let fileName = file; + + if (fileFilter) { + fileName = fileFilter(fileName); + } + + fileHashes[fileName] = result.hash; + + if (result.contents) { + fileContents[fileName] = result.contents; + } + + resolve(); + }).catch(reject); + }); + } + + files.forEach(file => { + promises.push(readSingleFile(file)); + }); + return new Promise((resolve, reject) => { + Promise.all(promises).then(() => { + resolve({ + files, + fileContents, + fileHashes + }); + }).catch(reject); + }); +} +/** + * Reads files from .desktop and computes a version hash. + * + * @param {string} dir - path + * @param {Function} fileFilter + * @returns {Promise} + */ + + +function readFilesAndComputeHash(dir, fileFilter) { + return new Promise((resolve, reject) => { + getFileList(dir, true).catch(reject).then(files => readAndHashFiles(files, fileFilter)).catch(reject).then(result => { + // eslint-disable-next-line no-param-reassign + result.hash = computeHashForHashesSet(result.files, result.fileHashes, fileFilter); + resolve(result); + }); + }); +} +/** + * Symlink exists + * @param {string} pathToCheck + * @returns {boolean} + */ + + +function symlinkExists(pathToCheck) { + try { + _fs.default.readlinkSync(pathToCheck); + + return true; + } catch (e) { + return false; + } +} + +var _default = { + getFileList, + rmWithRetries, + exists, + readDir, + readAndGetFileHash, + computeHashForHashesSet, + readAndHashFiles, + readFilesAndComputeHash, + symlinkExists +}; +exports.default = _default; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleGlzdHMiLCJwYXRoVG9DaGVjayIsImZzIiwiYWNjZXNzU3luYyIsImUiLCJybVdpdGhSZXRyaWVzIiwiYXJncyIsInJldHJpZXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInJtIiwicm1BcmdzIiwic2hlbGwiLCJjb25maWciLCJmYXRhbCIsInJlc2V0Iiwic2V0VGltZW91dCIsInJlYWREaXIiLCJkaXIiLCJjYWxsYmFjayIsImVyciIsImRhdGEiLCJzdGF0cyIsImxpc3QiLCJhbGxTdGF0cyIsInJlYWRkaXIiLCJmaWxlcyIsInBlbmRpbmciLCJsZW5ndGgiLCJmb3JFYWNoIiwiZmlsZSIsImZpbGVQYXRoIiwicGF0aCIsImpvaW4iLCJzdGF0IiwiX2VyciIsImlzRGlyZWN0b3J5IiwiX19lcnIiLCJyZXMiLCJfYWxsU3RhdHMiLCJjb25jYXQiLCJPYmplY3QiLCJhc3NpZ24iLCJwdXNoIiwic2l6ZSIsImRhdGVzIiwiYmlydGh0aW1lIiwiZ2V0VGltZSIsImN0aW1lIiwibXRpbWUiLCJnZXRGaWxlTGlzdCIsInNvcnQiLCJlcnJvciIsInJlc3VsdGFudEZpbGVzTGlzdCIsInN0cmlwTGVuZ3RoIiwic3Vic3RyIiwicGF0aHNVbmlmaWVkIiwibWFwIiwicHRoIiwicmVwbGFjZSIsInRlbXBvcmFyeUluZGV4IiwiaSIsImZpbGVzU29ydGVkIiwia2V5IiwicmVhZEFuZEdldEZpbGVIYXNoIiwicmV0dXJuRmlsZUNvbnRlbnRzIiwicmVhZEZpbGUiLCJoYXNoIiwiY3J5cHRvIiwiY3JlYXRlSGFzaCIsInVwZGF0ZSIsInJldHVybk9iamVjdCIsImRpZ2VzdCIsImNvbnRlbnRzIiwidG9TdHJpbmciLCJjb21wdXRlSGFzaEZvckhhc2hlc1NldCIsIm9yZGVyT2ZLZXlzIiwiaGFzaFNldCIsImtleUZpbHRlciIsImhhc2hlc0pvaW5lZCIsInJlZHVjZSIsInRtcEhhc2giLCJyZWFkQW5kSGFzaEZpbGVzIiwiZmlsZUZpbHRlciIsImZpbGVIYXNoZXMiLCJmaWxlQ29udGVudHMiLCJwcm9taXNlcyIsInJlYWRTaW5nbGVGaWxlIiwiZW5kc1dpdGgiLCJ0aGVuIiwicmVzdWx0IiwiZmlsZU5hbWUiLCJjYXRjaCIsImFsbCIsInJlYWRGaWxlc0FuZENvbXB1dGVIYXNoIiwic3ltbGlua0V4aXN0cyIsInJlYWRsaW5rU3luYyJdLCJzb3VyY2VzIjpbIi4uL2xpYi91dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBjb25zaXN0ZW50LXJldHVybiAqL1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHNoZWxsIGZyb20gJ3NoZWxsanMnO1xuXG4vKipcbiAqIEV4aXN0c1xuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhUb0NoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4aXN0cyhwYXRoVG9DaGVjaykge1xuICAgIHRyeSB7XG4gICAgICAgIGZzLmFjY2Vzc1N5bmMocGF0aFRvQ2hlY2spO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8qKlxuICogU2ltcGxlIHdyYXBwZXIgZm9yIHNoZWxsanMucm0gd2l0aCBhZGRpdGlvbmFsIHJldHJpZXMgaW4gY2FzZSBvZiBmYWlsdXJlLlxuICogSXQgaXMgdXNlZnVsIHdoZW4gc29tZXRoaW5nIGlzIGNvbmN1cnJlbnRseSByZWFkaW5nIHRoZSBkaXIgeW91IHdhbnQgdG8gcmVtb3ZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcm1XaXRoUmV0cmllcyguLi5hcmdzKSB7XG4gICAgbGV0IHJldHJpZXMgPSAwO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGZ1bmN0aW9uIHJtKC4uLnJtQXJncykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzaGVsbC5jb25maWcuZmF0YWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHNoZWxsLnJtKC4uLnJtQXJncyk7XG4gICAgICAgICAgICAgICAgc2hlbGwuY29uZmlnLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHJpZXMgKz0gMTtcbiAgICAgICAgICAgICAgICBpZiAocmV0cmllcyA8IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBybSguLi5ybUFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNoZWxsLmNvbmZpZy5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJtKC4uLmFyZ3MpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZERpcihkaXIsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcmVhZERpcihkaXIsIChlcnIsIGRhdGEsIHN0YXRzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHsgZGF0YSwgc3RhdHMgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgbGlzdCA9IFtdO1xuICAgIGxldCBhbGxTdGF0cyA9IHt9O1xuXG4gICAgZnMucmVhZGRpcihkaXIsIChlcnIsIGZpbGVzKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwZW5kaW5nID0gZmlsZXMubGVuZ3RoO1xuICAgICAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBsaXN0LCBhbGxTdGF0cyk7XG4gICAgICAgIH1cbiAgICAgICAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyLCBmaWxlKTtcbiAgICAgICAgICAgIGZzLnN0YXQoZmlsZVBhdGgsIChfZXJyLCBzdGF0cykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChfZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhfZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVhZERpcihmaWxlUGF0aCwgKF9fZXJyLCByZXMsIF9hbGxTdGF0cykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9fZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKF9fZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QgPSBsaXN0LmNvbmNhdChyZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsU3RhdHMgPSBPYmplY3QuYXNzaWduKGFsbFN0YXRzLCBfYWxsU3RhdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIGxpc3QsIGFsbFN0YXRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdC5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgYWxsU3RhdHNbZmlsZVBhdGhdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogc3RhdHMuc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMuYmlydGh0aW1lLmdldFRpbWUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5jdGltZS5nZXRUaW1lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMubXRpbWUuZ2V0VGltZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmcgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgbGlzdCwgYWxsU3RhdHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmaWxlIGxpc3QgZnJvbSBhIGRpcmVjdG9yeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXIgLSBkaXIgcGF0aFxuICogQHBhcmFtIHtib29sZWFufSBzb3J0IC0gd2hldGhlciB0byBhcHBseSBzb3J0XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheT59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlTGlzdChkaXIsIHNvcnQgPSBmYWxzZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHJlYWREaXIoZGlyLCAoZXJyb3IsIGZpbGVzKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgbGV0IHJlc3VsdGFudEZpbGVzTGlzdDtcblxuICAgICAgICAgICAgaWYgKHNvcnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHJpcExlbmd0aCA9IChkaXIuc3Vic3RyKDAsIDIpID09PSAnLi8nKSA/IGRpci5sZW5ndGggLSAxIDogZGlyLmxlbmd0aCArIDE7XG4gICAgICAgICAgICAgICAgbGV0IHBhdGhzVW5pZmllZCA9IGZpbGVzLm1hcCgocHRoID0+IHB0aC5zdWJzdHIoc3RyaXBMZW5ndGgpLnJlcGxhY2UoL1tcXFxcL10vZ20sICctJykpKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wb3JhcnlJbmRleCA9IHt9O1xuICAgICAgICAgICAgICAgIGZpbGVzLmZvckVhY2goKGZpbGUsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGVtcG9yYXJ5SW5kZXhbcGF0aHNVbmlmaWVkW2ldXSA9IGZpbGU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcGF0aHNVbmlmaWVkID0gcGF0aHNVbmlmaWVkLnNvcnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlc1NvcnRlZCA9IFtdO1xuICAgICAgICAgICAgICAgIHBhdGhzVW5pZmllZC5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZXNTb3J0ZWQucHVzaCh0ZW1wb3JhcnlJbmRleFtrZXldKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXN1bHRhbnRGaWxlc0xpc3QgPSBmaWxlc1NvcnRlZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0YW50RmlsZXNMaXN0ID0gZmlsZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdGFudEZpbGVzTGlzdCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFJldHVybnMgZmlsZSdzIGhhc2guXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZSAtIGZpbGUgcGF0aFxuICogQHBhcmFtIHtib29sZWFufSByZXR1cm5GaWxlQ29udGVudHMgLSBpbmNsdWRlIGZpbGUgY29udGVudHMgaW4gdGhlIHJlc3VsdGFudCBvYmplY3RcbiAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQW5kR2V0RmlsZUhhc2goZmlsZSwgcmV0dXJuRmlsZUNvbnRlbnRzID0gZmFsc2UpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBmcy5yZWFkRmlsZShmaWxlLCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGExJyk7XG4gICAgICAgICAgICBoYXNoLnVwZGF0ZShkYXRhKTtcbiAgICAgICAgICAgIGNvbnN0IHJldHVybk9iamVjdCA9IHsgaGFzaDogaGFzaC5kaWdlc3QoJ2hleCcpIH07XG4gICAgICAgICAgICBpZiAocmV0dXJuRmlsZUNvbnRlbnRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0LmNvbnRlbnRzID0gZGF0YS50b1N0cmluZygndXRmOCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5PYmplY3QpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIGEgaGFzaCBmcm9tIG9iamVjdHMgdmFsdWVzIGluIHNwZWNpZmllZCBvcmRlci5cbiAqIEBwYXJhbSB7QXJyYXl9IG9yZGVyT2ZLZXlzXG4gKiBAcGFyYW0ge09iamVjdH0gaGFzaFNldFxuICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5RmlsdGVyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUhhc2hGb3JIYXNoZXNTZXQob3JkZXJPZktleXMsIGhhc2hTZXQsIGtleUZpbHRlciA9IGtleSA9PiBrZXkpIHtcbiAgICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTEnKTtcbiAgICBjb25zdCBoYXNoZXNKb2luZWQgPSBvcmRlck9mS2V5cy5yZWR1Y2UoXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnbixuby1yZXR1cm4tYXNzaWduXG4gICAgICAgICh0bXBIYXNoLCBrZXkpID0+ICh0bXBIYXNoICs9IGhhc2hTZXRba2V5RmlsdGVyKGtleSldLCB0bXBIYXNoKSwgJydcbiAgICApO1xuICAgIGhhc2gudXBkYXRlKGhhc2hlc0pvaW5lZCk7XG4gICAgcmV0dXJuIGhhc2guZGlnZXN0KCdoZXgnKTtcbn1cblxuXG4vKipcbiAqIFJlYWRzIGZpbGVzIGZyb20gZGlzayBhbmQgY29tcHV0ZXMgaGFzaGVzIGZvciB0aGVtLlxuICogQHBhcmFtIHtBcnJheX0gZmlsZXMgLSBhcnJheSB3aXRoIGZpbGUgcGF0aHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQW5kSGFzaEZpbGVzKGZpbGVzLCBmaWxlRmlsdGVyKSB7XG4gICAgY29uc3QgZmlsZUhhc2hlcyA9IHt9O1xuICAgIGNvbnN0IGZpbGVDb250ZW50cyA9IHt9O1xuICAgIGNvbnN0IHByb21pc2VzID0gW107XG5cbiAgICBmdW5jdGlvbiByZWFkU2luZ2xlRmlsZShmaWxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICByZWFkQW5kR2V0RmlsZUhhc2goZmlsZSwgZmlsZS5lbmRzV2l0aCgnLmpzJykgJiYgIWZpbGUuZW5kc1dpdGgoJy50ZXN0LmpzJykpXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZU5hbWUgPSBmaWxlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBmaWxlRmlsdGVyKGZpbGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaWxlSGFzaGVzW2ZpbGVOYW1lXSA9IHJlc3VsdC5oYXNoO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmNvbnRlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlQ29udGVudHNbZmlsZU5hbWVdID0gcmVzdWx0LmNvbnRlbnRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChyZWplY3QpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmaWxlcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgIHByb21pc2VzLnB1c2gocmVhZFNpbmdsZUZpbGUoZmlsZSkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7IGZpbGVzLCBmaWxlQ29udGVudHMsIGZpbGVIYXNoZXMgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKHJlamVjdCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogUmVhZHMgZmlsZXMgZnJvbSAuZGVza3RvcCBhbmQgY29tcHV0ZXMgYSB2ZXJzaW9uIGhhc2guXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGRpciAtIHBhdGhcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZpbGVGaWx0ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRmlsZXNBbmRDb21wdXRlSGFzaChkaXIsIGZpbGVGaWx0ZXIpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBnZXRGaWxlTGlzdChkaXIsIHRydWUpXG4gICAgICAgICAgICAuY2F0Y2gocmVqZWN0KVxuICAgICAgICAgICAgLnRoZW4oZmlsZXMgPT4gcmVhZEFuZEhhc2hGaWxlcyhmaWxlcywgZmlsZUZpbHRlcikpXG4gICAgICAgICAgICAuY2F0Y2gocmVqZWN0KVxuICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNoID0gY29tcHV0ZUhhc2hGb3JIYXNoZXNTZXQocmVzdWx0LmZpbGVzLCByZXN1bHQuZmlsZUhhc2hlcywgZmlsZUZpbHRlcik7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogU3ltbGluayBleGlzdHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoVG9DaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzeW1saW5rRXhpc3RzKHBhdGhUb0NoZWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgZnMucmVhZGxpbmtTeW5jKHBhdGhUb0NoZWNrKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBnZXRGaWxlTGlzdCxcbiAgICBybVdpdGhSZXRyaWVzLFxuICAgIGV4aXN0cyxcbiAgICByZWFkRGlyLFxuICAgIHJlYWRBbmRHZXRGaWxlSGFzaCxcbiAgICBjb21wdXRlSGFzaEZvckhhc2hlc1NldCxcbiAgICByZWFkQW5kSGFzaEZpbGVzLFxuICAgIHJlYWRGaWxlc0FuZENvbXB1dGVIYXNoLFxuICAgIHN5bWxpbmtFeGlzdHNcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUpBOztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQSxNQUFULENBQWdCQyxXQUFoQixFQUE2QjtFQUNoQyxJQUFJO0lBQ0FDLFdBQUEsQ0FBR0MsVUFBSCxDQUFjRixXQUFkOztJQUNBLE9BQU8sSUFBUDtFQUNILENBSEQsQ0FHRSxPQUFPRyxDQUFQLEVBQVU7SUFDUixPQUFPLEtBQVA7RUFDSDtBQUNKO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFNBQVNDLGFBQVQsQ0FBdUIsR0FBR0MsSUFBMUIsRUFBZ0M7RUFDbkMsSUFBSUMsT0FBTyxHQUFHLENBQWQ7RUFDQSxPQUFPLElBQUlDLE9BQUosQ0FBWSxDQUFD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 \ No newline at end of file diff --git a/lib/electronApp.js b/lib/electronApp.js index b46f084e..0e59d40e 100644 --- a/lib/electronApp.js +++ b/lib/electronApp.js @@ -1,6 +1,6 @@ // eslint-disable-next-line no-unused-vars import regeneratorRuntime from 'regenerator-runtime/runtime'; -import asar from 'asar'; +import asar from '@electron/asar'; import assignIn from 'lodash/assignIn'; import _ from 'lodash'; import { LocalInstaller, progress } from 'install-local'; @@ -70,8 +70,9 @@ export default class ElectronApp { this.log.debug('packing'); asar.createPackage( this.$.env.paths.electronApp.appRoot, - this.$.env.paths.electronApp.appAsar, - () => { + this.$.env.paths.electronApp.appAsar + ) + .then(() => { // Lets move the node_modules back. this.log.debug('moving node_modules back from app dir'); @@ -116,8 +117,7 @@ export default class ElectronApp { { force: true } ); resolve(); - } - ); + }); }); } @@ -621,8 +621,7 @@ export default class ElectronApp { undefined, this.$.env.paths.electronApp.root ) - ) - ); + )); } } await Promise.all(promises); @@ -812,8 +811,9 @@ export default class ElectronApp { return new Promise((resolve, reject) => { asar.createPackage( this.$.env.paths.desktopTmp.root, - this.$.env.paths.electronApp.desktopAsar, - () => { + this.$.env.paths.electronApp.desktopAsar + ) + .then(() => { this.log.verbose('clearing temporary .desktop'); this.$.utils .rmWithRetries('-rf', this.$.env.paths.desktopTmp.root) @@ -824,8 +824,7 @@ export default class ElectronApp { reject(e); }); resolve(); - } - ); + }); }); } diff --git a/lib/meteorApp.js b/lib/meteorApp.js index 1e6e04e5..1b133638 100644 --- a/lib/meteorApp.js +++ b/lib/meteorApp.js @@ -6,7 +6,7 @@ import semver from 'semver'; import shell from 'shelljs'; import path from 'path'; import singleLineLog from 'single-line-log'; -import asar from 'asar'; +import asar from '@electron/asar'; import fetch from 'node-fetch'; import IsDesktopInjector from '../skeleton/modules/autoupdate/isDesktopInjector'; @@ -892,8 +892,9 @@ export default class MeteorApp { return new Promise((resolve, reject) => asar.createPackage( this.$.env.paths.electronApp.meteorApp, - path.join(this.$.env.paths.electronApp.root, 'meteor.asar'), - () => { + path.join(this.$.env.paths.electronApp.root, 'meteor.asar') + ) + .then(() => { // On Windows some files might still be blocked. Giving a tick for them to be // ready for deletion. setImmediate(() => { @@ -907,8 +908,7 @@ export default class MeteorApp { reject(e); }); }); - } - )); + })); } /** diff --git a/package-lock.json b/package-lock.json index 270cde7a..2cb4d7f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,12 +14,12 @@ } }, "@babel/cli": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.18.10.tgz", - "integrity": "sha512-dLvWH+ZDFAkd2jPBSghrsFBuXrREvFwjpDycXbmUoeochqKYe4zNSLEJYErpLg8dvxvZYe79/MkN461XCwpnGw==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.21.0.tgz", + "integrity": "sha512-xi7CxyS8XjSyiwUGCfwf+brtJxjW1/ZTcBUkP10xawIEXLX5HzLn+3aXkgxozcP2UhRhtKTmQurw9Uaes7jZrA==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.8", + "@jridgewell/trace-mapping": "^0.3.17", "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", "chokidar": "^3.4.0", "commander": "^4.0.1", @@ -30,6 +30,16 @@ "slash": "^2.0.0" }, "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, "commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -227,9 +237,9 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" }, "ms": { "version": "2.1.2", @@ -2586,9 +2596,9 @@ } }, "@babel/register": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.18.9.tgz", - "integrity": "sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.21.0.tgz", + "integrity": "sha512-9nKsPmYDi5DidAqJaQooxIhsLJiNMkGr8ypQ8Uic7cIox7UCDsM7HuUGxdGT7mSDTYbqzIdsOWzfBton/YJrMw==", "dev": true, "requires": { "clone-deep": "^4.0.1", @@ -2668,6 +2678,48 @@ "to-fast-properties": "^2.0.0" } }, + "@electron/asar": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.3.tgz", + "integrity": "sha512-wmOfE6szYyqZhRIiLH+eyZEp+bGcJI0OD/SCvSUrfBE0jvauyGYO2ZhpWxmNCcDojKu5DYrsVqT5BOCZZ01XIg==", + "requires": { + "@types/glob": "^7.1.1", + "chromium-pickle-js": "^0.2.0", + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "dependencies": { + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + } + } + }, "@electron/get": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.14.1.tgz", @@ -2926,6 +2978,37 @@ "dev": true, "optional": true }, + "@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "requires": { + "semver": "^7.3.5" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -2953,6 +3036,16 @@ "@types/responselike": "*" } }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "optional": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, "@types/http-cache-semantics": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", @@ -2980,11 +3073,38 @@ "@types/node": "*" } }, + "@types/linkify-it": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", + "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==", + "dev": true + }, + "@types/markdown-it": { + "version": "12.2.3", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", + "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", + "dev": true, + "requires": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "@types/mdurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", + "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==", + "dev": true + }, + "@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "optional": true + }, "@types/node": { "version": "18.7.13", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.13.tgz", - "integrity": "sha512-46yIhxSe5xEaJZXWdIBP7GU4HDTG8/eo0qd9atdiL+lFpA03y8KS+lkTN834TWJj5767GbWv4n/P6efyTFt1Dw==", - "dev": true + "integrity": "sha512-46yIhxSe5xEaJZXWdIBP7GU4HDTG8/eo0qd9atdiL+lFpA03y8KS+lkTN834TWJj5767GbWv4n/P6efyTFt1Dw==" }, "@types/puppeteer": { "version": "5.4.6", @@ -3161,15 +3281,16 @@ "@wdio/logger": "6.10.10" } }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", "dev": true }, "acorn-jsx": { @@ -3195,6 +3316,15 @@ "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", "dev": true }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, "ajv": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", @@ -3226,6 +3356,14 @@ "dev": true, "requires": { "array-back": "^3.0.1" + }, + "dependencies": { + "array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true + } } }, "ansi-escapes": { @@ -3268,23 +3406,14 @@ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" }, "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "optional": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" - }, - "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "optional": true - } } }, "append-transform": { @@ -3296,11 +3425,6 @@ "default-require-extensions": "^2.0.0" } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, "archiver": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", @@ -3439,11 +3563,21 @@ "dev": true }, "array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, "array-differ": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", @@ -3728,35 +3862,11 @@ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" }, - "asar": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/asar/-/asar-0.14.3.tgz", - "integrity": "sha512-+hNnVVDmYbv05We/a9knj/98w171+A94A9DNHj+3kXUr3ENTQoSEcfbJRvBBRHyOh4vukBYWujmHvvaMmQoQbg==", - "requires": { - "chromium-pickle-js": "^0.2.0", - "commander": "^2.9.0", - "cuint": "^0.2.1", - "glob": "^6.0.4", - "minimatch": "^3.0.3", - "mkdirp": "^0.5.0", - "mksnapshot": "^0.3.0", - "tmp": "0.0.28" - }, - "dependencies": { - "commander": { - "version": "2.9.0", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "requires": { - "graceful-readlink": ">= 1.0.0" - } - } - } - }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, "requires": { "safer-buffer": "~2.1.0" } @@ -3764,7 +3874,8 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true }, "assertion-error": { "version": "1.1.0", @@ -3787,7 +3898,8 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true }, "at-least-node": { "version": "1.0.0", @@ -3801,15 +3913,23 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true }, "aws4": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true }, "babel-code-frame": { "version": "6.26.0", @@ -4198,6 +4318,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, "requires": { "tweetnacl": "^0.14.3" } @@ -4208,15 +4329,6 @@ "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", "dev": true }, - "binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", - "requires": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - } - }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -4272,7 +4384,8 @@ "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true }, "boolean": { "version": "3.2.0", @@ -4332,66 +4445,69 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==" }, - "buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" - }, "cacache": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", - "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", - "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", + "version": "17.0.5", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.0.5.tgz", + "integrity": "sha512-Y/PRQevNSsjAPWykl9aeGz8Pr+OI6BYM9fYDNMvOkuUiG9IhG4LEmaYrZZZvioMUEQ+cBCxT0v8wrnCURccyKA==", + "requires": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^9.3.1", + "lru-cache": "^7.7.1", + "minipass": "^4.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" }, "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.4.tgz", + "integrity": "sha512-qaSc49hojMOv1EPM4EuyITjDSgSKI0rthoHnvE81tcOi1SCVndHko7auqxdQ14eiQG2NDBJBE86+2xIrbIvrbA==", "requires": { "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" + }, + "minimatch": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.3.tgz", + "integrity": "sha512-tEEvU9TkZgnFDCtpnrEYnPsjT7iUx42aXfs4bzmQ5sMA09/6hZY0jeZcGkXyDagiBOvkUjNo8Viom+Me6+2x7g==", + "requires": { + "brace-expansion": "^2.0.1" } } } }, "cache-point": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cache-point/-/cache-point-0.4.1.tgz", - "integrity": "sha512-4TgWfe9SF+bUy5cCql8gWHqKNrviufNwSYxLjf2utB0pY4+bdcuFwMmY1hDB+67Gz/L1vmhFNhePAjJTFBtV+Q==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cache-point/-/cache-point-1.0.0.tgz", + "integrity": "sha512-ZqrZp9Hi5Uq7vfSGmNP2bUT/9DzZC2Y/GXjHB8rUJN1a+KLmbV05+vxHipNsg8+CSVgjcVVzLV8VZms6w8ZeRw==", "dev": true, "requires": { - "array-back": "^2.0.0", + "array-back": "^4.0.0", "fs-then-native": "^2.0.0", - "mkdirp2": "^1.0.3" - }, - "dependencies": { - "array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", - "dev": true, - "requires": { - "typical": "^2.6.1" - } - } + "mkdirp2": "^1.0.4" } }, "cacheable-lookup": { @@ -4495,6 +4611,12 @@ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", "dev": true }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, "caniuse-lite": { "version": "1.0.30001384", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001384.tgz", @@ -4503,15 +4625,16 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true }, "catharsis": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.11.tgz", - "integrity": "sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", + "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", "dev": true, "requires": { - "lodash": "^4.17.14" + "lodash": "^4.17.15" } }, "chai": { @@ -4534,14 +4657,6 @@ "check-error": "^1.0.2" } }, - "chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", - "requires": { - "traverse": ">=0.3.0 <0.4" - } - }, "chalk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", @@ -4584,21 +4699,12 @@ "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" - }, - "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "optional": true - } } }, "chownr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, "chrome-launcher": { "version": "0.13.4", @@ -4674,6 +4780,11 @@ "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", "dev": true }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -4701,9 +4812,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "is-fullwidth-code-point": { @@ -4790,9 +4901,9 @@ } }, "collect-all": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/collect-all/-/collect-all-1.0.3.tgz", - "integrity": "sha512-0y0rBgoX8IzIjBAUnO73SEtSb4Mhk3IoceWJq5zZSxb9mWORhWH8xLYo4EDSOE1jRBk1LhmfjqWFFt10h/+MEA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/collect-all/-/collect-all-1.0.4.tgz", + "integrity": "sha512-RKZhRwJtJEP5FWul+gkSMEnaK6H3AGPTTWOiRimCcs+rc/OmQE3Yhy1Q7A7KsdkG3ZXVdZq68Y6ONSdvkeEcKA==", "dev": true, "requires": { "stream-connect": "^1.0.2", @@ -4822,22 +4933,29 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "requires": { "delayed-stream": "~1.0.0" } }, "command-line-args": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.1.1.tgz", - "integrity": "sha512-hL/eG8lrll1Qy1ezvkant+trihbGnaKaeEjj6Scyr3DN+RC7iQ5Rz84IeLERfAWDGo0HBSNAakczwgCilDXnWg==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", "dev": true, "requires": { - "array-back": "^3.0.1", + "array-back": "^3.1.0", "find-replace": "^3.0.0", "lodash.camelcase": "^4.3.0", "typical": "^4.0.0" }, "dependencies": { + "array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true + }, "typical": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", @@ -4894,14 +5012,14 @@ } }, "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "common-sequence": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/common-sequence/-/common-sequence-2.0.0.tgz", - "integrity": "sha512-f0QqPLpRTgMQn/pQIynf+SdE73Lw5Q1jn4hjirHLgH/NJ71TiHjXusV16BmOyuK5rRQ1W2f++II+TFZbQOh4hA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/common-sequence/-/common-sequence-2.0.2.tgz", + "integrity": "sha512-jAg09gkdkrDO9EWTdXfv80WWH3yeZl5oT69fGfedBNS9pXUKYInVJ1bJ+/ht2+Moeei48TmSbQDYMc8EOx9G0g==", "dev": true }, "commondir": { @@ -4977,6 +5095,7 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -4988,6 +5107,7 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -5002,6 +5122,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -5022,7 +5143,7 @@ "config-master": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/config-master/-/config-master-3.1.0.tgz", - "integrity": "sha1-ZnZjWQUFooO/JqSE1oSJ10xUhdo=", + "integrity": "sha512-n7LBL1zBzYdTpF1mx5DNcZnZn05CWIdsdvtPL4MosvqbBUK3Rq6VWEtGUuF3Y0s9/CIhMejezqlSkP6TnCJ/9g==", "dev": true, "requires": { "walk-back": "^2.0.1" @@ -5031,7 +5152,7 @@ "walk-back": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-2.0.1.tgz", - "integrity": "sha1-VU4qnYdPrEeoywBr9EwvDEmYoKQ=", + "integrity": "sha512-Nb6GvBR8UWX1D+Le+xUq0+Q1kFmRBIWVrfLnQAOmcpEzA9oAxwJ9gIr36t9TWYfzvWRvuMtjHiVsJYEkXWaTAQ==", "dev": true } } @@ -5060,12 +5181,12 @@ } }, "connect-modrewrite": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/connect-modrewrite/-/connect-modrewrite-0.9.0.tgz", - "integrity": "sha1-dHsqtlxEqlG3ah4sEWihkABjkBw=", + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/connect-modrewrite/-/connect-modrewrite-0.10.2.tgz", + "integrity": "sha512-37+kS9t26vxjW5ErNrr8d04F7Us1EH7XhHtxSm8yE8kO2uDF2DsPI+qI2wCeBSaoakXKit0/88sg4vL2Wl8tDw==", "dev": true, "requires": { - "qs": "^1.2.2" + "qs": "^6.3.1" } }, "convert-source-map": { @@ -5074,19 +5195,6 @@ "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", "dev": true }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, "core-js": { "version": "2.5.6", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.6.tgz", @@ -5112,7 +5220,8 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, "coveralls": { "version": "3.1.1", @@ -5251,21 +5360,23 @@ } }, "cross-env": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-3.1.4.tgz", - "integrity": "sha1-Vui8qW8XkIpusbwgEsoSb5KEITA=", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-3.2.4.tgz", + "integrity": "sha512-T8AFEAiuJ0w53ou6rnu3Fipaiu1W6ZO9GYfd33uxe1kAIiXM0fD8QnIm7orcJBOt7WQC5Ply63E7WZW/jSM+FA==", "dev": true, "requires": { - "cross-spawn": "^3.0.1" + "cross-spawn": "^5.1.0", + "is-windows": "^1.0.0" }, "dependencies": { "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", "dev": true, "requires": { "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", "which": "^1.2.9" } } @@ -5298,20 +5409,11 @@ "integrity": "sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==", "dev": true }, - "cuint": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", - "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==" - }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" - }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -5334,7 +5436,7 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true }, "decompress-response": { @@ -5346,20 +5448,6 @@ "mimic-response": "^1.0.0" } }, - "decompress-zip": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.3.2.tgz", - "integrity": "sha512-Ab1QY4LrWMrUuo53lLnmGOby7v8ryqxJ+bKibKSiPisx+25mhut1dScVBXAYx14i/PqSrFZvR2FRRazhLbvL+g==", - "requires": { - "binary": "^0.3.0", - "graceful-fs": "^4.1.3", - "mkpath": "^0.1.0", - "nopt": "^3.0.1", - "q": "^1.1.2", - "readable-stream": "^1.1.8", - "touch": "0.0.3" - } - }, "deep-eql": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", @@ -5444,18 +5532,19 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true }, "detect-indent": { @@ -5543,57 +5632,10 @@ "walk-back": "^4.0.0" }, "dependencies": { - "array-back": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.1.tgz", - "integrity": "sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg==", - "dev": true - }, - "cache-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cache-point/-/cache-point-1.0.0.tgz", - "integrity": "sha512-ZqrZp9Hi5Uq7vfSGmNP2bUT/9DzZC2Y/GXjHB8rUJN1a+KLmbV05+vxHipNsg8+CSVgjcVVzLV8VZms6w8ZeRw==", - "dev": true, - "requires": { - "array-back": "^4.0.0", - "fs-then-native": "^2.0.0", - "mkdirp2": "^1.0.4" - } - }, - "file-set": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/file-set/-/file-set-3.0.0.tgz", - "integrity": "sha512-B/SdeSIeRv7VlOgIjtH3dkxMI+tEy5m+OeCXfAUsirBoVoY+bGtsmvmmTFPm/G23TBY4RiTtjpcgePCfwXRjqA==", - "dev": true, - "requires": { - "array-back": "^4.0.0", - "glob": "^7.1.5" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "reduce-flatten": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-3.0.0.tgz", - "integrity": "sha512-eczl8wAYBxJ6Egl6I1ECIF+8z6sHu+KE7BzaEDZTpPXKXfy9SUDQlVYwkRcNTjJLC3Iakxbhss50KuT/R6SYfg==", - "dev": true - }, - "walk-back": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-4.0.0.tgz", - "integrity": "sha512-kudCA8PXVQfrqv2mFTG72vDBRi8BKWxGgFLwPpzHcpZnSwZk93WMwUDVcLHWNsnm+Y0AC4Vb6MUNRgaHfyV2DQ==", + "reduce-flatten": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-3.0.1.tgz", + "integrity": "sha512-bYo+97BmUUOzg09XwfkwALt4PQH1M5L0wzKerBt6WLm3Fhdd43mMS89HiT1B9pJIqko/6lWx3OnV4J9f2Kqp5Q==", "dev": true } } @@ -5622,45 +5664,11 @@ "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", "dev": true }, - "duplexify": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -5724,6 +5732,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, "requires": { "once": "^1.4.0" } @@ -5738,9 +5747,9 @@ } }, "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", "dev": true }, "env-paths": { @@ -5881,6 +5890,45 @@ } } }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + } + } + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -6046,13 +6094,14 @@ "dev": true }, "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", "dev": true, "requires": { "debug": "^3.2.7", - "resolve": "^1.20.0" + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" }, "dependencies": { "debug": { @@ -6065,9 +6114,9 @@ } }, "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "requires": { "has": "^1.0.3" @@ -6143,33 +6192,173 @@ } }, "eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", "dev": true, "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", "has": "^1.0.3", - "is-core-module": "^2.8.1", + "is-core-module": "^2.11.0", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", "tsconfig-paths": "^3.14.1" }, "dependencies": { + "array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + } + }, + "array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" + } + }, + "define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "es-abstract": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + } + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "requires": { + "has": "^1.0.3" } }, "is-glob": { @@ -6181,10 +6370,19 @@ "is-extglob": "^2.1.1" } }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "requires": { "minimist": "^1.2.0" @@ -6200,17 +6398,51 @@ } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true }, + "object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, "resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -6220,36 +6452,59 @@ "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" - }, - "dependencies": { - "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, "requires": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } } } }, @@ -6453,7 +6708,8 @@ "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "external-editor": { "version": "2.2.0", @@ -6528,7 +6784,8 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true }, "fancy-log": { "version": "1.3.3", @@ -6551,7 +6808,8 @@ "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true }, "fast-levenshtein": { "version": "2.0.6", @@ -6588,37 +6846,37 @@ } }, "file-set": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/file-set/-/file-set-2.0.1.tgz", - "integrity": "sha512-XgOUUpgR6FbbfYcniLw0qm1Am7PnNYIAkd+eXxRt42LiYhjaso0WiuQ+VmrNdtwotyM+cLCfZ56AZrySP3QnKA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/file-set/-/file-set-3.0.0.tgz", + "integrity": "sha512-B/SdeSIeRv7VlOgIjtH3dkxMI+tEy5m+OeCXfAUsirBoVoY+bGtsmvmmTFPm/G23TBY4RiTtjpcgePCfwXRjqA==", "dev": true, "requires": { - "array-back": "^2.0.0", - "glob": "^7.1.3" + "array-back": "^4.0.0", + "glob": "^7.1.5" }, "dependencies": { - "array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", - "dev": true, - "requires": { - "typical": "^2.6.1" - } - }, "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } } } }, @@ -6749,6 +7007,14 @@ "dev": true, "requires": { "array-back": "^3.0.1" + }, + "dependencies": { + "array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true + } } }, "find-up": { @@ -6778,37 +7044,13 @@ "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, - "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } + "is-callable": "^1.1.3" } }, "foreground-child": { @@ -6836,12 +7078,14 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true }, "form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -6863,39 +7107,6 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -6903,20 +7114,20 @@ "dev": true }, "fs-extra": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.1.tgz", - "integrity": "sha1-f8DGyJV/mD9X8waiTlud3Y0N2IA=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", "dev": true, "requires": { "graceful-fs": "^4.1.2", - "jsonfile": "^3.0.0", + "jsonfile": "^4.0.0", "universalify": "^0.1.0" }, "dependencies": { "jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, "requires": { "graceful-fs": "^4.1.6" @@ -6924,28 +7135,30 @@ } } }, + "fs-minipass": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.1.tgz", + "integrity": "sha512-MhaJDcFRTuLidHrIttu0RDGyyXs/IYHVmlcxfLAEFIWjc1vdLAkdwT7Ace2u7DbitWC0toKMl5eJZRYNVreIMw==", + "requires": { + "minipass": "^4.0.0" + } + }, "fs-plus": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/fs-plus/-/fs-plus-2.9.3.tgz", - "integrity": "sha1-debXxX5FNklVoc+/xWP8WCDgz/I=", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/fs-plus/-/fs-plus-2.10.1.tgz", + "integrity": "sha512-AaKbqqBM2p+Z5NSFhW/LU0sPD3cOnXwQ4kfM/JRX47ehwx+pxz0LuYYdpA/SeHV2i7lMQp+tA9OWBYBC/BYcfw==", "dev": true, "requires": { - "async": "~0.2.9", - "mkdirp": "~0.3.5", - "rimraf": "~2.2.2", + "async": "^1.5.2", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2", "underscore-plus": "1.x" }, "dependencies": { - "mkdirp": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=", - "dev": true - }, - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", "dev": true } } @@ -6959,20 +7172,9 @@ "fs-then-native": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fs-then-native/-/fs-then-native-2.0.0.tgz", - "integrity": "sha1-GaEk2U2QwiyOBF8ujdbr6jbUjGc=", + "integrity": "sha512-X712jAOaWXkemQCAmWeg5rOT2i+KOpWz1Z/txk/cW0qlOu2oQ9H61vc5w3X/iyuUEfq/OyaFJ78/cZAQD1/bgA==", "dev": true }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -7083,22 +7285,11 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, "requires": { "assert-plus": "^1.0.0" } }, - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -7176,7 +7367,6 @@ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, - "optional": true, "requires": { "define-properties": "^1.1.3" } @@ -7218,6 +7408,34 @@ "sparkles": "^1.0.0" } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + } + } + }, "got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", @@ -7240,12 +7458,8 @@ "graceful-fs": { "version": "4.2.9", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true }, "grapheme-splitter": { "version": "1.0.4", @@ -7334,17 +7548,24 @@ } }, "handlebars": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.2.tgz", - "integrity": "sha512-4PwqDL2laXtTWZghzzCtunQUTLbo31pcCJrd/B/9JP8XbhVzpS5ZXuKqlOzsd1rtcaLo4KqAn8nl8mkknS4MHw==", + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "dev": true, "requires": { + "minimist": "^1.2.5", "neo-async": "^2.6.0", - "optimist": "^0.6.1", "source-map": "^0.6.1", - "uglify-js": "^3.1.4" + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" }, "dependencies": { + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -7356,12 +7577,14 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true }, "har-validator": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, "requires": { "ajv": "^6.5.5", "har-schema": "^2.0.0" @@ -7371,6 +7594,7 @@ "version": "6.10.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -7381,12 +7605,14 @@ "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true } } }, @@ -7435,6 +7661,12 @@ "get-intrinsic": "^1.1.1" } }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, "has-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", @@ -7468,33 +7700,40 @@ } }, "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true }, "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true } } @@ -7503,6 +7742,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -7561,11 +7801,6 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==" - }, "ignore": { "version": "3.3.10", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", @@ -7604,6 +7839,11 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -7681,9 +7921,9 @@ } }, "install-local": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/install-local/-/install-local-0.6.0.tgz", - "integrity": "sha512-O30KcOgAOhreY8TnK8XETXcf6t4V1iXtditIEL6mHueUCA6e+ILVjboieiTYXt615rTP1KllYgqtE0ux7mvp2g==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/install-local/-/install-local-0.6.2.tgz", + "integrity": "sha512-jjBHRVO+Yu0mzJZeQ2w5/cvoekmD7T4TN5oB/pVSP8WfbG0rUKOGUdntQcJKuScqdnSgR26IjvZDLkCQJZlU7g==", "requires": { "lodash": "^4.17.10", "mz": "^2.7.0", @@ -7716,6 +7956,36 @@ "loose-envify": "^1.0.0" } }, + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + } + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -7838,9 +8108,9 @@ } }, "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", "dev": true }, "is-path-cwd": { @@ -7925,10 +8195,24 @@ "has-symbols": "^1.0.0" } }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true }, "is-weakref": { "version": "1.0.2", @@ -7939,6 +8223,12 @@ "call-bind": "^1.0.2" } }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, "is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -7951,7 +8241,8 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "isbinaryfile": { "version": "3.0.3", @@ -7996,7 +8287,8 @@ "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true }, "istanbul-lib-coverage": { "version": "2.0.5", @@ -8179,41 +8471,49 @@ } }, "js2xmlparser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.0.tgz", - "integrity": "sha512-WuNgdZOXVmBk5kUPMcTcVUpbGRzLfNkv7+7APq7WiDihpXVKrgxo6wwRpRl9OQeEBgKCVk9mR7RbzrnNWC8oBw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", + "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", "dev": true, "requires": { - "xmlcreate": "^2.0.0" + "xmlcreate": "^2.0.4" } }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true }, "jsdoc": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.3.tgz", - "integrity": "sha512-Yf1ZKA3r9nvtMWHO1kEuMZTlHOF8uoQ0vyo5eH7SQy5YeIiHM+B0DgKnn+X6y6KDYZcF7G2SPkKF+JORCXWE/A==", + "version": "3.6.11", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.11.tgz", + "integrity": "sha512-8UCU0TYeIYD9KeLzEcAu2q8N/mx9O3phAGl32nmHlE0LpaJL71mMkP4d+QE5zWfNt50qheHtOZ0qoxVrsX5TUg==", "dev": true, "requires": { - "@babel/parser": "^7.4.4", - "bluebird": "^3.5.4", - "catharsis": "^0.8.11", + "@babel/parser": "^7.9.4", + "@types/markdown-it": "^12.2.3", + "bluebird": "^3.7.2", + "catharsis": "^0.9.0", "escape-string-regexp": "^2.0.0", - "js2xmlparser": "^4.0.0", + "js2xmlparser": "^4.0.2", "klaw": "^3.0.0", - "markdown-it": "^8.4.2", - "markdown-it-anchor": "^5.0.2", - "marked": "^0.7.0", - "mkdirp": "^0.5.1", + "markdown-it": "^12.3.2", + "markdown-it-anchor": "^8.4.1", + "marked": "^4.0.10", + "mkdirp": "^1.0.4", "requizzle": "^0.2.3", - "strip-json-comments": "^3.0.1", + "strip-json-comments": "^3.1.0", "taffydb": "2.6.2", - "underscore": "~1.9.1" + "underscore": "~1.13.2" }, "dependencies": { + "@babel/parser": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", + "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", + "dev": true + }, "escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", @@ -8230,74 +8530,121 @@ } }, "marked": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", - "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true }, "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true } } }, "jsdoc-api": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/jsdoc-api/-/jsdoc-api-5.0.2.tgz", - "integrity": "sha512-nC5uvd907gbqTRinrHeX5EBNw2Yc/0/7qONbRu5R5wrq/1OaRHtqDWGLDu+6BFI6RyuEgp87IH/IdOz4CdN6RA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/jsdoc-api/-/jsdoc-api-5.0.4.tgz", + "integrity": "sha512-1KMwLnfo0FyhF06TQKzqIm8BiY1yoMIGICxRdJHUjzskaHMzHMmpLlmNFgzoa4pAC8t1CDPK5jWuQTvv1pBsEQ==", "dev": true, "requires": { - "array-back": "^3.1.0", - "cache-point": "^0.4.1", + "array-back": "^4.0.0", + "cache-point": "^1.0.0", "collect-all": "^1.0.3", "file-set": "^2.0.1", "fs-then-native": "^2.0.0", - "jsdoc": "^3.6.2", + "jsdoc": "^3.6.3", "object-to-spawn-args": "^1.1.1", "temp-path": "^1.0.0", "walk-back": "^3.0.1" + }, + "dependencies": { + "file-set": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/file-set/-/file-set-2.0.1.tgz", + "integrity": "sha512-XgOUUpgR6FbbfYcniLw0qm1Am7PnNYIAkd+eXxRt42LiYhjaso0WiuQ+VmrNdtwotyM+cLCfZ56AZrySP3QnKA==", + "dev": true, + "requires": { + "array-back": "^2.0.0", + "glob": "^7.1.3" + }, + "dependencies": { + "array-back": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", + "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", + "dev": true, + "requires": { + "typical": "^2.6.1" + } + } + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "walk-back": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-3.0.1.tgz", + "integrity": "sha512-umiNB2qLO731Sxbp6cfZ9pwURJzTnftxE4Gc7hq8n/ehkuXC//s9F65IEIJA2ZytQZ1ZOsm/Fju4IWx0bivkUQ==", + "dev": true + } } }, "jsdoc-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsdoc-parse/-/jsdoc-parse-3.0.1.tgz", - "integrity": "sha512-btZLp4wYl90vcAfgk4hoGQbO17iBVrhh3LJRMKZNtZgniO3F8H2CjxXld0owBIB1XxN+j3bAcWZnZKMnSj3iMA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsdoc-parse/-/jsdoc-parse-4.0.1.tgz", + "integrity": "sha512-qIObw8yqYZjrP2qxWROB5eLQFLTUX2jRGLhW9hjo2CC2fQVlskidCIzjCoctwsDvauBp2a/lR31jkSleczSo8Q==", "dev": true, "requires": { - "array-back": "^2.0.0", + "array-back": "^4.0.0", "lodash.omit": "^4.5.0", "lodash.pick": "^4.4.0", "reduce-extract": "^1.0.0", "sort-array": "^2.0.0", "test-value": "^3.0.0" - }, - "dependencies": { - "array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", - "dev": true, - "requires": { - "typical": "^2.6.1" - } - } } }, "jsdoc-to-markdown": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/jsdoc-to-markdown/-/jsdoc-to-markdown-5.0.0.tgz", - "integrity": "sha512-3gKEnbay7dSdyvtMDDkUf4r7pmBVgs3aqeT0Cg/ngTILPpJUzf8iKgASIo5psF007L45OIJtIuRX5VL/YUXKaA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/jsdoc-to-markdown/-/jsdoc-to-markdown-5.0.3.tgz", + "integrity": "sha512-tQv5tBV0fTYidRQtE60lJKxE98mmuLcYuITFDKQiDPE9hGccpeEGUNFcVkInq1vigyuPnZmt79bQ8wv2GKjY0Q==", "dev": true, "requires": { - "array-back": "^3.1.0", + "array-back": "^4.0.1", "command-line-tool": "^0.8.0", "config-master": "^3.1.0", - "dmd": "^4.0.0", - "jsdoc-api": "^5.0.1", - "jsdoc-parse": "^3.0.1", - "walk-back": "^3.0.1" + "dmd": "^4.0.5", + "jsdoc-api": "^5.0.4", + "jsdoc-parse": "^4.0.1", + "walk-back": "^4.0.0" } }, "jsesc": { @@ -8318,9 +8665,10 @@ "dev": true }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true }, "json-schema-traverse": { "version": "0.3.1", @@ -8337,7 +8685,8 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true }, "json5": { "version": "0.5.1", @@ -8345,22 +8694,15 @@ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" } }, @@ -8409,14 +8751,6 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "requires": { - "graceful-fs": "^4.1.9" - } - }, "lazystream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", @@ -8490,9 +8824,9 @@ } }, "linkify-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", - "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", "dev": true, "requires": { "uc.micro": "^1.0.1" @@ -8570,7 +8904,7 @@ "lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "dev": true }, "lodash.clonedeep": { @@ -8661,19 +8995,19 @@ "lodash.omit": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", - "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=", + "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==", "dev": true }, "lodash.padend": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", - "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=", + "integrity": "sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw==", "dev": true }, "lodash.pick": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", + "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", "dev": true }, "lodash.restparam": { @@ -8775,6 +9109,15 @@ "yallist": "^2.1.2" } }, + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -8800,22 +9143,30 @@ } }, "markdown-it": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", - "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", "dev": true, "requires": { - "argparse": "^1.0.7", - "entities": "~1.1.1", - "linkify-it": "^2.0.0", + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + } } }, "markdown-it-anchor": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.2.4.tgz", - "integrity": "sha512-n8zCGjxA3T+Mx1pG8HEgbJbkB8JFUuRkeTZQuIM8iPY6oQ8sWOPRZJDFC9a/pNg2QkHEjjGkhBEl/RSyzaDZ3A==", + "version": "8.6.7", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", + "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", "dev": true }, "marked": { @@ -8862,7 +9213,7 @@ "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", "dev": true }, "memorystream": { @@ -8901,20 +9252,22 @@ } }, "mime": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.0.3.tgz", - "integrity": "sha512-TrpAd/vX3xaLPDgVRm6JkZwLR0KHfukMdU2wTEbqMDdCnY6Yo3mE+mjs9YE6oMNw2QRfXVeBEYpmpO94BIqiug==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true }, "mime-db": { "version": "1.40.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "dev": true }, "mime-types": { "version": "2.1.24", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, "requires": { "mime-db": "1.40.0" } @@ -8932,9 +9285,9 @@ "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } @@ -8942,31 +9295,122 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true }, - "mississippi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", - "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "minipass": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", + "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==" + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^2.0.1", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.6" + }, + "dependencies": { + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + } } }, "mkdirp-classic": { @@ -8976,40 +9420,11 @@ "dev": true }, "mkdirp2": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp2/-/mkdirp2-1.0.4.tgz", - "integrity": "sha512-Q2PKB4ZR4UPtjLl76JfzlgSCUZhSV1AXQgAZa1qt5RiaALFjP/CDrGvFBrOz7Ck6McPcwMAxTsJvWOUjOU8XMw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/mkdirp2/-/mkdirp2-1.0.5.tgz", + "integrity": "sha512-xOE9xbICroUDmG1ye2h4bZ8WBie9EGmACaco8K8cx6RlkJJrxGIqjGqztAI+NMhexXBcdGbSEzI6N3EJPevxZw==", "dev": true }, - "mkpath": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-0.1.0.tgz", - "integrity": "sha1-dVSm+Nhxg0zJe1RisSLEwSTW3pE=" - }, - "mksnapshot": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/mksnapshot/-/mksnapshot-0.3.5.tgz", - "integrity": "sha512-PSBoZaj9h9myC3uRRW62RxmX8mrN3XbOkMEyURUD7v5CeJgtYTar50XU738t7Q0LtG1pBPtp5n5QwDGggRnEvw==", - "requires": { - "decompress-zip": "0.3.x", - "fs-extra": "0.26.7", - "request": "2.x" - }, - "dependencies": { - "fs-extra": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", - "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - } - } - }, "mocha": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", @@ -9075,6 +9490,15 @@ "sigmund": "~1.0.0" } }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, "ms": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", @@ -9101,19 +9525,6 @@ "integrity": "sha512-pEk4ECWQXV6z2zjhRZUongnLJNUeGQJ3w6OQ5ctGwD+i5o93qjRQUk2Rt6VdNeu3sEP0AB4LcfvdebpxBRVr4g==", "dev": true }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -9158,9 +9569,9 @@ "dev": true }, "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, "nested-error-stacks": { @@ -9176,23 +9587,18 @@ "dev": true }, "node-fetch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.2.0.tgz", - "integrity": "sha512-OayFWziIxiHY8bCUyLX6sTpDH8Jsbp4FfYd1j1f7vZyfgkcOnAyM4oQR16f8a0s7Gl/viMGRey8eScYk4V4EZA==" + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "requires": { + "whatwg-url": "^5.0.0" + } }, "node-releases": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "requires": { - "abbrev": "1" - } - }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -9206,9 +9612,9 @@ }, "dependencies": { "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "resolve": { @@ -9595,7 +10001,8 @@ "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true }, "object-assign": { "version": "4.1.1", @@ -9603,9 +10010,9 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-get": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object-get/-/object-get-2.1.0.tgz", - "integrity": "sha1-ciu9tgA576R8rTxtws5RqFwCxa4=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-get/-/object-get-2.1.1.tgz", + "integrity": "sha512-7n4IpLMzGGcLEMiQKsNR7vCe+N5E9LORFrtNUVy4sO3dj9a3HedZCxEL2T7QuLhcHN1NBuBsMOKaOsAYI9IIvg==", "dev": true }, "object-inspect": { @@ -9622,7 +10029,7 @@ "object-to-spawn-args": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-to-spawn-args/-/object-to-spawn-args-1.1.1.tgz", - "integrity": "sha1-d9qIJ/Bz0BHJ4bFz+JV4FHAkZ4U=", + "integrity": "sha512-d6xH8b+QdNj+cdndsL3rVCzwW9PqSSXQBDVj0d8fyaCqMimUEz+sW+Jtxp77bxaSs7C5w7XOH844FG7p2A0cFw==", "dev": true }, "object.assign": { @@ -9936,24 +10343,6 @@ "mimic-fn": "^1.0.0" } }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - } - } - }, "optionator": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", @@ -9977,7 +10366,8 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true }, "p-cancelable": { "version": "1.1.0", @@ -10003,6 +10393,14 @@ "p-limit": "^1.1.0" } }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", @@ -10021,40 +10419,6 @@ "release-zalgo": "^1.0.0" } }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -10107,14 +10471,30 @@ "dev": true }, "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-scurry": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.6.3.tgz", + "integrity": "sha512-RAmB+n30SlN+HnNx6EbcpoDy9nwdpcGPnEKrJnu6GZoDWBdIjo1UQMVtW2ybtC7LC2oKLcMq8y5g8WnKLiod9g==", + "requires": { + "lru-cache": "^7.14.1", + "minipass": "^4.0.2" + }, + "dependencies": { + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" + } + } }, "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "dev": true, "requires": { "isarray": "0.0.1" @@ -10123,7 +10503,7 @@ "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true } } @@ -10137,7 +10517,8 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true }, "picocolors": { "version": "1.0.0", @@ -10364,7 +10745,8 @@ "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true }, "progress": { "version": "2.0.3", @@ -10413,9 +10795,9 @@ "dev": true }, "proxyquire": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-1.7.11.tgz", - "integrity": "sha1-E7SU6x5x+yHMPr42meY3077Br54=", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-1.8.0.tgz", + "integrity": "sha512-mZZq4F50qaBkngvlf9paNfaSb5gtJ0mFPnBjda4NxCpXpMAaVfSLguRr9y2KXF6koOSBf4AanD2inuEQw3aCcA==", "dev": true, "requires": { "fill-keys": "^1.0.2", @@ -10426,7 +10808,7 @@ "resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", "dev": true } } @@ -10439,31 +10821,14 @@ "psl": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz", - "integrity": "sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA==" - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } + "integrity": "sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA==", + "dev": true }, "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true }, "puppeteer-core": { "version": "5.5.0", @@ -10543,21 +10908,16 @@ } } }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" - }, "qs": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-1.2.2.tgz", - "integrity": "sha1-GbV/8k3CqZzh+L32r82ln472H4g=", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true }, "queue": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/queue/-/queue-4.0.1.tgz", - "integrity": "sha1-GLsvTB+NmftkPan+rYmGklYpFhc=", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/queue/-/queue-4.5.1.tgz", + "integrity": "sha512-AMD7w5hRXcFSb8s9u38acBZ+309u6GsiibP4/0YacJeaurRshogB7v/ZcVPxP5gD5+zIw6ixRHdutiYUJfwKHw==", "dev": true, "requires": { "inherits": "~2.0.0" @@ -10585,6 +10945,7 @@ "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -10595,7 +10956,8 @@ "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true } } }, @@ -10649,7 +11011,7 @@ "reduce-extract": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/reduce-extract/-/reduce-extract-1.0.0.tgz", - "integrity": "sha1-Z/I4W+2mUGG19fQxJmLosIDKFSU=", + "integrity": "sha512-QF8vjWx3wnRSL5uFMyCjDeDc5EBMiryoT9tz94VvgjKfzecHAVnqmXAwQDcr7X4JmLc2cjkjFGCVzhMqDjgR9g==", "dev": true, "requires": { "test-value": "^1.0.1" @@ -10658,7 +11020,7 @@ "array-back": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", - "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=", + "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==", "dev": true, "requires": { "typical": "^2.6.0" @@ -10667,7 +11029,7 @@ "test-value": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/test-value/-/test-value-1.1.0.tgz", - "integrity": "sha1-oJE29y7AQ9J8iTcHwrFZv6196T8=", + "integrity": "sha512-wrsbRo7qP+2Je8x8DsK8ovCGyxe3sYfQwOraIY/09A2gFXU9DYKiTF14W4ki/01AEh56kMzAmlj9CaHGDDUBJA==", "dev": true, "requires": { "array-back": "^1.0.2", @@ -10679,7 +11041,7 @@ "reduce-flatten": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz", - "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=", + "integrity": "sha512-j5WfFJfc9CoXv/WbwVLHq74i/hdTUpy+iNC534LxczMRP67vJeK3V9JOdnL0N1cIRbn9mYhE2yVjvvKXDxvNXQ==", "dev": true }, "reduce-unique": { @@ -10691,7 +11053,7 @@ "reduce-without": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/reduce-without/-/reduce-without-1.0.1.tgz", - "integrity": "sha1-aK0OrRGFXJo31OglbBW7+Hly/Iw=", + "integrity": "sha512-zQv5y/cf85sxvdrKPlfcRzlDn/OqKFThNimYmsS3flmkioKvkUGn2Qg9cJVoQiEvdxFGLE0MQER/9fZ9sUqdxg==", "dev": true, "requires": { "test-value": "^2.0.0" @@ -10700,7 +11062,7 @@ "array-back": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", - "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=", + "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==", "dev": true, "requires": { "typical": "^2.6.0" @@ -10709,7 +11071,7 @@ "test-value": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz", - "integrity": "sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=", + "integrity": "sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w==", "dev": true, "requires": { "array-back": "^1.0.3", @@ -10794,13 +11156,23 @@ } }, "reify": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/reify/-/reify-0.17.3.tgz", - "integrity": "sha512-i0t837UYnWyJPCeesupZjmpThIppOPSs4I/uHmsWzQaiGQqtsYlbeJNN5i+61fe6UEA3Famc3IHnlm511poMnA==", + "version": "0.20.12", + "resolved": "https://registry.npmjs.org/reify/-/reify-0.20.12.tgz", + "integrity": "sha512-4BzKwDWyJJbukwI6xIJRh+BDTitoGzxdgYPiQQ1zbcTZW6I8xgHPw1DnVuEs/mEZQlYm1e09DcFSApb4UaR5bQ==", "dev": true, "requires": { - "acorn": "^5.5.3", + "acorn": "^6.1.1", + "acorn-dynamic-import": "^4.0.0", + "magic-string": "^0.25.3", "semver": "^5.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + } } }, "release-zalgo": { @@ -10828,9 +11200,10 @@ "dev": true }, "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -10839,7 +11212,7 @@ "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", - "har-validator": "~5.1.0", + "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", @@ -10849,16 +11222,9 @@ "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", + "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" - }, - "dependencies": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - } } }, "require-directory": { @@ -10890,12 +11256,12 @@ } }, "requizzle": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz", - "integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", + "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", "dev": true, "requires": { - "lodash": "^4.17.14" + "lodash": "^4.17.21" } }, "resolve": { @@ -10971,25 +11337,33 @@ "dev": true }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" }, "dependencies": { "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } } } }, @@ -11026,14 +11400,6 @@ "is-promise": "^2.1.0" } }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", - "requires": { - "aproba": "^1.1.1" - } - }, "run-sequence": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-1.2.2.tgz", @@ -11064,10 +11430,41 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + } + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "samsam": { "version": "1.3.0", @@ -11780,24 +12177,24 @@ "optional": true }, "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" }, "dependencies": { "debug": { @@ -11807,18 +12204,41 @@ "dev": true, "requires": { "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } } }, "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true } } @@ -11971,15 +12391,15 @@ "dev": true }, "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, "sha1-file": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sha1-file/-/sha1-file-1.0.1.tgz", - "integrity": "sha512-Pa3E81r7AJhrDFx8T3wzgiGV+4WydRehlW/nVaAzPoCK//L0Dy7URtOi6LriOMYBEk8qg7DkFbus4KgjosiEAQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/sha1-file/-/sha1-file-1.0.4.tgz", + "integrity": "sha512-IgcUYjTck/UAx0wdtBoTwiy4/yiIZX6do4uaqUtryJY/pBOQC1w3Cb/bZMyC2H3QYnodL5vbX0lY69xlWqeBnA==", "dev": true }, "shallow-clone": { @@ -12067,9 +12487,9 @@ } }, "sinon": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.3.1.tgz", - "integrity": "sha1-SMnHWLTQu4YydIaDPxxCmJGc6e4=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.4.1.tgz", + "integrity": "sha512-vFTrO9Wt0ECffDYIPSP/E5bBugt0UjcBQOfQUMh66xzkyPEnhl/vM2LRZi2ajuTdkH07sA6DzrM6KvdvGIH8xw==", "dev": true, "requires": { "diff": "^3.1.0", @@ -12097,9 +12517,9 @@ } }, "sinon-chai": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.10.0.tgz", - "integrity": "sha1-arMAi7jK6ZKedE12ZXS0zzXzS1s=", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz", + "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==", "dev": true }, "slash": { @@ -12128,7 +12548,7 @@ "sort-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/sort-array/-/sort-array-2.0.0.tgz", - "integrity": "sha1-OKnG2if9fRR7QuYFVPKBGHtN9HI=", + "integrity": "sha512-nZI3lq+nPRImxYqQY5iwpOPVLdDEMr2k6rCOAz5hRcpyYFsrR+2m5Kw0tZaTt452nx/9wZrKaMEMrX03I7ChqQ==", "dev": true, "requires": { "array-back": "^1.0.4", @@ -12139,7 +12559,7 @@ "array-back": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", - "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=", + "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==", "dev": true, "requires": { "typical": "^2.6.0" @@ -12169,6 +12589,12 @@ } } }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, "sparkles": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", @@ -12176,9 +12602,9 @@ "dev": true }, "spawn-wrap": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", - "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.3.tgz", + "integrity": "sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw==", "dev": true, "requires": { "foreground-child": "^1.5.6", @@ -12305,6 +12731,7 @@ "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -12318,11 +12745,11 @@ } }, "ssri": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.1.tgz", + "integrity": "sha512-WVy6di9DlPOeBWEjMScpNipeSX2jIZBGEn5Uuo8Q7aIuFEuDX0pw8RxcOjlD1TWP4obi24ki7m/13+nFpcbXrw==", "requires": { - "safe-buffer": "^5.1.1" + "minipass": "^4.0.0" } }, "standard-engine": { @@ -12344,9 +12771,9 @@ "dev": true }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true } } @@ -12360,7 +12787,7 @@ "stream-connect": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stream-connect/-/stream-connect-1.0.2.tgz", - "integrity": "sha1-GLyB8u2zW4tdmoAJIAqYUxRCipc=", + "integrity": "sha512-68Kl+79cE0RGKemKkhxTSg8+6AGrqBt+cbZAXevg2iJ6Y3zX4JhA/sZeGzLpxW9cXhmqAcE7KnJCisUmIUfnFQ==", "dev": true, "requires": { "array-back": "^1.0.2" @@ -12369,7 +12796,7 @@ "array-back": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", - "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=", + "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==", "dev": true, "requires": { "typical": "^2.6.0" @@ -12377,20 +12804,6 @@ } } }, - "stream-each": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", - "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" - }, "stream-via": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/stream-via/-/stream-via-1.0.4.tgz", @@ -12509,6 +12922,171 @@ "es-abstract": "^1.19.1" } }, + "string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "dependencies": { + "define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "es-abstract": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + } + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true + }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + } + } + }, "string.prototype.trimend": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", @@ -12532,7 +13110,8 @@ "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true }, "strip-ansi": { "version": "3.0.1", @@ -12542,6 +13121,12 @@ "ansi-regex": "^2.0.0" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -12661,9 +13246,52 @@ "taffydb": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", - "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=", + "integrity": "sha512-y3JaeRSplks6NYQuCOj3ZFMO3j60rTwbuKCvZxsAraGYH2epusatvZ0baZYA01WsGqJBq/Dl6vOrMUJqyMj8kA==", "dev": true }, + "tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, "tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", @@ -12771,17 +13399,17 @@ "temp-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/temp-path/-/temp-path-1.0.0.tgz", - "integrity": "sha1-JLFUOXOrRCiW2a02fdnL2/r+kYs=", + "integrity": "sha512-TvmyH7kC6ZVTYkqCODjJIbgvu0FKiwQpZ4D1aknE7xpcDf/qEOB8KZEK5ef2pfbVoiBhNWs3yx4y+ESMtNYmlg==", "dev": true }, "terser": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.8.2.tgz", - "integrity": "sha512-FGSBXiBJe2TSXy6pWwXpY0YcEWEK35UKL64BBbxX3aHqM4Nj0RMqXvqBuoSGfyd80t8MKQ5JwYm5jRRGTSEFNg==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", "requires": { - "commander": "~2.17.1", + "commander": "^2.20.0", "source-map": "~0.6.1", - "source-map-support": "~0.5.6" + "source-map-support": "~0.5.12" }, "dependencies": { "source-map": { @@ -12960,9 +13588,9 @@ "dev": true }, "thenify": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", - "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "requires": { "any-promise": "^1.0.0" } @@ -12985,6 +13613,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, "requires": { "readable-stream": "^2.1.5", "xtend": "~4.0.1" @@ -12994,6 +13623,7 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -13008,6 +13638,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -13020,14 +13651,6 @@ "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", "dev": true }, - "tmp": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz", - "integrity": "sha512-c2mmfiBmND6SOVxzogm1oda0OJ1HZVIk/5n26N59dDTh80MUeavpiCls4PGAdkX1PFkKokLpcf7prSjCeXLsJg==", - "requires": { - "os-tmpdir": "~1.0.1" - } - }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -13061,43 +13684,20 @@ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true }, - "touch": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/touch/-/touch-0.0.3.tgz", - "integrity": "sha1-Ua7z1ElXHU8oel2Hyci0kYGg2x0=", - "requires": { - "nopt": "~1.0.10" - }, - "dependencies": { - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "requires": { - "abbrev": "1" - } - } - } - }, "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" + "psl": "^1.1.28", + "punycode": "^2.1.1" } }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "trim-right": { "version": "1.0.1", @@ -13127,9 +13727,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, "strip-bom": { @@ -13151,6 +13751,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -13158,7 +13759,8 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true }, "type-check": { "version": "0.3.2", @@ -13181,21 +13783,33 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true }, "typical": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", - "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=", + "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==", "dev": true }, "ua-parser-js": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", - "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", + "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", "dev": true }, "uc.micro": { @@ -13205,31 +13819,11 @@ "dev": true }, "uglify-js": { - "version": "3.7.6", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.6.tgz", - "integrity": "sha512-yYqjArOYSxvqeeiYH2VGjZOqq6SVmhxzaPjJC1W2F9e+bqvFL9QXQ2osQuKUFjM2hGjKG2YclQnRKWQSt/nOTQ==", + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, - "optional": true, - "requires": { - "commander": "~2.20.3", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } + "optional": true }, "unbox-primitive": { "version": "1.0.1", @@ -13262,9 +13856,9 @@ } }, "underscore": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", "dev": true }, "underscore-plus": { @@ -13301,22 +13895,22 @@ "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==" }, "uniqid": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-5.0.3.tgz", - "integrity": "sha512-R2qx3X/LYWSdGRaluio4dYrPXAJACTqyUjuyXHoJLBUOIfmMcnYOyY2d6Y4clZcIz5lK6ZaI0Zzmm0cPfsIqzQ==" + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-5.4.0.tgz", + "integrity": "sha512-38JRbJ4Fj94VmnC7G/J/5n5SC7Ab46OM5iNtSstB/ko3l1b5g7ALt4qzHFgGciFkyiRNtDXtLNb+VsxtMSE77A==" }, "unique-filename": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", - "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "requires": { - "unique-slug": "^2.0.0" + "unique-slug": "^4.0.0" } }, "unique-slug": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", - "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "requires": { "imurmurhash": "^0.1.4" } @@ -13346,6 +13940,7 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, "requires": { "punycode": "^2.1.0" }, @@ -13353,7 +13948,8 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true } } }, @@ -13375,7 +13971,8 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "utils-merge": { "version": "1.0.1", @@ -13386,7 +13983,8 @@ "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true }, "v8-compile-cache": { "version": "2.3.0", @@ -13407,7 +14005,8 @@ "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -13426,9 +14025,9 @@ } }, "walk-back": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-3.0.1.tgz", - "integrity": "sha512-umiNB2qLO731Sxbp6cfZ9pwURJzTnftxE4Gc7hq8n/ehkuXC//s9F65IEIJA2ZytQZ1ZOsm/Fju4IWx0bivkUQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-4.0.0.tgz", + "integrity": "sha512-kudCA8PXVQfrqv2mFTG72vDBRi8BKWxGgFLwPpzHcpZnSwZk93WMwUDVcLHWNsnm+Y0AC4Vb6MUNRgaHfyV2DQ==", "dev": true }, "watch": { @@ -13442,9 +14041,9 @@ }, "dependencies": { "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true } } @@ -13670,14 +14269,12 @@ "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, "requires": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -13727,6 +14324,20 @@ "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", "dev": true }, + "which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -13761,9 +14372,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "is-fullwidth-code-point": { @@ -13832,20 +14443,22 @@ "dev": true }, "xmlcreate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.1.tgz", - "integrity": "sha512-MjGsXhKG8YjTKrDCXseFo3ClbMGvUD4en29H2Cev1dv4P/chlpw6KdYmlCWDkhosBVKRDjM836+3e3pm1cBNJA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", + "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", "dev": true }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true }, "yallist": { "version": "2.1.2", @@ -13872,8 +14485,7 @@ "dependencies": { "ansi-regex": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "resolved": "", "dev": true }, "find-up": { @@ -13954,21 +14566,13 @@ } }, "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } } }, "yauzl": { diff --git a/package.json b/package.json index 320fdecf..81dcd6cc 100644 --- a/package.json +++ b/package.json @@ -33,43 +33,43 @@ "author": "Bartosz Wojtkowiak ", "license": "MIT", "devDependencies": { - "@babel/cli": "7.18.10", - "@babel/register": "7.18.9", + "@babel/cli": "7.21.0", + "@babel/register": "7.21.0", "babel-plugin-istanbul": "^5.2.0", "chai": "3.5.0", "chai-as-promised": "6.0.0", "codecov": "1.0.1", "connect": "3.7.0", - "connect-modrewrite": "0.9.0", + "connect-modrewrite": "^0.10.2", "coveralls": "3.1.1", - "cross-env": "3.1.4", + "cross-env": "3.2.4", "dirty-chai": "1.2.2", "eslint": "4.19.1", "eslint-config-airbnb-base": "12.1.0", - "eslint-plugin-import": "2.26.0", + "eslint-plugin-import": "2.27.5", "find-port": "2.0.1", - "fs-extra": "4.0.1", - "fs-plus": "2.9.3", + "fs-extra": "4.0.3", + "fs-plus": "2.10.1", "import-fresh": "2.0.0", - "jsdoc-to-markdown": "5.0.0", - "mime": "2.0.3", + "jsdoc-to-markdown": "5.0.3", + "mime": "2.6.0", "mocha": "2.5.3", "mockery": "2.1.0", "npm-run-all": "4.1.5", "nyc": "14.1.1", - "proxyquire": "1.7.11", - "queue": "4.0.1", - "reify": "0.17.3", - "request": "2.88.0", + "proxyquire": "1.8.0", + "queue": "4.5.1", + "reify": "0.20.12", + "request": "2.88.2", "rewire": "3.0.2", "run-sequence": "1.2.2", "semistandard": "^16.0.1", - "send": "0.16.2", + "send": "0.18.0", "serve-static": "1.15.0", "server-destroy": "1.0.1", - "sha1-file": "1.0.1", - "sinon": "2.3.1", - "sinon-chai": "2.10.0", + "sha1-file": "1.0.4", + "sinon": "2.4.1", + "sinon-chai": "2.14.0", "spectron": "13.0.0", "temp-dir": "2.0.0", "watch": "1.0.2" @@ -78,23 +78,22 @@ "@babel/core": "7.18.13", "@babel/preset-env": "7.18.10", "@babel/runtime": "7.18.9", - "asar": "0.14.3", - "cacache": "10.0.4", - "commander": "2.17.1", + "@electron/asar": "3.2.3", + "cacache": "17.0.5", + "commander": "2.20.3", "cross-spawn": "5.0.1", "del": "2.2.2", - "install-local": "0.6.0", + "install-local": "0.6.2", "isbinaryfile": "3.0.3", "lodash": "4.17.21", "md5": "2.3.0", - "mksnapshot": "0.3.5", - "node-fetch": "2.2.0", + "node-fetch": "2.6.9", "regenerator-runtime": "0.12.1", - "rimraf": "2.6.2", + "rimraf": "2.6.3", "semver": "5.5.1", "shelljs": "0.8.5", "single-line-log": "1.1.2", - "terser": "3.8.2" + "terser": "4.8.1" }, "peerDependencies": { "app-builder-lib": "*", diff --git a/plugins/bundler/bundler.js b/plugins/bundler/bundler.js index cbcdd943..05d7a004 100644 --- a/plugins/bundler/bundler.js +++ b/plugins/bundler/bundler.js @@ -68,7 +68,7 @@ class MeteorDesktopBundler { 'cacache' ]; this.buildDeps = [ - 'asar', + '@electron/asar', 'shelljs', 'del', '@babel/core', @@ -509,7 +509,7 @@ class MeteorDesktopBundler { console.time('[meteor-desktop] preparing desktop.asar took'); - let asar; + let electronAsar; let shelljs; let babelCore; let babelPresetEnv; @@ -705,7 +705,7 @@ class MeteorDesktopBundler { try { const deps = this.lookForAndRequireDependencies(this.buildDeps); ({ - asar, + electronAsar, shelljs, del, babelCore, @@ -713,6 +713,7 @@ class MeteorDesktopBundler { terser, md5 } = deps); + console.log(deps); } catch (e) { // Look at the declaration of StringPrototypeToOriginal for explanation. String.prototype.to = StringPrototypeToOriginal; // eslint-disable-line @@ -881,20 +882,20 @@ class MeteorDesktopBundler { all.wait(); this.stampPerformance('babel/uglify'); - this.stampPerformance('asar'); + this.stampPerformance('@electron/asar'); const future = new Future(); const resolve = future.resolver(); const asarPath = path.join(desktopTmpAsarPath, 'desktop.asar'); - asar.createPackage( + electronAsar.createPackage( desktopTmpPath, - asarPath, - () => { + asarPath + ) + .then(() => { resolve(); - } - ); + }); future.wait(); - this.stampPerformance('asar'); + this.stampPerformance('@electron/asar'); const contents = fs.readFileSync(asarPath); diff --git a/tests/functional/electronApp.test.js b/tests/functional/electronApp.test.js index 5f781104..39415206 100644 --- a/tests/functional/electronApp.test.js +++ b/tests/functional/electronApp.test.js @@ -4,7 +4,7 @@ import sinonChai from 'sinon-chai'; import path from 'path'; import fs from 'fs'; import shell from 'shelljs'; -import asar from 'asar'; +import asar from '@electron/asar'; import { createTestInstance, StubLog, getModuleJson, saveModuleJson } from '../helpers/meteorDesktop'; import paths from '../helpers/paths'; diff --git a/tests/functional/modules/localServer.test.js b/tests/functional/modules/localServer.test.js index b4b9c0ba..1a149c6c 100644 --- a/tests/functional/modules/localServer.test.js +++ b/tests/functional/modules/localServer.test.js @@ -198,7 +198,7 @@ function localServerTests(useStreams = false) { it('should set application/woff for a .woff file', async () => { const response = await fetchFromLocalServer('/some-font.woff'); - expect(response.headers.get('Content-Type')).to.contain('application/font-woff'); + expect(response.headers.get('Content-Type')).to.contain('font/woff'); }); it('should set application/octet-stream for files without an extension', async () => { @@ -298,9 +298,9 @@ describe('localServer', () => { it('should server cordova.js file', async () => { const response = await fetchFromLocalServer('/cordova.js'); - const body = await response.text(); - expect(body).to.contain('window.cordova'); - expect(body).to.contain('module.exports = cordova;'); + const body = await response.text(); + expect(body).to.contain('window.cordova'); + expect(body).to.contain('module.exports = cordova;'); }); }); }); diff --git a/tests/unit/meteorApp.test.js b/tests/unit/meteorApp.test.js index 3d75203d..5fede597 100644 --- a/tests/unit/meteorApp.test.js +++ b/tests/unit/meteorApp.test.js @@ -6,7 +6,7 @@ import sinon from 'sinon'; import mockery from 'mockery'; // need for running test -import asar from 'asar'; // eslint-disable-line no-unused-vars +import asar from '@electron/asar'; // eslint-disable-line no-unused-vars chai.use(sinonChai); chai.use(dirty); From f521b19bc1bd71f07b92ea8a28b9714cc2dc8ddc Mon Sep 17 00:00:00 2001 From: "p.mikolajczak@tkhtechnology.com" Date: Wed, 5 Apr 2023 08:38:03 +0200 Subject: [PATCH 2/3] delete dist dir --- dist/bin/cli.js | 224 -------- dist/binaryModulesDetector.js | 80 --- dist/defaultDependencies.js | 8 - dist/dependenciesManager.js | 181 ------ dist/desktop.js | 271 --------- dist/electron.js | 61 -- dist/electronApp.js | 876 ----------------------------- dist/electronAppScaffold.js | 142 ----- dist/electronBuilder.js | 384 ------------- dist/env.js | 239 -------- dist/index.js | 247 --------- dist/log.js | 75 --- dist/meteorApp.js | 923 ------------------------------- dist/meteorManager.js | 147 ----- dist/packager.js | 142 ----- dist/scripts/addToScripts.js | 24 - dist/scripts/propagateVersion.js | 21 - dist/scripts/utils/addScript.js | 50 -- dist/skeletonDependencies.js | 24 - dist/utils.js | 328 ----------- 20 files changed, 4447 deletions(-) delete mode 100644 dist/bin/cli.js delete mode 100644 dist/binaryModulesDetector.js delete mode 100644 dist/defaultDependencies.js delete mode 100644 dist/dependenciesManager.js delete mode 100644 dist/desktop.js delete mode 100644 dist/electron.js delete mode 100644 dist/electronApp.js delete mode 100644 dist/electronAppScaffold.js delete mode 100644 dist/electronBuilder.js delete mode 100644 dist/env.js delete mode 100644 dist/index.js delete mode 100644 dist/log.js delete mode 100644 dist/meteorApp.js delete mode 100644 dist/meteorManager.js delete mode 100644 dist/packager.js delete mode 100644 dist/scripts/addToScripts.js delete mode 100644 dist/scripts/propagateVersion.js delete mode 100644 dist/scripts/utils/addScript.js delete mode 100644 dist/skeletonDependencies.js delete mode 100644 dist/utils.js diff --git a/dist/bin/cli.js b/dist/bin/cli.js deleted file mode 100644 index 683607e0..00000000 --- a/dist/bin/cli.js +++ /dev/null @@ -1,224 +0,0 @@ -#!/usr/bin/env node - -/* eslint-disable global-require */ -"use strict"; - -var _fs = _interopRequireDefault(require("fs")); - -var _path = _interopRequireDefault(require("path")); - -var _assignIn = _interopRequireDefault(require("lodash/assignIn")); - -var _commander = _interopRequireDefault(require("commander")); - -var _shelljs = _interopRequireDefault(require("shelljs")); - -var _ = _interopRequireDefault(require("../..")); - -var _addScript = _interopRequireDefault(require("../scripts/utils/addScript")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -const { - join -} = _path.default; -const cmd = process.argv[2]; -/* eslint-disable no-console */ - -const { - log, - error, - info, - warn -} = console; -/* eslint-enable no-console */ - -/** - * Looks for .meteor directory. - * @param {string} appPath - Meteor app path - */ - -function isMeteorApp(appPath) { - const meteorPath = join(appPath, '.meteor'); - - try { - return _fs.default.statSync(meteorPath).isDirectory(); - } catch (e) { - return false; - } -} -/** - * Just ensures a ddp url is set. - * - * @param {string|null} ddpUrl - the url that Meteor app connects to - * @returns {string|null} - */ - - -function getDdpUrl(ddpUrl = null) { - if (!ddpUrl && _commander.default.buildMeteor) { - info('no ddp_url specified, setting default: http://127.0.0.1:3000'); - return 'http://127.0.0.1:3000'; - } - - return ddpUrl; -} // -------------------------- - - -function collect(val, memo) { - memo.push(val); - return memo; -} - -_commander.default.option('-b, --build-meteor', 'runs meteor to obtain the mobile build, kills it after').option('-t, --build-timeout ', 'timeout value when waiting for ' + 'meteor to build, default 600sec').option('-p, --port ', 'port on which meteor is running, when with -b this will be passed to meteor when obtaining the build').option('--production', 'builds meteor app with the production switch, uglifies contents ' + 'of .desktop, packs app to app.asar').option('-a, --android', 'force adding android as a mobile platform instead of ios').option('-s, --scaffold', 'will scaffold .desktop if not present').option('-i, --ignore-stderr [string]', 'only with -b, strings that when found will not terminate meteor build', collect, []).option('--meteor-settings ', 'only with -b, adds --settings options to meteor').option('--prod-debug', 'forces adding dev tools to a production build').option('--ia32', 'generate 32bit installer/package').option('--all-archs', 'generate 32bit and 64bit installers').option('--win', 'generate Windows installer').option('--linux', 'generate Linux installer').option('--mac', 'generate Mac installer').option('-d, --debug', 'run electron with debug switch'); - -_commander.default.usage('[command] [options]').version(require('./../../package.json').version, '-V, --version').on('--help', () => { - log(' [ddp_url] - pass a ddp url if you want to use different one than used in meteor\'s --mobile-server'); - log(' this will also work with -b'); - log(' '); - log(' Examples:'); - log(''); - log(' ', ['# cd into meteor dir first', 'cd /your/meteor/app', 'meteor --mobile-server=127.0.0.1:3000', '', '# open new terminal, assuming you have done npm install --save-dev @meteor-community/meteor-desktop', 'npm run desktop -- init', 'npm run desktop'].join('\n ')); - log('\n'); -}); - -function verifyArgsSyntax() { - if (process.env.npm_config_argv) { - let npmArgv; - - try { - const args = ['-b', '--build-meteor', '-t', '--build-timeout', '-p', '--port', '--production', '-a', '--android', '-s', '--scaffold', '--ia32', '--win', '--linux', '--all-archs', '--win', '--mac', '--meteor-settings']; - npmArgv = JSON.parse(process.env.npm_config_argv); - - if (npmArgv.remain.length === 0 && npmArgv.original.length > 2) { - if (npmArgv.original.some(arg => !!~args.indexOf(arg))) { - warn('WARNING: seems that you might used the wrong console syntax, no ` --' + ' ` delimiter was found, be sure you are invoking meteor-desktop with' + ' it when passing commands or options -> ' + '`npm run desktop -- command --option`\n'); - } - } - } catch (e) {// Not sure if `npm_config_argv` is always present... - } - } -} - -function meteorDesktopFactory(ddpUrl, production = false) { - info(`METEOR-DESKTOP v${require('./../../package.json').version}\n`); - verifyArgsSyntax(); - const input = process.cwd(); - - if (!isMeteorApp(input)) { - error(`not in a meteor app dir\n ${input}`); - process.exit(); - } - - if (!_commander.default.output) { - _commander.default.output = input; - } - - if (production && !_commander.default.production) { - info('package/build-installer implies setting --production, setting it for you'); - } - - if (!_commander.default.buildMeteor) { - _commander.default.port = _commander.default.port || 3000; - info(`REMINDER: your Meteor project should be running now on port ${_commander.default.port}\n`); - } - - if (_commander.default.prodDebug) { - info('!! WARNING: You are adding devTools to a production build !!\n'); - } - - const options = { - ddpUrl, - skipMobileBuild: _commander.default.buildMeteor ? !_commander.default.buildMeteor : true, - production: _commander.default.production || production - }; - (0, _assignIn.default)(options, _commander.default); - return (0, _.default)(input, _commander.default.output, options); -} - -function run(ddpUrl) { - meteorDesktopFactory(getDdpUrl(ddpUrl)).run(); -} - -function build(ddpUrl) { - meteorDesktopFactory(getDdpUrl(ddpUrl)).build(); -} - -function init() { - meteorDesktopFactory().init(); -} - -function justRun() { - meteorDesktopFactory().justRun(); -} - -function runPackager(ddpUrl) { - meteorDesktopFactory(getDdpUrl(ddpUrl), true).runPackager(); -} - -function buildInstaller(ddpUrl) { - meteorDesktopFactory(getDdpUrl(ddpUrl), true).buildInstaller(); -} - -function initTestsSupport() { - log('installing cross-env, ava, meteor-desktop-test-suite and spectron'); - log('running `meteor npm install --save-dev cross-env ava spectron meteor-desktop-test-suite`'); - - const { - code - } = _shelljs.default.exec('meteor npm install --save-dev cross-env ava spectron meteor-desktop-test-suite'); - - if (code !== 0) { - warn('could not add cross-env, ava and spectron to your `devDependencies`, please do it' + ' manually'); - } - - const test = 'cross-env NODE_ENV=test ava .desktop/**/*.test.js -s --verbose'; - const testWatch = 'cross-env NODE_ENV=test ava .desktop/**/*.test.js -s --verbose' + ' --watch --source .desktop'; - - function fail() { - error('\ncould not add entries to `scripts` in package.json'); - log('please try to add it manually\n'); - log(`test-desktop: ${test}`); - log(`test-desktop-watch: ${testWatch}`); - } - - const packageJsonPath = _path.default.resolve(_path.default.join(process.cwd(), 'package.json')); - - (0, _addScript.default)('test-desktop', test, packageJsonPath, fail); - (0, _addScript.default)('test-desktop-watch', testWatch, packageJsonPath, fail); - log('\nadded test-desktop and test-desktop-watch entries'); - log('run the test with `npm run test-desktop`'); -} - -_commander.default.command('init').description('scaffolds .desktop dir in the meteor app').action(init); - -_commander.default.command('run [ddp_url]').description('(default) builds and runs desktop app').action(run); - -_commander.default.command('build [ddp_url]').description('builds your desktop app').action(build); - -_commander.default.command('build-installer [ddp_url]').description('creates the installer').action(buildInstaller); - -_commander.default.command('just-run').description('alias for running `electron .` in `.meteor/desktop-build`').action(justRun); - -_commander.default.command('package [ddp_url]').description('runs electron packager').action(runPackager); - -_commander.default.command('init-tests-support').description('prepares project for running functional tests of desktop app').action(initTestsSupport); - -if (process.argv.length === 2 || !~'-h|--help|run|init|build|build-installer|just-run|init-tests-support|package'.indexOf(cmd)) { - let { - argv - } = process; - - if (process.argv.length === 2) { - argv.push('run'); - } else { - let command = argv.splice(0, 2); - command = command.concat('run', argv); - argv = command; - } - - _commander.default.parse(argv); -} else { - _commander.default.parse(process.argv); -} -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJqb2luIiwicGF0aCIsImNtZCIsInByb2Nlc3MiLCJhcmd2IiwibG9nIiwiZXJyb3IiLCJpbmZvIiwid2FybiIsImNvbnNvbGUiLCJpc01ldGVvckFwcCIsImFwcFBhdGgiLCJtZXRlb3JQYXRoIiwiZnMiLCJzdGF0U3luYyIsImlzRGlyZWN0b3J5IiwiZSIsImdldERkcFVybCIsImRkcFVybCIsInByb2dyYW0iLCJidWlsZE1ldGVvciIsImNvbGxlY3QiLCJ2YWwiLCJtZW1vIiwicHVzaCIsIm9wdGlvbiIsInVzYWdlIiwidmVyc2lvbiIsInJlcXVpcmUiLCJvbiIsInZlcmlmeUFyZ3NTeW50YXgiLCJlbnYiLCJucG1fY29uZmlnX2FyZ3YiLCJucG1Bcmd2IiwiYXJncyIsIkpTT04iLCJwYXJzZSIsInJlbWFpbiIsImxlbmd0aCIsIm9yaWdpbmFsIiwic29tZSIsImFyZyIsImluZGV4T2YiLCJtZXRlb3JEZXNrdG9wRmFjdG9yeSIsInByb2R1Y3Rpb24iLCJpbnB1dCIsImN3ZCIsImV4aXQiLCJvdXRwdXQiLCJwb3J0IiwicHJvZERlYnVnIiwib3B0aW9ucyIsInNraXBNb2JpbGVCdWlsZCIsImFzc2lnbkluIiwibWV0ZW9yRGVza3RvcCIsInJ1biIsImJ1aWxkIiwiaW5pdCIsImp1c3RSdW4iLCJydW5QYWNrYWdlciIsImJ1aWxkSW5zdGFsbGVyIiwiaW5pdFRlc3RzU3VwcG9ydCIsImNvZGUiLCJzaGVsbCIsImV4ZWMiLCJ0ZXN0IiwidGVzdFdhdGNoIiwiZmFpbCIsInBhY2thZ2VKc29uUGF0aCIsInJlc29sdmUiLCJhZGRTY3JpcHQiLCJjb21tYW5kIiwiZGVzY3JpcHRpb24iLCJhY3Rpb24iLCJzcGxpY2UiLCJjb25jYXQiXSwic291cmNlcyI6WyIuLi8uLi9saWIvYmluL2NsaS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG4vKiBlc2xpbnQtZGlzYWJsZSBnbG9iYWwtcmVxdWlyZSAqL1xuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGFzc2lnbkluIGZyb20gJ2xvZGFzaC9hc3NpZ25Jbic7XG5pbXBvcnQgcHJvZ3JhbSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHNoZWxsIGZyb20gJ3NoZWxsanMnO1xuXG5pbXBvcnQgbWV0ZW9yRGVza3RvcCBmcm9tICcuLi8uLic7XG5pbXBvcnQgYWRkU2NyaXB0IGZyb20gJy4uL3NjcmlwdHMvdXRpbHMvYWRkU2NyaXB0JztcblxuY29uc3QgeyBqb2luIH0gPSBwYXRoO1xuY29uc3QgY21kID0gcHJvY2Vzcy5hcmd2WzJdO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5jb25zdCB7XG4gICAgbG9nLCBlcnJvciwgaW5mbywgd2FyblxufSA9IGNvbnNvbGU7XG5cbi8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuXG4vKipcbiAqIExvb2tzIGZvciAubWV0ZW9yIGRpcmVjdG9yeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBQYXRoIC0gTWV0ZW9yIGFwcCBwYXRoXG4gKi9cbmZ1bmN0aW9uIGlzTWV0ZW9yQXBwKGFwcFBhdGgpIHtcbiAgICBjb25zdCBtZXRlb3JQYXRoID0gam9pbihhcHBQYXRoLCAnLm1ldGVvcicpO1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBmcy5zdGF0U3luYyhtZXRlb3JQYXRoKS5pc0RpcmVjdG9yeSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBKdXN0IGVuc3VyZXMgYSBkZHAgdXJsIGlzIHNldC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBkZHBVcmwgLSB0aGUgdXJsIHRoYXQgTWV0ZW9yIGFwcCBjb25uZWN0cyB0b1xuICogQHJldHVybnMge3N0cmluZ3xudWxsfVxuICovXG5mdW5jdGlvbiBnZXREZHBVcmwoZGRwVXJsID0gbnVsbCkge1xuICAgIGlmICghZGRwVXJsICYmIHByb2dyYW0uYnVpbGRNZXRlb3IpIHtcbiAgICAgICAgaW5mbygnbm8gZGRwX3VybCBzcGVjaWZpZWQsIHNldHRpbmcgZGVmYXVsdDogaHR0cDovLzEyNy4wLjAuMTozMDAwJyk7XG4gICAgICAgIHJldHVybiAnaHR0cDovLzEyNy4wLjAuMTozMDAwJztcbiAgICB9XG4gICAgcmV0dXJuIGRkcFVybDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gY29sbGVjdCh2YWwsIG1lbW8pIHtcbiAgICBtZW1vLnB1c2godmFsKTtcbiAgICByZXR1cm4gbWVtbztcbn1cblxucHJvZ3JhbVxuICAgIC5vcHRpb24oJy1iLCAtLWJ1aWxkLW1ldGVvcicsICdydW5zIG1ldGVvciB0byBvYnRhaW4gdGhlIG1vYmlsZSBidWlsZCwga2lsbHMgaXQgYWZ0ZXInKVxuICAgIC5vcHRpb24oJy10LCAtLWJ1aWxkLXRpbWVvdXQgPHRpbWVvdXRfaW5fc2VjPicsICd0aW1lb3V0IHZhbHVlIHdoZW4gd2FpdGluZyBmb3IgJyArXG4gICAgICAgICdtZXRlb3IgdG8gYnVpbGQsIGRlZmF1bHQgNjAwc2VjJylcbiAgICAub3B0aW9uKCctcCwgLS1wb3J0IDxwb3J0PicsICdwb3J0IG9uIHdoaWNoIG1ldGVvciBpcyBydW5uaW5nLCB3aGVuIHdpdGggLWIgdGhpcyB3aWxsIGJlIHBhc3NlZCB0byBtZXRlb3Igd2hlbiBvYnRhaW5pbmcgdGhlIGJ1aWxkJylcbiAgICAub3B0aW9uKCctLXByb2R1Y3Rpb24nLCAnYnVpbGRzIG1ldGVvciBhcHAgd2l0aCB0aGUgcHJvZHVjdGlvbiBzd2l0Y2gsIHVnbGlmaWVzIGNvbnRlbnRzICcgK1xuICAgICAgICAnb2YgLmRlc2t0b3AsIHBhY2tzIGFwcCB0byBhcHAuYXNhcicpXG4gICAgLm9wdGlvbignLWEsIC0tYW5kcm9pZCcsICdmb3JjZSBhZGRpbmcgYW5kcm9pZCBhcyBhIG1vYmlsZSBwbGF0Zm9ybSBpbnN0ZWFkIG9mIGlvcycpXG4gICAgLm9wdGlvbignLXMsIC0tc2NhZmZvbGQnLCAnd2lsbCBzY2FmZm9sZCAuZGVza3RvcCBpZiBub3QgcHJlc2VudCcpXG4gICAgLm9wdGlvbignLWksIC0taWdub3JlLXN0ZGVyciBbc3RyaW5nXScsICdvbmx5IHdpdGggLWIsIHN0cmluZ3MgdGhhdCB3aGVuIGZvdW5kIHdpbGwgbm90IHRlcm1pbmF0ZSBtZXRlb3IgYnVpbGQnLCBjb2xsZWN0LCBbXSlcbiAgICAub3B0aW9uKCctLW1ldGVvci1zZXR0aW5ncyA8cGF0aD4nLCAnb25seSB3aXRoIC1iLCBhZGRzIC0tc2V0dGluZ3Mgb3B0aW9ucyB0byBtZXRlb3InKVxuICAgIC5vcHRpb24oJy0tcHJvZC1kZWJ1ZycsICdmb3JjZXMgYWRkaW5nIGRldiB0b29scyB0byBhIHByb2R1Y3Rpb24gYnVpbGQnKVxuICAgIC5vcHRpb24oJy0taWEzMicsICdnZW5lcmF0ZSAzMmJpdCBpbnN0YWxsZXIvcGFja2FnZScpXG4gICAgLm9wdGlvbignLS1hbGwtYXJjaHMnLCAnZ2VuZXJhdGUgMzJiaXQgYW5kIDY0Yml0IGluc3RhbGxlcnMnKVxuICAgIC5vcHRpb24oJy0td2luJywgJ2dlbmVyYXRlIFdpbmRvd3MgaW5zdGFsbGVyJylcbiAgICAub3B0aW9uKCctLWxpbnV4JywgJ2dlbmVyYXRlIExpbnV4IGluc3RhbGxlcicpXG4gICAgLm9wdGlvbignLS1tYWMnLCAnZ2VuZXJhdGUgTWFjIGluc3RhbGxlcicpXG4gICAgLm9wdGlvbignLWQsIC0tZGVidWcnLCAncnVuIGVsZWN0cm9uIHdpdGggZGVidWcgc3dpdGNoJyk7XG5cblxucHJvZ3JhbVxuICAgIC51c2FnZSgnW2NvbW1hbmRdIFtvcHRpb25zXScpXG4gICAgLnZlcnNpb24ocmVxdWlyZSgnLi8uLi8uLi9wYWNrYWdlLmpzb24nKS52ZXJzaW9uLCAnLVYsIC0tdmVyc2lvbicpXG4gICAgLm9uKCctLWhlbHAnLCAoKSA9PiB7XG4gICAgICAgIGxvZygnICBbZGRwX3VybF0gLSBwYXNzIGEgZGRwIHVybCBpZiB5b3Ugd2FudCB0byB1c2UgZGlmZmVyZW50IG9uZSB0aGFuIHVzZWQgaW4gbWV0ZW9yXFwncyAtLW1vYmlsZS1zZXJ2ZXInKTtcbiAgICAgICAgbG9nKCcgICAgICAgICAgICAgIHRoaXMgd2lsbCBhbHNvIHdvcmsgd2l0aCAtYicpO1xuICAgICAgICBsb2coJyAgICAnKTtcbiAgICAgICAgbG9nKCcgIEV4YW1wbGVzOicpO1xuICAgICAgICBsb2coJycpO1xuICAgICAgICBsb2coXG4gICAgICAgICAgICAnICAgJyxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAnIyBjZCBpbnRvIG1ldGVvciBkaXIgZmlyc3QnLFxuICAgICAgICAgICAgICAgICdjZCAveW91ci9tZXRlb3IvYXBwJyxcbiAgICAgICAgICAgICAgICAnbWV0ZW9yIC0tbW9iaWxlLXNlcnZlcj0xMjcuMC4wLjE6MzAwMCcsXG4gICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgJyMgb3BlbiBuZXcgdGVybWluYWwsIGFzc3VtaW5nIHlvdSBoYXZlIGRvbmUgbnBtIGluc3RhbGwgLS1zYXZlLWRldiBAbWV0ZW9yLWNvbW11bml0eS9tZXRlb3ItZGVza3RvcCcsXG4gICAgICAgICAgICAgICAgJ25wbSBydW4gZGVza3RvcCAtLSBpbml0JyxcbiAgICAgICAgICAgICAgICAnbnBtIHJ1biBkZXNrdG9wJ1xuICAgICAgICAgICAgXS5qb2luKCdcXG4gICAgJylcbiAgICAgICAgKTtcbiAgICAgICAgbG9nKCdcXG4nKTtcbiAgICB9KTtcblxuXG5mdW5jdGlvbiB2ZXJpZnlBcmdzU3ludGF4KCkge1xuICAgIGlmIChwcm9jZXNzLmVudi5ucG1fY29uZmlnX2FyZ3YpIHtcbiAgICAgICAgbGV0IG5wbUFyZ3Y7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBhcmdzID0gWyctYicsICctLWJ1aWxkLW1ldGVvcicsICctdCcsICctLWJ1aWxkLXRpbWVvdXQnLCAnLXAnLCAnLS1wb3J0JyxcbiAgICAgICAgICAgICAgICAnLS1wcm9kdWN0aW9uJywgJy1hJywgJy0tYW5kcm9pZCcsICctcycsICctLXNjYWZmb2xkJywgJy0taWEzMicsICctLXdpbicsXG4gICAgICAgICAgICAgICAgJy0tbGludXgnLCAnLS1hbGwtYXJjaHMnLCAnLS13aW4nLCAnLS1tYWMnLCAnLS1tZXRlb3Itc2V0dGluZ3MnXTtcbiAgICAgICAgICAgIG5wbUFyZ3YgPSBKU09OLnBhcnNlKHByb2Nlc3MuZW52Lm5wbV9jb25maWdfYXJndik7XG4gICAgICAgICAgICBpZiAobnBtQXJndi5yZW1haW4ubGVuZ3RoID09PSAwICYmIG5wbUFyZ3Yub3JpZ2luYWwubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgICAgIGlmIChucG1Bcmd2Lm9yaWdpbmFsLnNvbWUoYXJnID0+ICEhfmFyZ3MuaW5kZXhPZihhcmcpKSkge1xuICAgICAgICAgICAgICAgICAgICB3YXJuKCdXQVJOSU5HOiBzZWVtcyB0aGF0IHlvdSBtaWdodCB1c2VkIHRoZSB3cm9uZyBjb25zb2xlIHN5bnRheCwgbm8gYCAtLScgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyBgIGRlbGltaXRlciB3YXMgZm91bmQsIGJlIHN1cmUgeW91IGFyZSBpbnZva2luZyBtZXRlb3ItZGVza3RvcCB3aXRoJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnIGl0IHdoZW4gcGFzc2luZyBjb21tYW5kcyBvciBvcHRpb25zIC0+ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2BucG0gcnVuIGRlc2t0b3AgLS0gY29tbWFuZCAtLW9wdGlvbmBcXG4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIE5vdCBzdXJlIGlmIGBucG1fY29uZmlnX2FyZ3ZgIGlzIGFsd2F5cyBwcmVzZW50Li4uXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIG1ldGVvckRlc2t0b3BGYWN0b3J5KGRkcFVybCwgcHJvZHVjdGlvbiA9IGZhbHNlKSB7XG4gICAgaW5mbyhgTUVURU9SLURFU0tUT1AgdiR7cmVxdWlyZSgnLi8uLi8uLi9wYWNrYWdlLmpzb24nKS52ZXJzaW9ufVxcbmApO1xuXG4gICAgdmVyaWZ5QXJnc1N5bnRheCgpO1xuXG4gICAgY29uc3QgaW5wdXQgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gICAgaWYgKCFpc01ldGVvckFwcChpbnB1dCkpIHtcbiAgICAgICAgZXJyb3IoYG5vdCBpbiBhIG1ldGVvciBhcHAgZGlyXFxuICR7aW5wdXR9YCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgpO1xuICAgIH1cblxuICAgIGlmICghcHJvZ3JhbS5vdXRwdXQpIHtcbiAgICAgICAgcHJvZ3JhbS5vdXRwdXQgPSBpbnB1dDtcbiAgICB9XG5cbiAgICBpZiAocHJvZHVjdGlvbiAmJiAhcHJvZ3JhbS5wcm9kdWN0aW9uKSB7XG4gICAgICAgIGluZm8oJ3BhY2thZ2UvYnVpbGQtaW5zdGFsbGVyIGltcGxpZXMgc2V0dGluZyAtLXByb2R1Y3Rpb24sIHNldHRpbmcgaXQgZm9yIHlvdScpO1xuICAgIH1cblxuICAgIGlmICghcHJvZ3JhbS5idWlsZE1ldGVvcikge1xuICAgICAgICBwcm9ncmFtLnBvcnQgPSBwcm9ncmFtLnBvcnQgfHwgMzAwMDtcbiAgICAgICAgaW5mbyhgUkVNSU5ERVI6IHlvdXIgTWV0ZW9yIHByb2plY3Qgc2hvdWxkIGJlIHJ1bm5pbmcgbm93IG9uIHBvcnQgJHtwcm9ncmFtLnBvcnR9XFxuYCk7XG4gICAgfVxuXG4gICAgaWYgKHByb2dyYW0ucHJvZERlYnVnKSB7XG4gICAgICAgIGluZm8oJyEhIFdBUk5JTkc6IFlvdSBhcmUgYWRkaW5nIGRldlRvb2xzIHRvIGEgcHJvZHVjdGlvbiBidWlsZCAhIVxcbicpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIGRkcFVybCxcbiAgICAgICAgc2tpcE1vYmlsZUJ1aWxkOiBwcm9ncmFtLmJ1aWxkTWV0ZW9yID8gIXByb2dyYW0uYnVpbGRNZXRlb3IgOiB0cnVlLFxuICAgICAgICBwcm9kdWN0aW9uOiBwcm9ncmFtLnByb2R1Y3Rpb24gfHwgcHJvZHVjdGlvblxuICAgIH07XG5cbiAgICBhc3NpZ25JbihvcHRpb25zLCBwcm9ncmFtKTtcblxuICAgIHJldHVybiBtZXRlb3JEZXNrdG9wKFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgcHJvZ3JhbS5vdXRwdXQsXG4gICAgICAgIG9wdGlvbnNcbiAgICApO1xufVxuXG5mdW5jdGlvbiBydW4oZGRwVXJsKSB7XG4gICAgbWV0ZW9yRGVza3RvcEZhY3RvcnkoZ2V0RGRwVXJsKGRkcFVybCkpLnJ1bigpO1xufVxuXG5mdW5jdGlvbiBidWlsZChkZHBVcmwpIHtcbiAgICBtZXRlb3JEZXNrdG9wRmFjdG9yeShnZXREZHBVcmwoZGRwVXJsKSkuYnVpbGQoKTtcbn1cblxuZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBtZXRlb3JEZXNrdG9wRmFjdG9yeSgpLmluaXQoKTtcbn1cblxuZnVuY3Rpb24ganVzdFJ1bigpIHtcbiAgICBtZXRlb3JEZXNrdG9wRmFjdG9yeSgpLmp1c3RSdW4oKTtcbn1cblxuZnVuY3Rpb24gcnVuUGFja2FnZXIoZGRwVXJsKSB7XG4gICAgbWV0ZW9yRGVza3RvcEZhY3RvcnkoZ2V0RGRwVXJsKGRkcFVybCksIHRydWUpLnJ1blBhY2thZ2VyKCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSW5zdGFsbGVyKGRkcFVybCkge1xuICAgIG1ldGVvckRlc2t0b3BGYWN0b3J5KGdldERkcFVybChkZHBVcmwpLCB0cnVlKS5idWlsZEluc3RhbGxlcigpO1xufVxuXG5mdW5jdGlvbiBpbml0VGVzdHNTdXBwb3J0KCkge1xuICAgIGxvZygnaW5zdGFsbGluZyBjcm9zcy1lbnYsIGF2YSwgbWV0ZW9yLWRlc2t0b3AtdGVzdC1zdWl0ZSBhbmQgc3BlY3Ryb24nKTtcbiAgICBsb2coJ3J1bm5pbmcgYG1ldGVvciBucG0gaW5zdGFsbCAtLXNhdmUtZGV2IGNyb3NzLWVudiBhdmEgc3BlY3Ryb24gbWV0ZW9yLWRlc2t0b3AtdGVzdC1zdWl0ZWAnKTtcblxuICAgIGNvbnN0IHsgY29kZSB9ID0gc2hlbGwuZXhlYygnbWV0ZW9yIG5wbSBpbnN0YWxsIC0tc2F2ZS1kZXYgY3Jvc3MtZW52IGF2YSBzcGVjdHJvbiBtZXRlb3ItZGVza3RvcC10ZXN0LXN1aXRlJyk7XG5cbiAgICBpZiAoY29kZSAhPT0gMCkge1xuICAgICAgICB3YXJuKCdjb3VsZCBub3QgYWRkIGNyb3NzLWVudiwgYXZhIGFuZCBzcGVjdHJvbiB0byB5b3VyIGBkZXZEZXBlbmRlbmNpZXNgLCBwbGVhc2UgZG8gaXQnICtcbiAgICAgICAgICAgICcgbWFudWFsbHknKTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXN0ID0gJ2Nyb3NzLWVudiBOT0RFX0VOVj10ZXN0IGF2YSAuZGVza3RvcC8qKi8qLnRlc3QuanMgLXMgLS12ZXJib3NlJztcbiAgICBjb25zdCB0ZXN0V2F0Y2ggPSAnY3Jvc3MtZW52IE5PREVfRU5WPXRlc3QgYXZhIC5kZXNrdG9wLyoqLyoudGVzdC5qcyAtcyAtLXZlcmJvc2UnICtcbiAgICAgICAgJyAtLXdhdGNoIC0tc291cmNlIC5kZXNrdG9wJztcblxuICAgIGZ1bmN0aW9uIGZhaWwoKSB7XG4gICAgICAgIGVycm9yKCdcXG5jb3VsZCBub3QgYWRkIGVudHJpZXMgdG8gYHNjcmlwdHNgIGluIHBhY2thZ2UuanNvbicpO1xuICAgICAgICBsb2coJ3BsZWFzZSB0cnkgdG8gYWRkIGl0IG1hbnVhbGx5XFxuJyk7XG4gICAgICAgIGxvZyhgdGVzdC1kZXNrdG9wOiAke3Rlc3R9YCk7XG4gICAgICAgIGxvZyhgdGVzdC1kZXNrdG9wLXdhdGNoOiAke3Rlc3RXYXRjaH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAncGFja2FnZS5qc29uJylcbiAgICApO1xuXG4gICAgYWRkU2NyaXB0KCd0ZXN0LWRlc2t0b3AnLCB0ZXN0LCBwYWNrYWdlSnNvblBhdGgsIGZhaWwpO1xuICAgIGFkZFNjcmlwdCgndGVzdC1kZXNrdG9wLXdhdGNoJywgdGVzdFdhdGNoLCBwYWNrYWdlSnNvblBhdGgsIGZhaWwpO1xuXG4gICAgbG9nKCdcXG5hZGRlZCB0ZXN0LWRlc2t0b3AgYW5kIHRlc3QtZGVza3RvcC13YXRjaCBlbnRyaWVzJyk7XG4gICAgbG9nKCdydW4gdGhlIHRlc3Qgd2l0aCBgbnBtIHJ1biB0ZXN0LWRlc2t0b3BgJyk7XG59XG5cbnByb2dyYW1cbiAgICAuY29tbWFuZCgnaW5pdCcpXG4gICAgLmRlc2NyaXB0aW9uKCdzY2FmZm9sZHMgLmRlc2t0b3AgZGlyIGluIHRoZSBtZXRlb3IgYXBwJylcbiAgICAuYWN0aW9uKGluaXQpO1xuXG5wcm9ncmFtXG4gICAgLmNvbW1hbmQoJ3J1biBbZGRwX3VybF0nKVxuICAgIC5kZXNjcmlwdGlvbignKGRlZmF1bHQpIGJ1aWxkcyBhbmQgcnVucyBkZXNrdG9wIGFwcCcpXG4gICAgLmFjdGlvbihydW4pO1xuXG5wcm9ncmFtXG4gICAgLmNvbW1hbmQoJ2J1aWxkIFtkZHBfdXJsXScpXG4gICAgLmRlc2NyaXB0aW9uKCdidWlsZHMgeW91ciBkZXNrdG9wIGFwcCcpXG4gICAgLmFjdGlvbihidWlsZCk7XG5cbnByb2dyYW1cbiAgICAuY29tbWFuZCgnYnVpbGQtaW5zdGFsbGVyIFtkZHBfdXJsXScpXG4gICAgLmRlc2NyaXB0aW9uKCdjcmVhdGVzIHRoZSBpbnN0YWxsZXInKVxuICAgIC5hY3Rpb24oYnVpbGRJbnN0YWxsZXIpO1xuXG5wcm9ncmFtXG4gICAgLmNvbW1hbmQoJ2p1c3QtcnVuJylcbiAgICAuZGVzY3JpcHRpb24oJ2FsaWFzIGZvciBydW5uaW5nIGBlbGVjdHJvbiAuYCBpbiBgLm1ldGVvci9kZXNrdG9wLWJ1aWxkYCcpXG4gICAgLmFjdGlvbihqdXN0UnVuKTtcblxucHJvZ3JhbVxuICAgIC5jb21tYW5kKCdwYWNrYWdlIFtkZHBfdXJsXScpXG4gICAgLmRlc2NyaXB0aW9uKCdydW5zIGVsZWN0cm9uIHBhY2thZ2VyJylcbiAgICAuYWN0aW9uKHJ1blBhY2thZ2VyKTtcblxucHJvZ3JhbVxuICAgIC5jb21tYW5kKCdpbml0LXRlc3RzLXN1cHBvcnQnKVxuICAgIC5kZXNjcmlwdGlvbigncHJlcGFyZXMgcHJvamVjdCBmb3IgcnVubmluZyBmdW5jdGlvbmFsIHRlc3RzIG9mIGRlc2t0b3AgYXBwJylcbiAgICAuYWN0aW9uKGluaXRUZXN0c1N1cHBvcnQpO1xuXG5pZiAocHJvY2Vzcy5hcmd2Lmxlbmd0aCA9PT0gMiB8fCAhfignLWh8LS1oZWxwfHJ1bnxpbml0fGJ1aWxkfGJ1aWxkLWluc3RhbGxlcnxqdXN0LXJ1bnxpbml0LXRlc3RzLXN1cHBvcnR8cGFja2FnZScuaW5kZXhPZihjbWQpKVxuKSB7XG4gICAgbGV0IHsgYXJndiB9ID0gcHJvY2VzcztcbiAgICBpZiAocHJvY2Vzcy5hcmd2Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICBhcmd2LnB1c2goJ3J1bicpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBjb21tYW5kID0gYXJndi5zcGxpY2UoMCwgMik7XG4gICAgICAgIGNvbW1hbmQgPSBjb21tYW5kLmNvbmNhdCgncnVuJywgYXJndik7XG4gICAgICAgIGFyZ3YgPSBjb21tYW5kO1xuICAgIH1cbiAgICBwcm9ncmFtLnBhcnNlKGFyZ3YpO1xufSBlbHNlIHtcbiAgICBwcm9ncmFtLnBhcnNlKHByb2Nlc3MuYXJndik7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBOzs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7OztBQUVBLE1BQU07RUFBRUE7QUFBRixJQUFXQyxhQUFqQjtBQUNBLE1BQU1DLEdBQUcsR0FBR0MsT0FBTyxDQUFDQyxJQUFSLENBQWEsQ0FBYixDQUFaO0FBRUE7O0FBQ0EsTUFBTTtFQUNGQyxHQURFO0VBQ0dDLEtBREg7RUFDVUMsSUFEVjtFQUNnQkM7QUFEaEIsSUFFRkMsT0FG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 \ No newline at end of file diff --git a/dist/binaryModulesDetector.js b/dist/binaryModulesDetector.js deleted file mode 100644 index a074f7bb..00000000 --- a/dist/binaryModulesDetector.js +++ /dev/null @@ -1,80 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; - -var _path = _interopRequireDefault(require("path")); - -var _isbinaryfile = _interopRequireDefault(require("isbinaryfile")); - -var _shelljs = _interopRequireDefault(require("shelljs")); - -var _log = _interopRequireDefault(require("./log")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -_shelljs.default.config.fatal = true; -/** - * Experimental module for detecting modules containing binary files. - * Based on the same functionality from electron-builder. - * - * @property {MeteorDesktop} $ - * @class - */ - -class BinaryModulesDetector { - /** - * @constructor - */ - constructor(nodeModulesPath) { - this.log = new _log.default('binaryModulesDetector'); - this.nodeModulesPath = nodeModulesPath; - } // TODO: make asynchronous - - - detect() { - this.log.verbose('detecting node modules with binary files'); - - const files = _shelljs.default.ls('-RAl', this.nodeModulesPath); - - const extract = []; - files.forEach(file => { - const pathSplit = file.name.split(_path.default.posix.sep); - const dir = pathSplit[0]; - const filename = pathSplit.pop(); - - if (extract.indexOf(dir) === -1 && !BinaryModulesDetector.shouldBeIgnored(dir, filename)) { - if (file.isFile()) { - let shouldUnpack = false; - - if (file.name.endsWith('.dll') || file.name.endsWith('.exe') || file.name.endsWith('.dylib')) { - shouldUnpack = true; - } else if (_path.default.extname(file.name) === '') { - shouldUnpack = _isbinaryfile.default.sync(_path.default.join(this.nodeModulesPath, file.name)); - } - - if (shouldUnpack) { - this.log.debug(`binary file: ${file.name}`); - extract.push(dir); - } - } - } - }); - - if (extract.length > 0) { - this.log.verbose(`detected modules to be extracted: ${extract.join(', ')}`); - } - - return extract; - } - - static shouldBeIgnored(dir, filename) { - return dir === '.bin' || filename === '.DS_Store' || filename === 'LICENSE' || filename === 'README'; - } - -} - -exports.default = BinaryModulesDetector; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzaGVsbCIsImNvbmZpZyIsImZhdGFsIiwiQmluYXJ5TW9kdWxlc0RldGVjdG9yIiwiY29uc3RydWN0b3IiLCJub2RlTW9kdWxlc1BhdGgiLCJsb2ciLCJMb2ciLCJkZXRlY3QiLCJ2ZXJib3NlIiwiZmlsZXMiLCJscyIsImV4dHJhY3QiLCJmb3JFYWNoIiwiZmlsZSIsInBhdGhTcGxpdCIsIm5hbWUiLCJzcGxpdCIsInBhdGgiLCJwb3NpeCIsInNlcCIsImRpciIsImZpbGVuYW1lIiwicG9wIiwiaW5kZXhPZiIsInNob3VsZEJlSWdub3JlZCIsImlzRmlsZSIsInNob3VsZFVucGFjayIsImVuZHNXaXRoIiwiZXh0bmFtZSIsImlzQmluYXJ5RmlsZSIsInN5bmMiLCJqb2luIiwiZGVidWciLCJwdXNoIiwibGVuZ3RoIl0sInNvdXJjZXMiOlsiLi4vbGliL2JpbmFyeU1vZHVsZXNEZXRlY3Rvci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBpc0JpbmFyeUZpbGUgZnJvbSAnaXNiaW5hcnlmaWxlJztcbmltcG9ydCBzaGVsbCBmcm9tICdzaGVsbGpzJztcblxuaW1wb3J0IExvZyBmcm9tICcuL2xvZyc7XG5cbnNoZWxsLmNvbmZpZy5mYXRhbCA9IHRydWU7XG4vKipcbiAqIEV4cGVyaW1lbnRhbCBtb2R1bGUgZm9yIGRldGVjdGluZyBtb2R1bGVzIGNvbnRhaW5pbmcgYmluYXJ5IGZpbGVzLlxuICogQmFzZWQgb24gdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBmcm9tIGVsZWN0cm9uLWJ1aWxkZXIuXG4gKlxuICogQHByb3BlcnR5IHtNZXRlb3JEZXNrdG9wfSAkXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmluYXJ5TW9kdWxlc0RldGVjdG9yIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihub2RlTW9kdWxlc1BhdGgpIHtcbiAgICAgICAgdGhpcy5sb2cgPSBuZXcgTG9nKCdiaW5hcnlNb2R1bGVzRGV0ZWN0b3InKTtcbiAgICAgICAgdGhpcy5ub2RlTW9kdWxlc1BhdGggPSBub2RlTW9kdWxlc1BhdGg7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogbWFrZSBhc3luY2hyb25vdXNcbiAgICBkZXRlY3QoKSB7XG4gICAgICAgIHRoaXMubG9nLnZlcmJvc2UoJ2RldGVjdGluZyBub2RlIG1vZHVsZXMgd2l0aCBiaW5hcnkgZmlsZXMnKTtcbiAgICAgICAgY29uc3QgZmlsZXMgPSBzaGVsbC5scygnLVJBbCcsIHRoaXMubm9kZU1vZHVsZXNQYXRoKTtcblxuICAgICAgICBjb25zdCBleHRyYWN0ID0gW107XG5cbiAgICAgICAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF0aFNwbGl0ID0gZmlsZS5uYW1lLnNwbGl0KHBhdGgucG9zaXguc2VwKTtcbiAgICAgICAgICAgIGNvbnN0IGRpciA9IHBhdGhTcGxpdFswXTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aFNwbGl0LnBvcCgpO1xuXG4gICAgICAgICAgICBpZiAoZXh0cmFjdC5pbmRleE9mKGRpcikgPT09IC0xICYmXG4gICAgICAgICAgICAgICAgIUJpbmFyeU1vZHVsZXNEZXRlY3Rvci5zaG91bGRCZUlnbm9yZWQoZGlyLCBmaWxlbmFtZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGlmIChmaWxlLmlzRmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzaG91bGRVbnBhY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUubmFtZS5lbmRzV2l0aCgnLmRsbCcpIHx8IGZpbGUubmFtZS5lbmRzV2l0aCgnLmV4ZScpIHx8IGZpbGUubmFtZS5lbmRzV2l0aCgnLmR5bGliJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFVucGFjayA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aC5leHRuYW1lKGZpbGUubmFtZSkgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRVbnBhY2sgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQmluYXJ5RmlsZS5zeW5jKHBhdGguam9pbih0aGlzLm5vZGVNb2R1bGVzUGF0aCwgZmlsZS5uYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFVucGFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoYGJpbmFyeSBmaWxlOiAke2ZpbGUubmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3QucHVzaChkaXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGV4dHJhY3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5sb2cudmVyYm9zZShgZGV0ZWN0ZWQgbW9kdWxlcyB0byBiZSBleHRyYWN0ZWQ6ICR7ZXh0cmFjdC5qb2luKCcsICcpfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBleHRyYWN0O1xuICAgIH1cblxuICAgIHN0YXRpYyBzaG91bGRCZUlnbm9yZWQoZGlyLCBmaWxlbmFtZSkge1xuICAgICAgICByZXR1cm4gZGlyID09PSAnLmJpbicgfHwgZmlsZW5hbWUgPT09ICcuRFNfU3RvcmUnIHx8IGZpbGVuYW1lID09PSAnTElDRU5TRScgfHwgZmlsZW5hbWUgPT09ICdSRUFETUUnO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUVBOzs7O0FBRUFBLGdCQUFBLENBQU1DLE1BQU4sQ0FBYUMsS0FBYixHQUFxQixJQUFyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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 \ No newline at end of file diff --git a/dist/defaultDependencies.js b/dist/defaultDependencies.js deleted file mode 100644 index c5232dcc..00000000 --- a/dist/defaultDependencies.js +++ /dev/null @@ -1,8 +0,0 @@ -"use strict"; - -module.exports = { - electron: '11.5.0', - 'electron-builder': '23.3.1', - 'electron-packager': '15.4.0' -}; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwiZWxlY3Ryb24iXSwic291cmNlcyI6WyIuLi9saWIvZGVmYXVsdERlcGVuZGVuY2llcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBlbGVjdHJvbjogJzExLjUuMCcsXG4gICAgJ2VsZWN0cm9uLWJ1aWxkZXInOiAnMjMuMy4xJyxcbiAgICAnZWxlY3Ryb24tcGFja2FnZXInOiAnMTUuNC4wJ1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQUEsTUFBTSxDQUFDQyxPQUFQLEdBQWlCO0VBQ2JDLFFBQVEsRUFBRSxRQURHO0VBRWIsb0JBQW9CLFFBRlA7RUFHYixxQkFBcUI7QUFIUixDQUFqQiJ9 \ No newline at end of file diff --git a/dist/dependenciesManager.js b/dist/dependenciesManager.js deleted file mode 100644 index d5d4ac90..00000000 --- a/dist/dependenciesManager.js +++ /dev/null @@ -1,181 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; - -var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime")); - -var _lodash = require("lodash"); - -var _log = _interopRequireDefault(require("./log")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -// eslint-disable-next-line no-unused-vars - -/** - * Utility class designed for merging dependencies list with simple validation and duplicate - * detection. - * - * @class - */ -class DependenciesManager { - /** - * @param {MeteorDesktop} $ - context - * @param {Object} defaultDependencies - core dependencies list - * @constructor - */ - constructor($, defaultDependencies) { - this.log = new _log.default('dependenciesManager'); - this.$ = $; - this.dependencies = defaultDependencies; // Regexes for matching certain types of dependencies version. - // https://docs.npmjs.com/files/package.json#dependencies - - this.regexes = { - local: /^(\.\.\/|~\/|\.\/|\/)/, - git: /^git(\+(ssh|http)s?)?/, - github: /^\w+-?\w+(?!-)\//, - http: /^https?.+tar\.gz/, - file: /^file:/ - }; // Check for commit hashes. - - const gitCheck = { - type: 'regex', - regex: /#[a-f0-9]{7,40}/, - test: 'match', - message: 'git or github link must have a commit hash' - }; // Check for displaying warnings when npm package from local path is used. - - const localCheck = { - onceName: 'localCheck', - type: 'warning', - message: 'using dependencies from local paths is permitted' + ' but dangerous - read more in README.md' - }; - this.checks = { - local: localCheck, - file: localCheck, - git: gitCheck, - github: gitCheck, - version: { - type: 'regex', - // Matches all the semver ranges operators, empty strings and `*`. - regex: /[\^|><= ~-]|\.x|^$|^\*$/, - test: 'do not match', - message: 'semver ranges are forbidden, please specify exact version' - } - }; - } - /** - * Just a public getter. - * @returns {Object} - */ - - - getDependencies() { - return this.dependencies; - } - /** - * Returns local dependencies. - * @returns {Object} - */ - - - getLocalDependencies() { - return Object.keys(this.dependencies).filter(dependency => this.regexes.local.test(this.dependencies[dependency]) || this.regexes.file.test(this.dependencies[dependency])).reduce((localDependencies, currentDependency) => Object.assign(localDependencies, { - [currentDependency]: this.dependencies[currentDependency] - }), {}); - } - /** - * Returns remote dependencies. - * @returns {Object} - */ - - - getRemoteDependencies() { - return Object.keys(this.dependencies).filter(dependency => !this.regexes.local.test(this.dependencies[dependency]) && !this.regexes.file.test(this.dependencies[dependency])).reduce((localDependencies, currentDependency) => Object.assign(localDependencies, { - [currentDependency]: this.dependencies[currentDependency] - }), {}); - } - /** - * Merges dependencies into one list. - * - * @param {string} from - describes where the dependencies were set - * @param {Object} dependencies - dependencies list - */ - - - mergeDependencies(from, dependencies) { - if (this.validateDependenciesVersions(from, dependencies)) { - this.detectDuplicatedDependencies(from, dependencies); - (0, _lodash.assignIn)(this.dependencies, dependencies); - } - } - /** - * Detects dependency version type. - * @param {string} version - version string of the dependency - * @return {string} - */ - - - detectDependencyVersionType(version) { - const type = Object.keys(this.regexes).find(dependencyType => this.regexes[dependencyType].test(version)); - return type || 'version'; - } - /** - * Validates semver and detect ranges. - * - * @param {string} from - describes where the dependencies were set - * @param {Object} dependencies - dependencies list - */ - - - validateDependenciesVersions(from, dependencies) { - const warningsShown = {}; - (0, _lodash.forEach)(dependencies, (version, name) => { - const type = this.detectDependencyVersionType(version); - - if (this.checks[type]) { - const check = this.checks[type]; - - if (check.type === 'regex') { - const checkResult = check.test === 'match' ? this.checks[type].regex.test(version) : !this.checks[type].regex.test(version); - - if (!checkResult) { - throw new Error(`dependency ${name}:${version} from ${from} failed version ` + `check with message: ${this.checks[type].message}`); - } - } - - if (check.type === 'warning' && !warningsShown[check.onceName]) { - warningsShown[check.onceName] = true; - this.log.warn(`dependency ${name}:${version} from ${from} caused a` + ` warning: ${check.message}`); - } - } - }); - return true; - } - /** - * Detects duplicates. - * - * @param {string} from - describes where the dependencies were set - * @param {Object} dependencies - dependencies list - */ - - - detectDuplicatedDependencies(from, dependencies) { - const duplicates = (0, _lodash.intersection)(Object.keys(dependencies), Object.keys(this.dependencies)); - - if (duplicates.length > 0) { - duplicates.forEach(name => { - if (dependencies[name] !== this.dependencies[name]) { - throw new Error(`While processing dependencies from ${from}, a dependency ` + `${name}: ${dependencies[name]} was found to be conflicting with a ` + `dependency (${this.dependencies[name]}) that was already declared in ` + 'other module or it is used in core of the electron app.'); - } - }); - } - } - -} - -exports.default = DependenciesManager; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEZXBlbmRlbmNpZXNNYW5hZ2VyIiwiY29uc3RydWN0b3IiLCIkIiwiZGVmYXVsdERlcGVuZGVuY2llcyIsImxvZyIsIkxvZyIsImRlcGVuZGVuY2llcyIsInJlZ2V4ZXMiLCJsb2NhbCIsImdpdCIsImdpdGh1YiIsImh0dHAiLCJmaWxlIiwiZ2l0Q2hlY2siLCJ0eXBlIiwicmVnZXgiLCJ0ZXN0IiwibWVzc2FnZSIsImxvY2FsQ2hlY2siLCJvbmNlTmFtZSIsImNoZWNrcyIsInZlcnNpb24iLCJnZXREZXBlbmRlbmNpZXMiLCJnZXRMb2NhbERlcGVuZGVuY2llcyIsIk9iamVjdCIsImtleXMiLCJmaWx0ZXIiLCJkZXBlbmRlbmN5IiwicmVkdWNlIiwibG9jYWxEZXBlbmRlbmNpZXMiLCJjdXJyZW50RGVwZW5kZW5jeSIsImFzc2lnbiIsImdldFJlbW90ZURlcGVuZGVuY2llcyIsIm1lcmdlRGVwZW5kZW5jaWVzIiwiZnJvbSIsInZhbGlkYXRlRGVwZW5kZW5jaWVzVmVyc2lvbnMiLCJkZXRlY3REdXBsaWNhdGVkRGVwZW5kZW5jaWVzIiwiYXNzaWduSW4iLCJkZXRlY3REZXBlbmRlbmN5VmVyc2lvblR5cGUiLCJmaW5kIiwiZGVwZW5kZW5jeVR5cGUiLCJ3YXJuaW5nc1Nob3duIiwiZm9yRWFjaCIsIm5hbWUiLCJjaGVjayIsImNoZWNrUmVzdWx0IiwiRXJyb3IiLCJ3YXJuIiwiZHVwbGljYXRlcyIsImludGVyc2VjdGlvbiIsImxlbmd0aCJdLCJzb3VyY2VzIjpbIi4uL2xpYi9kZXBlbmRlbmNpZXNNYW5hZ2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuaW1wb3J0IHJlZ2VuZXJhdG9yUnVudGltZSBmcm9tICdyZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUnO1xuaW1wb3J0IHsgZm9yRWFjaCwgYXNzaWduSW4sIGludGVyc2VjdGlvbiB9IGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCBMb2cgZnJvbSAnLi9sb2cnO1xuXG4vKipcbiAqIFV0aWxpdHkgY2xhc3MgZGVzaWduZWQgZm9yIG1lcmdpbmcgZGVwZW5kZW5jaWVzIGxpc3Qgd2l0aCBzaW1wbGUgdmFsaWRhdGlvbiBhbmQgZHVwbGljYXRlXG4gKiBkZXRlY3Rpb24uXG4gKlxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERlcGVuZGVuY2llc01hbmFnZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TWV0ZW9yRGVza3RvcH0gJCAgICAgICAgICAgICAgICAgICAtIGNvbnRleHRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gICAgICAgIGRlZmF1bHREZXBlbmRlbmNpZXMgLSBjb3JlIGRlcGVuZGVuY2llcyBsaXN0XG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoJCwgZGVmYXVsdERlcGVuZGVuY2llcykge1xuICAgICAgICB0aGlzLmxvZyA9IG5ldyBMb2coJ2RlcGVuZGVuY2llc01hbmFnZXInKTtcbiAgICAgICAgdGhpcy4kID0gJDtcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBkZWZhdWx0RGVwZW5kZW5jaWVzO1xuXG4gICAgICAgIC8vIFJlZ2V4ZXMgZm9yIG1hdGNoaW5nIGNlcnRhaW4gdHlwZXMgb2YgZGVwZW5kZW5jaWVzIHZlcnNpb24uXG4gICAgICAgIC8vIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vZmlsZXMvcGFja2FnZS5qc29uI2RlcGVuZGVuY2llc1xuICAgICAgICB0aGlzLnJlZ2V4ZXMgPSB7XG4gICAgICAgICAgICBsb2NhbDogL14oXFwuXFwuXFwvfH5cXC98XFwuXFwvfFxcLykvLFxuICAgICAgICAgICAgZ2l0OiAvXmdpdChcXCsoc3NofGh0dHApcz8pPy8sXG4gICAgICAgICAgICBnaXRodWI6IC9eXFx3Ky0/XFx3Kyg/IS0pXFwvLyxcbiAgICAgICAgICAgIGh0dHA6IC9eaHR0cHM/Lit0YXJcXC5nei8sXG4gICAgICAgICAgICBmaWxlOiAvXmZpbGU6L1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBjb21taXQgaGFzaGVzLlxuICAgICAgICBjb25zdCBnaXRDaGVjayA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdyZWdleCcsXG4gICAgICAgICAgICByZWdleDogLyNbYS1mMC05XXs3LDQwfS8sXG4gICAgICAgICAgICB0ZXN0OiAnbWF0Y2gnLFxuICAgICAgICAgICAgbWVzc2FnZTogJ2dpdCBvciBnaXRodWIgbGluayBtdXN0IGhhdmUgYSBjb21taXQgaGFzaCdcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBDaGVjayBmb3IgZGlzcGxheWluZyB3YXJuaW5ncyB3aGVuIG5wbSBwYWNrYWdlIGZyb20gbG9jYWwgcGF0aCBpcyB1c2VkLlxuICAgICAgICBjb25zdCBsb2NhbENoZWNrID0ge1xuICAgICAgICAgICAgb25jZU5hbWU6ICdsb2NhbENoZWNrJyxcbiAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICd1c2luZyBkZXBlbmRlbmNpZXMgZnJvbSBsb2NhbCBwYXRocyBpcyBwZXJtaXR0ZWQnICtcbiAgICAgICAgICAgICcgYnV0IGRhbmdlcm91cyAtIHJlYWQgbW9yZSBpbiBSRUFETUUubWQnXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5jaGVja3MgPSB7XG4gICAgICAgICAgICBsb2NhbDogbG9jYWxDaGVjayxcbiAgICAgICAgICAgIGZpbGU6IGxvY2FsQ2hlY2ssXG4gICAgICAgICAgICBnaXQ6IGdpdENoZWNrLFxuICAgICAgICAgICAgZ2l0aHViOiBnaXRDaGVjayxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAncmVnZXgnLFxuICAgICAgICAgICAgICAgIC8vIE1hdGNoZXMgYWxsIHRoZSBzZW12ZXIgcmFuZ2VzIG9wZXJhdG9ycywgZW1wdHkgc3RyaW5ncyBhbmQgYCpgLlxuICAgICAgICAgICAgICAgIHJlZ2V4OiAvW1xcXnw+PD0gfi1dfFxcLnh8XiR8XlxcKiQvLFxuICAgICAgICAgICAgICAgIHRlc3Q6ICdkbyBub3QgbWF0Y2gnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdzZW12ZXIgcmFuZ2VzIGFyZSBmb3JiaWRkZW4sIHBsZWFzZSBzcGVjaWZ5IGV4YWN0IHZlcnNpb24nXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSnVzdCBhIHB1YmxpYyBnZXR0ZXIuXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBnZXREZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlcGVuZGVuY2llcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGxvY2FsIGRlcGVuZGVuY2llcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGdldExvY2FsRGVwZW5kZW5jaWVzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0XG4gICAgICAgICAgICAua2V5cyh0aGlzLmRlcGVuZGVuY2llcylcbiAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgZGVwZW5kZW5jeSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2V4ZXMubG9jYWwudGVzdCh0aGlzLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWdleGVzLmZpbGUudGVzdCh0aGlzLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKGxvY2FsRGVwZW5kZW5jaWVzLCBjdXJyZW50RGVwZW5kZW5jeSkgPT5cbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGVwZW5kZW5jaWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBbY3VycmVudERlcGVuZGVuY3ldOiB0aGlzLmRlcGVuZGVuY2llc1tjdXJyZW50RGVwZW5kZW5jeV0gfVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHt9XG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgcmVtb3RlIGRlcGVuZGVuY2llcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGdldFJlbW90ZURlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdFxuICAgICAgICAgICAgLmtleXModGhpcy5kZXBlbmRlbmNpZXMpXG4gICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kgPT5cbiAgICAgICAgICAgICAgICAgICAgIXRoaXMucmVnZXhlcy5sb2NhbC50ZXN0KHRoaXMuZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSAmJlxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5yZWdleGVzLmZpbGUudGVzdCh0aGlzLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKGxvY2FsRGVwZW5kZW5jaWVzLCBjdXJyZW50RGVwZW5kZW5jeSkgPT5cbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGVwZW5kZW5jaWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBbY3VycmVudERlcGVuZGVuY3ldOiB0aGlzLmRlcGVuZGVuY2llc1tjdXJyZW50RGVwZW5kZW5jeV0gfVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHt9XG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlcyBkZXBlbmRlbmNpZXMgaW50byBvbmUgbGlzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tICAgICAgICAgLSBkZXNjcmliZXMgd2hlcmUgdGhlIGRlcGVuZGVuY2llcyB3ZXJlIHNldFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXBlbmRlbmNpZXMgLSBkZXBlbmRlbmNpZXMgbGlzdFxuICAgICAqL1xuICAgIG1lcmdlRGVwZW5kZW5jaWVzKGZyb20sIGRlcGVuZGVuY2llcykge1xuICAgICAgICBpZiAodGhpcy52YWxpZGF0ZURlcGVuZGVuY2llc1ZlcnNpb25zKGZyb20sIGRlcGVuZGVuY2llcykpIHtcbiAgICAgICAgICAgIHRoaXMuZGV0ZWN0RHVwbGljYXRlZERlcGVuZGVuY2llcyhmcm9tLCBkZXBlbmRlbmNpZXMpO1xuICAgICAgICAgICAgYXNzaWduSW4odGhpcy5kZXBlbmRlbmNpZXMsIGRlcGVuZGVuY2llcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlY3RzIGRlcGVuZGVuY3kgdmVyc2lvbiB0eXBlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gdmVyc2lvbiBzdHJpbmcgb2YgdGhlIGRlcGVuZGVuY3lcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICovXG4gICAgZGV0ZWN0RGVwZW5kZW5jeVZlcnNpb25UeXBlKHZlcnNpb24pIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IE9iamVjdC5rZXlzKHRoaXMucmVnZXhlcylcbiAgICAgICAgICAgIC5maW5kKGRlcGVuZGVuY3lUeXBlID0+IHRoaXMucmVnZXhlc1tkZXBlbmRlbmN5VHlwZV0udGVzdCh2ZXJzaW9uKSk7XG4gICAgICAgIHJldHVybiB0eXBlIHx8ICd2ZXJzaW9uJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZXMgc2VtdmVyIGFuZCBkZXRlY3QgcmFuZ2VzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZyb20gICAgICAgICAtIGRlc2NyaWJlcyB3aGVyZSB0aGUgZGVwZW5kZW5jaWVzIHdlcmUgc2V0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRlcGVuZGVuY2llcyAtIGRlcGVuZGVuY2llcyBsaXN0XG4gICAgICovXG4gICAgdmFsaWRhdGVEZXBlbmRlbmNpZXNWZXJzaW9ucyhmcm9tLCBkZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgY29uc3Qgd2FybmluZ3NTaG93biA9IHt9O1xuICAgICAgICBmb3JFYWNoKGRlcGVuZGVuY2llcywgKHZlcnNpb24sIG5hbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLmRldGVjdERlcGVuZGVuY3lWZXJzaW9uVHlwZSh2ZXJzaW9uKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrc1t0eXBlXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrID0gdGhpcy5jaGVja3NbdHlwZV07XG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrLnR5cGUgPT09ICdyZWdleCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tSZXN1bHQgPSBjaGVjay50ZXN0ID09PSAnbWF0Y2gnID9cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tzW3R5cGVdLnJlZ2V4LnRlc3QodmVyc2lvbikgOlxuICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuY2hlY2tzW3R5cGVdLnJlZ2V4LnRlc3QodmVyc2lvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2tSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZGVwZW5kZW5jeSAke25hbWV9OiR7dmVyc2lvbn0gZnJvbSAke2Zyb219IGZhaWxlZCB2ZXJzaW9uIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBjaGVjayB3aXRoIG1lc3NhZ2U6ICR7dGhpcy5jaGVja3NbdHlwZV0ubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2hlY2sudHlwZSA9PT0gJ3dhcm5pbmcnICYmICF3YXJuaW5nc1Nob3duW2NoZWNrLm9uY2VOYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICB3YXJuaW5nc1Nob3duW2NoZWNrLm9uY2VOYW1lXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLndhcm4oYGRlcGVuZGVuY3kgJHtuYW1lfToke3ZlcnNpb259IGZyb20gJHtmcm9tfSBjYXVzZWQgYWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCB3YXJuaW5nOiAke2NoZWNrLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZWN0cyBkdXBsaWNhdGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZyb20gICAgICAgICAtIGRlc2NyaWJlcyB3aGVyZSB0aGUgZGVwZW5kZW5jaWVzIHdlcmUgc2V0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRlcGVuZGVuY2llcyAtIGRlcGVuZGVuY2llcyBsaXN0XG4gICAgICovXG4gICAgZGV0ZWN0RHVwbGljYXRlZERlcGVuZGVuY2llcyhmcm9tLCBkZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgY29uc3QgZHVwbGljYXRlcyA9IGludGVyc2VjdGlvbihPYmplY3Qua2V5cyhkZXBlbmRlbmNpZXMpLCBPYmplY3Qua2V5cyh0aGlzLmRlcGVuZGVuY2llcykpO1xuICAgICAgICBpZiAoZHVwbGljYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkdXBsaWNhdGVzLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzW25hbWVdICE9PSB0aGlzLmRlcGVuZGVuY2llc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFdoaWxlIHByb2Nlc3NpbmcgZGVwZW5kZW5jaWVzIGZyb20gJHtmcm9tfSwgYSBkZXBlbmRlbmN5IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCR7bmFtZX06ICR7ZGVwZW5kZW5jaWVzW25hbWVdfSB3YXMgZm91bmQgdG8gYmUgY29uZmxpY3Rpbmcgd2l0aCBhIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYGRlcGVuZGVuY3kgKCR7dGhpcy5kZXBlbmRlbmNpZXNbbmFtZV19KSB0aGF0IHdhcyBhbHJlYWR5IGRlY2xhcmVkIGluIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ290aGVyIG1vZHVsZSBvciBpdCBpcyB1c2VkIGluIGNvcmUgb2YgdGhlIGVsZWN0cm9uIGFwcC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUNBOztBQUNBOztBQUVBOzs7O0FBSkE7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2UsTUFBTUEsbUJBQU4sQ0FBMEI7RUFDckM7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUNJQyxXQUFXLENBQUNDLENBQUQsRUFBSUMsbUJBQUosRUFBeUI7SUFDaEMsS0FBS0MsR0FBTCxHQUFXLElBQUlDLFlBQUosQ0FBUSxxQkFBUixDQUFYO0lBQ0EsS0FBS0gsQ0FBTCxHQUFTQSxDQUFUO0lBQ0EsS0FBS0ksWUFBTCxHQUFvQkgsbUJBQXBCLENBSGdDLENBS2hDO0lBQ0E7O0lBQ0EsS0FBS0ksT0FBTCxHQUFlO01BQ1hDLEtBQUssRUFBRSx1QkFESTtNQUVYQyxHQUFHLEVBQUUsdUJBRk07TUFHWEMsTUFBTSxFQUFFLGtCQUhHO01BSVhDLElBQUksRUFBRSxrQkFKSztNQUtYQyxJQUFJLEVBQUU7SUFMSyxDQUFmLENBUGdDLENBZWhDOztJQUNBLE1BQU1DLFFBQVEsR0FBRztNQUNiQyxJQUFJ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 \ No newline at end of file diff --git a/dist/desktop.js b/dist/desktop.js deleted file mode 100644 index 3a5f1cd9..00000000 --- a/dist/desktop.js +++ /dev/null @@ -1,271 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; - -var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime")); - -var _shelljs = _interopRequireDefault(require("shelljs")); - -var _fs = _interopRequireDefault(require("fs")); - -var _path = _interopRequireDefault(require("path")); - -var _log = _interopRequireDefault(require("./log")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -// eslint-disable-next-line no-unused-vars -_shelljs.default.config.fatal = true; -/** - * Checks if the path is empty. - * @param {string} searchPath - * @returns {boolean} - */ - -function isEmptySync(searchPath) { - let stat; - - try { - stat = _fs.default.statSync(searchPath); - } catch (e) { - return true; - } - - if (stat.isDirectory()) { - const items = _fs.default.readdirSync(searchPath); - - return !items || !items.length; - } - - return false; -} -/** - * Represents the .desktop directory. - * @class - * @property {desktopSettings} settings - */ - - -class Desktop { - /** - * @param {MeteorDesktop} $ - context - * - * @constructor - */ - constructor($) { - this.$ = $; - this.log = new _log.default('desktop'); - this.settings = null; - this.dependencies = null; - } - /** - * Tries to read and returns settings.json contents from .desktop dir. - * - * @returns {desktopSettings|null} - */ - - - getSettings() { - if (!this.settings) { - try { - this.settings = JSON.parse(_fs.default.readFileSync(this.$.env.paths.desktop.settings, 'UTF-8')); - } catch (e) { - this.log.error('error while trying to read \'.desktop/settings.json\': ', e); - process.exit(1); - } - } - - return this.settings; - } - /** - * Returns a version hash representing current .desktop contents. - * @returns {string} - */ - - - async getHashVersion() { - this.log.info('calculating hash version from .desktop contents'); - const version = await this.$.utils.readFilesAndComputeHash(this.$.env.paths.desktop.root); - this.log.verbose(`calculated .desktop hash version is ${version.hash}`); - return version.hash; - } - /** - * Tries to read a module.json file from a module at provided path. - * - * @param {string} modulePath - path to the module dir - * @returns {Object} - */ - - - getModuleConfig(modulePath) { - let moduleConfig = {}; - - try { - moduleConfig = JSON.parse(_fs.default.readFileSync(_path.default.join(modulePath, 'module.json'), 'UTF-8')); - } catch (e) { - this.log.error(`error while trying to read 'module.json' from '${modulePath}' module: `, e); - process.exit(1); - } - - if (!('name' in moduleConfig)) { - this.log.error(`no 'name' field defined in 'module.json' in '${modulePath}' module.`); - process.exit(1); - } - - return moduleConfig; - } - /** - * Scans all modules for module.json and gathers this configuration altogether. - * - * @returns {[]} - */ - - - gatherModuleConfigs() { - const configs = []; - - if (!isEmptySync(this.$.env.paths.desktop.modules)) { - _shelljs.default.ls('-d', _path.default.join(this.$.env.paths.desktop.modules, '*')).forEach(module => { - if (_fs.default.lstatSync(module).isDirectory()) { - const moduleConfig = this.getModuleConfig(module); - moduleConfig.dirName = _path.default.parse(module).name; - configs.push(moduleConfig); - } - }); - } - - return configs; - } - /** - * Summarizes all dependencies defined in .desktop. - * - * @params {Object} settings - settings.json - * @params {boolean} checkModules - whether to gather modules dependencies - * @params {boolean} refresh - recompute - * @returns {{fromSettings: {}, plugins: {}, modules: {}}} - */ - - - getDependencies(settings = null, checkModules = true, refresh = false) { - if (!refresh && this.dependencies) { - return this.dependencies; - } - - const dependencies = { - fromSettings: {}, - plugins: {}, - modules: {} - }; - /** @type {desktopSettings} * */ - - const settingsJson = settings || this.getSettings(); // Settings can have a 'dependencies' field. - - if ('dependencies' in settingsJson) { - dependencies.fromSettings = settingsJson.dependencies; - } // Plugins are also a npm packages. - - - if ('plugins' in settingsJson) { - dependencies.plugins = Object.keys(settingsJson.plugins).reduce((plugins, plugin) => { - /* eslint-disable no-param-reassign */ - if (typeof settingsJson.plugins[plugin] === 'object') { - plugins[plugin] = settingsJson.plugins[plugin].version; - } else { - plugins[plugin] = settingsJson.plugins[plugin]; - } - - return plugins; - }, {}); - } // Each module can have its own dependencies defined. - - - const moduleDependencies = {}; - - if (checkModules) { - const configs = this.gatherModuleConfigs(); - configs.forEach(moduleConfig => { - if (!('dependencies' in moduleConfig)) { - moduleConfig.dependencies = {}; - } - - if (moduleConfig.name in moduleDependencies) { - this.log.error(`duplicate name '${moduleConfig.name}' in 'module.json' in ` + `'${moduleConfig.dirName}' - another module already registered the same name.`); - process.exit(1); - } - - moduleDependencies[moduleConfig.name] = moduleConfig.dependencies; - }); - } - - dependencies.modules = moduleDependencies; - this.dependencies = dependencies; - return dependencies; - } - /** - * Copies the .desktop scaffold into the meteor app dir. - * Adds entry to .meteor/.gitignore. - */ - - - scaffold() { - this.log.info('creating .desktop scaffold in your project'); - - if (this.$.utils.exists(this.$.env.paths.desktop.root)) { - this.log.warn('.desktop already exists - delete it if you want a new one to be ' + 'created'); - return; - } - - _shelljs.default.cp('-r', this.$.env.paths.scaffold, this.$.env.paths.desktop.root); - - _shelljs.default.mkdir(this.$.env.paths.desktop.import); - - this.log.info('.desktop directory prepared'); - } - /** - * Verifies if all mandatory files are present in the .desktop. - * - * @returns {boolean} - */ - - - check() { - this.log.verbose('checking .desktop existence'); - return !!(this.$.utils.exists(this.$.env.paths.desktop.root) && this.$.utils.exists(this.$.env.paths.desktop.settings) && this.$.utils.exists(this.$.env.paths.desktop.desktop)); - } - -} -/** - * @typedef {Object} desktopSettings - * @property {string} name - * @property {string} projectName - * @property {boolean} devTools - * @property {boolean} devtron - * @property {boolean} desktopHCP - * @property {Object} squirrel - * @property {string} squirrel.autoUpdateFeedUrl - * @property {Object} squirrel.autoUpdateFeedHeaders - * @property {Object} squirrel.autoUpdateCheckOnStart - * @property {Object} desktopHCPSettings - * @property {boolean} desktopHCPSettings.ignoreCompatibilityVersion - * @property {boolean} desktopHCPSettings.blockAppUpdateOnDesktopIncompatibility - * @property {number} webAppStartupTimeout - * @property {Array} linkPackages - * @property {Array} exposedModules - * @property {Object} window - * @property {Object} windowDev - * @property {Object} packageJsonFields - * @property {Object} builderOptions - * @property {Object} builderCliOptions - * @property {Object} packagerOptions - * @property {Object} plugins - * @property {Object} dependencies - * @property {boolean} uglify - * @property {string} version - * */ - - -exports.default = Desktop; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzaGVsbCIsImNvbmZpZyIsImZhdGFsIiwiaXNFbXB0eVN5bmMiLCJzZWFyY2hQYXRoIiwic3RhdCIsImZzIiwic3RhdFN5bmMiLCJlIiwiaXNEaXJlY3RvcnkiLCJpdGVtcyIsInJlYWRkaXJTeW5jIiwibGVuZ3RoIiwiRGVza3RvcCIsImNvbnN0cnVjdG9yIiwiJCIsImxvZyIsIkxvZyIsInNldHRpbmdzIiwiZGVwZW5kZW5jaWVzIiwiZ2V0U2V0dGluZ3MiLCJKU09OIiwicGFyc2UiLCJyZWFkRmlsZVN5bmMiLCJlbnYiLCJwYXRocyIsImRlc2t0b3AiLCJlcnJvciIsInByb2Nlc3MiLCJleGl0IiwiZ2V0SGFzaFZlcnNpb24iLCJpbmZvIiwidmVyc2lvbiIsInV0aWxzIiwicmVhZEZpbGVzQW5kQ29tcHV0ZUhhc2giLCJyb290IiwidmVyYm9zZSIsImhhc2giLCJnZXRNb2R1bGVDb25maWciLCJtb2R1bGVQYXRoIiwibW9kdWxlQ29uZmlnIiwicGF0aCIsImpvaW4iLCJnYXRoZXJNb2R1bGVDb25maWdzIiwiY29uZmlncyIsIm1vZHVsZXMiLCJscyIsImZvckVhY2giLCJtb2R1bGUiLCJsc3RhdFN5bmMiLCJkaXJOYW1lIiwibmFtZSIsInB1c2giLCJnZXREZXBlbmRlbmNpZXMiLCJjaGVja01vZHVsZXMiLCJyZWZyZXNoIiwiZnJvbVNldHRpbmdzIiwicGx1Z2lucyIsInNldHRpbmdzSnNvbiIsIk9iamVjdCIsImtleXMiLCJyZWR1Y2UiLCJwbHVnaW4iLCJtb2R1bGVEZXBlbmRlbmNpZXMiLCJzY2FmZm9sZCIsImV4aXN0cyIsIndhcm4iLCJjcCIsIm1rZGlyIiwiaW1wb3J0IiwiY2hlY2siXSwic291cmNlcyI6WyIuLi9saWIvZGVza3RvcC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmltcG9ydCByZWdlbmVyYXRvclJ1bnRpbWUgZnJvbSAncmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lJztcbmltcG9ydCBzaGVsbCBmcm9tICdzaGVsbGpzJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IExvZyBmcm9tICcuL2xvZyc7XG5cbnNoZWxsLmNvbmZpZy5mYXRhbCA9IHRydWU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBwYXRoIGlzIGVtcHR5LlxuICogQHBhcmFtIHtzdHJpbmd9IHNlYXJjaFBhdGhcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0VtcHR5U3luYyhzZWFyY2hQYXRoKSB7XG4gICAgbGV0IHN0YXQ7XG4gICAgdHJ5IHtcbiAgICAgICAgc3RhdCA9IGZzLnN0YXRTeW5jKHNlYXJjaFBhdGgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBmcy5yZWFkZGlyU3luYyhzZWFyY2hQYXRoKTtcbiAgICAgICAgcmV0dXJuICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgLmRlc2t0b3AgZGlyZWN0b3J5LlxuICogQGNsYXNzXG4gKiBAcHJvcGVydHkge2Rlc2t0b3BTZXR0aW5nc30gc2V0dGluZ3NcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGVza3RvcCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNZXRlb3JEZXNrdG9wfSAkIC0gY29udGV4dFxuICAgICAqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoJCkge1xuICAgICAgICB0aGlzLiQgPSAkO1xuICAgICAgICB0aGlzLmxvZyA9IG5ldyBMb2coJ2Rlc2t0b3AnKTtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IG51bGw7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmllcyB0byByZWFkIGFuZCByZXR1cm5zIHNldHRpbmdzLmpzb24gY29udGVudHMgZnJvbSAuZGVza3RvcCBkaXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7ZGVza3RvcFNldHRpbmdzfG51bGx9XG4gICAgICovXG4gICAgZ2V0U2V0dGluZ3MoKSB7XG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5ncykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgICAgICAgZnMucmVhZEZpbGVTeW5jKHRoaXMuJC5lbnYucGF0aHMuZGVza3RvcC5zZXR0aW5ncywgJ1VURi04JylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKCdlcnJvciB3aGlsZSB0cnlpbmcgdG8gcmVhZCBcXCcuZGVza3RvcC9zZXR0aW5ncy5qc29uXFwnOiAnLCBlKTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHZlcnNpb24gaGFzaCByZXByZXNlbnRpbmcgY3VycmVudCAuZGVza3RvcCBjb250ZW50cy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIGFzeW5jIGdldEhhc2hWZXJzaW9uKCkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdjYWxjdWxhdGluZyBoYXNoIHZlcnNpb24gZnJvbSAuZGVza3RvcCBjb250ZW50cycpO1xuXG4gICAgICAgIGNvbnN0IHZlcnNpb24gPSBhd2FpdCB0aGlzLiQudXRpbHMucmVhZEZpbGVzQW5kQ29tcHV0ZUhhc2godGhpcy4kLmVudi5wYXRocy5kZXNrdG9wLnJvb3QpO1xuXG4gICAgICAgIHRoaXMubG9nLnZlcmJvc2UoYGNhbGN1bGF0ZWQgLmRlc2t0b3AgaGFzaCB2ZXJzaW9uIGlzICR7dmVyc2lvbi5oYXNofWApO1xuICAgICAgICByZXR1cm4gdmVyc2lvbi5oYXNoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWVzIHRvIHJlYWQgYSBtb2R1bGUuanNvbiBmaWxlIGZyb20gYSBtb2R1bGUgYXQgcHJvdmlkZWQgcGF0aC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVQYXRoIC0gcGF0aCB0byB0aGUgbW9kdWxlIGRpclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgZ2V0TW9kdWxlQ29uZmlnKG1vZHVsZVBhdGgpIHtcbiAgICAgICAgbGV0IG1vZHVsZUNvbmZpZyA9IHt9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbW9kdWxlQ29uZmlnID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKG1vZHVsZVBhdGgsICdtb2R1bGUuanNvbicpLCAnVVRGLTgnKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgICAgICAgYGVycm9yIHdoaWxlIHRyeWluZyB0byByZWFkICdtb2R1bGUuanNvbicgZnJvbSAnJHttb2R1bGVQYXRofScgbW9kdWxlOiBgLFxuICAgICAgICAgICAgICAgIGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoJ25hbWUnIGluIG1vZHVsZUNvbmZpZykpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGBubyAnbmFtZScgZmllbGQgZGVmaW5lZCBpbiAnbW9kdWxlLmpzb24nIGluICcke21vZHVsZVBhdGh9JyBtb2R1bGUuYCk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1vZHVsZUNvbmZpZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTY2FucyBhbGwgbW9kdWxlcyBmb3IgbW9kdWxlLmpzb24gYW5kIGdhdGhlcnMgdGhpcyBjb25maWd1cmF0aW9uIGFsdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7W119XG4gICAgICovXG4gICAgZ2F0aGVyTW9kdWxlQ29uZmlncygpIHtcbiAgICAgICAgY29uc3QgY29uZmlncyA9IFtdO1xuXG4gICAgICAgIGlmICghaXNFbXB0eVN5bmModGhpcy4kLmVudi5wYXRocy5kZXNrdG9wLm1vZHVsZXMpKSB7XG4gICAgICAgICAgICBzaGVsbC5scygnLWQnLCBwYXRoLmpvaW4odGhpcy4kLmVudi5wYXRocy5kZXNrdG9wLm1vZHVsZXMsICcqJykpLmZvckVhY2goXG4gICAgICAgICAgICAgICAgKG1vZHVsZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZnMubHN0YXRTeW5jKG1vZHVsZSkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlQ29uZmlnID0gdGhpcy5nZXRNb2R1bGVDb25maWcobW9kdWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZUNvbmZpZy5kaXJOYW1lID0gcGF0aC5wYXJzZShtb2R1bGUpLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWdzLnB1c2gobW9kdWxlQ29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmZpZ3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3VtbWFyaXplcyBhbGwgZGVwZW5kZW5jaWVzIGRlZmluZWQgaW4gLmRlc2t0b3AuXG4gICAgICpcbiAgICAgKiBAcGFyYW1zIHtPYmplY3R9IHNldHRpbmdzICAgICAgLSBzZXR0aW5ncy5qc29uXG4gICAgICogQHBhcmFtcyB7Ym9vbGVhbn0gY2hlY2tNb2R1bGVzIC0gd2hldGhlciB0byBnYXRoZXIgbW9kdWxlcyBkZXBlbmRlbmNpZXNcbiAgICAgKiBAcGFyYW1zIHtib29sZWFufSByZWZyZXNoICAgICAgLSByZWNvbXB1dGVcbiAgICAgKiBAcmV0dXJucyB7e2Zyb21TZXR0aW5nczoge30sIHBsdWdpbnM6IHt9LCBtb2R1bGVzOiB7fX19XG4gICAgICovXG4gICAgZ2V0RGVwZW5kZW5jaWVzKHNldHRpbmdzID0gbnVsbCwgY2hlY2tNb2R1bGVzID0gdHJ1ZSwgcmVmcmVzaCA9IGZhbHNlKSB7XG4gICAgICAgIGlmICghcmVmcmVzaCAmJiB0aGlzLmRlcGVuZGVuY2llcykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICAgICAgICAgICAgZnJvbVNldHRpbmdzOiB7fSxcbiAgICAgICAgICAgIHBsdWdpbnM6IHt9LFxuICAgICAgICAgICAgbW9kdWxlczoge31cbiAgICAgICAgfTtcbiAgICAgICAgLyoqIEB0eXBlIHtkZXNrdG9wU2V0dGluZ3N9ICogKi9cbiAgICAgICAgY29uc3Qgc2V0dGluZ3NKc29uID0gc2V0dGluZ3MgfHwgdGhpcy5nZXRTZXR0aW5ncygpO1xuXG4gICAgICAgIC8vIFNldHRpbmdzIGNhbiBoYXZlIGEgJ2RlcGVuZGVuY2llcycgZmllbGQuXG4gICAgICAgIGlmICgnZGVwZW5kZW5jaWVzJyBpbiBzZXR0aW5nc0pzb24pIHtcbiAgICAgICAgICAgIGRlcGVuZGVuY2llcy5mcm9tU2V0dGluZ3MgPSBzZXR0aW5nc0pzb24uZGVwZW5kZW5jaWVzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGx1Z2lucyBhcmUgYWxzbyBhIG5wbSBwYWNrYWdlcy5cbiAgICAgICAgaWYgKCdwbHVnaW5zJyBpbiBzZXR0aW5nc0pzb24pIHtcbiAgICAgICAgICAgIGRlcGVuZGVuY2llcy5wbHVnaW5zID0gT2JqZWN0LmtleXMoc2V0dGluZ3NKc29uLnBsdWdpbnMpLnJlZHVjZSgocGx1Z2lucywgcGx1Z2luKSA9PiB7XG4gICAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNldHRpbmdzSnNvbi5wbHVnaW5zW3BsdWdpbl0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIHBsdWdpbnNbcGx1Z2luXSA9IHNldHRpbmdzSnNvbi5wbHVnaW5zW3BsdWdpbl0udmVyc2lvbjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwbHVnaW5zW3BsdWdpbl0gPSBzZXR0aW5nc0pzb24ucGx1Z2luc1twbHVnaW5dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcGx1Z2lucztcbiAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVhY2ggbW9kdWxlIGNhbiBoYXZlIGl0cyBvd24gZGVwZW5kZW5jaWVzIGRlZmluZWQuXG4gICAgICAgIGNvbnN0IG1vZHVsZURlcGVuZGVuY2llcyA9IHt9O1xuICAgICAgICBpZiAoY2hlY2tNb2R1bGVzKSB7XG4gICAgICAgICAgICBjb25zdCBjb25maWdzID0gdGhpcy5nYXRoZXJNb2R1bGVDb25maWdzKCk7XG5cbiAgICAgICAgICAgIGNvbmZpZ3MuZm9yRWFjaChcbiAgICAgICAgICAgICAgICAobW9kdWxlQ29uZmlnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKCdkZXBlbmRlbmNpZXMnIGluIG1vZHVsZUNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZUNvbmZpZy5kZXBlbmRlbmNpZXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobW9kdWxlQ29uZmlnLm5hbWUgaW4gbW9kdWxlRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihgZHVwbGljYXRlIG5hbWUgJyR7bW9kdWxlQ29uZmlnLm5hbWV9JyBpbiAnbW9kdWxlLmpzb24nIGluIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAnJHttb2R1bGVDb25maWcuZGlyTmFtZX0nIC0gYW5vdGhlciBtb2R1bGUgYWxyZWFkeSByZWdpc3RlcmVkIHRoZSBzYW1lIG5hbWUuYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlRGVwZW5kZW5jaWVzW21vZHVsZUNvbmZpZy5uYW1lXSA9IG1vZHVsZUNvbmZpZy5kZXBlbmRlbmNpZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlcGVuZGVuY2llcy5tb2R1bGVzID0gbW9kdWxlRGVwZW5kZW5jaWVzO1xuICAgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcztcbiAgICAgICAgcmV0dXJuIGRlcGVuZGVuY2llcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgdGhlIC5kZXNrdG9wIHNjYWZmb2xkIGludG8gdGhlIG1ldGVvciBhcHAgZGlyLlxuICAgICAqIEFkZHMgZW50cnkgdG8gLm1ldGVvci8uZ2l0aWdub3JlLlxuICAgICAqL1xuICAgIHNjYWZmb2xkKCkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdjcmVhdGluZyAuZGVza3RvcCBzY2FmZm9sZCBpbiB5b3VyIHByb2plY3QnKTtcblxuICAgICAgICBpZiAodGhpcy4kLnV0aWxzLmV4aXN0cyh0aGlzLiQuZW52LnBhdGhzLmRlc2t0b3Aucm9vdCkpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLndhcm4oJy5kZXNrdG9wIGFscmVhZHkgZXhpc3RzIC0gZGVsZXRlIGl0IGlmIHlvdSB3YW50IGEgbmV3IG9uZSB0byBiZSAnICtcbiAgICAgICAgICAgICAgICAnY3JlYXRlZCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc2hlbGwuY3AoJy1yJywgdGhpcy4kLmVudi5wYXRocy5zY2FmZm9sZCwgdGhpcy4kLmVudi5wYXRocy5kZXNrdG9wLnJvb3QpO1xuICAgICAgICBzaGVsbC5ta2Rpcih0aGlzLiQuZW52LnBhdGhzLmRlc2t0b3AuaW1wb3J0KTtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnLmRlc2t0b3AgZGlyZWN0b3J5IHByZXBhcmVkJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmVyaWZpZXMgaWYgYWxsIG1hbmRhdG9yeSBmaWxlcyBhcmUgcHJlc2VudCBpbiB0aGUgLmRlc2t0b3AuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBjaGVjaygpIHtcbiAgICAgICAgdGhpcy5sb2cudmVyYm9zZSgnY2hlY2tpbmcgLmRlc2t0b3AgZXhpc3RlbmNlJyk7XG4gICAgICAgIHJldHVybiAhISh0aGlzLiQudXRpbHMuZXhpc3RzKHRoaXMuJC5lbnYucGF0aHMuZGVza3RvcC5yb290KSAmJlxuICAgICAgICAgICAgdGhpcy4kLnV0aWxzLmV4aXN0cyh0aGlzLiQuZW52LnBhdGhzLmRlc2t0b3Auc2V0dGluZ3MpICYmXG4gICAgICAgICAgICB0aGlzLiQudXRpbHMuZXhpc3RzKHRoaXMuJC5lbnYucGF0aHMuZGVza3RvcC5kZXNrdG9wKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IGRlc2t0b3BTZXR0aW5nc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9qZWN0TmFtZVxuICogQHByb3BlcnR5IHtib29sZWFufSBkZXZUb29sc1xuICogQHByb3BlcnR5IHtib29sZWFufSBkZXZ0cm9uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGRlc2t0b3BIQ1BcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBzcXVpcnJlbFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNxdWlycmVsLmF1dG9VcGRhdGVGZWVkVXJsXG4gKiBAcHJvcGVydHkge09iamVjdH0gc3F1aXJyZWwuYXV0b1VwZGF0ZUZlZWRIZWFkZXJzXG4gKiBAcHJvcGVydHkge09iamVjdH0gc3F1aXJyZWwuYXV0b1VwZGF0ZUNoZWNrT25TdGFydFxuICogQHByb3BlcnR5IHtPYmplY3R9IGRlc2t0b3BIQ1BTZXR0aW5nc1xuICogQHByb3BlcnR5IHtib29sZWFufSBkZXNrdG9wSENQU2V0dGluZ3MuaWdub3JlQ29tcGF0aWJpbGl0eVZlcnNpb25cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZGVza3RvcEhDUFNldHRpbmdzLmJsb2NrQXBwVXBkYXRlT25EZXNrdG9wSW5jb21wYXRpYmlsaXR5XG4gKiBAcHJvcGVydHkge251bWJlcn0gd2ViQXBwU3RhcnR1cFRpbWVvdXRcbiAqIEBwcm9wZXJ0eSB7QXJyYXl9IGxpbmtQYWNrYWdlc1xuICogQHByb3BlcnR5IHtBcnJheX0gZXhwb3NlZE1vZHVsZXNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB3aW5kb3dcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB3aW5kb3dEZXZcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYWNrYWdlSnNvbkZpZWxkc1xuICogQHByb3BlcnR5IHtPYmplY3R9IGJ1aWxkZXJPcHRpb25zXG4gKiBAcHJvcGVydHkge09iamVjdH0gYnVpbGRlckNsaU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYWNrYWdlck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwbHVnaW5zXG4gKiBAcHJvcGVydHkge09iamVjdH0gZGVwZW5kZW5jaWVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVnbGlmeVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb25cbiAqICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7OztBQU5BO0FBUUFBLGdCQUFBLENBQU1DLE1BQU4sQ0FBYUMsS0FBYixHQUFxQixJQUFyQjtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsU0FBU0MsV0FBVCxDQUFxQkMsVUFBckIsRUFBaUM7RUFDN0IsSUFBSUMsSUFBSjs7RUFDQSxJQUFJO0lBQ0FBLElBQUksR0FBR0MsV0FBQSxDQUFHQyxRQUFILENBQVlILFVBQVosQ0FBUDtFQUNILENBRkQsQ0FFRSxPQUFPSSxDQUFQLEVBQVU7SUFDUixPQUFPLElBQVA7RUFDSDs7RUFDRCxJQUFJSCxJQUFJLENBQUNJLFdBQUwsRUFBSixFQUF3QjtJQUNwQixNQUFNQyxLQUFLLEdBQUdKLFdBQUEsQ0FBR0ssV0FBSCxDQUFlUCxVQUFmLENBQWQ7O0lBQ0EsT0FBTyxDQUFDTSxLQUFELElBQVUsQ0FBQ0EsS0FBSyxDQUFDRSxNQUF4QjtFQUNIOztFQUNELE9BQU8sS0FBUDtBQUNIO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ2UsTUFBTUMsT0FBTixDQUFjO0VBQ3pCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFDSUMsV0FBVyxDQUFDQyxDQUFELEVBQUk7SUFDWCxLQUFLQSxDQUFMLEdBQVNBLENBQVQ7SUFDQSxLQUFLQyxHQUFMLEdBQVcsSUFBSUMsWUFBSixDQUFRLFNBQVIsQ0FBWDtJQUNBLEtBQUtDLFFBQUwsR0FBZ0IsSUFBaEI7SUFDQSxLQUFLQyxZQUFMLEdBQW9CLElBQXBCO0VBQ0g7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBOzs7RUFDSUMsV0FBVyxHQUFHO0lBQ1YsSUFBSSxDQUFDLEtBQUtGLFFBQVYsRUFBb0I7TUFDaEIsSUFBSTtRQUNBLEtBQUtBLFFBQUwsR0FBZ0JHLElBQUks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 \ No newline at end of file diff --git a/dist/electron.js b/dist/electron.js deleted file mode 100644 index 4b4a584d..00000000 --- a/dist/electron.js +++ /dev/null @@ -1,61 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; - -var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime")); - -var _crossSpawn = _interopRequireDefault(require("cross-spawn")); - -var _log = _interopRequireDefault(require("./log")); - -var _defaultDependencies = _interopRequireDefault(require("./defaultDependencies")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Simple Electron runner. Runs the project with the bin provided by the 'electron' package. - * @class - */ -class Electron { - constructor($) { - this.log = new _log.default('electron'); - this.$ = $; - } - - async init() { - this.electron = await this.$.getDependency('electron', _defaultDependencies.default.electron); - } - - run() { - // Until: https://github.com/electron-userland/electron-prebuilt/pull/118 - const { - env - } = process; - env.ELECTRON_ENV = 'development'; - const cmd = []; - - if (this.$.env.options.debug) { - cmd.push('--debug=5858'); - } - - cmd.push('.'); - const child = (0, _crossSpawn.default)(this.electron.dependency, cmd, { - cwd: this.$.env.paths.electronApp.root, - env - }); // TODO: check if we can configure piping in spawn options - - child.stdout.on('data', chunk => { - process.stdout.write(chunk); - }); - child.stderr.on('data', chunk => { - process.stderr.write(chunk); - }); - } - -} - -exports.default = Electron; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFbGVjdHJvbiIsImNvbnN0cnVjdG9yIiwiJCIsImxvZyIsIkxvZyIsImluaXQiLCJlbGVjdHJvbiIsImdldERlcGVuZGVuY3kiLCJkZWZhdWx0RGVwZW5kZW5jaWVzIiwicnVuIiwiZW52IiwicHJvY2VzcyIsIkVMRUNUUk9OX0VOViIsImNtZCIsIm9wdGlvbnMiLCJkZWJ1ZyIsInB1c2giLCJjaGlsZCIsInNwYXduIiwiZGVwZW5kZW5jeSIsImN3ZCIsInBhdGhzIiwiZWxlY3Ryb25BcHAiLCJyb290Iiwic3Rkb3V0Iiwib24iLCJjaHVuayIsIndyaXRlIiwic3RkZXJyIl0sInNvdXJjZXMiOlsiLi4vbGliL2VsZWN0cm9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByZWdlbmVyYXRvclJ1bnRpbWUgZnJvbSAncmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lJztcbmltcG9ydCBzcGF3biBmcm9tICdjcm9zcy1zcGF3bic7XG5cbmltcG9ydCBMb2cgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IGRlZmF1bHREZXBlbmRlbmNpZXMgZnJvbSAnLi9kZWZhdWx0RGVwZW5kZW5jaWVzJztcblxuLyoqXG4gKiBTaW1wbGUgRWxlY3Ryb24gcnVubmVyLiBSdW5zIHRoZSBwcm9qZWN0IHdpdGggdGhlIGJpbiBwcm92aWRlZCBieSB0aGUgJ2VsZWN0cm9uJyBwYWNrYWdlLlxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVsZWN0cm9uIHtcbiAgICBjb25zdHJ1Y3RvcigkKSB7XG4gICAgICAgIHRoaXMubG9nID0gbmV3IExvZygnZWxlY3Ryb24nKTtcbiAgICAgICAgdGhpcy4kID0gJDtcbiAgICB9XG5cbiAgICBhc3luYyBpbml0KCkge1xuICAgICAgICB0aGlzLmVsZWN0cm9uID0gYXdhaXQgdGhpcy4kLmdldERlcGVuZGVuY3koJ2VsZWN0cm9uJywgZGVmYXVsdERlcGVuZGVuY2llcy5lbGVjdHJvbik7XG4gICAgfVxuXG4gICAgcnVuKCkge1xuICAgICAgICAvLyBVbnRpbDogaHR0cHM6Ly9naXRodWIuY29tL2VsZWN0cm9uLXVzZXJsYW5kL2VsZWN0cm9uLXByZWJ1aWx0L3B1bGwvMTE4XG4gICAgICAgIGNvbnN0IHsgZW52IH0gPSBwcm9jZXNzO1xuICAgICAgICBlbnYuRUxFQ1RST05fRU5WID0gJ2RldmVsb3BtZW50JztcblxuICAgICAgICBjb25zdCBjbWQgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy4kLmVudi5vcHRpb25zLmRlYnVnKSB7XG4gICAgICAgICAgICBjbWQucHVzaCgnLS1kZWJ1Zz01ODU4Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjbWQucHVzaCgnLicpO1xuXG4gICAgICAgIGNvbnN0IGNoaWxkID0gc3Bhd24odGhpcy5lbGVjdHJvbi5kZXBlbmRlbmN5LCBjbWQsIHtcbiAgICAgICAgICAgIGN3ZDogdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5yb290LFxuICAgICAgICAgICAgZW52XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRPRE86IGNoZWNrIGlmIHdlIGNhbiBjb25maWd1cmUgcGlwaW5nIGluIHNwYXduIG9wdGlvbnNcbiAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShjaHVuayk7XG4gICAgICAgIH0pO1xuICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICAgICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGNodW5rKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBRUE7O0FBQ0E7Ozs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNlLE1BQU1BLFFBQU4sQ0FBZTtFQUMxQkMsV0FBVyxDQUFDQyxDQUFELEVBQUk7SUFDWCxLQUFLQyxHQUFMLEdBQVcsSUFBSUMsWUFBSixDQUFRLFVBQVIsQ0FBWDtJQUNBLEtBQUtGLENBQUwsR0FBU0EsQ0FBVDtFQUNIOztFQUVTLE1BQUpHLElBQUksR0FBRztJQUNULEtBQUtDLFFBQUwsR0FBZ0IsTUFBTSxLQUFLSixDQUFMLENBQU9LLGFBQVAsQ0FBcUIsVUFBckIsRUFBaUNDLDRCQUFBLENBQW9CRixRQUFyRCxDQUF0QjtFQUNIOztFQUVERyxHQUFHLEdBQUc7SUFDRjtJQUNBLE1BQU07TUFBRUM7SUFBRixJQUFVQyxPQUFoQjtJQUNBRCxHQUFHLENBQUNFLFlBQUosR0FBbUIsYUFBbkI7SUFFQSxNQUFNQyxHQUFHLEdBQUcsRUFBWjs7SUFFQSxJQUFJLEtBQUtYLENBQUwsQ0FBT1EsR0FBUCxDQUFXSSxPQUFYLENBQW1CQyxLQUF2QixFQUE4QjtNQUMxQkYsR0FBRyxDQUFDRyxJQUFKLENBQVMsY0FBVDtJQUNIOztJQUVESCxHQUFHLENBQUNHLElBQUosQ0FBUyxHQUFUO0lBRUEsTUFBTUMsS0FBSyxHQUFHLElBQUFDLG1CQUFBLEVBQU0sS0FBS1osUUFBTCxDQUFjYSxVQUFwQixFQUFnQ04sR0FBaEMsRUFBcUM7TUFDL0NPLEdBQUcsRUFBRSxLQUFLbEIsQ0FBTCxDQUFPUSxHQUFQLENBQVdXLEtBQVgsQ0FBaUJDLFdBQWpCLENBQTZCQyxJQURhO01BRS9DYjtJQUYrQyxDQUFyQyxDQUFkLENBYkUsQ0FrQkY7O0lBQ0FPLEtBQUssQ0FBQ08sTUFBTixDQUFhQyxFQUFiLENBQWdCLE1BQWhCLEVBQXlCQyxLQUFELElBQVc7TUFDL0JmLE9BQU8sQ0FBQ2EsTUFBUixDQUFlRyxLQUFmLENBQXFCRCxLQUFyQjtJQUNILENBRkQ7SUFHQVQsS0FBSyxDQUFDVyxNQUFOLENBQWFILEVBQWIsQ0FBZ0IsTUFBaEIsRUFBeUJDLEtBQUQsSUFBVztNQUMvQmYsT0FBTyxDQUFDaUIsTUFBUixDQUFlRCxLQUFmLENBQXFCRCxLQUFyQjtJQUNILENBRkQ7RUFHSDs7QUFuQ3lCIn0= \ No newline at end of file diff --git a/dist/electronApp.js b/dist/electronApp.js deleted file mode 100644 index 6e7966c3..00000000 --- a/dist/electronApp.js +++ /dev/null @@ -1,876 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; - -var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime")); - -var _asar = _interopRequireDefault(require("@electron/asar")); - -var _assignIn = _interopRequireDefault(require("lodash/assignIn")); - -var _lodash = _interopRequireDefault(require("lodash")); - -var _installLocal = require("install-local"); - -var _core = require("@babel/core"); - -var _crypto = _interopRequireDefault(require("crypto")); - -var _del = _interopRequireDefault(require("del")); - -var _presetEnv = _interopRequireDefault(require("@babel/preset-env")); - -var _fs = _interopRequireDefault(require("fs")); - -var _path = _interopRequireDefault(require("path")); - -var _shelljs = _interopRequireDefault(require("shelljs")); - -var _semver = _interopRequireDefault(require("semver")); - -var _terser = _interopRequireDefault(require("terser")); - -var _log = _interopRequireDefault(require("./log")); - -var _electronAppScaffold = _interopRequireDefault(require("./electronAppScaffold")); - -var _dependenciesManager = _interopRequireDefault(require("./dependenciesManager")); - -var _binaryModulesDetector = _interopRequireDefault(require("./binaryModulesDetector")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -// eslint-disable-next-line no-unused-vars -_shelljs.default.config.fatal = true; -/** - * Represents the .desktop dir scaffold. - * @class - */ - -class ElectronApp { - /** - * @param {MeteorDesktop} $ - context - * @constructor - */ - constructor($) { - this.log = new _log.default('electronApp'); - this.scaffold = new _electronAppScaffold.default($); - this.depsManager = new _dependenciesManager.default($, this.scaffold.getDefaultPackageJson().dependencies); - this.$ = $; - this.meteorApp = this.$.meteorApp; - this.packageJson = null; - this.version = null; - this.compatibilityVersion = null; - this.deprectatedPlugins = ['meteor-desktop-localstorage']; - } - /** - * Makes an app.asar from the skeleton app. - * @property {Array} excludeFromDel - list of paths to exclude from deleting - * @returns {Promise} - */ - - - packSkeletonToAsar(excludeFromDel = []) { - this.log.info('packing skeleton app and node_modules to asar archive'); - return new Promise(resolve => { - const extract = this.getModulesToExtract(); // We want to pack skeleton app and node_modules together, so we need to temporarily - // move node_modules to app dir. - - this.log.debug('moving node_modules to app dir'); - - _fs.default.renameSync(this.$.env.paths.electronApp.nodeModules, _path.default.join(this.$.env.paths.electronApp.appRoot, 'node_modules')); - - let extracted = false; - extracted = this.extractModules(extract); - this.log.debug('packing'); - - _asar.default.createPackage(this.$.env.paths.electronApp.appRoot, this.$.env.paths.electronApp.appAsar).then(() => { - // Lets move the node_modules back. - this.log.debug('moving node_modules back from app dir'); - - _shelljs.default.mv(_path.default.join(this.$.env.paths.electronApp.appRoot, 'node_modules'), this.$.env.paths.electronApp.nodeModules); - - if (extracted) { - // We need to create a full node modules back. In other words we want - // the extracted modules back. - extract.forEach(module => _shelljs.default.cp('-rf', _path.default.join(this.$.env.paths.electronApp.extractedNodeModules, module), _path.default.join(this.$.env.paths.electronApp.nodeModules, module))); // Get the .bin back. - - if (this.$.utils.exists(this.$.env.paths.electronApp.extractedNodeModulesBin)) { - _shelljs.default.cp(_path.default.join(this.$.env.paths.electronApp.extractedNodeModulesBin, '*'), _path.default.join(this.$.env.paths.electronApp.nodeModules, '.bin')); - } - } - - this.log.debug('deleting source files'); - const exclude = [this.$.env.paths.electronApp.nodeModules].concat([this.$.env.paths.electronApp.appAsar, this.$.env.paths.electronApp.packageJson], excludeFromDel); - - _del.default.sync([`${this.$.env.paths.electronApp.root}${_path.default.sep}*`].concat(exclude.map(pathToExclude => `!${pathToExclude}`)), { - force: true - }); - - resolve(); - }); - }); - } - /** - * Moves specified node modules to a separate directory. - * @param {Array} extract - * @returns {boolean} - */ - - - extractModules(extract) { - const ext = ['.js', '.bat', '.sh', '.cmd', '']; - - if (extract.length > 0) { - if (this.$.utils.exists(this.$.env.paths.electronApp.extractedNodeModules)) { - _shelljs.default.rm('-rf', this.$.env.paths.electronApp.extractedNodeModules); - } - - _fs.default.mkdirSync(this.$.env.paths.electronApp.extractedNodeModules); - - _fs.default.mkdirSync(this.$.env.paths.electronApp.extractedNodeModulesBin); - - extract.forEach(module => { - _fs.default.renameSync(_path.default.join(this.$.env.paths.electronApp.appRoot, 'node_modules', module), _path.default.join(this.$.env.paths.electronApp.extractedNodeModules, module)); // Move bins. - - - this.extractBin(module, ext); - }); - return true; - } - - return false; - } - /** - * Extracts the bin files associated with a certain node modules. - * - * @param module - * @param ext - */ - - - extractBin(module, ext) { - let packageJson; - - try { - packageJson = JSON.parse(_fs.default.readFileSync(_path.default.join(this.$.env.paths.electronApp.extractedNodeModules, module, 'package.json'), 'utf8')); - } catch (e) { - packageJson = {}; - } - - const bins = 'bin' in packageJson && typeof packageJson.bin === 'object' ? Object.keys(packageJson.bin) : []; - - if (bins.length > 0) { - bins.forEach(bin => { - ext.forEach(extension => { - const binFilePath = _path.default.join(this.$.env.paths.electronApp.appRoot, 'node_modules', '.bin', `${bin}${extension}`); - - if (this.$.utils.exists(binFilePath) || this.$.utils.symlinkExists(binFilePath)) { - _fs.default.renameSync(binFilePath, _path.default.join(this.$.env.paths.electronApp.extractedNodeModulesBin, `${bin}${extension}`)); - } - }); - }); - } - } - /** - * Merges the `extract` field with automatically detected modules. - */ - - - getModulesToExtract() { - const binaryModulesDetector = new _binaryModulesDetector.default(this.$.env.paths.electronApp.nodeModules); - const toBeExtracted = binaryModulesDetector.detect(); - let { - extract - } = this.$.desktop.getSettings(); - - if (!Array.isArray(extract)) { - extract = []; - } - - const merge = {}; - toBeExtracted.concat(extract).forEach(module => { - merge[module] = true; - }); - extract = Object.keys(merge); - - if (extract.length > 0) { - this.log.verbose(`resultant modules to extract list is: ${extract.join(', ')}`); - } - - return extract; - } - /** - * Calculates a md5 from all dependencies. - */ - - - calculateCompatibilityVersion() { - this.log.verbose('calculating compatibility version'); - const settings = this.$.desktop.getSettings(); - - if ('desktopHCPCompatibilityVersion' in settings) { - this.compatibilityVersion = `${settings.desktopHCPCompatibilityVersion}`; - this.log.warn(`compatibility version overridden to ${this.compatibilityVersion}`); - return; - } - - const md5 = _crypto.default.createHash('md5'); - - let dependencies = this.depsManager.getDependencies(); - const dependenciesSorted = Object.keys(dependencies).sort(); - dependencies = dependenciesSorted.map(dependency => `${dependency}:${dependencies[dependency]}`); - const mainCompatibilityVersion = this.$.getVersion().split('.'); - this.log.debug('meteor-desktop compatibility version is ', `${mainCompatibilityVersion[0]}`); - dependencies.push(`meteor-desktop:${mainCompatibilityVersion[0]}`); - const desktopCompatibilityVersion = settings.version.split('.')[0]; - this.log.debug('.desktop compatibility version is ', desktopCompatibilityVersion); - dependencies.push(`desktop-app:${desktopCompatibilityVersion}`); - - if (process.env.METEOR_DESKTOP_DEBUG_DESKTOP_COMPATIBILITY_VERSION || process.env.METEOR_DESKTOP_DEBUG) { - this.log.debug(`compatibility version calculated from ${JSON.stringify(dependencies)}`); - } - - md5.update(JSON.stringify(dependencies)); - this.compatibilityVersion = md5.digest('hex'); - } - - async init() { - try { - await this.$.electron.init(); - await this.$.electronBuilder.init(); - } catch (e) { - this.log.warn('error occurred while initialising electron and electron-builder integration', e); - process.exit(1); - } - } - /** - * Runs all necessary tasks to build the desktopified app. - */ - - - async build(run = false) { - // TODO: refactor to a task runner - this.log.info('scaffolding'); - - if (!this.$.desktop.check()) { - if (!this.$.env.options.scaffold) { - this.log.error('seems that you do not have a .desktop dir in your project or it is' + ' corrupted. Run \'npm run desktop -- init\' to get a new one.'); // Do not fail, so that npm will not print his error stuff to console. - - process.exit(0); - } else { - this.$.desktop.scaffold(); - this.$.meteorApp.updateGitIgnore(); - } - } - - await this.init(); - - try { - this.$.meteorApp.updateGitIgnore(); - } catch (e) { - this.log.warn(`error occurred while adding ${this.$.env.paths.electronApp.rootName}` + 'to .gitignore: ', e); - } - - try { - await this.$.meteorApp.removeDeprecatedPackages(); - } catch (e) { - this.log.error('error while removing deprecated packages: ', e); - process.exit(1); - } - - try { - await this.$.meteorApp.ensureDesktopHCPPackages(); - } catch (e) { - this.log.error('error while checking for required packages: ', e); - process.exit(1); - } - - try { - await this.scaffold.make(); - } catch (e) { - this.log.error('error while scaffolding: ', e); - process.exit(1); - } - - try { - const fileName = '.npmrc'; - const dirName = '.meteor/desktop-build'; - - if (_fs.default.existsSync(dirName) && _fs.default.existsSync(fileName)) { - _fs.default.copyFileSync(fileName, `${dirName}/${fileName}`); - } - } catch (e) { - this.log.warn('error while copying .npmrc', e); - } - - try { - await this.exposeElectronModules(); - } catch (e) { - this.log.error('error while exposing electron modules: ', e); - process.exit(1); - } - - try { - this.updatePackageJsonFields(); - } catch (e) { - this.log.error('error while updating package.json: ', e); - } - - try { - this.updateDependenciesList(); - } catch (e) { - this.log.error('error while merging dependencies list: ', e); - } - - try { - this.calculateCompatibilityVersion(); - } catch (e) { - this.log.error('error while calculating compatibility version: ', e); - process.exit(1); - } - - try { - await this.handleTemporaryNodeModules(); - } catch (e) { - this.log.error('error occurred while handling temporary node_modules: ', e); - process.exit(1); - } - - let nodeModulesRemoved; - - try { - nodeModulesRemoved = await this.handleStateOfNodeModules(); - } catch (e) { - this.log.error('error occurred while clearing node_modules: ', e); - process.exit(1); - } - - try { - await this.rebuildDeps(true); - } catch (e) { - this.log.error('error occurred while installing node_modules: ', e); - process.exit(1); - } - - if (!nodeModulesRemoved) { - try { - await this.rebuildDeps(); - } catch (e) { - this.log.error('error occurred while rebuilding native node modules: ', e); - process.exit(1); - } - } - - try { - await this.linkNpmPackages(); - } catch (e) { - this.log.error(`linking packages failed: ${e}`); - process.exit(1); - } - - try { - await this.installLocalNodeModules(); - } catch (e) { - this.log.error('error occurred while installing local node modules: ', e); - process.exit(1); - } - - try { - await this.ensureMeteorDependencies(); - } catch (e) { - this.log.error('error occurred while ensuring meteor dependencies are installed: ', e); - process.exit(1); - } - - if (this.$.env.isProductionBuild()) { - try { - await this.packSkeletonToAsar(); - } catch (e) { - this.log.error('error while packing skeleton to asar: ', e); - process.exit(1); - } - } // TODO: find a way to avoid copying .desktop to a temp location - - - try { - this.copyDesktopToDesktopTemp(); - } catch (e) { - this.log.error('error while copying .desktop to a temporary location: ', e); - process.exit(1); - } - - try { - await this.updateSettingsJsonFields(); - } catch (e) { - this.log.error('error while updating settings.json: ', e); - process.exit(1); - } - - try { - await this.excludeFilesFromArchive(); - } catch (e) { - this.log.error('error while excluding files from packing to asar: ', e); - process.exit(1); - } - - try { - await this.transpileAndMinify(); - } catch (e) { - this.log.error('error while transpiling or minifying: ', e); - } - - try { - await this.packDesktopToAsar(); - } catch (e) { - this.log.error('error occurred while packing .desktop to asar: ', e); - process.exit(1); - } - - try { - await this.getMeteorClientBuild(); - } catch (e) { - this.log.error('error occurred during getting meteor mobile build: ', e); - } - - if (run) { - this.log.info('running'); - this.$.electron.run(); - } else { - this.log.info('built'); - } - } - /** - * Copies the `exposedModules` setting from `settings.json` into `preload.js` modifying its code - * so that the script will have it hardcoded. - */ - - - exposeElectronModules() { - const { - exposedModules - } = this.$.desktop.getSettings(); - - if (exposedModules && Array.isArray(exposedModules) && exposedModules.length > 0) { - let preload = _fs.default.readFileSync(this.$.env.paths.electronApp.preload, 'utf8'); - - const modules = this.$.desktop.getSettings().exposedModules.reduce( // eslint-disable-next-line no-return-assign,no-param-reassign - (prev, module) => (prev += `'${module}', `, prev), ''); - preload = preload.replace('const exposedModules = [', `const exposedModules = [${modules}`); - - _fs.default.writeFileSync(this.$.env.paths.electronApp.preload, preload); - } - } - /** - * Ensures all required dependencies are added to the Meteor project. - * @returns {Promise.} - */ - - - async ensureMeteorDependencies() { - let packages = []; - const packagesWithVersion = []; - let plugins = 'plugins ['; - Object.keys(this.$.desktop.getDependencies().plugins).forEach(plugin => { - // Read package.json of the plugin. - const packageJson = JSON.parse(_fs.default.readFileSync(_path.default.join(this.$.env.paths.electronApp.nodeModules, plugin, 'package.json'), 'utf8')); - - if ('meteorDependencies' in packageJson && typeof packageJson.meteorDependencies === 'object') { - plugins += `${plugin}, `; - packages.unshift(...Object.keys(packageJson.meteorDependencies)); - packagesWithVersion.unshift(...packages.map(packageName => { - if (packageJson.meteorDependencies[packageName] === '@version') { - return `${packageName}@${packageJson.version}`; - } - - return `${packageName}@${packageJson.meteorDependencies[packageName]}`; - })); - } - }); - const packagesCount = packages.length; - packages = packages.filter(value => !this.deprectatedPlugins.includes(value)); - - if (packagesCount !== packages.length) { - this.log.warn('you have some deprecated meteor desktop plugins in your settings, please remove ' + `them (deprecated plugins: ${this.deprectatedPlugins.join(', ')})`); - } - - if (packages.length > 0) { - plugins = `${plugins.substr(0, plugins.length - 2)}]`; - - try { - await this.$.meteorApp.meteorManager.ensurePackages(packages, packagesWithVersion, plugins); - } catch (e) { - throw new Error(e); - } - } - } - /** - * Builds meteor app. - */ - - - async getMeteorClientBuild() { - await this.$.meteorApp.build(); - } - /** - * Removes node_modules if needed. - * @returns {Promise} - */ - - - async handleStateOfNodeModules() { - if (this.$.env.isProductionBuild() || this.$.env.options.ia32) { - if (!this.$.env.isProductionBuild()) { - this.log.info('clearing node_modules because we need to have it clear for ia32 rebuild'); - } else { - this.log.info('clearing node_modules because this is a production build'); - } - - try { - await this.$.utils.rmWithRetries('-rf', this.$.env.paths.electronApp.nodeModules); - } catch (e) { - throw new Error(e); - } - - return true; - } - - return false; - } - /** - * If there is a temporary node_modules folder and no node_modules folder, we will - * restore it, as it might be a leftover from an interrupted flow. - * @returns {Promise} - */ - - - async handleTemporaryNodeModules() { - if (this.$.utils.exists(this.$.env.paths.electronApp.tmpNodeModules)) { - if (!this.$.utils.exists(this.$.env.paths.electronApp.nodeModules)) { - this.log.debug('moving temp node_modules back'); - - _shelljs.default.mv(this.$.env.paths.electronApp.tmpNodeModules, this.$.env.paths.electronApp.nodeModules); - } else { - // If there is a node_modules folder, we should clear the temporary one. - this.log.debug('clearing temp node_modules because new one is already created'); - - try { - await this.$.utils.rmWithRetries('-rf', this.$.env.paths.electronApp.tmpNodeModules); - } catch (e) { - throw new Error(e); - } - } - } - } - /** - * Runs npm link for every package specified in settings.json->linkPackages. - */ - - - async linkNpmPackages() { - if (this.$.env.isProductionBuild()) { - return; - } - - const settings = this.$.desktop.getSettings(); - const promises = []; - - if ('linkPackages' in this.$.desktop.getSettings()) { - if (Array.isArray(settings.linkPackages)) { - settings.linkPackages.forEach(packageName => promises.push(this.$.meteorApp.runNpm(['link', packageName], undefined, this.$.env.paths.electronApp.root))); - } - } - - await Promise.all(promises); - } - /** - * Runs npm in the electron app to get the dependencies installed. - * @returns {Promise} - */ - - - async ensureDeps() { - this.log.info('installing dependencies'); - - if (this.$.utils.exists(this.$.env.paths.electronApp.nodeModules)) { - this.log.debug('running npm prune to wipe unneeded dependencies'); - - try { - await this.runNpm(['prune']); - } catch (e) { - throw new Error(e); - } - } - - try { - await this.runNpm(['install'], this.$.env.stdio); - } catch (e) { - throw new Error(e); - } - } - /** - * Warns if plugins version are outdated in compare to the newest scaffold. - * @param {Object} pluginsVersions - current plugins versions from settings.json - */ - - - checkPluginsVersion(pluginsVersions) { - const settingsJson = JSON.parse(_fs.default.readFileSync(_path.default.join(this.$.env.paths.scaffold, 'settings.json'))); - const scaffoldPluginsVersion = this.$.desktop.getDependencies(settingsJson, false).plugins; - Object.keys(pluginsVersions).forEach(pluginName => { - if (pluginName in scaffoldPluginsVersion && scaffoldPluginsVersion[pluginName] !== pluginsVersions[pluginName] && _semver.default.lt(pluginsVersions[pluginName], scaffoldPluginsVersion[pluginName])) { - this.log.warn(`you are using outdated version ${pluginsVersions[pluginName]} of ` + `${pluginName}, the suggested version to use is ` + `${scaffoldPluginsVersion[pluginName]}`); - } - }); - } - /** - * Merges core dependency list with the dependencies from .desktop. - */ - - - updateDependenciesList() { - this.log.info('updating list of package.json\'s dependencies'); - const desktopDependencies = this.$.desktop.getDependencies(); - this.checkPluginsVersion(desktopDependencies.plugins); - this.log.debug('merging settings.json[dependencies]'); - this.depsManager.mergeDependencies('settings.json[dependencies]', desktopDependencies.fromSettings); - this.log.debug('merging settings.json[plugins]'); - this.depsManager.mergeDependencies('settings.json[plugins]', desktopDependencies.plugins); - this.log.debug('merging dependencies from modules'); - Object.keys(desktopDependencies.modules).forEach(module => this.depsManager.mergeDependencies(`module[${module}]`, desktopDependencies.modules[module])); - this.packageJson.dependencies = this.depsManager.getRemoteDependencies(); - this.packageJson.localDependencies = this.depsManager.getLocalDependencies(); - this.log.debug('writing updated package.json'); - - _fs.default.writeFileSync(this.$.env.paths.electronApp.packageJson, JSON.stringify(this.packageJson, null, 2)); - } - /** - * Install node modules from local paths using local-install. - * - * @param {string} arch - * @returns {Promise} - */ - - - installLocalNodeModules(arch = this.$.env.options.ia32 || process.arch === 'ia32' ? 'ia32' : 'x64') { - const localDependencies = _lodash.default.values(this.packageJson.localDependencies); - - if (localDependencies.length === 0) { - return Promise.resolve(); - } - - this.log.info('installing local node modules'); - const lastRebuild = this.$.electronBuilder.prepareLastRebuildObject(arch); - const env = this.$.electronBuilder.getGypEnv(lastRebuild.frameworkInfo, lastRebuild.platform, lastRebuild.arch); - const installer = new _installLocal.LocalInstaller({ - [this.$.env.paths.electronApp.root]: localDependencies - }, { - npmEnv: env - }); - (0, _installLocal.progress)(installer); - return installer.install(); - } - /** - * Rebuild binary dependencies against Electron's node headers. - * @returns {Promise} - */ - - - rebuildDeps(install = false) { - if (install) { - this.log.info('issuing node_modules install from electron-builder'); - } else { - this.log.info('issuing native modules rebuild from electron-builder'); - } - - const arch = this.$.env.options.ia32 || process.arch === 'ia32' ? 'ia32' : 'x64'; - - if (this.$.env.options.ia32) { - this.log.verbose('forcing rebuild for 32bit'); - } else { - this.log.verbose(`rebuilding for ${arch}`); - } - - return this.$.electronBuilder.installOrRebuild(arch, undefined, install); - } - /** - * Update package.json fields accordingly to what is set in settings.json. - * - * packageJson.name = settings.projectName - * packageJson.version = settings.version - * packageJson.* = settings.packageJsonFields - */ - - - updatePackageJsonFields() { - this.log.verbose('updating package.json fields'); - const settings = this.$.desktop.getSettings(); - /** @type {desktopSettings} */ - - const packageJson = this.scaffold.getDefaultPackageJson(); - packageJson.version = settings.version; - - if ('packageJsonFields' in settings) { - (0, _assignIn.default)(packageJson, settings.packageJsonFields); - } - - (0, _assignIn.default)(packageJson, { - name: settings.projectName - }); - this.log.debug('writing updated package.json'); - - _fs.default.writeFileSync(this.$.env.paths.electronApp.packageJson, JSON.stringify(packageJson, null, 4)); - - this.packageJson = packageJson; - } - /** - * Updates settings.json with env (prod/dev) information and versions. - */ - - - async updateSettingsJsonFields() { - this.log.debug('updating settings.json fields'); - const settings = this.$.desktop.getSettings(); // Save versions. - - settings.compatibilityVersion = this.compatibilityVersion; // Pass information about build type to the settings.json. - - settings.env = this.$.env.isProductionBuild() ? 'prod' : 'dev'; - const version = await this.$.desktop.getHashVersion(); - settings.desktopVersion = `${version}_${settings.env}`; - settings.meteorDesktopVersion = this.$.getVersion(); - - if (this.$.env.options.prodDebug) { - settings.prodDebug = true; - } - - _fs.default.writeFileSync(this.$.env.paths.desktopTmp.settings, JSON.stringify(settings, null, 4)); - } - /** - * Copies files from prepared .desktop to desktop.asar in electron app. - */ - - - packDesktopToAsar() { - this.log.info('packing .desktop to asar'); - return new Promise((resolve, reject) => { - _asar.default.createPackage(this.$.env.paths.desktopTmp.root, this.$.env.paths.electronApp.desktopAsar).then(() => { - this.log.verbose('clearing temporary .desktop'); - this.$.utils.rmWithRetries('-rf', this.$.env.paths.desktopTmp.root).then(() => { - resolve(); - }).catch(e => { - reject(e); - }); - resolve(); - }); - }); - } - /** - * Makes a temporary copy of .desktop. - */ - - - copyDesktopToDesktopTemp() { - this.log.verbose('copying .desktop to temporary location'); - - _shelljs.default.cp('-rf', this.$.env.paths.desktop.root, this.$.env.paths.desktopTmp.root); // Remove test files. - - - _del.default.sync([_path.default.join(this.$.env.paths.desktopTmp.root, '**', '*.test.js')], { - force: true - }); - } - /** - * Runs babel and uglify over .desktop if requested. - */ - - - async transpileAndMinify() { - this.log.info('transpiling and uglifying'); - const settings = this.$.desktop.getSettings(); - const options = 'uglifyOptions' in settings ? settings.uglifyOptions : {}; - const uglifyingEnabled = 'uglify' in settings && !!settings.uglify; - const preset = (0, _presetEnv.default)({ - assertVersion: () => {} - }, { - targets: { - node: '12' - } - }); - const { - data: files - } = await this.$.utils.readDir(this.$.env.paths.desktopTmp.root); - files.forEach(file => { - if (file.endsWith('.js')) { - let { - code - } = (0, _core.transformFileSync)(file, { - presets: [preset] - }); - let error; - - if (settings.env === 'prod' && uglifyingEnabled) { - ({ - code, - error - } = _terser.default.minify(code, options)); - } - - if (error) { - throw new Error(error); - } - - _fs.default.writeFileSync(file, code); - } - }); - } - /** - * Moves all the files that should not be packed into asar into a safe location which is the - * 'extracted' dir in the electron app. - */ - - - async excludeFilesFromArchive() { - this.log.info('excluding files from packing'); // Ensure empty `extracted` dir - - try { - await this.$.utils.rmWithRetries('-rf', this.$.env.paths.electronApp.extracted); - } catch (e) { - throw new Error(e); - } - - _shelljs.default.mkdir(this.$.env.paths.electronApp.extracted); - - const configs = this.$.desktop.gatherModuleConfigs(); // Move files that should not be asar'ed. - - configs.forEach(config => { - const moduleConfig = config; - - if ('extract' in moduleConfig) { - if (!Array.isArray(moduleConfig.extract)) { - moduleConfig.extract = [moduleConfig.extract]; - } - - moduleConfig.extract.forEach(file => { - this.log.debug(`excluding ${file} from ${config.name}`); - - const filePath = _path.default.join(this.$.env.paths.desktopTmp.modules, moduleConfig.dirName, file); - - const destinationPath = _path.default.join(this.$.env.paths.electronApp.extracted, moduleConfig.dirName); - - if (!this.$.utils.exists(destinationPath)) { - _shelljs.default.mkdir(destinationPath); - } - - _shelljs.default.mv(filePath, destinationPath); - }); - } - }); - } - -} - -exports.default = ElectronApp; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzaGVsbCIsImNvbmZpZyIsImZhdGFsIiwiRWxlY3Ryb25BcHAiLCJjb25zdHJ1Y3RvciIsIiQiLCJsb2ciLCJMb2ciLCJzY2FmZm9sZCIsIkVsZWN0cm9uQXBwU2NhZmZvbGQiLCJkZXBzTWFuYWdlciIsIkRlcGVuZGVuY2llc01hbmFnZXIiLCJnZXREZWZhdWx0UGFja2FnZUpzb24iLCJkZXBlbmRlbmNpZXMiLCJtZXRlb3JBcHAiLCJwYWNrYWdlSnNvbiIsInZlcnNpb24iLCJjb21wYXRpYmlsaXR5VmVyc2lvbiIsImRlcHJlY3RhdGVkUGx1Z2lucyIsInBhY2tTa2VsZXRvblRvQXNhciIsImV4Y2x1ZGVGcm9tRGVsIiwiaW5mbyIsIlByb21pc2UiLCJyZXNvbHZlIiwiZXh0cmFjdCIsImdldE1vZHVsZXNUb0V4dHJhY3QiLCJkZWJ1ZyIsImZzIiwicmVuYW1lU3luYyIsImVudiIsInBhdGhzIiwiZWxlY3Ryb25BcHAiLCJub2RlTW9kdWxlcyIsInBhdGgiLCJqb2luIiwiYXBwUm9vdCIsImV4dHJhY3RlZCIsImV4dHJhY3RNb2R1bGVzIiwiYXNhciIsImNyZWF0ZVBhY2thZ2UiLCJhcHBBc2FyIiwidGhlbiIsIm12IiwiZm9yRWFjaCIsIm1vZHVsZSIsImNwIiwiZXh0cmFjdGVkTm9kZU1vZHVsZXMiLCJ1dGlscyIsImV4aXN0cyIsImV4dHJhY3RlZE5vZGVNb2R1bGVzQmluIiwiZXhjbHVkZSIsImNvbmNhdCIsImRlbCIsInN5bmMiLCJyb290Iiwic2VwIiwibWFwIiwicGF0aFRvRXhjbHVkZSIsImZvcmNlIiwiZXh0IiwibGVuZ3RoIiwicm0iLCJta2RpclN5bmMiLCJleHRyYWN0QmluIiwiSlNPTiIsInBhcnNlIiwicmVhZEZpbGVTeW5jIiwiZSIsImJpbnMiLCJiaW4iLCJPYmplY3QiLCJrZXlzIiwiZXh0ZW5zaW9uIiwiYmluRmlsZVBhdGgiLCJzeW1saW5rRXhpc3RzIiwiYmluYXJ5TW9kdWxlc0RldGVjdG9yIiwiQmluYXJ5TW9kdWxlRGV0ZWN0b3IiLCJ0b0JlRXh0cmFjdGVkIiwiZGV0ZWN0IiwiZGVza3RvcCIsImdldFNldHRpbmdzIiwiQXJyYXkiLCJpc0FycmF5IiwibWVyZ2UiLCJ2ZXJib3NlIiwiY2FsY3VsYXRlQ29tcGF0aWJpbGl0eVZlcnNpb24iLCJzZXR0aW5ncyIsImRlc2t0b3BIQ1BDb21wYXRpYmlsaXR5VmVyc2lvbiIsIndhcm4iLCJtZDUiLCJjcnlwdG8iLCJjcmVhdGVIYXNoIiwiZ2V0RGVwZW5kZW5jaWVzIiwiZGVwZW5kZW5jaWVzU29ydGVkIiwic29ydCIsImRlcGVuZGVuY3kiLCJtYWluQ29tcGF0aWJpbGl0eVZlcnNpb24iLCJnZXRWZXJzaW9uIiwic3BsaXQiLCJwdXNoIiwiZGVza3RvcENvbXBhdGliaWxpdHlWZXJzaW9uIiwicHJvY2VzcyIsIk1FVEVPUl9ERVNLVE9QX0RFQlVHX0RFU0tUT1BfQ09NUEFUSUJJTElUWV9WRVJTSU9OIiwiTUVURU9SX0RFU0tUT1BfREVCVUciLCJzdHJpbmdpZnkiLCJ1cGRhdGUiLCJkaWdlc3QiLCJpbml0IiwiZWxlY3Ryb24iLCJlbGVjdHJvbkJ1aWxkZXIiLCJleGl0IiwiYnVpbGQiLCJydW4iLCJjaGVjayIsIm9wdGlvbnMiLCJlcnJvciIsInVwZGF0ZUdpdElnbm9yZSIsInJvb3ROYW1lIiwicmVtb3ZlRGVwcmVjYXRlZFBhY2thZ2VzIiwiZW5zdXJlRGVza3RvcEhDUFBhY2thZ2VzIiwibWFrZSIsImZpbGVOYW1lIiwiZGlyTmFtZSIsImV4aXN0c1N5bmMiLCJjb3B5RmlsZVN5bmMiLCJleHBvc2VFbGVjdHJvbk1vZHVsZXMiLCJ1cGRhdGVQYWNrYWdlSnNvbkZpZWxkcyIsInVwZGF0ZURlcGVuZGVuY2llc0xpc3QiLCJoYW5kbGVUZW1wb3JhcnlOb2RlTW9kdWxlcyIsIm5vZGVNb2R1bGVzUmVtb3ZlZCIsImhhbmRsZVN0YXRlT2ZOb2RlTW9kdWxlcyIsInJlYnVpbGREZXBzIiwibGlua05wbVBhY2thZ2VzIiwiaW5zdGFsbExvY2FsTm9kZU1vZHVsZXMiLCJlbnN1cmVNZXRlb3JEZXBlbmRlbmNpZXMiLCJpc1Byb2R1Y3Rpb25CdWlsZCIsImNvcHlEZXNrdG9wVG9EZXNrdG9wVGVtcCIsInVwZGF0ZVNldHRpbmdzSnNvbkZpZWxkcyIsImV4Y2x1ZGVGaWxlc0Zyb21BcmNoaXZlIiwidHJhbnNwaWxlQW5kTWluaWZ5IiwicGFja0Rlc2t0b3BUb0FzYXIiLCJnZXRNZXRlb3JDbGllbnRCdWlsZCIsImV4cG9zZWRNb2R1bGVzIiwicHJlbG9hZCIsIm1vZHVsZXMiLCJyZWR1Y2UiLCJwcmV2IiwicmVwbGFjZSIsIndyaXRlRmlsZVN5bmMiLCJwYWNrYWdlcyIsInBhY2thZ2VzV2l0aFZlcnNpb24iLCJwbHVnaW5zIiwicGx1Z2luIiwibWV0ZW9yRGVwZW5kZW5jaWVzIiwidW5zaGlmdCIsInBhY2thZ2VOYW1lIiwicGFja2FnZXNDb3VudCIsImZpbHRlciIsInZhbHVlIiwiaW5jbHVkZXMiLCJzdWJzdHIiLCJtZXRlb3JNYW5hZ2VyIiwiZW5zdXJlUGFja2FnZXMiLCJFcnJvciIsImlhMzIiLCJybVdpdGhSZXRyaWVzIiwidG1wTm9kZU1vZHVsZXMiLCJwcm9taXNlcyIsImxpbmtQYWNrYWdlcyIsInJ1bk5wbSIsInVuZGVmaW5lZCIsImFsbCIsImVuc3VyZURlcHMiLCJzdGRpbyIsImNoZWNrUGx1Z2luc1ZlcnNpb24iLCJwbHVnaW5zVmVyc2lvbnMiLCJzZXR0aW5nc0pzb24iLCJzY2FmZm9sZFBsdWdpbnNWZXJzaW9uIiwicGx1Z2luTmFtZSIsInNlbXZlciIsImx0IiwiZGVza3RvcERlcGVuZGVuY2llcyIsIm1lcmdlRGVwZW5kZW5jaWVzIiwiZnJvbVNldHRpbmdzIiwiZ2V0UmVtb3RlRGVwZW5kZW5jaWVzIiwibG9jYWxEZXBlbmRlbmNpZXMiLCJnZXRMb2NhbERlcGVuZGVuY2llcyIsImFyY2giLCJfIiwidmFsdWVzIiwibGFzdFJlYnVpbGQiLCJwcmVwYXJlTGFzdFJlYnVpbGRPYmplY3QiLCJnZXRHeXBFbnYiLCJmcmFtZXdvcmtJbmZvIiwicGxhdGZvcm0iLCJpbnN0YWxsZXIiLCJMb2NhbEluc3RhbGxlciIsIm5wbUVudiIsInByb2dyZXNzIiwiaW5zdGFsbCIsImluc3RhbGxPclJlYnVpbGQiLCJhc3NpZ25JbiIsInBhY2thZ2VKc29uRmllbGRzIiwibmFtZSIsInByb2plY3ROYW1lIiwiZ2V0SGFzaFZlcnNpb24iLCJkZXNrdG9wVmVyc2lvbiIsIm1ldGVvckRlc2t0b3BWZXJzaW9uIiwicHJvZERlYnVnIiwiZGVza3RvcFRtcCIsInJlamVjdCIsImRlc2t0b3BBc2FyIiwiY2F0Y2giLCJ1Z2xpZnlPcHRpb25zIiwidWdsaWZ5aW5nRW5hYmxlZCIsInVnbGlmeSIsInByZXNldCIsInByZXNldEVudiIsImFzc2VydFZlcnNpb24iLCJ0YXJnZXRzIiwibm9kZSIsImRhdGEiLCJmaWxlcyIsInJlYWREaXIiLCJmaWxlIiwiZW5kc1dpdGgiLCJjb2RlIiwidHJhbnNmb3JtRmlsZVN5bmMiLCJwcmVzZXRzIiwibWluaWZ5IiwibWtkaXIiLCJjb25maWdzIiwiZ2F0aGVyTW9kdWxlQ29uZmlncyIsIm1vZHVsZUNvbmZpZyIsImZpbGVQYXRoIiwiZGVzdGluYXRpb25QYXRoIl0sInNvdXJjZXMiOlsiLi4vbGliL2VsZWN0cm9uQXBwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuaW1wb3J0IHJlZ2VuZXJhdG9yUnVudGltZSBmcm9tICdyZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUnO1xuaW1wb3J0IGFzYXIgZnJvbSAnQGVsZWN0cm9uL2FzYXInO1xuaW1wb3J0IGFzc2lnbkluIGZyb20gJ2xvZGFzaC9hc3NpZ25Jbic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgTG9jYWxJbnN0YWxsZXIsIHByb2dyZXNzIH0gZnJvbSAnaW5zdGFsbC1sb2NhbCc7XG5pbXBvcnQgeyB0cmFuc2Zvcm1GaWxlU3luYyB9IGZyb20gJ0BiYWJlbC9jb3JlJztcbmltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCBkZWwgZnJvbSAnZGVsJztcbmltcG9ydCBwcmVzZXRFbnYgZnJvbSAnQGJhYmVsL3ByZXNldC1lbnYnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHNoZWxsIGZyb20gJ3NoZWxsanMnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHVnbGlmeSBmcm9tICd0ZXJzZXInO1xuXG5pbXBvcnQgTG9nIGZyb20gJy4vbG9nJztcbmltcG9ydCBFbGVjdHJvbkFwcFNjYWZmb2xkIGZyb20gJy4vZWxlY3Ryb25BcHBTY2FmZm9sZCc7XG5pbXBvcnQgRGVwZW5kZW5jaWVzTWFuYWdlciBmcm9tICcuL2RlcGVuZGVuY2llc01hbmFnZXInO1xuaW1wb3J0IEJpbmFyeU1vZHVsZURldGVjdG9yIGZyb20gJy4vYmluYXJ5TW9kdWxlc0RldGVjdG9yJztcblxuc2hlbGwuY29uZmlnLmZhdGFsID0gdHJ1ZTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSAuZGVza3RvcCBkaXIgc2NhZmZvbGQuXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWxlY3Ryb25BcHAge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TWV0ZW9yRGVza3RvcH0gJCAtIGNvbnRleHRcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigkKSB7XG4gICAgICAgIHRoaXMubG9nID0gbmV3IExvZygnZWxlY3Ryb25BcHAnKTtcbiAgICAgICAgdGhpcy5zY2FmZm9sZCA9IG5ldyBFbGVjdHJvbkFwcFNjYWZmb2xkKCQpO1xuICAgICAgICB0aGlzLmRlcHNNYW5hZ2VyID0gbmV3IERlcGVuZGVuY2llc01hbmFnZXIoXG4gICAgICAgICAgICAkLFxuICAgICAgICAgICAgdGhpcy5zY2FmZm9sZC5nZXREZWZhdWx0UGFja2FnZUpzb24oKS5kZXBlbmRlbmNpZXNcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy4kID0gJDtcbiAgICAgICAgdGhpcy5tZXRlb3JBcHAgPSB0aGlzLiQubWV0ZW9yQXBwO1xuICAgICAgICB0aGlzLnBhY2thZ2VKc29uID0gbnVsbDtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb21wYXRpYmlsaXR5VmVyc2lvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuZGVwcmVjdGF0ZWRQbHVnaW5zID0gWydtZXRlb3ItZGVza3RvcC1sb2NhbHN0b3JhZ2UnXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYWtlcyBhbiBhcHAuYXNhciBmcm9tIHRoZSBza2VsZXRvbiBhcHAuXG4gICAgICogQHByb3BlcnR5IHtBcnJheX0gZXhjbHVkZUZyb21EZWwgLSBsaXN0IG9mIHBhdGhzIHRvIGV4Y2x1ZGUgZnJvbSBkZWxldGluZ1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIHBhY2tTa2VsZXRvblRvQXNhcihleGNsdWRlRnJvbURlbCA9IFtdKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ3BhY2tpbmcgc2tlbGV0b24gYXBwIGFuZCBub2RlX21vZHVsZXMgdG8gYXNhciBhcmNoaXZlJyk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXh0cmFjdCA9IHRoaXMuZ2V0TW9kdWxlc1RvRXh0cmFjdCgpO1xuXG4gICAgICAgICAgICAvLyBXZSB3YW50IHRvIHBhY2sgc2tlbGV0b24gYXBwIGFuZCBub2RlX21vZHVsZXMgdG9nZXRoZXIsIHNvIHdlIG5lZWQgdG8gdGVtcG9yYXJpbHlcbiAgICAgICAgICAgIC8vIG1vdmUgbm9kZV9tb2R1bGVzIHRvIGFwcCBkaXIuXG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZygnbW92aW5nIG5vZGVfbW9kdWxlcyB0byBhcHAgZGlyJyk7XG5cbiAgICAgICAgICAgIGZzLnJlbmFtZVN5bmMoXG4gICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5ub2RlTW9kdWxlcyxcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5hcHBSb290LCAnbm9kZV9tb2R1bGVzJylcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGxldCBleHRyYWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGV4dHJhY3RlZCA9IHRoaXMuZXh0cmFjdE1vZHVsZXMoZXh0cmFjdCk7XG5cbiAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKCdwYWNraW5nJyk7XG4gICAgICAgICAgICBhc2FyLmNyZWF0ZVBhY2thZ2UoXG4gICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5hcHBSb290LFxuICAgICAgICAgICAgICAgIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuYXBwQXNhclxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTGV0cyBtb3ZlIHRoZSBub2RlX21vZHVsZXMgYmFjay5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoJ21vdmluZyBub2RlX21vZHVsZXMgYmFjayBmcm9tIGFwcCBkaXInKTtcblxuICAgICAgICAgICAgICAgICAgICBzaGVsbC5tdihcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguam9pbih0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLmFwcFJvb3QsICdub2RlX21vZHVsZXMnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubm9kZU1vZHVsZXNcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGNyZWF0ZSBhIGZ1bGwgbm9kZSBtb2R1bGVzIGJhY2suIEluIG90aGVyIHdvcmRzIHdlIHdhbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBleHRyYWN0ZWQgbW9kdWxlcyBiYWNrLlxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdC5mb3JFYWNoKG1vZHVsZSA9PiBzaGVsbC5jcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLXJmJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5leHRyYWN0ZWROb2RlTW9kdWxlcywgbW9kdWxlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5ub2RlTW9kdWxlcywgbW9kdWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgLmJpbiBiYWNrLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuJC51dGlscy5leGlzdHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5leHRyYWN0ZWROb2RlTW9kdWxlc0JpblxuICAgICAgICAgICAgICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWxsLmNwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5leHRyYWN0ZWROb2RlTW9kdWxlc0JpbiwgJyonKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubm9kZU1vZHVsZXMsICcuYmluJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoJ2RlbGV0aW5nIHNvdXJjZSBmaWxlcycpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGNsdWRlID0gW3RoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubm9kZU1vZHVsZXNdLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLmFwcEFzYXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5wYWNrYWdlSnNvblxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVGcm9tRGVsXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgZGVsLnN5bmMoXG4gICAgICAgICAgICAgICAgICAgICAgICBbYCR7dGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5yb290fSR7cGF0aC5zZXB9KmBdLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlLm1hcChwYXRoVG9FeGNsdWRlID0+IGAhJHtwYXRoVG9FeGNsdWRlfWApXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBmb3JjZTogdHJ1ZSB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgc3BlY2lmaWVkIG5vZGUgbW9kdWxlcyB0byBhIHNlcGFyYXRlIGRpcmVjdG9yeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBleHRyYWN0XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgZXh0cmFjdE1vZHVsZXMoZXh0cmFjdCkge1xuICAgICAgICBjb25zdCBleHQgPSBbJy5qcycsICcuYmF0JywgJy5zaCcsICcuY21kJywgJyddO1xuXG4gICAgICAgIGlmIChleHRyYWN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiQudXRpbHMuZXhpc3RzKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuZXh0cmFjdGVkTm9kZU1vZHVsZXMpKSB7XG4gICAgICAgICAgICAgICAgc2hlbGwucm0oJy1yZicsIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuZXh0cmFjdGVkTm9kZU1vZHVsZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuZXh0cmFjdGVkTm9kZU1vZHVsZXMpO1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuZXh0cmFjdGVkTm9kZU1vZHVsZXNCaW4pO1xuXG4gICAgICAgICAgICBleHRyYWN0LmZvckVhY2goKG1vZHVsZSkgPT4ge1xuICAgICAgICAgICAgICAgIGZzLnJlbmFtZVN5bmMoXG4gICAgICAgICAgICAgICAgICAgIHBhdGguam9pbih0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLmFwcFJvb3QsICdub2RlX21vZHVsZXMnLCBtb2R1bGUpLFxuICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5leHRyYWN0ZWROb2RlTW9kdWxlcywgbW9kdWxlKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIC8vIE1vdmUgYmlucy5cbiAgICAgICAgICAgICAgICB0aGlzLmV4dHJhY3RCaW4obW9kdWxlLCBleHQpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyB0aGUgYmluIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBhIGNlcnRhaW4gbm9kZSBtb2R1bGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vZHVsZVxuICAgICAqIEBwYXJhbSBleHRcbiAgICAgKi9cbiAgICBleHRyYWN0QmluKG1vZHVsZSwgZXh0KSB7XG4gICAgICAgIGxldCBwYWNrYWdlSnNvbjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgICBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgICAgIHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuZXh0cmFjdGVkTm9kZU1vZHVsZXMsIG1vZHVsZSwgJ3BhY2thZ2UuanNvbidcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgJ3V0ZjgnXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcGFja2FnZUpzb24gPSB7fTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgY29uc3QgYmlucyA9ICgnYmluJyBpbiBwYWNrYWdlSnNvbiAmJiB0eXBlb2YgcGFja2FnZUpzb24uYmluID09PSAnb2JqZWN0JykgPyBPYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5iaW4pIDogW107XG5cbiAgICAgICAgaWYgKGJpbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYmlucy5mb3JFYWNoKChiaW4pID0+IHtcbiAgICAgICAgICAgICAgICBleHQuZm9yRWFjaCgoZXh0ZW5zaW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpbkZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5hcHBSb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgJ25vZGVfbW9kdWxlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAnLmJpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtiaW59JHtleHRlbnNpb259YFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4kLnV0aWxzLmV4aXN0cyhiaW5GaWxlUGF0aCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJC51dGlscy5zeW1saW5rRXhpc3RzKGJpbkZpbGVQYXRoKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZzLnJlbmFtZVN5bmMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLmV4dHJhY3RlZE5vZGVNb2R1bGVzQmluLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtiaW59JHtleHRlbnNpb259YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWVyZ2VzIHRoZSBgZXh0cmFjdGAgZmllbGQgd2l0aCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIG1vZHVsZXMuXG4gICAgICovXG4gICAgZ2V0TW9kdWxlc1RvRXh0cmFjdCgpIHtcbiAgICAgICAgY29uc3QgYmluYXJ5TW9kdWxlc0RldGVjdG9yID1cbiAgICAgICAgICAgIG5ldyBCaW5hcnlNb2R1bGVEZXRlY3Rvcih0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLm5vZGVNb2R1bGVzKTtcbiAgICAgICAgY29uc3QgdG9CZUV4dHJhY3RlZCA9IGJpbmFyeU1vZHVsZXNEZXRlY3Rvci5kZXRlY3QoKTtcblxuICAgICAgICBsZXQgeyBleHRyYWN0IH0gPSB0aGlzLiQuZGVza3RvcC5nZXRTZXR0aW5ncygpO1xuXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShleHRyYWN0KSkge1xuICAgICAgICAgICAgZXh0cmFjdCA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWVyZ2UgPSB7fTtcbiAgICAgICAgdG9CZUV4dHJhY3RlZC5jb25jYXQoZXh0cmFjdCkuZm9yRWFjaCgobW9kdWxlKSA9PiB7XG4gICAgICAgICAgICBtZXJnZVttb2R1bGVdID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGV4dHJhY3QgPSBPYmplY3Qua2V5cyhtZXJnZSk7XG4gICAgICAgIGlmIChleHRyYWN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMubG9nLnZlcmJvc2UoYHJlc3VsdGFudCBtb2R1bGVzIHRvIGV4dHJhY3QgbGlzdCBpczogJHtleHRyYWN0LmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4dHJhY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyBhIG1kNSBmcm9tIGFsbCBkZXBlbmRlbmNpZXMuXG4gICAgICovXG4gICAgY2FsY3VsYXRlQ29tcGF0aWJpbGl0eVZlcnNpb24oKSB7XG4gICAgICAgIHRoaXMubG9nLnZlcmJvc2UoJ2NhbGN1bGF0aW5nIGNvbXBhdGliaWxpdHkgdmVyc2lvbicpO1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuJC5kZXNrdG9wLmdldFNldHRpbmdzKCk7XG5cbiAgICAgICAgaWYgKCgnZGVza3RvcEhDUENvbXBhdGliaWxpdHlWZXJzaW9uJyBpbiBzZXR0aW5ncykpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcGF0aWJpbGl0eVZlcnNpb24gPSBgJHtzZXR0aW5ncy5kZXNrdG9wSENQQ29tcGF0aWJpbGl0eVZlcnNpb259YDtcbiAgICAgICAgICAgIHRoaXMubG9nLndhcm4oYGNvbXBhdGliaWxpdHkgdmVyc2lvbiBvdmVycmlkZGVuIHRvICR7dGhpcy5jb21wYXRpYmlsaXR5VmVyc2lvbn1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1kNSA9IGNyeXB0by5jcmVhdGVIYXNoKCdtZDUnKTtcbiAgICAgICAgbGV0IGRlcGVuZGVuY2llcyA9IHRoaXMuZGVwc01hbmFnZXIuZ2V0RGVwZW5kZW5jaWVzKCk7XG4gICAgICAgIGNvbnN0IGRlcGVuZGVuY2llc1NvcnRlZCA9IE9iamVjdC5rZXlzKGRlcGVuZGVuY2llcykuc29ydCgpO1xuICAgICAgICBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXNTb3J0ZWQubWFwKGRlcGVuZGVuY3kgPT5cbiAgICAgICAgICAgIGAke2RlcGVuZGVuY3l9OiR7ZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldfWApO1xuICAgICAgICBjb25zdCBtYWluQ29tcGF0aWJpbGl0eVZlcnNpb24gPSB0aGlzLiQuZ2V0VmVyc2lvbigpLnNwbGl0KCcuJyk7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKCdtZXRlb3ItZGVza3RvcCBjb21wYXRpYmlsaXR5IHZlcnNpb24gaXMgJyxcbiAgICAgICAgICAgIGAke21haW5Db21wYXRpYmlsaXR5VmVyc2lvblswXX1gKTtcbiAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goXG4gICAgICAgICAgICBgbWV0ZW9yLWRlc2t0b3A6JHttYWluQ29tcGF0aWJpbGl0eVZlcnNpb25bMF19YFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGRlc2t0b3BDb21wYXRpYmlsaXR5VmVyc2lvbiA9IHNldHRpbmdzLnZlcnNpb24uc3BsaXQoJy4nKVswXTtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoJy5kZXNrdG9wIGNvbXBhdGliaWxpdHkgdmVyc2lvbiBpcyAnLCBkZXNrdG9wQ29tcGF0aWJpbGl0eVZlcnNpb24pO1xuICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChcbiAgICAgICAgICAgIGBkZXNrdG9wLWFwcDoke2Rlc2t0b3BDb21wYXRpYmlsaXR5VmVyc2lvbn1gXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk1FVEVPUl9ERVNLVE9QX0RFQlVHX0RFU0tUT1BfQ09NUEFUSUJJTElUWV9WRVJTSU9OIHx8XG4gICAgICAgICAgICBwcm9jZXNzLmVudi5NRVRFT1JfREVTS1RPUF9ERUJVR1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBjb21wYXRpYmlsaXR5IHZlcnNpb24gY2FsY3VsYXRlZCBmcm9tICR7SlNPTi5zdHJpbmdpZnkoZGVwZW5kZW5jaWVzKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1kNS51cGRhdGUoSlNPTi5zdHJpbmdpZnkoZGVwZW5kZW5jaWVzKSk7XG5cbiAgICAgICAgdGhpcy5jb21wYXRpYmlsaXR5VmVyc2lvbiA9IG1kNS5kaWdlc3QoJ2hleCcpO1xuICAgIH1cblxuICAgIGFzeW5jIGluaXQoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiQuZWxlY3Ryb24uaW5pdCgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4kLmVsZWN0cm9uQnVpbGRlci5pbml0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLndhcm4oJ2Vycm9yIG9jY3VycmVkIHdoaWxlIGluaXRpYWxpc2luZyBlbGVjdHJvbiBhbmQgZWxlY3Ryb24tYnVpbGRlciBpbnRlZ3JhdGlvbicsIGUpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVucyBhbGwgbmVjZXNzYXJ5IHRhc2tzIHRvIGJ1aWxkIHRoZSBkZXNrdG9waWZpZWQgYXBwLlxuICAgICAqL1xuICAgIGFzeW5jIGJ1aWxkKHJ1biA9IGZhbHNlKSB7XG4gICAgICAgIC8vIFRPRE86IHJlZmFjdG9yIHRvIGEgdGFzayBydW5uZXJcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnc2NhZmZvbGRpbmcnKTtcblxuICAgICAgICBpZiAoIXRoaXMuJC5kZXNrdG9wLmNoZWNrKCkpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy4kLmVudi5vcHRpb25zLnNjYWZmb2xkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ3NlZW1zIHRoYXQgeW91IGRvIG5vdCBoYXZlIGEgLmRlc2t0b3AgZGlyIGluIHlvdXIgcHJvamVjdCBvciBpdCBpcycgK1xuICAgICAgICAgICAgICAgICAgICAnIGNvcnJ1cHRlZC4gUnVuIFxcJ25wbSBydW4gZGVza3RvcCAtLSBpbml0XFwnIHRvIGdldCBhIG5ldyBvbmUuJyk7XG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IGZhaWwsIHNvIHRoYXQgbnBtIHdpbGwgbm90IHByaW50IGhpcyBlcnJvciBzdHVmZiB0byBjb25zb2xlLlxuICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kLmRlc2t0b3Auc2NhZmZvbGQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLiQubWV0ZW9yQXBwLnVwZGF0ZUdpdElnbm9yZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy4kLm1ldGVvckFwcC51cGRhdGVHaXRJZ25vcmUoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cud2FybihgZXJyb3Igb2NjdXJyZWQgd2hpbGUgYWRkaW5nICR7dGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5yb290TmFtZX1gICtcbiAgICAgICAgICAgICAgICAndG8gLmdpdGlnbm9yZTogJywgZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4kLm1ldGVvckFwcC5yZW1vdmVEZXByZWNhdGVkUGFja2FnZXMoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ2Vycm9yIHdoaWxlIHJlbW92aW5nIGRlcHJlY2F0ZWQgcGFja2FnZXM6ICcsIGUpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuJC5tZXRlb3JBcHAuZW5zdXJlRGVza3RvcEhDUFBhY2thZ2VzKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKCdlcnJvciB3aGlsZSBjaGVja2luZyBmb3IgcmVxdWlyZWQgcGFja2FnZXM6ICcsIGUpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2NhZmZvbGQubWFrZSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igd2hpbGUgc2NhZmZvbGRpbmc6ICcsIGUpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gJy5ucG1yYyc7XG4gICAgICAgICAgICBjb25zdCBkaXJOYW1lID0gJy5tZXRlb3IvZGVza3RvcC1idWlsZCc7XG4gICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJOYW1lKSAmJiBmcy5leGlzdHNTeW5jKGZpbGVOYW1lKSkge1xuICAgICAgICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhmaWxlTmFtZSwgYCR7ZGlyTmFtZX0vJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cud2FybignZXJyb3Igd2hpbGUgY29weWluZyAubnBtcmMnLCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmV4cG9zZUVsZWN0cm9uTW9kdWxlcygpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igd2hpbGUgZXhwb3NpbmcgZWxlY3Ryb24gbW9kdWxlczogJywgZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVQYWNrYWdlSnNvbkZpZWxkcygpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igd2hpbGUgdXBkYXRpbmcgcGFja2FnZS5qc29uOiAnLCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURlcGVuZGVuY2llc0xpc3QoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ2Vycm9yIHdoaWxlIG1lcmdpbmcgZGVwZW5kZW5jaWVzIGxpc3Q6ICcsIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlQ29tcGF0aWJpbGl0eVZlcnNpb24oKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ2Vycm9yIHdoaWxlIGNhbGN1bGF0aW5nIGNvbXBhdGliaWxpdHkgdmVyc2lvbjogJywgZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVUZW1wb3JhcnlOb2RlTW9kdWxlcygpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGVtcG9yYXJ5IG5vZGVfbW9kdWxlczogJywgZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbm9kZU1vZHVsZXNSZW1vdmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbm9kZU1vZHVsZXNSZW1vdmVkID0gYXdhaXQgdGhpcy5oYW5kbGVTdGF0ZU9mTm9kZU1vZHVsZXMoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ2Vycm9yIG9jY3VycmVkIHdoaWxlIGNsZWFyaW5nIG5vZGVfbW9kdWxlczogJywgZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWJ1aWxkRGVwcyh0cnVlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ2Vycm9yIG9jY3VycmVkIHdoaWxlIGluc3RhbGxpbmcgbm9kZV9tb2R1bGVzOiAnLCBlKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbm9kZU1vZHVsZXNSZW1vdmVkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVidWlsZERlcHMoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igb2NjdXJyZWQgd2hpbGUgcmVidWlsZGluZyBuYXRpdmUgbm9kZSBtb2R1bGVzOiAnLCBlKTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5saW5rTnBtUGFja2FnZXMoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoYGxpbmtpbmcgcGFja2FnZXMgZmFpbGVkOiAke2V9YCk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbnN0YWxsTG9jYWxOb2RlTW9kdWxlcygpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igb2NjdXJyZWQgd2hpbGUgaW5zdGFsbGluZyBsb2NhbCBub2RlIG1vZHVsZXM6ICcsIGUpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVNZXRlb3JEZXBlbmRlbmNpZXMoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ2Vycm9yIG9jY3VycmVkIHdoaWxlIGVuc3VyaW5nIG1ldGVvciBkZXBlbmRlbmNpZXMgYXJlIGluc3RhbGxlZDogJywgZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGlmICh0aGlzLiQuZW52LmlzUHJvZHVjdGlvbkJ1aWxkKCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wYWNrU2tlbGV0b25Ub0FzYXIoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igd2hpbGUgcGFja2luZyBza2VsZXRvbiB0byBhc2FyOiAnLCBlKTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBmaW5kIGEgd2F5IHRvIGF2b2lkIGNvcHlpbmcgLmRlc2t0b3AgdG8gYSB0ZW1wIGxvY2F0aW9uXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmNvcHlEZXNrdG9wVG9EZXNrdG9wVGVtcCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igd2hpbGUgY29weWluZyAuZGVza3RvcCB0byBhIHRlbXBvcmFyeSBsb2NhdGlvbjogJywgZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVTZXR0aW5nc0pzb25GaWVsZHMoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ2Vycm9yIHdoaWxlIHVwZGF0aW5nIHNldHRpbmdzLmpzb246ICcsIGUpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZXhjbHVkZUZpbGVzRnJvbUFyY2hpdmUoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ2Vycm9yIHdoaWxlIGV4Y2x1ZGluZyBmaWxlcyBmcm9tIHBhY2tpbmcgdG8gYXNhcjogJywgZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy50cmFuc3BpbGVBbmRNaW5pZnkoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ2Vycm9yIHdoaWxlIHRyYW5zcGlsaW5nIG9yIG1pbmlmeWluZzogJywgZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wYWNrRGVza3RvcFRvQXNhcigpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igb2NjdXJyZWQgd2hpbGUgcGFja2luZyAuZGVza3RvcCB0byBhc2FyOiAnLCBlKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdldE1ldGVvckNsaWVudEJ1aWxkKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKCdlcnJvciBvY2N1cnJlZCBkdXJpbmcgZ2V0dGluZyBtZXRlb3IgbW9iaWxlIGJ1aWxkOiAnLCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChydW4pIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ3J1bm5pbmcnKTtcbiAgICAgICAgICAgIHRoaXMuJC5lbGVjdHJvbi5ydW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ2J1aWx0Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgdGhlIGBleHBvc2VkTW9kdWxlc2Agc2V0dGluZyBmcm9tIGBzZXR0aW5ncy5qc29uYCBpbnRvIGBwcmVsb2FkLmpzYCBtb2RpZnlpbmcgaXRzIGNvZGVcbiAgICAgKiBzbyB0aGF0IHRoZSBzY3JpcHQgd2lsbCBoYXZlIGl0IGhhcmRjb2RlZC5cbiAgICAgKi9cbiAgICBleHBvc2VFbGVjdHJvbk1vZHVsZXMoKSB7XG4gICAgICAgIGNvbnN0IHsgZXhwb3NlZE1vZHVsZXMgfSA9IHRoaXMuJC5kZXNrdG9wLmdldFNldHRpbmdzKCk7XG4gICAgICAgIGlmIChleHBvc2VkTW9kdWxlcyAmJiBBcnJheS5pc0FycmF5KGV4cG9zZWRNb2R1bGVzKSAmJiBleHBvc2VkTW9kdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcHJlbG9hZCA9IGZzLnJlYWRGaWxlU3luYyh0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnByZWxvYWQsICd1dGY4Jyk7XG4gICAgICAgICAgICBjb25zdCBtb2R1bGVzID0gdGhpcy4kLmRlc2t0b3AuZ2V0U2V0dGluZ3MoKVxuICAgICAgICAgICAgICAgIC5leHBvc2VkTW9kdWxlc1xuICAgICAgICAgICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXR1cm4tYXNzaWduLG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgICAgIChwcmV2LCBtb2R1bGUpID0+IChwcmV2ICs9IGAnJHttb2R1bGV9JywgYCwgcHJldiksICcnXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgcHJlbG9hZCA9IHByZWxvYWQucmVwbGFjZSgnY29uc3QgZXhwb3NlZE1vZHVsZXMgPSBbJywgYGNvbnN0IGV4cG9zZWRNb2R1bGVzID0gWyR7bW9kdWxlc31gKTtcbiAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5wcmVsb2FkLCBwcmVsb2FkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuc3VyZXMgYWxsIHJlcXVpcmVkIGRlcGVuZGVuY2llcyBhcmUgYWRkZWQgdG8gdGhlIE1ldGVvciBwcm9qZWN0LlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlLjx2b2lkPn1cbiAgICAgKi9cbiAgICBhc3luYyBlbnN1cmVNZXRlb3JEZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIGxldCBwYWNrYWdlcyA9IFtdO1xuICAgICAgICBjb25zdCBwYWNrYWdlc1dpdGhWZXJzaW9uID0gW107XG4gICAgICAgIGxldCBwbHVnaW5zID0gJ3BsdWdpbnMgWyc7XG5cbiAgICAgICAgT2JqZWN0LmtleXModGhpcy4kLmRlc2t0b3AuZ2V0RGVwZW5kZW5jaWVzKCkucGx1Z2lucykuZm9yRWFjaCgocGx1Z2luKSA9PiB7XG4gICAgICAgICAgICAvLyBSZWFkIHBhY2thZ2UuanNvbiBvZiB0aGUgcGx1Z2luLlxuICAgICAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPVxuICAgICAgICAgICAgICAgIEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLm5vZGVNb2R1bGVzLCBwbHVnaW4sICdwYWNrYWdlLmpzb24nXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3V0ZjgnXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoJ21ldGVvckRlcGVuZGVuY2llcycgaW4gcGFja2FnZUpzb24gJiYgdHlwZW9mIHBhY2thZ2VKc29uLm1ldGVvckRlcGVuZGVuY2llcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBwbHVnaW5zICs9IGAke3BsdWdpbn0sIGA7XG4gICAgICAgICAgICAgICAgcGFja2FnZXMudW5zaGlmdCguLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5tZXRlb3JEZXBlbmRlbmNpZXMpKTtcbiAgICAgICAgICAgICAgICBwYWNrYWdlc1dpdGhWZXJzaW9uLnVuc2hpZnQoLi4ucGFja2FnZXMubWFwKChwYWNrYWdlTmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFja2FnZUpzb24ubWV0ZW9yRGVwZW5kZW5jaWVzW3BhY2thZ2VOYW1lXSA9PT0gJ0B2ZXJzaW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke3BhY2thZ2VOYW1lfUAke3BhY2thZ2VKc29uLnZlcnNpb259YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7cGFja2FnZU5hbWV9QCR7cGFja2FnZUpzb24ubWV0ZW9yRGVwZW5kZW5jaWVzW3BhY2thZ2VOYW1lXX1gO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcGFja2FnZXNDb3VudCA9IHBhY2thZ2VzLmxlbmd0aDtcbiAgICAgICAgcGFja2FnZXMgPSBwYWNrYWdlcy5maWx0ZXIodmFsdWUgPT4gIXRoaXMuZGVwcmVjdGF0ZWRQbHVnaW5zLmluY2x1ZGVzKHZhbHVlKSk7XG4gICAgICAgIGlmIChwYWNrYWdlc0NvdW50ICE9PSBwYWNrYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLndhcm4oJ3lvdSBoYXZlIHNvbWUgZGVwcmVjYXRlZCBtZXRlb3IgZGVza3RvcCBwbHVnaW5zIGluIHlvdXIgc2V0dGluZ3MsIHBsZWFzZSByZW1vdmUgJyArXG4gICAgICAgICAgICAgICAgYHRoZW0gKGRlcHJlY2F0ZWQgcGx1Z2luczogJHt0aGlzLmRlcHJlY3RhdGVkUGx1Z2lucy5qb2luKCcsICcpfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBwbHVnaW5zID0gYCR7cGx1Z2lucy5zdWJzdHIoMCwgcGx1Z2lucy5sZW5ndGggLSAyKX1dYDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4kLm1ldGVvckFwcC5tZXRlb3JNYW5hZ2VyLmVuc3VyZVBhY2thZ2VzKFxuICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcywgcGFja2FnZXNXaXRoVmVyc2lvbiwgcGx1Z2luc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIG1ldGVvciBhcHAuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0TWV0ZW9yQ2xpZW50QnVpbGQoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuJC5tZXRlb3JBcHAuYnVpbGQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIG5vZGVfbW9kdWxlcyBpZiBuZWVkZWQuXG4gICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgYXN5bmMgaGFuZGxlU3RhdGVPZk5vZGVNb2R1bGVzKCkge1xuICAgICAgICBpZiAodGhpcy4kLmVudi5pc1Byb2R1Y3Rpb25CdWlsZCgpIHx8IHRoaXMuJC5lbnYub3B0aW9ucy5pYTMyKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuJC5lbnYuaXNQcm9kdWN0aW9uQnVpbGQoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ2NsZWFyaW5nIG5vZGVfbW9kdWxlcyBiZWNhdXNlIHdlIG5lZWQgdG8gaGF2ZSBpdCBjbGVhciBmb3IgaWEzMiByZWJ1aWxkJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ2NsZWFyaW5nIG5vZGVfbW9kdWxlcyBiZWNhdXNlIHRoaXMgaXMgYSBwcm9kdWN0aW9uIGJ1aWxkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuJC51dGlscy5ybVdpdGhSZXRyaWVzKFxuICAgICAgICAgICAgICAgICAgICAnLXJmJywgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5ub2RlTW9kdWxlc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoZXJlIGlzIGEgdGVtcG9yYXJ5IG5vZGVfbW9kdWxlcyBmb2xkZXIgYW5kIG5vIG5vZGVfbW9kdWxlcyBmb2xkZXIsIHdlIHdpbGxcbiAgICAgKiByZXN0b3JlIGl0LCBhcyBpdCBtaWdodCBiZSBhIGxlZnRvdmVyIGZyb20gYW4gaW50ZXJydXB0ZWQgZmxvdy5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBhc3luYyBoYW5kbGVUZW1wb3JhcnlOb2RlTW9kdWxlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuJC51dGlscy5leGlzdHModGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC50bXBOb2RlTW9kdWxlcykpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy4kLnV0aWxzLmV4aXN0cyh0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLm5vZGVNb2R1bGVzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKCdtb3ZpbmcgdGVtcCBub2RlX21vZHVsZXMgYmFjaycpO1xuICAgICAgICAgICAgICAgIHNoZWxsLm12KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnRtcE5vZGVNb2R1bGVzLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLm5vZGVNb2R1bGVzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBub2RlX21vZHVsZXMgZm9sZGVyLCB3ZSBzaG91bGQgY2xlYXIgdGhlIHRlbXBvcmFyeSBvbmUuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoJ2NsZWFyaW5nIHRlbXAgbm9kZV9tb2R1bGVzIGJlY2F1c2UgbmV3IG9uZSBpcyBhbHJlYWR5IGNyZWF0ZWQnKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiQudXRpbHMucm1XaXRoUmV0cmllcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICctcmYnLCB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnRtcE5vZGVNb2R1bGVzXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVucyBucG0gbGluayBmb3IgZXZlcnkgcGFja2FnZSBzcGVjaWZpZWQgaW4gc2V0dGluZ3MuanNvbi0+bGlua1BhY2thZ2VzLlxuICAgICAqL1xuICAgIGFzeW5jIGxpbmtOcG1QYWNrYWdlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuJC5lbnYuaXNQcm9kdWN0aW9uQnVpbGQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy4kLmRlc2t0b3AuZ2V0U2V0dGluZ3MoKTtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgaWYgKCdsaW5rUGFja2FnZXMnIGluIHRoaXMuJC5kZXNrdG9wLmdldFNldHRpbmdzKCkpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNldHRpbmdzLmxpbmtQYWNrYWdlcykpIHtcbiAgICAgICAgICAgICAgICBzZXR0aW5ncy5saW5rUGFja2FnZXMuZm9yRWFjaChwYWNrYWdlTmFtZSA9PlxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kLm1ldGVvckFwcC5ydW5OcG0oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWydsaW5rJywgcGFja2FnZU5hbWVdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnJvb3RcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1bnMgbnBtIGluIHRoZSBlbGVjdHJvbiBhcHAgdG8gZ2V0IHRoZSBkZXBlbmRlbmNpZXMgaW5zdGFsbGVkLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGFzeW5jIGVuc3VyZURlcHMoKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ2luc3RhbGxpbmcgZGVwZW5kZW5jaWVzJyk7XG4gICAgICAgIGlmICh0aGlzLiQudXRpbHMuZXhpc3RzKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubm9kZU1vZHVsZXMpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZygncnVubmluZyBucG0gcHJ1bmUgdG8gd2lwZSB1bm5lZWRlZCBkZXBlbmRlbmNpZXMnKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW5OcG0oWydwcnVuZSddKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucnVuTnBtKFsnaW5zdGFsbCddLCB0aGlzLiQuZW52LnN0ZGlvKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2FybnMgaWYgcGx1Z2lucyB2ZXJzaW9uIGFyZSBvdXRkYXRlZCBpbiBjb21wYXJlIHRvIHRoZSBuZXdlc3Qgc2NhZmZvbGQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBsdWdpbnNWZXJzaW9ucyAtIGN1cnJlbnQgcGx1Z2lucyB2ZXJzaW9ucyBmcm9tIHNldHRpbmdzLmpzb25cbiAgICAgKi9cbiAgICBjaGVja1BsdWdpbnNWZXJzaW9uKHBsdWdpbnNWZXJzaW9ucykge1xuICAgICAgICBjb25zdCBzZXR0aW5nc0pzb24gPSBKU09OLnBhcnNlKFxuICAgICAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih0aGlzLiQuZW52LnBhdGhzLnNjYWZmb2xkLCAnc2V0dGluZ3MuanNvbicpKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzY2FmZm9sZFBsdWdpbnNWZXJzaW9uID0gdGhpcy4kLmRlc2t0b3AuZ2V0RGVwZW5kZW5jaWVzKHNldHRpbmdzSnNvbiwgZmFsc2UpLnBsdWdpbnM7XG4gICAgICAgIE9iamVjdC5rZXlzKHBsdWdpbnNWZXJzaW9ucykuZm9yRWFjaCgocGx1Z2luTmFtZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHBsdWdpbk5hbWUgaW4gc2NhZmZvbGRQbHVnaW5zVmVyc2lvbiAmJlxuICAgICAgICAgICAgICAgIHNjYWZmb2xkUGx1Z2luc1ZlcnNpb25bcGx1Z2luTmFtZV0gIT09IHBsdWdpbnNWZXJzaW9uc1twbHVnaW5OYW1lXSAmJlxuICAgICAgICAgICAgICAgIHNlbXZlci5sdChwbHVnaW5zVmVyc2lvbnNbcGx1Z2luTmFtZV0sIHNjYWZmb2xkUGx1Z2luc1ZlcnNpb25bcGx1Z2luTmFtZV0pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy53YXJuKGB5b3UgYXJlIHVzaW5nIG91dGRhdGVkIHZlcnNpb24gJHtwbHVnaW5zVmVyc2lvbnNbcGx1Z2luTmFtZV19IG9mIGAgK1xuICAgICAgICAgICAgICAgICAgICBgJHtwbHVnaW5OYW1lfSwgdGhlIHN1Z2dlc3RlZCB2ZXJzaW9uIHRvIHVzZSBpcyBgICtcbiAgICAgICAgICAgICAgICAgICAgYCR7c2NhZmZvbGRQbHVnaW5zVmVyc2lvbltwbHVnaW5OYW1lXX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWVyZ2VzIGNvcmUgZGVwZW5kZW5jeSBsaXN0IHdpdGggdGhlIGRlcGVuZGVuY2llcyBmcm9tIC5kZXNrdG9wLlxuICAgICAqL1xuICAgIHVwZGF0ZURlcGVuZGVuY2llc0xpc3QoKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ3VwZGF0aW5nIGxpc3Qgb2YgcGFja2FnZS5qc29uXFwncyBkZXBlbmRlbmNpZXMnKTtcbiAgICAgICAgY29uc3QgZGVza3RvcERlcGVuZGVuY2llcyA9IHRoaXMuJC5kZXNrdG9wLmdldERlcGVuZGVuY2llcygpO1xuXG4gICAgICAgIHRoaXMuY2hlY2tQbHVnaW5zVmVyc2lvbihkZXNrdG9wRGVwZW5kZW5jaWVzLnBsdWdpbnMpO1xuXG4gICAgICAgIHRoaXMubG9nLmRlYnVnKCdtZXJnaW5nIHNldHRpbmdzLmpzb25bZGVwZW5kZW5jaWVzXScpO1xuICAgICAgICB0aGlzLmRlcHNNYW5hZ2VyLm1lcmdlRGVwZW5kZW5jaWVzKFxuICAgICAgICAgICAgJ3NldHRpbmdzLmpzb25bZGVwZW5kZW5jaWVzXScsXG4gICAgICAgICAgICBkZXNrdG9wRGVwZW5kZW5jaWVzLmZyb21TZXR0aW5nc1xuICAgICAgICApO1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZygnbWVyZ2luZyBzZXR0aW5ncy5qc29uW3BsdWdpbnNdJyk7XG4gICAgICAgIHRoaXMuZGVwc01hbmFnZXIubWVyZ2VEZXBlbmRlbmNpZXMoXG4gICAgICAgICAgICAnc2V0dGluZ3MuanNvbltwbHVnaW5zXScsXG4gICAgICAgICAgICBkZXNrdG9wRGVwZW5kZW5jaWVzLnBsdWdpbnNcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmxvZy5kZWJ1ZygnbWVyZ2luZyBkZXBlbmRlbmNpZXMgZnJvbSBtb2R1bGVzJyk7XG4gICAgICAgIE9iamVjdC5rZXlzKGRlc2t0b3BEZXBlbmRlbmNpZXMubW9kdWxlcykuZm9yRWFjaChtb2R1bGUgPT5cbiAgICAgICAgICAgIHRoaXMuZGVwc01hbmFnZXIubWVyZ2VEZXBlbmRlbmNpZXMoXG4gICAgICAgICAgICAgICAgYG1vZHVsZVske21vZHVsZX1dYCxcbiAgICAgICAgICAgICAgICBkZXNrdG9wRGVwZW5kZW5jaWVzLm1vZHVsZXNbbW9kdWxlXVxuICAgICAgICAgICAgKSk7XG5cbiAgICAgICAgdGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPSB0aGlzLmRlcHNNYW5hZ2VyLmdldFJlbW90ZURlcGVuZGVuY2llcygpO1xuICAgICAgICB0aGlzLnBhY2thZ2VKc29uLmxvY2FsRGVwZW5kZW5jaWVzID0gdGhpcy5kZXBzTWFuYWdlci5nZXRMb2NhbERlcGVuZGVuY2llcygpO1xuXG4gICAgICAgIHRoaXMubG9nLmRlYnVnKCd3cml0aW5nIHVwZGF0ZWQgcGFja2FnZS5qc29uJyk7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnBhY2thZ2VKc29uLCBKU09OLnN0cmluZ2lmeSh0aGlzLnBhY2thZ2VKc29uLCBudWxsLCAyKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc3RhbGwgbm9kZSBtb2R1bGVzIGZyb20gbG9jYWwgcGF0aHMgdXNpbmcgbG9jYWwtaW5zdGFsbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhcmNoXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgaW5zdGFsbExvY2FsTm9kZU1vZHVsZXMoYXJjaCA9IHRoaXMuJC5lbnYub3B0aW9ucy5pYTMyIHx8IHByb2Nlc3MuYXJjaCA9PT0gJ2lhMzInID8gJ2lhMzInIDogJ3g2NCcpIHtcbiAgICAgICAgY29uc3QgbG9jYWxEZXBlbmRlbmNpZXMgPSBfLnZhbHVlcyh0aGlzLnBhY2thZ2VKc29uLmxvY2FsRGVwZW5kZW5jaWVzKTtcbiAgICAgICAgaWYgKGxvY2FsRGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ2luc3RhbGxpbmcgbG9jYWwgbm9kZSBtb2R1bGVzJyk7XG4gICAgICAgIGNvbnN0IGxhc3RSZWJ1aWxkID0gdGhpcy4kLmVsZWN0cm9uQnVpbGRlci5wcmVwYXJlTGFzdFJlYnVpbGRPYmplY3QoYXJjaCk7XG4gICAgICAgIGNvbnN0IGVudiA9IHRoaXMuJC5lbGVjdHJvbkJ1aWxkZXIuZ2V0R3lwRW52KGxhc3RSZWJ1aWxkLmZyYW1ld29ya0luZm8sIGxhc3RSZWJ1aWxkLnBsYXRmb3JtLCBsYXN0UmVidWlsZC5hcmNoKTtcbiAgICAgICAgY29uc3QgaW5zdGFsbGVyID0gbmV3IExvY2FsSW5zdGFsbGVyKFxuICAgICAgICAgICAgeyBbdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5yb290XTogbG9jYWxEZXBlbmRlbmNpZXMgfSxcbiAgICAgICAgICAgIHsgbnBtRW52OiBlbnYgfVxuICAgICAgICApO1xuICAgICAgICBwcm9ncmVzcyhpbnN0YWxsZXIpO1xuICAgICAgICByZXR1cm4gaW5zdGFsbGVyLmluc3RhbGwoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWJ1aWxkIGJpbmFyeSBkZXBlbmRlbmNpZXMgYWdhaW5zdCBFbGVjdHJvbidzIG5vZGUgaGVhZGVycy5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICByZWJ1aWxkRGVwcyhpbnN0YWxsID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGluc3RhbGwpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ2lzc3Vpbmcgbm9kZV9tb2R1bGVzIGluc3RhbGwgZnJvbSBlbGVjdHJvbi1idWlsZGVyJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdpc3N1aW5nIG5hdGl2ZSBtb2R1bGVzIHJlYnVpbGQgZnJvbSBlbGVjdHJvbi1idWlsZGVyJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcmNoID0gdGhpcy4kLmVudi5vcHRpb25zLmlhMzIgfHwgcHJvY2Vzcy5hcmNoID09PSAnaWEzMicgPyAnaWEzMicgOiAneDY0JztcblxuICAgICAgICBpZiAodGhpcy4kLmVudi5vcHRpb25zLmlhMzIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLnZlcmJvc2UoJ2ZvcmNpbmcgcmVidWlsZCBmb3IgMzJiaXQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9nLnZlcmJvc2UoYHJlYnVpbGRpbmcgZm9yICR7YXJjaH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLiQuZWxlY3Ryb25CdWlsZGVyLmluc3RhbGxPclJlYnVpbGQoYXJjaCwgdW5kZWZpbmVkLCBpbnN0YWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgcGFja2FnZS5qc29uIGZpZWxkcyBhY2NvcmRpbmdseSB0byB3aGF0IGlzIHNldCBpbiBzZXR0aW5ncy5qc29uLlxuICAgICAqXG4gICAgICogcGFja2FnZUpzb24ubmFtZSA9IHNldHRpbmdzLnByb2plY3ROYW1lXG4gICAgICogcGFja2FnZUpzb24udmVyc2lvbiA9IHNldHRpbmdzLnZlcnNpb25cbiAgICAgKiBwYWNrYWdlSnNvbi4qID0gc2V0dGluZ3MucGFja2FnZUpzb25GaWVsZHNcbiAgICAgKi9cbiAgICB1cGRhdGVQYWNrYWdlSnNvbkZpZWxkcygpIHtcbiAgICAgICAgdGhpcy5sb2cudmVyYm9zZSgndXBkYXRpbmcgcGFja2FnZS5qc29uIGZpZWxkcycpO1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuJC5kZXNrdG9wLmdldFNldHRpbmdzKCk7XG4gICAgICAgIC8qKiBAdHlwZSB7ZGVza3RvcFNldHRpbmdzfSAqL1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IHRoaXMuc2NhZmZvbGQuZ2V0RGVmYXVsdFBhY2thZ2VKc29uKCk7XG5cbiAgICAgICAgcGFja2FnZUpzb24udmVyc2lvbiA9IHNldHRpbmdzLnZlcnNpb247XG4gICAgICAgIGlmICgncGFja2FnZUpzb25GaWVsZHMnIGluIHNldHRpbmdzKSB7XG4gICAgICAgICAgICBhc3NpZ25JbihwYWNrYWdlSnNvbiwgc2V0dGluZ3MucGFja2FnZUpzb25GaWVsZHMpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2lnbkluKHBhY2thZ2VKc29uLCB7IG5hbWU6IHNldHRpbmdzLnByb2plY3ROYW1lIH0pO1xuXG4gICAgICAgIHRoaXMubG9nLmRlYnVnKCd3cml0aW5nIHVwZGF0ZWQgcGFja2FnZS5qc29uJyk7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnBhY2thZ2VKc29uLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgbnVsbCwgNClcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5wYWNrYWdlSnNvbiA9IHBhY2thZ2VKc29uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgc2V0dGluZ3MuanNvbiB3aXRoIGVudiAocHJvZC9kZXYpIGluZm9ybWF0aW9uIGFuZCB2ZXJzaW9ucy5cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVTZXR0aW5nc0pzb25GaWVsZHMoKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKCd1cGRhdGluZyBzZXR0aW5ncy5qc29uIGZpZWxkcycpO1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuJC5kZXNrdG9wLmdldFNldHRpbmdzKCk7XG5cbiAgICAgICAgLy8gU2F2ZSB2ZXJzaW9ucy5cbiAgICAgICAgc2V0dGluZ3MuY29tcGF0aWJpbGl0eVZlcnNpb24gPSB0aGlzLmNvbXBhdGliaWxpdHlWZXJzaW9uO1xuXG4gICAgICAgIC8vIFBhc3MgaW5mb3JtYXRpb24gYWJvdXQgYnVpbGQgdHlwZSB0byB0aGUgc2V0dGluZ3MuanNvbi5cbiAgICAgICAgc2V0dGluZ3MuZW52ID0gKHRoaXMuJC5lbnYuaXNQcm9kdWN0aW9uQnVpbGQoKSkgP1xuICAgICAgICAgICAgJ3Byb2QnIDogJ2Rldic7XG5cbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IHRoaXMuJC5kZXNrdG9wLmdldEhhc2hWZXJzaW9uKCk7XG4gICAgICAgIHNldHRpbmdzLmRlc2t0b3BWZXJzaW9uID0gYCR7dmVyc2lvbn1fJHtzZXR0aW5ncy5lbnZ9YDtcblxuICAgICAgICBzZXR0aW5ncy5tZXRlb3JEZXNrdG9wVmVyc2lvbiA9IHRoaXMuJC5nZXRWZXJzaW9uKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuJC5lbnYub3B0aW9ucy5wcm9kRGVidWcpIHtcbiAgICAgICAgICAgIHNldHRpbmdzLnByb2REZWJ1ZyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5kZXNrdG9wVG1wLnNldHRpbmdzLCBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgbnVsbCwgNClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgZmlsZXMgZnJvbSBwcmVwYXJlZCAuZGVza3RvcCB0byBkZXNrdG9wLmFzYXIgaW4gZWxlY3Ryb24gYXBwLlxuICAgICAqL1xuICAgIHBhY2tEZXNrdG9wVG9Bc2FyKCkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdwYWNraW5nIC5kZXNrdG9wIHRvIGFzYXInKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGFzYXIuY3JlYXRlUGFja2FnZShcbiAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmRlc2t0b3BUbXAucm9vdCxcbiAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLmRlc2t0b3BBc2FyXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZy52ZXJib3NlKCdjbGVhcmluZyB0ZW1wb3JhcnkgLmRlc2t0b3AnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kLnV0aWxzXG4gICAgICAgICAgICAgICAgICAgICAgICAucm1XaXRoUmV0cmllcygnLXJmJywgdGhpcy4kLmVudi5wYXRocy5kZXNrdG9wVG1wLnJvb3QpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1ha2VzIGEgdGVtcG9yYXJ5IGNvcHkgb2YgLmRlc2t0b3AuXG4gICAgICovXG4gICAgY29weURlc2t0b3BUb0Rlc2t0b3BUZW1wKCkge1xuICAgICAgICB0aGlzLmxvZy52ZXJib3NlKCdjb3B5aW5nIC5kZXNrdG9wIHRvIHRlbXBvcmFyeSBsb2NhdGlvbicpO1xuICAgICAgICBzaGVsbC5jcCgnLXJmJywgdGhpcy4kLmVudi5wYXRocy5kZXNrdG9wLnJvb3QsIHRoaXMuJC5lbnYucGF0aHMuZGVza3RvcFRtcC5yb290KTtcbiAgICAgICAgLy8gUmVtb3ZlIHRlc3QgZmlsZXMuXG4gICAgICAgIGRlbC5zeW5jKFtcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLiQuZW52LnBhdGhzLmRlc2t0b3BUbXAucm9vdCwgJyoqJywgJyoudGVzdC5qcycpXG4gICAgICAgIF0sIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBSdW5zIGJhYmVsIGFuZCB1Z2xpZnkgb3ZlciAuZGVza3RvcCBpZiByZXF1ZXN0ZWQuXG4gICAgICovXG4gICAgYXN5bmMgdHJhbnNwaWxlQW5kTWluaWZ5KCkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCd0cmFuc3BpbGluZyBhbmQgdWdsaWZ5aW5nJyk7XG5cbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLiQuZGVza3RvcC5nZXRTZXR0aW5ncygpO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gJ3VnbGlmeU9wdGlvbnMnIGluIHNldHRpbmdzID8gc2V0dGluZ3MudWdsaWZ5T3B0aW9ucyA6IHt9O1xuXG4gICAgICAgIGNvbnN0IHVnbGlmeWluZ0VuYWJsZWQgPSAndWdsaWZ5JyBpbiBzZXR0aW5ncyAmJiAhIXNldHRpbmdzLnVnbGlmeTtcblxuICAgICAgICBjb25zdCBwcmVzZXQgPSBwcmVzZXRFbnYoeyBhc3NlcnRWZXJzaW9uOiAoKSA9PiB7IH0gfSwgeyB0YXJnZXRzOiB7IG5vZGU6ICcxMicgfSB9KTtcblxuICAgICAgICBjb25zdCB7IGRhdGE6IGZpbGVzIH0gPSBhd2FpdCB0aGlzLiQudXRpbHMucmVhZERpcih0aGlzLiQuZW52LnBhdGhzLmRlc2t0b3BUbXAucm9vdCk7XG5cbiAgICAgICAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGZpbGUuZW5kc1dpdGgoJy5qcycpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgY29kZSB9ID0gdHJhbnNmb3JtRmlsZVN5bmMoZmlsZSwge1xuICAgICAgICAgICAgICAgICAgICBwcmVzZXRzOiBbcHJlc2V0XVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxldCBlcnJvcjtcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuZW52ID09PSAncHJvZCcgJiYgdWdsaWZ5aW5nRW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAoeyBjb2RlLCBlcnJvciB9ID0gdWdsaWZ5Lm1pbmlmeShjb2RlLCBvcHRpb25zKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGUsIGNvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlcyBhbGwgdGhlIGZpbGVzIHRoYXQgc2hvdWxkIG5vdCBiZSBwYWNrZWQgaW50byBhc2FyIGludG8gYSBzYWZlIGxvY2F0aW9uIHdoaWNoIGlzIHRoZVxuICAgICAqICdleHRyYWN0ZWQnIGRpciBpbiB0aGUgZWxlY3Ryb24gYXBwLlxuICAgICAqL1xuICAgIGFzeW5jIGV4Y2x1ZGVGaWxlc0Zyb21BcmNoaXZlKCkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdleGNsdWRpbmcgZmlsZXMgZnJvbSBwYWNraW5nJyk7XG5cbiAgICAgICAgLy8gRW5zdXJlIGVtcHR5IGBleHRyYWN0ZWRgIGRpclxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiQudXRpbHMucm1XaXRoUmV0cmllcygnLXJmJywgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5leHRyYWN0ZWQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzaGVsbC5ta2Rpcih0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLmV4dHJhY3RlZCk7XG5cbiAgICAgICAgY29uc3QgY29uZmlncyA9IHRoaXMuJC5kZXNrdG9wLmdhdGhlck1vZHVsZUNvbmZpZ3MoKTtcblxuICAgICAgICAvLyBNb3ZlIGZpbGVzIHRoYXQgc2hvdWxkIG5vdCBiZSBhc2FyJ2VkLlxuICAgICAgICBjb25maWdzLmZvckVhY2goKGNvbmZpZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbW9kdWxlQ29uZmlnID0gY29uZmlnO1xuICAgICAgICAgICAgaWYgKCdleHRyYWN0JyBpbiBtb2R1bGVDb25maWcpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobW9kdWxlQ29uZmlnLmV4dHJhY3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZUNvbmZpZy5leHRyYWN0ID0gW21vZHVsZUNvbmZpZy5leHRyYWN0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbW9kdWxlQ29uZmlnLmV4dHJhY3QuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgZXhjbHVkaW5nICR7ZmlsZX0gZnJvbSAke2NvbmZpZy5uYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJC5lbnYucGF0aHMuZGVza3RvcFRtcC5tb2R1bGVzLCBtb2R1bGVDb25maWcuZGlyTmFtZSwgZmlsZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvblBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLmV4dHJhY3RlZCwgbW9kdWxlQ29uZmlnLmRpck5hbWVcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuJC51dGlscy5leGlzdHMoZGVzdGluYXRpb25QYXRoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hlbGwubWtkaXIoZGVzdGluYXRpb25QYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzaGVsbC5tdihmaWxlUGF0aCwgZGVzdGluYXRpb25QYXRoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFuQkE7QUFxQkFBLGdCQUFBLENBQU1DLE1BQU4sQ0FBYUMsS0FBYixHQUFxQixJQUFyQjtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUNlLE1BQU1DLFdBQU4sQ0FBa0I7RUFDN0I7QUFDSjtBQUNBO0FBQ0E7RUFDSUMsV0FBVyxDQUFDQyxDQUFELEVBQUk7SUFDWCxLQUFLQyxHQUFMLEdBQVcsSUFBSUMsWUFBSixDQUFRLGFBQVIsQ0FBWDtJQUNB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 \ No newline at end of file diff --git a/dist/electronAppScaffold.js b/dist/electronAppScaffold.js deleted file mode 100644 index d108be14..00000000 --- a/dist/electronAppScaffold.js +++ /dev/null @@ -1,142 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; - -var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime")); - -var _fs = _interopRequireDefault(require("fs")); - -var _del = _interopRequireDefault(require("del")); - -var _shelljs = _interopRequireDefault(require("shelljs")); - -var _path = _interopRequireDefault(require("path")); - -var _log = _interopRequireDefault(require("./log")); - -var _skeletonDependencies = _interopRequireDefault(require("./skeletonDependencies")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -// eslint-disable-next-line no-unused-vars -const { - join -} = _path.default; -_shelljs.default.config.fatal = true; -/** - * Represents the .desktop dir scaffold. - */ - -class ElectronAppScaffold { - /** - * @param {MeteorDesktop} $ - context - * @constructor - */ - constructor($) { - this.log = new _log.default('electronAppScaffold'); - this.$ = $; - this.packageJson = { - name: 'MyMeteorApp', - main: this.$.env.isProductionBuild() ? 'app.asar/index.js' : 'app/index.js', - dependencies: Object.assign({}, _skeletonDependencies.default) - }; - - if (!this.$.env.isProductionBuild() || this.$.env.options.prodDebug) { - this.packageJson.dependencies.devtron = '1.4.0'; - this.packageJson.dependencies['electron-debug'] = '1.5.0'; - } - } - /** - * Just a public getter from the default package.json object. - * @returns {Object} - */ - - - getDefaultPackageJson() { - return Object.assign({}, this.packageJson); - } - /** - * Clear the electron app. Removes everything except the node_modules which would be a waste - * to delete. Later `npm prune` will keep it clear. - */ - - - clear() { - if (!this.$.utils.exists(this.$.env.paths.electronApp.root)) { - this.log.verbose(`creating ${this.$.env.paths.electronApp.rootName}`); - - _shelljs.default.mkdir(this.$.env.paths.electronApp.root); - } - - return (0, _del.default)([`${this.$.env.paths.electronApp.root}${_path.default.sep}*`, `!${this.$.env.paths.electronApp.nodeModules}`], { - force: true - }); - } - /** - * Just copies the Skeleton App into the electron app. - */ - - - copySkeletonApp() { - this.log.verbose('copying skeleton app'); - - try { - _shelljs.default.cp('-rf', join(this.$.env.paths.meteorDesktop.skeleton, '*'), this.$.env.paths.electronApp.appRoot + _path.default.sep); - } catch (e) { - this.log.error('error while copying skeleton app:', e); - process.exit(1); - } - } - /** - * After clearing the electron app path, copies a fresh skeleton. - */ - - - async make() { - try { - this.log.verbose(`clearing ${this.$.env.paths.electronApp.rootName}`); - await this.clear(); - } catch (e) { - this.log.error(`error while removing ${this.$.env.paths.electronApp.root}: `, e); - process.exit(1); - } - - this.createAppRoot(); - this.copySkeletonApp(); // TODO: hey, wait, .gitignore is not needed - right? - - /* - this.log.debug('creating .gitignore'); - fs.writeFileSync(this.$.env.paths.electronApp.gitIgnore, [ - 'node_modules' - ].join('\n')); - */ - - this.log.verbose('writing package.json'); - - _fs.default.writeFileSync(this.$.env.paths.electronApp.packageJson, JSON.stringify(this.packageJson, null, 2)); - } - /** - * Creates the app directory in the electron app. - */ - - - createAppRoot() { - try { - this.log.verbose(`creating ${this.$.env.paths.electronApp.appRoot}`); - - _fs.default.mkdirSync(this.$.env.paths.electronApp.appRoot); - } catch (e) { - if (e.code !== 'EEXIST') { - this.log.error(`error while creating dir: ${this.$.env.paths.electronApp.appRoot}: `, e); - process.exit(1); - } - } - } - -} - -exports.default = ElectronAppScaffold; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJqb2luIiwicGF0aCIsInNoZWxsIiwiY29uZmlnIiwiZmF0YWwiLCJFbGVjdHJvbkFwcFNjYWZmb2xkIiwiY29uc3RydWN0b3IiLCIkIiwibG9nIiwiTG9nIiwicGFja2FnZUpzb24iLCJuYW1lIiwibWFpbiIsImVudiIsImlzUHJvZHVjdGlvbkJ1aWxkIiwiZGVwZW5kZW5jaWVzIiwiT2JqZWN0IiwiYXNzaWduIiwib3B0aW9ucyIsInByb2REZWJ1ZyIsImRldnRyb24iLCJnZXREZWZhdWx0UGFja2FnZUpzb24iLCJjbGVhciIsInV0aWxzIiwiZXhpc3RzIiwicGF0aHMiLCJlbGVjdHJvbkFwcCIsInJvb3QiLCJ2ZXJib3NlIiwicm9vdE5hbWUiLCJta2RpciIsImRlbCIsInNlcCIsIm5vZGVNb2R1bGVzIiwiZm9yY2UiLCJjb3B5U2tlbGV0b25BcHAiLCJjcCIsIm1ldGVvckRlc2t0b3AiLCJza2VsZXRvbiIsImFwcFJvb3QiLCJlIiwiZXJyb3IiLCJwcm9jZXNzIiwiZXhpdCIsIm1ha2UiLCJjcmVhdGVBcHBSb290IiwiZnMiLCJ3cml0ZUZpbGVTeW5jIiwiSlNPTiIsInN0cmluZ2lmeSIsIm1rZGlyU3luYyIsImNvZGUiXSwic291cmNlcyI6WyIuLi9saWIvZWxlY3Ryb25BcHBTY2FmZm9sZC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmltcG9ydCByZWdlbmVyYXRvclJ1bnRpbWUgZnJvbSAncmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgZGVsIGZyb20gJ2RlbCc7XG5pbXBvcnQgc2hlbGwgZnJvbSAnc2hlbGxqcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IExvZyBmcm9tICcuL2xvZyc7XG5pbXBvcnQgZGVwZW5kZW5jaWVzIGZyb20gJy4vc2tlbGV0b25EZXBlbmRlbmNpZXMnO1xuXG5jb25zdCB7IGpvaW4gfSA9IHBhdGg7XG5zaGVsbC5jb25maWcuZmF0YWwgPSB0cnVlO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIC5kZXNrdG9wIGRpciBzY2FmZm9sZC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWxlY3Ryb25BcHBTY2FmZm9sZCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNZXRlb3JEZXNrdG9wfSAkIC0gY29udGV4dFxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCQpIHtcbiAgICAgICAgdGhpcy5sb2cgPSBuZXcgTG9nKCdlbGVjdHJvbkFwcFNjYWZmb2xkJyk7XG4gICAgICAgIHRoaXMuJCA9ICQ7XG5cbiAgICAgICAgdGhpcy5wYWNrYWdlSnNvbiA9IHtcbiAgICAgICAgICAgIG5hbWU6ICdNeU1ldGVvckFwcCcsXG4gICAgICAgICAgICBtYWluOiAodGhpcy4kLmVudi5pc1Byb2R1Y3Rpb25CdWlsZCgpKSA/XG4gICAgICAgICAgICAgICAgJ2FwcC5hc2FyL2luZGV4LmpzJyA6ICdhcHAvaW5kZXguanMnLFxuICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiBPYmplY3QuYXNzaWduKHt9LCBkZXBlbmRlbmNpZXMpXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCF0aGlzLiQuZW52LmlzUHJvZHVjdGlvbkJ1aWxkKCkgfHwgdGhpcy4kLmVudi5vcHRpb25zLnByb2REZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMuZGV2dHJvbiA9ICcxLjQuMCc7XG4gICAgICAgICAgICB0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llc1snZWxlY3Ryb24tZGVidWcnXSA9ICcxLjUuMCc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKdXN0IGEgcHVibGljIGdldHRlciBmcm9tIHRoZSBkZWZhdWx0IHBhY2thZ2UuanNvbiBvYmplY3QuXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBnZXREZWZhdWx0UGFja2FnZUpzb24oKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciB0aGUgZWxlY3Ryb24gYXBwLiBSZW1vdmVzIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBub2RlX21vZHVsZXMgd2hpY2ggd291bGQgYmUgYSB3YXN0ZVxuICAgICAqIHRvIGRlbGV0ZS4gTGF0ZXIgYG5wbSBwcnVuZWAgd2lsbCBrZWVwIGl0IGNsZWFyLlxuICAgICAqL1xuICAgIGNsZWFyKCkge1xuICAgICAgICBpZiAoIXRoaXMuJC51dGlscy5leGlzdHModGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5yb290KSkge1xuICAgICAgICAgICAgdGhpcy5sb2cudmVyYm9zZShgY3JlYXRpbmcgJHt0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnJvb3ROYW1lfWApO1xuICAgICAgICAgICAgc2hlbGwubWtkaXIodGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5yb290KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWwoW1xuICAgICAgICAgICAgYCR7dGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5yb290fSR7cGF0aC5zZXB9KmAsXG4gICAgICAgICAgICBgISR7dGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5ub2RlTW9kdWxlc31gXG4gICAgICAgIF0sIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSnVzdCBjb3BpZXMgdGhlIFNrZWxldG9uIEFwcCBpbnRvIHRoZSBlbGVjdHJvbiBhcHAuXG4gICAgICovXG4gICAgY29weVNrZWxldG9uQXBwKCkge1xuICAgICAgICB0aGlzLmxvZy52ZXJib3NlKCdjb3B5aW5nIHNrZWxldG9uIGFwcCcpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2hlbGwuY3AoXG4gICAgICAgICAgICAgICAgJy1yZicsXG4gICAgICAgICAgICAgICAgam9pbih0aGlzLiQuZW52LnBhdGhzLm1ldGVvckRlc2t0b3Auc2tlbGV0b24sICcqJyksXG4gICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5hcHBSb290ICsgcGF0aC5zZXBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKCdlcnJvciB3aGlsZSBjb3B5aW5nIHNrZWxldG9uIGFwcDonLCBlKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFmdGVyIGNsZWFyaW5nIHRoZSBlbGVjdHJvbiBhcHAgcGF0aCwgY29waWVzIGEgZnJlc2ggc2tlbGV0b24uXG4gICAgICovXG4gICAgYXN5bmMgbWFrZSgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMubG9nLnZlcmJvc2UoYGNsZWFyaW5nICR7dGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5yb290TmFtZX1gKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xlYXIoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgICAgICAgYGVycm9yIHdoaWxlIHJlbW92aW5nICR7dGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5yb290fTogYCwgZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3JlYXRlQXBwUm9vdCgpO1xuXG4gICAgICAgIHRoaXMuY29weVNrZWxldG9uQXBwKCk7XG5cbiAgICAgICAgLy8gVE9ETzogaGV5LCB3YWl0LCAuZ2l0aWdub3JlIGlzIG5vdCBuZWVkZWQgLSByaWdodD9cbiAgICAgICAgLypcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoJ2NyZWF0aW5nIC5naXRpZ25vcmUnKTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLmdpdElnbm9yZSwgW1xuICAgICAgICAgICAgJ25vZGVfbW9kdWxlcydcbiAgICAgICAgXS5qb2luKCdcXG4nKSk7XG4gICAgICAgICovXG4gICAgICAgIHRoaXMubG9nLnZlcmJvc2UoJ3dyaXRpbmcgcGFja2FnZS5qc29uJyk7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnBhY2thZ2VKc29uLCBKU09OLnN0cmluZ2lmeSh0aGlzLnBhY2thZ2VKc29uLCBudWxsLCAyKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIGFwcCBkaXJlY3RvcnkgaW4gdGhlIGVsZWN0cm9uIGFwcC5cbiAgICAgKi9cbiAgICBjcmVhdGVBcHBSb290KCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5sb2cudmVyYm9zZShgY3JlYXRpbmcgJHt0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLmFwcFJvb3R9YCk7XG4gICAgICAgICAgICBmcy5ta2RpclN5bmModGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5hcHBSb290KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUuY29kZSAhPT0gJ0VFWElTVCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYGVycm9yIHdoaWxlIGNyZWF0aW5nIGRpcjogJHt0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLmFwcFJvb3R9OiBgLCBlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7OztBQVJBO0FBVUEsTUFBTTtFQUFFQTtBQUFGLElBQVdDLGFBQWpCO0FBQ0FDLGdCQUFBLENBQU1DLE1BQU4sQ0FBYUMsS0FBYixHQUFxQixJQUFyQjtBQUVBO0FBQ0E7QUFDQTs7QUFDZSxNQUFNQyxtQkFBTixDQUEwQjtFQUNyQztBQUNKO0FBQ0E7QUFDQTtFQUNJQyxXQUFXLENBQUNDLENBQUQsRUFBSTtJQUNYLEtBQUtDLEdBQUwsR0FBVyxJQUFJQyxZQUFKLENBQVEscUJBQVIsQ0FBWDtJQUNBLEtBQUtGLENBQUwsR0FBU0EsQ0FBVDtJQUVBLEtBQUtHLFdBQUwsR0FBbUI7TUFDZkMsSUFBSSxFQUFFLGFBRFM7TUFFZkMsSUFBSSxFQUFHLEtBQUtMLENBQUwsQ0FBT00sR0FBUCxDQUFXQyxpQkFBWCxFQUFELEdBQ0YsbUJBREUsR0FDb0IsY0FIWDtNQUlmQyxZQUFZLEVBQUVDLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLEVBQWQsRUFBa0JGLDZCQUFsQjtJQUpDLENBQW5COztJQU9BLElBQUksQ0FBQyxLQUFLUixDQUFMLENBQU9NLEdBQVAsQ0FBV0MsaUJBQVgsRUFBRCxJQUFtQyxLQUFLUCxDQUFMLENBQU9NLEdBQVAsQ0FBV0ssT0FBWCxDQUFtQkMsU0FBMUQsRUFBcUU7TUFDakUsS0FBS1QsV0FBTCxDQUFpQkssWUFBakIsQ0FBOEJLLE9BQTlCLEdBQXdDLE9BQXhDO01BQ0EsS0FBS1YsV0FBTCxDQUFpQkssWUFBakIsQ0FBOEIsZ0JBQTlCLElBQWtELE9BQWxEO0lBQ0g7RUFDSjtFQUVEO0FBQ0o7QUFDQTtBQUNBOzs7RUFDSU0scUJBQXFCLEdBQUc7SUFDcEIsT0FBT0wsTUFBTSxDQUFDQyxNQUFQLENBQWMsRUFBZCxFQUFrQixLQUFLUCxXQUF2QixDQUFQO0VBQ0g7RUFFRDtBQUNKO0FBQ0E7QUFDQTs7O0VBQ0lZLEtBQUssR0FBRztJQUNKLElBQUksQ0FBQyxLQUFLZixDQUFMLENBQU9nQixLQUFQLENBQWFDLE1BQWIsQ0FBb0IsS0FBS2pCLENBQUwsQ0FBT00sR0FBUCxDQUFXWSxLQUFYLENBQWlCQyxXQUFqQixDQUE2QkMsSUFBakQsQ0FBTCxFQUE2RDtNQUN6RCxLQUFLbkIsR0FBTCxDQUFTb0IsT0FBVCxDQUFrQixZQUFXLEtBQUtyQixDQUFMLENBQU9NLEdBQVAsQ0FBV1ksS0FBWCxDQUFpQkMsV0FBakIsQ0FBNkJHLFFBQVMsRUFBbkU7O01BQ0EzQixnQkFBQSxDQUFNNEIsS0FBTixDQUFZLEtBQUt2QixDQUFMLENBQU9NLEdBQVAsQ0FBV1ksS0FBWCxDQUFpQkMsV0FBakIsQ0FBNkJDLElBQXpDO0lBQ0g7O0lBRUQsT0FBTyxJQUFBSSxZQUFBLEVBQUksQ0FDTixHQUFFLEtBQUt4QixDQUFMLENBQU9NLEdBQVAsQ0FBV1ksS0FBWCxDQUFpQkMsV0FBakIsQ0FBNkJDLElBQUssR0FBRTFCLGFBQUEsQ0FBSytCLEdBQUksR0FEekMsRUFFTixJQUFHLEtBQUt6QixDQUFMLENBQU9NLEdBQVAsQ0FBV1ksS0FBWCxDQUFpQkMsV0FBakIsQ0FBNkJPLFdBQVksRUFGdEMsQ0FBSixFQUdKO01BQUVDLEtBQUssRUFBRTtJQUFULENBSEksQ0FBUDtFQUlIO0VBRUQ7QUFDSjtBQUNBOzs7RUFDSUMsZUFBZSxHQUFHO0lBQ2QsS0FBSzNCLEdBQUwsQ0FBU29CLE9BQVQsQ0FBaUIsc0JBQWpCOztJQUNBLElBQUk7TUFDQTFCLGdCQUFBLENBQU1rQyxFQUFOLENBQ0ksS0FESixFQUVJcEMsSUFBSSxDQUFDLEtBQUtPLENBQUwsQ0FBT00sR0FBUCxDQUFXWSxLQUFYLENBQWlCWSxhQUFqQixDQUErQkMsUUFBaEMsRUFBMEMsR0FBMUMsQ0FGUixFQUdJLEtBQUsvQixDQUFMLENBQU9NLEdBQVAsQ0FBV1ksS0FBWCxDQUFpQkMsV0FBakIsQ0FBNkJhLE9BQTdCLEdBQXVDdEMsYUFBQSxDQUFLK0IsR0FIaEQ7SUFLSCxDQU5ELENBTUUsT0FBT1EsQ0FBUCxFQUFVO01BQ1IsS0FBS2hDLEdBQUwsQ0FBU2lDLEtBQVQsQ0FBZSxtQ0FBZixFQUFvREQsQ0FBcEQ7TUFDQUUsT0FBTyxDQUFDQyxJQUFSLENBQWEsQ0FBYjtJQUNIO0VBQ0o7RUFFRDtBQUNKO0FBQ0E7OztFQUNjLE1BQUpDLElBQUksR0FBRztJQUNULElBQUk7TUFDQSxLQUFLcEMsR0FBTCxDQUFTb0IsT0FBVCxDQUFrQixZQUFXLEtBQUtyQixDQUFMLENBQU9NLEdBQVAsQ0FBV1ksS0FBWCxDQUFpQkMsV0FBakIsQ0FBNkJHLFFBQVMsRUFBbkU7TUFDQSxNQUFNLEtBQUtQLEtBQUwsRUFBTjtJQUNILENBSEQsQ0FHRSxPQUFPa0IsQ0FBUCxFQUFVO01BQ1IsS0FBS2hDLEdBQUwsQ0FBU2lDLEtBQVQsQ0FDSyx3QkFBdUIsS0FBS2xDLENBQUwsQ0FBT00sR0FBUCxDQUFXWSxLQUFYLENBQWlCQyxXQUFqQixDQUE2QkMsSUFBSyxJQUQ5RCxFQUNtRWEsQ0FEbkU7TUFHQUUsT0FBTyxDQUFDQyxJQUFSLENBQWEsQ0FBYjtJQUNIOztJQUVELEtBQUtFLGFBQUw7SUFFQSxLQUFLVixlQUFMLEdBYlMsQ0FlVDs7SUFDQTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0lBQ1EsS0FBSzNCLEdBQUwsQ0FBU29CLE9BQVQsQ0FBaUIsc0JBQWpCOztJQUNBa0IsV0FBQSxDQUFHQyxhQUFILENBQ0ksS0FBS3hDLENBQUwsQ0FBT00sR0FBUCxDQUFXWSxLQUFYLENBQWlCQyxXQUFqQixDQUE2QmhCLFdBRGpDLEVBQzhDc0MsSUFBSSxDQUFDQyxTQUFMLENBQWUsS0FBS3ZDLFdBQXBCLEVBQWlDLElBQWpDLEVBQXVDLENBQXZDLENBRDlDO0VBR0g7RUFFRDtBQUNKO0FBQ0E7OztFQUNJbUMsYUFBYSxHQUFHO0lBQ1osSUFBSTtNQUNBLEtBQUtyQyxHQUFMLENBQVNvQixPQUFULENBQWtCLFlBQVcsS0FBS3JCLENBQUwsQ0FBT00sR0FBUCxDQUFXWSxLQUFYLENBQWlCQyxXQUFqQixDQUE2QmEsT0FBUSxFQUFsRTs7TUFDQU8sV0FBQSxDQUFHSSxTQUFILENBQWEsS0FBSzNDLENBQUwsQ0FBT00sR0FBUCxDQUFXWSxLQUFYLENBQWlCQyxXQUFqQixDQUE2QmEsT0FBMUM7SUFDSCxDQUhELENBR0UsT0FBT0MsQ0FBUCxFQUFVO01BQ1IsSUFBSUEsQ0FBQyxDQUFDVyxJQUFGLEtBQVcsUUFBZixFQUF5QjtRQUNyQixLQUFLM0MsR0FBTCxDQUFTaUMsS0FBVCxDQUNLLDZCQUE0QixLQUFLbEMsQ0FBTCxDQUFPTSxHQUFQLENBQVdZLEtBQVgsQ0FBaUJDLFdBQWpCLENBQTZCYSxPQUFRLElBRHRFLEVBQzJFQyxDQUQzRTtRQUdBRSxPQUFPLENBQUNDLElBQVIsQ0FBYSxDQUFiO01BQ0g7SUFDSjtFQUNKOztBQTdHb0MifQ== \ No newline at end of file diff --git a/dist/electronBuilder.js b/dist/electronBuilder.js deleted file mode 100644 index d4438f23..00000000 --- a/dist/electronBuilder.js +++ /dev/null @@ -1,384 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; - -var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime")); - -var _shelljs = _interopRequireDefault(require("shelljs")); - -var _path = _interopRequireDefault(require("path")); - -var _fs = _interopRequireDefault(require("fs")); - -var _rimraf = _interopRequireDefault(require("rimraf")); - -var _crossSpawn = _interopRequireDefault(require("cross-spawn")); - -var _log = _interopRequireDefault(require("./log")); - -var _defaultDependencies = _interopRequireDefault(require("./defaultDependencies")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -// eslint-disable-next-line no-unused-vars - -/** - * Promisfied rimraf. - * - * @param {string} dirPath - path to the dir to be deleted - * @param {number} delay - delay the task by ms - * @returns {Promise} - */ -function removeDir(dirPath, delay = 0) { - return new Promise((resolve, reject) => { - setTimeout(() => { - (0, _rimraf.default)(dirPath, { - maxBusyTries: 100 - }, err => { - if (err) { - reject(err); - } else { - resolve(); - } - }); - }, delay); - }); -} -/** - * Wrapper for electron-builder. - */ - - -class InstallerBuilder { - /** - * @param {MeteorDesktop} $ - context - * - * @constructor - */ - constructor($) { - this.log = new _log.default('electronBuilder'); - this.$ = $; - this.firstPass = true; - this.lastRebuild = {}; - this.currentContext = null; - this.installerDir = _path.default.join(this.$.env.options.output, this.$.env.paths.installerDir); - this.platforms = []; - } - - async init() { - this.builder = await this.$.getDependency('electron-builder', _defaultDependencies.default['electron-builder']); - const appBuilder = await this.$.getDependency('app-builder-lib', _defaultDependencies.default['electron-builder'], false); - this.yarn = require(_path.default.join(appBuilder.path, 'out', 'util', 'yarn')); - this.getGypEnv = this.yarn.getGypEnv; - this.packageDependencies = require(_path.default.join(appBuilder.path, 'out', 'util', 'packageDependencies')); - } - /** - * Prepares the last rebuild object for electron-builder. - * - * @param {string} arch - * @param {string} platform - * @returns {Object} - */ - - - prepareLastRebuildObject(arch, platform = process.platform) { - const productionDeps = this.packageDependencies.createLazyProductionDeps(this.$.env.paths.electronApp.root); - this.lastRebuild = { - frameworkInfo: { - version: this.$.getElectronVersion(), - useCustomDist: true - }, - platform, - arch, - productionDeps - }; - return this.lastRebuild; - } - /** - * Calls npm rebuild from electron-builder. - * @param {string} arch - * @param {string} platform - * @param {boolean} install - * @returns {Promise} - */ - - - async installOrRebuild(arch, platform = process.platform, install = false) { - this.log.debug(`calling installOrRebuild from electron-builder for arch ${arch}`); - this.prepareLastRebuildObject(arch, platform); - await this.yarn.installOrRebuild(this.$.desktop.getSettings().builderOptions || {}, this.$.env.paths.electronApp.root, this.lastRebuild, install); - } - /** - * Callback invoked before build is made. Ensures that app.asar have the right rebuilt - * node_modules. - * - * @param {Object} context - * @returns {Promise} - */ - - - beforeBuild(context) { - this.currentContext = Object.assign({}, context); - return new Promise((resolve, reject) => { - const platformMatches = process.platform === context.platform.nodeName; - const rebuild = platformMatches && context.arch !== this.lastRebuild.arch; - - if (!platformMatches) { - this.log.warn('skipping dependencies rebuild because platform is different, if you have native ' + 'node modules as your app dependencies you should od the build on the target platform only'); - } - - if (!rebuild) { - this.moveNodeModulesOut().catch(e => reject(e)).then(() => setTimeout(() => resolve(false), 2000)); // Timeout helps on Windows to clear the file locks. - } else { - // Lets rebuild the node_modules for different arch. - this.installOrRebuild(context.arch, context.platform.nodeName).catch(e => reject(e)).then(() => this.$.electronApp.installLocalNodeModules(context.arch)).catch(e => reject(e)).then(() => { - this.$.electronApp.scaffold.createAppRoot(); - this.$.electronApp.scaffold.copySkeletonApp(); - return this.$.electronApp.packSkeletonToAsar([this.$.env.paths.electronApp.meteorAsar, this.$.env.paths.electronApp.desktopAsar, this.$.env.paths.electronApp.extracted]); - }).catch(e => reject(e)).then(() => this.moveNodeModulesOut()).catch(e => reject(e)).then(() => resolve(false)); - } - }); - } - /** - * Callback to be invoked after packing. Restores node_modules to the .desktop-build. - * @returns {Promise} - */ - - - afterPack(context) { - this.platforms = this.platforms.filter(platform => platform !== context.electronPlatformName); - - if (this.platforms.length !== 0) { - return Promise.resolve(); - } - - return new Promise((resolve, reject) => { - _shelljs.default.config.fatal = true; - - if (this.$.utils.exists(this.$.env.paths.electronApp.extractedNodeModules)) { - this.log.debug('injecting extracted modules'); - - _shelljs.default.cp('-Rf', this.$.env.paths.electronApp.extractedNodeModules, _path.default.join(this.getPackagedAppPath(context), 'node_modules')); - } - - this.log.debug('moving node_modules back'); // Move node_modules back. - - try { - _shelljs.default.mv(this.$.env.paths.electronApp.tmpNodeModules, this.$.env.paths.electronApp.nodeModules); - } catch (e) { - reject(e); - return; - } finally { - _shelljs.default.config.reset(); - } - - if (this.firstPass) { - this.firstPass = false; - } - - this.log.debug('node_modules moved back'); - this.wait().catch(e => reject(e)).then(() => resolve()); - }); - } - /** - * This command kills orphaned MSBuild.exe processes. - * Sometime after native node_modules compilation they are still writing some logs, - * prevent node_modules from being deleted. - */ - - - killMSBuild() { - if (this.currentContext.platform.nodeName !== 'win32') { - return; - } - - try { - const out = _crossSpawn.default.sync('wmic', ['process', 'where', 'caption="MSBuild.exe"', 'get', 'processid']).stdout.toString('utf-8').split('\n'); - - const regex = new RegExp(/(\d+)/, 'gm'); // No we will check for those with the matching params. - - out.forEach(line => { - const match = regex.exec(line) || false; - - if (match) { - this.log.debug(`killing MSBuild.exe at pid: ${match[1]}`); - - _crossSpawn.default.sync('taskkill', ['/pid', match[1], '/f', '/t']); - } - - regex.lastIndex = 0; - }); - } catch (e) { - this.log.debug('kill MSBuild failed'); - } - } - /** - * Returns the path to packaged app. - * @returns {string} - */ - - - getPackagedAppPath(context = {}) { - if (this.currentContext.platform.nodeName === 'darwin') { - return _path.default.join(this.installerDir, 'mac', `${context.packager.appInfo.productFilename}.app`, 'Contents', 'Resources', 'app'); - } - - const platformDir = `${this.currentContext.platform.nodeName === 'win32' ? 'win' : 'linux'}-${this.currentContext.arch === 'ia32' ? 'ia32-' : ''}unpacked`; - return _path.default.join(this.installerDir, platformDir, 'resources', 'app'); - } - /** - * On Windows it waits for the app.asar in the packed app to be free (no file locks). - * @returns {*} - */ - - - wait() { - if (this.currentContext.platform.nodeName !== 'win32') { - return Promise.resolve(); - } - - const appAsarPath = _path.default.join(this.getPackagedAppPath(), 'app.asar'); - - let retries = 0; - const self = this; - return new Promise((resolve, reject) => { - function check() { - _fs.default.open(appAsarPath, 'r+', (err, fd) => { - retries += 1; - - if (err) { - if (err.code !== 'ENOENT') { - self.log.debug(`waiting for app.asar to be readable, ${'code' in err ? `currently reading it returns ${err.code}` : ''}`); - - if (retries < 6) { - setTimeout(() => check(), 4000); - } else { - reject(`file is locked: ${appAsarPath}`); - } - } else { - resolve(); - } - } else { - _fs.default.closeSync(fd); - - resolve(); - } - }); - } - - check(); - }); - } - /** - * Prepares the target object passed to the electron-builder. - * - * @returns {Map>>} - */ - - - prepareTargets() { - let arch = this.$.env.options.ia32 ? 'ia32' : 'x64'; - arch = this.$.env.options.allArchs ? 'all' : arch; - const targets = []; - - if (this.$.env.options.win) { - targets.push(this.builder.dependency.Platform.WINDOWS); - } - - if (this.$.env.options.linux) { - targets.push(this.builder.dependency.Platform.LINUX); - } - - if (this.$.env.options.mac) { - targets.push(this.builder.dependency.Platform.MAC); - } - - if (targets.length === 0) { - if (this.$.env.os.isWindows) { - targets.push(this.builder.dependency.Platform.WINDOWS); - } else if (this.$.env.os.isLinux) { - targets.push(this.builder.dependency.Platform.LINUX); - } else { - targets.push(this.builder.dependency.Platform.MAC); - } - } - - return this.builder.dependency.createTargets(targets, null, arch); - } - - async build() { - const settings = this.$.desktop.getSettings(); - - if (!('builderOptions' in settings)) { - this.log.error('no builderOptions in settings.json, aborting'); - process.exit(1); - } - - const builderOptions = Object.assign({}, settings.builderOptions); - builderOptions.asar = false; - builderOptions.npmRebuild = true; - builderOptions.beforeBuild = this.beforeBuild.bind(this); - builderOptions.afterPack = this.afterPack.bind(this); - builderOptions.electronVersion = this.$.getElectronVersion(); - builderOptions.directories = { - app: this.$.env.paths.electronApp.root, - output: _path.default.join(this.$.env.options.output, this.$.env.paths.installerDir) - }; - - if ('mac' in builderOptions && 'target' in builderOptions.mac) { - if (builderOptions.mac.target.includes('mas')) { - this.platforms = ['darwin', 'mas']; - } - } - - try { - this.log.debug('calling build from electron-builder'); - await this.builder.dependency.build(Object.assign({ - targets: this.prepareTargets(), - config: builderOptions - }, settings.builderCliOptions)); - - if (this.$.utils.exists(this.$.env.paths.electronApp.extractedNodeModules)) { - _shelljs.default.rm('-rf', this.$.env.paths.electronApp.extractedNodeModules); - } - } catch (e) { - this.log.error('error while building installer: ', e); - } - } - /** - * Moves node_modules out of the app because while the app will be packaged - * we do not want it to be there. - * @returns {Promise} - */ - - - moveNodeModulesOut() { - return new Promise((resolve, reject) => { - this.log.debug('moving node_modules out, because we have them already in' + ' app.asar'); - this.killMSBuild(); - removeDir(this.$.env.paths.electronApp.tmpNodeModules).catch(e => reject(e)).then(() => { - _shelljs.default.config.fatal = true; - _shelljs.default.config.verbose = true; - - try { - _shelljs.default.mv(this.$.env.paths.electronApp.nodeModules, this.$.env.paths.electronApp.tmpNodeModules); - - _shelljs.default.config.reset(); - - return this.wait(); - } catch (e) { - _shelljs.default.config.reset(); - - return Promise.reject(e); - } - }).catch(e => reject(e)).then(() => removeDir(this.$.env.paths.electronApp.nodeModules, 1000)).catch(e => reject(e)).then(() => this.wait()).catch(reject).then(resolve); - }); - } - -} - -exports.default = InstallerBuilder; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZW1vdmVEaXIiLCJkaXJQYXRoIiwiZGVsYXkiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNldFRpbWVvdXQiLCJyaW1yYWYiLCJtYXhCdXN5VHJpZXMiLCJlcnIiLCJJbnN0YWxsZXJCdWlsZGVyIiwiY29uc3RydWN0b3IiLCIkIiwibG9nIiwiTG9nIiwiZmlyc3RQYXNzIiwibGFzdFJlYnVpbGQiLCJjdXJyZW50Q29udGV4dCIsImluc3RhbGxlckRpciIsInBhdGgiLCJqb2luIiwiZW52Iiwib3B0aW9ucyIsIm91dHB1dCIsInBhdGhzIiwicGxhdGZvcm1zIiwiaW5pdCIsImJ1aWxkZXIiLCJnZXREZXBlbmRlbmN5IiwiZGVmYXVsdERlcGVuZGVuY2llcyIsImFwcEJ1aWxkZXIiLCJ5YXJuIiwicmVxdWlyZSIsImdldEd5cEVudiIsInBhY2thZ2VEZXBlbmRlbmNpZXMiLCJwcmVwYXJlTGFzdFJlYnVpbGRPYmplY3QiLCJhcmNoIiwicGxhdGZvcm0iLCJwcm9jZXNzIiwicHJvZHVjdGlvbkRlcHMiLCJjcmVhdGVMYXp5UHJvZHVjdGlvbkRlcHMiLCJlbGVjdHJvbkFwcCIsInJvb3QiLCJmcmFtZXdvcmtJbmZvIiwidmVyc2lvbiIsImdldEVsZWN0cm9uVmVyc2lvbiIsInVzZUN1c3RvbURpc3QiLCJpbnN0YWxsT3JSZWJ1aWxkIiwiaW5zdGFsbCIsImRlYnVnIiwiZGVza3RvcCIsImdldFNldHRpbmdzIiwiYnVpbGRlck9wdGlvbnMiLCJiZWZvcmVCdWlsZCIsImNvbnRleHQiLCJPYmplY3QiLCJhc3NpZ24iLCJwbGF0Zm9ybU1hdGNoZXMiLCJub2RlTmFtZSIsInJlYnVpbGQiLCJ3YXJuIiwibW92ZU5vZGVNb2R1bGVzT3V0IiwiY2F0Y2giLCJlIiwidGhlbiIsImluc3RhbGxMb2NhbE5vZGVNb2R1bGVzIiwic2NhZmZvbGQiLCJjcmVhdGVBcHBSb290IiwiY29weVNrZWxldG9uQXBwIiwicGFja1NrZWxldG9uVG9Bc2FyIiwibWV0ZW9yQXNhciIsImRlc2t0b3BBc2FyIiwiZXh0cmFjdGVkIiwiYWZ0ZXJQYWNrIiwiZmlsdGVyIiwiZWxlY3Ryb25QbGF0Zm9ybU5hbWUiLCJsZW5ndGgiLCJzaGVsbCIsImNvbmZpZyIsImZhdGFsIiwidXRpbHMiLCJleGlzdHMiLCJleHRyYWN0ZWROb2RlTW9kdWxlcyIsImNwIiwiZ2V0UGFja2FnZWRBcHBQYXRoIiwibXYiLCJ0bXBOb2RlTW9kdWxlcyIsIm5vZGVNb2R1bGVzIiwicmVzZXQiLCJ3YWl0Iiwia2lsbE1TQnVpbGQiLCJvdXQiLCJzcGF3biIsInN5bmMiLCJzdGRvdXQiLCJ0b1N0cmluZyIsInNwbGl0IiwicmVnZXgiLCJSZWdFeHAiLCJmb3JFYWNoIiwibGluZSIsIm1hdGNoIiwiZXhlYyIsImxhc3RJbmRleCIsInBhY2thZ2VyIiwiYXBwSW5mbyIsInByb2R1Y3RGaWxlbmFtZSIsInBsYXRmb3JtRGlyIiwiYXBwQXNhclBhdGgiLCJyZXRyaWVzIiwic2VsZiIsImNoZWNrIiwiZnMiLCJvcGVuIiwiZmQiLCJjb2RlIiwiY2xvc2VTeW5jIiwicHJlcGFyZVRhcmdldHMiLCJpYTMyIiwiYWxsQXJjaHMiLCJ0YXJnZXRzIiwid2luIiwicHVzaCIsImRlcGVuZGVuY3kiLCJQbGF0Zm9ybSIsIldJTkRPV1MiLCJsaW51eCIsIkxJTlVYIiwibWFjIiwiTUFDIiwib3MiLCJpc1dpbmRvd3MiLCJpc0xpbnV4IiwiY3JlYXRlVGFyZ2V0cyIsImJ1aWxkIiwic2V0dGluZ3MiLCJlcnJvciIsImV4aXQiLCJhc2FyIiwibnBtUmVidWlsZCIsImJpbmQiLCJlbGVjdHJvblZlcnNpb24iLCJkaXJlY3RvcmllcyIsImFwcCIsInRhcmdldCIsImluY2x1ZGVzIiwiYnVpbGRlckNsaU9wdGlvbnMiLCJybSIsInZlcmJvc2UiXSwic291cmNlcyI6WyIuLi9saWIvZWxlY3Ryb25CdWlsZGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuaW1wb3J0IHJlZ2VuZXJhdG9yUnVudGltZSBmcm9tICdyZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUnO1xuaW1wb3J0IHNoZWxsIGZyb20gJ3NoZWxsanMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHJpbXJhZiBmcm9tICdyaW1yYWYnO1xuaW1wb3J0IHNwYXduIGZyb20gJ2Nyb3NzLXNwYXduJztcbmltcG9ydCBMb2cgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IGRlZmF1bHREZXBlbmRlbmNpZXMgZnJvbSAnLi9kZWZhdWx0RGVwZW5kZW5jaWVzJztcblxuLyoqXG4gKiBQcm9taXNmaWVkIHJpbXJhZi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyUGF0aCAtIHBhdGggdG8gdGhlIGRpciB0byBiZSBkZWxldGVkXG4gKiBAcGFyYW0ge251bWJlcn0gZGVsYXkgLSBkZWxheSB0aGUgdGFzayBieSBtc1xuICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlRGlyKGRpclBhdGgsIGRlbGF5ID0gMCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgcmltcmFmKGRpclBhdGgsIHtcbiAgICAgICAgICAgICAgICBtYXhCdXN5VHJpZXM6IDEwMFxuICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBkZWxheSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogV3JhcHBlciBmb3IgZWxlY3Ryb24tYnVpbGRlci5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW5zdGFsbGVyQnVpbGRlciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNZXRlb3JEZXNrdG9wfSAkIC0gY29udGV4dFxuICAgICAqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoJCkge1xuICAgICAgICB0aGlzLmxvZyA9IG5ldyBMb2coJ2VsZWN0cm9uQnVpbGRlcicpO1xuICAgICAgICB0aGlzLiQgPSAkO1xuICAgICAgICB0aGlzLmZpcnN0UGFzcyA9IHRydWU7XG4gICAgICAgIHRoaXMubGFzdFJlYnVpbGQgPSB7fTtcbiAgICAgICAgdGhpcy5jdXJyZW50Q29udGV4dCA9IG51bGw7XG4gICAgICAgIHRoaXMuaW5zdGFsbGVyRGlyID0gcGF0aC5qb2luKHRoaXMuJC5lbnYub3B0aW9ucy5vdXRwdXQsIHRoaXMuJC5lbnYucGF0aHMuaW5zdGFsbGVyRGlyKTtcbiAgICAgICAgdGhpcy5wbGF0Zm9ybXMgPSBbXTtcbiAgICB9XG5cbiAgICBhc3luYyBpbml0KCkge1xuICAgICAgICB0aGlzLmJ1aWxkZXIgPSBhd2FpdCB0aGlzLiQuZ2V0RGVwZW5kZW5jeSgnZWxlY3Ryb24tYnVpbGRlcicsIGRlZmF1bHREZXBlbmRlbmNpZXNbJ2VsZWN0cm9uLWJ1aWxkZXInXSk7XG4gICAgICAgIGNvbnN0IGFwcEJ1aWxkZXIgPSBhd2FpdCB0aGlzLiQuZ2V0RGVwZW5kZW5jeSgnYXBwLWJ1aWxkZXItbGliJywgZGVmYXVsdERlcGVuZGVuY2llc1snZWxlY3Ryb24tYnVpbGRlciddLCBmYWxzZSk7XG5cbiAgICAgICAgdGhpcy55YXJuID0gcmVxdWlyZShwYXRoLmpvaW4oYXBwQnVpbGRlci5wYXRoLCAnb3V0JywgJ3V0aWwnLCAneWFybicpKTtcbiAgICAgICAgdGhpcy5nZXRHeXBFbnYgPSB0aGlzLnlhcm4uZ2V0R3lwRW52O1xuICAgICAgICB0aGlzLnBhY2thZ2VEZXBlbmRlbmNpZXMgPSByZXF1aXJlKHBhdGguam9pbihhcHBCdWlsZGVyLnBhdGgsICdvdXQnLCAndXRpbCcsICdwYWNrYWdlRGVwZW5kZW5jaWVzJykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZXBhcmVzIHRoZSBsYXN0IHJlYnVpbGQgb2JqZWN0IGZvciBlbGVjdHJvbi1idWlsZGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFyY2hcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGxhdGZvcm1cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHByZXBhcmVMYXN0UmVidWlsZE9iamVjdChhcmNoLCBwbGF0Zm9ybSA9IHByb2Nlc3MucGxhdGZvcm0pIHtcbiAgICAgICAgY29uc3QgcHJvZHVjdGlvbkRlcHMgPSB0aGlzLnBhY2thZ2VEZXBlbmRlbmNpZXNcbiAgICAgICAgICAgIC5jcmVhdGVMYXp5UHJvZHVjdGlvbkRlcHModGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5yb290KTtcbiAgICAgICAgdGhpcy5sYXN0UmVidWlsZCA9IHtcbiAgICAgICAgICAgIGZyYW1ld29ya0luZm86IHsgdmVyc2lvbjogdGhpcy4kLmdldEVsZWN0cm9uVmVyc2lvbigpLCB1c2VDdXN0b21EaXN0OiB0cnVlIH0sXG4gICAgICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgICAgIGFyY2gsXG4gICAgICAgICAgICBwcm9kdWN0aW9uRGVwc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5sYXN0UmVidWlsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxscyBucG0gcmVidWlsZCBmcm9tIGVsZWN0cm9uLWJ1aWxkZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFyY2hcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGxhdGZvcm1cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluc3RhbGxcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBhc3luYyBpbnN0YWxsT3JSZWJ1aWxkKGFyY2gsIHBsYXRmb3JtID0gcHJvY2Vzcy5wbGF0Zm9ybSwgaW5zdGFsbCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBjYWxsaW5nIGluc3RhbGxPclJlYnVpbGQgZnJvbSBlbGVjdHJvbi1idWlsZGVyIGZvciBhcmNoICR7YXJjaH1gKTtcbiAgICAgICAgdGhpcy5wcmVwYXJlTGFzdFJlYnVpbGRPYmplY3QoYXJjaCwgcGxhdGZvcm0pO1xuICAgICAgICBhd2FpdCB0aGlzLnlhcm4uaW5zdGFsbE9yUmVidWlsZCh0aGlzLiQuZGVza3RvcC5nZXRTZXR0aW5ncygpLmJ1aWxkZXJPcHRpb25zIHx8IHt9LFxuICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5yb290LCB0aGlzLmxhc3RSZWJ1aWxkLCBpbnN0YWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayBpbnZva2VkIGJlZm9yZSBidWlsZCBpcyBtYWRlLiBFbnN1cmVzIHRoYXQgYXBwLmFzYXIgaGF2ZSB0aGUgcmlnaHQgcmVidWlsdFxuICAgICAqIG5vZGVfbW9kdWxlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0XG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgYmVmb3JlQnVpbGQoY29udGV4dCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRDb250ZXh0ID0gT2JqZWN0LmFzc2lnbih7fSwgY29udGV4dCk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwbGF0Zm9ybU1hdGNoZXMgPSBwcm9jZXNzLnBsYXRmb3JtID09PSBjb250ZXh0LnBsYXRmb3JtLm5vZGVOYW1lO1xuICAgICAgICAgICAgY29uc3QgcmVidWlsZCA9IHBsYXRmb3JtTWF0Y2hlcyAmJiBjb250ZXh0LmFyY2ggIT09IHRoaXMubGFzdFJlYnVpbGQuYXJjaDtcbiAgICAgICAgICAgIGlmICghcGxhdGZvcm1NYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cud2Fybignc2tpcHBpbmcgZGVwZW5kZW5jaWVzIHJlYnVpbGQgYmVjYXVzZSBwbGF0Zm9ybSBpcyBkaWZmZXJlbnQsIGlmIHlvdSBoYXZlIG5hdGl2ZSAnICtcbiAgICAgICAgICAgICAgICAgICAgJ25vZGUgbW9kdWxlcyBhcyB5b3VyIGFwcCBkZXBlbmRlbmNpZXMgeW91IHNob3VsZCBvZCB0aGUgYnVpbGQgb24gdGhlIHRhcmdldCBwbGF0Zm9ybSBvbmx5Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghcmVidWlsZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubW92ZU5vZGVNb2R1bGVzT3V0KClcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGUgPT4gcmVqZWN0KGUpKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoZmFsc2UpLCAyMDAwKSk7XG4gICAgICAgICAgICAgICAgLy8gVGltZW91dCBoZWxwcyBvbiBXaW5kb3dzIHRvIGNsZWFyIHRoZSBmaWxlIGxvY2tzLlxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBMZXRzIHJlYnVpbGQgdGhlIG5vZGVfbW9kdWxlcyBmb3IgZGlmZmVyZW50IGFyY2guXG4gICAgICAgICAgICAgICAgdGhpcy5pbnN0YWxsT3JSZWJ1aWxkKGNvbnRleHQuYXJjaCwgY29udGV4dC5wbGF0Zm9ybS5ub2RlTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGUgPT4gcmVqZWN0KGUpKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLiQuZWxlY3Ryb25BcHAuaW5zdGFsbExvY2FsTm9kZU1vZHVsZXMoY29udGV4dC5hcmNoKSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGUgPT4gcmVqZWN0KGUpKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQuZWxlY3Ryb25BcHAuc2NhZmZvbGQuY3JlYXRlQXBwUm9vdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kLmVsZWN0cm9uQXBwLnNjYWZmb2xkLmNvcHlTa2VsZXRvbkFwcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJC5lbGVjdHJvbkFwcC5wYWNrU2tlbGV0b25Ub0FzYXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLm1ldGVvckFzYXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuZGVza3RvcEFzYXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuZXh0cmFjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGUgPT4gcmVqZWN0KGUpKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLm1vdmVOb2RlTW9kdWxlc091dCgpKVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZSA9PiByZWplY3QoZSkpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHJlc29sdmUoZmFsc2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgdG8gYmUgaW52b2tlZCBhZnRlciBwYWNraW5nLiBSZXN0b3JlcyBub2RlX21vZHVsZXMgdG8gdGhlIC5kZXNrdG9wLWJ1aWxkLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGFmdGVyUGFjayhjb250ZXh0KSB7XG4gICAgICAgIHRoaXMucGxhdGZvcm1zID0gdGhpcy5wbGF0Zm9ybXNcbiAgICAgICAgICAgIC5maWx0ZXIocGxhdGZvcm0gPT4gcGxhdGZvcm0gIT09IGNvbnRleHQuZWxlY3Ryb25QbGF0Zm9ybU5hbWUpO1xuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHNoZWxsLmNvbmZpZy5mYXRhbCA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLiQudXRpbHMuZXhpc3RzKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuZXh0cmFjdGVkTm9kZU1vZHVsZXMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoJ2luamVjdGluZyBleHRyYWN0ZWQgbW9kdWxlcycpO1xuICAgICAgICAgICAgICAgIHNoZWxsLmNwKFxuICAgICAgICAgICAgICAgICAgICAnLVJmJyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5leHRyYWN0ZWROb2RlTW9kdWxlcyxcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMuZ2V0UGFja2FnZWRBcHBQYXRoKGNvbnRleHQpLCAnbm9kZV9tb2R1bGVzJylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZygnbW92aW5nIG5vZGVfbW9kdWxlcyBiYWNrJyk7XG4gICAgICAgICAgICAvLyBNb3ZlIG5vZGVfbW9kdWxlcyBiYWNrLlxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHNoZWxsLm12KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnRtcE5vZGVNb2R1bGVzLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLm5vZGVNb2R1bGVzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBzaGVsbC5jb25maWcucmVzZXQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZmlyc3RQYXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdFBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKCdub2RlX21vZHVsZXMgbW92ZWQgYmFjaycpO1xuXG4gICAgICAgICAgICB0aGlzLndhaXQoKVxuICAgICAgICAgICAgICAgIC5jYXRjaChlID0+IHJlamVjdChlKSlcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiByZXNvbHZlKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGNvbW1hbmQga2lsbHMgb3JwaGFuZWQgTVNCdWlsZC5leGUgcHJvY2Vzc2VzLlxuICAgICAqIFNvbWV0aW1lIGFmdGVyIG5hdGl2ZSBub2RlX21vZHVsZXMgY29tcGlsYXRpb24gdGhleSBhcmUgc3RpbGwgd3JpdGluZyBzb21lIGxvZ3MsXG4gICAgICogcHJldmVudCBub2RlX21vZHVsZXMgZnJvbSBiZWluZyBkZWxldGVkLlxuICAgICAqL1xuICAgIGtpbGxNU0J1aWxkKCkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q29udGV4dC5wbGF0Zm9ybS5ub2RlTmFtZSAhPT0gJ3dpbjMyJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBvdXQgPSBzcGF3blxuICAgICAgICAgICAgICAgIC5zeW5jKFxuICAgICAgICAgICAgICAgICAgICAnd21pYycsXG4gICAgICAgICAgICAgICAgICAgIFsncHJvY2VzcycsICd3aGVyZScsICdjYXB0aW9uPVwiTVNCdWlsZC5leGVcIicsICdnZXQnLCAncHJvY2Vzc2lkJ11cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN0ZG91dC50b1N0cmluZygndXRmLTgnKVxuICAgICAgICAgICAgICAgIC5zcGxpdCgnXFxuJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cCgvKFxcZCspLywgJ2dtJyk7XG4gICAgICAgICAgICAvLyBObyB3ZSB3aWxsIGNoZWNrIGZvciB0aG9zZSB3aXRoIHRoZSBtYXRjaGluZyBwYXJhbXMuXG4gICAgICAgICAgICBvdXQuZm9yRWFjaCgobGluZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gcmVnZXguZXhlYyhsaW5lKSB8fCBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoYGtpbGxpbmcgTVNCdWlsZC5leGUgYXQgcGlkOiAke21hdGNoWzFdfWApO1xuICAgICAgICAgICAgICAgICAgICBzcGF3bi5zeW5jKCd0YXNra2lsbCcsIFsnL3BpZCcsIG1hdGNoWzFdLCAnL2YnLCAnL3QnXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlZ2V4Lmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoJ2tpbGwgTVNCdWlsZCBmYWlsZWQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHBhdGggdG8gcGFja2FnZWQgYXBwLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0UGFja2FnZWRBcHBQYXRoKGNvbnRleHQgPSB7fSkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q29udGV4dC5wbGF0Zm9ybS5ub2RlTmFtZSA9PT0gJ2RhcndpbicpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgdGhpcy5pbnN0YWxsZXJEaXIsXG4gICAgICAgICAgICAgICAgJ21hYycsXG4gICAgICAgICAgICAgICAgYCR7Y29udGV4dC5wYWNrYWdlci5hcHBJbmZvLnByb2R1Y3RGaWxlbmFtZX0uYXBwYCxcbiAgICAgICAgICAgICAgICAnQ29udGVudHMnLCAnUmVzb3VyY2VzJywgJ2FwcCdcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGxhdGZvcm1EaXIgPVxuICAgICAgICAgICAgYCR7dGhpcy5jdXJyZW50Q29udGV4dC5wbGF0Zm9ybS5ub2RlTmFtZSA9PT0gJ3dpbjMyJyA/ICd3aW4nIDogJ2xpbnV4J30tJHt0aGlzLmN1cnJlbnRDb250ZXh0LmFyY2ggPT09ICdpYTMyJyA/ICdpYTMyLScgOiAnJ311bnBhY2tlZGA7XG4gICAgICAgIHJldHVybiBwYXRoLmpvaW4oXG4gICAgICAgICAgICB0aGlzLmluc3RhbGxlckRpcixcbiAgICAgICAgICAgIHBsYXRmb3JtRGlyLFxuICAgICAgICAgICAgJ3Jlc291cmNlcycsICdhcHAnXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT24gV2luZG93cyBpdCB3YWl0cyBmb3IgdGhlIGFwcC5hc2FyIGluIHRoZSBwYWNrZWQgYXBwIHRvIGJlIGZyZWUgKG5vIGZpbGUgbG9ja3MpLlxuICAgICAqIEByZXR1cm5zIHsqfVxuICAgICAqL1xuICAgIHdhaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDb250ZXh0LnBsYXRmb3JtLm5vZGVOYW1lICE9PSAnd2luMzInKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBwQXNhclBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICB0aGlzLmdldFBhY2thZ2VkQXBwUGF0aCgpLFxuICAgICAgICAgICAgJ2FwcC5hc2FyJ1xuICAgICAgICApO1xuICAgICAgICBsZXQgcmV0cmllcyA9IDA7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgZnVuY3Rpb24gY2hlY2soKSB7XG4gICAgICAgICAgICAgICAgZnMub3BlbihhcHBBc2FyUGF0aCwgJ3IrJywgKGVyciwgZmQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0cmllcyArPSAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZGVidWcoYHdhaXRpbmcgZm9yIGFwcC5hc2FyIHRvIGJlIHJlYWRhYmxlLCAkeydjb2RlJyBpbiBlcnIgPyBgY3VycmVudGx5IHJlYWRpbmcgaXQgcmV0dXJucyAke2Vyci5jb2RlfWAgOiAnJ31gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0cmllcyA8IDYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBjaGVjaygpLCA0MDAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoYGZpbGUgaXMgbG9ja2VkOiAke2FwcEFzYXJQYXRofWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnMuY2xvc2VTeW5jKGZkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2hlY2soKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJlcGFyZXMgdGhlIHRhcmdldCBvYmplY3QgcGFzc2VkIHRvIHRoZSBlbGVjdHJvbi1idWlsZGVyLlxuICAgICAqXG4gICAgICogQHJldHVybnMge01hcDxQbGF0Zm9ybSwgTWFwPEFyY2gsIEFycmF5PHN0cmluZz4+Pn1cbiAgICAgKi9cbiAgICBwcmVwYXJlVGFyZ2V0cygpIHtcbiAgICAgICAgbGV0IGFyY2ggPSB0aGlzLiQuZW52Lm9wdGlvbnMuaWEzMiA/ICdpYTMyJyA6ICd4NjQnO1xuICAgICAgICBhcmNoID0gdGhpcy4kLmVudi5vcHRpb25zLmFsbEFyY2hzID8gJ2FsbCcgOiBhcmNoO1xuXG4gICAgICAgIGNvbnN0IHRhcmdldHMgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy4kLmVudi5vcHRpb25zLndpbikge1xuICAgICAgICAgICAgdGFyZ2V0cy5wdXNoKHRoaXMuYnVpbGRlci5kZXBlbmRlbmN5LlBsYXRmb3JtLldJTkRPV1MpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiQuZW52Lm9wdGlvbnMubGludXgpIHtcbiAgICAgICAgICAgIHRhcmdldHMucHVzaCh0aGlzLmJ1aWxkZXIuZGVwZW5kZW5jeS5QbGF0Zm9ybS5MSU5VWCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuJC5lbnYub3B0aW9ucy5tYWMpIHtcbiAgICAgICAgICAgIHRhcmdldHMucHVzaCh0aGlzLmJ1aWxkZXIuZGVwZW5kZW5jeS5QbGF0Zm9ybS5NQUMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4kLmVudi5vcy5pc1dpbmRvd3MpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRzLnB1c2godGhpcy5idWlsZGVyLmRlcGVuZGVuY3kuUGxhdGZvcm0uV0lORE9XUyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuJC5lbnYub3MuaXNMaW51eCkge1xuICAgICAgICAgICAgICAgIHRhcmdldHMucHVzaCh0aGlzLmJ1aWxkZXIuZGVwZW5kZW5jeS5QbGF0Zm9ybS5MSU5VWCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldHMucHVzaCh0aGlzLmJ1aWxkZXIuZGVwZW5kZW5jeS5QbGF0Zm9ybS5NQUMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkZXIuZGVwZW5kZW5jeS5jcmVhdGVUYXJnZXRzKHRhcmdldHMsIG51bGwsIGFyY2gpO1xuICAgIH1cblxuICAgIGFzeW5jIGJ1aWxkKCkge1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuJC5kZXNrdG9wLmdldFNldHRpbmdzKCk7XG4gICAgICAgIGlmICghKCdidWlsZGVyT3B0aW9ucycgaW4gc2V0dGluZ3MpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihcbiAgICAgICAgICAgICAgICAnbm8gYnVpbGRlck9wdGlvbnMgaW4gc2V0dGluZ3MuanNvbiwgYWJvcnRpbmcnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnVpbGRlck9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBzZXR0aW5ncy5idWlsZGVyT3B0aW9ucyk7XG5cbiAgICAgICAgYnVpbGRlck9wdGlvbnMuYXNhciA9IGZhbHNlO1xuICAgICAgICBidWlsZGVyT3B0aW9ucy5ucG1SZWJ1aWxkID0gdHJ1ZTtcblxuICAgICAgICBidWlsZGVyT3B0aW9ucy5iZWZvcmVCdWlsZCA9IHRoaXMuYmVmb3JlQnVpbGQuYmluZCh0aGlzKTtcbiAgICAgICAgYnVpbGRlck9wdGlvbnMuYWZ0ZXJQYWNrID0gdGhpcy5hZnRlclBhY2suYmluZCh0aGlzKTtcbiAgICAgICAgYnVpbGRlck9wdGlvbnMuZWxlY3Ryb25WZXJzaW9uID0gdGhpcy4kLmdldEVsZWN0cm9uVmVyc2lvbigpO1xuXG4gICAgICAgIGJ1aWxkZXJPcHRpb25zLmRpcmVjdG9yaWVzID0ge1xuICAgICAgICAgICAgYXBwOiB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnJvb3QsXG4gICAgICAgICAgICBvdXRwdXQ6IHBhdGguam9pbih0aGlzLiQuZW52Lm9wdGlvbnMub3V0cHV0LCB0aGlzLiQuZW52LnBhdGhzLmluc3RhbGxlckRpcilcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoJ21hYycgaW4gYnVpbGRlck9wdGlvbnMgJiYgJ3RhcmdldCcgaW4gYnVpbGRlck9wdGlvbnMubWFjKSB7XG4gICAgICAgICAgICBpZiAoYnVpbGRlck9wdGlvbnMubWFjLnRhcmdldC5pbmNsdWRlcygnbWFzJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXRmb3JtcyA9IFsnZGFyd2luJywgJ21hcyddO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKCdjYWxsaW5nIGJ1aWxkIGZyb20gZWxlY3Ryb24tYnVpbGRlcicpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5idWlsZGVyLmRlcGVuZGVuY3kuYnVpbGQoT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAgICAgdGFyZ2V0czogdGhpcy5wcmVwYXJlVGFyZ2V0cygpLFxuICAgICAgICAgICAgICAgIGNvbmZpZzogYnVpbGRlck9wdGlvbnNcbiAgICAgICAgICAgIH0sIHNldHRpbmdzLmJ1aWxkZXJDbGlPcHRpb25zKSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLiQudXRpbHMuZXhpc3RzKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuZXh0cmFjdGVkTm9kZU1vZHVsZXMpKSB7XG4gICAgICAgICAgICAgICAgc2hlbGwucm0oJy1yZicsIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuZXh0cmFjdGVkTm9kZU1vZHVsZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igd2hpbGUgYnVpbGRpbmcgaW5zdGFsbGVyOiAnLCBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIG5vZGVfbW9kdWxlcyBvdXQgb2YgdGhlIGFwcCBiZWNhdXNlIHdoaWxlIHRoZSBhcHAgd2lsbCBiZSBwYWNrYWdlZFxuICAgICAqIHdlIGRvIG5vdCB3YW50IGl0IHRvIGJlIHRoZXJlLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAgICovXG4gICAgbW92ZU5vZGVNb2R1bGVzT3V0KCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoJ21vdmluZyBub2RlX21vZHVsZXMgb3V0LCBiZWNhdXNlIHdlIGhhdmUgdGhlbSBhbHJlYWR5IGluJyArXG4gICAgICAgICAgICAgICAgJyBhcHAuYXNhcicpO1xuICAgICAgICAgICAgdGhpcy5raWxsTVNCdWlsZCgpO1xuICAgICAgICAgICAgcmVtb3ZlRGlyKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAudG1wTm9kZU1vZHVsZXMpXG4gICAgICAgICAgICAgICAgLmNhdGNoKGUgPT4gcmVqZWN0KGUpKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2hlbGwuY29uZmlnLmZhdGFsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgc2hlbGwuY29uZmlnLnZlcmJvc2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hlbGwubXYoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5ub2RlTW9kdWxlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnRtcE5vZGVNb2R1bGVzXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hlbGwuY29uZmlnLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53YWl0KCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoZWxsLmNvbmZpZy5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZSA9PiByZWplY3QoZSkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gcmVtb3ZlRGlyKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubm9kZU1vZHVsZXMsIDEwMDApKVxuICAgICAgICAgICAgICAgIC5jYXRjaChlID0+IHJlamVjdChlKSlcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLndhaXQoKSlcbiAgICAgICAgICAgICAgICAuY2F0Y2gocmVqZWN0KVxuICAgICAgICAgICAgICAgIC50aGVuKHJlc29sdmUpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQVJBOztBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsU0FBVCxDQUFtQkMsT0FBbkIsRUFBNEJDLEtBQUssR0FBRyxDQUFwQyxFQUF1QztFQUNuQyxPQUFPLElBQUlDLE9BQUosQ0FBWSxDQUFDQyxPQUFELEVBQVVDLE1BQVYsS0FBcUI7SUFDcENDLFVBQVUsQ0FBQyxNQUFNO01BQ2IsSUFBQUMsZUFBQSxFQUFPTixPQUFQLEVBQWdCO1FBQ1pPLFlBQVksRUFBRTtNQURGLENBQWhCLEVBRUlDLEdBQUQsSUFBUztRQUNSLElBQUlBLEdBQUosRUFBUztVQUNMSixNQUFNLENBQUNJLEdBQUQsQ0FBTjtRQUNILENBRkQsTUFFTztVQUNITCxPQUFPO1FBQ1Y7TUFDSixDQVJEO0lBU0gsQ0FWUyxFQVVQRixLQVZPLENBQVY7RUFXSCxDQVpNLENBQVA7QUFhSDtBQUVEO0FBQ0E7QUFDQTs7O0FBQ2UsTUFBTVEsZ0JBQU4sQ0FBdUI7RUFDbEM7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUNJQyxXQUFXLENBQUNDLENBQUQsRUFBSTtJQUNYLEtBQUtDLEdBQUwsR0FBVyxJQUFJQyxZQUFKLENBQVEsaUJBQVIsQ0FBWDtJQUNBLEtBQUtGLENBQUwsR0FBU0EsQ0FBVDtJQUNBLEtBQUtHLFNBQUwsR0FBaUIsSUFBakI7SUFDQSxLQUFLQyxXQUFMLEdBQW1CLEVBQW5CO0lBQ0EsS0FBS0MsY0FBTCxHQUFzQixJQUF0QjtJQUNBLEtBQUtDLFlBQUwsR0FBb0JDLGFBQUEsQ0FBS0MsSUFBTCxDQUFVLEtBQUtSLENBQUwsQ0FBT1MsR0FBUCxDQUFXQyxPQUFYLENBQW1C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 \ No newline at end of file diff --git a/dist/env.js b/dist/env.js deleted file mode 100644 index 8f8fd133..00000000 --- a/dist/env.js +++ /dev/null @@ -1,239 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; - -var _path = _interopRequireDefault(require("path")); - -var _os = _interopRequireDefault(require("os")); - -var _assignIn = _interopRequireDefault(require("lodash/assignIn")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -const { - join -} = _path.default; -/** - * @class - * @property {packagePaths} paths - */ - -class Env { - constructor(input, output, options) { - this.options = options; - - if (this.isProductionBuild()) { - process.env.NODE_ENV = 'production'; - } - - this.sys = { - platform: process.platform, - arch: process.arch - }; // Operational System. - - this.os = { - isWindows: process.platform === 'win32', - isLinux: process.platform === 'linux', - isOsx: process.platform === 'darwin' - }; - this.stdio = 'inherit'; - this.os.name = this.sys.platform === 'darwin' ? 'osx' : this.sys.platform; - this.os.home = process.env[this.os.isWindows ? 'USERPROFILE' : 'HOME']; - this.os.tmp = _os.default.tmpdir(); - /** @type {packagePaths} */ - - this.paths = {}; - /** @type {meteorDesktopPaths} */ - - this.paths.meteorDesktop = { - root: _path.default.resolve(__dirname, '..') - }; - this.paths.meteorDesktop.skeleton = join(this.paths.meteorDesktop.root, 'skeleton'); - /** @type {meteorAppPaths} */ - - this.paths.meteorApp = { - root: input - }; - /** @type {desktopPaths} */ - - this.paths.desktop = { - rootName: '.desktop', - root: join(this.paths.meteorApp.root, '.desktop') - }; - (0, _assignIn.default)(this.paths.desktop, { - modules: join(this.paths.desktop.root, 'modules'), - import: join(this.paths.desktop.root, 'import'), - assets: join(this.paths.desktop.root, 'assets'), - settings: join(this.paths.desktop.root, 'settings.json'), - desktop: join(this.paths.desktop.root, 'desktop.js') - }); - this.paths.desktop.splashScreen = join(this.paths.desktop.assets, 'splashScreen.png'); - this.paths.desktop.loadingGif = join(this.paths.desktop.assets, 'loading.gif'); - this.paths.desktop.meteorIco = join(this.paths.desktop.assets, 'meteor.ico'); - /** @type {electronAppPaths} */ - - this.paths.electronApp = { - rootName: 'desktop-build' - }; - this.paths.electronApp.root = join(this.paths.meteorApp.root, '.meteor', this.paths.electronApp.rootName); - this.paths.electronApp.tmpNodeModules = join(this.paths.meteorApp.root, '.meteor', '.desktop_node_modules'); - this.paths.cache = join(this.paths.meteorApp.root, '.meteor', 'local', 'desktop-cache'); - this.paths.electronApp.extractedNodeModules = join(this.paths.meteorApp.root, '.meteor', '.desktop_extracted_node_modules'); - this.paths.electronApp.extractedNodeModulesBin = join(this.paths.electronApp.extractedNodeModules, '.bin'); - this.paths.electronApp.appRoot = join(this.paths.electronApp.root, 'app'); - (0, _assignIn.default)(this.paths.electronApp, { - app: join(this.paths.electronApp.appRoot, 'app.js'), - cordova: join(this.paths.electronApp.appRoot, 'cordova.js'), - index: join(this.paths.electronApp.appRoot, 'index.js'), - preload: join(this.paths.electronApp.appRoot, 'preload.js'), - modules: join(this.paths.electronApp.appRoot, 'modules'), - desktopAsar: join(this.paths.electronApp.root, 'desktop.asar'), - extracted: join(this.paths.electronApp.root, 'extracted'), - appAsar: join(this.paths.electronApp.root, 'app.asar'), - import: join(this.paths.electronApp.root, 'import'), - assets: join(this.paths.electronApp.root, 'assets'), - packageJson: join(this.paths.electronApp.root, 'package.json'), - settings: join(this.paths.electronApp.root, 'settings.json'), - desktop: join(this.paths.electronApp.root, 'desktop.js'), - desktopTmp: join(this.paths.electronApp.root, '__desktop'), - nodeModules: join(this.paths.electronApp.root, 'node_modules'), - meteorAsar: join(this.paths.electronApp.root, 'meteor.asar'), - meteorApp: join(this.paths.electronApp.root, 'meteor'), - meteorAppIndex: join(this.paths.electronApp.root, 'meteor', 'index.html'), - meteorAppProgramJson: join(this.paths.electronApp.root, 'meteor', 'program.json'), - skeleton: join(this.paths.electronApp.root, 'skeleton') - }); - (0, _assignIn.default)(this.paths.meteorApp, { - platforms: join(this.paths.meteorApp.root, '.meteor', 'platforms'), - packages: join(this.paths.meteorApp.root, '.meteor', 'packages'), - versions: join(this.paths.meteorApp.root, '.meteor', 'versions'), - release: join(this.paths.meteorApp.root, '.meteor', 'release'), - packageJson: join(this.paths.meteorApp.root, 'package.json'), - gitIgnore: join(this.paths.meteorApp.root, '.meteor', '.gitignore'), - cordovaBuild: join(this.paths.meteorApp.root, '.meteor', 'local', 'cordova-build', 'www', 'application'), - webCordova: join(this.paths.meteorApp.root, '.meteor', 'local', 'build', 'programs', 'web.cordova') - }); - (0, _assignIn.default)(this.paths.meteorApp, { - cordovaBuildIndex: join(this.paths.meteorApp.cordovaBuild, 'index.html'), - cordovaBuildProgramJson: join(this.paths.meteorApp.cordovaBuild, 'program.json') - }); - (0, _assignIn.default)(this.paths.meteorApp, { - webCordovaProgramJson: join(this.paths.meteorApp.webCordova, 'program.json') - }); - /** @type {desktopTmpPaths} */ - - this.paths.desktopTmp = { - root: join(this.paths.electronApp.root, '__desktop') - }; - (0, _assignIn.default)(this.paths.desktopTmp, { - modules: join(this.paths.desktopTmp.root, 'modules'), - settings: join(this.paths.desktopTmp.root, 'settings.json') - }); - this.paths.packageDir = '.desktop-package'; - this.paths.installerDir = '.desktop-installer'; // Scaffold - - this.paths.scaffold = join(__dirname, '..', 'scaffold'); - } - /** - * @returns {boolean|*} - * @public - */ - - - isProductionBuild() { - return !!('production' in this.options && this.options.production); - } - -} - -exports.default = Env; -module.exports = Env; -/** - * @typedef {Object} desktopPaths - * @property {string} rootName - * @property {string} root - * @property {string} modules - * @property {string} import - * @property {string} assets - * @property {string} settings - * @property {string} desktop - * @property {string} splashScreen - * @property {string} loadingGif - * @property {string} meteorIco - */ - -/** - * @typedef {Object} meteorAppPaths - * @property {string} root - * @property {string} platforms - * @property {string} release - * @property {string} packages - * @property {string} versions - * @property {string} gitIgnore - * @property {string} packageJson - * @property {string} cordovaBuild - * @property {string} cordovaBuildIndex - * @property {string} cordovaBuildProgramJson - * @property {string} webCordova - * @property {string} webCordovaIndex - * @property {string} webCordovaProgramJson - */ - -/** - * @typedef {Object} electronAppPaths - * @property {string} rootName - * @property {string} root - * @property {Object} appRoot - * @property {string} appRoot.cordova - * @property {string} appRoot.index - * @property {string} appRoot.app - * @property {string} appRoot.modules - * @property {string} desktopAsar - * @property {string} extracted - * @property {string} appAsar - * @property {string} preload - * @property {string} import - * @property {string} assets - * @property {string} gitIgnore - * @property {string} packageJson - * @property {string} settings - * @property {string} desktop - * @property {string} desktopTmp - * @property {string} nodeModules - * @property {string} meteorAsar - * @property {string} meteorApp - * @property {string} meteorAppIndex - * @property {string} meteorAppProgramJson - * @property {string} skeleton - * @property {string} tmpNodeModules - * @property {string} extractedNodeModules - * @property {string} extractedNodeModulesBin - */ - -/** - * @typedef {Object} desktopTmpPaths - * @property {string} root - * @property {string} modules - * @property {string} settings - */ - -/** - * @typedef {Object} meteorDesktopPaths - * @property {string} root - * @property {string} skeleton - */ - -/** - * @typedef {Object} packagePaths - * @property {meteorAppPaths} meteorApp - * @property {desktopPaths} desktop - * @property {electronAppPaths} electronApp - * @property {desktopTmpPaths} desktopTmp - * @property {meteorDesktopPaths} meteorDesktop - * @property {string} packageDir - * @property {string} scaffold - */ -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJqb2luIiwicGF0aCIsIkVudiIsImNvbnN0cnVjdG9yIiwiaW5wdXQiLCJvdXRwdXQiLCJvcHRpb25zIiwiaXNQcm9kdWN0aW9uQnVpbGQiLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJzeXMiLCJwbGF0Zm9ybSIsImFyY2giLCJvcyIsImlzV2luZG93cyIsImlzTGludXgiLCJpc09zeCIsInN0ZGlvIiwibmFtZSIsImhvbWUiLCJ0bXAiLCJ0bXBkaXIiLCJwYXRocyIsIm1ldGVvckRlc2t0b3AiLCJyb290IiwicmVzb2x2ZSIsIl9fZGlybmFtZSIsInNrZWxldG9uIiwibWV0ZW9yQXBwIiwiZGVza3RvcCIsInJvb3ROYW1lIiwiYXNzaWduSW4iLCJtb2R1bGVzIiwiaW1wb3J0IiwiYXNzZXRzIiwic2V0dGluZ3MiLCJzcGxhc2hTY3JlZW4iLCJsb2FkaW5nR2lmIiwibWV0ZW9ySWNvIiwiZWxlY3Ryb25BcHAiLCJ0bXBOb2RlTW9kdWxlcyIsImNhY2hlIiwiZXh0cmFjdGVkTm9kZU1vZHVsZXMiLCJleHRyYWN0ZWROb2RlTW9kdWxlc0JpbiIsImFwcFJvb3QiLCJhcHAiLCJjb3Jkb3ZhIiwiaW5kZXgiLCJwcmVsb2FkIiwiZGVza3RvcEFzYXIiLCJleHRyYWN0ZWQiLCJhcHBBc2FyIiwicGFja2FnZUpzb24iLCJkZXNrdG9wVG1wIiwibm9kZU1vZHVsZXMiLCJtZXRlb3JBc2FyIiwibWV0ZW9yQXBwSW5kZXgiLCJtZXRlb3JBcHBQcm9ncmFtSnNvbiIsInBsYXRmb3JtcyIsInBhY2thZ2VzIiwidmVyc2lvbnMiLCJyZWxlYXNlIiwiZ2l0SWdub3JlIiwiY29yZG92YUJ1aWxkIiwid2ViQ29yZG92YSIsImNvcmRvdmFCdWlsZEluZGV4IiwiY29yZG92YUJ1aWxkUHJvZ3JhbUpzb24iLCJ3ZWJDb3Jkb3ZhUHJvZ3JhbUpzb24iLCJwYWNrYWdlRGlyIiwiaW5zdGFsbGVyRGlyIiwic2NhZmZvbGQiLCJwcm9kdWN0aW9uIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uL2xpYi9lbnYuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IGFzc2lnbkluIGZyb20gJ2xvZGFzaC9hc3NpZ25Jbic7XG5cbmNvbnN0IHsgam9pbiB9ID0gcGF0aDtcblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBwcm9wZXJ0eSB7cGFja2FnZVBhdGhzfSBwYXRoc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbnYge1xuICAgIGNvbnN0cnVjdG9yKGlucHV0LCBvdXRwdXQsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgICBpZiAodGhpcy5pc1Byb2R1Y3Rpb25CdWlsZCgpKSB7XG4gICAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViA9ICdwcm9kdWN0aW9uJztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3lzID0ge1xuICAgICAgICAgICAgcGxhdGZvcm06IHByb2Nlc3MucGxhdGZvcm0sXG4gICAgICAgICAgICBhcmNoOiBwcm9jZXNzLmFyY2hcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBPcGVyYXRpb25hbCBTeXN0ZW0uXG4gICAgICAgIHRoaXMub3MgPSB7XG4gICAgICAgICAgICBpc1dpbmRvd3M6IChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSxcbiAgICAgICAgICAgIGlzTGludXg6IChwcm9jZXNzLnBsYXRmb3JtID09PSAnbGludXgnKSxcbiAgICAgICAgICAgIGlzT3N4OiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicpXG5cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zdGRpbyA9ICdpbmhlcml0JztcblxuICAgICAgICB0aGlzLm9zLm5hbWUgPSAodGhpcy5zeXMucGxhdGZvcm0gPT09ICdkYXJ3aW4nID8gJ29zeCcgOiB0aGlzLnN5cy5wbGF0Zm9ybSk7XG4gICAgICAgIHRoaXMub3MuaG9tZSA9IHByb2Nlc3MuZW52Wyh0aGlzLm9zLmlzV2luZG93cyA/ICdVU0VSUFJPRklMRScgOiAnSE9NRScpXTtcbiAgICAgICAgdGhpcy5vcy50bXAgPSBvcy50bXBkaXIoKTtcblxuICAgICAgICAvKiogQHR5cGUge3BhY2thZ2VQYXRoc30gKi9cbiAgICAgICAgdGhpcy5wYXRocyA9IHt9O1xuXG4gICAgICAgIC8qKiBAdHlwZSB7bWV0ZW9yRGVza3RvcFBhdGhzfSAqL1xuICAgICAgICB0aGlzLnBhdGhzLm1ldGVvckRlc2t0b3AgPSB7XG4gICAgICAgICAgICByb290OiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi4nKVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMucGF0aHMubWV0ZW9yRGVza3RvcC5za2VsZXRvbiA9IGpvaW4odGhpcy5wYXRocy5tZXRlb3JEZXNrdG9wLnJvb3QsICdza2VsZXRvbicpO1xuXG4gICAgICAgIC8qKiBAdHlwZSB7bWV0ZW9yQXBwUGF0aHN9ICovXG4gICAgICAgIHRoaXMucGF0aHMubWV0ZW9yQXBwID0ge1xuICAgICAgICAgICAgcm9vdDogaW5wdXRcbiAgICAgICAgfTtcblxuICAgICAgICAvKiogQHR5cGUge2Rlc2t0b3BQYXRoc30gKi9cbiAgICAgICAgdGhpcy5wYXRocy5kZXNrdG9wID0ge1xuICAgICAgICAgICAgcm9vdE5hbWU6ICcuZGVza3RvcCcsXG4gICAgICAgICAgICByb290OiBqb2luKHRoaXMucGF0aHMubWV0ZW9yQXBwLnJvb3QsICcuZGVza3RvcCcpXG4gICAgICAgIH07XG5cbiAgICAgICAgYXNzaWduSW4odGhpcy5wYXRocy5kZXNrdG9wLCB7XG4gICAgICAgICAgICBtb2R1bGVzOiBqb2luKHRoaXMucGF0aHMuZGVza3RvcC5yb290LCAnbW9kdWxlcycpLFxuICAgICAgICAgICAgaW1wb3J0OiBqb2luKHRoaXMucGF0aHMuZGVza3RvcC5yb290LCAnaW1wb3J0JyksXG4gICAgICAgICAgICBhc3NldHM6IGpvaW4odGhpcy5wYXRocy5kZXNrdG9wLnJvb3QsICdhc3NldHMnKSxcbiAgICAgICAgICAgIHNldHRpbmdzOiBqb2luKHRoaXMucGF0aHMuZGVza3RvcC5yb290LCAnc2V0dGluZ3MuanNvbicpLFxuICAgICAgICAgICAgZGVza3RvcDogam9pbih0aGlzLnBhdGhzLmRlc2t0b3Aucm9vdCwgJ2Rlc2t0b3AuanMnKVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnBhdGhzLmRlc2t0b3Auc3BsYXNoU2NyZWVuID0gam9pbih0aGlzLnBhdGhzLmRlc2t0b3AuYXNzZXRzLCAnc3BsYXNoU2NyZWVuLnBuZycpO1xuICAgICAgICB0aGlzLnBhdGhzLmRlc2t0b3AubG9hZGluZ0dpZiA9IGpvaW4odGhpcy5wYXRocy5kZXNrdG9wLmFzc2V0cywgJ2xvYWRpbmcuZ2lmJyk7XG4gICAgICAgIHRoaXMucGF0aHMuZGVza3RvcC5tZXRlb3JJY28gPSBqb2luKHRoaXMucGF0aHMuZGVza3RvcC5hc3NldHMsICdtZXRlb3IuaWNvJyk7XG5cbiAgICAgICAgLyoqIEB0eXBlIHtlbGVjdHJvbkFwcFBhdGhzfSAqL1xuICAgICAgICB0aGlzLnBhdGhzLmVsZWN0cm9uQXBwID0ge1xuICAgICAgICAgICAgcm9vdE5hbWU6ICdkZXNrdG9wLWJ1aWxkJyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wYXRocy5lbGVjdHJvbkFwcC5yb290ID1cbiAgICAgICAgICAgIGpvaW4odGhpcy5wYXRocy5tZXRlb3JBcHAucm9vdCwgJy5tZXRlb3InLCB0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLnJvb3ROYW1lKTtcblxuICAgICAgICB0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLnRtcE5vZGVNb2R1bGVzID1cbiAgICAgICAgICAgIGpvaW4odGhpcy5wYXRocy5tZXRlb3JBcHAucm9vdCwgJy5tZXRlb3InLCAnLmRlc2t0b3Bfbm9kZV9tb2R1bGVzJyk7XG5cbiAgICAgICAgdGhpcy5wYXRocy5jYWNoZSA9XG4gICAgICAgICAgICBqb2luKHRoaXMucGF0aHMubWV0ZW9yQXBwLnJvb3QsICcubWV0ZW9yJywgJ2xvY2FsJywgJ2Rlc2t0b3AtY2FjaGUnKTtcblxuICAgICAgICB0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLmV4dHJhY3RlZE5vZGVNb2R1bGVzID1cbiAgICAgICAgICAgIGpvaW4odGhpcy5wYXRocy5tZXRlb3JBcHAucm9vdCwgJy5tZXRlb3InLCAnLmRlc2t0b3BfZXh0cmFjdGVkX25vZGVfbW9kdWxlcycpO1xuXG4gICAgICAgIHRoaXMucGF0aHMuZWxlY3Ryb25BcHAuZXh0cmFjdGVkTm9kZU1vZHVsZXNCaW4gPVxuICAgICAgICAgICAgam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLmV4dHJhY3RlZE5vZGVNb2R1bGVzLCAnLmJpbicpO1xuXG5cbiAgICAgICAgdGhpcy5wYXRocy5lbGVjdHJvbkFwcC5hcHBSb290ID1cbiAgICAgICAgICAgIGpvaW4odGhpcy5wYXRocy5lbGVjdHJvbkFwcC5yb290LCAnYXBwJyk7XG5cbiAgICAgICAgYXNzaWduSW4odGhpcy5wYXRocy5lbGVjdHJvbkFwcCwge1xuICAgICAgICAgICAgYXBwOiBqb2luKHRoaXMucGF0aHMuZWxlY3Ryb25BcHAuYXBwUm9vdCwgJ2FwcC5qcycpLFxuICAgICAgICAgICAgY29yZG92YTogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLmFwcFJvb3QsICdjb3Jkb3ZhLmpzJyksXG4gICAgICAgICAgICBpbmRleDogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLmFwcFJvb3QsICdpbmRleC5qcycpLFxuICAgICAgICAgICAgcHJlbG9hZDogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLmFwcFJvb3QsICdwcmVsb2FkLmpzJyksXG4gICAgICAgICAgICBtb2R1bGVzOiBqb2luKHRoaXMucGF0aHMuZWxlY3Ryb25BcHAuYXBwUm9vdCwgJ21vZHVsZXMnKSxcbiAgICAgICAgICAgIGRlc2t0b3BBc2FyOiBqb2luKHRoaXMucGF0aHMuZWxlY3Ryb25BcHAucm9vdCwgJ2Rlc2t0b3AuYXNhcicpLFxuICAgICAgICAgICAgZXh0cmFjdGVkOiBqb2luKHRoaXMucGF0aHMuZWxlY3Ryb25BcHAucm9vdCwgJ2V4dHJhY3RlZCcpLFxuICAgICAgICAgICAgYXBwQXNhcjogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLnJvb3QsICdhcHAuYXNhcicpLFxuICAgICAgICAgICAgaW1wb3J0OiBqb2luKHRoaXMucGF0aHMuZWxlY3Ryb25BcHAucm9vdCwgJ2ltcG9ydCcpLFxuICAgICAgICAgICAgYXNzZXRzOiBqb2luKHRoaXMucGF0aHMuZWxlY3Ryb25BcHAucm9vdCwgJ2Fzc2V0cycpLFxuICAgICAgICAgICAgcGFja2FnZUpzb246IGpvaW4odGhpcy5wYXRocy5lbGVjdHJvbkFwcC5yb290LCAncGFja2FnZS5qc29uJyksXG4gICAgICAgICAgICBzZXR0aW5nczogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLnJvb3QsICdzZXR0aW5ncy5qc29uJyksXG4gICAgICAgICAgICBkZXNrdG9wOiBqb2luKHRoaXMucGF0aHMuZWxlY3Ryb25BcHAucm9vdCwgJ2Rlc2t0b3AuanMnKSxcbiAgICAgICAgICAgIGRlc2t0b3BUbXA6IGpvaW4odGhpcy5wYXRocy5lbGVjdHJvbkFwcC5yb290LCAnX19kZXNrdG9wJyksXG4gICAgICAgICAgICBub2RlTW9kdWxlczogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLnJvb3QsICdub2RlX21vZHVsZXMnKSxcbiAgICAgICAgICAgIG1ldGVvckFzYXI6IGpvaW4odGhpcy5wYXRocy5lbGVjdHJvbkFwcC5yb290LCAnbWV0ZW9yLmFzYXInKSxcbiAgICAgICAgICAgIG1ldGVvckFwcDogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLnJvb3QsICdtZXRlb3InKSxcbiAgICAgICAgICAgIG1ldGVvckFwcEluZGV4OiBqb2luKHRoaXMucGF0aHMuZWxlY3Ryb25BcHAucm9vdCwgJ21ldGVvcicsICdpbmRleC5odG1sJyksXG4gICAgICAgICAgICBtZXRlb3JBcHBQcm9ncmFtSnNvbjogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLnJvb3QsICdtZXRlb3InLCAncHJvZ3JhbS5qc29uJyksXG4gICAgICAgICAgICBza2VsZXRvbjogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLnJvb3QsICdza2VsZXRvbicpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFzc2lnbkluKHRoaXMucGF0aHMubWV0ZW9yQXBwLCB7XG4gICAgICAgICAgICBwbGF0Zm9ybXM6IGpvaW4odGhpcy5wYXRocy5tZXRlb3JBcHAucm9vdCwgJy5tZXRlb3InLCAncGxhdGZvcm1zJyksXG4gICAgICAgICAgICBwYWNrYWdlczogam9pbih0aGlzLnBhdGhzLm1ldGVvckFwcC5yb290LCAnLm1ldGVvcicsICdwYWNrYWdlcycpLFxuICAgICAgICAgICAgdmVyc2lvbnM6IGpvaW4odGhpcy5wYXRocy5tZXRlb3JBcHAucm9vdCwgJy5tZXRlb3InLCAndmVyc2lvbnMnKSxcbiAgICAgICAgICAgIHJlbGVhc2U6IGpvaW4odGhpcy5wYXRocy5tZXRlb3JBcHAucm9vdCwgJy5tZXRlb3InLCAncmVsZWFzZScpLFxuICAgICAgICAgICAgcGFja2FnZUpzb246IGpvaW4odGhpcy5wYXRocy5tZXRlb3JBcHAucm9vdCwgJ3BhY2thZ2UuanNvbicpLFxuICAgICAgICAgICAgZ2l0SWdub3JlOiBqb2luKHRoaXMucGF0aHMubWV0ZW9yQXBwLnJvb3QsICcubWV0ZW9yJywgJy5naXRpZ25vcmUnKSxcbiAgICAgICAgICAgIGNvcmRvdmFCdWlsZDogam9pbihcbiAgICAgICAgICAgICAgICB0aGlzLnBhdGhzLm1ldGVvckFwcC5yb290LFxuICAgICAgICAgICAgICAgICcubWV0ZW9yJyxcbiAgICAgICAgICAgICAgICAnbG9jYWwnLFxuICAgICAgICAgICAgICAgICdjb3Jkb3ZhLWJ1aWxkJyxcbiAgICAgICAgICAgICAgICAnd3d3JyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgd2ViQ29yZG92YTogam9pbihcbiAgICAgICAgICAgICAgICB0aGlzLnBhdGhzLm1ldGVvckFwcC5yb290LFxuICAgICAgICAgICAgICAgICcubWV0ZW9yJyxcbiAgICAgICAgICAgICAgICAnbG9jYWwnLFxuICAgICAgICAgICAgICAgICdidWlsZCcsXG4gICAgICAgICAgICAgICAgJ3Byb2dyYW1zJyxcbiAgICAgICAgICAgICAgICAnd2ViLmNvcmRvdmEnXG4gICAgICAgICAgICApXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFzc2lnbkluKHRoaXMucGF0aHMubWV0ZW9yQXBwLCB7XG4gICAgICAgICAgICBjb3Jkb3ZhQnVpbGRJbmRleDogam9pbihcbiAgICAgICAgICAgICAgICB0aGlzLnBhdGhzLm1ldGVvckFwcC5jb3Jkb3ZhQnVpbGQsICdpbmRleC5odG1sJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGNvcmRvdmFCdWlsZFByb2dyYW1Kc29uOiBqb2luKFxuICAgICAgICAgICAgICAgIHRoaXMucGF0aHMubWV0ZW9yQXBwLmNvcmRvdmFCdWlsZCwgJ3Byb2dyYW0uanNvbidcbiAgICAgICAgICAgIClcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXNzaWduSW4odGhpcy5wYXRocy5tZXRlb3JBcHAsIHtcbiAgICAgICAgICAgIHdlYkNvcmRvdmFQcm9ncmFtSnNvbjogam9pbihcbiAgICAgICAgICAgICAgICB0aGlzLnBhdGhzLm1ldGVvckFwcC53ZWJDb3Jkb3ZhLCAncHJvZ3JhbS5qc29uJ1xuICAgICAgICAgICAgKVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIC8qKiBAdHlwZSB7ZGVza3RvcFRtcFBhdGhzfSAqL1xuICAgICAgICB0aGlzLnBhdGhzLmRlc2t0b3BUbXAgPSB7XG4gICAgICAgICAgICByb290OiBqb2luKHRoaXMucGF0aHMuZWxlY3Ryb25BcHAucm9vdCwgJ19fZGVza3RvcCcpLFxuICAgICAgICB9O1xuXG4gICAgICAgIGFzc2lnbkluKHRoaXMucGF0aHMuZGVza3RvcFRtcCwge1xuICAgICAgICAgICAgbW9kdWxlczogam9pbih0aGlzLnBhdGhzLmRlc2t0b3BUbXAucm9vdCwgJ21vZHVsZXMnKSxcbiAgICAgICAgICAgIHNldHRpbmdzOiBqb2luKHRoaXMucGF0aHMuZGVza3RvcFRtcC5yb290LCAnc2V0dGluZ3MuanNvbicpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucGF0aHMucGFja2FnZURpciA9ICcuZGVza3RvcC1wYWNrYWdlJztcbiAgICAgICAgdGhpcy5wYXRocy5pbnN0YWxsZXJEaXIgPSAnLmRlc2t0b3AtaW5zdGFsbGVyJztcblxuICAgICAgICAvLyBTY2FmZm9sZFxuICAgICAgICB0aGlzLnBhdGhzLnNjYWZmb2xkID0gam9pbihfX2Rpcm5hbWUsICcuLicsICdzY2FmZm9sZCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufCp9XG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIGlzUHJvZHVjdGlvbkJ1aWxkKCkge1xuICAgICAgICByZXR1cm4gISEoJ3Byb2R1Y3Rpb24nIGluIHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMucHJvZHVjdGlvbik7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEVudjtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBkZXNrdG9wUGF0aHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByb290TmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJvb3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2R1bGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaW1wb3J0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXNzZXRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2V0dGluZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXNrdG9wXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3BsYXNoU2NyZWVuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbG9hZGluZ0dpZlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1ldGVvckljb1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gbWV0ZW9yQXBwUGF0aHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByb290XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGxhdGZvcm1zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVsZWFzZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhY2thZ2VzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBnaXRJZ25vcmVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYWNrYWdlSnNvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvcmRvdmFCdWlsZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvcmRvdmFCdWlsZEluZGV4XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29yZG92YUJ1aWxkUHJvZ3JhbUpzb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB3ZWJDb3Jkb3ZhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2ViQ29yZG92YUluZGV4XG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2ViQ29yZG92YVByb2dyYW1Kc29uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBlbGVjdHJvbkFwcFBhdGhzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcm9vdE5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByb290XG4gKiBAcHJvcGVydHkge09iamVjdH0gYXBwUm9vdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcFJvb3QuY29yZG92YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcFJvb3QuaW5kZXhcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBSb290LmFwcFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcFJvb3QubW9kdWxlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlc2t0b3BBc2FyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXh0cmFjdGVkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwQXNhclxuICogQHByb3BlcnR5IHtzdHJpbmd9IHByZWxvYWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbXBvcnRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhc3NldHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBnaXRJZ25vcmVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYWNrYWdlSnNvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNldHRpbmdzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVza3RvcFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlc2t0b3BUbXBcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBub2RlTW9kdWxlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IG1ldGVvckFzYXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZXRlb3JBcHBcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZXRlb3JBcHBJbmRleFxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1ldGVvckFwcFByb2dyYW1Kc29uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2tlbGV0b25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0bXBOb2RlTW9kdWxlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dHJhY3RlZE5vZGVNb2R1bGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXh0cmFjdGVkTm9kZU1vZHVsZXNCaW5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IGRlc2t0b3BUbXBQYXRoc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHJvb3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2R1bGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2V0dGluZ3NcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IG1ldGVvckRlc2t0b3BQYXRoc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHJvb3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBza2VsZXRvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gcGFja2FnZVBhdGhzXG4gKiBAcHJvcGVydHkge21ldGVvckFwcFBhdGhzfSBtZXRlb3JBcHBcbiAqIEBwcm9wZXJ0eSB7ZGVza3RvcFBhdGhzfSBkZXNrdG9wXG4gKiBAcHJvcGVydHkge2VsZWN0cm9uQXBwUGF0aHN9IGVsZWN0cm9uQXBwXG4gKiBAcHJvcGVydHkge2Rlc2t0b3BUbXBQYXRoc30gZGVza3RvcFRtcFxuICogQHByb3BlcnR5IHttZXRlb3JEZXNrdG9wUGF0aHN9IG1ldGVvckRlc2t0b3BcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYWNrYWdlRGlyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2NhZmZvbGRcbiAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7Ozs7QUFFQSxNQUFNO0VBQUVBO0FBQUYsSUFBV0MsYUFBakI7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFDZSxNQUFNQyxHQUFOLENBQVU7RUFDckJDLFdBQVcsQ0FBQ0MsS0FBRCxFQUFRQyxNQUFSLEVBQWdCQyxPQUFoQixFQUF5QjtJQUNoQyxLQUFLQSxPQUFMLEdBQWVBLE9BQWY7O0lBRUEsSUFBSSxLQUFLQyxpQkFBTCxFQUFKLEVBQThCO01BQzFCQyxPQUFPLENBQUNDLEdBQVIsQ0FBWUMsUUFBWixHQUF1QixZQUF2QjtJQUNIOztJQUVELEtBQUtDLEdBQUwsR0FBVztNQUNQQyxRQUFRLEVBQUVKLE9BQU8sQ0FBQ0ksUUFEWDtNQUVQQyxJQUFJLEVBQUVMLE9BQU8sQ0FBQ0s7SUFGUCxDQUFYLENBUGdDLENBWWhDOztJQUNBLEtBQUtDLEVBQUwsR0FBVTtNQUNOQyxTQUFTLEVBQUdQLE9BQU8sQ0FBQ0ksUUFBUixLQUFxQixPQUQzQjtNQUVOSSxPQUFPLEVBQUdSLE9BQU8sQ0FBQ0ksUUFBUixLQUFxQixPQUZ6QjtNQUdOSyxLQUFLLEVBQUdULE9B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Y0FEVjtJQURBLENBQS9CO0lBT0E7O0lBQ0EsS0FBSzFDLEtBQUwsQ0FBVytCLFVBQVgsR0FBd0I7TUFDcEI3QixJQUFJLEVBQUV6QixJQUFJLENBQUMsS0FBS3VCLEtBQUwsQ0FBV2lCLFdBQVgsQ0FBdUJmLElBQXhCLEVBQThCLFdBQTlCO0lBRFUsQ0FBeEI7SUFJQSxJQUFBTyxpQkFBQSxFQUFTLEtBQUtULEtBQUwsQ0FBVytCLFVBQXBCLEVBQWdDO01BQzVCckIsT0FBTyxFQUFFakMsSUFBSSxDQUFDLEtBQUt1QixLQUFMLENBQVcrQixVQUFYLENBQXNCN0IsSUFBdkIsRUFBNkIsU0FBN0IsQ0FEZTtNQUU1QlcsUUFBUSxFQUFFcEMsSUFBSSxDQUFDLEtBQUt1QixLQUFMLENBQVcrQixVQUFYLENBQXNCN0IsSUFBdkIsRUFBNkIsZUFBN0I7SUFGYyxDQUFoQztJQUtBLEtBQUtGLEtBQUwsQ0FBVzhDLFVBQVgsR0FBd0Isa0JBQXhCO0lBQ0EsS0FBSzlDLEtBQUwsQ0FBVytDLFlBQVgsR0FBMEIsb0JBQTFCLENBNUpnQyxDQThKaEM7O0lBQ0EsS0FBSy9DLEtBQUwsQ0FBV2dELFFBQVgsR0FBc0J2RSxJQUFJLENBQUMyQixTQUFELEVBQVksSUFBWixFQUFrQixVQUFsQixDQUExQjtFQUNIO0VBRUQ7QUFDSjtBQUNBO0FBQ0E7OztFQUNJcEIsaUJBQWlCLEdBQUc7SUFDaEIsT0FBTyxDQUFDLEVBQUUsZ0JBQWdCLEtBQUtELE9BQXJCLElBQWdDLEtBQUtBLE9BQUwsQ0FBYWtFLFVBQS9DLENBQVI7RUFDSDs7QUF6S29COzs7QUE0S3pCQyxNQUFNLENBQUNDLE9BQVAsR0FBaUJ4RSxHQUFqQjtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSJ9 \ No newline at end of file diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index 44c7cecc..00000000 --- a/dist/index.js +++ /dev/null @@ -1,247 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = _exports; - -var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime")); - -var _fs = _interopRequireDefault(require("fs")); - -var _path = _interopRequireDefault(require("path")); - -var _shelljs = _interopRequireDefault(require("shelljs")); - -var _env = _interopRequireDefault(require("./env")); - -var _electron = _interopRequireDefault(require("./electron")); - -var _log = _interopRequireDefault(require("./log")); - -var _desktop = _interopRequireDefault(require("./desktop")); - -var _electronApp = _interopRequireDefault(require("./electronApp")); - -var _meteorApp = _interopRequireDefault(require("./meteorApp")); - -var _electronBuilder = _interopRequireDefault(require("./electronBuilder")); - -var _packager = _interopRequireDefault(require("./packager")); - -var _utils = _interopRequireDefault(require("./utils")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -// eslint-disable-next-line no-unused-vars -_shelljs.default.config.fatal = true; -/** - * Main entity. - * @class - * @property {Env} env - * @property {Electron} electron - * @property {InstallerBuilder} installerBuilder - * @property {ElectronApp} electronApp - * @property {Desktop} desktop - * @property {MeteorApp} meteorApp - */ - -class MeteorDesktop { - /** - * @param {string} input - Meteor app dir - * @param {string} output - output dir for bundle/package/installer - * @param {Object} options - options from cli.js - * @param {Object} dependencies - dependencies object - * @constructor - */ - constructor(input, output, options, dependencies) { - const Log = dependencies.log; - this.log = new Log('index'); - this.version = this.getVersion(); - this.log.info('initializing'); - this.env = new _env.default(input, output, options); - this.electron = new _electron.default(this); - this.electronBuilder = new _electronBuilder.default(this); - this.electronApp = new _electronApp.default(this); - this.desktop = new _desktop.default(this); - this.meteorApp = new _meteorApp.default(this); - this.utils = _utils.default; - } - /** - * Tries to read the version from our own package.json. - * - * @returns {string} - */ - - - getVersion() { - if (this.version) { - return this.version; - } - - let version = null; - - try { - ({ - version - } = JSON.parse(_fs.default.readFileSync(_path.default.join(__dirname, '..', 'package.json'), 'UTF-8'))); - } catch (e) { - this.log.error(`error while trying to read ${_path.default.join(__dirname, 'package.json')}`, e); - process.exit(1); - } - - if (process.env.PLUGIN_VERSION && (version.includes('rc') || version.includes('beta') || version.includes('alpha'))) { - version = process.env.PLUGIN_VERSION; - } - - return version; - } - /** - * Tries to read the version from our own package.json. - * - * @returns {string} - */ - - - getElectronVersion() { - let version = null; - - try { - const { - dependencies = {}, - devDependencies = {} - } = JSON.parse(_fs.default.readFileSync(_path.default.join(this.env.paths.meteorApp.root, 'package.json'), 'UTF-8')); - - if (!('electron' in dependencies) && !('electron' in devDependencies)) { - this.log.error('electron not found in meteor project dependencies'); - process.exit(1); - } - - version = dependencies.electron || devDependencies.electron; - - if (this.electronApp.depsManager.checks.version.regex.test(version)) { - ({ - version - } = JSON.parse(_fs.default.readFileSync(_path.default.join(this.env.paths.meteorApp.root, 'node_modules', 'electron', 'package.json'), 'UTF-8'))); - } - } catch (e) { - this.log.error(`error while trying to read ${_path.default.join(this.env.paths.meteorApp.root, 'package.json')}`, e); - process.exit(1); - } - - return version; - } - - async init() { - this.desktop.scaffold(); - this.meteorApp.updateGitIgnore(); - await this.electronApp.init(); - } - - async buildInstaller(throwError = false) { - this.env.options.installerBuild = true; - await this.electronApp.build(); - - try { - await this.electronBuilder.build(); - } catch (e) { - this.log.error('error occurred while building installer', e); - - if (throwError) { - throw new Error(e); - } - } - } - - async run() { - await this.electronApp.build(true); - } - - async build() { - await this.electronApp.build(); - } - - justRun() { - this.electron.run(); - } - - async runPackager() { - this.packager = new _packager.default(this); - await this.packager.init(); - await this.electronApp.build(); - this.packager.packageApp().catch(e => { - this.log.error(`while trying to build a package an error occurred: ${e}`); - }); - } - - async getDependency(name, version, declarationCheck = true) { - if (declarationCheck) { - try { - const { - dependencies = {}, - devDependencies = {} - } = JSON.parse(_fs.default.readFileSync(_path.default.join(this.env.paths.meteorApp.root, 'package.json'), 'UTF-8')); - - if (!(name in dependencies) && !(name in devDependencies)) { - await this.meteorApp.runNpm(['i', '-D', '-E', '--only=dev', `${name}@${version}`], 'inherit'); - } - } catch (e) { - this.log.error(`could no read ${_path.default.join(this.env.paths.meteorApp.root, 'package.json')}`, e); - process.exit(1); - } - } - - const dependencyPath = _path.default.join(this.env.paths.meteorApp.root, 'node_modules', name); - - let dependency = null; - - try { - dependency = require(dependencyPath); - } catch (e) { - if (declarationCheck) { - this.log.warn(`could not find ${name}, installing the default version for you: ${name}@${version}`); - - try { - await this.meteorApp.runNpm(['i', '-D', '-E', '--only=dev', `${name}@${version}`], 'inherit'); - } catch (err) { - this.log.error(err); - process.exit(1); - } - } else { - this.log.warn(`could not find ${name}, exiting`); - process.exit(1); - } - } finally { - if (!dependency) { - dependency = require(dependencyPath); - } - } - - const dependencyVersion = require(_path.default.join(dependencyPath, 'package.json')).version; - - if (dependencyVersion !== version) { - if (dependencyVersion.split('.')[0] !== version.split('.')[0]) { - this.log.warn(`you are using a ${name}@${dependencyVersion} while the recommended version is ` + `${version}, the compatibility version is different, use at your own risk, be sure to report ` + 'that when submitting issues'); - } else { - this.log.warn(`you are using a ${name}@${dependencyVersion} while the recommended version is ` + `${version}, be sure to report that when submitting issues`); - } - } - - return { - dependency, - path: dependencyPath - }; - } - -} - -function _exports(input, output, options, { - log = _log.default -} = { - log: _log.default -}) { - return new MeteorDesktop(input, output, options, { - log - }); -} -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzaGVsbCIsImNvbmZpZyIsImZhdGFsIiwiTWV0ZW9yRGVza3RvcCIsImNvbnN0cnVjdG9yIiwiaW5wdXQiLCJvdXRwdXQiLCJvcHRpb25zIiwiZGVwZW5kZW5jaWVzIiwiTG9nIiwibG9nIiwidmVyc2lvbiIsImdldFZlcnNpb24iLCJpbmZvIiwiZW52IiwiRW52IiwiZWxlY3Ryb24iLCJFbGVjdHJvbiIsImVsZWN0cm9uQnVpbGRlciIsIkVsZWN0cm9uQnVpbGRlciIsImVsZWN0cm9uQXBwIiwiRWxlY3Ryb25BcHAiLCJkZXNrdG9wIiwiRGVza3RvcCIsIm1ldGVvckFwcCIsIk1ldGVvckFwcCIsInV0aWxzIiwiSlNPTiIsInBhcnNlIiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJwYXRoIiwiam9pbiIsIl9fZGlybmFtZSIsImUiLCJlcnJvciIsInByb2Nlc3MiLCJleGl0IiwiUExVR0lOX1ZFUlNJT04iLCJpbmNsdWRlcyIsImdldEVsZWN0cm9uVmVyc2lvbiIsImRldkRlcGVuZGVuY2llcyIsInBhdGhzIiwicm9vdCIsImRlcHNNYW5hZ2VyIiwiY2hlY2tzIiwicmVnZXgiLCJ0ZXN0IiwiaW5pdCIsInNjYWZmb2xkIiwidXBkYXRlR2l0SWdub3JlIiwiYnVpbGRJbnN0YWxsZXIiLCJ0aHJvd0Vycm9yIiwiaW5zdGFsbGVyQnVpbGQiLCJidWlsZCIsIkVycm9yIiwicnVuIiwianVzdFJ1biIsInJ1blBhY2thZ2VyIiwicGFja2FnZXIiLCJQYWNrYWdlciIsInBhY2thZ2VBcHAiLCJjYXRjaCIsImdldERlcGVuZGVuY3kiLCJuYW1lIiwiZGVjbGFyYXRpb25DaGVjayIsInJ1bk5wbSIsImRlcGVuZGVuY3lQYXRoIiwiZGVwZW5kZW5jeSIsInJlcXVpcmUiLCJ3YXJuIiwiZXJyIiwiZGVwZW5kZW5jeVZlcnNpb24iLCJzcGxpdCIsImV4cG9ydHMiLCJMb2dnZXIiXSwic291cmNlcyI6WyIuLi9saWIvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5pbXBvcnQgcmVnZW5lcmF0b3JSdW50aW1lIGZyb20gJ3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZSc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgc2hlbGwgZnJvbSAnc2hlbGxqcyc7XG5pbXBvcnQgRW52IGZyb20gJy4vZW52JztcbmltcG9ydCBFbGVjdHJvbiBmcm9tICcuL2VsZWN0cm9uJztcbmltcG9ydCBMb2dnZXIgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IERlc2t0b3AgZnJvbSAnLi9kZXNrdG9wJztcbmltcG9ydCBFbGVjdHJvbkFwcCBmcm9tICcuL2VsZWN0cm9uQXBwJztcbmltcG9ydCBNZXRlb3JBcHAgZnJvbSAnLi9tZXRlb3JBcHAnO1xuaW1wb3J0IEVsZWN0cm9uQnVpbGRlciBmcm9tICcuL2VsZWN0cm9uQnVpbGRlcic7XG5pbXBvcnQgUGFja2FnZXIgZnJvbSAnLi9wYWNrYWdlcic7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbnNoZWxsLmNvbmZpZy5mYXRhbCA9IHRydWU7XG5cbi8qKlxuICogTWFpbiBlbnRpdHkuXG4gKiBAY2xhc3NcbiAqIEBwcm9wZXJ0eSB7RW52fSBlbnZcbiAqIEBwcm9wZXJ0eSB7RWxlY3Ryb259IGVsZWN0cm9uXG4gKiBAcHJvcGVydHkge0luc3RhbGxlckJ1aWxkZXJ9IGluc3RhbGxlckJ1aWxkZXJcbiAqIEBwcm9wZXJ0eSB7RWxlY3Ryb25BcHB9IGVsZWN0cm9uQXBwXG4gKiBAcHJvcGVydHkge0Rlc2t0b3B9IGRlc2t0b3BcbiAqIEBwcm9wZXJ0eSB7TWV0ZW9yQXBwfSBtZXRlb3JBcHBcbiAqL1xuY2xhc3MgTWV0ZW9yRGVza3RvcCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0ICAgICAgICAtIE1ldGVvciBhcHAgZGlyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG91dHB1dCAgICAgICAtIG91dHB1dCBkaXIgZm9yIGJ1bmRsZS9wYWNrYWdlL2luc3RhbGxlclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zICAgICAgLSBvcHRpb25zIGZyb20gY2xpLmpzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRlcGVuZGVuY2llcyAtIGRlcGVuZGVuY2llcyBvYmplY3RcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihpbnB1dCwgb3V0cHV0LCBvcHRpb25zLCBkZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgY29uc3QgTG9nID0gZGVwZW5kZW5jaWVzLmxvZztcbiAgICAgICAgdGhpcy5sb2cgPSBuZXcgTG9nKCdpbmRleCcpO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSB0aGlzLmdldFZlcnNpb24oKTtcblxuICAgICAgICB0aGlzLmxvZy5pbmZvKCdpbml0aWFsaXppbmcnKTtcblxuICAgICAgICB0aGlzLmVudiA9IG5ldyBFbnYoaW5wdXQsIG91dHB1dCwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZWxlY3Ryb24gPSBuZXcgRWxlY3Ryb24odGhpcyk7XG4gICAgICAgIHRoaXMuZWxlY3Ryb25CdWlsZGVyID0gbmV3IEVsZWN0cm9uQnVpbGRlcih0aGlzKTtcbiAgICAgICAgdGhpcy5lbGVjdHJvbkFwcCA9IG5ldyBFbGVjdHJvbkFwcCh0aGlzKTtcbiAgICAgICAgdGhpcy5kZXNrdG9wID0gbmV3IERlc2t0b3AodGhpcyk7XG4gICAgICAgIHRoaXMubWV0ZW9yQXBwID0gbmV3IE1ldGVvckFwcCh0aGlzKTtcbiAgICAgICAgdGhpcy51dGlscyA9IHV0aWxzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWVzIHRvIHJlYWQgdGhlIHZlcnNpb24gZnJvbSBvdXIgb3duIHBhY2thZ2UuanNvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0VmVyc2lvbigpIHtcbiAgICAgICAgaWYgKHRoaXMudmVyc2lvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmVyc2lvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICh7IHZlcnNpb24gfSA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICdwYWNrYWdlLmpzb24nKSwgJ1VURi04JylcbiAgICAgICAgICAgICkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihgZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIHJlYWQgJHtwYXRoLmpvaW4oX19kaXJuYW1lLCAncGFja2FnZS5qc29uJyl9YCwgZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LlBMVUdJTl9WRVJTSU9OICYmXG4gICAgICAgICAgICAodmVyc2lvbi5pbmNsdWRlcygncmMnKSB8fCB2ZXJzaW9uLmluY2x1ZGVzKCdiZXRhJykgfHwgdmVyc2lvbi5pbmNsdWRlcygnYWxwaGEnKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB2ZXJzaW9uID0gcHJvY2Vzcy5lbnYuUExVR0lOX1ZFUlNJT047XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZlcnNpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZXMgdG8gcmVhZCB0aGUgdmVyc2lvbiBmcm9tIG91ciBvd24gcGFja2FnZS5qc29uLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRFbGVjdHJvblZlcnNpb24oKSB7XG4gICAgICAgIGxldCB2ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHsgZGVwZW5kZW5jaWVzID0ge30sIGRldkRlcGVuZGVuY2llcyA9IHt9IH0gPSBKU09OLnBhcnNlKFxuICAgICAgICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5lbnYucGF0aHMubWV0ZW9yQXBwLnJvb3QsICdwYWNrYWdlLmpzb24nKSwgJ1VURi04JylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoISgnZWxlY3Ryb24nIGluIGRlcGVuZGVuY2llcykgJiYgISgnZWxlY3Ryb24nIGluIGRldkRlcGVuZGVuY2llcykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZWxlY3Ryb24gbm90IGZvdW5kIGluIG1ldGVvciBwcm9qZWN0IGRlcGVuZGVuY2llcycpO1xuICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZlcnNpb24gPSBkZXBlbmRlbmNpZXMuZWxlY3Ryb24gfHwgZGV2RGVwZW5kZW5jaWVzLmVsZWN0cm9uO1xuICAgICAgICAgICAgaWYgKHRoaXMuZWxlY3Ryb25BcHAuZGVwc01hbmFnZXIuY2hlY2tzLnZlcnNpb24ucmVnZXgudGVzdCh2ZXJzaW9uKSkge1xuICAgICAgICAgICAgICAgICh7IHZlcnNpb24gfSA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5lbnYucGF0aHMubWV0ZW9yQXBwLnJvb3QsICdub2RlX21vZHVsZXMnLCAnZWxlY3Ryb24nLCAncGFja2FnZS5qc29uJyksICdVVEYtOCcpXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGBlcnJvciB3aGlsZSB0cnlpbmcgdG8gcmVhZCAke3BhdGguam9pbih0aGlzLmVudi5wYXRocy5tZXRlb3JBcHAucm9vdCwgJ3BhY2thZ2UuanNvbicpfWAsIGUpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2ZXJzaW9uO1xuICAgIH1cblxuICAgIGFzeW5jIGluaXQoKSB7XG4gICAgICAgIHRoaXMuZGVza3RvcC5zY2FmZm9sZCgpO1xuICAgICAgICB0aGlzLm1ldGVvckFwcC51cGRhdGVHaXRJZ25vcmUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5lbGVjdHJvbkFwcC5pbml0KCk7XG4gICAgfVxuXG4gICAgYXN5bmMgYnVpbGRJbnN0YWxsZXIodGhyb3dFcnJvciA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuZW52Lm9wdGlvbnMuaW5zdGFsbGVyQnVpbGQgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLmVsZWN0cm9uQXBwLmJ1aWxkKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmVsZWN0cm9uQnVpbGRlci5idWlsZCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igb2NjdXJyZWQgd2hpbGUgYnVpbGRpbmcgaW5zdGFsbGVyJywgZSk7XG4gICAgICAgICAgICBpZiAodGhyb3dFcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHJ1bigpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbGVjdHJvbkFwcC5idWlsZCh0cnVlKTtcbiAgICB9XG5cbiAgICBhc3luYyBidWlsZCgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbGVjdHJvbkFwcC5idWlsZCgpO1xuICAgIH1cblxuICAgIGp1c3RSdW4oKSB7XG4gICAgICAgIHRoaXMuZWxlY3Ryb24ucnVuKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgcnVuUGFja2FnZXIoKSB7XG4gICAgICAgIHRoaXMucGFja2FnZXIgPSBuZXcgUGFja2FnZXIodGhpcyk7XG4gICAgICAgIGF3YWl0IHRoaXMucGFja2FnZXIuaW5pdCgpO1xuICAgICAgICBhd2FpdCB0aGlzLmVsZWN0cm9uQXBwLmJ1aWxkKCk7XG5cbiAgICAgICAgdGhpcy5wYWNrYWdlci5wYWNrYWdlQXBwKCkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGB3aGlsZSB0cnlpbmcgdG8gYnVpbGQgYSBwYWNrYWdlIGFuIGVycm9yIG9jY3VycmVkOiAke2V9YCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIGdldERlcGVuZGVuY3kobmFtZSwgdmVyc2lvbiwgZGVjbGFyYXRpb25DaGVjayA9IHRydWUpIHtcbiAgICAgICAgaWYgKGRlY2xhcmF0aW9uQ2hlY2spIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkZXBlbmRlbmNpZXMgPSB7fSwgZGV2RGVwZW5kZW5jaWVzID0ge30gfSA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5lbnYucGF0aHMubWV0ZW9yQXBwLnJvb3QsICdwYWNrYWdlLmpzb24nKSwgJ1VURi04JylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICghKG5hbWUgaW4gZGVwZW5kZW5jaWVzKSAmJiAhKG5hbWUgaW4gZGV2RGVwZW5kZW5jaWVzKSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1ldGVvckFwcC5ydW5OcG0oWydpJywgJy1EJywgJy1FJywgJy0tb25seT1kZXYnLCBgJHtuYW1lfUAke3ZlcnNpb259YF0sICdpbmhlcml0Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGBjb3VsZCBubyByZWFkICR7cGF0aC5qb2luKHRoaXMuZW52LnBhdGhzLm1ldGVvckFwcC5yb290LCAncGFja2FnZS5qc29uJyl9YCwgZSk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVwZW5kZW5jeVBhdGggPSBwYXRoLmpvaW4odGhpcy5lbnYucGF0aHMubWV0ZW9yQXBwLnJvb3QsICdub2RlX21vZHVsZXMnLCBuYW1lKTtcbiAgICAgICAgbGV0IGRlcGVuZGVuY3kgPSBudWxsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZGVwZW5kZW5jeSA9IHJlcXVpcmUoZGVwZW5kZW5jeVBhdGgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb25DaGVjaykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLndhcm4oYGNvdWxkIG5vdCBmaW5kICR7bmFtZX0sIGluc3RhbGxpbmcgdGhlIGRlZmF1bHQgdmVyc2lvbiBmb3IgeW91OiAke25hbWV9QCR7dmVyc2lvbn1gKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1ldGVvckFwcC5ydW5OcG0oWydpJywgJy1EJywgJy1FJywgJy0tb25seT1kZXYnLCBgJHtuYW1lfUAke3ZlcnNpb259YF0sICdpbmhlcml0Jyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLndhcm4oYGNvdWxkIG5vdCBmaW5kICR7bmFtZX0sIGV4aXRpbmdgKTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoIWRlcGVuZGVuY3kpIHtcbiAgICAgICAgICAgICAgICBkZXBlbmRlbmN5ID0gcmVxdWlyZShkZXBlbmRlbmN5UGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVwZW5kZW5jeVZlcnNpb24gPSByZXF1aXJlKHBhdGguam9pbihkZXBlbmRlbmN5UGF0aCwgJ3BhY2thZ2UuanNvbicpKS52ZXJzaW9uO1xuXG4gICAgICAgIGlmIChkZXBlbmRlbmN5VmVyc2lvbiAhPT0gdmVyc2lvbikge1xuICAgICAgICAgICAgaWYgKGRlcGVuZGVuY3lWZXJzaW9uLnNwbGl0KCcuJylbMF0gIT09IHZlcnNpb24uc3BsaXQoJy4nKVswXSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLndhcm4oYHlvdSBhcmUgdXNpbmcgYSAke25hbWV9QCR7ZGVwZW5kZW5jeVZlcnNpb259IHdoaWxlIHRoZSByZWNvbW1lbmRlZCB2ZXJzaW9uIGlzIGAgK1xuICAgICAgICAgICAgICAgICAgICBgJHt2ZXJzaW9ufSwgdGhlIGNvbXBhdGliaWxpdHkgdmVyc2lvbiBpcyBkaWZmZXJlbnQsIHVzZSBhdCB5b3VyIG93biByaXNrLCBiZSBzdXJlIHRvIHJlcG9ydCBgICtcbiAgICAgICAgICAgICAgICAgICAgJ3RoYXQgd2hlbiBzdWJtaXR0aW5nIGlzc3VlcycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy53YXJuKGB5b3UgYXJlIHVzaW5nIGEgJHtuYW1lfUAke2RlcGVuZGVuY3lWZXJzaW9ufSB3aGlsZSB0aGUgcmVjb21tZW5kZWQgdmVyc2lvbiBpcyBgICtcbiAgICAgICAgICAgICAgICAgICAgYCR7dmVyc2lvbn0sIGJlIHN1cmUgdG8gcmVwb3J0IHRoYXQgd2hlbiBzdWJtaXR0aW5nIGlzc3Vlc2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRlcGVuZGVuY3ksIHBhdGg6IGRlcGVuZGVuY3lQYXRoIH07XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleHBvcnRzKGlucHV0LCBvdXRwdXQsIG9wdGlvbnMsIHsgbG9nID0gTG9nZ2VyIH0gPSB7IGxvZzogTG9nZ2VyIH0pIHtcbiAgICByZXR1cm4gbmV3IE1ldGVvckRlc2t0b3AoaW5wdXQsIG91dHB1dCwgb3B0aW9ucywgeyBsb2cgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQWJBO0FBZUFBLGdCQUFBLENBQU1DLE1BQU4sQ0FBYUMsS0FBYixHQUFxQixJQUFyQjtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE1BQU1DLGFBQU4sQ0FBb0I7RUFDaEI7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSUMsV0FBVyxDQUFDQyxLQUFELEVBQVFDLE1BQVIsRUFBZ0JDLE9BQWhCLEVBQXlCQyxZQUF6QixFQUF1QztJQUM5QyxNQUFNQyxHQUFHLEdBQUdELFlBQVksQ0FBQ0UsR0FBekI7SUFDQSxLQUFLQSxHQUFMLEdBQVcsSUFBSUQsR0FBSixDQUFRLE9BQVIsQ0FBWDtJQUNBLEtBQUtFLE9BQUwsR0FBZSxLQUFLQyxVQUFMLEVBQWY7SUFFQSxLQUFLRixHQUFMLENBQVNHLElBQVQsQ0FBYyxjQUFkO0lBRUEsS0FBS0MsR0FBTCxHQUFXLElBQUlDLFlBQUosQ0FBUVYsS0FBUixFQUFlQyxNQUFmLEVBQXVCQyxPQUF2QixDQUFYO0lBQ0EsS0FBS1MsUUFBTCxHQUFnQixJQUFJQyxpQkFBSixDQUFhLElBQWIsQ0FBaEI7SUFDQSxLQUFLQyxlQUFMLEdBQXVCLElBQUlDLHdCQUFKLENBQW9CLElBQXBCLENBQXZCO0lBQ0EsS0FBS0MsV0FBTCxHQUFtQixJQUFJQyxvQkFBSixDQUFnQixJQUFoQixDQUFuQjtJQUNBLEtBQUtDLE9BQUwsR0FBZSxJQUFJQyxnQkFBSixDQUFZLElBQVosQ0FBZjtJQUNBLEtBQUtDLFNBQUwsR0FBaUIsSUFBSUMsa0JBQUosQ0FBYyxJQUFkLENBQWpCO0lBQ0EsS0FBS0MsS0FBTCxHQUFhQSxjQUFiO0VBQ0g7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBOzs7RUFDSWQsVUFBVSxHQUFHO0lBQ1QsSUFBSSxLQUFLRCxPQUFULEVBQWtCO01BQ2QsT0FBTyxLQUFLQSxPQUFaO0lBQ0g7O0lBRUQsSUFBSUEsT0FBTyxHQUFHLElBQWQ7O0lBQ0EsSUFBSTtNQUNBLENBQUM7UUFBRUE7TUFBRixJQUFjZ0IsSUFBSSxDQUFDQyxLQUFMLENBQ1hDLFdBQUEsQ0FBR0MsWUFBSCxDQUFnQkMsYUFBQSxDQUFLQyxJQUFMLENBQVVDLFNBQVYsRUFBcUIsSUFBckIsRUFBMkIsY0FBM0IsQ0FBaEIsRUFBNEQsT0FBNUQsQ0FEVyxDQUFmO0lBR0gsQ0FKRCxDQUlFLE9BQU9DLENBQVAsRUFBVTtNQUNSLEtBQUt4QixHQUFMLENBQVN5QixLQUFULENBQWdCLDhCQUE2QkosYUFBQSxDQUFLQyxJQUFMLENBQVVDLFNBQVYsRUFBcUIsY0FBckIsQ0FBcUMsRUFBbEYsRUFBcUZDLENBQXJGO01BQ0FFLE9BQU8sQ0FBQ0MsSUFBUixDQUFhLENBQWI7SUFDSDs7SUFDRCxJQUFJRCxPQUFPLENBQUN0QixHQUFSLENBQVl3QixjQUFaLEtBQ0MzQixPQUFPLENBQUM0QixRQUFSLENBQWlCLElBQWpCLEtBQTBCNUIsT0FBTyxDQUFDNEIsUUFBUixDQUFpQixNQUFqQixDQUExQixJQUFzRDVCLE9BQU8sQ0FBQzRCLFFBQVIsQ0FBaUIsT0FBakIsQ0FEdkQsQ0FBSixFQUVFO01BQ0U1QixPQUFPLEdBQUd5QixPQUFPLENBQUN0QixHQUFSLENBQVl3QixjQUF0QjtJQUNIOztJQUNELE9BQU8zQixPQUFQO0VBQ0g7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBOzs7RUFDSTZCLGtCQUFrQixHQUFHO0lBQ2pCLElBQUk3QixPQUFPLEdBQUcsSUFBZDs7SUFDQSxJQUFJO01BQ0EsTUFBTTtRQUFFSCxZQUFZLEdBQUcsRUFBakI7UUFBcUJpQyxlQUFlLEdBQUc7TUFBdkMsSUFBOENkLElBQUksQ0FBQ0MsS0FBTCxDQUNoREMsV0FBQSxDQUFHQyxZQUFILENBQWdCQyxhQUFBLENBQUtDLElBQUwsQ0FBVSxLQUFLbEIsR0FBTCxDQUFTNEIsS0FBVCxDQUFlbEIsU0FBZixDQUF5Qm1CLElBQW5DLEVBQXlDLGNBQXpDLENBQWhCLEVBQTBFLE9BQTFFLENBRGdELENBQXBEOztNQUdBLElBQUksRUFBRSxjQUFjbkMsWUFBaEIsS0FBaUMsRUFBRSxjQUFjaUMsZUFBaEIsQ0FBckMsRUFBdUU7UUFDbkUsS0FBSy9CLEdBQUwsQ0FBU3lCLEtBQVQsQ0FBZSxtREFBZjtRQUNBQyxPQUFPLENBQUNDLElBQVIsQ0FBYSxDQUFiO01BQ0g7O01BQ0QxQixPQUFPLEdBQUdILFlBQVksQ0FBQ1EsUUFBYixJQUF5QnlCLGVBQWUsQ0FBQ3pCLFFBQW5EOztNQUNBLElBQUksS0FBS0ksV0FBTCxDQUFpQndCLFdBQWpCLENBQTZCQyxNQUE3QixDQUFvQ2xDLE9BQXBDLENBQTRDbUMsS0FBNUMsQ0FBa0RDLElBQWxELENBQXVEcEMsT0FBdkQsQ0FBSixFQUFxRTtRQUNqRSxDQUFDO1VBQUVBO1FBQUYsSUFBY2dCLElBQUksQ0FBQ0MsS0FBTCxDQUNYQyxXQUFBLENBQUdDLFlBQUgsQ0FBZ0JDLGFBQUEsQ0FBS0MsSUFBTCxDQUFVLEtBQUtsQixHQUFMLENBQVM0QixLQUFULENBQWVsQixTQUFmLENBQXlCbUIsSUFBbkMsRUFBeUMsY0FBekMsRUFBeUQsVUFBekQsRUFBcUUsY0FBckUsQ0FBaEIsRUFBc0csT0FBdEcsQ0FEVyxDQUFmO01BR0g7SUFDSixDQWRELENBY0UsT0FBT1QsQ0FBUCxFQUFVO01BQ1IsS0FBS3hCLEdBQUwsQ0FBU3lCLEtBQVQsQ0FBZ0IsOEJBQTZCSixhQUFBLENBQUtDLElBQUwsQ0FBVSxLQUFLbEIsR0FBTCxDQUFTNEIsS0FBVCxDQUFlbEIsU0FBZixDQUF5Qm1CLElBQW5DLEVBQXlDLGNBQXpDLENBQXlELEVBQXRHLEVBQXlHVCxDQUF6RztNQUNBRSxPQUFPLENBQUNDLElBQVIsQ0FBYSxDQUFiO0lBQ0g7O0lBQ0QsT0FBTzFCLE9BQVA7RUFDSDs7RUFFUyxNQUFKcUMsSUFBSSxHQUFHO0lBQ1QsS0FBSzFCLE9BQUwsQ0FBYTJCLFFBQWI7SUFDQSxLQUFLekIsU0FBTCxDQUFlMEIsZUFBZjtJQUNBLE1BQU0sS0FBSzlCLFdBQUwsQ0FBaUI0QixJQUFqQixFQUFOO0VBQ0g7O0VBRW1CLE1BQWRHLGNBQWMsQ0FBQ0MsVUFBVSxHQUFHLEtBQWQsRUFBcUI7SUFDckMsS0FBS3RDLEdBQUwsQ0FBU1AsT0FBVCxDQUFpQjhDLGNBQWpCLEdBQWtDLElBQWxDO0lBQ0EsTUFBTSxLQUFLakMsV0FBTCxDQUFpQmtDLEtBQWpCLEVBQU47O0lBQ0EsSUFBSTtNQUNBLE1BQU0sS0FBS3BDLGVBQUwsQ0FBcUJvQyxLQUFyQixFQUFOO0lBQ0gsQ0FGRCxDQUVFLE9BQU9wQixDQUFQLEVBQVU7TUFDUixLQUFLeEIsR0FBTCxDQUFTeUIsS0FBVCxDQUFlLHlDQUFmLEVBQTBERCxDQUExRDs7TUFDQSxJQUFJa0IsVUFBSixFQUFnQjtRQUNaLE1BQU0sSUFBSUcsS0FBSixDQUFVckIsQ0FBVixDQUFOO01BQ0g7SUFDSjtFQUNKOztFQUVRLE1BQUhzQixHQUFHLEdBQUc7SUFDUixNQUFNLEtBQUtwQyxXQUFMLENBQWlCa0MsS0FBakIsQ0FBdUIsSUFBdkIsQ0FBTjtFQUNIOztFQUVVLE1BQUxBLEtBQUssR0FBRztJQUNWLE1BQU0sS0FBS2xDLFdBQUwsQ0FBaUJrQyxLQUFqQixFQUFOO0VBQ0g7O0VBRURHLE9BQU8sR0FBRztJQUNOLEtBQUt6QyxRQUFMLENBQWN3QyxHQUFkO0VBQ0g7O0VBRWdCLE1BQVhFLFdBQVcsR0FBRztJQUNoQixLQUFLQyxRQUFMLEdBQWdCLElBQUlDLGlCQUFKLENBQWEsSUFBYixDQUFoQjtJQUNBLE1BQU0sS0FBS0QsUUFBTCxDQUFjWCxJQUFkLEVBQU47SUFDQSxNQUFNLEtBQUs1QixXQUFMLENBQWlCa0MsS0FBakIsRUFBTjtJQUVBLEtBQUtLLFFBQUwsQ0FBY0UsVUFBZCxHQUEyQkMsS0FBM0IsQ0FBa0M1QixDQUFELElBQU87TUFDcEMsS0FBS3hCLEdBQUwsQ0FBU3lCLEtBQVQsQ0FBZ0Isc0RBQXFERCxDQUFFLEVBQXZFO0lBQ0gsQ0FGRDtFQUdIOztFQUVrQixNQUFiNkIsYUFBYSxDQUFDQyxJQUFELEVBQU9yRCxPQUFQLEVBQWdCc0QsZ0JBQWdCLEdBQUcsSUFBbkMsRUFBeUM7SUFDeEQsSUFBSUEsZ0JBQUosRUFBc0I7TUFDbEIsSUFBSTtRQUNBLE1BQU07VUFBRXpELFlBQVksR0FBRyxFQUFqQjtVQUFxQmlDLGVBQWUsR0FBRztRQUF2QyxJQUE4Q2QsSUFBSSxDQUFDQyxLQUFMLENBQ2hEQyxXQUFBLENBQUdDLFlBQUgsQ0FBZ0JDLGFBQUEsQ0FBS0MsSUFBTCxDQUFVLEtBQUtsQixHQUFMLENBQVM0QixLQUFULENBQWVsQixTQUFmLENBQXlCbUIsSUFBbkMsRUFBeUMsY0FBekMsQ0FBaEIsRUFBMEUsT0FBMUUsQ0FEZ0QsQ0FBcEQ7O1FBR0EsSUFBSSxFQUFFcUIsSUFBSSxJQUFJeEQsWUFBVixLQUEyQixFQUFFd0QsSUFBSSxJQUFJdkIsZUFBVixDQUEvQixFQUEyRDtVQUN2RCxNQUFNLEtBQUtqQixTQUFMLENBQWUwQyxNQUFmLENBQXNCLENBQUMsR0FBRCxFQUFNLElBQU4sRUFBWSxJQUFaLEVBQWtCLFlBQWxCLEVBQWlDLEdBQUVGLElBQUssSUFBR3JELE9BQVEsRUFBbkQsQ0FBdEIsRUFBNkUsU0FBN0UsQ0FBTjtRQUNIO01BQ0osQ0FQRCxDQU9FLE9BQU91QixDQUFQLEVBQVU7UUFDUixLQUFLeEIsR0FBTCxDQUFTeUIsS0FBVCxDQUFnQixpQkFBZ0JKLGFBQUEsQ0FBS0MsSUFBTCxDQUFVLEtBQUtsQixHQUFMLENBQVM0QixLQUFULENBQWVsQixTQUFmLENBQXlCbUIsSUFBbkMsRUFBeUMsY0FBekMsQ0FBeUQsRUFBekYsRUFBNEZULENBQTVGO1FBQ0FFLE9BQU8sQ0FBQ0MsSUFBUixDQUFhLENBQWI7TUFDSDtJQUNKOztJQUVELE1BQU04QixjQUFjLEdBQUdwQyxhQUFBLENBQUtDLElBQUwsQ0FBVSxLQUFLbEIsR0FBTCxDQUFTNEIsS0FBVCxDQUFlbEIsU0FBZixDQUF5Qm1CLElBQW5DLEVBQXlDLGNBQXpDLEVBQXlEcUIsSUFBekQsQ0FBdkI7O0lBQ0EsSUFBSUksVUFBVSxHQUFHLElBQWpCOztJQUNBLElBQUk7TUFDQUEsVUFBVSxHQUFHQyxPQUFPLENBQUNGLGNBQUQsQ0FBcEI7SUFDSCxDQUZELENBRUUsT0FBT2pDLENBQVAsRUFBVTtNQUNSLElBQUkrQixnQkFBSixFQUFzQjtRQUNsQixLQUFLdkQsR0FBTCxDQUFTNEQsSUFBVCxDQUFlLGtCQUFpQk4sSUFBSyw2Q0FBNENBLElBQUssSUFBR3JELE9BQVEsRUFBakc7O1FBQ0EsSUFBSTtVQUNBLE1BQU0sS0FBS2EsU0FBTCxDQUFlMEMsTUFBZixDQUFzQixDQUFDLEdBQUQsRUFBTSxJQUFOLEVBQVksSUFBWixFQUFrQixZQUFsQixFQUFpQyxHQUFFRixJQUFLLElBQUdyRCxPQUFRLEVBQW5ELENBQXRCLEVBQTZFLFNBQTdFLENBQU47UUFDSCxDQUZELENBRUUsT0FBTzRELEdBQVAsRUFBWTtVQUNWLEtBQUs3RCxHQUFMLENBQVN5QixLQUFULENBQWVvQyxHQUFmO1VBQ0FuQyxPQUFPLENBQUNDLElBQVIsQ0FBYSxDQUFiO1FBQ0g7TUFDSixDQVJELE1BUU87UUFDSCxLQUFLM0IsR0FBTCxDQUFTNEQsSUFBVCxDQUFlLGtCQUFpQk4sSUFBSyxXQUFyQztRQUNBNUIsT0FBTyxDQUFDQyxJQUFSLENBQWEsQ0FBYjtNQUNIO0lBQ0osQ0FmRCxTQWVVO01BQ04sSUFBSSxDQUFDK0IsVUFBTCxFQUFpQjtRQUNiQSxVQUFVLEdBQUdDLE9BQU8sQ0FBQ0YsY0FBRCxDQUFwQjtNQUNIO0lBQ0o7O0lBQ0QsTUFBTUssaUJBQWlCLEdBQUdILE9BQU8sQ0FBQ3RDLGFBQUEsQ0FBS0MsSUFBTCxDQUFVbUMsY0FBVixFQUEwQixjQUExQixDQUFELENBQVAsQ0FBbUR4RCxPQUE3RTs7SUFFQSxJQUFJNkQsaUJBQWlCLEtBQUs3RCxPQUExQixFQUFtQztNQUMvQixJQUFJNkQsaUJBQWlCLENBQUNDLEtBQWxCLENBQXdCLEdBQXhCLEVBQTZCLENBQTdCLE1BQW9DOUQsT0FBTyxDQUFDOEQsS0FBUixDQUFjLEdBQWQsRUFBbUIsQ0FBbkIsQ0FBeEMsRUFBK0Q7UUFDM0QsS0FBSy9ELEdBQUwsQ0FBUzRELElBQVQsQ0FBZSxtQkFBa0JOLElBQUssSUFBR1EsaUJBQWtCLG9DQUE3QyxHQUNULEdBQUU3RCxPQUFRLG9GQURELEdBRVYsNkJBRko7TUFHSCxDQUpELE1BSU87UUFDSCxLQUFLRCxHQUFMLENBQVM0RCxJQUFULENBQWUsbUJBQWtCTixJQUFLLElBQUdRLGlCQUFrQixvQ0FBN0MsR0FDVCxHQUFFN0QsT0FBUSxpREFEZjtNQUVIO0lBQ0o7O0lBQ0QsT0FBTztNQUFFeUQsVUFBRjtNQUFjckMsSUFBSSxFQUFFb0M7SUFBcEIsQ0FBUDtFQUNIOztBQTFLZTs7QUE2S0wsU0FBU08sUUFBVCxDQUFpQnJFLEtBQWpCLEVBQXdCQyxNQUF4QixFQUFnQ0MsT0FBaEMsRUFBeUM7RUFBRUcsR0FBRyxHQUFHaUU7QUFBUixJQUFtQjtFQUFFakUsR0FBRyxFQUFFaUU7QUFBUCxDQUE1RCxFQUE2RTtFQUN4RixPQUFPLElBQUl4RSxhQUFKLENBQWtCRSxLQUFsQixFQUF5QkMsTUFBekIsRUFBaUNDLE9BQWpDLEVBQTBDO0lBQUVHO0VBQUYsQ0FBMUMsQ0FBUDtBQUNIIn0= \ No newline at end of file diff --git a/dist/log.js b/dist/log.js deleted file mode 100644 index 5677ea1e..00000000 --- a/dist/log.js +++ /dev/null @@ -1,75 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; - -/* eslint-disable no-console */ - -/* - 0.OFF - 1.INFO - 2.WARN - 3.ERROR - 4.TRACE - 5.DEBUG - 6.ALL - */ -class Log { - constructor(prefix) { - this.prefix = prefix; - } - - static level() { - return process.env.MD_LOG_LEVEL || 'ALL'; - } - - static slice(args) { - return Array.prototype.slice.call(args, 0); - } - - log(type, args) { - console.log.apply(null, [`${type} ${this.prefix}: `].concat(Log.slice(args))); - } - - info(...args) { - if (/INFO|ALL/i.test(Log.level())) { - this.log('INFO', args); - } - } - - warn(...args) { - if (/WARN|ALL/i.test(Log.level())) { - this.log('WARN', args); - } - } - - error(...args) { - if (/ERROR|ALL/i.test(Log.level())) { - this.log('ERROR', args); - } - } - - debug(...args) { - if (/DEBUG|ALL/i.test(Log.level())) { - this.log('DEBUG', args); - } - } - - verbose(...args) { - if (/VERBOSE|ALL/i.test(Log.level())) { - this.log('VERBOSE', args); - } - } - - trace(...args) { - if (/TRACE|ALL/i.test(Log.level())) { - this.log('TRACE', args); - } - } - -} - -exports.default = Log; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMb2ciLCJjb25zdHJ1Y3RvciIsInByZWZpeCIsImxldmVsIiwicHJvY2VzcyIsImVudiIsIk1EX0xPR19MRVZFTCIsInNsaWNlIiwiYXJncyIsIkFycmF5IiwicHJvdG90eXBlIiwiY2FsbCIsImxvZyIsInR5cGUiLCJjb25zb2xlIiwiYXBwbHkiLCJjb25jYXQiLCJpbmZvIiwidGVzdCIsIndhcm4iLCJlcnJvciIsImRlYnVnIiwidmVyYm9zZSIsInRyYWNlIl0sInNvdXJjZXMiOlsiLi4vbGliL2xvZy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4vKlxuIDAuT0ZGXG4gMS5JTkZPXG4gMi5XQVJOXG4gMy5FUlJPUlxuIDQuVFJBQ0VcbiA1LkRFQlVHXG4gNi5BTExcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb2cge1xuICAgIGNvbnN0cnVjdG9yKHByZWZpeCkge1xuICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDtcbiAgICB9XG5cbiAgICBzdGF0aWMgbGV2ZWwoKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5NRF9MT0dfTEVWRUwgfHwgJ0FMTCc7XG4gICAgfVxuXG4gICAgc3RhdGljIHNsaWNlKGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3MsIDApO1xuICAgIH1cblxuICAgIGxvZyh0eXBlLCBhcmdzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nLmFwcGx5KG51bGwsIFtgJHt0eXBlfSAgJHt0aGlzLnByZWZpeH06IGBdLmNvbmNhdChMb2cuc2xpY2UoYXJncykpKTtcbiAgICB9XG5cbiAgICBpbmZvKC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKC9JTkZPfEFMTC9pLnRlc3QoTG9nLmxldmVsKCkpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZygnSU5GTycsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgd2FybiguLi5hcmdzKSB7XG4gICAgICAgIGlmICgvV0FSTnxBTEwvaS50ZXN0KExvZy5sZXZlbCgpKSkge1xuICAgICAgICAgICAgdGhpcy5sb2coJ1dBUk4nLCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVycm9yKC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKC9FUlJPUnxBTEwvaS50ZXN0KExvZy5sZXZlbCgpKSkge1xuICAgICAgICAgICAgdGhpcy5sb2coJ0VSUk9SJywgYXJncyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZWJ1ZyguLi5hcmdzKSB7XG4gICAgICAgIGlmICgvREVCVUd8QUxML2kudGVzdChMb2cubGV2ZWwoKSkpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKCdERUJVRycsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmVyYm9zZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICgvVkVSQk9TRXxBTEwvaS50ZXN0KExvZy5sZXZlbCgpKSkge1xuICAgICAgICAgICAgdGhpcy5sb2coJ1ZFUkJPU0UnLCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRyYWNlKC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKC9UUkFDRXxBTEwvaS50ZXN0KExvZy5sZXZlbCgpKSkge1xuICAgICAgICAgICAgdGhpcy5sb2coJ1RSQUNFJywgYXJncyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFZSxNQUFNQSxHQUFOLENBQVU7RUFDckJDLFdBQVcsQ0FBQ0MsTUFBRCxFQUFTO0lBQ2hCLEtBQUtBLE1BQUwsR0FBY0EsTUFBZDtFQUNIOztFQUVXLE9BQUxDLEtBQUssR0FBRztJQUNYLE9BQU9DLE9BQU8sQ0FBQ0MsR0FBUixDQUFZQyxZQUFaLElBQTRCLEtBQW5DO0VBQ0g7O0VBRVcsT0FBTEMsS0FBSyxDQUFDQyxJQUFELEVBQU87SUFDZixPQUFPQyxLQUFLLENBQUNDLFNBQU4sQ0FBZ0JILEtBQWhCLENBQXNCSSxJQUF0QixDQUEyQkgsSUFBM0IsRUFBaUMsQ0FBakMsQ0FBUDtFQUNIOztFQUVESSxHQUFHLENBQUNDLElBQUQsRUFBT0wsSUFBUCxFQUFhO0lBQ1pNLE9BQU8sQ0FBQ0YsR0FBUixDQUFZRyxLQUFaLENBQWtCLElBQWxCLEVBQXdCLENBQUUsR0FBRUYsSUFBSyxLQUFJLEtBQUtYLE1BQU8sSUFBekIsRUFBOEJjLE1BQTlCLENBQXFDaEIsR0FBRyxDQUFDTyxLQUFKLENBQVVDLElBQVYsQ0FBckMsQ0FBeEI7RUFDSDs7RUFFRFMsSUFBSSxDQUFDLEdBQUdULElBQUosRUFBVTtJQUNWLElBQUksWUFBWVUsSUFBWixDQUFpQmxCLEdBQUcsQ0FBQ0csS0FBSixFQUFqQixDQUFKLEVBQW1DO01BQy9CLEtBQUtTLEdBQUwsQ0FBUyxNQUFULEVBQWlCSixJQUFqQjtJQUNIO0VBQ0o7O0VBRURXLElBQUksQ0FBQyxHQUFHWCxJQUFKLEVBQVU7SUFDVixJQUFJLFlBQVlVLElBQVosQ0FBaUJsQixHQUFHLENBQUNHLEtBQUosRUFBakIsQ0FBSixFQUFtQztNQUMvQixLQUFLUyxHQUFMLENBQVMsTUFBVCxFQUFpQkosSUFBakI7SUFDSDtFQUNKOztFQUVEWSxLQUFLLENBQUMsR0FBR1osSUFBSixFQUFVO0lBQ1gsSUFBSSxhQUFhVSxJQUFiLENBQWtCbEIsR0FBRyxDQUFDRyxLQUFKLEVBQWxCLENBQUosRUFBb0M7TUFDaEMsS0FBS1MsR0FBTCxDQUFTLE9BQVQsRUFBa0JKLElBQWxCO0lBQ0g7RUFDSjs7RUFFRGEsS0FBSyxDQUFDLEdBQUdiLElBQUosRUFBVTtJQUNYLElBQUksYUFBYVUsSUFBYixDQUFrQmxCLEdBQUcsQ0FBQ0csS0FBSixFQUFsQixDQUFKLEVBQW9DO01BQ2hDLEtBQUtTLEdBQUwsQ0FBUyxPQUFULEVBQWtCSixJQUFsQjtJQUNIO0VBQ0o7O0VBRURjLE9BQU8sQ0FBQyxHQUFHZCxJQUFKLEVBQVU7SUFDYixJQUFJLGVBQWVVLElBQWYsQ0FBb0JsQixHQUFHLENBQUNHLEtBQUosRUFBcEIsQ0FBSixFQUFzQztNQUNsQyxLQUFLUyxHQUFMLENBQVMsU0FBVCxFQUFvQkosSUFBcEI7SUFDSDtFQUNKOztFQUVEZSxLQUFLLENBQUMsR0FBR2YsSUFBSixFQUFVO0lBQ1gsSUFBSSxhQUFhVSxJQUFiLENBQWtCbEIsR0FBRyxDQUFDRyxLQUFKLEVBQWxCLENBQUosRUFBb0M7TUFDaEMsS0FBS1MsR0FBTCxDQUFTLE9BQVQsRUFBa0JKLElBQWxCO0lBQ0g7RUFDSjs7QUFuRG9CIn0= \ No newline at end of file diff --git a/dist/meteorApp.js b/dist/meteorApp.js deleted file mode 100644 index e4508bfe..00000000 --- a/dist/meteorApp.js +++ /dev/null @@ -1,923 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; - -var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime")); - -var _fs = _interopRequireDefault(require("fs")); - -var _crossSpawn = _interopRequireDefault(require("cross-spawn")); - -var _semver = _interopRequireDefault(require("semver")); - -var _shelljs = _interopRequireDefault(require("shelljs")); - -var _path = _interopRequireDefault(require("path")); - -var _singleLineLog = _interopRequireDefault(require("single-line-log")); - -var _asar = _interopRequireDefault(require("@electron/asar")); - -var _nodeFetch = _interopRequireDefault(require("node-fetch")); - -var _isDesktopInjector = _interopRequireDefault(require("../skeleton/modules/autoupdate/isDesktopInjector")); - -var _log = _interopRequireDefault(require("./log")); - -var _meteorManager = _interopRequireDefault(require("./meteorManager")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -// eslint-disable-next-line no-unused-vars -const { - join -} = _path.default; -const sll = _singleLineLog.default.stdout; // TODO: refactor all strategy ifs to one place - -/** - * Represents the Meteor app. - * @property {MeteorDesktop} $ - * @class - */ - -class MeteorApp { - /** - * @param {MeteorDesktop} $ - context - * @constructor - */ - constructor($) { - this.log = new _log.default('meteorApp'); - this.$ = $; - this.meteorManager = new _meteorManager.default($); - this.mobilePlatform = null; - this.oldManifest = null; - this.injector = new _isDesktopInjector.default(); - this.matcher = new RegExp('__meteor_runtime_config__ = JSON.parse\\(decodeURIComponent\\("([^"]*)"\\)\\)'); - this.replacer = new RegExp('(__meteor_runtime_config__ = JSON.parse\\(decodeURIComponent\\()"([^"]*)"(\\)\\))'); - this.meteorVersion = null; - this.indexHTMLstrategy = null; - this.indexHTMLStrategies = { - INDEX_FROM_CORDOVA_BUILD: 1, - INDEX_FROM_RUNNING_SERVER: 2 - }; - this.deprectatedPackages = ['omega:meteor-desktop-localstorage']; - } - /** - * Remove any deprecated packages from meteor project. - * @returns {Promise} - */ - - - async removeDeprecatedPackages() { - try { - if (this.meteorManager.checkPackages(this.deprectatedPackages)) { - this.log.info('deprecated meteor plugins found, removing them'); - await this.meteorManager.deletePackages(this.deprectatedPackages); - } - } catch (e) { - throw new Error(e); - } - } - /** - * Ensures that required packages are added to the Meteor app. - */ - - - async ensureDesktopHCPPackages() { - const desktopHCPPackages = ['communitypackages:meteor-desktop-watcher', 'communitypackages:meteor-desktop-bundler']; - - if (this.$.desktop.getSettings().desktopHCP) { - this.log.verbose('desktopHCP is enabled, checking for required packages'); - const packagesWithVersion = desktopHCPPackages.map(packageName => `${packageName}@${this.$.getVersion()}`); - - try { - await this.meteorManager.ensurePackages(desktopHCPPackages, packagesWithVersion, 'desktopHCP'); - } catch (e) { - throw new Error(e); - } - } else { - this.log.verbose('desktopHCP is not enabled, removing required packages'); - - try { - if (this.meteorManager.checkPackages(desktopHCPPackages)) { - await this.meteorManager.deletePackages(desktopHCPPackages); - } - } catch (e) { - throw new Error(e); - } - } - } - /** - * Adds entry to .meteor/.gitignore if necessary. - */ - - - updateGitIgnore() { - this.log.verbose('updating .meteor/.gitignore'); // Lets read the .meteor/.gitignore and filter out blank lines. - - const gitIgnore = _fs.default.readFileSync(this.$.env.paths.meteorApp.gitIgnore, 'UTF-8').split('\n').filter(ignoredPath => ignoredPath.trim() !== ''); - - if (!~gitIgnore.indexOf(this.$.env.paths.electronApp.rootName)) { - this.log.verbose(`adding ${this.$.env.paths.electronApp.rootName} to .meteor/.gitignore`); - gitIgnore.push(this.$.env.paths.electronApp.rootName); - - _fs.default.writeFileSync(this.$.env.paths.meteorApp.gitIgnore, gitIgnore.join('\n'), 'UTF-8'); - } - } - /** - * Reads the Meteor release version used in the app. - * @returns {string} - */ - - - getMeteorRelease() { - let release = _fs.default.readFileSync(this.$.env.paths.meteorApp.release, 'UTF-8').replace(/\r/gm, '').split('\n')[0]; - - [, release] = release.split('@'); // We do not care if it is beta. - - if (~release.indexOf('-')) { - [release] = release.split('-'); - } - - return release; - } - /** - * Cast Meteor release to semver version. - * @returns {string} - */ - - - castMeteorReleaseToSemver() { - return `${this.getMeteorRelease()}.0.0`.match(/(^\d+\.\d+\.\d+)/gmi)[0]; - } - /** - * Validate meteor version against a versionRange. - * @param {string} versionRange - semver version range - */ - - - checkMeteorVersion(versionRange) { - const release = this.castMeteorReleaseToSemver(); - - if (!_semver.default.satisfies(release, versionRange)) { - if (this.$.env.options.skipMobileBuild) { - this.log.error(`wrong meteor version (${release}) in project - only ` + `${versionRange} is supported`); - } else { - this.log.error(`wrong meteor version (${release}) in project - only ` + `${versionRange} is supported for automatic meteor builds (you can always ` + 'try with `--skip-mobile-build` if you are using meteor >= 1.2.1'); - } - - process.exit(1); - } - } - /** - * Decides which strategy to use while trying to get client build out of Meteor project. - * @returns {number} - */ - - - chooseStrategy() { - if (this.$.env.options.forceCordovaBuild) { - return this.indexHTMLStrategies.INDEX_FROM_CORDOVA_BUILD; - } - - const release = this.castMeteorReleaseToSemver(); - - if (_semver.default.satisfies(release, '> 1.3.4')) { - return this.indexHTMLStrategies.INDEX_FROM_RUNNING_SERVER; - } - - if (_semver.default.satisfies(release, '1.3.4')) { - const explodedVersion = this.getMeteorRelease().split('.'); - - if (explodedVersion.length >= 4) { - if (explodedVersion[3] > 1) { - return this.indexHTMLStrategies.INDEX_FROM_RUNNING_SERVER; - } - - return this.indexHTMLStrategies.INDEX_FROM_CORDOVA_BUILD; - } - } - - return this.indexHTMLStrategies.INDEX_FROM_CORDOVA_BUILD; - } - /** - * Checks required preconditions. - * - Meteor version - * - is mobile platform added - */ - - - async checkPreconditions() { - if (this.$.env.options.skipMobileBuild) { - this.checkMeteorVersion('>= 1.2.1'); - } else { - this.checkMeteorVersion('>= 1.3.3'); - this.indexHTMLstrategy = this.chooseStrategy(); - - if (this.indexHTMLstrategy === this.indexHTMLStrategies.INDEX_FROM_CORDOVA_BUILD) { - this.log.debug('meteor version is < 1.3.4.2 so the index.html from cordova-build will' + ' be used'); - } else { - this.log.debug('meteor version is >= 1.3.4.2 so the index.html will be downloaded ' + 'from __cordova/index.html'); - } - } - - if (!this.$.env.options.skipMobileBuild) { - const platforms = _fs.default.readFileSync(this.$.env.paths.meteorApp.platforms, 'UTF-8'); - - if (!~platforms.indexOf('android') && !~platforms.indexOf('ios')) { - if (!this.$.env.options.android) { - this.mobilePlatform = 'ios'; - } else { - this.mobilePlatform = 'android'; - } - - this.log.warn(`no mobile target detected - will add '${this.mobilePlatform}' ` + 'just to get a mobile build'); - - try { - await this.addMobilePlatform(this.mobilePlatform); - } catch (e) { - this.log.error('failed to add a mobile platform - please try to do it manually'); - process.exit(1); - } - } - } - } - /** - * Tries to add a mobile platform to meteor project. - * @param {string} platform - platform to add - * @returns {Promise} - */ - - - addMobilePlatform(platform) { - return new Promise((resolve, reject) => { - this.log.verbose(`adding mobile platform: ${platform}`); - (0, _crossSpawn.default)('meteor', ['add-platform', platform], { - cwd: this.$.env.paths.meteorApp.root, - stdio: this.$.env.stdio - }).on('exit', () => { - const platforms = _fs.default.readFileSync(this.$.env.paths.meteorApp.platforms, 'UTF-8'); - - if (!~platforms.indexOf('android') && !~platforms.indexOf('ios')) { - reject(); - } else { - resolve(); - } - }); - }); - } - /** - * Tries to remove a mobile platform from meteor project. - * @param {string} platform - platform to remove - * @returns {Promise} - */ - - - removeMobilePlatform(platform) { - if (this.$.env.options.skipRemoveMobilePlatform) { - return Promise.resolve(); - } - - return new Promise((resolve, reject) => { - this.log.verbose(`removing mobile platform: ${platform}`); - (0, _crossSpawn.default)('meteor', ['remove-platform', platform], { - cwd: this.$.env.paths.meteorApp.root, - stdio: this.$.env.stdio, - env: Object.assign({ - METEOR_PRETTY_OUTPUT: 0 - }, process.env) - }).on('exit', () => { - const platforms = _fs.default.readFileSync(this.$.env.paths.meteorApp.platforms, 'UTF-8'); - - if (~platforms.indexOf(platform)) { - reject(); - } else { - resolve(); - } - }); - }); - } - /** - * Just checks for index.html and program.json existence. - * @returns {boolean} - */ - - - isCordovaBuildReady() { - if (this.indexHTMLstrategy === this.indexHTMLStrategies.INDEX_FROM_CORDOVA_BUILD) { - return this.$.utils.exists(this.$.env.paths.meteorApp.cordovaBuildIndex) && this.$.utils.exists(this.$.env.paths.meteorApp.cordovaBuildProgramJson) && (!this.oldManifest || this.oldManifest && this.oldManifest !== _fs.default.readFileSync(this.$.env.paths.meteorApp.cordovaBuildProgramJson, 'UTF-8')); - } - - return this.$.utils.exists(this.$.env.paths.meteorApp.webCordovaProgramJson) && (!this.oldManifest || this.oldManifest && this.oldManifest !== _fs.default.readFileSync(this.$.env.paths.meteorApp.webCordovaProgramJson, 'UTF-8')); - } - /** - * Fetches index.html from running project. - * @returns {Promise.<*>} - */ - - - async acquireIndex() { - const port = this.$.env.options.port ? this.$.env.options.port : 3080; - this.log.info('acquiring index.html'); - const res = await (0, _nodeFetch.default)(`http://127.0.0.1:${port}/__cordova/index.html`); - const text = await res.text(); // Simple test if we really download index.html for web.cordova. - - if (~text.indexOf('src="/cordova.js"')) { - return text; - } - - return false; - } - /** - * Fetches mainfest.json from running project. - * @returns {Promise.} - */ - - - async acquireManifest() { - const port = this.$.env.options.port ? this.$.env.options.port : 3080; - this.log.info('acquiring manifest.json'); - const res = await (0, _nodeFetch.default)(`http://127.0.0.1:${port}/__cordova/manifest.json?meteor_dont_serve_index=true`); - const text = await res.text(); - return JSON.parse(text); - } - /** - * Tries to get a mobile build from meteor app. - * In case of failure leaves a meteor.log. - * A lot of stuff is happening here - but the main aim is to get a mobile build from - * .meteor/local/cordova-build/www/application and exit as soon as possible. - * - * @returns {Promise} - */ - - - buildMobileTarget() { - const programJson = this.indexHTMLstrategy === this.indexHTMLStrategies.INDEX_FROM_CORDOVA_BUILD ? this.$.env.paths.meteorApp.cordovaBuildProgramJson : this.$.env.paths.meteorApp.webCordovaProgramJson; - - if (this.$.utils.exists(programJson)) { - this.oldManifest = _fs.default.readFileSync(programJson, 'UTF-8'); - } - - return new Promise((resolve, reject) => { - const self = this; - let log = ''; - let desiredExit = false; - let buildTimeout = null; - let errorTimeout = null; - let messageTimeout = null; - let killTimeout = null; - let cordovaCheckInterval = null; - let portProblem = false; - - function windowsKill(pid) { - self.log.debug(`killing pid: ${pid}`); - - _crossSpawn.default.sync('taskkill', ['/pid', pid, '/f', '/t']); // We will look for other process which might have been created outside the - // process tree. - // Lets list all node.exe processes. - - - const out = _crossSpawn.default.sync('wmic', ['process', 'where', 'caption="node.exe"', 'get', 'commandline,processid']).stdout.toString('utf-8').split('\n'); - - const args = self.prepareArguments(); // Lets mount regex. - - const regexV1 = new RegExp(`${args.join('\\s+')}\\s+(\\d+)`, 'gm'); - const regexV2 = new RegExp(`"${args.join('"\\s+"')}"\\s+(\\d+)`, 'gm'); // No we will check for those with the matching params. - - out.forEach(line => { - const match = regexV1.exec(line) || regexV2.exec(line) || false; - - if (match) { - self.log.debug(`killing pid: ${match[1]}`); - - _crossSpawn.default.sync('taskkill', ['/pid', match[1], '/f', '/t']); - } - - regexV1.lastIndex = 0; - regexV2.lastIndex = 0; - }); - } - - function writeLog() { - _fs.default.writeFileSync('meteor.log', log, 'UTF-8'); - } - - function clearTimeoutsAndIntervals() { - clearInterval(cordovaCheckInterval); - clearTimeout(buildTimeout); - clearTimeout(errorTimeout); - clearTimeout(messageTimeout); - clearTimeout(killTimeout); - } - - const args = this.prepareArguments(); - this.log.info(`running "meteor ${args.join(' ')}"... this might take a while`); - const env = { - METEOR_PRETTY_OUTPUT: 0, - METEOR_NO_RELEASE_CHECK: 1 - }; - - if (this.$.env.options.prodDebug) { - env.METEOR_DESKOP_PROD_DEBUG = true; - } // Lets spawn meteor. - - - const child = (0, _crossSpawn.default)('meteor', args, { - env: Object.assign(env, process.env), - cwd: this.$.env.paths.meteorApp.root - }, { - shell: true - }); // Kills the currently running meteor command. - - function kill() { - sll(''); - child.kill('SIGKILL'); - - if (self.$.env.os.isWindows) { - windowsKill(child.pid); - } - } - - function exit() { - killTimeout = setTimeout(() => { - clearTimeoutsAndIntervals(); - desiredExit = true; - kill(); - resolve(); - }, 500); - } - - function copyBuild() { - self.copyBuild().then(() => { - exit(); - }).catch(() => { - clearTimeoutsAndIntervals(); - kill(); - writeLog(); - reject('copy'); - }); - } - - cordovaCheckInterval = setInterval(() => { - // Check if we already have cordova-build ready. - if (this.isCordovaBuildReady()) { - // If so, then exit immediately. - if (this.indexHTMLstrategy === this.indexHTMLStrategies.INDEX_FROM_CORDOVA_BUILD) { - copyBuild(); - } - } - }, 1000); - child.stderr.on('data', chunk => { - const line = chunk.toString('UTF-8'); - log += `${line}\n`; - - if (errorTimeout) { - clearTimeout(errorTimeout); - } // Do not exit if this is the warning for using --production. - // Output exceeds -> https://github.com/meteor/meteor/issues/8592 - - - if (!~line.indexOf('--production') && !~line.indexOf('Output exceeds ') && !~line.indexOf('Node#moveTo') && !~line.indexOf('Browserslist') && Array.isArray(self.$.env.options.ignoreStderr) && self.$.env.options.ignoreStderr.every(str => !~line.indexOf(str))) { - self.log.warn('STDERR:', line); // We will exit 1s after last error in stderr. - - errorTimeout = setTimeout(() => { - clearTimeoutsAndIntervals(); - kill(); - writeLog(); - reject('error'); - }, 1000); - } - }); - child.stdout.on('data', chunk => { - const line = chunk.toString('UTF-8'); - - if (!desiredExit && line.trim().replace(/[\n\r\t\v\f]+/gm, '') !== '') { - const linesToDisplay = line.trim().split('\n\r'); // Only display last line from the chunk. - - const sanitizedLine = linesToDisplay.pop().replace(/[\n\r\t\v\f]+/gm, ''); - sll(sanitizedLine); - } - - log += `${line}\n`; - - if (~line.indexOf('after_platform_add')) { - sll(''); - this.log.info('done... 10%'); - } - - if (~line.indexOf('Local package version')) { - if (messageTimeout) { - clearTimeout(messageTimeout); - } - - messageTimeout = setTimeout(() => { - sll(''); - this.log.info('building in progress...'); - }, 1500); - } - - if (~line.indexOf('Preparing Cordova project')) { - sll(''); - this.log.info('done... 60%'); - } - - if (~line.indexOf('Can\'t listen on port')) { - portProblem = true; - } - - if (~line.indexOf('Your application has errors')) { - if (errorTimeout) { - clearTimeout(errorTimeout); - } - - errorTimeout = setTimeout(() => { - clearTimeoutsAndIntervals(); - kill(); - writeLog(); - reject('errorInApp'); - }, 1000); - } - - if (~line.indexOf('App running at')) { - copyBuild(); - } - }); // When Meteor exits - - child.on('exit', () => { - sll(''); - clearTimeoutsAndIntervals(); - - if (!desiredExit) { - writeLog(); - - if (portProblem) { - reject('port'); - } else { - reject('exit'); - } - } - }); - buildTimeout = setTimeout(() => { - kill(); - writeLog(); - reject('timeout'); - }, this.$.env.options.buildTimeout ? this.$.env.options.buildTimeout * 1000 : 600000); - }); - } - /** - * Replaces the DDP url that was used originally when Meteor was building the client. - * @param {string} indexHtml - path to index.html from the client - */ - - - updateDdpUrl(indexHtml) { - let content; - let runtimeConfig; - - try { - content = _fs.default.readFileSync(indexHtml, 'UTF-8'); - } catch (e) { - this.log.error(`error loading index.html file: ${e.message}`); - process.exit(1); - } - - if (!this.matcher.test(content)) { - this.log.error('could not find runtime config in index file'); - process.exit(1); - } - - try { - const matches = content.match(this.matcher); - runtimeConfig = JSON.parse(decodeURIComponent(matches[1])); - } catch (e) { - this.log.error('could not find runtime config in index file'); - process.exit(1); - } - - if (this.$.env.options.ddpUrl.substr(-1, 1) !== '/') { - this.$.env.options.ddpUrl += '/'; - } - - runtimeConfig.ROOT_URL = this.$.env.options.ddpUrl; - runtimeConfig.DDP_DEFAULT_CONNECTION_URL = this.$.env.options.ddpUrl; - content = content.replace(this.replacer, `$1"${encodeURIComponent(JSON.stringify(runtimeConfig))}"$3`); - - try { - _fs.default.writeFileSync(indexHtml, content); - } catch (e) { - this.log.error(`error writing index.html file: ${e.message}`); - process.exit(1); - } - - this.log.info('successfully updated ddp string in the runtime config of a mobile build' + ` to ${this.$.env.options.ddpUrl}`); - } - /** - * Prepares the arguments passed to `meteor` command. - * @returns {string[]} - */ - - - prepareArguments() { - const args = ['run', '--verbose', `--mobile-server=${this.$.env.options.ddpUrl}`]; - - if (this.$.env.isProductionBuild()) { - args.push('--production'); - } - - args.push('-p'); - - if (this.$.env.options.port) { - args.push(this.$.env.options.port); - } else { - args.push('3080'); - } - - if (this.$.env.options.meteorSettings) { - args.push('--settings', this.$.env.options.meteorSettings); - } - - return args; - } - /** - * Validates the mobile build and copies it into electron app. - */ - - - async copyBuild() { - this.log.debug('clearing build dir'); - - try { - await this.$.utils.rmWithRetries('-rf', this.$.env.paths.electronApp.meteorApp); - } catch (e) { - throw new Error(e); - } - - let prefix = 'cordovaBuild'; - let copyPathPostfix = ''; - - if (this.indexHTMLstrategy === this.indexHTMLStrategies.INDEX_FROM_RUNNING_SERVER) { - prefix = 'webCordova'; - copyPathPostfix = `${_path.default.sep}*`; - let indexHtml; - - try { - _fs.default.mkdirSync(this.$.env.paths.electronApp.meteorApp); - - indexHtml = await this.acquireIndex(); - - _fs.default.writeFileSync(this.$.env.paths.electronApp.meteorAppIndex, indexHtml); - - this.log.info('successfully downloaded index.html from running meteor app'); - } catch (e) { - this.log.error('error while trying to download index.html for web.cordova, ' + 'be sure that you are running a mobile target or with' + ' --mobile-server: ', e); - throw e; - } - } - - const cordovaBuild = this.$.env.paths.meteorApp[prefix]; - const { - cordovaBuildIndex - } = this.$.env.paths.meteorApp; - const cordovaBuildProgramJson = this.$.env.paths.meteorApp[`${prefix}ProgramJson`]; - - if (!this.$.utils.exists(cordovaBuild)) { - this.log.error(`no mobile build found at ${cordovaBuild}`); - this.log.error('are you sure you did run meteor with --mobile-server?'); - throw new Error('required file not present'); - } - - if (!this.$.utils.exists(cordovaBuildProgramJson)) { - this.log.error('no program.json found in mobile build found at ' + `${cordovaBuild}`); - this.log.error('are you sure you did run meteor with --mobile-server?'); - throw new Error('required file not present'); - } - - if (this.indexHTMLstrategy !== this.indexHTMLStrategies.INDEX_FROM_RUNNING_SERVER) { - if (!this.$.utils.exists(cordovaBuildIndex)) { - this.log.error('no index.html found in cordova build found at ' + `${cordovaBuild}`); - this.log.error('are you sure you did run meteor with --mobile-server?'); - throw new Error('required file not present'); - } - } - - this.log.verbose('copying mobile build'); - - _shelljs.default.cp('-R', `${cordovaBuild}${copyPathPostfix}`, this.$.env.paths.electronApp.meteorApp); // Because of various permission problems here we try to clear te path by clearing - // all possible restrictions. - - - _shelljs.default.chmod('-R', '777', this.$.env.paths.electronApp.meteorApp); - - if (this.$.env.os.isWindows) { - _shelljs.default.exec(`attrib -r ${this.$.env.paths.electronApp.meteorApp}${_path.default.sep}*.* /s`); - } - - if (this.indexHTMLstrategy === this.indexHTMLStrategies.INDEX_FROM_RUNNING_SERVER) { - let programJson; - - try { - programJson = await this.acquireManifest(); - - _fs.default.writeFileSync(this.$.env.paths.electronApp.meteorAppProgramJson, JSON.stringify(programJson, null, 4)); - - this.log.info('successfully downloaded manifest.json from running meteor app'); - } catch (e) { - this.log.error('error while trying to download manifest.json for web.cordova,' + ' be sure that you are running a mobile target or with' + ' --mobile-server: ', e); - throw e; - } - } - - this.log.info('mobile build copied to electron app'); - this.log.debug('copy cordova.js to meteor build'); - - _shelljs.default.cp(join(__dirname, '..', 'skeleton', 'cordova.js'), this.$.env.paths.electronApp.meteorApp); - } - /** - * Injects Meteor.isDesktop - */ - - - injectIsDesktop() { - this.log.info('injecting isDesktop'); - let manifestJsonPath = this.$.env.paths.meteorApp.cordovaBuildProgramJson; - - if (this.indexHTMLstrategy === this.indexHTMLStrategies.INDEX_FROM_RUNNING_SERVER) { - manifestJsonPath = this.$.env.paths.meteorApp.webCordovaProgramJson; - } - - try { - const { - manifest - } = JSON.parse(_fs.default.readFileSync(manifestJsonPath, 'UTF-8')); - let injected = false; - let injectedStartupDidComplete = false; - let result = null; // We will search in every .js file in the manifest. - // We could probably detect whether this is a dev or production build and only search in - // the correct files, but for now this should be fine. - - manifest.forEach(file => { - let fileContents; // Hacky way of setting isDesktop. - - if (file.type === 'js') { - fileContents = _fs.default.readFileSync(join(this.$.env.paths.electronApp.meteorApp, file.path), 'UTF-8'); - result = this.injector.processFileContents(fileContents); - ({ - fileContents - } = result); - injectedStartupDidComplete = result.injectedStartupDidComplete ? true : injectedStartupDidComplete; - injected = result.injected ? true : injected; - - _fs.default.writeFileSync(join(this.$.env.paths.electronApp.meteorApp, file.path), fileContents); - } - }); - - if (!injected) { - this.log.error('error injecting isDesktop global var.'); - process.exit(1); - } - - if (!injectedStartupDidComplete) { - this.log.error('error injecting isDesktop for startupDidComplete'); - process.exit(1); - } - } catch (e) { - this.log.error('error occurred while injecting isDesktop: ', e); - process.exit(1); - } - - this.log.info('injected successfully'); - } - /** - * Builds, modifies and copies the meteor app to electron app. - */ - - - async build() { - this.log.info('checking for any mobile platform'); - - try { - await this.checkPreconditions(); - } catch (e) { - this.log.error('error occurred during checking preconditions: ', e); - process.exit(1); - } - - this.log.info('building meteor app'); - - if (!this.$.env.options.skipMobileBuild) { - try { - await this.buildMobileTarget(); - } catch (reason) { - switch (reason) { - case 'timeout': - this.log.error('timeout while building, log has been written to meteor.log'); - break; - - case 'error': - this.log.error('build was terminated by meteor-desktop as some errors were reported to stderr, you ' + 'should see it above, also check meteor.log for more info, to ignore it use the ' + '--ignore-stderr ""'); - break; - - case 'errorInApp': - this.log.error('your meteor app has errors - look into meteor.log for more' + ' info'); - break; - - case 'port': - this.log.error('your port 3080 is currently used (you probably have this or other ' + 'meteor project running?), use `-t` or `--meteor-port` to use ' + 'different port while building'); - break; - - case 'exit': - this.log.error('meteor cmd exited unexpectedly, log has been written to meteor.log'); - break; - - case 'copy': - this.log.error('error encountered when copying the build'); - break; - - default: - this.log.error('error occurred during building mobile target', reason); - } - - if (this.mobilePlatform) { - await this.removeMobilePlatform(this.mobilePlatform); - } - - process.exit(1); - } - } else { - this.indexHTMLstrategy = this.chooseStrategy(); - - try { - await this.copyBuild(); - } catch (e) { - process.exit(1); - } - } - - this.injectIsDesktop(); - this.changeDdpUrl(); - - try { - await this.packToAsar(); - } catch (e) { - this.log.error('error while packing meteor app to asar'); - process.exit(1); - } - - this.log.info('meteor build finished'); - - if (this.mobilePlatform) { - await this.removeMobilePlatform(this.mobilePlatform); - } - } - - changeDdpUrl() { - if (this.$.env.options.ddpUrl !== null) { - try { - this.updateDdpUrl(this.$.env.paths.electronApp.meteorAppIndex); - } catch (e) { - this.log.error(`error while trying to change the ddp url: ${e.message}`); - } - } - } - - packToAsar() { - this.log.info('packing meteor app to asar archive'); - return new Promise((resolve, reject) => _asar.default.createPackage(this.$.env.paths.electronApp.meteorApp, _path.default.join(this.$.env.paths.electronApp.root, 'meteor.asar')).then(() => { - // On Windows some files might still be blocked. Giving a tick for them to be - // ready for deletion. - setImmediate(() => { - this.log.verbose('clearing meteor app after packing'); - this.$.utils.rmWithRetries('-rf', this.$.env.paths.electronApp.meteorApp).then(() => { - resolve(); - }).catch(e => { - reject(e); - }); - }); - })); - } - /** - * Wrapper for spawning npm. - * @param {Array} commands - commands for spawn - * @param {string} stdio - * @param {string} cwd - * @return {Promise} - */ - - - runNpm(commands, stdio = 'ignore', cwd = this.$.env.paths.meteorApp.root) { - return new Promise((resolve, reject) => { - this.log.verbose(`executing meteor npm ${commands.join(' ')}`); - (0, _crossSpawn.default)('meteor', ['npm', ...commands], { - cwd, - stdio - }).on('exit', code => code === 0 ? resolve() : reject(new Error(`npm exit code was ${code}`))); - }); - } - -} - -exports.default = MeteorApp; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJqb2luIiwicGF0aCIsInNsbCIsInNpbmdsZUxpbmVMb2ciLCJzdGRvdXQiLCJNZXRlb3JBcHAiLCJjb25zdHJ1Y3RvciIsIiQiLCJsb2ciLCJMb2ciLCJtZXRlb3JNYW5hZ2VyIiwiTWV0ZW9yTWFuYWdlciIsIm1vYmlsZVBsYXRmb3JtIiwib2xkTWFuaWZlc3QiLCJpbmplY3RvciIsIklzRGVza3RvcEluamVjdG9yIiwibWF0Y2hlciIsIlJlZ0V4cCIsInJlcGxhY2VyIiwibWV0ZW9yVmVyc2lvbiIsImluZGV4SFRNTHN0cmF0ZWd5IiwiaW5kZXhIVE1MU3RyYXRlZ2llcyIsIklOREVYX0ZST01fQ09SRE9WQV9CVUlMRCIsIklOREVYX0ZST01fUlVOTklOR19TRVJWRVIiLCJkZXByZWN0YXRlZFBhY2thZ2VzIiwicmVtb3ZlRGVwcmVjYXRlZFBhY2thZ2VzIiwiY2hlY2tQYWNrYWdlcyIsImluZm8iLCJkZWxldGVQYWNrYWdlcyIsImUiLCJFcnJvciIsImVuc3VyZURlc2t0b3BIQ1BQYWNrYWdlcyIsImRlc2t0b3BIQ1BQYWNrYWdlcyIsImRlc2t0b3AiLCJnZXRTZXR0aW5ncyIsImRlc2t0b3BIQ1AiLCJ2ZXJib3NlIiwicGFja2FnZXNXaXRoVmVyc2lvbiIsIm1hcCIsInBhY2thZ2VOYW1lIiwiZ2V0VmVyc2lvbiIsImVuc3VyZVBhY2thZ2VzIiwidXBkYXRlR2l0SWdub3JlIiwiZ2l0SWdub3JlIiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJlbnYiLCJwYXRocyIsIm1ldGVvckFwcCIsInNwbGl0IiwiZmlsdGVyIiwiaWdub3JlZFBhdGgiLCJ0cmltIiwiaW5kZXhPZiIsImVsZWN0cm9uQXBwIiwicm9vdE5hbWUiLCJwdXNoIiwid3JpdGVGaWxlU3luYyIsImdldE1ldGVvclJlbGVhc2UiLCJyZWxlYXNlIiwicmVwbGFjZSIsImNhc3RNZXRlb3JSZWxlYXNlVG9TZW12ZXIiLCJtYXRjaCIsImNoZWNrTWV0ZW9yVmVyc2lvbiIsInZlcnNpb25SYW5nZSIsInNlbXZlciIsInNhdGlzZmllcyIsIm9wdGlvbnMiLCJza2lwTW9iaWxlQnVpbGQiLCJlcnJvciIsInByb2Nlc3MiLCJleGl0IiwiY2hvb3NlU3RyYXRlZ3kiLCJmb3JjZUNvcmRvdmFCdWlsZCIsImV4cGxvZGVkVmVyc2lvbiIsImxlbmd0aCIsImNoZWNrUHJlY29uZGl0aW9ucyIsImRlYnVnIiwicGxhdGZvcm1zIiwiYW5kcm9pZCIsIndhcm4iLCJhZGRNb2JpbGVQbGF0Zm9ybSIsInBsYXRmb3JtIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJzcGF3biIsImN3ZCIsInJvb3QiLCJzdGRpbyIsIm9uIiwicmVtb3ZlTW9iaWxlUGxhdGZvcm0iLCJza2lwUmVtb3ZlTW9iaWxlUGxhdGZvcm0iLCJPYmplY3QiLCJhc3NpZ24iLCJNRVRFT1JfUFJFVFRZX09VVFBVVCIsImlzQ29yZG92YUJ1aWxkUmVhZHkiLCJ1dGlscyIsImV4aXN0cyIsImNvcmRvdmFCdWlsZEluZGV4IiwiY29yZG92YUJ1aWxkUHJvZ3JhbUpzb24iLCJ3ZWJDb3Jkb3ZhUHJvZ3JhbUpzb24iLCJhY3F1aXJlSW5kZXgiLCJwb3J0IiwicmVzIiwiZmV0Y2giLCJ0ZXh0IiwiYWNxdWlyZU1hbmlmZXN0IiwiSlNPTiIsInBhcnNlIiwiYnVpbGRNb2JpbGVUYXJnZXQiLCJwcm9ncmFtSnNvbiIsInNlbGYiLCJkZXNpcmVkRXhpdCIsImJ1aWxkVGltZW91dCIsImVycm9yVGltZW91dCIsIm1lc3NhZ2VUaW1lb3V0Iiwia2lsbFRpbWVvdXQiLCJjb3Jkb3ZhQ2hlY2tJbnRlcnZhbCIsInBvcnRQcm9ibGVtIiwid2luZG93c0tpbGwiLCJwaWQiLCJzeW5jIiwib3V0IiwidG9TdHJpbmciLCJhcmdzIiwicHJlcGFyZUFyZ3VtZW50cyIsInJlZ2V4VjEiLCJyZWdleFYyIiwiZm9yRWFjaCIsImxpbmUiLCJleGVjIiwibGFzdEluZGV4Iiwid3JpdGVMb2ciLCJjbGVhclRpbWVvdXRzQW5kSW50ZXJ2YWxzIiwiY2xlYXJJbnRlcnZhbCIsImNsZWFyVGltZW91dCIsIk1FVEVPUl9OT19SRUxFQVNFX0NIRUNLIiwicHJvZERlYnVnIiwiTUVURU9SX0RFU0tPUF9QUk9EX0RFQlVHIiwiY2hpbGQiLCJzaGVsbCIsImtpbGwiLCJvcyIsImlzV2luZG93cyIsInNldFRpbWVvdXQiLCJjb3B5QnVpbGQiLCJ0aGVuIiwiY2F0Y2giLCJzZXRJbnRlcnZhbCIsInN0ZGVyciIsImNodW5rIiwiQXJyYXkiLCJpc0FycmF5IiwiaWdub3JlU3RkZXJyIiwiZXZlcnkiLCJzdHIiLCJsaW5lc1RvRGlzcGxheSIsInNhbml0aXplZExpbmUiLCJwb3AiLCJ1cGRhdGVEZHBVcmwiLCJpbmRleEh0bWwiLCJjb250ZW50IiwicnVudGltZUNvbmZpZyIsIm1lc3NhZ2UiLCJ0ZXN0IiwibWF0Y2hlcyIsImRlY29kZVVSSUNvbXBvbmVudCIsImRkcFVybCIsInN1YnN0ciIsIlJPT1RfVVJMIiwiRERQX0RFRkFVTFRfQ09OTkVDVElPTl9VUkwiLCJlbmNvZGVVUklDb21wb25lbnQiLCJzdHJpbmdpZnkiLCJpc1Byb2R1Y3Rpb25CdWlsZCIsIm1ldGVvclNldHRpbmdzIiwicm1XaXRoUmV0cmllcyIsInByZWZpeCIsImNvcHlQYXRoUG9zdGZpeCIsInNlcCIsIm1rZGlyU3luYyIsIm1ldGVvckFwcEluZGV4IiwiY29yZG92YUJ1aWxkIiwiY3AiLCJjaG1vZCIsIm1ldGVvckFwcFByb2dyYW1Kc29uIiwiX19kaXJuYW1lIiwiaW5qZWN0SXNEZXNrdG9wIiwibWFuaWZlc3RKc29uUGF0aCIsIm1hbmlmZXN0IiwiaW5qZWN0ZWQiLCJpbmplY3RlZFN0YXJ0dXBEaWRDb21wbGV0ZSIsInJlc3VsdCIsImZpbGUiLCJmaWxlQ29udGVudHMiLCJ0eXBlIiwicHJvY2Vzc0ZpbGVDb250ZW50cyIsImJ1aWxkIiwicmVhc29uIiwiY2hhbmdlRGRwVXJsIiwicGFja1RvQXNhciIsImFzYXIiLCJjcmVhdGVQYWNrYWdlIiwic2V0SW1tZWRpYXRlIiwicnVuTnBtIiwiY29tbWFuZHMiLCJjb2RlIl0sInNvdXJjZXMiOlsiLi4vbGliL21ldGVvckFwcC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmltcG9ydCByZWdlbmVyYXRvclJ1bnRpbWUgZnJvbSAncmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgc3Bhd24gZnJvbSAnY3Jvc3Mtc3Bhd24nO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHNoZWxsIGZyb20gJ3NoZWxsanMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgc2luZ2xlTGluZUxvZyBmcm9tICdzaW5nbGUtbGluZS1sb2cnO1xuaW1wb3J0IGFzYXIgZnJvbSAnQGVsZWN0cm9uL2FzYXInO1xuaW1wb3J0IGZldGNoIGZyb20gJ25vZGUtZmV0Y2gnO1xuXG5pbXBvcnQgSXNEZXNrdG9wSW5qZWN0b3IgZnJvbSAnLi4vc2tlbGV0b24vbW9kdWxlcy9hdXRvdXBkYXRlL2lzRGVza3RvcEluamVjdG9yJztcbmltcG9ydCBMb2cgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IE1ldGVvck1hbmFnZXIgZnJvbSAnLi9tZXRlb3JNYW5hZ2VyJztcblxuY29uc3QgeyBqb2luIH0gPSBwYXRoO1xuY29uc3Qgc2xsID0gc2luZ2xlTGluZUxvZy5zdGRvdXQ7XG5cbi8vIFRPRE86IHJlZmFjdG9yIGFsbCBzdHJhdGVneSBpZnMgdG8gb25lIHBsYWNlXG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgTWV0ZW9yIGFwcC5cbiAqIEBwcm9wZXJ0eSB7TWV0ZW9yRGVza3RvcH0gJFxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1ldGVvckFwcCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNZXRlb3JEZXNrdG9wfSAkIC0gY29udGV4dFxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCQpIHtcbiAgICAgICAgdGhpcy5sb2cgPSBuZXcgTG9nKCdtZXRlb3JBcHAnKTtcbiAgICAgICAgdGhpcy4kID0gJDtcbiAgICAgICAgdGhpcy5tZXRlb3JNYW5hZ2VyID0gbmV3IE1ldGVvck1hbmFnZXIoJCk7XG4gICAgICAgIHRoaXMubW9iaWxlUGxhdGZvcm0gPSBudWxsO1xuICAgICAgICB0aGlzLm9sZE1hbmlmZXN0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5pbmplY3RvciA9IG5ldyBJc0Rlc2t0b3BJbmplY3RvcigpO1xuICAgICAgICB0aGlzLm1hdGNoZXIgPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ19fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18gPSBKU09OLnBhcnNlXFxcXChkZWNvZGVVUklDb21wb25lbnRcXFxcKFwiKFteXCJdKilcIlxcXFwpXFxcXCknXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucmVwbGFjZXIgPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJyhfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fID0gSlNPTi5wYXJzZVxcXFwoZGVjb2RlVVJJQ29tcG9uZW50XFxcXCgpXCIoW15cIl0qKVwiKFxcXFwpXFxcXCkpJ1xuICAgICAgICApO1xuICAgICAgICB0aGlzLm1ldGVvclZlcnNpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmluZGV4SFRNTHN0cmF0ZWd5ID0gbnVsbDtcblxuICAgICAgICB0aGlzLmluZGV4SFRNTFN0cmF0ZWdpZXMgPSB7XG4gICAgICAgICAgICBJTkRFWF9GUk9NX0NPUkRPVkFfQlVJTEQ6IDEsXG4gICAgICAgICAgICBJTkRFWF9GUk9NX1JVTk5JTkdfU0VSVkVSOiAyXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5kZXByZWN0YXRlZFBhY2thZ2VzID0gWydvbWVnYTptZXRlb3ItZGVza3RvcC1sb2NhbHN0b3JhZ2UnXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYW55IGRlcHJlY2F0ZWQgcGFja2FnZXMgZnJvbSBtZXRlb3IgcHJvamVjdC5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBhc3luYyByZW1vdmVEZXByZWNhdGVkUGFja2FnZXMoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tZXRlb3JNYW5hZ2VyLmNoZWNrUGFja2FnZXModGhpcy5kZXByZWN0YXRlZFBhY2thZ2VzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ2RlcHJlY2F0ZWQgbWV0ZW9yIHBsdWdpbnMgZm91bmQsIHJlbW92aW5nIHRoZW0nKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1ldGVvck1hbmFnZXIuZGVsZXRlUGFja2FnZXModGhpcy5kZXByZWN0YXRlZFBhY2thZ2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5zdXJlcyB0aGF0IHJlcXVpcmVkIHBhY2thZ2VzIGFyZSBhZGRlZCB0byB0aGUgTWV0ZW9yIGFwcC5cbiAgICAgKi9cbiAgICBhc3luYyBlbnN1cmVEZXNrdG9wSENQUGFja2FnZXMoKSB7XG4gICAgICAgIGNvbnN0IGRlc2t0b3BIQ1BQYWNrYWdlcyA9IFsnY29tbXVuaXR5cGFja2FnZXM6bWV0ZW9yLWRlc2t0b3Atd2F0Y2hlcicsICdjb21tdW5pdHlwYWNrYWdlczptZXRlb3ItZGVza3RvcC1idW5kbGVyJ107XG4gICAgICAgIGlmICh0aGlzLiQuZGVza3RvcC5nZXRTZXR0aW5ncygpLmRlc2t0b3BIQ1ApIHtcbiAgICAgICAgICAgIHRoaXMubG9nLnZlcmJvc2UoJ2Rlc2t0b3BIQ1AgaXMgZW5hYmxlZCwgY2hlY2tpbmcgZm9yIHJlcXVpcmVkIHBhY2thZ2VzJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhY2thZ2VzV2l0aFZlcnNpb24gPSBkZXNrdG9wSENQUGFja2FnZXMubWFwKHBhY2thZ2VOYW1lID0+IGAke3BhY2thZ2VOYW1lfUAke3RoaXMuJC5nZXRWZXJzaW9uKCl9YCk7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5tZXRlb3JNYW5hZ2VyLmVuc3VyZVBhY2thZ2VzKGRlc2t0b3BIQ1BQYWNrYWdlcywgcGFja2FnZXNXaXRoVmVyc2lvbiwgJ2Rlc2t0b3BIQ1AnKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZy52ZXJib3NlKCdkZXNrdG9wSENQIGlzIG5vdCBlbmFibGVkLCByZW1vdmluZyByZXF1aXJlZCBwYWNrYWdlcycpO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1ldGVvck1hbmFnZXIuY2hlY2tQYWNrYWdlcyhkZXNrdG9wSENQUGFja2FnZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWV0ZW9yTWFuYWdlci5kZWxldGVQYWNrYWdlcyhkZXNrdG9wSENQUGFja2FnZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGVudHJ5IHRvIC5tZXRlb3IvLmdpdGlnbm9yZSBpZiBuZWNlc3NhcnkuXG4gICAgICovXG4gICAgdXBkYXRlR2l0SWdub3JlKCkge1xuICAgICAgICB0aGlzLmxvZy52ZXJib3NlKCd1cGRhdGluZyAubWV0ZW9yLy5naXRpZ25vcmUnKTtcbiAgICAgICAgLy8gTGV0cyByZWFkIHRoZSAubWV0ZW9yLy5naXRpZ25vcmUgYW5kIGZpbHRlciBvdXQgYmxhbmsgbGluZXMuXG4gICAgICAgIGNvbnN0IGdpdElnbm9yZSA9IGZzLnJlYWRGaWxlU3luYyh0aGlzLiQuZW52LnBhdGhzLm1ldGVvckFwcC5naXRJZ25vcmUsICdVVEYtOCcpXG4gICAgICAgICAgICAuc3BsaXQoJ1xcbicpLmZpbHRlcihpZ25vcmVkUGF0aCA9PiBpZ25vcmVkUGF0aC50cmltKCkgIT09ICcnKTtcblxuICAgICAgICBpZiAoIX5naXRJZ25vcmUuaW5kZXhPZih0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnJvb3ROYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5sb2cudmVyYm9zZShgYWRkaW5nICR7dGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5yb290TmFtZX0gdG8gLm1ldGVvci8uZ2l0aWdub3JlYCk7XG4gICAgICAgICAgICBnaXRJZ25vcmUucHVzaCh0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnJvb3ROYW1lKTtcblxuICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLiQuZW52LnBhdGhzLm1ldGVvckFwcC5naXRJZ25vcmUsIGdpdElnbm9yZS5qb2luKCdcXG4nKSwgJ1VURi04Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWFkcyB0aGUgTWV0ZW9yIHJlbGVhc2UgdmVyc2lvbiB1c2VkIGluIHRoZSBhcHAuXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRNZXRlb3JSZWxlYXNlKCkge1xuICAgICAgICBsZXQgcmVsZWFzZSA9IGZzLnJlYWRGaWxlU3luYyh0aGlzLiQuZW52LnBhdGhzLm1ldGVvckFwcC5yZWxlYXNlLCAnVVRGLTgnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcci9nbSwgJycpXG4gICAgICAgICAgICAuc3BsaXQoJ1xcbicpWzBdO1xuICAgICAgICAoWywgcmVsZWFzZV0gPSByZWxlYXNlLnNwbGl0KCdAJykpO1xuICAgICAgICAvLyBXZSBkbyBub3QgY2FyZSBpZiBpdCBpcyBiZXRhLlxuICAgICAgICBpZiAofnJlbGVhc2UuaW5kZXhPZignLScpKSB7XG4gICAgICAgICAgICAoW3JlbGVhc2VdID0gcmVsZWFzZS5zcGxpdCgnLScpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVsZWFzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0IE1ldGVvciByZWxlYXNlIHRvIHNlbXZlciB2ZXJzaW9uLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgY2FzdE1ldGVvclJlbGVhc2VUb1NlbXZlcigpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuZ2V0TWV0ZW9yUmVsZWFzZSgpfS4wLjBgLm1hdGNoKC8oXlxcZCtcXC5cXGQrXFwuXFxkKykvZ21pKVswXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBtZXRlb3IgdmVyc2lvbiBhZ2FpbnN0IGEgdmVyc2lvblJhbmdlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uUmFuZ2UgLSBzZW12ZXIgdmVyc2lvbiByYW5nZVxuICAgICAqL1xuICAgIGNoZWNrTWV0ZW9yVmVyc2lvbih2ZXJzaW9uUmFuZ2UpIHtcbiAgICAgICAgY29uc3QgcmVsZWFzZSA9IHRoaXMuY2FzdE1ldGVvclJlbGVhc2VUb1NlbXZlcigpO1xuICAgICAgICBpZiAoIXNlbXZlci5zYXRpc2ZpZXMocmVsZWFzZSwgdmVyc2lvblJhbmdlKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuJC5lbnYub3B0aW9ucy5za2lwTW9iaWxlQnVpbGQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihgd3JvbmcgbWV0ZW9yIHZlcnNpb24gKCR7cmVsZWFzZX0pIGluIHByb2plY3QgLSBvbmx5IGAgK1xuICAgICAgICAgICAgICAgICAgICBgJHt2ZXJzaW9uUmFuZ2V9IGlzIHN1cHBvcnRlZGApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihgd3JvbmcgbWV0ZW9yIHZlcnNpb24gKCR7cmVsZWFzZX0pIGluIHByb2plY3QgLSBvbmx5IGAgK1xuICAgICAgICAgICAgICAgICAgICBgJHt2ZXJzaW9uUmFuZ2V9IGlzIHN1cHBvcnRlZCBmb3IgYXV0b21hdGljIG1ldGVvciBidWlsZHMgKHlvdSBjYW4gYWx3YXlzIGAgK1xuICAgICAgICAgICAgICAgICAgICAndHJ5IHdpdGggYC0tc2tpcC1tb2JpbGUtYnVpbGRgIGlmIHlvdSBhcmUgdXNpbmcgbWV0ZW9yID49IDEuMi4xJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWNpZGVzIHdoaWNoIHN0cmF0ZWd5IHRvIHVzZSB3aGlsZSB0cnlpbmcgdG8gZ2V0IGNsaWVudCBidWlsZCBvdXQgb2YgTWV0ZW9yIHByb2plY3QuXG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKi9cbiAgICBjaG9vc2VTdHJhdGVneSgpIHtcbiAgICAgICAgaWYgKHRoaXMuJC5lbnYub3B0aW9ucy5mb3JjZUNvcmRvdmFCdWlsZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXhIVE1MU3RyYXRlZ2llcy5JTkRFWF9GUk9NX0NPUkRPVkFfQlVJTEQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWxlYXNlID0gdGhpcy5jYXN0TWV0ZW9yUmVsZWFzZVRvU2VtdmVyKCk7XG4gICAgICAgIGlmIChzZW12ZXIuc2F0aXNmaWVzKHJlbGVhc2UsICc+IDEuMy40JykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluZGV4SFRNTFN0cmF0ZWdpZXMuSU5ERVhfRlJPTV9SVU5OSU5HX1NFUlZFUjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VtdmVyLnNhdGlzZmllcyhyZWxlYXNlLCAnMS4zLjQnKSkge1xuICAgICAgICAgICAgY29uc3QgZXhwbG9kZWRWZXJzaW9uID0gdGhpcy5nZXRNZXRlb3JSZWxlYXNlKCkuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIGlmIChleHBsb2RlZFZlcnNpb24ubGVuZ3RoID49IDQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXhwbG9kZWRWZXJzaW9uWzNdID4gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbmRleEhUTUxTdHJhdGVnaWVzLklOREVYX0ZST01fUlVOTklOR19TRVJWRVI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluZGV4SFRNTFN0cmF0ZWdpZXMuSU5ERVhfRlJPTV9DT1JET1ZBX0JVSUxEO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4SFRNTFN0cmF0ZWdpZXMuSU5ERVhfRlJPTV9DT1JET1ZBX0JVSUxEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyByZXF1aXJlZCBwcmVjb25kaXRpb25zLlxuICAgICAqIC0gTWV0ZW9yIHZlcnNpb25cbiAgICAgKiAtIGlzIG1vYmlsZSBwbGF0Zm9ybSBhZGRlZFxuICAgICAqL1xuICAgIGFzeW5jIGNoZWNrUHJlY29uZGl0aW9ucygpIHtcbiAgICAgICAgaWYgKHRoaXMuJC5lbnYub3B0aW9ucy5za2lwTW9iaWxlQnVpbGQpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tNZXRlb3JWZXJzaW9uKCc+PSAxLjIuMScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jaGVja01ldGVvclZlcnNpb24oJz49IDEuMy4zJyk7XG4gICAgICAgICAgICB0aGlzLmluZGV4SFRNTHN0cmF0ZWd5ID0gdGhpcy5jaG9vc2VTdHJhdGVneSgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXhIVE1Mc3RyYXRlZ3kgPT09IHRoaXMuaW5kZXhIVE1MU3RyYXRlZ2llcy5JTkRFWF9GUk9NX0NPUkRPVkFfQlVJTEQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgJ21ldGVvciB2ZXJzaW9uIGlzIDwgMS4zLjQuMiBzbyB0aGUgaW5kZXguaHRtbCBmcm9tIGNvcmRvdmEtYnVpbGQgd2lsbCcgK1xuICAgICAgICAgICAgICAgICAgICAnIGJlIHVzZWQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICdtZXRlb3IgdmVyc2lvbiBpcyA+PSAxLjMuNC4yIHNvIHRoZSBpbmRleC5odG1sIHdpbGwgYmUgZG93bmxvYWRlZCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2Zyb20gX19jb3Jkb3ZhL2luZGV4Lmh0bWwnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy4kLmVudi5vcHRpb25zLnNraXBNb2JpbGVCdWlsZCkge1xuICAgICAgICAgICAgY29uc3QgcGxhdGZvcm1zID0gZnMucmVhZEZpbGVTeW5jKHRoaXMuJC5lbnYucGF0aHMubWV0ZW9yQXBwLnBsYXRmb3JtcywgJ1VURi04Jyk7XG4gICAgICAgICAgICBpZiAoIX5wbGF0Zm9ybXMuaW5kZXhPZignYW5kcm9pZCcpICYmICF+cGxhdGZvcm1zLmluZGV4T2YoJ2lvcycpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLiQuZW52Lm9wdGlvbnMuYW5kcm9pZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vYmlsZVBsYXRmb3JtID0gJ2lvcyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2JpbGVQbGF0Zm9ybSA9ICdhbmRyb2lkJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cud2Fybihgbm8gbW9iaWxlIHRhcmdldCBkZXRlY3RlZCAtIHdpbGwgYWRkICcke3RoaXMubW9iaWxlUGxhdGZvcm19JyBgICtcbiAgICAgICAgICAgICAgICAgICAgJ2p1c3QgdG8gZ2V0IGEgbW9iaWxlIGJ1aWxkJyk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRNb2JpbGVQbGF0Zm9ybSh0aGlzLm1vYmlsZVBsYXRmb3JtKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKCdmYWlsZWQgdG8gYWRkIGEgbW9iaWxlIHBsYXRmb3JtIC0gcGxlYXNlIHRyeSB0byBkbyBpdCBtYW51YWxseScpO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZXMgdG8gYWRkIGEgbW9iaWxlIHBsYXRmb3JtIHRvIG1ldGVvciBwcm9qZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwbGF0Zm9ybSAtIHBsYXRmb3JtIHRvIGFkZFxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGFkZE1vYmlsZVBsYXRmb3JtKHBsYXRmb3JtKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZy52ZXJib3NlKGBhZGRpbmcgbW9iaWxlIHBsYXRmb3JtOiAke3BsYXRmb3JtfWApO1xuICAgICAgICAgICAgc3Bhd24oJ21ldGVvcicsIFsnYWRkLXBsYXRmb3JtJywgcGxhdGZvcm1dLCB7XG4gICAgICAgICAgICAgICAgY3dkOiB0aGlzLiQuZW52LnBhdGhzLm1ldGVvckFwcC5yb290LFxuICAgICAgICAgICAgICAgIHN0ZGlvOiB0aGlzLiQuZW52LnN0ZGlvXG4gICAgICAgICAgICB9KS5vbignZXhpdCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwbGF0Zm9ybXMgPSBmcy5yZWFkRmlsZVN5bmModGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHAucGxhdGZvcm1zLCAnVVRGLTgnKTtcbiAgICAgICAgICAgICAgICBpZiAoIX5wbGF0Zm9ybXMuaW5kZXhPZignYW5kcm9pZCcpICYmICF+cGxhdGZvcm1zLmluZGV4T2YoJ2lvcycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZXMgdG8gcmVtb3ZlIGEgbW9iaWxlIHBsYXRmb3JtIGZyb20gbWV0ZW9yIHByb2plY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBsYXRmb3JtIC0gcGxhdGZvcm0gdG8gcmVtb3ZlXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgcmVtb3ZlTW9iaWxlUGxhdGZvcm0ocGxhdGZvcm0pIHtcbiAgICAgICAgaWYgKHRoaXMuJC5lbnYub3B0aW9ucy5za2lwUmVtb3ZlTW9iaWxlUGxhdGZvcm0pIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2cudmVyYm9zZShgcmVtb3ZpbmcgbW9iaWxlIHBsYXRmb3JtOiAke3BsYXRmb3JtfWApO1xuICAgICAgICAgICAgc3Bhd24oJ21ldGVvcicsIFsncmVtb3ZlLXBsYXRmb3JtJywgcGxhdGZvcm1dLCB7XG4gICAgICAgICAgICAgICAgY3dkOiB0aGlzLiQuZW52LnBhdGhzLm1ldGVvckFwcC5yb290LFxuICAgICAgICAgICAgICAgIHN0ZGlvOiB0aGlzLiQuZW52LnN0ZGlvLFxuICAgICAgICAgICAgICAgIGVudjogT2JqZWN0LmFzc2lnbih7IE1FVEVPUl9QUkVUVFlfT1VUUFVUOiAwIH0sIHByb2Nlc3MuZW52KVxuICAgICAgICAgICAgfSkub24oJ2V4aXQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGxhdGZvcm1zID0gZnMucmVhZEZpbGVTeW5jKHRoaXMuJC5lbnYucGF0aHMubWV0ZW9yQXBwLnBsYXRmb3JtcywgJ1VURi04Jyk7XG4gICAgICAgICAgICAgICAgaWYgKH5wbGF0Zm9ybXMuaW5kZXhPZihwbGF0Zm9ybSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKdXN0IGNoZWNrcyBmb3IgaW5kZXguaHRtbCBhbmQgcHJvZ3JhbS5qc29uIGV4aXN0ZW5jZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0NvcmRvdmFCdWlsZFJlYWR5KCkge1xuICAgICAgICBpZiAodGhpcy5pbmRleEhUTUxzdHJhdGVneSA9PT0gdGhpcy5pbmRleEhUTUxTdHJhdGVnaWVzLklOREVYX0ZST01fQ09SRE9WQV9CVUlMRCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuJC51dGlscy5leGlzdHModGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHAuY29yZG92YUJ1aWxkSW5kZXgpICYmXG4gICAgICAgICAgICAgICAgdGhpcy4kLnV0aWxzLmV4aXN0cyh0aGlzLiQuZW52LnBhdGhzLm1ldGVvckFwcC5jb3Jkb3ZhQnVpbGRQcm9ncmFtSnNvbikgJiZcbiAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICF0aGlzLm9sZE1hbmlmZXN0IHx8XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm9sZE1hbmlmZXN0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9sZE1hbmlmZXN0ICE9PSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHAuY29yZG92YUJ1aWxkUHJvZ3JhbUpzb24sICdVVEYtOCdcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuJC51dGlscy5leGlzdHModGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHAud2ViQ29yZG92YVByb2dyYW1Kc29uKSAmJlxuICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICF0aGlzLm9sZE1hbmlmZXN0IHx8XG4gICAgICAgICAgICAgICAgKHRoaXMub2xkTWFuaWZlc3QgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbGRNYW5pZmVzdCAhPT0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHAud2ViQ29yZG92YVByb2dyYW1Kc29uLCAnVVRGLTgnXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgaW5kZXguaHRtbCBmcm9tIHJ1bm5pbmcgcHJvamVjdC5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZS48Kj59XG4gICAgICovXG4gICAgYXN5bmMgYWNxdWlyZUluZGV4KCkge1xuICAgICAgICBjb25zdCBwb3J0ID0gKHRoaXMuJC5lbnYub3B0aW9ucy5wb3J0KSA/IHRoaXMuJC5lbnYub3B0aW9ucy5wb3J0IDogMzA4MDtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnYWNxdWlyaW5nIGluZGV4Lmh0bWwnKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYGh0dHA6Ly8xMjcuMC4wLjE6JHtwb3J0fS9fX2NvcmRvdmEvaW5kZXguaHRtbGApO1xuICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzLnRleHQoKTtcbiAgICAgICAgLy8gU2ltcGxlIHRlc3QgaWYgd2UgcmVhbGx5IGRvd25sb2FkIGluZGV4Lmh0bWwgZm9yIHdlYi5jb3Jkb3ZhLlxuICAgICAgICBpZiAofnRleHQuaW5kZXhPZignc3JjPVwiL2NvcmRvdmEuanNcIicpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBtYWluZmVzdC5qc29uIGZyb20gcnVubmluZyBwcm9qZWN0LlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlLjx2b2lkPn1cbiAgICAgKi9cbiAgICBhc3luYyBhY3F1aXJlTWFuaWZlc3QoKSB7XG4gICAgICAgIGNvbnN0IHBvcnQgPSAodGhpcy4kLmVudi5vcHRpb25zLnBvcnQpID8gdGhpcy4kLmVudi5vcHRpb25zLnBvcnQgOiAzMDgwO1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdhY3F1aXJpbmcgbWFuaWZlc3QuanNvbicpO1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgIGBodHRwOi8vMTI3LjAuMC4xOiR7cG9ydH0vX19jb3Jkb3ZhL21hbmlmZXN0Lmpzb24/bWV0ZW9yX2RvbnRfc2VydmVfaW5kZXg9dHJ1ZWBcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHRleHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWVzIHRvIGdldCBhIG1vYmlsZSBidWlsZCBmcm9tIG1ldGVvciBhcHAuXG4gICAgICogSW4gY2FzZSBvZiBmYWlsdXJlIGxlYXZlcyBhIG1ldGVvci5sb2cuXG4gICAgICogQSBsb3Qgb2Ygc3R1ZmYgaXMgaGFwcGVuaW5nIGhlcmUgLSBidXQgdGhlIG1haW4gYWltIGlzIHRvIGdldCBhIG1vYmlsZSBidWlsZCBmcm9tXG4gICAgICogLm1ldGVvci9sb2NhbC9jb3Jkb3ZhLWJ1aWxkL3d3dy9hcHBsaWNhdGlvbiBhbmQgZXhpdCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgYnVpbGRNb2JpbGVUYXJnZXQoKSB7XG4gICAgICAgIGNvbnN0IHByb2dyYW1Kc29uID1cbiAgICAgICAgICAgICh0aGlzLmluZGV4SFRNTHN0cmF0ZWd5ID09PSB0aGlzLmluZGV4SFRNTFN0cmF0ZWdpZXMuSU5ERVhfRlJPTV9DT1JET1ZBX0JVSUxEKSA/XG4gICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHAuY29yZG92YUJ1aWxkUHJvZ3JhbUpzb24gOlxuICAgICAgICAgICAgICAgIHRoaXMuJC5lbnYucGF0aHMubWV0ZW9yQXBwLndlYkNvcmRvdmFQcm9ncmFtSnNvbjtcblxuICAgICAgICBpZiAodGhpcy4kLnV0aWxzLmV4aXN0cyhwcm9ncmFtSnNvbikpIHtcbiAgICAgICAgICAgIHRoaXMub2xkTWFuaWZlc3QgPSBmcy5yZWFkRmlsZVN5bmMocHJvZ3JhbUpzb24sICdVVEYtOCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgbGV0IGxvZyA9ICcnO1xuICAgICAgICAgICAgbGV0IGRlc2lyZWRFeGl0ID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgYnVpbGRUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBlcnJvclRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgbGV0IG1lc3NhZ2VUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBraWxsVGltZW91dCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgY29yZG92YUNoZWNrSW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHBvcnRQcm9ibGVtID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIHdpbmRvd3NLaWxsKHBpZCkge1xuICAgICAgICAgICAgICAgIHNlbGYubG9nLmRlYnVnKGBraWxsaW5nIHBpZDogJHtwaWR9YCk7XG4gICAgICAgICAgICAgICAgc3Bhd24uc3luYygndGFza2tpbGwnLCBbJy9waWQnLCBwaWQsICcvZicsICcvdCddKTtcblxuICAgICAgICAgICAgICAgIC8vIFdlIHdpbGwgbG9vayBmb3Igb3RoZXIgcHJvY2VzcyB3aGljaCBtaWdodCBoYXZlIGJlZW4gY3JlYXRlZCBvdXRzaWRlIHRoZVxuICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgdHJlZS5cbiAgICAgICAgICAgICAgICAvLyBMZXRzIGxpc3QgYWxsIG5vZGUuZXhlIHByb2Nlc3Nlcy5cblxuICAgICAgICAgICAgICAgIGNvbnN0IG91dCA9IHNwYXduXG4gICAgICAgICAgICAgICAgICAgIC5zeW5jKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3dtaWMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgWydwcm9jZXNzJywgJ3doZXJlJywgJ2NhcHRpb249XCJub2RlLmV4ZVwiJywgJ2dldCcsICdjb21tYW5kbGluZSxwcm9jZXNzaWQnXVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIC5zdGRvdXQudG9TdHJpbmcoJ3V0Zi04JylcbiAgICAgICAgICAgICAgICAgICAgLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhcmdzID0gc2VsZi5wcmVwYXJlQXJndW1lbnRzKCk7XG4gICAgICAgICAgICAgICAgLy8gTGV0cyBtb3VudCByZWdleC5cbiAgICAgICAgICAgICAgICBjb25zdCByZWdleFYxID0gbmV3IFJlZ0V4cChgJHthcmdzLmpvaW4oJ1xcXFxzKycpfVxcXFxzKyhcXFxcZCspYCwgJ2dtJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVnZXhWMiA9IG5ldyBSZWdFeHAoYFwiJHthcmdzLmpvaW4oJ1wiXFxcXHMrXCInKX1cIlxcXFxzKyhcXFxcZCspYCwgJ2dtJyk7XG4gICAgICAgICAgICAgICAgLy8gTm8gd2Ugd2lsbCBjaGVjayBmb3IgdGhvc2Ugd2l0aCB0aGUgbWF0Y2hpbmcgcGFyYW1zLlxuICAgICAgICAgICAgICAgIG91dC5mb3JFYWNoKChsaW5lKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gcmVnZXhWMS5leGVjKGxpbmUpIHx8IHJlZ2V4VjIuZXhlYyhsaW5lKSB8fCBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5kZWJ1Zyhga2lsbGluZyBwaWQ6ICR7bWF0Y2hbMV19YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGF3bi5zeW5jKCd0YXNra2lsbCcsIFsnL3BpZCcsIG1hdGNoWzFdLCAnL2YnLCAnL3QnXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVnZXhWMS5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICByZWdleFYyLmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIHdyaXRlTG9nKCkge1xuICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoJ21ldGVvci5sb2cnLCBsb2csICdVVEYtOCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBjbGVhclRpbWVvdXRzQW5kSW50ZXJ2YWxzKCkge1xuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoY29yZG92YUNoZWNrSW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChidWlsZFRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChlcnJvclRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChtZXNzYWdlVGltZW91dCk7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGtpbGxUaW1lb3V0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYXJncyA9IHRoaXMucHJlcGFyZUFyZ3VtZW50cygpO1xuXG4gICAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBydW5uaW5nIFwibWV0ZW9yICR7YXJncy5qb2luKCcgJyl9XCIuLi4gdGhpcyBtaWdodCB0YWtlIGEgd2hpbGVgKTtcblxuICAgICAgICAgICAgY29uc3QgZW52ID0geyBNRVRFT1JfUFJFVFRZX09VVFBVVDogMCwgTUVURU9SX05PX1JFTEVBU0VfQ0hFQ0s6IDEgfTtcbiAgICAgICAgICAgIGlmICh0aGlzLiQuZW52Lm9wdGlvbnMucHJvZERlYnVnKSB7XG4gICAgICAgICAgICAgICAgZW52Lk1FVEVPUl9ERVNLT1BfUFJPRF9ERUJVRyA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIExldHMgc3Bhd24gbWV0ZW9yLlxuICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBzcGF3bihcbiAgICAgICAgICAgICAgICAnbWV0ZW9yJyxcbiAgICAgICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZW52OiBPYmplY3QuYXNzaWduKGVudiwgcHJvY2Vzcy5lbnYpLFxuICAgICAgICAgICAgICAgICAgICBjd2Q6IHRoaXMuJC5lbnYucGF0aHMubWV0ZW9yQXBwLnJvb3RcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHsgc2hlbGw6IHRydWUgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gS2lsbHMgdGhlIGN1cnJlbnRseSBydW5uaW5nIG1ldGVvciBjb21tYW5kLlxuICAgICAgICAgICAgZnVuY3Rpb24ga2lsbCgpIHtcbiAgICAgICAgICAgICAgICBzbGwoJycpO1xuICAgICAgICAgICAgICAgIGNoaWxkLmtpbGwoJ1NJR0tJTEwnKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi4kLmVudi5vcy5pc1dpbmRvd3MpIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93c0tpbGwoY2hpbGQucGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGV4aXQoKSB7XG4gICAgICAgICAgICAgICAga2lsbFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0c0FuZEludGVydmFscygpO1xuICAgICAgICAgICAgICAgICAgICBkZXNpcmVkRXhpdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGtpbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGNvcHlCdWlsZCgpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmNvcHlCdWlsZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBleGl0KCk7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXRzQW5kSW50ZXJ2YWxzKCk7XG4gICAgICAgICAgICAgICAgICAgIGtpbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVMb2coKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCdjb3B5Jyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvcmRvdmFDaGVja0ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBjb3Jkb3ZhLWJ1aWxkIHJlYWR5LlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQ29yZG92YUJ1aWxkUmVhZHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBzbywgdGhlbiBleGl0IGltbWVkaWF0ZWx5LlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbmRleEhUTUxzdHJhdGVneSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhIVE1MU3RyYXRlZ2llcy5JTkRFWF9GUk9NX0NPUkRPVkFfQlVJTEQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlCdWlsZCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgMTAwMCk7XG5cbiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIChjaHVuaykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBjaHVuay50b1N0cmluZygnVVRGLTgnKTtcbiAgICAgICAgICAgICAgICBsb2cgKz0gYCR7bGluZX1cXG5gO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvclRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGVycm9yVGltZW91dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIERvIG5vdCBleGl0IGlmIHRoaXMgaXMgdGhlIHdhcm5pbmcgZm9yIHVzaW5nIC0tcHJvZHVjdGlvbi5cbiAgICAgICAgICAgICAgICAvLyBPdXRwdXQgZXhjZWVkcyAtPiBodHRwczovL2dpdGh1Yi5jb20vbWV0ZW9yL21ldGVvci9pc3N1ZXMvODU5MlxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIX5saW5lLmluZGV4T2YoJy0tcHJvZHVjdGlvbicpICYmXG4gICAgICAgICAgICAgICAgICAgICF+bGluZS5pbmRleE9mKCdPdXRwdXQgZXhjZWVkcyAnKSAmJlxuICAgICAgICAgICAgICAgICAgICAhfmxpbmUuaW5kZXhPZignTm9kZSNtb3ZlVG8nKSAmJlxuICAgICAgICAgICAgICAgICAgICAhfmxpbmUuaW5kZXhPZignQnJvd3NlcnNsaXN0JykgJiZcbiAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShzZWxmLiQuZW52Lm9wdGlvbnMuaWdub3JlU3RkZXJyKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi4kLmVudi5vcHRpb25zLmlnbm9yZVN0ZGVyci5ldmVyeShzdHIgPT4gIX5saW5lLmluZGV4T2Yoc3RyKSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy53YXJuKCdTVERFUlI6JywgbGluZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIHdpbGwgZXhpdCAxcyBhZnRlciBsYXN0IGVycm9yIGluIHN0ZGVyci5cbiAgICAgICAgICAgICAgICAgICAgZXJyb3JUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXRzQW5kSW50ZXJ2YWxzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBraWxsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUxvZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCdlcnJvcicpO1xuICAgICAgICAgICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGluZSA9IGNodW5rLnRvU3RyaW5nKCdVVEYtOCcpO1xuICAgICAgICAgICAgICAgIGlmICghZGVzaXJlZEV4aXQgJiYgbGluZS50cmltKCkucmVwbGFjZSgvW1xcblxcclxcdFxcdlxcZl0rL2dtLCAnJykgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVzVG9EaXNwbGF5ID0gbGluZS50cmltKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zcGxpdCgnXFxuXFxyJyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgZGlzcGxheSBsYXN0IGxpbmUgZnJvbSB0aGUgY2h1bmsuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNhbml0aXplZExpbmUgPSBsaW5lc1RvRGlzcGxheS5wb3AoKS5yZXBsYWNlKC9bXFxuXFxyXFx0XFx2XFxmXSsvZ20sICcnKTtcbiAgICAgICAgICAgICAgICAgICAgc2xsKHNhbml0aXplZExpbmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2cgKz0gYCR7bGluZX1cXG5gO1xuICAgICAgICAgICAgICAgIGlmICh+bGluZS5pbmRleE9mKCdhZnRlcl9wbGF0Zm9ybV9hZGQnKSkge1xuICAgICAgICAgICAgICAgICAgICBzbGwoJycpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdkb25lLi4uIDEwJScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh+bGluZS5pbmRleE9mKCdMb2NhbCBwYWNrYWdlIHZlcnNpb24nKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZVRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChtZXNzYWdlVGltZW91dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsbCgnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdidWlsZGluZyBpbiBwcm9ncmVzcy4uLicpO1xuICAgICAgICAgICAgICAgICAgICB9LCAxNTAwKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAofmxpbmUuaW5kZXhPZignUHJlcGFyaW5nIENvcmRvdmEgcHJvamVjdCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHNsbCgnJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ2RvbmUuLi4gNjAlJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKH5saW5lLmluZGV4T2YoJ0NhblxcJ3QgbGlzdGVuIG9uIHBvcnQnKSkge1xuICAgICAgICAgICAgICAgICAgICBwb3J0UHJvYmxlbSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKH5saW5lLmluZGV4T2YoJ1lvdXIgYXBwbGljYXRpb24gaGFzIGVycm9ycycpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvclRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChlcnJvclRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVycm9yVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0c0FuZEludGVydmFscygpO1xuICAgICAgICAgICAgICAgICAgICAgICAga2lsbCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVMb2coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgnZXJyb3JJbkFwcCcpO1xuICAgICAgICAgICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAofmxpbmUuaW5kZXhPZignQXBwIHJ1bm5pbmcgYXQnKSkge1xuICAgICAgICAgICAgICAgICAgICBjb3B5QnVpbGQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gV2hlbiBNZXRlb3IgZXhpdHNcbiAgICAgICAgICAgIGNoaWxkLm9uKCdleGl0JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHNsbCgnJyk7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0c0FuZEludGVydmFscygpO1xuICAgICAgICAgICAgICAgIGlmICghZGVzaXJlZEV4aXQpIHtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVMb2coKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnRQcm9ibGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoJ3BvcnQnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgnZXhpdCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGJ1aWxkVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGtpbGwoKTtcbiAgICAgICAgICAgICAgICB3cml0ZUxvZygpO1xuICAgICAgICAgICAgICAgIHJlamVjdCgndGltZW91dCcpO1xuICAgICAgICAgICAgfSwgdGhpcy4kLmVudi5vcHRpb25zLmJ1aWxkVGltZW91dCA/IHRoaXMuJC5lbnYub3B0aW9ucy5idWlsZFRpbWVvdXQgKiAxMDAwIDogNjAwMDAwKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwbGFjZXMgdGhlIEREUCB1cmwgdGhhdCB3YXMgdXNlZCBvcmlnaW5hbGx5IHdoZW4gTWV0ZW9yIHdhcyBidWlsZGluZyB0aGUgY2xpZW50LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbmRleEh0bWwgLSBwYXRoIHRvIGluZGV4Lmh0bWwgZnJvbSB0aGUgY2xpZW50XG4gICAgICovXG4gICAgdXBkYXRlRGRwVXJsKGluZGV4SHRtbCkge1xuICAgICAgICBsZXQgY29udGVudDtcbiAgICAgICAgbGV0IHJ1bnRpbWVDb25maWc7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoaW5kZXhIdG1sLCAnVVRGLTgnKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoYGVycm9yIGxvYWRpbmcgaW5kZXguaHRtbCBmaWxlOiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMubWF0Y2hlci50ZXN0KGNvbnRlbnQpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignY291bGQgbm90IGZpbmQgcnVudGltZSBjb25maWcgaW4gaW5kZXggZmlsZScpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBjb250ZW50Lm1hdGNoKHRoaXMubWF0Y2hlcik7XG4gICAgICAgICAgICBydW50aW1lQ29uZmlnID0gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQobWF0Y2hlc1sxXSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignY291bGQgbm90IGZpbmQgcnVudGltZSBjb25maWcgaW4gaW5kZXggZmlsZScpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuJC5lbnYub3B0aW9ucy5kZHBVcmwuc3Vic3RyKC0xLCAxKSAhPT0gJy8nKSB7XG4gICAgICAgICAgICB0aGlzLiQuZW52Lm9wdGlvbnMuZGRwVXJsICs9ICcvJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJ1bnRpbWVDb25maWcuUk9PVF9VUkwgPSB0aGlzLiQuZW52Lm9wdGlvbnMuZGRwVXJsO1xuICAgICAgICBydW50aW1lQ29uZmlnLkREUF9ERUZBVUxUX0NPTk5FQ1RJT05fVVJMID0gdGhpcy4kLmVudi5vcHRpb25zLmRkcFVybDtcblxuICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKFxuICAgICAgICAgICAgdGhpcy5yZXBsYWNlciwgYCQxXCIke2VuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShydW50aW1lQ29uZmlnKSl9XCIkM2BcbiAgICAgICAgKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhpbmRleEh0bWwsIGNvbnRlbnQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihgZXJyb3Igd3JpdGluZyBpbmRleC5odG1sIGZpbGU6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ3N1Y2Nlc3NmdWxseSB1cGRhdGVkIGRkcCBzdHJpbmcgaW4gdGhlIHJ1bnRpbWUgY29uZmlnIG9mIGEgbW9iaWxlIGJ1aWxkJyArXG4gICAgICAgICAgICBgIHRvICR7dGhpcy4kLmVudi5vcHRpb25zLmRkcFVybH1gKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmVwYXJlcyB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byBgbWV0ZW9yYCBjb21tYW5kLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICAgKi9cbiAgICBwcmVwYXJlQXJndW1lbnRzKCkge1xuICAgICAgICBjb25zdCBhcmdzID0gWydydW4nLCAnLS12ZXJib3NlJywgYC0tbW9iaWxlLXNlcnZlcj0ke3RoaXMuJC5lbnYub3B0aW9ucy5kZHBVcmx9YF07XG4gICAgICAgIGlmICh0aGlzLiQuZW52LmlzUHJvZHVjdGlvbkJ1aWxkKCkpIHtcbiAgICAgICAgICAgIGFyZ3MucHVzaCgnLS1wcm9kdWN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgYXJncy5wdXNoKCctcCcpO1xuICAgICAgICBpZiAodGhpcy4kLmVudi5vcHRpb25zLnBvcnQpIHtcbiAgICAgICAgICAgIGFyZ3MucHVzaCh0aGlzLiQuZW52Lm9wdGlvbnMucG9ydCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcmdzLnB1c2goJzMwODAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4kLmVudi5vcHRpb25zLm1ldGVvclNldHRpbmdzKSB7XG4gICAgICAgICAgICBhcmdzLnB1c2goJy0tc2V0dGluZ3MnLCB0aGlzLiQuZW52Lm9wdGlvbnMubWV0ZW9yU2V0dGluZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcmdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlcyB0aGUgbW9iaWxlIGJ1aWxkIGFuZCBjb3BpZXMgaXQgaW50byBlbGVjdHJvbiBhcHAuXG4gICAgICovXG4gICAgYXN5bmMgY29weUJ1aWxkKCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZygnY2xlYXJpbmcgYnVpbGQgZGlyJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiQudXRpbHMucm1XaXRoUmV0cmllcygnLXJmJywgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5tZXRlb3JBcHApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcHJlZml4ID0gJ2NvcmRvdmFCdWlsZCc7XG4gICAgICAgIGxldCBjb3B5UGF0aFBvc3RmaXggPSAnJztcblxuICAgICAgICBpZiAodGhpcy5pbmRleEhUTUxzdHJhdGVneSA9PT0gdGhpcy5pbmRleEhUTUxTdHJhdGVnaWVzLklOREVYX0ZST01fUlVOTklOR19TRVJWRVIpIHtcbiAgICAgICAgICAgIHByZWZpeCA9ICd3ZWJDb3Jkb3ZhJztcbiAgICAgICAgICAgIGNvcHlQYXRoUG9zdGZpeCA9IGAke3BhdGguc2VwfSpgO1xuICAgICAgICAgICAgbGV0IGluZGV4SHRtbDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZnMubWtkaXJTeW5jKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubWV0ZW9yQXBwKTtcbiAgICAgICAgICAgICAgICBpbmRleEh0bWwgPSBhd2FpdCB0aGlzLmFjcXVpcmVJbmRleCgpO1xuICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5tZXRlb3JBcHBJbmRleCwgaW5kZXhIdG1sKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdzdWNjZXNzZnVsbHkgZG93bmxvYWRlZCBpbmRleC5odG1sIGZyb20gcnVubmluZyBtZXRlb3IgYXBwJyk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ2Vycm9yIHdoaWxlIHRyeWluZyB0byBkb3dubG9hZCBpbmRleC5odG1sIGZvciB3ZWIuY29yZG92YSwgJyArXG4gICAgICAgICAgICAgICAgICAgICdiZSBzdXJlIHRoYXQgeW91IGFyZSBydW5uaW5nIGEgbW9iaWxlIHRhcmdldCBvciB3aXRoJyArXG4gICAgICAgICAgICAgICAgICAgICcgLS1tb2JpbGUtc2VydmVyOiAnLCBlKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29yZG92YUJ1aWxkID0gdGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHBbcHJlZml4XTtcbiAgICAgICAgY29uc3QgeyBjb3Jkb3ZhQnVpbGRJbmRleCB9ID0gdGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHA7XG4gICAgICAgIGNvbnN0IGNvcmRvdmFCdWlsZFByb2dyYW1Kc29uID0gdGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHBbYCR7cHJlZml4fVByb2dyYW1Kc29uYF07XG5cbiAgICAgICAgaWYgKCF0aGlzLiQudXRpbHMuZXhpc3RzKGNvcmRvdmFCdWlsZCkpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGBubyBtb2JpbGUgYnVpbGQgZm91bmQgYXQgJHtjb3Jkb3ZhQnVpbGR9YCk7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignYXJlIHlvdSBzdXJlIHlvdSBkaWQgcnVuIG1ldGVvciB3aXRoIC0tbW9iaWxlLXNlcnZlcj8nKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgZmlsZSBub3QgcHJlc2VudCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLiQudXRpbHMuZXhpc3RzKGNvcmRvdmFCdWlsZFByb2dyYW1Kc29uKSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ25vIHByb2dyYW0uanNvbiBmb3VuZCBpbiBtb2JpbGUgYnVpbGQgZm91bmQgYXQgJyArXG4gICAgICAgICAgICAgICAgYCR7Y29yZG92YUJ1aWxkfWApO1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ2FyZSB5b3Ugc3VyZSB5b3UgZGlkIHJ1biBtZXRlb3Igd2l0aCAtLW1vYmlsZS1zZXJ2ZXI/Jyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIGZpbGUgbm90IHByZXNlbnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmluZGV4SFRNTHN0cmF0ZWd5ICE9PSB0aGlzLmluZGV4SFRNTFN0cmF0ZWdpZXMuSU5ERVhfRlJPTV9SVU5OSU5HX1NFUlZFUikge1xuICAgICAgICAgICAgaWYgKCF0aGlzLiQudXRpbHMuZXhpc3RzKGNvcmRvdmFCdWlsZEluZGV4KSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKCdubyBpbmRleC5odG1sIGZvdW5kIGluIGNvcmRvdmEgYnVpbGQgZm91bmQgYXQgJyArXG4gICAgICAgICAgICAgICAgICAgIGAke2NvcmRvdmFCdWlsZH1gKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignYXJlIHlvdSBzdXJlIHlvdSBkaWQgcnVuIG1ldGVvciB3aXRoIC0tbW9iaWxlLXNlcnZlcj8nKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIGZpbGUgbm90IHByZXNlbnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nLnZlcmJvc2UoJ2NvcHlpbmcgbW9iaWxlIGJ1aWxkJyk7XG4gICAgICAgIHNoZWxsLmNwKFxuICAgICAgICAgICAgJy1SJywgYCR7Y29yZG92YUJ1aWxkfSR7Y29weVBhdGhQb3N0Zml4fWAsIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubWV0ZW9yQXBwXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQmVjYXVzZSBvZiB2YXJpb3VzIHBlcm1pc3Npb24gcHJvYmxlbXMgaGVyZSB3ZSB0cnkgdG8gY2xlYXIgdGUgcGF0aCBieSBjbGVhcmluZ1xuICAgICAgICAvLyBhbGwgcG9zc2libGUgcmVzdHJpY3Rpb25zLlxuICAgICAgICBzaGVsbC5jaG1vZChcbiAgICAgICAgICAgICctUicsICc3NzcnLCB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLm1ldGVvckFwcFxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy4kLmVudi5vcy5pc1dpbmRvd3MpIHtcbiAgICAgICAgICAgIHNoZWxsLmV4ZWMoYGF0dHJpYiAtciAke3RoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubWV0ZW9yQXBwfSR7cGF0aC5zZXB9Ki4qIC9zYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pbmRleEhUTUxzdHJhdGVneSA9PT0gdGhpcy5pbmRleEhUTUxTdHJhdGVnaWVzLklOREVYX0ZST01fUlVOTklOR19TRVJWRVIpIHtcbiAgICAgICAgICAgIGxldCBwcm9ncmFtSnNvbjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcHJvZ3JhbUpzb24gPSBhd2FpdCB0aGlzLmFjcXVpcmVNYW5pZmVzdCgpO1xuICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubWV0ZW9yQXBwUHJvZ3JhbUpzb24sXG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHByb2dyYW1Kc29uLCBudWxsLCA0KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuaW5mbygnc3VjY2Vzc2Z1bGx5IGRvd25sb2FkZWQgbWFuaWZlc3QuanNvbiBmcm9tIHJ1bm5pbmcgbWV0ZW9yIGFwcCcpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKCdlcnJvciB3aGlsZSB0cnlpbmcgdG8gZG93bmxvYWQgbWFuaWZlc3QuanNvbiBmb3Igd2ViLmNvcmRvdmEsJyArXG4gICAgICAgICAgICAgICAgICAgICcgYmUgc3VyZSB0aGF0IHlvdSBhcmUgcnVubmluZyBhIG1vYmlsZSB0YXJnZXQgb3Igd2l0aCcgK1xuICAgICAgICAgICAgICAgICAgICAnIC0tbW9iaWxlLXNlcnZlcjogJywgZSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nLmluZm8oJ21vYmlsZSBidWlsZCBjb3BpZWQgdG8gZWxlY3Ryb24gYXBwJyk7XG5cbiAgICAgICAgdGhpcy5sb2cuZGVidWcoJ2NvcHkgY29yZG92YS5qcyB0byBtZXRlb3IgYnVpbGQnKTtcbiAgICAgICAgc2hlbGwuY3AoXG4gICAgICAgICAgICBqb2luKF9fZGlybmFtZSwgJy4uJywgJ3NrZWxldG9uJywgJ2NvcmRvdmEuanMnKSxcbiAgICAgICAgICAgIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubWV0ZW9yQXBwXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5qZWN0cyBNZXRlb3IuaXNEZXNrdG9wXG4gICAgICovXG4gICAgaW5qZWN0SXNEZXNrdG9wKCkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdpbmplY3RpbmcgaXNEZXNrdG9wJyk7XG5cbiAgICAgICAgbGV0IG1hbmlmZXN0SnNvblBhdGggPSB0aGlzLiQuZW52LnBhdGhzLm1ldGVvckFwcC5jb3Jkb3ZhQnVpbGRQcm9ncmFtSnNvbjtcbiAgICAgICAgaWYgKHRoaXMuaW5kZXhIVE1Mc3RyYXRlZ3kgPT09IHRoaXMuaW5kZXhIVE1MU3RyYXRlZ2llcy5JTkRFWF9GUk9NX1JVTk5JTkdfU0VSVkVSKSB7XG4gICAgICAgICAgICBtYW5pZmVzdEpzb25QYXRoID0gdGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHAud2ViQ29yZG92YVByb2dyYW1Kc29uO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHsgbWFuaWZlc3QgfSA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgZnMucmVhZEZpbGVTeW5jKG1hbmlmZXN0SnNvblBhdGgsICdVVEYtOCcpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbGV0IGluamVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgaW5qZWN0ZWRTdGFydHVwRGlkQ29tcGxldGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuXG4gICAgICAgICAgICAvLyBXZSB3aWxsIHNlYXJjaCBpbiBldmVyeSAuanMgZmlsZSBpbiB0aGUgbWFuaWZlc3QuXG4gICAgICAgICAgICAvLyBXZSBjb3VsZCBwcm9iYWJseSBkZXRlY3Qgd2hldGhlciB0aGlzIGlzIGEgZGV2IG9yIHByb2R1Y3Rpb24gYnVpbGQgYW5kIG9ubHkgc2VhcmNoIGluXG4gICAgICAgICAgICAvLyB0aGUgY29ycmVjdCBmaWxlcywgYnV0IGZvciBub3cgdGhpcyBzaG91bGQgYmUgZmluZS5cbiAgICAgICAgICAgIG1hbmlmZXN0LmZvckVhY2goKGZpbGUpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZmlsZUNvbnRlbnRzO1xuICAgICAgICAgICAgICAgIC8vIEhhY2t5IHdheSBvZiBzZXR0aW5nIGlzRGVza3RvcC5cbiAgICAgICAgICAgICAgICBpZiAoZmlsZS50eXBlID09PSAnanMnKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVDb250ZW50cyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4odGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5tZXRlb3JBcHAsIGZpbGUucGF0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICAnVVRGLTgnXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuaW5qZWN0b3IucHJvY2Vzc0ZpbGVDb250ZW50cyhmaWxlQ29udGVudHMpO1xuXG4gICAgICAgICAgICAgICAgICAgICh7IGZpbGVDb250ZW50cyB9ID0gcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgaW5qZWN0ZWRTdGFydHVwRGlkQ29tcGxldGUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmluamVjdGVkU3RhcnR1cERpZENvbXBsZXRlID8gdHJ1ZSA6IGluamVjdGVkU3RhcnR1cERpZENvbXBsZXRlO1xuICAgICAgICAgICAgICAgICAgICBpbmplY3RlZCA9IHJlc3VsdC5pbmplY3RlZCA/IHRydWUgOiBpbmplY3RlZDtcblxuICAgICAgICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICAgICAgICAgICAgICAgICAgam9pbih0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLm1ldGVvckFwcCwgZmlsZS5wYXRoKSwgZmlsZUNvbnRlbnRzXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghaW5qZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3IgaW5qZWN0aW5nIGlzRGVza3RvcCBnbG9iYWwgdmFyLicpO1xuICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaW5qZWN0ZWRTdGFydHVwRGlkQ29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3IgaW5qZWN0aW5nIGlzRGVza3RvcCBmb3Igc3RhcnR1cERpZENvbXBsZXRlJyk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igb2NjdXJyZWQgd2hpbGUgaW5qZWN0aW5nIGlzRGVza3RvcDogJywgZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2cuaW5mbygnaW5qZWN0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGRzLCBtb2RpZmllcyBhbmQgY29waWVzIHRoZSBtZXRlb3IgYXBwIHRvIGVsZWN0cm9uIGFwcC5cbiAgICAgKi9cbiAgICBhc3luYyBidWlsZCgpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnY2hlY2tpbmcgZm9yIGFueSBtb2JpbGUgcGxhdGZvcm0nKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2hlY2tQcmVjb25kaXRpb25zKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKCdlcnJvciBvY2N1cnJlZCBkdXJpbmcgY2hlY2tpbmcgcHJlY29uZGl0aW9uczogJywgZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZy5pbmZvKCdidWlsZGluZyBtZXRlb3IgYXBwJyk7XG5cbiAgICAgICAgaWYgKCF0aGlzLiQuZW52Lm9wdGlvbnMuc2tpcE1vYmlsZUJ1aWxkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYnVpbGRNb2JpbGVUYXJnZXQoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAocmVhc29uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RpbWVvdXQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RpbWVvdXQgd2hpbGUgYnVpbGRpbmcsIGxvZyBoYXMgYmVlbiB3cml0dGVuIHRvIG1ldGVvci5sb2cnXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWlsZCB3YXMgdGVybWluYXRlZCBieSBtZXRlb3ItZGVza3RvcCBhcyBzb21lIGVycm9ycyB3ZXJlIHJlcG9ydGVkIHRvIHN0ZGVyciwgeW91ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaG91bGQgc2VlIGl0IGFib3ZlLCBhbHNvIGNoZWNrIG1ldGVvci5sb2cgZm9yIG1vcmUgaW5mbywgdG8gaWdub3JlIGl0IHVzZSB0aGUgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0taWdub3JlLXN0ZGVyciBcIjxzdHJpbmc+XCInXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Vycm9ySW5BcHAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3lvdXIgbWV0ZW9yIGFwcCBoYXMgZXJyb3JzIC0gbG9vayBpbnRvIG1ldGVvci5sb2cgZm9yIG1vcmUnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGluZm8nXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3BvcnQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3lvdXIgcG9ydCAzMDgwIGlzIGN1cnJlbnRseSB1c2VkICh5b3UgcHJvYmFibHkgaGF2ZSB0aGlzIG9yIG90aGVyICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZXRlb3IgcHJvamVjdCBydW5uaW5nPyksIHVzZSBgLXRgIG9yIGAtLW1ldGVvci1wb3J0YCB0byB1c2UgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RpZmZlcmVudCBwb3J0IHdoaWxlIGJ1aWxkaW5nJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdleGl0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZXRlb3IgY21kIGV4aXRlZCB1bmV4cGVjdGVkbHksIGxvZyBoYXMgYmVlbiB3cml0dGVuIHRvIG1ldGVvci5sb2cnXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvcHknOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9yIGVuY291bnRlcmVkIHdoZW4gY29weWluZyB0aGUgYnVpbGQnXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGJ1aWxkaW5nIG1vYmlsZSB0YXJnZXQnLCByZWFzb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tb2JpbGVQbGF0Zm9ybSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZU1vYmlsZVBsYXRmb3JtKHRoaXMubW9iaWxlUGxhdGZvcm0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmluZGV4SFRNTHN0cmF0ZWd5ID0gdGhpcy5jaG9vc2VTdHJhdGVneSgpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvcHlCdWlsZCgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5qZWN0SXNEZXNrdG9wKCk7XG5cbiAgICAgICAgdGhpcy5jaGFuZ2VEZHBVcmwoKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wYWNrVG9Bc2FyKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKCdlcnJvciB3aGlsZSBwYWNraW5nIG1ldGVvciBhcHAgdG8gYXNhcicpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2cuaW5mbygnbWV0ZW9yIGJ1aWxkIGZpbmlzaGVkJyk7XG5cbiAgICAgICAgaWYgKHRoaXMubW9iaWxlUGxhdGZvcm0pIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlTW9iaWxlUGxhdGZvcm0odGhpcy5tb2JpbGVQbGF0Zm9ybSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjaGFuZ2VEZHBVcmwoKSB7XG4gICAgICAgIGlmICh0aGlzLiQuZW52Lm9wdGlvbnMuZGRwVXJsICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRGRwVXJsKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubWV0ZW9yQXBwSW5kZXgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGBlcnJvciB3aGlsZSB0cnlpbmcgdG8gY2hhbmdlIHRoZSBkZHAgdXJsOiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBhY2tUb0FzYXIoKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ3BhY2tpbmcgbWV0ZW9yIGFwcCB0byBhc2FyIGFyY2hpdmUnKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAgICAgICAgICBhc2FyLmNyZWF0ZVBhY2thZ2UoXG4gICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5tZXRlb3JBcHAsXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAucm9vdCwgJ21ldGVvci5hc2FyJylcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9uIFdpbmRvd3Mgc29tZSBmaWxlcyBtaWdodCBzdGlsbCBiZSBibG9ja2VkLiBHaXZpbmcgYSB0aWNrIGZvciB0aGVtIHRvIGJlXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlYWR5IGZvciBkZWxldGlvbi5cbiAgICAgICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLnZlcmJvc2UoJ2NsZWFyaW5nIG1ldGVvciBhcHAgYWZ0ZXIgcGFja2luZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kLnV0aWxzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJtV2l0aFJldHJpZXMoJy1yZicsIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubWV0ZW9yQXBwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdyYXBwZXIgZm9yIHNwYXduaW5nIG5wbS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSAgY29tbWFuZHMgLSBjb21tYW5kcyBmb3Igc3Bhd25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RkaW9cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY3dkXG4gICAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBydW5OcG0oY29tbWFuZHMsIHN0ZGlvID0gJ2lnbm9yZScsIGN3ZCA9IHRoaXMuJC5lbnYucGF0aHMubWV0ZW9yQXBwLnJvb3QpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nLnZlcmJvc2UoYGV4ZWN1dGluZyBtZXRlb3IgbnBtICR7Y29tbWFuZHMuam9pbignICcpfWApO1xuXG4gICAgICAgICAgICBzcGF3bignbWV0ZW9yJywgWyducG0nLCAuLi5jb21tYW5kc10sIHtcbiAgICAgICAgICAgICAgICBjd2QsXG4gICAgICAgICAgICAgICAgc3RkaW9cbiAgICAgICAgICAgIH0pLm9uKCdleGl0JywgY29kZSA9PiAoXG4gICAgICAgICAgICAgICAgKGNvZGUgPT09IDApID8gcmVzb2x2ZSgpIDogcmVqZWN0KG5ldyBFcnJvcihgbnBtIGV4aXQgY29kZSB3YXMgJHtjb2RlfWApKVxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOzs7O0FBYkE7QUFlQSxNQUFNO0VBQUVBO0FBQUYsSUFBV0Ms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 \ No newline at end of file diff --git a/dist/meteorManager.js b/dist/meteorManager.js deleted file mode 100644 index 098723b3..00000000 --- a/dist/meteorManager.js +++ /dev/null @@ -1,147 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; - -var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime")); - -var _fs = _interopRequireDefault(require("fs")); - -var _crossSpawn = _interopRequireDefault(require("cross-spawn")); - -var _log = _interopRequireDefault(require("./log")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -// eslint-disable-next-line no-unused-vars - -/** - * Utility class designed for managing Meteor packages. - * - * @property {MeteorDesktop} $ - * @class - */ -class MeteorManager { - /** - * @param {MeteorDesktop} $ - context - * @constructor - */ - constructor($) { - this.log = new _log.default('meteorManager'); - this.$ = $; - } - /** - * Looks for specified packages in .meteor/packages. In other words checks if the project has - * specified packages added. - * @param {Array} packages - * @returns {boolean} - */ - - - checkPackages(packages) { - const usedPackages = _fs.default.readFileSync(this.$.env.paths.meteorApp.packages, 'UTF-8').replace(/\r/gm, '').split('\n').filter(line => !line.trim().startsWith('#')); - - return !packages.some(packageToFind => !usedPackages.some(meteorPackage => ~meteorPackage.indexOf(packageToFind))); - } - /** - * Looks for specified packages in .meteor/packages. In other words checks if the project has - * specified packages added. - * @param {Array} packages - * @returns {boolean} - */ - - - checkPackagesVersion(packages) { - const usedPackages = _fs.default.readFileSync(this.$.env.paths.meteorApp.versions, 'UTF-8').replace(/\r/gm, '').split('\n'); - - return !packages.some(packageToFind => !usedPackages.some(meteorPackage => meteorPackage === packageToFind)); - } - /** - * Ensures certain packages are added to meteor project and in correct version. - * @param {Array} packages - * @param {Array} packagesWithVersion - * @param {string} who - name of the entity that requests presence of thos packages (can be the - * integration itself or a plugin) - * @returns {Promise.} - */ - - - async ensurePackages(packages, packagesWithVersion, who) { - if (!this.checkPackages(packages)) { - this.log.warn(`${who} requires some packages that are not added to project, will try to add them now`); - - try { - await this.addPackages(packages, packagesWithVersion); - } catch (e) { - throw new Error(e); - } - } - - if (!this.checkPackagesVersion(packagesWithVersion)) { - this.log.warn(`${who} required packages version is different, fixing it`); - - try { - await this.addPackages(packages, packagesWithVersion); - } catch (e) { - throw new Error(e); - } - } - } - /** - * Removes packages from the meteor app. - * @param {Array} packages - array with names of the packages to remove - */ - - - deletePackages(packages) { - this.log.warn('removing packages from meteor project', ...packages); - return new Promise((resolve, reject) => { - (0, _crossSpawn.default)('meteor', ['remove'].concat(packages), { - cwd: this.$.env.paths.meteorApp.root, - stdio: ['pipe', 'pipe', process.stderr], - env: Object.assign({ - METEOR_PRETTY_OUTPUT: 0, - METEOR_NO_RELEASE_CHECK: 1 - }, process.env) - }).on('exit', code => { - if (code !== 0 || this.checkPackages(packages)) { - reject('removing packages failed'); - } else { - resolve(); - } - }); - }); - } - /** - * Adds packages to the meteor app. - * @param {Array} packages - array with names of the packages to add - * @param {Array} packagesWithVersion - array with names and versions of the packages to add - */ - - - addPackages(packages, packagesWithVersion) { - this.log.info('adding packages to meteor project', ...packagesWithVersion); - return new Promise((resolve, reject) => { - (0, _crossSpawn.default)('meteor', ['add'].concat(packagesWithVersion.map(packageName => packageName.replace('@', '@='))), { - cwd: this.$.env.paths.meteorApp.root, - stdio: ['pipe', 'pipe', process.stderr], - env: Object.assign({ - METEOR_PRETTY_OUTPUT: 0, - METEOR_NO_RELEASE_CHECK: 1 - }, process.env) - }).on('exit', code => { - if (code !== 0 || !this.checkPackages(packages)) { - reject('adding packages failed'); - } else { - resolve(); - } - }); - }); - } - -} - -exports.default = MeteorManager; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNZXRlb3JNYW5hZ2VyIiwiY29uc3RydWN0b3IiLCIkIiwibG9nIiwiTG9nIiwiY2hlY2tQYWNrYWdlcyIsInBhY2thZ2VzIiwidXNlZFBhY2thZ2VzIiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJlbnYiLCJwYXRocyIsIm1ldGVvckFwcCIsInJlcGxhY2UiLCJzcGxpdCIsImZpbHRlciIsImxpbmUiLCJ0cmltIiwic3RhcnRzV2l0aCIsInNvbWUiLCJwYWNrYWdlVG9GaW5kIiwibWV0ZW9yUGFja2FnZSIsImluZGV4T2YiLCJjaGVja1BhY2thZ2VzVmVyc2lvbiIsInZlcnNpb25zIiwiZW5zdXJlUGFja2FnZXMiLCJwYWNrYWdlc1dpdGhWZXJzaW9uIiwid2hvIiwid2FybiIsImFkZFBhY2thZ2VzIiwiZSIsIkVycm9yIiwiZGVsZXRlUGFja2FnZXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNwYXduIiwiY29uY2F0IiwiY3dkIiwicm9vdCIsInN0ZGlvIiwicHJvY2VzcyIsInN0ZGVyciIsIk9iamVjdCIsImFzc2lnbiIsIk1FVEVPUl9QUkVUVFlfT1VUUFVUIiwiTUVURU9SX05PX1JFTEVBU0VfQ0hFQ0siLCJvbiIsImNvZGUiLCJpbmZvIiwibWFwIiwicGFja2FnZU5hbWUiXSwic291cmNlcyI6WyIuLi9saWIvbWV0ZW9yTWFuYWdlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmltcG9ydCByZWdlbmVyYXRvclJ1bnRpbWUgZnJvbSAncmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgc3Bhd24gZnJvbSAnY3Jvc3Mtc3Bhd24nO1xuXG5pbXBvcnQgTG9nIGZyb20gJy4vbG9nJztcblxuLyoqXG4gKiBVdGlsaXR5IGNsYXNzIGRlc2lnbmVkIGZvciBtYW5hZ2luZyBNZXRlb3IgcGFja2FnZXMuXG4gKlxuICogQHByb3BlcnR5IHtNZXRlb3JEZXNrdG9wfSAkXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWV0ZW9yTWFuYWdlciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNZXRlb3JEZXNrdG9wfSAkIC0gY29udGV4dFxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCQpIHtcbiAgICAgICAgdGhpcy5sb2cgPSBuZXcgTG9nKCdtZXRlb3JNYW5hZ2VyJyk7XG4gICAgICAgIHRoaXMuJCA9ICQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9va3MgZm9yIHNwZWNpZmllZCBwYWNrYWdlcyBpbiAubWV0ZW9yL3BhY2thZ2VzLiBJbiBvdGhlciB3b3JkcyBjaGVja3MgaWYgdGhlIHByb2plY3QgaGFzXG4gICAgICogc3BlY2lmaWVkIHBhY2thZ2VzIGFkZGVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhY2thZ2VzXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgY2hlY2tQYWNrYWdlcyhwYWNrYWdlcykge1xuICAgICAgICBjb25zdCB1c2VkUGFja2FnZXMgPSBmc1xuICAgICAgICAgICAgLnJlYWRGaWxlU3luYyh0aGlzLiQuZW52LnBhdGhzLm1ldGVvckFwcC5wYWNrYWdlcywgJ1VURi04JylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXHIvZ20sICcnKVxuICAgICAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAgICAgLmZpbHRlcihsaW5lID0+ICFsaW5lLnRyaW0oKS5zdGFydHNXaXRoKCcjJykpO1xuICAgICAgICByZXR1cm4gIXBhY2thZ2VzLnNvbWUoXG4gICAgICAgICAgICBwYWNrYWdlVG9GaW5kID0+XG4gICAgICAgICAgICAgICAgIXVzZWRQYWNrYWdlcy5zb21lKG1ldGVvclBhY2thZ2UgPT4gfm1ldGVvclBhY2thZ2UuaW5kZXhPZihwYWNrYWdlVG9GaW5kKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb29rcyBmb3Igc3BlY2lmaWVkIHBhY2thZ2VzIGluIC5tZXRlb3IvcGFja2FnZXMuIEluIG90aGVyIHdvcmRzIGNoZWNrcyBpZiB0aGUgcHJvamVjdCBoYXNcbiAgICAgKiBzcGVjaWZpZWQgcGFja2FnZXMgYWRkZWQuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFja2FnZXNcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBjaGVja1BhY2thZ2VzVmVyc2lvbihwYWNrYWdlcykge1xuICAgICAgICBjb25zdCB1c2VkUGFja2FnZXMgPSBmcy5yZWFkRmlsZVN5bmModGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHAudmVyc2lvbnMsICdVVEYtOCcpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxyL2dtLCAnJylcbiAgICAgICAgICAgIC5zcGxpdCgnXFxuJyk7XG4gICAgICAgIHJldHVybiAhcGFja2FnZXMuc29tZShcbiAgICAgICAgICAgIHBhY2thZ2VUb0ZpbmQgPT4gIXVzZWRQYWNrYWdlcy5zb21lKG1ldGVvclBhY2thZ2UgPT4gbWV0ZW9yUGFja2FnZSA9PT0gcGFja2FnZVRvRmluZClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbnN1cmVzIGNlcnRhaW4gcGFja2FnZXMgYXJlIGFkZGVkIHRvIG1ldGVvciBwcm9qZWN0IGFuZCBpbiBjb3JyZWN0IHZlcnNpb24uXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFja2FnZXNcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWNrYWdlc1dpdGhWZXJzaW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHdobyAtIG5hbWUgb2YgdGhlIGVudGl0eSB0aGF0IHJlcXVlc3RzIHByZXNlbmNlIG9mIHRob3MgcGFja2FnZXMgKGNhbiBiZSB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdyYXRpb24gaXRzZWxmIG9yIGEgcGx1Z2luKVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlLjx2b2lkPn1cbiAgICAgKi9cbiAgICBhc3luYyBlbnN1cmVQYWNrYWdlcyhwYWNrYWdlcywgcGFja2FnZXNXaXRoVmVyc2lvbiwgd2hvKSB7XG4gICAgICAgIGlmICghdGhpcy5jaGVja1BhY2thZ2VzKHBhY2thZ2VzKSkge1xuICAgICAgICAgICAgdGhpcy5sb2cud2FybihgJHt3aG99IHJlcXVpcmVzIHNvbWUgcGFja2FnZXMgdGhhdCBhcmUgbm90IGFkZGVkIHRvIHByb2plY3QsIHdpbGwgdHJ5IHRvIGFkZCB0aGVtIG5vd2ApO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFkZFBhY2thZ2VzKHBhY2thZ2VzLCBwYWNrYWdlc1dpdGhWZXJzaW9uKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrUGFja2FnZXNWZXJzaW9uKHBhY2thZ2VzV2l0aFZlcnNpb24pKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy53YXJuKGAke3dob30gcmVxdWlyZWQgcGFja2FnZXMgdmVyc2lvbiBpcyBkaWZmZXJlbnQsIGZpeGluZyBpdGApO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFkZFBhY2thZ2VzKHBhY2thZ2VzLCBwYWNrYWdlc1dpdGhWZXJzaW9uKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHBhY2thZ2VzIGZyb20gdGhlIG1ldGVvciBhcHAuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFja2FnZXMgICAgICAgICAgICAtIGFycmF5IHdpdGggbmFtZXMgb2YgdGhlIHBhY2thZ2VzIHRvIHJlbW92ZVxuICAgICAqL1xuICAgIGRlbGV0ZVBhY2thZ2VzKHBhY2thZ2VzKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oJ3JlbW92aW5nIHBhY2thZ2VzIGZyb20gbWV0ZW9yIHByb2plY3QnLCAuLi5wYWNrYWdlcyk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBzcGF3bihcbiAgICAgICAgICAgICAgICAnbWV0ZW9yJyxcbiAgICAgICAgICAgICAgICBbJ3JlbW92ZSddLmNvbmNhdChwYWNrYWdlcyksIHtcbiAgICAgICAgICAgICAgICAgICAgY3dkOiB0aGlzLiQuZW52LnBhdGhzLm1ldGVvckFwcC5yb290LFxuICAgICAgICAgICAgICAgICAgICBzdGRpbzogWydwaXBlJywgJ3BpcGUnLCBwcm9jZXNzLnN0ZGVycl0sXG4gICAgICAgICAgICAgICAgICAgIGVudjogT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgTUVURU9SX1BSRVRUWV9PVVRQVVQ6IDAsIE1FVEVPUl9OT19SRUxFQVNFX0NIRUNLOiAxIH0sIHByb2Nlc3MuZW52XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLm9uKCdleGl0JywgKGNvZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSAhPT0gMCB8fCB0aGlzLmNoZWNrUGFja2FnZXMocGFja2FnZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgncmVtb3ZpbmcgcGFja2FnZXMgZmFpbGVkJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIHBhY2thZ2VzIHRvIHRoZSBtZXRlb3IgYXBwLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhY2thZ2VzICAgICAgICAgICAgLSBhcnJheSB3aXRoIG5hbWVzIG9mIHRoZSBwYWNrYWdlcyB0byBhZGRcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWNrYWdlc1dpdGhWZXJzaW9uIC0gYXJyYXkgd2l0aCBuYW1lcyBhbmQgdmVyc2lvbnMgb2YgdGhlIHBhY2thZ2VzIHRvIGFkZFxuICAgICAqL1xuICAgIGFkZFBhY2thZ2VzKHBhY2thZ2VzLCBwYWNrYWdlc1dpdGhWZXJzaW9uKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ2FkZGluZyBwYWNrYWdlcyB0byBtZXRlb3IgcHJvamVjdCcsIC4uLnBhY2thZ2VzV2l0aFZlcnNpb24pO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgc3Bhd24oXG4gICAgICAgICAgICAgICAgJ21ldGVvcicsXG4gICAgICAgICAgICAgICAgWydhZGQnXS5jb25jYXQoXG4gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzV2l0aFZlcnNpb24ubWFwKHBhY2thZ2VOYW1lID0+IHBhY2thZ2VOYW1lLnJlcGxhY2UoJ0AnLCAnQD0nKSlcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY3dkOiB0aGlzLiQuZW52LnBhdGhzLm1ldGVvckFwcC5yb290LFxuICAgICAgICAgICAgICAgICAgICBzdGRpbzogWydwaXBlJywgJ3BpcGUnLCBwcm9jZXNzLnN0ZGVycl0sXG4gICAgICAgICAgICAgICAgICAgIGVudjogT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgTUVURU9SX1BSRVRUWV9PVVRQVVQ6IDAsIE1FVEVPUl9OT19SRUxFQVNFX0NIRUNLOiAxIH0sIHByb2Nlc3MuZW52XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLm9uKCdleGl0JywgKGNvZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSAhPT0gMCB8fCAhdGhpcy5jaGVja1BhY2thZ2VzKHBhY2thZ2VzKSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoJ2FkZGluZyBwYWNrYWdlcyBmYWlsZWQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUNBOztBQUNBOztBQUNBOztBQUVBOzs7O0FBTEE7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2UsTUFBTUEsYUFBTixDQUFvQjtFQUMvQjtBQUNKO0FBQ0E7QUFDQTtFQUNJQyxXQUFXLENBQUNDLENBQUQsRUFBSTtJQUNYLEtBQUtDLEdBQUwsR0FBVyxJQUFJQyxZQUFKLENBQVEsZUFBUixDQUFYO0lBQ0EsS0FBS0YsQ0FBTCxHQUFTQSxDQUFUO0VBQ0g7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztFQUNJRyxhQUFhLENBQUNDLFFBQUQsRUFBVztJQUNwQixNQUFNQyxZQUFZLEdBQUdDLFdBQUEsQ0FDaEJDLFlBRGdCLENBQ0gsS0FBS1AsQ0FBTCxDQUFPUSxHQUFQLENBQVdDLEtBQVgsQ0FBaUJDLFNBQWpCLENBQTJCTixRQUR4QixFQUNrQyxPQURsQyxFQUVoQk8sT0FGZ0IsQ0FFUixNQUZRLEVBRUEsRUFGQSxFQUdoQkMsS0FIZ0IsQ0FHVixJQUhVLEVBSWhCQyxNQUpnQixDQUlUQyxJQUFJLElBQUksQ0FBQ0EsSUFBSSxDQUFDQyxJQUFMLEdBQVlDLFVBQVosQ0FBdUIsR0FBdkIsQ0FKQSxDQUFyQjs7SUFLQSxPQUFPLENBQUNaLFFBQVEsQ0FBQ2EsSUFBVCxDQUNKQyxhQUFhLElBQ1QsQ0FBQ2IsWUFBWSxDQUFDWSxJQUFiLENBQWtCRSxhQUFhLElBQUksQ0FBQ0EsYUFBYSxDQUFDQyxPQUFkLENBQXNCRixhQUF0QixDQUFwQyxDQUZELENBQVI7RUFJSDtFQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0VBQ0lHLG9CQUFvQixDQUFDakIsUUFBRCxFQUFXO0lBQzNCLE1BQU1DLFlBQVksR0FBR0MsV0FBQSxDQUFHQyxZQUFILENBQWdCLEtBQUtQLENBQUwsQ0FBT1EsR0FBUCxDQUFXQyxLQUFYLENBQWlCQyxTQUFqQixDQUEyQlksUUFBM0MsRUFBcUQsT0FBckQsRUFDaEJYLE9BRGdCLENBQ1IsTUFEUSxFQUNBLEVBREEsRUFFaEJDLEtBRmdCLENBRVYsSUFGVSxDQUFyQjs7SUFHQSxPQUFPLENBQUNSLFFBQVEsQ0FBQ2EsSUFBVCxDQUNKQyxhQUFhLElBQUksQ0FBQ2IsWUFBWSxDQUFDWSxJQUFiLENBQWtCRSxhQUFhLElBQUlBLGFBQWEsS0FBS0QsYUFBckQsQ0FEZCxDQUFSO0VBR0g7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7RUFDd0IsTUFBZEssY0FBYyxDQUFDbkIsUUFBRCxFQUFXb0IsbUJBQVgsRUFBZ0NDLEdBQWhDLEVBQXFDO0lBQ3JELElBQUksQ0FBQyxLQUFLdEIsYUFBTCxDQUFtQkMsUUFBbkIsQ0FBTCxFQUFtQztNQUMvQixLQUFLSCxHQUFMLENBQVN5QixJQUFULENBQWUsR0FBRUQsR0FBSSxpRkFBckI7O01BQ0EsSUFBSTtRQUNBLE1BQU0sS0FBS0UsV0FBTCxDQUFpQnZCLFFBQWpCLEVBQTJCb0IsbUJBQTNCLENBQU47TUFDSCxDQUZELENBRUUsT0FBT0ksQ0FBUCxFQUFVO1FBQ1IsTUFBTSxJQUFJQyxLQUFKLENBQVVELENBQVYsQ0FBTjtNQUNIO0lBQ0o7O0lBQ0QsSUFBSSxDQUFDLEtBQUtQLG9CQUFMLENBQTBCRyxtQkFBMUIsQ0FBTCxFQUFxRDtNQUNqRCxLQUFLdkIsR0FBTCxDQUFTeUIsSUFBVCxDQUFlLEdBQUVELEdBQUksb0RBQXJCOztNQUNBLElBQUk7UUFDQSxNQUFNLEtBQUtFLFdBQUwsQ0FBaUJ2QixRQUFqQixFQUEyQm9CLG1CQUEzQixDQUFOO01BQ0gsQ0FGRCxDQUVFLE9BQU9JLENBQVAsRUFBVTtRQUNSLE1BQU0sSUFBSUMsS0FBSixDQUFVRCxDQUFWLENBQU47TUFDSDtJQUNKO0VBQ0o7RUFFRDtBQUNKO0FBQ0E7QUFDQTs7O0VBQ0lFLGNBQWMsQ0FBQzFCLFFBQUQsRUFBVztJQUNyQixLQUFLSCxHQUFMLENBQVN5QixJQUFULENBQWMsdUNBQWQsRUFBdUQsR0FBR3RCLFFBQTFEO0lBQ0EsT0FBTyxJQUFJMkIsT0FBSixDQUFZLENBQUNDLE9BQUQsRUFBVUMsTUFBVixLQUFxQjtNQUNwQyxJQUFBQyxtQkFBQSxFQUNJLFFBREosRUFFSSxDQUFDLFFBQUQsRUFBV0MsTUFBWCxDQUFrQi9CLFFBQWxCLENBRkosRUFFaUM7UUFDekJnQyxHQUFHLEVBQUUsS0FBS3BDLENBQUwsQ0FBT1EsR0FBUCxDQUFXQyxLQUFYLENBQWlCQyxTQUFqQixDQUEyQjJCLElBRFA7UUFFekJDLEtBQUssRUFBRSxDQUFDLE1BQUQsRUFBUyxNQUFULEVBQWlCQyxPQUFPLENBQUNDLE1BQXpCLENBRmtCO1FBR3pCaEMsR0FBRyxFQUFFaUMsTUFBTSxDQUFDQyxNQUFQLENBQ0Q7VUFBRUMsb0JBQW9CLEVBQUUsQ0FBeEI7VUFBMkJDLHVCQUF1QixFQUFFO1FBQXBELENBREMsRUFDd0RMLE9BQU8sQ0FBQy9CLEdBRGhFO01BSG9CLENBRmpDLEVBU0VxQyxFQVRGLENBU0ssTUFUTCxFQVNjQyxJQUFELElBQVU7UUFDbkIsSUFBSUEsSUFBSSxLQUFLLENBQVQsSUFBYyxLQUFLM0MsYUFBTCxDQUFtQkMsUUFBbkIsQ0FBbEIsRUFBZ0Q7VUFDNUM2QixNQUFNLENBQUMsMEJBQUQsQ0FBTjtRQUNILENBRkQsTUFFTztVQUNIRCxPQUFPO1FBQ1Y7TUFDSixDQWZEO0lBZ0JILENBakJNLENBQVA7RUFrQkg7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBOzs7RUFDSUwsV0FBVyxDQUFDdkIsUUFBRCxFQUFXb0IsbUJBQVgsRUFBZ0M7SUFDdkMsS0FBS3ZCLEdBQUwsQ0FBUzhDLElBQVQsQ0FBYyxtQ0FBZCxFQUFtRCxHQUFHdkIsbUJBQXREO0lBQ0EsT0FBTyxJQUFJTyxPQUFKLENBQVksQ0FBQ0MsT0FBRCxFQUFVQyxNQUFWLEtBQXFCO01BQ3BDLElBQUFDLG1CQUFBLEVBQ0ksUUFESixFQUVJLENBQUMsS0FBRCxFQUFRQyxNQUFSLENBQ0lYLG1CQUFtQixDQUFDd0IsR0FBcEIsQ0FBd0JDLFdBQVcsSUFBSUEsV0FBVyxDQUFDdEMsT0FBWixDQUFvQixHQUFwQixFQUF5QixJQUF6QixDQUF2QyxDQURKLENBRkosRUFLSTtRQUNJeUIsR0FBRyxFQUFFLEtBQUtwQyxDQUFMLENBQU9RLEdBQVAsQ0FBV0MsS0FBWCxDQUFpQkMsU0FBakIsQ0FBMkIyQixJQURwQztRQUVJQyxLQUFLLEVBQUUsQ0FBQyxNQUFELEVBQVMsTUFBVCxFQUFpQkMsT0FBTyxDQUFDQyxNQUF6QixDQUZYO1FBR0loQyxHQUFHLEVBQUVpQyxNQUFNLENBQUNDLE1BQVAsQ0FDRDtVQUFFQyxvQkFBb0IsRUFBRSxDQUF4QjtVQUEyQkMsdUJBQXVCLEVBQUU7UUFBcEQsQ0FEQyxFQUN3REwsT0FBTyxDQUFDL0IsR0FEaEU7TUFIVCxDQUxKLEVBWUVxQyxFQVpGLENBWUssTUFaTCxFQVljQyxJQUFELElBQVU7UUFDbkIsSUFBSUEsSUFBSSxLQUFLLENBQVQsSUFBYyxDQUFDLEtBQUszQyxhQUFMLENBQW1CQyxRQUFuQixDQUFuQixFQUFpRDtVQUM3QzZCLE1BQU0sQ0FBQyx3QkFBRCxDQUFOO1FBQ0gsQ0FGRCxNQUVPO1VBQ0hELE9BQU87UUFDVjtNQUNKLENBbEJEO0lBbUJILENBcEJNLENBQVA7RUFxQkg7O0FBNUg4QiJ9 \ No newline at end of file diff --git a/dist/packager.js b/dist/packager.js deleted file mode 100644 index 5dc2f01f..00000000 --- a/dist/packager.js +++ /dev/null @@ -1,142 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; - -var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime")); - -var _assignIn = _interopRequireDefault(require("lodash/assignIn")); - -var _path = _interopRequireDefault(require("path")); - -var _fs = _interopRequireDefault(require("fs")); - -var _shelljs = _interopRequireDefault(require("shelljs")); - -var _log = _interopRequireDefault(require("./log")); - -var _defaultDependencies = _interopRequireDefault(require("./defaultDependencies")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -// eslint-disable-next-line no-unused-vars -const { - join -} = _path.default; -/** - * Wrapper around electron-packager. - * @class - */ - -class ElectronPackager { - constructor($) { - this.log = new _log.default('electron-packager'); - this.$ = $; - } - - async init() { - this.packager = (await this.$.getDependency('electron-packager', _defaultDependencies.default['electron-packager'])).dependency; - } - /** - * Runs the packager with provided arguments. - * - * @param {Object} args - * @returns {Promise} - */ - - - runPackager(args) { - return new Promise((resolve, reject) => { - this.packager(args, err => { - if (err) { - reject(err); - } else { - this.log.info(`wrote packaged app to ${this.$.env.paths.packageDir}`); - resolve(); - } - }); - }); - } - - async packageApp() { - const { - version - } = JSON.parse(_fs.default.readFileSync(join(this.$.env.paths.meteorApp.root, 'node_modules', 'electron', 'package.json'), 'UTF-8')); - const settings = this.$.desktop.getSettings(); - const { - name - } = settings; - - if (!name) { - this.log.error('`name` field in settings.json not set'); - process.exit(1); - } - - const arch = this.$.env.options.ia32 ? 'ia32' : 'x64'; - this.log.info(`packaging '${name}' for platform '${this.$.env.sys.platform}-${arch}'` + ` using electron v${version}`); - - try { - await this.$.utils.rmWithRetries('-rf', _path.default.join(this.$.env.options.output, this.$.env.paths.packageDir)); - } catch (e) { - throw new Error(e); - } - - const args = { - name, - arch, - prune: false, - electronVersion: version, - platform: this.$.env.sys.platform, - dir: this.$.env.paths.electronApp.root, - out: _path.default.join(this.$.env.options.output, this.$.env.paths.packageDir) - }; - - if ('packagerOptions' in settings) { - const { - packagerOptions - } = settings; - ['windows', 'linux', 'osx'].forEach(system => { - if (this.$.env.os[`is${system[0].toUpperCase()}${system.substring(1)}`] && `_${system}` in packagerOptions) { - (0, _assignIn.default)(packagerOptions, packagerOptions[`_${system}`]); - } - }); - Object.keys(packagerOptions).forEach(field => { - if (packagerOptions[field] === '@version') { - packagerOptions[field] = settings.version; - } - }); - (0, _assignIn.default)(args, packagerOptions); - } // Move node_modules away. We do not want to delete it, just temporarily remove it from - // our way. - - - _fs.default.renameSync(this.$.env.paths.electronApp.nodeModules, this.$.env.paths.electronApp.tmpNodeModules); - - let extracted = false; - - if (this.$.utils.exists(this.$.env.paths.electronApp.extractedNodeModules)) { - _fs.default.renameSync(this.$.env.paths.electronApp.extractedNodeModules, this.$.env.paths.electronApp.nodeModules); - - extracted = true; - } - - try { - await this.runPackager(args); - } finally { - if (extracted) { - _shelljs.default.rm('-rf', this.$.env.paths.electronApp.extractedNodeModules); - - _shelljs.default.rm('-rf', this.$.env.paths.electronApp.nodeModules); - } // Move node_modules back. - - - _fs.default.renameSync(this.$.env.paths.electronApp.tmpNodeModules, this.$.env.paths.electronApp.nodeModules); - } - } - -} - -exports.default = ElectronPackager; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJqb2luIiwicGF0aCIsIkVsZWN0cm9uUGFja2FnZXIiLCJjb25zdHJ1Y3RvciIsIiQiLCJsb2ciLCJMb2ciLCJpbml0IiwicGFja2FnZXIiLCJnZXREZXBlbmRlbmN5IiwiZGVmYXVsdERlcGVuZGVuY2llcyIsImRlcGVuZGVuY3kiLCJydW5QYWNrYWdlciIsImFyZ3MiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImVyciIsImluZm8iLCJlbnYiLCJwYXRocyIsInBhY2thZ2VEaXIiLCJwYWNrYWdlQXBwIiwidmVyc2lvbiIsIkpTT04iLCJwYXJzZSIsImZzIiwicmVhZEZpbGVTeW5jIiwibWV0ZW9yQXBwIiwicm9vdCIsInNldHRpbmdzIiwiZGVza3RvcCIsImdldFNldHRpbmdzIiwibmFtZSIsImVycm9yIiwicHJvY2VzcyIsImV4aXQiLCJhcmNoIiwib3B0aW9ucyIsImlhMzIiLCJzeXMiLCJwbGF0Zm9ybSIsInV0aWxzIiwicm1XaXRoUmV0cmllcyIsIm91dHB1dCIsImUiLCJFcnJvciIsInBydW5lIiwiZWxlY3Ryb25WZXJzaW9uIiwiZGlyIiwiZWxlY3Ryb25BcHAiLCJvdXQiLCJwYWNrYWdlck9wdGlvbnMiLCJmb3JFYWNoIiwic3lzdGVtIiwib3MiLCJ0b1VwcGVyQ2FzZSIsInN1YnN0cmluZyIsImFzc2lnbkluIiwiT2JqZWN0Iiwia2V5cyIsImZpZWxkIiwicmVuYW1lU3luYyIsIm5vZGVNb2R1bGVzIiwidG1wTm9kZU1vZHVsZXMiLCJleHRyYWN0ZWQiLCJleGlzdHMiLCJleHRyYWN0ZWROb2RlTW9kdWxlcyIsInNoZWxsIiwicm0iXSwic291cmNlcyI6WyIuLi9saWIvcGFja2FnZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5pbXBvcnQgcmVnZW5lcmF0b3JSdW50aW1lIGZyb20gJ3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZSc7XG5pbXBvcnQgYXNzaWduSW4gZnJvbSAnbG9kYXNoL2Fzc2lnbkluJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBzaGVsbCBmcm9tICdzaGVsbGpzJztcblxuaW1wb3J0IExvZyBmcm9tICcuL2xvZyc7XG5pbXBvcnQgZGVmYXVsdERlcGVuZGVuY2llcyBmcm9tICcuL2RlZmF1bHREZXBlbmRlbmNpZXMnO1xuXG5jb25zdCB7IGpvaW4gfSA9IHBhdGg7XG5cbi8qKlxuICogV3JhcHBlciBhcm91bmQgZWxlY3Ryb24tcGFja2FnZXIuXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWxlY3Ryb25QYWNrYWdlciB7XG4gICAgY29uc3RydWN0b3IoJCkge1xuICAgICAgICB0aGlzLmxvZyA9IG5ldyBMb2coJ2VsZWN0cm9uLXBhY2thZ2VyJyk7XG4gICAgICAgIHRoaXMuJCA9ICQ7XG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdCgpIHtcbiAgICAgICAgdGhpcy5wYWNrYWdlciA9IChhd2FpdCB0aGlzLiQuZ2V0RGVwZW5kZW5jeSgnZWxlY3Ryb24tcGFja2FnZXInLCBkZWZhdWx0RGVwZW5kZW5jaWVzWydlbGVjdHJvbi1wYWNrYWdlciddKSkuZGVwZW5kZW5jeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSdW5zIHRoZSBwYWNrYWdlciB3aXRoIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgcnVuUGFja2FnZXIoYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYWNrYWdlcihhcmdzLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZy5pbmZvKGB3cm90ZSBwYWNrYWdlZCBhcHAgdG8gJHt0aGlzLiQuZW52LnBhdGhzLnBhY2thZ2VEaXJ9YCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcGFja2FnZUFwcCgpIHtcbiAgICAgICAgY29uc3QgeyB2ZXJzaW9uIH0gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgIGpvaW4oXG4gICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHAucm9vdCxcbiAgICAgICAgICAgICAgICAnbm9kZV9tb2R1bGVzJyxcbiAgICAgICAgICAgICAgICAnZWxlY3Ryb24nLFxuICAgICAgICAgICAgICAgICdwYWNrYWdlLmpzb24nXG4gICAgICAgICAgICApLCAnVVRGLTgnXG4gICAgICAgICkpO1xuXG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy4kLmRlc2t0b3AuZ2V0U2V0dGluZ3MoKTtcbiAgICAgICAgY29uc3QgeyBuYW1lIH0gPSBzZXR0aW5ncztcbiAgICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignYG5hbWVgIGZpZWxkIGluIHNldHRpbmdzLmpzb24gbm90IHNldCcpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXJjaCA9IHRoaXMuJC5lbnYub3B0aW9ucy5pYTMyID8gJ2lhMzInIDogJ3g2NCc7XG5cbiAgICAgICAgdGhpcy5sb2cuaW5mbyhcbiAgICAgICAgICAgIGBwYWNrYWdpbmcgJyR7bmFtZX0nIGZvciBwbGF0Zm9ybSAnJHt0aGlzLiQuZW52LnN5cy5wbGF0Zm9ybX0tJHthcmNofSdgICtcbiAgICAgICAgICAgIGAgdXNpbmcgZWxlY3Ryb24gdiR7dmVyc2lvbn1gXG4gICAgICAgICk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuJC51dGlscy5ybVdpdGhSZXRyaWVzKFxuICAgICAgICAgICAgICAgICctcmYnLCBwYXRoLmpvaW4odGhpcy4kLmVudi5vcHRpb25zLm91dHB1dCwgdGhpcy4kLmVudi5wYXRocy5wYWNrYWdlRGlyKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXJncyA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBhcmNoLFxuICAgICAgICAgICAgcHJ1bmU6IGZhbHNlLFxuICAgICAgICAgICAgZWxlY3Ryb25WZXJzaW9uOiB2ZXJzaW9uLFxuICAgICAgICAgICAgcGxhdGZvcm06IHRoaXMuJC5lbnYuc3lzLnBsYXRmb3JtLFxuICAgICAgICAgICAgZGlyOiB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnJvb3QsXG4gICAgICAgICAgICBvdXQ6IHBhdGguam9pbih0aGlzLiQuZW52Lm9wdGlvbnMub3V0cHV0LCB0aGlzLiQuZW52LnBhdGhzLnBhY2thZ2VEaXIpXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCdwYWNrYWdlck9wdGlvbnMnIGluIHNldHRpbmdzKSB7XG4gICAgICAgICAgICBjb25zdCB7IHBhY2thZ2VyT3B0aW9ucyB9ID0gc2V0dGluZ3M7XG5cbiAgICAgICAgICAgIFsnd2luZG93cycsICdsaW51eCcsICdvc3gnXS5mb3JFYWNoKChzeXN0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJC5lbnYub3NbYGlzJHtzeXN0ZW1bMF0udG9VcHBlckNhc2UoKX0ke3N5c3RlbS5zdWJzdHJpbmcoMSl9YF0gJiZcbiAgICAgICAgICAgICAgICAgICAgKGBfJHtzeXN0ZW19YCkgaW4gcGFja2FnZXJPcHRpb25zXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGFzc2lnbkluKHBhY2thZ2VyT3B0aW9ucywgcGFja2FnZXJPcHRpb25zW2BfJHtzeXN0ZW19YF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhwYWNrYWdlck9wdGlvbnMpLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VyT3B0aW9uc1tmaWVsZF0gPT09ICdAdmVyc2lvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFja2FnZXJPcHRpb25zW2ZpZWxkXSA9IHNldHRpbmdzLnZlcnNpb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGFzc2lnbkluKGFyZ3MsIHBhY2thZ2VyT3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNb3ZlIG5vZGVfbW9kdWxlcyBhd2F5LiBXZSBkbyBub3Qgd2FudCB0byBkZWxldGUgaXQsIGp1c3QgdGVtcG9yYXJpbHkgcmVtb3ZlIGl0IGZyb21cbiAgICAgICAgLy8gb3VyIHdheS5cbiAgICAgICAgZnMucmVuYW1lU3luYyhcbiAgICAgICAgICAgIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubm9kZU1vZHVsZXMsXG4gICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnRtcE5vZGVNb2R1bGVzXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IGV4dHJhY3RlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLiQudXRpbHMuZXhpc3RzKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuZXh0cmFjdGVkTm9kZU1vZHVsZXMpKSB7XG4gICAgICAgICAgICBmcy5yZW5hbWVTeW5jKFxuICAgICAgICAgICAgICAgIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuZXh0cmFjdGVkTm9kZU1vZHVsZXMsXG4gICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5ub2RlTW9kdWxlc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGV4dHJhY3RlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW5QYWNrYWdlcihhcmdzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChleHRyYWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBzaGVsbC5ybSgnLXJmJywgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5leHRyYWN0ZWROb2RlTW9kdWxlcyk7XG4gICAgICAgICAgICAgICAgc2hlbGwucm0oJy1yZicsIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubm9kZU1vZHVsZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTW92ZSBub2RlX21vZHVsZXMgYmFjay5cbiAgICAgICAgICAgIGZzLnJlbmFtZVN5bmMoXG4gICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC50bXBOb2RlTW9kdWxlcyxcbiAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLm5vZGVNb2R1bGVzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7Ozs7QUFSQTtBQVVBLE1BQU07RUFBRUE7QUFBRixJQUFXQyxhQUFqQjtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUNlLE1BQU1DLGdCQUFOLENBQXVCO0VBQ2xDQyxXQUFXLENBQUNDLENBQUQsRUFBSTtJQUNYLEtBQUtDLEdBQUwsR0FBVyxJQUFJQyxZQUFKLENBQVEsbUJB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 \ No newline at end of file diff --git a/dist/scripts/addToScripts.js b/dist/scripts/addToScripts.js deleted file mode 100644 index aa8d2507..00000000 --- a/dist/scripts/addToScripts.js +++ /dev/null @@ -1,24 +0,0 @@ -"use strict"; - -var _path = _interopRequireDefault(require("path")); - -var _addScript = _interopRequireDefault(require("./utils/addScript")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/* eslint-disable no-console */ - -/** - * This script adds a 'desktop' entry to 'scripts' in package.json. If the entry already exists - * it leaves it untouched. - */ -function fail() { - console.error('[meteor-desktop] failed to add meteor-desktop to your package.json scripts, ' + 'please add it manually as \'desktop\': \'meteor-desktop\''); - process.exit(0); -} - -const packageJsonPath = _path.default.resolve(_path.default.join(__dirname, '..', '..', '..', '..', 'package.json')); - -(0, _addScript.default)('desktop', 'meteor-desktop', packageJsonPath, fail); -console.log('[meteor-desktop] successfully added a \'desktop\' entry to your package.json' + ' scripts section.'); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmYWlsIiwiY29uc29sZSIsImVycm9yIiwicHJvY2VzcyIsImV4aXQiLCJwYWNrYWdlSnNvblBhdGgiLCJwYXRoIiwicmVzb2x2ZSIsImpvaW4iLCJfX2Rpcm5hbWUiLCJhZGRTY3JpcHQiLCJsb2ciXSwic291cmNlcyI6WyIuLi8uLi9saWIvc2NyaXB0cy9hZGRUb1NjcmlwdHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCBhZGRTY3JpcHQgZnJvbSAnLi91dGlscy9hZGRTY3JpcHQnO1xuLyoqXG4gKiBUaGlzIHNjcmlwdCBhZGRzIGEgJ2Rlc2t0b3AnIGVudHJ5IHRvICdzY3JpcHRzJyBpbiBwYWNrYWdlLmpzb24uIElmIHRoZSBlbnRyeSBhbHJlYWR5IGV4aXN0c1xuICogaXQgbGVhdmVzIGl0IHVudG91Y2hlZC5cbiAqL1xuZnVuY3Rpb24gZmFpbCgpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbbWV0ZW9yLWRlc2t0b3BdIGZhaWxlZCB0byBhZGQgbWV0ZW9yLWRlc2t0b3AgdG8geW91ciBwYWNrYWdlLmpzb24gc2NyaXB0cywgJyArXG4gICAgICAgICdwbGVhc2UgYWRkIGl0IG1hbnVhbGx5IGFzIFxcJ2Rlc2t0b3BcXCc6IFxcJ21ldGVvci1kZXNrdG9wXFwnJyk7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xufVxuXG5jb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpXG4pO1xuXG5hZGRTY3JpcHQoJ2Rlc2t0b3AnLCAnbWV0ZW9yLWRlc2t0b3AnLCBwYWNrYWdlSnNvblBhdGgsIGZhaWwpO1xuXG5jb25zb2xlLmxvZygnW21ldGVvci1kZXNrdG9wXSBzdWNjZXNzZnVsbHkgYWRkZWQgYSBcXCdkZXNrdG9wXFwnIGVudHJ5IHRvIHlvdXIgcGFja2FnZS5qc29uJyArXG4gICAgJyBzY3JpcHRzIHNlY3Rpb24uJyk7XG4iXSwibWFwcGluZ3MiOiI7O0FBQ0E7O0FBRUE7Ozs7QUFIQTs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLElBQVQsR0FBZ0I7RUFDWkMsT0FBTyxDQUFDQyxLQUFSLENBQWMsaUZBQ1YsMkRBREo7RUFFQUMsT0FBTyxDQUFDQyxJQUFSLENBQWEsQ0FBYjtBQUNIOztBQUVELE1BQU1DLGVBQWUsR0FBR0MsYUFBQSxDQUFLQyxPQUFMLENBQ3BCRCxhQUFBLENBQUtFLElBQUwsQ0FBVUMsU0FBVixFQUFxQixJQUFyQixFQUEyQixJQUEzQixFQUFpQyxJQUFqQyxFQUF1QyxJQUF2QyxFQUE2QyxjQUE3QyxDQURvQixDQUF4Qjs7QUFJQSxJQUFBQyxrQkFBQSxFQUFVLFNBQVYsRUFBcUIsZ0JBQXJCLEVBQXVDTCxlQUF2QyxFQUF3REwsSUFBeEQ7QUFFQUMsT0FBTyxDQUFDVSxHQUFSLENBQVksaUZBQ1IsbUJBREoifQ== \ No newline at end of file diff --git a/dist/scripts/propagateVersion.js b/dist/scripts/propagateVersion.js deleted file mode 100644 index eb548ed1..00000000 --- a/dist/scripts/propagateVersion.js +++ /dev/null @@ -1,21 +0,0 @@ -"use strict"; - -// This propagates the version from package.json to Meteor plugins. -const { - version -} = require('../../package.json'); - -const fs = require('fs'); - -const paths = ['./plugins/bundler/package.js', './plugins/watcher/package.js']; -paths.forEach(path => { - let packageJs = fs.readFileSync(path, 'UTF-8'); - packageJs = packageJs.replace(/(version: ')([^']+)'/, `$1${version}'`); - - if (~path.indexOf('watcher')) { - packageJs = packageJs.replace(/(communitypackages:meteor-desktop-bundler@)([^']+)'/, `$1${version}'`); - } - - fs.writeFileSync(path, packageJs); -}); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ2ZXJzaW9uIiwicmVxdWlyZSIsImZzIiwicGF0aHMiLCJmb3JFYWNoIiwicGF0aCIsInBhY2thZ2VKcyIsInJlYWRGaWxlU3luYyIsInJlcGxhY2UiLCJpbmRleE9mIiwid3JpdGVGaWxlU3luYyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9zY3JpcHRzL3Byb3BhZ2F0ZVZlcnNpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBwcm9wYWdhdGVzIHRoZSB2ZXJzaW9uIGZyb20gcGFja2FnZS5qc29uIHRvIE1ldGVvciBwbHVnaW5zLlxuXG5jb25zdCB7IHZlcnNpb24gfSA9IHJlcXVpcmUoJy4uLy4uL3BhY2thZ2UuanNvbicpO1xuY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuXG5jb25zdCBwYXRocyA9IFsnLi9wbHVnaW5zL2J1bmRsZXIvcGFja2FnZS5qcycsICcuL3BsdWdpbnMvd2F0Y2hlci9wYWNrYWdlLmpzJ107XG5wYXRocy5mb3JFYWNoKChwYXRoKSA9PiB7XG4gICAgbGV0IHBhY2thZ2VKcyA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLCAnVVRGLTgnKTtcbiAgICBwYWNrYWdlSnMgPSBwYWNrYWdlSnMucmVwbGFjZSgvKHZlcnNpb246ICcpKFteJ10rKScvLCBgJDEke3ZlcnNpb259J2ApO1xuICAgIGlmICh+cGF0aC5pbmRleE9mKCd3YXRjaGVyJykpIHtcbiAgICAgICAgcGFja2FnZUpzID0gcGFja2FnZUpzLnJlcGxhY2UoLyhjb21tdW5pdHlwYWNrYWdlczptZXRlb3ItZGVza3RvcC1idW5kbGVyQCkoW14nXSspJy8sIGAkMSR7dmVyc2lvbn0nYCk7XG4gICAgfVxuICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aCwgcGFja2FnZUpzKTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBRUEsTUFBTTtFQUFFQTtBQUFGLElBQWNDLE9BQU8sQ0FBQyxvQkFBRCxDQUEzQjs7QUFDQSxNQUFNQyxFQUFFLEdBQUdELE9BQU8sQ0FBQyxJQUFELENBQWxCOztBQUVBLE1BQU1FLEtBQUssR0FBRyxDQUFDLDhCQUFELEVBQWlDLDhCQUFqQyxDQUFkO0FBQ0FBLEtBQUssQ0FBQ0MsT0FBTixDQUFlQyxJQUFELElBQVU7RUFDcEIsSUFBSUMsU0FBUyxHQUFHSixFQUFFLENBQUNLLFlBQUgsQ0FBZ0JGLElBQWhCLEVBQXNCLE9BQXRCLENBQWhCO0VBQ0FDLFNBQVMsR0FBR0EsU0FBUyxDQUFDRSxPQUFWLENBQWtCLHNCQUFsQixFQUEyQyxLQUFJUixPQUFRLEdBQXZELENBQVo7O0VBQ0EsSUFBSSxDQUFDSyxJQUFJLENBQUNJLE9BQUwsQ0FBYSxTQUFiLENBQUwsRUFBOEI7SUFDMUJILFNBQVMsR0FBR0EsU0FBUyxDQUFDRSxPQUFWLENBQWtCLHFEQUFsQixFQUEwRSxLQUFJUixPQUFRLEdBQXRGLENBQVo7RUFDSDs7RUFDREUsRUFBRSxDQUFDUSxhQUFILENBQWlCTCxJQUFqQixFQUF1QkMsU0FBdkI7QUFDSCxDQVBEIn0= \ No newline at end of file diff --git a/dist/scripts/utils/addScript.js b/dist/scripts/utils/addScript.js deleted file mode 100644 index 3e6b47e5..00000000 --- a/dist/scripts/utils/addScript.js +++ /dev/null @@ -1,50 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = addScript; - -var _fs = _interopRequireDefault(require("fs")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function readJsonFile(jsonFilePath) { - try { - return JSON.parse(_fs.default.readFileSync(jsonFilePath, 'UTF-8')); - } catch (e) { - return false; - } -} - -function writeJsonFile(jsonFilePath, jsonContents) { - try { - _fs.default.writeFileSync(jsonFilePath, JSON.stringify(jsonContents, null, 2)); - } catch (e) { - return false; - } - - return true; -} - -function addScript(name, script, packageJsonPath, fail) { - const packageJson = readJsonFile(packageJsonPath); - - if (!(packageJson && packageJson.name)) { - fail(); - return; - } - - if (!('scripts' in packageJson)) { - packageJson.scripts = {}; - } - - if (!(name in packageJson.scripts)) { - packageJson.scripts[name] = script; - } - - if (!writeJsonFile(packageJsonPath, packageJson)) { - fail(); - } -} -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZWFkSnNvbkZpbGUiLCJqc29uRmlsZVBhdGgiLCJKU09OIiwicGFyc2UiLCJmcyIsInJlYWRGaWxlU3luYyIsImUiLCJ3cml0ZUpzb25GaWxlIiwianNvbkNvbnRlbnRzIiwid3JpdGVGaWxlU3luYyIsInN0cmluZ2lmeSIsImFkZFNjcmlwdCIsIm5hbWUiLCJzY3JpcHQiLCJwYWNrYWdlSnNvblBhdGgiLCJmYWlsIiwicGFja2FnZUpzb24iLCJzY3JpcHRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL3NjcmlwdHMvdXRpbHMvYWRkU2NyaXB0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdmcyc7XG5cbmZ1bmN0aW9uIHJlYWRKc29uRmlsZShqc29uRmlsZVBhdGgpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoanNvbkZpbGVQYXRoLCAnVVRGLTgnKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB3cml0ZUpzb25GaWxlKGpzb25GaWxlUGF0aCwganNvbkNvbnRlbnRzKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhqc29uRmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KGpzb25Db250ZW50cywgbnVsbCwgMikpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYWRkU2NyaXB0KG5hbWUsIHNjcmlwdCwgcGFja2FnZUpzb25QYXRoLCBmYWlsKSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSByZWFkSnNvbkZpbGUocGFja2FnZUpzb25QYXRoKTtcbiAgICBpZiAoIShwYWNrYWdlSnNvbiAmJiBwYWNrYWdlSnNvbi5uYW1lKSkge1xuICAgICAgICBmYWlsKCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoISgnc2NyaXB0cycgaW4gcGFja2FnZUpzb24pKSB7XG4gICAgICAgIHBhY2thZ2VKc29uLnNjcmlwdHMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIShuYW1lIGluIHBhY2thZ2VKc29uLnNjcmlwdHMpKSB7XG4gICAgICAgIHBhY2thZ2VKc29uLnNjcmlwdHNbbmFtZV0gPSBzY3JpcHQ7XG4gICAgfVxuXG4gICAgaWYgKCF3cml0ZUpzb25GaWxlKHBhY2thZ2VKc29uUGF0aCwgcGFja2FnZUpzb24pKSB7XG4gICAgICAgIGZhaWwoKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7OztBQUVBLFNBQVNBLFlBQVQsQ0FBc0JDLFlBQXRCLEVBQW9DO0VBQ2hDLElBQUk7SUFDQSxPQUFPQyxJQUFJLENBQUNDLEtBQUwsQ0FBV0MsV0FBQSxDQUFHQyxZQUFILENBQWdCSixZQUFoQixFQUE4QixPQUE5QixDQUFYLENBQVA7RUFDSCxDQUZELENBRUUsT0FBT0ssQ0FBUCxFQUFVO0lBQ1IsT0FBTyxLQUFQO0VBQ0g7QUFDSjs7QUFFRCxTQUFTQyxhQUFULENBQXVCTixZQUF2QixFQUFxQ08sWUFBckMsRUFBbUQ7RUFDL0MsSUFBSTtJQUNBSixXQUFBLENBQUdLLGFBQUgsQ0FBaUJSLFlBQWpCLEVBQStCQyxJQUFJLENBQUNRLFNBQUwsQ0FBZUYsWUFBZixFQUE2QixJQUE3QixFQUFtQyxDQUFuQyxDQUEvQjtFQUNILENBRkQsQ0FFRSxPQUFPRixDQUFQLEVBQVU7SUFDUixPQUFPLEtBQVA7RUFDSDs7RUFDRCxPQUFPLElBQVA7QUFDSDs7QUFFYyxTQUFTSyxTQUFULENBQW1CQyxJQUFuQixFQUF5QkMsTUFBekIsRUFBaUNDLGVBQWpDLEVBQWtEQyxJQUFsRCxFQUF3RDtFQUNuRSxNQUFNQyxXQUFXLEdBQUdoQixZQUFZLENBQUNjLGVBQUQsQ0FBaEM7O0VBQ0EsSUFBSSxFQUFFRSxXQUFXLElBQUlBLFdBQVcsQ0FBQ0osSUFBN0IsQ0FBSixFQUF3QztJQUNwQ0csSUFBSTtJQUNKO0VBQ0g7O0VBRUQsSUFBSSxFQUFFLGFBQWFDLFdBQWYsQ0FBSixFQUFpQztJQUM3QkEsV0FBVyxDQUFDQyxPQUFaLEdBQXNCLEVBQXRCO0VBQ0g7O0VBRUQsSUFBSSxFQUFFTCxJQUFJLElBQUlJLFdBQVcsQ0FBQ0MsT0FBdEIsQ0FBSixFQUFvQztJQUNoQ0QsV0FBVyxDQUFDQyxPQUFaLENBQW9CTCxJQUFwQixJQUE0QkMsTUFBNUI7RUFDSDs7RUFFRCxJQUFJLENBQUNOLGFBQWEsQ0FBQ08sZUFBRCxFQUFrQkUsV0FBbEIsQ0FBbEIsRUFBa0Q7SUFDOUNELElBQUk7RUFDUDtBQUNKIn0= \ No newline at end of file diff --git a/dist/skeletonDependencies.js b/dist/skeletonDependencies.js deleted file mode 100644 index 31e6e13d..00000000 --- a/dist/skeletonDependencies.js +++ /dev/null @@ -1,24 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; -var _default = { - connect: '3.6.6', - 'server-destroy': '1.0.1', - winston: '2.3.0', - 'find-port': '2.0.1', - rimraf: '2.6.2', - shelljs: '0.7.5', - lodash: '4.17.15', - request: '2.88.0', - queue: '4.0.1', - reify: '0.17.3', - send: '0.16.2', - mime: '2.0.3', - 'fs-extra': '3.0.1', - 'fs-plus': '2.9.3' -}; -exports.default = _default; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb25uZWN0Iiwid2luc3RvbiIsInJpbXJhZiIsInNoZWxsanMiLCJsb2Rhc2giLCJyZXF1ZXN0IiwicXVldWUiLCJyZWlmeSIsInNlbmQiLCJtaW1lIl0sInNvdXJjZXMiOlsiLi4vbGliL3NrZWxldG9uRGVwZW5kZW5jaWVzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IHtcbiAgICBjb25uZWN0OiAnMy42LjYnLFxuICAgICdzZXJ2ZXItZGVzdHJveSc6ICcxLjAuMScsXG4gICAgd2luc3RvbjogJzIuMy4wJyxcbiAgICAnZmluZC1wb3J0JzogJzIuMC4xJyxcbiAgICByaW1yYWY6ICcyLjYuMicsXG4gICAgc2hlbGxqczogJzAuNy41JyxcbiAgICBsb2Rhc2g6ICc0LjE3LjE1JyxcbiAgICByZXF1ZXN0OiAnMi44OC4wJyxcbiAgICBxdWV1ZTogJzQuMC4xJyxcbiAgICByZWlmeTogJzAuMTcuMycsXG4gICAgc2VuZDogJzAuMTYuMicsXG4gICAgbWltZTogJzIuMC4zJyxcbiAgICAnZnMtZXh0cmEnOiAnMy4wLjEnLFxuICAgICdmcy1wbHVzJzogJzIuOS4zJ1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O2VBQWU7RUFDWEEsT0FBTyxFQUFFLE9BREU7RUFFWCxrQkFBa0IsT0FGUDtFQUdYQyxPQUFPLEVBQUUsT0FIRTtFQUlYLGFBQWEsT0FKRjtFQUtYQyxNQUFNLEVBQUUsT0FMRztFQU1YQyxPQUFPLEVBQUUsT0FORTtFQU9YQyxNQUFNLEVBQUUsU0FQRztFQVFYQyxPQUFPLEVBQUUsUUFSRTtFQVNYQyxLQUFLLEVBQUUsT0FUSTtFQVVYQyxLQUFLLEVBQUUsUUFWSTtFQVdYQyxJQUFJLEVBQUUsUUFYSztFQVlYQyxJQUFJLEVBQUUsT0FaSztFQWFYLFlBQVksT0FiRDtFQWNYLFdBQVc7QUFkQSxDIn0= \ No newline at end of file diff --git a/dist/utils.js b/dist/utils.js deleted file mode 100644 index f931f672..00000000 --- a/dist/utils.js +++ /dev/null @@ -1,328 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.computeHashForHashesSet = computeHashForHashesSet; -exports.default = void 0; -exports.exists = exists; -exports.getFileList = getFileList; -exports.readAndGetFileHash = readAndGetFileHash; -exports.readAndHashFiles = readAndHashFiles; -exports.readDir = readDir; -exports.readFilesAndComputeHash = readFilesAndComputeHash; -exports.rmWithRetries = rmWithRetries; -exports.symlinkExists = symlinkExists; - -var _path = _interopRequireDefault(require("path")); - -var _fs = _interopRequireDefault(require("fs")); - -var _crypto = _interopRequireDefault(require("crypto")); - -var _shelljs = _interopRequireDefault(require("shelljs")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/* eslint-disable consistent-return */ - -/** - * Exists - * @param {string} pathToCheck - * @returns {boolean} - */ -function exists(pathToCheck) { - try { - _fs.default.accessSync(pathToCheck); - - return true; - } catch (e) { - return false; - } -} -/** - * Simple wrapper for shelljs.rm with additional retries in case of failure. - * It is useful when something is concurrently reading the dir you want to remove. - */ - - -function rmWithRetries(...args) { - let retries = 0; - return new Promise((resolve, reject) => { - function rm(...rmArgs) { - try { - _shelljs.default.config.fatal = true; - - _shelljs.default.rm(...rmArgs); - - _shelljs.default.config.reset(); - - resolve(); - } catch (e) { - retries += 1; - - if (retries < 5) { - setTimeout(() => { - rm(...rmArgs); - }, 100); - } else { - _shelljs.default.config.reset(); - - reject(e); - } - } - } - - rm(...args); - }); -} - -function readDir(dir, callback) { - if (!callback) { - return new Promise((resolve, reject) => { - readDir(dir, (err, data, stats) => { - if (err) { - reject(err); - } else { - resolve({ - data, - stats - }); - } - }); - }); - } - - let list = []; - let allStats = {}; - - _fs.default.readdir(dir, (err, files) => { - if (err) { - return callback(err); - } - - let pending = files.length; - - if (!pending) { - return callback(null, list, allStats); - } - - files.forEach(file => { - const filePath = _path.default.join(dir, file); - - _fs.default.stat(filePath, (_err, stats) => { - if (_err) { - return callback(_err); - } - - if (stats.isDirectory()) { - readDir(filePath, (__err, res, _allStats) => { - if (__err) { - return callback(__err); - } - - list = list.concat(res); - allStats = Object.assign(allStats, _allStats); - pending -= 1; - - if (!pending) { - return callback(null, list, allStats); - } - }); - } else { - list.push(filePath); - allStats[filePath] = { - size: stats.size, - dates: [stats.birthtime.getTime(), stats.ctime.getTime(), stats.mtime.getTime()] - }; - pending -= 1; - - if (!pending) { - return callback(null, list, allStats); - } - } - }); - }); - }); -} -/** - * Returns a file list from a directory. - * @param {string} dir - dir path - * @param {boolean} sort - whether to apply sort - * @returns {Promise} - */ - - -function getFileList(dir, sort = false) { - return new Promise((resolve, reject) => { - readDir(dir, (error, files) => { - if (error) { - reject(error); - return; - } // eslint-disable-next-line no-param-reassign - - - let resultantFilesList; - - if (sort) { - const stripLength = dir.substr(0, 2) === './' ? dir.length - 1 : dir.length + 1; - let pathsUnified = files.map(pth => pth.substr(stripLength).replace(/[\\/]/gm, '-')); - const temporaryIndex = {}; - files.forEach((file, i) => { - temporaryIndex[pathsUnified[i]] = file; - }); - pathsUnified = pathsUnified.sort(); - const filesSorted = []; - pathsUnified.forEach(key => { - filesSorted.push(temporaryIndex[key]); - }); - resultantFilesList = filesSorted; - } else { - resultantFilesList = files; - } - - resolve(resultantFilesList); - }); - }); -} -/** - * Returns file's hash. - * @param {string} file - file path - * @param {boolean} returnFileContents - include file contents in the resultant object - * @returns {Promise} - */ - - -function readAndGetFileHash(file, returnFileContents = false) { - return new Promise((resolve, reject) => { - _fs.default.readFile(file, (err, data) => { - if (err) { - reject(err); - return; - } - - const hash = _crypto.default.createHash('sha1'); - - hash.update(data); - const returnObject = { - hash: hash.digest('hex') - }; - - if (returnFileContents) { - returnObject.contents = data.toString('utf8'); - } - - resolve(returnObject); - }); - }); -} -/** - * Calculates a hash from objects values in specified order. - * @param {Array} orderOfKeys - * @param {Object} hashSet - * @param {Function} keyFilter - * @returns {string} - */ - - -function computeHashForHashesSet(orderOfKeys, hashSet, keyFilter = key => key) { - const hash = _crypto.default.createHash('sha1'); - - const hashesJoined = orderOfKeys.reduce( // eslint-disable-next-line no-param-reassign,no-return-assign - (tmpHash, key) => (tmpHash += hashSet[keyFilter(key)], tmpHash), ''); - hash.update(hashesJoined); - return hash.digest('hex'); -} -/** - * Reads files from disk and computes hashes for them. - * @param {Array} files - array with file paths - * @returns {Promise} - */ - - -function readAndHashFiles(files, fileFilter) { - const fileHashes = {}; - const fileContents = {}; - const promises = []; - - function readSingleFile(file) { - return new Promise((resolve, reject) => { - readAndGetFileHash(file, file.endsWith('.js') && !file.endsWith('.test.js')).then(result => { - let fileName = file; - - if (fileFilter) { - fileName = fileFilter(fileName); - } - - fileHashes[fileName] = result.hash; - - if (result.contents) { - fileContents[fileName] = result.contents; - } - - resolve(); - }).catch(reject); - }); - } - - files.forEach(file => { - promises.push(readSingleFile(file)); - }); - return new Promise((resolve, reject) => { - Promise.all(promises).then(() => { - resolve({ - files, - fileContents, - fileHashes - }); - }).catch(reject); - }); -} -/** - * Reads files from .desktop and computes a version hash. - * - * @param {string} dir - path - * @param {Function} fileFilter - * @returns {Promise} - */ - - -function readFilesAndComputeHash(dir, fileFilter) { - return new Promise((resolve, reject) => { - getFileList(dir, true).catch(reject).then(files => readAndHashFiles(files, fileFilter)).catch(reject).then(result => { - // eslint-disable-next-line no-param-reassign - result.hash = computeHashForHashesSet(result.files, result.fileHashes, fileFilter); - resolve(result); - }); - }); -} -/** - * Symlink exists - * @param {string} pathToCheck - * @returns {boolean} - */ - - -function symlinkExists(pathToCheck) { - try { - _fs.default.readlinkSync(pathToCheck); - - return true; - } catch (e) { - return false; - } -} - -var _default = { - getFileList, - rmWithRetries, - exists, - readDir, - readAndGetFileHash, - computeHashForHashesSet, - readAndHashFiles, - readFilesAndComputeHash, - symlinkExists -}; -exports.default = _default; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleGlzdHMiLCJwYXRoVG9DaGVjayIsImZzIiwiYWNjZXNzU3luYyIsImUiLCJybVdpdGhSZXRyaWVzIiwiYXJncyIsInJldHJpZXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInJtIiwicm1BcmdzIiwic2hlbGwiLCJjb25maWciLCJmYXRhbCIsInJlc2V0Iiwic2V0VGltZW91dCIsInJlYWREaXIiLCJkaXIiLCJjYWxsYmFjayIsImVyciIsImRhdGEiLCJzdGF0cyIsImxpc3QiLCJhbGxTdGF0cyIsInJlYWRkaXIiLCJmaWxlcyIsInBlbmRpbmciLCJsZW5ndGgiLCJmb3JFYWNoIiwiZmlsZSIsImZpbGVQYXRoIiwicGF0aCIsImpvaW4iLCJzdGF0IiwiX2VyciIsImlzRGlyZWN0b3J5IiwiX19lcnIiLCJyZXMiLCJfYWxsU3RhdHMiLCJjb25jYXQiLCJPYmplY3QiLCJhc3NpZ24iLCJwdXNoIiwic2l6ZSIsImRhdGVzIiwiYmlydGh0aW1lIiwiZ2V0VGltZSIsImN0aW1lIiwibXRpbWUiLCJnZXRGaWxlTGlzdCIsInNvcnQiLCJlcnJvciIsInJlc3VsdGFudEZpbGVzTGlzdCIsInN0cmlwTGVuZ3RoIiwic3Vic3RyIiwicGF0aHNVbmlmaWVkIiwibWFwIiwicHRoIiwicmVwbGFjZSIsInRlbXBvcmFyeUluZGV4IiwiaSIsImZpbGVzU29ydGVkIiwia2V5IiwicmVhZEFuZEdldEZpbGVIYXNoIiwicmV0dXJuRmlsZUNvbnRlbnRzIiwicmVhZEZpbGUiLCJoYXNoIiwiY3J5cHRvIiwiY3JlYXRlSGFzaCIsInVwZGF0ZSIsInJldHVybk9iamVjdCIsImRpZ2VzdCIsImNvbnRlbnRzIiwidG9TdHJpbmciLCJjb21wdXRlSGFzaEZvckhhc2hlc1NldCIsIm9yZGVyT2ZLZXlzIiwiaGFzaFNldCIsImtleUZpbHRlciIsImhhc2hlc0pvaW5lZCIsInJlZHVjZSIsInRtcEhhc2giLCJyZWFkQW5kSGFzaEZpbGVzIiwiZmlsZUZpbHRlciIsImZpbGVIYXNoZXMiLCJmaWxlQ29udGVudHMiLCJwcm9taXNlcyIsInJlYWRTaW5nbGVGaWxlIiwiZW5kc1dpdGgiLCJ0aGVuIiwicmVzdWx0IiwiZmlsZU5hbWUiLCJjYXRjaCIsImFsbCIsInJlYWRGaWxlc0FuZENvbXB1dGVIYXNoIiwic3ltbGlua0V4aXN0cyIsInJlYWRsaW5rU3luYyJdLCJzb3VyY2VzIjpbIi4uL2xpYi91dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBjb25zaXN0ZW50LXJldHVybiAqL1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHNoZWxsIGZyb20gJ3NoZWxsanMnO1xuXG4vKipcbiAqIEV4aXN0c1xuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhUb0NoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4aXN0cyhwYXRoVG9DaGVjaykge1xuICAgIHRyeSB7XG4gICAgICAgIGZzLmFjY2Vzc1N5bmMocGF0aFRvQ2hlY2spO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8qKlxuICogU2ltcGxlIHdyYXBwZXIgZm9yIHNoZWxsanMucm0gd2l0aCBhZGRpdGlvbmFsIHJldHJpZXMgaW4gY2FzZSBvZiBmYWlsdXJlLlxuICogSXQgaXMgdXNlZnVsIHdoZW4gc29tZXRoaW5nIGlzIGNvbmN1cnJlbnRseSByZWFkaW5nIHRoZSBkaXIgeW91IHdhbnQgdG8gcmVtb3ZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcm1XaXRoUmV0cmllcyguLi5hcmdzKSB7XG4gICAgbGV0IHJldHJpZXMgPSAwO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGZ1bmN0aW9uIHJtKC4uLnJtQXJncykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzaGVsbC5jb25maWcuZmF0YWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHNoZWxsLnJtKC4uLnJtQXJncyk7XG4gICAgICAgICAgICAgICAgc2hlbGwuY29uZmlnLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHJpZXMgKz0gMTtcbiAgICAgICAgICAgICAgICBpZiAocmV0cmllcyA8IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBybSguLi5ybUFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNoZWxsLmNvbmZpZy5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJtKC4uLmFyZ3MpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZERpcihkaXIsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcmVhZERpcihkaXIsIChlcnIsIGRhdGEsIHN0YXRzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHsgZGF0YSwgc3RhdHMgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgbGlzdCA9IFtdO1xuICAgIGxldCBhbGxTdGF0cyA9IHt9O1xuXG4gICAgZnMucmVhZGRpcihkaXIsIChlcnIsIGZpbGVzKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwZW5kaW5nID0gZmlsZXMubGVuZ3RoO1xuICAgICAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBsaXN0LCBhbGxTdGF0cyk7XG4gICAgICAgIH1cbiAgICAgICAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyLCBmaWxlKTtcbiAgICAgICAgICAgIGZzLnN0YXQoZmlsZVBhdGgsIChfZXJyLCBzdGF0cykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChfZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhfZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVhZERpcihmaWxlUGF0aCwgKF9fZXJyLCByZXMsIF9hbGxTdGF0cykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9fZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKF9fZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QgPSBsaXN0LmNvbmNhdChyZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsU3RhdHMgPSBPYmplY3QuYXNzaWduKGFsbFN0YXRzLCBfYWxsU3RhdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIGxpc3QsIGFsbFN0YXRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdC5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgYWxsU3RhdHNbZmlsZVBhdGhdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogc3RhdHMuc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMuYmlydGh0aW1lLmdldFRpbWUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5jdGltZS5nZXRUaW1lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMubXRpbWUuZ2V0VGltZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmcgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgbGlzdCwgYWxsU3RhdHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmaWxlIGxpc3QgZnJvbSBhIGRpcmVjdG9yeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXIgLSBkaXIgcGF0aFxuICogQHBhcmFtIHtib29sZWFufSBzb3J0IC0gd2hldGhlciB0byBhcHBseSBzb3J0XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheT59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlTGlzdChkaXIsIHNvcnQgPSBmYWxzZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHJlYWREaXIoZGlyLCAoZXJyb3IsIGZpbGVzKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgbGV0IHJlc3VsdGFudEZpbGVzTGlzdDtcblxuICAgICAgICAgICAgaWYgKHNvcnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHJpcExlbmd0aCA9IChkaXIuc3Vic3RyKDAsIDIpID09PSAnLi8nKSA/IGRpci5sZW5ndGggLSAxIDogZGlyLmxlbmd0aCArIDE7XG4gICAgICAgICAgICAgICAgbGV0IHBhdGhzVW5pZmllZCA9IGZpbGVzLm1hcCgocHRoID0+IHB0aC5zdWJzdHIoc3RyaXBMZW5ndGgpLnJlcGxhY2UoL1tcXFxcL10vZ20sICctJykpKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wb3JhcnlJbmRleCA9IHt9O1xuICAgICAgICAgICAgICAgIGZpbGVzLmZvckVhY2goKGZpbGUsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGVtcG9yYXJ5SW5kZXhbcGF0aHNVbmlmaWVkW2ldXSA9IGZpbGU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcGF0aHNVbmlmaWVkID0gcGF0aHNVbmlmaWVkLnNvcnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlc1NvcnRlZCA9IFtdO1xuICAgICAgICAgICAgICAgIHBhdGhzVW5pZmllZC5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZXNTb3J0ZWQucHVzaCh0ZW1wb3JhcnlJbmRleFtrZXldKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXN1bHRhbnRGaWxlc0xpc3QgPSBmaWxlc1NvcnRlZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0YW50RmlsZXNMaXN0ID0gZmlsZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdGFudEZpbGVzTGlzdCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFJldHVybnMgZmlsZSdzIGhhc2guXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZSAtIGZpbGUgcGF0aFxuICogQHBhcmFtIHtib29sZWFufSByZXR1cm5GaWxlQ29udGVudHMgLSBpbmNsdWRlIGZpbGUgY29udGVudHMgaW4gdGhlIHJlc3VsdGFudCBvYmplY3RcbiAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQW5kR2V0RmlsZUhhc2goZmlsZSwgcmV0dXJuRmlsZUNvbnRlbnRzID0gZmFsc2UpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBmcy5yZWFkRmlsZShmaWxlLCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGExJyk7XG4gICAgICAgICAgICBoYXNoLnVwZGF0ZShkYXRhKTtcbiAgICAgICAgICAgIGNvbnN0IHJldHVybk9iamVjdCA9IHsgaGFzaDogaGFzaC5kaWdlc3QoJ2hleCcpIH07XG4gICAgICAgICAgICBpZiAocmV0dXJuRmlsZUNvbnRlbnRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0LmNvbnRlbnRzID0gZGF0YS50b1N0cmluZygndXRmOCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5PYmplY3QpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIGEgaGFzaCBmcm9tIG9iamVjdHMgdmFsdWVzIGluIHNwZWNpZmllZCBvcmRlci5cbiAqIEBwYXJhbSB7QXJyYXl9IG9yZGVyT2ZLZXlzXG4gKiBAcGFyYW0ge09iamVjdH0gaGFzaFNldFxuICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5RmlsdGVyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUhhc2hGb3JIYXNoZXNTZXQob3JkZXJPZktleXMsIGhhc2hTZXQsIGtleUZpbHRlciA9IGtleSA9PiBrZXkpIHtcbiAgICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTEnKTtcbiAgICBjb25zdCBoYXNoZXNKb2luZWQgPSBvcmRlck9mS2V5cy5yZWR1Y2UoXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnbixuby1yZXR1cm4tYXNzaWduXG4gICAgICAgICh0bXBIYXNoLCBrZXkpID0+ICh0bXBIYXNoICs9IGhhc2hTZXRba2V5RmlsdGVyKGtleSldLCB0bXBIYXNoKSwgJydcbiAgICApO1xuICAgIGhhc2gudXBkYXRlKGhhc2hlc0pvaW5lZCk7XG4gICAgcmV0dXJuIGhhc2guZGlnZXN0KCdoZXgnKTtcbn1cblxuXG4vKipcbiAqIFJlYWRzIGZpbGVzIGZyb20gZGlzayBhbmQgY29tcHV0ZXMgaGFzaGVzIGZvciB0aGVtLlxuICogQHBhcmFtIHtBcnJheX0gZmlsZXMgLSBhcnJheSB3aXRoIGZpbGUgcGF0aHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQW5kSGFzaEZpbGVzKGZpbGVzLCBmaWxlRmlsdGVyKSB7XG4gICAgY29uc3QgZmlsZUhhc2hlcyA9IHt9O1xuICAgIGNvbnN0IGZpbGVDb250ZW50cyA9IHt9O1xuICAgIGNvbnN0IHByb21pc2VzID0gW107XG5cbiAgICBmdW5jdGlvbiByZWFkU2luZ2xlRmlsZShmaWxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICByZWFkQW5kR2V0RmlsZUhhc2goZmlsZSwgZmlsZS5lbmRzV2l0aCgnLmpzJykgJiYgIWZpbGUuZW5kc1dpdGgoJy50ZXN0LmpzJykpXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZU5hbWUgPSBmaWxlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBmaWxlRmlsdGVyKGZpbGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaWxlSGFzaGVzW2ZpbGVOYW1lXSA9IHJlc3VsdC5oYXNoO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmNvbnRlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlQ29udGVudHNbZmlsZU5hbWVdID0gcmVzdWx0LmNvbnRlbnRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChyZWplY3QpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmaWxlcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgIHByb21pc2VzLnB1c2gocmVhZFNpbmdsZUZpbGUoZmlsZSkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7IGZpbGVzLCBmaWxlQ29udGVudHMsIGZpbGVIYXNoZXMgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKHJlamVjdCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogUmVhZHMgZmlsZXMgZnJvbSAuZGVza3RvcCBhbmQgY29tcHV0ZXMgYSB2ZXJzaW9uIGhhc2guXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGRpciAtIHBhdGhcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZpbGVGaWx0ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRmlsZXNBbmRDb21wdXRlSGFzaChkaXIsIGZpbGVGaWx0ZXIpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBnZXRGaWxlTGlzdChkaXIsIHRydWUpXG4gICAgICAgICAgICAuY2F0Y2gocmVqZWN0KVxuICAgICAgICAgICAgLnRoZW4oZmlsZXMgPT4gcmVhZEFuZEhhc2hGaWxlcyhmaWxlcywgZmlsZUZpbHRlcikpXG4gICAgICAgICAgICAuY2F0Y2gocmVqZWN0KVxuICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNoID0gY29tcHV0ZUhhc2hGb3JIYXNoZXNTZXQocmVzdWx0LmZpbGVzLCByZXN1bHQuZmlsZUhhc2hlcywgZmlsZUZpbHRlcik7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogU3ltbGluayBleGlzdHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoVG9DaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzeW1saW5rRXhpc3RzKHBhdGhUb0NoZWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgZnMucmVhZGxpbmtTeW5jKHBhdGhUb0NoZWNrKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBnZXRGaWxlTGlzdCxcbiAgICBybVdpdGhSZXRyaWVzLFxuICAgIGV4aXN0cyxcbiAgICByZWFkRGlyLFxuICAgIHJlYWRBbmRHZXRGaWxlSGFzaCxcbiAgICBjb21wdXRlSGFzaEZvckhhc2hlc1NldCxcbiAgICByZWFkQW5kSGFzaEZpbGVzLFxuICAgIHJlYWRGaWxlc0FuZENvbXB1dGVIYXNoLFxuICAgIHN5bWxpbmtFeGlzdHNcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUpBOztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQSxNQUFULENBQWdCQyxXQUFoQixFQUE2QjtFQUNoQyxJQUFJO0lBQ0FDLFdBQUEsQ0FBR0MsVUFBSCxDQUFjRixXQUFkOztJQUNBLE9BQU8sSUFBUDtFQUNILENBSEQsQ0FHRSxPQUFPRyxDQUFQLEVBQVU7SUFDUixPQUFPLEtBQVA7RUFDSDtBQUNKO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFNBQVNDLGFBQVQsQ0FBdUIsR0FBR0MsSUFBMUIsRUFBZ0M7RUFDbkMsSUFBSUMsT0FBTyxHQUFHLENBQWQ7RUFDQSxPQUFPLElBQUlDLE9BQUosQ0FBWSxDQUFD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 \ No newline at end of file From 7c64e3e6b86711dcde3c2a1228ebe59b0655e6a9 Mon Sep 17 00:00:00 2001 From: "p.mikolajczak@tkhtechnology.com" Date: Wed, 5 Apr 2023 08:38:50 +0200 Subject: [PATCH 3/3] Update gitignore, config.yml --- .circleci/config.yml | 2 +- .gitignore | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 70d09d72..e5d2eac1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -29,7 +29,7 @@ jobs: - checkout - run: name: Update npm - command: 'sudo npm install -g npm@latest' + command: 'sudo npm install -g npm@6' - restore_cache: key: dependency-cache-{{ checksum "package.json" }}-{{ checksum ".circleci/config.yml" }} - run: diff --git a/.gitignore b/.gitignore index 28f46c1a..fd027d5c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ node_modules .idea +dist tests/_tmp_ tests/.__tmp_int .npm