redhot
Version:
TypeScript Monorepo Management
72 lines (61 loc) • 1.95 kB
JavaScript
const conventionalChangelog = require('conventional-changelog')
const addStream = require('add-stream')
const tempfile = require('tempfile')
const fs = require('fs')
const path = require('path')
const { isFile, exec } = require('../../util')
const startCommits = {}
function touchFile (path) {
return exec(`touch ${path}`)
}
// Update the startCommit for each package, looking for release commits
// for each package.
exports.generateChangelogs = function (packages, rootDir, callback) {
const config = {
preset: 'angular',
append: true,
transform: function (commit, cb) {
if (commit.type === 'release') {
startCommits[commit.scope] = commit.hash
}
cb()
}
}
conventionalChangelog(config, {}, { reverse: true })
.on('end', () => runUpdateChangelogs(packages, rootDir, callback))
.resume()
}
function runUpdateChangelogs (packages, rootDir, callback) {
packages.forEach(function (packageName) {
const filename = path.join(rootDir, packageName, '/CHANGELOG.md')
if (!isFile(filename)) {
touchFile(filename)
}
const changelogOpts = {
preset: 'angular',
releaseCount: 0,
pkg: {
path: path.join(rootDir, packageName, 'package.json')
},
transform: function (commit, cb) {
if (commit.scope === packageName) {
cb(null, commit)
} else {
cb()
}
}
}
const gitRawCommitsOpts = { from: startCommits[packageName] }
const readStream = fs.createReadStream(filename)
const tmp = tempfile()
conventionalChangelog(changelogOpts, {}, gitRawCommitsOpts)
.pipe(addStream(readStream))
.pipe(fs.createWriteStream(tmp))
.on('finish', function () {
fs.createReadStream(tmp)
.pipe(fs.createWriteStream(filename))
console.log('Successfully updated changelog for ' + packageName + '!')
callback && callback()
})
})
}