forked from release-it/conventional-changelog
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
97 lines (84 loc) · 2.8 KB
/
index.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
const { EOL } = require('os');
const fs = require('fs');
const { Plugin } = require('release-it');
const conventionalRecommendedBump = require('conventional-recommended-bump');
const conventionalChangelog = require('conventional-changelog');
const semver = require('semver');
const concat = require('concat-stream');
const prependFile = require('prepend-file');
class ConventionalChangelog extends Plugin {
static disablePlugin() {
return 'version';
}
getIncrementedVersion({ increment, latestVersion, isPreRelease, preReleaseId }) {
this.debug({ increment, latestVersion, isPreRelease, preReleaseId });
return new Promise((resolve, reject) =>
conventionalRecommendedBump(this.options, (err, result) => {
this.debug({ err, result });
if (err) return reject(err);
let { releaseType } = result;
if(increment) {
this.log.warn(`Recommended bump is "${releaseType}", but is overridden with "${increment}".`)
releaseType = increment;
}
if(increment && semver.valid(increment)) {
resolve(increment);
} else if (releaseType) {
const type = isPreRelease ? `pre${releaseType}` : releaseType;
resolve(semver.inc(latestVersion, type, preReleaseId));
} else {
resolve(null);
}
})
);
}
getChangelogStream(options = {}) {
return conventionalChangelog(Object.assign(options, this.options), null, {
debug: this.config.isDebug ? this.debug : null
});
}
getChangelog(options) {
return new Promise((resolve, reject) => {
const resolver = result => resolve(result.toString().trim());
const changelogStream = this.getChangelogStream(options);
changelogStream.pipe(concat(resolver));
changelogStream.on('error', reject);
});
}
async writeChangelog() {
const { infile } = this.options;
let { changelog } = this.config.getContext();
let hasInfile = false;
try {
fs.accessSync(infile);
hasInfile = true;
} catch (err) {
this.debug(err);
}
if (!hasInfile) {
changelog = await this.getChangelog({ releaseCount: 0 });
this.debug({ changelog });
}
await new Promise((resolve, reject) =>
prependFile(infile, changelog + EOL + EOL, err => {
if (err) return reject(err);
resolve();
})
);
if (!hasInfile) {
await this.exec(`git add ${infile}`);
}
}
async beforeRelease() {
const { infile } = this.options;
const { isDryRun } = this.global;
const changelog = await this.getChangelog();
this.debug({ changelog });
this.config.setContext({ changelog });
this.log.exec(`Writing changelog to ${infile}`, isDryRun);
if (infile && !isDryRun) {
await this.writeChangelog();
}
}
}
module.exports = ConventionalChangelog;