Skip to content

Commit 4a66d2e

Browse files
committed
feat: improve messages and accurate loc
1 parent b42646a commit 4a66d2e

File tree

2 files changed

+70
-26
lines changed

2 files changed

+70
-26
lines changed

lib/rules/require-default-export.js

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ module.exports = {
1717
fixable: null,
1818
schema: [],
1919
messages: {
20-
mustDefaultExport: 'The component must be the default export.'
20+
missing: 'Missing default export.',
21+
mustBeDefaultExport: 'Component must be the default export.'
2122
}
2223
},
2324
/** @param {RuleContext} context */
@@ -36,23 +37,32 @@ module.exports = {
3637
}
3738

3839
let hasDefaultExport = false
40+
let hasDefinedComponent = false
3941

40-
return {
41-
'Program > ExportDefaultDeclaration'() {
42-
hasDefaultExport = true
43-
},
44-
45-
/**
46-
* @param {Program} node
47-
*/
48-
'Program:exit'(node) {
49-
if (!hasDefaultExport && node.body.length > 0) {
50-
context.report({
51-
loc: { line: 1, column: 0 },
52-
messageId: 'mustDefaultExport'
53-
})
42+
return utils.compositingVisitors(
43+
utils.defineVueVisitor(context, {
44+
onVueObjectExit() {
45+
hasDefinedComponent = true
46+
}
47+
}),
48+
49+
{
50+
'Program > ExportDefaultDeclaration'() {
51+
hasDefaultExport = true
52+
},
53+
54+
/**
55+
* @param {Program} node
56+
*/
57+
'Program:exit'(node) {
58+
if (!hasDefaultExport && node.body.length > 0) {
59+
context.report({
60+
loc: node.tokens[node.tokens.length - 1].loc,
61+
messageId: hasDefinedComponent ? 'mustBeDefaultExport' : 'missing'
62+
})
63+
}
5464
}
5565
}
56-
}
66+
)
5767
}
5868
}

tests/lib/rules/require-default-export.js

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,11 @@ tester.run('require-default-export', rule, {
8686
`,
8787
errors: [
8888
{
89-
messageId: 'mustDefaultExport',
90-
line: 1
89+
messageId: 'missing',
90+
line: 4,
91+
endLine: 4,
92+
column: 7,
93+
endColumn: 16
9194
}
9295
]
9396
},
@@ -100,8 +103,11 @@ tester.run('require-default-export', rule, {
100103
`,
101104
errors: [
102105
{
103-
messageId: 'mustDefaultExport',
104-
line: 1
106+
messageId: 'missing',
107+
line: 4,
108+
endLine: 4,
109+
column: 7,
110+
endColumn: 16
105111
}
106112
]
107113
},
@@ -116,8 +122,11 @@ tester.run('require-default-export', rule, {
116122
`,
117123
errors: [
118124
{
119-
messageId: 'mustDefaultExport',
120-
line: 1
125+
messageId: 'missing',
126+
line: 6,
127+
endLine: 6,
128+
column: 7,
129+
endColumn: 16
121130
}
122131
]
123132
},
@@ -131,8 +140,11 @@ tester.run('require-default-export', rule, {
131140
`,
132141
errors: [
133142
{
134-
messageId: 'mustDefaultExport',
135-
line: 1
143+
messageId: 'missing',
144+
line: 5,
145+
endLine: 5,
146+
column: 7,
147+
endColumn: 16
136148
}
137149
]
138150
},
@@ -147,8 +159,30 @@ tester.run('require-default-export', rule, {
147159
`,
148160
errors: [
149161
{
150-
messageId: 'mustDefaultExport',
151-
line: 1
162+
messageId: 'mustBeDefaultExport',
163+
line: 6,
164+
endLine: 6,
165+
column: 7,
166+
endColumn: 16
167+
}
168+
]
169+
},
170+
{
171+
filename: 'test.vue',
172+
code: `
173+
<script>
174+
import Vue from 'vue';
175+
176+
const component = Vue.component('foo', {});
177+
</script>
178+
`,
179+
errors: [
180+
{
181+
messageId: 'mustBeDefaultExport',
182+
line: 6,
183+
endLine: 6,
184+
column: 7,
185+
endColumn: 16
152186
}
153187
]
154188
}

0 commit comments

Comments
 (0)