@@ -164,7 +164,20 @@ async function processStyle (styles, id, content, options) {
164
164
return outputs
165
165
}
166
166
167
- function parseTemplate ( code ) {
167
+ function checkIfTemplateContainsMoreElements ( node ) {
168
+ let count = 0
169
+
170
+ node . content . childNodes . forEach ( ( node ) => {
171
+ //filter text/comment node
172
+ if ( node . nodeName . indexOf ( '#' ) === - 1 ) {
173
+ count ++
174
+ }
175
+ } )
176
+
177
+ return count > 1
178
+ }
179
+
180
+ function parseTemplate ( id , code ) {
168
181
debug ( 'Parsing template....' )
169
182
const fragment = parse5 . parseFragment ( code , { locationInfo : true } )
170
183
@@ -180,6 +193,10 @@ function parseTemplate (code) {
180
193
continue
181
194
}
182
195
196
+ if ( name === 'template' && checkIfTemplateContainsMoreElements ( fragment . childNodes [ i ] ) ) {
197
+ throw new Error ( `[rollup-plugin-vue] Error in ${ id } :\n <template> should only contain exactly one root element.` )
198
+ }
199
+
183
200
const start = fragment . childNodes [ i ] . __location . startTag . endOffset
184
201
const end = fragment . childNodes [ i ] . __location . endTag . startOffset
185
202
@@ -221,7 +238,7 @@ const hasScoped = function (styles) {
221
238
} , false )
222
239
}
223
240
export default async function vueTransform ( code , id , options ) {
224
- const nodes = parseTemplate ( code )
241
+ const nodes = parseTemplate ( id , code )
225
242
const css = await processStyle ( nodes . style , id , code , options , nodes )
226
243
const modules = getModules ( css )
227
244
const scoped = hasScoped ( css )
0 commit comments