Skip to content

Commit 424ce7a

Browse files
committed
Report on standalone function calls too
1 parent e064d0b commit 424ce7a

File tree

2 files changed

+71
-23
lines changed

2 files changed

+71
-23
lines changed

lib/rules/no-setup-props-destructure.js

+54-23
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,8 @@ module.exports = {
3535
*/
3636
/** @type {Map<FunctionDeclaration | FunctionExpression | ArrowFunctionExpression | Program, ScopePropsReferences>} */
3737
const setupScopePropsReferenceIds = new Map()
38-
const outerExpressionTypes = new Set([
38+
const wrapperExpressionTypes = new Set([
3939
'ArrayExpression',
40-
'CallExpression',
4140
'ObjectExpression'
4241
])
4342

@@ -68,27 +67,11 @@ module.exports = {
6867

6968
const rightNode = utils.skipChainExpression(right)
7069

71-
if (outerExpressionTypes.has(rightNode.type)) {
72-
const propRefs = [...propsReferences.refs.values()]
73-
const isPropsMemberAccessed = propRefs.some((props) => {
74-
const isPropsInCallExpression = utils.inRange(rightNode.range, props)
75-
76-
if (isPropsInCallExpression) {
77-
const isPropMemberExpression =
78-
props.parent.type === 'MemberExpression' &&
79-
props.parent.object === props
80-
81-
if (isPropMemberExpression) {
82-
return true
83-
}
84-
}
85-
86-
return false
87-
})
88-
89-
if (isPropsMemberAccessed) {
90-
return report(left, 'getProperty', propsReferences.scopeName)
91-
}
70+
if (
71+
wrapperExpressionTypes.has(rightNode.type) &&
72+
isPropsMemberAccessed(rightNode, propsReferences)
73+
) {
74+
return report(rightNode, 'getProperty', propsReferences.scopeName)
9275
}
9376

9477
if (
@@ -108,6 +91,34 @@ module.exports = {
10891
report(left, 'getProperty', propsReferences.scopeName)
10992
}
11093
}
94+
/**
95+
* @param {Expression} node
96+
* @param {ScopePropsReferences} propsReferences
97+
*/
98+
function isPropsMemberAccessed(node, propsReferences) {
99+
const propRefs = [...propsReferences.refs.values()]
100+
const isMemberAccessed = propRefs.some((props) => {
101+
const isPropsInExpressionRange = utils.inRange(node.range, props)
102+
103+
if (isPropsInExpressionRange) {
104+
const isPropsMemberExpression =
105+
props.parent.type === 'MemberExpression' &&
106+
props.parent.object === props
107+
108+
if (isPropsMemberExpression) {
109+
return true
110+
}
111+
}
112+
113+
return false
114+
})
115+
116+
if (isMemberAccessed) {
117+
return true
118+
}
119+
120+
return false
121+
}
111122
/**
112123
* @typedef {object} ScopeStack
113124
* @property {ScopeStack | null} upper
@@ -182,6 +193,26 @@ module.exports = {
182193

183194
setupScopePropsReferenceIds.delete(node)
184195
},
196+
/**
197+
* @param {CallExpression} node
198+
*/
199+
CallExpression(node) {
200+
if (!scopeStack) {
201+
return
202+
}
203+
204+
const propsReferenceIds = setupScopePropsReferenceIds.get(
205+
scopeStack.scopeNode
206+
)
207+
208+
if (!propsReferenceIds) {
209+
return
210+
}
211+
212+
if (isPropsMemberAccessed(node, propsReferenceIds)) {
213+
report(node, 'getProperty', propsReferenceIds.scopeName)
214+
}
215+
},
185216
/**
186217
* @param {VariableDeclarator} node
187218
*/

tests/lib/rules/no-setup-props-destructure.js

+17
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,23 @@ tester.run('no-setup-props-destructure', rule, {
660660
line: 4
661661
}
662662
]
663+
},
664+
{
665+
filename: 'test.vue',
666+
code: `
667+
<script setup>
668+
const props = defineProps({ count: Number })
669+
const buildCounter = (count) => ({ count })
670+
671+
buildCounter(props.count)
672+
</script>
673+
`,
674+
errors: [
675+
{
676+
messageId: 'getProperty',
677+
line: 6
678+
}
679+
]
663680
}
664681
]
665682
})

0 commit comments

Comments
 (0)