diff --git a/package.json b/package.json index a28c37b74d2..b2537120400 100644 --- a/package.json +++ b/package.json @@ -89,14 +89,14 @@ "@babel/plugin-transform-shorthand-properties": "^7.2.0", "@babel/plugin-transform-spread": "^7.2.2", "@babel/plugin-transform-template-literals": "^7.2.0", - "@glimmer/compiler": "^0.37.0", + "@glimmer/compiler": "^0.37.1", "@glimmer/env": "^0.1.7", - "@glimmer/interfaces": "^0.37.0", - "@glimmer/node": "^0.37.0", - "@glimmer/opcode-compiler": "^0.37.0", - "@glimmer/program": "^0.37.0", - "@glimmer/reference": "^0.37.0", - "@glimmer/runtime": "^0.37.0", + "@glimmer/interfaces": "^0.37.1", + "@glimmer/node": "^0.37.1", + "@glimmer/opcode-compiler": "^0.37.1", + "@glimmer/program": "^0.37.1", + "@glimmer/reference": "^0.37.1", + "@glimmer/runtime": "^0.37.1", "@types/qunit": "^2.5.3", "@types/rsvp": "^4.0.2", "auto-dist-tag": "^1.0.0", diff --git a/packages/@ember/-internals/glimmer/tests/integration/components/angle-bracket-invocation-test.js b/packages/@ember/-internals/glimmer/tests/integration/components/angle-bracket-invocation-test.js index eeb243aa60c..59ed820f073 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/components/angle-bracket-invocation-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/components/angle-bracket-invocation-test.js @@ -855,6 +855,70 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_INVOCATION) { }); } + '@test can forward ...attributes to dynamic component invocation ("splattributes")'() { + this.registerComponent('x-outer', { + ComponentClass: Component.extend({ tagName: '' }), + template: '{{yield}}', + }); + + this.registerComponent('x-inner', { + ComponentClass: Component.extend({ tagName: '' }), + template: '
{{yield}}
', + }); + + this.render(strip` + {{#let (component 'x-outer') as |Thing|}} + Hello! + {{/let}} + `); + + this.assertElement(this.firstChild, { + tagName: 'div', + attrs: { 'data-foo': '' }, + content: 'Hello!', + }); + } + + '@test an inner angle invocation can forward ...attributes through dynamic component invocation ("splattributes")'() { + this.registerComponent('x-outer', { + ComponentClass: Component.extend({ tagName: '' }), + template: `{{#let (component 'x-inner') as |Thing|}}{{yield}}{{/let}}`, + }); + + this.registerComponent('x-inner', { + ComponentClass: Component.extend({ tagName: '' }), + template: '
{{yield}}
', + }); + + this.render('Hello!'); + + this.assertElement(this.firstChild, { + tagName: 'div', + attrs: { 'data-foo': '' }, + content: 'Hello!', + }); + } + + '@test an inner angle invocation can forward ...attributes through static component invocation ("splattributes")'() { + this.registerComponent('x-outer', { + ComponentClass: Component.extend({ tagName: '' }), + template: `{{yield}}`, + }); + + this.registerComponent('x-inner', { + ComponentClass: Component.extend({ tagName: '' }), + template: '
{{yield}}
', + }); + + this.render('Hello!'); + + this.assertElement(this.firstChild, { + tagName: 'div', + attrs: { 'data-foo': '' }, + content: 'Hello!', + }); + } + '@test can include `...attributes` in multiple elements in tagless component ("splattributes")'() { this.registerComponent('foo-bar', { ComponentClass: Component.extend({ tagName: '' }), @@ -919,6 +983,41 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_INVOCATION) { content: 'world', }); } + + '@test can yield content to contextual components invoked with angle-bracket components that receives splattributes'() { + this.registerComponent('foo-bar/inner', { + ComponentClass: Component.extend({ tagName: '' }), + template: '

{{yield}}

', + }); + this.registerComponent('foo-bar', { + ComponentClass: Component.extend({ tagName: '' }), + // If doesn't receive splattributes this test passes + template: strip` + {{#let (component "foo-bar/inner") as |Inner|}} + {{yield}} +

Inside the let

+ {{/let}} +

Outside the let

+ `, + }); + + this.render('Yielded content'); + this.assertElement(this.firstChild, { + tagName: 'h1', + attrs: {}, + content: 'Yielded content', + }); + this.assertElement(this.nthChild(1), { + tagName: 'h2', + attrs: {}, + content: 'Inside the let', + }); + this.assertElement(this.nthChild(2), { + tagName: 'h3', + attrs: {}, + content: 'Outside the let', + }); + } } ); } diff --git a/packages/@ember/-internals/glimmer/tests/integration/custom-component-manager-test.js b/packages/@ember/-internals/glimmer/tests/integration/custom-component-manager-test.js index 5608f28aec9..f0bcb33e2ab 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/custom-component-manager-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/custom-component-manager-test.js @@ -305,6 +305,58 @@ if (GLIMMER_CUSTOM_COMPONENT_MANAGER) { this.assertHTML(`

Chad Hietala

`); } + ['@test it can set positional params on the component instance']() { + let ComponentClass = setComponentManager( + createBasicManager, + EmberObject.extend({ + salutation: computed('args.positional', function() { + return this.args.positional[0] + ' ' + this.args.positional[1]; + }), + }) + ); + + this.registerComponent('foo-bar', { + template: `

{{salutation}}

`, + ComponentClass, + }); + + this.render('{{foo-bar "Yehuda" "Katz"}}'); + + this.assertHTML(`

Yehuda Katz

`); + } + + ['@test positional params are updated if they change']() { + let ComponentClass = setComponentManager( + createBasicManager, + EmberObject.extend({ + salutation: computed('args.positional', function() { + return this.args.positional[0] + ' ' + this.args.positional[1]; + }), + }) + ); + + this.registerComponent('foo-bar', { + template: `

{{salutation}}

`, + ComponentClass, + }); + + this.render('{{foo-bar firstName lastName}}', { + firstName: 'Yehuda', + lastName: 'Katz', + }); + + this.assertHTML(`

Yehuda Katz

`); + + runTask(() => + setProperties(this.context, { + firstName: 'Chad', + lastName: 'Hietala', + }) + ); + + this.assertHTML(`

Chad Hietala

`); + } + ['@test it can opt-in to running destructor'](assert) { let ComponentClass = setComponentManager( () => { diff --git a/yarn.lock b/yarn.lock index 38b5bad78d8..d47da35bd7b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -598,120 +598,120 @@ lodash "^4.17.10" to-fast-properties "^2.0.0" -"@glimmer/compiler@^0.37.0": - version "0.37.0" - resolved "https://registry.yarnpkg.com/@glimmer/compiler/-/compiler-0.37.0.tgz#861d9c8064b54c24895262e1dd6a805cf24b8175" - integrity sha512-h01QJvqzClYw6Y5+DptqaB74KeBz14fsbNlig2O1sH5B2RKXRXo6T/OFSlFO/BHdzPLIrhyrkNQ/pooy2nTNmQ== +"@glimmer/compiler@^0.37.1": + version "0.37.1" + resolved "https://registry.yarnpkg.com/@glimmer/compiler/-/compiler-0.37.1.tgz#a3d59e0b1e51341314d3f8202aa0d4b70dc55173" + integrity sha512-bGdRb52eWZuHEGaIa1Rl0e0f4vPpQtp+gnpsaRwBMmRLqDrCZKdEJ8jCN5bI8TMFbtvP78s/5O0qi/XK+UzO4A== dependencies: - "@glimmer/interfaces" "^0.37.0" - "@glimmer/syntax" "^0.37.0" - "@glimmer/util" "^0.37.0" - "@glimmer/wire-format" "^0.37.0" + "@glimmer/interfaces" "^0.37.1" + "@glimmer/syntax" "^0.37.1" + "@glimmer/util" "^0.37.1" + "@glimmer/wire-format" "^0.37.1" -"@glimmer/encoder@^0.37.0": - version "0.37.0" - resolved "https://registry.yarnpkg.com/@glimmer/encoder/-/encoder-0.37.0.tgz#3689bb8dbdbce4ae45783b447d1a7fcc40c067c2" - integrity sha512-NS5UTeBZd0GRQYpUVQ/sSYriHxAPLSb4z1qlRzWQCfJmovtMRRYgcFpyRck/ckmFsXdlfDL+Nu0hJLOcYU+oXQ== +"@glimmer/encoder@^0.37.1": + version "0.37.1" + resolved "https://registry.yarnpkg.com/@glimmer/encoder/-/encoder-0.37.1.tgz#5cd95e04043c74ee4253811a768871b02fcd12c5" + integrity sha512-XvtlyFYibYxwYBfak5NK62u/iNtOgP1hbccxJNuDgK2pwYakrnZX6KSOg/6QnFNknjJkSQ/cwpW696ROliPTfw== "@glimmer/env@^0.1.7": version "0.1.7" resolved "https://registry.yarnpkg.com/@glimmer/env/-/env-0.1.7.tgz#fd2d2b55a9029c6b37a6c935e8c8871ae70dfa07" integrity sha1-/S0rVakCnGs3psk16MiHGucN+gc= -"@glimmer/interfaces@^0.37.0": - version "0.37.0" - resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.37.0.tgz#7e16dc3b44369ea084e13064dd30ec14ed86623f" - integrity sha512-tLvn6O0SqPotkQy/I/PBgnUorho+kim7psitpAZQMljOY8ocSf0+dfIY4GKQsTqefbpHbmdu4dYBhyy09xDJag== +"@glimmer/interfaces@^0.37.1": + version "0.37.1" + resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.37.1.tgz#44328c49d835445fda26efa7c8d5463ee2e626ed" + integrity sha512-ys5I6iEeaPvSPY9dn6uc9NAh9HkL8fnUZjTHJhlKV5nFv5qqXhBK8hFE86fVXqGRtXLHfOa90pg75vLXgw7u/g== dependencies: - "@glimmer/wire-format" "^0.37.0" + "@glimmer/wire-format" "^0.37.1" "@simple-dom/interface" "1.4.0" -"@glimmer/low-level@^0.37.0": - version "0.37.0" - resolved "https://registry.yarnpkg.com/@glimmer/low-level/-/low-level-0.37.0.tgz#ef49a49abb829c5ffcf539c3408cc545df688875" - integrity sha512-OFPE0KVUbSsQhpJpwI2zmG+1+y0NkpSJzn4qQ1kuKzpk50TABeTBo8ycqJFTgYh/cjus/W212G2YgEN/YXZqZw== - -"@glimmer/node@^0.37.0": - version "0.37.0" - resolved "https://registry.yarnpkg.com/@glimmer/node/-/node-0.37.0.tgz#cbf51153ec3d3e858314b95f249c8c80f458fa23" - integrity sha512-f2F/ttR1J3pkOLBGEuR/I+Z4tNKLuii5983LnUB6UDW0DKbz3DZwkejVcYr6wxhaU5QuD5RWl+AkaREOfZuh7w== - dependencies: - "@glimmer/interfaces" "^0.37.0" - "@glimmer/runtime" "^0.37.0" - -"@glimmer/opcode-compiler@^0.37.0": - version "0.37.0" - resolved "https://registry.yarnpkg.com/@glimmer/opcode-compiler/-/opcode-compiler-0.37.0.tgz#26b37cc3a569ba88377e373d602f518b65b36cc3" - integrity sha512-a+wMGHXTnzrvapFzyxx7tE73msnnIFCDy7O5vH/gnwNqy8VEGeXperJDpwZxxn0SnSVtwvCPJ+85MXFDmcfrvQ== - dependencies: - "@glimmer/encoder" "^0.37.0" - "@glimmer/interfaces" "^0.37.0" - "@glimmer/program" "^0.37.0" - "@glimmer/reference" "^0.37.0" - "@glimmer/util" "^0.37.0" - "@glimmer/vm" "^0.37.0" - "@glimmer/wire-format" "^0.37.0" - -"@glimmer/program@^0.37.0": - version "0.37.0" - resolved "https://registry.yarnpkg.com/@glimmer/program/-/program-0.37.0.tgz#25aaa78363216a47074246c4ddea0d6241e3295b" - integrity sha512-wsu9R5+ytndMJg4AXBGm8dJax3q/vk5PkSxl8VHi5jxje4Ja/8AjJl7SpE2nRCfmLpq8rV6vHSmZaKY1tSRANQ== - dependencies: - "@glimmer/encoder" "^0.37.0" - "@glimmer/interfaces" "^0.37.0" - "@glimmer/util" "^0.37.0" - -"@glimmer/reference@^0.37.0": - version "0.37.0" - resolved "https://registry.yarnpkg.com/@glimmer/reference/-/reference-0.37.0.tgz#5910810d932a03f5bb62014caa9733cecf0683ed" - integrity sha512-NCYlu9X0ok7pJiGb/Uevv/84xA1Z49PHDUcDrN0X/bDzSI/zoFy//wPevjPO/+ihBtD5Hy9Ve3eC/lfSSWsWVA== - dependencies: - "@glimmer/util" "^0.37.0" - -"@glimmer/runtime@^0.37.0": - version "0.37.0" - resolved "https://registry.yarnpkg.com/@glimmer/runtime/-/runtime-0.37.0.tgz#b1ec8303f6a97141310bb4fe3ecac7396311381a" - integrity sha512-U9FKj4id2HwA1FTVJLFWpCIsICOaIZklwhTHHd7XrtoETdFaesn7/4e3fH/LNx0BrPkXy6dfD/9I7izLFM4ToQ== - dependencies: - "@glimmer/interfaces" "^0.37.0" - "@glimmer/low-level" "^0.37.0" - "@glimmer/program" "^0.37.0" - "@glimmer/reference" "^0.37.0" - "@glimmer/util" "^0.37.0" - "@glimmer/vm" "^0.37.0" - "@glimmer/wire-format" "^0.37.0" +"@glimmer/low-level@^0.37.1": + version "0.37.1" + resolved "https://registry.yarnpkg.com/@glimmer/low-level/-/low-level-0.37.1.tgz#307f818b20b8df43c04750c01eb92ead2af4b455" + integrity sha512-CIscEE0BKNMlx6PCNUJVyPWYGCwtfoYTbwUIyQdY5IeVXLvBweT8fteMmHv4HapsPCKubPPkvwwm3bgBLSq3dA== + +"@glimmer/node@^0.37.1": + version "0.37.1" + resolved "https://registry.yarnpkg.com/@glimmer/node/-/node-0.37.1.tgz#f401e366b6b6d71a16f9aa7e3fddaeb7f9cf7b3b" + integrity sha512-eQiIhfx3MJqXhjDTqQMtzAfI+IJ+5aw0bLXjBikXHCau/lpSS6EqO12WZR1QN+K1wchdVlYkseme4wEs89fyag== + dependencies: + "@glimmer/interfaces" "^0.37.1" + "@glimmer/runtime" "^0.37.1" + +"@glimmer/opcode-compiler@^0.37.1": + version "0.37.1" + resolved "https://registry.yarnpkg.com/@glimmer/opcode-compiler/-/opcode-compiler-0.37.1.tgz#e69eaa227ea85f2b6316f447617fedef58a38ca3" + integrity sha512-Nf6BOgcSfOUDDlExNWqjGqNUx6m6biebnMX6aEwfJwD/JrnwQuMo20/K4d8+6ZvJwqwn1Bwth9Jk3rsp7caLAw== + dependencies: + "@glimmer/encoder" "^0.37.1" + "@glimmer/interfaces" "^0.37.1" + "@glimmer/program" "^0.37.1" + "@glimmer/reference" "^0.37.1" + "@glimmer/util" "^0.37.1" + "@glimmer/vm" "^0.37.1" + "@glimmer/wire-format" "^0.37.1" + +"@glimmer/program@^0.37.1": + version "0.37.1" + resolved "https://registry.yarnpkg.com/@glimmer/program/-/program-0.37.1.tgz#440efc86fdc2e870dfca9c678c1986c84e8ab5dc" + integrity sha512-HVaF3U1bCTH7cryMccgkxHn7/IzLfy9LGbyQK0wgeiHsY+xCSBb7Kq1WP4LPUH8+84/BzEpuLJN7u2n5GGdZlw== + dependencies: + "@glimmer/encoder" "^0.37.1" + "@glimmer/interfaces" "^0.37.1" + "@glimmer/util" "^0.37.1" + +"@glimmer/reference@^0.37.1": + version "0.37.1" + resolved "https://registry.yarnpkg.com/@glimmer/reference/-/reference-0.37.1.tgz#a444a56eb3e79d9d6d991c423f32c6491778d57b" + integrity sha512-nGelUwaQ1jBnI1OH80JV3cMiWfjgsi399y61ajARiHjl1DK8gXchZ0qLpNu83Sa5UbL09AMbVaUTb8xsy6MFwA== + dependencies: + "@glimmer/util" "^0.37.1" + +"@glimmer/runtime@^0.37.1": + version "0.37.1" + resolved "https://registry.yarnpkg.com/@glimmer/runtime/-/runtime-0.37.1.tgz#3f690f003d00af710823449afadeaf01e379533e" + integrity sha512-ujkaODl2DDrwOttXZTcobH8ML4eSpgepnPpsYYEafCBXxKxkTWHV7JzSuuh3/hnHZVdrRO/vP6zIJ0P86FXBLQ== + dependencies: + "@glimmer/interfaces" "^0.37.1" + "@glimmer/low-level" "^0.37.1" + "@glimmer/program" "^0.37.1" + "@glimmer/reference" "^0.37.1" + "@glimmer/util" "^0.37.1" + "@glimmer/vm" "^0.37.1" + "@glimmer/wire-format" "^0.37.1" "@simple-dom/interface" "^1.4.0" -"@glimmer/syntax@^0.37.0": - version "0.37.0" - resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.37.0.tgz#3d91aef9ecad70e70654584f84552c195f3280a6" - integrity sha512-DTWPjTK6f7sXAYIqLjC7lfNpONyY21jmHjhzAbC6nbEfZ3DegmogWDBLCO8dhun1bAF4T2FL7+gLho698UqBiw== +"@glimmer/syntax@^0.37.1": + version "0.37.1" + resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.37.1.tgz#f3c507122f7c4b859ce712e0c5bbc43608ca12db" + integrity sha512-DtSRWrbZlgAvLOR62slBvMgUmcnYxfq4Jv5uqCqD4/DUrjV2ezmOMhDFW4zxAVz55luqx9/900XHYiUzsicPyA== dependencies: - "@glimmer/interfaces" "^0.37.0" - "@glimmer/util" "^0.37.0" + "@glimmer/interfaces" "^0.37.1" + "@glimmer/util" "^0.37.1" handlebars "^4.0.6" simple-html-tokenizer "^0.5.6" -"@glimmer/util@^0.37.0": - version "0.37.0" - resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.37.0.tgz#962937c187b05a8a371d5b064674e74e838411c7" - integrity sha512-gwApoQ4xAAPKUBd9IpKYqW3UojZv45gIH+hxi9G9BbZWQZd1f9qIUHwk6JP+bNQ4zvxv9z4QEL1pOCWLx0TE3w== +"@glimmer/util@^0.37.1": + version "0.37.1" + resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.37.1.tgz#b6dafd36134556053121fc8a8ffceb68e490a4b5" + integrity sha512-Of58Of07fsT8JOkok/tXJvewEdI6LzDxdlIIcdhv6iOJgYUsJUQKUYf6XY+5o/rtsrByPQ5da2WwHbLAcpq0aQ== -"@glimmer/vm@^0.37.0": - version "0.37.0" - resolved "https://registry.yarnpkg.com/@glimmer/vm/-/vm-0.37.0.tgz#34268bb46a69e551379ccc554773e80900461c24" - integrity sha512-1H0Vag7kgZKJ6hCFg9Lv5OA0Q5b130atdnbKb79AS0OUpT3G7f64h/eCIlxMxhF+YhRi2nrD5Hb5bVuuD8Pszg== +"@glimmer/vm@^0.37.1": + version "0.37.1" + resolved "https://registry.yarnpkg.com/@glimmer/vm/-/vm-0.37.1.tgz#26ad736b1228dac88fd8c1b9ce2b8ffefa91bdc0" + integrity sha512-EIhJoDrXX+WW3vyovTiEQSYwdbAQgaJKGR25mkMKGLSwvIu4RcX2d9uUPSkm+pBvijHNk2f67q86k1s6j8cBIQ== dependencies: - "@glimmer/interfaces" "^0.37.0" - "@glimmer/program" "^0.37.0" - "@glimmer/util" "^0.37.0" + "@glimmer/interfaces" "^0.37.1" + "@glimmer/program" "^0.37.1" + "@glimmer/util" "^0.37.1" -"@glimmer/wire-format@^0.37.0": - version "0.37.0" - resolved "https://registry.yarnpkg.com/@glimmer/wire-format/-/wire-format-0.37.0.tgz#cd26f3d260d92a9e5d2873bd0234b54556ab3e85" - integrity sha512-wMBCo9cosxKzcsHuPlFzd+WHS8AqJoNYYK+LcpgLZRhjXO55oeirEQcwthV1uHdYs0CK7i+HcljuMDdJk2heww== +"@glimmer/wire-format@^0.37.1": + version "0.37.1" + resolved "https://registry.yarnpkg.com/@glimmer/wire-format/-/wire-format-0.37.1.tgz#34906e320d38bc65b1730b5f78890b184211a0d5" + integrity sha512-iDj8D1eCVDmcsNUcz5epdOCN6Gt53W3cMsS2qAkf2H6REiXQ9kG7ySIGIdahNsLT/f21MT+JzqawylZR0hrw0w== dependencies: - "@glimmer/util" "^0.37.0" + "@glimmer/util" "^0.37.1" "@simple-dom/document@^1.4.0": version "1.4.0"