From 113a3daab2a2742127a5857b76d1314deb260e03 Mon Sep 17 00:00:00 2001 From: Paolo Ricciuti Date: Sat, 14 Jun 2025 17:14:39 +0200 Subject: [PATCH] fix: don't define `error.message` if it's not configurable (#16149) * fix: don't define `error.message` if it's not configurable * fix: print console.error with updated stack * fix: revert second `console.error` --- .changeset/unlucky-plants-jump.md | 5 +++++ packages/svelte/src/internal/client/error-handling.js | 8 +++++++- .../samples/non-configurable-errors/_config.js | 8 ++++++++ .../samples/non-configurable-errors/main.svelte | 11 +++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 .changeset/unlucky-plants-jump.md create mode 100644 packages/svelte/tests/runtime-runes/samples/non-configurable-errors/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/non-configurable-errors/main.svelte diff --git a/.changeset/unlucky-plants-jump.md b/.changeset/unlucky-plants-jump.md new file mode 100644 index 0000000000..814cb99b69 --- /dev/null +++ b/.changeset/unlucky-plants-jump.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: don't define `error.message` if it's not configurable diff --git a/packages/svelte/src/internal/client/error-handling.js b/packages/svelte/src/internal/client/error-handling.js index aeec1d8b47..99f3ed6cd4 100644 --- a/packages/svelte/src/internal/client/error-handling.js +++ b/packages/svelte/src/internal/client/error-handling.js @@ -3,7 +3,7 @@ import { DEV } from 'esm-env'; import { FILENAME } from '../../constants.js'; import { is_firefox } from './dom/operations.js'; import { BOUNDARY_EFFECT, EFFECT_RAN } from './constants.js'; -import { define_property } from '../shared/utils.js'; +import { define_property, get_descriptor } from '../shared/utils.js'; import { active_effect } from './runtime.js'; /** @@ -63,6 +63,12 @@ function adjust_error(error, effect) { if (adjusted_errors.has(error)) return; adjusted_errors.add(error); + const message_descriptor = get_descriptor(error, 'message'); + + // if the message was already changed and it's not configurable we can't change it + // or it will throw a different error swallowing the original error + if (message_descriptor && !message_descriptor.configurable) return; + var indent = is_firefox ? ' ' : '\t'; var component_stack = `\n${indent}in ${effect.fn?.name || ''}`; var context = effect.ctx; diff --git a/packages/svelte/tests/runtime-runes/samples/non-configurable-errors/_config.js b/packages/svelte/tests/runtime-runes/samples/non-configurable-errors/_config.js new file mode 100644 index 0000000000..5bbe4483d3 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/non-configurable-errors/_config.js @@ -0,0 +1,8 @@ +import { test } from '../../test'; + +export default test({ + compileOptions: { + dev: true + }, + error: 'test' +}); diff --git a/packages/svelte/tests/runtime-runes/samples/non-configurable-errors/main.svelte b/packages/svelte/tests/runtime-runes/samples/non-configurable-errors/main.svelte new file mode 100644 index 0000000000..f71a5e6c43 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/non-configurable-errors/main.svelte @@ -0,0 +1,11 @@ +