forked from sinonjs/sinon
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
added eslint rule to catch prototype method usage sinonjs#1826
this rule started life as a direct copy of the built-in ESLint rule: https://eslint.org/docs/rules/no-prototype-builtins
- Loading branch information
Showing
3 changed files
with
79 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
"use strict"; | ||
|
||
function getPrototypeMethods(prototype) { | ||
/* eslint-disable local-rules/no-prototype-methods */ | ||
return Object.getOwnPropertyNames(prototype).filter(function (name) { | ||
return typeof prototype[name] === "function" && prototype.hasOwnProperty(name); | ||
}); | ||
} | ||
|
||
var DISALLOWED_ARRAY_PROPS = getPrototypeMethods(Array.prototype); | ||
|
||
var DISALLOWED_OBJECT_PROPS = getPrototypeMethods(Object.prototype); | ||
|
||
module.exports = { | ||
// rule to disallow direct use of prototype methods of builtins | ||
"no-prototype-methods": { | ||
meta: { | ||
docs: { | ||
description: "disallow calling prototype methods directly", | ||
category: "Possible Errors", | ||
recommended: false, | ||
url: "https://eslint.org/docs/rules/no-prototype-builtins" | ||
}, | ||
|
||
schema: [] | ||
}, | ||
|
||
create: function (context) { | ||
/** | ||
* Reports if a disallowed property is used in a CallExpression | ||
* @param {ASTNode} node The CallExpression node. | ||
* @returns {void} | ||
*/ | ||
function disallowBuiltIns(node) { | ||
if ( | ||
node.callee.type !== "MemberExpression" | ||
|| node.callee.computed | ||
// allow static method calls | ||
|| node.callee.object.name === "Array" | ||
|| node.callee.object.name === "Object" | ||
) { | ||
return; | ||
} | ||
var propName = node.callee.property.name; | ||
|
||
if (DISALLOWED_OBJECT_PROPS.indexOf(propName) > -1) { | ||
context.report({ | ||
message: "Do not access {{obj}} prototype method '{{prop}}' from target object.", | ||
loc: node.callee.property.loc.start, | ||
data: { | ||
obj: "Object", | ||
prop: propName | ||
}, | ||
node: node | ||
}); | ||
} | ||
else if (DISALLOWED_ARRAY_PROPS.indexOf(propName) > -1) { | ||
context.report({ | ||
message: "Do not access {{obj}} prototype method '{{prop}}' from target object.", | ||
loc: node.callee.property.loc.start, | ||
data: { | ||
obj: "Array", | ||
prop: propName | ||
}, | ||
node: node | ||
}); | ||
} | ||
} | ||
|
||
return { | ||
CallExpression: disallowBuiltIns | ||
}; | ||
} | ||
} | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters