diff --git a/compiler/generate/index.js b/compiler/generate/index.js index 7b203f4683..f950e7b393 100644 --- a/compiler/generate/index.js +++ b/compiler/generate/index.js @@ -1,4 +1,4 @@ -import MagicString from 'magic-string'; +import MagicString, { Bundle } from 'magic-string'; import { walk } from 'estree-walker'; import deindent from './utils/deindent.js'; import isReference from './utils/isReference.js'; @@ -365,8 +365,6 @@ export default function generate ( parsed, source, options ) { return state[ key ]; }; - let setting = false; - this.set = function set ( newState ) { ${setStatements.join( '\n\n' )} }; @@ -426,38 +424,26 @@ export default function generate ( parsed, source, options ) { const parts = result.split( '✂]' ); const finalChunk = parts.pop(); - const sortedByResult = parts.map( ( str, index ) => { - const match = pattern.exec( str ); + const compiled = new Bundle({ separator: '' }); - return { - index, - chunk: str.replace( pattern, '' ), - start: +match[1], - end: +match[2] - }; - }); - - const sortedBySource = sortedByResult - .slice() - .sort( ( a, b ) => a.start - b.start ); + parts.forEach( str => { + const match = pattern.exec( str ); - let c = 0; + compiled.addSource({ + filename: options.filename, + content: new MagicString( str.replace( pattern, '' ) ) + }); - sortedBySource.forEach( part => { - generator.code.remove( c, part.start ); - generator.code.insertRight( part.start, part.chunk ); - c = part.end; + compiled.addSource({ + filename: options.filename, + content: generator.code.snip( +match[1], +match[2] ) + }); }); - generator.code.remove( c, source.length ); - generator.code.append( finalChunk ); - - sortedByResult.forEach( part => { - generator.code.move( part.start, part.end, 0 ); - }); + compiled.append( finalChunk ); return { - code: generator.code.toString(), - map: generator.code.generateMap() + code: compiled.toString(), + map: compiled.generateMap() }; } diff --git a/compiler/generate/visitors/EachBlock.js b/compiler/generate/visitors/EachBlock.js index 50a5ccbadb..c9d7270eca 100644 --- a/compiler/generate/visitors/EachBlock.js +++ b/compiler/generate/visitors/EachBlock.js @@ -11,7 +11,7 @@ export default { generator.addSourcemapLocations( node.expression ); - const { dependencies, snippet, string } = generator.contextualise( node.expression ); + const { dependencies, snippet } = generator.contextualise( node.expression ); generator.current.initStatements.push( deindent` var ${name}_anchor = document.createComment( ${JSON.stringify( `#each ${generator.source.slice( node.expression.start, node.expression.end )}` )} ); @@ -29,7 +29,7 @@ export default { ` ); generator.current.updateStatements.push( deindent` - var ${name}_value = ${string}; + var ${name}_value = ${snippet}; for ( var i = 0; i < ${name}_value.length; i += 1 ) { if ( !${name}_iterations[i] ) { diff --git a/compiler/generate/visitors/IfBlock.js b/compiler/generate/visitors/IfBlock.js index ee3c7bfa04..1c114abfe6 100644 --- a/compiler/generate/visitors/IfBlock.js +++ b/compiler/generate/visitors/IfBlock.js @@ -11,7 +11,7 @@ export default { const elseRenderer = `renderElseBlock_${i}`; generator.addSourcemapLocations( node.expression ); - const { snippet, string } = generator.contextualise( node.expression ); + const { snippet } = generator.contextualise( node.expression ); generator.current.initStatements.push( deindent` var ${name}_anchor = document.createComment( ${JSON.stringify( `#if ${generator.source.slice( node.expression.start, node.expression.end )}` )} ); @@ -70,7 +70,7 @@ export default { } let update = deindent` - if ( ${string} ) { + if ( ${snippet} ) { ${ifTrue.join( '\n\n' )} } diff --git a/compiler/generate/visitors/MustacheTag.js b/compiler/generate/visitors/MustacheTag.js index 1415ba0495..2a24027b14 100644 --- a/compiler/generate/visitors/MustacheTag.js +++ b/compiler/generate/visitors/MustacheTag.js @@ -1,11 +1,10 @@ import deindent from '../utils/deindent.js'; -import isReference from '../utils/isReference.js'; export default { enter ( generator, node ) { const name = generator.current.counter( 'text' ); - const { snippet, string } = generator.contextualise( node.expression ); + const { snippet } = generator.contextualise( node.expression ); generator.current.initStatements.push( deindent` var ${name} = document.createTextNode( ${snippet} ); @@ -15,7 +14,7 @@ export default { generator.addSourcemapLocations( node.expression ); generator.current.updateStatements.push( deindent` - ${name}.data = ${string}; + ${name}.data = ${snippet}; ` ); } }; diff --git a/compiler/generate/visitors/attributes/addElementAttributes.js b/compiler/generate/visitors/attributes/addElementAttributes.js index ede40c71be..f1501a61b1 100644 --- a/compiler/generate/visitors/attributes/addElementAttributes.js +++ b/compiler/generate/visitors/attributes/addElementAttributes.js @@ -61,11 +61,11 @@ export default function addElementAttributes ( generator, node, local ) { dynamic = true; // dynamic – but potentially non-string – attributes - const { snippet, string } = generator.contextualise( value.expression ); + const { snippet } = generator.contextualise( value.expression ); const updater = propertyName ? `${local.name}.${propertyName} = ${snippet};` : - `${local.name}.setAttribute( '${attribute.name}', ${string} );`; // TODO use snippet both times – see note below + `${local.name}.setAttribute( '${attribute.name}', ${snippet} );`; // TODO use snippet both times – see note below local.init.push( updater ); local.update.push( updater ); diff --git a/test/compiler/each-blocks-nested/_config.js b/test/compiler/each-blocks-nested/_config.js index 42e56cb6c5..0c21561e75 100644 --- a/test/compiler/each-blocks-nested/_config.js +++ b/test/compiler/each-blocks-nested/_config.js @@ -1,6 +1,4 @@ export default { - solo: true, - data: { columns: [ 'a', 'b', 'c' ], rows: [ 1, 2, 3 ]