diff --git a/packages/eslint-plugin/src/rules/class-literal-property-style.ts b/packages/eslint-plugin/src/rules/class-literal-property-style.ts index ed49b144e478..d1eb4ae44703 100644 --- a/packages/eslint-plugin/src/rules/class-literal-property-style.ts +++ b/packages/eslint-plugin/src/rules/class-literal-property-style.ts @@ -1,10 +1,14 @@ -import type { TSESTree } from '@typescript-eslint/utils'; +import type { TSESLint, TSESTree } from '@typescript-eslint/utils'; import { AST_NODE_TYPES } from '@typescript-eslint/utils'; import * as util from '../util'; type Options = ['fields' | 'getters']; -type MessageIds = 'preferFieldStyle' | 'preferGetterStyle'; +type MessageIds = + | 'preferFieldStyle' + | 'preferFieldStyleSuggestion' + | 'preferGetterStyle' + | 'preferGetterStyleSuggestion'; interface NodeWithModifiers { accessibility?: TSESTree.Accessibility; @@ -45,10 +49,12 @@ export default util.createRule({ 'Enforce that literals on classes are exposed in a consistent style', recommended: 'strict', }, - fixable: 'code', + hasSuggestions: true, messages: { preferFieldStyle: 'Literals should be exposed using readonly fields.', + preferFieldStyleSuggestion: 'Replace the literals with readonly fields.', preferGetterStyle: 'Literals should be exposed using getters.', + preferGetterStyleSuggestion: 'Replace the literals with getters.', }, schema: [{ enum: ['fields', 'getters'] }], }, @@ -80,18 +86,23 @@ export default util.createRule({ context.report({ node: node.key, messageId: 'preferFieldStyle', - fix(fixer) { - const sourceCode = context.getSourceCode(); - const name = sourceCode.getText(node.key); - - let text = ''; - - text += printNodeModifiers(node, 'readonly'); - text += node.computed ? `[${name}]` : name; - text += ` = ${sourceCode.getText(argument)};`; - - return fixer.replaceText(node, text); - }, + suggest: [ + { + messageId: 'preferFieldStyleSuggestion', + fix(fixer): TSESLint.RuleFix { + const sourceCode = context.getSourceCode(); + const name = sourceCode.getText(node.key); + + let text = ''; + + text += printNodeModifiers(node, 'readonly'); + text += node.computed ? `[${name}]` : name; + text += ` = ${sourceCode.getText(argument)};`; + + return fixer.replaceText(node, text); + }, + }, + ], }); }, }), @@ -110,18 +121,23 @@ export default util.createRule({ context.report({ node: node.key, messageId: 'preferGetterStyle', - fix(fixer) { - const sourceCode = context.getSourceCode(); - const name = sourceCode.getText(node.key); - - let text = ''; - - text += printNodeModifiers(node, 'get'); - text += node.computed ? `[${name}]` : name; - text += `() { return ${sourceCode.getText(value)}; }`; - - return fixer.replaceText(node, text); - }, + suggest: [ + { + messageId: 'preferGetterStyleSuggestion', + fix(fixer): TSESLint.RuleFix { + const sourceCode = context.getSourceCode(); + const name = sourceCode.getText(node.key); + + let text = ''; + + text += printNodeModifiers(node, 'get'); + text += node.computed ? `[${name}]` : name; + text += `() { return ${sourceCode.getText(value)}; }`; + + return fixer.replaceText(node, text); + }, + }, + ], }); }, }), diff --git a/packages/eslint-plugin/tests/rules/class-literal-property-style.test.ts b/packages/eslint-plugin/tests/rules/class-literal-property-style.test.ts index af0aa203df7d..a0715bc24d2f 100644 --- a/packages/eslint-plugin/tests/rules/class-literal-property-style.test.ts +++ b/packages/eslint-plugin/tests/rules/class-literal-property-style.test.ts @@ -185,11 +185,6 @@ class Mx { get p1() { return 'hello world'; } -} - `, - output: ` -class Mx { - readonly p1 = 'hello world'; } `, errors: [ @@ -197,6 +192,16 @@ class Mx { messageId: 'preferFieldStyle', column: 7, line: 3, + suggestions: [ + { + messageId: 'preferFieldStyleSuggestion', + output: ` +class Mx { + readonly p1 = 'hello world'; +} + `, + }, + ], }, ], }, @@ -206,11 +211,6 @@ class Mx { get p1() { return \`hello world\`; } -} - `, - output: ` -class Mx { - readonly p1 = \`hello world\`; } `, errors: [ @@ -218,6 +218,16 @@ class Mx { messageId: 'preferFieldStyle', column: 7, line: 3, + suggestions: [ + { + messageId: 'preferFieldStyleSuggestion', + output: ` +class Mx { + readonly p1 = \`hello world\`; +} + `, + }, + ], }, ], }, @@ -227,11 +237,6 @@ class Mx { static get p1() { return 'hello world'; } -} - `, - output: ` -class Mx { - static readonly p1 = 'hello world'; } `, errors: [ @@ -239,6 +244,16 @@ class Mx { messageId: 'preferFieldStyle', column: 14, line: 3, + suggestions: [ + { + messageId: 'preferFieldStyleSuggestion', + output: ` +class Mx { + static readonly p1 = 'hello world'; +} + `, + }, + ], }, ], }, @@ -248,11 +263,6 @@ class Mx { public static get foo() { return 1; } -} - `, - output: ` -class Mx { - public static readonly foo = 1; } `, errors: [ @@ -260,6 +270,16 @@ class Mx { messageId: 'preferFieldStyle', column: 21, line: 3, + suggestions: [ + { + messageId: 'preferFieldStyleSuggestion', + output: ` +class Mx { + public static readonly foo = 1; +} + `, + }, + ], }, ], }, @@ -269,11 +289,6 @@ class Mx { public get [myValue]() { return 'a literal value'; } -} - `, - output: ` -class Mx { - public readonly [myValue] = 'a literal value'; } `, errors: [ @@ -281,6 +296,16 @@ class Mx { messageId: 'preferFieldStyle', column: 15, line: 3, + suggestions: [ + { + messageId: 'preferFieldStyleSuggestion', + output: ` +class Mx { + public readonly [myValue] = 'a literal value'; +} + `, + }, + ], }, ], }, @@ -290,11 +315,6 @@ class Mx { public get [myValue]() { return 12345n; } -} - `, - output: ` -class Mx { - public readonly [myValue] = 12345n; } `, errors: [ @@ -302,6 +322,16 @@ class Mx { messageId: 'preferFieldStyle', column: 15, line: 3, + suggestions: [ + { + messageId: 'preferFieldStyleSuggestion', + output: ` +class Mx { + public readonly [myValue] = 12345n; +} + `, + }, + ], }, ], }, @@ -309,11 +339,6 @@ class Mx { code: ` class Mx { public readonly [myValue] = 'a literal value'; -} - `, - output: ` -class Mx { - public get [myValue]() { return 'a literal value'; } } `, errors: [ @@ -321,6 +346,16 @@ class Mx { messageId: 'preferGetterStyle', column: 20, line: 3, + suggestions: [ + { + messageId: 'preferGetterStyleSuggestion', + output: ` +class Mx { + public get [myValue]() { return 'a literal value'; } +} + `, + }, + ], }, ], options: ['getters'], @@ -329,11 +364,6 @@ class Mx { code: ` class Mx { readonly p1 = 'hello world'; -} - `, - output: ` -class Mx { - get p1() { return 'hello world'; } } `, errors: [ @@ -341,6 +371,16 @@ class Mx { messageId: 'preferGetterStyle', column: 12, line: 3, + suggestions: [ + { + messageId: 'preferGetterStyleSuggestion', + output: ` +class Mx { + get p1() { return 'hello world'; } +} + `, + }, + ], }, ], options: ['getters'], @@ -349,11 +389,6 @@ class Mx { code: ` class Mx { readonly p1 = \`hello world\`; -} - `, - output: ` -class Mx { - get p1() { return \`hello world\`; } } `, errors: [ @@ -361,6 +396,16 @@ class Mx { messageId: 'preferGetterStyle', column: 12, line: 3, + suggestions: [ + { + messageId: 'preferGetterStyleSuggestion', + output: ` +class Mx { + get p1() { return \`hello world\`; } +} + `, + }, + ], }, ], options: ['getters'], @@ -369,11 +414,6 @@ class Mx { code: ` class Mx { static readonly p1 = 'hello world'; -} - `, - output: ` -class Mx { - static get p1() { return 'hello world'; } } `, errors: [ @@ -381,6 +421,16 @@ class Mx { messageId: 'preferGetterStyle', column: 19, line: 3, + suggestions: [ + { + messageId: 'preferGetterStyleSuggestion', + output: ` +class Mx { + static get p1() { return 'hello world'; } +} + `, + }, + ], }, ], options: ['getters'], @@ -391,11 +441,6 @@ class Mx { protected get p1() { return 'hello world'; } -} - `, - output: ` -class Mx { - protected readonly p1 = 'hello world'; } `, errors: [ @@ -403,6 +448,16 @@ class Mx { messageId: 'preferFieldStyle', column: 17, line: 3, + suggestions: [ + { + messageId: 'preferFieldStyleSuggestion', + output: ` +class Mx { + protected readonly p1 = 'hello world'; +} + `, + }, + ], }, ], options: ['fields'], @@ -411,11 +466,6 @@ class Mx { code: ` class Mx { protected readonly p1 = 'hello world'; -} - `, - output: ` -class Mx { - protected get p1() { return 'hello world'; } } `, errors: [ @@ -423,6 +473,16 @@ class Mx { messageId: 'preferGetterStyle', column: 22, line: 3, + suggestions: [ + { + messageId: 'preferGetterStyleSuggestion', + output: ` +class Mx { + protected get p1() { return 'hello world'; } +} + `, + }, + ], }, ], options: ['getters'], @@ -433,11 +493,6 @@ class Mx { public static get p1() { return 'hello world'; } -} - `, - output: ` -class Mx { - public static readonly p1 = 'hello world'; } `, errors: [ @@ -445,6 +500,16 @@ class Mx { messageId: 'preferFieldStyle', column: 21, line: 3, + suggestions: [ + { + messageId: 'preferFieldStyleSuggestion', + output: ` +class Mx { + public static readonly p1 = 'hello world'; +} + `, + }, + ], }, ], }, @@ -452,11 +517,6 @@ class Mx { code: ` class Mx { public static readonly p1 = 'hello world'; -} - `, - output: ` -class Mx { - public static get p1() { return 'hello world'; } } `, errors: [ @@ -464,6 +524,16 @@ class Mx { messageId: 'preferGetterStyle', column: 26, line: 3, + suggestions: [ + { + messageId: 'preferGetterStyleSuggestion', + output: ` +class Mx { + public static get p1() { return 'hello world'; } +} + `, + }, + ], }, ], options: ['getters'], @@ -483,7 +553,15 @@ class Mx { } } `, - output: ` + errors: [ + { + messageId: 'preferFieldStyle', + column: 14, + line: 3, + suggestions: [ + { + messageId: 'preferFieldStyleSuggestion', + output: ` class Mx { public readonly myValue = gql\` { @@ -495,11 +573,8 @@ class Mx { \`; } `, - errors: [ - { - messageId: 'preferFieldStyle', - column: 14, - line: 3, + }, + ], }, ], }, @@ -516,7 +591,15 @@ class Mx { \`; } `, - output: ` + errors: [ + { + messageId: 'preferGetterStyle', + column: 19, + line: 3, + suggestions: [ + { + messageId: 'preferGetterStyleSuggestion', + output: ` class Mx { public get myValue() { return gql\` { @@ -528,11 +611,8 @@ class Mx { \`; } } `, - errors: [ - { - messageId: 'preferGetterStyle', - column: 19, - line: 3, + }, + ], }, ], options: ['getters'], 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