From 27ff54b338273c0eea8aa0e46a5222a6c4424759 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Thu, 27 Jul 2023 16:13:38 -0400 Subject: [PATCH 1/3] chore: enabled most of strict-type-checked internally --- .eslintrc.js | 7 ++++--- .../ast-spec/tests/ast-node-types.type-test.ts | 1 + .../eslint-plugin/src/rules/default-param-last.ts | 2 +- .../src/rules/explicit-function-return-type.ts | 2 +- .../src/rules/naming-convention-utils/enums.ts | 1 + .../rules/naming-convention-utils/parse-options.ts | 1 + .../eslint-plugin/src/rules/no-empty-function.ts | 2 +- packages/eslint-plugin/src/rules/no-namespace.ts | 5 +---- .../no-non-null-asserted-nullish-coalescing.ts | 4 +--- packages/eslint-plugin/src/rules/no-redeclare.ts | 3 +-- packages/eslint-plugin/src/rules/no-shadow.ts | 2 +- .../src/rules/no-unsafe-assignment.ts | 2 +- .../eslint-plugin/src/rules/prefer-regexp-exec.ts | 1 + .../src/util/collectUnusedVariables.ts | 2 +- .../src/util/getOperatorPrecedence.ts | 1 + packages/eslint-plugin/tools/generate-configs.ts | 5 +---- packages/rule-tester/src/RuleTester.ts | 2 +- packages/rule-tester/src/TestFramework.ts | 1 + packages/rule-tester/tests/RuleTester.test.ts | 2 +- .../src/definition/CatchClauseDefinition.ts | 3 +-- .../definition/ImplicitGlobalVariableDefinition.ts | 3 +-- .../src/definition/ParameterDefinition.ts | 3 +-- .../scope-manager/tests/util/getSpecificNode.ts | 6 +----- packages/typescript-estree/src/convert.ts | 2 +- .../src/parseSettings/ExpiringCache.ts | 2 +- packages/typescript-estree/tests/lib/parse.test.ts | 4 ++-- .../utils/src/eslint-utils/getParserServices.ts | 2 ++ packages/utils/src/ts-eslint/SourceCode.ts | 14 +------------- packages/website-eslint/src/mock/eslint.js | 1 + packages/website/plugins/generated-rule-docs.ts | 2 +- packages/website/src/hooks/useHistorySelector.ts | 2 +- 31 files changed, 36 insertions(+), 54 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 9795cfb5792d..a9e11b19255e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -20,9 +20,8 @@ module.exports = { extends: [ 'eslint:recommended', 'plugin:eslint-plugin/recommended', - 'plugin:@typescript-eslint/recommended-type-checked', + 'plugin:@typescript-eslint/strict-type-checked', 'plugin:@typescript-eslint/stylistic-type-checked', - // TODO: consider enabling strict-type-checked ], parserOptions: { sourceType: 'module', @@ -53,8 +52,10 @@ module.exports = { // make sure we're not leveraging any deprecated APIs 'deprecation/deprecation': 'error', - // TODO(#7138): Investigate enabling these soon ✨ + // TODO(#7338): Investigate enabling these soon ✨ '@typescript-eslint/consistent-indexed-object-style': 'off', + '@typescript-eslint/no-unnecessary-condition': 'off', + '@typescript-eslint/no-dynamic-delete': 'off', '@typescript-eslint/prefer-nullish-coalescing': 'off', // TODO(#7130): Investigate changing these in or removing these from presets diff --git a/packages/ast-spec/tests/ast-node-types.type-test.ts b/packages/ast-spec/tests/ast-node-types.type-test.ts index dc3d9a1bd506..f906a86139eb 100644 --- a/packages/ast-spec/tests/ast-node-types.type-test.ts +++ b/packages/ast-spec/tests/ast-node-types.type-test.ts @@ -12,4 +12,5 @@ type TakesString> = T; type _Test = // forcing the test onto a new line so it isn't covered by the expect error // If there are any enum members that don't have a corresponding TSESTree.Node, then this line will error with "Type 'string | number | symbol' is not assignable to type 'string'." + // eslint-disable-next-line @typescript-eslint/no-invalid-void-type TakesString | void; diff --git a/packages/eslint-plugin/src/rules/default-param-last.ts b/packages/eslint-plugin/src/rules/default-param-last.ts index e76ce14fa057..b8638031ac5a 100644 --- a/packages/eslint-plugin/src/rules/default-param-last.ts +++ b/packages/eslint-plugin/src/rules/default-param-last.ts @@ -24,7 +24,7 @@ export default createRule({ * @private */ function isOptionalParam(node: TSESTree.Parameter): boolean { - return 'optional' in node && node.optional === true; + return 'optional' in node && node.optional; } /** diff --git a/packages/eslint-plugin/src/rules/explicit-function-return-type.ts b/packages/eslint-plugin/src/rules/explicit-function-return-type.ts index e57465be8365..671504173d59 100644 --- a/packages/eslint-plugin/src/rules/explicit-function-return-type.ts +++ b/packages/eslint-plugin/src/rules/explicit-function-return-type.ts @@ -138,7 +138,7 @@ export default util.createRule({ case AST_NODE_TYPES.Property: { if ( parent.key.type === AST_NODE_TYPES.Identifier && - parent.computed === false + !parent.computed ) { funcName = parent.key.name; } diff --git a/packages/eslint-plugin/src/rules/naming-convention-utils/enums.ts b/packages/eslint-plugin/src/rules/naming-convention-utils/enums.ts index 1b26c18ecb22..43eaff51edea 100644 --- a/packages/eslint-plugin/src/rules/naming-convention-utils/enums.ts +++ b/packages/eslint-plugin/src/rules/naming-convention-utils/enums.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/prefer-literal-enum-member */ enum PredefinedFormats { camelCase = 1, strictCamelCase, diff --git a/packages/eslint-plugin/src/rules/naming-convention-utils/parse-options.ts b/packages/eslint-plugin/src/rules/naming-convention-utils/parse-options.ts index 945777dd7fbd..77035e7d7524 100644 --- a/packages/eslint-plugin/src/rules/naming-convention-utils/parse-options.ts +++ b/packages/eslint-plugin/src/rules/naming-convention-utils/parse-options.ts @@ -87,6 +87,7 @@ function parseOptions(context: Context): ParsedOptions { const result = util.getEnumNames(Selectors).reduce((acc, k) => { acc[k] = createValidator(k, context, normalizedOptions); return acc; + // eslint-disable-next-line @typescript-eslint/prefer-reduce-type-parameter }, {} as ParsedOptions); return result; diff --git a/packages/eslint-plugin/src/rules/no-empty-function.ts b/packages/eslint-plugin/src/rules/no-empty-function.ts index e77981eab301..c5668b0d08b7 100644 --- a/packages/eslint-plugin/src/rules/no-empty-function.ts +++ b/packages/eslint-plugin/src/rules/no-empty-function.ts @@ -151,7 +151,7 @@ export default util.createRule({ isAllowedOverrideMethods && isBodyEmpty(node) && node.parent?.type === AST_NODE_TYPES.MethodDefinition && - node.parent.override === true + node.parent.override ); } diff --git a/packages/eslint-plugin/src/rules/no-namespace.ts b/packages/eslint-plugin/src/rules/no-namespace.ts index 145ddc3ad16b..22907682eb39 100644 --- a/packages/eslint-plugin/src/rules/no-namespace.ts +++ b/packages/eslint-plugin/src/rules/no-namespace.ts @@ -52,10 +52,7 @@ export default util.createRule({ const filename = context.getFilename(); function isDeclaration(node: TSESTree.Node): boolean { - if ( - node.type === AST_NODE_TYPES.TSModuleDeclaration && - node.declare === true - ) { + if (node.type === AST_NODE_TYPES.TSModuleDeclaration && node.declare) { return true; } diff --git a/packages/eslint-plugin/src/rules/no-non-null-asserted-nullish-coalescing.ts b/packages/eslint-plugin/src/rules/no-non-null-asserted-nullish-coalescing.ts index a79fa4062b1f..ef2a0fd85eca 100644 --- a/packages/eslint-plugin/src/rules/no-non-null-asserted-nullish-coalescing.ts +++ b/packages/eslint-plugin/src/rules/no-non-null-asserted-nullish-coalescing.ts @@ -26,9 +26,7 @@ function isDefinitionWithAssignment(definition: Definition): boolean { } const variableDeclarator = definition.node; - return ( - variableDeclarator.definite === true || variableDeclarator.init != null - ); + return variableDeclarator.definite || variableDeclarator.init != null; } export default util.createRule({ diff --git a/packages/eslint-plugin/src/rules/no-redeclare.ts b/packages/eslint-plugin/src/rules/no-redeclare.ts index 1f47b575c813..e1cca150bb39 100644 --- a/packages/eslint-plugin/src/rules/no-redeclare.ts +++ b/packages/eslint-plugin/src/rules/no-redeclare.ts @@ -71,8 +71,7 @@ export default util.createRule({ node?: TSESTree.Comment | TSESTree.Identifier; loc?: TSESTree.SourceLocation; }, - void, - unknown + void > { if ( options?.builtinGlobals && diff --git a/packages/eslint-plugin/src/rules/no-shadow.ts b/packages/eslint-plugin/src/rules/no-shadow.ts index ed202e9ea759..b296339e6552 100644 --- a/packages/eslint-plugin/src/rules/no-shadow.ts +++ b/packages/eslint-plugin/src/rules/no-shadow.ts @@ -283,7 +283,7 @@ export default util.createRule({ * @returns Whether or not the variable name is allowed. */ function isAllowed(variable: TSESLint.Scope.Variable): boolean { - return options.allow!.indexOf(variable.name) !== -1; + return options.allow!.includes(variable.name); } /** diff --git a/packages/eslint-plugin/src/rules/no-unsafe-assignment.ts b/packages/eslint-plugin/src/rules/no-unsafe-assignment.ts index 7e929071e19e..1f6d36fafe9d 100644 --- a/packages/eslint-plugin/src/rules/no-unsafe-assignment.ts +++ b/packages/eslint-plugin/src/rules/no-unsafe-assignment.ts @@ -174,7 +174,7 @@ export default util.createRule({ } let key: string; - if (receiverProperty.computed === false) { + if (!receiverProperty.computed) { key = receiverProperty.key.type === AST_NODE_TYPES.Identifier ? receiverProperty.key.name diff --git a/packages/eslint-plugin/src/rules/prefer-regexp-exec.ts b/packages/eslint-plugin/src/rules/prefer-regexp-exec.ts index 8e61a735c13e..7bbf5feba250 100644 --- a/packages/eslint-plugin/src/rules/prefer-regexp-exec.ts +++ b/packages/eslint-plugin/src/rules/prefer-regexp-exec.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/prefer-literal-enum-member */ import type { TSESTree } from '@typescript-eslint/utils'; import { AST_NODE_TYPES } from '@typescript-eslint/utils'; import * as tsutils from 'ts-api-utils'; diff --git a/packages/eslint-plugin/src/util/collectUnusedVariables.ts b/packages/eslint-plugin/src/util/collectUnusedVariables.ts index 4df1a178fbdb..8ec63de10dc6 100644 --- a/packages/eslint-plugin/src/util/collectUnusedVariables.ts +++ b/packages/eslint-plugin/src/util/collectUnusedVariables.ts @@ -323,7 +323,7 @@ class UnusedVarsVisitor< protected TSModuleDeclaration(node: TSESTree.TSModuleDeclaration): void { // -- global augmentation can be in any file, and they do not need exports - if (node.global === true) { + if (node.global) { this.markVariableAsUsed('global', node.parent); } } diff --git a/packages/eslint-plugin/src/util/getOperatorPrecedence.ts b/packages/eslint-plugin/src/util/getOperatorPrecedence.ts index abbcb9191a59..5626d66c03db 100644 --- a/packages/eslint-plugin/src/util/getOperatorPrecedence.ts +++ b/packages/eslint-plugin/src/util/getOperatorPrecedence.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/prefer-literal-enum-member */ import type { TSESTree } from '@typescript-eslint/utils'; import { AST_NODE_TYPES } from '@typescript-eslint/utils'; import { SyntaxKind } from 'typescript'; diff --git a/packages/eslint-plugin/tools/generate-configs.ts b/packages/eslint-plugin/tools/generate-configs.ts index 5056bdb7de42..1ada9e7105bc 100644 --- a/packages/eslint-plugin/tools/generate-configs.ts +++ b/packages/eslint-plugin/tools/generate-configs.ts @@ -76,10 +76,7 @@ async function main(): Promise { ); const EXTENDS = ['./configs/base', './configs/eslint-recommended']; - type RuleEntry = [ - string, - TSESLint.RuleModule, - ]; + type RuleEntry = [string, TSESLint.RuleModule]; const allRuleEntries: RuleEntry[] = Object.entries(rules).sort((a, b) => a[0].localeCompare(b[0]), diff --git a/packages/rule-tester/src/RuleTester.ts b/packages/rule-tester/src/RuleTester.ts index cc6577611378..61ecddde6610 100644 --- a/packages/rule-tester/src/RuleTester.ts +++ b/packages/rule-tester/src/RuleTester.ts @@ -237,7 +237,7 @@ export class RuleTester extends TestFramework { // convenience iterator to make it easy to loop all tests without a concat const allTestsIterator = { - *[Symbol.iterator](): Generator, void, unknown> { + *[Symbol.iterator](): Generator, void> { for (const testCase of normalizedTests.valid) { yield testCase; } diff --git a/packages/rule-tester/src/TestFramework.ts b/packages/rule-tester/src/TestFramework.ts index dea77d746249..f7ed21b51e17 100644 --- a/packages/rule-tester/src/TestFramework.ts +++ b/packages/rule-tester/src/TestFramework.ts @@ -51,6 +51,7 @@ let OVERRIDE_IT_SKIP: Maybe = null; * allows the user to manually supply functions in case they want to roll their * own tooling */ +// eslint-disable-next-line @typescript-eslint/no-extraneous-class export abstract class TestFramework { /** * Runs a function after all the tests in this file have completed. diff --git a/packages/rule-tester/tests/RuleTester.test.ts b/packages/rule-tester/tests/RuleTester.test.ts index 25b6aa0888ed..a9d248da2e94 100644 --- a/packages/rule-tester/tests/RuleTester.test.ts +++ b/packages/rule-tester/tests/RuleTester.test.ts @@ -119,7 +119,7 @@ beforeEach(() => { jest.clearAllMocks(); }); -const NOOP_RULE: RuleModule<'error', []> = { +const NOOP_RULE: RuleModule<'error'> = { meta: { messages: { error: 'error', diff --git a/packages/scope-manager/src/definition/CatchClauseDefinition.ts b/packages/scope-manager/src/definition/CatchClauseDefinition.ts index 10dccb9d25f7..4c930bdfb52c 100644 --- a/packages/scope-manager/src/definition/CatchClauseDefinition.ts +++ b/packages/scope-manager/src/definition/CatchClauseDefinition.ts @@ -6,8 +6,7 @@ import { DefinitionType } from './DefinitionType'; class CatchClauseDefinition extends DefinitionBase< DefinitionType.CatchClause, TSESTree.CatchClause, - null, - TSESTree.BindingName + null > { constructor(name: TSESTree.BindingName, node: CatchClauseDefinition['node']) { super(DefinitionType.CatchClause, name, node, null); diff --git a/packages/scope-manager/src/definition/ImplicitGlobalVariableDefinition.ts b/packages/scope-manager/src/definition/ImplicitGlobalVariableDefinition.ts index 35c2a5b7f7d1..3c460eb20bdd 100644 --- a/packages/scope-manager/src/definition/ImplicitGlobalVariableDefinition.ts +++ b/packages/scope-manager/src/definition/ImplicitGlobalVariableDefinition.ts @@ -6,8 +6,7 @@ import { DefinitionType } from './DefinitionType'; class ImplicitGlobalVariableDefinition extends DefinitionBase< DefinitionType.ImplicitGlobalVariable, TSESTree.Node, - null, - TSESTree.BindingName + null > { constructor( name: TSESTree.BindingName, diff --git a/packages/scope-manager/src/definition/ParameterDefinition.ts b/packages/scope-manager/src/definition/ParameterDefinition.ts index 631d2df663e3..70d4120b3a81 100644 --- a/packages/scope-manager/src/definition/ParameterDefinition.ts +++ b/packages/scope-manager/src/definition/ParameterDefinition.ts @@ -15,8 +15,7 @@ class ParameterDefinition extends DefinitionBase< | TSESTree.TSEmptyBodyFunctionExpression | TSESTree.TSFunctionType | TSESTree.TSMethodSignature, - null, - TSESTree.BindingName + null > { /** * Whether the parameter definition is a part of a rest parameter. diff --git a/packages/scope-manager/tests/util/getSpecificNode.ts b/packages/scope-manager/tests/util/getSpecificNode.ts index e9d23cf90c97..520d43bc7a86 100644 --- a/packages/scope-manager/tests/util/getSpecificNode.ts +++ b/packages/scope-manager/tests/util/getSpecificNode.ts @@ -1,17 +1,13 @@ import type { AST_NODE_TYPES, TSESTree } from '@typescript-eslint/types'; import { simpleTraverse } from '@typescript-eslint/typescript-estree'; -function getSpecificNode< - TSelector extends AST_NODE_TYPES, - TNode extends Extract, ->(ast: TSESTree.Node, selector: TSelector): TNode; function getSpecificNode< TSelector extends AST_NODE_TYPES, TNode extends Extract, >( ast: TSESTree.Node, selector: TSelector, - cb: (node: TNode) => boolean | null | undefined, + cb?: (node: TNode) => boolean | null | undefined, ): TNode; function getSpecificNode< TSelector extends AST_NODE_TYPES, diff --git a/packages/typescript-estree/src/convert.ts b/packages/typescript-estree/src/convert.ts index 7c1018f7a8a1..a13fa5c7a48c 100644 --- a/packages/typescript-estree/src/convert.ts +++ b/packages/typescript-estree/src/convert.ts @@ -190,7 +190,7 @@ export class Converter { const isType = result.type === AST_NODE_TYPES.TSInterfaceDeclaration || result.type === AST_NODE_TYPES.TSTypeAliasDeclaration; - const isDeclare = 'declare' in result && result.declare === true; + const isDeclare = 'declare' in result && result.declare; return this.createNode(node, { type: AST_NODE_TYPES.ExportNamedDeclaration, // @ts-expect-error - TODO, narrow the types here diff --git a/packages/typescript-estree/src/parseSettings/ExpiringCache.ts b/packages/typescript-estree/src/parseSettings/ExpiringCache.ts index e28506d1d9bd..6848a8596fb1 100644 --- a/packages/typescript-estree/src/parseSettings/ExpiringCache.ts +++ b/packages/typescript-estree/src/parseSettings/ExpiringCache.ts @@ -4,7 +4,7 @@ export const DEFAULT_TSCONFIG_CACHE_DURATION_SECONDS = 30; const ZERO_HR_TIME: [number, number] = [0, 0]; export interface CacheLike { - get(key: Key): Value | void; + get(key: Key): Value | undefined; set(key: Key, value: Value): this; } diff --git a/packages/typescript-estree/tests/lib/parse.test.ts b/packages/typescript-estree/tests/lib/parse.test.ts index 658493c9150c..1b39713f1557 100644 --- a/packages/typescript-estree/tests/lib/parse.test.ts +++ b/packages/typescript-estree/tests/lib/parse.test.ts @@ -362,7 +362,7 @@ describe('parseAndGenerateServices', () => { filePath: join(PROJECT_DIR, filePath), }); } catch (error) { - throw alignErrorPath(error as Error); + alignErrorPath(error as Error); } }; @@ -499,7 +499,7 @@ describe('parseAndGenerateServices', () => { filePath: join(PROJECT_DIR, filePath), }); } catch (error) { - throw alignErrorPath(error as Error); + alignErrorPath(error as Error); } }; diff --git a/packages/utils/src/eslint-utils/getParserServices.ts b/packages/utils/src/eslint-utils/getParserServices.ts index 4b65afe3cf66..6b4d50b88638 100644 --- a/packages/utils/src/eslint-utils/getParserServices.ts +++ b/packages/utils/src/eslint-utils/getParserServices.ts @@ -7,6 +7,7 @@ import type { const ERROR_MESSAGE = 'You have used a rule which requires parserServices to be generated. You must therefore provide a value for the "parserOptions.project" property for @typescript-eslint/parser.'; +/* eslint-disable @typescript-eslint/unified-signatures */ /** * Try to retrieve type-aware parser service from context. * This **_will_** throw if it is not available. @@ -83,5 +84,6 @@ function getParserServices( return context.parserServices; } +/* eslint-enable @typescript-eslint/unified-signatures */ export { getParserServices }; diff --git a/packages/utils/src/ts-eslint/SourceCode.ts b/packages/utils/src/ts-eslint/SourceCode.ts index 3d7f33dd93c2..fa186c78e97b 100644 --- a/packages/utils/src/ts-eslint/SourceCode.ts +++ b/packages/utils/src/ts-eslint/SourceCode.ts @@ -208,19 +208,7 @@ declare class TokenStore { getTokensBetween( left: TSESTree.Node | TSESTree.Token, right: TSESTree.Node | TSESTree.Token, - padding?: T, - ): SourceCode.ReturnTypeFromOptions[]; - /** - * Gets all of the tokens between two non-overlapping nodes. - * @param left Node before the desired token range. - * @param right Node after the desired token range. - * @param padding Number of extra tokens on either side of center. - * @returns Tokens between left and right. - */ - getTokensBetween( - left: TSESTree.Node | TSESTree.Token, - right: TSESTree.Node | TSESTree.Token, - padding?: number, + padding?: T | number, ): SourceCode.ReturnTypeFromOptions[]; } diff --git a/packages/website-eslint/src/mock/eslint.js b/packages/website-eslint/src/mock/eslint.js index bb112732ff67..fac5d44d93e6 100644 --- a/packages/website-eslint/src/mock/eslint.js +++ b/packages/website-eslint/src/mock/eslint.js @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-extraneous-class */ class RuleTester {} class SourceCode {} diff --git a/packages/website/plugins/generated-rule-docs.ts b/packages/website/plugins/generated-rule-docs.ts index 9f4d013d5455..317f33353d34 100644 --- a/packages/website/plugins/generated-rule-docs.ts +++ b/packages/website/plugins/generated-rule-docs.ts @@ -40,7 +40,7 @@ const eslintPluginDirectory = path.resolve( path.join(__dirname, '../../eslint-plugin'), ); -function nodeIsParent(node: unist.Node): node is unist.Parent { +function nodeIsParent(node: unist.Node): node is unist.Parent { return 'children' in node; } diff --git a/packages/website/src/hooks/useHistorySelector.ts b/packages/website/src/hooks/useHistorySelector.ts index 841c100b83b9..31745005ac11 100644 --- a/packages/website/src/hooks/useHistorySelector.ts +++ b/packages/website/src/hooks/useHistorySelector.ts @@ -2,7 +2,7 @@ import { useHistory } from '@docusaurus/router'; import type * as H from 'history'; import { useSyncExternalStore } from 'react'; -export type HistorySelector = (history: H.History) => T; +export type HistorySelector = (history: H.History) => T; export function useHistorySelector( selector: HistorySelector, From 590e8adfe102529e77ffaf97798875f84b4998ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josh=20Goldberg=20=E2=9C=A8?= Date: Thu, 27 Jul 2023 21:15:38 -0400 Subject: [PATCH 2/3] Update packages/eslint-plugin/src/util/getOperatorPrecedence.ts Co-authored-by: Brad Zacher --- packages/eslint-plugin/src/util/getOperatorPrecedence.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/eslint-plugin/src/util/getOperatorPrecedence.ts b/packages/eslint-plugin/src/util/getOperatorPrecedence.ts index 5626d66c03db..9865256a5f41 100644 --- a/packages/eslint-plugin/src/util/getOperatorPrecedence.ts +++ b/packages/eslint-plugin/src/util/getOperatorPrecedence.ts @@ -1,4 +1,4 @@ -/* eslint-disable @typescript-eslint/prefer-literal-enum-member */ +/* eslint-disable @typescript-eslint/prefer-literal-enum-member -- the enums come from TS so to make merging upstream easier we purposely avoid adding literal values. */ import type { TSESTree } from '@typescript-eslint/utils'; import { AST_NODE_TYPES } from '@typescript-eslint/utils'; import { SyntaxKind } from 'typescript'; From 8f050854690810f55001a2710a8142a317eeb84d Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Thu, 27 Jul 2023 21:28:09 -0400 Subject: [PATCH 3/3] Explicit DefinitionBase and other touchups --- .eslintrc.js | 6 ++++++ .../src/rules/naming-convention-utils/enums.ts | 3 ++- packages/eslint-plugin/tools/generate-configs.ts | 1 + .../src/definition/CatchClauseDefinition.ts | 3 ++- .../scope-manager/src/definition/DefinitionBase.ts | 2 +- .../definition/ImplicitGlobalVariableDefinition.ts | 3 ++- .../src/definition/ParameterDefinition.ts | 3 ++- .../tests/util/serializers/DefinitionBase.ts | 12 ++++++++++-- packages/utils/src/ts-eslint/SourceCode.ts | 8 ++++---- 9 files changed, 30 insertions(+), 11 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index a9e11b19255e..bb34d033c475 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -87,6 +87,12 @@ module.exports = { '@typescript-eslint/no-explicit-any': 'error', '@typescript-eslint/no-non-null-assertion': 'off', '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/prefer-literal-enum-member': [ + 'error', + { + allowBitwiseExpressions: true, + }, + ], '@typescript-eslint/unbound-method': 'off', '@typescript-eslint/restrict-template-expressions': [ 'error', diff --git a/packages/eslint-plugin/src/rules/naming-convention-utils/enums.ts b/packages/eslint-plugin/src/rules/naming-convention-utils/enums.ts index 43eaff51edea..7f0b7e69693c 100644 --- a/packages/eslint-plugin/src/rules/naming-convention-utils/enums.ts +++ b/packages/eslint-plugin/src/rules/naming-convention-utils/enums.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/prefer-literal-enum-member */ enum PredefinedFormats { camelCase = 1, strictCamelCase, @@ -48,6 +47,7 @@ enum Selectors { type SelectorsString = keyof typeof Selectors; enum MetaSelectors { + /* eslint-disable @typescript-eslint/prefer-literal-enum-member */ default = -1, variableLike = 0 | Selectors.variable | @@ -77,6 +77,7 @@ enum MetaSelectors { Selectors.classProperty | Selectors.objectLiteralProperty | Selectors.typeProperty, + /* eslint-enable @typescript-eslint/prefer-literal-enum-member */ } type MetaSelectorsString = keyof typeof MetaSelectors; type IndividualAndMetaSelectorsString = MetaSelectorsString | SelectorsString; diff --git a/packages/eslint-plugin/tools/generate-configs.ts b/packages/eslint-plugin/tools/generate-configs.ts index 1ada9e7105bc..e693dfa3f414 100644 --- a/packages/eslint-plugin/tools/generate-configs.ts +++ b/packages/eslint-plugin/tools/generate-configs.ts @@ -76,6 +76,7 @@ async function main(): Promise { ); const EXTENDS = ['./configs/base', './configs/eslint-recommended']; + // TODO: migrate to import { RuleModule } from '@typescript-eslint/utils/ts-eslint' type RuleEntry = [string, TSESLint.RuleModule]; const allRuleEntries: RuleEntry[] = Object.entries(rules).sort((a, b) => diff --git a/packages/scope-manager/src/definition/CatchClauseDefinition.ts b/packages/scope-manager/src/definition/CatchClauseDefinition.ts index 4c930bdfb52c..10dccb9d25f7 100644 --- a/packages/scope-manager/src/definition/CatchClauseDefinition.ts +++ b/packages/scope-manager/src/definition/CatchClauseDefinition.ts @@ -6,7 +6,8 @@ import { DefinitionType } from './DefinitionType'; class CatchClauseDefinition extends DefinitionBase< DefinitionType.CatchClause, TSESTree.CatchClause, - null + null, + TSESTree.BindingName > { constructor(name: TSESTree.BindingName, node: CatchClauseDefinition['node']) { super(DefinitionType.CatchClause, name, node, null); diff --git a/packages/scope-manager/src/definition/DefinitionBase.ts b/packages/scope-manager/src/definition/DefinitionBase.ts index 2418e5e8af48..01976f164eb0 100644 --- a/packages/scope-manager/src/definition/DefinitionBase.ts +++ b/packages/scope-manager/src/definition/DefinitionBase.ts @@ -9,7 +9,7 @@ abstract class DefinitionBase< TType extends DefinitionType, TNode extends TSESTree.Node, TParent extends TSESTree.Node | null, - TName extends TSESTree.Node = TSESTree.BindingName, + TName extends TSESTree.Node, > { /** * A unique ID for this instance - primarily used to help debugging and testing diff --git a/packages/scope-manager/src/definition/ImplicitGlobalVariableDefinition.ts b/packages/scope-manager/src/definition/ImplicitGlobalVariableDefinition.ts index 3c460eb20bdd..35c2a5b7f7d1 100644 --- a/packages/scope-manager/src/definition/ImplicitGlobalVariableDefinition.ts +++ b/packages/scope-manager/src/definition/ImplicitGlobalVariableDefinition.ts @@ -6,7 +6,8 @@ import { DefinitionType } from './DefinitionType'; class ImplicitGlobalVariableDefinition extends DefinitionBase< DefinitionType.ImplicitGlobalVariable, TSESTree.Node, - null + null, + TSESTree.BindingName > { constructor( name: TSESTree.BindingName, diff --git a/packages/scope-manager/src/definition/ParameterDefinition.ts b/packages/scope-manager/src/definition/ParameterDefinition.ts index 70d4120b3a81..631d2df663e3 100644 --- a/packages/scope-manager/src/definition/ParameterDefinition.ts +++ b/packages/scope-manager/src/definition/ParameterDefinition.ts @@ -15,7 +15,8 @@ class ParameterDefinition extends DefinitionBase< | TSESTree.TSEmptyBodyFunctionExpression | TSESTree.TSFunctionType | TSESTree.TSMethodSignature, - null + null, + TSESTree.BindingName > { /** * Whether the parameter definition is a part of a rest parameter. diff --git a/packages/scope-manager/tests/util/serializers/DefinitionBase.ts b/packages/scope-manager/tests/util/serializers/DefinitionBase.ts index 7402ee1cc68b..08f88fe750e0 100644 --- a/packages/scope-manager/tests/util/serializers/DefinitionBase.ts +++ b/packages/scope-manager/tests/util/serializers/DefinitionBase.ts @@ -1,9 +1,17 @@ +import type { TSESTree } from '@typescript-eslint/types'; + import { DefinitionBase } from '../../../src/definition/DefinitionBase'; import { createSerializer } from './baseSerializer'; // hacking around the fact that you can't use abstract classes generically -// eslint-disable-next-line @typescript-eslint/no-explicit-any -class DefinitionInstance extends DefinitionBase { +class DefinitionInstance extends DefinitionBase< + /* eslint-disable @typescript-eslint/no-explicit-any */ + any, + any, + any, + /* eslint-enable @typescript-eslint/no-explicit-any */ + TSESTree.BindingName +> { isTypeDefinition = false; isVariableDefinition = false; } diff --git a/packages/utils/src/ts-eslint/SourceCode.ts b/packages/utils/src/ts-eslint/SourceCode.ts index fa186c78e97b..0e921370211e 100644 --- a/packages/utils/src/ts-eslint/SourceCode.ts +++ b/packages/utils/src/ts-eslint/SourceCode.ts @@ -186,7 +186,7 @@ declare class TokenStore { */ getTokensAfter( node: TSESTree.Node | TSESTree.Token, - options?: T, + options?: T | number, ): SourceCode.ReturnTypeFromOptions[]; /** * Gets the `count` tokens that precedes a given node or token. @@ -196,19 +196,19 @@ declare class TokenStore { */ getTokensBefore( node: TSESTree.Node | TSESTree.Token, - options?: T, + options?: T | number, ): SourceCode.ReturnTypeFromOptions[]; /** * Gets all of the tokens between two non-overlapping nodes. * @param left Node before the desired token range. * @param right Node after the desired token range. - * @param options The option object. If this is a function then it's `options.filter`. + * @param options The option object. If this is a number then it's `options.count`. If this is a function then it's `options.filter`. * @returns Tokens between left and right. */ getTokensBetween( left: TSESTree.Node | TSESTree.Token, right: TSESTree.Node | TSESTree.Token, - padding?: T | number, + options?: T | number, ): SourceCode.ReturnTypeFromOptions[]; }