diff --git a/src/qweb/base_directives.ts b/src/qweb/base_directives.ts index 04f30daf..f8a4623e 100644 --- a/src/qweb/base_directives.ts +++ b/src/qweb/base_directives.ts @@ -1,6 +1,7 @@ import { CompilationContext } from "./compilation_context"; import { QWeb } from "./qweb"; import { htmlToVDOM } from "../vdom/html_to_vdom"; +import { QWebVar } from "./expression_parser"; /** * Owl QWeb Directives @@ -119,7 +120,7 @@ QWeb.addDirective({ ctx.rootContext.shouldDefineScope = true; const variable = node.getAttribute("t-set")!; let value = node.getAttribute("t-value")!; - ctx.variables[variable] = ctx.variables[variable] || {}; + ctx.variables[variable] = ctx.variables[variable] || ({} as QWebVar); let qwebvar = ctx.variables[variable]; const hasBody = node.hasChildNodes(); @@ -229,7 +230,7 @@ QWeb.addDirective({ // ------------------------------------------------ if (!qweb.subTemplates[subTemplate]) { qweb.subTemplates[subTemplate] = true; - const subTemplateFn = qweb._compile(subTemplate, nodeTemplate.elem, ctx); + const subTemplateFn = qweb._compile(subTemplate, nodeTemplate.elem, ctx, true); qweb.subTemplates[subTemplate] = subTemplateFn; } @@ -264,17 +265,16 @@ QWeb.addDirective({ // ------------------------------------------------ const callingScope = hasBody ? "scope" : "Object.assign(Object.create(context), scope)"; const parentComponent = `utils.getComponent(context)`; + const keyCode = ctx.loopNumber ? `, key: ${ctx.generateTemplateKey()}` : ""; + const parentNode = ctx.parentNode ? `c${ctx.parentNode}` : "result"; + const extra = `Object.assign({}, extra, {parentNode: ${parentNode}, parent: ${parentComponent}${keyCode}})`; if (ctx.parentNode) { - ctx.addLine( - `this.subTemplates['${subTemplate}'].call(this, ${callingScope}, Object.assign({}, extra, {parentNode: c${ctx.parentNode}, parent: ${parentComponent}}));` - ); + ctx.addLine(`this.subTemplates['${subTemplate}'].call(this, ${callingScope}, ${extra});`); } else { // this is a t-call with no parentnode, we need to extract the result ctx.rootContext.shouldDefineResult = true; ctx.addLine(`result = []`); - ctx.addLine( - `this.subTemplates['${subTemplate}'].call(this, ${callingScope}, Object.assign({}, extra, {parentNode: result, parent: ${parentComponent}}));` - ); + ctx.addLine(`this.subTemplates['${subTemplate}'].call(this, ${callingScope}, ${extra});`); ctx.addLine(`result = result[0]`); } diff --git a/src/qweb/qweb.ts b/src/qweb/qweb.ts index 08b68e67..0bd591cd 100644 --- a/src/qweb/qweb.ts +++ b/src/qweb/qweb.ts @@ -383,7 +383,12 @@ export class QWeb extends EventBus { }); } - _compile(name: string, elem: Element, parentContext?: CompilationContext): CompiledTemplate { + _compile( + name: string, + elem: Element, + parentContext?: CompilationContext, + defineKey?: boolean + ): CompiledTemplate { const isDebug = elem.attributes.hasOwnProperty("t-debug"); const ctx = new CompilationContext(name); if (elem.tagName !== "t") { @@ -396,6 +401,10 @@ export class QWeb extends EventBus { ctx.hasParentWidget = true; ctx.shouldDefineResult = false; ctx.addLine(`let c${ctx.parentNode} = extra.parentNode;`); + if (defineKey) { + ctx.currentKey = `key${ctx.generateID()}`; + ctx.addLine(`let ${ctx.currentKey} = extra.key || '';`); + } } this._compileNode(elem, ctx); diff --git a/tests/component/__snapshots__/component.test.ts.snap b/tests/component/__snapshots__/component.test.ts.snap index 3f0447b1..f52a855d 100644 --- a/tests/component/__snapshots__/component.test.ts.snap +++ b/tests/component/__snapshots__/component.test.ts.snap @@ -1017,12 +1017,14 @@ exports[`t-call handlers are properly bound through a t-call 1`] = ` let utils = this.constructor.utils; let h = this.h; let c1 = extra.parentNode; - let c2 = [], p2 = {key:2,on:{}}; - let vn2 = h('p', p2, c2); - c1.push(vn2); - extra.handlers['click__3__'] = extra.handlers['click__3__'] || function (e) {if (!context.__owl__.isMounted){return}utils.getComponent(context)['update'](e);}; - p2.on['click'] = extra.handlers['click__3__']; - c2.push({text: \`lucas\`}); + let key2 = extra.key || ''; + let c3 = [], p3 = {key:key2,on:{}}; + let vn3 = h('p', p3, c3); + c1.push(vn3); + let k4 = \`click__4__\` + key2; + extra.handlers[k4] = extra.handlers[k4] || function (e) {if (!context.__owl__.isMounted){return}utils.getComponent(context)['update'](e);}; + p3.on['click'] = extra.handlers[k4]; + c3.push({text: \`lucas\`}); }" `; @@ -1034,12 +1036,13 @@ exports[`t-call handlers with arguments are properly bound through a t-call 1`] let scope = Object.create(context); let h = this.h; let c1 = extra.parentNode; - let c2 = [], p2 = {key:2,on:{}}; - let vn2 = h('p', p2, c2); - c1.push(vn2); - let args3 = [scope['a']]; - p2.on['click'] = function (e) {if (!context.__owl__.isMounted){return}utils.getComponent(context)['update'](...args3, e);}; - c2.push({text: \`lucas\`}); + let key2 = extra.key || ''; + let c3 = [], p3 = {key:key2,on:{}}; + let vn3 = h('p', p3, c3); + c1.push(vn3); + let args4 = [scope['a']]; + p3.on['click'] = function (e) {if (!context.__owl__.isMounted){return}utils.getComponent(context)['update'](...args4, e);}; + c3.push({text: \`lucas\`}); }" `; @@ -1053,29 +1056,31 @@ exports[`t-call parent is set within t-call 1`] = ` let scope = Object.create(context); let h = this.h; let c1 = extra.parentNode; + let key2 = extra.key || ''; // Component 'Child' - let w2 = '__3__' in parent.__owl__.cmap ? parent.__owl__.children[parent.__owl__.cmap['__3__']] : false; - let props2 = {}; - if (w2 && w2.__owl__.currentFiber && !w2.__owl__.vnode) { - w2.destroy(); - w2 = false; + let k4 = \`__4__\` + key2; + let w3 = k4 in parent.__owl__.cmap ? parent.__owl__.children[parent.__owl__.cmap[k4]] : false; + let props3 = {}; + if (w3 && w3.__owl__.currentFiber && !w3.__owl__.vnode) { + w3.destroy(); + w3 = false; } - if (w2) { - w2.__updateProps(props2, extra.fiber, undefined); - let pvnode = w2.__owl__.pvnode; + if (w3) { + w3.__updateProps(props3, extra.fiber, undefined); + let pvnode = w3.__owl__.pvnode; c1.push(pvnode); } else { - let componentKey2 = \`Child\`; - let W2 = context.constructor.components[componentKey2] || QWeb.components[componentKey2]|| scope['Child']; - if (!W2) {throw new Error('Cannot find the definition of component \\"' + componentKey2 + '\\"')} - w2 = new W2(parent, props2); - parent.__owl__.cmap['__3__'] = w2.__owl__.id; - let fiber = w2.__prepare(extra.fiber, undefined, () => { const vnode = fiber.vnode; pvnode.sel = vnode.sel; }); - let pvnode = h('dummy', {key: '__3__', hook: {remove() {},destroy(vn) {w2.destroy();}}}); + let componentKey3 = \`Child\`; + let W3 = context.constructor.components[componentKey3] || QWeb.components[componentKey3]|| scope['Child']; + if (!W3) {throw new Error('Cannot find the definition of component \\"' + componentKey3 + '\\"')} + w3 = new W3(parent, props3); + parent.__owl__.cmap[k4] = w3.__owl__.id; + let fiber = w3.__prepare(extra.fiber, undefined, () => { const vnode = fiber.vnode; pvnode.sel = vnode.sel; }); + let pvnode = h('dummy', {key: k4, hook: {remove() {},destroy(vn) {w3.destroy();}}}); c1.push(pvnode); - w2.__owl__.pvnode = pvnode; + w3.__owl__.pvnode = pvnode; } - w2.__owl__.parentLastFiberId = extra.fiber.id; + w3.__owl__.parentLastFiberId = extra.fiber.id; }" `; @@ -1089,29 +1094,31 @@ exports[`t-call parent is set within t-call with no parentNode 1`] = ` let scope = Object.create(context); let h = this.h; let c1 = extra.parentNode; + let key2 = extra.key || ''; // Component 'Child' - let w2 = '__3__' in parent.__owl__.cmap ? parent.__owl__.children[parent.__owl__.cmap['__3__']] : false; - let props2 = {}; - if (w2 && w2.__owl__.currentFiber && !w2.__owl__.vnode) { - w2.destroy(); - w2 = false; + let k4 = \`__4__\` + key2; + let w3 = k4 in parent.__owl__.cmap ? parent.__owl__.children[parent.__owl__.cmap[k4]] : false; + let props3 = {}; + if (w3 && w3.__owl__.currentFiber && !w3.__owl__.vnode) { + w3.destroy(); + w3 = false; } - if (w2) { - w2.__updateProps(props2, extra.fiber, undefined); - let pvnode = w2.__owl__.pvnode; + if (w3) { + w3.__updateProps(props3, extra.fiber, undefined); + let pvnode = w3.__owl__.pvnode; c1.push(pvnode); } else { - let componentKey2 = \`Child\`; - let W2 = context.constructor.components[componentKey2] || QWeb.components[componentKey2]|| scope['Child']; - if (!W2) {throw new Error('Cannot find the definition of component \\"' + componentKey2 + '\\"')} - w2 = new W2(parent, props2); - parent.__owl__.cmap['__3__'] = w2.__owl__.id; - let fiber = w2.__prepare(extra.fiber, undefined, () => { const vnode = fiber.vnode; pvnode.sel = vnode.sel; }); - let pvnode = h('dummy', {key: '__3__', hook: {remove() {},destroy(vn) {w2.destroy();}}}); + let componentKey3 = \`Child\`; + let W3 = context.constructor.components[componentKey3] || QWeb.components[componentKey3]|| scope['Child']; + if (!W3) {throw new Error('Cannot find the definition of component \\"' + componentKey3 + '\\"')} + w3 = new W3(parent, props3); + parent.__owl__.cmap[k4] = w3.__owl__.id; + let fiber = w3.__prepare(extra.fiber, undefined, () => { const vnode = fiber.vnode; pvnode.sel = vnode.sel; }); + let pvnode = h('dummy', {key: k4, hook: {remove() {},destroy(vn) {w3.destroy();}}}); c1.push(pvnode); - w2.__owl__.pvnode = pvnode; + w3.__owl__.pvnode = pvnode; } - w2.__owl__.parentLastFiberId = extra.fiber.id; + w3.__owl__.parentLastFiberId = extra.fiber.id; }" `; diff --git a/tests/component/component.test.ts b/tests/component/component.test.ts index 3ff1fba8..fbf90693 100644 --- a/tests/component/component.test.ts +++ b/tests/component/component.test.ts @@ -5599,6 +5599,26 @@ describe("t-call", () => { expect(env.qweb.subTemplates["sub"].toString()).toMatchSnapshot(); }); + test("t-call in t-foreach and children component", async () => { + env.qweb.addTemplate("sub", ``); + class Child extends Component { + static template = xml``; + } + class Parent extends Component { + static components = { Child }; + static template = xml` +
+ + + +
`; + } + const parent = new Parent(); + await parent.mount(fixture); + + expect(fixture.innerHTML).toBe("
abc
"); + }); + test("parent is set within t-call with no parentNode", async () => { env.qweb.addTemplate("sub", ``); let child; diff --git a/tests/qweb/__snapshots__/qweb.test.ts.snap b/tests/qweb/__snapshots__/qweb.test.ts.snap index 26fd9442..9a3a50c1 100644 --- a/tests/qweb/__snapshots__/qweb.test.ts.snap +++ b/tests/qweb/__snapshots__/qweb.test.ts.snap @@ -765,28 +765,32 @@ exports[`misc global 1`] = ` c6.push({text: _7}); } { - let _origScope10 = scope; + let _origScope11 = scope; scope = Object.assign(Object.create(context), scope); { let c__0 = []; { - let _origScope13 = scope; + let _origScope15 = scope; scope = Object.assign(Object.create(context), scope); { let c__0 = []; scope.foo = 'aaa'; scope[utils.zero] = c__0; } - this.subTemplates['_callee-uses-foo'].call(this, scope, Object.assign({}, extra, {parentNode: c__0, parent: utils.getComponent(context)})); - scope = _origScope13; + let k16 = \`__16__\${i1}__\`; + this.subTemplates['_callee-uses-foo'].call(this, scope, Object.assign({}, extra, {parentNode: c__0, parent: utils.getComponent(context), key: k16})); + scope = _origScope15; } - this.subTemplates['_callee-uses-foo'].call(this, Object.assign(Object.create(context), scope), Object.assign({}, extra, {parentNode: c__0, parent: utils.getComponent(context)})); + let k17 = \`__17__\${i1}__\`; + this.subTemplates['_callee-uses-foo'].call(this, Object.assign(Object.create(context), scope), Object.assign({}, extra, {parentNode: c__0, parent: utils.getComponent(context), key: k17})); scope.foo = 'bbb'; - this.subTemplates['_callee-uses-foo'].call(this, Object.assign(Object.create(context), scope), Object.assign({}, extra, {parentNode: c__0, parent: utils.getComponent(context)})); + let k18 = \`__18__\${i1}__\`; + this.subTemplates['_callee-uses-foo'].call(this, Object.assign(Object.create(context), scope), Object.assign({}, extra, {parentNode: c__0, parent: utils.getComponent(context), key: k18})); scope[utils.zero] = c__0; } - this.subTemplates['_callee-asc'].call(this, scope, Object.assign({}, extra, {parentNode: c1, parent: utils.getComponent(context)})); - scope = _origScope10; + let k19 = \`__19__\${i1}__\`; + this.subTemplates['_callee-asc'].call(this, scope, Object.assign({}, extra, {parentNode: c1, parent: utils.getComponent(context), key: k19})); + scope = _origScope11; } } scope = _origScope5; @@ -1040,10 +1044,11 @@ exports[`t-call (template calling basic caller 2`] = ` // Template name: \\"_basic-callee\\" let h = this.h; let c1 = extra.parentNode; - let c2 = [], p2 = {key:2}; - let vn2 = h('span', p2, c2); - c1.push(vn2); - c2.push({text: \`ok\`}); + let key2 = extra.key || ''; + let c3 = [], p3 = {key:key2}; + let vn3 = h('span', p3, c3); + c1.push(vn3); + c3.push({text: \`ok\`}); }" `; @@ -1068,10 +1073,11 @@ exports[`t-call (template calling basic caller, no parent node 2`] = ` // Template name: \\"_basic-callee\\" let h = this.h; let c1 = extra.parentNode; - let c2 = [], p2 = {key:2}; - let vn2 = h('div', p2, c2); - c1.push(vn2); - c2.push({text: \`ok\`}); + let key2 = extra.key || ''; + let c3 = [], p3 = {key:key2}; + let vn3 = h('div', p3, c3); + c1.push(vn3); + c3.push({text: \`ok\`}); }" `; @@ -1085,23 +1091,23 @@ exports[`t-call (template calling call with several sub nodes on same line 1`] = let c1 = [], p1 = {key:1}; let vn1 = h('div', p1, c1); { - let _origScope3 = scope; + let _origScope4 = scope; scope = Object.assign(Object.create(context), scope); { let c__0 = []; - let c4 = [], p4 = {key:4}; - let vn4 = h('span', p4, c4); - c__0.push(vn4); - c4.push({text: \`hey\`}); - c__0.push({text: \` \`}); let c5 = [], p5 = {key:5}; let vn5 = h('span', p5, c5); c__0.push(vn5); - c5.push({text: \`yay\`}); + c5.push({text: \`hey\`}); + c__0.push({text: \` \`}); + let c6 = [], p6 = {key:6}; + let vn6 = h('span', p6, c6); + c__0.push(vn6); + c6.push({text: \`yay\`}); scope[utils.zero] = c__0; } this.subTemplates['SubTemplate'].call(this, scope, Object.assign({}, extra, {parentNode: c1, parent: utils.getComponent(context)})); - scope = _origScope3; + scope = _origScope4; } return vn1; }" @@ -1115,10 +1121,11 @@ exports[`t-call (template calling call with several sub nodes on same line 2`] = let scope = Object.create(context); let h = this.h; let c1 = extra.parentNode; - let c2 = [], p2 = {key:2}; - let vn2 = h('div', p2, c2); - c1.push(vn2); - c2.push(...scope[utils.zero]); + let key2 = extra.key || ''; + let c3 = [], p3 = {key:key2}; + let vn3 = h('div', p3, c3); + c1.push(vn3); + c3.push(...scope[utils.zero]); }" `; @@ -1132,23 +1139,23 @@ exports[`t-call (template calling cascading t-call t-raw='0' 1`] = ` let c1 = [], p1 = {key:1}; let vn1 = h('div', p1, c1); { - let _origScope10 = scope; + let _origScope13 = scope; scope = Object.assign(Object.create(context), scope); { let c__0 = []; - let c11 = [], p11 = {key:11}; - let vn11 = h('span', p11, c11); - c__0.push(vn11); - c11.push({text: \`hey\`}); + let c14 = [], p14 = {key:14}; + let vn14 = h('span', p14, c14); + c__0.push(vn14); + c14.push({text: \`hey\`}); c__0.push({text: \` \`}); - let c12 = [], p12 = {key:12}; - let vn12 = h('span', p12, c12); - c__0.push(vn12); - c12.push({text: \`yay\`}); + let c15 = [], p15 = {key:15}; + let vn15 = h('span', p15, c15); + c__0.push(vn15); + c15.push({text: \`yay\`}); scope[utils.zero] = c__0; } this.subTemplates['SubTemplate'].call(this, scope, Object.assign({}, extra, {parentNode: c1, parent: utils.getComponent(context)})); - scope = _origScope10; + scope = _origScope13; } return vn1; }" @@ -1197,15 +1204,16 @@ exports[`t-call (template calling recursive template, part 1 2`] = ` let scope = Object.create(context); let h = this.h; let c1 = extra.parentNode; - let c3 = [], p3 = {key:3}; - let vn3 = h('div', p3, c3); - c1.push(vn3); - let c4 = [], p4 = {key:4}; - let vn4 = h('span', p4, c4); - c3.push(vn4); - c4.push({text: \`hey\`}); + let key3 = extra.key || ''; + let c4 = [], p4 = {key:key3}; + let vn4 = h('div', p4, c4); + c1.push(vn4); + let c5 = [], p5 = {key:key3}; + let vn5 = h('span', p5, c5); + c4.push(vn5); + c5.push({text: \`hey\`}); if (false) { - this.subTemplates['recursive'].call(this, Object.assign(Object.create(context), scope), Object.assign({}, extra, {parentNode: c3, parent: utils.getComponent(context)})); + this.subTemplates['recursive'].call(this, Object.assign(Object.create(context), scope), Object.assign({}, extra, {parentNode: c4, parent: utils.getComponent(context)})); } }" `; @@ -1220,7 +1228,7 @@ exports[`t-call (template calling recursive template, part 2 1`] = ` let c1 = [], p1 = {key:1}; let vn1 = h('div', p1, c1); { - let _origScope10 = scope; + let _origScope12 = scope; scope = Object.assign(Object.create(context), scope); { let c__0 = []; @@ -1228,7 +1236,7 @@ exports[`t-call (template calling recursive template, part 2 1`] = ` scope[utils.zero] = c__0; } this.subTemplates['nodeTemplate'].call(this, scope, Object.assign({}, extra, {parentNode: c1, parent: utils.getComponent(context)})); - scope = _origScope10; + scope = _origScope12; } return vn1; }" @@ -1242,45 +1250,47 @@ exports[`t-call (template calling recursive template, part 2 2`] = ` let scope = Object.create(context); let h = this.h; let c1 = extra.parentNode; - let c2 = [], p2 = {key:2}; - let vn2 = h('div', p2, c2); - c1.push(vn2); - let c3 = [], p3 = {key:3}; - let vn3 = h('p', p3, c3); - c2.push(vn3); - let _4 = scope['node'].val; - if (_4 != null) { - c3.push({text: _4}); + let key2 = extra.key || ''; + let c3 = [], p3 = {key:key2}; + let vn3 = h('div', p3, c3); + c1.push(vn3); + let c4 = [], p4 = {key:key2}; + let vn4 = h('p', p4, c4); + c3.push(vn4); + let _5 = scope['node'].val; + if (_5 != null) { + c4.push({text: _5}); } - let _5 = scope['node'].children||[]; - if (!_5) { throw new Error('QWeb error: Invalid loop expression')} - let _6 = _7 = _5; - if (!(_5 instanceof Array)) { - _6 = Object.keys(_5); - _7 = Object.values(_5); + let _6 = scope['node'].children||[]; + if (!_6) { throw new Error('QWeb error: Invalid loop expression')} + let _7 = _8 = _6; + if (!(_6 instanceof Array)) { + _7 = Object.keys(_6); + _8 = Object.values(_6); } - let _length6 = _6.length; - let _origScope8 = scope; + let _length7 = _7.length; + let _origScope9 = scope; scope = Object.assign(Object.create(context), scope); - for (let i1 = 0; i1 < _length6; i1++) { + for (let i1 = 0; i1 < _length7; i1++) { scope.subtree_first = i1 === 0 - scope.subtree_last = i1 === _length6 - 1 + scope.subtree_last = i1 === _length7 - 1 scope.subtree_index = i1 - scope.subtree = _6[i1] - scope.subtree_value = _7[i1] + scope.subtree = _7[i1] + scope.subtree_value = _8[i1] { - let _origScope9 = scope; + let _origScope10 = scope; scope = Object.assign(Object.create(context), scope); { let c__0 = []; scope.node = scope['subtree']; scope[utils.zero] = c__0; } - this.subTemplates['nodeTemplate'].call(this, scope, Object.assign({}, extra, {parentNode: c2, parent: utils.getComponent(context)})); - scope = _origScope9; + let k11 = \`__11__\` + key2; + this.subTemplates['nodeTemplate'].call(this, scope, Object.assign({}, extra, {parentNode: c3, parent: utils.getComponent(context), key: k11})); + scope = _origScope10; } } - scope = _origScope8; + scope = _origScope9; }" `; @@ -1294,7 +1304,7 @@ exports[`t-call (template calling recursive template, part 3 1`] = ` let c1 = [], p1 = {key:1}; let vn1 = h('div', p1, c1); { - let _origScope10 = scope; + let _origScope12 = scope; scope = Object.assign(Object.create(context), scope); { let c__0 = []; @@ -1302,7 +1312,7 @@ exports[`t-call (template calling recursive template, part 3 1`] = ` scope[utils.zero] = c__0; } this.subTemplates['nodeTemplate'].call(this, scope, Object.assign({}, extra, {parentNode: c1, parent: utils.getComponent(context)})); - scope = _origScope10; + scope = _origScope12; } return vn1; }" @@ -1316,45 +1326,47 @@ exports[`t-call (template calling recursive template, part 3 2`] = ` let scope = Object.create(context); let h = this.h; let c1 = extra.parentNode; - let c2 = [], p2 = {key:2}; - let vn2 = h('div', p2, c2); - c1.push(vn2); - let c3 = [], p3 = {key:3}; - let vn3 = h('p', p3, c3); - c2.push(vn3); - let _4 = scope['node'].val; - if (_4 != null) { - c3.push({text: _4}); + let key2 = extra.key || ''; + let c3 = [], p3 = {key:key2}; + let vn3 = h('div', p3, c3); + c1.push(vn3); + let c4 = [], p4 = {key:key2}; + let vn4 = h('p', p4, c4); + c3.push(vn4); + let _5 = scope['node'].val; + if (_5 != null) { + c4.push({text: _5}); } - let _5 = scope['node'].children||[]; - if (!_5) { throw new Error('QWeb error: Invalid loop expression')} - let _6 = _7 = _5; - if (!(_5 instanceof Array)) { - _6 = Object.keys(_5); - _7 = Object.values(_5); + let _6 = scope['node'].children||[]; + if (!_6) { throw new Error('QWeb error: Invalid loop expression')} + let _7 = _8 = _6; + if (!(_6 instanceof Array)) { + _7 = Object.keys(_6); + _8 = Object.values(_6); } - let _length6 = _6.length; - let _origScope8 = scope; + let _length7 = _7.length; + let _origScope9 = scope; scope = Object.assign(Object.create(context), scope); - for (let i1 = 0; i1 < _length6; i1++) { + for (let i1 = 0; i1 < _length7; i1++) { scope.subtree_first = i1 === 0 - scope.subtree_last = i1 === _length6 - 1 + scope.subtree_last = i1 === _length7 - 1 scope.subtree_index = i1 - scope.subtree = _6[i1] - scope.subtree_value = _7[i1] + scope.subtree = _7[i1] + scope.subtree_value = _8[i1] { - let _origScope9 = scope; + let _origScope10 = scope; scope = Object.assign(Object.create(context), scope); { let c__0 = []; scope.node = scope['subtree']; scope[utils.zero] = c__0; } - this.subTemplates['nodeTemplate'].call(this, scope, Object.assign({}, extra, {parentNode: c2, parent: utils.getComponent(context)})); - scope = _origScope9; + let k11 = \`__11__\` + key2; + this.subTemplates['nodeTemplate'].call(this, scope, Object.assign({}, extra, {parentNode: c3, parent: utils.getComponent(context), key: k11})); + scope = _origScope10; } } - scope = _origScope8; + scope = _origScope9; }" `; @@ -1368,7 +1380,7 @@ exports[`t-call (template calling scoped parameters 1`] = ` let c1 = [], p1 = {key:1}; let vn1 = h('div', p1, c1); { - let _origScope2 = scope; + let _origScope3 = scope; scope = Object.assign(Object.create(context), scope); { let c__0 = []; @@ -1376,7 +1388,7 @@ exports[`t-call (template calling scoped parameters 1`] = ` scope[utils.zero] = c__0; } this.subTemplates['_basic-callee'].call(this, scope, Object.assign({}, extra, {parentNode: c1, parent: utils.getComponent(context)})); - scope = _origScope2; + scope = _origScope3; } if (scope.foo != null) { c1.push({text: scope.foo}); @@ -1407,10 +1419,11 @@ exports[`t-call (template calling t-call with t-if 2`] = ` // Template name: \\"sub\\" let h = this.h; let c1 = extra.parentNode; - let c2 = [], p2 = {key:2}; - let vn2 = h('span', p2, c2); - c1.push(vn2); - c2.push({text: \`ok\`}); + let key2 = extra.key || ''; + let c3 = [], p3 = {key:key2}; + let vn3 = h('span', p3, c3); + c1.push(vn3); + c3.push({text: \`ok\`}); }" `; @@ -1441,15 +1454,16 @@ exports[`t-call (template calling t-call with t-set inside and outside 1`] = ` scope.v_value = _4[i1] scope.val = scope['v'].val; { - let _origScope8 = scope; + let _origScope9 = scope; scope = Object.assign(Object.create(context), scope); { let c__0 = []; scope.val3 = scope.val*3; scope[utils.zero] = c__0; } - this.subTemplates['sub'].call(this, scope, Object.assign({}, extra, {parentNode: c1, parent: utils.getComponent(context)})); - scope = _origScope8; + let k10 = \`__10__\${i1}__\`; + this.subTemplates['sub'].call(this, scope, Object.assign({}, extra, {parentNode: c1, parent: utils.getComponent(context), key: k10})); + scope = _origScope9; } } scope = _origScope5; @@ -1487,7 +1501,7 @@ exports[`t-call (template calling t-call, conditional and t-set in t-call body 1 } else if (scope.v1==='elif') { { - let _origScope5 = scope; + let _origScope7 = scope; scope = Object.assign(Object.create(context), scope); { let c__0 = []; @@ -1495,7 +1509,7 @@ exports[`t-call (template calling t-call, conditional and t-set in t-call body 1 scope[utils.zero] = c__0; } this.subTemplates['callee2'].call(this, scope, Object.assign({}, extra, {parentNode: c1, parent: utils.getComponent(context)})); - scope = _origScope5; + scope = _origScope7; } } return vn1; @@ -1525,7 +1539,7 @@ exports[`t-call (template calling with unused body 1`] = ` let result; let h = this.h; { - let _origScope3 = scope; + let _origScope4 = scope; scope = Object.assign(Object.create(context), scope); { let c__0 = []; @@ -1535,7 +1549,7 @@ exports[`t-call (template calling with unused body 1`] = ` result = [] this.subTemplates['_basic-callee'].call(this, scope, Object.assign({}, extra, {parentNode: result, parent: utils.getComponent(context)})); result = result[0] - scope = _origScope3; + scope = _origScope4; } return result; }" @@ -1550,7 +1564,7 @@ exports[`t-call (template calling with unused setbody 1`] = ` let result; let h = this.h; { - let _origScope3 = scope; + let _origScope4 = scope; scope = Object.assign(Object.create(context), scope); { let c__0 = []; @@ -1560,7 +1574,7 @@ exports[`t-call (template calling with unused setbody 1`] = ` result = [] this.subTemplates['_basic-callee'].call(this, scope, Object.assign({}, extra, {parentNode: result, parent: utils.getComponent(context)})); result = result[0] - scope = _origScope3; + scope = _origScope4; } return result; }" @@ -1575,7 +1589,7 @@ exports[`t-call (template calling with used body 1`] = ` let result; let h = this.h; { - let _origScope3 = scope; + let _origScope4 = scope; scope = Object.assign(Object.create(context), scope); { let c__0 = []; @@ -1585,7 +1599,7 @@ exports[`t-call (template calling with used body 1`] = ` result = [] this.subTemplates['_callee-printsbody'].call(this, scope, Object.assign({}, extra, {parentNode: result, parent: utils.getComponent(context)})); result = result[0] - scope = _origScope3; + scope = _origScope4; } return result; }" @@ -1601,7 +1615,7 @@ exports[`t-call (template calling with used set body 1`] = ` let c1 = [], p1 = {key:1}; let vn1 = h('span', p1, c1); { - let _origScope3 = scope; + let _origScope4 = scope; scope = Object.assign(Object.create(context), scope); { let c__0 = []; @@ -1609,7 +1623,7 @@ exports[`t-call (template calling with used set body 1`] = ` scope[utils.zero] = c__0; } this.subTemplates['_callee-uses-foo'].call(this, scope, Object.assign({}, extra, {parentNode: c1, parent: utils.getComponent(context)})); - scope = _origScope3; + scope = _origScope4; } return vn1; }" @@ -1798,18 +1812,18 @@ exports[`t-esc t-esc=0 is escaped 1`] = ` let c1 = [], p1 = {key:1}; let vn1 = h('div', p1, c1); { - let _origScope3 = scope; + let _origScope4 = scope; scope = Object.assign(Object.create(context), scope); { let c__0 = []; - let c4 = [], p4 = {key:4}; - let vn4 = h('p', p4, c4); - c__0.push(vn4); - c4.push({text: \`escaped\`}); + let c5 = [], p5 = {key:5}; + let vn5 = h('p', p5, c5); + c__0.push(vn5); + c5.push({text: \`escaped\`}); scope[utils.zero] = c__0; } this.subTemplates['test'].call(this, scope, Object.assign({}, extra, {parentNode: c1, parent: utils.getComponent(context)})); - scope = _origScope3; + scope = _origScope4; } return vn1; }"