Skip to content

Commit 8eccbfd

Browse files
author
Soc Sieng
committed
fix: preserve property case for custom elements
Fixes sveltejs#5184
1 parent fb8bab8 commit 8eccbfd

File tree

3 files changed

+12
-8
lines changed

3 files changed

+12
-8
lines changed

src/compiler/compile/render_dom/wrappers/Element/Attribute.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,12 @@ export default class AttributeWrapper extends BaseAttributeWrapper {
8282
const element = this.parent;
8383
const { name, property_name, should_cache, is_indirectly_bound_value } = this;
8484

85+
const is_custom_element = /-/.test(element.node.name);
86+
8587
// xlink is a special case... we could maybe extend this to generic
8688
// namespaced attributes but I'm not sure that's applicable in
8789
// HTML5?
88-
const method = /-/.test(element.node.name)
90+
const method = is_custom_element
8991
? '@set_custom_element_data'
9092
: name.slice(0, 6) === 'xlink:'
9193
? '@xlink_attr'
@@ -130,10 +132,12 @@ export default class AttributeWrapper extends BaseAttributeWrapper {
130132
? b`@prop_dev(${element.var}, "${property_name}", ${should_cache ? this.last : value});`
131133
: b`${element.var}.${property_name} = ${should_cache ? this.last : value};`;
132134
} else {
135+
// use this.node.name when the element is a custom element to preserve property case-sensitivity
136+
const custom_element_aware_name = is_custom_element ? this.node.name : name;
133137
block.chunks.hydrate.push(
134-
b`${method}(${element.var}, "${name}", ${init});`
138+
b`${method}(${element.var}, "${custom_element_aware_name}", ${init});`
135139
);
136-
updater = b`${method}(${element.var}, "${name}", ${should_cache ? this.last : value});`;
140+
updater = b`${method}(${element.var}, "${custom_element_aware_name}", ${should_cache ? this.last : value});`;
137141
}
138142

139143
if (is_indirectly_bound_value) {
@@ -387,4 +391,4 @@ function is_indirectly_bound_value(attribute: AttributeWrapper) {
387391
(binding) =>
388392
/checked|group/.test(binding.name)
389393
)));
390-
}
394+
}

test/custom-elements/samples/props/main.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@
66
export let items = ['a', 'b', 'c'];
77
</script>
88

9-
<my-widget class="foo" {items}/>
9+
<my-widget class="foo" widgetItems={items}/>
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<svelte:options tag="my-widget"/>
22

33
<script>
4-
export let items = [];
4+
export let widgetItems = [];
55
</script>
66

7-
<p>{items.length} items</p>
8-
<p>{items.join(', ')}</p>
7+
<p>{widgetItems.length} items</p>
8+
<p>{widgetItems.join(', ')}</p>

0 commit comments

Comments
 (0)