Skip to content

Commit 4d0794a

Browse files
committed
fix: avoid shadowing a variable in dynamic components
1 parent 931f211 commit 4d0794a

File tree

5 files changed

+31
-3
lines changed

5 files changed

+31
-3
lines changed

.changeset/short-mails-know.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: avoid shadowing a variable in dynamic components

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ import { build_component } from './shared/component.js';
1010
export function Component(node, context) {
1111
const component = build_component(
1212
node,
13-
// if it's not dynamic we will just use the node name, if it is dynamic we will use the node name
14-
// only if it's a valid identifier, otherwise we will use a default name
15-
!node.metadata.dynamic || regex_is_valid_identifier.test(node.name) ? node.name : '$$component',
13+
// avoid shadowing the component variable by a variable used in $.component
14+
node.metadata.dynamic
15+
? '$$component_' + node.name.replaceAll(/[^a-zA-Z_$0-9]/g, '_')
16+
: node.name,
1617
context
1718
);
1819
context.state.init.push(component);
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<script>
2+
const { children } = $props()
3+
</script>
4+
5+
{@render children()}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { test } from '../../test';
2+
import { flushSync } from 'svelte';
3+
4+
export default test({
5+
async test({ assert, target }) {
6+
assert.htmlEqual(target.innerHTML, 'test');
7+
}
8+
});
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<script>
2+
import A from './A.svelte';
3+
4+
const B = $derived(A);
5+
</script>
6+
7+
<B>
8+
<B>test</B>
9+
</B>

0 commit comments

Comments
 (0)