diff --git a/@commitlint/rules/src/scope-case.ts b/@commitlint/rules/src/scope-case.ts index 3c197d002b..247522e072 100644 --- a/@commitlint/rules/src/scope-case.ts +++ b/@commitlint/rules/src/scope-case.ts @@ -25,9 +25,9 @@ export const scopeCase: SyncRule = ( return check; }); - // Scopes may contain slash-delimiters to separate them and mark them as individual segments. + // Scopes may contain slash or comma delimiters to separate them and mark them as individual segments. // This means that each of these segments should be tested separately with `ensure`. - const delimiters = /(\/|\\)/g; + const delimiters = /\/|\\|,/g; const scopeSegments = scope.split(delimiters); const result = checks.some(check => { diff --git a/@commitlint/rules/src/scope-enum.test.ts b/@commitlint/rules/src/scope-enum.test.ts index 5054eee6f9..29d820a24a 100644 --- a/@commitlint/rules/src/scope-enum.test.ts +++ b/@commitlint/rules/src/scope-enum.test.ts @@ -4,13 +4,15 @@ import {scopeEnum} from './scope-enum'; const messages = { plain: 'foo(bar): baz', superfluous: 'foo(): baz', - empty: 'foo: baz' + empty: 'foo: baz', + multiple: 'foo(bar,baz): qux' }; const parsed = { plain: parse(messages.plain), superfluous: parse(messages.superfluous), - empty: parse(messages.empty) + empty: parse(messages.empty), + multiple: parse(messages.multiple) }; test('scope-enum with plain message and always should succeed empty enum', async () => { @@ -90,3 +92,21 @@ test('scope-enum with empty scope and never should succeed empty enum', async () const expected = true; expect(actual).toEqual(expected); }); + +test('scope-enum with multiple scope should succeed on message with multiple scope', async () => { + const [actual] = scopeEnum(await parsed.multiple, 'never', ['bar', 'baz']); + const expected = false; + expect(actual).toEqual(expected); +}); + +test('scope-enum with multiple scope should error on message with forbidden enum', async () => { + const [actual] = scopeEnum(await parsed.multiple, 'never', ['bar', 'qux']); + const expected = true; + expect(actual).toEqual(expected); +}); + +test('scope-enum with multiple scope should error on message with superfluous scope', async () => { + const [actual] = scopeEnum(await parsed.multiple, 'never', ['bar']); + const expected = true; + expect(actual).toEqual(expected); +}); diff --git a/@commitlint/rules/src/scope-enum.ts b/@commitlint/rules/src/scope-enum.ts index 7185385f59..bc3d33de47 100644 --- a/@commitlint/rules/src/scope-enum.ts +++ b/@commitlint/rules/src/scope-enum.ts @@ -11,8 +11,15 @@ export const scopeEnum: SyncRule = ( return [true, '']; } + // Scopes may contain slash or comma delimiters to separate them and mark them as individual segments. + // This means that each of these segments should be tested separately with `ensure`. + const delimiters = /\/|\\|,/g; + const scopeSegments = parsed.scope.split(delimiters); + const negated = when === 'never'; - const result = value.length === 0 || ensure.enum(parsed.scope, value); + const result = + value.length === 0 || + scopeSegments.every(scope => ensure.enum(scope, value)); return [ negated ? !result : result,