From ee822f6ebec3153d215ccec32f8f3eaf31fe7d91 Mon Sep 17 00:00:00 2001 From: Roman Hotsiy Date: Thu, 8 Feb 2018 00:51:00 +0200 Subject: [PATCH] fix: filter out non-existing security schemas + warn --- src/services/models/SecurityRequirement.ts | 42 +++++++++++++--------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/src/services/models/SecurityRequirement.ts b/src/services/models/SecurityRequirement.ts index 2a2a601c25..ee2e594437 100644 --- a/src/services/models/SecurityRequirement.ts +++ b/src/services/models/SecurityRequirement.ts @@ -2,26 +2,36 @@ import { OpenAPISecurityRequirement } from '../../types'; import { SECURITY_SCHEMES_SECTION } from '../../utils/openapi'; import { OpenAPIParser } from '../OpenAPIParser'; +interface SecurityScheme { + id: string; + sectionId: string; + type: string; + scopes: string[]; +} + export class SecurityRequirementModel { - schemes: Array<{ - id: string; - sectionId: string; - type: string; - scopes: string[]; - }>; + schemes: SecurityScheme[]; constructor(requirement: OpenAPISecurityRequirement, parser: OpenAPIParser) { const schemes = (parser.spec.components && parser.spec.components.securitySchemes) || {}; - this.schemes = Object.keys(requirement || {}).map(id => { - const scheme = parser.deref(schemes[id]); - const scopes = requirement[id] || []; - return { - id, - sectionId: SECURITY_SCHEMES_SECTION + id, - type: scheme.type, - scopes, - }; - }); + this.schemes = Object.keys(requirement || {}) + .map(id => { + const scheme = parser.deref(schemes[id]); + const scopes = requirement[id] || []; + + if (!scheme) { + console.warn(`Non existing security scheme referenced: ${id}. Skipping`); + return null; + } + + return { + id, + sectionId: SECURITY_SCHEMES_SECTION + id, + type: scheme.type, + scopes, + }; + }) + .filter(scheme => scheme !== undefined) as SecurityScheme[]; } }