From a80dcda2e02725f829ed198310cf5facf6eb7335 Mon Sep 17 00:00:00 2001 From: Arpad Borsos Date: Sat, 3 Dec 2016 10:11:55 +0100 Subject: [PATCH 1/7] separate create from mount --- compiler/generate/index.js | 44 ++++++++++++++----- compiler/generate/visitors/EachBlock.js | 39 +++++++++------- compiler/generate/visitors/Element.js | 12 +++-- compiler/generate/visitors/IfBlock.js | 22 +++++++--- .../each-block-random-permute/_config.js | 33 ++++++++++++++ .../each-block-random-permute/main.html | 3 ++ 6 files changed, 118 insertions(+), 35 deletions(-) create mode 100644 test/compiler/each-block-random-permute/_config.js create mode 100644 test/compiler/each-block-random-permute/main.html diff --git a/compiler/generate/index.js b/compiler/generate/index.js index f73b4a90b3..3d67f89213 100644 --- a/compiler/generate/index.js +++ b/compiler/generate/index.js @@ -15,28 +15,34 @@ export default function generate ( parsed, source, options ) { const generator = { addElement ( name, renderStatement, needsIdentifier = false ) { - const needsTeardown = generator.current.localElementDepth === 0; - if ( needsIdentifier || needsTeardown ) { + const isToplevel = generator.current.localElementDepth === 0; + if ( needsIdentifier || isToplevel ) { generator.current.initStatements.push( deindent` var ${name} = ${renderStatement}; - ${generator.appendToTarget( name )}; ` ); + generator.createMountStatement( name ); } else { generator.current.initStatements.push( deindent` ${generator.current.target}.appendChild( ${renderStatement} ); ` ); } - if ( needsTeardown ) { + if ( isToplevel ) { generator.current.teardownStatements.push( deindent` if ( detach ) ${name}.parentNode.removeChild( ${name} ); ` ); } }, - appendToTarget ( name ) { - if ( generator.current.useAnchor && generator.current.target === 'target' ) { - return `anchor.parentNode.insertBefore( ${name}, anchor )`; + + createMountStatement ( name ) { + if ( generator.current.target === 'target' ) { + generator.current.mountStatements.push( deindent` + target.insertBefore( ${name}, anchor ); + ` ); + } else { + generator.current.initStatements.push( deindent` + ${generator.current.target}.appendChild( ${name} ); + ` ); } - return `${generator.current.target}.appendChild( ${name} )`; }, addRenderer ( fragment ) { @@ -45,10 +51,17 @@ export default function generate ( parsed, source, options ) { } renderers.push( deindent` - function ${fragment.name} ( ${fragment.params}, component, target${fragment.useAnchor ? ', anchor' : ''} ) { + function ${fragment.name} ( ${fragment.params}, component ) { + var target, anchor; ${fragment.initStatements.join( '\n\n' )} return { + mount: function ( _target, _anchor ) { + target = _target; + anchor = _anchor; + ${fragment.mountStatements.join( '\n\n' )} + }, + update: function ( changed, ${fragment.params} ) { ${fragment.updateStatements.join( '\n\n' )} }, @@ -236,6 +249,7 @@ export default function generate ( parsed, source, options ) { localElementDepth: 0, initStatements: [], + mountStatements: [], updateStatements: [], teardownStatements: [], @@ -364,13 +378,17 @@ export default function generate ( parsed, source, options ) { if ( generator.hasComplexBindings ) { initStatements.push( deindent` this.__bindings = []; - var mainFragment = renderMainFragment( state, this, options.target ); + var mainFragment = renderMainFragment( state, this ); + if ( options.target ) this.mount( options.target ); while ( this.__bindings.length ) this.__bindings.pop()(); ` ); setStatements.push( `while ( this.__bindings.length ) this.__bindings.pop()();` ); } else { - initStatements.push( `var mainFragment = renderMainFragment( state, this, options.target );` ); + initStatements.push( deindent` + var mainFragment = renderMainFragment( state, this ); + if ( options.target ) this.mount( options.target ); + ` ); } if ( generator.hasComponents ) { @@ -449,6 +467,10 @@ export default function generate ( parsed, source, options ) { ${setStatements.join( '\n\n' )} }; + this.mount = function mount ( target, anchor ) { + mainFragment.mount( target, anchor ); + } + this.observe = function ( key, callback, options ) { var group = ( options && options.defer ) ? observers.deferred : observers.immediate; diff --git a/compiler/generate/visitors/EachBlock.js b/compiler/generate/visitors/EachBlock.js index c20e9b8320..1327c1d120 100644 --- a/compiler/generate/visitors/EachBlock.js +++ b/compiler/generate/visitors/EachBlock.js @@ -6,10 +6,13 @@ export default { const i = generator.counters.each++; const name = `eachBlock_${i}`; const anchor = `${name}_anchor`; + const iterations = `${name}_iterations`; const renderer = `renderEachBlock_${i}`; const listName = `${name}_value`; + const isToplevel = generator.current.localElementDepth === 0; + generator.addSourcemapLocations( node.expression ); const { dependencies, snippet } = generator.contextualise( node.expression ); @@ -18,39 +21,44 @@ export default { generator.current.initStatements.push( deindent` var ${name}_value = ${snippet}; - var ${name}_fragment = document.createDocumentFragment(); - var ${name}_iterations = []; + var ${iterations} = []; for ( var i = 0; i < ${name}_value.length; i += 1 ) { - ${name}_iterations[i] = ${renderer}( ${generator.current.params}, ${listName}, ${listName}[i], i, component, ${name}_fragment ); + ${iterations}[i] = ${renderer}( ${generator.current.params}, ${listName}, ${listName}[i], i, component ); + ${!isToplevel ? `${iterations}[i].mount( ${anchor}.parentNode, ${anchor} );` : ''} } - - ${anchor}.parentNode.insertBefore( ${name}_fragment, ${anchor} ); ` ); + if ( isToplevel ) { + generator.current.mountStatements.push( deindent` + for ( var i = 0; i < ${iterations}.length; i += 1 ) { + ${iterations}[i].mount( ${anchor}.parentNode, ${anchor} ); + } + ` ); + } + generator.current.updateStatements.push( deindent` var ${name}_value = ${snippet}; for ( var i = 0; i < ${name}_value.length; i += 1 ) { - if ( !${name}_iterations[i] ) { - ${name}_iterations[i] = ${renderer}( ${generator.current.params}, ${listName}, ${listName}[i], i, component, ${name}_fragment ); + if ( !${iterations}[i] ) { + ${iterations}[i] = ${renderer}( ${generator.current.params}, ${listName}, ${listName}[i], i, component ); + ${iterations}[i].mount( ${anchor}.parentNode, ${anchor} ); } else { - ${name}_iterations[i].update( changed, ${generator.current.params}, ${listName}, ${listName}[i], i ); + ${iterations}[i].update( changed, ${generator.current.params}, ${listName}, ${listName}[i], i ); } } - for ( var i = ${name}_value.length; i < ${name}_iterations.length; i += 1 ) { - ${name}_iterations[i].teardown( true ); + for ( var i = ${name}_value.length; i < ${iterations}.length; i += 1 ) { + ${iterations}[i].teardown( true ); } - ${anchor}.parentNode.insertBefore( ${name}_fragment, ${anchor} ); - ${name}_iterations.length = ${listName}.length; + ${iterations}.length = ${listName}.length; ` ); - const needsTeardown = generator.current.localElementDepth === 0; generator.current.teardownStatements.push( deindent` - for ( var i = 0; i < ${name}_iterations.length; i += 1 ) { - ${name}_iterations[i].teardown( ${needsTeardown ? 'detach' : 'false'} ); + for ( var i = 0; i < ${iterations}.length; i += 1 ) { + ${iterations}[i].teardown( ${isToplevel ? 'detach' : 'false'} ); } ` ); @@ -88,6 +96,7 @@ export default { params, initStatements: [], + mountStatements: [], updateStatements: [ Object.keys( contexts ).map( contextName => { const listName = listNames[ contextName ]; const indexName = indexNames[ contextName ]; diff --git a/compiler/generate/visitors/Element.js b/compiler/generate/visitors/Element.js index 8f5bf5f861..67b4f6af5f 100644 --- a/compiler/generate/visitors/Element.js +++ b/compiler/generate/visitors/Element.js @@ -15,6 +15,7 @@ export default { allUsedContexts: new Set(), init: [], + mount: [], update: [], teardown: [] }; @@ -57,7 +58,7 @@ export default { ${statements.join( '\n\n' )} var ${name} = new template.components.${node.name}({ - target: ${generator.current.target}, + target: ${!shouldDetach ? generator.current.target: 'null'}, parent: component, data: ${name}_initialData }); @@ -65,11 +66,14 @@ export default { } else { local.init.unshift( deindent` var ${name} = new template.components.${node.name}({ - target: ${generator.current.target}, + target: ${!shouldDetach ? generator.current.target: 'null'}, parent: component }); ` ); } + if ( shouldDetach ) { + local.mount.unshift( `${name}.mount( target, anchor );` ); + } if ( local.dynamicAttributes.length ) { const updates = local.dynamicAttributes.map( attribute => { @@ -146,6 +150,7 @@ export default { generator.current.initStatements.push( local.init.join( '\n' ) ); if ( local.update.length ) generator.current.updateStatements.push( local.update.join( '\n' ) ); + if ( local.mount.length ) generator.current.mountStatements.push( local.mount.join( '\n' ) ); generator.current.teardownStatements.push( local.teardown.join( '\n' ) ); generator.push({ @@ -166,7 +171,6 @@ export default { if ( isComponent ) return; - generator.current.initStatements.push( - generator.appendToTarget( name ) ); + generator.createMountStatement( name ); } }; diff --git a/compiler/generate/visitors/IfBlock.js b/compiler/generate/visitors/IfBlock.js index 76ab5255e5..6a3d5d2467 100644 --- a/compiler/generate/visitors/IfBlock.js +++ b/compiler/generate/visitors/IfBlock.js @@ -11,18 +11,19 @@ function generateBlock ( generator, node, name ) { localElementDepth: 0, initStatements: [], + mountStatements: [], updateStatements: [], teardownStatements: [], counter: counter() }); node.children.forEach( generator.visit ); - //generator.visit( node.children ); generator.addRenderer( generator.current ); generator.pop(); // unset the children, to avoid them being visited again node.children = []; } + function getConditionsAndBlocks ( generator, node, _name, i = 0 ) { generator.addSourcemapLocations( node.expression ); const name = `${_name}_${i}`; @@ -54,12 +55,13 @@ export default { enter ( generator, node ) { const i = generator.counters.if++; - const { params, target } = generator.current; + const { params } = generator.current; const name = `ifBlock_${i}`; const anchor = `${name}_anchor`; const getBlock = `getBlock_${i}`; const currentBlock = `currentBlock_${i}`; + const isToplevel = generator.current.localElementDepth === 0; const conditionsAndBlocks = getConditionsAndBlocks( generator, node, `renderIfBlock_${i}` ); generator.addElement( anchor, `document.createComment( ${JSON.stringify( `#if ${generator.source.slice( node.expression.start, node.expression.end )}` )} )`, true ); @@ -72,9 +74,16 @@ export default { } var ${currentBlock} = ${getBlock}( ${params} ); - var ${name} = ${currentBlock} && ${currentBlock}( ${params}, component, ${target}, ${anchor} ); + var ${name} = ${currentBlock} && ${currentBlock}( ${params}, component ); ` ); + const mountStatement = `if ( ${name} ) ${name}.mount( ${anchor}.parentNode, ${anchor} );`; + if ( isToplevel ) { + generator.current.mountStatements.push( mountStatement ); + } else { + generator.current.initStatements.push( mountStatement ); + } + generator.current.updateStatements.push( deindent` var _${currentBlock} = ${currentBlock}; ${currentBlock} = ${getBlock}( ${params} ); @@ -82,10 +91,13 @@ export default { ${name}.update( changed, ${params} ); } else { if ( ${name} ) ${name}.teardown( true ); - ${name} = ${currentBlock} && ${currentBlock}( ${params}, component, ${target}, ${anchor} ); + ${name} = ${currentBlock} && ${currentBlock}( ${params}, component ); + if ( ${name} ) ${name}.mount( ${anchor}.parentNode, ${anchor} ); } ` ); - generator.current.teardownStatements.push( `if ( ${name} ) ${name}.teardown( detach );` ); + generator.current.teardownStatements.push( deindent` + if ( ${name} ) ${name}.teardown( ${isToplevel ? 'detach' : 'false'} ); + ` ); } }; diff --git a/test/compiler/each-block-random-permute/_config.js b/test/compiler/each-block-random-permute/_config.js new file mode 100644 index 0000000000..14c667091b --- /dev/null +++ b/test/compiler/each-block-random-permute/_config.js @@ -0,0 +1,33 @@ +const VALUES = Array.from( 'abcdefghijklmnopqrstuvwxyz' ); + +function permute () { + const values = VALUES.slice(); + const number = Math.floor(Math.random() * VALUES.length); + const permuted = []; + for (let i = 0; i < number; i++) { + permuted.push( ...values.splice( Math.floor( Math.random() * ( number - i ) ), 1 ) ); + } + + return { + data: permuted, + expected: permuted.length ? `(${permuted.join(')(')})` : '' + }; +} + +let step = permute(); + +export default { + data: { + values: step.data + }, + + html: step.expected, + + test ( assert, component, target ) { + for (let i = 0; i < 100; i++) { + step = permute(); + component.set({ values: step.data }); + assert.htmlEqual( target.innerHTML, step.expected ); + } + } +}; diff --git a/test/compiler/each-block-random-permute/main.html b/test/compiler/each-block-random-permute/main.html new file mode 100644 index 0000000000..8aef076d0e --- /dev/null +++ b/test/compiler/each-block-random-permute/main.html @@ -0,0 +1,3 @@ +{{#each values as value}} + ({{value}}) +{{/each}} From c1ba15875e6bab4d116804c18f4abd6806a8cdf8 Mon Sep 17 00:00:00 2001 From: Arpad Borsos Date: Sat, 3 Dec 2016 11:44:08 +0100 Subject: [PATCH 2/7] various refactorings & fixes * fix some code style issues * refactor around createMountStatement * fix non-toplevel if blocks and elements being detached --- compiler/generate/index.js | 20 +++++++++++++------- compiler/generate/visitors/EachBlock.js | 4 ++-- compiler/generate/visitors/Element.js | 9 ++++----- compiler/generate/visitors/IfBlock.js | 7 +++++-- 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/compiler/generate/index.js b/compiler/generate/index.js index 347d7062cf..fdf88c5f60 100644 --- a/compiler/generate/index.js +++ b/compiler/generate/index.js @@ -15,28 +15,34 @@ export default function generate ( parsed, source, options ) { const generator = { addElement ( name, renderStatement, needsIdentifier = false ) { - const needsTeardown = generator.current.localElementDepth === 0; - if ( needsIdentifier || needsTeardown ) { + const isToplevel = generator.current.localElementDepth === 0; + if ( needsIdentifier || isToplevel ) { generator.current.initStatements.push( deindent` var ${name} = ${renderStatement}; - ${generator.appendToTarget( name )}; ` ); + generator.createMountStatement( name ); } else { generator.current.initStatements.push( deindent` ${generator.current.target}.appendChild( ${renderStatement} ); ` ); } - if ( needsTeardown ) { + if ( isToplevel ) { generator.current.teardownStatements.push( deindent` if ( detach ) ${name}.parentNode.removeChild( ${name} ); ` ); } }, - appendToTarget ( name ) { + + createMountStatement ( name ) { if ( generator.current.useAnchor && generator.current.target === 'target' ) { - return `anchor.parentNode.insertBefore( ${name}, anchor )`; + generator.current.initStatements.push( deindent ` + anchor.parentNode.insertBefore( ${name}, anchor ); + ` ); + } else { + generator.current.initStatements.push( deindent ` + ${generator.current.target}.appendChild( ${name} ); + ` ); } - return `${generator.current.target}.appendChild( ${name} )`; }, addRenderer ( fragment ) { diff --git a/compiler/generate/visitors/EachBlock.js b/compiler/generate/visitors/EachBlock.js index c20e9b8320..53b025a6fa 100644 --- a/compiler/generate/visitors/EachBlock.js +++ b/compiler/generate/visitors/EachBlock.js @@ -47,10 +47,10 @@ export default { ${name}_iterations.length = ${listName}.length; ` ); - const needsTeardown = generator.current.localElementDepth === 0; + const isToplevel = generator.current.localElementDepth === 0; generator.current.teardownStatements.push( deindent` for ( var i = 0; i < ${name}_iterations.length; i += 1 ) { - ${name}_iterations[i].teardown( ${needsTeardown ? 'detach' : 'false'} ); + ${name}_iterations[i].teardown( ${isToplevel ? 'detach' : 'false'} ); } ` ); diff --git a/compiler/generate/visitors/Element.js b/compiler/generate/visitors/Element.js index 8f5bf5f861..dda3b31d4f 100644 --- a/compiler/generate/visitors/Element.js +++ b/compiler/generate/visitors/Element.js @@ -19,7 +19,7 @@ export default { teardown: [] }; - const shouldDetach = generator.current.localElementDepth === 0; + const isToplevel = generator.current.localElementDepth === 0; if ( isComponent ) { generator.hasComponents = true; @@ -87,7 +87,7 @@ export default { ` ); } - local.teardown.push( `${name}.teardown( ${shouldDetach} );` ); + local.teardown.push( `${name}.teardown( ${isToplevel ? 'detach' : 'false'} );` ); } else { @@ -132,7 +132,7 @@ export default { } local.init.unshift( render ); - if ( shouldDetach ) { + if ( isToplevel ) { local.teardown.push( `if ( detach ) ${name}.parentNode.removeChild( ${name} );` ); } } @@ -166,7 +166,6 @@ export default { if ( isComponent ) return; - generator.current.initStatements.push( - generator.appendToTarget( name ) ); + generator.createMountStatement( name ); } }; diff --git a/compiler/generate/visitors/IfBlock.js b/compiler/generate/visitors/IfBlock.js index 76ab5255e5..05ff5887b9 100644 --- a/compiler/generate/visitors/IfBlock.js +++ b/compiler/generate/visitors/IfBlock.js @@ -17,12 +17,12 @@ function generateBlock ( generator, node, name ) { counter: counter() }); node.children.forEach( generator.visit ); - //generator.visit( node.children ); generator.addRenderer( generator.current ); generator.pop(); // unset the children, to avoid them being visited again node.children = []; } + function getConditionsAndBlocks ( generator, node, _name, i = 0 ) { generator.addSourcemapLocations( node.expression ); const name = `${_name}_${i}`; @@ -86,6 +86,9 @@ export default { } ` ); - generator.current.teardownStatements.push( `if ( ${name} ) ${name}.teardown( detach );` ); + const isToplevel = generator.current.localElementDepth === 0; + generator.current.teardownStatements.push( deindent` + if ( ${name} ) ${name}.teardown( ${isToplevel ? 'detach' : 'false'} ); + ` ); } }; From 3f300c9b715cecb0f7e09652ce42f8000aa53c61 Mon Sep 17 00:00:00 2001 From: Arpad Borsos Date: Sat, 3 Dec 2016 11:57:09 +0100 Subject: [PATCH 3/7] add a createAnchor helper --- compiler/generate/index.js | 7 +++++++ compiler/generate/visitors/EachBlock.js | 3 +-- compiler/generate/visitors/IfBlock.js | 3 +-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/compiler/generate/index.js b/compiler/generate/index.js index fdf88c5f60..13bb40c4df 100644 --- a/compiler/generate/index.js +++ b/compiler/generate/index.js @@ -45,6 +45,13 @@ export default function generate ( parsed, source, options ) { } }, + createAnchor ( _name, description = '' ) { + const name = `${_name}_anchor`; + const statement = `document.createComment( ${JSON.stringify( description )} )`; + generator.addElement( name, statement, true ); + return name; + }, + addRenderer ( fragment ) { if ( fragment.autofocus ) { fragment.initStatements.push( `${fragment.autofocus}.focus();` ); diff --git a/compiler/generate/visitors/EachBlock.js b/compiler/generate/visitors/EachBlock.js index 53b025a6fa..53f9a07d7e 100644 --- a/compiler/generate/visitors/EachBlock.js +++ b/compiler/generate/visitors/EachBlock.js @@ -5,7 +5,6 @@ export default { enter ( generator, node ) { const i = generator.counters.each++; const name = `eachBlock_${i}`; - const anchor = `${name}_anchor`; const renderer = `renderEachBlock_${i}`; const listName = `${name}_value`; @@ -14,7 +13,7 @@ export default { const { dependencies, snippet } = generator.contextualise( node.expression ); - generator.addElement( anchor, `document.createComment( ${JSON.stringify( `#each ${generator.source.slice( node.expression.start, node.expression.end )}` )} )`, true ); + const anchor = generator.createAnchor( name, `#each ${generator.source.slice( node.expression.start, node.expression.end )}` ); generator.current.initStatements.push( deindent` var ${name}_value = ${snippet}; diff --git a/compiler/generate/visitors/IfBlock.js b/compiler/generate/visitors/IfBlock.js index 05ff5887b9..2c8fbd30ca 100644 --- a/compiler/generate/visitors/IfBlock.js +++ b/compiler/generate/visitors/IfBlock.js @@ -56,13 +56,12 @@ export default { const { params, target } = generator.current; const name = `ifBlock_${i}`; - const anchor = `${name}_anchor`; const getBlock = `getBlock_${i}`; const currentBlock = `currentBlock_${i}`; const conditionsAndBlocks = getConditionsAndBlocks( generator, node, `renderIfBlock_${i}` ); - generator.addElement( anchor, `document.createComment( ${JSON.stringify( `#if ${generator.source.slice( node.expression.start, node.expression.end )}` )} )`, true ); + const anchor = generator.createAnchor( name, `#if ${generator.source.slice( node.expression.start, node.expression.end )}` ); generator.current.initStatements.push( deindent` function ${getBlock} ( ${params} ) { From 19c376f032261c790d0618622dc4e35f14a9114a Mon Sep 17 00:00:00 2001 From: Arpad Borsos Date: Sat, 3 Dec 2016 13:15:16 +0100 Subject: [PATCH 4/7] fix onrender hook for nested widgets --- compiler/generate/index.js | 2 ++ compiler/generate/visitors/Element.js | 4 ++-- test/compiler/if-block-widget/Widget.html | 1 + test/compiler/if-block-widget/_config.js | 13 +++++++++++++ test/compiler/if-block-widget/main.html | 14 ++++++++++++++ .../ParentWidget.html | 11 +++++++++++ .../onrender-fires-when-ready-nested/Widget.html | 9 +++++++++ .../onrender-fires-when-ready-nested/_config.js | 3 +++ .../onrender-fires-when-ready-nested/main.html | 16 ++++++++++++++++ 9 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 test/compiler/if-block-widget/Widget.html create mode 100644 test/compiler/if-block-widget/_config.js create mode 100644 test/compiler/if-block-widget/main.html create mode 100644 test/compiler/onrender-fires-when-ready-nested/ParentWidget.html create mode 100644 test/compiler/onrender-fires-when-ready-nested/Widget.html create mode 100644 test/compiler/onrender-fires-when-ready-nested/_config.js create mode 100644 test/compiler/onrender-fires-when-ready-nested/main.html diff --git a/compiler/generate/index.js b/compiler/generate/index.js index 347d7062cf..fa9dc4f578 100644 --- a/compiler/generate/index.js +++ b/compiler/generate/index.js @@ -489,6 +489,8 @@ export default function generate ( parsed, source, options ) { state = {}; }; + this._parent = options.parent; + ${initStatements.join( '\n\n' )} } ` ); diff --git a/compiler/generate/visitors/Element.js b/compiler/generate/visitors/Element.js index 8f5bf5f861..2b4e46acc0 100644 --- a/compiler/generate/visitors/Element.js +++ b/compiler/generate/visitors/Element.js @@ -58,7 +58,7 @@ export default { var ${name} = new template.components.${node.name}({ target: ${generator.current.target}, - parent: component, + parent: component._parent || component, data: ${name}_initialData }); ` ); @@ -66,7 +66,7 @@ export default { local.init.unshift( deindent` var ${name} = new template.components.${node.name}({ target: ${generator.current.target}, - parent: component + parent: component._parent || component }); ` ); } diff --git a/test/compiler/if-block-widget/Widget.html b/test/compiler/if-block-widget/Widget.html new file mode 100644 index 0000000000..bbd986fcb1 --- /dev/null +++ b/test/compiler/if-block-widget/Widget.html @@ -0,0 +1 @@ +

Widget

diff --git a/test/compiler/if-block-widget/_config.js b/test/compiler/if-block-widget/_config.js new file mode 100644 index 0000000000..6c42237db4 --- /dev/null +++ b/test/compiler/if-block-widget/_config.js @@ -0,0 +1,13 @@ +export default { + skip: true, + data: { + visible: true + }, + html: 'before\n

Widget

\nafter', + test ( assert, component, target ) { + component.set({ visible: false }); + assert.equal( target.innerHTML, 'before\n\nafter' ); + component.set({ visible: true }); + assert.equal( target.innerHTML, 'before\n

Widget

\nafter' ); + } +}; diff --git a/test/compiler/if-block-widget/main.html b/test/compiler/if-block-widget/main.html new file mode 100644 index 0000000000..5e2a3859b4 --- /dev/null +++ b/test/compiler/if-block-widget/main.html @@ -0,0 +1,14 @@ +before +{{#if visible}} + +{{/if}} +after + diff --git a/test/compiler/onrender-fires-when-ready-nested/ParentWidget.html b/test/compiler/onrender-fires-when-ready-nested/ParentWidget.html new file mode 100644 index 0000000000..1ab8608eff --- /dev/null +++ b/test/compiler/onrender-fires-when-ready-nested/ParentWidget.html @@ -0,0 +1,11 @@ +{{#if foo}}{{/if}} + + diff --git a/test/compiler/onrender-fires-when-ready-nested/Widget.html b/test/compiler/onrender-fires-when-ready-nested/Widget.html new file mode 100644 index 0000000000..10de81c6d4 --- /dev/null +++ b/test/compiler/onrender-fires-when-ready-nested/Widget.html @@ -0,0 +1,9 @@ +

{{inDocument}}

+ + diff --git a/test/compiler/onrender-fires-when-ready-nested/_config.js b/test/compiler/onrender-fires-when-ready-nested/_config.js new file mode 100644 index 0000000000..06327ebc4d --- /dev/null +++ b/test/compiler/onrender-fires-when-ready-nested/_config.js @@ -0,0 +1,3 @@ +export default { + html: `

true

\n

true

` +}; diff --git a/test/compiler/onrender-fires-when-ready-nested/main.html b/test/compiler/onrender-fires-when-ready-nested/main.html new file mode 100644 index 0000000000..6ba25d0a68 --- /dev/null +++ b/test/compiler/onrender-fires-when-ready-nested/main.html @@ -0,0 +1,16 @@ +
+ + +
+ + From bf12bb54a7a7b268a7dd0ab2b01592798fffb40d Mon Sep 17 00:00:00 2001 From: mrkishi Date: Sat, 3 Dec 2016 22:09:38 -0200 Subject: [PATCH 5/7] Fix typo in generator's contextualise; solves #46 --- compiler/generate/index.js | 2 +- test/compiler/component-data-dynamic/Widget.html | 1 + test/compiler/component-data-dynamic/_config.js | 10 ++++++---- test/compiler/component-data-dynamic/main.html | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/compiler/generate/index.js b/compiler/generate/index.js index 347d7062cf..cf2e17bbf7 100644 --- a/compiler/generate/index.js +++ b/compiler/generate/index.js @@ -101,7 +101,7 @@ export default function generate ( parsed, source, options ) { const context = indexes[ name ]; if ( !~usedContexts.indexOf( context ) ) usedContexts.push( context ); } else { - dependencies.push( node.name ); + dependencies.push( name ); generator.code.prependRight( node.start, `root.` ); if ( !~usedContexts.indexOf( 'root' ) ) usedContexts.push( 'root' ); } diff --git a/test/compiler/component-data-dynamic/Widget.html b/test/compiler/component-data-dynamic/Widget.html index 5886087d16..43184b9ad8 100644 --- a/test/compiler/component-data-dynamic/Widget.html +++ b/test/compiler/component-data-dynamic/Widget.html @@ -1,3 +1,4 @@

foo: {{foo}}

baz: {{baz}} ({{typeof baz}})

qux: {{qux}}

+

quux: {{quux}}

diff --git a/test/compiler/component-data-dynamic/_config.js b/test/compiler/component-data-dynamic/_config.js index 514faf667e..48c8fff2bf 100644 --- a/test/compiler/component-data-dynamic/_config.js +++ b/test/compiler/component-data-dynamic/_config.js @@ -2,16 +2,18 @@ export default { data: { bar: 'lol', x: 2, - compound: 'piece of' + compound: 'piece of', + go: { deeper: 'core' } }, - html: `

foo: lol

\n

baz: 42 (number)

\n

qux: this is a piece of string

`, + html: `

foo: lol

\n

baz: 42 (number)

\n

qux: this is a piece of string

\n

quux: core

`, test ( assert, component, target ) { component.set({ bar: 'wut', x: 3, - compound: 'rather boring' + compound: 'rather boring', + go: { deeper: 'heart' } }); - assert.equal( target.innerHTML, `

foo: wut

\n

baz: 43 (number)

\n

qux: this is a rather boring string

` ); + assert.equal( target.innerHTML, `

foo: wut

\n

baz: 43 (number)

\n

qux: this is a rather boring string

\n

quux: heart

` ); } }; diff --git a/test/compiler/component-data-dynamic/main.html b/test/compiler/component-data-dynamic/main.html index 118ba7b76e..12d5f3208b 100644 --- a/test/compiler/component-data-dynamic/main.html +++ b/test/compiler/component-data-dynamic/main.html @@ -1,5 +1,5 @@
- +