@@ -1989,6 +1989,136 @@ describe('htmlbars-inline-precompile', function () {
1989
1989
` ) ;
1990
1990
} ) ;
1991
1991
1992
+ it ( 'captures lexical "this" in mustache when template is used as an expression' , function ( ) {
1993
+ plugins = [
1994
+ [
1995
+ HTMLBarsInlinePrecompile ,
1996
+ {
1997
+ compiler,
1998
+ targetFormat : 'hbs' ,
1999
+ } ,
2000
+ ] ,
2001
+ ] ;
2002
+
2003
+ let transformed = transform (
2004
+ `import { template } from '@ember/template-compiler';
2005
+ function upper(s) { return s.toUpperCase() }
2006
+ export function exampleTest() {
2007
+ this.message = "hello";
2008
+ render(template('{{upper this.message}}', { eval: function() { return eval(arguments[0]) } }))
2009
+ }
2010
+ `
2011
+ ) ;
2012
+
2013
+ expect ( transformed ) . toEqualCode ( `
2014
+ import { precompileTemplate } from "@ember/template-compilation";
2015
+ import { setComponentTemplate } from "@ember/component";
2016
+ import templateOnly from "@ember/component/template-only";
2017
+ function upper(s) {
2018
+ return s.toUpperCase();
2019
+ }
2020
+ export function exampleTest() {
2021
+ this.message = "hello";
2022
+ render(
2023
+ setComponentTemplate(
2024
+ precompileTemplate("{{upper this.message}}", {
2025
+ strictMode: true,
2026
+ scope: () => ({
2027
+ upper,
2028
+ this: this,
2029
+ }),
2030
+ }),
2031
+ templateOnly()
2032
+ )
2033
+ );
2034
+ }
2035
+ ` ) ;
2036
+ } ) ;
2037
+
2038
+ it ( 'captures lexical "this" in Element when template is used as an expression' , function ( ) {
2039
+ plugins = [
2040
+ [
2041
+ HTMLBarsInlinePrecompile ,
2042
+ {
2043
+ compiler,
2044
+ targetFormat : 'hbs' ,
2045
+ } ,
2046
+ ] ,
2047
+ ] ;
2048
+
2049
+ let transformed = transform (
2050
+ `import { template } from '@ember/template-compiler';
2051
+ import SomeComponent from './elsewhere.js';
2052
+ export function exampleTest() {
2053
+ this.message = SomeComponent;
2054
+ render(template('<this.message />', { eval: function() { return eval(arguments[0]) } }))
2055
+ }
2056
+ `
2057
+ ) ;
2058
+
2059
+ expect ( transformed ) . toEqualCode ( `
2060
+ import SomeComponent from './elsewhere.js';
2061
+ import { precompileTemplate } from "@ember/template-compilation";
2062
+ import { setComponentTemplate } from "@ember/component";
2063
+ import templateOnly from "@ember/component/template-only";
2064
+ export function exampleTest() {
2065
+ this.message = SomeComponent;
2066
+ render(
2067
+ setComponentTemplate(
2068
+ precompileTemplate("<this.message />", {
2069
+ strictMode: true,
2070
+ scope: () => ({
2071
+ this: this,
2072
+ }),
2073
+ }),
2074
+ templateOnly()
2075
+ )
2076
+ );
2077
+ }
2078
+ ` ) ;
2079
+ } ) ;
2080
+
2081
+ it ( 'does not captures lexical "this" when template is used in class body' , function ( ) {
2082
+ plugins = [
2083
+ [
2084
+ HTMLBarsInlinePrecompile ,
2085
+ {
2086
+ compiler,
2087
+ targetFormat : 'hbs' ,
2088
+ } ,
2089
+ ] ,
2090
+ ] ;
2091
+
2092
+ let transformed = transform (
2093
+ `import { template } from '@ember/template-compiler';
2094
+ import Component from '@glimmer/component';
2095
+ export class Example extends Component {
2096
+ upper(s) { return s.toUpperCase() }
2097
+ message = "hi";
2098
+ static {
2099
+ template('{{this.upper this.message}}', { component: this, eval: function() { return eval(arguments[0]) } })
2100
+ }
2101
+ }
2102
+ `
2103
+ ) ;
2104
+
2105
+ expect ( transformed ) . toEqualCode ( `
2106
+ import Component from '@glimmer/component';
2107
+ import { precompileTemplate } from "@ember/template-compilation";
2108
+ import { setComponentTemplate } from "@ember/component";
2109
+ export class Example extends Component {
2110
+ upper(s) { return s.toUpperCase() }
2111
+ message = "hi";
2112
+ static {
2113
+ setComponentTemplate(
2114
+ precompileTemplate("{{this.upper this.message}}", {
2115
+ strictMode: true,
2116
+ }), this)
2117
+ }
2118
+ }
2119
+ ` ) ;
2120
+ } ) ;
2121
+
1992
2122
it ( 'leaves ember keywords alone when no local is defined' , function ( ) {
1993
2123
plugins = [
1994
2124
[
0 commit comments