UNPKG

2.96 kBJavaScriptView Raw
1const {callbackify} = require('util');
2const parser = require('conventional-commits-parser').sync;
3const debug = require('debug')('semantic-release:commit-analyzer');
4const loadParserConfig = require('./lib/load-parser-config');
5const loadReleaseRules = require('./lib/load-release-rules');
6const analyzeCommit = require('./lib/analyze-commit');
7const compareReleaseTypes = require('./lib/compare-release-types');
8const RELEASE_TYPES = require('./lib/default-release-types');
9const DEFAULT_RELEASE_RULES = require('./lib/default-release-rules');
10
11/**
12 * Determine the type of release to create based on a list of commits.
13 *
14 * @param {Object} [pluginConfig={}] semantic-release configuration
15 * @param {string} pluginConfig.preset conventional-changelog preset ('angular', 'atom', 'codemirror', 'ember', 'eslint', 'express', 'jquery', 'jscs', 'jshint')
16 * @param {string} pluginConfig.config requierable npm package with a custom conventional-changelog preset
17 * @param {string|Array} pluginConfig.releaseRules a string to load an external module or an `Array` of rules.
18 * @param {Object} pluginConfig.parserOpts additional `conventional-changelog-parser` options that will overwrite ones loaded by `preset` or `config`.
19 * @param {Object} options semantic-release options
20 * @param {Array} options.commits array of commits
21 */
22async function commitAnalyzer(pluginConfig, {commits, logger}) {
23 const releaseRules = loadReleaseRules(pluginConfig);
24 const config = await loadParserConfig(pluginConfig);
25 let releaseType = null;
26
27 commits.every(rawCommit => {
28 const commit = parser(rawCommit.message, config);
29 logger.log(`Analyzing commit: %s`, rawCommit.message);
30 let commitReleaseType;
31
32 // Determine release type based on custom releaseRules
33 if (releaseRules) {
34 debug('Analyzing with custom rules');
35 commitReleaseType = analyzeCommit(releaseRules, commit);
36 if (commitReleaseType) {
37 logger.log('The release type for the commit is %s', commitReleaseType);
38 }
39 }
40 // If no custom releaseRules or none matched the commit, try with default releaseRules
41 if (!commitReleaseType) {
42 debug('Analyzing with default rules');
43 commitReleaseType = analyzeCommit(DEFAULT_RELEASE_RULES, commit);
44 if (commitReleaseType) {
45 logger.log('The release type for the commit is %s', commitReleaseType);
46 } else {
47 logger.log('The commit should not trigger a release');
48 }
49 }
50 // Set releaseType if commit's release type is higher
51 if (commitReleaseType && compareReleaseTypes(releaseType, commitReleaseType)) {
52 releaseType = commitReleaseType;
53 }
54
55 // Break loop if releaseType is the highest
56 if (releaseType === RELEASE_TYPES[0]) {
57 return false;
58 }
59 return true;
60 });
61 logger.log('Analysis of %s commits complete: %s release', commits.length, releaseType || 'no');
62
63 return releaseType;
64}
65
66module.exports = callbackify(commitAnalyzer);