@@ -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,14 +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
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
36
37
37
config . parserPreset = {
38
38
name : config . parserPreset ,
39
39
path : resolvedParserPreset ,
40
- parserOpts : ( await require ( resolvedParserPreset ) ) . parserOpts
40
+ parserOpts : require ( resolvedParserPreset )
41
41
} ;
42
42
}
43
43
@@ -49,14 +49,13 @@ export default async (seed = {}, options = {cwd: process.cwd()}) => {
49
49
} ) ;
50
50
51
51
const preset = valid ( mergeWith ( extended , config , w ) ) ;
52
- // Await parser-preset if applicable
53
- if (
54
- typeof preset . parserPreset === 'object' &&
55
- typeof preset . parserPreset . parserOpts === 'object' &&
56
- typeof preset . parserPreset . parserOpts . then === 'function'
57
- ) {
58
- preset . parserPreset . parserOpts = ( await preset . parserPreset
59
- . parserOpts ) . parserOpts ;
52
+
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
+ ) ;
60
59
}
61
60
62
61
// Resolve config-relative formatter module
@@ -117,3 +116,41 @@ async function loadConfig(cwd, configPath) {
117
116
118
117
return { } ;
119
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