@@ -11,11 +11,11 @@ exports.parse = parseQuery;
11
11
12
12
// -----------------------------------------------------------------------------
13
13
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 * \) $ / ,
16
16
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 * $ / ;
19
19
20
20
function matchQuery ( mediaQuery , values ) {
21
21
return parseQuery ( mediaQuery ) . some ( function ( query ) {
@@ -88,21 +88,44 @@ function parseQuery(mediaQuery) {
88
88
return mediaQuery . split ( ',' ) . map ( function ( query ) {
89
89
query = query . trim ( ) ;
90
90
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 ] ,
93
99
type = captures [ 2 ] ,
94
- expressions = captures [ 3 ] || '' ,
100
+ expressions = ( ( captures [ 3 ] || '' ) + ( captures [ 4 ] || '' ) ) . trim ( ) ,
95
101
parsed = { } ;
96
102
97
103
parsed . inverse = ! ! modifier && modifier . toLowerCase ( ) === 'not' ;
98
104
parsed . type = type ? type . toLowerCase ( ) : 'all' ;
99
105
106
+ // Check for media query expressions.
107
+ if ( ! expressions ) {
108
+ parsed . expressions = [ ] ;
109
+ return parsed ;
110
+ }
111
+
100
112
// 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
+ }
102
119
103
120
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 ) ;
106
129
107
130
return {
108
131
modifier : feature [ 1 ] ,
0 commit comments