Skip to content

Commit 9842bd6

Browse files
committed
Update vue/require-prop-type-constructor rule to support <script setup>
1 parent 2eafd04 commit 9842bd6

File tree

3 files changed

+77
-28
lines changed

3 files changed

+77
-28
lines changed

Diff for: lib/rules/require-prop-type-constructor.js

+20-3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@
77
const utils = require('../utils')
88
const { isDef } = require('../utils')
99

10+
/**
11+
* @typedef {import('../utils').ComponentArrayProp} ComponentArrayProp
12+
* @typedef {import('../utils').ComponentObjectProp} ComponentObjectProp
13+
*/
14+
1015
// ------------------------------------------------------------------------------
1116
// Rule Definition
1217
// ------------------------------------------------------------------------------
@@ -76,8 +81,9 @@ module.exports = {
7681
)
7782
}
7883

79-
return utils.executeOnVueComponent(context, (obj) => {
80-
for (const prop of utils.getComponentProps(obj)) {
84+
/** @param {(ComponentArrayProp | ComponentObjectProp)[]} props */
85+
function verifyProps(props) {
86+
for (const prop of props) {
8187
if (!prop.value || prop.propName == null) {
8288
continue
8389
}
@@ -94,6 +100,17 @@ module.exports = {
94100
checkPropertyNode(prop.propName, typeProperty.value)
95101
}
96102
}
97-
})
103+
}
104+
105+
return utils.compositingVisitors(
106+
utils.defineScriptSetupVisitor(context, {
107+
onDefinePropsEnter(_node, props) {
108+
verifyProps(props)
109+
}
110+
}),
111+
utils.executeOnVueComponent(context, (obj) => {
112+
verifyProps(utils.getComponentProps(obj))
113+
})
114+
)
98115
}
99116
}

Diff for: lib/utils/index.js

+27-25
Original file line numberDiff line numberDiff line change
@@ -1095,34 +1095,36 @@ module.exports = {
10951095
return null
10961096
}
10971097

1098-
const definePropsMap = new Map()
1099-
/**
1100-
* @param {CallExpression} node
1101-
*/
1102-
scriptSetupVisitor.CallExpression = (node) => {
1103-
if (
1104-
inScriptSetup(node) &&
1105-
node.callee.type === 'Identifier' &&
1106-
node.callee.name === 'defineProps'
1107-
) {
1108-
/** @type {(ComponentArrayProp | ComponentObjectProp)[]} */
1109-
let props = []
1110-
if (node.arguments.length >= 1) {
1111-
const defNode = getObjectOrArray(node.arguments[0])
1112-
if (defNode) {
1113-
props = getComponentPropsFromDefine(defNode)
1098+
if (visitor.onDefinePropsEnter || visitor.onDefinePropsExit) {
1099+
const definePropsMap = new Map()
1100+
/**
1101+
* @param {CallExpression} node
1102+
*/
1103+
scriptSetupVisitor.CallExpression = (node) => {
1104+
if (
1105+
inScriptSetup(node) &&
1106+
node.callee.type === 'Identifier' &&
1107+
node.callee.name === 'defineProps'
1108+
) {
1109+
/** @type {(ComponentArrayProp | ComponentObjectProp)[]} */
1110+
let props = []
1111+
if (node.arguments.length >= 1) {
1112+
const defNode = getObjectOrArray(node.arguments[0])
1113+
if (defNode) {
1114+
props = getComponentPropsFromDefine(defNode)
1115+
}
11141116
}
1117+
definePropsMap.set(node, props)
1118+
callVisitor('onDefinePropsEnter', node, props)
11151119
}
1116-
definePropsMap.set(node, props)
1117-
callVisitor('onDefinePropsEnter', node, props)
1120+
callVisitor('CallExpression', node)
11181121
}
1119-
callVisitor('CallExpression', node)
1120-
}
1121-
scriptSetupVisitor['CallExpression:exit'] = (node) => {
1122-
callVisitor('CallExpression:exit', node)
1123-
if (definePropsMap.has(node)) {
1124-
callVisitor('onDefinePropsExit', node, definePropsMap.get(node))
1125-
definePropsMap.delete(node)
1122+
scriptSetupVisitor['CallExpression:exit'] = (node) => {
1123+
callVisitor('CallExpression:exit', node)
1124+
if (definePropsMap.has(node)) {
1125+
callVisitor('onDefinePropsExit', node, definePropsMap.get(node))
1126+
definePropsMap.delete(node)
1127+
}
11261128
}
11271129
}
11281130

Diff for: tests/lib/rules/require-prop-type-constructor.js

+30
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,36 @@ ruleTester.run('require-prop-type-constructor', rule, {
355355
line: 18
356356
}
357357
]
358+
},
359+
{
360+
filename: 'SomeComponent.vue',
361+
code: `
362+
<script setup>
363+
defineProps({
364+
a: {
365+
type: 'String',
366+
default: 'abc'
367+
},
368+
})
369+
</script>
370+
`,
371+
output: `
372+
<script setup>
373+
defineProps({
374+
a: {
375+
type: String,
376+
default: 'abc'
377+
},
378+
})
379+
</script>
380+
`,
381+
parser: require.resolve('vue-eslint-parser'),
382+
errors: [
383+
{
384+
message: 'The "a" property should be a constructor.',
385+
line: 5
386+
}
387+
]
358388
}
359389
]
360390
})

0 commit comments

Comments
 (0)