Skip to content

Commit 8f2c123

Browse files
committed
permit Promise.prototype['then'] access and test for other prototype access
1 parent 8432b56 commit 8f2c123

File tree

2 files changed

+34
-8
lines changed

2 files changed

+34
-8
lines changed

__tests__/spec-only.js

+3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ ruleTester.run('spec-only', rule, {
1111
'Promise.all()',
1212
'Promise["all"]',
1313
'Promise[method];',
14+
'Promise.prototype;',
15+
'Promise.prototype[method];',
16+
'Promise.prototype["then"];',
1417
'Promise.race()',
1518
'var ctch = Promise.prototype.catch',
1619
'Promise.withResolvers()',

rules/spec-only.js

+31-8
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,28 @@ const getDocsUrl = require('./lib/get-docs-url')
55

66
const PROMISE_INSTANCE_METHODS = new Set(['then', 'catch', 'finally'])
77

8+
function isPermittedProperty(expression, standardSet, allowedMethods) {
9+
// istanbul ignore if
10+
if (expression.type !== 'MemberExpression') return false
11+
12+
if (expression.property.type === 'Literal')
13+
return (
14+
standardSet.has(expression.property.value) ||
15+
allowedMethods.includes(expression.property.value)
16+
)
17+
18+
// istanbul ignore else
19+
if (expression.property.type === 'Identifier')
20+
return (
21+
expression.computed ||
22+
standardSet.has(expression.property.name) ||
23+
allowedMethods.includes(expression.property.name)
24+
)
25+
26+
// istanbul ignore next
27+
return false
28+
}
29+
830
module.exports = {
931
meta: {
1032
type: 'problem',
@@ -37,15 +59,16 @@ module.exports = {
3759
MemberExpression(node) {
3860
if (
3961
node.object.type === 'Identifier' &&
40-
(!node.computed || node.property.type === 'Literal') &&
4162
node.object.name === 'Promise' &&
42-
((node.property.name && !PROMISE_STATICS.has(node.property.name)) ||
43-
(node.property.value &&
44-
!PROMISE_STATICS.has(node.property.value))) &&
45-
(node.property.name !== 'prototype' ||
46-
(!PROMISE_INSTANCE_METHODS.has(node?.parent?.property?.name) &&
47-
!allowedMethods.includes(node?.parent?.property?.name))) &&
48-
!allowedMethods.includes(node.property.name ?? node.property.value)
63+
((node.property.name !== 'prototype' &&
64+
!isPermittedProperty(node, PROMISE_STATICS, allowedMethods)) ||
65+
(node.property.name === 'prototype' &&
66+
node.parent.type === 'MemberExpression' &&
67+
!isPermittedProperty(
68+
node.parent,
69+
PROMISE_INSTANCE_METHODS,
70+
allowedMethods,
71+
)))
4972
) {
5073
context.report({
5174
node,

0 commit comments

Comments
 (0)