Skip to content

Commit 8fb2fb7

Browse files
authored
fix : bug "$0 is not defined" with svelte:element and a single class with a function call (#15396)
* add spread to test * fix #15386 * fix #15392 * test * changeset * use is_text_attribute
1 parent cf56973 commit 8fb2fb7

File tree

4 files changed

+88
-2
lines changed

4 files changed

+88
-2
lines changed

.changeset/two-dragons-camp.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix : bug "$0 is not defined" on svelte:element with a function call on class

packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteElement.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,10 @@ export function SvelteElement(node, context) {
8383
if (
8484
attributes.length === 1 &&
8585
attributes[0].type === 'Attribute' &&
86-
attributes[0].name.toLowerCase() === 'class'
86+
attributes[0].name.toLowerCase() === 'class' &&
87+
is_text_attribute(attributes[0])
8788
) {
88-
// special case when there only a class attribute
89+
// special case when there only a class attribute, without call expression
8990
let { value, has_state } = build_attribute_value(
9091
attributes[0].value,
9192
context,
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import { flushSync } from 'svelte';
2+
import { ok, test } from '../../test';
3+
4+
export default test({
5+
html: `
6+
<div></div>
7+
<div class="red svelte-p153w3"></div>
8+
<div></div>
9+
<div class="red svelte-p153w3"></div>
10+
<div class="blue svelte-p153w3"></div>
11+
<div class="blue svelte-p153w3"></div>
12+
`,
13+
14+
async test({ assert, target, component }) {
15+
component.active = true;
16+
flushSync();
17+
18+
assert.htmlEqual(
19+
target.innerHTML,
20+
`
21+
<div></div>
22+
<div class="red svelte-p153w3"></div>
23+
<div class="active"></div>
24+
<div class="red svelte-p153w3 active"></div>
25+
<div class="blue svelte-p153w3"></div>
26+
<div class="blue svelte-p153w3 active"></div>
27+
`
28+
);
29+
30+
component.tag = 'span';
31+
flushSync();
32+
33+
assert.htmlEqual(
34+
target.innerHTML,
35+
`
36+
<span></span>
37+
<span class="red svelte-p153w3"></span>
38+
<span class="active"></span>
39+
<span class="red svelte-p153w3 active"></span>
40+
<span class="blue svelte-p153w3"></span>
41+
<span class="blue svelte-p153w3 active"></span>
42+
`
43+
);
44+
45+
component.active = false;
46+
flushSync();
47+
48+
assert.htmlEqual(
49+
target.innerHTML,
50+
`
51+
<span></span>
52+
<span class="red svelte-p153w3"></span>
53+
<span class=""></span>
54+
<span class="red svelte-p153w3"></span>
55+
<span class="blue svelte-p153w3"></span>
56+
<span class="blue svelte-p153w3"></span>
57+
`
58+
);
59+
}
60+
});
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<script>
2+
let { tag = "div", active = false } = $props();
3+
4+
function cn(classname) {
5+
return classname;
6+
}
7+
</script>
8+
9+
<svelte:element this={tag}></svelte:element>
10+
<svelte:element this={tag} class="red"></svelte:element>
11+
<svelte:element this={tag} class:active={active}></svelte:element>
12+
<svelte:element this={tag} class="red" class:active={active}></svelte:element>
13+
<svelte:element this={tag} class={cn("blue")}></svelte:element>
14+
<svelte:element this={tag} class={cn("blue")} class:active={active}></svelte:element>
15+
16+
<style>
17+
.red {
18+
color: red;
19+
}
20+
</style>

0 commit comments

Comments
 (0)