@@ -3,81 +3,60 @@ import { transform } from '../../src/transform'
3
3
import { transformFor } from '../../src/transforms/vFor'
4
4
import { ForNode , NodeTypes } from '../../src/ast'
5
5
import { ErrorCodes } from '../../src/errors'
6
+ import { CompilerOptions } from '../../src'
7
+
8
+ function transformWithFor (
9
+ template : string ,
10
+ options : CompilerOptions = { }
11
+ ) : ForNode {
12
+ const node = parse ( template , options )
13
+ transform ( node , { nodeTransforms : [ transformFor ] , ...options } )
14
+ if ( ! options . onError ) {
15
+ expect ( node . children . length ) . toBe ( 1 )
16
+ expect ( node . children [ 0 ] . type ) . toBe ( NodeTypes . FOR )
17
+ }
18
+ return node . children [ 0 ] as ForNode
19
+ }
6
20
7
21
describe ( 'compiler: transform v-for' , ( ) => {
8
22
test ( 'number expression' , ( ) => {
9
- const node = parse ( '<span v-for="index in 5" />' )
10
-
11
- transform ( node , { nodeTransforms : [ transformFor ] } )
12
-
13
- expect ( node . children . length ) . toBe ( 1 )
14
-
15
- const forNode = node . children [ 0 ] as ForNode
16
-
17
- expect ( forNode . type ) . toBe ( NodeTypes . FOR )
23
+ const forNode = transformWithFor ( '<span v-for="index in 5" />' )
18
24
expect ( forNode . keyAlias ) . toBeUndefined ( )
19
25
expect ( forNode . objectIndexAlias ) . toBeUndefined ( )
20
26
expect ( forNode . valueAlias ! . content ) . toBe ( 'index' )
21
27
expect ( forNode . source . content ) . toBe ( '5' )
22
28
} )
23
29
24
30
test ( 'value' , ( ) => {
25
- const node = parse ( '<span v-for="(item) in items" />' )
26
-
27
- transform ( node , { nodeTransforms : [ transformFor ] } )
28
-
29
- expect ( node . children . length ) . toBe ( 1 )
30
-
31
- const forNode = node . children [ 0 ] as ForNode
32
-
33
- expect ( forNode . type ) . toBe ( NodeTypes . FOR )
31
+ const forNode = transformWithFor ( '<span v-for="(item) in items" />' )
34
32
expect ( forNode . keyAlias ) . toBeUndefined ( )
35
33
expect ( forNode . objectIndexAlias ) . toBeUndefined ( )
36
34
expect ( forNode . valueAlias ! . content ) . toBe ( 'item' )
37
35
expect ( forNode . source . content ) . toBe ( 'items' )
38
36
} )
39
37
40
38
test ( 'object de-structured value' , ( ) => {
41
- const node = parse ( '<span v-for="({ id, value }) in items" />' )
42
-
43
- transform ( node , { nodeTransforms : [ transformFor ] } )
44
-
45
- expect ( node . children . length ) . toBe ( 1 )
46
-
47
- const forNode = node . children [ 0 ] as ForNode
48
-
49
- expect ( forNode . type ) . toBe ( NodeTypes . FOR )
39
+ const forNode = transformWithFor (
40
+ '<span v-for="({ id, value }) in items" />'
41
+ )
50
42
expect ( forNode . keyAlias ) . toBeUndefined ( )
51
43
expect ( forNode . objectIndexAlias ) . toBeUndefined ( )
52
44
expect ( forNode . valueAlias ! . content ) . toBe ( '{ id, value }' )
53
45
expect ( forNode . source . content ) . toBe ( 'items' )
54
46
} )
55
47
56
48
test ( 'array de-structured value' , ( ) => {
57
- const node = parse ( '<span v-for="([ id, value ]) in items" />' )
58
-
59
- transform ( node , { nodeTransforms : [ transformFor ] } )
60
-
61
- expect ( node . children . length ) . toBe ( 1 )
62
-
63
- const forNode = node . children [ 0 ] as ForNode
64
-
65
- expect ( forNode . type ) . toBe ( NodeTypes . FOR )
49
+ const forNode = transformWithFor (
50
+ '<span v-for="([ id, value ]) in items" />'
51
+ )
66
52
expect ( forNode . keyAlias ) . toBeUndefined ( )
67
53
expect ( forNode . objectIndexAlias ) . toBeUndefined ( )
68
54
expect ( forNode . valueAlias ! . content ) . toBe ( '[ id, value ]' )
69
55
expect ( forNode . source . content ) . toBe ( 'items' )
70
56
} )
71
57
72
58
test ( 'value and key' , ( ) => {
73
- const node = parse ( '<span v-for="(item, key) in items" />' )
74
-
75
- transform ( node , { nodeTransforms : [ transformFor ] } )
76
-
77
- expect ( node . children . length ) . toBe ( 1 )
78
-
79
- const forNode = node . children [ 0 ] as ForNode
80
-
59
+ const forNode = transformWithFor ( '<span v-for="(item, key) in items" />' )
81
60
expect ( forNode . keyAlias ) . not . toBeUndefined ( )
82
61
expect ( forNode . keyAlias ! . content ) . toBe ( 'key' )
83
62
expect ( forNode . objectIndexAlias ) . toBeUndefined ( )
@@ -86,15 +65,9 @@ describe('compiler: transform v-for', () => {
86
65
} )
87
66
88
67
test ( 'value, key and index' , ( ) => {
89
- const node = parse ( '<span v-for="(value, key, index) in items" />' )
90
-
91
- transform ( node , { nodeTransforms : [ transformFor ] } )
92
-
93
- expect ( node . children . length ) . toBe ( 1 )
94
-
95
- const forNode = node . children [ 0 ] as ForNode
96
-
97
- expect ( forNode . type ) . toBe ( NodeTypes . FOR )
68
+ const forNode = transformWithFor (
69
+ '<span v-for="(value, key, index) in items" />'
70
+ )
98
71
expect ( forNode . keyAlias ) . not . toBeUndefined ( )
99
72
expect ( forNode . keyAlias ! . content ) . toBe ( 'key' )
100
73
expect ( forNode . objectIndexAlias ) . not . toBeUndefined ( )
@@ -104,15 +77,7 @@ describe('compiler: transform v-for', () => {
104
77
} )
105
78
106
79
test ( 'skipped key' , ( ) => {
107
- const node = parse ( '<span v-for="(value,,index) in items" />' )
108
-
109
- transform ( node , { nodeTransforms : [ transformFor ] } )
110
-
111
- expect ( node . children . length ) . toBe ( 1 )
112
-
113
- const forNode = node . children [ 0 ] as ForNode
114
-
115
- expect ( forNode . type ) . toBe ( NodeTypes . FOR )
80
+ const forNode = transformWithFor ( '<span v-for="(value,,index) in items" />' )
116
81
expect ( forNode . keyAlias ) . toBeUndefined ( )
117
82
expect ( forNode . objectIndexAlias ) . not . toBeUndefined ( )
118
83
expect ( forNode . objectIndexAlias ! . content ) . toBe ( 'index' )
@@ -121,15 +86,7 @@ describe('compiler: transform v-for', () => {
121
86
} )
122
87
123
88
test ( 'skipped value and key' , ( ) => {
124
- const node = parse ( '<span v-for="(,,index) in items" />' )
125
-
126
- transform ( node , { nodeTransforms : [ transformFor ] } )
127
-
128
- expect ( node . children . length ) . toBe ( 1 )
129
-
130
- const forNode = node . children [ 0 ] as ForNode
131
-
132
- expect ( forNode . type ) . toBe ( NodeTypes . FOR )
89
+ const forNode = transformWithFor ( '<span v-for="(,,index) in items" />' )
133
90
expect ( forNode . keyAlias ) . toBeUndefined ( )
134
91
expect ( forNode . objectIndexAlias ) . not . toBeUndefined ( )
135
92
expect ( forNode . objectIndexAlias ! . content ) . toBe ( 'index' )
@@ -138,31 +95,15 @@ describe('compiler: transform v-for', () => {
138
95
} )
139
96
140
97
test ( 'unbracketed value' , ( ) => {
141
- const node = parse ( '<span v-for="item in items" />' )
142
-
143
- transform ( node , { nodeTransforms : [ transformFor ] } )
144
-
145
- expect ( node . children . length ) . toBe ( 1 )
146
-
147
- const forNode = node . children [ 0 ] as ForNode
148
-
149
- expect ( forNode . type ) . toBe ( NodeTypes . FOR )
98
+ const forNode = transformWithFor ( '<span v-for="item in items" />' )
150
99
expect ( forNode . keyAlias ) . toBeUndefined ( )
151
100
expect ( forNode . objectIndexAlias ) . toBeUndefined ( )
152
101
expect ( forNode . valueAlias ! . content ) . toBe ( 'item' )
153
102
expect ( forNode . source . content ) . toBe ( 'items' )
154
103
} )
155
104
156
105
test ( 'unbracketed value and key' , ( ) => {
157
- const node = parse ( '<span v-for="item, key in items" />' )
158
-
159
- transform ( node , { nodeTransforms : [ transformFor ] } )
160
-
161
- expect ( node . children . length ) . toBe ( 1 )
162
-
163
- const forNode = node . children [ 0 ] as ForNode
164
-
165
- expect ( forNode . type ) . toBe ( NodeTypes . FOR )
106
+ const forNode = transformWithFor ( '<span v-for="item, key in items" />' )
166
107
expect ( forNode . keyAlias ) . not . toBeUndefined ( )
167
108
expect ( forNode . keyAlias ! . content ) . toBe ( 'key' )
168
109
expect ( forNode . objectIndexAlias ) . toBeUndefined ( )
@@ -171,15 +112,9 @@ describe('compiler: transform v-for', () => {
171
112
} )
172
113
173
114
test ( 'unbracketed value, key and index' , ( ) => {
174
- const node = parse ( '<span v-for="value, key, index in items" />' )
175
-
176
- transform ( node , { nodeTransforms : [ transformFor ] } )
177
-
178
- expect ( node . children . length ) . toBe ( 1 )
179
-
180
- const forNode = node . children [ 0 ] as ForNode
181
-
182
- expect ( forNode . type ) . toBe ( NodeTypes . FOR )
115
+ const forNode = transformWithFor (
116
+ '<span v-for="value, key, index in items" />'
117
+ )
183
118
expect ( forNode . keyAlias ) . not . toBeUndefined ( )
184
119
expect ( forNode . keyAlias ! . content ) . toBe ( 'key' )
185
120
expect ( forNode . objectIndexAlias ) . not . toBeUndefined ( )
@@ -189,15 +124,7 @@ describe('compiler: transform v-for', () => {
189
124
} )
190
125
191
126
test ( 'unbracketed skipped key' , ( ) => {
192
- const node = parse ( '<span v-for="value, , index in items" />' )
193
-
194
- transform ( node , { nodeTransforms : [ transformFor ] } )
195
-
196
- expect ( node . children . length ) . toBe ( 1 )
197
-
198
- const forNode = node . children [ 0 ] as ForNode
199
-
200
- expect ( forNode . type ) . toBe ( NodeTypes . FOR )
127
+ const forNode = transformWithFor ( '<span v-for="value, , index in items" />' )
201
128
expect ( forNode . keyAlias ) . toBeUndefined ( )
202
129
expect ( forNode . objectIndexAlias ) . not . toBeUndefined ( )
203
130
expect ( forNode . objectIndexAlias ! . content ) . toBe ( 'index' )
@@ -206,15 +133,7 @@ describe('compiler: transform v-for', () => {
206
133
} )
207
134
208
135
test ( 'unbracketed skipped value and key' , ( ) => {
209
- const node = parse ( '<span v-for=", , index in items" />' )
210
-
211
- transform ( node , { nodeTransforms : [ transformFor ] } )
212
-
213
- expect ( node . children . length ) . toBe ( 1 )
214
-
215
- const forNode = node . children [ 0 ] as ForNode
216
-
217
- expect ( forNode . type ) . toBe ( NodeTypes . FOR )
136
+ const forNode = transformWithFor ( '<span v-for=", , index in items" />' )
218
137
expect ( forNode . keyAlias ) . toBeUndefined ( )
219
138
expect ( forNode . objectIndexAlias ) . not . toBeUndefined ( )
220
139
expect ( forNode . objectIndexAlias ! . content ) . toBe ( 'index' )
@@ -223,9 +142,8 @@ describe('compiler: transform v-for', () => {
223
142
} )
224
143
225
144
test ( 'missing expression' , ( ) => {
226
- const node = parse ( '<span v-for />' )
227
145
const onError = jest . fn ( )
228
- transform ( node , { nodeTransforms : [ transformFor ] , onError } )
146
+ transformWithFor ( '<span v-for />' , { onError } )
229
147
230
148
expect ( onError ) . toHaveBeenCalledTimes ( 1 )
231
149
expect ( onError ) . toHaveBeenCalledWith (
@@ -236,9 +154,8 @@ describe('compiler: transform v-for', () => {
236
154
} )
237
155
238
156
test ( 'empty expression' , ( ) => {
239
- const node = parse ( '<span v-for="" />' )
240
157
const onError = jest . fn ( )
241
- transform ( node , { nodeTransforms : [ transformFor ] , onError } )
158
+ transformWithFor ( '<span v-for="" />' , { onError } )
242
159
243
160
expect ( onError ) . toHaveBeenCalledTimes ( 1 )
244
161
expect ( onError ) . toHaveBeenCalledWith (
@@ -249,9 +166,8 @@ describe('compiler: transform v-for', () => {
249
166
} )
250
167
251
168
test ( 'invalid expression' , ( ) => {
252
- const node = parse ( '<span v-for="items" />' )
253
169
const onError = jest . fn ( )
254
- transform ( node , { nodeTransforms : [ transformFor ] , onError } )
170
+ transformWithFor ( '<span v-for="items" />' , { onError } )
255
171
256
172
expect ( onError ) . toHaveBeenCalledTimes ( 1 )
257
173
expect ( onError ) . toHaveBeenCalledWith (
@@ -262,9 +178,8 @@ describe('compiler: transform v-for', () => {
262
178
} )
263
179
264
180
test ( 'missing source' , ( ) => {
265
- const node = parse ( '<span v-for="item in" />' )
266
181
const onError = jest . fn ( )
267
- transform ( node , { nodeTransforms : [ transformFor ] , onError } )
182
+ transformWithFor ( '<span v-for="item in" />' , { onError } )
268
183
269
184
expect ( onError ) . toHaveBeenCalledTimes ( 1 )
270
185
expect ( onError ) . toHaveBeenCalledWith (
@@ -275,9 +190,8 @@ describe('compiler: transform v-for', () => {
275
190
} )
276
191
277
192
test ( 'missing value' , ( ) => {
278
- const node = parse ( '<span v-for="in items" />' )
279
193
const onError = jest . fn ( )
280
- transform ( node , { nodeTransforms : [ transformFor ] , onError } )
194
+ transformWithFor ( '<span v-for="in items" />' , { onError } )
281
195
282
196
expect ( onError ) . toHaveBeenCalledTimes ( 1 )
283
197
expect ( onError ) . toHaveBeenCalledWith (
@@ -290,15 +204,7 @@ describe('compiler: transform v-for', () => {
290
204
describe ( 'source location' , ( ) => {
291
205
test ( 'value & source' , ( ) => {
292
206
const source = '<span v-for="item in items" />'
293
- const node = parse ( source )
294
-
295
- transform ( node , { nodeTransforms : [ transformFor ] } )
296
-
297
- expect ( node . children . length ) . toBe ( 1 )
298
-
299
- const forNode = node . children [ 0 ] as ForNode
300
-
301
- expect ( forNode . type ) . toBe ( NodeTypes . FOR )
207
+ const forNode = transformWithFor ( source )
302
208
303
209
expect ( forNode . valueAlias ! . content ) . toBe ( 'item' )
304
210
expect ( forNode . valueAlias ! . loc . start . offset ) . toBe (
@@ -321,15 +227,7 @@ describe('compiler: transform v-for', () => {
321
227
322
228
test ( 'bracketed value' , ( ) => {
323
229
const source = '<span v-for="( item ) in items" />'
324
- const node = parse ( source )
325
-
326
- transform ( node , { nodeTransforms : [ transformFor ] } )
327
-
328
- expect ( node . children . length ) . toBe ( 1 )
329
-
330
- const forNode = node . children [ 0 ] as ForNode
331
-
332
- expect ( forNode . type ) . toBe ( NodeTypes . FOR )
230
+ const forNode = transformWithFor ( source )
333
231
334
232
expect ( forNode . valueAlias ! . content ) . toBe ( 'item' )
335
233
expect ( forNode . valueAlias ! . loc . start . offset ) . toBe (
@@ -352,15 +250,7 @@ describe('compiler: transform v-for', () => {
352
250
353
251
test ( 'de-structured value' , ( ) => {
354
252
const source = '<span v-for="( { id, key })in items" />'
355
- const node = parse ( source )
356
-
357
- transform ( node , { nodeTransforms : [ transformFor ] } )
358
-
359
- expect ( node . children . length ) . toBe ( 1 )
360
-
361
- const forNode = node . children [ 0 ] as ForNode
362
-
363
- expect ( forNode . type ) . toBe ( NodeTypes . FOR )
253
+ const forNode = transformWithFor ( source )
364
254
365
255
expect ( forNode . valueAlias ! . content ) . toBe ( '{ id, key }' )
366
256
expect ( forNode . valueAlias ! . loc . start . offset ) . toBe (
@@ -385,15 +275,7 @@ describe('compiler: transform v-for', () => {
385
275
386
276
test ( 'bracketed value, key, index' , ( ) => {
387
277
const source = '<span v-for="( item, key, index ) in items" />'
388
- const node = parse ( source )
389
-
390
- transform ( node , { nodeTransforms : [ transformFor ] } )
391
-
392
- expect ( node . children . length ) . toBe ( 1 )
393
-
394
- const forNode = node . children [ 0 ] as ForNode
395
-
396
- expect ( forNode . type ) . toBe ( NodeTypes . FOR )
278
+ const forNode = transformWithFor ( source )
397
279
398
280
expect ( forNode . valueAlias ! . content ) . toBe ( 'item' )
399
281
expect ( forNode . valueAlias ! . loc . start . offset ) . toBe (
@@ -436,15 +318,7 @@ describe('compiler: transform v-for', () => {
436
318
437
319
test ( 'skipped key' , ( ) => {
438
320
const source = '<span v-for="( item,, index ) in items" />'
439
- const node = parse ( source )
440
-
441
- transform ( node , { nodeTransforms : [ transformFor ] } )
442
-
443
- expect ( node . children . length ) . toBe ( 1 )
444
-
445
- const forNode = node . children [ 0 ] as ForNode
446
-
447
- expect ( forNode . type ) . toBe ( NodeTypes . FOR )
321
+ const forNode = transformWithFor ( source )
448
322
449
323
expect ( forNode . valueAlias ! . content ) . toBe ( 'item' )
450
324
expect ( forNode . valueAlias ! . loc . start . offset ) . toBe (
0 commit comments