Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/add-callexpression-support.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'eslint-plugin-vue': patch
---

fix(no-v-html): add CallExpression support to ignorePattern option (#2949)
28 changes: 25 additions & 3 deletions lib/rules/no-v-html.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,37 @@ module.exports = {
? new RegExp(options.ignorePattern, 'u')
: undefined

/**
* Check if the expression matches the ignore pattern
* @param {VExpressionContainer['expression']} expression
* @param {SourceCode} sourceCode
* @returns {boolean}
*/
function shouldIgnore(expression, sourceCode) {
if (!ignoreRegEx || !expression) {
return false
}

// For simple identifiers, use the name property directly (optimized)
if (expression.type === 'Identifier') {
return ignoreRegEx.test(expression.name)
}

// For other expression types (e.g., CallExpression), get the full text
const expressionText = sourceCode.getText(expression)
return ignoreRegEx.test(expressionText)
}

return utils.defineTemplateBodyVisitor(context, {
/** @param {VDirective} node */
"VAttribute[directive=true][key.name.name='html']"(node) {
const sourceCode = context.sourceCode

if (
ignoreRegEx &&
node.value &&
node.value.expression &&
node.value.expression.type === 'Identifier' &&
ignoreRegEx.test(node.value.expression.name)
sourceCode &&
shouldIgnore(node.value.expression, sourceCode)
) {
return
}
Expand Down
5 changes: 5 additions & 0 deletions tests/lib/rules/no-v-html.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ ruleTester.run('no-v-html', rule, {
filename: 'test.vue',
code: '<template><div v-html="htmlKnownToBeSafe"></div></template>',
options: [{ ignorePattern: '^html' }]
},
{
filename: 'test.vue',
code: '<template><div v-html="$sanitize(test)"></div></template>',
options: [{ ignorePattern: String.raw`^\$sanitize\(` }]
}
],
invalid: [
Expand Down
Loading