From 0179ee154c049a35af6db1a630fb107d81ea5619 Mon Sep 17 00:00:00 2001 From: Fabrice Weinberg Date: Thu, 1 Dec 2016 19:14:00 +0100 Subject: [PATCH 1/2] Add initial support for {{yield}} --- compiler/generate/index.js | 4 ++++ compiler/generate/visitors/MustacheTag.js | 16 +++++++++++----- test/compiler/component-yield/Widget.html | 1 + test/compiler/component-yield/_config.js | 8 ++++++++ test/compiler/component-yield/main.html | 16 ++++++++++++++++ 5 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 test/compiler/component-yield/Widget.html create mode 100644 test/compiler/component-yield/_config.js create mode 100644 test/compiler/component-yield/main.html diff --git a/compiler/generate/index.js b/compiler/generate/index.js index f73b4a90b30c..ae9d97995210 100644 --- a/compiler/generate/index.js +++ b/compiler/generate/index.js @@ -489,6 +489,10 @@ export default function generate ( parsed, source, options ) { state = {}; }; + this.appendChild = function 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 a7078e1e2815..a0b94c908e61 100644 --- a/compiler/generate/visitors/MustacheTag.js +++ b/compiler/generate/visitors/MustacheTag.js @@ -3,14 +3,20 @@ import deindent from '../utils/deindent.js'; export default { enter ( generator, node ) { const name = generator.current.counter( 'text' ); + const { snippet } = generator.contextualise( node.expression ); generator.addSourcemapLocations( node.expression ); - const { snippet } = generator.contextualise( node.expression ); - generator.addElement( name, `document.createTextNode( ${snippet} )`, true ); + if (node.expression.name === 'yield') { + generator.current.initStatements.push( deindent` + component.yield = ${generator.current.target}; + ` ); + } else { + generator.addElement( name, `document.createTextNode( ${snippet} )`, true ); - generator.current.updateStatements.push( deindent` - ${name}.data = ${snippet}; - ` ); + generator.current.updateStatements.push( deindent` + ${name}.data = ${snippet}; + ` ); + } } }; diff --git a/test/compiler/component-yield/Widget.html b/test/compiler/component-yield/Widget.html new file mode 100644 index 000000000000..2528571ca1cd --- /dev/null +++ b/test/compiler/component-yield/Widget.html @@ -0,0 +1 @@ + diff --git a/test/compiler/component-yield/_config.js b/test/compiler/component-yield/_config.js new file mode 100644 index 000000000000..0b2f9bebff5f --- /dev/null +++ b/test/compiler/component-yield/_config.js @@ -0,0 +1,8 @@ +export default { + html: '
', + test ( assert, component, target ) { + component.set({ a: 'World' }); + assert.equal( component.get( 'a' ), 'World' ); + assert.equal( target.innerHTML, '
' ); + } +}; diff --git a/test/compiler/component-yield/main.html b/test/compiler/component-yield/main.html new file mode 100644 index 000000000000..a6b006660a6e --- /dev/null +++ b/test/compiler/component-yield/main.html @@ -0,0 +1,16 @@ +
+ Hello {{a}} +
+ + From 57ae613b6ac44ab77b4a15cf843b60331f437382 Mon Sep 17 00:00:00 2001 From: Fabrice Weinberg Date: Thu, 1 Dec 2016 19:41:18 +0100 Subject: [PATCH 2/2] 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 ae9d97995210..68d7f36b2dfa 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 a0b94c908e61..e3dcca73d397 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 000000000000..e4d34ffdb6d9 --- /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 000000000000..012a14c3efe2 --- /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 9d132849e3c8..0097938b16d6 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;