/
release-prepare.js
129 lines (108 loc) · 3.78 KB
/
release-prepare.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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/* eslint no-console-log:0 no-alert:0 */
import {exec} from 'child_process';
import gulp from 'gulp';
import {merge, map, readArray} from 'event-stream';
import series from 'stream-series';
import path from 'path';
import promisify from 'es6-promisify';
import runSequence from 'run-sequence';
import changelog from 'conventional-changelog';
import {log, colors} from 'gulp-util';
import source from 'vinyl-source-stream';
import semver from 'semver';
import {argv} from 'yargs';
import {getNewVersion} from './helpers/version-helper';
import {componentsWithChanges, componentsToUpdate, updatePackageJsons} from './helpers/package-version-helper';
import {commitTransform} from './helpers/changelog-helper';
import {writeFileSync} from 'jsonfile';
const prompt = promisify(require('inquirer').prompt, function(val) {
this.resolve(val);
});
const execPromise = promisify(exec);
const recommendedBump = promisify(require('conventional-recommended-bump'));
gulp.task('release-update-version', (done) => {
(async function() {
const packageJsonPath = path.join(process.cwd(), 'package.json');
const jsonContents = require(packageJsonPath);
let userVersion = argv.version;
if (!userVersion){
const versionBumpType = await recommendedBump({preset: 'angular'});
const recommendedVersion = semver.inc(jsonContents.version, versionBumpType);
console.log('Current version is', colors.green(jsonContents.version));
console.log('Recommended bump is', colors.red(versionBumpType), 'to', colors.red(recommendedVersion));
const versionOptions = [
['patch'],
['minor'],
['major'],
['prepatch', 'alpha'],
['preminor', 'alpha'],
['premajor', 'alpha'],
['prerelease', 'alpha']
].map((args) => {
const resultVersion = semver.inc(jsonContents.version, ...args);
return {
name: `${args[0]} to ${resultVersion}`,
value: resultVersion
};
});
userVersion = (await prompt([{
type: 'list',
name: 'version',
message: 'Please select version:',
choices: versionOptions
}])).version;
}
jsonContents.version = userVersion;
writeFileSync(packageJsonPath, jsonContents, {spaces: 2});
delete require.cache[packageJsonPath];
done();
})();
});
gulp.task('release-update-package-versions', (done) => {
componentsWithChanges().then((components) => {
readArray(components)
.pipe(componentsToUpdate())
.pipe(updatePackageJsons())
.pipe(gulp.dest('.'))
.on('end', done);
});
});
gulp.task('release-generate-changelog', () => {
const newChangesStream = changelog(
{preset: 'angular', warn: log},
{},
{},
{noteKeywords: ['BREAKING CHANGE', 'DEPRECATION WARNING']},
{transform: commitTransform}
);
const oldChangesStream = gulp.src('../CHANGELOG.md')
.pipe(map((file, cb) => cb(null, file.contents)));
const latestChangesFileStream = newChangesStream
.pipe(source('LATEST_CHANGES.md'));
const changelogFileStream = series(newChangesStream, oldChangesStream)
.pipe(source('CHANGELOG.md'));
return merge(changelogFileStream, latestChangesFileStream)
.pipe(gulp.dest('../'));
});
gulp.task('release-commit', () =>
execPromise(
`git add package.json \
../CHANGELOG.md \
../LATEST_CHANGES.md \
src/pivotal-ui/components/*/package.json \
src/pivotal-ui-react/*/package.json \
../styleguide/old_styleguides \
../styleguide/docs/other-versions.scss \
&& git commit -m "v${getNewVersion()}"`
)
);
gulp.task('release-prepare', (done) =>
runSequence(
'release-update-version',
[
'release-update-package-versions',
'release-generate-changelog'
],
done
)
);