Skip to content

Commit c705cd4

Browse files
committed
fix(load): add support for factory-callback parser presets
1 parent dc0f43c commit c705cd4

File tree

1 file changed

+48
-11
lines changed

1 file changed

+48
-11
lines changed

@commitlint/load/src/index.js

+48-11
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import path from 'path';
22
import executeRule from '@commitlint/execute-rule';
33
import resolveExtends from '@commitlint/resolve-extends';
44
import cosmiconfig from 'cosmiconfig';
5-
import {toPairs, merge, mergeWith, pick} from 'lodash';
5+
import {toPairs, merge, mergeWith, pick, startsWith} from 'lodash';
66
import resolveFrom from 'resolve-from';
77
import loadPlugin from './utils/loadPlugin';
88

@@ -30,14 +30,14 @@ export default async (seed = {}, options = {cwd: process.cwd()}) => {
3030
pick(config, 'extends', 'plugins', 'ignores', 'defaultIgnores')
3131
);
3232

33-
// Resolve parserPreset key
33+
// Resolve parserPreset key when overwritten by main config
3434
if (typeof config.parserPreset === 'string') {
3535
const resolvedParserPreset = resolveFrom(base, config.parserPreset);
3636

3737
config.parserPreset = {
3838
name: config.parserPreset,
3939
path: resolvedParserPreset,
40-
parserOpts: (await require(resolvedParserPreset)).parserOpts
40+
parserOpts: require(resolvedParserPreset)
4141
};
4242
}
4343

@@ -49,14 +49,13 @@ export default async (seed = {}, options = {cwd: process.cwd()}) => {
4949
});
5050

5151
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+
);
6059
}
6160

6261
// Resolve config-relative formatter module
@@ -117,3 +116,41 @@ async function loadConfig(cwd, configPath) {
117116

118117
return {};
119118
}
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

Comments
 (0)