@@ -35,7 +35,11 @@ import { InternalOptions } from './types/options'
35
35
36
36
// Imports:
37
37
import * 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'
39
43
import debug from 'debug'
40
44
import { handleWarning , MitigationTypes } from './utils'
41
45
import * as jsonptr from 'json-ptr'
@@ -131,7 +135,6 @@ export function methodToHttpMethod(method: string): HTTP_METHODS {
131
135
*/
132
136
export function getValidOAS3 (
133
137
spec : Oas2 | Oas3 ,
134
- oasValidatorOptions : object ,
135
138
swagger2OpenAPIOptions : object
136
139
) : Promise < Oas3 > {
137
140
return new Promise ( ( resolve , reject ) => {
@@ -161,8 +164,25 @@ export function getValidOAS3(
161
164
) {
162
165
preprocessingLog ( `Received OpenAPI Specification - going to validate...` )
163
166
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
+ } )
166
186
. catch ( ( error ) =>
167
187
reject (
168
188
`Could not validate OpenAPI Specification '${
@@ -419,7 +439,7 @@ export function getSchemaTargetGraphQLType<TSource, TContext, TArgs>(
419
439
oas : Oas3
420
440
) : TargetGraphQLType | null {
421
441
let schema : SchemaObject
422
- if ( " $ref" in schemaOrRef && typeof schemaOrRef . $ref === 'string' ) {
442
+ if ( ' $ref' in schemaOrRef && typeof schemaOrRef . $ref === 'string' ) {
423
443
schema = resolveRef ( schemaOrRef . $ref , oas )
424
444
} else {
425
445
schema = schemaOrRef as SchemaObject
@@ -529,7 +549,10 @@ function hasNestedOneOfUsage(schema: SchemaObject, oas: Oas3): boolean {
529
549
Array . isArray ( schema . oneOf ) &&
530
550
schema . oneOf . some ( ( memberSchemaOrRef ) => {
531
551
let memberSchema : SchemaObject
532
- if ( "$ref" in memberSchemaOrRef && typeof memberSchemaOrRef . $ref === 'string' ) {
552
+ if (
553
+ '$ref' in memberSchemaOrRef &&
554
+ typeof memberSchemaOrRef . $ref === 'string'
555
+ ) {
533
556
memberSchema = resolveRef ( memberSchemaOrRef . $ref , oas )
534
557
} else {
535
558
memberSchema = memberSchemaOrRef as SchemaObject
@@ -560,7 +583,10 @@ function hasNestedAnyOfUsage(schema: SchemaObject, oas: Oas3): boolean {
560
583
schema . anyOf . some ( ( memberSchemaOrRef ) => {
561
584
let memberSchema : SchemaObject
562
585
563
- if ( "$ref" in memberSchemaOrRef && typeof memberSchemaOrRef . $ref === 'string' ) {
586
+ if (
587
+ '$ref' in memberSchemaOrRef &&
588
+ typeof memberSchemaOrRef . $ref === 'string'
589
+ ) {
564
590
memberSchema = resolveRef ( memberSchemaOrRef . $ref , oas )
565
591
} else {
566
592
memberSchema = memberSchemaOrRef as SchemaObject
@@ -809,11 +835,11 @@ export function getRequestSchemaAndNames(
809
835
requestBodyObjectOrRef !== null
810
836
) {
811
837
// 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 )
817
843
} else {
818
844
requestBodyObject = requestBodyObjectOrRef as RequestBodyObject
819
845
}
@@ -859,14 +885,11 @@ export function getRequestSchemaAndNames(
859
885
) {
860
886
// Resolve payload schema reference if applicable
861
887
if (
862
- " $ref" in payloadSchemaOrRef &&
888
+ ' $ref' in payloadSchemaOrRef &&
863
889
typeof payloadSchemaOrRef . $ref === 'string'
864
890
) {
865
891
fromRef = payloadSchemaOrRef . $ref . split ( '/' ) . pop ( )
866
- payloadSchema = resolveRef (
867
- payloadSchemaOrRef . $ref ,
868
- oas
869
- )
892
+ payloadSchema = resolveRef ( payloadSchemaOrRef . $ref , oas )
870
893
} else {
871
894
payloadSchema = payloadSchemaOrRef as SchemaObject
872
895
}
@@ -946,11 +969,11 @@ export function getResponseSchemaAndNames<TSource, TContext, TArgs>(
946
969
// Get response object
947
970
const responseObjectOrRef = operation ?. responses ?. [ statusCode ]
948
971
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 )
954
977
} else {
955
978
responseObject = responseObjectOrRef as ResponseObject
956
979
}
@@ -984,14 +1007,11 @@ export function getResponseSchemaAndNames<TSource, TContext, TArgs>(
984
1007
responseObject ?. content ?. [ responseContentType ] ?. schema
985
1008
// Resolve response schema reference if applicable
986
1009
if (
987
- " $ref" in responseSchemaOrRef &&
1010
+ ' $ref' in responseSchemaOrRef &&
988
1011
typeof responseSchemaOrRef . $ref === 'string'
989
1012
) {
990
1013
fromRef = responseSchemaOrRef . $ref . split ( '/' ) . pop ( )
991
- responseSchema = resolveRef (
992
- responseSchemaOrRef . $ref ,
993
- oas
994
- )
1014
+ responseSchema = resolveRef ( responseSchemaOrRef . $ref , oas )
995
1015
} else {
996
1016
responseSchema = responseSchemaOrRef as SchemaObject
997
1017
}
@@ -1121,11 +1141,11 @@ export function getLinks<TSource, TContext, TArgs>(
1121
1141
const responseObjectOrRef = responses [ statusCode ]
1122
1142
1123
1143
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 )
1129
1149
} else {
1130
1150
response = responseObjectOrRef as ResponseObject
1131
1151
}
@@ -1136,7 +1156,10 @@ export function getLinks<TSource, TContext, TArgs>(
1136
1156
const linkObjectOrRef = epLinks [ linkKey ]
1137
1157
1138
1158
let link : LinkObject
1139
- if ( "$ref" in linkObjectOrRef && typeof linkObjectOrRef . $ref === 'string' ) {
1159
+ if (
1160
+ '$ref' in linkObjectOrRef &&
1161
+ typeof linkObjectOrRef . $ref === 'string'
1162
+ ) {
1140
1163
link = resolveRef ( linkObjectOrRef . $ref , oas )
1141
1164
} else {
1142
1165
link = linkObjectOrRef as LinkObject
@@ -1173,17 +1196,15 @@ export function getParameters(
1173
1196
// First, consider parameters in Path Item Object:
1174
1197
const pathParams = pathItem . parameters
1175
1198
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
1185
1206
}
1186
- )
1207
+ } )
1187
1208
parameters = parameters . concat ( pathItemParameters )
1188
1209
}
1189
1210
@@ -1192,7 +1213,7 @@ export function getParameters(
1192
1213
if ( Array . isArray ( opObjectParameters ) ) {
1193
1214
const operationParameters : ParameterObject [ ] = opObjectParameters . map (
1194
1215
( p ) => {
1195
- if ( " $ref" in p && typeof p . $ref === 'string' ) {
1216
+ if ( ' $ref' in p && typeof p . $ref === 'string' ) {
1196
1217
// Here we know we have a parameter object:
1197
1218
return resolveRef ( p . $ref , oas )
1198
1219
} else {
@@ -1262,12 +1283,12 @@ export function getSecuritySchemes(
1262
1283
const securitySchemeOrRef = oas . components . securitySchemes [ schemeKey ]
1263
1284
1264
1285
// 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
+ ) {
1266
1290
// Result of resolution will be SecuritySchemeObject:
1267
- securitySchemes [ schemeKey ] = resolveRef (
1268
- securitySchemeOrRef . $ref ,
1269
- oas
1270
- )
1291
+ securitySchemes [ schemeKey ] = resolveRef ( securitySchemeOrRef . $ref , oas )
1271
1292
} else {
1272
1293
// We already have a SecuritySchemeObject:
1273
1294
securitySchemes [ schemeKey ] = securitySchemeOrRef as SecuritySchemeObject
0 commit comments