UNPKG

extendable-yeoman

Version:

Create Yeoman generators that support extensions and dynamic sub-generators automatically.

217 lines (189 loc) 22.8 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _yeomanGenerator = require('yeoman-generator'); var _yeomanGenerator2 = _interopRequireDefault(_yeomanGenerator); var _path = require('path'); var _path2 = _interopRequireDefault(_path); var _globby = require('globby'); var _globby2 = _interopRequireDefault(_globby); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } /** * This file contains main Pluggable Yeoman object. * * This object extends the base Yeoman generator object and exposes a new * version of it that supports a plugin architecture allowing plugins to * be used with generators built on top of it. */ // Import dependencies /** * The Pluggable Yo base object * */ var Base = _yeomanGenerator2.default.Base.extend({ _extensionLookups: ['.', 'extensions', 'lib/extensions'], _extensions: {}, /** * Sets up the object, registering methods with the Yeoman run loop. * * @return {Object} The resulting MakeBase object. */ constructor: function constructor() { // Run the baser constructor. _yeomanGenerator2.default.Base.apply(this, arguments); // Set the name this._generatorName = this.options.namespace.split(':')[0]; // Find Extensions this._gatherExtensions(); this._initExtensions(); }, /** * Initializes any extensions or runs any dynamic subgenerators. */ _initExtensions: function _initExtensions() { var argv = arguments.length <= 0 || arguments[0] === undefined ? process.argv : arguments[0]; var generator = false; var ns = this.options.namespace; var rawNS = argv[2].split(/:/); var last = rawNS.pop(); if (last[0] === '/') { ns = rawNS.concat(last.slice(1)).join(':'); generator = true; this.run = function (cb) { if (typeof cb === 'function') { cb(); } }; } if (!(ns in this._extensions)) { if (generator) { this.env.error('The dynamic sub-generator ' + ns + ' does not exist.'); } return false; } for (var i = 0, length = this._extensions[ns].length; i < length; i++) { if (generator) { this.env.register(this._extensions[ns][i], ns + i); this.env.run([ns + i].concat(this.args), this.options); } else { require(this._extensions[ns][i])(this); } } return this; }, /** * Search for generator extensions. * * A generator extension can modify the behavior of the extended generator, * or even add new sub-generators to it. * * Defaults lookups are: * - ./ * - extensions/ * - lib/extensions/ * * So this index file * `node_modules/ext-dummy-modification/lib/extensions/yo/index.js` would * automatically invoked when the `dummy:yo` generator is invoked. */ _gatherExtensions: function _gatherExtensions() { var _this = this; var extensionModules = this._searchForExtensions(this._getNpmPaths()); var patterns = []; this._extensionLookups.forEach(function (lookup) { extensionModules.forEach(function (modulePath) { patterns.push(_path2.default.join(modulePath, lookup)); }); }); patterns.forEach(function (pattern) { _globby2.default.sync(['*/index.js', '*/*/index.js', '!node_modules/*/index.js'], { cwd: pattern }).forEach(function (filename) { var ns = _this._generatorName + ':' + _this.env.namespace(filename); if (!(ns in _this._extensions)) { _this._extensions[ns] = []; } _this._extensions[ns].push(_path2.default.join(pattern, filename)); }); }); }, /** * Search npm for every available generator extensions. * * Generator Extensions are npm packages who's name start with * `ext-<generator-name>-` and are place in the top level `node_module` * path. They can be installed globally or locally. * * @param {Array} List of search paths * @return {Array} List of the generator modules path */ _searchForExtensions: function _searchForExtensions(searchPaths) { var _this2 = this; var modules = []; searchPaths.forEach(function (root) { if (!root) { return; } modules.push.apply(modules, _toConsumableArray(_globby2.default.sync(_this2._getExtensionPrefixes(), { cwd: root }).map(function (match) { return _path2.default.join(root, match); }))); }); return modules; }, /** * Get the npm lookup directories (`node_modules/`) * * @return {Array} lookup paths */ _getNpmPaths: function _getNpmPaths() { var proc = arguments.length <= 0 || arguments[0] === undefined ? process : arguments[0]; var directory = arguments.length <= 1 || arguments[1] === undefined ? __dirname : arguments[1]; var win32 = proc.platform === 'win32'; var paths = []; // Add NVM prefix directory if (proc.env.NVM_PATH) { paths.push(_path2.default.join(_path2.default.dirname(proc.env.NVM_PATH), 'node_modules')); } // Adding global npm directories // We tried using npm to get the global modules path, but it hasn't worked out // because of bugs in the parseable implementation of `ls` command and mostly // performance issues. So, we go with our best bet for now. if (proc.env.NODE_PATH) { paths.push.apply(paths, _toConsumableArray(proc.env.NODE_PATH.split(_path2.default.delimiter).filter(function (path) { return !!path; }))); } // global node_modules should be 4 or 2 directory up this one (most of the time) paths.push(_path2.default.join(directory, '../../../..')); paths.push(_path2.default.join(directory, '../..')); // adds support for generator resolving when yeoman-generator has been linked if (proc.argv[1]) { paths.push(_path2.default.join(_path2.default.dirname(proc.argv[1]), '../..')); } // Default paths for each system if (win32) { paths.push(_path2.default.join(proc.env.APPDATA, 'npm/node_modules')); } else { paths.push(_path2.default.join(_path2.default.sep, 'usr', 'lib', 'node_modules')); } // Walk up the CWD and add `node_modules/` folder lookup on each level proc.cwd().split(_path2.default.sep).forEach(function (part, i, parts) { var prefix = !win32 ? _path2.default.sep : ''; paths.push(prefix + _path2.default.join.apply(_path2.default, parts.slice(0, i + 1).concat(['node_modules']))); }); return paths.reverse(); }, /** * Gets the default prefixes when searching for extensions via Globby. * * You can override this in your own base module if you would like your * extension previs to be different than the default. * * @return {Array} An array of glob strings for extension search. */ _getExtensionPrefixes: function _getExtensionPrefixes() { return ['ext-' + this._generatorName + '-*', '@*/ext-' + this._generatorName + '-*']; } }); exports.default = Base; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9iYXNlLmpzIl0sIm5hbWVzIjpbIkJhc2UiLCJleHRlbmQiLCJfZXh0ZW5zaW9uTG9va3VwcyIsIl9leHRlbnNpb25zIiwiY29uc3RydWN0b3IiLCJhcHBseSIsImFyZ3VtZW50cyIsIl9nZW5lcmF0b3JOYW1lIiwib3B0aW9ucyIsIm5hbWVzcGFjZSIsInNwbGl0IiwiX2dhdGhlckV4dGVuc2lvbnMiLCJfaW5pdEV4dGVuc2lvbnMiLCJhcmd2IiwicHJvY2VzcyIsImdlbmVyYXRvciIsIm5zIiwicmF3TlMiLCJsYXN0IiwicG9wIiwiY29uY2F0Iiwic2xpY2UiLCJqb2luIiwicnVuIiwiY2IiLCJlbnYiLCJlcnJvciIsImkiLCJsZW5ndGgiLCJyZWdpc3RlciIsImFyZ3MiLCJyZXF1aXJlIiwiZXh0ZW5zaW9uTW9kdWxlcyIsIl9zZWFyY2hGb3JFeHRlbnNpb25zIiwiX2dldE5wbVBhdGhzIiwicGF0dGVybnMiLCJmb3JFYWNoIiwibG9va3VwIiwibW9kdWxlUGF0aCIsInB1c2giLCJzeW5jIiwiY3dkIiwicGF0dGVybiIsImZpbGVuYW1lIiwic2VhcmNoUGF0aHMiLCJtb2R1bGVzIiwicm9vdCIsIl9nZXRFeHRlbnNpb25QcmVmaXhlcyIsIm1hcCIsIm1hdGNoIiwicHJvYyIsImRpcmVjdG9yeSIsIl9fZGlybmFtZSIsIndpbjMyIiwicGxhdGZvcm0iLCJwYXRocyIsIk5WTV9QQVRIIiwiZGlybmFtZSIsIk5PREVfUEFUSCIsImRlbGltaXRlciIsImZpbHRlciIsInBhdGgiLCJBUFBEQVRBIiwic2VwIiwicGFydCIsInBhcnRzIiwicHJlZml4IiwicmV2ZXJzZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBU0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7b01BWEE7Ozs7Ozs7O0FBUUE7OztBQUtBOzs7O0FBSUEsSUFBTUEsT0FBTywwQkFBT0EsSUFBUCxDQUFZQyxNQUFaLENBQW1CO0FBQy9CQyxvQkFBbUIsQ0FDbEIsR0FEa0IsRUFFbEIsWUFGa0Is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LGVBQUtVLEdBQWQsR0FBb0IsRUFBbkM7QUFDQVIsU0FBTWhCLElBQU4sQ0FBWTJCLFNBQVMsZUFBSzVDLElBQUwsQ0FBVWpCLEtBQVYsaUJBQXNCNEQsTUFBTTVDLEtBQU4sQ0FBWSxDQUFaLEVBQWVNLElBQUksQ0FBbkIsRUFBc0JQLE1BQXRCLENBQTZCLENBQUMsY0FBRCxDQUE3QixDQUF0QixDQUFyQjtBQUNBLEdBSEQ7O0FBS0EsU0FBT21DLE1BQU1ZLE9BQU4sRUFBUDtBQUNBLEVBbEs4QjtBQW1LL0I7Ozs7Ozs7O0FBUUFwQix3QkFBdUIsaUNBQVU7QUFDaEMsU0FBTyxDQUNOLFNBQVMsS0FBS3hDLGNBQWQsR0FBK0IsSUFEekIsRUFFTixZQUFZLEtBQUtBLGNBQWpCLEdBQWtDLElBRjVCLENBQVA7QUFJQTtBQWhMOEIsQ0FBbkIsQ0FBYjs7a0JBbUxlUCxJIiwiZmlsZSI6ImJhc2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoaXMgZmlsZSBjb250YWlucyBtYWluIFBsdWdnYWJsZSBZZW9tYW4gb2JqZWN0LlxuICpcbiAqIFRoaXMgb2JqZWN0IGV4dGVuZHMgdGhlIGJhc2UgWWVvbWFuIGdlbmVyYXRvciBvYmplY3QgYW5kIGV4cG9zZXMgYSBuZXdcbiAqIHZlcnNpb24gb2YgaXQgdGhhdCBzdXBwb3J0cyBhIHBsdWdpbiBhcmNoaXRlY3R1cmUgYWxsb3dpbmcgcGx1Z2lucyB0b1xuICogYmUgdXNlZCB3aXRoIGdlbmVyYXRvcnMgYnVpbHQgb24gdG9wIG9mIGl0LlxuICovXG5cbi8vIEltcG9ydCBkZXBlbmRlbmNpZXNcbmltcG9ydCBZZW9tYW4gZnJvbSAneWVvbWFuLWdlbmVyYXRvcic7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBnbG9iYnkgZnJvbSAnZ2xvYmJ5JztcblxuLyoqXG4gKiBUaGUgUGx1Z2dhYmxlIFlvIGJhc2Ugb2JqZWN0XG4gKlxuICovXG5jb25zdCBCYXNlID0gWWVvbWFuLkJhc2UuZXh0ZW5kKHtcblx0X2V4dGVuc2lvbkxvb2t1cHM6IFtcblx0XHQnLicsXG5cdFx0J2V4dGVuc2lvbnMnLFxuXHRcdCdsaWIvZXh0ZW5zaW9ucycsXG5cdF0sXG5cdF9leHRlbnNpb25zOiB7fSxcblx0LyoqXG5cdCAqIFNldHMgdXAgdGhlIG9iamVjdCwgcmVnaXN0ZXJpbmcgbWV0aG9kcyB3aXRoIHRoZSBZZW9tYW4gcnVuIGxvb3AuXG5cdCAqXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIHJlc3VsdGluZyBNYWtlQmFzZSBvYmplY3QuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcjogZnVuY3Rpb24oKXtcblx0XHQvLyBSdW4gdGhlIGJhc2VyIGNvbnN0cnVjdG9yLlxuXHRcdFllb21hbi5CYXNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0Ly8gU2V0IHRoZSBuYW1lXG5cdFx0dGhpcy5fZ2VuZXJhdG9yTmFtZSA9IHRoaXMub3B0aW9ucy5uYW1lc3BhY2Uuc3BsaXQoJzonKVswXTtcblx0XHQvLyBGaW5kIEV4dGVuc2lvbnNcblx0XHR0aGlzLl9nYXRoZXJFeHRlbnNpb25zKCk7XG5cdFx0dGhpcy5faW5pdEV4dGVuc2lvbnMoKTtcblx0fSxcblx0LyoqXG5cdCAqIEluaXRpYWxpemVzIGFueSBleHRlbnNpb25zIG9yIHJ1bnMgYW55IGR5bmFtaWMgc3ViZ2VuZXJhdG9ycy5cblx0ICovXG5cdF9pbml0RXh0ZW5zaW9uczogZnVuY3Rpb24oYXJndiA9IHByb2Nlc3MuYXJndil7XG5cdFx0bGV0IGdlbmVyYXRvciA9IGZhbHNlO1xuXHRcdGxldCBucyA9IHRoaXMub3B0aW9ucy5uYW1lc3BhY2U7XG5cdFx0Y29uc3QgcmF3TlMgPSBhcmd2WzJdLnNwbGl0KC86Lyk7XG5cdFx0Y29uc3QgbGFzdCA9IHJhd05TLnBvcCgpO1xuXG5cdFx0aWYobGFzdFswXSA9PT0gJy8nKXtcblx0XHRcdG5zID0gcmF3TlMuY29uY2F0KGxhc3Quc2xpY2UoMSkpLmpvaW4oJzonKTtcblx0XHRcdGdlbmVyYXRvciA9IHRydWU7XG5cdFx0XHR0aGlzLnJ1biA9IGZ1bmN0aW9uKGNiKXtcblx0XHRcdFx0aWYodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKXtcblx0XHRcdFx0XHRjYigpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRpZighKG5zIGluIHRoaXMuX2V4dGVuc2lvbnMpKXtcblx0XHRcdGlmKGdlbmVyYXRvcil7XG5cdFx0XHRcdHRoaXMuZW52LmVycm9yKGBUaGUgZHluYW1pYyBzdWItZ2VuZXJhdG9yICR7bnN9IGRvZXMgbm90IGV4aXN0LmApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRmb3IobGV0IGkgPSAwLCBsZW5ndGggPSB0aGlzLl9leHRlbnNpb25zW25zXS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKyl7XG5cdFx0XHRpZihnZW5lcmF0b3Ipe1xuXHRcdFx0XHR0aGlzLmVudi5yZWdpc3Rlcih0aGlzLl9leHRlbnNpb25zW25zXVtpXSwgbnMgKyBpKTtcblx0XHRcdFx0dGhpcy5lbnYucnVuKFtucyArIGldLmNvbmNhdCh0aGlzLmFyZ3MpLCB0aGlzLm9wdGlvbnMpO1xuXHRcdFx0fWVsc2V7XG5cdFx0XHRcdHJlcXVpcmUodGhpcy5fZXh0ZW5zaW9uc1tuc11baV0pKHRoaXMpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblx0LyoqXG5cdCAqIFNlYXJjaCBmb3IgZ2VuZXJhdG9yIGV4dGVuc2lvbnMuXG5cdCAqXG5cdCAqIEEgZ2VuZXJhdG9yIGV4dGVuc2lvbiBjYW4gbW9kaWZ5IHRoZSBiZWhhdmlvciBvZiB0aGUgZXh0ZW5kZWQgZ2VuZXJhdG9yLFxuXHQgKiBvciBldmVuIGFkZCBuZXcgc3ViLWdlbmVyYXRvcnMgdG8gaXQuXG5cdCAqXG5cdCAqIERlZmF1bHRzIGxvb2t1cHMgYXJlOlxuXHQgKiAgIC0gLi9cblx0ICogICAtIGV4dGVuc2lvbnMvXG5cdCAqICAgLSBsaWIvZXh0ZW5zaW9ucy9cblx0ICpcblx0ICogU28gdGhpcyBpbmRleCBmaWxlXG5cdCAqIGBub2RlX21vZHVsZXMvZXh0LWR1bW15LW1vZGlmaWNhdGlvbi9saWIvZXh0ZW5zaW9ucy95by9pbmRleC5qc2Agd291bGRcblx0ICogYXV0b21hdGljYWxseSBpbnZva2VkIHdoZW4gdGhlIGBkdW1teTp5b2AgZ2VuZXJhdG9yIGlzIGludm9rZWQuXG5cdCAqL1xuXHRfZ2F0aGVyRXh0ZW5zaW9uczogZnVuY3Rpb24oKXtcblx0XHRjb25zdCBleHRlbnNpb25Nb2R1bGVzID0gdGhpcy5fc2VhcmNoRm9yRXh0ZW5zaW9ucyh0aGlzLl9nZXROcG1QYXRocygpKTtcblx0XHRjb25zdCBwYXR0ZXJucyA9IFtdO1xuXG5cdFx0dGhpcy5fZXh0ZW5zaW9uTG9va3Vwcy5mb3JFYWNoKGZ1bmN0aW9uKGxvb2t1cCl7XG5cdFx0XHRleHRlbnNpb25Nb2R1bGVzLmZvckVhY2goZnVuY3Rpb24obW9kdWxlUGF0aCl7XG5cdFx0XHRcdHBhdHRlcm5zLnB1c2gocGF0aC5qb2luKG1vZHVsZVBhdGgsIGxvb2t1cCkpO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdFx0cGF0dGVybnMuZm9yRWFjaChwYXR0ZXJuID0+IHtcblx0XHRcdGdsb2JieS5zeW5jKFxuXHRcdFx0XHRbJyovaW5kZXguanMnLCAnKi8qL2luZGV4LmpzJywgJyFub2RlX21vZHVsZXMvKi9pbmRleC5qcyddLFxuXHRcdFx0XHR7Y3dkOiBwYXR0ZXJufVxuXHRcdFx0KS5mb3JFYWNoKGZpbGVuYW1lID0+IHtcblx0XHRcdFx0Y29uc3QgbnMgPSBgJHt0aGlzLl9nZW5lcmF0b3JOYW1lfToke3RoaXMuZW52Lm5hbWVzcGFjZShmaWxlbmFtZSl9YDtcblx0XHRcdFx0aWYoIShucyBpbiB0aGlzLl9leHRlbnNpb25zKSl7XG5cdFx0XHRcdFx0dGhpcy5fZXh0ZW5zaW9uc1tuc10gPSBbXTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9leHRlbnNpb25zW25zXS5wdXNoKHBhdGguam9pbihwYXR0ZXJuLCBmaWxlbmFtZSkpO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH0sXG5cdC8qKlxuXHQgKiBTZWFyY2ggbnBtIGZvciBldmVyeSBhdmFpbGFibGUgZ2VuZXJhdG9yIGV4dGVuc2lvbnMuXG5cdCAqXG5cdCAqIEdlbmVyYXRvciBFeHRlbnNpb25zIGFyZSBucG0gcGFja2FnZXMgd2hvJ3MgbmFtZSBzdGFydCB3aXRoXG5cdCAqIGBleHQtPGdlbmVyYXRvci1uYW1lPi1gIGFuZCBhcmUgcGxhY2UgaW4gdGhlIHRvcCBsZXZlbCBgbm9kZV9tb2R1bGVgXG5cdCAqIHBhdGguIFRoZXkgY2FuIGJlIGluc3RhbGxlZCBnbG9iYWxseSBvciBsb2NhbGx5LlxuXHQgKlxuXHQgKiBAcGFyYW0ge0FycmF5fSAgTGlzdCBvZiBzZWFyY2ggcGF0aHNcblx0ICogQHJldHVybiB7QXJyYXl9IExpc3Qgb2YgdGhlIGdlbmVyYXRvciBtb2R1bGVzIHBhdGhcblx0ICovXG5cdF9zZWFyY2hGb3JFeHRlbnNpb25zOiBmdW5jdGlvbihzZWFyY2hQYXRocyl7XG5cdFx0Y29uc3QgbW9kdWxlcyA9IFtdO1xuXG5cdFx0c2VhcmNoUGF0aHMuZm9yRWFjaChyb290ID0+IHtcblx0XHRcdGlmKCFyb290KXtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bW9kdWxlcy5wdXNoKC4uLmdsb2JieS5zeW5jKFxuXHRcdFx0XHRcdHRoaXMuX2dldEV4dGVuc2lvblByZWZpeGVzKCksXG5cdFx0XHRcdFx0e2N3ZDogcm9vdH1cblx0XHRcdFx0KS5tYXAobWF0Y2ggPT4gcGF0aC5qb2luKHJvb3QsIG1hdGNoKSkpO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIG1vZHVsZXM7XG5cdH0sXG5cdC8qKlxuXHQgKiBHZXQgdGhlIG5wbSBsb29rdXAgZGlyZWN0b3JpZXMgKGBub2RlX21vZHVsZXMvYClcblx0ICpcblx0ICogQHJldHVybiB7QXJyYXl9IGxvb2t1cCBwYXRoc1xuXHQgKi9cblx0X2dldE5wbVBhdGhzOiBmdW5jdGlvbihwcm9jID0gcHJvY2VzcywgZGlyZWN0b3J5ID0gX19kaXJuYW1lKXtcblx0XHRjb25zdCB3aW4zMiA9IHByb2MucGxhdGZvcm0gPT09ICd3aW4zMic7XG5cdFx0Y29uc3QgcGF0aHMgPSBbXTtcblxuXHRcdC8vIEFkZCBOVk0gcHJlZml4IGRpcmVjdG9yeVxuXHRcdGlmKHByb2MuZW52Lk5WTV9QQVRIKXtcblx0XHRcdHBhdGhzLnB1c2gocGF0aC5qb2luKHBhdGguZGlybmFtZShwcm9jLmVudi5OVk1fUEFUSCksICdub2RlX21vZHVsZXMnKSk7XG5cdFx0fVxuXG5cdFx0Ly8gQWRkaW5nIGdsb2JhbCBucG0gZGlyZWN0b3JpZXNcblx0XHQvLyBXZSB0cmllZCB1c2luZyBucG0gdG8gZ2V0IHRoZSBnbG9iYWwgbW9kdWxlcyBwYXRoLCBidXQgaXQgaGFzbid0IHdvcmtlZCBvdXRcblx0XHQvLyBiZWNhdXNlIG9mIGJ1Z3MgaW4gdGhlIHBhcnNlYWJsZSBpbXBsZW1lbnRhdGlvbiBvZiBgbHNgIGNvbW1hbmQgYW5kIG1vc3RseVxuXHRcdC8vIHBlcmZvcm1hbmNlIGlzc3Vlcy4gU28sIHdlIGdvIHdpdGggb3VyIGJlc3QgYmV0IGZvciBub3cuXG5cdFx0aWYocHJvYy5lbnYuTk9ERV9QQVRIKXtcblx0XHRcdHBhdGhzLnB1c2goLi4ucHJvYy5lbnYuTk9ERV9QQVRILnNwbGl0KHBhdGguZGVsaW1pdGVyKS5maWx0ZXIocGF0aCA9PiAhIXBhdGgpKTtcblx0XHR9XG5cblx0XHQvLyBnbG9iYWwgbm9kZV9tb2R1bGVzIHNob3VsZCBiZSA0IG9yIDIgZGlyZWN0b3J5IHVwIHRoaXMgb25lIChtb3N0IG9mIHRoZSB0aW1lKVxuXHRcdHBhdGhzLnB1c2gocGF0aC5qb2luKGRpcmVjdG9yeSwgJy4uLy4uLy4uLy4uJykpO1xuXHRcdHBhdGhzLnB1c2gocGF0aC5qb2luKGRpcmVjdG9yeSwgJy4uLy4uJykpO1xuXG5cdFx0Ly8gYWRkcyBzdXBwb3J0IGZvciBnZW5lcmF0b3IgcmVzb2x2aW5nIHdoZW4geWVvbWFuLWdlbmVyYXRvciBoYXMgYmVlbiBsaW5rZWRcblx0XHRpZihwcm9jLmFyZ3ZbMV0pe1xuXHRcdFx0cGF0aHMucHVzaChwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHByb2MuYXJndlsxXSksICcuLi8uLicpKTtcblx0XHR9XG5cblx0XHQvLyBEZWZhdWx0IHBhdGhzIGZvciBlYWNoIHN5c3RlbVxuXHRcdGlmKHdpbjMyKXtcblx0XHRcdHBhdGhzLnB1c2gocGF0aC5qb2luKHByb2MuZW52LkFQUERBVEEsICducG0vbm9kZV9tb2R1bGVzJykpO1xuXHRcdH1lbHNle1xuXHRcdFx0cGF0aHMucHVzaChwYXRoLmpvaW4ocGF0aC5zZXAsICd1c3InLCAnbGliJywgJ25vZGVfbW9kdWxlcycpKTtcblx0XHR9XG5cblx0XHQvLyBXYWxrIHVwIHRoZSBDV0QgYW5kIGFkZCBgbm9kZV9tb2R1bGVzL2AgZm9sZGVyIGxvb2t1cCBvbiBlYWNoIGxldmVsXG5cdFx0cHJvYy5jd2QoKS5zcGxpdChwYXRoLnNlcCkuZm9yRWFjaCgocGFydCwgaSwgcGFydHMpID0+IHtcblx0XHRcdGNvbnN0IHByZWZpeCA9ICF3aW4zMiA/IHBhdGguc2VwIDogJyc7XG5cdFx0XHRwYXRocy5wdXNoKCBwcmVmaXggKyBwYXRoLmpvaW4uYXBwbHkocGF0aCwgcGFydHMuc2xpY2UoMCwgaSArIDEpLmNvbmNhdChbJ25vZGVfbW9kdWxlcyddKSkpO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHBhdGhzLnJldmVyc2UoKTtcblx0fSxcblx0LyoqXG5cdCAqIEdldHMgdGhlIGRlZmF1bHQgcHJlZml4ZXMgd2hlbiBzZWFyY2hpbmcgZm9yIGV4dGVuc2lvbnMgdmlhIEdsb2JieS5cblx0ICpcblx0ICogWW91IGNhbiBvdmVycmlkZSB0aGlzIGluIHlvdXIgb3duIGJhc2UgbW9kdWxlIGlmIHlvdSB3b3VsZCBsaWtlIHlvdXJcblx0ICogZXh0ZW5zaW9uIHByZXZpcyB0byBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgZGVmYXVsdC5cblx0ICpcblx0ICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIGdsb2Igc3RyaW5ncyBmb3IgZXh0ZW5zaW9uIHNlYXJjaC5cblx0ICovXG5cdF9nZXRFeHRlbnNpb25QcmVmaXhlczogZnVuY3Rpb24oKXtcblx0XHRyZXR1cm4gW1xuXHRcdFx0J2V4dC0nICsgdGhpcy5fZ2VuZXJhdG9yTmFtZSArICctKicsXG5cdFx0XHQnQCovZXh0LScgKyB0aGlzLl9nZW5lcmF0b3JOYW1lICsgJy0qJ1xuXHRcdF07XG5cdH1cbn0gKTtcblxuZXhwb3J0IGRlZmF1bHQgQmFzZTtcbiJdfQ== //# sourceMappingURL=base.js.map