charlike
Version:
Small, fast, simple and streaming project scaffolder for myself, but not only. Supports hundreds of template engines through the @JSTransformers API or if you want custom `render` function passed through options
166 lines (145 loc) • 4.48 kB
JavaScript
;
var dateFormat = require('dateformat');
var join = require('path').join;
var readFileSync = require('fs').readFileSync;
var semverValid = require('semver').valid;
var through = require('through2');
var util = require('./lib/util');
var _ = require('lodash');
function conventionalChangelogWriter(context, options) {
var savedKeyCommit;
var commits = [];
var firstRelease = true;
var neverGenerated = true;
context = _.extend({
commit: 'commits',
issue: 'issues',
date: dateFormat(new Date(), 'yyyy-mm-dd', true)
}, context);
if (!_.isBoolean(context.linkReferences) && (context.repository || context.repoUrl) && context.commit && context.issue) {
context.linkReferences = true;
}
options = _.assign({
groupBy: 'type',
commitsSort: 'header',
noteGroupsSort: 'title',
notesSort: 'text',
generateOn: function(commit) {
return semverValid(commit.version);
},
finalizeContext: function(context) {
return context;
},
debug: function() {},
reverse: false,
includeDetails: false,
ignoreReverted: true,
doFlush: true,
mainTemplate: readFileSync(join(__dirname, 'templates/template.hbs'), 'utf-8'),
headerPartial: readFileSync(join(__dirname, 'templates/header.hbs'), 'utf-8'),
commitPartial: readFileSync(join(__dirname, 'templates/commit.hbs'), 'utf-8'),
footerPartial: readFileSync(join(__dirname, 'templates/footer.hbs'), 'utf-8')
}, options);
if (!_.isFunction(options.transform) && _.isObject(options.transform) || _.isUndefined(options.transform)) {
options.transform = _.assign({
hash: function(hash) {
if (_.isString(hash)) {
return hash.substring(0, 7);
}
},
header: function(header) {
return header.substring(0, 100);
},
committerDate: function(date) {
if (!date) {
return;
}
return dateFormat(date, 'yyyy-mm-dd', true);
}
}, options.transform);
}
var generateOn = options.generateOn;
if (_.isString(generateOn)) {
generateOn = function(commit) {
return !_.isUndefined(commit[options.generateOn]);
};
} else if (!_.isFunction(generateOn)) {
generateOn = function() {
return false;
};
}
options.commitGroupsSort = util.functionify(options.commitGroupsSort);
options.commitsSort = util.functionify(options.commitsSort);
options.noteGroupsSort = util.functionify(options.noteGroupsSort);
options.notesSort = util.functionify(options.notesSort);
return through.obj(function(chunk, enc, cb) {
try {
var result;
var commit = util.processCommit(chunk, options.transform, context);
var keyCommit = commit || chunk;
// previous blocks of logs
if (options.reverse) {
if (commit) {
commits.push(commit);
}
if (generateOn(keyCommit, commits, context, options)) {
neverGenerated = false;
result = util.generate(options, commits, context, keyCommit);
if (options.includeDetails) {
this.push({
log: result,
keyCommit: keyCommit
});
} else {
this.push(result);
}
commits = [];
}
} else {
if (generateOn(keyCommit, commits, context, options)) {
neverGenerated = false;
result = util.generate(options, commits, context, savedKeyCommit);
if (!firstRelease || options.doFlush) {
if (options.includeDetails) {
this.push({
log: result,
keyCommit: savedKeyCommit
});
} else {
this.push(result);
}
}
firstRelease = false;
commits = [];
savedKeyCommit = keyCommit;
}
if (commit) {
commits.push(commit);
}
}
cb();
} catch (err) {
cb(err);
}
}, function(cb) {
if (!options.doFlush && (options.reverse || neverGenerated)) {
cb(null);
return;
}
try {
var result = util.generate(options, commits, context, savedKeyCommit);
if (options.includeDetails) {
this.push({
log: result,
keyCommit: savedKeyCommit
});
} else {
this.push(result);
}
cb();
} catch (err) {
cb(err);
}
});
}
module.exports = conventionalChangelogWriter;