From 0edbee4550e85b933e9bd2ba3c5511ef6fbf7304 Mon Sep 17 00:00:00 2001 From: Andrew Seguin Date: Tue, 9 Dec 2025 15:13:34 -0700 Subject: [PATCH] fix(core): explicitly cast signal node value to String If the computed's `toString` is called and `node.value` is a Symbol, the browser will throw an exception `ERROR TypeError: Cannot convert a Symbol value to a string` Symbols cannot be implicitly changed to strings. This change changes the conversion to be explicit by wrapping `node.value` with `String()` This can be reproduced if you create a computed with `createComputed(computation, equal)` and call `toString()` while `node.value` is something like `Symbol(UNSET)` (cherry picked from commit e2a9938c517b1e0429818e285ef70b69bf61181b) --- packages/core/primitives/signals/src/computed.ts | 2 +- packages/core/primitives/signals/src/linked_signal.ts | 2 +- packages/core/primitives/signals/src/signal.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/primitives/signals/src/computed.ts b/packages/core/primitives/signals/src/computed.ts index cc033839803..b6d5ceb7f42 100644 --- a/packages/core/primitives/signals/src/computed.ts +++ b/packages/core/primitives/signals/src/computed.ts @@ -84,7 +84,7 @@ export function createComputed( (computed as ComputedGetter)[SIGNAL] = node; if (typeof ngDevMode !== 'undefined' && ngDevMode) { const debugName = node.debugName ? ' (' + node.debugName + ')' : ''; - computed.toString = () => `[Computed${debugName}: ${node.value}]`; + computed.toString = () => `[Computed${debugName}: ${String(node.value)}]`; } runPostProducerCreatedFn(node); diff --git a/packages/core/primitives/signals/src/linked_signal.ts b/packages/core/primitives/signals/src/linked_signal.ts index 7e107b52c32..d3fa39e06c7 100644 --- a/packages/core/primitives/signals/src/linked_signal.ts +++ b/packages/core/primitives/signals/src/linked_signal.ts @@ -94,7 +94,7 @@ export function createLinkedSignal( getter[SIGNAL] = node; if (typeof ngDevMode !== 'undefined' && ngDevMode) { const debugName = node.debugName ? ' (' + node.debugName + ')' : ''; - getter.toString = () => `[LinkedSignal${debugName}: ${node.value}]`; + getter.toString = () => `[LinkedSignal${debugName}: ${String(node.value)}]`; } runPostProducerCreatedFn(node); diff --git a/packages/core/primitives/signals/src/signal.ts b/packages/core/primitives/signals/src/signal.ts index cb10dddfa61..d8ab44d44c2 100644 --- a/packages/core/primitives/signals/src/signal.ts +++ b/packages/core/primitives/signals/src/signal.ts @@ -63,7 +63,7 @@ export function createSignal( (getter as any)[SIGNAL] = node; if (typeof ngDevMode !== 'undefined' && ngDevMode) { const debugName = node.debugName ? ' (' + node.debugName + ')' : ''; - getter.toString = () => `[Signal${debugName}: ${node.value}]`; + getter.toString = () => `[Signal${debugName}: ${String(node.value)}]`; } runPostProducerCreatedFn(node);