import MagicString from 'magic-string'; import { walk } from 'estree-walker'; import deindent from './utils/deindent.js'; import walkHtml from './utils/walkHtml.js'; import flattenReference from './utils/flattenReference.js'; import counter from './utils/counter.js'; function createRenderer ( fragment ) { return deindent` function ${fragment.name} ( component, target${fragment.useAnchor ? ', anchor' : ''} ) { ${fragment.initStatements.join( '\n\n' )} return { update: function ( ${fragment.contextChain.join( ', ' )} ) { ${fragment.updateStatements.join( '\n\n' )} }, teardown: function () { ${fragment.teardownStatements.join( '\n\n' )} } }; } `; } 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 = { if: 0, each: 0 }; // TODO add contents of