UNPKG

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
'use strict'; 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;