Skip to content

Commit c1fa4dc

Browse files
authored
feat: add support for defineMessage (#9)
1 parent 1f8cf37 commit c1fa4dc

11 files changed

+130
-7
lines changed

Diff for: .gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@
22
.DS_Store
33
node_modules
44
coverage
5+
.vscode

Diff for: docs/rules/id-missing.md

+12
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ formatMessage({ id: 'missing_example' })
3131
defineMessages({ msg: { id:'missing_example' }})
3232
```
3333

34+
```js
35+
defineMessage({ id:'missing_example' })
36+
```
37+
3438
Examples of **correct** code for this rule:
3539

3640
```js
@@ -57,6 +61,14 @@ defineMessages({ msg: { id: 'in_example' }})
5761
defineMessages({ msg: { id: `in_${someKey}_label` }})
5862
```
5963

64+
```js
65+
defineMessage({ id: 'in_example' })
66+
```
67+
68+
```js
69+
defineMessage({ id: `in_${someKey}_label` })
70+
```
71+
6072
### Options
6173

6274
```

Diff for: docs/rules/id-prefix.md

+16
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ formatMessage({ id:'missing_example' })
2323
defineMessages({ msg: { id: 'missing_example' }})
2424
```
2525

26+
```js
27+
defineMessage({ id:'missing_example' })
28+
```
29+
2630
Examples of **correct** code for this rule:
2731

2832
```js
@@ -61,6 +65,18 @@ defineMessages({ msg: { id: `in_${someKey}_label` }})
6165
defineMessages({ msg: { id: 'out_example' }})
6266
```
6367

68+
```js
69+
defineMessage({ id: 'in_example' })
70+
```
71+
72+
```js
73+
defineMessage({ id: `in_${someKey}_label` })
74+
```
75+
76+
```js
77+
defineMessage({ id: 'out_example' })
78+
```
79+
6480
### Options
6581

6682
```

Diff for: docs/rules/no-default.md

+8
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ formatMessage({ id: 'missing_example', defaultMessage: 'Redundant message text'
1818
defineMessages({ msg: { id: 'missing_example', defaultMessage: 'Redundant message text' }})
1919
```
2020

21+
```js
22+
defineMessage({ id: 'missing_example', defaultMessage: 'Redundant message text' })
23+
```
24+
2125
Examples of **correct** code for this rule:
2226

2327
```js
@@ -32,6 +36,10 @@ formatMessage({ id: 'in_example' })
3236
defineMessages({ msg: { id: 'in_example' }})
3337
```
3438

39+
```js
40+
defineMessage({ id: 'in_example' })
41+
```
42+
3543
### Options
3644

3745
```

Diff for: lib/rules/id-missing.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ const { getIntlIds } = require('../util/translations');
33
const {
44
findFormatMessageAttrNode,
55
findFormattedMessageAttrNode,
6-
findAttrNodeInDefineMessages
6+
findAttrNodeInDefineMessages,
7+
findAttrNodeInDefineMessage
78
} = require('../util/findNodes');
89

910
// ------------------------------------------------------------------------------
@@ -91,7 +92,7 @@ module.exports = {
9192
if (attrNode) return processAttrNode(attrNode);
9293
},
9394
Property: function (node) {
94-
const attrNode = findAttrNodeInDefineMessages(node, 'id');
95+
const attrNode = findAttrNodeInDefineMessages(node, 'id') || findAttrNodeInDefineMessage(node, 'id');
9596
if (attrNode) return processAttrNode(attrNode);
9697
}
9798
};

Diff for: lib/rules/id-prefix.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ const { templateLiteralDisplayStr } = require('../util/templateLiterals');
22
const {
33
findFormatMessageAttrNode,
44
findFormattedMessageAttrNode,
5-
findAttrNodeInDefineMessages
5+
findAttrNodeInDefineMessages,
6+
findAttrNodeInDefineMessage
67
} = require('../util/findNodes');
78

89
// ------------------------------------------------------------------------------
@@ -87,7 +88,7 @@ module.exports = {
8788
if (attrNode) return processAttrNode(attrNode);
8889
},
8990
Property: function (node) {
90-
const attrNode = findAttrNodeInDefineMessages(node, 'id');
91+
const attrNode = findAttrNodeInDefineMessages(node, 'id') || findAttrNodeInDefineMessage(node, 'id');
9192
if (attrNode) return processAttrNode(attrNode);
9293
}
9394
};

Diff for: lib/rules/no-default.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
const {
22
findFormatMessageAttrNode,
33
findFormattedMessageAttrNode,
4-
findAttrNodeInDefineMessages
4+
findAttrNodeInDefineMessages,
5+
findAttrNodeInDefineMessage
56
} = require('../util/findNodes');
67

78

@@ -48,7 +49,10 @@ module.exports = {
4849
if (attrNode) return processAttrNode(attrNode);
4950
},
5051
Property: function (node) {
51-
const attrNode = findAttrNodeInDefineMessages(node, 'defaultMessage');
52+
const attrNode =
53+
findAttrNodeInDefineMessages(node, 'defaultMessage') ||
54+
findAttrNodeInDefineMessage(node, 'defaultMessage');
55+
5256
if (attrNode) return processAttrNode(attrNode);
5357
}
5458
};

