11const R = require ( 'ramda' ) ;
22const mediaTyper = require ( 'media-typer' ) ;
33const pipeParseResult = require ( '../../pipeParseResult' ) ;
4- const { isExtension, hasKey, getValue } = require ( '../../predicates' ) ;
4+ const {
5+ isExtension, hasKey, getKey, getValue,
6+ } = require ( '../../predicates' ) ;
57const {
68 createWarning,
79 createUnsupportedMemberWarning,
@@ -44,6 +46,15 @@ function parseExample(namespace, mediaType) {
4446const parseSchemaObjectOrRef = parseReference ( 'schemas' , parseSchemaObject ) ;
4547const parseExampleObjectOrRef = parseReference ( 'examples' , parseExampleObject ) ;
4648
49+ const isValidMediaType = ( mediaType ) => {
50+ try {
51+ mediaTyper . parse ( mediaType . toValue ( ) ) ;
52+ } catch ( error ) {
53+ return false ;
54+ }
55+ return true ;
56+ } ;
57+
4758/**
4859 * Parse Media Type Object
4960 *
@@ -59,6 +70,14 @@ function parseMediaTypeObject(context, MessageBodyClass, element) {
5970 const { namespace } = context ;
6071 const mediaType = element . key . toValue ( ) ;
6172
73+ const createInvalidMediaTypeWarning = mediaType => createWarning ( namespace ,
74+ `'${ name } ' media type '${ mediaType . toValue ( ) } ' is invalid` , mediaType ) ;
75+
76+ const validateMediaType = R . unless (
77+ R . compose ( isValidMediaType , getKey ) ,
78+ R . compose ( createInvalidMediaTypeWarning , getKey )
79+ ) ;
80+
6281 const createExamplesNotJSONWarning = createWarning ( namespace ,
6382 `'${ name } ' 'examples' is only supported for JSON media types` ) ;
6483
@@ -99,6 +118,8 @@ function parseMediaTypeObject(context, MessageBodyClass, element) {
99118 ] ) ;
100119
101120 const parseMediaType = pipeParseResult ( namespace ,
121+ validateMediaType ,
122+ getValue ,
102123 parseObject ( context , name , parseMember ) ,
103124 ( mediaTypeObject ) => {
104125 const message = new MessageBodyClass ( ) ;
@@ -146,7 +167,7 @@ function parseMediaTypeObject(context, MessageBodyClass, element) {
146167 return message ;
147168 } ) ;
148169
149- return parseMediaType ( element . value ) ;
170+ return parseMediaType ( element ) ;
150171}
151172
152173module . exports = R . curry ( parseMediaTypeObject ) ;
0 commit comments