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[]; } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy