diff --git a/lib/rules/no-sync.js b/lib/rules/no-sync.js index e670bfc4..a7cb7dcf 100644 --- a/lib/rules/no-sync.js +++ b/lib/rules/no-sync.js @@ -4,6 +4,24 @@ */ "use strict" +const allowedAtRootLevelSelector = [ + // fs.readFileSync() + ":function MemberExpression > Identifier[name=/Sync$/]", + // readFileSync.call(null, 'path') + ":function MemberExpression > Identifier[name=/Sync$/]", + // readFileSync() + ":function :not(MemberExpression) > Identifier[name=/Sync$/]", +] + +const disallowedAtRootLevelSelector = [ + // fs.readFileSync() + "MemberExpression > Identifier[name=/Sync$/]", + // readFileSync.call(null, 'path') + "MemberExpression > Identifier[name=/Sync$/]", + // readFileSync() + ":not(MemberExpression) > Identifier[name=/Sync$/]", +] + module.exports = { meta: { type: "suggestion", @@ -32,18 +50,17 @@ module.exports = { }, create(context) { - const selector = - context.options[0] && context.options[0].allowAtRootLevel - ? ":function MemberExpression[property.name=/.*Sync$/]" - : "MemberExpression[property.name=/.*Sync$/]" + const selector = context.options[0]?.allowAtRootLevel + ? allowedAtRootLevelSelector + : disallowedAtRootLevelSelector return { [selector](node) { context.report({ - node, + node: node.parent, messageId: "noSync", data: { - propertyName: node.property.name, + propertyName: node.name, }, }) }, diff --git a/tests/lib/rules/no-sync.js b/tests/lib/rules/no-sync.js index aaf97bb7..91c165b1 100644 --- a/tests/lib/rules/no-sync.js +++ b/tests/lib/rules/no-sync.js @@ -14,10 +14,18 @@ new RuleTester().run("no-sync", rule, { code: "var foo = fs.fooSync;", options: [{ allowAtRootLevel: true }], }, + { + code: "var foo = fooSync;", + options: [{ allowAtRootLevel: true }], + }, { code: "if (true) {fs.fooSync();}", options: [{ allowAtRootLevel: true }], }, + { + code: "if (true) {fooSync();}", + options: [{ allowAtRootLevel: true }], + }, ], invalid: [ { @@ -30,6 +38,36 @@ new RuleTester().run("no-sync", rule, { }, ], }, + { + code: "var foo = fs.fooSync.apply();", + errors: [ + { + messageId: "noSync", + data: { propertyName: "fooSync" }, + type: "MemberExpression", + }, + ], + }, + { + code: "var foo = fooSync();", + errors: [ + { + messageId: "noSync", + data: { propertyName: "fooSync" }, + type: "CallExpression", + }, + ], + }, + { + code: "var foo = fooSync.apply();", + errors: [ + { + messageId: "noSync", + data: { propertyName: "fooSync" }, + type: "MemberExpression", + }, + ], + }, { code: "var foo = fs.fooSync();", options: [{ allowAtRootLevel: false }],