Skip to content

Commit 346eb46

Browse files
author
Alfred Ringstad
committed
Make server side rendering of Dynamic Elements work similar to the client side version
1 parent d0d9dff commit 346eb46

File tree

2 files changed

+47
-36
lines changed

2 files changed

+47
-36
lines changed

src/compiler/compile/render_ssr/handlers/DynamicElement.ts

Lines changed: 20 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { is_void } from '../../../utils/names';
21
import {
32
get_attribute_value,
43
get_class_attribute_value
@@ -11,6 +10,7 @@ import ElementHandler from './Element';
1110
import { x } from 'code-red';
1211
import Expression from '../../nodes/shared/Expression';
1312
import remove_whitespace_children from './utils/remove_whitespace_children';
13+
import Element from '../../nodes/Element';
1414

1515
export default function (
1616
node: DynamicElement,
@@ -19,19 +19,20 @@ export default function (
1919
slot_scopes: Map<any, any>;
2020
}
2121
) {
22-
if (typeof node.tag.node === 'string') {
23-
node.name = node.tag.node;
24-
ElementHandler(node as any, renderer, options);
22+
const dependencies = node.tag.dynamic_dependencies();
23+
24+
if (dependencies.length === 0) {
25+
((node as unknown) as Element).dynamic_tag = node.tag;
26+
ElementHandler((node as unknown) as Element, renderer, options);
2527
} else {
2628
const children = remove_whitespace_children(node.children, node.next);
2729

2830
// awkward special case
2931
let node_contents;
3032

31-
const contenteditable =
32-
node.name !== 'textarea' &&
33-
node.name !== 'input' &&
34-
node.attributes.some((attribute) => attribute.name === 'contenteditable');
33+
const contenteditable = node.attributes.some(
34+
(attribute) => attribute.name === 'contenteditable'
35+
);
3536

3637
const slot = node.get_static_attribute_value('slot');
3738
const nearest_inline_component = node.find_nearest(/InlineComponent/);
@@ -63,9 +64,7 @@ export default function (
6364
args.push(attribute.expression.node);
6465
} else {
6566
const name = attribute.name.toLowerCase();
66-
if (name === 'value' && node.name.toLowerCase() === 'textarea') {
67-
node_contents = get_attribute_value(attribute);
68-
} else if (attribute.is_true) {
67+
if (attribute.is_true) {
6968
args.push(x`{ ${attribute.name}: true }`);
7069
} else if (
7170
boolean_attributes.has(name) &&
@@ -91,9 +90,7 @@ export default function (
9190
let add_class_attribute = !!class_expression;
9291
node.attributes.forEach((attribute) => {
9392
const name = attribute.name.toLowerCase();
94-
if (name === 'value' && node.name.toLowerCase() === 'textarea') {
95-
node_contents = get_attribute_value(attribute);
96-
} else if (attribute.is_true) {
93+
if (attribute.is_true) {
9794
renderer.add_string(` ${attribute.name}`);
9895
} else if (
9996
boolean_attributes.has(name) &&
@@ -160,9 +157,6 @@ export default function (
160157

161158
// TODO where was this used?
162159
// value = name === 'textContent' ? x`@escape($$value)` : x`$$value`;
163-
} else if (binding.name === 'value' && node.name === 'textarea') {
164-
const snippet = expression.node;
165-
node_contents = x`${snippet} || ""`;
166160
} else {
167161
const snippet = expression.node;
168162
renderer.add_expression(x`@add_attribute("${name}", ${snippet}, 1)`);
@@ -188,19 +182,15 @@ export default function (
188182
renderer.add_expression(node_contents);
189183
}
190184

191-
if (!is_void(node.name)) {
192-
renderer.add_string('</');
193-
renderer.add_expression(node.tag.node);
194-
renderer.add_string('>');
195-
}
185+
renderer.add_string('</');
186+
renderer.add_expression(node.tag.node);
187+
renderer.add_string('>');
196188
} else if (slot && nearest_inline_component) {
197189
renderer.render(children, options);
198190

199-
if (!is_void(node.name)) {
200-
renderer.add_string('</');
201-
renderer.add_expression(node.tag.node);
202-
renderer.add_string('>');
203-
}
191+
renderer.add_string('</');
192+
renderer.add_expression(node.tag.node);
193+
renderer.add_string('>');
204194

205195
const lets = node.lets;
206196
const seen = new Set(lets.map((l) => l.name.name));
@@ -216,11 +206,9 @@ export default function (
216206
} else {
217207
renderer.render(children, options);
218208

219-
if (!is_void(node.name)) {
220-
renderer.add_string('</');
221-
renderer.add_expression(node.tag.node);
222-
renderer.add_string('>');
223-
}
209+
renderer.add_string('</');
210+
renderer.add_expression(node.tag.node);
211+
renderer.add_string('>');
224212
}
225213
}
226214
}

src/compiler/compile/render_ssr/handlers/Element.ts

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,12 @@ export default function(node: Element, renderer: Renderer, options: RenderOption
3030
renderer.push();
3131
}
3232

33-
renderer.add_string(`<${node.name}`);
33+
if (node.dynamic_tag) {
34+
renderer.add_string('<');
35+
renderer.add_expression(node.dynamic_tag.node);
36+
} else {
37+
renderer.add_string(`<${node.name}`);
38+
}
3439

3540
const class_expression_list = node.classes.map(class_directive => {
3641
const { expression, name } = class_directive;
@@ -146,13 +151,25 @@ export default function(node: Element, renderer: Renderer, options: RenderOption
146151
}
147152

148153
if (!is_void(node.name)) {
149-
renderer.add_string(`</${node.name}>`);
154+
if (node.dynamic_tag) {
155+
renderer.add_string('</');
156+
renderer.add_expression(node.dynamic_tag.node);
157+
renderer.add_string('>');
158+
} else {
159+
renderer.add_string(`</${node.name}>`);
160+
}
150161
}
151162
} else if (slot && nearest_inline_component) {
152163
renderer.render(children, options);
153164

154165
if (!is_void(node.name)) {
155-
renderer.add_string(`</${node.name}>`);
166+
if (node.dynamic_tag) {
167+
renderer.add_string('</');
168+
renderer.add_expression(node.dynamic_tag.node);
169+
renderer.add_string('>');
170+
} else {
171+
renderer.add_string(`</${node.name}>`);
172+
}
156173
}
157174

158175
const lets = node.lets;
@@ -170,7 +187,13 @@ export default function(node: Element, renderer: Renderer, options: RenderOption
170187
renderer.render(children, options);
171188

172189
if (!is_void(node.name)) {
173-
renderer.add_string(`</${node.name}>`);
190+
if (node.dynamic_tag) {
191+
renderer.add_string('</');
192+
renderer.add_expression(node.dynamic_tag.node);
193+
renderer.add_string('>');
194+
} else {
195+
renderer.add_string(`</${node.name}>`);
196+
}
174197
}
175198
}
176199
}

0 commit comments

Comments
 (0)