diff --git a/.eslintrc.js b/.eslintrc.js index 0cbb0a0772cb..ac2e363f4e13 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,7 +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 @@ -85,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/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 59b223912c3b..e72079c064b8 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 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 b92928b86477..7b96072291d9 100644 --- a/packages/eslint-plugin/src/rules/naming-convention-utils/enums.ts +++ b/packages/eslint-plugin/src/rules/naming-convention-utils/enums.ts @@ -50,6 +50,7 @@ enum Selectors { type SelectorsString = keyof typeof Selectors; enum MetaSelectors { + /* eslint-disable @typescript-eslint/prefer-literal-enum-member */ default = -1, variableLike = 0 | Selectors.variable | @@ -79,6 +80,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/src/rules/naming-convention-utils/parse-options.ts b/packages/eslint-plugin/src/rules/naming-convention-utils/parse-options.ts index 885c25a8035f..557393268f9b 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 = 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 363b393e9d27..f7189d6dacb1 100644 --- a/packages/eslint-plugin/src/rules/no-empty-function.ts +++ b/packages/eslint-plugin/src/rules/no-empty-function.ts @@ -155,7 +155,7 @@ export default 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 516225271956..d99b10051797 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 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 44d540cd44ea..ce241f321a39 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 createRule({ diff --git a/packages/eslint-plugin/src/rules/no-redeclare.ts b/packages/eslint-plugin/src/rules/no-redeclare.ts index 296dc4a6d14f..9b404e6d8424 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 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 dbc86e930cde..9e2359e8b9f1 100644 --- a/packages/eslint-plugin/src/rules/no-shadow.ts +++ b/packages/eslint-plugin/src/rules/no-shadow.ts @@ -284,7 +284,7 @@ export default 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 819959b781d7..c16a4904756b 100644 --- a/packages/eslint-plugin/src/rules/no-unsafe-assignment.ts +++ b/packages/eslint-plugin/src/rules/no-unsafe-assignment.ts @@ -186,7 +186,7 @@ export default 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 b899e1f8cc99..3d3152f436f5 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 -- 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'; diff --git a/packages/eslint-plugin/tools/generate-configs.ts b/packages/eslint-plugin/tools/generate-configs.ts index fdd536d47179..ccce38829ef3 100644 --- a/packages/eslint-plugin/tools/generate-configs.ts +++ b/packages/eslint-plugin/tools/generate-configs.ts @@ -74,10 +74,8 @@ async function main(): Promise { ); const EXTENDS = ['./configs/base', './configs/eslint-recommended']; - type RuleEntry = [ - string, - TSESLint.RuleModule, - ]; + // 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) => a[0].localeCompare(b[0]), diff --git a/packages/rule-tester/src/RuleTester.ts b/packages/rule-tester/src/RuleTester.ts index 0aab722a4502..85bd223d8609 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 07ad0f31f8ab..ad03048a767a 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/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/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/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/typescript-estree/src/convert.ts b/packages/typescript-estree/src/convert.ts index a6e35dd4bcc2..eb4e7c39ea18 100644 --- a/packages/typescript-estree/src/convert.ts +++ b/packages/typescript-estree/src/convert.ts @@ -198,7 +198,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 49b564e061b9..344942747917 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/json-schema.ts b/packages/utils/src/json-schema.ts index 51ae016ca453..a3b2e5fdeceb 100644 --- a/packages/utils/src/json-schema.ts +++ b/packages/utils/src/json-schema.ts @@ -33,7 +33,6 @@ export type JSONSchema4TypeExtended = | JSONSchema4Object; // Workaround for infinite type recursion -// eslint-disable-next-line @typescript-eslint/consistent-indexed-object-style export interface JSONSchema4Object { [key: string]: JSONSchema4TypeExtended; } diff --git a/packages/utils/src/ts-eslint/SourceCode.ts b/packages/utils/src/ts-eslint/SourceCode.ts index 7e8352b13d9d..03b9c9dd2896 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,31 +196,19 @@ declare class TokenStore { */ getTokensBefore( node: TSESTree.Node | TSESTree.Token, - options?: 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 options The option object. 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, + 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 padding Number of extra tokens on either side of center. + * @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?: number, + options?: 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 207b11720bff..8d1cc8b56347 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,