@@ -35,7 +35,11 @@ import { InternalOptions } from './types/options'
3535
3636// Imports:
3737import * as Swagger2OpenAPI from 'swagger2openapi'
38- import * as OASValidator from 'oas-validator'
38+ import {
39+ Spectral as OASValidator ,
40+ isOpenApiv2 ,
41+ isOpenApiv3
42+ } from '@stoplight/spectral'
3943import debug from 'debug'
4044import { handleWarning , MitigationTypes } from './utils'
4145import * as jsonptr from 'json-ptr'
@@ -131,7 +135,6 @@ export function methodToHttpMethod(method: string): HTTP_METHODS {
131135 */
132136export function getValidOAS3 (
133137 spec : Oas2 | Oas3 ,
134- oasValidatorOptions : object ,
135138 swagger2OpenAPIOptions : object
136139) : Promise < Oas3 > {
137140 return new Promise ( ( resolve , reject ) => {
@@ -161,8 +164,25 @@ export function getValidOAS3(
161164 ) {
162165 preprocessingLog ( `Received OpenAPI Specification - going to validate...` )
163166
164- OASValidator . validate ( spec , oasValidatorOptions )
165- . then ( ( ) => resolve ( spec as Oas3 ) )
167+ const validator = new OASValidator ( )
168+ validator . registerFormat ( 'oas3' , isOpenApiv3 )
169+
170+ validator
171+ . loadRuleset ( 'spectral:oas' )
172+ . then ( ( ) => validator . run ( spec ) )
173+ . then ( ( results ) => {
174+ for ( const result of results ) {
175+ if ( result . severity < 1 ) {
176+ return reject (
177+ `Invalid OpenAPI Specification '${
178+ ( spec as Oas3 ) . info . title
179+ } '. [${ result . path . join ( '.' ) } ] ${ result . message } `
180+ )
181+ }
182+ }
183+
184+ resolve ( spec as Oas3 )
185+ } )
166186 . catch ( ( error ) =>
167187 reject (
168188 `Could not validate OpenAPI Specification '${
@@ -419,7 +439,7 @@ export function getSchemaTargetGraphQLType<TSource, TContext, TArgs>(
419439 oas : Oas3
420440) : TargetGraphQLType | null {
421441 let schema : SchemaObject
422- if ( " $ref" in schemaOrRef && typeof schemaOrRef . $ref === 'string' ) {
442+ if ( ' $ref' in schemaOrRef && typeof schemaOrRef . $ref === 'string' ) {
423443 schema = resolveRef ( schemaOrRef . $ref , oas )
424444 } else {
425445 schema = schemaOrRef as SchemaObject
@@ -529,7 +549,10 @@ function hasNestedOneOfUsage(schema: SchemaObject, oas: Oas3): boolean {
529549 Array . isArray ( schema . oneOf ) &&
530550 schema . oneOf . some ( ( memberSchemaOrRef ) => {
531551 let memberSchema : SchemaObject
532- if ( "$ref" in memberSchemaOrRef && typeof memberSchemaOrRef . $ref === 'string' ) {
552+ if (
553+ '$ref' in memberSchemaOrRef &&
554+ typeof memberSchemaOrRef . $ref === 'string'
555+ ) {
533556 memberSchema = resolveRef ( memberSchemaOrRef . $ref , oas )
534557 } else {
535558 memberSchema = memberSchemaOrRef as SchemaObject
@@ -560,7 +583,10 @@ function hasNestedAnyOfUsage(schema: SchemaObject, oas: Oas3): boolean {
560583 schema . anyOf . some ( ( memberSchemaOrRef ) => {
561584 let memberSchema : SchemaObject
562585
563- if ( "$ref" in memberSchemaOrRef && typeof memberSchemaOrRef . $ref === 'string' ) {
586+ if (
587+ '$ref' in memberSchemaOrRef &&
588+ typeof memberSchemaOrRef . $ref === 'string'
589+ ) {
564590 memberSchema = resolveRef ( memberSchemaOrRef . $ref , oas )
565591 } else {
566592 memberSchema = memberSchemaOrRef as SchemaObject
@@ -809,11 +835,11 @@ export function getRequestSchemaAndNames(
809835 requestBodyObjectOrRef !== null
810836 ) {
811837 // Resolve reference if applicable. Make sure we have a RequestBodyObject:
812- if ( "$ref" in requestBodyObjectOrRef && typeof requestBodyObjectOrRef . $ref === 'string' ) {
813- requestBodyObject = resolveRef (
814- requestBodyObjectOrRef . $ref ,
815- oas
816- )
838+ if (
839+ '$ref' in requestBodyObjectOrRef &&
840+ typeof requestBodyObjectOrRef . $ref === 'string'
841+ ) {
842+ requestBodyObject = resolveRef ( requestBodyObjectOrRef . $ref , oas )
817843 } else {
818844 requestBodyObject = requestBodyObjectOrRef as RequestBodyObject
819845 }
@@ -859,14 +885,11 @@ export function getRequestSchemaAndNames(
859885 ) {
860886 // Resolve payload schema reference if applicable
861887 if (
862- " $ref" in payloadSchemaOrRef &&
888+ ' $ref' in payloadSchemaOrRef &&
863889 typeof payloadSchemaOrRef . $ref === 'string'
864890 ) {
865891 fromRef = payloadSchemaOrRef . $ref . split ( '/' ) . pop ( )
866- payloadSchema = resolveRef (
867- payloadSchemaOrRef . $ref ,
868- oas
869- )
892+ payloadSchema = resolveRef ( payloadSchemaOrRef . $ref , oas )
870893 } else {
871894 payloadSchema = payloadSchemaOrRef as SchemaObject
872895 }
@@ -946,11 +969,11 @@ export function getResponseSchemaAndNames<TSource, TContext, TArgs>(
946969 // Get response object
947970 const responseObjectOrRef = operation ?. responses ?. [ statusCode ]
948971 if ( typeof responseObjectOrRef === 'object' && responseObjectOrRef !== null ) {
949- if ( "$ref" in responseObjectOrRef && typeof responseObjectOrRef . $ref === 'string' ) {
950- responseObject = resolveRef (
951- responseObjectOrRef . $ref ,
952- oas
953- )
972+ if (
973+ '$ref' in responseObjectOrRef &&
974+ typeof responseObjectOrRef . $ref === 'string'
975+ ) {
976+ responseObject = resolveRef ( responseObjectOrRef . $ref , oas )
954977 } else {
955978 responseObject = responseObjectOrRef as ResponseObject
956979 }
@@ -984,14 +1007,11 @@ export function getResponseSchemaAndNames<TSource, TContext, TArgs>(
9841007 responseObject ?. content ?. [ responseContentType ] ?. schema
9851008 // Resolve response schema reference if applicable
9861009 if (
987- " $ref" in responseSchemaOrRef &&
1010+ ' $ref' in responseSchemaOrRef &&
9881011 typeof responseSchemaOrRef . $ref === 'string'
9891012 ) {
9901013 fromRef = responseSchemaOrRef . $ref . split ( '/' ) . pop ( )
991- responseSchema = resolveRef (
992- responseSchemaOrRef . $ref ,
993- oas
994- )
1014+ responseSchema = resolveRef ( responseSchemaOrRef . $ref , oas )
9951015 } else {
9961016 responseSchema = responseSchemaOrRef as SchemaObject
9971017 }
@@ -1121,11 +1141,11 @@ export function getLinks<TSource, TContext, TArgs>(
11211141 const responseObjectOrRef = responses [ statusCode ]
11221142
11231143 let response : ResponseObject
1124- if ( "$ref" in responseObjectOrRef && typeof responseObjectOrRef . $ref === 'string' ) {
1125- response = resolveRef (
1126- responseObjectOrRef . $ref ,
1127- oas
1128- )
1144+ if (
1145+ '$ref' in responseObjectOrRef &&
1146+ typeof responseObjectOrRef . $ref === 'string'
1147+ ) {
1148+ response = resolveRef ( responseObjectOrRef . $ref , oas )
11291149 } else {
11301150 response = responseObjectOrRef as ResponseObject
11311151 }
@@ -1136,7 +1156,10 @@ export function getLinks<TSource, TContext, TArgs>(
11361156 const linkObjectOrRef = epLinks [ linkKey ]
11371157
11381158 let link : LinkObject
1139- if ( "$ref" in linkObjectOrRef && typeof linkObjectOrRef . $ref === 'string' ) {
1159+ if (
1160+ '$ref' in linkObjectOrRef &&
1161+ typeof linkObjectOrRef . $ref === 'string'
1162+ ) {
11401163 link = resolveRef ( linkObjectOrRef . $ref , oas )
11411164 } else {
11421165 link = linkObjectOrRef as LinkObject
@@ -1173,17 +1196,15 @@ export function getParameters(
11731196 // First, consider parameters in Path Item Object:
11741197 const pathParams = pathItem . parameters
11751198 if ( Array . isArray ( pathParams ) ) {
1176- const pathItemParameters : ParameterObject [ ] = pathParams . map (
1177- ( p ) => {
1178- if ( "$ref" in p && typeof p . $ref === 'string' ) {
1179- // Here we know we have a parameter object:
1180- return resolveRef ( p . $ref , oas ) as ParameterObject
1181- } else {
1182- // Here we know we have a parameter object:
1183- return p as ParameterObject
1184- }
1199+ const pathItemParameters : ParameterObject [ ] = pathParams . map ( ( p ) => {
1200+ if ( '$ref' in p && typeof p . $ref === 'string' ) {
1201+ // Here we know we have a parameter object:
1202+ return resolveRef ( p . $ref , oas ) as ParameterObject
1203+ } else {
1204+ // Here we know we have a parameter object:
1205+ return p as ParameterObject
11851206 }
1186- )
1207+ } )
11871208 parameters = parameters . concat ( pathItemParameters )
11881209 }
11891210
@@ -1192,7 +1213,7 @@ export function getParameters(
11921213 if ( Array . isArray ( opObjectParameters ) ) {
11931214 const operationParameters : ParameterObject [ ] = opObjectParameters . map (
11941215 ( p ) => {
1195- if ( " $ref" in p && typeof p . $ref === 'string' ) {
1216+ if ( ' $ref' in p && typeof p . $ref === 'string' ) {
11961217 // Here we know we have a parameter object:
11971218 return resolveRef ( p . $ref , oas )
11981219 } else {
@@ -1262,12 +1283,12 @@ export function getSecuritySchemes(
12621283 const securitySchemeOrRef = oas . components . securitySchemes [ schemeKey ]
12631284
12641285 // Ensure we have actual SecuritySchemeObject:
1265- if ( "$ref" in securitySchemeOrRef && typeof securitySchemeOrRef . $ref === 'string' ) {
1286+ if (
1287+ '$ref' in securitySchemeOrRef &&
1288+ typeof securitySchemeOrRef . $ref === 'string'
1289+ ) {
12661290 // Result of resolution will be SecuritySchemeObject:
1267- securitySchemes [ schemeKey ] = resolveRef (
1268- securitySchemeOrRef . $ref ,
1269- oas
1270- )
1291+ securitySchemes [ schemeKey ] = resolveRef ( securitySchemeOrRef . $ref , oas )
12711292 } else {
12721293 // We already have a SecuritySchemeObject:
12731294 securitySchemes [ schemeKey ] = securitySchemeOrRef as SecuritySchemeObject
0 commit comments