UNPKG

fomantic-ui

Version:

Fomantic empowers designers and developers by creating a shared vocabulary for UI.

200 lines (168 loc) • 6.43 kB
const semver = require('semver'); // eslint-disable-line import/no-extraneous-dependencies let changelogDeps = {}, loopVersion = '', uniqueCommits = [] ; const issueLinks = function (item) { if (typeof loopVersion !== 'string') { return item; } let repository = semver.gte(loopVersion, '2.4.0') ? 'fomantic/Fomantic-UI' : 'Semantic-Org/Semantic-UI'; item.subject = item.subject.replace(/#(\d+)([ ,]|$)/, '[`#$1`](https://github.com/' + repository + '/issues/$1) '); return item; }; module.exports = function (Handlebars) { Handlebars.registerHelper('commit-list-enhanced', (context, options) => { const { exclude, message, subject, heading, } = options.hash; if (!context || context.length === 0 || !heading) { return ''; } loopVersion = options.data.root.releases[options.data.index].tag; uniqueCommits = []; let list = context .filter((item) => { const commit = item.commit || item; if (exclude) { const pattern = new RegExp(exclude, 'm'); if (pattern.test(commit.message)) { return false; } } if (message) { const pattern = new RegExp(message, 'm'); return pattern.test(commit.message); } if (subject) { const pattern = new RegExp(subject); return pattern.test(commit.subject); } return true; }) .filter((item) => { if (uniqueCommits.includes(item.subject)) { return false; } uniqueCommits.push(item.subject); return true; }) .map(issueLinks) .map((item) => options.fn(item)); if (list.length === 0) { return ''; } list = list.filter((item) => item.trim() !== '').sort().join(''); let returnString = ''; if (heading) { returnString = `${heading}\n\n`; } if (list) { returnString += `${list}\n`; } return returnString; }); Handlebars.registerHelper('noprefix', (text) => { if (!(typeof text === 'string')) { return ''; } let result = text.replace(/^(\w+(\([^()]+\))?:|\[[\w ]+]) */, ''); return new Handlebars.SafeString(result); }); Handlebars.registerHelper('contributorlink', (text) => { if (!(typeof text === 'string')) { return ''; } let result = text.replace(/add ([\dA-Za-z-]+) as a contributor/, '[`$1`](https://github.com/$1)'); return Handlebars.helpers.noprefix(result); }); Handlebars.registerHelper('commit-list-dependencies', (context, options) => { const { exclude, message, subject, heading, } = options.hash; if (!context || context.length === 0 || !heading) { return ''; } loopVersion = options.data.root.releases[options.data.index].tag; changelogDeps = {}; const depsRegex = /(?:build\(deps[A-Za-z-]*\):|\[Snyk]) (?:\[?[Ss]ecurity]? )?(?:bump|upgrade) ([\w./@-]+) from (\d+\.\d+\.\d+) to (\d+\.\d+\.\d+)/, detectVersionRange = function (item) { let subjectDetails = item.subject.match(depsRegex); if (!subjectDetails) { return true; } let depPackage = subjectDetails[1], depVersionFrom = subjectDetails[2], depVersionTo = subjectDetails[3] ; if (!changelogDeps[depPackage]) { changelogDeps[depPackage] = { from: '999.999.999', to: '0.0.0', }; } if (semver.lt(depVersionFrom, changelogDeps[depPackage].from)) { changelogDeps[depPackage].from = depVersionFrom; } if (semver.gte(depVersionTo, changelogDeps[depPackage].to)) { changelogDeps[depPackage].to = depVersionTo; return true; } return false; }, list = context .filter((item) => { const commit = item.commit || item; if (exclude) { const pattern = new RegExp(exclude, 'm'); if (pattern.test(commit.message)) { return false; } } if (message) { const pattern = new RegExp(message, 'm'); return pattern.test(commit.message); } if (subject) { const pattern = new RegExp(subject); return pattern.test(commit.subject); } return true; }) .filter(detectVersionRange) // second round as the previous list came unordered from git .filter(detectVersionRange) // adjust from version to create the whole range in one line (linked to the latest commit) .map((item) => { let subjectDetails = item.subject.match(depsRegex); if (!subjectDetails) { return item; } let depPackage = subjectDetails[1], depVersionFrom = subjectDetails[2] ; item.subject = item.subject.replace(depVersionFrom, changelogDeps[depPackage].from); return item; }) .map(issueLinks) .map((item) => options.fn(item)) .sort() .join('') ; if (!list) { return ''; } if (!heading) { return `${list}\n`; } return `${heading}\n\n${list}\n`; }); };