diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/CallExpression.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/CallExpression.js index 9b6337b9ed..25cff4bfe0 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/CallExpression.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/CallExpression.js @@ -150,6 +150,7 @@ export function CallExpression(node, context) { break; + case '$effect.active': case '$effect.tracking': if (node.arguments.length !== 0) { e.rune_invalid_arguments(node, rune); diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/CallExpression.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/CallExpression.js index 3e2f1414e6..746c051e3f 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/CallExpression.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/CallExpression.js @@ -17,6 +17,9 @@ export function CallExpression(node, context) { case '$host': return b.id('$$props.$$host'); + case '$effect.active': + return b.call('$.effect_active'); + case '$effect.tracking': return b.call('$.effect_tracking'); diff --git a/packages/svelte/src/compiler/phases/3-transform/server/visitors/CallExpression.js b/packages/svelte/src/compiler/phases/3-transform/server/visitors/CallExpression.js index 41d3202ce9..64d4f573c5 100644 --- a/packages/svelte/src/compiler/phases/3-transform/server/visitors/CallExpression.js +++ b/packages/svelte/src/compiler/phases/3-transform/server/visitors/CallExpression.js @@ -16,7 +16,7 @@ export function CallExpression(node, context) { return b.void0; } - if (rune === '$effect.tracking') { + if (rune === '$effect.tracking' || rune === '$effect.active') { return b.false; } diff --git a/packages/svelte/src/internal/client/index.js b/packages/svelte/src/internal/client/index.js index cddb432a98..a186cdd86b 100644 --- a/packages/svelte/src/internal/client/index.js +++ b/packages/svelte/src/internal/client/index.js @@ -107,6 +107,7 @@ export { } from './reactivity/deriveds.js'; export { aborted, + effect_active, effect_tracking, effect_root, legacy_pre_effect, diff --git a/packages/svelte/src/internal/client/reactivity/effects.js b/packages/svelte/src/internal/client/reactivity/effects.js index c4edd2bf8d..ccc2d9c9ec 100644 --- a/packages/svelte/src/internal/client/reactivity/effects.js +++ b/packages/svelte/src/internal/client/reactivity/effects.js @@ -165,6 +165,20 @@ export function effect_tracking() { return active_reaction !== null && !untracking; } +/** + * Internal representation of `$effect.active()` + * @returns {boolean} + */ +export function effect_active() { + if (active_reaction === null && active_effect === null) { + return false; + } + if (is_destroying_effect) { + return false; + } + return true; +} + /** * @param {() => void} fn */ diff --git a/packages/svelte/src/utils.js b/packages/svelte/src/utils.js index cd79cfc274..f49382921a 100644 --- a/packages/svelte/src/utils.js +++ b/packages/svelte/src/utils.js @@ -442,6 +442,7 @@ const RUNES = /** @type {const} */ ([ '$props.id', '$bindable', '$effect', + '$effect.active', '$effect.pre', '$effect.tracking', '$effect.root',