1
1
import { parseExpressionAt } from 'acorn' ;
2
2
import repeat from '../../utils/repeat' ;
3
- import list from '../../utils/list' ;
4
3
import { Parser } from '../index' ;
5
4
6
5
const DIRECTIVES = {
7
6
Ref : {
8
7
names : [ 'ref' ] ,
9
8
attribute ( start , end , type , name ) {
10
9
return { start, end, type, name } ;
11
- }
10
+ } ,
11
+ allowedExpressionTypes : [ ] ,
12
+ error : 'ref directives cannot have a value'
12
13
} ,
13
14
14
15
EventHandler : {
15
16
names : [ 'on' ] ,
16
- allowedExpressionTypes : [ 'CallExpression' ] ,
17
17
attribute ( start , end , type , name , expression ) {
18
18
return { start, end, type, name, expression } ;
19
- }
19
+ } ,
20
+ allowedExpressionTypes : [ 'CallExpression' ] ,
21
+ error : 'Expected a method call'
20
22
} ,
21
23
22
24
Binding : {
23
25
names : [ 'bind' ] ,
24
- allowedExpressionTypes : [ 'Identifier' , 'MemberExpression' ] ,
25
26
attribute ( start , end , type , name , expression ) {
26
27
return {
27
28
start, end, type, name,
@@ -32,19 +33,22 @@ const DIRECTIVES = {
32
33
name,
33
34
}
34
35
} ;
35
- }
36
+ } ,
37
+ allowedExpressionTypes : [ 'Identifier' , 'MemberExpression' ] ,
38
+ error : 'Can only bind to an identifier (e.g. `foo`) or a member expression (e.g. `foo.bar` or `foo[baz]`)'
36
39
} ,
37
40
38
41
Transition : {
39
42
names : [ 'in' , 'out' , 'transition' ] ,
40
- allowedExpressionTypes : [ 'ObjectExpression' ] ,
41
43
attribute ( start , end , type , name , expression , directiveName ) {
42
44
return {
43
45
start, end, type, name, expression,
44
46
intro : directiveName === 'in' || directiveName === 'transition' ,
45
47
outro : directiveName === 'out' || directiveName === 'transition' ,
46
48
} ;
47
- }
49
+ } ,
50
+ allowedExpressionTypes : [ 'ObjectExpression' ] ,
51
+ error : 'Transition argument must be an object literal, e.g. `{ duration: 400 }`'
48
52
}
49
53
} ;
50
54
@@ -138,12 +142,8 @@ export function readDirective(
138
142
}
139
143
140
144
expression = readExpression ( parser , expressionStart , quoteMark ) ;
141
- if ( directive . allowedExpressionTypes ) {
142
- if ( directive . allowedExpressionTypes . indexOf ( expression . type ) === - 1 ) {
143
- parser . error ( `Expected ${ list ( directive . allowedExpressionTypes ) } ` , expressionStart ) ;
144
- }
145
- } else {
146
- parser . error ( `${ directiveName } directives cannot have a value` , expressionStart ) ;
145
+ if ( directive . allowedExpressionTypes . indexOf ( expression . type ) === - 1 ) {
146
+ parser . error ( directive . error , expressionStart ) ;
147
147
}
148
148
}
149
149
0 commit comments