@@ -4,53 +4,52 @@ import { Parser } from '../index';
4
4
5
5
const DIRECTIVES = {
6
6
Ref : {
7
- names : [ 'ref' ] ,
7
+ names : [ 'ref' ] ,
8
8
attribute ( start , end , type , name ) {
9
9
return { start, end, type, name } ;
10
- }
10
+ } ,
11
+ allowedExpressionTypes : [ ] ,
12
+ error : 'ref directives cannot have a value'
11
13
} ,
12
14
13
15
EventHandler : {
14
- names : [ 'on' ] ,
15
- allowedExpressionTypes : [ 'CallExpression' ] ,
16
+ names : [ 'on' ] ,
17
+ attribute ( start , end , type , name , expression ) {
18
+ return { start, end, type, name, expression } ;
19
+ } ,
20
+ allowedExpressionTypes : [ 'CallExpression' ] ,
21
+ error : 'Expected a method call'
16
22
} ,
17
23
18
24
Binding : {
19
- names : [ '' , 'bind' ] ,
20
- allowedExpressionTypes : [ 'Identifier' , 'MemberExpression' ] ,
21
- attribute ( start , end , type , name , expression , directiveName ) {
22
- let value ;
23
-
24
- // :foo is shorthand for foo='{{foo}}'
25
- if ( ! directiveName ) {
26
- const valueStart = start + 1 ;
27
- const valueEnd = start + name . length ;
28
- type = 'Attribute' ;
29
- value = getShorthandValue ( start + 1 , name ) ;
30
- } else {
31
- value = expression || {
25
+ names : [ 'bind' ] ,
26
+ attribute ( start , end , type , name , expression ) {
27
+ return {
28
+ start, end, type, name,
29
+ value : expression || {
32
30
type : 'Identifier' ,
33
31
start : start + 5 ,
34
32
end,
35
33
name,
36
- } ;
37
- }
38
-
39
- return { start, end, type, name, value } ;
34
+ }
35
+ } ;
40
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]`)'
41
39
} ,
42
40
43
41
Transition : {
44
- names : [ 'in' , 'out' , 'transition' ] ,
45
- allowedExpressionTypes : [ 'ObjectExpression' ] ,
42
+ names : [ 'in' , 'out' , 'transition' ] ,
46
43
attribute ( start , end , type , name , expression , directiveName ) {
47
44
return {
48
45
start, end, type, name, expression,
49
46
intro : directiveName === 'in' || directiveName === 'transition' ,
50
47
outro : directiveName === 'out' || directiveName === 'transition' ,
51
- }
48
+ } ;
52
49
} ,
53
- } ,
50
+ allowedExpressionTypes : [ 'ObjectExpression' ] ,
51
+ error : 'Transition argument must be an object literal, e.g. `{ duration: 400 }`'
52
+ }
54
53
} ;
55
54
56
55
@@ -83,7 +82,7 @@ function readExpression(parser: Parser, start: number, quoteMark: string|null) {
83
82
} else {
84
83
str += char ;
85
84
}
86
- } else if ( / [ \s \r \n \ /> ] / . test ( char ) ) {
85
+ } else if ( / [ \s \/ > ] / . test ( char ) ) {
87
86
break ;
88
87
} else {
89
88
str += char ;
@@ -106,12 +105,23 @@ export function readDirective(
106
105
start : number ,
107
106
attrName : string
108
107
) {
109
- const [ directiveName , name ] = attrName . split ( ':' ) ;
108
+ const [ directiveName , name ] = attrName . split ( ':' ) ;
110
109
if ( name === undefined ) return ; // No colon in the name
111
-
110
+
111
+ if ( directiveName === '' ) {
112
+ // not a directive — :foo is short for foo={{foo}}
113
+ return {
114
+ start : start ,
115
+ end : start + name . length + 1 ,
116
+ type : 'Attribute' ,
117
+ name,
118
+ value : getShorthandValue ( start + 1 , name )
119
+ } ;
120
+ }
121
+
112
122
const type = lookupByName [ directiveName ] ;
113
123
if ( ! type ) return ; // not a registered directive
114
-
124
+
115
125
const directive = DIRECTIVES [ type ] ;
116
126
let expression = null ;
117
127
@@ -133,21 +143,11 @@ export function readDirective(
133
143
134
144
expression = readExpression ( parser , expressionStart , quoteMark ) ;
135
145
if ( directive . allowedExpressionTypes . indexOf ( expression . type ) === - 1 ) {
136
- parser . error ( `Expected ${ directive . allowedExpressionTypes . join ( ' or ' ) } ` , expressionStart ) ;
146
+ parser . error ( directive . error , expressionStart ) ;
137
147
}
138
148
}
139
149
140
- if ( directive . attribute ) {
141
- return directive . attribute ( start , parser . index , type , name , expression , directiveName ) ;
142
- } else {
143
- return {
144
- start,
145
- end : parser . index ,
146
- type : type ,
147
- name,
148
- expression,
149
- } ;
150
- }
150
+ return directive . attribute ( start , parser . index , type , name , expression , directiveName ) ;
151
151
}
152
152
153
153
0 commit comments