| 1 | 'use strict';var _contextCompat = require('eslint-module-utils/contextCompat');
|
|---|
| 2 | var _vm = require('vm');var _vm2 = _interopRequireDefault(_vm);
|
|---|
| 3 |
|
|---|
| 4 | var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { 'default': obj };}
|
|---|
| 5 |
|
|---|
| 6 | module.exports = {
|
|---|
| 7 | meta: {
|
|---|
| 8 | type: 'suggestion',
|
|---|
| 9 | docs: {
|
|---|
| 10 | category: 'Style guide',
|
|---|
| 11 | description: 'Enforce a leading comment with the webpackChunkName for dynamic imports.',
|
|---|
| 12 | url: (0, _docsUrl2['default'])('dynamic-import-chunkname') },
|
|---|
| 13 |
|
|---|
| 14 | schema: [{
|
|---|
| 15 | type: 'object',
|
|---|
| 16 | properties: {
|
|---|
| 17 | importFunctions: {
|
|---|
| 18 | type: 'array',
|
|---|
| 19 | uniqueItems: true,
|
|---|
| 20 | items: {
|
|---|
| 21 | type: 'string' } },
|
|---|
| 22 |
|
|---|
| 23 |
|
|---|
| 24 | allowEmpty: {
|
|---|
| 25 | type: 'boolean' },
|
|---|
| 26 |
|
|---|
| 27 | webpackChunknameFormat: {
|
|---|
| 28 | type: 'string' } } }],
|
|---|
| 29 |
|
|---|
| 30 |
|
|---|
| 31 |
|
|---|
| 32 | hasSuggestions: true },
|
|---|
| 33 |
|
|---|
| 34 |
|
|---|
| 35 | create: function () {function create(context) {
|
|---|
| 36 | var config = context.options[0];var _ref =
|
|---|
| 37 | config || {},_ref$importFunctions = _ref.importFunctions,importFunctions = _ref$importFunctions === undefined ? [] : _ref$importFunctions,_ref$allowEmpty = _ref.allowEmpty,allowEmpty = _ref$allowEmpty === undefined ? false : _ref$allowEmpty;var _ref2 =
|
|---|
| 38 | config || {},_ref2$webpackChunknam = _ref2.webpackChunknameFormat,webpackChunknameFormat = _ref2$webpackChunknam === undefined ? '([0-9a-zA-Z-_/.]|\\[(request|index)\\])+' : _ref2$webpackChunknam;
|
|---|
| 39 |
|
|---|
| 40 | var paddedCommentRegex = /^ (\S[\s\S]+\S) $/;
|
|---|
| 41 | var commentStyleRegex = /^( ((webpackChunkName: .+)|((webpackPrefetch|webpackPreload): (true|false|-?[0-9]+))|(webpackIgnore: (true|false))|((webpackInclude|webpackExclude): \/.*\/)|(webpackMode: ["'](lazy|lazy-once|eager|weak)["'])|(webpackExports: (['"]\w+['"]|\[(['"]\w+['"], *)+(['"]\w+['"]*)\]))),?)+ $/;
|
|---|
| 42 | var chunkSubstrFormat = 'webpackChunkName: ["\']' + String(webpackChunknameFormat) + '["\'],? ';
|
|---|
| 43 | var chunkSubstrRegex = new RegExp(chunkSubstrFormat);
|
|---|
| 44 | var eagerModeFormat = 'webpackMode: ["\']eager["\'],? ';
|
|---|
| 45 | var eagerModeRegex = new RegExp(eagerModeFormat);
|
|---|
| 46 |
|
|---|
| 47 | function run(node, arg) {
|
|---|
| 48 | var sourceCode = (0, _contextCompat.getSourceCode)(context);
|
|---|
| 49 | var leadingComments = sourceCode.getCommentsBefore ?
|
|---|
| 50 | sourceCode.getCommentsBefore(arg) // This method is available in ESLint >= 4.
|
|---|
| 51 | : sourceCode.getComments(arg).leading; // This method is deprecated in ESLint 7.
|
|---|
| 52 |
|
|---|
| 53 | if ((!leadingComments || leadingComments.length === 0) && !allowEmpty) {
|
|---|
| 54 | context.report({
|
|---|
| 55 | node: node,
|
|---|
| 56 | message: 'dynamic imports require a leading comment with the webpack chunkname' });
|
|---|
| 57 |
|
|---|
| 58 | return;
|
|---|
| 59 | }
|
|---|
| 60 |
|
|---|
| 61 | var isChunknamePresent = false;
|
|---|
| 62 | var isEagerModePresent = false;var _iteratorNormalCompletion = true;var _didIteratorError = false;var _iteratorError = undefined;try {
|
|---|
| 63 |
|
|---|
| 64 | for (var _iterator = leadingComments[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {var comment = _step.value;
|
|---|
| 65 | if (comment.type !== 'Block') {
|
|---|
| 66 | context.report({
|
|---|
| 67 | node: node,
|
|---|
| 68 | message: 'dynamic imports require a /* foo */ style comment, not a // foo comment' });
|
|---|
| 69 |
|
|---|
| 70 | return;
|
|---|
| 71 | }
|
|---|
| 72 |
|
|---|
| 73 | if (!paddedCommentRegex.test(comment.value)) {
|
|---|
| 74 | context.report({
|
|---|
| 75 | node: node,
|
|---|
| 76 | message: 'dynamic imports require a block comment padded with spaces - /* foo */' });
|
|---|
| 77 |
|
|---|
| 78 | return;
|
|---|
| 79 | }
|
|---|
| 80 |
|
|---|
| 81 | try {
|
|---|
| 82 | // just like webpack itself does
|
|---|
| 83 | _vm2['default'].runInNewContext('(function() {return {' + String(comment.value) + '}})()');
|
|---|
| 84 | } catch (error) {
|
|---|
| 85 | context.report({
|
|---|
| 86 | node: node,
|
|---|
| 87 | message: 'dynamic imports require a "webpack" comment with valid syntax' });
|
|---|
| 88 |
|
|---|
| 89 | return;
|
|---|
| 90 | }
|
|---|
| 91 |
|
|---|
| 92 | if (!commentStyleRegex.test(comment.value)) {
|
|---|
| 93 | context.report({
|
|---|
| 94 | node: node,
|
|---|
| 95 | message: 'dynamic imports require a "webpack" comment with valid syntax' });
|
|---|
| 96 |
|
|---|
| 97 |
|
|---|
| 98 | return;
|
|---|
| 99 | }
|
|---|
| 100 |
|
|---|
| 101 | if (eagerModeRegex.test(comment.value)) {
|
|---|
| 102 | isEagerModePresent = true;
|
|---|
| 103 | }
|
|---|
| 104 |
|
|---|
| 105 | if (chunkSubstrRegex.test(comment.value)) {
|
|---|
| 106 | isChunknamePresent = true;
|
|---|
| 107 | }
|
|---|
| 108 | }} catch (err) {_didIteratorError = true;_iteratorError = err;} finally {try {if (!_iteratorNormalCompletion && _iterator['return']) {_iterator['return']();}} finally {if (_didIteratorError) {throw _iteratorError;}}}
|
|---|
| 109 |
|
|---|
| 110 | if (isChunknamePresent && isEagerModePresent) {
|
|---|
| 111 | context.report({
|
|---|
| 112 | node: node,
|
|---|
| 113 | message: 'dynamic imports using eager mode do not need a webpackChunkName',
|
|---|
| 114 | suggest: [
|
|---|
| 115 | {
|
|---|
| 116 | desc: 'Remove webpackChunkName',
|
|---|
| 117 | fix: function () {function fix(fixer) {var _iteratorNormalCompletion2 = true;var _didIteratorError2 = false;var _iteratorError2 = undefined;try {
|
|---|
| 118 | for (var _iterator2 = leadingComments[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {var _comment = _step2.value;
|
|---|
| 119 | if (chunkSubstrRegex.test(_comment.value)) {
|
|---|
| 120 | var replacement = _comment.value.replace(chunkSubstrRegex, '').trim().replace(/,$/, '');
|
|---|
| 121 | if (replacement === '') {
|
|---|
| 122 | return fixer.remove(_comment);
|
|---|
| 123 | } else {
|
|---|
| 124 | return fixer.replaceText(_comment, '/* ' + String(replacement) + ' */');
|
|---|
| 125 | }
|
|---|
| 126 | }
|
|---|
| 127 | }} catch (err) {_didIteratorError2 = true;_iteratorError2 = err;} finally {try {if (!_iteratorNormalCompletion2 && _iterator2['return']) {_iterator2['return']();}} finally {if (_didIteratorError2) {throw _iteratorError2;}}}
|
|---|
| 128 | }return fix;}() },
|
|---|
| 129 |
|
|---|
| 130 | {
|
|---|
| 131 | desc: 'Remove webpackMode',
|
|---|
| 132 | fix: function () {function fix(fixer) {var _iteratorNormalCompletion3 = true;var _didIteratorError3 = false;var _iteratorError3 = undefined;try {
|
|---|
| 133 | for (var _iterator3 = leadingComments[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {var _comment2 = _step3.value;
|
|---|
| 134 | if (eagerModeRegex.test(_comment2.value)) {
|
|---|
| 135 | var replacement = _comment2.value.replace(eagerModeRegex, '').trim().replace(/,$/, '');
|
|---|
| 136 | if (replacement === '') {
|
|---|
| 137 | return fixer.remove(_comment2);
|
|---|
| 138 | } else {
|
|---|
| 139 | return fixer.replaceText(_comment2, '/* ' + String(replacement) + ' */');
|
|---|
| 140 | }
|
|---|
| 141 | }
|
|---|
| 142 | }} catch (err) {_didIteratorError3 = true;_iteratorError3 = err;} finally {try {if (!_iteratorNormalCompletion3 && _iterator3['return']) {_iterator3['return']();}} finally {if (_didIteratorError3) {throw _iteratorError3;}}}
|
|---|
| 143 | }return fix;}() }] });
|
|---|
| 144 |
|
|---|
| 145 |
|
|---|
| 146 |
|
|---|
| 147 | }
|
|---|
| 148 |
|
|---|
| 149 | if (!isChunknamePresent && !allowEmpty && !isEagerModePresent) {
|
|---|
| 150 | context.report({
|
|---|
| 151 | node: node,
|
|---|
| 152 | message: 'dynamic imports require a leading comment in the form /*' +
|
|---|
| 153 | chunkSubstrFormat + '*/' });
|
|---|
| 154 |
|
|---|
| 155 | }
|
|---|
| 156 | }
|
|---|
| 157 |
|
|---|
| 158 | return {
|
|---|
| 159 | ImportExpression: function () {function ImportExpression(node) {
|
|---|
| 160 | run(node, node.source);
|
|---|
| 161 | }return ImportExpression;}(),
|
|---|
| 162 |
|
|---|
| 163 | CallExpression: function () {function CallExpression(node) {
|
|---|
| 164 | if (node.callee.type !== 'Import' && importFunctions.indexOf(node.callee.name) < 0) {
|
|---|
| 165 | return;
|
|---|
| 166 | }
|
|---|
| 167 |
|
|---|
| 168 | run(node, node.arguments[0]);
|
|---|
| 169 | }return CallExpression;}() };
|
|---|
| 170 |
|
|---|
| 171 | }return create;}() };
|
|---|
| 172 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9keW5hbWljLWltcG9ydC1jaHVua25hbWUuanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJ0eXBlIiwiZG9jcyIsImNhdGVnb3J5IiwiZGVzY3JpcHRpb24iLCJ1cmwiLCJzY2hlbWEiLCJwcm9wZXJ0aWVzIiwiaW1wb3J0RnVuY3Rpb25zIiwidW5pcXVlSXRlbXMiLCJpdGVtcyIsImFsbG93RW1wdHkiLCJ3ZWJwYWNrQ2h1bmtuYW1lRm9ybWF0IiwiaGFzU3VnZ2VzdGlvbnMiLCJjcmVhdGUiLCJjb250ZXh0IiwiY29uZmlnIiwib3B0aW9ucyIsInBhZGRlZENvbW1lbnRSZWdleCIsImNvbW1lbnRTdHlsZVJlZ2V4IiwiY2h1bmtTdWJzdHJGb3JtYXQiLCJjaHVua1N1YnN0clJlZ2V4IiwiUmVnRXhwIiwiZWFnZXJNb2RlRm9ybWF0IiwiZWFnZXJNb2RlUmVnZXgiLCJydW4iLCJub2RlIiwiYXJnIiwic291cmNlQ29kZSIsImxlYWRpbmdDb21tZW50cyIsImdldENvbW1lbnRzQmVmb3JlIiwiZ2V0Q29tbWVudHMiLCJsZWFkaW5nIiwibGVuZ3RoIiwicmVwb3J0IiwibWVzc2FnZSIsImlzQ2h1bmtuYW1lUHJlc2VudCIsImlzRWFnZXJNb2RlUHJlc2VudCIsImNvbW1lbnQiLCJ0ZXN0IiwidmFsdWUiLCJ2bSIsInJ1bkluTmV3Q29udGV4dCIsImVycm9yIiwic3VnZ2VzdCIsImRlc2MiLCJmaXgiLCJmaXhlciIsInJlcGxhY2VtZW50IiwicmVwbGFjZSIsInRyaW0iLCJyZW1vdmUiLCJyZXBsYWNlVGV4dCIsIkltcG9ydEV4cHJlc3Npb24iLCJzb3VyY2UiLCJDYWxsRXhwcmVzc2lvbiIsImNhbGxlZSIsImluZGV4T2YiLCJuYW1lIiwiYXJndW1lbnRzIl0sIm1hcHBpbmdzIjoiYUFBQTtBQUNBLHdCOztBQUVBLHFDOztBQUVBQSxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZDLFFBQU07QUFDSkMsVUFBTSxZ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RUFBdEMsRUFBMEMwQixJQUExQyxHQUFpREQsT0FBakQsQ0FBeUQsSUFBekQsRUFBK0QsRUFBL0QsQ0FBcEI7QUFDQSw0QkFBSUQsZ0JBQWdCLEVBQXBCLEVBQXdCO0FBQ3RCLGlDQUFPRCxNQUFNSSxNQUFOLENBQWFiLFNBQWIsQ0FBUDtBQUNELHlCQUZELE1BRU87QUFDTCxpQ0FBT1MsTUFBTUssV0FBTixDQUFrQmQsU0FBbEIsaUJBQWlDVSxXQUFqQyxVQUFQO0FBQ0Q7QUFDRjtBQUNGLHFCQVZRO0FBV1YsaUJBYkgsZ0JBaEJPLENBSEksRUFBZjs7OztBQW9DRDs7QUFFRCxZQUFJLENBQUNaLGtCQUFELElBQXVCLENBQUN6QixVQUF4QixJQUFzQyxDQUFDMEIsa0JBQTNDLEVBQStEO0FBQzdEdEIsa0JBQVFtQixNQUFSLENBQWU7QUFDYlIsc0JBRGE7QUFFYlM7QUFDNkRmLDZCQUQ3RCxPQUZhLEVBQWY7O0FBS0Q7QUFDRjs7QUFFRCxhQUFPO0FBQ0xpQyx3QkFESyx5Q0FDWTNCLElBRFosRUFDa0I7QUFDckJELGdCQUFJQyxJQUFKLEVBQVVBLEtBQUs0QixNQUFmO0FBQ0QsV0FISTs7QUFLTEMsc0JBTEssdUNBS1U3QixJQUxWLEVBS2dCO0FBQ25CLGdCQUFJQSxLQUFLOEIsTUFBTCxDQUFZdkQsSUFBWixLQUFxQixRQUFyQixJQUFpQ08sZ0JBQWdCaUQsT0FBaEIsQ0FBd0IvQixLQUFLOEIsTUFBTCxDQUFZRSxJQUFwQyxJQUE0QyxDQUFqRixFQUFvRjtBQUNsRjtBQUNEOztBQUVEakMsZ0JBQUlDLElBQUosRUFBVUEsS0FBS2lDLFNBQUwsQ0FBZSxDQUFmLENBQVY7QUFDRCxXQVhJLDJCQUFQOztBQWFELEtBcktjLG1CQUFqQiIsImZpbGUiOiJkeW5hbWljLWltcG9ydC1jaHVua25hbWUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRTb3VyY2VDb2RlIH0gZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy9jb250ZXh0Q29tcGF0JztcbmltcG9ydCB2bSBmcm9tICd2bSc7XG5cbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7XG4gICAgICBjYXRlZ29yeTogJ1N0eWxlIGd1aWRlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRW5mb3JjZSBhIGxlYWRpbmcgY29tbWVudCB3aXRoIHRoZSB3ZWJwYWNrQ2h1bmtOYW1lIGZvciBkeW5hbWljIGltcG9ydHMuJyxcbiAgICAgIHVybDogZG9jc1VybCgnZHluYW1pYy1pbXBvcnQtY2h1bmtuYW1lJyksXG4gICAgfSxcbiAgICBzY2hlbWE6IFt7XG4gICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgaW1wb3J0RnVuY3Rpb25zOiB7XG4gICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICB1bmlxdWVJdGVtczogdHJ1ZSxcbiAgICAgICAgICBpdGVtczoge1xuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgYWxsb3dFbXB0eToge1xuICAgICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgfSxcbiAgICAgICAgd2VicGFja0NodW5rbmFtZUZvcm1hdDoge1xuICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9XSxcbiAgICBoYXNTdWdnZXN0aW9uczogdHJ1ZSxcbiAgfSxcblxuICBjcmVhdGUoY29udGV4dCkge1xuICAgIGNvbnN0IGNvbmZpZyA9IGNvbnRleHQub3B0aW9uc1swXTtcbiAgICBjb25zdCB7IGltcG9ydEZ1bmN0aW9ucyA9IFtdLCBhbGxvd0VtcHR5ID0gZmFsc2UgfSA9IGNvbmZpZyB8fCB7fTtcbiAgICBjb25zdCB7IHdlYnBhY2tDaHVua25hbWVGb3JtYXQgPSAnKFswLTlhLXpBLVotXy8uXXxcXFxcWyhyZXF1ZXN0fGluZGV4KVxcXFxdKSsnIH0gPSBjb25maWcgfHwge307XG5cbiAgICBjb25zdCBwYWRkZWRDb21tZW50UmVnZXggPSAvXiAoXFxTW1xcc1xcU10rXFxTKSAkLztcbiAgICBjb25zdCBjb21tZW50U3R5bGVSZWdleCA9IC9eKCAoKHdlYnBhY2tDaHVua05hbWU6IC4rKXwoKHdlYnBhY2tQcmVmZXRjaHx3ZWJwYWNrUHJlbG9hZCk6ICh0cnVlfGZhbHNlfC0/WzAtOV0rKSl8KHdlYnBhY2tJZ25vcmU6ICh0cnVlfGZhbHNlKSl8KCh3ZWJwYWNrSW5jbHVkZXx3ZWJwYWNrRXhjbHVkZSk6IFxcLy4qXFwvKXwod2VicGFja01vZGU6IFtcIiddKGxhenl8bGF6eS1vbmNlfGVhZ2VyfHdlYWspW1wiJ10pfCh3ZWJwYWNrRXhwb3J0czogKFsnXCJdXFx3K1snXCJdfFxcWyhbJ1wiXVxcdytbJ1wiXSwgKikrKFsnXCJdXFx3K1snXCJdKilcXF0pKSksPykrICQvO1xuICAgIGNvbnN0IGNodW5rU3Vic3RyRm9ybWF0ID0gYHdlYnBhY2tDaHVua05hbWU6IFtcIiddJHt3ZWJwYWNrQ2h1bmtuYW1lRm9ybWF0fVtcIiddLD8gYDtcbiAgICBjb25zdCBjaHVua1N1YnN0clJlZ2V4ID0gbmV3IFJlZ0V4cChjaHVua1N1YnN0ckZvcm1hdCk7XG4gICAgY29uc3QgZWFnZXJNb2RlRm9ybWF0ID0gYHdlYnBhY2tNb2RlOiBbXCInXWVhZ2VyW1wiJ10sPyBgO1xuICAgIGNvbnN0IGVhZ2VyTW9kZVJlZ2V4ID0gbmV3IFJlZ0V4cChlYWdlck1vZGVGb3JtYXQpO1xuXG4gICAgZnVuY3Rpb24gcnVuKG5vZGUsIGFyZykge1xuICAgICAgY29uc3Qgc291cmNlQ29kZSA9IGdldFNvdXJjZUNvZGUoY29udGV4dCk7XG4gICAgICBjb25zdCBsZWFkaW5nQ29tbWVudHMgPSBzb3VyY2VDb2RlLmdldENvbW1lbnRzQmVmb3JlXG4gICAgICAgID8gc291cmNlQ29kZS5nZXRDb21tZW50c0JlZm9yZShhcmcpIC8vIFRoaXMgbWV0aG9kIGlzIGF2YWlsYWJsZSBpbiBFU0xpbnQgPj0gNC5cbiAgICAgICAgOiBzb3VyY2VDb2RlLmdldENvbW1lbnRzKGFyZykubGVhZGluZzsgLy8gVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCBpbiBFU0xpbnQgNy5cblxuICAgICAgaWYgKCghbGVhZGluZ0NvbW1lbnRzIHx8IGxlYWRpbmdDb21tZW50cy5sZW5ndGggPT09IDApICYmICFhbGxvd0VtcHR5KSB7XG4gICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdkeW5hbWljIGltcG9ydHMgcmVxdWlyZSBhIGxlYWRpbmcgY29tbWVudCB3aXRoIHRoZSB3ZWJwYWNrIGNodW5rbmFtZScsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBpc0NodW5rbmFtZVByZXNlbnQgPSBmYWxzZTtcbiAgICAgIGxldCBpc0VhZ2VyTW9kZVByZXNlbnQgPSBmYWxzZTtcblxuICAgICAgZm9yIChjb25zdCBjb21tZW50IG9mIGxlYWRpbmdDb21tZW50cykge1xuICAgICAgICBpZiAoY29tbWVudC50eXBlICE9PSAnQmxvY2snKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdkeW5hbWljIGltcG9ydHMgcmVxdWlyZSBhIC8qIGZvbyAqLyBzdHlsZSBjb21tZW50LCBub3QgYSAvLyBmb28gY29tbWVudCcsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYWRkZWRDb21tZW50UmVnZXgudGVzdChjb21tZW50LnZhbHVlKSkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBtZXNzYWdlOiBgZHluYW1pYyBpbXBvcnRzIHJlcXVpcmUgYSBibG9jayBjb21tZW50IHBhZGRlZCB3aXRoIHNwYWNlcyAtIC8qIGZvbyAqL2AsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBqdXN0IGxpa2Ugd2VicGFjayBpdHNlbGYgZG9lc1xuICAgICAgICAgIHZtLnJ1bkluTmV3Q29udGV4dChgKGZ1bmN0aW9uKCkge3JldHVybiB7JHtjb21tZW50LnZhbHVlfX19KSgpYCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBkeW5hbWljIGltcG9ydHMgcmVxdWlyZSBhIFwid2VicGFja1wiIGNvbW1lbnQgd2l0aCB2YWxpZCBzeW50YXhgLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29tbWVudFN0eWxlUmVnZXgudGVzdChjb21tZW50LnZhbHVlKSkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICBgZHluYW1pYyBpbXBvcnRzIHJlcXVpcmUgYSBcIndlYnBhY2tcIiBjb21tZW50IHdpdGggdmFsaWQgc3ludGF4YCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZWFnZXJNb2RlUmVnZXgudGVzdChjb21tZW50LnZhbHVlKSkge1xuICAgICAgICAgIGlzRWFnZXJNb2RlUHJlc2VudCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2h1bmtTdWJzdHJSZWdleC50ZXN0KGNvbW1lbnQudmFsdWUpKSB7XG4gICAgICAgICAgaXNDaHVua25hbWVQcmVzZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNDaHVua25hbWVQcmVzZW50ICYmIGlzRWFnZXJNb2RlUHJlc2VudCkge1xuICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBtZXNzYWdlOiAnZHluYW1pYyBpbXBvcnRzIHVzaW5nIGVhZ2VyIG1vZGUgZG8gbm90IG5lZWQgYSB3ZWJwYWNrQ2h1bmtOYW1lJyxcbiAgICAgICAgICBzdWdnZXN0OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGRlc2M6ICdSZW1vdmUgd2VicGFja0NodW5rTmFtZScsXG4gICAgICAgICAgICAgIGZpeChmaXhlcikge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29tbWVudCBvZiBsZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChjaHVua1N1YnN0clJlZ2V4LnRlc3QoY29tbWVudC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGFjZW1lbnQgPSBjb21tZW50LnZhbHVlLnJlcGxhY2UoY2h1bmtTdWJzdHJSZWdleCwgJycpLnRyaW0oKS5yZXBsYWNlKC8sJC8sICcnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXhlci5yZW1vdmUoY29tbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpeGVyLnJlcGxhY2VUZXh0KGNvbW1lbnQsIGAvKiAke3JlcGxhY2VtZW50fSAqL2ApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZGVzYzogJ1JlbW92ZSB3ZWJwYWNrTW9kZScsXG4gICAgICAgICAgICAgIGZpeChmaXhlcikge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29tbWVudCBvZiBsZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChlYWdlck1vZGVSZWdleC50ZXN0KGNvbW1lbnQudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gY29tbWVudC52YWx1ZS5yZXBsYWNlKGVhZ2VyTW9kZVJlZ2V4LCAnJykudHJpbSgpLnJlcGxhY2UoLywkLywgJycpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpeGVyLnJlbW92ZShjb21tZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZml4ZXIucmVwbGFjZVRleHQoY29tbWVudCwgYC8qICR7cmVwbGFjZW1lbnR9ICovYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzQ2h1bmtuYW1lUHJlc2VudCAmJiAhYWxsb3dFbXB0eSAmJiAhaXNFYWdlck1vZGVQcmVzZW50KSB7XG4gICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICBgZHluYW1pYyBpbXBvcnRzIHJlcXVpcmUgYSBsZWFkaW5nIGNvbW1lbnQgaW4gdGhlIGZvcm0gLyoke2NodW5rU3Vic3RyRm9ybWF0fSovYCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIEltcG9ydEV4cHJlc3Npb24obm9kZSkge1xuICAgICAgICBydW4obm9kZSwgbm9kZS5zb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgQ2FsbEV4cHJlc3Npb24obm9kZSkge1xuICAgICAgICBpZiAobm9kZS5jYWxsZWUudHlwZSAhPT0gJ0ltcG9ydCcgJiYgaW1wb3J0RnVuY3Rpb25zLmluZGV4T2Yobm9kZS5jYWxsZWUubmFtZSkgPCAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcnVuKG5vZGUsIG5vZGUuYXJndW1lbnRzWzBdKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbn07XG4iXX0= |
|---|