diff --git a/src/generators/server-side-rendering/visitors/YieldTag.js b/src/generators/server-side-rendering/visitors/YieldTag.js index 732f96301b..a9b35f777e 100644 --- a/src/generators/server-side-rendering/visitors/YieldTag.js +++ b/src/generators/server-side-rendering/visitors/YieldTag.js @@ -1,5 +1,5 @@ export default { enter ( generator ) { - generator.append( `\${options.yield()}` ); + generator.append( `\${options && options.yield ? options.yield() : ''}` ); } }; diff --git a/test/generate.js b/test/generate.js index 384bd95b84..17a8aba7e3 100644 --- a/test/generate.js +++ b/test/generate.js @@ -4,7 +4,7 @@ import * as path from 'path'; import * as fs from 'fs'; import * as acorn from 'acorn'; -import { svelte, env, setupHtmlEqual } from './helpers.js'; +import { addLineNumbers, loadConfig, svelte, env, setupHtmlEqual } from './helpers.js'; let showCompiledCode = false; let compileOptions = null; @@ -18,36 +18,13 @@ require.extensions[ '.html' ] = function ( module, filename ) { return module._compile( code, filename ); }; -function addLineNumbers ( code ) { - return code.split( '\n' ).map( ( line, i ) => { - i = String( i + 1 ); - while ( i.length < 3 ) i = ` ${i}`; - - return `${i}: ${line.replace( /^\t+/, match => match.split( '\t' ).join( ' ' ) )}`; - }).join( '\n' ); -} - -function loadConfig ( dir ) { - try { - const resolved = require.resolve( `./generator/${dir}/_config.js` ); - delete require.cache[ resolved ]; - return require( resolved ).default; - } catch ( err ) { - if ( err.code === 'E_NOT_FOUND' ) { - return {}; - } - - throw err; - } -} - describe( 'generate', () => { before( setupHtmlEqual ); function runTest ( dir, shared ) { if ( dir[0] === '.' ) return; - const config = loadConfig( dir ); + const config = loadConfig( `./generator/${dir}/_config.js` ); if ( config.solo && process.env.CI ) { throw new Error( 'Forgot to remove `solo: true` from test' ); diff --git a/test/generator/component-binding-nested/_config.js b/test/generator/component-binding-nested/_config.js index 77a138d9e8..fd1250e7a5 100644 --- a/test/generator/component-binding-nested/_config.js +++ b/test/generator/component-binding-nested/_config.js @@ -1,4 +1,6 @@ export default { + 'skip-ssr': true, // TODO delete this line, once binding works + data: { x: 'initial' }, diff --git a/test/generator/component-binding/_config.js b/test/generator/component-binding/_config.js index b7f45f6304..f2ed4d67e2 100644 --- a/test/generator/component-binding/_config.js +++ b/test/generator/component-binding/_config.js @@ -1,4 +1,6 @@ export default { + 'skip-ssr': true, // TODO delete this line, once binding works + html: `

count: 0

diff --git a/test/generator/component-yield/_config.js b/test/generator/component-yield/_config.js index fcf00b5072..174d01f1a5 100644 --- a/test/generator/component-yield/_config.js +++ b/test/generator/component-yield/_config.js @@ -1,3 +1,3 @@ export default { - html: '

Hello

' -} + html: '

Hello

' +}; diff --git a/test/generator/component-yield/main.html b/test/generator/component-yield/main.html index 7d5cbf7180..5432dcf8f4 100644 --- a/test/generator/component-yield/main.html +++ b/test/generator/component-yield/main.html @@ -1,15 +1,16 @@

- Hello - {{#if test}} - {{yield}} - {{/if}} + Hello + {{#if test}} + {{yield}} + {{/if}}

+ diff --git a/test/generator/onrender-chain/_config.js b/test/generator/onrender-chain/_config.js index 348f66cd6f..cb3bab34a3 100644 --- a/test/generator/onrender-chain/_config.js +++ b/test/generator/onrender-chain/_config.js @@ -1,4 +1,6 @@ export default { + 'skip-ssr': true, + html: ` 321 `, diff --git a/test/generator/onrender-fires-when-ready-nested/_config.js b/test/generator/onrender-fires-when-ready-nested/_config.js index 06327ebc4d..cbc0b87604 100644 --- a/test/generator/onrender-fires-when-ready-nested/_config.js +++ b/test/generator/onrender-fires-when-ready-nested/_config.js @@ -1,3 +1,5 @@ export default { + 'skip-ssr': true, // uses onrender + html: `

true

\n

true

` }; diff --git a/test/generator/onrender-fires-when-ready/_config.js b/test/generator/onrender-fires-when-ready/_config.js index 14db20be9e..6ed7e85e9c 100644 --- a/test/generator/onrender-fires-when-ready/_config.js +++ b/test/generator/onrender-fires-when-ready/_config.js @@ -1,4 +1,6 @@ export default { + 'skip-ssr': true, // uses onrender + html: `

true

`, test ( assert, component, target ) { diff --git a/test/generator/raw-mustaches/_config.js b/test/generator/raw-mustaches/_config.js index 850a169e02..8b7767d6d1 100644 --- a/test/generator/raw-mustaches/_config.js +++ b/test/generator/raw-mustaches/_config.js @@ -1,8 +1,12 @@ const ns = ''; + export default { + 'skip-ssr': true, + data: { raw: 'raw html!!!\\o/' }, + html: `before${ns}raw html!!!\\o/${ns}after`, test ( assert, component, target ) { diff --git a/test/generator/set-in-observe/_config.js b/test/generator/set-in-observe/_config.js index 81c02623cd..65d993fdb9 100644 --- a/test/generator/set-in-observe/_config.js +++ b/test/generator/set-in-observe/_config.js @@ -1,4 +1,6 @@ export default { + 'skip-ssr': true, // uses onrender + html: `

1

2

diff --git a/test/generator/set-in-onrender/_config.js b/test/generator/set-in-onrender/_config.js index 1eb52e9522..6cd361c076 100644 --- a/test/generator/set-in-onrender/_config.js +++ b/test/generator/set-in-onrender/_config.js @@ -1,3 +1,5 @@ export default { + 'skip-ssr': true, // uses onrender + html: '

2

' }; diff --git a/test/generator/text-node-top-level/_config.js b/test/generator/single-text-node/_config.js similarity index 100% rename from test/generator/text-node-top-level/_config.js rename to test/generator/single-text-node/_config.js diff --git a/test/generator/text-node-top-level/main.html b/test/generator/single-text-node/main.html similarity index 100% rename from test/generator/text-node-top-level/main.html rename to test/generator/single-text-node/main.html diff --git a/test/generator/svg-xmlns/_config.js b/test/generator/svg-xmlns/_config.js index a3ab702eaf..58a57c434f 100644 --- a/test/generator/svg-xmlns/_config.js +++ b/test/generator/svg-xmlns/_config.js @@ -1,4 +1,6 @@ export default { + 'skip-ssr': true, + data: { x: 0, y: 0, diff --git a/test/helpers.js b/test/helpers.js index d55923d93f..cd50730811 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -114,3 +114,26 @@ export function setupHtmlEqual () { }; }); } + +export function loadConfig ( file ) { + try { + const resolved = require.resolve( file ); + delete require.cache[ resolved ]; + return require( resolved ).default; + } catch ( err ) { + if ( err.code === 'E_NOT_FOUND' ) { + return {}; + } + + throw err; + } +} + +export function addLineNumbers ( code ) { + return code.split( '\n' ).map( ( line, i ) => { + i = String( i + 1 ); + while ( i.length < 3 ) i = ` ${i}`; + + return `${i}: ${line.replace( /^\t+/, match => match.split( '\t' ).join( ' ' ) )}`; + }).join( '\n' ); +} diff --git a/test/server-side-rendering/raw-mustaches/_actual.html b/test/server-side-rendering/raw-mustaches/_actual.html new file mode 100644 index 0000000000..c44897a0c2 --- /dev/null +++ b/test/server-side-rendering/raw-mustaches/_actual.html @@ -0,0 +1 @@ +beforeraw html!!!\o/after \ No newline at end of file diff --git a/test/server-side-rendering/raw-mustaches/_expected.html b/test/server-side-rendering/raw-mustaches/_expected.html new file mode 100644 index 0000000000..d4c7678446 --- /dev/null +++ b/test/server-side-rendering/raw-mustaches/_expected.html @@ -0,0 +1 @@ +beforeraw html!!!\o/after diff --git a/test/server-side-rendering/raw-mustaches/data.json b/test/server-side-rendering/raw-mustaches/data.json new file mode 100644 index 0000000000..450f2a60dc --- /dev/null +++ b/test/server-side-rendering/raw-mustaches/data.json @@ -0,0 +1,3 @@ +{ + "raw": "raw html!!!\\o/" +} diff --git a/test/server-side-rendering/raw-mustaches/main.html b/test/server-side-rendering/raw-mustaches/main.html new file mode 100644 index 0000000000..1a733843df --- /dev/null +++ b/test/server-side-rendering/raw-mustaches/main.html @@ -0,0 +1 @@ +before{{{raw}}}after diff --git a/test/ssr.js b/test/ssr.js index ebac203de3..fa2873c810 100644 --- a/test/ssr.js +++ b/test/ssr.js @@ -1,7 +1,7 @@ import assert from 'assert'; import * as fs from 'fs'; -import { exists, setupHtmlEqual, tryToLoadJson } from './helpers.js'; +import { addLineNumbers, exists, loadConfig, setupHtmlEqual, svelte, tryToLoadJson } from './helpers.js'; function tryToReadFile ( file ) { try { @@ -47,4 +47,47 @@ describe( 'ssr', () => { assert.equal( css.replace( /^\s+/gm, '' ), expectedCss.replace( /^\s+/gm, '' ) ); }); }); + + // duplicate client-side tests, as far as possible + fs.readdirSync( 'test/generator' ).forEach( dir => { + if ( dir[0] === '.' ) return; + + const config = loadConfig( `./generator/${dir}/_config.js` ); + + if ( config.solo && process.env.CI ) { + throw new Error( 'Forgot to remove `solo: true` from test' ); + } + + if ( config['skip-ssr'] ) return; + + ( config.skip ? it.skip : config.solo ? it.only : it )( dir, () => { + let compiled; + + try { + const source = fs.readFileSync( `test/generator/${dir}/main.html`, 'utf-8' ); + compiled = svelte.compile( source, { generate: 'ssr' }); + } catch ( err ) { + if ( config.compileError ) { + config.compileError( err ); + return; + } else { + throw err; + } + } + + const component = require( `./generator/${dir}/main.html` ); + let html; + + try { + html = component.render( config.data ); + + if ( config.html ) { + assert.htmlEqual( html, config.html ); + } + } catch ( err ) { + console.log( addLineNumbers( compiled.code ) ); // eslint-disable-line no-console + throw err; + } + }); + }); });