Skip to content

Commit f93892f

Browse files
authored
Update vue/prop-name-casing rule to support <script setup> (#1544)
* Update `vue/prop-name-casing` rule to support `<script setup>` * fix for test on node v8
1 parent e495132 commit f93892f

File tree

2 files changed

+125
-4
lines changed

2 files changed

+125
-4
lines changed

lib/rules/prop-name-casing.js

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@ const utils = require('../utils')
88
const casing = require('../utils/casing')
99
const allowedCaseOptions = ['camelCase', 'snake_case']
1010

11+
/**
12+
* @typedef {import('../utils').ComponentArrayProp} ComponentArrayProp
13+
* @typedef {import('../utils').ComponentObjectProp} ComponentObjectProp
14+
* @typedef {import('../utils').ComponentTypeProp} ComponentTypeProp
15+
*/
16+
1117
// ------------------------------------------------------------------------------
1218
// Rule Definition
1319
// ------------------------------------------------------------------------------
@@ -22,8 +28,11 @@ function create(context) {
2228
// Public
2329
// ----------------------------------------------------------------------
2430

25-
return utils.executeOnVue(context, (obj) => {
26-
for (const item of utils.getComponentProps(obj)) {
31+
/**
32+
* @param {(ComponentArrayProp | ComponentObjectProp | ComponentTypeProp)[]} props
33+
*/
34+
function processProps(props) {
35+
for (const item of props) {
2736
const propName = item.propName
2837
if (propName == null) {
2938
continue
@@ -39,7 +48,17 @@ function create(context) {
3948
})
4049
}
4150
}
42-
})
51+
}
52+
return utils.compositingVisitors(
53+
utils.defineScriptSetupVisitor(context, {
54+
onDefinePropsEnter(_node, props) {
55+
processProps(props)
56+
}
57+
}),
58+
utils.executeOnVue(context, (obj) => {
59+
processProps(utils.getComponentProps(obj))
60+
})
61+
)
4362
}
4463

4564
// ------------------------------------------------------------------------------

tests/lib/rules/prop-name-casing.js

Lines changed: 103 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
// Requirements
99
// ------------------------------------------------------------------------------
1010

11+
const semver = require('semver')
1112
const rule = require('../../../lib/rules/prop-name-casing')
1213
const RuleTester = require('eslint').RuleTester
1314

@@ -322,6 +323,44 @@ ruleTester.run('prop-name-casing', rule, {
322323
`,
323324
options: ['snake_case'],
324325
parserOptions
326+
},
327+
{
328+
filename: 'test.vue',
329+
code: `
330+
<script setup>
331+
defineProps({
332+
greetingText: String
333+
})
334+
</script>
335+
`,
336+
parser: require.resolve('vue-eslint-parser'),
337+
parserOptions
338+
},
339+
{
340+
filename: 'test.vue',
341+
code: `
342+
<script setup>
343+
defineProps(['greetingText'])
344+
</script>
345+
`,
346+
parser: require.resolve('vue-eslint-parser'),
347+
parserOptions
348+
},
349+
{
350+
filename: 'test.vue',
351+
code: `
352+
<script setup lang="ts">
353+
interface Props {
354+
greetingText: number
355+
}
356+
defineProps<Props>()
357+
</script>
358+
`,
359+
parser: require.resolve('vue-eslint-parser'),
360+
parserOptions: {
361+
...parserOptions,
362+
parser: require.resolve('@typescript-eslint/parser')
363+
}
325364
}
326365
],
327366

@@ -580,6 +619,69 @@ ruleTester.run('prop-name-casing', rule, {
580619
`,
581620
parserOptions,
582621
errors: ['Prop "/greeting-text/" is not in camelCase.']
583-
}
622+
},
623+
{
624+
filename: 'test.vue',
625+
code: `
626+
<script setup>
627+
defineProps({
628+
greeting_text: String
629+
})
630+
</script>
631+
`,
632+
parser: require.resolve('vue-eslint-parser'),
633+
parserOptions,
634+
errors: [
635+
{
636+
message: 'Prop "greeting_text" is not in camelCase.',
637+
line: 4
638+
}
639+
]
640+
},
641+
{
642+
filename: 'test.vue',
643+
code: `
644+
<script setup>
645+
defineProps(['greeting_text'])
646+
</script>
647+
`,
648+
parser: require.resolve('vue-eslint-parser'),
649+
parserOptions,
650+
errors: [
651+
{
652+
message: 'Prop "greeting_text" is not in camelCase.',
653+
line: 3
654+
}
655+
]
656+
},
657+
...(semver.lt(
658+
require('@typescript-eslint/parser/package.json').version,
659+
'4.0.0'
660+
)
661+
? []
662+
: [
663+
{
664+
filename: 'test.vue',
665+
code: `
666+
<script setup lang="ts">
667+
interface Props {
668+
greeting_text: number
669+
}
670+
defineProps<Props>()
671+
</script>
672+
`,
673+
parser: require.resolve('vue-eslint-parser'),
674+
parserOptions: {
675+
...parserOptions,
676+
parser: require.resolve('@typescript-eslint/parser')
677+
},
678+
errors: [
679+
{
680+
message: 'Prop "greeting_text" is not in camelCase.',
681+
line: 4
682+
}
683+
]
684+
}
685+
])
584686
]
585687
})

0 commit comments

Comments
 (0)