From 119ad1432ad85b532d767f0281efb721bcc1f51c Mon Sep 17 00:00:00 2001 From: mrkishi Date: Sun, 4 Dec 2016 13:56:42 -0200 Subject: [PATCH 01/12] Improve teardown code by unifying detach branches --- compiler/generate/index.js | 9 +++++++-- compiler/generate/visitors/EachBlock.js | 1 + compiler/generate/visitors/Element.js | 4 +++- compiler/generate/visitors/IfBlock.js | 1 + 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/compiler/generate/index.js b/compiler/generate/index.js index ead297fa2e..02477cb38d 100644 --- a/compiler/generate/index.js +++ b/compiler/generate/index.js @@ -27,8 +27,8 @@ export default function generate ( parsed, source, options ) { ` ); } if ( isToplevel ) { - generator.current.teardownStatements.push( deindent` - if ( detach ) ${name}.parentNode.removeChild( ${name} ); + generator.current.detachStatements.push( deindent` + ${name}.parentNode.removeChild( ${name} ); ` ); } }, @@ -72,6 +72,10 @@ export default function generate ( parsed, source, options ) { teardown: function ( detach ) { ${fragment.teardownStatements.join( '\n\n' )} + + if ( detach ) { + ${fragment.detachStatements.join( '\n\n' )} + } } }; } @@ -255,6 +259,7 @@ export default function generate ( parsed, source, options ) { initStatements: [], mountStatements: [], updateStatements: [], + detachStatements: [], teardownStatements: [], contexts: {}, diff --git a/compiler/generate/visitors/EachBlock.js b/compiler/generate/visitors/EachBlock.js index bfe4cf0cff..089ab59876 100644 --- a/compiler/generate/visitors/EachBlock.js +++ b/compiler/generate/visitors/EachBlock.js @@ -102,6 +102,7 @@ export default { return `var ${contextName} = ${listName}[${indexName}];`; }).join( '\n' ) ], + detachStatements: [], teardownStatements: [], counter: counter(), diff --git a/compiler/generate/visitors/Element.js b/compiler/generate/visitors/Element.js index 7b050cdb1a..c928a395a1 100644 --- a/compiler/generate/visitors/Element.js +++ b/compiler/generate/visitors/Element.js @@ -17,6 +17,7 @@ export default { init: [], mount: [], update: [], + detach: [], teardown: [] }; @@ -138,7 +139,7 @@ export default { local.init.unshift( render ); if ( isToplevel ) { - local.teardown.push( `if ( detach ) ${name}.parentNode.removeChild( ${name} );` ); + local.detach.push( `${name}.parentNode.removeChild( ${name} );` ); } } @@ -152,6 +153,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.detachStatements.push( local.detach.join( '\n' ) ); generator.current.teardownStatements.push( local.teardown.join( '\n' ) ); generator.push({ diff --git a/compiler/generate/visitors/IfBlock.js b/compiler/generate/visitors/IfBlock.js index 98fb4d05a0..254b7f0969 100644 --- a/compiler/generate/visitors/IfBlock.js +++ b/compiler/generate/visitors/IfBlock.js @@ -13,6 +13,7 @@ function generateBlock ( generator, node, name ) { initStatements: [], mountStatements: [], updateStatements: [], + detachStatements: [], teardownStatements: [], counter: counter() From 4bcbdfb5aef33d1bfbe6b15f445d75e02c6d99a7 Mon Sep 17 00:00:00 2001 From: Fabrice Weinberg Date: Sun, 4 Dec 2016 17:13:54 +0100 Subject: [PATCH 02/12] Parse {{yield}} as YieldTag --- compiler/parse/state/mustache.js | 13 +++++++++++++ compiler/parse/state/yield.js | 11 +++++++++++ test/parser/yield/input.html | 1 + test/parser/yield/output.json | 14 ++++++++++++++ 4 files changed, 39 insertions(+) create mode 100644 compiler/parse/state/yield.js create mode 100644 test/parser/yield/input.html create mode 100644 test/parser/yield/output.json diff --git a/compiler/parse/state/mustache.js b/compiler/parse/state/mustache.js index e412b1043f..b27e694608 100644 --- a/compiler/parse/state/mustache.js +++ b/compiler/parse/state/mustache.js @@ -177,6 +177,19 @@ export default function mustache ( parser ) { parser.stack.push( block ); } + // {{yield}} + else if ( parser.eat( 'yield' ) ) { + + parser.allowWhitespace(); + parser.eat( '}}', true ); + + parser.current().children.push({ + start, + end: parser.index, + type: 'YieldTag' + }); + } + else { const expression = readExpression( parser ); diff --git a/compiler/parse/state/yield.js b/compiler/parse/state/yield.js new file mode 100644 index 0000000000..a85c877271 --- /dev/null +++ b/compiler/parse/state/yield.js @@ -0,0 +1,11 @@ +export default function _yield ( parser ) { + const start = parser.index; + + parser.current().children.push({ + start, + end: parser.index, + type: 'YieldTag' + }); + + return null; +} diff --git a/test/parser/yield/input.html b/test/parser/yield/input.html new file mode 100644 index 0000000000..889d9eeadc --- /dev/null +++ b/test/parser/yield/input.html @@ -0,0 +1 @@ +{{yield}} diff --git a/test/parser/yield/output.json b/test/parser/yield/output.json new file mode 100644 index 0000000000..227da6561f --- /dev/null +++ b/test/parser/yield/output.json @@ -0,0 +1,14 @@ +{ + "html": { + "start": 0, + "end": 9, + "type": "Fragment", + "children": [ + { + "start": 0, + "end": 9, + "type": "YieldTag" + } + ] + } +} From 49629c5403b10086ce3020615dc8c16948da0b0c Mon Sep 17 00:00:00 2001 From: Fabrice Weinberg Date: Sun, 4 Dec 2016 17:56:05 +0100 Subject: [PATCH 03/12] remove superficial yield.js --- compiler/parse/state/yield.js | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 compiler/parse/state/yield.js diff --git a/compiler/parse/state/yield.js b/compiler/parse/state/yield.js deleted file mode 100644 index a85c877271..0000000000 --- a/compiler/parse/state/yield.js +++ /dev/null @@ -1,11 +0,0 @@ -export default function _yield ( parser ) { - const start = parser.index; - - parser.current().children.push({ - start, - end: parser.index, - type: 'YieldTag' - }); - - return null; -} From 65cdead99145232591d079a4305dee127d8eec44 Mon Sep 17 00:00:00 2001 From: Nico Rehwaldt Date: Sun, 4 Dec 2016 21:18:13 +0100 Subject: [PATCH 04/12] Verify computed property dependencies Improves the validator to fail if someone forgets to declare dependent properties for computed state: ``` export default { computed: { bar: () => { return new Date().getTime(); } } }; ``` --- compiler/validate/js/propValidators/computed.js | 9 ++++++++- test/validator/computed-values/errors.json | 8 ++++++++ test/validator/computed-values/input.html | 7 +++++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 test/validator/computed-values/errors.json create mode 100644 test/validator/computed-values/input.html diff --git a/compiler/validate/js/propValidators/computed.js b/compiler/validate/js/propValidators/computed.js index 102ce73333..00b10af00d 100644 --- a/compiler/validate/js/propValidators/computed.js +++ b/compiler/validate/js/propValidators/computed.js @@ -21,7 +21,14 @@ export default function computed ( validator, prop ) { return; } - computation.value.params.forEach( param => { + const params = computation.value.params; + + if ( params.length === 0 ) { + validator.error( `A computed value must depend on at least one property`, computation.value.start ); + return; + } + + params.forEach( param => { const valid = param.type === 'Identifier' || param.type === 'AssignmentPattern' && param.left.type === 'Identifier'; if ( !valid ) { diff --git a/test/validator/computed-values/errors.json b/test/validator/computed-values/errors.json new file mode 100644 index 0000000000..3f4994e790 --- /dev/null +++ b/test/validator/computed-values/errors.json @@ -0,0 +1,8 @@ +[{ + "message": "A computed value must depend on at least one property", + "pos": 49, + "loc": { + "line": 4, + "column": 8 + } +}] \ No newline at end of file diff --git a/test/validator/computed-values/input.html b/test/validator/computed-values/input.html new file mode 100644 index 0000000000..92cb29d732 --- /dev/null +++ b/test/validator/computed-values/input.html @@ -0,0 +1,7 @@ + From 6131f69fc3de9200ddea66f6ac7af233514c24ca Mon Sep 17 00:00:00 2001 From: Nico Rehwaldt Date: Sun, 4 Dec 2016 21:28:27 +0100 Subject: [PATCH 05/12] Correct README to use onwarn Seems like it is public API: https://github.com/sveltejs/svelte/blob/master/compiler/index.js#L8. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 16490fecf3..f374b13348 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ const { code, map } = svelte.compile( source, { console.error( err.message ); }, - onwarning: warning => { + onwarn: warning => { console.warn( warning.message ); } }); From e2afbaa5c4ab930c63b2e3d4923078600eb9ddb1 Mon Sep 17 00:00:00 2001 From: Nicolas Charpentier Date: Sun, 4 Dec 2016 18:17:00 -0500 Subject: [PATCH 06/12] Add charpeni/svelte-example into README tools --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 16490fecf3..667f4d8abb 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ This is the Svelte compiler, which is primarily intended for authors of tooling * [sveltify](https://github.com/tehshrike/sveltify) - Browserify transform * [gulp-svelte](https://github.com/shinnn/gulp-svelte) - gulp plugin * [metalsmith-svelte](https://github.com/shinnn/metalsmith-svelte) - Metalsmith plugin +* [charpeni/svelte-example](https://github.com/charpeni/svelte-example) - Some Svelte examples with configured Rollup, Babel, ESLint, directives, Two-Way binding, and nested components * More to come! From 6c473a3466d724bdd4d4a315b79bae52f72aa72b Mon Sep 17 00:00:00 2001 From: Fabrice Weinberg Date: Mon, 5 Dec 2016 00:56:45 +0100 Subject: [PATCH 07/12] Initial implementation of {{yield}}-generator --- compiler/generate/index.js | 1 + compiler/generate/visitors/Element.js | 67 ++++++++++++++----- compiler/generate/visitors/YieldTag.js | 9 +++ compiler/generate/visitors/index.js | 4 +- test/compiler/component-yield-if/Widget.html | 15 +++++ test/compiler/component-yield-if/_config.js | 13 ++++ test/compiler/component-yield-if/main.html | 14 ++++ .../component-yield-parent/Widget.html | 1 + .../component-yield-parent/_config.js | 9 +++ .../compiler/component-yield-parent/main.html | 14 ++++ test/compiler/component-yield/_config.js | 3 + test/compiler/component-yield/main.html | 15 +++++ 12 files changed, 146 insertions(+), 19 deletions(-) create mode 100644 compiler/generate/visitors/YieldTag.js create mode 100644 test/compiler/component-yield-if/Widget.html create mode 100644 test/compiler/component-yield-if/_config.js create mode 100644 test/compiler/component-yield-if/main.html create mode 100644 test/compiler/component-yield-parent/Widget.html create mode 100644 test/compiler/component-yield-parent/_config.js create mode 100644 test/compiler/component-yield-parent/main.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 ead297fa2e..1c25c3e639 100644 --- a/compiler/generate/index.js +++ b/compiler/generate/index.js @@ -516,6 +516,7 @@ export default function generate ( parsed, source, options ) { }; this.root = options.root; + this.yield = options.yield; ${initStatements.join( '\n\n' )} } diff --git a/compiler/generate/visitors/Element.js b/compiler/generate/visitors/Element.js index 7b050cdb1a..6728f4cd42 100644 --- a/compiler/generate/visitors/Element.js +++ b/compiler/generate/visitors/Element.js @@ -1,9 +1,11 @@ import deindent from '../utils/deindent.js'; import addComponentAttributes from './attributes/addComponentAttributes.js'; import addElementAttributes from './attributes/addElementAttributes.js'; +import counter from '../utils/counter.js'; export default { enter ( generator, node ) { + const hasChildren = node.children.length > 0 const isComponent = node.name in generator.components; const name = generator.current.counter( isComponent ? `${node.name[0].toLowerCase()}${node.name.slice( 1 )}` : node.name ); @@ -27,13 +29,49 @@ export default { addComponentAttributes( generator, node, local ); + const componentInitProperties = [ + `target: ${!isToplevel ? generator.current.target: 'null'}`, + 'root: component.root || component' + ]; + // Component has children + if ( hasChildren ) { + const yieldName = `render${name}YieldFragment`; + + // {{YIELD STUFF}} + generator.push({ + useAnchor: true, + name: generator.current.counter(yieldName), + target: 'target', + localElementDepth: 0, + + initStatements: [], + mountStatements: [], + updateStatements: [], + teardownStatements: [], + + counter: counter() + }); + + node.children.forEach( generator.visit ); + generator.addRenderer( generator.current ); + generator.pop(); + + // Don't render children twice + node.children = []; + + generator.current.initStatements.push(`var ${name}_yieldFragment = ${yieldName}( root, component );`); + generator.current.updateStatements.push(`${name}_yieldFragment.update ( changed, root );`) + + componentInitProperties.push(`yield: ${name}_yieldFragment`); + } + + const statements = []; + if ( local.staticAttributes.length || local.dynamicAttributes.length || local.bindings.length ) { const initialProps = local.staticAttributes .concat( local.dynamicAttributes ) .map( attribute => `${attribute.name}: ${attribute.value}` ); - const statements = []; - if ( initialProps.length ) { statements.push( deindent` var ${name}_initialData = { @@ -53,24 +91,17 @@ export default { statements.push( bindings.join( '\n' ) ); } + componentInitProperties.push(`data: ${name}_initialData`); + } - local.init.unshift( deindent` - ${statements.join( '\n\n' )} + local.init.unshift( deindent` + ${statements.join( '\n\n' )} + + var ${name} = new template.components.${node.name}({ + ${componentInitProperties.join(',\n')} + }); + ` ); - var ${name} = new template.components.${node.name}({ - target: ${!isToplevel ? generator.current.target: 'null'}, - root: component.root || component, - data: ${name}_initialData - }); - ` ); - } else { - local.init.unshift( deindent` - var ${name} = new template.components.${node.name}({ - target: ${!isToplevel ? generator.current.target: 'null'}, - root: component.root || component - }); - ` ); - } if ( isToplevel ) { local.mount.unshift( `${name}.mount( target, anchor );` ); diff --git a/compiler/generate/visitors/YieldTag.js b/compiler/generate/visitors/YieldTag.js new file mode 100644 index 0000000000..a9fa5604cf --- /dev/null +++ b/compiler/generate/visitors/YieldTag.js @@ -0,0 +1,9 @@ +import deindent from '../utils/deindent.js'; + +export default { + enter ( generator, node ) { + const anchor = generator.createAnchor( 'yield', 'yield' ); + generator.current.mountStatements.push(`component.yield && component.yield.mount( ${generator.current.target}, ${anchor} );`); + generator.current.teardownStatements.push(`component.yield && component.yield.teardown( detach );`); + } +}; diff --git a/compiler/generate/visitors/index.js b/compiler/generate/visitors/index.js index 064669762f..70ba9e3298 100644 --- a/compiler/generate/visitors/index.js +++ b/compiler/generate/visitors/index.js @@ -4,6 +4,7 @@ import Element from './Element.js'; import IfBlock from './IfBlock.js'; import MustacheTag from './MustacheTag.js'; import Text from './Text.js'; +import YieldTag from './YieldTag.js'; export default { Comment, @@ -11,5 +12,6 @@ export default { Element, IfBlock, MustacheTag, - Text + Text, + YieldTag }; diff --git a/test/compiler/component-yield-if/Widget.html b/test/compiler/component-yield-if/Widget.html new file mode 100644 index 0000000000..7dbf91afb5 --- /dev/null +++ b/test/compiler/component-yield-if/Widget.html @@ -0,0 +1,15 @@ +

+ {{#if show}} + {{yield}} + {{/if}} +

+ diff --git a/test/compiler/component-yield-if/_config.js b/test/compiler/component-yield-if/_config.js new file mode 100644 index 0000000000..fad768230d --- /dev/null +++ b/test/compiler/component-yield-if/_config.js @@ -0,0 +1,13 @@ +export default { + html: '

', + test ( assert, component, target ) { + const widget = component.refs.widget; + assert.equal( widget.get( 'show' ), false ); + widget.set({show: true}); + assert.equal( target.innerHTML, '

Hello

' ); + component.set({data: 'World'}); + assert.equal( target.innerHTML, '

World

' ); + widget.set({show: false}); + assert.equal( target.innerHTML, '

' ); + } +} diff --git a/test/compiler/component-yield-if/main.html b/test/compiler/component-yield-if/main.html new file mode 100644 index 0000000000..61f0909984 --- /dev/null +++ b/test/compiler/component-yield-if/main.html @@ -0,0 +1,14 @@ +
+ {{data}} +
+ diff --git a/test/compiler/component-yield-parent/Widget.html b/test/compiler/component-yield-parent/Widget.html new file mode 100644 index 0000000000..e147954fa0 --- /dev/null +++ b/test/compiler/component-yield-parent/Widget.html @@ -0,0 +1 @@ +

{{yield}}

diff --git a/test/compiler/component-yield-parent/_config.js b/test/compiler/component-yield-parent/_config.js new file mode 100644 index 0000000000..28b8e175de --- /dev/null +++ b/test/compiler/component-yield-parent/_config.js @@ -0,0 +1,9 @@ +export default { + html: '

Hello

', + test ( assert, component, target ) { + assert.equal( component.get( 'data' ), 'Hello' ); + component.set({data: 'World'}) + assert.equal( component.get( 'data' ), 'World' ); + assert.equal( target.innerHTML, '

World

' ); + } +} diff --git a/test/compiler/component-yield-parent/main.html b/test/compiler/component-yield-parent/main.html new file mode 100644 index 0000000000..8a043a6ca7 --- /dev/null +++ b/test/compiler/component-yield-parent/main.html @@ -0,0 +1,14 @@ +
+ {{data}} +
+ diff --git a/test/compiler/component-yield/_config.js b/test/compiler/component-yield/_config.js new file mode 100644 index 0000000000..fcf00b5072 --- /dev/null +++ b/test/compiler/component-yield/_config.js @@ -0,0 +1,3 @@ +export default { + html: '

Hello

' +} diff --git a/test/compiler/component-yield/main.html b/test/compiler/component-yield/main.html new file mode 100644 index 0000000000..7d5cbf7180 --- /dev/null +++ b/test/compiler/component-yield/main.html @@ -0,0 +1,15 @@ +

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

+ From cc7c92a6f69d59bd2f681687103e9ceb1abef8d5 Mon Sep 17 00:00:00 2001 From: Fabrice Weinberg Date: Mon, 5 Dec 2016 00:59:28 +0100 Subject: [PATCH 08/12] Fix linting issues --- compiler/generate/visitors/Element.js | 4 ++-- compiler/generate/visitors/YieldTag.js | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/compiler/generate/visitors/Element.js b/compiler/generate/visitors/Element.js index 6728f4cd42..ba58935f13 100644 --- a/compiler/generate/visitors/Element.js +++ b/compiler/generate/visitors/Element.js @@ -5,7 +5,7 @@ import counter from '../utils/counter.js'; export default { enter ( generator, node ) { - const hasChildren = node.children.length > 0 + const hasChildren = node.children.length > 0; const isComponent = node.name in generator.components; const name = generator.current.counter( isComponent ? `${node.name[0].toLowerCase()}${node.name.slice( 1 )}` : node.name ); @@ -60,7 +60,7 @@ export default { node.children = []; generator.current.initStatements.push(`var ${name}_yieldFragment = ${yieldName}( root, component );`); - generator.current.updateStatements.push(`${name}_yieldFragment.update ( changed, root );`) + generator.current.updateStatements.push(`${name}_yieldFragment.update ( changed, root );`); componentInitProperties.push(`yield: ${name}_yieldFragment`); } diff --git a/compiler/generate/visitors/YieldTag.js b/compiler/generate/visitors/YieldTag.js index a9fa5604cf..5ec8727ad1 100644 --- a/compiler/generate/visitors/YieldTag.js +++ b/compiler/generate/visitors/YieldTag.js @@ -1,7 +1,5 @@ -import deindent from '../utils/deindent.js'; - export default { - enter ( generator, node ) { + enter ( generator ) { const anchor = generator.createAnchor( 'yield', 'yield' ); generator.current.mountStatements.push(`component.yield && component.yield.mount( ${generator.current.target}, ${anchor} );`); generator.current.teardownStatements.push(`component.yield && component.yield.teardown( detach );`); From efde7625651dc07d9bfec7e39c3361d7dbae7c14 Mon Sep 17 00:00:00 2001 From: Rich-Harris Date: Sun, 4 Dec 2016 20:27:42 -0500 Subject: [PATCH 09/12] move examples into own section --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8416c357d1..985fe17d50 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,6 @@ This is the Svelte compiler, which is primarily intended for authors of tooling * [sveltify](https://github.com/tehshrike/sveltify) - Browserify transform * [gulp-svelte](https://github.com/shinnn/gulp-svelte) - gulp plugin * [metalsmith-svelte](https://github.com/shinnn/metalsmith-svelte) - Metalsmith plugin -* [charpeni/svelte-example](https://github.com/charpeni/svelte-example) - Some Svelte examples with configured Rollup, Babel, ESLint, directives, Two-Way binding, and nested components * More to come! @@ -51,6 +50,12 @@ const { code, map } = svelte.compile( source, { ``` +## Example/starter repos + +* [charpeni/svelte-example](https://github.com/charpeni/svelte-example) - Some Svelte examples with configured Rollup, Babel, ESLint, directives, Two-Way binding, and nested components +* [EmilTholin/svelte-test](https://github.com/EmilTholin/svelte-test) + + ## License [MIT](LICENSE) From 4210c238d43629234708228d9f3c104777eaa5f9 Mon Sep 17 00:00:00 2001 From: Rich-Harris Date: Sun, 4 Dec 2016 21:07:45 -0500 Subject: [PATCH 10/12] separate detach statements, per #110 --- compiler/generate/visitors/Element.js | 1 + 1 file changed, 1 insertion(+) diff --git a/compiler/generate/visitors/Element.js b/compiler/generate/visitors/Element.js index 2aee0eac26..99717420e8 100644 --- a/compiler/generate/visitors/Element.js +++ b/compiler/generate/visitors/Element.js @@ -48,6 +48,7 @@ export default { initStatements: [], mountStatements: [], updateStatements: [], + detachStatements: [], teardownStatements: [], counter: counter() From 306a93117668fed893e2e6d88b025364ffa9e81f Mon Sep 17 00:00:00 2001 From: Rich-Harris Date: Sun, 4 Dec 2016 21:09:06 -0500 Subject: [PATCH 11/12] test update while yield fragment is torn down, and tweak code for consistency --- test/compiler/component-yield-if/Widget.html | 22 ++++++++++---------- test/compiler/component-yield-if/_config.js | 19 +++++++++++++---- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/test/compiler/component-yield-if/Widget.html b/test/compiler/component-yield-if/Widget.html index 7dbf91afb5..a2c8d49daa 100644 --- a/test/compiler/component-yield-if/Widget.html +++ b/test/compiler/component-yield-if/Widget.html @@ -1,15 +1,15 @@

- {{#if show}} - {{yield}} - {{/if}} + {{#if show}} + {{yield}} + {{/if}}

- diff --git a/test/compiler/component-yield-if/_config.js b/test/compiler/component-yield-if/_config.js index fad768230d..a428e4522d 100644 --- a/test/compiler/component-yield-if/_config.js +++ b/test/compiler/component-yield-if/_config.js @@ -1,13 +1,24 @@ export default { html: '

', + test ( assert, component, target ) { const widget = component.refs.widget; + assert.equal( widget.get( 'show' ), false ); + widget.set({show: true}); - assert.equal( target.innerHTML, '

Hello

' ); + assert.htmlEqual( target.innerHTML, '

Hello

' ); + component.set({data: 'World'}); - assert.equal( target.innerHTML, '

World

' ); + assert.htmlEqual( target.innerHTML, '

World

' ); + widget.set({show: false}); - assert.equal( target.innerHTML, '

' ); + assert.htmlEqual( target.innerHTML, '

' ); + + component.set({data: 'Goodbye'}); + assert.htmlEqual( target.innerHTML, '

' ); + + widget.set({show: true}); + assert.htmlEqual( target.innerHTML, '

Goodbye

' ); } -} +}; From d94209ba31f4627512ea1033389ece5a5e607dcb Mon Sep 17 00:00:00 2001 From: Rich-Harris Date: Sun, 4 Dec 2016 21:10:14 -0500 Subject: [PATCH 12/12] show code for all compiled components if config.show, not just main.html --- test/test.js | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/test/test.js b/test/test.js index 1738c5e5ad..297406c72f 100644 --- a/test/test.js +++ b/test/test.js @@ -22,8 +22,12 @@ const svelte = process.env.COVERAGE ? const cache = {}; +let showCompiledCode = false; + require.extensions[ '.html' ] = function ( module, filename ) { const code = cache[ filename ] || ( cache[ filename ] = svelte.compile( fs.readFileSync( filename, 'utf-8' ) ).code ); + if ( showCompiledCode ) console.log( addLineNumbers( code ) ); // eslint-disable-line no-console + return module._compile( code, filename ); }; @@ -49,6 +53,15 @@ function env () { }); } +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' ); +} + describe( 'svelte', () => { before( () => { function cleanChildren ( node ) { @@ -225,6 +238,8 @@ describe( 'svelte', () => { ( config.skip ? it.skip : config.solo ? it.only : it )( dir, () => { let compiled; + showCompiledCode = config.show; + try { const source = fs.readFileSync( `test/compiler/${dir}/main.html`, 'utf-8' ); compiled = svelte.compile( source ); @@ -238,12 +253,6 @@ describe( 'svelte', () => { } const { code } = compiled; - const withLineNumbers = 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' ); // check that no ES2015+ syntax slipped in try { @@ -251,7 +260,7 @@ describe( 'svelte', () => { const es5 = spaces( startIndex ) + code.slice( startIndex ).replace( /export default .+/, '' ); acorn.parse( es5, { ecmaVersion: 5 }); } catch ( err ) { - console.log( withLineNumbers ); // eslint-disable-line no-console + if ( !config.show ) console.log( addLineNumbers( code ) ); // eslint-disable-line no-console throw err; } @@ -262,14 +271,10 @@ describe( 'svelte', () => { try { SvelteComponent = require( `./compiler/${dir}/main.html` ).default; } catch ( err ) { - console.log( withLineNumbers ); // eslint-disable-line no-console + if ( !config.show ) console.log( addLineNumbers( code ) ); // eslint-disable-line no-console throw err; } - if ( config.show ) { - console.log( withLineNumbers ); // eslint-disable-line no-console - } - return env() .then( window => { const target = window.document.querySelector( 'main' ); @@ -291,7 +296,7 @@ describe( 'svelte', () => { } }) .catch( err => { - if ( !config.show ) console.log( withLineNumbers ); // eslint-disable-line no-console + if ( !config.show ) console.log( addLineNumbers( code ) ); // eslint-disable-line no-console throw err; }); });