diff --git a/packages/react-native/src/private/webapis/structuredClone/__tests__/structuredClone-itest.js b/packages/react-native/src/private/webapis/structuredClone/__tests__/structuredClone-itest.js index 402e055048d..fcaddc8fff7 100644 --- a/packages/react-native/src/private/webapis/structuredClone/__tests__/structuredClone-itest.js +++ b/packages/react-native/src/private/webapis/structuredClone/__tests__/structuredClone-itest.js @@ -226,22 +226,30 @@ describe('structuredClone', () => { // Valid error names value.name = 'Error'; expect(structuredClone(value).name).toBe('Error'); + expect(structuredClone(value)).toBeInstanceOf(Error); value.name = 'EvalError'; expect(structuredClone(value).name).toBe('EvalError'); + expect(structuredClone(value)).toBeInstanceOf(EvalError); value.name = 'RangeError'; expect(structuredClone(value).name).toBe('RangeError'); + expect(structuredClone(value)).toBeInstanceOf(RangeError); value.name = 'ReferenceError'; expect(structuredClone(value).name).toBe('ReferenceError'); + expect(structuredClone(value)).toBeInstanceOf(ReferenceError); value.name = 'SyntaxError'; expect(structuredClone(value).name).toBe('SyntaxError'); + expect(structuredClone(value)).toBeInstanceOf(SyntaxError); value.name = 'TypeError'; expect(structuredClone(value).name).toBe('TypeError'); + expect(structuredClone(value)).toBeInstanceOf(TypeError); value.name = 'URIError'; expect(structuredClone(value).name).toBe('URIError'); + expect(structuredClone(value)).toBeInstanceOf(URIError); // Invalid error names value.name = 'FooError'; expect(structuredClone(value).name).toBe('Error'); + expect(structuredClone(value)).toBeInstanceOf(Error); }); it('clones values deeply', () => { diff --git a/packages/react-native/src/private/webapis/structuredClone/structuredClone.js b/packages/react-native/src/private/webapis/structuredClone/structuredClone.js index 89a7f90725b..a1c6298ea7c 100644 --- a/packages/react-native/src/private/webapis/structuredClone/structuredClone.js +++ b/packages/react-native/src/private/webapis/structuredClone/structuredClone.js @@ -14,14 +14,14 @@ import { isPlatformObject, } from '../webidl/PlatformObjects'; -const VALID_ERROR_NAMES = new Set([ - 'Error', - 'EvalError', - 'RangeError', - 'ReferenceError', - 'SyntaxError', - 'TypeError', - 'URIError', +const ERROR_CONSTRUCTORS: Map> = new Map([ + ['Error', Error], + ['EvalError', EvalError], + ['RangeError', RangeError], + ['ReferenceError', ReferenceError], + ['SyntaxError', SyntaxError], + ['TypeError', TypeError], + ['URIError', URIError], ]); const BASIC_CONSTRUCTORS = [Number, String, Boolean, Date]; @@ -149,17 +149,12 @@ function structuredCloneInternal(value: T): T { } if (value instanceof Error) { + const ErrorConstructor = ERROR_CONSTRUCTORS.get(value.name) ?? Error; const result = value.cause - ? new Error(value.message, {cause: value.cause}) - : new Error(value.message); + ? new ErrorConstructor(value.message, {cause: value.cause}) + : new ErrorConstructor(value.message); memory.set(value, result); - if (VALID_ERROR_NAMES.has(value.name)) { - result.name = value.name; - } else { - result.name = 'Error'; - } - result.stack = value.stack; // $FlowExpectedError[incompatible-type] we know result is T