From f070f4e6708b2bd9a50614497fcfb65759f58492 Mon Sep 17 00:00:00 2001 From: Matatjahu Date: Thu, 19 May 2022 12:36:11 +0200 Subject: [PATCH] feat(rulesets): apply review suggestions --- docs/reference/asyncapi-rules.md | 2 +- docs/reference/openapi-rules.md | 4 +- packages/rulesets/src/asyncapi/index.ts | 2 +- packages/rulesets/src/oas/index.ts | 2 +- .../src/shared/functions/uniquenessTags.ts | 44 +++++++------------ 5 files changed, 21 insertions(+), 33 deletions(-) diff --git a/docs/reference/asyncapi-rules.md b/docs/reference/asyncapi-rules.md index 43666cff4..fa11723df 100644 --- a/docs/reference/asyncapi-rules.md +++ b/docs/reference/asyncapi-rules.md @@ -343,7 +343,7 @@ tags: ### asyncapi-tags-uniqueness -Tags have duplicate names (identifiers). +Tags must not have duplicate names (identifiers). **Recommended:** Yes diff --git a/docs/reference/openapi-rules.md b/docs/reference/openapi-rules.md index 69e1884c8..3abcbcb47 100644 --- a/docs/reference/openapi-rules.md +++ b/docs/reference/openapi-rules.md @@ -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 diff --git a/packages/rulesets/src/asyncapi/index.ts b/packages/rulesets/src/asyncapi/index.ts index 0a74000d3..660c1bb38 100644 --- a/packages/rulesets/src/asyncapi/index.ts +++ b/packages/rulesets/src/asyncapi/index.ts @@ -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, diff --git a/packages/rulesets/src/oas/index.ts b/packages/rulesets/src/oas/index.ts index 23e65a683..9f5c21e74 100644 --- a/packages/rulesets/src/oas/index.ts +++ b/packages/rulesets/src/oas/index.ts @@ -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, diff --git a/packages/rulesets/src/shared/functions/uniquenessTags.ts b/packages/rulesets/src/shared/functions/uniquenessTags.ts index e478bfb17..ba711db2c 100644 --- a/packages/rulesets/src/shared/functions/uniquenessTags.ts +++ b/packages/rulesets/src/shared/functions/uniquenessTags.ts @@ -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((acc, item, i, arr) => { + if (arr.indexOf(item) !== i) { + acc.push(i); + } + return acc; + }, []); } export default createRulesetFunction( @@ -30,31 +31,18 @@ export default createRulesetFunction( 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; },