diff --git a/engine.js b/engine.js new file mode 100644 index 00000000..b4d665c7 --- /dev/null +++ b/engine.js @@ -0,0 +1,107 @@ +"format cjs"; + +var wrap = require('word-wrap'); +var objectAssign = require('object-assign'); +var objectValues = require('object-values'); +var forEach = require('lodash.foreach'); +var mapKeys = require('lodash.mapkeys'); +var mapValues = require('lodash.mapvalues'); +var rightPadKeys = require('right-pad-keys'); +var conventionalCommitTypes = require('conventional-commit-types'); + +// This can be any kind of SystemJS compatible module. +// We use Commonjs here, but ES6 or AMD would do just +// fine. +module.exports = function (options) { + + options = options || {}; + + var types = objectAssign({}, options.types || conventionalCommitTypes.types); + forEach(types, function (type, key) { + type.key = key; + }); + types = mapKeys(types, function (type, key) { + return key + ':'; + }); + types = rightPadKeys(types); + + var choices = mapValues(types, function (type, key) { + return { + name: key + ' ' + type.description, + value: type.key + }; + }); + choices = objectValues(choices); + + return { + // When a user runs `git cz`, prompter will + // be executed. We pass you cz, which currently + // is just an instance of inquirer.js. Using + // this you can ask questions and get answers. + // + // The commit callback should be executed when + // you're ready to send back a commit template + // to git. + // + // By default, we'll de-indent your commit + // template and will keep empty lines. + prompter: function(cz, commit) { + console.log('\nLine 1 will be cropped at 100 characters. All other lines will be wrapped after 100 characters.\n'); + + // Let's ask some questions of the user + // so that we can populate our commit + // template. + // + // See inquirer.js docs for specifics. + // You can also opt to use another input + // collection library if you prefer. + cz.prompt([ + { + type: 'list', + name: 'type', + message: 'Select the type of change that you\'re committing:', + choices: choices + }, { + type: 'input', + name: 'scope', + message: 'Denote the scope of this change ($location, $browser, $compile, etc.):\n' + }, { + type: 'input', + name: 'subject', + message: 'Write a short, imperative tense description of the change:\n' + }, { + type: 'input', + name: 'body', + message: 'Provide a longer description of the change:\n' + }, { + type: 'input', + name: 'footer', + message: 'List any breaking changes or issues closed by this change:\n' + } + ]).then(function(answers) { + + var maxLineWidth = 100; + + var wrapOptions = { + trim: true, + newline: '\n', + indent:'', + width: maxLineWidth + }; + + // parentheses are only needed when a scope is present + var scope = answers.scope.trim(); + scope = scope ? '(' + answers.scope.trim() + ')' : ''; + + // Hard limit this line + var head = (answers.type + scope + ': ' + answers.subject.trim()).slice(0, maxLineWidth); + + // Wrap these lines at 100 characters + var body = wrap(answers.body, wrapOptions); + var footer = wrap(answers.footer, wrapOptions); + + commit(head + '\n\n' + body + '\n\n' + footer); + }); + } + }; +}; diff --git a/index.js b/index.js index fae73161..ae1b32f5 100644 --- a/index.js +++ b/index.js @@ -1,104 +1,5 @@ "format cjs"; -var wrap = require('word-wrap'); +var engine = require('./engine'); -// This can be any kind of SystemJS compatible module. -// We use Commonjs here, but ES6 or AMD would do just -// fine. -module.exports = { - - // When a user runs `git cz`, prompter will - // be executed. We pass you cz, which currently - // is just an instance of inquirer.js. Using - // this you can ask questions and get answers. - // - // The commit callback should be executed when - // you're ready to send back a commit template - // to git. - // - // By default, we'll de-indent your commit - // template and will keep empty lines. - prompter: function(cz, commit) { - console.log('\nLine 1 will be cropped at 100 characters. All other lines will be wrapped after 100 characters.\n'); - - // Let's ask some questions of the user - // so that we can populate our commit - // template. - // - // See inquirer.js docs for specifics. - // You can also opt to use another input - // collection library if you prefer. - cz.prompt([ - { - type: 'list', - name: 'type', - message: 'Select the type of change that you\'re committing:', - choices: [ - { - name: 'feat: A new feature', - value: 'feat' - }, { - name: 'fix: A bug fix', - value: 'fix' - }, { - name: 'docs: Documentation only changes', - value: 'docs' - }, { - name: 'style: Changes that do not affect the meaning of the code\n (white-space, formatting, missing semi-colons, etc.)', - value: 'style' - }, { - name: 'refactor: A code change that neither fixes a bug or adds a feature', - value: 'refactor' - }, { - name: 'perf: A code change that improves performance', - value: 'perf' - }, { - name: 'test: Adding missing tests', - value: 'test' - }, { - name: 'chore: Changes to the build process or auxiliary tools\n and libraries such as documentation generation', - value: 'chore' - }] - }, { - type: 'input', - name: 'scope', - message: 'Denote the scope of this change ($location, $browser, $compile, etc.):\n' - }, { - type: 'input', - name: 'subject', - message: 'Write a short, imperative tense description of the change:\n' - }, { - type: 'input', - name: 'body', - message: 'Provide a longer description of the change:\n' - }, { - type: 'input', - name: 'footer', - message: 'List any breaking changes or issues closed by this change:\n' - } - ]).then(function(answers) { - - var maxLineWidth = 100; - - var wrapOptions = { - trim: true, - newline: '\n', - indent:'', - width: maxLineWidth - }; - - // parentheses are only needed when a scope is present - var scope = answers.scope.trim(); - scope = scope ? '(' + answers.scope.trim() + ')' : ''; - - // Hard limit this line - var head = (answers.type + scope + ': ' + answers.subject.trim()).slice(0, maxLineWidth); - - // Wrap these lines at 100 characters - var body = wrap(answers.body, wrapOptions); - var footer = wrap(answers.footer, wrapOptions); - - commit(head + '\n\n' + body + '\n\n' + footer); - }); - } -} +module.exports = engine(); diff --git a/package.json b/package.json index 11106424..c17a013d 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,13 @@ "author": "Jim Cummins ", "license": "MIT", "dependencies": { + "conventional-commit-types": "^2.0.0", + "lodash.foreach": "^4.4.1", + "lodash.mapkeys": "^4.5.1", + "lodash.mapvalues": "^4.5.1", + "object-assign": "^4.1.0", + "object-values": "^1.0.0", + "right-pad-keys": "^0.1.2", "word-wrap": "^1.0.3" }, "devDependencies": {