UNPKG

18.9 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = void 0;
7
8var _lodash = _interopRequireDefault(require("lodash.memoize"));
9
10var _Lint = require("../Lint");
11
12var _Versioning = _interopRequireWildcard(require("../Versioning"));
13
14var _providers = require("../providers");
15
16function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
17
18function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
19
20function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
22function getName(node) {
23 switch (node.type) {
24 case 'NewExpression':
25 {
26 return node.callee.name;
27 }
28
29 case 'MemberExpression':
30 {
31 return node.object.name;
32 }
33
34 case 'CallExpression':
35 {
36 return node.callee.name;
37 }
38
39 default:
40 throw new Error('not found');
41 }
42}
43
44function generateErrorName(rule) {
45 if (rule.name) return rule.name;
46 if (rule.property) return `${rule.object}.${rule.property}()`;
47 return rule.object;
48}
49
50const getPolyfillSet = (0, _lodash.default)(polyfillArrayJSON => new Set(JSON.parse(polyfillArrayJSON)));
51
52function isPolyfilled(context, rule) {
53 if (!context.settings.polyfills) return false;
54 const polyfills = getPolyfillSet(JSON.stringify(context.settings.polyfills));
55 return (// v2 allowed users to select polyfills based off their caniuseId. This is
56 // no longer supported. Keeping this here to avoid breaking changes.
57 polyfills.has(rule.id) || // Check if polyfill is provided (ex. `Promise.all`)
58 polyfills.has(rule.protoChainId) || // Check if entire API is polyfilled (ex. `Promise`)
59 polyfills.has(rule.protoChain[0])
60 );
61}
62
63const getRulesForTargets = (0, _lodash.default)(targetsJSON => {
64 const targets = JSON.parse(targetsJSON);
65 const result = {
66 CallExpression: [],
67 NewExpression: [],
68 MemberExpression: []
69 };
70
71 _providers.rules.forEach(rule => {
72 if (rule.getUnsupportedTargets(rule, targets).length === 0) return;
73 result[rule.astNodeType].push(rule);
74 });
75
76 return result;
77});
78var _default = {
79 meta: {
80 docs: {
81 description: 'Ensure cross-browser API compatibility',
82 category: 'Compatibility',
83 url: 'https://github.com/amilajack/eslint-plugin-compat/blob/master/docs/rules/compat.md',
84 recommended: true
85 },
86 type: 'problem',
87 schema: [{
88 type: 'string'
89 }]
90 },
91
92 create(context) {
93 // Determine lowest targets from browserslist config, which reads user's
94 // package.json config section. Use config from eslintrc for testing purposes
95 const browserslistConfig = context.settings.browsers || context.settings.targets || context.options[0];
96 const browserslistTargets = (0, _Versioning.Versioning)((0, _Versioning.default)(context.getFilename(), browserslistConfig)); // Stringify to support memoization; browserslistConfig is always an array of new objects.
97
98 const targetedRules = getRulesForTargets(JSON.stringify(browserslistTargets));
99 const errors = [];
100
101 function handleFailingRule(rule, node) {
102 if (isPolyfilled(context, rule)) return;
103 errors.push({
104 node,
105 message: [generateErrorName(rule), 'is not supported in', rule.getUnsupportedTargets(rule, browserslistTargets).join(', ')].join(' ')
106 });
107 }
108
109 const identifiers = new Set();
110 return {
111 CallExpression: _Lint.lintCallExpression.bind(null, handleFailingRule, targetedRules.CallExpression),
112 NewExpression: _Lint.lintNewExpression.bind(null, handleFailingRule, targetedRules.NewExpression),
113 MemberExpression: _Lint.lintMemberExpression.bind(null, handleFailingRule, targetedRules.MemberExpression),
114
115 // Keep track of all the defined variables. Do not report errors for nodes that are not defined
116 Identifier(node) {
117 if (node.parent) {
118 const {
119 type
120 } = node.parent;
121
122 if ( // ex. const { Set } = require('immutable');
123 type === 'Property' || // ex. function Set() {}
124 type === 'FunctionDeclaration' || // ex. const Set = () => {}
125 type === 'VariableDeclarator' || // ex. class Set {}
126 type === 'ClassDeclaration' || // ex. import Set from 'set';
127 type === 'ImportDefaultSpecifier' || // ex. import {Set} from 'set';
128 type === 'ImportSpecifier' || // ex. import {Set} from 'set';
129 type === 'ImportDeclaration') {
130 identifiers.add(node.name);
131 }
132 }
133 },
134
135 'Program:exit': () => {
136 // Get a map of all the variables defined in the root scope (not the global scope)
137 // const variablesMap = context.getScope().childScopes.map(e => e.set)[0];
138 errors.filter(error => !identifiers.has(getName(error.node))).forEach(node => context.report(node));
139 }
140 };
141 }
142
143};
144exports.default = _default;
145//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9jb21wYXQuanMiXSwibmFtZXMiOlsiZ2V0TmFtZSIsIm5vZGUiLCJ0eXBlIiwiY2FsbGVlIiwibmFtZSIsIm9iamVjdCIsIkVycm9yIiwiZ2VuZXJhdGVFcnJvck5hbWUiLCJydWxlIiwicHJvcGVydHkiLCJnZXRQb2x5ZmlsbFNldCIsInBvbHlmaWxsQXJyYXlKU09OIiwiU2V0IiwiSlNPTiIsInBhcnNlIiwiaXNQb2x5ZmlsbGVkIiwiY29udGV4dCIsInNldHRpbmdzIiwicG9seWZpbGxzIiwic3RyaW5naWZ5IiwiaGFzIiwiaWQiLCJwcm90b0NoYWluSWQiLCJwcm90b0NoYWluIiwiZ2V0UnVsZXNGb3JUYXJnZXRzIiwidGFyZ2V0c0pTT04iLCJ0YXJnZXRzIiwicmVzdWx0IiwiQ2FsbEV4cHJlc3Npb24iLCJOZXdFeHByZXNzaW9uIiwiTWVtYmVyRXhwcmVzc2lvbiIsInJ1bGVzIiwiZm9yRWFjaCIsImdldFVuc3VwcG9ydGVkVGFyZ2V0cyIsImxlbmd0aCIsImFzdE5vZGVUeXBlIiwicHVzaCIsIm1ldGEiLCJkb2NzIiwiZGVzY3JpcHRpb24iLCJjYXRlZ29yeSIsInVybCIsInJlY29tbWVuZGVkIiwic2NoZW1hIiwiY3JlYXRlIiwiYnJvd3NlcnNsaXN0Q29uZmlnIiwiYnJvd3NlcnMiLCJvcHRpb25zIiwiYnJvd3NlcnNsaXN0VGFyZ2V0cyIsImdldEZpbGVuYW1lIiwidGFyZ2V0ZWRSdWxlcyIsImVycm9ycyIsImhhbmRsZUZhaWxpbmdSdWxlIiwibWVzc2FnZSIsImpvaW4iLCJpZGVudGlmaWVycyIsImxpbnRDYWxsRXhwcmVzc2lvbiIsImJpbmQiLCJsaW50TmV3RXhwcmVzc2lvbiIsImxpbnRNZW1iZXJFeHByZXNzaW9uIiwiSWRlbnRpZmllciIsInBhcmVudCIsImFkZCIsImZpbHRlciIsImVycm9yIiwicmVwb3J0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQ0E7O0FBQ0E7O0FBS0E7O0FBRUE7Ozs7Ozs7O0FB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ckIsYUFIRCxDQU5WO0FBV0xDLE1BQUFBLGdCQUFnQixFQUFFNkIsMkJBQXFCRixJQUFyQixDQUNoQixJQURnQixFQUVoQkwsaUJBRmdCLEVBR2hCRixhQUFhLENBQUNwQixnQkFIRSxDQVhiOztBQWdCTDtBQUNBOEIsTUFBQUEsVUFBVSxDQUFDM0QsSUFBRCxFQUFtQjtBQUMzQixZQUFJQSxJQUFJLENBQUM0RCxNQUFULEVBQWlCO0FBQ2YsZ0JBQU07QUFBRTNELFlBQUFBO0FBQUYsY0FBV0QsSUFBSSxDQUFDNEQsTUFBdEI7O0FBQ0EsZUFDRTtBQUNBM0QsVUFBQUEsSUFBSSxLQUFLLFVBQVQsSUFDQTtBQUNBQSxVQUFBQSxJQUFJLEtBQUsscUJBRlQsSUFHQTtBQUNBQSxVQUFBQSxJQUFJLEtBQUssb0JBSlQsSUFLQTtBQUNBQSxVQUFBQSxJQUFJLEtBQUssa0JBTlQsSUFPQTtBQUNBQSxVQUFBQSxJQUFJLEtBQUssd0JBUlQsSUFTQTtBQUNBQSxVQUFBQSxJQUFJLEtBQUssaUJBVlQsSUFXQTtBQUNBQSxVQUFBQSxJQUFJLEtBQUssbUJBZFgsRUFlRTtBQUNBcUQsWUFBQUEsV0FBVyxDQUFDTyxHQUFaLENBQWdCN0QsSUFBSSxDQUFDRyxJQUFyQjtBQUNEO0FBQ0Y7QUFDRixPQXZDSTs7QUF3Q0wsc0JBQWdCLE1BQU07QUFDcEI7QUFDQTtBQUNBK0MsUUFBQUEsTUFBTSxDQUNIWSxNQURILENBQ1VDLEtBQUssSUFBSSxDQUFDVCxXQUFXLENBQUNuQyxHQUFaLENBQWdCcEIsT0FBTyxDQUFDZ0UsS0FBSyxDQUFDL0QsSUFBUCxDQUF2QixDQURwQixFQUVHK0IsT0FGSCxDQUVXL0IsSUFBSSxJQUFJZSxPQUFPLENBQUNpRCxNQUFSLENBQWVoRSxJQUFmLENBRm5CO0FBR0Q7QUE5Q0ksS0FBUDtBQWdERDs7QUE3RlksQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEBmbG93XG5pbXBvcnQgbWVtb2l6ZSBmcm9tICdsb2Rhc2gubWVtb2l6ZSc7XG5pbXBvcnQge1xuICBsaW50Q2FsbEV4cHJlc3Npb24sXG4gIGxpbnRNZW1iZXJFeHByZXNzaW9uLFxuICBsaW50TmV3RXhwcmVzc2lvblxufSBmcm9tICcuLi9MaW50JztcbmltcG9ydCBEZXRlcm1pbmVUYXJnZXRzRnJvbUNvbmZpZywgeyBWZXJzaW9uaW5nIH0gZnJvbSAnLi4vVmVyc2lvbmluZyc7XG5pbXBvcnQgdHlwZSB7IEVTTGludE5vZGUsIE5vZGUsIEJyb3dzZXJMaXN0Q29uZmlnIH0gZnJvbSAnLi4vTGludFR5cGVzJztcbmltcG9ydCB7IHJ1bGVzIH0gZnJvbSAnLi4vcHJvdmlkZXJzJztcblxudHlwZSBFU0xpbnQgPSB7XG4gIFthc3ROb2RlVHlwZU5hbWU6IHN0cmluZ106IChub2RlOiBFU0xpbnROb2RlKSA9PiB2b2lkXG59O1xuXG50eXBlIENvbnRleHQgPSB7XG4gIG5vZGU6IEVTTGludE5vZGUsXG4gIG9wdGlvbnM6IEFycmF5PHN0cmluZz4sXG4gIHNldHRpbmdzOiB7XG4gICAgYnJvd3NlcnM6IEFycmF5PHN0cmluZz4sXG4gICAgcG9seWZpbGxzOiBBcnJheTxzdHJpbmc+XG4gIH0sXG4gIGdldEZpbGVuYW1lOiAoKSA9PiBzdHJpbmcsXG4gIHJlcG9ydDogKCkgPT4gdm9pZFxufTtcblxuZnVuY3Rpb24gZ2V0TmFtZShub2RlOiBFU0xpbnROb2RlKTogc3RyaW5nIHtcbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlICdOZXdFeHByZXNzaW9uJzoge1xuICAgICAgcmV0dXJuIG5vZGUuY2FsbGVlLm5hbWU7XG4gICAgfVxuICAgIGNhc2UgJ01lbWJlckV4cHJlc3Npb24nOiB7XG4gICAgICByZXR1cm4gbm9kZS5vYmplY3QubmFtZTtcbiAgICB9XG4gICAgY2FzZSAnQ2FsbEV4cHJlc3Npb24nOiB7XG4gICAgICByZXR1cm4gbm9kZS5jYWxsZWUubmFtZTtcbiAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm90IGZvdW5kJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFcnJvck5hbWUocnVsZTogTm9kZSk6IHN0cmluZyB7XG4gIGlmIChydWxlLm5hbWUpIHJldHVybiBydWxlLm5hbWU7XG4gIGlmIChydWxlLnByb3BlcnR5KSByZXR1cm4gYCR7cnVsZS5vYmplY3R9LiR7cnVsZS5wcm9wZXJ0eX0oKWA7XG4gIHJldHVybiBydWxlLm9iamVjdDtcbn1cblxuY29uc3QgZ2V0UG9seWZpbGxTZXQgPSBtZW1vaXplKFxuICAocG9seWZpbGxBcnJheUpTT046IHN0cmluZyk6IFNldDxTdHJpbmc+ID0+XG4gICAgbmV3IFNldChKU09OLnBhcnNlKHBvbHlmaWxsQXJyYXlKU09OKSlcbik7XG5cbmZ1bmN0aW9uIGlzUG9seWZpbGxlZChjb250ZXh0OiBDb250ZXh0LCBydWxlOiBOb2RlKTogYm9vbGVhbiB7XG4gIGlmICghY29udGV4dC5zZXR0aW5ncy5wb2x5ZmlsbHMpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcG9seWZpbGxzID0gZ2V0UG9seWZpbGxTZXQoSlNPTi5zdHJpbmdpZnkoY29udGV4dC5zZXR0aW5ncy5wb2x5ZmlsbHMpKTtcbiAgcmV0dXJuIChcbiAgICAvLyB2MiBhbGxvd2VkIHVzZXJzIHRvIHNlbGVjdCBwb2x5ZmlsbHMgYmFzZWQgb2ZmIHRoZWlyIGNhbml1c2VJZC4gVGhpcyBpc1xuICAgIC8vIG5vIGxvbmdlciBzdXBwb3J0ZWQuIEtlZXBpbmcgdGhpcyBoZXJlIHRvIGF2b2lkIGJyZWFraW5nIGNoYW5nZXMuXG4gICAgcG9seWZpbGxzLmhhcyhydWxlLmlkKSB8fFxuICAgIC8vIENoZWNrIGlmIHBvbHlmaWxsIGlzIHByb3ZpZGVkIChleC4gYFByb21pc2UuYWxsYClcbiAgICBwb2x5ZmlsbHMuaGFzKHJ1bGUucHJvdG9DaGFpbklkKSB8fFxuICAgIC8vIENoZWNrIGlmIGVudGlyZSBBUEkgaXMgcG9seWZpbGxlZCAoZXguIGBQcm9taXNlYClcbiAgICBwb2x5ZmlsbHMuaGFzKHJ1bGUucHJvdG9DaGFpblswXSlcbiAgKTtcbn1cblxuY29uc3QgZ2V0UnVsZXNGb3JUYXJnZXRzID0gbWVtb2l6ZSgodGFyZ2V0c0pTT046IHN0cmluZyk6IE9iamVjdCA9PiB7XG4gIGNvbnN0IHRhcmdldHMgPSBKU09OLnBhcnNlKHRhcmdldHNKU09OKTtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIENhbGxFeHByZXNzaW9uOiBbXSxcbiAgICBOZXdFeHByZXNzaW9uOiBbXSxcbiAgICBNZW1iZXJFeHByZXNzaW9uOiBbXVxuICB9O1xuICBydWxlcy5mb3JFYWNoKHJ1bGUgPT4ge1xuICAgIGlmIChydWxlLmdldFVuc3VwcG9ydGVkVGFyZ2V0cyhydWxlLCB0YXJnZXRzKS5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICByZXN1bHRbcnVsZS5hc3ROb2RlVHlwZV0ucHVzaChydWxlKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBtZXRhOiB7XG4gICAgZG9jczoge1xuICAgICAgZGVzY3JpcHRpb246ICdFbnN1cmUgY3Jvc3MtYnJvd3NlciBBUEkgY29tcGF0aWJpbGl0eScsXG4gICAgICBjYXRlZ29yeTogJ0NvbXBhdGliaWxpdHknLFxuICAgICAgdXJsOlxuICAgICAgICAnaHR0cHM6Ly9naXRodWIuY29tL2FtaWxhamFjay9lc2xpbnQtcGx1Z2luLWNvbXBhdC9ibG9iL21hc3Rlci9kb2NzL3J1bGVzL2NvbXBhdC5tZCcsXG4gICAgICByZWNvbW1lbmRlZDogdHJ1ZVxuICAgIH0sXG4gICAgdHlwZTogJ3Byb2JsZW0nLFxuICAgIHNjaGVtYTogW3sgdHlwZTogJ3N0cmluZycgfV1cbiAgfSxcbiAgY3JlYXRlKGNvbnRleHQ6IENvbnRleHQpOiBFU0xpbnQge1xuICAgIC8vIERldGVybWluZSBsb3dlc3QgdGFyZ2V0cyBmcm9tIGJyb3dzZXJzbGlzdCBjb25maWcsIHdoaWNoIHJlYWRzIHVzZXInc1xuICAgIC8vIHBhY2thZ2UuanNvbiBjb25maWcgc2VjdGlvbi4gVXNlIGNvbmZpZyBmcm9tIGVzbGludHJjIGZvciB0ZXN0aW5nIHB1cnBvc2VzXG4gICAgY29uc3QgYnJvd3NlcnNsaXN0Q29uZmlnOiBCcm93c2VyTGlzdENvbmZpZyA9XG4gICAgICBjb250ZXh0LnNldHRpbmdzLmJyb3dzZXJzIHx8XG4gICAgICBjb250ZXh0LnNldHRpbmdzLnRhcmdldHMgfHxcbiAgICAgIGNvbnRleHQub3B0aW9uc1swXTtcblxuICAgIGNvbnN0IGJyb3dzZXJzbGlzdFRhcmdldHMgPSBWZXJzaW9uaW5nKFxuICAgICAgRGV0ZXJtaW5lVGFyZ2V0c0Zyb21Db25maWcoY29udGV4dC5nZXRGaWxlbmFtZSgpLCBicm93c2Vyc2xpc3RDb25maWcpXG4gICAgKTtcblxuICAgIC8vIFN0cmluZ2lmeSB0byBzdXBwb3J0IG1lbW9pemF0aW9uOyBicm93c2Vyc2xpc3RDb25maWcgaXMgYWx3YXlzIGFuIGFycmF5IG9mIG5ldyBvYmplY3RzLlxuICAgIGNvbnN0IHRhcmdldGVkUnVsZXMgPSBnZXRSdWxlc0ZvclRhcmdldHMoXG4gICAgICBKU09OLnN0cmluZ2lmeShicm93c2Vyc2xpc3RUYXJnZXRzKVxuICAgICk7XG5cbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcblxuICAgIGZ1bmN0aW9uIGhhbmRsZUZhaWxpbmdSdWxlKHJ1bGU6IE5vZGUsIG5vZGU6IEVTTGludE5vZGUpIHtcbiAgICAgIGlmIChpc1BvbHlmaWxsZWQoY29udGV4dCwgcnVsZSkpIHJldHVybjtcbiAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgbm9kZSxcbiAgICAgICAgbWVzc2FnZTogW1xuICAgICAgICAgIGdlbmVyYXRlRXJyb3JOYW1lKHJ1bGUpLFxuICAgICAgICAgICdpcyBub3Qgc3VwcG9ydGVkIGluJyxcbiAgICAgICAgICBydWxlLmdldFVuc3VwcG9ydGVkVGFyZ2V0cyhydWxlLCBicm93c2Vyc2xpc3RUYXJnZXRzKS5qb2luKCcsICcpXG4gICAgICAgIF0uam9pbignICcpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBpZGVudGlmaWVycyA9IG5ldyBTZXQoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBDYWxsRXhwcmVzc2lvbjogbGludENhbGxFeHByZXNzaW9uLmJpbmQoXG4gICAgICAgIG51bGwsXG4gICAgICAgIGhhbmRsZUZhaWxpbmdSdWxlLFxuICAgICAgICB0YXJnZXRlZFJ1bGVzLkNhbGxFeHByZXNzaW9uXG4gICAgICApLFxuICAgICAgTmV3RXhwcmVzc2lvbjogbGludE5ld0V4cHJlc3Npb24uYmluZChcbiAgICAgICAgbnVsbCxcbiAgICAgICAgaGFuZGxlRmFpbGluZ1J1bGUsXG4gICAgICAgIHRhcmdldGVkUnVsZXMuTmV3RXhwcmVzc2lvblxuICAgICAgKSxcbiAgICAgIE1lbWJlckV4cHJlc3Npb246IGxpbnRNZW1iZXJFeHByZXNzaW9uLmJpbmQoXG4gICAgICAgIG51bGwsXG4gICAgICAgIGhhbmRsZUZhaWxpbmdSdWxlLFxuICAgICAgICB0YXJnZXRlZFJ1bGVzLk1lbWJlckV4cHJlc3Npb25cbiAgICAgICksXG4gICAgICAvLyBLZWVwIHRyYWNrIG9mIGFsbCB0aGUgZGVmaW5lZCB2YXJpYWJsZXMuIERvIG5vdCByZXBvcnQgZXJyb3JzIGZvciBub2RlcyB0aGF0IGFyZSBub3QgZGVmaW5lZFxuICAgICAgSWRlbnRpZmllcihub2RlOiBFU0xpbnROb2RlKSB7XG4gICAgICAgIGlmIChub2RlLnBhcmVudCkge1xuICAgICAgICAgIGNvbnN0IHsgdHlwZSB9ID0gbm9kZS5wYXJlbnQ7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgLy8gZXguIGNvbnN0IHsgU2V0IH0gPSByZXF1aXJlKCdpbW11dGFibGUnKTtcbiAgICAgICAgICAgIHR5cGUgPT09ICdQcm9wZXJ0eScgfHxcbiAgICAgICAgICAgIC8vIGV4LiBmdW5jdGlvbiBTZXQoKSB7fVxuICAgICAgICAgICAgdHlwZSA9PT0gJ0Z1bmN0aW9uRGVjbGFyYXRpb24nIHx8XG4gICAgICAgICAgICAvLyBleC4gY29uc3QgU2V0ID0gKCkgPT4ge31cbiAgICAgICAgICAgIHR5cGUgPT09ICdWYXJpYWJsZURlY2xhcmF0b3InIHx8XG4gICAgICAgICAgICAvLyBleC4gY2xhc3MgU2V0IHt9XG4gICAgICAgICAgICB0eXBlID09PSAnQ2xhc3NEZWNsYXJhdGlvbicgfHxcbiAgICAgICAgICAgIC8vIGV4LiBpbXBvcnQgU2V0IGZyb20gJ3NldCc7XG4gICAgICAgICAgICB0eXBlID09PSAnSW1wb3J0RGVmYXVsdFNwZWNpZmllcicgfHxcbiAgICAgICAgICAgIC8vIGV4LiBpbXBvcnQge1NldH0gZnJvbSAnc2V0JztcbiAgICAgICAgICAgIHR5cGUgPT09ICdJbXBvcnRTcGVjaWZpZXInIHx8XG4gICAgICAgICAgICAvLyBleC4gaW1wb3J0IHtTZXR9IGZyb20gJ3NldCc7XG4gICAgICAgICAgICB0eXBlID09PSAnSW1wb3J0RGVjbGFyYXRpb24nXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZGVudGlmaWVycy5hZGQobm9kZS5uYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAnUHJvZ3JhbTpleGl0JzogKCkgPT4ge1xuICAgICAgICAvLyBHZXQgYSBtYXAgb2YgYWxsIHRoZSB2YXJpYWJsZXMgZGVmaW5lZCBpbiB0aGUgcm9vdCBzY29wZSAobm90IHRoZSBnbG9iYWwgc2NvcGUpXG4gICAgICAgIC8vIGNvbnN0IHZhcmlhYmxlc01hcCA9IGNvbnRleHQuZ2V0U2NvcGUoKS5jaGlsZFNjb3Blcy5tYXAoZSA9PiBlLnNldClbMF07XG4gICAgICAgIGVycm9yc1xuICAgICAgICAgIC5maWx0ZXIoZXJyb3IgPT4gIWlkZW50aWZpZXJzLmhhcyhnZXROYW1lKGVycm9yLm5vZGUpKSlcbiAgICAgICAgICAuZm9yRWFjaChub2RlID0+IGNvbnRleHQucmVwb3J0KG5vZGUpKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59O1xuIl19
\No newline at end of file