From c182269891de889bdf42055122d90b7922ed2d33 Mon Sep 17 00:00:00 2001 From: Rafael Santana Date: Tue, 21 Sep 2021 12:26:57 -0300 Subject: [PATCH 1/5] fix(experimental-utils): support immutable members --- .../src/rules/no-magic-numbers.ts | 49 +++++++++---------- .../experimental-utils/src/ts-eslint/Rule.ts | 18 +++---- 2 files changed, 33 insertions(+), 34 deletions(-) diff --git a/packages/eslint-plugin/src/rules/no-magic-numbers.ts b/packages/eslint-plugin/src/rules/no-magic-numbers.ts index e63c80686c3..69597c242e4 100644 --- a/packages/eslint-plugin/src/rules/no-magic-numbers.ts +++ b/packages/eslint-plugin/src/rules/no-magic-numbers.ts @@ -1,18 +1,32 @@ import { - TSESTree, AST_NODE_TYPES, + TSESTree, } from '@typescript-eslint/experimental-utils'; -import { getESLintCoreRule } from '../util/getESLintCoreRule'; import * as util from '../util'; +import { getESLintCoreRule } from '../util/getESLintCoreRule'; const baseRule = getESLintCoreRule('no-magic-numbers'); type Options = util.InferOptionsTypeFromRule; type MessageIds = util.InferMessageIdsTypeFromRule; -const baseRuleSchema = Array.isArray(baseRule.meta.schema) - ? baseRule.meta.schema[0] - : baseRule.meta.schema; +// Extend base schema with additional property to ignore TS numeric literal types +const schema = util.deepMerge( + { ...baseRule.meta.schema }, + { + properties: { + ignoreNumericLiteralTypes: { + type: 'boolean', + }, + ignoreEnums: { + type: 'boolean', + }, + ignoreReadonlyClassProperties: { + type: 'boolean', + }, + }, + }, +); export default util.createRule({ name: 'no-magic-numbers', @@ -23,26 +37,11 @@ export default util.createRule({ recommended: false, extendsBaseRule: true, }, - hasSuggestions: baseRule.meta.hasSuggestions, - // Extend base schema with additional property to ignore TS numeric literal types - schema: [ - { - ...baseRuleSchema, - properties: { - ...baseRuleSchema.properties, - ignoreNumericLiteralTypes: { - type: 'boolean', - }, - ignoreEnums: { - type: 'boolean', - }, - ignoreReadonlyClassProperties: { - type: 'boolean', - }, - }, - }, - ], - messages: baseRule.meta.messages, + schema: [schema], + messages: baseRule.meta.messages ?? { + useConst: "Number constants declarations must use 'const'.", + noMagic: 'No magic number: {{raw}}.', + }, }, defaultOptions: [ { diff --git a/packages/experimental-utils/src/ts-eslint/Rule.ts b/packages/experimental-utils/src/ts-eslint/Rule.ts index 7750d35dc68..715c5ed4b12 100644 --- a/packages/experimental-utils/src/ts-eslint/Rule.ts +++ b/packages/experimental-utils/src/ts-eslint/Rule.ts @@ -69,15 +69,15 @@ interface RuleMetaData { /** * The name of the rule this rule was replaced by, if it was deprecated. */ - replacedBy?: string[]; + replacedBy?: readonly string[]; /** * The options schema. Supply an empty array if there are no options. */ - schema: JSONSchema4 | JSONSchema4[]; + schema: JSONSchema4 | readonly JSONSchema4[]; } interface RuleFix { - range: AST.Range; + range: Readonly; text: string; } @@ -87,25 +87,25 @@ interface RuleFixer { text: string, ): RuleFix; - insertTextAfterRange(range: AST.Range, text: string): RuleFix; + insertTextAfterRange(range: Readonly, text: string): RuleFix; insertTextBefore( nodeOrToken: TSESTree.Node | TSESTree.Token, text: string, ): RuleFix; - insertTextBeforeRange(range: AST.Range, text: string): RuleFix; + insertTextBeforeRange(range: Readonly, text: string): RuleFix; remove(nodeOrToken: TSESTree.Node | TSESTree.Token): RuleFix; - removeRange(range: AST.Range): RuleFix; + removeRange(range: Readonly): RuleFix; replaceText( nodeOrToken: TSESTree.Node | TSESTree.Token, text: string, ): RuleFix; - replaceTextRange(range: AST.Range, text: string): RuleFix; + replaceTextRange(range: Readonly, text: string): RuleFix; } interface SuggestionReportDescriptor @@ -210,13 +210,13 @@ interface RuleContext< * the root of the AST and continuing through the direct parent of the current node. * This array does not include the currently-traversed node itself. */ - getAncestors(): TSESTree.Node[]; + getAncestors(): readonly TSESTree.Node[]; /** * Returns a list of variables declared by the given node. * This information can be used to track references to variables. */ - getDeclaredVariables(node: TSESTree.Node): Scope.Variable[]; + getDeclaredVariables(node: TSESTree.Node): readonly Scope.Variable[]; /** * Returns the current working directory passed to Linter. From ec18cedb4d16bad355a9df6041e5e346e60fc438 Mon Sep 17 00:00:00 2001 From: Rafael Santana Date: Mon, 4 Oct 2021 00:20:46 -0300 Subject: [PATCH 2/5] refactor: drop modifier from `getAncestors` --- packages/experimental-utils/src/ts-eslint/Rule.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/experimental-utils/src/ts-eslint/Rule.ts b/packages/experimental-utils/src/ts-eslint/Rule.ts index 715c5ed4b12..860f3779e45 100644 --- a/packages/experimental-utils/src/ts-eslint/Rule.ts +++ b/packages/experimental-utils/src/ts-eslint/Rule.ts @@ -210,7 +210,7 @@ interface RuleContext< * the root of the AST and continuing through the direct parent of the current node. * This array does not include the currently-traversed node itself. */ - getAncestors(): readonly TSESTree.Node[]; + getAncestors(): TSESTree.Node[]; /** * Returns a list of variables declared by the given node. From ee29109bcba810c4349526dda22003db9820dbcd Mon Sep 17 00:00:00 2001 From: Rafael Santana Date: Tue, 12 Oct 2021 18:37:23 -0300 Subject: [PATCH 3/5] build: merge with v5 --- packages/eslint-plugin/src/rules/no-magic-numbers.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/eslint-plugin/src/rules/no-magic-numbers.ts b/packages/eslint-plugin/src/rules/no-magic-numbers.ts index 69597c242e4..d989ac0eec1 100644 --- a/packages/eslint-plugin/src/rules/no-magic-numbers.ts +++ b/packages/eslint-plugin/src/rules/no-magic-numbers.ts @@ -38,10 +38,7 @@ export default util.createRule({ extendsBaseRule: true, }, schema: [schema], - messages: baseRule.meta.messages ?? { - useConst: "Number constants declarations must use 'const'.", - noMagic: 'No magic number: {{raw}}.', - }, + messages: baseRule.meta.messages, }, defaultOptions: [ { From 02b1fbd14556cd25289e6d83c997e1cb0b554645 Mon Sep 17 00:00:00 2001 From: Rafael Santana Date: Tue, 12 Oct 2021 18:41:27 -0300 Subject: [PATCH 4/5] refactor: accept `readonly` on `suggestions` --- packages/experimental-utils/src/ts-eslint/RuleTester.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/experimental-utils/src/ts-eslint/RuleTester.ts b/packages/experimental-utils/src/ts-eslint/RuleTester.ts index 9a255b24207..65184298969 100644 --- a/packages/experimental-utils/src/ts-eslint/RuleTester.ts +++ b/packages/experimental-utils/src/ts-eslint/RuleTester.ts @@ -1,7 +1,7 @@ import { RuleTester as ESLintRuleTester } from 'eslint'; import { AST_NODE_TYPES, AST_TOKEN_TYPES } from '../ts-estree'; -import { ParserOptions } from './ParserOptions'; import { Linter } from './Linter'; +import { ParserOptions } from './ParserOptions'; import { RuleCreateFunction, RuleModule, @@ -108,7 +108,7 @@ interface TestCaseError { /** * Reported suggestions. */ - readonly suggestions?: SuggestionOutput[] | null; + readonly suggestions?: readonly SuggestionOutput[] | null; /** * The type of the reported AST node. */ From 06066730791d79c11276a9fbaa448069adeb8a9e Mon Sep 17 00:00:00 2001 From: Brad Zacher Date: Tue, 14 Dec 2021 23:19:16 -0800 Subject: [PATCH 5/5] suppress lint --- packages/eslint-plugin/src/rules/no-empty-function.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/eslint-plugin/src/rules/no-empty-function.ts b/packages/eslint-plugin/src/rules/no-empty-function.ts index 06c04cb4eca..51ec13e3ff0 100644 --- a/packages/eslint-plugin/src/rules/no-empty-function.ts +++ b/packages/eslint-plugin/src/rules/no-empty-function.ts @@ -11,6 +11,7 @@ type Options = util.InferOptionsTypeFromRule; type MessageIds = util.InferMessageIdsTypeFromRule; const schema = util.deepMerge( + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument -- https://github.com/microsoft/TypeScript/issues/17002 Array.isArray(baseRule.meta.schema) ? baseRule.meta.schema[0] : baseRule.meta.schema,