@@ -11,11 +11,11 @@ exports.parse = parseQuery;
1111
1212// -----------------------------------------------------------------------------
1313
14- var RE_MEDIA_QUERY = / (?: ( o n l y | n o t ) ? \s * ( [ ^ \s \( \) ] + ) (?: \s * a n d ) ? \s * ) ? ( . + ) ? / i,
15- RE_MQ_EXPRESSION = / \( \s * ( [ ^ \s \: \) ] + ) \s * (?: \: \s * ( [ ^ \s \ )] + ) ) ? \s * \) / ,
14+ var RE_MEDIA_QUERY = / ^ (?: ( o n l y | n o t ) ? \s * ( [ _ a - z ] [ _ a - z 0 - 9 - ] * ) | ( \( [ ^ \) ] + \) ) ) (?: \s * a n d \s * ( . * ) ) ? $ / i,
15+ RE_MQ_EXPRESSION = / ^ \( \s * ( [ _ a - z - ] [ _ a - z 0 - 9 - ] * ) \s * (?: \: \s * ( [ ^ \) ] + ) ) ? \s * \) $ / ,
1616 RE_MQ_FEATURE = / ^ (?: ( m i n | m a x ) - ) ? ( .+ ) / ,
17- RE_LENGTH_UNIT = / ( e m | r e m | p x | c m | m m | i n | p t | p c ) ? $ / ,
18- RE_RESOLUTION_UNIT = / ( d p i | d p c m | d p p x ) ? $ / ;
17+ RE_LENGTH_UNIT = / ( e m | r e m | p x | c m | m m | i n | p t | p c ) ? \s * $ / ,
18+ RE_RESOLUTION_UNIT = / ( d p i | d p c m | d p p x ) ? \s * $ / ;
1919
2020function matchQuery ( mediaQuery , values ) {
2121 return parseQuery ( mediaQuery ) . some ( function ( query ) {
@@ -88,21 +88,44 @@ function parseQuery(mediaQuery) {
8888 return mediaQuery . split ( ',' ) . map ( function ( query ) {
8989 query = query . trim ( ) ;
9090
91- var captures = query . match ( RE_MEDIA_QUERY ) ,
92- modifier = captures [ 1 ] ,
91+ var captures = query . match ( RE_MEDIA_QUERY ) ;
92+
93+ // Media Query must be valid.
94+ if ( ! captures ) {
95+ throw new SyntaxError ( 'Invalid CSS media query: ' + query ) ;
96+ }
97+
98+ var modifier = captures [ 1 ] ,
9399 type = captures [ 2 ] ,
94- expressions = captures [ 3 ] || '' ,
100+ expressions = ( ( captures [ 3 ] || '' ) + ( captures [ 4 ] || '' ) ) . trim ( ) ,
95101 parsed = { } ;
96102
97103 parsed . inverse = ! ! modifier && modifier . toLowerCase ( ) === 'not' ;
98104 parsed . type = type ? type . toLowerCase ( ) : 'all' ;
99105
106+ // Check for media query expressions.
107+ if ( ! expressions ) {
108+ parsed . expressions = [ ] ;
109+ return parsed ;
110+ }
111+
100112 // Split expressions into a list.
101- expressions = expressions . match ( / \( [ ^ \) ] + \) / g) || [ ] ;
113+ expressions = expressions . match ( / \( [ ^ \) ] + \) / g) ;
114+
115+ // Media Query must be valid.
116+ if ( ! expressions ) {
117+ throw new SyntaxError ( 'Invalid CSS media query: ' + query ) ;
118+ }
102119
103120 parsed . expressions = expressions . map ( function ( expression ) {
104- var captures = expression . match ( RE_MQ_EXPRESSION ) ,
105- feature = captures [ 1 ] . toLowerCase ( ) . match ( RE_MQ_FEATURE ) ;
121+ var captures = expression . match ( RE_MQ_EXPRESSION ) ;
122+
123+ // Media Query must be valid.
124+ if ( ! captures ) {
125+ throw new SyntaxError ( 'Invalid CSS media query: ' + query ) ;
126+ }
127+
128+ var feature = captures [ 1 ] . toLowerCase ( ) . match ( RE_MQ_FEATURE ) ;
106129
107130 return {
108131 modifier : feature [ 1 ] ,
0 commit comments