Skip to content

Commit 98dde7f

Browse files
committed
feat: throw when using both a template and a renderer
1 parent 70e820c commit 98dde7f

File tree

3 files changed

+46
-7
lines changed

3 files changed

+46
-7
lines changed

packages/vaadin-template-renderer/src/vaadin-template-renderer.js

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,34 +14,52 @@ function createRenderer(component, template, TemplatizerClass = Templatizer) {
1414
};
1515

1616
template.__templatizer = templatizer;
17+
renderer.__templatized = true;
1718

1819
return renderer;
1920
}
2021

22+
function assignRenderer(component, rendererName, renderer) {
23+
const oldRenderer = component[rendererName];
24+
25+
if (oldRenderer && !oldRenderer.__templatized) {
26+
const tag = component.localName;
27+
28+
throw new Error(`Cannot use both a template and a renderer for <${tag} />.`);
29+
}
30+
31+
component[rendererName] = renderer;
32+
}
33+
2134
function processGridTemplate(grid, template) {
2235
if (template.matches('.row-details')) {
23-
grid.rowDetailsRenderer = createRenderer(grid, template, GridTemplatizer);
36+
const renderer = createRenderer(grid, template, GridTemplatizer);
37+
assignRenderer(grid, 'rowDetailsRenderer', renderer);
2438
return;
2539
}
2640
}
2741

2842
function processGridColumnTemplate(column, template) {
2943
if (template.matches('.header')) {
30-
column.headerRenderer = createRenderer(column, template);
44+
const renderer = createRenderer(column, template);
45+
assignRenderer(column, 'headerRenderer', renderer);
3146
return;
3247
}
3348

3449
if (template.matches('.footer')) {
35-
column.footerRenderer = createRenderer(column, template);
50+
const renderer = createRenderer(column, template);
51+
assignRenderer(column, 'footerRenderer', renderer);
3652
return;
3753
}
3854

3955
if (template.matches('.editor')) {
40-
column.editModeRenderer = createRenderer(column, template, GridTemplatizer);
56+
const renderer = createRenderer(column, template, GridTemplatizer);
57+
assignRenderer(column, 'editModeRenderer', renderer);
4158
return;
4259
}
4360

44-
column.renderer = createRenderer(column, template, GridTemplatizer);
61+
const renderer = createRenderer(column, template, GridTemplatizer);
62+
assignRenderer(column, 'renderer', renderer);
4563
}
4664

4765
function processTemplate(component, template) {
@@ -55,7 +73,8 @@ function processTemplate(component, template) {
5573
return;
5674
}
5775

58-
component.renderer = createRenderer(component, template);
76+
const renderer = createRenderer(component, template);
77+
assignRenderer(component, 'renderer', renderer);
5978
}
6079

6180
function processTemplates(component) {

packages/vaadin-template-renderer/test/fixtures/mock-component.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ export class MockComponent extends HTMLElement {
66
}
77

88
connectedCallback() {
9-
window.Vaadin.templateRendererCallback?.(this);
9+
if (this.getAttribute('disable-template-renderer-callback') === null) {
10+
window.Vaadin.templateRendererCallback(this);
11+
}
1012
}
1113

1214
get $() {
@@ -20,6 +22,10 @@ export class MockComponent extends HTMLElement {
2022
this.render();
2123
}
2224

25+
get renderer() {
26+
return this.__renderer;
27+
}
28+
2329
render() {
2430
this.__renderer?.(this.$.content);
2531
}

packages/vaadin-template-renderer/test/vaadin-template-renderer.test.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,20 @@ describe('vaadin-template-renderer', () => {
7171
});
7272
});
7373

74+
it('should throw when using both a template and a renderer', () => {
75+
const component = fixtureSync(`
76+
<mock-component disable-template-renderer-callback>
77+
<template>foo</template>
78+
</mock-component>
79+
`);
80+
81+
component.renderer = () => {};
82+
83+
expect(() => window.Vaadin.templateRendererCallback(component)).to.throw(
84+
/^Cannot use both a template and a renderer for <mock-component \/>\.$/
85+
);
86+
});
87+
7488
it('should not process non-child templates', () => {
7589
const component = fixtureSync(`
7690
<mock-component>

0 commit comments

Comments
 (0)