@@ -2,7 +2,7 @@ import path from 'path';
2
2
import executeRule from '@commitlint/execute-rule' ;
3
3
import resolveExtends from '@commitlint/resolve-extends' ;
4
4
import cosmiconfig from 'cosmiconfig' ;
5
- import { toPairs , merge , mergeWith , pick } from 'lodash' ;
5
+ import { toPairs , merge , mergeWith , pick , startsWith } from 'lodash' ;
6
6
import resolveFrom from 'resolve-from' ;
7
7
import loadPlugin from './utils/loadPlugin' ;
8
8
@@ -30,20 +30,14 @@ export default async (seed = {}, options = {cwd: process.cwd()}) => {
30
30
pick ( config , 'extends' , 'plugins' , 'ignores' , 'defaultIgnores' )
31
31
) ;
32
32
33
- // Resolve parserPreset key from flat-non-extended config
33
+ // Resolve parserPreset key when overwritten by main config
34
34
if ( typeof config . parserPreset === 'string' ) {
35
35
const resolvedParserPreset = resolveFrom ( base , config . parserPreset ) ;
36
- let resolvedParserConfig = await require ( resolvedParserPreset ) ;
37
-
38
- // Resolve loaded parser preset factory
39
- if ( typeof resolvedParserConfig === 'function' ) {
40
- resolvedParserConfig = await resolvedParserConfig ( ) ;
41
- }
42
36
43
37
config . parserPreset = {
44
38
name : config . parserPreset ,
45
39
path : resolvedParserPreset ,
46
- parserOpts : resolvedParserConfig . parserOpts
40
+ parserOpts : require ( resolvedParserPreset )
47
41
} ;
48
42
}
49
43
@@ -55,20 +49,13 @@ export default async (seed = {}, options = {cwd: process.cwd()}) => {
55
49
} ) ;
56
50
57
51
const preset = valid ( mergeWith ( extended , config , w ) ) ;
58
- // Await parser-preset if applicable
59
- if (
60
- typeof preset . parserPreset === 'object' &&
61
- typeof preset . parserPreset . parserOpts === 'object' &&
62
- typeof preset . parserPreset . parserOpts . then === 'function'
63
- ) {
64
- let parserPreset = await preset . parserPreset . parserOpts ;
65
52
66
- // Resolve loaded parser preset factory from extended config
67
- if ( typeof parserPreset === 'function ' ) {
68
- parserPreset = await parserPreset ( ) ;
69
- }
70
-
71
- preset . parserPreset . parserOpts = parserPreset . parserOpts ;
53
+ // Resolve parser-opts from preset
54
+ if ( typeof preset . parserPreset === 'object ' ) {
55
+ preset . parserPreset . parserOpts = await loadParserOpts (
56
+ preset . parserPreset . name ,
57
+ preset . parserPreset
58
+ ) ;
72
59
}
73
60
74
61
// Resolve config-relative formatter module
@@ -129,3 +116,41 @@ async function loadConfig(cwd, configPath) {
129
116
130
117
return { } ;
131
118
}
119
+
120
+ async function loadParserOpts ( parserName , pendingParser ) {
121
+ // Await for the module, loaded with require
122
+ const parser = await pendingParser ;
123
+
124
+ // Await parser opts if applicable
125
+ if (
126
+ typeof parser === 'object' &&
127
+ typeof parser . parserOpts === 'object' &&
128
+ typeof parser . parserOpts . then === 'function'
129
+ ) {
130
+ return ( await parser . parserOpts ) . parserOpts ;
131
+ }
132
+
133
+ // Create parser opts from factory
134
+ if (
135
+ typeof parser === 'object' &&
136
+ typeof parser . parserOpts === 'function' &&
137
+ startsWith ( parserName , 'conventional-changelog-' )
138
+ ) {
139
+ return await new Promise ( resolve => {
140
+ parser . parserOpts ( ( _ , opts ) => {
141
+ resolve ( opts . parserOpts ) ;
142
+ } ) ;
143
+ } ) ;
144
+ }
145
+
146
+ // Pull nested paserOpts, might happen if overwritten with a module in main config
147
+ if (
148
+ typeof parser === 'object' &&
149
+ typeof parser . parserOpts === 'object' &&
150
+ typeof parser . parserOpts . parserOpts === 'object'
151
+ ) {
152
+ return parser . parserOpts . parserOpts ;
153
+ }
154
+
155
+ return parser . parserOpts ;
156
+ }
0 commit comments