Skip to content

Commit c0cf11c

Browse files
committed
fix(ensure): ignore word delimiters for case matching #291
1 parent 7082d33 commit c0cf11c

File tree

3 files changed

+394
-40
lines changed

3 files changed

+394
-40
lines changed

@commitlint/ensure/src/case.js

+20-11
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,42 @@ export default ensureCase;
88

99
function ensureCase(raw = '', target = 'lowercase') {
1010
const input = String(raw);
11+
const transformed = toCase(input, target);
1112

13+
if (transformed === '') {
14+
return true;
15+
}
16+
17+
return transformed === input;
18+
}
19+
20+
function toCase(input, target) {
1221
switch (target) {
1322
case 'camel-case':
14-
return camelCase(input) === input;
23+
return camelCase(input);
1524
case 'kebab-case':
16-
return kebabCase(input) === input;
25+
return kebabCase(input);
1726
case 'snake-case':
18-
return snakeCase(input) === input;
27+
return snakeCase(input);
1928
case 'pascal-case':
20-
return upperFirst(camelCase(input)) === input;
29+
return upperFirst(camelCase(input));
2130
case 'start-case':
22-
return startCase(input) === input;
31+
return startCase(input);
2332
case 'upper-case':
2433
case 'uppercase':
25-
return input.toUpperCase() === input;
34+
return input.toUpperCase();
2635
case 'sentence-case':
2736
case 'sentencecase': {
2837
const word = input.split(' ')[0];
29-
return (
30-
ensureCase(word.charAt(0), 'upper-case') &&
31-
ensureCase(word.slice(1), 'lower-case')
32-
);
38+
return `${toCase(word.charAt(0), 'upper-case')}${toCase(
39+
word.slice(1),
40+
'lower-case'
41+
)}${input.slice(word.length)}`;
3342
}
3443
case 'lower-case':
3544
case 'lowercase':
3645
case 'lowerCase': // Backwards compat config-angular v4
37-
return input.toLowerCase() === input;
46+
return input.toLowerCase();
3847
default:
3948
throw new TypeError(`ensure-case: Unknown target case "${target}"`);
4049
}

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

+43-2
Original file line numberDiff line numberDiff line change
@@ -31,22 +31,33 @@ test('false for uppercase on lowercase', t => {
3131
t.is(actual, false);
3232
});
3333

34+
test('true for * on lowercase', t => {
35+
const actual = ensure('*', 'lowercase');
36+
console.log({actual});
37+
t.is(actual, true);
38+
});
39+
3440
test('true for uppercase on uppercase', t => {
3541
const actual = ensure('A', 'uppercase');
3642
t.is(actual, true);
3743
});
3844

39-
test('false for lowercase on lowercase', t => {
45+
test('false for lowercase on uppercase', t => {
4046
const actual = ensure('a', 'uppercase');
4147
t.is(actual, false);
4248
});
4349

50+
test('true for * on uppercase', t => {
51+
const actual = ensure('*', 'uppercase');
52+
t.is(actual, true);
53+
});
54+
4455
test('true for sentencecase on sentencecase', t => {
4556
const actual = ensure('Sentence case', 'sentence-case');
4657
t.is(actual, true);
4758
});
4859

49-
test('false for lowsercase on sentencecase', t => {
60+
test('false for lowercase on sentencecase', t => {
5061
t.is(ensure('sentence case', 'sentence-case'), false);
5162
});
5263

@@ -73,3 +84,33 @@ test('false for snake_case on sentencecase', t => {
7384
test('false for camelCase on sentencecase', t => {
7485
t.is(ensure('camelCase', 'sentence-case'), false);
7586
});
87+
88+
test('true for * on sentence-case', t => {
89+
const actual = ensure('*', 'sentence-case');
90+
t.is(actual, true);
91+
});
92+
93+
test('true for * on camel-case', t => {
94+
const actual = ensure('*', 'camel-case');
95+
t.is(actual, true);
96+
});
97+
98+
test('true for * on kebab-case', t => {
99+
const actual = ensure('*', 'kebab-case');
100+
t.is(actual, true);
101+
});
102+
103+
test('true for * on snake-case', t => {
104+
const actual = ensure('*', 'snake-case');
105+
t.is(actual, true);
106+
});
107+
108+
test('true for * on pascal-case', t => {
109+
const actual = ensure('*', 'snake-case');
110+
t.is(actual, true);
111+
});
112+
113+
test('true for * on start-case', t => {
114+
const actual = ensure('*', 'snake-case');
115+
t.is(actual, true);
116+
});

0 commit comments

Comments
 (0)