Skip to content

Commit d93f2c6

Browse files
authored
Fix false positive for unknown prop in vue/no-undef-properties rule (#2186)
1 parent 30931f0 commit d93f2c6

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

Diff for: lib/rules/no-undef-properties.js

+11
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ module.exports = {
127127

128128
/** @type { Set<string | ASTNode> } */
129129
this.reported = new Set()
130+
131+
this.hasUnknownProperty = false
130132
}
131133
/**
132134
* Report
@@ -135,6 +137,7 @@ module.exports = {
135137
* @param {boolean} [options.props]
136138
*/
137139
verifyReferences(references, options) {
140+
if (this.hasUnknownProperty) return
138141
const report = this.report.bind(this)
139142
verifyUndefProperties(this.defineProperties, references, null)
140143

@@ -206,6 +209,10 @@ module.exports = {
206209
}
207210
})
208211
}
212+
213+
markAsHasUnknownProperty() {
214+
this.hasUnknownProperty = true
215+
}
209216
}
210217

211218
/** @type {Map<ASTNode, VueComponentContext>} */
@@ -280,6 +287,10 @@ module.exports = {
280287
const ctx = getVueComponentContext(programNode)
281288

282289
for (const prop of props) {
290+
if (prop.type === 'unknown') {
291+
ctx.markAsHasUnknownProperty()
292+
return
293+
}
283294
if (!prop.propName) {
284295
continue
285296
}

Diff for: tests/lib/rules/no-undef-properties.js

+47
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66

77
const RuleTester = require('eslint').RuleTester
88
const rule = require('../../../lib/rules/no-undef-properties')
9+
const {
10+
getTypeScriptFixtureTestOptions
11+
} = require('../../test-utils/typescript')
912

1013
const tester = new RuleTester({
1114
parser: require.resolve('vue-eslint-parser'),
@@ -535,6 +538,26 @@ tester.run('no-undef-properties', rule, {
535538
},
536539
};
537540
</script>`
541+
},
542+
543+
{
544+
// unknown type
545+
filename: 'test.vue',
546+
code: `
547+
<script setup lang="ts">
548+
import type { Props1 } from './test01';
549+
550+
defineProps<Props1>();
551+
552+
</script>
553+
554+
<template>
555+
<div>{{ foo }}</div>
556+
<div>{{ unknown }}</div>
557+
</template>`,
558+
parserOptions: {
559+
parser: require.resolve('@typescript-eslint/parser')
560+
}
538561
}
539562
],
540563

@@ -1129,6 +1152,30 @@ tester.run('no-undef-properties', rule, {
11291152
column: 46
11301153
}
11311154
]
1155+
},
1156+
1157+
{
1158+
// known type
1159+
filename: 'test.vue',
1160+
code: `
1161+
<script setup lang="ts">
1162+
import type { Props1 } from './test01';
1163+
1164+
defineProps<Props1>();
1165+
1166+
</script>
1167+
1168+
<template>
1169+
<div>{{ foo }}</div>
1170+
<div>{{ unknown }}</div>
1171+
</template>`,
1172+
...getTypeScriptFixtureTestOptions(),
1173+
errors: [
1174+
{
1175+
message: "'unknown' is not defined.",
1176+
line: 11
1177+
}
1178+
]
11321179
}
11331180
]
11341181
})

0 commit comments

Comments
 (0)