Skip to content

Commit 8f152de

Browse files
committed
fix: falsy attachments on components
1 parent b8d1513 commit 8f152de

File tree

7 files changed

+43
-2
lines changed

7 files changed

+43
-2
lines changed

.changeset/fuzzy-taxis-hunt.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: falsy attachments on components

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,10 @@ export function build_component(node, component_name, context, anchor = context.
261261
let expression = /** @type {Expression} */ (context.visit(attribute.expression));
262262

263263
if (attribute.metadata.expression.has_state) {
264-
expression = b.arrow([b.id('$$node')], b.call(expression, b.id('$$node')));
264+
expression = b.arrow(
265+
[b.id('$$node')],
266+
b.call(b.call('$.safe_call', expression), b.id('$$node'))
267+
);
265268
}
266269

267270
push_prop(b.prop('get', b.call('$.attachment'), expression, true));

packages/svelte/src/internal/client/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ export {
155155
} from './dom/operations.js';
156156
export { attr, clsx } from '../shared/attributes.js';
157157
export { snapshot } from '../shared/clone.js';
158-
export { noop, fallback, to_array } from '../shared/utils.js';
158+
export { noop, fallback, safe_call, to_array } from '../shared/utils.js';
159159
export {
160160
invalid_default_snippet,
161161
validate_dynamic_element_tag,

packages/svelte/src/internal/shared/utils.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,16 @@ export function fallback(value, fallback, lazy = false) {
8282
: value;
8383
}
8484

85+
/**
86+
* @param {*} value
87+
*/
88+
export function safe_call(value) {
89+
if (is_function(value)) {
90+
return value;
91+
}
92+
return noop;
93+
}
94+
8595
/**
8696
* When encountering a situation like `let [a, b, c] = $derived(blah())`,
8797
* we need to stash an intermediate value that `a`, `b`, and `c` derive
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<script>
2+
let props = $props();
3+
</script>
4+
5+
<div {...props}></div>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { test } from '../../test';
2+
3+
export default test({
4+
test() {}
5+
});
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<script>
2+
import Child from './Child.svelte';
3+
4+
function attachment(){
5+
console.log("up");
6+
}
7+
8+
let enabled = $state(false);
9+
</script>
10+
11+
<button onclick={() => enabled = !enabled}></button>
12+
13+
<Child {@attach enabled && attachment} />

0 commit comments

Comments
 (0)