Skip to content

Commit c9dea58

Browse files
committed
feat(require-toggle-inside-transition): add additionalDirectives option (#2535)
1 parent 0fbe35e commit c9dea58

File tree

3 files changed

+87
-3
lines changed

3 files changed

+87
-3
lines changed

docs/rules/require-toggle-inside-transition.md

+36-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,42 @@ This rule reports elements inside `<transition>` that do not control the display
3333

3434
## :wrench: Options
3535

36-
Nothing.
36+
```json
37+
{
38+
"vue/require-toggle-inside-transition": ["error", {
39+
"additionalDirectives": []
40+
}]
41+
}
42+
```
43+
44+
- `additionalDirectives` (`string[]`) ... Custom directives which will satisfy this rule in addition to `v-show` and `v-if`. Should be added without the `v-` prefix.
45+
46+
### `additionalDirectives: ["dialog"]`
47+
48+
<eslint-code-block :rules="{'vue/require-toggle-inside-transition': ['error', {additionalDirectives: ['dialog']}]}">
49+
50+
```vue
51+
<template>
52+
<!-- ✓ GOOD -->
53+
<transition><div v-if="show" /></transition>
54+
<transition><div v-show="show" /></transition>
55+
<transition><dialog v-dialog="show" /></transition>
56+
<template>
57+
```
58+
59+
</eslint-code-block>
60+
61+
<eslint-code-block :rules="{'vue/require-toggle-inside-transition': ['error', {additionalDirectives: ['dialog']}]}">
62+
63+
```vue
64+
<template>
65+
<!-- ✗ BAD -->
66+
<transition><div /></transition>
67+
<transition><div v-custom="show" /></transition>
68+
<template>
69+
```
70+
71+
</eslint-code-block>
3772

3873
## :books: Further Reading
3974

lib/rules/require-toggle-inside-transition.js

+22-2
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,31 @@ module.exports = {
3030
url: 'https://eslint.vuejs.org/rules/require-toggle-inside-transition.html'
3131
},
3232
fixable: null,
33-
schema: [],
33+
schema: [
34+
{
35+
type: 'object',
36+
properties: {
37+
additionalDirectives: {
38+
type: 'array',
39+
items: {
40+
type: 'string'
41+
}
42+
}
43+
},
44+
additionalProperties: false
45+
}
46+
],
3447
messages: {
3548
expected:
3649
'The element inside `<transition>` is expected to have a `v-if` or `v-show` directive.'
3750
}
3851
},
3952
/** @param {RuleContext} context */
4053
create(context) {
54+
/** @type {Array<string>} */
55+
const additionalDirectives =
56+
(context.options[0] && context.options[0].additionalDirectives) || []
57+
4158
/**
4259
* Check if the given element has display control.
4360
* @param {VElement} element The element node to check.
@@ -61,7 +78,10 @@ module.exports = {
6178
element.name !== 'slot' &&
6279
!utils.hasDirective(element, 'if') &&
6380
!utils.hasDirective(element, 'show') &&
64-
!utils.hasDirective(element, 'bind', 'key')
81+
!utils.hasDirective(element, 'bind', 'key') &&
82+
!additionalDirectives.some((directive) =>
83+
utils.hasDirective(element, directive)
84+
)
6585
) {
6686
context.report({
6787
node: element.startTag,

tests/lib/rules/require-toggle-inside-transition.js

+29
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,15 @@ tester.run('require-toggle-inside-transition', rule, {
7777
{
7878
filename: 'test.vue',
7979
code: '<template><transition :appear="true"><div /></transition></template>'
80+
},
81+
{
82+
filename: 'test.vue',
83+
code: '<template><transition><dialog v-dialog="show" /></transition></template>',
84+
options: [
85+
{
86+
additionalDirectives: ['dialog']
87+
}
88+
]
8089
}
8190
],
8291
invalid: [
@@ -132,6 +141,26 @@ tester.run('require-toggle-inside-transition', rule, {
132141
filename: 'test.vue',
133142
code: '<template><transition @appear="isLoaded"><div /></transition></template>',
134143
errors: [{ messageId: 'expected' }]
144+
},
145+
{
146+
filename: 'test.vue',
147+
code: '<template><transition><dialog v-dialog="show" /></transition></template>',
148+
options: [
149+
{
150+
additionalDirectives: []
151+
}
152+
],
153+
errors: [{ messageId: 'expected' }]
154+
},
155+
{
156+
filename: 'test.vue',
157+
code: '<template><transition><div v-custom="show" /></transition></template>',
158+
options: [
159+
{
160+
additionalDirectives: ['dialog']
161+
}
162+
],
163+
errors: [{ messageId: 'expected' }]
135164
}
136165
]
137166
})

0 commit comments

Comments
 (0)