From bac02481b781f4d2509a5361b3d4bfdd47482ab2 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 7 Dec 2016 16:52:40 -0500 Subject: [PATCH] server-rendered CSS (#153) --- src/generate/css/process.js | 14 +- src/generate/index.js | 11 +- src/parse/index.js | 2 + src/server-side-rendering/compile.js | 58 +++++++- src/server-side-rendering/register.js | 8 +- ssr/register.js | 134 +++++++++++++++++- ssr/register.js.map | 2 +- test/server-side-rendering/styles/_actual.css | 4 + .../server-side-rendering/styles/_actual.html | 1 + .../styles/_expected.css | 3 + .../styles/_expected.html | 1 + test/server-side-rendering/styles/main.html | 7 + test/test.js | 21 ++- 13 files changed, 237 insertions(+), 29 deletions(-) create mode 100644 test/server-side-rendering/styles/_actual.css create mode 100644 test/server-side-rendering/styles/_actual.html create mode 100644 test/server-side-rendering/styles/_expected.css create mode 100644 test/server-side-rendering/styles/_expected.html create mode 100644 test/server-side-rendering/styles/main.html diff --git a/src/generate/css/process.js b/src/generate/css/process.js index 2bbb120c9a..a75d1cf46e 100644 --- a/src/generate/css/process.js +++ b/src/generate/css/process.js @@ -1,18 +1,6 @@ -import deindent from '../../utils/deindent.js'; import spaces from '../../utils/spaces.js'; import transform from './transform.js'; export default function process ( parsed ) { - const scoped = transform( spaces( parsed.css.content.start ) + parsed.css.content.styles, parsed.hash ); - - return deindent` - let addedCss = false; - function addCss () { - var style = document.createElement( 'style' ); - style.textContent = ${JSON.stringify( scoped )}; - document.head.appendChild( style ); - - addedCss = true; - } - `; + return transform( spaces( parsed.css.content.start ) + parsed.css.content.styles, parsed.hash ); } diff --git a/src/generate/index.js b/src/generate/index.js index df34af2825..b47bbd9afa 100644 --- a/src/generate/index.js +++ b/src/generate/index.js @@ -393,7 +393,16 @@ export default function generate ( parsed, source, options, names ) { } if ( parsed.css ) { - topLevelStatements.push( processCss( parsed ) ); + topLevelStatements.push( deindent` + let addedCss = false; + function addCss () { + var style = document.createElement( 'style' ); + style.textContent = ${JSON.stringify( processCss( parsed ) )}; + document.head.appendChild( style ); + + addedCss = true; + } + ` ); } topLevelStatements.push( ...renderers.reverse() ); diff --git a/src/parse/index.js b/src/parse/index.js index 87e7599258..60ac377371 100644 --- a/src/parse/index.js +++ b/src/parse/index.js @@ -25,6 +25,8 @@ export default function parse ( template ) { throw new TypeError( 'Template must be a string' ); } + template = template.replace( /\s+$/, '' ); + const parser = { index: 0, template, diff --git a/src/server-side-rendering/compile.js b/src/server-side-rendering/compile.js index de8ba7704e..af7e852a99 100644 --- a/src/server-side-rendering/compile.js +++ b/src/server-side-rendering/compile.js @@ -4,6 +4,7 @@ import deindent from '../utils/deindent.js'; import isReference from '../utils/isReference.js'; import flattenReference from '../utils/flattenReference.js'; import MagicString, { Bundle } from 'magic-string'; +import processCss from '../generate/css/process.js'; const voidElementNames = /^(?:area|base|br|col|command|doctype|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/i; @@ -113,6 +114,8 @@ export default function compile ( source, filename ) { }; } + let elementDepth = 0; + const stringifiers = { Component ( node ) { const props = node.attributes.map( attribute => { @@ -187,12 +190,18 @@ export default function compile ( source, filename ) { element += str; }); + if ( parsed.css && elementDepth === 0 ) { + element += ` svelte-${parsed.hash}`; + } + if ( voidElementNames.test( node.name ) ) { element += '>'; } else if ( node.children.length === 0 ) { element += '/>'; } else { + elementDepth += 1; element += '>' + node.children.map( stringify ).join( '' ) + ``; + elementDepth -= 1; } return element; @@ -278,10 +287,6 @@ export default function compile ( source, filename ) { topLevelStatements.push( `[✂${parsed.js.content.start}-${parsed.js.content.end}✂]` ); } - if ( parsed.css ) { - throw new Error( 'TODO handle css' ); - } - const renderStatements = [ templateProperties.data ? `data = Object.assign( template.data(), data || {} );` : `data = data || {};` ]; @@ -325,10 +330,55 @@ export default function compile ( source, filename ) { `return rendered;` ); + const renderCssStatements = [ + `var components = [];` + ]; + + if ( parsed.css ) { + renderCssStatements.push( deindent` + components.push({ + filename: exports.filename, + css: ${JSON.stringify( processCss( parsed ) )}, + map: null // TODO + }); + ` ); + } + + if ( templateProperties.components ) { + renderCssStatements.push( deindent` + var seen = {}; + + function addComponent ( component ) { + var result = component.renderCss(); + result.components.forEach( x => { + if ( seen[ x.filename ] ) return; + seen[ x.filename ] = true; + components.push( x ); + }); + } + ` ); + + renderCssStatements.push( templateProperties.components.properties.map( prop => `addComponent( template.components.${prop.key.name} );` ).join( '\n' ) ); + } + + renderCssStatements.push( deindent` + return { + css: components.map( x => x.css ).join( '\\n' ), + map: null, + components + }; + ` ); + topLevelStatements.push( deindent` + exports.filename = ${JSON.stringify( filename )}; + exports.render = function ( data, options ) { ${renderStatements.join( '\n\n' )} }; + + exports.renderCss = function () { + ${renderCssStatements.join( '\n\n' )} + }; ` ); const rendered = topLevelStatements.join( '\n\n' ); diff --git a/src/server-side-rendering/register.js b/src/server-side-rendering/register.js index b0b41358fd..62a2eaf678 100644 --- a/src/server-side-rendering/register.js +++ b/src/server-side-rendering/register.js @@ -3,5 +3,11 @@ import compile from './compile.js'; require.extensions[ '.html' ] = function ( module, filename ) { const { code } = compile( fs.readFileSync( filename, 'utf-8' ) ); - return module._compile( code, filename ); + + try { + return module._compile( code, filename ); + } catch ( err ) { + console.log( code ); + throw err; + } }; diff --git a/ssr/register.js b/ssr/register.js index f0cff43e51..e1c640ea25 100644 --- a/ssr/register.js +++ b/ssr/register.js @@ -132,6 +132,75 @@ function flatten ( node ) { return { name, keypath: parts.join( '.' ) }; } +function spaces ( i ) { + let result = ''; + while ( i-- ) result += ' '; + return result; +} + +// largely borrowed from Ractive – https://github.com/ractivejs/ractive/blob/2ec648aaf5296bb88c21812e947e0e42fcc456e3/src/Ractive/config/custom/css/transform.js +const selectorsPattern = /(?:^|\})?\s*([^\{\}]+)\s*\{/g; +const commentsPattern = /\/\*.*?\*\//g; +const selectorUnitPattern = /((?:(?:\[[^\]+]\])|(?:[^\s\+\>~:]))+)((?:::?[^\s\+\>\~\(:]+(?:\([^\)]+\))?)*\s*[\s\+\>\~]?)\s*/g; +const excludePattern = /^(?:@|\d+%)/; + +function transformSelector ( selector, parent ) { + const selectorUnits = []; + let match; + + while ( match = selectorUnitPattern.exec( selector ) ) { + selectorUnits.push({ + str: match[0], + base: match[1], + modifiers: match[2] + }); + } + + // For each simple selector within the selector, we need to create a version + // that a) combines with the id, and b) is inside the id + const base = selectorUnits.map( unit => unit.str ); + + const transformed = []; + let i = selectorUnits.length; + + while ( i-- ) { + const appended = base.slice(); + + // Pseudo-selectors should go after the attribute selector + const unit = selectorUnits[i]; + appended[i] = unit.base + parent + unit.modifiers || ''; + + const prepended = base.slice(); + prepended[i] = parent + ' ' + prepended[i]; + + transformed.push( appended.join( ' ' ), prepended.join( ' ' ) ); + } + + return transformed.join( ', ' ); +} + +function transformCss ( css, hash ) { + const attr = `[svelte-${hash}]`; + + return css + .replace( commentsPattern, '' ) + .replace( selectorsPattern, ( match, $1 ) => { + // don't transform at-rules and keyframe declarations + if ( excludePattern.test( $1 ) ) return match; + + const selectors = $1.split( ',' ).map( selector => selector.trim() ); + const transformed = selectors + .map( selector => transformSelector( selector, attr ) ) + .join( ', ' ) + ' '; + + return match.replace( $1, transformed ); + }); +} + +function process ( parsed ) { + return transformCss( spaces( parsed.css.content.start ) + parsed.css.content.styles, parsed.hash ); +} + const voidElementNames = /^(?:area|base|br|col|command|doctype|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/i; function compile ( source, filename ) { @@ -240,6 +309,8 @@ function compile ( source, filename ) { }; } + let elementDepth = 0; + const stringifiers = { Component ( node ) { const props = node.attributes.map( attribute => { @@ -314,12 +385,18 @@ function compile ( source, filename ) { element += str; }); + if ( parsed.css && elementDepth === 0 ) { + element += ` svelte-${parsed.hash}`; + } + if ( voidElementNames.test( node.name ) ) { element += '>'; } else if ( node.children.length === 0 ) { element += '/>'; } else { + elementDepth += 1; element += '>' + node.children.map( stringify ).join( '' ) + ``; + elementDepth -= 1; } return element; @@ -405,10 +482,6 @@ function compile ( source, filename ) { topLevelStatements.push( `[✂${parsed.js.content.start}-${parsed.js.content.end}✂]` ); } - if ( parsed.css ) { - throw new Error( 'TODO handle css' ); - } - const renderStatements = [ templateProperties.data ? `data = Object.assign( template.data(), data || {} );` : `data = data || {};` ]; @@ -452,10 +525,55 @@ function compile ( source, filename ) { `return rendered;` ); + const renderCssStatements = [ + `var components = [];` + ]; + + if ( parsed.css ) { + renderCssStatements.push( deindent` + components.push({ + filename: exports.filename, + css: ${JSON.stringify( process( parsed ) )}, + map: null // TODO + }); + ` ); + } + + if ( templateProperties.components ) { + renderCssStatements.push( deindent` + var seen = {}; + + function addComponent ( component ) { + var result = component.renderCss(); + result.components.forEach( x => { + if ( seen[ x.filename ] ) return; + seen[ x.filename ] = true; + components.push( x ); + }); + } + ` ); + + renderCssStatements.push( templateProperties.components.properties.map( prop => `addComponent( template.components.${prop.key.name} );` ).join( '\n' ) ); + } + + renderCssStatements.push( deindent` + return { + css: components.map( x => x.css ).join( '\\n' ), + map: null, + components + }; + ` ); + topLevelStatements.push( deindent` + exports.filename = ${JSON.stringify( filename )}; + exports.render = function ( data, options ) { ${renderStatements.join( '\n\n' )} }; + + exports.renderCss = function () { + ${renderCssStatements.join( '\n\n' )} + }; ` ); const rendered = topLevelStatements.join( '\n\n' ); @@ -496,6 +614,12 @@ function compile ( source, filename ) { require.extensions[ '.html' ] = function ( module, filename ) { const { code } = compile( fs.readFileSync( filename, 'utf-8' ) ); - return module._compile( code, filename ); + + try { + return module._compile( code, filename ); + } catch ( err ) { + console.log( code ); + throw err; + } }; //# sourceMappingURL=register.js.map diff --git a/ssr/register.js.map b/ssr/register.js.map index c5b0fb481b..3ef2216c5e 100644 --- a/ssr/register.js.map +++ b/ssr/register.js.map @@ -1 +1 @@ -{"version":3,"file":null,"sources":["../node_modules/estree-walker/dist/estree-walker.es.js","../src/utils/deindent.js","../src/utils/isReference.js","../src/utils/flattenReference.js","../src/server-side-rendering/compile.js","../src/server-side-rendering/register.js"],"sourcesContent":["function walk ( ast, ref) {\n\tvar enter = ref.enter;\n\tvar leave = ref.leave;\n\n\tvisit( ast, null, enter, leave );\n}\n\nvar context = {\n\tskip: function () { return context.shouldSkip = true; },\n\tshouldSkip: false\n};\n\nvar childKeys = {};\n\nvar toString = Object.prototype.toString;\n\nfunction isArray ( thing ) {\n\treturn toString.call( thing ) === '[object Array]';\n}\n\nfunction visit ( node, parent, enter, leave, prop, index ) {\n\tif ( !node ) return;\n\n\tif ( enter ) {\n\t\tcontext.shouldSkip = false;\n\t\tenter.call( context, node, parent, prop, index );\n\t\tif ( context.shouldSkip ) return;\n\t}\n\n\tvar keys = childKeys[ node.type ] || (\n\t\tchildKeys[ node.type ] = Object.keys( node ).filter( function (key) { return typeof node[ key ] === 'object'; } )\n\t);\n\n\tfor ( var i = 0; i < keys.length; i += 1 ) {\n\t\tvar key = keys[i];\n\t\tvar value = node[ key ];\n\n\t\tif ( isArray( value ) ) {\n\t\t\tfor ( var j = 0; j < value.length; j += 1 ) {\n\t\t\t\tvisit( value[j], node, enter, leave, key, j );\n\t\t\t}\n\t\t}\n\n\t\telse if ( value && value.type ) {\n\t\t\tvisit( value, node, enter, leave, key, null );\n\t\t}\n\t}\n\n\tif ( leave ) {\n\t\tleave( node, parent, prop, index );\n\t}\n}\n\nexport { walk };\n//# sourceMappingURL=estree-walker.es.js.map\n","const start = /\\n(\\t+)/;\n\nexport default function deindent ( strings, ...values ) {\n\tconst indentation = start.exec( strings[0] )[1];\n\tconst pattern = new RegExp( `^${indentation}`, 'gm' );\n\n\tlet result = strings[0].replace( start, '' ).replace( pattern, '' );\n\n\tlet trailingIndentation = getTrailingIndentation( result );\n\n\tfor ( let i = 1; i < strings.length; i += 1 ) {\n\t\tconst value = String( values[ i - 1 ] ).replace( /\\n/g, `\\n${trailingIndentation}` );\n\t\tresult += value + strings[i].replace( pattern, '' );\n\n\t\ttrailingIndentation = getTrailingIndentation( result );\n\t}\n\n\treturn result.trim();\n}\n\nfunction getTrailingIndentation ( str ) {\n\tlet i = str.length;\n\twhile ( str[ i - 1 ] === ' ' || str[ i - 1 ] === '\\t' ) i -= 1;\n\treturn str.slice( i, str.length );\n}\n","export default function isReference ( node, parent ) {\n\tif ( node.type === 'MemberExpression' ) {\n\t\treturn !node.computed && isReference( node.object, node );\n\t}\n\n\tif ( node.type === 'Identifier' ) {\n\t\t// the only time we could have an identifier node without a parent is\n\t\t// if it's the entire body of a function without a block statement –\n\t\t// i.e. an arrow function expression like `a => a`\n\t\tif ( !parent ) return true;\n\n\t\t// TODO is this right?\n\t\tif ( parent.type === 'MemberExpression' || parent.type === 'MethodDefinition' ) {\n\t\t\treturn parent.computed || node === parent.object;\n\t\t}\n\n\t\t// disregard the `bar` in `{ bar: foo }`, but keep it in `{ [bar]: foo }`\n\t\tif ( parent.type === 'Property' ) return parent.computed || node === parent.value;\n\n\t\t// disregard the `bar` in `class Foo { bar () {...} }`\n\t\tif ( parent.type === 'MethodDefinition' ) return false;\n\n\t\t// disregard the `bar` in `export { foo as bar }`\n\t\tif ( parent.type === 'ExportSpecifier' && node !== parent.local ) return;\n\n\t\treturn true;\n\t}\n}\n","export default function flatten ( node ) {\n\tconst parts = [];\n\twhile ( node.type === 'MemberExpression' ) {\n\t\tif ( node.computed ) return null;\n\t\tparts.unshift( node.property.name );\n\n\t\tnode = node.object;\n\t}\n\n\tif ( node.type !== 'Identifier' ) return null;\n\n\tconst name = node.name;\n\tparts.unshift( name );\n\n\treturn { name, keypath: parts.join( '.' ) };\n}\n","import { parse, validate } from 'svelte';\nimport { walk } from 'estree-walker';\nimport deindent from '../utils/deindent.js';\nimport isReference from '../utils/isReference.js';\nimport flattenReference from '../utils/flattenReference.js';\nimport MagicString, { Bundle } from 'magic-string';\n\nconst voidElementNames = /^(?:area|base|br|col|command|doctype|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/i;\n\nexport default function compile ( source, filename ) {\n\tconst parsed = parse( source, {} );\n\tvalidate( parsed, source, {} );\n\n\tconst code = new MagicString( source );\n\n\tconst templateProperties = {};\n\tconst components = {};\n\tconst helpers = {};\n\n\tconst imports = [];\n\n\tif ( parsed.js ) {\n\t\twalk( parsed.js.content, {\n\t\t\tenter ( node ) {\n\t\t\t\tcode.addSourcemapLocation( node.start );\n\t\t\t\tcode.addSourcemapLocation( node.end );\n\t\t\t}\n\t\t});\n\n\t\t// imports need to be hoisted out of the IIFE\n\t\tfor ( let i = 0; i < parsed.js.content.body.length; i += 1 ) {\n\t\t\tconst node = parsed.js.content.body[i];\n\t\t\tif ( node.type === 'ImportDeclaration' ) {\n\t\t\t\tlet a = node.start;\n\t\t\t\tlet b = node.end;\n\t\t\t\twhile ( /[ \\t]/.test( source[ a - 1 ] ) ) a -= 1;\n\t\t\t\twhile ( source[b] === '\\n' ) b += 1;\n\n\t\t\t\t//imports.push( source.slice( a, b ).replace( /^\\s/, '' ) );\n\t\t\t\timports.push( node );\n\t\t\t\tcode.remove( a, b );\n\t\t\t}\n\t\t}\n\n\t\tconst defaultExport = parsed.js.content.body.find( node => node.type === 'ExportDefaultDeclaration' );\n\n\t\tif ( defaultExport ) {\n\t\t\tconst finalNode = parsed.js.content.body[ parsed.js.content.body.length - 1 ];\n\t\t\tif ( defaultExport === finalNode ) {\n\t\t\t\t// export is last property, we can just return it\n\t\t\t\tcode.overwrite( defaultExport.start, defaultExport.declaration.start, `return ` );\n\t\t\t} else {\n\t\t\t\t// TODO ensure `template` isn't already declared\n\t\t\t\tcode.overwrite( defaultExport.start, defaultExport.declaration.start, `var template = ` );\n\n\t\t\t\tlet i = defaultExport.start;\n\t\t\t\twhile ( /\\s/.test( source[ i - 1 ] ) ) i--;\n\n\t\t\t\tconst indentation = source.slice( i, defaultExport.start );\n\t\t\t\tcode.appendLeft( finalNode.end, `\\n\\n${indentation}return template;` );\n\t\t\t}\n\n\t\t\tdefaultExport.declaration.properties.forEach( prop => {\n\t\t\t\ttemplateProperties[ prop.key.name ] = prop.value;\n\t\t\t});\n\n\t\t\tcode.prependRight( parsed.js.content.start, 'var template = (function () {' );\n\t\t} else {\n\t\t\tcode.prependRight( parsed.js.content.start, '(function () {' );\n\t\t}\n\n\t\tcode.appendLeft( parsed.js.content.end, '}());' );\n\n\t\tif ( templateProperties.helpers ) {\n\t\t\ttemplateProperties.helpers.properties.forEach( prop => {\n\t\t\t\thelpers[ prop.key.name ] = prop.value;\n\t\t\t});\n\t\t}\n\n\t\tif ( templateProperties.components ) {\n\t\t\ttemplateProperties.components.properties.forEach( prop => {\n\t\t\t\tcomponents[ prop.key.name ] = prop.value;\n\t\t\t});\n\t\t}\n\t}\n\n\tlet scope = new Set();\n\tconst scopes = [ scope ];\n\n\tfunction contextualise ( expression ) {\n\t\twalk( expression, {\n\t\t\tenter ( node, parent ) {\n\t\t\t\tif ( isReference( node, parent ) ) {\n\t\t\t\t\tconst { name } = flattenReference( node );\n\n\t\t\t\t\tif ( parent && parent.type === 'CallExpression' && node === parent.callee && helpers[ name ] ) {\n\t\t\t\t\t\tcode.prependRight( node.start, `template.helpers.` );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !scope.has( name ) ) {\n\t\t\t\t\t\tcode.prependRight( node.start, `data.` );\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.skip();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tsnippet: `[✂${expression.start}-${expression.end}✂]`,\n\t\t\tstring: code.slice( expression.start, expression.end )\n\t\t};\n\t}\n\n\tconst stringifiers = {\n\t\tComponent ( node ) {\n\t\t\tconst props = node.attributes.map( attribute => {\n\t\t\t\tlet value;\n\n\t\t\t\tif ( attribute.value === true ) {\n\t\t\t\t\tvalue = `true`;\n\t\t\t\t} else if ( attribute.value.length === 0 ) {\n\t\t\t\t\tvalue = `''`;\n\t\t\t\t} else if ( attribute.value.length === 1 ) {\n\t\t\t\t\tconst chunk = attribute.value[0];\n\t\t\t\t\tif ( chunk.type === 'Text' ) {\n\t\t\t\t\t\tvalue = isNaN( parseFloat( chunk.data ) ) ? JSON.stringify( chunk.data ) : chunk.data;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst { snippet } = contextualise( chunk.expression );\n\t\t\t\t\t\tvalue = snippet;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tvalue = '`' + attribute.value.map( stringify ).join( '' ) + '`';\n\t\t\t\t}\n\n\t\t\t\treturn `${attribute.name}: ${value}`;\n\t\t\t}).join( ', ' );\n\n\t\t\tlet params = `{${props}}`;\n\n\t\t\tif ( node.children.length ) {\n\t\t\t\tparams += `, { yield: () => \\`${node.children.map( stringify ).join( '' )}\\` }`;\n\t\t\t}\n\n\t\t\treturn `\\${template.components.${node.name}.render(${params})}`;\n\t\t},\n\n\t\tEachBlock ( node ) {\n\t\t\tconst { snippet } = contextualise( node.expression );\n\n\t\t\tscope = new Set();\n\t\t\tscope.add( node.context );\n\t\t\tif ( node.index ) scope.add( node.index );\n\n\t\t\tscopes.push( scope );\n\n\t\t\tconst block = `\\${ ${snippet}.map( ${ node.index ? `( ${node.context}, ${node.index} )` : node.context} => \\`${ node.children.map( stringify ).join( '' )}\\` ).join( '' )}`;\n\n\t\t\tscopes.pop();\n\t\t\tscope = scopes[ scopes.length - 1 ];\n\n\t\t\treturn block;\n\t\t},\n\n\t\tElement ( node ) {\n\t\t\tif ( node.name in components ) {\n\t\t\t\treturn stringifiers.Component( node );\n\t\t\t}\n\n\t\t\tlet element = `<${node.name}`;\n\n\t\t\tnode.attributes.forEach( attribute => {\n\t\t\t\tlet str = ` ${attribute.name}`;\n\n\t\t\t\tif ( attribute.value !== true ) {\n\t\t\t\t\tstr += `=\"` + attribute.value.map( chunk => {\n\t\t\t\t\t\tif ( chunk.type === 'Text' ) {\n\t\t\t\t\t\t\treturn chunk.data;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst { snippet } = contextualise( chunk.expression );\n\t\t\t\t\t\treturn '${' + snippet + '}';\n\t\t\t\t\t}).join( '' ) + `\"`;\n\t\t\t\t}\n\n\t\t\t\telement += str;\n\t\t\t});\n\n\t\t\tif ( voidElementNames.test( node.name ) ) {\n\t\t\t\telement += '>';\n\t\t\t} else if ( node.children.length === 0 ) {\n\t\t\t\telement += '/>';\n\t\t\t} else {\n\t\t\t\telement += '>' + node.children.map( stringify ).join( '' ) + ``;\n\t\t\t}\n\n\t\t\treturn element;\n\t\t},\n\n\t\tIfBlock ( node ) {\n\t\t\tconst { snippet } = contextualise( node.expression ); // TODO use snippet, for sourcemap support\n\n\t\t\tconst consequent = node.children.map( stringify ).join( '' );\n\t\t\tconst alternate = node.else ? node.else.children.map( stringify ).join( '' ) : '';\n\n\t\t\treturn '${ ' + snippet + ' ? `' + consequent + '` : `' + alternate + '` }';\n\t\t},\n\n\t\tMustacheTag ( node ) {\n\t\t\tconst { snippet } = contextualise( node.expression ); // TODO use snippet, for sourcemap support\n\t\t\treturn '${' + snippet + '}';\n\t\t},\n\n\t\tText ( node ) {\n\t\t\treturn node.data.replace( /\\${/g, '\\\\${' );\n\t\t},\n\n\t\tYieldTag () {\n\t\t\treturn `\\${options.yield()}`;\n\t\t}\n\t};\n\n\tfunction stringify ( node ) {\n\t\tconst stringifier = stringifiers[ node.type ];\n\n\t\tif ( !stringifier ) {\n\t\t\tthrow new Error( `Not implemented: ${node.type}` );\n\t\t}\n\n\t\treturn stringifier( node );\n\t}\n\n\tfunction createBlock ( node ) {\n\t\tconst str = stringify( node );\n\t\tif ( str.slice( 0, 2 ) === '${' ) return str.slice( 2, -1 );\n\t\treturn '`' + str + '`';\n\t}\n\n\tconst blocks = parsed.html.children.map( node => {\n\t\treturn deindent`\n\t\t\trendered += ${createBlock( node )};\n\t\t`;\n\t});\n\n\tconst topLevelStatements = [];\n\n\tconst importBlock = imports\n\t\t.map( ( declaration, i ) => {\n\t\t\tconst defaultImport = declaration.specifiers.find( x => x.type === 'ImportDefaultSpecifier' || x.type === 'ImportSpecifier' && x.imported.name === 'default' );\n\t\t\tconst namespaceImport = declaration.specifiers.find( x => x.type === 'ImportNamespaceSpecifier' );\n\t\t\tconst namedImports = declaration.specifiers.filter( x => x.type === 'ImportSpecifier' && x.imported.name !== 'default' );\n\n\t\t\tconst name = ( defaultImport || namespaceImport ) ? ( defaultImport || namespaceImport ).local.name : `__import${i}`;\n\n\t\t\tconst statements = [\n\t\t\t\t`var ${name} = require( '${declaration.source.value}' );`\n\t\t\t];\n\n\t\t\tnamedImports.forEach( specifier => {\n\t\t\t\tstatements.push( `var ${specifier.local.name} = ${name}.${specifier.imported.name};` );\n\t\t\t});\n\n\t\t\tif ( defaultImport ) {\n\t\t\t\tstatements.push( `${name} = ( ${name} && ${name}.__esModule ) ? ${name}['default'] : ${name};` );\n\t\t\t}\n\n\t\t\treturn statements.join( '\\n' );\n\t\t})\n\t\t.filter( Boolean )\n\t\t.join( '\\n' );\n\n\tif ( parsed.js ) {\n\t\tif ( imports.length ) {\n\t\t\ttopLevelStatements.push( importBlock );\n\t\t}\n\n\t\ttopLevelStatements.push( `[✂${parsed.js.content.start}-${parsed.js.content.end}✂]` );\n\t}\n\n\tif ( parsed.css ) {\n\t\tthrow new Error( 'TODO handle css' );\n\t}\n\n\tconst renderStatements = [\n\t\ttemplateProperties.data ? `data = Object.assign( template.data(), data || {} );` : `data = data || {};`\n\t];\n\n\tif ( templateProperties.computed ) {\n\t\tconst statements = [];\n\t\tconst dependencies = new Map();\n\n\t\ttemplateProperties.computed.properties.forEach( prop => {\n\t\t\tconst key = prop.key.name;\n\t\t\tconst value = prop.value;\n\n\t\t\tconst deps = value.params.map( param => param.name );\n\t\t\tdependencies.set( key, deps );\n\t\t});\n\n\t\tconst visited = new Set();\n\n\t\tfunction visit ( key ) {\n\t\t\tif ( !dependencies.has( key ) ) return; // not a computation\n\n\t\t\tif ( visited.has( key ) ) return;\n\t\t\tvisited.add( key );\n\n\t\t\tconst deps = dependencies.get( key );\n\t\t\tdeps.forEach( visit );\n\n\t\t\tstatements.push( deindent`\n\t\t\t\tdata.${key} = template.computed.${key}( ${deps.map( dep => `data.${dep}` ).join( ', ' )} );\n\t\t\t` );\n\t\t}\n\n\t\ttemplateProperties.computed.properties.forEach( prop => visit( prop.key.name ) );\n\n\t\trenderStatements.push( statements.join( '\\n' ) );\n\t}\n\n\trenderStatements.push(\n\t\t`var rendered = '';`,\n\t\tblocks.join( '\\n\\n' ),\n\t\t`return rendered;`\n\t);\n\n\ttopLevelStatements.push( deindent`\n\t\texports.render = function ( data, options ) {\n\t\t\t${renderStatements.join( '\\n\\n' )}\n\t\t};\n\t` );\n\n\tconst rendered = topLevelStatements.join( '\\n\\n' );\n\n\tconst pattern = /\\[✂(\\d+)-(\\d+)$/;\n\n\tconst parts = rendered.split( '✂]' );\n\tconst finalChunk = parts.pop();\n\n\tconst compiled = new Bundle({ separator: '' });\n\n\tfunction addString ( str ) {\n\t\tcompiled.addSource({\n\t\t\tcontent: new MagicString( str )\n\t\t});\n\t}\n\n\tparts.forEach( str => {\n\t\tconst chunk = str.replace( pattern, '' );\n\t\tif ( chunk ) addString( chunk );\n\n\t\tconst match = pattern.exec( str );\n\n\t\tconst snippet = code.snip( +match[1], +match[2] );\n\n\t\tcompiled.addSource({\n\t\t\tfilename,\n\t\t\tcontent: snippet\n\t\t});\n\t});\n\n\taddString( finalChunk );\n\n\treturn {\n\t\tcode: compiled.toString()\n\t};\n}\n","import * as fs from 'fs';\nimport compile from './compile.js';\n\nrequire.extensions[ '.html' ] = function ( module, filename ) {\n\tconst { code } = compile( fs.readFileSync( filename, 'utf-8' ) );\n\treturn module._compile( code, filename );\n};\n"],"names":["parse","validate","MagicString","flattenReference","Bundle","fs.readFileSync"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":null,"sources":["../node_modules/estree-walker/dist/estree-walker.es.js","../src/utils/deindent.js","../src/utils/isReference.js","../src/utils/flattenReference.js","../src/utils/spaces.js","../src/generate/css/transform.js","../src/generate/css/process.js","../src/server-side-rendering/compile.js","../src/server-side-rendering/register.js"],"sourcesContent":["function walk ( ast, ref) {\n\tvar enter = ref.enter;\n\tvar leave = ref.leave;\n\n\tvisit( ast, null, enter, leave );\n}\n\nvar context = {\n\tskip: function () { return context.shouldSkip = true; },\n\tshouldSkip: false\n};\n\nvar childKeys = {};\n\nvar toString = Object.prototype.toString;\n\nfunction isArray ( thing ) {\n\treturn toString.call( thing ) === '[object Array]';\n}\n\nfunction visit ( node, parent, enter, leave, prop, index ) {\n\tif ( !node ) return;\n\n\tif ( enter ) {\n\t\tcontext.shouldSkip = false;\n\t\tenter.call( context, node, parent, prop, index );\n\t\tif ( context.shouldSkip ) return;\n\t}\n\n\tvar keys = childKeys[ node.type ] || (\n\t\tchildKeys[ node.type ] = Object.keys( node ).filter( function (key) { return typeof node[ key ] === 'object'; } )\n\t);\n\n\tfor ( var i = 0; i < keys.length; i += 1 ) {\n\t\tvar key = keys[i];\n\t\tvar value = node[ key ];\n\n\t\tif ( isArray( value ) ) {\n\t\t\tfor ( var j = 0; j < value.length; j += 1 ) {\n\t\t\t\tvisit( value[j], node, enter, leave, key, j );\n\t\t\t}\n\t\t}\n\n\t\telse if ( value && value.type ) {\n\t\t\tvisit( value, node, enter, leave, key, null );\n\t\t}\n\t}\n\n\tif ( leave ) {\n\t\tleave( node, parent, prop, index );\n\t}\n}\n\nexport { walk };\n//# sourceMappingURL=estree-walker.es.js.map\n","const start = /\\n(\\t+)/;\n\nexport default function deindent ( strings, ...values ) {\n\tconst indentation = start.exec( strings[0] )[1];\n\tconst pattern = new RegExp( `^${indentation}`, 'gm' );\n\n\tlet result = strings[0].replace( start, '' ).replace( pattern, '' );\n\n\tlet trailingIndentation = getTrailingIndentation( result );\n\n\tfor ( let i = 1; i < strings.length; i += 1 ) {\n\t\tconst value = String( values[ i - 1 ] ).replace( /\\n/g, `\\n${trailingIndentation}` );\n\t\tresult += value + strings[i].replace( pattern, '' );\n\n\t\ttrailingIndentation = getTrailingIndentation( result );\n\t}\n\n\treturn result.trim();\n}\n\nfunction getTrailingIndentation ( str ) {\n\tlet i = str.length;\n\twhile ( str[ i - 1 ] === ' ' || str[ i - 1 ] === '\\t' ) i -= 1;\n\treturn str.slice( i, str.length );\n}\n","export default function isReference ( node, parent ) {\n\tif ( node.type === 'MemberExpression' ) {\n\t\treturn !node.computed && isReference( node.object, node );\n\t}\n\n\tif ( node.type === 'Identifier' ) {\n\t\t// the only time we could have an identifier node without a parent is\n\t\t// if it's the entire body of a function without a block statement –\n\t\t// i.e. an arrow function expression like `a => a`\n\t\tif ( !parent ) return true;\n\n\t\t// TODO is this right?\n\t\tif ( parent.type === 'MemberExpression' || parent.type === 'MethodDefinition' ) {\n\t\t\treturn parent.computed || node === parent.object;\n\t\t}\n\n\t\t// disregard the `bar` in `{ bar: foo }`, but keep it in `{ [bar]: foo }`\n\t\tif ( parent.type === 'Property' ) return parent.computed || node === parent.value;\n\n\t\t// disregard the `bar` in `class Foo { bar () {...} }`\n\t\tif ( parent.type === 'MethodDefinition' ) return false;\n\n\t\t// disregard the `bar` in `export { foo as bar }`\n\t\tif ( parent.type === 'ExportSpecifier' && node !== parent.local ) return;\n\n\t\treturn true;\n\t}\n}\n","export default function flatten ( node ) {\n\tconst parts = [];\n\twhile ( node.type === 'MemberExpression' ) {\n\t\tif ( node.computed ) return null;\n\t\tparts.unshift( node.property.name );\n\n\t\tnode = node.object;\n\t}\n\n\tif ( node.type !== 'Identifier' ) return null;\n\n\tconst name = node.name;\n\tparts.unshift( name );\n\n\treturn { name, keypath: parts.join( '.' ) };\n}\n","export default function spaces ( i ) {\n\tlet result = '';\n\twhile ( i-- ) result += ' ';\n\treturn result;\n}\n","// largely borrowed from Ractive – https://github.com/ractivejs/ractive/blob/2ec648aaf5296bb88c21812e947e0e42fcc456e3/src/Ractive/config/custom/css/transform.js\nconst selectorsPattern = /(?:^|\\})?\\s*([^\\{\\}]+)\\s*\\{/g;\nconst commentsPattern = /\\/\\*.*?\\*\\//g;\nconst selectorUnitPattern = /((?:(?:\\[[^\\]+]\\])|(?:[^\\s\\+\\>~:]))+)((?:::?[^\\s\\+\\>\\~\\(:]+(?:\\([^\\)]+\\))?)*\\s*[\\s\\+\\>\\~]?)\\s*/g;\nconst excludePattern = /^(?:@|\\d+%)/;\n\nfunction transformSelector ( selector, parent ) {\n\tconst selectorUnits = [];\n\tlet match;\n\n\twhile ( match = selectorUnitPattern.exec( selector ) ) {\n\t\tselectorUnits.push({\n\t\t\tstr: match[0],\n\t\t\tbase: match[1],\n\t\t\tmodifiers: match[2]\n\t\t});\n\t}\n\n\t// For each simple selector within the selector, we need to create a version\n\t// that a) combines with the id, and b) is inside the id\n\tconst base = selectorUnits.map( unit => unit.str );\n\n\tconst transformed = [];\n\tlet i = selectorUnits.length;\n\n\twhile ( i-- ) {\n\t\tconst appended = base.slice();\n\n\t\t// Pseudo-selectors should go after the attribute selector\n\t\tconst unit = selectorUnits[i];\n\t\tappended[i] = unit.base + parent + unit.modifiers || '';\n\n\t\tconst prepended = base.slice();\n\t\tprepended[i] = parent + ' ' + prepended[i];\n\n\t\ttransformed.push( appended.join( ' ' ), prepended.join( ' ' ) );\n\t}\n\n\treturn transformed.join( ', ' );\n}\n\nexport default function transformCss ( css, hash ) {\n\tconst attr = `[svelte-${hash}]`;\n\n\treturn css\n\t\t.replace( commentsPattern, '' )\n\t\t.replace( selectorsPattern, ( match, $1 ) => {\n\t\t\t// don't transform at-rules and keyframe declarations\n\t\t\tif ( excludePattern.test( $1 ) ) return match;\n\n\t\t\tconst selectors = $1.split( ',' ).map( selector => selector.trim() );\n\t\t\tconst transformed = selectors\n\t\t\t\t.map( selector => transformSelector( selector, attr ) )\n\t\t\t\t.join( ', ' ) + ' ';\n\n\t\t\treturn match.replace( $1, transformed );\n\t\t});\n}\n","import spaces from '../../utils/spaces.js';\nimport transform from './transform.js';\n\nexport default function process ( parsed ) {\n\treturn transform( spaces( parsed.css.content.start ) + parsed.css.content.styles, parsed.hash );\n}\n","import { parse, validate } from 'svelte';\nimport { walk } from 'estree-walker';\nimport deindent from '../utils/deindent.js';\nimport isReference from '../utils/isReference.js';\nimport flattenReference from '../utils/flattenReference.js';\nimport MagicString, { Bundle } from 'magic-string';\nimport processCss from '../generate/css/process.js';\n\nconst voidElementNames = /^(?:area|base|br|col|command|doctype|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/i;\n\nexport default function compile ( source, filename ) {\n\tconst parsed = parse( source, {} );\n\tvalidate( parsed, source, {} );\n\n\tconst code = new MagicString( source );\n\n\tconst templateProperties = {};\n\tconst components = {};\n\tconst helpers = {};\n\n\tconst imports = [];\n\n\tif ( parsed.js ) {\n\t\twalk( parsed.js.content, {\n\t\t\tenter ( node ) {\n\t\t\t\tcode.addSourcemapLocation( node.start );\n\t\t\t\tcode.addSourcemapLocation( node.end );\n\t\t\t}\n\t\t});\n\n\t\t// imports need to be hoisted out of the IIFE\n\t\tfor ( let i = 0; i < parsed.js.content.body.length; i += 1 ) {\n\t\t\tconst node = parsed.js.content.body[i];\n\t\t\tif ( node.type === 'ImportDeclaration' ) {\n\t\t\t\tlet a = node.start;\n\t\t\t\tlet b = node.end;\n\t\t\t\twhile ( /[ \\t]/.test( source[ a - 1 ] ) ) a -= 1;\n\t\t\t\twhile ( source[b] === '\\n' ) b += 1;\n\n\t\t\t\t//imports.push( source.slice( a, b ).replace( /^\\s/, '' ) );\n\t\t\t\timports.push( node );\n\t\t\t\tcode.remove( a, b );\n\t\t\t}\n\t\t}\n\n\t\tconst defaultExport = parsed.js.content.body.find( node => node.type === 'ExportDefaultDeclaration' );\n\n\t\tif ( defaultExport ) {\n\t\t\tconst finalNode = parsed.js.content.body[ parsed.js.content.body.length - 1 ];\n\t\t\tif ( defaultExport === finalNode ) {\n\t\t\t\t// export is last property, we can just return it\n\t\t\t\tcode.overwrite( defaultExport.start, defaultExport.declaration.start, `return ` );\n\t\t\t} else {\n\t\t\t\t// TODO ensure `template` isn't already declared\n\t\t\t\tcode.overwrite( defaultExport.start, defaultExport.declaration.start, `var template = ` );\n\n\t\t\t\tlet i = defaultExport.start;\n\t\t\t\twhile ( /\\s/.test( source[ i - 1 ] ) ) i--;\n\n\t\t\t\tconst indentation = source.slice( i, defaultExport.start );\n\t\t\t\tcode.appendLeft( finalNode.end, `\\n\\n${indentation}return template;` );\n\t\t\t}\n\n\t\t\tdefaultExport.declaration.properties.forEach( prop => {\n\t\t\t\ttemplateProperties[ prop.key.name ] = prop.value;\n\t\t\t});\n\n\t\t\tcode.prependRight( parsed.js.content.start, 'var template = (function () {' );\n\t\t} else {\n\t\t\tcode.prependRight( parsed.js.content.start, '(function () {' );\n\t\t}\n\n\t\tcode.appendLeft( parsed.js.content.end, '}());' );\n\n\t\tif ( templateProperties.helpers ) {\n\t\t\ttemplateProperties.helpers.properties.forEach( prop => {\n\t\t\t\thelpers[ prop.key.name ] = prop.value;\n\t\t\t});\n\t\t}\n\n\t\tif ( templateProperties.components ) {\n\t\t\ttemplateProperties.components.properties.forEach( prop => {\n\t\t\t\tcomponents[ prop.key.name ] = prop.value;\n\t\t\t});\n\t\t}\n\t}\n\n\tlet scope = new Set();\n\tconst scopes = [ scope ];\n\n\tfunction contextualise ( expression ) {\n\t\twalk( expression, {\n\t\t\tenter ( node, parent ) {\n\t\t\t\tif ( isReference( node, parent ) ) {\n\t\t\t\t\tconst { name } = flattenReference( node );\n\n\t\t\t\t\tif ( parent && parent.type === 'CallExpression' && node === parent.callee && helpers[ name ] ) {\n\t\t\t\t\t\tcode.prependRight( node.start, `template.helpers.` );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !scope.has( name ) ) {\n\t\t\t\t\t\tcode.prependRight( node.start, `data.` );\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.skip();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tsnippet: `[✂${expression.start}-${expression.end}✂]`,\n\t\t\tstring: code.slice( expression.start, expression.end )\n\t\t};\n\t}\n\n\tlet elementDepth = 0;\n\n\tconst stringifiers = {\n\t\tComponent ( node ) {\n\t\t\tconst props = node.attributes.map( attribute => {\n\t\t\t\tlet value;\n\n\t\t\t\tif ( attribute.value === true ) {\n\t\t\t\t\tvalue = `true`;\n\t\t\t\t} else if ( attribute.value.length === 0 ) {\n\t\t\t\t\tvalue = `''`;\n\t\t\t\t} else if ( attribute.value.length === 1 ) {\n\t\t\t\t\tconst chunk = attribute.value[0];\n\t\t\t\t\tif ( chunk.type === 'Text' ) {\n\t\t\t\t\t\tvalue = isNaN( parseFloat( chunk.data ) ) ? JSON.stringify( chunk.data ) : chunk.data;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst { snippet } = contextualise( chunk.expression );\n\t\t\t\t\t\tvalue = snippet;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tvalue = '`' + attribute.value.map( stringify ).join( '' ) + '`';\n\t\t\t\t}\n\n\t\t\t\treturn `${attribute.name}: ${value}`;\n\t\t\t}).join( ', ' );\n\n\t\t\tlet params = `{${props}}`;\n\n\t\t\tif ( node.children.length ) {\n\t\t\t\tparams += `, { yield: () => \\`${node.children.map( stringify ).join( '' )}\\` }`;\n\t\t\t}\n\n\t\t\treturn `\\${template.components.${node.name}.render(${params})}`;\n\t\t},\n\n\t\tEachBlock ( node ) {\n\t\t\tconst { snippet } = contextualise( node.expression );\n\n\t\t\tscope = new Set();\n\t\t\tscope.add( node.context );\n\t\t\tif ( node.index ) scope.add( node.index );\n\n\t\t\tscopes.push( scope );\n\n\t\t\tconst block = `\\${ ${snippet}.map( ${ node.index ? `( ${node.context}, ${node.index} )` : node.context} => \\`${ node.children.map( stringify ).join( '' )}\\` ).join( '' )}`;\n\n\t\t\tscopes.pop();\n\t\t\tscope = scopes[ scopes.length - 1 ];\n\n\t\t\treturn block;\n\t\t},\n\n\t\tElement ( node ) {\n\t\t\tif ( node.name in components ) {\n\t\t\t\treturn stringifiers.Component( node );\n\t\t\t}\n\n\t\t\tlet element = `<${node.name}`;\n\n\t\t\tnode.attributes.forEach( attribute => {\n\t\t\t\tlet str = ` ${attribute.name}`;\n\n\t\t\t\tif ( attribute.value !== true ) {\n\t\t\t\t\tstr += `=\"` + attribute.value.map( chunk => {\n\t\t\t\t\t\tif ( chunk.type === 'Text' ) {\n\t\t\t\t\t\t\treturn chunk.data;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst { snippet } = contextualise( chunk.expression );\n\t\t\t\t\t\treturn '${' + snippet + '}';\n\t\t\t\t\t}).join( '' ) + `\"`;\n\t\t\t\t}\n\n\t\t\t\telement += str;\n\t\t\t});\n\n\t\t\tif ( parsed.css && elementDepth === 0 ) {\n\t\t\t\telement += ` svelte-${parsed.hash}`;\n\t\t\t}\n\n\t\t\tif ( voidElementNames.test( node.name ) ) {\n\t\t\t\telement += '>';\n\t\t\t} else if ( node.children.length === 0 ) {\n\t\t\t\telement += '/>';\n\t\t\t} else {\n\t\t\t\telementDepth += 1;\n\t\t\t\telement += '>' + node.children.map( stringify ).join( '' ) + ``;\n\t\t\t\telementDepth -= 1;\n\t\t\t}\n\n\t\t\treturn element;\n\t\t},\n\n\t\tIfBlock ( node ) {\n\t\t\tconst { snippet } = contextualise( node.expression ); // TODO use snippet, for sourcemap support\n\n\t\t\tconst consequent = node.children.map( stringify ).join( '' );\n\t\t\tconst alternate = node.else ? node.else.children.map( stringify ).join( '' ) : '';\n\n\t\t\treturn '${ ' + snippet + ' ? `' + consequent + '` : `' + alternate + '` }';\n\t\t},\n\n\t\tMustacheTag ( node ) {\n\t\t\tconst { snippet } = contextualise( node.expression ); // TODO use snippet, for sourcemap support\n\t\t\treturn '${' + snippet + '}';\n\t\t},\n\n\t\tText ( node ) {\n\t\t\treturn node.data.replace( /\\${/g, '\\\\${' );\n\t\t},\n\n\t\tYieldTag () {\n\t\t\treturn `\\${options.yield()}`;\n\t\t}\n\t};\n\n\tfunction stringify ( node ) {\n\t\tconst stringifier = stringifiers[ node.type ];\n\n\t\tif ( !stringifier ) {\n\t\t\tthrow new Error( `Not implemented: ${node.type}` );\n\t\t}\n\n\t\treturn stringifier( node );\n\t}\n\n\tfunction createBlock ( node ) {\n\t\tconst str = stringify( node );\n\t\tif ( str.slice( 0, 2 ) === '${' ) return str.slice( 2, -1 );\n\t\treturn '`' + str + '`';\n\t}\n\n\tconst blocks = parsed.html.children.map( node => {\n\t\treturn deindent`\n\t\t\trendered += ${createBlock( node )};\n\t\t`;\n\t});\n\n\tconst topLevelStatements = [];\n\n\tconst importBlock = imports\n\t\t.map( ( declaration, i ) => {\n\t\t\tconst defaultImport = declaration.specifiers.find( x => x.type === 'ImportDefaultSpecifier' || x.type === 'ImportSpecifier' && x.imported.name === 'default' );\n\t\t\tconst namespaceImport = declaration.specifiers.find( x => x.type === 'ImportNamespaceSpecifier' );\n\t\t\tconst namedImports = declaration.specifiers.filter( x => x.type === 'ImportSpecifier' && x.imported.name !== 'default' );\n\n\t\t\tconst name = ( defaultImport || namespaceImport ) ? ( defaultImport || namespaceImport ).local.name : `__import${i}`;\n\n\t\t\tconst statements = [\n\t\t\t\t`var ${name} = require( '${declaration.source.value}' );`\n\t\t\t];\n\n\t\t\tnamedImports.forEach( specifier => {\n\t\t\t\tstatements.push( `var ${specifier.local.name} = ${name}.${specifier.imported.name};` );\n\t\t\t});\n\n\t\t\tif ( defaultImport ) {\n\t\t\t\tstatements.push( `${name} = ( ${name} && ${name}.__esModule ) ? ${name}['default'] : ${name};` );\n\t\t\t}\n\n\t\t\treturn statements.join( '\\n' );\n\t\t})\n\t\t.filter( Boolean )\n\t\t.join( '\\n' );\n\n\tif ( parsed.js ) {\n\t\tif ( imports.length ) {\n\t\t\ttopLevelStatements.push( importBlock );\n\t\t}\n\n\t\ttopLevelStatements.push( `[✂${parsed.js.content.start}-${parsed.js.content.end}✂]` );\n\t}\n\n\tconst renderStatements = [\n\t\ttemplateProperties.data ? `data = Object.assign( template.data(), data || {} );` : `data = data || {};`\n\t];\n\n\tif ( templateProperties.computed ) {\n\t\tconst statements = [];\n\t\tconst dependencies = new Map();\n\n\t\ttemplateProperties.computed.properties.forEach( prop => {\n\t\t\tconst key = prop.key.name;\n\t\t\tconst value = prop.value;\n\n\t\t\tconst deps = value.params.map( param => param.name );\n\t\t\tdependencies.set( key, deps );\n\t\t});\n\n\t\tconst visited = new Set();\n\n\t\tfunction visit ( key ) {\n\t\t\tif ( !dependencies.has( key ) ) return; // not a computation\n\n\t\t\tif ( visited.has( key ) ) return;\n\t\t\tvisited.add( key );\n\n\t\t\tconst deps = dependencies.get( key );\n\t\t\tdeps.forEach( visit );\n\n\t\t\tstatements.push( deindent`\n\t\t\t\tdata.${key} = template.computed.${key}( ${deps.map( dep => `data.${dep}` ).join( ', ' )} );\n\t\t\t` );\n\t\t}\n\n\t\ttemplateProperties.computed.properties.forEach( prop => visit( prop.key.name ) );\n\n\t\trenderStatements.push( statements.join( '\\n' ) );\n\t}\n\n\trenderStatements.push(\n\t\t`var rendered = '';`,\n\t\tblocks.join( '\\n\\n' ),\n\t\t`return rendered;`\n\t);\n\n\tconst renderCssStatements = [\n\t\t`var components = [];`\n\t];\n\n\tif ( parsed.css ) {\n\t\trenderCssStatements.push( deindent`\n\t\t\tcomponents.push({\n\t\t\t\tfilename: exports.filename,\n\t\t\t\tcss: ${JSON.stringify( processCss( parsed ) )},\n\t\t\t\tmap: null // TODO\n\t\t\t});\n\t\t` );\n\t}\n\n\tif ( templateProperties.components ) {\n\t\trenderCssStatements.push( deindent`\n\t\t\tvar seen = {};\n\n\t\t\tfunction addComponent ( component ) {\n\t\t\t\tvar result = component.renderCss();\n\t\t\t\tresult.components.forEach( x => {\n\t\t\t\t\tif ( seen[ x.filename ] ) return;\n\t\t\t\t\tseen[ x.filename ] = true;\n\t\t\t\t\tcomponents.push( x );\n\t\t\t\t});\n\t\t\t}\n\t\t` );\n\n\t\trenderCssStatements.push( templateProperties.components.properties.map( prop => `addComponent( template.components.${prop.key.name} );` ).join( '\\n' ) );\n\t}\n\n\trenderCssStatements.push( deindent`\n\t\treturn {\n\t\t\tcss: components.map( x => x.css ).join( '\\\\n' ),\n\t\t\tmap: null,\n\t\t\tcomponents\n\t\t};\n\t` );\n\n\ttopLevelStatements.push( deindent`\n\t\texports.filename = ${JSON.stringify( filename )};\n\n\t\texports.render = function ( data, options ) {\n\t\t\t${renderStatements.join( '\\n\\n' )}\n\t\t};\n\n\t\texports.renderCss = function () {\n\t\t\t${renderCssStatements.join( '\\n\\n' )}\n\t\t};\n\t` );\n\n\tconst rendered = topLevelStatements.join( '\\n\\n' );\n\n\tconst pattern = /\\[✂(\\d+)-(\\d+)$/;\n\n\tconst parts = rendered.split( '✂]' );\n\tconst finalChunk = parts.pop();\n\n\tconst compiled = new Bundle({ separator: '' });\n\n\tfunction addString ( str ) {\n\t\tcompiled.addSource({\n\t\t\tcontent: new MagicString( str )\n\t\t});\n\t}\n\n\tparts.forEach( str => {\n\t\tconst chunk = str.replace( pattern, '' );\n\t\tif ( chunk ) addString( chunk );\n\n\t\tconst match = pattern.exec( str );\n\n\t\tconst snippet = code.snip( +match[1], +match[2] );\n\n\t\tcompiled.addSource({\n\t\t\tfilename,\n\t\t\tcontent: snippet\n\t\t});\n\t});\n\n\taddString( finalChunk );\n\n\treturn {\n\t\tcode: compiled.toString()\n\t};\n}\n","import * as fs from 'fs';\nimport compile from './compile.js';\n\nrequire.extensions[ '.html' ] = function ( module, filename ) {\n\tconst { code } = compile( fs.readFileSync( filename, 'utf-8' ) );\n\n\ttry {\n\t\treturn module._compile( code, filename );\n\t} catch ( err ) {\n\t\tconsole.log( code );\n\t\tthrow err;\n\t}\n};\n"],"names":["transform","parse","validate","MagicString","flattenReference","processCss","Bundle","fs.readFileSync"],"mappings":";;;;;;;;;AAAA,SAAS,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE;CACzB,IAAI,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;CACtB,IAAI,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;;CAEtB,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;CACjC;;AAED,IAAI,OAAO,GAAG;CACb,IAAI,EAAE,YAAY,EAAE,OAAO,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE;CACvD,UAAU,EAAE,KAAK;CACjB,CAAC;;AAEF,IAAI,SAAS,GAAG,EAAE,CAAC;;AAEnB,IAAI,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;;AAEzC,SAAS,OAAO,GAAG,KAAK,GAAG;CAC1B,OAAO,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,gBAAgB,CAAC;CACnD;;AAED,SAAS,KAAK,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG;CAC1D,KAAK,CAAC,IAAI,GAAG,OAAO;;CAEpB,KAAK,KAAK,GAAG;EACZ,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC;EAC3B,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;EACjD,KAAK,OAAO,CAAC,UAAU,GAAG,OAAO;EACjC;;CAED,IAAI,IAAI,GAAG,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI;EACpC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,UAAU,GAAG,EAAE,EAAE,OAAO,OAAO,IAAI,EAAE,GAAG,EAAE,KAAK,QAAQ,CAAC,EAAE,EAAE;EACjH,CAAC;;CAEF,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG;EAC1C,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;EAClB,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC;;EAExB,KAAK,OAAO,EAAE,KAAK,EAAE,GAAG;GACvB,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG;IAC3C,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IAC9C;GACD;;OAEI,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,GAAG;GAC/B,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;GAC9C;EACD;;CAED,KAAK,KAAK,GAAG;EACZ,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;EACnC;CACD,AAED,AAAgB,AAChB;;ACtDA,MAAM,KAAK,GAAG,SAAS,CAAC;;AAExB,AAAe,SAAS,QAAQ,GAAG,OAAO,EAAE,GAAG,MAAM,GAAG;CACvD,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;CAChD,MAAM,OAAO,GAAG,IAAI,MAAM,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;;CAEtD,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;;CAEpE,IAAI,mBAAmB,GAAG,sBAAsB,EAAE,MAAM,EAAE,CAAC;;CAE3D,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG;EAC7C,MAAM,KAAK,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC;EACtF,MAAM,IAAI,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;;EAEpD,mBAAmB,GAAG,sBAAsB,EAAE,MAAM,EAAE,CAAC;EACvD;;CAED,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;CACrB;;AAED,SAAS,sBAAsB,GAAG,GAAG,GAAG;CACvC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;CACnB,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;CAC/D,OAAO,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;CAClC;;ACxBc,SAAS,WAAW,GAAG,IAAI,EAAE,MAAM,GAAG;CACpD,KAAK,IAAI,CAAC,IAAI,KAAK,kBAAkB,GAAG;EACvC,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;EAC1D;;CAED,KAAK,IAAI,CAAC,IAAI,KAAK,YAAY,GAAG;;;;EAIjC,KAAK,CAAC,MAAM,GAAG,OAAO,IAAI,CAAC;;;EAG3B,KAAK,MAAM,CAAC,IAAI,KAAK,kBAAkB,IAAI,MAAM,CAAC,IAAI,KAAK,kBAAkB,GAAG;GAC/E,OAAO,MAAM,CAAC,QAAQ,IAAI,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC;GACjD;;;EAGD,KAAK,MAAM,CAAC,IAAI,KAAK,UAAU,GAAG,OAAO,MAAM,CAAC,QAAQ,IAAI,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC;;;EAGlF,KAAK,MAAM,CAAC,IAAI,KAAK,kBAAkB,GAAG,OAAO,KAAK,CAAC;;;EAGvD,KAAK,MAAM,CAAC,IAAI,KAAK,iBAAiB,IAAI,IAAI,KAAK,MAAM,CAAC,KAAK,GAAG,OAAO;;EAEzE,OAAO,IAAI,CAAC;EACZ;CACD;;AC3Bc,SAAS,OAAO,GAAG,IAAI,GAAG;CACxC,MAAM,KAAK,GAAG,EAAE,CAAC;CACjB,QAAQ,IAAI,CAAC,IAAI,KAAK,kBAAkB,GAAG;EAC1C,KAAK,IAAI,CAAC,QAAQ,GAAG,OAAO,IAAI,CAAC;EACjC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;;EAEpC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;EACnB;;CAED,KAAK,IAAI,CAAC,IAAI,KAAK,YAAY,GAAG,OAAO,IAAI,CAAC;;CAE9C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;CACvB,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;;CAEtB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;CAC5C;;ACfc,SAAS,MAAM,GAAG,CAAC,GAAG;CACpC,IAAI,MAAM,GAAG,EAAE,CAAC;CAChB,QAAQ,CAAC,EAAE,GAAG,MAAM,IAAI,GAAG,CAAC;CAC5B,OAAO,MAAM,CAAC;CACd;;ACJD;AACA,MAAM,gBAAgB,GAAG,8BAA8B,CAAC;AACxD,MAAM,eAAe,GAAG,cAAc,CAAC;AACvC,MAAM,mBAAmB,GAAG,iGAAiG,CAAC;AAC9H,MAAM,cAAc,GAAG,aAAa,CAAC;;AAErC,SAAS,iBAAiB,GAAG,QAAQ,EAAE,MAAM,GAAG;CAC/C,MAAM,aAAa,GAAG,EAAE,CAAC;CACzB,IAAI,KAAK,CAAC;;CAEV,QAAQ,KAAK,GAAG,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG;EACtD,aAAa,CAAC,IAAI,CAAC;GAClB,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;GACb,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;GACd,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;GACnB,CAAC,CAAC;EACH;;;;CAID,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,EAAE,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;;CAEnD,MAAM,WAAW,GAAG,EAAE,CAAC;CACvB,IAAI,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC;;CAE7B,QAAQ,CAAC,EAAE,GAAG;EACb,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;;;EAG9B,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;EAC9B,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;;EAExD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;EAC/B,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;;EAE3C,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;EAChE;;CAED,OAAO,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;CAChC;;AAED,AAAe,SAAS,YAAY,GAAG,GAAG,EAAE,IAAI,GAAG;CAClD,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;;CAEhC,OAAO,GAAG;GACR,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE;GAC9B,OAAO,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM;;GAE5C,KAAK,cAAc,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,KAAK,CAAC;;GAE9C,MAAM,SAAS,GAAG,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;GACrE,MAAM,WAAW,GAAG,SAAS;KAC3B,GAAG,EAAE,QAAQ,IAAI,iBAAiB,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;KACtD,IAAI,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;;GAErB,OAAO,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC;GACxC,CAAC,CAAC;CACJ;;ACtDc,SAAS,OAAO,GAAG,MAAM,GAAG;CAC1C,OAAOA,YAAS,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;CAChG;;ACGD,MAAM,gBAAgB,GAAG,oGAAoG,CAAC;;AAE9H,AAAe,SAAS,OAAO,GAAG,MAAM,EAAE,QAAQ,GAAG;CACpD,MAAM,MAAM,GAAGC,2BAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;CACnCC,8BAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;CAE/B,MAAM,IAAI,GAAG,IAAIC,oBAAW,EAAE,MAAM,EAAE,CAAC;;CAEvC,MAAM,kBAAkB,GAAG,EAAE,CAAC;CAC9B,MAAM,UAAU,GAAG,EAAE,CAAC;CACtB,MAAM,OAAO,GAAG,EAAE,CAAC;;CAEnB,MAAM,OAAO,GAAG,EAAE,CAAC;;CAEnB,KAAK,MAAM,CAAC,EAAE,GAAG;EAChB,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE;GACxB,KAAK,CAAC,EAAE,IAAI,GAAG;IACd,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACxC,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;IACtC;GACD,CAAC,CAAC;;;EAGH,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG;GAC5D,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;GACvC,KAAK,IAAI,CAAC,IAAI,KAAK,mBAAmB,GAAG;IACxC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;IACnB,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;IACjB,QAAQ,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IACjD,QAAQ,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;;;IAGpC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;IACrB,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACpB;GACD;;EAED,MAAM,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,0BAA0B,EAAE,CAAC;;EAEtG,KAAK,aAAa,GAAG;GACpB,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;GAC9E,KAAK,aAAa,KAAK,SAAS,GAAG;;IAElC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAClF,MAAM;;IAEN,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC;;IAE1F,IAAI,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC;IAC5B,QAAQ,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;;IAE3C,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC;IAC3D,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,gBAAgB,CAAC,EAAE,CAAC;IACvE;;GAED,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,IAAI;IACrD,kBAAkB,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;IACjD,CAAC,CAAC;;GAEH,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,+BAA+B,EAAE,CAAC;GAC9E,MAAM;GACN,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,gBAAgB,EAAE,CAAC;GAC/D;;EAED,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;;EAElD,KAAK,kBAAkB,CAAC,OAAO,GAAG;GACjC,kBAAkB,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,IAAI;IACtD,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;IACtC,CAAC,CAAC;GACH;;EAED,KAAK,kBAAkB,CAAC,UAAU,GAAG;GACpC,kBAAkB,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,IAAI;IACzD,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;IACzC,CAAC,CAAC;GACH;EACD;;CAED,IAAI,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;CACtB,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,CAAC;;CAEzB,SAAS,aAAa,GAAG,UAAU,GAAG;EACrC,IAAI,EAAE,UAAU,EAAE;GACjB,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG;IACtB,KAAK,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG;KAClC,MAAM,EAAE,IAAI,EAAE,GAAGC,OAAgB,EAAE,IAAI,EAAE,CAAC;;KAE1C,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,gBAAgB,IAAI,IAAI,KAAK,MAAM,CAAC,MAAM,IAAI,OAAO,EAAE,IAAI,EAAE,GAAG;MAC9F,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;MACrD,OAAO;MACP;;KAED,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG;MACzB,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;MACzC;;KAED,IAAI,CAAC,IAAI,EAAE,CAAC;KACZ;IACD;GACD,CAAC,CAAC;;EAEH,OAAO;GACN,OAAO,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;GACpD,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE;GACtD,CAAC;EACF;;CAED,IAAI,YAAY,GAAG,CAAC,CAAC;;CAErB,MAAM,YAAY,GAAG;EACpB,SAAS,CAAC,EAAE,IAAI,GAAG;GAClB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,IAAI;IAC/C,IAAI,KAAK,CAAC;;IAEV,KAAK,SAAS,CAAC,KAAK,KAAK,IAAI,GAAG;KAC/B,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;KACf,MAAM,KAAK,SAAS,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,GAAG;KAC1C,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;KACb,MAAM,KAAK,SAAS,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,GAAG;KAC1C,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACjC,KAAK,KAAK,CAAC,IAAI,KAAK,MAAM,GAAG;MAC5B,KAAK,GAAG,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;MACtF,MAAM;MACN,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;MACtD,KAAK,GAAG,OAAO,CAAC;MAChB;KACD,MAAM;KACN,KAAK,GAAG,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;KAChE;;IAED,OAAO,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;GAEhB,IAAI,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;;GAE1B,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG;IAC3B,MAAM,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAChF;;GAED,OAAO,CAAC,uBAAuB,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;GAChE;;EAED,SAAS,CAAC,EAAE,IAAI,GAAG;GAClB,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;;GAErD,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;GAClB,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;GAC1B,KAAK,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;GAE1C,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;;GAErB,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC;;GAE5K,MAAM,CAAC,GAAG,EAAE,CAAC;GACb,KAAK,GAAG,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;;GAEpC,OAAO,KAAK,CAAC;GACb;;EAED,OAAO,CAAC,EAAE,IAAI,GAAG;GAChB,KAAK,IAAI,CAAC,IAAI,IAAI,UAAU,GAAG;IAC9B,OAAO,YAAY,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;IACtC;;GAED,IAAI,OAAO,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;;GAE9B,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,IAAI;IACrC,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;;IAE/B,KAAK,SAAS,CAAC,KAAK,KAAK,IAAI,GAAG;KAC/B,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,IAAI;MAC3C,KAAK,KAAK,CAAC,IAAI,KAAK,MAAM,GAAG;OAC5B,OAAO,KAAK,CAAC,IAAI,CAAC;OAClB;;MAED,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;MACtD,OAAO,IAAI,GAAG,OAAO,GAAG,GAAG,CAAC;MAC5B,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;KACpB;;IAED,OAAO,IAAI,GAAG,CAAC;IACf,CAAC,CAAC;;GAEH,KAAK,MAAM,CAAC,GAAG,IAAI,YAAY,KAAK,CAAC,GAAG;IACvC,OAAO,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACpC;;GAED,KAAK,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG;IACzC,OAAO,IAAI,GAAG,CAAC;IACf,MAAM,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,GAAG;IACxC,OAAO,IAAI,IAAI,CAAC;IAChB,MAAM;IACN,YAAY,IAAI,CAAC,CAAC;IAClB,OAAO,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/E,YAAY,IAAI,CAAC,CAAC;IAClB;;GAED,OAAO,OAAO,CAAC;GACf;;EAED,OAAO,CAAC,EAAE,IAAI,GAAG;GAChB,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;;GAErD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;GAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;;GAElF,OAAO,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,CAAC;GAC3E;;EAED,WAAW,CAAC,EAAE,IAAI,GAAG;GACpB,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;GACrD,OAAO,IAAI,GAAG,OAAO,GAAG,GAAG,CAAC;GAC5B;;EAED,IAAI,CAAC,EAAE,IAAI,GAAG;GACb,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;GAC3C;;EAED,QAAQ,CAAC,GAAG;GACX,OAAO,CAAC,mBAAmB,CAAC,CAAC;GAC7B;EACD,CAAC;;CAEF,SAAS,SAAS,GAAG,IAAI,GAAG;EAC3B,MAAM,WAAW,GAAG,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;;EAE9C,KAAK,CAAC,WAAW,GAAG;GACnB,MAAM,IAAI,KAAK,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;GACnD;;EAED,OAAO,WAAW,EAAE,IAAI,EAAE,CAAC;EAC3B;;CAED,SAAS,WAAW,GAAG,IAAI,GAAG;EAC7B,MAAM,GAAG,GAAG,SAAS,EAAE,IAAI,EAAE,CAAC;EAC9B,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,GAAG,OAAO,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;EAC5D,OAAO,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;EACvB;;CAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,IAAI;EAChD,OAAO,QAAQ,CAAC;eACH,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;EACnC,CAAC,CAAC;EACF,CAAC,CAAC;;CAEH,MAAM,kBAAkB,GAAG,EAAE,CAAC;;CAE9B,MAAM,WAAW,GAAG,OAAO;GACzB,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC,MAAM;GAC3B,MAAM,aAAa,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,wBAAwB,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;GAC/J,MAAM,eAAe,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,0BAA0B,EAAE,CAAC;GAClG,MAAM,YAAY,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;;GAEzH,MAAM,IAAI,GAAG,EAAE,aAAa,IAAI,eAAe,EAAE,GAAG,EAAE,aAAa,IAAI,eAAe,EAAE,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;;GAErH,MAAM,UAAU,GAAG;IAClB,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;IACzD,CAAC;;GAEF,YAAY,CAAC,OAAO,EAAE,SAAS,IAAI;IAClC,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACvF,CAAC,CAAC;;GAEH,KAAK,aAAa,GAAG;IACpB,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACjG;;GAED,OAAO,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;GAC/B,CAAC;GACD,MAAM,EAAE,OAAO,EAAE;GACjB,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEf,KAAK,MAAM,CAAC,EAAE,GAAG;EAChB,KAAK,OAAO,CAAC,MAAM,GAAG;GACrB,kBAAkB,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;GACvC;;EAED,kBAAkB,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;EACrF;;CAED,MAAM,gBAAgB,GAAG;EACxB,kBAAkB,CAAC,IAAI,GAAG,CAAC,oDAAoD,CAAC,GAAG,CAAC,kBAAkB,CAAC;EACvG,CAAC;;CAEF,KAAK,kBAAkB,CAAC,QAAQ,GAAG;EAClC,MAAM,UAAU,GAAG,EAAE,CAAC;EACtB,MAAM,YAAY,GAAG,IAAI,GAAG,EAAE,CAAC;;EAE/B,kBAAkB,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,IAAI;GACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;GAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;;GAEzB,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;GACrD,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;GAC9B,CAAC,CAAC;;EAEH,MAAM,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;;EAE1B,SAAS,KAAK,GAAG,GAAG,GAAG;GACtB,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,OAAO;;GAEvC,KAAK,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,OAAO;GACjC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;;GAEnB,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;GACrC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;;GAEtB,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC;SACpB,EAAE,GAAG,CAAC,qBAAqB,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;GACzF,CAAC,EAAE,CAAC;GACJ;;EAED,kBAAkB,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,IAAI,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;;EAEjF,gBAAgB,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;EACjD;;CAED,gBAAgB,CAAC,IAAI;EACpB,CAAC,kBAAkB,CAAC;EACpB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE;EACrB,CAAC,gBAAgB,CAAC;EAClB,CAAC;;CAEF,MAAM,mBAAmB,GAAG;EAC3B,CAAC,oBAAoB,CAAC;EACtB,CAAC;;CAEF,KAAK,MAAM,CAAC,GAAG,GAAG;EACjB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC;;;SAG5B,EAAE,IAAI,CAAC,SAAS,EAAEC,OAAU,EAAE,MAAM,EAAE,EAAE,CAAC;;;EAGhD,CAAC,EAAE,CAAC;EACJ;;CAED,KAAK,kBAAkB,CAAC,UAAU,GAAG;EACpC,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC;;;;;;;;;;;EAWnC,CAAC,EAAE,CAAC;;EAEJ,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,kCAAkC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;EACzJ;;CAED,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC;;;;;;CAMnC,CAAC,EAAE,CAAC;;CAEJ,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC;qBACd,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC;;;GAG/C,EAAE,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;;;;GAIlC,EAAE,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;;CAEvC,CAAC,EAAE,CAAC;;CAEJ,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;;CAEnD,MAAM,OAAO,GAAG,iBAAiB,CAAC;;CAElC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;CACrC,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;;CAE/B,MAAM,QAAQ,GAAG,IAAIC,kBAAM,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;;CAE/C,SAAS,SAAS,GAAG,GAAG,GAAG;EAC1B,QAAQ,CAAC,SAAS,CAAC;GAClB,OAAO,EAAE,IAAIH,oBAAW,EAAE,GAAG,EAAE;GAC/B,CAAC,CAAC;EACH;;CAED,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI;EACrB,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;EACzC,KAAK,KAAK,GAAG,SAAS,EAAE,KAAK,EAAE,CAAC;;EAEhC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;;EAElC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;;EAElD,QAAQ,CAAC,SAAS,CAAC;GAClB,QAAQ;GACR,OAAO,EAAE,OAAO;GAChB,CAAC,CAAC;EACH,CAAC,CAAC;;CAEH,SAAS,EAAE,UAAU,EAAE,CAAC;;CAExB,OAAO;EACN,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE;EACzB,CAAC;CACF;;AC9ZD,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,WAAW,MAAM,EAAE,QAAQ,GAAG;CAC7D,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,EAAEI,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;;CAEjE,IAAI;EACH,OAAO,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;EACzC,CAAC,QAAQ,GAAG,GAAG;EACf,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;EACpB,MAAM,GAAG,CAAC;EACV;CACD,CAAC"} \ No newline at end of file diff --git a/test/server-side-rendering/styles/_actual.css b/test/server-side-rendering/styles/_actual.css new file mode 100644 index 0000000000..c2598a22cd --- /dev/null +++ b/test/server-side-rendering/styles/_actual.css @@ -0,0 +1,4 @@ + + div[svelte-281576708], [svelte-281576708] div { + color: red; + } diff --git a/test/server-side-rendering/styles/_actual.html b/test/server-side-rendering/styles/_actual.html new file mode 100644 index 0000000000..9752d45d81 --- /dev/null +++ b/test/server-side-rendering/styles/_actual.html @@ -0,0 +1 @@ +
red
\ No newline at end of file diff --git a/test/server-side-rendering/styles/_expected.css b/test/server-side-rendering/styles/_expected.css new file mode 100644 index 0000000000..e26c4b8a4e --- /dev/null +++ b/test/server-side-rendering/styles/_expected.css @@ -0,0 +1,3 @@ +div[svelte-281576708], [svelte-281576708] div { + color: red; +} diff --git a/test/server-side-rendering/styles/_expected.html b/test/server-side-rendering/styles/_expected.html new file mode 100644 index 0000000000..afb992c94a --- /dev/null +++ b/test/server-side-rendering/styles/_expected.html @@ -0,0 +1 @@ +
red
diff --git a/test/server-side-rendering/styles/main.html b/test/server-side-rendering/styles/main.html new file mode 100644 index 0000000000..bfe5a23214 --- /dev/null +++ b/test/server-side-rendering/styles/main.html @@ -0,0 +1,7 @@ +
red
+ + diff --git a/test/test.js b/test/test.js index 16f5b6e089..f943ba4710 100644 --- a/test/test.js +++ b/test/test.js @@ -71,6 +71,15 @@ function tryToLoadJson ( file ) { } } +function tryToReadFile ( file ) { + try { + return fs.readFileSync( file, 'utf-8' ); + } catch ( err ) { + if ( err.code !== 'ENOENT' ) throw err; + return null; + } +} + describe( 'svelte', () => { before( () => { function cleanChildren ( node ) { @@ -519,14 +528,18 @@ describe( 'svelte', () => { ( solo ? it.only : it )( dir, () => { const component = require( `./server-side-rendering/${dir}/main.html` ); - const expected = fs.readFileSync( `test/server-side-rendering/${dir}/_expected.html`, 'utf-8' ); + const expectedHtml = tryToReadFile( `test/server-side-rendering/${dir}/_expected.html` ); + const expectedCss = tryToReadFile( `test/server-side-rendering/${dir}/_expected.css` ) || ''; const data = tryToLoadJson( `test/server-side-rendering/${dir}/data.json` ); - const actual = component.render( data ); + const html = component.render( data ); + const { css } = component.renderCss(); - fs.writeFileSync( `test/server-side-rendering/${dir}/_actual.html`, actual ); + fs.writeFileSync( `test/server-side-rendering/${dir}/_actual.html`, html ); + if ( css ) fs.writeFileSync( `test/server-side-rendering/${dir}/_actual.css`, css ); - assert.htmlEqual( actual, expected ); + assert.htmlEqual( html, expectedHtml ); + assert.equal( css.replace( /^\s+/gm, '' ), expectedCss.replace( /^\s+/gm, '' ) ); }); }); });