From 57ae613b6ac44ab77b4a15cf843b60331f437382 Mon Sep 17 00:00:00 2001 From: Fabrice Weinberg Date: Thu, 1 Dec 2016 19:41:18 +0100 Subject: [PATCH] Ensure that only one {{yield}} can be used --- compiler/generate/index.js | 2 +- compiler/generate/visitors/MustacheTag.js | 11 ++++++++--- test/compiler/component-yield-one/_config.js | 5 +++++ test/compiler/component-yield-one/main.html | 2 ++ test/test.js | 2 +- 5 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 test/compiler/component-yield-one/_config.js create mode 100644 test/compiler/component-yield-one/main.html diff --git a/compiler/generate/index.js b/compiler/generate/index.js index ae9d979952..68d7f36b2d 100644 --- a/compiler/generate/index.js +++ b/compiler/generate/index.js @@ -490,7 +490,7 @@ export default function generate ( parsed, source, options ) { }; this.appendChild = function appendChild ( child ) { - this.yield.appendChild(child) + this.yield.appendChild(child); } ${initStatements.join( '\n\n' )} diff --git a/compiler/generate/visitors/MustacheTag.js b/compiler/generate/visitors/MustacheTag.js index a0b94c908e..e3dcca73d3 100644 --- a/compiler/generate/visitors/MustacheTag.js +++ b/compiler/generate/visitors/MustacheTag.js @@ -8,9 +8,14 @@ export default { generator.addSourcemapLocations( node.expression ); if (node.expression.name === 'yield') { - generator.current.initStatements.push( deindent` - component.yield = ${generator.current.target}; - ` ); + if (generator.hasYield === undefined) { + generator.hasYield = true; + generator.current.initStatements.push( deindent` + component.yield = ${generator.current.target}; + ` ); + } else { + throw new Error( `Only one {{yield}} per component.` ); + } } else { generator.addElement( name, `document.createTextNode( ${snippet} )`, true ); diff --git a/test/compiler/component-yield-one/_config.js b/test/compiler/component-yield-one/_config.js new file mode 100644 index 0000000000..e4d34ffdb6 --- /dev/null +++ b/test/compiler/component-yield-one/_config.js @@ -0,0 +1,5 @@ +export default { + compileError: function ( assert, err ) { + assert.equal('Error: Only one {{yield}} per component.', err) + } +}; diff --git a/test/compiler/component-yield-one/main.html b/test/compiler/component-yield-one/main.html new file mode 100644 index 0000000000..012a14c3ef --- /dev/null +++ b/test/compiler/component-yield-one/main.html @@ -0,0 +1,2 @@ +

{{yield}}

+

{{yield}}

diff --git a/test/test.js b/test/test.js index 9d132849e3..0097938b16 100644 --- a/test/test.js +++ b/test/test.js @@ -228,7 +228,7 @@ describe( 'svelte', () => { compiled = svelte.compile( source ); } catch ( err ) { if ( config.compileError ) { - config.compileError( err ); + config.compileError( assert, err ); return; } else { throw err;