@@ -20,14 +20,17 @@ const FOR_LOOP_EXPRESSION_PATTERN = /^\s*([0-9A-Za-z_$]*)\s+of\s+([\S\s]*)/;
20
20
const FOR_LOOP_TRACK_PATTERN = / ^ t r a c k \s + ( [ \S \s ] * ) / ;
21
21
22
22
/** Pattern for the `as` expression in a conditional block. */
23
- const CONDITIONAL_ALIAS_PATTERN = / ^ ( a s \s ) + ( .* ) / ;
23
+ const CONDITIONAL_ALIAS_PATTERN = / ^ ( a s \s + ) ( .* ) / ;
24
24
25
25
/** Pattern used to identify an `else if` block. */
26
26
const ELSE_IF_PATTERN = / ^ e l s e [ ^ \S \r \n ] + i f / ;
27
27
28
28
/** Pattern used to identify a `let` parameter. */
29
29
const FOR_LOOP_LET_PATTERN = / ^ l e t \s + ( [ \S \s ] * ) / ;
30
30
31
+ /** Pattern used to validate a JavaScript identifier. */
32
+ const IDENTIFIER_PATTERN = / ^ [ $ A - Z _ ] [ 0 - 9 A - Z _ $ ] * $ / i;
33
+
31
34
/**
32
35
* Pattern to group a string into leading whitespace, non whitespace, and trailing whitespace.
33
36
* Useful for getting the variable name span when a span can contain leading and trailing space.
@@ -630,9 +633,16 @@ function parseConditionalBlockParameters(
630
633
) ;
631
634
} else {
632
635
const name = aliasMatch [ 2 ] . trim ( ) ;
633
- const variableStart = param . sourceSpan . start . moveBy ( aliasMatch [ 1 ] . length ) ;
634
- const variableSpan = new ParseSourceSpan ( variableStart , variableStart . moveBy ( name . length ) ) ;
635
- expressionAlias = new t . Variable ( name , name , variableSpan , variableSpan ) ;
636
+
637
+ if ( IDENTIFIER_PATTERN . test ( name ) ) {
638
+ const variableStart = param . sourceSpan . start . moveBy ( aliasMatch [ 1 ] . length ) ;
639
+ const variableSpan = new ParseSourceSpan ( variableStart , variableStart . moveBy ( name . length ) ) ;
640
+ expressionAlias = new t . Variable ( name , name , variableSpan , variableSpan ) ;
641
+ } else {
642
+ errors . push (
643
+ new ParseError ( param . sourceSpan , '"as" expression must be a valid JavaScript identifier' ) ,
644
+ ) ;
645
+ }
636
646
}
637
647
}
638
648
0 commit comments