Skip to content

Commit 41749bc

Browse files
Rugalmarionebl
authored andcommitted
feat(core): add sentence-case to ensure-case (#117)
* feat(core): add sentence-case rule * docs: add sentence-case for *-case rules * refactor(core): reuse ensureCase internally
1 parent 060c0f8 commit 41749bc

File tree

5 files changed

+59
-41
lines changed

5 files changed

+59
-41
lines changed

@commitlint/core/src/library/ensure-case.js

+12-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import {camelCase, kebabCase, snakeCase, upperFirst, startCase} from 'lodash';
22

3-
export default (raw = '', target = 'lowercase') => {
3+
export default ensureCase;
4+
5+
function ensureCase(raw = '', target = 'lowercase') {
46
const input = String(raw);
57

68
switch (target) {
@@ -17,9 +19,16 @@ export default (raw = '', target = 'lowercase') => {
1719
case 'upper-case':
1820
case 'uppercase':
1921
return input.toUpperCase() === input;
22+
case 'sentence-case':
23+
case 'sentencecase':
24+
return (
25+
ensureCase(raw.charAt(0), 'upper-case') &&
26+
ensureCase(raw.substring(1), 'lower-case')
27+
);
2028
case 'lower-case':
2129
case 'lowercase':
22-
default:
2330
return input.toLowerCase() === input;
31+
default:
32+
throw new TypeError(`ensure-case: Unknown target case "${target}"`);
2433
}
25-
};
34+
}

@commitlint/core/src/library/ensure-case.test.js

+33
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,36 @@ test('false for lowercase on lowercase', t => {
4040
const actual = ensure('a', 'uppercase');
4141
t.is(actual, false);
4242
});
43+
44+
test('true for sentencecase on sentencecase', t => {
45+
const actual = ensure('Sentence case', 'sentence-case');
46+
t.is(actual, true);
47+
});
48+
49+
test('false for lowsercase on sentencecase', t => {
50+
t.is(ensure('sentence case', 'sentence-case'), false);
51+
});
52+
53+
test('false for UPPERCASE on sentencecase', t => {
54+
t.is(ensure('UPPERCASE', 'sentence-case'), false);
55+
});
56+
57+
test('false for Start Case on sentencecase', t => {
58+
t.is(ensure('Start Case', 'sentence-case'), false);
59+
});
60+
61+
test('false for PascalCase on sentencecase', t => {
62+
t.is(ensure('PascalCase', 'sentence-case'), false);
63+
});
64+
65+
test('false for kebab-case on sentencecase', t => {
66+
t.is(ensure('kebab-case', 'sentence-case'), false);
67+
});
68+
69+
test('false for snake_case on sentencecase', t => {
70+
t.is(ensure('snake_case', 'sentence-case'), false);
71+
});
72+
73+
test('false for camelCase on sentencecase', t => {
74+
t.is(ensure('camelCase', 'sentence-case'), false);
75+
});

@commitlint/core/src/rules/scope-case.test.js

+1-5
Original file line numberDiff line numberDiff line change
@@ -159,11 +159,7 @@ test('with kebabcase scope should fail for "always pascalcase"', async t => {
159159
});
160160

161161
test('with kebabcase scope should succeed for "always kebabcase"', async t => {
162-
const [actual] = scopeCase(
163-
await parsed.kebabcase,
164-
'always',
165-
'kebabcase-case'
166-
);
162+
const [actual] = scopeCase(await parsed.kebabcase, 'always', 'kebab-case');
167163
const expected = true;
168164
t.is(actual, expected);
169165
});

docs/reference-rules.md

+9-3
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,10 @@ Rule configurations are either of type `array` residing on a key with the rule's
116116
'camel-case', // camelCase
117117
'kebab-case', // kebab-case
118118
'pascal-case', // PascalCase
119+
'sentence-case', // Sentence case
119120
'snake-case', // snake_case
120-
'start-case' // Start Case
121+
'start-case', // Start Case
122+
'sentence-case' // Sentence case
121123
]
122124
```
123125

@@ -155,8 +157,10 @@ Rule configurations are either of type `array` residing on a key with the rule's
155157
'camel-case', // camelCase
156158
'kebab-case', // kebab-case
157159
'pascal-case', // PascalCase
160+
'sentence-case', // Sentence case
158161
'snake-case', // snake_case
159-
'start-case' // Start Case
162+
'start-case', // Start Case
163+
'sentence-case' // Sentence case
160164
]
161165
```
162166

@@ -220,8 +224,10 @@ Rule configurations are either of type `array` residing on a key with the rule's
220224
'camel-case', // camelCase
221225
'kebab-case', // kebab-case
222226
'pascal-case', // PascalCase
227+
'sentence-case', // Sentence case
223228
'snake-case', // snake_case
224-
'start-case' // Start Case
229+
'start-case', // Start Case
230+
'sentence-case' // Sentence case
225231
]
226232
```
227233

yarn.lock

+4-30
Original file line numberDiff line numberDiff line change
@@ -2071,7 +2071,7 @@ debug@^3.0.1, debug@^3.1.0:
20712071
dependencies:
20722072
ms "2.0.0"
20732073

2074-
debuglog@*, debuglog@^1.0.1:
2074+
debuglog@^1.0.1:
20752075
version "1.0.1"
20762076
resolved "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
20772077

@@ -3599,7 +3599,7 @@ import-modules@^1.1.0:
35993599
version "1.1.0"
36003600
resolved "https://registry.npmjs.org/import-modules/-/import-modules-1.1.0.tgz#748db79c5cc42bb9701efab424f894e72600e9dc"
36013601

3602-
imurmurhash@*, imurmurhash@^0.1.4:
3602+
imurmurhash@^0.1.4:
36033603
version "0.1.4"
36043604
resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
36053605

@@ -4460,39 +4460,17 @@ lockfile@~1.0.3:
44604460
version "1.0.3"
44614461
resolved "https://registry.npmjs.org/lockfile/-/lockfile-1.0.3.tgz#2638fc39a0331e9cac1a04b71799931c9c50df79"
44624462

4463-
lodash._baseindexof@*:
4464-
version "3.1.0"
4465-
resolved "https://registry.npmjs.org/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c"
4466-
44674463
lodash._baseuniq@~4.6.0:
44684464
version "4.6.0"
44694465
resolved "https://registry.npmjs.org/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8"
44704466
dependencies:
44714467
lodash._createset "~4.0.0"
44724468
lodash._root "~3.0.0"
44734469

4474-
lodash._bindcallback@*:
4475-
version "3.0.1"
4476-
resolved "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e"
4477-
4478-
lodash._cacheindexof@*:
4479-
version "3.0.2"
4480-
resolved "https://registry.npmjs.org/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92"
4481-
4482-
lodash._createcache@*:
4483-
version "3.1.2"
4484-
resolved "https://registry.npmjs.org/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093"
4485-
dependencies:
4486-
lodash._getnative "^3.0.0"
4487-
44884470
lodash._createset@~4.0.0:
44894471
version "4.0.3"
44904472
resolved "https://registry.npmjs.org/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26"
44914473

4492-
lodash._getnative@*, lodash._getnative@^3.0.0:
4493-
version "3.9.1"
4494-
resolved "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
4495-
44964474
lodash._reinterpolate@~3.0.0:
44974475
version "3.0.0"
44984476
resolved "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
@@ -4549,10 +4527,6 @@ lodash.merge@^4.6.0:
45494527
version "4.6.0"
45504528
resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5"
45514529

4552-
lodash.restparam@*:
4553-
version "3.6.1"
4554-
resolved "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
4555-
45564530
lodash.snakecase@^4.0.1:
45574531
version "4.1.1"
45584532
resolved "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d"
@@ -5865,7 +5839,7 @@ readable-stream@~1.1.10:
58655839
isarray "0.0.1"
58665840
string_decoder "~0.10.x"
58675841

5868-
readdir-scoped-modules@*, readdir-scoped-modules@^1.0.0:
5842+
readdir-scoped-modules@^1.0.0:
58695843
version "1.0.2"
58705844
resolved "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747"
58715845
dependencies:
@@ -7028,7 +7002,7 @@ v8flags@^2.1.1:
70287002
dependencies:
70297003
user-home "^1.1.1"
70307004

7031-
validate-npm-package-license@*, validate-npm-package-license@^3.0.1:
7005+
validate-npm-package-license@^3.0.1:
70327006
version "3.0.1"
70337007
resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
70347008
dependencies:

0 commit comments

Comments
 (0)