Skip to content

Commit cadcfed

Browse files
byCedricmarionebl
authored andcommitted
fix: handle case rules for numerics correctly
* fix(ensure): return true for values starting with numeric character * fix(rules): ignore values starting with non-alphabetic character
1 parent b32bc93 commit cadcfed

File tree

4 files changed

+57
-3
lines changed

4 files changed

+57
-3
lines changed

@commitlint/ensure/src/case.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ function ensureCase(raw = '', target = 'lowercase') {
1414
.trim();
1515
const transformed = toCase(input, target);
1616

17-
if (transformed === '') {
17+
if (transformed === '' || transformed.match(/^\d/)) {
1818
return true;
1919
}
2020

@@ -38,7 +38,7 @@ function toCase(input, target) {
3838
return input.toUpperCase();
3939
case 'sentence-case':
4040
case 'sentencecase': {
41-
const word = input.split(' ')[0];
41+
const [word] = input.split(' ');
4242
return `${toCase(word.charAt(0), 'upper-case')}${toCase(
4343
word.slice(1),
4444
'lower-case'

@commitlint/ensure/src/case.test.js

+28
Original file line numberDiff line numberDiff line change
@@ -291,3 +291,31 @@ test('false for `LOWERCASE on lowercase', t => {
291291
const actual = ensure('`LOWERCASE', 'lowercase');
292292
t.is(actual, false);
293293
});
294+
295+
test('true for numeric on camel-case', t => {
296+
t.true(ensure('1.0.0', 'camel-case'));
297+
});
298+
299+
test('true for numeric on kebab-case', t => {
300+
t.true(ensure('1.0.0', 'kebab-case'));
301+
});
302+
303+
test('true for numeric on snake-case', t => {
304+
t.true(ensure('1.0.0', 'snake-case'));
305+
});
306+
307+
test('true for numeric on pascal-case', t => {
308+
t.true(ensure('1.0.0', 'pascal-case'));
309+
});
310+
311+
test('true for numeric on uppercase', t => {
312+
t.true(ensure('1.0.0', 'uppercase'));
313+
});
314+
315+
test('true for numeric on sentencecase', t => {
316+
t.true(ensure('1.0.0', 'sentencecase'));
317+
});
318+
319+
test('true for numeric on lowercase', t => {
320+
t.true(ensure('1.0.0', 'lowercase'));
321+
});

@commitlint/rules/src/subject-case.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const negated = when => when === 'never';
66
export default (parsed, when, value) => {
77
const {subject} = parsed;
88

9-
if (typeof subject !== 'string') {
9+
if (typeof subject !== 'string' || !subject.match(/^[a-z]/i)) {
1010
return [true];
1111
}
1212

@commitlint/rules/src/subject-case.test.js

+26
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import subjectCase from './subject-case';
44

55
const messages = {
66
empty: 'test:\n',
7+
numeric: 'test: 1.0.0',
78
lowercase: 'test: subject',
89
mixedcase: 'test: sUbJeCt',
910
uppercase: 'test: SUBJECT',
@@ -16,6 +17,7 @@ const messages = {
1617

1718
const parsed = {
1819
empty: parse(messages.empty),
20+
numeric: parse(messages.numeric),
1921
lowercase: parse(messages.lowercase),
2022
mixedcase: parse(messages.mixedcase),
2123
uppercase: parse(messages.uppercase),
@@ -324,3 +326,27 @@ test('with uppercase scope should fail for "never [uppercase, lowercase]"', asyn
324326
const expected = false;
325327
t.is(actual, expected);
326328
});
329+
330+
test('with numeric subject should succeed for "never lowercase"', async t => {
331+
const [actual] = subjectCase(await parsed.numeric, 'never', 'lowercase');
332+
const expected = true;
333+
t.is(actual, expected);
334+
});
335+
336+
test('with numeric subject should succeed for "always lowercase"', async t => {
337+
const [actual] = subjectCase(await parsed.numeric, 'always', 'lowercase');
338+
const expected = true;
339+
t.is(actual, expected);
340+
});
341+
342+
test('with numeric subject should succeed for "never uppercase"', async t => {
343+
const [actual] = subjectCase(await parsed.numeric, 'never', 'uppercase');
344+
const expected = true;
345+
t.is(actual, expected);
346+
});
347+
348+
test('with numeric subject should succeed for "always uppercase"', async t => {
349+
const [actual] = subjectCase(await parsed.numeric, 'always', 'uppercase');
350+
const expected = true;
351+
t.is(actual, expected);
352+
});

0 commit comments

Comments
 (0)