diff --git a/packages/eslint-plugin-internal/package.json b/packages/eslint-plugin-internal/package.json index 672744314a4..9d073886f83 100644 --- a/packages/eslint-plugin-internal/package.json +++ b/packages/eslint-plugin-internal/package.json @@ -15,6 +15,7 @@ "dependencies": { "@types/prettier": "*", "@typescript-eslint/experimental-utils": "4.31.2", + "@typescript-eslint/scope-manager": "^4.31.2", "prettier": "*" } } diff --git a/packages/eslint-plugin-internal/src/rules/no-poorly-typed-ts-props.ts b/packages/eslint-plugin-internal/src/rules/no-poorly-typed-ts-props.ts index d5554ec57d5..96c1405c73f 100644 --- a/packages/eslint-plugin-internal/src/rules/no-poorly-typed-ts-props.ts +++ b/packages/eslint-plugin-internal/src/rules/no-poorly-typed-ts-props.ts @@ -1,7 +1,7 @@ import { - TSESTree, ESLintUtils, TSESLint, + TSESTree, } from '@typescript-eslint/experimental-utils'; import { createRule } from '../util'; @@ -24,6 +24,7 @@ const BANNED_PROPERTIES = [ fixWith: 'getDeclarations()', }, { + // eslint-disable-next-line @typescript-eslint/internal/prefer-ast-types-enum type: 'Type', property: 'symbol', fixWith: 'getSymbol()', diff --git a/packages/eslint-plugin-internal/src/rules/prefer-ast-types-enum.ts b/packages/eslint-plugin-internal/src/rules/prefer-ast-types-enum.ts index 8a5ec63bb4e..c4a95695d96 100755 --- a/packages/eslint-plugin-internal/src/rules/prefer-ast-types-enum.ts +++ b/packages/eslint-plugin-internal/src/rules/prefer-ast-types-enum.ts @@ -3,6 +3,7 @@ import { AST_TOKEN_TYPES, TSESTree, } from '@typescript-eslint/experimental-utils'; +import { DefinitionType } from '@typescript-eslint/scope-manager'; import { createRule } from '../util'; const isStringLiteral = ( @@ -17,7 +18,7 @@ export default createRule({ category: 'Best Practices', recommended: 'error', description: - 'Ensures consistent usage of AST_NODE_TYPES & AST_TOKEN_TYPES enums.', + 'Ensures consistent usage of `AST_NODE_TYPES`, `AST_TOKEN_TYPES` and `DefinitionType` enums.', }, messages: { preferEnum: 'Prefer {{ enumName }}.{{ literal }} over raw literal', @@ -28,7 +29,7 @@ export default createRule({ defaultOptions: [], create(context) { const report = ( - enumName: 'AST_NODE_TYPES' | 'AST_TOKEN_TYPES', + enumName: 'AST_NODE_TYPES' | 'AST_TOKEN_TYPES' | 'DefinitionType', literal: TSESTree.StringLiteral, ): void => context.report({ @@ -44,7 +45,7 @@ export default createRule({ if ( node.parent?.type === AST_NODE_TYPES.TSEnumMember && node.parent.parent?.type === AST_NODE_TYPES.TSEnumDeclaration && - ['AST_NODE_TYPES', 'AST_TOKEN_TYPES'].includes( + ['AST_NODE_TYPES', 'AST_TOKEN_TYPES', 'DefinitionType'].includes( node.parent.parent.id.name, ) ) { @@ -64,6 +65,10 @@ export default createRule({ if (Object.prototype.hasOwnProperty.call(AST_TOKEN_TYPES, value)) { report('AST_TOKEN_TYPES', node); } + + if (Object.prototype.hasOwnProperty.call(DefinitionType, value)) { + report('DefinitionType', node); + } }, }; }, diff --git a/packages/eslint-plugin-internal/tests/rules/no-poorly-typed-ts-props.test.ts b/packages/eslint-plugin-internal/tests/rules/no-poorly-typed-ts-props.test.ts index 8fe109ee3d1..4c9751489bd 100644 --- a/packages/eslint-plugin-internal/tests/rules/no-poorly-typed-ts-props.test.ts +++ b/packages/eslint-plugin-internal/tests/rules/no-poorly-typed-ts-props.test.ts @@ -1,5 +1,6 @@ +/* eslint-disable @typescript-eslint/internal/prefer-ast-types-enum */ import rule from '../../src/rules/no-poorly-typed-ts-props'; -import { RuleTester, getFixturesRootDir } from '../RuleTester'; +import { getFixturesRootDir, RuleTester } from '../RuleTester'; const ruleTester = new RuleTester({ parser: '@typescript-eslint/parser', diff --git a/packages/eslint-plugin-internal/tests/rules/prefer-ast-types-enum.test.ts b/packages/eslint-plugin-internal/tests/rules/prefer-ast-types-enum.test.ts index c2ffd8e489e..94f8830a04e 100644 --- a/packages/eslint-plugin-internal/tests/rules/prefer-ast-types-enum.test.ts +++ b/packages/eslint-plugin-internal/tests/rules/prefer-ast-types-enum.test.ts @@ -2,8 +2,9 @@ import { AST_NODE_TYPES, AST_TOKEN_TYPES, } from '@typescript-eslint/experimental-utils'; +import { DefinitionType } from '@typescript-eslint/scope-manager'; import rule from '../../src/rules/prefer-ast-types-enum'; -import { RuleTester, batchedSingleLineTests } from '../RuleTester'; +import { batchedSingleLineTests, RuleTester } from '../RuleTester'; const ruleTester = new RuleTester({ parser: '@typescript-eslint/parser', @@ -17,6 +18,7 @@ ruleTester.run('prefer-ast-types-enum', rule, { "node.type === 'constructor';", 'node.type === AST_NODE_TYPES.Literal;', 'node.type === AST_TOKEN_TYPES.Keyword;', + 'node.type === DefinitionType.Parameter;', 'node.type === 1;', ` enum MY_ENUM { @@ -33,10 +35,12 @@ ruleTester.run('prefer-ast-types-enum', rule, { code: ` node.type === 'Literal'; node.type === 'Keyword'; +node.type === 'Parameter'; `, output: ` node.type === AST_NODE_TYPES.Literal; node.type === AST_TOKEN_TYPES.Keyword; +node.type === DefinitionType.Parameter; `, errors: [ { @@ -49,6 +53,11 @@ node.type === AST_TOKEN_TYPES.Keyword; messageId: 'preferEnum', line: 3, }, + { + data: { enumName: 'DefinitionType', literal: DefinitionType.Parameter }, + messageId: 'preferEnum', + line: 4, + }, ], }), }); diff --git a/packages/eslint-plugin/src/rules/explicit-module-boundary-types.ts b/packages/eslint-plugin/src/rules/explicit-module-boundary-types.ts index bdcd9750c88..33caf65f19b 100644 --- a/packages/eslint-plugin/src/rules/explicit-module-boundary-types.ts +++ b/packages/eslint-plugin/src/rules/explicit-module-boundary-types.ts @@ -1,7 +1,8 @@ import { - TSESTree, AST_NODE_TYPES, + TSESTree, } from '@typescript-eslint/experimental-utils'; +import { DefinitionType } from '@typescript-eslint/scope-manager'; import * as util from '../util'; import { checkFunctionExpressionReturnType, @@ -294,11 +295,12 @@ export default util.createRule({ for (const definition of variable.defs) { // cases we don't care about in this rule if ( - definition.type === 'ImplicitGlobalVariable' || - definition.type === 'ImportBinding' || - // eslint-disable-next-line @typescript-eslint/internal/prefer-ast-types-enum - definition.type === 'CatchClause' || - definition.type === 'Parameter' + [ + DefinitionType.ImplicitGlobalVariable, + DefinitionType.ImportBinding, + DefinitionType.CatchClause, + DefinitionType.Parameter, + ].includes(definition.type) ) { continue; } diff --git a/packages/eslint-plugin/src/rules/no-inferrable-types.ts b/packages/eslint-plugin/src/rules/no-inferrable-types.ts index 110bda41aea..4edcf69c975 100644 --- a/packages/eslint-plugin/src/rules/no-inferrable-types.ts +++ b/packages/eslint-plugin/src/rules/no-inferrable-types.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/internal/prefer-ast-types-enum */ import { AST_NODE_TYPES, TSESTree, @@ -129,7 +130,6 @@ export default util.createRule({ case AST_NODE_TYPES.TSBooleanKeyword: return ( hasUnaryPrefix(init, '!') || - // eslint-disable-next-line @typescript-eslint/internal/prefer-ast-types-enum isFunctionCall(init, 'Boolean') || isLiteral(init, 'boolean') ); @@ -151,7 +151,6 @@ export default util.createRule({ case AST_NODE_TYPES.TSStringKeyword: return ( - // eslint-disable-next-line @typescript-eslint/internal/prefer-ast-types-enum isFunctionCall(init, 'String') || isLiteral(init, 'string') || init.type === AST_NODE_TYPES.TemplateLiteral diff --git a/packages/eslint-plugin/src/rules/no-shadow.ts b/packages/eslint-plugin/src/rules/no-shadow.ts index ea27f87e083..61a34c231d0 100644 --- a/packages/eslint-plugin/src/rules/no-shadow.ts +++ b/packages/eslint-plugin/src/rules/no-shadow.ts @@ -87,7 +87,10 @@ export default util.createRule({ * Check if variable is a `this` parameter. */ function isThisParam(variable: TSESLint.Scope.Variable): boolean { - return variable.defs[0].type === 'Parameter' && variable.name === 'this'; + return ( + variable.defs[0].type === DefinitionType.Parameter && + variable.name === 'this' + ); } function isTypeImport( @@ -293,7 +296,7 @@ export default util.createRule({ inner && outer[0] < inner[0] && inner[1] < outer[1] && - ((innerDef.type === 'FunctionName' && + ((innerDef.type === DefinitionType.FunctionName && innerDef.node.type === AST_NODE_TYPES.FunctionExpression) || innerDef.node.type === AST_NODE_TYPES.ClassExpression) && outerScope === innerScope.upper diff --git a/packages/eslint-plugin/src/rules/no-type-alias.ts b/packages/eslint-plugin/src/rules/no-type-alias.ts index 6cd149dd77c..cf56745ca90 100644 --- a/packages/eslint-plugin/src/rules/no-type-alias.ts +++ b/packages/eslint-plugin/src/rules/no-type-alias.ts @@ -1,5 +1,6 @@ import { AST_NODE_TYPES, + AST_TOKEN_TYPES, TSESTree, } from '@typescript-eslint/experimental-utils'; import * as util from '../util'; @@ -278,8 +279,7 @@ export default util.createRule({ reportError(type.node, type.compositionType, isTopLevel, 'Generics'); } } else if ( - // eslint-disable-next-line @typescript-eslint/internal/prefer-ast-types-enum - type.node.type.endsWith('Keyword') || + type.node.type.endsWith(AST_TOKEN_TYPES.Keyword) || aliasTypes.has(type.node.type) || (type.node.type === AST_NODE_TYPES.TSTypeOperator && (type.node.operator === 'keyof' || diff --git a/packages/eslint-plugin/src/rules/no-unused-vars-experimental.ts b/packages/eslint-plugin/src/rules/no-unused-vars-experimental.ts index 0aedd20cbb2..75154329522 100644 --- a/packages/eslint-plugin/src/rules/no-unused-vars-experimental.ts +++ b/packages/eslint-plugin/src/rules/no-unused-vars-experimental.ts @@ -1,5 +1,4 @@ -/* eslint-disable no-fallthrough */ - +/* eslint-disable @typescript-eslint/internal/prefer-ast-types-enum, no-fallthrough */ import { TSESTree } from '@typescript-eslint/experimental-utils'; import * as ts from 'typescript'; import * as util from '../util'; @@ -161,7 +160,6 @@ export default util.createRule({ break; case ts.SyntaxKind.PropertyDeclaration: - // eslint-disable-next-line @typescript-eslint/internal/prefer-ast-types-enum report('Property'); break; diff --git a/packages/eslint-plugin/src/rules/no-use-before-define.ts b/packages/eslint-plugin/src/rules/no-use-before-define.ts index 59680863c9b..ef39ec9a5b7 100644 --- a/packages/eslint-plugin/src/rules/no-use-before-define.ts +++ b/packages/eslint-plugin/src/rules/no-use-before-define.ts @@ -3,6 +3,7 @@ import { TSESLint, TSESTree, } from '@typescript-eslint/experimental-utils'; +import { DefinitionType } from '@typescript-eslint/scope-manager'; import * as util from '../util'; const SENTINEL_TYPE = @@ -44,14 +45,14 @@ function parseOptions(options: string | Config | null): Required { * Checks whether or not a given variable is a function declaration. */ function isFunction(variable: TSESLint.Scope.Variable): boolean { - return variable.defs[0].type === 'FunctionName'; + return variable.defs[0].type === DefinitionType.FunctionName; } /** * Checks whether or not a given variable is a type declaration. */ function isTypedef(variable: TSESLint.Scope.Variable): boolean { - return variable.defs[0].type === 'Type'; + return variable.defs[0].type === DefinitionType.Type; } /** @@ -62,7 +63,7 @@ function isOuterEnum( reference: TSESLint.Scope.Reference, ): boolean { return ( - variable.defs[0].type == 'TSEnumName' && + variable.defs[0].type == DefinitionType.TSEnumName && variable.scope.variableScope !== reference.from.variableScope ); } @@ -75,7 +76,7 @@ function isOuterClass( reference: TSESLint.Scope.Reference, ): boolean { return ( - variable.defs[0].type === 'ClassName' && + variable.defs[0].type === DefinitionType.ClassName && variable.scope.variableScope !== reference.from.variableScope ); } @@ -88,7 +89,7 @@ function isOuterVariable( reference: TSESLint.Scope.Reference, ): boolean { return ( - variable.defs[0].type === 'Variable' && + variable.defs[0].type === DefinitionType.Variable && variable.scope.variableScope !== reference.from.variableScope ); } @@ -142,7 +143,7 @@ function isClassRefInClassDecorator( variable: TSESLint.Scope.Variable, reference: TSESLint.Scope.Reference, ): boolean { - if (variable.defs[0].type !== 'ClassName') { + if (variable.defs[0].type !== DefinitionType.ClassName) { return false; } diff --git a/packages/eslint-plugin/tests/rules/ban-types.test.ts b/packages/eslint-plugin/tests/rules/ban-types.test.ts index 27743ecc5a3..9dbd5344be5 100644 --- a/packages/eslint-plugin/tests/rules/ban-types.test.ts +++ b/packages/eslint-plugin/tests/rules/ban-types.test.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/internal/prefer-ast-types-enum */ import { TSESLint } from '@typescript-eslint/experimental-utils'; import rule, { MessageIds, @@ -5,7 +6,7 @@ import rule, { TYPE_KEYWORDS, } from '../../src/rules/ban-types'; import { objectReduceKey } from '../../src/util'; -import { RuleTester, noFormat } from '../RuleTester'; +import { noFormat, RuleTester } from '../RuleTester'; const ruleTester = new RuleTester({ parser: '@typescript-eslint/parser', @@ -163,7 +164,6 @@ ruleTester.run('ban-types', rule, { { messageId: 'bannedTypeMessage', data: { - // eslint-disable-next-line @typescript-eslint/internal/prefer-ast-types-enum name: 'String', customMessage: ' Use string instead.', }, @@ -180,7 +180,6 @@ ruleTester.run('ban-types', rule, { { messageId: 'bannedTypeMessage', data: { - // eslint-disable-next-line @typescript-eslint/internal/prefer-ast-types-enum name: 'String', customMessage: ' Use string instead.', }, @@ -197,7 +196,6 @@ ruleTester.run('ban-types', rule, { { messageId: 'bannedTypeMessage', data: { - // eslint-disable-next-line @typescript-eslint/internal/prefer-ast-types-enum name: 'String', customMessage: ' Use string instead.', }, @@ -242,7 +240,6 @@ class Foo extends Bar implements Baz { { messageId: 'bannedTypeMessage', data: { - // eslint-disable-next-line @typescript-eslint/internal/prefer-ast-types-enum name: 'String', customMessage: ' Use string instead.', }, @@ -252,7 +249,6 @@ class Foo extends Bar implements Baz { { messageId: 'bannedTypeMessage', data: { - // eslint-disable-next-line @typescript-eslint/internal/prefer-ast-types-enum name: 'String', customMessage: ' Use string instead.', }, @@ -271,7 +267,6 @@ class Foo extends Bar implements Baz { { messageId: 'bannedTypeMessage', data: { - // eslint-disable-next-line @typescript-eslint/internal/prefer-ast-types-enum name: 'String', customMessage: ' Use string instead.', }, @@ -296,7 +291,6 @@ class Foo extends Bar implements Baz { { messageId: 'bannedTypeMessage', data: { - // eslint-disable-next-line @typescript-eslint/internal/prefer-ast-types-enum name: 'String', customMessage: ' Use string instead.', }, @@ -306,7 +300,6 @@ class Foo extends Bar implements Baz { { messageId: 'bannedTypeMessage', data: { - // eslint-disable-next-line @typescript-eslint/internal/prefer-ast-types-enum name: 'String', customMessage: ' Use string instead.', }, @@ -316,7 +309,6 @@ class Foo extends Bar implements Baz { { messageId: 'bannedTypeMessage', data: { - // eslint-disable-next-line @typescript-eslint/internal/prefer-ast-types-enum name: 'String', customMessage: ' Use string instead.', }, diff --git a/packages/eslint-plugin/tests/rules/naming-convention.test.ts b/packages/eslint-plugin/tests/rules/naming-convention.test.ts index 5aa1606eaff..1c693b4fde0 100644 --- a/packages/eslint-plugin/tests/rules/naming-convention.test.ts +++ b/packages/eslint-plugin/tests/rules/naming-convention.test.ts @@ -1,11 +1,12 @@ +/* eslint-disable @typescript-eslint/internal/prefer-ast-types-enum */ import { TSESLint } from '@typescript-eslint/experimental-utils'; import rule, { MessageIds, Options } from '../../src/rules/naming-convention'; import { PredefinedFormatsString, - selectorTypeToMessageString, Selector, + selectorTypeToMessageString, } from '../../src/rules/naming-convention-utils'; -import { RuleTester, getFixturesRootDir } from '../RuleTester'; +import { getFixturesRootDir, RuleTester } from '../RuleTester'; const ruleTester = new RuleTester({ parser: '@typescript-eslint/parser', diff --git a/packages/eslint-plugin/tests/rules/no-unused-vars-experimental.test.ts b/packages/eslint-plugin/tests/rules/no-unused-vars-experimental.test.ts index 67b9d22c86f..6beaa6f0a0a 100644 --- a/packages/eslint-plugin/tests/rules/no-unused-vars-experimental.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unused-vars-experimental.test.ts @@ -1,13 +1,14 @@ +/* eslint-disable @typescript-eslint/internal/prefer-ast-types-enum */ import { InvalidTestCase, ValidTestCase, } from '@typescript-eslint/experimental-utils/dist/ts-eslint'; import rule, { DEFAULT_IGNORED_REGEX_STRING, - Options, MessageIds, + Options, } from '../../src/rules/no-unused-vars-experimental'; -import { RuleTester, getFixturesRootDir } from '../RuleTester'; +import { getFixturesRootDir, RuleTester } from '../RuleTester'; const rootDir = getFixturesRootDir(); const ruleTester = new RuleTester({ @@ -544,7 +545,6 @@ export class Foo { messageId: 'unusedWithIgnorePattern', data: { name: 'foo', - // eslint-disable-next-line @typescript-eslint/internal/prefer-ast-types-enum type: 'Property', pattern: DEFAULT_IGNORED_REGEX, }, diff --git a/packages/scope-manager/src/definition/DefinitionType.ts b/packages/scope-manager/src/definition/DefinitionType.ts index 7f689d45ed5..5b01718ce7f 100644 --- a/packages/scope-manager/src/definition/DefinitionType.ts +++ b/packages/scope-manager/src/definition/DefinitionType.ts @@ -1,5 +1,4 @@ enum DefinitionType { - // eslint-disable-next-line @typescript-eslint/internal/prefer-ast-types-enum CatchClause = 'CatchClause', ClassName = 'ClassName', FunctionName = 'FunctionName', diff --git a/packages/scope-manager/tests/eslint-scope/references.test.ts b/packages/scope-manager/tests/eslint-scope/references.test.ts index 5f07dd671e9..8458fbfe657 100644 --- a/packages/scope-manager/tests/eslint-scope/references.test.ts +++ b/packages/scope-manager/tests/eslint-scope/references.test.ts @@ -643,6 +643,7 @@ describe('References:', () => { expect(constructorParamTypeRef1.isValueReference).toBe(true); const setterParamTypeRef3 = classBScope.childScopes[1].references[0]; + // eslint-disable-next-line @typescript-eslint/internal/prefer-ast-types-enum expect(setterParamTypeRef3.identifier.name).toBe('Type'); expect(setterParamTypeRef3.isTypeReference).toBe(true); expect(setterParamTypeRef3.isValueReference).toBe(false);