Skip to content

Commit ecb041e

Browse files
committed
fix: execute dynamic configuration in get-configuration
This change contains * Move execute-rule to own file * Move resolve-extends to own file * Move dynamic configuration execution to get-configuration * Refactory dynamic configuration execution to be more generic
1 parent 9e83429 commit ecb041e

File tree

4 files changed

+71
-46
lines changed

4 files changed

+71
-46
lines changed

source/index.js

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,6 @@ export getMessages from './library/get-messages';
66
export getPreset from './library/get-preset';
77
export format from './library/format';
88

9-
async function executeRule(entry) {
10-
const [name, config] = entry;
11-
return typeof config === 'function' ?
12-
[name, await config()] :
13-
[name, await config];
14-
}
15-
169
export default async (message, options = {}) => {
1710
const {
1811
preset: {
@@ -24,19 +17,14 @@ export default async (message, options = {}) => {
2417
}
2518
} = options;
2619

20+
// parse the commit message
2721
const parsed = merge(
2822
{raw: message},
2923
parse(message, parserOptions)
3024
);
3125

32-
// execute wildcard rules
33-
const executedWildcards = await Promise.all(
34-
Object.entries(wildcards || {})
35-
.map(async entry => await executeRule(entry))
36-
);
37-
3826
// wildcard matches skip the linting
39-
const bails = executedWildcards
27+
const bails = Object.entries(wildcards)
4028
.filter(entry => {
4129
const [, pattern] = entry;
4230
return Array.isArray(pattern);
@@ -46,8 +34,9 @@ export default async (message, options = {}) => {
4634
const expression = new RegExp(...pattern);
4735
return parsed.header.match(expression);
4836
})
49-
.map(entry => entry[0])
37+
.map(entry => entry[0]);
5038

39+
// found a wildcard match, skip
5140
if (bails.length > 0) {
5241
return {
5342
valid: true,
@@ -58,14 +47,8 @@ export default async (message, options = {}) => {
5847
};
5948
}
6049

61-
// execute linting rules
62-
const executedRules = await Promise.all(
63-
Object.entries(rules || {})
64-
.map(async entry => await executeRule(entry))
65-
);
66-
67-
// validate against all rules
68-
const results = executedRules
50+
// validate against all rules
51+
const results = Object.entries(rules)
6952
.filter(entry => {
7053
const [, [level]] = entry;
7154
return level > 0;
@@ -89,7 +72,7 @@ export default async (message, options = {}) => {
8972
message
9073
};
9174
})
92-
.filter(Boolean)
75+
.filter(Boolean);
9376

9477
const errors = results.filter(result =>
9578
result.level > 1 && !result.valid);

source/library/execute-rule.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export default async entry => {
2+
const [name, config] = entry;
3+
return typeof config === 'function' ?
4+
[name, await config()] :
5+
[name, await config];
6+
};

source/library/get-configuration.js

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,54 @@
11
import {merge, pick} from 'lodash';
22
import rc from 'rc';
33

4+
import resolveExtends from './resolve-extends';
5+
import executeRule from './execute-rule';
6+
47
const defaults = {
58
extends: ['angular']
69
};
710

8-
// Resolve extend configs
9-
function resolveExtends(config, prefix = '', key = 'extends') {
10-
return Object.values(config[key] || [])
11-
.reduce((merged, extender) => {
12-
const name = [prefix, extender]
13-
.filter(String)
14-
.join('-');
15-
return merge(
16-
{},
17-
merged,
18-
resolveExtends(require(name))
19-
);
20-
}, config);
21-
}
11+
const defaultName = 'conventional-changelog-lint';
2212

23-
// Get linting config
24-
export default (name = 'conventional-changelog-lint', settings = {
13+
const defaultSettings = {
2514
prefix: 'conventional-changelog-lint-config'
26-
}, seed = {}) => {
15+
};
16+
17+
export default async (name = defaultName, settings = defaultSettings, seed = {}) => {
18+
// Merge passed config with file based options
2719
const config = merge(rc(name, settings.defaults), seed);
2820
const opts = merge({}, defaults, pick(config, 'extends'));
29-
return merge(
30-
{},
31-
resolveExtends(opts, settings.prefix),
32-
config
33-
);
21+
22+
// Resolve extends key
23+
const extended = resolveExtends(opts, settings.prefix);
24+
const preset = merge({}, extended, config);
25+
26+
// Execute rule config functions if needed
27+
const executed = await Promise.all(['rules', 'wildcards']
28+
.map(key => {
29+
return [key, preset[key]];
30+
})
31+
.map(async item => {
32+
const [key, value] = item;
33+
const executedValue = await Promise.all(
34+
Object.entries(value || {})
35+
.map(async entry => await executeRule(entry))
36+
);
37+
return [key, executedValue.reduce((registry, item) => {
38+
const [key, value] = item;
39+
return {
40+
...registry,
41+
[key]: value
42+
};
43+
}, {})];
44+
}));
45+
46+
// Merge executed config keys into preset
47+
return executed.reduce((registry, item) => {
48+
const [key, value] = item;
49+
return {
50+
...registry,
51+
[key]: value
52+
};
53+
}, preset);
3454
};

source/library/resolve-extends.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import {merge} from 'lodash';
2+
3+
// Resolve extend configs
4+
export default function resolveExtends(config, prefix = '', key = 'extends') {
5+
return Object.values(config[key] || [])
6+
.reduce((merged, extender) => {
7+
const name = [prefix, extender]
8+
.filter(String)
9+
.join('-');
10+
return merge(
11+
{},
12+
merged,
13+
resolveExtends(require(name))
14+
);
15+
}, config);
16+
}

0 commit comments

Comments
 (0)