Skip to content

Commit 01ab399

Browse files
committed
[Refactor] add getMessageData util
1 parent cc9578c commit 01ab399

File tree

3 files changed

+53
-35
lines changed

3 files changed

+53
-35
lines changed

lib/rules/hook-use-state.js

+43-32
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
const Components = require('../util/Components');
99
const docsUrl = require('../util/docsUrl');
1010
const report = require('../util/report');
11+
const getMessageData = require('../util/message');
1112

1213
// ------------------------------------------------------------------------------
1314
// Rule Definition
@@ -20,6 +21,8 @@ function isNodeDestructuring(node) {
2021
const messages = {
2122
useStateErrorMessage: 'useState call is not destructured into value + setter pair',
2223
useStateErrorMessageOrAddOption: 'useState call is not destructured into value + setter pair (you can allow destructuring by enabling "allowDestructuredState" option)',
24+
suggestPair: 'Destructure useState call into value + setter pair',
25+
suggestMemo: 'Replace useState call with useMemo',
2326
};
2427

2528
module.exports = {
@@ -67,7 +70,10 @@ module.exports = {
6770
context,
6871
messages.useStateErrorMessage,
6972
'useStateErrorMessage',
70-
{ node }
73+
{
74+
node,
75+
suggest: false,
76+
}
7177
);
7278
return;
7379
}
@@ -104,21 +110,23 @@ module.exports = {
104110

105111
if (!isSymmetricGetterSetterPair) {
106112
const suggestions = [
107-
{
108-
desc: 'Destructure useState call into value + setter pair',
109-
fix: (fixer) => {
110-
if (expectedSetterVariableNames.length === 0) {
111-
return;
112-
}
113-
114-
const fix = fixer.replaceTextRange(
115-
node.parent.id.range,
116-
`[${valueVariableName}, ${expectedSetterVariableNames[0]}]`
117-
);
118-
119-
return fix;
120-
},
121-
},
113+
Object.assign(
114+
getMessageData('suggestPair', messages.suggestPair),
115+
{
116+
fix(fixer) {
117+
if (expectedSetterVariableNames.length === 0) {
118+
return;
119+
}
120+
121+
const fix = fixer.replaceTextRange(
122+
node.parent.id.range,
123+
`[${valueVariableName}, ${expectedSetterVariableNames[0]}]`
124+
);
125+
126+
return fix;
127+
},
128+
}
129+
),
122130
];
123131

124132
const defaultReactImports = components.getDefaultReactImports();
@@ -150,22 +158,24 @@ module.exports = {
150158
useMemoCode = 'useMemo';
151159
}
152160

153-
suggestions.unshift({
154-
desc: 'Replace useState call with useMemo',
155-
fix: (fixer) => [
156-
// Add useMemo import, if necessary
157-
useStateReactImportSpecifier
158-
&& (!useMemoReactImportSpecifier || defaultReactImportName)
159-
&& fixer.insertTextAfter(useStateReactImportSpecifier, ', useMemo'),
160-
// Convert single-value destructure to simple assignment
161-
fixer.replaceTextRange(node.parent.id.range, valueVariableName),
162-
// Convert useState call to useMemo + arrow function + dependency array
163-
fixer.replaceTextRange(
164-
node.range,
165-
`${useMemoCode}(() => ${context.getSourceCode().getText(node.arguments[0])}, [])`
166-
),
167-
].filter(Boolean),
168-
});
161+
suggestions.unshift(Object.assign(
162+
getMessageData('suggestMemo', messages.suggestMemo),
163+
{
164+
fix: (fixer) => [
165+
// Add useMemo import, if necessary
166+
useStateReactImportSpecifier
167+
&& (!useMemoReactImportSpecifier || defaultReactImportName)
168+
&& fixer.insertTextAfter(useStateReactImportSpecifier, ', useMemo'),
169+
// Convert single-value destructure to simple assignment
170+
fixer.replaceTextRange(node.parent.id.range, valueVariableName),
171+
// Convert useState call to useMemo + arrow function + dependency array
172+
fixer.replaceTextRange(
173+
node.range,
174+
`${useMemoCode}(() => ${context.getSourceCode().getText(node.arguments[0])}, [])`
175+
),
176+
].filter(Boolean),
177+
}
178+
));
169179
}
170180

171181
if (isOnlyValueDestructuring) {
@@ -175,6 +185,7 @@ module.exports = {
175185
'useStateErrorMessageOrAddOption',
176186
{
177187
node: node.parent.id,
188+
suggest: false,
178189
}
179190
);
180191
return;

lib/util/message.js

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
'use strict';
2+
3+
const semver = require('semver');
4+
const eslintPkg = require('eslint/package.json');
5+
6+
module.exports = function getMessageData(messageId, message) {
7+
return messageId && semver.satisfies(eslintPkg.version, '>= 4.15') ? { messageId } : { message };
8+
};

lib/util/report.js

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
'use strict';
22

3-
const semver = require('semver');
4-
const eslintPkg = require('eslint/package.json');
3+
const getMessageData = require('./message');
54

65
module.exports = function report(context, message, messageId, data) {
76
context.report(
87
Object.assign(
9-
messageId && semver.satisfies(eslintPkg.version, '>= 4.15') ? { messageId } : { message },
8+
getMessageData(messageId, message),
109
data
1110
)
1211
);

0 commit comments

Comments
 (0)