Skip to content

Commit 48ef3e9

Browse files
committed
prevent effects being created in unowned deriveds
1 parent 7e2740a commit 48ef3e9

File tree

3 files changed

+24
-0
lines changed

3 files changed

+24
-0
lines changed

packages/svelte/messages/client-errors/errors.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020

2121
> `%rune%` cannot be used inside an effect cleanup function
2222
23+
## effect_in_unowned_derived
24+
25+
> Effect cannot be created inside a `$derived` value that was not itself created inside an effect
26+
2327
## effect_orphan
2428

2529
> `%rune%` can only be used inside an effect (e.g. during component initialisation)

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,22 @@ export function effect_in_teardown(rune) {
9292
}
9393
}
9494

95+
/**
96+
* Effect cannot be created inside a `$derived` value that was not itself created inside an effect
97+
* @returns {never}
98+
*/
99+
export function effect_in_unowned_derived() {
100+
if (DEV) {
101+
const error = new Error(`${"effect_in_unowned_derived"}\n${"Effect cannot be created inside a `$derived` value that was not itself created inside an effect"}`);
102+
103+
error.name = 'Svelte error';
104+
throw error;
105+
} else {
106+
// TODO print a link to the documentation
107+
throw new Error("effect_in_unowned_derived");
108+
}
109+
}
110+
95111
/**
96112
* `%rune%` can only be used inside an effect (e.g. during component initialisation)
97113
* @param {string} rune

packages/svelte/src/internal/client/reactivity/effects.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,10 @@ function create_effect(type, fn, sync) {
9393
}
9494

9595
if (current_reaction !== null && !is_root) {
96+
if ((current_reaction.f & (DERIVED | UNOWNED)) === (DERIVED | UNOWNED)) {
97+
e.effect_in_unowned_derived();
98+
}
99+
96100
push_effect(effect, current_reaction);
97101
}
98102

0 commit comments

Comments
 (0)