Diff for: lib/util/findNodes.js

+21-1
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,28 @@ function findAttrNodeInDefineMessages(node, attrName) {
5454
}
5555
}
5656

57+
/**
58+
* Finds an attribute in defineMessages using attribute name.
59+
*
60+
* @param {Object} node - parent defineMessages node
61+
* @param {string} attrName - attribute name.
62+
* @returns {Object} node - returns node if it finds the attribute.
63+
*/
64+
function findAttrNodeInDefineMessage(node, attrName) {
65+
if (node.type === 'Property'
66+
&& node.key.name === attrName
67+
&& node.parent
68+
&& node.parent.parent
69+
&& node.parent.parent.type === 'CallExpression'
70+
&& node.parent.parent.callee.name === 'defineMessage'
71+
) {
72+
return node;
73+
}
74+
}
75+
5776
module.exports = {
5877
findFormatMessageAttrNode,
5978
findFormattedMessageAttrNode,
60-
findAttrNodeInDefineMessages
79+
findAttrNodeInDefineMessages,
80+
findAttrNodeInDefineMessage
6181
};

Diff for: tests/lib/rules/id-missing.spec.js

+31
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,22 @@ ruleTester.run('id-missing', rule, {
5656
code: 'formatMessage({ id: `in_b_${bogus}` })',
5757
settings
5858
},
59+
{
60+
code: "defineMessage({ id: 'in_a_example' })",
61+
settings
62+
},
63+
{
64+
code: "defineMessage({ id: 'in_b_example' })",
65+
settings
66+
},
67+
{
68+
code: 'defineMessage({ id: `in_a_${bogus}` })',
69+
settings
70+
},
71+
{
72+
code: 'defineMessage({ id: `in_b_${bogus}` })',
73+
settings
74+
},
5975
{
6076
code: "defineMessages({ msg1: { id: `in_a_${bogus}` }, msg2: { id: 'in_b_example' }})",
6177
settings
@@ -110,6 +126,21 @@ ruleTester.run('id-missing', rule, {
110126
settings,
111127
errors: ['Missing id pattern: in_b_*_missing']
112128
},
129+
{
130+
code: "defineMessage({ id: 'in_a_missing_example' })",
131+
settings,
132+
errors: ['Missing id: in_a_missing_example']
133+
},
134+
{
135+
code: "defineMessage({ id: 'bad_missing_example' })",
136+
settings,
137+
errors: ['Missing id: bad_missing_example']
138+
},
139+
{
140+
code: 'defineMessage({ id: `in_b_${bogus}_missing` })',
141+
settings,
142+
errors: ['Missing id pattern: in_b_*_missing']
143+
},
113144
{
114145
code: "defineMessages({ msg1: { id: `in_a_${bogus}_missing` }, msg2: { id: 'bad_missing_example' }})",
115146
settings,

Diff for: tests/lib/rules/id-prefix.spec.js

+22
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,18 @@ ruleTester.run('id-prefix', rule, {
6565
{
6666
code: "defineMessages({ msg1: { id:`in_a_${bogus}` }, msg2: { id: 'in_b_example' }})",
6767
options
68+
},
69+
{
70+
code: 'defineMessage({ id:`in_a_${bogus}` })',
71+
options
72+
},
73+
{
74+
code: 'defineMessage({ id:`in_a_ignored_${bogus}` })',
75+
options
76+
},
77+
{
78+
code: "defineMessage({ id: 'in_b_example' })",
79+
options
6880
}
6981
],
7082

@@ -93,6 +105,16 @@ ruleTester.run('id-prefix', rule, {
93105
code: "defineMessages({ msg1: { id: `bad_${bogus}_missing`}, msg2: { id: 'bad_missing_example' }})",
94106
options,
95107
errors: ['Invalid id prefix: bad_*_missing', 'Invalid id prefix: bad_missing_example']
108+
},
109+
{
110+
code: 'defineMessage({ id: `bad_${bogus}_missing`})',
111+
options,
112+
errors: ['Invalid id prefix: bad_*_missing']
113+
},
114+
{
115+
code: "defineMessage({ id: 'bad_missing_example' })",
116+
options,
117+
errors: ['Invalid id prefix: bad_missing_example']
96118
}
97119
]
98120
});

Diff for: tests/lib/rules/no-default.spec.js

+7
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ ruleTester.run('no-default', rule, {
2020
},
2121
{
2222
code: "defineMessages({ msg1: { id:'in_example' }, msg2: { id:'in_example' }})"
23+
},
24+
{
25+
code: "defineMessage({ id:'in_example' })"
2326
}
2427
],
2528

@@ -35,6 +38,10 @@ ruleTester.run('no-default', rule, {
3538
{
3639
code: "defineMessages({ msg1: { id: 'in_ex', defaultMessage: 'example'}, msg2: { id: 'in_ex', defaultMessage: 'example' }})",
3740
errors: ['Do not use defaultMessage', 'Do not use defaultMessage']
41+
},
42+
{
43+
code: "defineMessage({ id: 'in_ex', defaultMessage: 'example' })",
44+
errors: ['Do not use defaultMessage']
3845
}
3946
]
4047
});

0 commit comments

Comments
 (0)