@@ -46,9 +46,28 @@ const getInnerErrors = (inner, depth = 0) => {
4646
4747const uniqStrings = ( items ) => Object . keys ( items . reduce ( ( result , item ) => Object . assign ( { } , result , { [ item ] : '' } ) , { } ) ) ;
4848
49+ const getValidatorErrors = ( error ) => {
50+ if ( ! error ) {
51+ return [ ] ;
52+ }
53+
54+ if ( Array . isArray ( error . details ) ) {
55+ return error . details . map ( getError ) ;
56+ } else {
57+ return [ {
58+ type : 'error' ,
59+ label : error . name ,
60+ title : error . message ,
61+ context : ''
62+ } ] ;
63+ }
64+ } ;
65+
4966const validate = ( script , options = { } ) => new Promise ( ( resolve , reject ) => {
5067 SwaggerParser . validate ( script , options , ( err , api ) => {
51- if ( ! err ) {
68+ const errors = getValidatorErrors ( err ) . concat ( checkPathParameters ( script ) ) ;
69+
70+ if ( errors . length === 0 ) {
5271 return resolve ( [ {
5372 type : 'success' ,
5473 label : '' ,
@@ -59,19 +78,54 @@ const validate = (script, options = {}) => new Promise((resolve, reject) => {
5978 basePath : api . basePath
6079 }
6180 } ] ) ;
62- } else if ( Array . isArray ( err . details ) ) {
63- resolve ( err . details . map ( getError ) ) ;
6481 } else {
65- resolve ( [ {
66- type : 'error' ,
67- label : err . name ,
68- title : err . message ,
69- context : ''
70- } ] ) ;
82+ resolve ( errors ) ;
7183 }
7284 } ) ;
7385} ) ;
7486
87+ const getPathParameters = ( pathName ) => {
88+ const regExp = / \{ ( [ \s \S ] + ?) \} / ;
89+
90+ return ( pathName . match ( new RegExp ( regExp , 'g' ) ) || [ ] ) . map ( ( parameter ) => {
91+ return parameter . match ( regExp ) [ 1 ] ;
92+ } ) ;
93+ } ;
94+
95+ const createPathParameterError = ( pathName , parameter ) => {
96+ return {
97+ type : 'error' ,
98+ label : 'Semantic Error' ,
99+ title : 'Semantic error at ' + `paths.${ pathName } ` ,
100+ context : `Declared path parameter "${ parameter } " needs to be defined as a path parameter at either the path or operation level`
101+ } ;
102+ } ;
103+
104+ const checkPathParameters = ( schema ) => {
105+ return Object . keys ( schema . paths ) . reduce ( ( errors , pathName ) => {
106+ const pathParameters = getPathParameters ( pathName ) ;
107+ const requests = schema . paths [ pathName ] || { } ;
108+
109+ return pathParameters . reduce ( ( errors , parameter ) => {
110+ return Object . keys ( requests ) . reduce ( ( errors , requestName ) => {
111+ const request = requests [ requestName ] ;
112+
113+ if ( ! Array . isArray ( request . parameters ) ) {
114+ return errors . concat ( createPathParameterError ( pathName , parameter ) ) ;
115+ }
116+
117+ const param = request . parameters . find ( ( param ) => param . name === parameter && param . in === 'path' ) ;
118+
119+ if ( param ) {
120+ return errors ;
121+ }
122+
123+ return errors . concat ( createPathParameterError ( pathName , parameter ) ) ;
124+ } , errors ) ;
125+ } , errors ) ;
126+ } , [ ] ) ;
127+ } ;
128+
75129module . exports = {
76130 validate
77131} ;
0 commit comments