Skip to content

Commit cf2fcc9

Browse files
committed
Report on standalone function calls too
1 parent ce36f18 commit cf2fcc9

File tree

2 files changed

+61
-23
lines changed

2 files changed

+61
-23
lines changed

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

+44-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,24 @@ module.exports = {
10891
report(left, 'getProperty', propsReferences.scopeName)
10992
}
11093
}
94+
95+
/**
96+
* @param {Expression} node
97+
* @param {ScopePropsReferences} propsReferences
98+
*/
99+
function isPropsMemberAccessed(node, propsReferences) {
100+
const propRefs = [...propsReferences.refs.values()]
101+
102+
return propRefs.some((props) => {
103+
const isPropsInExpressionRange = utils.inRange(node.range, props)
104+
const isPropsMemberExpression =
105+
props.parent.type === 'MemberExpression' &&
106+
props.parent.object === props
107+
108+
return isPropsInExpressionRange && isPropsMemberExpression
109+
})
110+
}
111+
111112
/**
112113
* @typedef {object} ScopeStack
113114
* @property {ScopeStack | null} upper
@@ -182,6 +183,26 @@ module.exports = {
182183

183184
setupScopePropsReferenceIds.delete(node)
184185
},
186+
/**
187+
* @param {CallExpression} node
188+
*/
189+
CallExpression(node) {
190+
if (!scopeStack) {
191+
return
192+
}
193+
194+
const propsReferenceIds = setupScopePropsReferenceIds.get(
195+
scopeStack.scopeNode
196+
)
197+
198+
if (!propsReferenceIds) {
199+
return
200+
}
201+
202+
if (isPropsMemberAccessed(node, propsReferenceIds)) {
203+
report(node, 'getProperty', propsReferenceIds.scopeName)
204+
}
205+
},
185206
/**
186207
* @param {VariableDeclarator} node
187208
*/

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)