|  |  |  | @ -25,7 +25,26 @@ function createRenderer ( fragment ) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | export default function generate ( parsed, template ) { | 
			
		
	
		
			
				
					|  |  |  |  | 	const code = new MagicString( template ); | 
			
		
	
		
			
				
					|  |  |  |  | 	 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	let hasDefaultData = false; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// TODO wrap all this in magic-string
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if ( parsed.js ) { | 
			
		
	
		
			
				
					|  |  |  |  | 		walk( parsed.js.content, { | 
			
		
	
		
			
				
					|  |  |  |  | 			enter ( node ) { | 
			
		
	
		
			
				
					|  |  |  |  | 				code.addSourcemapLocation( node.start ); | 
			
		
	
		
			
				
					|  |  |  |  | 				code.addSourcemapLocation( node.end ); | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 		}); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		const defaultExport = parsed.js.content.body.find( node => node.type === 'ExportDefaultDeclaration' ); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if ( defaultExport ) { | 
			
		
	
		
			
				
					|  |  |  |  | 			code.overwrite( defaultExport.start, defaultExport.declaration.start, `const template = ` ); | 
			
		
	
		
			
				
					|  |  |  |  | 			hasDefaultData = defaultExport.declaration.properties.find( prop => prop.key.name === 'data' ); | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	const renderers = []; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	const counters = { | 
			
		
	
	
		
			
				
					|  |  |  | @ -294,22 +313,8 @@ export default function generate ( parsed, template ) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	renderers.push( createRenderer( current ) ); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	let js = ''; | 
			
		
	
		
			
				
					|  |  |  |  | 	let hasDefaultData = false; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// TODO wrap all this in magic-string
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if ( parsed.js ) { | 
			
		
	
		
			
				
					|  |  |  |  | 		const defaultExport = parsed.js.content.body.find( node => node.type === 'ExportDefaultDeclaration' ); | 
			
		
	
		
			
				
					|  |  |  |  | 		if ( defaultExport ) { | 
			
		
	
		
			
				
					|  |  |  |  | 			js = `${template.slice( parsed.js.content.start, defaultExport.start )}const template = ${template.slice( defaultExport.declaration.start, parsed.js.content.end)}`; | 
			
		
	
		
			
				
					|  |  |  |  | 			hasDefaultData = defaultExport.declaration.properties.find( prop => prop.key.name === 'data' ); | 
			
		
	
		
			
				
					|  |  |  |  | 		} else { | 
			
		
	
		
			
				
					|  |  |  |  | 			js = template.slice( parsed.js.content.start, parsed.js.content.end ); | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	const result = deindent` | 
			
		
	
		
			
				
					|  |  |  |  | 		${js} | 
			
		
	
		
			
				
					|  |  |  |  | 		${parsed.js ? `[✂${parsed.js.content.start}-${parsed.js.content.end}✂]` : ``} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		${renderers.reverse().join( '\n\n' )} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -375,5 +380,42 @@ export default function generate ( parsed, template ) { | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	`;
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	return { code: result }; // TODO use magic-string
 | 
			
		
	
		
			
				
					|  |  |  |  | 	const pattern = /\[✂(\d+)-(\d+)/; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	const parts = result.split( '✂]' ); | 
			
		
	
		
			
				
					|  |  |  |  | 	const finalChunk = parts.pop(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	const sortedByResult = parts.map( ( str, index ) => { | 
			
		
	
		
			
				
					|  |  |  |  | 		const match = pattern.exec( str ); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		return { | 
			
		
	
		
			
				
					|  |  |  |  | 			index, | 
			
		
	
		
			
				
					|  |  |  |  | 			chunk: str.replace( pattern, '' ), | 
			
		
	
		
			
				
					|  |  |  |  | 			start: +match[1], | 
			
		
	
		
			
				
					|  |  |  |  | 			end: +match[2] | 
			
		
	
		
			
				
					|  |  |  |  | 		}; | 
			
		
	
		
			
				
					|  |  |  |  | 	}); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	const sortedBySource = sortedByResult | 
			
		
	
		
			
				
					|  |  |  |  | 		.slice() | 
			
		
	
		
			
				
					|  |  |  |  | 		.sort( ( a, b ) => a.start - b.start ); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	let c = 0; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	sortedBySource.forEach( part => { | 
			
		
	
		
			
				
					|  |  |  |  | 		code.remove( c, part.start ); | 
			
		
	
		
			
				
					|  |  |  |  | 		code.insertLeft( part.start, part.chunk ); | 
			
		
	
		
			
				
					|  |  |  |  | 		c = part.end; | 
			
		
	
		
			
				
					|  |  |  |  | 	}); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	code.remove( c, template.length ); | 
			
		
	
		
			
				
					|  |  |  |  | 	code.append( finalChunk ); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	sortedByResult.forEach( part => { | 
			
		
	
		
			
				
					|  |  |  |  | 		code.move( part.start, part.end, 0 ); | 
			
		
	
		
			
				
					|  |  |  |  | 	}); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	return { | 
			
		
	
		
			
				
					|  |  |  |  | 		code: code.toString() | 
			
		
	
		
			
				
					|  |  |  |  | 	}; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
	
		
			
				
					|  |  |  | 
 |