|
1 | 1 | import path from 'path';
|
2 |
| -import {entries, merge, mergeWith, pick} from 'lodash'; |
3 |
| -import rc from 'rc'; |
4 | 2 | import cosmiconfig from 'cosmiconfig';
|
| 3 | +import {entries, merge, mergeWith, pick} from 'lodash'; |
5 | 4 | import resolveFrom from 'resolve-from';
|
6 |
| -import up from 'find-up'; |
7 | 5 |
|
8 |
| -import resolveExtends from './library/resolve-extends'; |
9 | 6 | import executeRule from './library/execute-rule';
|
| 7 | +import resolveExtends from './library/resolve-extends'; |
| 8 | +import toplevel from './library/toplevel'; |
10 | 9 |
|
11 | 10 | const w = (a, b) => (Array.isArray(b) ? b : undefined);
|
12 | 11 | const valid = input => pick(input, 'extends', 'rules', 'parserPreset');
|
13 | 12 |
|
14 |
| -export default async (seed = {}) => { |
15 |
| - // Obtain config from .rc files |
16 |
| - const raw = await file(); |
| 13 | +export default async (seed = {}, options = {cwd: ''}) => { |
| 14 | + const explorer = cosmiconfig('commitlint', { |
| 15 | + rcExtensions: true, |
| 16 | + stopDir: await toplevel(options.cwd) |
| 17 | + }); |
| 18 | + |
| 19 | + const raw = (await explorer.load(options.cwd)) || {}; |
| 20 | + const base = raw.filepath ? path.dirname(raw.filepath) : options.cwd; |
| 21 | + |
17 | 22 | // Merge passed config with file based options
|
18 |
| - const config = valid(merge(raw, seed)); |
| 23 | + const config = valid(merge(raw.config, seed)); |
19 | 24 | const opts = merge({extends: [], rules: {}}, pick(config, 'extends'));
|
20 | 25 |
|
21 | 26 | // Resolve parserPreset key
|
22 | 27 | if (typeof config.parserPreset === 'string') {
|
23 |
| - const resolvedParserPreset = resolveFrom( |
24 |
| - process.cwd(), |
25 |
| - config.parserPreset |
26 |
| - ); |
| 28 | + const resolvedParserPreset = resolveFrom(base, config.parserPreset); |
27 | 29 |
|
28 | 30 | config.parserPreset = {
|
29 | 31 | name: config.parserPreset,
|
30 |
| - path: `./${path.posix.relative(process.cwd(), resolvedParserPreset)}` |
31 |
| - .split(path.sep) |
32 |
| - .join('/'), |
| 32 | + path: resolvedParserPreset, |
33 | 33 | opts: require(resolvedParserPreset)
|
34 | 34 | };
|
35 | 35 | }
|
36 | 36 |
|
37 | 37 | // Resolve extends key
|
38 | 38 | const extended = resolveExtends(opts, {
|
39 | 39 | prefix: 'commitlint-config',
|
40 |
| - cwd: raw.config ? path.dirname(raw.config) : process.cwd(), |
| 40 | + cwd: base, |
41 | 41 | parserPreset: config.parserPreset
|
42 | 42 | });
|
43 | 43 |
|
@@ -80,49 +80,3 @@ export default async (seed = {}) => {
|
80 | 80 | return registry;
|
81 | 81 | }, preset);
|
82 | 82 | };
|
83 |
| - |
84 |
| -async function file() { |
85 |
| - const legacy = rc('conventional-changelog-lint'); |
86 |
| - const legacyFound = typeof legacy.config === 'string'; |
87 |
| - const explorer = cosmiconfig('commitlint', { |
88 |
| - rcExtensions: true, |
89 |
| - stopDir: await toplevel() |
90 |
| - }); |
91 |
| - const config = await explorer.load('.'); |
92 |
| - |
93 |
| - if (legacyFound && !config) { |
94 |
| - console.warn( |
95 |
| - `Using legacy ${path.relative( |
96 |
| - process.cwd(), |
97 |
| - legacy.config |
98 |
| - )}. Rename to commitlint.config.js to silence this warning.` |
99 |
| - ); |
100 |
| - } |
101 |
| - |
102 |
| - if (legacyFound && config) { |
103 |
| - console.warn( |
104 |
| - `Ignored legacy ${path.relative( |
105 |
| - process.cwd(), |
106 |
| - legacy.config |
107 |
| - )} as commitlint.config.js superseeds it. Remove .conventional-changelog-lintrc to silence this warning.` |
108 |
| - ); |
109 |
| - } |
110 |
| - |
111 |
| - if (config) { |
112 |
| - return config.config; |
113 |
| - } |
114 |
| - |
115 |
| - return legacy; |
116 |
| -} |
117 |
| - |
118 |
| -// Find the next git root |
119 |
| -// (start: string) => Promise<string | null> |
120 |
| -async function toplevel(cwd = process.cwd()) { |
121 |
| - const found = await up('.git', {cwd}); |
122 |
| - |
123 |
| - if (typeof found !== 'string') { |
124 |
| - return found; |
125 |
| - } |
126 |
| - |
127 |
| - return path.join(found, '..'); |
128 |
| -} |
0 commit comments