Skip to content

Commit 366977e

Browse files
committed
Fix vuejs#1819: Enforce order between script and script setup
1 parent 8f09420 commit 366977e

File tree

3 files changed

+42
-11
lines changed

3 files changed

+42
-11
lines changed

docs/rules/component-tags-order.md

+16-9
Original file line numberDiff line numberDiff line change
@@ -14,27 +14,28 @@ since: v6.1.0
1414

1515
## :book: Rule Details
1616

17-
This rule warns about the order of the `<script>`, `<template>` & `<style>` tags.
17+
This rule warns about the order of the `<script>`, `<script setup>`, `<template>` & `<style>` tags.
1818

1919
## :wrench: Options
2020

2121
```json
2222
{
2323
"vue/component-tags-order": ["error", {
24-
"order": [ [ "script", "template" ], "style" ]
24+
"order": [ [ "script", "script/setup", "template" ], "style" ]
2525
}]
2626
}
2727
```
2828

29-
- `order` (`(string|string[])[]`) ... The order of top-level element names. default `[ [ "script", "template" ], "style" ]`.
29+
- `order` (`(string|string[])[]`) ... The order of top-level element names. default `[ [ "script", "script/setup", "template" ], "style" ]`.
3030

31-
### `{ "order": [ [ "script", "template" ], "style" ] }` (default)
31+
### `{ "order": [ [ "script", "script/setup", "template" ], "style" ] }` (default)
3232

3333
<eslint-code-block fix :rules="{'vue/component-tags-order': ['error']}">
3434

3535
```vue
3636
<!-- ✓ GOOD -->
3737
<script>/* ... */</script>
38+
<script setup>/* ... */</script>
3839
<template>...</template>
3940
<style>/* ... */</style>
4041
```
@@ -47,6 +48,7 @@ This rule warns about the order of the `<script>`, `<template>` & `<style>` tags
4748
<!-- ✓ GOOD -->
4849
<template>...</template>
4950
<script>/* ... */</script>
51+
<script setup>/* ... */</script>
5052
<style>/* ... */</style>
5153
```
5254

@@ -57,6 +59,7 @@ This rule warns about the order of the `<script>`, `<template>` & `<style>` tags
5759
```vue
5860
<!-- ✗ BAD -->
5961
<style>/* ... */</style>
62+
<script setup>/* ... */</script>
6063
<script>/* ... */</script>
6164
<template>...</template>
6265
```
@@ -65,48 +68,52 @@ This rule warns about the order of the `<script>`, `<template>` & `<style>` tags
6568

6669
### `{ "order": ["template", "script", "style"] }`
6770

68-
<eslint-code-block fix :rules="{'vue/component-tags-order': ['error', { 'order': ['template', 'script', 'style'] }]}">
71+
<eslint-code-block fix :rules="{'vue/component-tags-order': ['error', { 'order': ['template', 'script', 'script/setup', 'style'] }]}">
6972

7073
```vue
7174
<!-- ✓ GOOD -->
7275
<template>...</template>
76+
<script setup>/* ... */</script>
7377
<script>/* ... */</script>
7478
<style>/* ... */</style>
7579
```
7680

7781
</eslint-code-block>
7882

79-
<eslint-code-block fix :rules="{'vue/component-tags-order': ['error', { 'order': ['template', 'script', 'style'] }]}">
83+
<eslint-code-block fix :rules="{'vue/component-tags-order': ['error', { 'order': ['template', 'script', 'script/setup', 'style'] }]}">
8084

8185
```vue
8286
<!-- ✗ BAD -->
87+
<script setup>/* ... */</script>
8388
<script>/* ... */</script>
8489
<template>...</template>
8590
<style>/* ... */</style>
8691
```
8792

8893
</eslint-code-block>
8994

90-
### `{ "order": ["docs", "template", "script", "style"] }`
95+
### `{ "order": ["docs", "template", "script", "script/setup", "style"] }`
9196

92-
<eslint-code-block fix :rules="{'vue/component-tags-order': ['error', { 'order': ['docs', 'template', 'script', 'style'] }]}">
97+
<eslint-code-block fix :rules="{'vue/component-tags-order': ['error', { 'order': ['docs', 'template', 'script', 'script/setup', 'style'] }]}">
9398

9499
```vue
95100
<!-- ✓ GOOD -->
96101
<docs> documentation </docs>
97102
<template>...</template>
98103
<script>/* ... */</script>
104+
<script setup>/* ... */</script>
99105
<style>/* ... */</style>
100106
```
101107

102108
</eslint-code-block>
103109

104-
<eslint-code-block fix :rules="{'vue/component-tags-order': ['error', { 'order': ['docs', 'template', 'script', 'style'] }]}">
110+
<eslint-code-block fix :rules="{'vue/component-tags-order': ['error', { 'order': ['docs', 'template', 'script', 'script/setup', 'style'] }]}">
105111

106112
```vue
107113
<!-- ✗ BAD -->
108114
<template>...</template>
109115
<script>/* ... */</script>
116+
<script setup>/* ... */</script>
110117
<docs> documentation </docs>
111118
<style>/* ... */</style>
112119
```

lib/rules/component-tags-order.js

+14-2
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,12 @@ module.exports = {
8686
}
8787
return []
8888
}
89+
/**
90+
* @param {VElement} element
91+
*/
92+
function isSetupScript(element) {
93+
return element.name === 'script' && utils.getAttribute(element, 'setup')
94+
}
8995

9096
return {
9197
Program(node) {
@@ -101,6 +107,12 @@ module.exports = {
101107
}
102108
const firstUnordered = elements
103109
.slice(0, index)
110+
.map((e) => {
111+
return {
112+
element: e,
113+
name: isSetupScript(e) ? 'script/setup' : e.name
114+
}
115+
})
104116
.filter((e) => expectedIndex < getOrderPosition(e.name))
105117
.sort(
106118
(e1, e2) => getOrderPosition(e1.name) - getOrderPosition(e2.name)
@@ -113,12 +125,12 @@ module.exports = {
113125
data: {
114126
name: element.name,
115127
firstUnorderedName: firstUnordered.name,
116-
line: firstUnordered.loc.start.line
128+
line: firstUnordered.element.loc.start.line
117129
},
118130
*fix(fixer) {
119131
// insert element before firstUnordered
120132
const fixedElements = elements.flatMap((it) => {
121-
if (it === firstUnordered) {
133+
if (it === firstUnordered.element) {
122134
return [element, it]
123135
} else if (it === element) {
124136
return []

tests/lib/rules/component-tags-order.js

+12
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ tester.run('component-tags-order', rule, {
5050
'<template></template><script></script><docs></docs><style></style>',
5151
'<script></script><template></template>',
5252
'<template></template><script></script>',
53+
'<script setup></script><script></script>',
54+
'<docs></docs><template></template><script></script><script setup></script><style></style>',
5355
`
5456
<template>
5557
</template>
@@ -102,6 +104,16 @@ tester.run('component-tags-order', rule, {
102104
output: null,
103105
options: [{ order: ['docs', 'script', 'template', 'style'] }]
104106
},
107+
{
108+
code: '<script setup></script><script></script><template></template><style></style>',
109+
output: null,
110+
options: [{ order: ['script/setup', 'script', 'template', 'style'] }]
111+
},
112+
{
113+
code: '<template></template><script setup></script><script></script><style></style>',
114+
output: null,
115+
options: [{ order: [['script/setup', 'script', 'template'], 'style'] }]
116+
},
105117
{
106118
code: '<template></template><docs></docs><script></script><style></style>',
107119
output: null,

0 commit comments

Comments
 (0)