Skip to content

Commit f24c353

Browse files
acdvsljharb
authored andcommitted
[Fix] move error messages to meta property
1 parent 05d35ad commit f24c353

File tree

166 files changed

+6045
-3120
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

166 files changed

+6045
-3120
lines changed

lib/rules/boolean-prop-naming.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ const propWrapperUtil = require('../util/propWrapper');
1414
// Rule Definition
1515
// ------------------------------------------------------------------------------
1616

17+
// Predefine message for use in context.report conditional.
18+
// messageId will still be usable in tests.
19+
const PATTERN_MISMATCH_MSG = 'Prop name ({{propName}}) doesn\'t match rule ({{pattern}})';
20+
1721
module.exports = {
1822
meta: {
1923
docs: {
@@ -23,6 +27,10 @@ module.exports = {
2327
url: docsUrl('boolean-prop-naming')
2428
},
2529

30+
messages: {
31+
patternMismatch: PATTERN_MISMATCH_MSG
32+
},
33+
2634
schema: [{
2735
additionalProperties: false,
2836
properties: {
@@ -193,15 +201,14 @@ module.exports = {
193201
function reportInvalidNaming(component) {
194202
component.invalidProps.forEach((propNode) => {
195203
const propName = getPropName(propNode);
196-
context.report({
204+
context.report(Object.assign({
197205
node: propNode,
198-
message: config.message || 'Prop name ({{ propName }}) doesn\'t match rule ({{ pattern }})',
199206
data: {
200207
component: propName,
201208
propName,
202209
pattern: config.rule
203210
}
204-
});
211+
}, config.message ? {message: config.message} : {messageId: 'patternMismatch'}));
205212
});
206213
}
207214

lib/rules/button-has-type.js

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,14 @@ module.exports = {
4242
recommended: false,
4343
url: docsUrl('button-has-type')
4444
},
45+
46+
messages: {
47+
missingType: 'Missing an explicit type attribute for button',
48+
complexType: 'The button type attribute must be specified by a static string or a trivial ternary expression',
49+
invalidValue: '"{{value}}" is an invalid value for button type attribute',
50+
forbiddenValue: '"{{value}}" is an invalid value for button type attribute'
51+
},
52+
4553
schema: [{
4654
type: 'object',
4755
properties: {
@@ -68,28 +76,33 @@ module.exports = {
6876
function reportMissing(node) {
6977
context.report({
7078
node,
71-
message: 'Missing an explicit type attribute for button'
79+
messageId: 'missingType'
7280
});
7381
}
7482

7583
function reportComplex(node) {
7684
context.report({
7785
node,
78-
message: 'The button type attribute must be specified by a static string or a trivial ternary expression'
86+
messageId: 'complexType'
7987
});
8088
}
8189

8290
function checkValue(node, value) {
83-
const q = (x) => `"${x}"`;
8491
if (!(value in configuration)) {
8592
context.report({
8693
node,
87-
message: `${q(value)} is an invalid value for button type attribute`
94+
messageId: 'invalidValue',
95+
data: {
96+
value
97+
}
8898
});
8999
} else if (!configuration[value]) {
90100
context.report({
91101
node,
92-
message: `${q(value)} is a forbidden value for button type attribute`
102+
messageId: 'forbiddenValue',
103+
data: {
104+
value
105+
}
93106
});
94107
}
95108
}

lib/rules/default-props-match-prop-types.js

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ module.exports = {
2121
url: docsUrl('default-props-match-prop-types')
2222
},
2323

24+
messages: {
25+
requiredHasDefault: 'defaultProp "{{name}}" defined for isRequired propType.',
26+
defaultHasNoType: 'defaultProp "{{name}}" has no corresponding propTypes declaration.'
27+
},
28+
2429
schema: [{
2530
type: 'object',
2631
properties: {
@@ -62,14 +67,18 @@ module.exports = {
6267
if (prop) {
6368
context.report({
6469
node: defaultProp.node,
65-
message: 'defaultProp "{{name}}" defined for isRequired propType.',
66-
data: {name: defaultPropName}
70+
messageId: 'requiredHasDefault',
71+
data: {
72+
name: defaultPropName
73+
}
6774
});
6875
} else {
6976
context.report({
7077
node: defaultProp.node,
71-
message: 'defaultProp "{{name}}" has no corresponding propTypes declaration.',
72-
data: {name: defaultPropName}
78+
messageId: 'defaultHasNoType',
79+
data: {
80+
name: defaultPropName
81+
}
7382
});
7483
}
7584
});

lib/rules/destructuring-assignment.js

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@ module.exports = {
1818
recommended: false,
1919
url: docsUrl('destructuring-assignment')
2020
},
21+
22+
messages: {
23+
noDestructPropsInSFCArg: 'Must never use destructuring props assignment in SFC argument',
24+
noDestructContextInSFCArg: 'Must never use destructuring context assignment in SFC argument',
25+
noDestructAssignment: 'Must never use destructuring {{type}} assignment',
26+
useDestructAssignment: 'Must use destructuring {{type}} assignment'
27+
},
28+
2129
schema: [{
2230
type: 'string',
2331
enum: [
@@ -50,12 +58,12 @@ module.exports = {
5058
if (destructuringProps && components.get(node) && configuration === 'never') {
5159
context.report({
5260
node,
53-
message: 'Must never use destructuring props assignment in SFC argument'
61+
messageId: 'noDestructPropsInSFCArg'
5462
});
5563
} else if (destructuringContext && components.get(node) && configuration === 'never') {
5664
context.report({
5765
node,
58-
message: 'Must never use destructuring context assignment in SFC argument'
66+
messageId: 'noDestructContextInSFCArg'
5967
});
6068
}
6169
}
@@ -66,7 +74,10 @@ module.exports = {
6674
if (isPropUsed && configuration === 'always') {
6775
context.report({
6876
node,
69-
message: `Must use destructuring ${node.object.name} assignment`
77+
messageId: 'useDestructAssignment',
78+
data: {
79+
type: node.object.name
80+
}
7081
});
7182
}
7283
}
@@ -96,7 +107,10 @@ module.exports = {
96107
) {
97108
context.report({
98109
node,
99-
message: `Must use destructuring ${node.object.property.name} assignment`
110+
messageId: 'useDestructAssignment',
111+
data: {
112+
type: node.object.property.name
113+
}
100114
});
101115
}
102116
}
@@ -135,7 +149,10 @@ module.exports = {
135149
if (SFCComponent && destructuringSFC && configuration === 'never') {
136150
context.report({
137151
node,
138-
message: `Must never use destructuring ${node.init.name} assignment`
152+
messageId: 'noDestructAssignment',
153+
data: {
154+
type: node.init.name
155+
}
139156
});
140157
}
141158

@@ -145,7 +162,10 @@ module.exports = {
145162
) {
146163
context.report({
147164
node,
148-
message: `Must never use destructuring ${node.init.property.name} assignment`
165+
messageId: 'noDestructAssignment',
166+
data: {
167+
type: node.init.property.name
168+
}
149169
});
150170
}
151171
}

lib/rules/display-name.js

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ module.exports = {
2323
url: docsUrl('display-name')
2424
},
2525

26+
messages: {
27+
noDisplayName: 'Component definition is missing display name'
28+
},
29+
2630
schema: [{
2731
type: 'object',
2832
properties: {
@@ -38,8 +42,6 @@ module.exports = {
3842
const config = context.options[0] || {};
3943
const ignoreTranspilerName = config.ignoreTranspilerName || false;
4044

41-
const MISSING_MESSAGE = 'Component definition is missing display name';
42-
4345
/**
4446
* Mark a prop type as declared
4547
* @param {ASTNode} node The AST node being checked.
@@ -57,10 +59,7 @@ module.exports = {
5759
function reportMissingDisplayName(component) {
5860
context.report({
5961
node: component.node,
60-
message: MISSING_MESSAGE,
61-
data: {
62-
component: component.name
63-
}
62+
messageId: 'noDisplayName'
6463
});
6564
}
6665

lib/rules/forbid-component-props.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ module.exports = {
2626
url: docsUrl('forbid-component-props')
2727
},
2828

29+
messages: {
30+
propIsForbidden: 'Prop "{{prop}}" is forbidden on Components'
31+
},
32+
2933
schema: [{
3034
type: 'object',
3135
properties: {
@@ -94,12 +98,13 @@ module.exports = {
9498
}
9599

96100
const customMessage = forbid.get(prop).message;
97-
const errorMessage = customMessage || `Prop \`${prop}\` is forbidden on Components`;
98101

99-
context.report({
102+
context.report(Object.assign({
100103
node,
101-
message: errorMessage
102-
});
104+
data: {
105+
prop
106+
}
107+
}, customMessage ? {message: customMessage} : {messageId: 'propIsForbidden'}));
103108
}
104109
};
105110
}

lib/rules/forbid-dom-props.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ module.exports = {
2626
url: docsUrl('forbid-dom-props')
2727
},
2828

29+
messages: {
30+
propIsForbidden: 'Prop "{{prop}}" is forbidden on DOM Nodes'
31+
},
32+
2933
schema: [{
3034
type: 'object',
3135
properties: {
@@ -83,12 +87,13 @@ module.exports = {
8387
}
8488

8589
const customMessage = forbid.get(prop).message;
86-
const errorMessage = customMessage || `Prop \`${prop}\` is forbidden on DOM Nodes`;
8790

88-
context.report({
91+
context.report(Object.assign({
8992
node,
90-
message: errorMessage
91-
});
93+
data: {
94+
prop
95+
}
96+
}, customMessage ? {message: customMessage} : {messageId: 'propIsForbidden'}));
9297
}
9398
};
9499
}

lib/rules/forbid-elements.js

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ module.exports = {
2121
url: docsUrl('forbid-elements')
2222
},
2323

24+
messages: {
25+
forbiddenElement: '<{{element}}> is forbidden',
26+
forbiddenElement_message: '<{{element}}> is forbidden, {{message}}'
27+
},
28+
2429
schema: [{
2530
type: 'object',
2631
properties: {
@@ -60,17 +65,6 @@ module.exports = {
6065
}
6166
});
6267

63-
function errorMessageForElement(name) {
64-
const message = `<${name}> is forbidden`;
65-
const additionalMessage = indexedForbidConfigs[name].message;
66-
67-
if (additionalMessage) {
68-
return `${message}, ${additionalMessage}`;
69-
}
70-
71-
return message;
72-
}
73-
7468
function isValidCreateElement(node) {
7569
return node.callee
7670
&& node.callee.type === 'MemberExpression'
@@ -81,9 +75,15 @@ module.exports = {
8175

8276
function reportIfForbidden(element, node) {
8377
if (has(indexedForbidConfigs, element)) {
78+
const message = indexedForbidConfigs[element].message;
79+
8480
context.report({
8581
node,
86-
message: errorMessageForElement(element)
82+
messageId: message ? 'forbiddenElement_message' : 'forbiddenElement',
83+
data: {
84+
element,
85+
message
86+
}
8787
});
8888
}
8989
}

lib/rules/forbid-foreign-prop-types.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ module.exports = {
1717
url: docsUrl('forbid-foreign-prop-types')
1818
},
1919

20+
messages: {
21+
forbiddenPropType: 'Using propTypes from another component is not safe because they may be removed in production builds'
22+
},
23+
2024
schema: [
2125
{
2226
type: 'object',
@@ -109,7 +113,7 @@ module.exports = {
109113
) {
110114
context.report({
111115
node: node.property,
112-
message: 'Using propTypes from another component is not safe because they may be removed in production builds'
116+
messageId: 'forbiddenPropType'
113117
});
114118
}
115119
},
@@ -120,7 +124,7 @@ module.exports = {
120124
if (propTypesNode) {
121125
context.report({
122126
node: propTypesNode,
123-
message: 'Using propTypes from another component is not safe because they may be removed in production builds'
127+
messageId: 'forbiddenPropType'
124128
});
125129
}
126130
}

lib/rules/forbid-prop-types.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ module.exports = {
2929
url: docsUrl('forbid-prop-types')
3030
},
3131

32+
messages: {
33+
forbiddenPropType: 'Prop type "{{target}}" is forbidden'
34+
},
35+
3236
schema: [{
3337
type: 'object',
3438
properties: {
@@ -63,7 +67,10 @@ module.exports = {
6367
if (isForbidden(type)) {
6468
context.report({
6569
node: declaration,
66-
message: `Prop type \`${target}\` is forbidden`
70+
messageId: 'forbiddenPropType',
71+
data: {
72+
target
73+
}
6774
});
6875
}
6976
}

0 commit comments

Comments
 (0)