From ae148be0d15e856bf34a66fc63d1e37d478762aa Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 20 Jul 2025 08:17:42 -0400 Subject: [PATCH] chore: move `capture_signals` to legacy module --- .changeset/swift-cherries-know.md | 5 ++ .../svelte/src/internal/client/dev/tracing.js | 2 +- packages/svelte/src/internal/client/index.js | 2 +- packages/svelte/src/internal/client/legacy.js | 46 ++++++++++++++++ .../svelte/src/internal/client/runtime.js | 54 ++----------------- 5 files changed, 56 insertions(+), 53 deletions(-) create mode 100644 .changeset/swift-cherries-know.md create mode 100644 packages/svelte/src/internal/client/legacy.js diff --git a/.changeset/swift-cherries-know.md b/.changeset/swift-cherries-know.md new file mode 100644 index 0000000000..d8bbb1256a --- /dev/null +++ b/.changeset/swift-cherries-know.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +chore: move `capture_signals` to legacy module diff --git a/packages/svelte/src/internal/client/dev/tracing.js b/packages/svelte/src/internal/client/dev/tracing.js index 1b26c702fb..673a710fac 100644 --- a/packages/svelte/src/internal/client/dev/tracing.js +++ b/packages/svelte/src/internal/client/dev/tracing.js @@ -4,7 +4,7 @@ import { snapshot } from '../../shared/clone.js'; import { define_property } from '../../shared/utils.js'; import { DERIVED, ASYNC, PROXY_PATH_SYMBOL, STATE_SYMBOL } from '#client/constants'; import { effect_tracking } from '../reactivity/effects.js'; -import { active_reaction, captured_signals, set_captured_signals, untrack } from '../runtime.js'; +import { active_reaction, untrack } from '../runtime.js'; /** * @typedef {{ diff --git a/packages/svelte/src/internal/client/index.js b/packages/svelte/src/internal/client/index.js index cddb432a98..90f0f9baac 100644 --- a/packages/svelte/src/internal/client/index.js +++ b/packages/svelte/src/internal/client/index.js @@ -138,11 +138,11 @@ export { mark_store_binding } from './reactivity/store.js'; export { boundary, pending } from './dom/blocks/boundary.js'; +export { invalidate_inner_signals } from './legacy.js'; export { set_text } from './render.js'; export { get, safe_get, - invalidate_inner_signals, tick, untrack, exclude_from_object, diff --git a/packages/svelte/src/internal/client/legacy.js b/packages/svelte/src/internal/client/legacy.js new file mode 100644 index 0000000000..97ad7244c0 --- /dev/null +++ b/packages/svelte/src/internal/client/legacy.js @@ -0,0 +1,46 @@ +/** @import { Value } from '#client' */ +import { internal_set } from './reactivity/sources.js'; +import { untrack } from './runtime.js'; + +/** + * @type {Set | null} + * @deprecated + */ +export let captured_signals = null; + +/** + * Capture an array of all the signals that are read when `fn` is called + * @template T + * @param {() => T} fn + */ +function capture_signals(fn) { + var previous_captured_signals = captured_signals; + + try { + captured_signals = new Set(); + + untrack(fn); + + if (previous_captured_signals !== null) { + for (var signal of captured_signals) { + previous_captured_signals.add(signal); + } + } + + return captured_signals; + } finally { + captured_signals = previous_captured_signals; + } +} + +/** + * Invokes a function and captures all signals that are read during the invocation, + * then invalidates them. + * @param {() => any} fn + * @deprecated + */ +export function invalidate_inner_signals(fn) { + for (var signal of capture_signals(fn)) { + internal_set(signal, signal.v); + } +} diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 3d3c89975c..e86866af2a 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -22,7 +22,7 @@ import { STALE_REACTION, ERROR_VALUE } from './constants.js'; -import { internal_set, old_values } from './reactivity/sources.js'; +import { old_values } from './reactivity/sources.js'; import { destroy_derived_effects, execute_derived, @@ -45,6 +45,7 @@ import * as w from './warnings.js'; import { Batch, batch_deriveds, flushSync, schedule_effect } from './reactivity/batch.js'; import { handle_error } from './error-handling.js'; import { UNINITIALIZED } from '../../constants.js'; +import { captured_signals } from './legacy.js'; export let is_updating_effect = false; @@ -137,14 +138,6 @@ export function set_update_version(value) { // If we are working with a get() chain that has no active container, // to prevent memory leaks, we skip adding the reaction. export let skip_reaction = false; -// Handle collecting all signals which are read during a specific time frame -/** @type {Set | null} */ -export let captured_signals = null; - -/** @param {Set | null} value */ -export function set_captured_signals(value) { - captured_signals = value; -} export function increment_write_version() { return ++write_version; @@ -531,9 +524,7 @@ export function get(signal) { var flags = signal.f; var is_derived = (flags & DERIVED) !== 0; - if (captured_signals !== null) { - captured_signals.add(signal); - } + captured_signals?.add(signal); // Register the dependency on the current reaction signal. if (active_reaction !== null && !untracking) { @@ -713,45 +704,6 @@ export function safe_get(signal) { return signal && get(signal); } -/** - * Capture an array of all the signals that are read when `fn` is called - * @template T - * @param {() => T} fn - */ -function capture_signals(fn) { - var previous_captured_signals = captured_signals; - captured_signals = new Set(); - - var captured = captured_signals; - var signal; - - try { - untrack(fn); - if (previous_captured_signals !== null) { - for (signal of captured_signals) { - previous_captured_signals.add(signal); - } - } - } finally { - captured_signals = previous_captured_signals; - } - - return captured; -} - -/** - * Invokes a function and captures all signals that are read during the invocation, - * then invalidates them. - * @param {() => any} fn - */ -export function invalidate_inner_signals(fn) { - var captured = capture_signals(() => untrack(fn)); - - for (var signal of captured) { - internal_set(signal, signal.v); - } -} - /** * When used inside a [`$derived`](https://svelte.dev/docs/svelte/$derived) or [`$effect`](https://svelte.dev/docs/svelte/$effect), * any state read inside `fn` will not be treated as a dependency.