mirror of
https://github.com/odoo/owl.git
synced 2025-10-06 19:59:41 +07:00
[FIX] compiler: handle t-set as functions
This commit is contained in:
committed by
Aaron Bohy
parent
75ad0835e9
commit
5bf47500d5
@@ -145,16 +145,19 @@ exports[`basics t-set with a body expression can be passed in props, and then t-
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
let { isBoundary, withDefault } = helpers;
|
||||
let { isBoundary, withDefault, LazyValue } = helpers;
|
||||
|
||||
let block1 = createBlock(\`<div><block-child-0/></div>\`);
|
||||
let block2 = createBlock(\`<p>43</p>\`);
|
||||
|
||||
function value1(ctx, node, key = \\"\\") {
|
||||
return block2();
|
||||
}
|
||||
|
||||
return function template(ctx, node, key = \\"\\") {
|
||||
ctx = Object.create(ctx);
|
||||
ctx[isBoundary] = 1
|
||||
let b2 = block2();
|
||||
ctx[\`abc\`] = b2;
|
||||
ctx[\`abc\`] = new LazyValue(value1, ctx, node);
|
||||
let b3 = component(\`Child\`, {val: ctx['abc']}, key + \`__1\`, node, ctx);
|
||||
return block1([], [b3]);
|
||||
}
|
||||
|
||||
@@ -47,6 +47,150 @@ exports[`t-set slot setted value (with t-set) not accessible with t-esc 2`] = `
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`t-set slots with a t-set with a component in body 1`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
let { capture, isBoundary, withDefault, LazyValue, safeOutput } = helpers;
|
||||
|
||||
function slot1(ctx, node, key = \\"\\") {
|
||||
ctx = Object.create(ctx);
|
||||
ctx[isBoundary] = 1
|
||||
ctx[\`v\`] = new LazyValue(value1, ctx, node);
|
||||
let b3 = text(\` in slot \`);
|
||||
let b4 = safeOutput(ctx['v']);
|
||||
return multi([b3, b4]);
|
||||
}
|
||||
|
||||
function value1(ctx, node, key = \\"\\") {
|
||||
return component(\`C\`, {}, key + \`__1\`, node, ctx);
|
||||
}
|
||||
|
||||
return function template(ctx, node, key = \\"\\") {
|
||||
const ctx1 = capture(ctx);
|
||||
return component(\`Child\`, {slots: {'default': {__render: slot1, __ctx: ctx1}}}, key + \`__2\`, node, ctx);
|
||||
}
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`t-set slots with a t-set with a component in body 2`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
let { callSlot } = helpers;
|
||||
|
||||
return function template(ctx, node, key = \\"\\") {
|
||||
let b2 = text(\`Child \`);
|
||||
let b3 = callSlot(ctx, node, key, 'default', false, {});
|
||||
return multi([b2, b3]);
|
||||
}
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`t-set slots with a t-set with a component in body 3`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
|
||||
return function template(ctx, node, key = \\"\\") {
|
||||
return text(\`C\`);
|
||||
}
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`t-set slots with an t-set with a component in body 1`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
let { capture, isBoundary, withDefault, LazyValue, safeOutput } = helpers;
|
||||
|
||||
let block4 = createBlock(\`<div>coffee</div>\`);
|
||||
|
||||
function slot1(ctx, node, key = \\"\\") {
|
||||
ctx = Object.create(ctx);
|
||||
ctx[isBoundary] = 1
|
||||
ctx[\`v\`] = new LazyValue(value1, ctx, node);
|
||||
let b5 = text(\` tea \`);
|
||||
let b6 = safeOutput(ctx['v']);
|
||||
return multi([b5, b6]);
|
||||
}
|
||||
|
||||
function value1(ctx, node, key = \\"\\") {
|
||||
let b3 = component(\`Child\`, {}, key + \`__1\`, node, ctx);
|
||||
let b4 = block4();
|
||||
return multi([b3, b4]);
|
||||
}
|
||||
|
||||
return function template(ctx, node, key = \\"\\") {
|
||||
const ctx1 = capture(ctx);
|
||||
return component(\`Blorg\`, {slots: {'default': {__render: slot1, __ctx: ctx1}}}, key + \`__2\`, node, ctx);
|
||||
}
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`t-set slots with an t-set with a component in body 2`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
let { callSlot } = helpers;
|
||||
|
||||
return function template(ctx, node, key = \\"\\") {
|
||||
let b2 = text(\`Blorg \`);
|
||||
let b3 = callSlot(ctx, node, key, 'default', false, {});
|
||||
return multi([b2, b3]);
|
||||
}
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`t-set slots with an t-set with a component in body 3`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
|
||||
return function template(ctx, node, key = \\"\\") {
|
||||
return text(\`Child\`);
|
||||
}
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`t-set slots with an unused t-set with a component in body 1`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
let { capture, isBoundary, withDefault, LazyValue } = helpers;
|
||||
|
||||
function slot1(ctx, node, key = \\"\\") {
|
||||
ctx = Object.create(ctx);
|
||||
ctx[isBoundary] = 1
|
||||
ctx[\`v\`] = new LazyValue(value1, ctx, node);
|
||||
return text(\` in slot \`);
|
||||
}
|
||||
|
||||
function value1(ctx, node, key = \\"\\") {
|
||||
return component(\`Child\`, {}, key + \`__1\`, node, ctx);
|
||||
}
|
||||
|
||||
return function template(ctx, node, key = \\"\\") {
|
||||
const ctx1 = capture(ctx);
|
||||
return component(\`Child\`, {slots: {'default': {__render: slot1, __ctx: ctx1}}}, key + \`__2\`, node, ctx);
|
||||
}
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`t-set slots with an unused t-set with a component in body 2`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
let { callSlot } = helpers;
|
||||
|
||||
return function template(ctx, node, key = \\"\\") {
|
||||
let b2 = text(\`Child \`);
|
||||
let b3 = callSlot(ctx, node, key, 'default', false, {});
|
||||
return multi([b2, b3]);
|
||||
}
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`t-set t-set can't alter component even if key in component 1`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
@@ -174,3 +318,59 @@ exports[`t-set t-set outside modified in t-if 1`] = `
|
||||
}
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`t-set t-set with a component in body 1`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
let { isBoundary, withDefault, LazyValue, safeOutput } = helpers;
|
||||
|
||||
let block1 = createBlock(\`<div><div><block-child-0/></div></div>\`);
|
||||
|
||||
function value1(ctx, node, key = \\"\\") {
|
||||
return component(\`Child\`, {}, key + \`__1\`, node, ctx);
|
||||
}
|
||||
|
||||
return function template(ctx, node, key = \\"\\") {
|
||||
ctx = Object.create(ctx);
|
||||
ctx[isBoundary] = 1
|
||||
ctx[\`v\`] = new LazyValue(value1, ctx, node);
|
||||
let b3 = safeOutput(ctx['v']);
|
||||
return block1([], [b3]);
|
||||
}
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`t-set t-set with a component in body 2`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
|
||||
return function template(ctx, node, key = \\"\\") {
|
||||
return text(\`Child\`);
|
||||
}
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`t-set t-set with something in body 1`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
let { isBoundary, withDefault, LazyValue, safeOutput } = helpers;
|
||||
|
||||
let block1 = createBlock(\`<div><div><block-child-0/></div></div>\`);
|
||||
let block2 = createBlock(\`<p>coucou</p>\`);
|
||||
|
||||
function value1(ctx, node, key = \\"\\") {
|
||||
return block2();
|
||||
}
|
||||
|
||||
return function template(ctx, node, key = \\"\\") {
|
||||
ctx = Object.create(ctx);
|
||||
ctx[isBoundary] = 1
|
||||
ctx[\`v\`] = new LazyValue(value1, ctx, node);
|
||||
let b3 = safeOutput(ctx['v']);
|
||||
return block1([], [b3]);
|
||||
}
|
||||
}"
|
||||
`;
|
||||
|
||||
@@ -156,4 +156,113 @@ describe("t-set", () => {
|
||||
expect(fixture.innerHTML).toBe("<div><p>source</p><div>childcalled</div><p>source</p></div>");
|
||||
expect((child as any).iter).toBe("child");
|
||||
});
|
||||
|
||||
test("t-set with something in body", async () => {
|
||||
class Comp extends Component {
|
||||
static template = xml`
|
||||
<div>
|
||||
<t t-set="v">
|
||||
<p>coucou</p>
|
||||
</t>
|
||||
<div><t t-out="v"/></div>
|
||||
</div>`;
|
||||
}
|
||||
|
||||
await mount(Comp, fixture);
|
||||
|
||||
expect(fixture.innerHTML).toBe("<div><div><p>coucou</p></div></div>");
|
||||
});
|
||||
|
||||
test("t-set with a component in body", async () => {
|
||||
class Child extends Component {
|
||||
static template = xml`Child`;
|
||||
}
|
||||
|
||||
class Comp extends Component {
|
||||
static template = xml`
|
||||
<div>
|
||||
<t t-set="v">
|
||||
<Child/>
|
||||
</t>
|
||||
<div><t t-out="v"/></div>
|
||||
</div>`;
|
||||
static components = { Child };
|
||||
}
|
||||
|
||||
await mount(Comp, fixture);
|
||||
|
||||
expect(fixture.innerHTML).toBe("<div><div>Child</div></div>");
|
||||
});
|
||||
|
||||
test("slots with an unused t-set with a component in body", async () => {
|
||||
class Child extends Component {
|
||||
static template = xml`Child <t t-slot="default"/>`;
|
||||
}
|
||||
|
||||
class Comp extends Component {
|
||||
static template = xml`
|
||||
<Child>
|
||||
<t t-set="v">
|
||||
<Child/>
|
||||
</t>
|
||||
in slot
|
||||
</Child>`;
|
||||
static components = { Child };
|
||||
}
|
||||
|
||||
await mount(Comp, fixture);
|
||||
|
||||
expect(fixture.innerHTML).toBe("Child in slot ");
|
||||
});
|
||||
|
||||
test("slots with a t-set with a component in body", async () => {
|
||||
class C extends Component {
|
||||
static template = xml`C`;
|
||||
}
|
||||
class Child extends Component {
|
||||
static template = xml`Child <t t-slot="default"/>`;
|
||||
}
|
||||
|
||||
class Comp extends Component {
|
||||
static template = xml`
|
||||
<Child>
|
||||
<t t-set="v">
|
||||
<C/>
|
||||
</t>
|
||||
in slot
|
||||
<t t-out="v" />
|
||||
</Child>`;
|
||||
static components = { Child, C };
|
||||
}
|
||||
|
||||
await mount(Comp, fixture);
|
||||
|
||||
expect(fixture.innerHTML).toBe("Child in slot C");
|
||||
});
|
||||
|
||||
test("slots with an t-set with a component in body", async () => {
|
||||
class Child extends Component {
|
||||
static template = xml`Child`;
|
||||
}
|
||||
class Blorg extends Component {
|
||||
static template = xml`Blorg <t t-slot="default"/>`;
|
||||
}
|
||||
|
||||
class Comp extends Component {
|
||||
static template = xml`
|
||||
<Blorg>
|
||||
<t t-set="v">
|
||||
<Child/>
|
||||
<div>coffee</div>
|
||||
</t>
|
||||
tea
|
||||
<t t-out="v"/>
|
||||
</Blorg>`;
|
||||
static components = { Child, Blorg };
|
||||
}
|
||||
|
||||
await mount(Comp, fixture);
|
||||
|
||||
expect(fixture.innerHTML).toBe("Blorg tea Child<div>coffee</div>");
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user