aboutsummaryrefslogtreecommitdiff
path: root/tools/node_modules/babel-eslint/lib
diff options
context:
space:
mode:
Diffstat (limited to 'tools/node_modules/babel-eslint/lib')
-rw-r--r--tools/node_modules/babel-eslint/lib/analyze-scope.js338
-rw-r--r--tools/node_modules/babel-eslint/lib/babylon-to-espree/attachComments.js59
-rw-r--r--tools/node_modules/babel-eslint/lib/babylon-to-espree/convertComments.js17
-rw-r--r--tools/node_modules/babel-eslint/lib/babylon-to-espree/convertTemplateType.js99
-rw-r--r--tools/node_modules/babel-eslint/lib/babylon-to-espree/index.js35
-rw-r--r--tools/node_modules/babel-eslint/lib/babylon-to-espree/toAST.js118
-rw-r--r--tools/node_modules/babel-eslint/lib/babylon-to-espree/toToken.js80
-rw-r--r--tools/node_modules/babel-eslint/lib/babylon-to-espree/toTokens.js19
-rw-r--r--tools/node_modules/babel-eslint/lib/index.js22
-rw-r--r--tools/node_modules/babel-eslint/lib/parse-with-patch.js9
-rw-r--r--tools/node_modules/babel-eslint/lib/parse-with-scope.js12
-rw-r--r--tools/node_modules/babel-eslint/lib/parse.js87
-rw-r--r--tools/node_modules/babel-eslint/lib/patch-eslint-scope.js370
-rw-r--r--tools/node_modules/babel-eslint/lib/visitor-keys.js15
14 files changed, 1280 insertions, 0 deletions
diff --git a/tools/node_modules/babel-eslint/lib/analyze-scope.js b/tools/node_modules/babel-eslint/lib/analyze-scope.js
new file mode 100644
index 0000000000..dd4cc3b35a
--- /dev/null
+++ b/tools/node_modules/babel-eslint/lib/analyze-scope.js
@@ -0,0 +1,338 @@
+"use strict";
+
+const t = require("@babel/types");
+const escope = require("eslint-scope");
+const Definition = require("eslint-scope/lib/definition").Definition;
+const OriginalPatternVisitor = require("eslint-scope/lib/pattern-visitor");
+const OriginalReferencer = require("eslint-scope/lib/referencer");
+const fallback = require("eslint-visitor-keys").getKeys;
+const childVisitorKeys = require("./visitor-keys");
+
+const flowFlippedAliasKeys = t.FLIPPED_ALIAS_KEYS.Flow.concat([
+ "ArrayPattern",
+ "ClassDeclaration",
+ "ClassExpression",
+ "FunctionDeclaration",
+ "FunctionExpression",
+ "Identifier",
+ "ObjectPattern",
+ "RestElement",
+]);
+const visitorKeysMap = Object.keys(t.VISITOR_KEYS).reduce(function(acc, key) {
+ const value = t.VISITOR_KEYS[key];
+ if (flowFlippedAliasKeys.indexOf(value) === -1) {
+ acc[key] = value;
+ }
+ return acc;
+}, {});
+
+const propertyTypes = {
+ // loops
+ callProperties: { type: "loop", values: ["value"] },
+ indexers: { type: "loop", values: ["key", "value"] },
+ properties: { type: "loop", values: ["argument", "value"] },
+ types: { type: "loop" },
+ params: { type: "loop" },
+ // single property
+ argument: { type: "single" },
+ elementType: { type: "single" },
+ qualification: { type: "single" },
+ rest: { type: "single" },
+ returnType: { type: "single" },
+ // others
+ typeAnnotation: { type: "typeAnnotation" },
+ typeParameters: { type: "typeParameters" },
+ id: { type: "id" },
+};
+
+class PatternVisitor extends OriginalPatternVisitor {
+ ArrayPattern(node) {
+ node.elements.forEach(this.visit, this);
+ }
+
+ ObjectPattern(node) {
+ node.properties.forEach(this.visit, this);
+ }
+}
+
+class Referencer extends OriginalReferencer {
+ // inherits.
+ visitPattern(node, options, callback) {
+ if (!node) {
+ return;
+ }
+
+ // Visit type annotations.
+ this._checkIdentifierOrVisit(node.typeAnnotation);
+ if (t.isAssignmentPattern(node)) {
+ this._checkIdentifierOrVisit(node.left.typeAnnotation);
+ }
+
+ // Overwrite `super.visitPattern(node, options, callback)` in order to not visit `ArrayPattern#typeAnnotation` and `ObjectPattern#typeAnnotation`.
+ if (typeof options === "function") {
+ callback = options;
+ options = { processRightHandNodes: false };
+ }
+
+ const visitor = new PatternVisitor(this.options, node, callback);
+ visitor.visit(node);
+
+ // Process the right hand nodes recursively.
+ if (options.processRightHandNodes) {
+ visitor.rightHandNodes.forEach(this.visit, this);
+ }
+ }
+
+ // inherits.
+ visitClass(node) {
+ // Decorators.
+ this._visitArray(node.decorators);
+
+ // Flow type parameters.
+ const typeParamScope = this._nestTypeParamScope(node);
+
+ // Flow super types.
+ this._visitTypeAnnotation(node.implements);
+ this._visitTypeAnnotation(
+ node.superTypeParameters && node.superTypeParameters.params
+ );
+
+ // Basic.
+ super.visitClass(node);
+
+ // Close the type parameter scope.
+ if (typeParamScope) {
+ this.close(node);
+ }
+ }
+
+ // inherits.
+ visitFunction(node) {
+ const typeParamScope = this._nestTypeParamScope(node);
+
+ // Flow return types.
+ this._checkIdentifierOrVisit(node.returnType);
+
+ // Basic.
+ super.visitFunction(node);
+
+ // Close the type parameter scope.
+ if (typeParamScope) {
+ this.close(node);
+ }
+ }
+
+ // inherits.
+ visitProperty(node) {
+ if (node.value && node.value.type === "TypeCastExpression") {
+ this._visitTypeAnnotation(node.value);
+ }
+ this._visitArray(node.decorators);
+ super.visitProperty(node);
+ }
+
+ InterfaceDeclaration(node) {
+ this._createScopeVariable(node, node.id);
+
+ const typeParamScope = this._nestTypeParamScope(node);
+
+ // TODO: Handle mixins
+ this._visitArray(node.extends);
+ this.visit(node.body);
+
+ if (typeParamScope) {
+ this.close(node);
+ }
+ }
+
+ TypeAlias(node) {
+ this._createScopeVariable(node, node.id);
+
+ const typeParamScope = this._nestTypeParamScope(node);
+
+ this.visit(node.right);
+
+ if (typeParamScope) {
+ this.close(node);
+ }
+ }
+
+ ClassProperty(node) {
+ this._visitClassProperty(node);
+ }
+
+ ClassPrivateProperty(node) {
+ this._visitClassProperty(node);
+ }
+
+ DeclareModule(node) {
+ this._visitDeclareX(node);
+ }
+
+ DeclareFunction(node) {
+ this._visitDeclareX(node);
+ }
+
+ DeclareVariable(node) {
+ this._visitDeclareX(node);
+ }
+
+ DeclareClass(node) {
+ this._visitDeclareX(node);
+ }
+
+ _visitClassProperty(node) {
+ this._visitTypeAnnotation(node.typeAnnotation);
+ this.visitProperty(node);
+ }
+
+ _visitDeclareX(node) {
+ if (node.id) {
+ this._createScopeVariable(node, node.id);
+ }
+
+ const typeParamScope = this._nestTypeParamScope(node);
+ if (typeParamScope) {
+ this.close(node);
+ }
+ }
+
+ _createScopeVariable(node, name) {
+ this.currentScope().variableScope.__define(
+ name,
+ new Definition("Variable", name, node, null, null, null)
+ );
+ }
+
+ _nestTypeParamScope(node) {
+ if (!node.typeParameters) {
+ return null;
+ }
+
+ const parentScope = this.scopeManager.__currentScope;
+ const scope = new escope.Scope(
+ this.scopeManager,
+ "type-parameters",
+ parentScope,
+ node,
+ false
+ );
+
+ this.scopeManager.__nestScope(scope);
+ for (let j = 0; j < node.typeParameters.params.length; j++) {
+ const name = node.typeParameters.params[j];
+ scope.__define(name, new Definition("TypeParameter", name, name));
+ if (name.typeAnnotation) {
+ this._checkIdentifierOrVisit(name);
+ }
+ }
+ scope.__define = function() {
+ return parentScope.__define.apply(parentScope, arguments);
+ };
+
+ return scope;
+ }
+
+ _visitTypeAnnotation(node) {
+ if (!node) {
+ return;
+ }
+ if (Array.isArray(node)) {
+ node.forEach(this._visitTypeAnnotation, this);
+ return;
+ }
+
+ // get property to check (params, id, etc...)
+ const visitorValues = visitorKeysMap[node.type];
+ if (!visitorValues) {
+ return;
+ }
+
+ // can have multiple properties
+ for (let i = 0; i < visitorValues.length; i++) {
+ const visitorValue = visitorValues[i];
+ const propertyType = propertyTypes[visitorValue];
+ const nodeProperty = node[visitorValue];
+ // check if property or type is defined
+ if (propertyType == null || nodeProperty == null) {
+ continue;
+ }
+ if (propertyType.type === "loop") {
+ for (let j = 0; j < nodeProperty.length; j++) {
+ if (Array.isArray(propertyType.values)) {
+ for (let k = 0; k < propertyType.values.length; k++) {
+ const loopPropertyNode = nodeProperty[j][propertyType.values[k]];
+ if (loopPropertyNode) {
+ this._checkIdentifierOrVisit(loopPropertyNode);
+ }
+ }
+ } else {
+ this._checkIdentifierOrVisit(nodeProperty[j]);
+ }
+ }
+ } else if (propertyType.type === "single") {
+ this._checkIdentifierOrVisit(nodeProperty);
+ } else if (propertyType.type === "typeAnnotation") {
+ this._visitTypeAnnotation(node.typeAnnotation);
+ } else if (propertyType.type === "typeParameters") {
+ for (let l = 0; l < node.typeParameters.params.length; l++) {
+ this._checkIdentifierOrVisit(node.typeParameters.params[l]);
+ }
+ } else if (propertyType.type === "id") {
+ if (node.id.type === "Identifier") {
+ this._checkIdentifierOrVisit(node.id);
+ } else {
+ this._visitTypeAnnotation(node.id);
+ }
+ }
+ }
+ }
+
+ _checkIdentifierOrVisit(node) {
+ if (node && node.typeAnnotation) {
+ this._visitTypeAnnotation(node.typeAnnotation);
+ } else if (node && node.type === "Identifier") {
+ this.visit(node);
+ } else {
+ this._visitTypeAnnotation(node);
+ }
+ }
+
+ _visitArray(nodeList) {
+ if (nodeList) {
+ for (const node of nodeList) {
+ this.visit(node);
+ }
+ }
+ }
+}
+
+module.exports = function(ast, parserOptions) {
+ const options = {
+ ignoreEval: true,
+ optimistic: false,
+ directive: false,
+ nodejsScope:
+ ast.sourceType === "script" &&
+ (parserOptions.ecmaFeatures &&
+ parserOptions.ecmaFeatures.globalReturn) === true,
+ impliedStrict: false,
+ sourceType: ast.sourceType,
+ ecmaVersion: parserOptions.ecmaVersion || 2018,
+ fallback,
+ };
+
+ if (OriginalReferencer._babelEslintPatched) {
+ require("./patch-eslint-scope")(parserOptions);
+ return escope.analyze(ast, options);
+ }
+
+ options.childVisitorKeys = childVisitorKeys;
+
+ const scopeManager = new escope.ScopeManager(options);
+ const referencer = new Referencer(options, scopeManager);
+
+ referencer.visit(ast);
+
+ return scopeManager;
+};
diff --git a/tools/node_modules/babel-eslint/lib/babylon-to-espree/attachComments.js b/tools/node_modules/babel-eslint/lib/babylon-to-espree/attachComments.js
new file mode 100644
index 0000000000..8c608a45ad
--- /dev/null
+++ b/tools/node_modules/babel-eslint/lib/babylon-to-espree/attachComments.js
@@ -0,0 +1,59 @@
+"use strict";
+
+// comment fixes
+module.exports = function(ast, comments, tokens) {
+ if (comments.length) {
+ var firstComment = comments[0];
+ var lastComment = comments[comments.length - 1];
+ // fixup program start
+ if (!tokens.length) {
+ // if no tokens, the program starts at the end of the last comment
+ ast.start = lastComment.end;
+ ast.loc.start.line = lastComment.loc.end.line;
+ ast.loc.start.column = lastComment.loc.end.column;
+
+ if (ast.leadingComments === null && ast.innerComments.length) {
+ ast.leadingComments = ast.innerComments;
+ }
+ } else if (firstComment.start < tokens[0].start) {
+ // if there are comments before the first token, the program starts at the first token
+ var token = tokens[0];
+ // ast.start = token.start;
+ // ast.loc.start.line = token.loc.start.line;
+ // ast.loc.start.column = token.loc.start.column;
+
+ // estraverse do not put leading comments on first node when the comment
+ // appear before the first token
+ if (ast.body.length) {
+ var node = ast.body[0];
+ node.leadingComments = [];
+ var firstTokenStart = token.start;
+ var len = comments.length;
+ for (var i = 0; i < len && comments[i].start < firstTokenStart; i++) {
+ node.leadingComments.push(comments[i]);
+ }
+ }
+ }
+ // fixup program end
+ if (tokens.length) {
+ var lastToken = tokens[tokens.length - 1];
+ if (lastComment.end > lastToken.end) {
+ // If there is a comment after the last token, the program ends at the
+ // last token and not the comment
+ // ast.end = lastToken.end;
+ ast.range[1] = lastToken.end;
+ ast.loc.end.line = lastToken.loc.end.line;
+ ast.loc.end.column = lastToken.loc.end.column;
+ }
+ }
+ } else {
+ if (!tokens.length) {
+ ast.loc.start.line = 1;
+ ast.loc.end.line = 1;
+ }
+ }
+ if (ast.body && ast.body.length > 0) {
+ ast.loc.start.line = ast.body[0].loc.start.line;
+ ast.range[0] = ast.body[0].start;
+ }
+};
diff --git a/tools/node_modules/babel-eslint/lib/babylon-to-espree/convertComments.js b/tools/node_modules/babel-eslint/lib/babylon-to-espree/convertComments.js
new file mode 100644
index 0000000000..17d7117372
--- /dev/null
+++ b/tools/node_modules/babel-eslint/lib/babylon-to-espree/convertComments.js
@@ -0,0 +1,17 @@
+"use strict";
+
+module.exports = function(comments) {
+ for (var i = 0; i < comments.length; i++) {
+ var comment = comments[i];
+ if (comment.type === "CommentBlock") {
+ comment.type = "Block";
+ } else if (comment.type === "CommentLine") {
+ comment.type = "Line";
+ }
+ // sometimes comments don't get ranges computed,
+ // even with options.ranges === true
+ if (!comment.range) {
+ comment.range = [comment.start, comment.end];
+ }
+ }
+};
diff --git a/tools/node_modules/babel-eslint/lib/babylon-to-espree/convertTemplateType.js b/tools/node_modules/babel-eslint/lib/babylon-to-espree/convertTemplateType.js
new file mode 100644
index 0000000000..d8892f9972
--- /dev/null
+++ b/tools/node_modules/babel-eslint/lib/babylon-to-espree/convertTemplateType.js
@@ -0,0 +1,99 @@
+"use strict";
+
+module.exports = function(tokens, tt) {
+ var startingToken = 0;
+ var currentToken = 0;
+ var numBraces = 0; // track use of {}
+ var numBackQuotes = 0; // track number of nested templates
+
+ function isBackQuote(token) {
+ return tokens[token].type === tt.backQuote;
+ }
+
+ function isTemplateStarter(token) {
+ return (
+ isBackQuote(token) ||
+ // only can be a template starter when in a template already
+ (tokens[token].type === tt.braceR && numBackQuotes > 0)
+ );
+ }
+
+ function isTemplateEnder(token) {
+ return isBackQuote(token) || tokens[token].type === tt.dollarBraceL;
+ }
+
+ // append the values between start and end
+ function createTemplateValue(start, end) {
+ var value = "";
+ while (start <= end) {
+ if (tokens[start].value) {
+ value += tokens[start].value;
+ } else if (tokens[start].type !== tt.template) {
+ value += tokens[start].type.label;
+ }
+ start++;
+ }
+ return value;
+ }
+
+ // create Template token
+ function replaceWithTemplateType(start, end) {
+ var templateToken = {
+ type: "Template",
+ value: createTemplateValue(start, end),
+ start: tokens[start].start,
+ end: tokens[end].end,
+ loc: {
+ start: tokens[start].loc.start,
+ end: tokens[end].loc.end,
+ },
+ };
+
+ // put new token in place of old tokens
+ tokens.splice(start, end - start + 1, templateToken);
+ }
+
+ function trackNumBraces(token) {
+ if (tokens[token].type === tt.braceL) {
+ numBraces++;
+ } else if (tokens[token].type === tt.braceR) {
+ numBraces--;
+ }
+ }
+
+ while (startingToken < tokens.length) {
+ // template start: check if ` or }
+ if (isTemplateStarter(startingToken) && numBraces === 0) {
+ if (isBackQuote(startingToken)) {
+ numBackQuotes++;
+ }
+
+ currentToken = startingToken + 1;
+
+ // check if token after template start is "template"
+ if (
+ currentToken >= tokens.length - 1 ||
+ tokens[currentToken].type !== tt.template
+ ) {
+ break;
+ }
+
+ // template end: find ` or ${
+ while (!isTemplateEnder(currentToken)) {
+ if (currentToken >= tokens.length - 1) {
+ break;
+ }
+ currentToken++;
+ }
+
+ if (isBackQuote(currentToken)) {
+ numBackQuotes--;
+ }
+ // template start and end found: create new token
+ replaceWithTemplateType(startingToken, currentToken);
+ } else if (numBackQuotes > 0) {
+ trackNumBraces(startingToken);
+ }
+ startingToken++;
+ }
+};
diff --git a/tools/node_modules/babel-eslint/lib/babylon-to-espree/index.js b/tools/node_modules/babel-eslint/lib/babylon-to-espree/index.js
new file mode 100644
index 0000000000..ecd8eee6f1
--- /dev/null
+++ b/tools/node_modules/babel-eslint/lib/babylon-to-espree/index.js
@@ -0,0 +1,35 @@
+"use strict";
+
+var attachComments = require("./attachComments");
+var convertComments = require("./convertComments");
+var toTokens = require("./toTokens");
+var toAST = require("./toAST");
+
+module.exports = function(ast, traverse, tt, code) {
+ // remove EOF token, eslint doesn't use this for anything and it interferes
+ // with some rules see https://github.com/babel/babel-eslint/issues/2
+ // todo: find a more elegant way to do this
+ ast.tokens.pop();
+
+ // convert tokens
+ ast.tokens = toTokens(ast.tokens, tt, code);
+
+ // add comments
+ convertComments(ast.comments);
+
+ // transform esprima and acorn divergent nodes
+ toAST(ast, traverse, code);
+
+ // ast.program.tokens = ast.tokens;
+ // ast.program.comments = ast.comments;
+ // ast = ast.program;
+
+ // remove File
+ ast.type = "Program";
+ ast.sourceType = ast.program.sourceType;
+ ast.directives = ast.program.directives;
+ ast.body = ast.program.body;
+ delete ast.program;
+
+ attachComments(ast, ast.comments, ast.tokens);
+};
diff --git a/tools/node_modules/babel-eslint/lib/babylon-to-espree/toAST.js b/tools/node_modules/babel-eslint/lib/babylon-to-espree/toAST.js
new file mode 100644
index 0000000000..b3da41f0cb
--- /dev/null
+++ b/tools/node_modules/babel-eslint/lib/babylon-to-espree/toAST.js
@@ -0,0 +1,118 @@
+"use strict";
+
+var t = require("@babel/types");
+var convertComments = require("./convertComments");
+
+module.exports = function(ast, traverse, code) {
+ var state = { source: code };
+
+ // Monkey patch visitor keys in order to be able to traverse the estree nodes
+ t.VISITOR_KEYS.Property = t.VISITOR_KEYS.ObjectProperty;
+ t.VISITOR_KEYS.MethodDefinition = [
+ "key",
+ "value",
+ "decorators",
+ "returnType",
+ "typeParameters",
+ ];
+
+ traverse(ast, astTransformVisitor, null, state);
+
+ delete t.VISITOR_KEYS.Property;
+ delete t.VISITOR_KEYS.MethodDefinition;
+};
+
+var astTransformVisitor = {
+ noScope: true,
+ enter(path) {
+ var node = path.node;
+
+ // private var to track original node type
+ node._babelType = node.type;
+
+ if (node.innerComments) {
+ node.trailingComments = node.innerComments;
+ delete node.innerComments;
+ }
+
+ if (node.trailingComments) {
+ convertComments(node.trailingComments);
+ }
+
+ if (node.leadingComments) {
+ convertComments(node.leadingComments);
+ }
+ },
+ exit(path) {
+ var node = path.node;
+
+ if (path.isJSXText()) {
+ node.type = "Literal";
+ }
+
+ if (
+ path.isRestElement() &&
+ path.parent &&
+ path.parent.type === "ObjectPattern"
+ ) {
+ node.type = "ExperimentalRestProperty";
+ }
+
+ if (
+ path.isSpreadElement() &&
+ path.parent &&
+ path.parent.type === "ObjectExpression"
+ ) {
+ node.type = "ExperimentalSpreadProperty";
+ }
+
+ if (path.isTypeParameter()) {
+ node.type = "Identifier";
+ node.typeAnnotation = node.bound;
+ delete node.bound;
+ }
+
+ // flow: prevent "no-undef"
+ // for "Component" in: "let x: React.Component"
+ if (path.isQualifiedTypeIdentifier()) {
+ delete node.id;
+ }
+ // for "b" in: "var a: { b: Foo }"
+ if (path.isObjectTypeProperty()) {
+ delete node.key;
+ }
+ // for "indexer" in: "var a: {[indexer: string]: number}"
+ if (path.isObjectTypeIndexer()) {
+ delete node.id;
+ }
+ // for "param" in: "var a: { func(param: Foo): Bar };"
+ if (path.isFunctionTypeParam()) {
+ delete node.name;
+ }
+
+ // modules
+
+ if (path.isImportDeclaration()) {
+ delete node.isType;
+ }
+
+ // template string range fixes
+ if (path.isTemplateLiteral()) {
+ for (var j = 0; j < node.quasis.length; j++) {
+ var q = node.quasis[j];
+ q.range[0] -= 1;
+ if (q.tail) {
+ q.range[1] += 1;
+ } else {
+ q.range[1] += 2;
+ }
+ q.loc.start.column -= 1;
+ if (q.tail) {
+ q.loc.end.column += 1;
+ } else {
+ q.loc.end.column += 2;
+ }
+ }
+ }
+ },
+};
diff --git a/tools/node_modules/babel-eslint/lib/babylon-to-espree/toToken.js b/tools/node_modules/babel-eslint/lib/babylon-to-espree/toToken.js
new file mode 100644
index 0000000000..9c5a49ef11
--- /dev/null
+++ b/tools/node_modules/babel-eslint/lib/babylon-to-espree/toToken.js
@@ -0,0 +1,80 @@
+"use strict";
+
+module.exports = function(token, tt, source) {
+ var type = token.type;
+ token.range = [token.start, token.end];
+
+ if (type === tt.name) {
+ token.type = "Identifier";
+ } else if (
+ type === tt.semi ||
+ type === tt.comma ||
+ type === tt.parenL ||
+ type === tt.parenR ||
+ type === tt.braceL ||
+ type === tt.braceR ||
+ type === tt.slash ||
+ type === tt.dot ||
+ type === tt.bracketL ||
+ type === tt.bracketR ||
+ type === tt.ellipsis ||
+ type === tt.arrow ||
+ type === tt.star ||
+ type === tt.incDec ||
+ type === tt.colon ||
+ type === tt.question ||
+ type === tt.template ||
+ type === tt.backQuote ||
+ type === tt.dollarBraceL ||
+ type === tt.at ||
+ type === tt.logicalOR ||
+ type === tt.logicalAND ||
+ type === tt.bitwiseOR ||
+ type === tt.bitwiseXOR ||
+ type === tt.bitwiseAND ||
+ type === tt.equality ||
+ type === tt.relational ||
+ type === tt.bitShift ||
+ type === tt.plusMin ||
+ type === tt.modulo ||
+ type === tt.exponent ||
+ type === tt.prefix ||
+ type === tt.doubleColon ||
+ type.isAssign
+ ) {
+ token.type = "Punctuator";
+ if (!token.value) token.value = type.label;
+ } else if (type === tt.jsxTagStart) {
+ token.type = "Punctuator";
+ token.value = "<";
+ } else if (type === tt.jsxTagEnd) {
+ token.type = "Punctuator";
+ token.value = ">";
+ } else if (type === tt.jsxName) {
+ token.type = "JSXIdentifier";
+ } else if (type === tt.jsxText) {
+ token.type = "JSXText";
+ } else if (type.keyword === "null") {
+ token.type = "Null";
+ } else if (type.keyword === "false" || type.keyword === "true") {
+ token.type = "Boolean";
+ } else if (type.keyword) {
+ token.type = "Keyword";
+ } else if (type === tt.num) {
+ token.type = "Numeric";
+ token.value = source.slice(token.start, token.end);
+ } else if (type === tt.string) {
+ token.type = "String";
+ token.value = source.slice(token.start, token.end);
+ } else if (type === tt.regexp) {
+ token.type = "RegularExpression";
+ var value = token.value;
+ token.regex = {
+ pattern: value.pattern,
+ flags: value.flags,
+ };
+ token.value = `/${value.pattern}/${value.flags}`;
+ }
+
+ return token;
+};
diff --git a/tools/node_modules/babel-eslint/lib/babylon-to-espree/toTokens.js b/tools/node_modules/babel-eslint/lib/babylon-to-espree/toTokens.js
new file mode 100644
index 0000000000..a863b871b0
--- /dev/null
+++ b/tools/node_modules/babel-eslint/lib/babylon-to-espree/toTokens.js
@@ -0,0 +1,19 @@
+"use strict";
+
+var convertTemplateType = require("./convertTemplateType");
+var toToken = require("./toToken");
+
+module.exports = function(tokens, tt, code) {
+ // transform tokens to type "Template"
+ convertTemplateType(tokens, tt);
+
+ var transformedTokens = [];
+ for (var i = 0; i < tokens.length; i++) {
+ var token = tokens[i];
+ if (token.type !== "CommentLine" && token.type !== "CommentBlock") {
+ transformedTokens.push(toToken(token, tt, code));
+ }
+ }
+
+ return transformedTokens;
+};
diff --git a/tools/node_modules/babel-eslint/lib/index.js b/tools/node_modules/babel-eslint/lib/index.js
new file mode 100644
index 0000000000..c4655280af
--- /dev/null
+++ b/tools/node_modules/babel-eslint/lib/index.js
@@ -0,0 +1,22 @@
+"use strict";
+
+exports.parse = function(code, options) {
+ return exports.parseForESLint(code, options).ast;
+};
+
+exports.parseForESLint = function(code, options) {
+ options = options || {};
+ options.ecmaVersion = options.ecmaVersion || 2018;
+ options.sourceType = options.sourceType || "module";
+ options.allowImportExportEverywhere =
+ options.allowImportExportEverywhere || false;
+
+ if (options.eslintVisitorKeys && options.eslintScopeManager) {
+ return require("./parse-with-scope")(code, options);
+ }
+ return { ast: require("./parse-with-patch")(code, options) };
+};
+
+exports.parseNoPatch = function(code, options) {
+ return require("./parse")(code, options);
+};
diff --git a/tools/node_modules/babel-eslint/lib/parse-with-patch.js b/tools/node_modules/babel-eslint/lib/parse-with-patch.js
new file mode 100644
index 0000000000..ba1b95b5b1
--- /dev/null
+++ b/tools/node_modules/babel-eslint/lib/parse-with-patch.js
@@ -0,0 +1,9 @@
+"use strict";
+
+var parse = require("./parse");
+var patchEscope = require("./patch-eslint-scope");
+
+module.exports = function(code, options) {
+ patchEscope(options);
+ return parse(code, options);
+};
diff --git a/tools/node_modules/babel-eslint/lib/parse-with-scope.js b/tools/node_modules/babel-eslint/lib/parse-with-scope.js
new file mode 100644
index 0000000000..36e3fce5b0
--- /dev/null
+++ b/tools/node_modules/babel-eslint/lib/parse-with-scope.js
@@ -0,0 +1,12 @@
+"use strict";
+
+const visitorKeys = require("./visitor-keys");
+const analyzeScope = require("./analyze-scope");
+const parse = require("./parse");
+
+module.exports = function(code, options) {
+ const ast = parse(code, options);
+ const scopeManager = analyzeScope(ast, options);
+
+ return { ast, scopeManager, visitorKeys };
+};
diff --git a/tools/node_modules/babel-eslint/lib/parse.js b/tools/node_modules/babel-eslint/lib/parse.js
new file mode 100644
index 0000000000..f29e6af155
--- /dev/null
+++ b/tools/node_modules/babel-eslint/lib/parse.js
@@ -0,0 +1,87 @@
+"use strict";
+
+var babylonToEspree = require("./babylon-to-espree");
+var parse = require("babylon").parse;
+var tt = require("babylon").tokTypes;
+var traverse = require("@babel/traverse").default;
+var codeFrameColumns = require("@babel/code-frame").codeFrameColumns;
+
+module.exports = function(code, options) {
+ var opts = {
+ codeFrame: options.hasOwnProperty("codeFrame") ? options.codeFrame : true,
+ sourceType: options.sourceType,
+ allowImportExportEverywhere: options.allowImportExportEverywhere, // consistent with espree
+ allowReturnOutsideFunction: true,
+ allowSuperOutsideMethod: true,
+ ranges: true,
+ tokens: true,
+ plugins: [
+ "flow",
+ "jsx",
+ "estree",
+ "asyncFunctions",
+ "asyncGenerators",
+ "classConstructorCall",
+ "classProperties",
+ "decorators",
+ "doExpressions",
+ "exponentiationOperator",
+ "exportDefaultFrom",
+ "exportNamespaceFrom",
+ "functionBind",
+ "functionSent",
+ "objectRestSpread",
+ "trailingFunctionCommas",
+ "dynamicImport",
+ "numericSeparator",
+ "optionalChaining",
+ "importMeta",
+ "classPrivateProperties",
+ "bigInt",
+ "optionalCatchBinding",
+ "throwExpressions",
+ "pipelineOperator",
+ "nullishCoalescingOperator",
+ ],
+ };
+
+ var ast;
+ try {
+ ast = parse(code, opts);
+ } catch (err) {
+ if (err instanceof SyntaxError) {
+ err.lineNumber = err.loc.line;
+ err.column = err.loc.column;
+
+ if (opts.codeFrame) {
+ err.lineNumber = err.loc.line;
+ err.column = err.loc.column + 1;
+
+ // remove trailing "(LINE:COLUMN)" acorn message and add in esprima syntax error message start
+ err.message =
+ "Line " +
+ err.lineNumber +
+ ": " +
+ err.message.replace(/ \((\d+):(\d+)\)$/, "") +
+ // add codeframe
+ "\n\n" +
+ codeFrameColumns(
+ code,
+ {
+ start: {
+ line: err.lineNumber,
+ column: err.column,
+ },
+ },
+ { highlightCode: true }
+ );
+ }
+ }
+
+ throw err;
+ }
+
+ babylonToEspree(ast, traverse, tt, code);
+
+ return ast;
+};
diff --git a/tools/node_modules/babel-eslint/lib/patch-eslint-scope.js b/tools/node_modules/babel-eslint/lib/patch-eslint-scope.js
new file mode 100644
index 0000000000..aec71fc6ca
--- /dev/null
+++ b/tools/node_modules/babel-eslint/lib/patch-eslint-scope.js
@@ -0,0 +1,370 @@
+"use strict";
+
+var Module = require("module");
+var path = require("path");
+var t = require("@babel/types");
+
+function getModules() {
+ try {
+ // avoid importing a local copy of eslint, try to find a peer dependency
+ var eslintLoc = Module._resolveFilename("eslint", module.parent);
+ } catch (err) {
+ try {
+ // avoids breaking in jest where module.parent is undefined
+ eslintLoc = require.resolve("eslint");
+ } catch (err) {
+ throw new ReferenceError("couldn't resolve eslint");
+ }
+ }
+
+ // get modules relative to what eslint will load
+ var eslintMod = new Module(eslintLoc);
+ eslintMod.filename = eslintLoc;
+ eslintMod.paths = Module._nodeModulePaths(path.dirname(eslintLoc));
+
+ try {
+ var escope = eslintMod.require("eslint-scope");
+ var Definition = eslintMod.require("eslint-scope/lib/definition")
+ .Definition;
+ var referencer = eslintMod.require("eslint-scope/lib/referencer");
+ } catch (err) {
+ escope = eslintMod.require("escope");
+ Definition = eslintMod.require("escope/lib/definition").Definition;
+ referencer = eslintMod.require("escope/lib/referencer");
+ }
+
+ var estraverse = eslintMod.require("estraverse");
+
+ if (referencer.__esModule) referencer = referencer.default;
+
+ return {
+ Definition,
+ escope,
+ estraverse,
+ referencer,
+ };
+}
+
+function monkeypatch(modules) {
+ var Definition = modules.Definition;
+ var escope = modules.escope;
+ var estraverse = modules.estraverse;
+ var referencer = modules.referencer;
+
+ Object.assign(estraverse.VisitorKeys, t.VISITOR_KEYS);
+ estraverse.VisitorKeys.MethodDefinition.push("decorators");
+ estraverse.VisitorKeys.Property.push("decorators");
+
+ // if there are decorators, then visit each
+ function visitDecorators(node) {
+ if (!node.decorators) {
+ return;
+ }
+ for (var i = 0; i < node.decorators.length; i++) {
+ if (node.decorators[i].expression) {
+ this.visit(node.decorators[i]);
+ }
+ }
+ }
+
+ // iterate through part of t.VISITOR_KEYS
+ var flowFlippedAliasKeys = t.FLIPPED_ALIAS_KEYS.Flow.concat([
+ "ArrayPattern",
+ "ClassDeclaration",
+ "ClassExpression",
+ "FunctionDeclaration",
+ "FunctionExpression",
+ "Identifier",
+ "ObjectPattern",
+ "RestElement",
+ ]);
+ var visitorKeysMap = Object.keys(t.VISITOR_KEYS).reduce(function(acc, key) {
+ var value = t.VISITOR_KEYS[key];
+ if (flowFlippedAliasKeys.indexOf(value) === -1) {
+ acc[key] = value;
+ }
+ return acc;
+ }, {});
+
+ var propertyTypes = {
+ // loops
+ callProperties: { type: "loop", values: ["value"] },
+ indexers: { type: "loop", values: ["key", "value"] },
+ properties: { type: "loop", values: ["argument", "value"] },
+ types: { type: "loop" },
+ params: { type: "loop" },
+ // single property
+ argument: { type: "single" },
+ elementType: { type: "single" },
+ qualification: { type: "single" },
+ rest: { type: "single" },
+ returnType: { type: "single" },
+ // others
+ typeAnnotation: { type: "typeAnnotation" },
+ typeParameters: { type: "typeParameters" },
+ id: { type: "id" },
+ };
+
+ function visitTypeAnnotation(node) {
+ // get property to check (params, id, etc...)
+ var visitorValues = visitorKeysMap[node.type];
+ if (!visitorValues) {
+ return;
+ }
+
+ // can have multiple properties
+ for (var i = 0; i < visitorValues.length; i++) {
+ var visitorValue = visitorValues[i];
+ var propertyType = propertyTypes[visitorValue];
+ var nodeProperty = node[visitorValue];
+ // check if property or type is defined
+ if (propertyType == null || nodeProperty == null) {
+ continue;
+ }
+ if (propertyType.type === "loop") {
+ for (var j = 0; j < nodeProperty.length; j++) {
+ if (Array.isArray(propertyType.values)) {
+ for (var k = 0; k < propertyType.values.length; k++) {
+ var loopPropertyNode = nodeProperty[j][propertyType.values[k]];
+ if (loopPropertyNode) {
+ checkIdentifierOrVisit.call(this, loopPropertyNode);
+ }
+ }
+ } else {
+ checkIdentifierOrVisit.call(this, nodeProperty[j]);
+ }
+ }
+ } else if (propertyType.type === "single") {
+ checkIdentifierOrVisit.call(this, nodeProperty);
+ } else if (propertyType.type === "typeAnnotation") {
+ visitTypeAnnotation.call(this, node.typeAnnotation);
+ } else if (propertyType.type === "typeParameters") {
+ for (var l = 0; l < node.typeParameters.params.length; l++) {
+ checkIdentifierOrVisit.call(this, node.typeParameters.params[l]);
+ }
+ } else if (propertyType.type === "id") {
+ if (node.id.type === "Identifier") {
+ checkIdentifierOrVisit.call(this, node.id);
+ } else {
+ visitTypeAnnotation.call(this, node.id);
+ }
+ }
+ }
+ }
+
+ function checkIdentifierOrVisit(node) {
+ if (node.typeAnnotation) {
+ visitTypeAnnotation.call(this, node.typeAnnotation);
+ } else if (node.type === "Identifier") {
+ this.visit(node);
+ } else {
+ visitTypeAnnotation.call(this, node);
+ }
+ }
+
+ function nestTypeParamScope(manager, node) {
+ var parentScope = manager.__currentScope;
+ var scope = new escope.Scope(
+ manager,
+ "type-parameters",
+ parentScope,
+ node,
+ false
+ );
+ manager.__nestScope(scope);
+ for (var j = 0; j < node.typeParameters.params.length; j++) {
+ var name = node.typeParameters.params[j];
+ scope.__define(name, new Definition("TypeParameter", name, name));
+ if (name.typeAnnotation) {
+ checkIdentifierOrVisit.call(this, name);
+ }
+ }
+ scope.__define = function() {
+ return parentScope.__define.apply(parentScope, arguments);
+ };
+ return scope;
+ }
+
+ // visit decorators that are in: ClassDeclaration / ClassExpression
+ var visitClass = referencer.prototype.visitClass;
+ referencer.prototype.visitClass = function(node) {
+ visitDecorators.call(this, node);
+ var typeParamScope;
+ if (node.typeParameters) {
+ typeParamScope = nestTypeParamScope.call(this, this.scopeManager, node);
+ }
+ // visit flow type: ClassImplements
+ if (node.implements) {
+ for (var i = 0; i < node.implements.length; i++) {
+ checkIdentifierOrVisit.call(this, node.implements[i]);
+ }
+ }
+ if (node.superTypeParameters) {
+ for (var k = 0; k < node.superTypeParameters.params.length; k++) {
+ checkIdentifierOrVisit.call(this, node.superTypeParameters.params[k]);
+ }
+ }
+ visitClass.call(this, node);
+ if (typeParamScope) {
+ this.close(node);
+ }
+ };
+
+ // visit decorators that are in: Property / MethodDefinition
+ var visitProperty = referencer.prototype.visitProperty;
+ referencer.prototype.visitProperty = function(node) {
+ if (node.value && node.value.type === "TypeCastExpression") {
+ visitTypeAnnotation.call(this, node.value);
+ }
+ visitDecorators.call(this, node);
+ visitProperty.call(this, node);
+ };
+
+ function visitClassProperty(node) {
+ if (node.typeAnnotation) {
+ visitTypeAnnotation.call(this, node.typeAnnotation);
+ }
+ this.visitProperty(node);
+ }
+
+ // visit ClassProperty as a Property.
+ referencer.prototype.ClassProperty = visitClassProperty;
+
+ // visit ClassPrivateProperty as a Property.
+ referencer.prototype.ClassPrivateProperty = visitClassProperty;
+
+ // visit flow type in FunctionDeclaration, FunctionExpression, ArrowFunctionExpression
+ var visitFunction = referencer.prototype.visitFunction;
+ referencer.prototype.visitFunction = function(node) {
+ var typeParamScope;
+ if (node.typeParameters) {
+ typeParamScope = nestTypeParamScope.call(this, this.scopeManager, node);
+ }
+ if (node.returnType) {
+ checkIdentifierOrVisit.call(this, node.returnType);
+ }
+ // only visit if function parameters have types
+ if (node.params) {
+ for (var i = 0; i < node.params.length; i++) {
+ var param = node.params[i];
+ if (param.typeAnnotation) {
+ checkIdentifierOrVisit.call(this, param);
+ } else if (t.isAssignmentPattern(param)) {
+ if (param.left.typeAnnotation) {
+ checkIdentifierOrVisit.call(this, param.left);
+ }
+ }
+ }
+ }
+ // set ArrayPattern/ObjectPattern visitor keys back to their original. otherwise
+ // escope will traverse into them and include the identifiers within as declarations
+ estraverse.VisitorKeys.ObjectPattern = ["properties"];
+ estraverse.VisitorKeys.ArrayPattern = ["elements"];
+ visitFunction.call(this, node);
+ // set them back to normal...
+ estraverse.VisitorKeys.ObjectPattern = t.VISITOR_KEYS.ObjectPattern;
+ estraverse.VisitorKeys.ArrayPattern = t.VISITOR_KEYS.ArrayPattern;
+ if (typeParamScope) {
+ this.close(node);
+ }
+ };
+
+ // visit flow type in VariableDeclaration
+ var variableDeclaration = referencer.prototype.VariableDeclaration;
+ referencer.prototype.VariableDeclaration = function(node) {
+ if (node.declarations) {
+ for (var i = 0; i < node.declarations.length; i++) {
+ var id = node.declarations[i].id;
+ var typeAnnotation = id.typeAnnotation;
+ if (typeAnnotation) {
+ checkIdentifierOrVisit.call(this, typeAnnotation);
+ }
+ }
+ }
+ variableDeclaration.call(this, node);
+ };
+
+ function createScopeVariable(node, name) {
+ this.currentScope().variableScope.__define(
+ name,
+ new Definition("Variable", name, node, null, null, null)
+ );
+ }
+
+ referencer.prototype.InterfaceDeclaration = function(node) {
+ createScopeVariable.call(this, node, node.id);
+ var typeParamScope;
+ if (node.typeParameters) {
+ typeParamScope = nestTypeParamScope.call(this, this.scopeManager, node);
+ }
+ // TODO: Handle mixins
+ for (var i = 0; i < node.extends.length; i++) {
+ visitTypeAnnotation.call(this, node.extends[i]);
+ }
+ visitTypeAnnotation.call(this, node.body);
+ if (typeParamScope) {
+ this.close(node);
+ }
+ };
+
+ referencer.prototype.TypeAlias = function(node) {
+ createScopeVariable.call(this, node, node.id);
+ var typeParamScope;
+ if (node.typeParameters) {
+ typeParamScope = nestTypeParamScope.call(this, this.scopeManager, node);
+ }
+ if (node.right) {
+ visitTypeAnnotation.call(this, node.right);
+ }
+ if (typeParamScope) {
+ this.close(node);
+ }
+ };
+
+ referencer.prototype.DeclareModule = referencer.prototype.DeclareFunction = referencer.prototype.DeclareVariable = referencer.prototype.DeclareClass = function(
+ node
+ ) {
+ if (node.id) {
+ createScopeVariable.call(this, node, node.id);
+ }
+
+ var typeParamScope;
+ if (node.typeParameters) {
+ typeParamScope = nestTypeParamScope.call(this, this.scopeManager, node);
+ }
+ if (typeParamScope) {
+ this.close(node);
+ }
+ };
+
+ referencer._babelEslintPatched = true;
+}
+
+// To patch for each call.
+var escope = null;
+var escopeAnalyze = null;
+
+module.exports = function(parserOptions) {
+ // Patch `Referencer.prototype` once.
+ if (!escope) {
+ const modules = getModules();
+ monkeypatch(modules);
+
+ // Store to patch for each call.
+ escope = modules.escope;
+ escopeAnalyze = modules.escope.analyze;
+ }
+
+ // Patch `escope.analyze` based on the current parserOptions.
+ escope.analyze = function(ast, opts) {
+ opts = opts || {};
+ opts.ecmaVersion = parserOptions.ecmaVersion;
+ opts.sourceType = parserOptions.sourceType;
+ opts.nodejsScope =
+ ast.sourceType === "script" &&
+ (parserOptions.ecmaFeatures &&
+ parserOptions.ecmaFeatures.globalReturn) === true;
+
+ return escopeAnalyze.call(this, ast, opts);
+ };
+};
diff --git a/tools/node_modules/babel-eslint/lib/visitor-keys.js b/tools/node_modules/babel-eslint/lib/visitor-keys.js
new file mode 100644
index 0000000000..921a0bb016
--- /dev/null
+++ b/tools/node_modules/babel-eslint/lib/visitor-keys.js
@@ -0,0 +1,15 @@
+"use strict";
+
+const BABEL_VISITOR_KEYS = require("@babel/types").VISITOR_KEYS;
+const ESLINT_VISITOR_KEYS = require("eslint-visitor-keys").KEYS;
+
+module.exports = Object.assign(
+ {
+ Literal: ESLINT_VISITOR_KEYS.Literal,
+ MethodDefinition: ["decorators"].concat(
+ ESLINT_VISITOR_KEYS.MethodDefinition
+ ),
+ Property: ["decorators"].concat(ESLINT_VISITOR_KEYS.Property),
+ },
+ BABEL_VISITOR_KEYS
+);