Skip to content

Commit 768251e

Browse files
committed
feat: add $effect.active rune
1 parent 88a15cd commit 768251e

File tree

15 files changed

+79
-26
lines changed

15 files changed

+79
-26
lines changed

.changeset/eighty-hairs-remain.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': minor
3+
---
4+
5+
feat: add $effect.active rune

packages/svelte/src/compiler/phases/2-analyze/visitors/CallExpression.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ export function CallExpression(node, context) {
109109

110110
break;
111111

112+
case '$effect.active':
112113
case '$effect.tracking':
113114
if (node.arguments.length !== 0) {
114115
e.rune_invalid_arguments(node, rune);

packages/svelte/src/compiler/phases/2-analyze/visitors/Identifier.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,6 @@ export function Identifier(node, context) {
5353
parent = /** @type {Expression} */ (context.path[--i]);
5454

5555
if (!is_rune(name)) {
56-
if (name === '$effect.active') {
57-
e.rune_renamed(parent, '$effect.active', '$effect.tracking');
58-
}
59-
6056
if (name === '$state.frozen') {
6157
e.rune_renamed(parent, '$state.frozen', '$state.raw');
6258
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ export function CallExpression(node, context) {
1717
case '$effect.tracking':
1818
return b.call('$.effect_tracking');
1919

20+
case '$effect.active':
21+
return b.call('$.effect_active');
22+
2023
case '$state.snapshot':
2124
return b.call(
2225
'$.snapshot',

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export function VariableDeclaration(node, context) {
2525
if (
2626
!rune ||
2727
rune === '$effect.tracking' ||
28+
rune === '$effect.active' ||
2829
rune === '$effect.root' ||
2930
rune === '$inspect' ||
3031
rune === '$inspect.trace' ||

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export function CallExpression(node, context) {
1616
return b.id('undefined');
1717
}
1818

19-
if (rune === '$effect.tracking') {
19+
if (rune === '$effect.tracking' || rune === '$effect.active') {
2020
return b.literal(false);
2121
}
2222

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,13 @@ export function VariableDeclaration(node, context) {
1919
for (const declarator of node.declarations) {
2020
const init = declarator.init;
2121
const rune = get_rune(init, context.state.scope);
22-
if (!rune || rune === '$effect.tracking' || rune === '$inspect' || rune === '$effect.root') {
22+
if (
23+
!rune ||
24+
rune === '$effect.tracking' ||
25+
rune === '$effect.active' ||
26+
rune === '$inspect' ||
27+
rune === '$effect.root'
28+
) {
2329
declarations.push(/** @type {VariableDeclarator} */ (context.visit(declarator)));
2430
continue;
2531
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ export {
100100
export { derived, derived_safe_equal } from './reactivity/deriveds.js';
101101
export {
102102
effect_tracking,
103+
effect_active,
103104
effect_root,
104105
legacy_pre_effect,
105106
legacy_pre_effect_reset,

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,14 @@ export function effect_tracking() {
173173
return !skip_reaction;
174174
}
175175

176+
/**
177+
* Internal representation of `$effect.active()`
178+
* @returns {boolean}
179+
*/
180+
export function effect_active() {
181+
return active_effect !== null;
182+
}
183+
176184
/**
177185
* @param {() => void} fn
178186
*/

packages/svelte/src/utils.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,7 @@ const RUNES = /** @type {const} */ ([
428428
'$effect',
429429
'$effect.pre',
430430
'$effect.tracking',
431+
'$effect.active',
431432
'$effect.root',
432433
'$inspect',
433434
'$inspect().with',

0 commit comments

Comments
 (0)