@@ -188,41 +188,108 @@ test('respects cwd option', async () => {
188
188
} ) ;
189
189
} ) ;
190
190
191
- const mjsConfigFiles = isDynamicAwaitSupported ( )
192
- ? [ 'commitlint.config.mjs' , '.commitlintrc.mjs' ]
193
- : [ ] ;
191
+ describe . each ( [ [ 'basic' ] , [ 'extends' ] ] ) ( '%s config' , ( template ) => {
192
+ const isExtendsTemplate = template === 'extends' ;
194
193
195
- test . each (
196
- [
194
+ const configFiles = [
197
195
'commitlint.config.cjs' ,
198
196
'commitlint.config.js' ,
197
+ 'commitlint.config.mjs' ,
199
198
'package.json' ,
200
199
'.commitlintrc' ,
201
200
'.commitlintrc.cjs' ,
202
201
'.commitlintrc.js' ,
203
202
'.commitlintrc.json' ,
203
+ '.commitlintrc.mjs' ,
204
204
'.commitlintrc.yml' ,
205
205
'.commitlintrc.yaml' ,
206
- ...mjsConfigFiles ,
207
- ] . map ( ( configFile ) => [ configFile ] )
208
- ) ( 'recursive extends with %s' , async ( configFile ) => {
209
- const cwd = await gitBootstrap ( `fixtures/recursive-extends-js-template` ) ;
210
- const configPath = path . join ( __dirname , `../fixtures/config/${ configFile } ` ) ;
211
- const config = readFileSync ( configPath ) ;
212
-
213
- writeFileSync ( path . join ( cwd , configFile ) , config ) ;
214
-
215
- const actual = await load ( { } , { cwd} ) ;
216
-
217
- expect ( actual ) . toMatchObject ( {
218
- formatter : '@commitlint/format' ,
219
- extends : [ './first-extended' ] ,
220
- plugins : { } ,
221
- rules : {
222
- zero : [ 0 , 'never' ] ,
223
- one : [ 1 , 'always' ] ,
224
- two : [ 2 , 'never' ] ,
225
- } ,
206
+ ] ;
207
+
208
+ const configTestCases = [
209
+ ...configFiles
210
+ . filter ( ( filename ) => ! filename . endsWith ( '.mjs' ) )
211
+ . map ( ( filename ) => ( { filename, isEsm : false } ) ) ,
212
+ ...configFiles
213
+ . filter ( ( filename ) =>
214
+ [ '.mjs' , '.js' ] . some ( ( ext ) => filename . endsWith ( ext ) )
215
+ )
216
+ . map ( ( filename ) => ( { filename, isEsm : true } ) ) ,
217
+ ] ;
218
+
219
+ const getConfigContents = ( {
220
+ filename,
221
+ isEsm,
222
+ } ) : string | NodeJS . ArrayBufferView => {
223
+ if ( filename === 'package.json' ) {
224
+ const configPath = path . join (
225
+ __dirname ,
226
+ `../fixtures/${ template } -config/.commitlintrc.json`
227
+ ) ;
228
+ const commitlint = JSON . parse (
229
+ readFileSync ( configPath , { encoding : 'utf-8' } )
230
+ ) ;
231
+ return JSON . stringify ( { commitlint} ) ;
232
+ } else {
233
+ const filePath = [ '..' , 'fixtures' , `${ template } -config` , filename ] ;
234
+
235
+ if ( isEsm ) {
236
+ filePath . splice ( 3 , 0 , 'esm' ) ;
237
+ }
238
+
239
+ const configPath = path . join ( __dirname , filePath . join ( '/' ) ) ;
240
+ return readFileSync ( configPath ) ;
241
+ }
242
+ } ;
243
+
244
+ const esmBootstrap = ( cwd : string ) => {
245
+ const packageJsonPath = path . join ( cwd , 'package.json' ) ;
246
+ const packageJSON = JSON . parse (
247
+ readFileSync ( packageJsonPath , { encoding : 'utf-8' } )
248
+ ) ;
249
+
250
+ writeFileSync (
251
+ packageJsonPath ,
252
+ JSON . stringify ( {
253
+ ...packageJSON ,
254
+ type : 'module' ,
255
+ } )
256
+ ) ;
257
+ } ;
258
+
259
+ const templateFolder = [ template , isExtendsTemplate ? 'js' : '' , 'template' ]
260
+ . filter ( ( elem ) => elem )
261
+ . join ( '-' ) ;
262
+
263
+ it . each (
264
+ configTestCases
265
+ // Skip ESM tests for the extends suite until resolve-extends supports ESM
266
+ . filter ( ( { isEsm} ) => template !== 'extends' || ! isEsm )
267
+ // Skip ESM tests if dynamic await is not supported; Jest will crash with a seg fault error
268
+ . filter ( ( { isEsm} ) => isDynamicAwaitSupported ( ) || ! isEsm )
269
+ ) ( '$filename, ESM: $isEsm' , async ( { filename, isEsm} ) => {
270
+ const cwd = await gitBootstrap ( `fixtures/${ templateFolder } ` ) ;
271
+
272
+ if ( isEsm ) {
273
+ esmBootstrap ( cwd ) ;
274
+ }
275
+
276
+ writeFileSync (
277
+ path . join ( cwd , filename ) ,
278
+ getConfigContents ( { filename, isEsm} )
279
+ ) ;
280
+
281
+ const actual = await load ( { } , { cwd} ) ;
282
+
283
+ expect ( actual ) . toMatchObject ( {
284
+ formatter : '@commitlint/format' ,
285
+ extends : isExtendsTemplate ? [ './first-extended' ] : [ ] ,
286
+ plugins : { } ,
287
+ rules : {
288
+ zero : [ 0 , 'never' ] ,
289
+ one : [ 1 , 'always' ] ,
290
+ two : [ 2 , 'never' ] ,
291
+ } ,
292
+ } ) ;
226
293
} ) ;
227
294
} ) ;
228
295
0 commit comments