UNPKG

temporarily

Version:

Create temporary directories and files.

244 lines (192 loc) 21 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.cleanup = cleanup; exports.filepath = filepath; exports.dir = dir; exports.file = file; var _fs = _interopRequireDefault(require("fs")); var _os = _interopRequireDefault(require("os")); var _path = _interopRequireDefault(require("path")); var _cryptoRandomString = _interopRequireDefault(require("crypto-random-string")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // constants var EMPTY_STRING = ''; var DEFAULT_DIR_MODE = 0o777; var DEFAULT_ENCODING = 'utf8'; var DEFAULT_FILE_MODE = 0o666; var DEFAULT_NAME = 'temporarily-{WWWWDDDD}'; var TMP_DIR = 'temporarily-{XXXXXXXX}'; var DIGIT = '1234567890'; var WORD = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; var TEMPLATE_INTERPOLATE = /\{([^}]+)\}/g; // utils var sample = function sample(array) { return array[Math.floor(Math.random() * array.length)]; }; // private var templateChars = { /* eslint-disable id-length */ d: function d() { return sample(DIGIT); }, w: function w() { return sample(WORD); }, x: function x() { return (0, _cryptoRandomString.default)(1); } /* eslint-enable id-length */ }; var tempXCallbacks = []; // const debug = (...args) => { // console.log(...args); // }; var moveTo = function moveTo(toTempDir) { var move = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; return function (fromTemp) { /* eslint-disable no-param-reassign */ var newFilepath = _path.default.join(toTempDir.filepath, _path.default.basename(fromTemp.filepath)); if (move) { _fs.default.renameSync(fromTemp.filepath, newFilepath); // debug('MOVED', fromTemp.filepath, newFilepath); } fromTemp.filepath = newFilepath; if (fromTemp.children) { fromTemp.children = fromTemp.children.map(moveTo(fromTemp, false)); } return fromTemp; }; }; var templateReplacer = function templateReplacer(match, innerMatch) { return innerMatch.split(EMPTY_STRING).map(function (char) { var chars = templateChars[char.toLowerCase()]; if (!chars) { throw new Error(`Expected template placeholder to be one of: ${Object.keys(templateChars).join(', ')}. Received ${char}`); } return chars(); }).join(EMPTY_STRING); }; var tmpDir = function tmpDir() { return _path.default.join(_os.default.tmpdir(), TMP_DIR.replace(TEMPLATE_INTERPOLATE, templateReplacer)); }; // exports function registerCleanup(fn) { tempXCallbacks.push(fn); return function manualCleanupOne() { fn(); tempXCallbacks = tempXCallbacks.filter(function (callback) { return callback !== fn; }); }; } /** */ function cleanup() { tempXCallbacks.forEach(function (fn) { fn(); }); tempXCallbacks.length = 0; } /** * @param {object} [options] * @param {string} [options.dir=os.tmpdir] * @param {string} [options.ext] * @param {string} [options.name=temporarily-{WWWWDDDD}] * @return {string} filepath */ function filepath() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$dir = _ref.dir, dirPath = _ref$dir === void 0 ? tmpDir() : _ref$dir, _ref$ext = _ref.ext, ext = _ref$ext === void 0 ? null : _ref$ext, _ref$name = _ref.name, name = _ref$name === void 0 ? DEFAULT_NAME : _ref$name; var dirname = _path.default.resolve(dirPath); var basename = name.replace(TEMPLATE_INTERPOLATE, templateReplacer); return _path.default.join(dirname, `${basename}${ext ? `.${ext}` : ''}`); } /** * @param {object} [options] * @param {number} [options.mode=0o777] * @param {Array<object>} [children] * @return {object} dir props */ function dir() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var children = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; if (Array.isArray(options)) { /* eslint-disable no-param-reassign */ children = options; options = {}; /* eslint-enable no-param-reassign */ } var _options = options, _options$mode = _options.mode, mode = _options$mode === void 0 ? DEFAULT_DIR_MODE : _options$mode; var tempDir = { filepath: filepath(options), isDir: true, mode }; try { _fs.default.accessSync(tempDir.filepath, _fs.default.F_OK); } catch (err) { if (err.code !== 'ENOENT') { throw new Error(`Could not check ${tempDir.filepath}.`); } tempDir.cleanup = registerCleanup(function () { _fs.default.rmdirSync(tempDir.filepath); }); var parentDir = _path.default.dirname(tempDir.filepath); dir({ dir: _path.default.dirname(parentDir), name: _path.default.basename(parentDir) }); _fs.default.mkdirSync(tempDir.filepath, mode); // debug('CREATED DIR', tempDir.filepath); } if (children.length !== 0) { tempDir.children = children.map(moveTo(tempDir)); } return tempDir; } /** * @param {object} [options] * @param {string} [options.data=''] * @param {string} [options.encoding=utf8] * @param {number} [options.mode=0o666] * @return {object} file props */ function file() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var _options$data = options.data, data = _options$data === void 0 ? '' : _options$data, _options$encoding = options.encoding, encoding = _options$encoding === void 0 ? DEFAULT_ENCODING : _options$encoding, _options$mode2 = options.mode, mode = _options$mode2 === void 0 ? DEFAULT_FILE_MODE : _options$mode2; var tempFile = { data, filepath: filepath(options), isFile: true, mode }; var parentDir = _path.default.dirname(tempFile.filepath); tempFile.cleanup = registerCleanup(function () { _fs.default.unlinkSync(tempFile.filepath); }); try { _fs.default.accessSync(parentDir, _fs.default.F_OK); } catch (err) { if (err.code !== 'ENOENT') { throw new Error(`Could not check ${parentDir}.`); } dir({ dir: _path.default.dirname(parentDir), name: _path.default.basename(parentDir) }); } _fs.default.writeFileSync(tempFile.filepath, data, { encoding, mode }); // debug('CREATED FILE', tempFile.filepath); return tempFile; } // auto clean up process.on('exit', cleanup); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2xpYi9pbmRleC5qcyJdLCJuYW1lcyI6WyJFTVBUWV9TVFJJTkciLCJERUZBVUxUX0RJUl9NT0RFIiwiREVGQVVMVF9FTkNPRElORyIsIkRFRkFVTFRfRklMRV9NT0RFIiwiREVGQVVMVF9OQU1FIiwiVE1QX0RJUiIsIkRJR0lUIiwiV09SRCIsIlRFTVBMQVRFX0lOVEVSUE9MQVRFIiwic2FtcGxlIiwiYXJyYXkiLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJsZW5ndGgiLCJ0ZW1wbGF0ZUNoYXJzIiwiZCIsInciLCJ4IiwidGVtcFhDYWxsYmFja3MiLCJtb3ZlVG8iLCJ0b1RlbXBEaXIiLCJtb3ZlIiwiZnJvbVRlbXAiLCJuZXdGaWxlcGF0aCIsInBhdGgiLCJqb2luIiwiZmlsZXBhdGgiLCJiYXNlbmFtZSIsImZzIiwicmVuYW1lU3luYyIsImNoaWxkcmVuIiwibWFwIiwidGVtcGxhdGVSZXBsYWNlciIsIm1hdGNoIiwiaW5uZXJNYXRjaCIsInNwbGl0IiwiY2hhciIsImNoYXJzIiwidG9Mb3dlckNhc2UiLCJFcnJvciIsIk9iamVjdCIsImtleXMiLCJ0bXBEaXIiLCJvcyIsInRtcGRpciIsInJlcGxhY2UiLCJyZWdpc3RlckNsZWFudXAiLCJmbiIsInB1c2giLCJtYW51YWxDbGVhbnVwT25lIiwiZmlsdGVyIiwiY2FsbGJhY2siLCJjbGVhbnVwIiwiZm9yRWFjaCIsImRpciIsImRpclBhdGgiLCJleHQiLCJuYW1lIiwiZGlybmFtZSIsInJlc29sdmUiLCJvcHRpb25zIiwiQXJyYXkiLCJpc0FycmF5IiwibW9kZSIsInRlbXBEaXIiLCJpc0RpciIsImFjY2Vzc1N5bmMiLCJGX09LIiwiZXJyIiwiY29kZSIsInJtZGlyU3luYyIsInBhcmVudERpciIsIm1rZGlyU3luYyIsImZpbGUiLCJkYXRhIiwiZW5jb2RpbmciLCJ0ZW1wRmlsZSIsImlzRmlsZSIsInVubGlua1N5bmMiLCJ3cml0ZUZpbGVTeW5jIiwicHJvY2VzcyIsIm9uIl0sIm1hcHBpbmdz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dUMsSUFBNUI7QUFDRCxHQUZELENBRUUsT0FBT0MsR0FBUCxFQUFZO0FBQ1osUUFBSUEsR0FBRyxDQUFDQyxJQUFKLEtBQWEsUUFBakIsRUFBMkI7QUFDekIsWUFBTSxJQUFJOUIsS0FBSixDQUFXLG1CQUFrQmdDLFNBQVUsR0FBdkMsQ0FBTjtBQUNEOztBQUNEakIsSUFBQUEsR0FBRyxDQUFDO0FBQ0ZBLE1BQUFBLEdBQUcsRUFBRTlCLGNBQUtrQyxPQUFMLENBQWFhLFNBQWIsQ0FESDtBQUVGZCxNQUFBQSxJQUFJLEVBQUVqQyxjQUFLRyxRQUFMLENBQWM0QyxTQUFkO0FBRkosS0FBRCxDQUFIO0FBSUQ7O0FBQ0QzQyxjQUFHbUQsYUFBSCxDQUFpQkgsUUFBUSxDQUFDbEQsUUFBMUIsRUFBb0NnRCxJQUFwQyxFQUEwQztBQUFFQyxJQUFBQSxRQUFGO0FBQVlaLElBQUFBO0FBQVosR0FBMUMsRUEzQmlDLENBNEJqQzs7O0FBQ0EsU0FBT2EsUUFBUDtBQUNELEMsQ0FFRDs7O0FBRUFJLE9BQU8sQ0FBQ0MsRUFBUixDQUFXLE1BQVgsRUFBbUI3QixPQUFuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCByYW5kb21TdHJpbmcgZnJvbSAnY3J5cHRvLXJhbmRvbS1zdHJpbmcnO1xuXG4vLyBjb25zdGFudHNcblxuY29uc3QgRU1QVFlfU1RSSU5HID0gJyc7XG5cbmNvbnN0IERFRkFVTFRfRElSX01PREUgPSAwbzc3NztcbmNvbnN0IERFRkFVTFRfRU5DT0RJTkcgPSAndXRmOCc7XG5jb25zdCBERUZBVUxUX0ZJTEVfTU9ERSA9IDBvNjY2O1xuY29uc3QgREVGQVVMVF9OQU1FID0gJ3RlbXBvcmFyaWx5LXtXV1dXRERERH0nO1xuY29uc3QgVE1QX0RJUiA9ICd0ZW1wb3JhcmlseS17WFhYWFhYWFh9JztcblxuY29uc3QgRElHSVQgPSAnMTIzNDU2Nzg5MCc7XG5jb25zdCBXT1JEID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonO1xuXG5jb25zdCBURU1QTEFURV9JTlRFUlBPTEFURSA9IC9cXHsoW159XSspXFx9L2c7XG5cbi8vIHV0aWxzXG5cbmNvbnN0IHNhbXBsZSA9IChhcnJheSkgPT4gYXJyYXlbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYXJyYXkubGVuZ3RoKV07XG5cbi8vIHByaXZhdGVcblxuY29uc3QgdGVtcGxhdGVDaGFycyA9IHtcbiAgLyogZXNsaW50LWRpc2FibGUgaWQtbGVuZ3RoICovXG4gIGQ6ICgpID0+IHNhbXBsZShESUdJVCksXG4gIHc6ICgpID0+IHNhbXBsZShXT1JEKSxcbiAgeDogKCkgPT4gcmFuZG9tU3RyaW5nKDEpLFxuICAvKiBlc2xpbnQtZW5hYmxlIGlkLWxlbmd0aCAqL1xufTtcblxubGV0IHRlbXBYQ2FsbGJhY2tzID0gW107XG5cbi8vIGNvbnN0IGRlYnVnID0gKC4uLmFyZ3MpID0+IHtcbi8vICAgY29uc29sZS5sb2coLi4uYXJncyk7XG4vLyB9O1xuXG5jb25zdCBtb3ZlVG8gPSAodG9UZW1wRGlyLCBtb3ZlID0gdHJ1ZSkgPT4gKGZyb21UZW1wKSA9PiB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG4gIGNvbnN0IG5ld0ZpbGVwYXRoID0gcGF0aC5qb2luKFxuICAgIHRvVGVtcERpci5maWxlcGF0aCxcbiAgICBwYXRoLmJhc2VuYW1lKGZyb21UZW1wLmZpbGVwYXRoKSxcbiAgKTtcbiAgaWYgKG1vdmUpIHtcbiAgICBmcy5yZW5hbWVTeW5jKGZyb21UZW1wLmZpbGVwYXRoLCBuZXdGaWxlcGF0aCk7XG4gICAgLy8gZGVidWcoJ01PVkVEJywgZnJvbVRlbXAuZmlsZXBhdGgsIG5ld0ZpbGVwYXRoKTtcbiAgfVxuICBmcm9tVGVtcC5maWxlcGF0aCA9IG5ld0ZpbGVwYXRoO1xuICBpZiAoZnJvbVRlbXAuY2hpbGRyZW4pIHtcbiAgICBmcm9tVGVtcC5jaGlsZHJlbiA9IGZyb21UZW1wLmNoaWxkcmVuLm1hcChtb3ZlVG8oZnJvbVRlbXAsIGZhbHNlKSk7XG4gIH1cbiAgcmV0dXJuIGZyb21UZW1wO1xufTtcblxuY29uc3QgdGVtcGxhdGVSZXBsYWNlciA9IChtYXRjaCwgaW5uZXJNYXRjaCkgPT5cbiAgaW5uZXJNYXRjaFxuICAgIC5zcGxpdChFTVBUWV9TVFJJTkcpXG4gICAgLm1hcCgoY2hhcikgPT4ge1xuICAgICAgY29uc3QgY2hhcnMgPSB0ZW1wbGF0ZUNoYXJzW2NoYXIudG9Mb3dlckNhc2UoKV07XG4gICAgICBpZiAoIWNoYXJzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRXhwZWN0ZWQgdGVtcGxhdGUgcGxhY2Vob2xkZXIgdG8gYmUgb25lIG9mOiAke09iamVjdC5rZXlzKFxuICAgICAgICAgICAgdGVtcGxhdGVDaGFycyxcbiAgICAgICAgICApLmpvaW4oJywgJyl9LiBSZWNlaXZlZCAke2NoYXJ9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGFycygpO1xuICAgIH0pXG4gICAgLmpvaW4oRU1QVFlfU1RSSU5HKTtcblxuY29uc3QgdG1wRGlyID0gKCkgPT4gcGF0aC5qb2luKG9zLnRtcGRpcigpLCBUTVBfRElSLnJlcGxhY2UoVEVNUExBVEVfSU5URVJQT0xBVEUsIHRlbXBsYXRlUmVwbGFjZXIpKTtcblxuLy8gZXhwb3J0c1xuXG5mdW5jdGlvbiByZWdpc3RlckNsZWFudXAoZm4pIHtcbiAgdGVtcFhDYWxsYmFja3MucHVzaChmbik7XG4gIHJldHVybiBmdW5jdGlvbiBtYW51YWxDbGVhbnVwT25lKCkge1xuICAgIGZuKCk7XG4gICAgdGVtcFhDYWxsYmFja3MgPSB0ZW1wWENhbGxiYWNrcy5maWx0ZXIoKGNhbGxiYWNrKSA9PiBjYWxsYmFjayAhPT0gZm4pO1xuICB9XG59XG5cbi8qKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gIHRlbXBYQ2FsbGJhY2tzLmZvckVhY2goKGZuKSA9PiB7XG4gICAgZm4oKTtcbiAgfSk7XG4gIHRlbXBYQ2FsbGJhY2tzLmxlbmd0aCA9IDA7XG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmRpcj1vcy50bXBkaXJdXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuZXh0XVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm5hbWU9dGVtcG9yYXJpbHkte1dXV1dEREREfV1cbiAqIEByZXR1cm4ge3N0cmluZ30gZmlsZXBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGVwYXRoKHtcbiAgZGlyOiBkaXJQYXRoID0gdG1wRGlyKCksXG4gIGV4dCA9IG51bGwsXG4gIG5hbWUgPSBERUZBVUxUX05BTUUsXG59ID0ge30pIHtcbiAgY29uc3QgZGlybmFtZSA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgY29uc3QgYmFzZW5hbWUgPSBuYW1lLnJlcGxhY2UoVEVNUExBVEVfSU5URVJQT0xBVEUsIHRlbXBsYXRlUmVwbGFjZXIpO1xuICByZXR1cm4gcGF0aC5qb2luKGRpcm5hbWUsIGAke2Jhc2VuYW1lfSR7ZXh0ID8gYC4ke2V4dH1gIDogJyd9YCk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9ICAgICAgICBbb3B0aW9uc11cbiAqIEBwYXJhbSB7bnVtYmVyfSAgICAgICAgW29wdGlvbnMubW9kZT0wbzc3N11cbiAqIEBwYXJhbSB7QXJyYXk8b2JqZWN0Pn0gW2NoaWxkcmVuXVxuICogQHJldHVybiB7b2JqZWN0fSBkaXIgcHJvcHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpcihvcHRpb25zID0ge30sIGNoaWxkcmVuID0gW10pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucykpIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuICAgIGNoaWxkcmVuID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0ge307XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuICB9XG4gIGNvbnN0IHsgbW9kZSA9IERFRkFVTFRfRElSX01PREUgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHRlbXBEaXIgPSB7XG4gICAgZmlsZXBhdGg6IGZpbGVwYXRoKG9wdGlvbnMpLFxuICAgIGlzRGlyOiB0cnVlLFxuICAgIG1vZGUsXG4gIH07XG4gIHRyeSB7XG4gICAgZnMuYWNjZXNzU3luYyh0ZW1wRGlyLmZpbGVwYXRoLCBmcy5GX09LKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyci5jb2RlICE9PSAnRU5PRU5UJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgY2hlY2sgJHt0ZW1wRGlyLmZpbGVwYXRofS5gKTtcbiAgICB9XG4gICAgdGVtcERpci5jbGVhbnVwID0gcmVnaXN0ZXJDbGVhbnVwKCgpID0+IHtcbiAgICAgIGZzLnJtZGlyU3luYyh0ZW1wRGlyLmZpbGVwYXRoKTtcbiAgICB9KTtcbiAgICBjb25zdCBwYXJlbnREaXIgPSBwYXRoLmRpcm5hbWUodGVtcERpci5maWxlcGF0aCk7XG4gICAgZGlyKHtcbiAgICAgIGRpcjogcGF0aC5kaXJuYW1lKHBhcmVudERpciksXG4gICAgICBuYW1lOiBwYXRoLmJhc2VuYW1lKHBhcmVudERpciksXG4gICAgfSk7XG4gICAgZnMubWtkaXJTeW5jKHRlbXBEaXIuZmlsZXBhdGgsIG1vZGUpO1xuICAgIC8vIGRlYnVnKCdDUkVBVEVEIERJUicsIHRlbXBEaXIuZmlsZXBhdGgpO1xuICB9XG4gIGlmIChjaGlsZHJlbi5sZW5ndGggIT09IDApIHtcbiAgICB0ZW1wRGlyLmNoaWxkcmVuID0gY2hpbGRyZW4ubWFwKG1vdmVUbyh0ZW1wRGlyKSk7XG4gIH1cbiAgcmV0dXJuIHRlbXBEaXI7XG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmRhdGE9JyddXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuZW5jb2Rpbmc9dXRmOF1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tb2RlPTBvNjY2XVxuICogQHJldHVybiB7b2JqZWN0fSBmaWxlIHByb3BzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxlKG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZGF0YSA9ICcnLFxuICAgIGVuY29kaW5nID0gREVGQVVMVF9FTkNPRElORyxcbiAgICBtb2RlID0gREVGQVVMVF9GSUxFX01PREUsXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCB0ZW1wRmlsZSA9IHtcbiAgICBkYXRhLFxuICAgIGZpbGVwYXRoOiBmaWxlcGF0aChvcHRpb25zKSxcbiAgICBpc0ZpbGU6IHRydWUsXG4gICAgbW9kZSxcbiAgfTtcbiAgY29uc3QgcGFyZW50RGlyID0gcGF0aC5kaXJuYW1lKHRlbXBGaWxlLmZpbGVwYXRoKTtcbiAgdGVtcEZpbGUuY2xlYW51cCA9IHJlZ2lzdGVyQ2xlYW51cCgoKSA9PiB7XG4gICAgZnMudW5saW5rU3luYyh0ZW1wRmlsZS5maWxlcGF0aCk7XG4gIH0pO1xuICB0cnkge1xuICAgIGZzLmFjY2Vzc1N5bmMocGFyZW50RGlyLCBmcy5GX09LKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyci5jb2RlICE9PSAnRU5PRU5UJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgY2hlY2sgJHtwYXJlbnREaXJ9LmApO1xuICAgIH1cbiAgICBkaXIoe1xuICAgICAgZGlyOiBwYXRoLmRpcm5hbWUocGFyZW50RGlyKSxcbiAgICAgIG5hbWU6IHBhdGguYmFzZW5hbWUocGFyZW50RGlyKSxcbiAgICB9KTtcbiAgfVxuICBmcy53cml0ZUZpbGVTeW5jKHRlbXBGaWxlLmZpbGVwYXRoLCBkYXRhLCB7IGVuY29kaW5nLCBtb2RlIH0pO1xuICAvLyBkZWJ1ZygnQ1JFQVRFRCBGSUxFJywgdGVtcEZpbGUuZmlsZXBhdGgpO1xuICByZXR1cm4gdGVtcEZpbGU7XG59XG5cbi8vIGF1dG8gY2xlYW4gdXBcblxucHJvY2Vzcy5vbignZXhpdCcsIGNsZWFudXApO1xuIl19