@@ -80,18 +80,25 @@ export function stringify(sfcDescriptor: SFCDescriptor) {
80
80
newlinesBefore = block . startOfOpenTag - prevBlock . endOfCloseTag
81
81
}
82
82
83
- return (
84
- sfcCode +
85
- '\n' . repeat ( newlinesBefore ) +
86
- block . openTag +
87
- block . content +
88
- block . closeTag
89
- )
83
+ if ( block . openTag === '' ) {
84
+ return sfcCode + '\n' . repeat ( newlinesBefore ) + block . loc . source
85
+ } else {
86
+ return (
87
+ sfcCode +
88
+ '\n' . repeat ( newlinesBefore ) +
89
+ block . openTag +
90
+ block . content +
91
+ block . closeTag
92
+ )
93
+ }
90
94
} , '' )
91
95
)
92
96
}
93
97
94
98
function makeOpenTag ( block : SFCBlock ) {
99
+ if ( ! block . attrs ) {
100
+ return ''
101
+ }
95
102
let source = '<' + block . type
96
103
97
104
source += Object . keys ( block . attrs )
@@ -112,6 +119,9 @@ function makeOpenTag(block: SFCBlock) {
112
119
}
113
120
114
121
function makeCloseTag ( block : SFCBlock ) {
122
+ if ( ! block . attrs ) {
123
+ return ''
124
+ }
115
125
return `</${ block . type } >\n`
116
126
}
117
127
@@ -121,6 +131,7 @@ function makeCloseTag(block: SFCBlock) {
121
131
122
132
export interface TemplateCompiler {
123
133
compile ( template : string , options : CompilerOptions ) : CodegenResult
134
+
124
135
parse ( template : string , options : ParserOptions ) : RootNode
125
136
}
126
137
@@ -241,53 +252,56 @@ export function parse(
241
252
} )
242
253
243
254
ast . children . forEach ( node => {
244
- if ( node . type !== NodeTypes . ELEMENT ) {
245
- return
246
- }
247
- if ( ! node . children . length && ! hasSrc ( node ) && node . tag !== 'template' ) {
248
- return
249
- }
250
- switch ( node . tag ) {
251
- case 'template' :
252
- if ( ! descriptor . template ) {
253
- const templateBlock = ( descriptor . template = createBlock (
254
- node ,
255
- source ,
256
- false
257
- ) as SFCTemplateBlock )
258
- templateBlock . ast = node
259
- } else {
260
- errors . push ( createDuplicateBlockError ( node ) )
261
- }
262
- break
263
- case 'script' :
264
- const scriptBlock = createBlock ( node , source , pad ) as SFCScriptBlock
265
- const isSetup = ! ! scriptBlock . attrs . setup
266
- if ( isSetup && ! descriptor . scriptSetup ) {
267
- descriptor . scriptSetup = scriptBlock
255
+ if ( node . type == NodeTypes . ELEMENT ) {
256
+ if ( ! node . children . length && ! hasSrc ( node ) && node . tag !== 'template' ) {
257
+ return
258
+ }
259
+ switch ( node . tag ) {
260
+ case 'template' :
261
+ if ( ! descriptor . template ) {
262
+ const templateBlock = ( descriptor . template = createBlock (
263
+ node ,
264
+ source ,
265
+ false
266
+ ) as SFCTemplateBlock )
267
+ templateBlock . ast = node
268
+ } else {
269
+ errors . push ( createDuplicateBlockError ( node ) )
270
+ }
268
271
break
269
- }
270
- if ( ! isSetup && ! descriptor . script ) {
271
- descriptor . script = scriptBlock
272
+ case 'script' :
273
+ const scriptBlock = createBlock ( node , source , pad ) as SFCScriptBlock
274
+ const isSetup = ! ! scriptBlock . attrs . setup
275
+ if ( isSetup && ! descriptor . scriptSetup ) {
276
+ descriptor . scriptSetup = scriptBlock
277
+ break
278
+ }
279
+ if ( ! isSetup && ! descriptor . script ) {
280
+ descriptor . script = scriptBlock
281
+ break
282
+ }
283
+ errors . push ( createDuplicateBlockError ( node , isSetup ) )
272
284
break
273
- }
274
- errors . push ( createDuplicateBlockError ( node , isSetup ) )
275
- break
276
- case 'style' :
277
- const styleBlock = createBlock ( node , source , pad ) as SFCStyleBlock
278
- if ( styleBlock . attrs . vars ) {
279
- errors . push (
280
- new SyntaxError (
281
- `<style vars> has been replaced by a new proposal: ` +
282
- `https://github.com/vuejs/rfcs/pull/231`
285
+ case 'style' :
286
+ const styleBlock = createBlock ( node , source , pad ) as SFCStyleBlock
287
+ if ( styleBlock . attrs . vars ) {
288
+ errors . push (
289
+ new SyntaxError (
290
+ `<style vars> has been replaced by a new proposal: ` +
291
+ `https://github.com/vuejs/rfcs/pull/231`
292
+ )
283
293
)
284
- )
285
- }
286
- descriptor . styles . push ( styleBlock )
287
- break
288
- default :
289
- descriptor . customBlocks . push ( createBlock ( node , source , pad ) )
290
- break
294
+ }
295
+ descriptor . styles . push ( styleBlock )
296
+ break
297
+ default :
298
+ descriptor . customBlocks . push ( createBlock ( node , source , pad ) )
299
+ break
300
+ }
301
+ } else if ( node . type == NodeTypes . COMMENT ) {
302
+ // @ts -ignore
303
+ descriptor . customBlocks . push ( node )
304
+ // descriptor.customBlocks.push(createBlock(node, source, pad))
291
305
}
292
306
} )
293
307
0 commit comments