diff --git a/@commitlint/core/src/library/ensure-case.js b/@commitlint/core/src/library/ensure-case.js index 64ba4a1163..a1639b224f 100644 --- a/@commitlint/core/src/library/ensure-case.js +++ b/@commitlint/core/src/library/ensure-case.js @@ -1,6 +1,8 @@ import {camelCase, kebabCase, snakeCase, upperFirst, startCase} from 'lodash'; -export default (raw = '', target = 'lowercase') => { +export default ensureCase; + +function ensureCase(raw = '', target = 'lowercase') { const input = String(raw); switch (target) { @@ -17,9 +19,16 @@ export default (raw = '', target = 'lowercase') => { case 'upper-case': case 'uppercase': return input.toUpperCase() === input; + case 'sentence-case': + case 'sentencecase': + return ( + ensureCase(raw.charAt(0), 'upper-case') && + ensureCase(raw.substring(1), 'lower-case') + ); case 'lower-case': case 'lowercase': - default: return input.toLowerCase() === input; + default: + throw new TypeError(`ensure-case: Unknown target case "${target}"`); } -}; +} diff --git a/@commitlint/core/src/library/ensure-case.test.js b/@commitlint/core/src/library/ensure-case.test.js index 506e13716a..a60f594403 100644 --- a/@commitlint/core/src/library/ensure-case.test.js +++ b/@commitlint/core/src/library/ensure-case.test.js @@ -40,3 +40,36 @@ test('false for lowercase on lowercase', t => { const actual = ensure('a', 'uppercase'); t.is(actual, false); }); + +test('true for sentencecase on sentencecase', t => { + const actual = ensure('Sentence case', 'sentence-case'); + t.is(actual, true); +}); + +test('false for lowsercase on sentencecase', t => { + t.is(ensure('sentence case', 'sentence-case'), false); +}); + +test('false for UPPERCASE on sentencecase', t => { + t.is(ensure('UPPERCASE', 'sentence-case'), false); +}); + +test('false for Start Case on sentencecase', t => { + t.is(ensure('Start Case', 'sentence-case'), false); +}); + +test('false for PascalCase on sentencecase', t => { + t.is(ensure('PascalCase', 'sentence-case'), false); +}); + +test('false for kebab-case on sentencecase', t => { + t.is(ensure('kebab-case', 'sentence-case'), false); +}); + +test('false for snake_case on sentencecase', t => { + t.is(ensure('snake_case', 'sentence-case'), false); +}); + +test('false for camelCase on sentencecase', t => { + t.is(ensure('camelCase', 'sentence-case'), false); +}); diff --git a/@commitlint/core/src/rules/scope-case.test.js b/@commitlint/core/src/rules/scope-case.test.js index 313fd8acd3..c87f7b8a6c 100644 --- a/@commitlint/core/src/rules/scope-case.test.js +++ b/@commitlint/core/src/rules/scope-case.test.js @@ -159,11 +159,7 @@ test('with kebabcase scope should fail for "always pascalcase"', async t => { }); test('with kebabcase scope should succeed for "always kebabcase"', async t => { - const [actual] = scopeCase( - await parsed.kebabcase, - 'always', - 'kebabcase-case' - ); + const [actual] = scopeCase(await parsed.kebabcase, 'always', 'kebab-case'); const expected = true; t.is(actual, expected); }); diff --git a/docs/reference-rules.md b/docs/reference-rules.md index f2ccb865c1..cc1c5824e6 100644 --- a/docs/reference-rules.md +++ b/docs/reference-rules.md @@ -116,8 +116,10 @@ Rule configurations are either of type `array` residing on a key with the rule's 'camel-case', // camelCase 'kebab-case', // kebab-case 'pascal-case', // PascalCase + 'sentence-case', // Sentence case 'snake-case', // snake_case - 'start-case' // Start Case + 'start-case', // Start Case + 'sentence-case' // Sentence case ] ``` @@ -155,8 +157,10 @@ Rule configurations are either of type `array` residing on a key with the rule's 'camel-case', // camelCase 'kebab-case', // kebab-case 'pascal-case', // PascalCase + 'sentence-case', // Sentence case 'snake-case', // snake_case - 'start-case' // Start Case + 'start-case', // Start Case + 'sentence-case' // Sentence case ] ``` @@ -220,8 +224,10 @@ Rule configurations are either of type `array` residing on a key with the rule's 'camel-case', // camelCase 'kebab-case', // kebab-case 'pascal-case', // PascalCase + 'sentence-case', // Sentence case 'snake-case', // snake_case - 'start-case' // Start Case + 'start-case', // Start Case + 'sentence-case' // Sentence case ] ``` diff --git a/yarn.lock b/yarn.lock index 859377ca49..db138f8910 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2071,7 +2071,7 @@ debug@^3.0.1, debug@^3.1.0: dependencies: ms "2.0.0" -debuglog@*, debuglog@^1.0.1: +debuglog@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" @@ -3599,7 +3599,7 @@ import-modules@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/import-modules/-/import-modules-1.1.0.tgz#748db79c5cc42bb9701efab424f894e72600e9dc" -imurmurhash@*, imurmurhash@^0.1.4: +imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -4460,10 +4460,6 @@ lockfile@~1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/lockfile/-/lockfile-1.0.3.tgz#2638fc39a0331e9cac1a04b71799931c9c50df79" -lodash._baseindexof@*: - version "3.1.0" - resolved "https://registry.npmjs.org/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" - lodash._baseuniq@~4.6.0: version "4.6.0" resolved "https://registry.npmjs.org/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" @@ -4471,28 +4467,10 @@ lodash._baseuniq@~4.6.0: lodash._createset "~4.0.0" lodash._root "~3.0.0" -lodash._bindcallback@*: - version "3.0.1" - resolved "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" - -lodash._cacheindexof@*: - version "3.0.2" - resolved "https://registry.npmjs.org/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" - -lodash._createcache@*: - version "3.1.2" - resolved "https://registry.npmjs.org/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" - dependencies: - lodash._getnative "^3.0.0" - lodash._createset@~4.0.0: version "4.0.3" resolved "https://registry.npmjs.org/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" -lodash._getnative@*, lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" @@ -4549,10 +4527,6 @@ lodash.merge@^4.6.0: version "4.6.0" resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5" -lodash.restparam@*: - version "3.6.1" - resolved "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - lodash.snakecase@^4.0.1: version "4.1.1" resolved "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" @@ -5865,7 +5839,7 @@ readable-stream@~1.1.10: isarray "0.0.1" string_decoder "~0.10.x" -readdir-scoped-modules@*, readdir-scoped-modules@^1.0.0: +readdir-scoped-modules@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" dependencies: @@ -7028,7 +7002,7 @@ v8flags@^2.1.1: dependencies: user-home "^1.1.1" -validate-npm-package-license@*, validate-npm-package-license@^3.0.1: +validate-npm-package-license@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" dependencies: