@@ -8,7 +8,7 @@ import versionMap from './versionMap.cjs'
8
8
const CREATE_ALIAS_SETTING_PLACEHOLDER = 'CREATE_ALIAS_SETTING_PLACEHOLDER'
9
9
export { CREATE_ALIAS_SETTING_PLACEHOLDER }
10
10
11
- function stringifyJS ( value , styleGuide ) {
11
+ function stringifyJS ( value , styleGuide , configFormat ) {
12
12
// eslint-disable-next-line no-shadow
13
13
const result = stringify ( value , ( val , indent , stringify , key ) => {
14
14
if ( key === 'CREATE_ALIAS_SETTING_PLACEHOLDER' ) {
@@ -18,6 +18,10 @@ function stringifyJS (value, styleGuide) {
18
18
return stringify ( val )
19
19
} , 2 )
20
20
21
+ if ( configFormat === 'flat' ) {
22
+ return result . replace ( 'CREATE_ALIAS_SETTING_PLACEHOLDER: ' , '...createAliasSetting' )
23
+ }
24
+
21
25
return result . replace (
22
26
'CREATE_ALIAS_SETTING_PLACEHOLDER: ' ,
23
27
`...require('@vue/eslint-config-${ styleGuide } /createAliasSetting')`
@@ -72,17 +76,15 @@ export default function createConfig ({
72
76
addDependency ( 'eslint' )
73
77
addDependency ( 'eslint-plugin-vue' )
74
78
75
- if ( configFormat === 'flat' ) {
76
- addDependency ( '@eslint/ eslintrc' )
77
- addDependency ( '@eslint/js' )
78
- } else if ( styleGuide !== 'default' || hasTypeScript || needsPrettier ) {
79
- addDependency ( ' @rushstack/eslint-patch' )
79
+ if (
80
+ configFormat === " eslintrc" &&
81
+ ( styleGuide !== "default" || hasTypeScript || needsPrettier )
82
+ ) {
83
+ addDependency ( " @rushstack/eslint-patch" ) ;
80
84
}
81
85
82
86
const language = hasTypeScript ? 'typescript' : 'javascript'
83
87
84
- const flatConfigExtends = [ ]
85
- const flatConfigImports = [ ]
86
88
const eslintrcConfig = {
87
89
root : true ,
88
90
extends : [
@@ -96,6 +98,20 @@ export default function createConfig ({
96
98
eslintrcConfig . extends . push ( name )
97
99
}
98
100
101
+ let needsFlatCompat = false
102
+ const flatConfigExtends = [ ]
103
+ const flatConfigImports = [ ]
104
+ flatConfigImports . push ( `import pluginVue from 'eslint-plugin-vue'` )
105
+ flatConfigExtends . push (
106
+ vueVersion . startsWith ( '2' )
107
+ ? `...pluginVue.configs['flat/vue2-essential']`
108
+ : `...pluginVue.configs['flat/essential']`
109
+ )
110
+
111
+ if ( configFormat === 'flat' && styleGuide === 'default' ) {
112
+ addDependency ( '@eslint/js' )
113
+ }
114
+
99
115
switch ( `${ styleGuide } -${ language } ` ) {
100
116
case 'default-javascript' :
101
117
eslintrcConfig . extends . push ( 'eslint:recommended' )
@@ -107,41 +123,53 @@ export default function createConfig ({
107
123
flatConfigImports . push ( `import js from '@eslint/js'` )
108
124
flatConfigExtends . push ( 'js.configs.recommended' )
109
125
addDependencyAndExtend ( '@vue/eslint-config-typescript' )
126
+ needsFlatCompat = true
110
127
flatConfigExtends . push ( `...compat.extends('@vue/eslint-config-typescript')` )
111
128
break
112
129
case 'airbnb-javascript' :
113
130
case 'standard-javascript' :
114
131
addDependencyAndExtend ( `@vue/eslint-config-${ styleGuide } ` )
132
+ needsFlatCompat = true
115
133
flatConfigExtends . push ( `...compat.extends('@vue/eslint-config-${ styleGuide } ')` )
116
134
break
117
135
case 'airbnb-typescript' :
118
136
case 'standard-typescript' :
119
137
addDependencyAndExtend ( `@vue/eslint-config-${ styleGuide } -with-typescript` )
138
+ needsFlatCompat = true
120
139
flatConfigExtends . push ( `...compat.extends('@vue/eslint-config-${ styleGuide } -with-typescript')` )
121
140
break
122
141
default :
123
142
throw new Error ( `unexpected combination of styleGuide and language: ${ styleGuide } -${ language } ` )
124
143
}
125
144
126
- flatConfigImports . push ( `import pluginVue from 'eslint-plugin-vue'` )
127
- flatConfigExtends . push (
128
- vueVersion . startsWith ( '2' )
129
- ? `...pluginVue.configs['flat/vue2-essential']`
130
- : `...pluginVue.configs['flat/essential']`
131
- )
132
-
133
145
deepMerge ( pkg . devDependencies , additionalDependencies )
134
146
deepMerge ( eslintrcConfig , additionalConfig )
135
147
148
+ if ( additionalConfig ?. extends ) {
149
+ needsFlatCompat = true
150
+ additionalConfig . extends . forEach ( ( pkgName ) => {
151
+ flatConfigExtends . push ( `...compat.extends('${ pkgName } ')` )
152
+ } )
153
+ }
154
+
136
155
const flatConfigEntry = {
137
156
files : filePatterns
138
157
}
139
- deepMerge ( flatConfigEntry , additionalConfig )
158
+ if ( additionalConfig ?. settings ?. [ CREATE_ALIAS_SETTING_PLACEHOLDER ] ) {
159
+ flatConfigImports . push (
160
+ `import createAliasSetting from '@vue/eslint-config-${ styleGuide } /createAliasSetting'`
161
+ )
162
+ flatConfigEntry . settings = {
163
+ [ CREATE_ALIAS_SETTING_PLACEHOLDER ] :
164
+ additionalConfig . settings [ CREATE_ALIAS_SETTING_PLACEHOLDER ]
165
+ }
166
+ }
140
167
141
168
if ( needsPrettier ) {
142
169
addDependency ( 'prettier' )
143
170
addDependency ( '@vue/eslint-config-prettier' )
144
171
eslintrcConfig . extends . push ( '@vue/eslint-config-prettier/skip-formatting' )
172
+ needsFlatCompat = true
145
173
flatConfigExtends . push ( `...compat.extends('@vue/eslint-config-prettier/skip-formatting')` )
146
174
}
147
175
@@ -174,27 +202,38 @@ export default function createConfig ({
174
202
175
203
// eslint.config.js | .eslintrc.cjs
176
204
if ( configFormat === 'flat' ) {
177
- files [ 'eslint.config.js' ] += "import path from 'node:path'\n"
178
- files [ 'eslint.config.js' ] += "import { fileURLToPath } from 'node:url'\n\n"
205
+ if ( needsFlatCompat ) {
206
+ files [ 'eslint.config.js' ] += "import path from 'node:path'\n"
207
+ files [ 'eslint.config.js' ] += "import { fileURLToPath } from 'node:url'\n\n"
208
+
209
+ addDependency ( '@eslint/eslintrc' )
210
+ files [ 'eslint.config.js' ] += "import { FlatCompat } from '@eslint/eslintrc'\n"
211
+ }
179
212
213
+ // imports
180
214
flatConfigImports . forEach ( ( pkgImport ) => {
181
215
files [ 'eslint.config.js' ] += `${ pkgImport } \n`
182
216
} )
183
217
files [ 'eslint.config.js' ] += '\n'
184
218
185
219
// neccesary for compatibility until all packages support flat config
186
- files [ 'eslint.config.js' ] += 'const __filename = fileURLToPath(import.meta.url)\n'
187
- files [ 'eslint.config.js' ] += 'const __dirname = path.dirname(__filename)\n'
188
- files [ 'eslint.config.js' ] += 'const compat = new FlatCompat({\n'
189
- files [ 'eslint.config.js' ] += ' baseDirectory: __dirname\n'
190
- files [ 'eslint.config.js' ] += '})\n\n'
220
+ if ( needsFlatCompat ) {
221
+ files [ 'eslint.config.js' ] += 'const __filename = fileURLToPath(import.meta.url)\n'
222
+ files [ 'eslint.config.js' ] += 'const __dirname = path.dirname(__filename)\n'
223
+ files [ 'eslint.config.js' ] += 'const compat = new FlatCompat({\n'
224
+ files [ 'eslint.config.js' ] += ' baseDirectory: __dirname'
225
+ if ( pkg . devDependencies [ '@vue/eslint-config-typescript' ] ) {
226
+ files [ 'eslint.config.js' ] += ',\n recommendedConfig: js.configs.recommended'
227
+ }
228
+ files [ 'eslint.config.js' ] += '\n})\n\n'
229
+ }
191
230
192
231
files [ 'eslint.config.js' ] += 'export default [\n'
193
232
flatConfigExtends . forEach ( ( usage ) => {
194
233
files [ 'eslint.config.js' ] += ` ${ usage } ,\n`
195
234
} )
196
235
197
- const [ , ...keep ] = stringifyJS ( [ flatConfigEntry ] , styleGuide ) . split ( '{' )
236
+ const [ , ...keep ] = stringifyJS ( [ flatConfigEntry ] , styleGuide , "flat" ) . split ( '{' )
198
237
files [ 'eslint.config.js' ] += ` {${ keep . join ( '{' ) } \n`
199
238
} else {
200
239
files [ '.eslintrc.cjs' ] += `module.exports = ${ stringifyJS ( eslintrcConfig , styleGuide ) } \n`
0 commit comments