Skip to content

Commit c5c4b62

Browse files
authored
Fix: False negative in prefer-message-ids rule (#173)
1 parent e4b0f92 commit c5c4b62

File tree

2 files changed

+104
-0
lines changed

2 files changed

+104
-0
lines changed

lib/rules/prefer-message-ids.js

+29
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use strict';
22

33
const utils = require('../utils');
4+
const { getStaticValue } = require('eslint-utils');
45

56
// ------------------------------------------------------------------------------
67
// Rule Definition
@@ -17,11 +18,15 @@ module.exports = {
1718
fixable: null,
1819
schema: [],
1920
messages: {
21+
messagesMissing: '`meta.messages` must contain at least one violation message.',
2022
foundMessage: 'Use `messageId` instead of `message`.',
2123
},
2224
},
2325

2426
create (context) {
27+
const sourceCode = context.getSourceCode();
28+
const info = utils.getRuleInfo(sourceCode);
29+
2530
let contextIdentifiers;
2631

2732
// ----------------------------------------------------------------------
@@ -31,6 +36,30 @@ module.exports = {
3136
return {
3237
Program (ast) {
3338
contextIdentifiers = utils.getContextIdentifiers(context, ast);
39+
40+
if (info === null || info.meta === null) {
41+
return;
42+
}
43+
44+
const metaNode = info.meta;
45+
const messagesNode =
46+
metaNode &&
47+
metaNode.properties &&
48+
metaNode.properties.find(p => p.type === 'Property' && utils.getKeyName(p) === 'messages');
49+
50+
if (!messagesNode) {
51+
context.report({ node: metaNode, messageId: 'messagesMissing' });
52+
return;
53+
}
54+
55+
const staticValue = getStaticValue(messagesNode.value, context.getScope());
56+
if (!staticValue) {
57+
return;
58+
}
59+
60+
if (typeof staticValue.value === 'object' && staticValue.value.constructor === Object && Object.keys(staticValue.value).length === 0) {
61+
context.report({ node: messagesNode.value, messageId: 'messagesMissing' });
62+
}
3463
},
3564
CallExpression (node) {
3665
if (

tests/lib/rules/prefer-message-ids.js

+75
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,26 @@ ruleTester.run('prefer-message-ids', rule, {
5858
]
5959
});
6060
`,
61+
62+
// `meta.messages` has a message
63+
`
64+
module.exports = {
65+
meta: { messages: { someMessageId: 'some message' } },
66+
create(context) {
67+
context.report({ node, messageId: 'someMessageId' });
68+
}
69+
};
70+
`,
71+
// `meta.messages` has a message (in variable)
72+
`
73+
const messages = { someMessageId: 'some message' };
74+
module.exports = {
75+
meta: { messages },
76+
create(context) {
77+
context.report({ node, messageId: 'someMessageId' });
78+
}
79+
};
80+
`,
6181
],
6282

6383
invalid: [
@@ -100,5 +120,60 @@ ruleTester.run('prefer-message-ids', rule, {
100120
`,
101121
errors: [{ messageId: 'foundMessage', type: 'Property' }],
102122
},
123+
124+
{
125+
// `meta.messages` missing
126+
code: `
127+
module.exports = {
128+
meta: { description: 'foo' },
129+
create(context) { }
130+
};
131+
`,
132+
errors: [{ messageId: 'messagesMissing', type: 'ObjectExpression' }],
133+
},
134+
{
135+
// `meta.messages` empty
136+
code: `
137+
module.exports = {
138+
meta: {
139+
description: 'foo',
140+
messages: {},
141+
},
142+
create(context) { }
143+
};
144+
`,
145+
errors: [{ messageId: 'messagesMissing', type: 'ObjectExpression' }],
146+
},
147+
{
148+
// `meta.messages` empty (in variable)
149+
code: `
150+
const messages = {};
151+
module.exports = {
152+
meta: {
153+
description: 'foo',
154+
messages,
155+
},
156+
create(context) { }
157+
};
158+
`,
159+
errors: [{ messageId: 'messagesMissing', type: 'Identifier' }],
160+
},
161+
{
162+
// `meta.messages` missing and using `message`
163+
code: `
164+
module.exports = {
165+
meta: {
166+
description: 'foo',
167+
},
168+
create(context) {
169+
context.report({ node, message: 'foo' });
170+
}
171+
};
172+
`,
173+
errors: [
174+
{ messageId: 'messagesMissing', type: 'ObjectExpression' },
175+
{ messageId: 'foundMessage', type: 'Property' },
176+
],
177+
},
103178
],
104179
});

0 commit comments

Comments
 (0)