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
136 lines (125 loc) • 4.02 kB
JavaScript
;
var conventionalCommitsParser = require('./');
var forEach = require('lodash').forEach;
var fs = require('fs');
var isTextPath = require('is-text-path');
var JSONStream = require('JSONStream');
var meow = require('meow');
var readline = require('readline');
var split = require('split2');
var through = require('through2');
var filePaths = [];
var separator = '\n\n\n';
var cli = meow({
help: [
'Practice writing commit messages or parse messages from files.',
'If used without specifying a text file path, you will enter an interactive shell.',
'Otherwise the commit messages in the files are parsed and printed',
'By default, commits will be split by three newlines (`\\n\\n\\n`) or you can specify a separator.',
'',
'Usage',
' conventional-commits-parser [<commit-separator>]',
' conventional-commits-parser [<commit-separator>] <path> [<path> ...]',
' cat <path> | conventional-commits-parser [<commit-separator>]',
'',
'Example',
' conventional-commits-parser',
' conventional-commits-parser log.txt',
' cat log.txt | conventional-commits-parser',
' conventional-commits-parser log2.txt \'===\' >> parsed.txt',
'',
'Options',
' -p, --header-pattern Regex to match header pattern',
' -c, --header-correspondence Comma separated parts used to define what capturing group of `headerPattern` captures what',
' -r, --reference-actions Comma separated keywords that used to reference issues',
' -i, --issue-prefixes Comma separated prefixes of an issue',
' -n, --note-keywords Comma separated keywords for important notes',
' -f, --field-pattern Regex to match other fields',
' --revert-pattern Regex to match revert pattern',
' --revert-correspondence Comma separated fields used to define what the commit reverts',
' -v, --verbose Verbose output'
]
}, {
alias: {
p: 'headerPattern',
c: 'headerCorrespondence',
r: 'referenceActions',
i: 'issuePrefixes',
n: 'noteKeywords',
f: 'fieldPattern',
v: 'verbose'
}
});
forEach(cli.input, function(arg) {
if (isTextPath(arg)) {
filePaths.push(arg);
} else {
separator = arg;
}
});
var length = filePaths.length;
var options = cli.flags;
if (options.verbose) {
options.warn = console.log.bind(console);
}
function processFile(fileIndex) {
var filePath = filePaths[fileIndex];
fs.createReadStream(filePath)
.on('error', function(err) {
console.warn('Failed to read file ' + filePath + '\n' + err);
if (++fileIndex < length) {
processFile(fileIndex);
}
})
.pipe(split(separator))
.pipe(conventionalCommitsParser(options))
.pipe(JSONStream.stringify())
.on('end', function() {
if (++fileIndex < length) {
processFile(fileIndex);
}
})
.pipe(process.stdout);
}
if (process.stdin.isTTY) {
if (length > 0) {
processFile(0);
} else {
var commit = '';
var stream = through();
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
terminal: true
});
stream.pipe(conventionalCommitsParser(options))
.pipe(JSONStream.stringify('', '', ''))
.pipe(through(function(chunk, enc, cb) {
if (chunk.toString() === '""') {
cb(null, 'Commit cannot be parsed\n');
} else {
cb(null, chunk + '\n');
}
}))
.pipe(process.stdout);
rl.on('line', function(line) {
commit += line + '\n';
if (commit.indexOf(separator) === -1) {
return;
}
stream.write(commit);
commit = '';
});
}
} else {
options.warn = true;
process.stdin
.pipe(conventionalCommitsParser(options))
.on('error', function(err) {
console.error(err.toString());
process.exit(1);
})
.pipe(JSONStream.stringify())
.pipe(process.stdout);
}