Skip to content

Commit 7d2b29b

Browse files
committed
Fix: False negative in prefer-message-ids rule
1 parent e4b0f92 commit 7d2b29b

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-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

+52
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,20 @@ 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+
};
67+
`,
68+
// `meta.messages` has a message (in variable)
69+
`
70+
const messages = { someMessageId: 'some message' };
71+
module.exports = {
72+
meta: { messages }
73+
};
74+
`,
6175
],
6276

6377
invalid: [
@@ -100,5 +114,43 @@ ruleTester.run('prefer-message-ids', rule, {
100114
`,
101115
errors: [{ messageId: 'foundMessage', type: 'Property' }],
102116
},
117+
118+
{
119+
// `meta.messages` missing
120+
code: `
121+
module.exports = {
122+
meta: { description: 'foo' },
123+
create(context) { }
124+
};
125+
`,
126+
errors: [{ messageId: 'messagesMissing', type: 'ObjectExpression' }],
127+
},
128+
{
129+
// `meta.messages` empty
130+
code: `
131+
module.exports = {
132+
meta: {
133+
description: 'foo',
134+
messages: {},
135+
},
136+
create(context) { }
137+
};
138+
`,
139+
errors: [{ messageId: 'messagesMissing', type: 'ObjectExpression' }],
140+
},
141+
{
142+
// `meta.messages` empty (in variable)
143+
code: `
144+
const messages = {};
145+
module.exports = {
146+
meta: {
147+
description: 'foo',
148+
messages,
149+
},
150+
create(context) { }
151+
};
152+
`,
153+
errors: [{ messageId: 'messagesMissing', type: 'Identifier' }],
154+
},
103155
],
104156
});

0 commit comments

Comments
 (0)