Skip to content

Commit 15eb5b5

Browse files
authored
fix: missing classes after dynamic expressions in class attributes (#11134)
1 parent d5776c3 commit 15eb5b5

File tree

5 files changed

+25
-7
lines changed

5 files changed

+25
-7
lines changed

.changeset/cool-comics-marry.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 missing classes after dynamic expressions in class attribute

packages/svelte/src/compiler/phases/3-transform/server/transform-server.js

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -853,9 +853,7 @@ function serialize_attribute_value(
853853
/** @type {import('estree').Expression[]} */
854854
const expressions = [];
855855

856-
if (attribute_value[0].type !== 'Text') {
857-
quasis.push(b.quasi('', false));
858-
}
856+
quasis.push(b.quasi('', false));
859857

860858
let i = 0;
861859
for (const node of attribute_value) {
@@ -866,17 +864,16 @@ function serialize_attribute_value(
866864
// don't trim, space could be important to separate from expression tag
867865
data = data.replace(regex_whitespaces_strict, ' ');
868866
}
869-
quasis.push(b.quasi(data, i === attribute_value.length));
867+
const last = /** @type {import('estree').TemplateElement} */ (quasis.at(-1));
868+
last.value.raw += data;
870869
} else {
871870
expressions.push(
872871
b.call(
873872
'$.stringify',
874873
/** @type {import('estree').Expression} */ (context.visit(node.expression))
875874
)
876875
);
877-
if (i === attribute_value.length || attribute_value[i]?.type !== 'Text') {
878-
quasis.push(b.quasi('', true));
879-
}
876+
quasis.push(b.quasi('', i + 1 === attribute_value.length));
880877
}
881878
}
882879

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { test } from '../../test';
2+
3+
export default test({});
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<div class="bar baz svelte-m782ot">bar</div>
2+
<div class="foo bar baz svelte-m782ot">bar</div>
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<script>
2+
const dynamic_value = 'bar';
3+
</script>
4+
<div class="{dynamic_value} baz">bar</div>
5+
<div class="foo {dynamic_value} baz">bar</div>
6+
7+
<style>
8+
.baz {
9+
color: red;
10+
}
11+
</style>

0 commit comments

Comments
 (0)