Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: enable multiple scopes in scope-enum and scope-case rules #901

Merged
merged 1 commit into from
Jun 21, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions @commitlint/rules/src/scope-case.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@ export const scopeCase: SyncRule<TargetCaseType | TargetCaseType[]> = (
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 => {
Expand Down
24 changes: 22 additions & 2 deletions @commitlint/rules/src/scope-enum.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 () => {
Expand Down Expand Up @@ -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);
});
9 changes: 8 additions & 1 deletion @commitlint/rules/src/scope-enum.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,15 @@ export const scopeEnum: SyncRule<string[]> = (
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,
Expand Down