Skip to content

Commit

Permalink
Report on standalone function calls too
Browse files Browse the repository at this point in the history
  • Loading branch information
davidmyersdev committed Jul 28, 2023
1 parent ce36f18 commit cf2fcc9
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 23 deletions.
67 changes: 44 additions & 23 deletions lib/rules/no-setup-props-destructure.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,8 @@ module.exports = {
*/
/** @type {Map<FunctionDeclaration | FunctionExpression | ArrowFunctionExpression | Program, ScopePropsReferences>} */
const setupScopePropsReferenceIds = new Map()
const outerExpressionTypes = new Set([
const wrapperExpressionTypes = new Set([
'ArrayExpression',
'CallExpression',
'ObjectExpression'
])

Expand Down Expand Up @@ -68,27 +67,11 @@ module.exports = {

const rightNode = utils.skipChainExpression(right)

if (outerExpressionTypes.has(rightNode.type)) {
const propRefs = [...propsReferences.refs.values()]
const isPropsMemberAccessed = propRefs.some((props) => {
const isPropsInCallExpression = utils.inRange(rightNode.range, props)

if (isPropsInCallExpression) {
const isPropMemberExpression =
props.parent.type === 'MemberExpression' &&
props.parent.object === props

if (isPropMemberExpression) {
return true
}
}

return false
})

if (isPropsMemberAccessed) {
return report(left, 'getProperty', propsReferences.scopeName)
}
if (
wrapperExpressionTypes.has(rightNode.type) &&
isPropsMemberAccessed(rightNode, propsReferences)
) {
return report(rightNode, 'getProperty', propsReferences.scopeName)
}

if (
Expand All @@ -108,6 +91,24 @@ module.exports = {
report(left, 'getProperty', propsReferences.scopeName)
}
}

/**
* @param {Expression} node
* @param {ScopePropsReferences} propsReferences
*/
function isPropsMemberAccessed(node, propsReferences) {
const propRefs = [...propsReferences.refs.values()]

return propRefs.some((props) => {
const isPropsInExpressionRange = utils.inRange(node.range, props)
const isPropsMemberExpression =
props.parent.type === 'MemberExpression' &&
props.parent.object === props

return isPropsInExpressionRange && isPropsMemberExpression
})
}

/**
* @typedef {object} ScopeStack
* @property {ScopeStack | null} upper
Expand Down Expand Up @@ -182,6 +183,26 @@ module.exports = {

setupScopePropsReferenceIds.delete(node)
},
/**
* @param {CallExpression} node
*/
CallExpression(node) {
if (!scopeStack) {
return
}

const propsReferenceIds = setupScopePropsReferenceIds.get(
scopeStack.scopeNode
)

if (!propsReferenceIds) {
return
}

if (isPropsMemberAccessed(node, propsReferenceIds)) {
report(node, 'getProperty', propsReferenceIds.scopeName)
}
},
/**
* @param {VariableDeclarator} node
*/
Expand Down
17 changes: 17 additions & 0 deletions tests/lib/rules/no-setup-props-destructure.js
Original file line number Diff line number Diff line change
Expand Up @@ -660,6 +660,23 @@ tester.run('no-setup-props-destructure', rule, {
line: 4
}
]
},
{
filename: 'test.vue',
code: `
<script setup>
const props = defineProps({ count: Number })
const buildCounter = (count) => ({ count })
buildCounter(props.count)
</script>
`,
errors: [
{
messageId: 'getProperty',
line: 6
}
]
}
]
})

0 comments on commit cf2fcc9

Please sign in to comment.