Skip to content

Commit 6d02512

Browse files
authoredOct 11, 2023
feat: detect non-member expressions in n/no-sync (#127)
1 parent 2d43f48 commit 6d02512

File tree

2 files changed

+61
-6
lines changed

2 files changed

+61
-6
lines changed
 

‎lib/rules/no-sync.js

+23-6
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,24 @@
44
*/
55
"use strict"
66

7+
const allowedAtRootLevelSelector = [
8+
// fs.readFileSync()
9+
":function MemberExpression > Identifier[name=/Sync$/]",
10+
// readFileSync.call(null, 'path')
11+
":function MemberExpression > Identifier[name=/Sync$/]",
12+
// readFileSync()
13+
":function :not(MemberExpression) > Identifier[name=/Sync$/]",
14+
]
15+
16+
const disallowedAtRootLevelSelector = [
17+
// fs.readFileSync()
18+
"MemberExpression > Identifier[name=/Sync$/]",
19+
// readFileSync.call(null, 'path')
20+
"MemberExpression > Identifier[name=/Sync$/]",
21+
// readFileSync()
22+
":not(MemberExpression) > Identifier[name=/Sync$/]",
23+
]
24+
725
module.exports = {
826
meta: {
927
type: "suggestion",
@@ -32,18 +50,17 @@ module.exports = {
3250
},
3351

3452
create(context) {
35-
const selector =
36-
context.options[0] && context.options[0].allowAtRootLevel
37-
? ":function MemberExpression[property.name=/.*Sync$/]"
38-
: "MemberExpression[property.name=/.*Sync$/]"
53+
const selector = context.options[0]?.allowAtRootLevel
54+
? allowedAtRootLevelSelector
55+
: disallowedAtRootLevelSelector
3956

4057
return {
4158
[selector](node) {
4259
context.report({
43-
node,
60+
node: node.parent,
4461
messageId: "noSync",
4562
data: {
46-
propertyName: node.property.name,
63+
propertyName: node.name,
4764
},
4865
})
4966
},

‎tests/lib/rules/no-sync.js

+38
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,18 @@ new RuleTester().run("no-sync", rule, {
1414
code: "var foo = fs.fooSync;",
1515
options: [{ allowAtRootLevel: true }],
1616
},
17+
{
18+
code: "var foo = fooSync;",
19+
options: [{ allowAtRootLevel: true }],
20+
},
1721
{
1822
code: "if (true) {fs.fooSync();}",
1923
options: [{ allowAtRootLevel: true }],
2024
},
25+
{
26+
code: "if (true) {fooSync();}",
27+
options: [{ allowAtRootLevel: true }],
28+
},
2129
],
2230
invalid: [
2331
{
@@ -30,6 +38,36 @@ new RuleTester().run("no-sync", rule, {
3038
},
3139
],
3240
},
41+
{
42+
code: "var foo = fs.fooSync.apply();",
43+
errors: [
44+
{
45+
messageId: "noSync",
46+
data: { propertyName: "fooSync" },
47+
type: "MemberExpression",
48+
},
49+
],
50+
},
51+
{
52+
code: "var foo = fooSync();",
53+
errors: [
54+
{
55+
messageId: "noSync",
56+
data: { propertyName: "fooSync" },
57+
type: "CallExpression",
58+
},
59+
],
60+
},
61+
{
62+
code: "var foo = fooSync.apply();",
63+
errors: [
64+
{
65+
messageId: "noSync",
66+
data: { propertyName: "fooSync" },
67+
type: "MemberExpression",
68+
},
69+
],
70+
},
3371
{
3472
code: "var foo = fs.fooSync();",
3573
options: [{ allowAtRootLevel: false }],

0 commit comments

Comments
 (0)
Please sign in to comment.