UNPKG

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