extendable-yeoman
Version:
Create Yeoman generators that support extensions and dynamic sub-generators automatically.
217 lines (189 loc) • 22.8 kB
JavaScript
;
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