From d4cb2c3f6f57bf65e4dadf9f119b22a3134e1373 Mon Sep 17 00:00:00 2001 From: waynzh Date: Sat, 29 Jun 2024 15:45:14 +0800 Subject: [PATCH 1/2] fix(no-setup-props-reactivity-loss): report template literal --- lib/rules/no-setup-props-reactivity-loss.js | 25 +++++++++++-- .../rules/no-setup-props-reactivity-loss.js | 37 +++++++++++++++++++ 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/lib/rules/no-setup-props-reactivity-loss.js b/lib/rules/no-setup-props-reactivity-loss.js index b8e896075..4c3be8b90 100644 --- a/lib/rules/no-setup-props-reactivity-loss.js +++ b/lib/rules/no-setup-props-reactivity-loss.js @@ -79,18 +79,35 @@ module.exports = { left.type !== 'ArrayPattern' && left.type !== 'ObjectPattern' && rightNode.type !== 'MemberExpression' && - rightNode.type !== 'ConditionalExpression' + rightNode.type !== 'ConditionalExpression' && + rightNode.type !== 'TemplateLiteral' ) { return } - /** @type {Expression | Super} */ - let rightId = rightNode + if (rightNode.type === 'TemplateLiteral') { + rightNode.expressions.some((expression) => + checkMemberAccess(expression, propsReferences, left, right) + ) + } else { + checkMemberAccess(rightNode, propsReferences, left, right) + } + } + + /** + * @param {Expression | Super} rightId + * @param {ScopePropsReferences} propsReferences + * @param {Pattern} left + * @param {Expression} right + * @return {boolean} + */ + function checkMemberAccess(rightId, propsReferences, left, right) { while (rightId.type === 'MemberExpression') { rightId = utils.skipChainExpression(rightId.object) } if (rightId.type === 'Identifier' && propsReferences.refs.has(rightId)) { report(left, 'getProperty', propsReferences.scopeName) + return true } if ( rightId.type === 'ConditionalExpression' && @@ -99,7 +116,9 @@ module.exports = { isPropsMemberAccessed(rightId.alternate, propsReferences)) ) { report(right, 'getProperty', propsReferences.scopeName) + return true } + return false } /** diff --git a/tests/lib/rules/no-setup-props-reactivity-loss.js b/tests/lib/rules/no-setup-props-reactivity-loss.js index 6321ea573..894ce9039 100644 --- a/tests/lib/rules/no-setup-props-reactivity-loss.js +++ b/tests/lib/rules/no-setup-props-reactivity-loss.js @@ -717,6 +717,43 @@ tester.run('no-setup-props-reactivity-loss', rule, { line: 4 } ] + }, + { + // https://github.com/vuejs/eslint-plugin-vue/issues/2470 + filename: 'test.vue', + code: ` + + `, + errors: [ + { + messageId: 'getProperty', + line: 5 + } + ] + }, + { + filename: 'test.vue', + code: ` + + `, + errors: [ + { + messageId: 'getProperty', + line: 5 + } + ] } ] }) From 674a4bb571bf976aaf940d7a4080129cd018d3c3 Mon Sep 17 00:00:00 2001 From: waynzh Date: Sat, 29 Jun 2024 16:02:47 +0800 Subject: [PATCH 2/2] test: add template string valid case --- tests/lib/rules/no-setup-props-reactivity-loss.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/lib/rules/no-setup-props-reactivity-loss.js b/tests/lib/rules/no-setup-props-reactivity-loss.js index 894ce9039..edf721d8d 100644 --- a/tests/lib/rules/no-setup-props-reactivity-loss.js +++ b/tests/lib/rules/no-setup-props-reactivity-loss.js @@ -144,6 +144,7 @@ tester.run('no-setup-props-reactivity-loss', rule, { const {x} = noProps ({y} = noProps) const z = noProps.z + const foo = \`\${noProp.foo}\` } }