Skip to content

Commit 7c0d1d0

Browse files
authored
Fix: Fix false negatives and reporting location in require-meta-type (#155)
1 parent 4aa9aca commit 7c0d1d0

File tree

2 files changed

+65
-8
lines changed

2 files changed

+65
-8
lines changed

lib/rules/require-meta-type.js

+13-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
'use strict';
77

8+
const { getStaticValue } = require('eslint-utils');
89
const utils = require('../utils');
910
const VALID_TYPES = new Set(['problem', 'suggestion', 'layout']);
1011

@@ -52,10 +53,19 @@ module.exports = {
5253
metaNode.properties &&
5354
metaNode.properties.find(p => p.type === 'Property' && utils.getKeyName(p) === 'type');
5455

55-
if (typeNode && typeNode.value.type === 'Literal' && !VALID_TYPES.has(typeNode.value.value)) {
56-
context.report({ node: metaNode, messageId: 'unexpected' });
57-
} else if (!typeNode) {
56+
if (!typeNode) {
5857
context.report({ node: metaNode, messageId: 'missing' });
58+
return;
59+
}
60+
61+
const staticValue = getStaticValue(typeNode.value, context.getScope());
62+
if (!staticValue) {
63+
// Ignore non-static values since we can't determine what they look like.
64+
return;
65+
}
66+
67+
if (!VALID_TYPES.has(staticValue.value)) {
68+
context.report({ node: typeNode.value, messageId: 'unexpected' });
5969
}
6070
},
6171
};

tests/lib/rules/require-meta-type.js

+52-5
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,25 @@ ruleTester.run('require-meta-type', rule, {
3737
create(context) {}
3838
};
3939
`,
40+
`
41+
const type = 'problem';
42+
module.exports = {
43+
meta: { type },
44+
create(context) {}
45+
};
46+
`,
47+
`
48+
module.exports = {
49+
meta: { type: getType() },
50+
create(context) {}
51+
};
52+
`,
53+
`
54+
module.exports = {
55+
meta: { type: FOO },
56+
create(context) {}
57+
};
58+
`,
4059
`module.exports = {
4160
create(context) {}
4261
}`,
@@ -60,7 +79,7 @@ ruleTester.run('require-meta-type', rule, {
6079
create(context) {}
6180
};
6281
`,
63-
errors: [{ messageId: 'missing' }],
82+
errors: [{ messageId: 'missing', type: 'ObjectExpression' }],
6483
},
6584
{
6685
code: `
@@ -70,7 +89,7 @@ ruleTester.run('require-meta-type', rule, {
7089
create,
7190
};
7291
`,
73-
errors: [{ messageId: 'missing' }],
92+
errors: [{ messageId: 'missing', type: 'ObjectExpression' }],
7493
},
7594
{
7695
code: `
@@ -80,7 +99,7 @@ ruleTester.run('require-meta-type', rule, {
8099
create,
81100
};
82101
`,
83-
errors: [{ messageId: 'missing' }],
102+
errors: [{ messageId: 'missing', type: 'ObjectExpression' }],
84103
},
85104
{
86105
code: `
@@ -90,7 +109,7 @@ ruleTester.run('require-meta-type', rule, {
90109
create,
91110
};
92111
`,
93-
errors: [{ messageId: 'missing' }],
112+
errors: [{ messageId: 'missing', type: 'ObjectExpression' }],
94113
},
95114
{
96115
code: `
@@ -99,7 +118,35 @@ ruleTester.run('require-meta-type', rule, {
99118
create(context) {}
100119
};
101120
`,
102-
errors: [{ messageId: 'unexpected' }],
121+
errors: [{ messageId: 'unexpected', type: 'Literal' }],
122+
},
123+
{
124+
code: `
125+
const type = 'invalid-type';
126+
module.exports = {
127+
meta: { type },
128+
create(context) {}
129+
};
130+
`,
131+
errors: [{ messageId: 'unexpected', type: 'Identifier' }],
132+
},
133+
{
134+
code: `
135+
module.exports = {
136+
meta: { type: null },
137+
create(context) {}
138+
};
139+
`,
140+
errors: [{ messageId: 'unexpected', type: 'Literal' }],
141+
},
142+
{
143+
code: `
144+
module.exports = {
145+
meta: { type: undefined },
146+
create(context) {}
147+
};
148+
`,
149+
errors: [{ messageId: 'unexpected', type: 'Identifier' }],
103150
},
104151
],
105152
});

0 commit comments

Comments
 (0)