From 2af595b31e08ace4e025db86de004f9a249e50ca Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Thu, 30 Apr 2026 12:28:13 +0200 Subject: [PATCH] chore: replace custom `window` management with `globalThis` Co-authored-by: Copilot --- packages/svelte/src/compiler/types/index.d.ts | 2 +- .../internal/client/custom-renderer/state.js | 3 - .../src/internal/client/dom/operations.js | 14 +--- .../src/internal/client/dom/template.js | 67 +++++++++---------- .../svelte/src/internal/disclose-version.js | 2 +- packages/svelte/types/index.d.ts | 4 +- 6 files changed, 36 insertions(+), 56 deletions(-) diff --git a/packages/svelte/src/compiler/types/index.d.ts b/packages/svelte/src/compiler/types/index.d.ts index 1164e05066..2813c782a9 100644 --- a/packages/svelte/src/compiler/types/index.d.ts +++ b/packages/svelte/src/compiler/types/index.d.ts @@ -148,7 +148,7 @@ export interface CompileOptions extends ModuleCompileOptions { */ runes?: boolean | undefined | ((options: { filename: string }) => boolean | undefined); /** - * If `true`, exposes the Svelte major version in the browser by adding it to a `Set` stored in the global `window.__svelte.v`. + * If `true`, exposes the Svelte major version in the browser by adding it to a `Set` stored in the global `globalThis.__svelte.v`. * * @default true */ diff --git a/packages/svelte/src/internal/client/custom-renderer/state.js b/packages/svelte/src/internal/client/custom-renderer/state.js index 6c8555b0a1..202885ab79 100644 --- a/packages/svelte/src/internal/client/custom-renderer/state.js +++ b/packages/svelte/src/internal/client/custom-renderer/state.js @@ -7,9 +7,6 @@ */ export let current_renderer = null; -// allow for a "window" for each custom renderer...to use with `$props.id` -export let custom_renderer_window_map = new WeakMap(); - /** * @param {Renderer | null} value */ diff --git a/packages/svelte/src/internal/client/dom/operations.js b/packages/svelte/src/internal/client/dom/operations.js index 42caf652b7..48b071568f 100644 --- a/packages/svelte/src/internal/client/dom/operations.js +++ b/packages/svelte/src/internal/client/dom/operations.js @@ -13,7 +13,7 @@ import { } from '#client/constants'; import { eager_block_effects } from '../reactivity/batch.js'; import { NAMESPACE_HTML } from '../../../constants.js'; -import { custom_renderer_window_map, current_renderer } from '../custom-renderer/state.js'; +import { current_renderer } from '../custom-renderer/state.js'; // export these for reference in the compiled code, making global name deduplication unnecessary /** @type {Window} */ @@ -794,15 +794,3 @@ export function class_list_toggle(element, name, force) { } element.classList.toggle(name, force); } - -export function get_window() { - if (current_renderer) { - var custom_renderer_window = custom_renderer_window_map.get(current_renderer); - if (!custom_renderer_window) { - custom_renderer_window = {}; - custom_renderer_window_map.set(current_renderer, custom_renderer_window); - } - return custom_renderer_window; - } - return window; -} diff --git a/packages/svelte/src/internal/client/dom/template.js b/packages/svelte/src/internal/client/dom/template.js index 8e5a25a1d9..13a74d8603 100644 --- a/packages/svelte/src/internal/client/dom/template.js +++ b/packages/svelte/src/internal/client/dom/template.js @@ -1,30 +1,12 @@ /** @import { Effect, EffectNodes, TemplateNode } from '#client' */ /** @import { TemplateStructure } from './types' */ -import { hydrate_next, hydrate_node, hydrating, set_hydrate_node } from './hydration.js'; import { - create_text, - get_first_child, - get_next_sibling, - is_firefox, - create_element, - create_fragment, - create_comment, - set_attribute, - merge_text_nodes, - get_last_child, - import_node, - clone_node, - append_child, - insert_before, - set_text_content, - replace_with, - node_type, - get_node_value, - node_name, - get_window -} from './operations.js'; -import { create_fragment_from_html } from './reconciler.js'; -import { active_effect } from '../runtime.js'; + COMMENT_NODE, + DOCUMENT_FRAGMENT_NODE, + IS_XHTML, + REACTION_RAN, + TEXT_NODE +} from '#client/constants'; import { NAMESPACE_MATHML, NAMESPACE_SVG, @@ -33,14 +15,30 @@ import { TEMPLATE_USE_MATHML, TEMPLATE_USE_SVG } from '../../../constants.js'; -import { - COMMENT_NODE, - DOCUMENT_FRAGMENT_NODE, - IS_XHTML, - REACTION_RAN, - TEXT_NODE -} from '#client/constants'; import { current_renderer } from '../custom-renderer/state.js'; +import { active_effect } from '../runtime.js'; +import { hydrate_next, hydrate_node, hydrating, set_hydrate_node } from './hydration.js'; +import { + append_child, + clone_node, + create_comment, + create_element, + create_fragment, + create_text, + get_first_child, + get_last_child, + get_node_value, + import_node, + insert_before, + is_firefox, + merge_text_nodes, + node_name, + node_type, + replace_with, + set_attribute, + set_text_content +} from './operations.js'; +import { create_fragment_from_html } from './reconciler.js'; const TEMPLATE_TAG = IS_XHTML ? 'template' : 'TEMPLATE'; const SCRIPT_TAG = IS_XHTML ? 'script' : 'SCRIPT'; @@ -418,10 +416,7 @@ export function props_id() { return id; } - let window = get_window(); - - // This way we ensure the id is unique even across Svelte runtimes - (window.__svelte ??= {}).uid ??= 1; + /**@type {*}*/ (globalThis.__svelte ??= {}).uid ??= 1; - return `c${window.__svelte.uid++}`; + return `c${/**@type {*}*/ (globalThis.__svelte).uid++}`; } diff --git a/packages/svelte/src/internal/disclose-version.js b/packages/svelte/src/internal/disclose-version.js index 86c3482b5d..d51d82c89b 100644 --- a/packages/svelte/src/internal/disclose-version.js +++ b/packages/svelte/src/internal/disclose-version.js @@ -2,5 +2,5 @@ import { PUBLIC_VERSION } from '../version.js'; if (typeof window !== 'undefined') { // @ts-expect-error - ((window.__svelte ??= {}).v ??= new Set()).add(PUBLIC_VERSION); + ((globalThis.__svelte ??= {}).v ??= new Set()).add(PUBLIC_VERSION); } diff --git a/packages/svelte/types/index.d.ts b/packages/svelte/types/index.d.ts index 2cd78cbc54..9c2e2ba2b9 100644 --- a/packages/svelte/types/index.d.ts +++ b/packages/svelte/types/index.d.ts @@ -1105,7 +1105,7 @@ declare module 'svelte/compiler' { */ runes?: boolean | undefined | ((options: { filename: string }) => boolean | undefined); /** - * If `true`, exposes the Svelte major version in the browser by adding it to a `Set` stored in the global `window.__svelte.v`. + * If `true`, exposes the Svelte major version in the browser by adding it to a `Set` stored in the global `globalThis.__svelte.v`. * * @default true */ @@ -3398,7 +3398,7 @@ declare module 'svelte/types/compiler/interfaces' { */ runes?: boolean | undefined | ((options: { filename: string }) => boolean | undefined); /** - * If `true`, exposes the Svelte major version in the browser by adding it to a `Set` stored in the global `window.__svelte.v`. + * If `true`, exposes the Svelte major version in the browser by adding it to a `Set` stored in the global `globalThis.__svelte.v`. * * @default true */