forked from lerna/lerna
/
get-changelog-config.js
98 lines (74 loc) · 3.28 KB
/
get-changelog-config.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
"use strict";
const conventionalChangelogPresetLoader = require("conventional-changelog-preset-loader");
const log = require("npmlog");
const npa = require("npm-package-arg");
const ValidationError = require("@lerna/validation-error");
module.exports = getChangelogConfig;
const cfgCache = new Map();
function resolveConfigPromise(presetPackageName, presetConfig) {
log.verbose("getChangelogConfig", "Attempting to resolve preset %j", presetPackageName);
const config = conventionalChangelogPresetLoader(presetConfig || presetPackageName);
log.info("getChangelogConfig", "Successfully resolved preset %j", presetPackageName);
return config;
}
function getChangelogConfig(changelogPreset = "conventional-changelog-angular", rootPath) {
const presetName = typeof changelogPreset === "string" ? changelogPreset : changelogPreset.name;
const presetConfig = typeof changelogPreset === "object" ? changelogPreset : null;
let config = cfgCache.get(presetName);
if (!config) {
let presetPackageName = presetName;
// https://github.com/npm/npm-package-arg#result-object
const parsed = npa(presetPackageName, rootPath);
log.verbose("getChangelogConfig", "using preset %j", presetPackageName);
log.silly("npa", parsed);
if (parsed.type === "directory") {
if (parsed.raw[0] === "@") {
// npa parses scoped subpath reference as a directory
parsed.name = parsed.raw;
parsed.scope = parsed.raw.substring(0, parsed.raw.indexOf("/"));
// un-scoped subpath shorthand handled in first catch block
} else {
presetPackageName = parsed.fetchSpec;
}
} else if (parsed.type === "git" && parsed.hosted && parsed.hosted.default === "shortcut") {
// probably a shorthand subpath, e.g. "foo/bar"
parsed.name = parsed.raw;
}
// Maybe it doesn't need an implicit 'conventional-changelog-' prefix?
try {
config = resolveConfigPromise(presetPackageName, presetConfig);
cfgCache.set(presetName, config);
// early exit, yay
return Promise.resolve(config);
} catch (err) {
log.verbose("getChangelogConfig", err.message);
log.info("getChangelogConfig", "Auto-prefixing conventional-changelog preset %j", presetName);
// probably a deep shorthand subpath :P
parsed.name = parsed.raw;
}
if (parsed.name.indexOf("conventional-changelog-") < 0) {
// implicit 'conventional-changelog-' prefix
const parts = parsed.name.split("/");
const start = parsed.scope ? 1 : 0;
// foo => conventional-changelog-foo
// @scope/foo => @scope/conventional-changelog-foo
parts.splice(start, 1, `conventional-changelog-${parts[start]}`);
// _technically_ supports 'foo/lib/bar.js', but that's gross
presetPackageName = parts.join("/");
}
try {
config = resolveConfigPromise(presetPackageName, presetConfig);
cfgCache.set(presetName, config);
} catch (err) {
log.warn("getChangelogConfig", err.message);
throw new ValidationError(
"EPRESET",
`Unable to load conventional-changelog preset '${presetName}'${
presetName !== presetPackageName ? ` (${presetPackageName})` : ""
}`
);
}
}
// the core presets are bloody Q.all() spreads
return Promise.resolve(config);
}