Files
2025-07-24 17:21:45 +08:00

95 lines
2.0 KiB
JavaScript

module.exports = function (lines, options, errors) {
var scheme = '<type>(<scope>): <subject>'
var prefix = 'First line must be ' + scheme + '\n'
var line = lines[0]
if (line.startsWith('revert: ')) {
line = line.replace(/^revert: /, '')
prefix = 'First line must be revert: ' + scheme + '\n'
} else if (line.startsWith('revert')) {
errors.push(
'If this is a revert of a previous commit, please write:\n' +
'revert: <type>(<scope>): <subject>'
)
return
}
if (line.indexOf('(') === -1) {
errors.push(prefix + 'Need an opening parenthesis: (')
return
}
var type = line.replace(/\(.*/, '')
if (!type) {
errors.push(
prefix + '<type> was empty, must be one of these:\n' +
options.types.join(', ')
)
return
}
if (options.types.indexOf(type) === -1) {
errors.push(
prefix + '<type> invalid, was "' + type +
'", must be one of these:\n' + options.types.join(', ')
)
return
}
if (line.indexOf(')') === -1) {
errors.push(prefix + 'Need a closing parenthesis after scope: <scope>)')
return
}
var scope = line.slice(line.indexOf('(') + 1, line.indexOf(')'))
if (!RegExp(options.scope).test(scope)) {
errors.push(
prefix + 'Scope ' + scope + ' does not match ' + options.scope
)
return
}
if (line.indexOf(type + '(' + scope + '):') === -1) {
errors.push(prefix + 'Need a colon after the closing parenthesis: ):')
return
}
var subject = line.split(':')[1]
if (!subject.startsWith(' ')) {
errors.push(prefix + 'Need a space after colon: ": "')
return
}
subject = subject.slice(1, subject.length)
if (subject.length === 0) {
errors.push(prefix + '<subject> must not be empty')
return
}
if (!/^[a-z]/.test(subject)) {
errors.push('<subject> must start with a lowercase letter')
return
}
if (subject[subject.length - 1] === '.') {
errors.push('<subject> must not end with a dot')
return
}
}