Skip to content

Commit

Permalink
feat(rulesets): apply review suggestions
Browse files Browse the repository at this point in the history
  • Loading branch information
magicmatatjahu committed May 19, 2022
1 parent 7765b22 commit f070f4e
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 33 deletions.
2 changes: 1 addition & 1 deletion docs/reference/asyncapi-rules.md
Expand Up @@ -343,7 +343,7 @@ tags:

### asyncapi-tags-uniqueness

Tags have duplicate names (identifiers).
Tags must not have duplicate names (identifiers).

**Recommended:** Yes

Expand Down
4 changes: 2 additions & 2 deletions docs/reference/openapi-rules.md
Expand Up @@ -250,9 +250,9 @@ tags:
- name: "Badger"
```

### asyncapi-tags-uniqueness
### openapi-tags-uniqueness

OpenAPI object should have non-duplicated tag names (identifiers).
OpenAPI object must not have duplicated tag names (identifiers).

**Recommended:** Yes

Expand Down
2 changes: 1 addition & 1 deletion packages/rulesets/src/asyncapi/index.ts
Expand Up @@ -360,7 +360,7 @@ export default {
},
},
'asyncapi-tags-uniqueness': {
description: 'Each tags must have a unique names.',
description: 'Each tag must have a unique name.',
message: '{{error}}',
severity: 'error',
recommended: true,
Expand Down
2 changes: 1 addition & 1 deletion packages/rulesets/src/oas/index.ts
Expand Up @@ -214,7 +214,7 @@ const ruleset = {
},
},
'openapi-tags-uniqueness': {
description: 'Each tags must have a unique names.',
description: 'Each tag must have a unique name.',
message: '{{error}}',
severity: 'error',
recommended: true,
Expand Down
44 changes: 16 additions & 28 deletions packages/rulesets/src/shared/functions/uniquenessTags.ts
Expand Up @@ -4,14 +4,15 @@ import type { IFunctionResult } from '@stoplight/spectral-core';

type Tags = Array<{ name: string }>;

function getDuplicateTagNames(tags: Tags): string[] {
const tagNames = tags.map(item => item.name);
return tagNames.reduce((acc, item, idx, arr) => {
if (arr.indexOf(item) !== idx && acc.indexOf(item) < 0) {
acc.push(item);
}
return acc;
}, [] as string[]);
function getDuplicateTagsIndexes(tags: Tags): number[] {
return tags
.map(item => item.name)
.reduce<number[]>((acc, item, i, arr) => {
if (arr.indexOf(item) !== i) {
acc.push(i);
}
return acc;
}, []);
}

export default createRulesetFunction<Tags, null>(
Expand All @@ -30,31 +31,18 @@ export default createRulesetFunction<Tags, null>(
options: null,
},
function uniquenessTags(targetVal, _, ctx) {
const duplicatedTags = getDuplicateTagNames(targetVal);
const duplicatedTags = getDuplicateTagsIndexes(targetVal);
if (duplicatedTags.length === 0) return [];

const results: IFunctionResult[] = [];

duplicatedTags.map(duplicatedTag => {
let checkedFirst = false;
const duplicatedTags: number[] = [];
targetVal.forEach((tag, index) => {
if (tag.name === duplicatedTag) {
if (!checkedFirst) {
checkedFirst = true;
return;
}
duplicatedTags.push(index);
}
for (const duplicatedIndex of duplicatedTags) {
const duplicatedTag = targetVal[duplicatedIndex].name;
results.push({
message: `"tags" object contains duplicate tag name "${duplicatedTag}".`,
path: [...ctx.path, duplicatedIndex, 'name'],
});

results.push(
...duplicatedTags.map(duplicatedIndex => ({
message: `"tags" object contains duplicate tag name "${duplicatedTag}".`,
path: [...ctx.path, duplicatedIndex, 'name'],
})),
);
});
}

return results;
},
Expand Down

0 comments on commit f070f4e

Please sign in to comment.