@@ -7,14 +7,16 @@ import { BOUNDARY_EFFECT, EFFECT_RAN } from './constants.js';
7
7
import { define_property , get_descriptor } from '../shared/utils.js' ;
8
8
import { active_effect } from './runtime.js' ;
9
9
10
+ const adjustments = new WeakMap ( ) ;
11
+
10
12
/**
11
13
* @param {unknown } error
12
14
*/
13
15
export function handle_error ( error ) {
14
16
var effect = /** @type {Effect } */ ( active_effect ) ;
15
17
16
- if ( DEV && error instanceof Error ) {
17
- adjust_error ( error , effect ) ;
18
+ if ( DEV && error instanceof Error && ! adjustments . has ( error ) ) {
19
+ adjustments . set ( error , get_adjustments ( error , effect ) ) ;
18
20
}
19
21
20
22
if ( ( effect . f & EFFECT_RAN ) === 0 ) {
@@ -48,21 +50,19 @@ export function invoke_error_boundary(error, effect) {
48
50
effect = effect . parent ;
49
51
}
50
52
53
+ if ( error instanceof Error ) {
54
+ apply_adjustments ( error ) ;
55
+ }
56
+
51
57
throw error ;
52
58
}
53
59
54
- /** @type {WeakSet<Error> } */
55
- const adjusted_errors = new WeakSet ( ) ;
56
-
57
60
/**
58
61
* Add useful information to the error message/stack in development
59
62
* @param {Error } error
60
63
* @param {Effect } effect
61
64
*/
62
- function adjust_error ( error , effect ) {
63
- if ( adjusted_errors . has ( error ) ) return ;
64
- adjusted_errors . add ( error ) ;
65
-
65
+ function get_adjustments ( error , effect ) {
66
66
const message_descriptor = get_descriptor ( error , 'message' ) ;
67
67
68
68
// if the message was already changed and it's not configurable we can't change it
@@ -78,17 +78,28 @@ function adjust_error(error, effect) {
78
78
context = context . p ;
79
79
}
80
80
81
- define_property ( error , 'message' , {
82
- value : error . message + `\n${ component_stack } \n`
83
- } ) ;
81
+ return {
82
+ message : error . message + `\n${ component_stack } \n` ,
83
+ stack : error . stack
84
+ ?. split ( '\n' )
85
+ . filter ( ( line ) => ! line . includes ( 'svelte/src/internal' ) )
86
+ . join ( '\n' )
87
+ } ;
88
+ }
89
+
90
+ /**
91
+ * @param {Error } error
92
+ */
93
+ function apply_adjustments ( error ) {
94
+ const adjusted = adjustments . get ( error ) ;
95
+
96
+ if ( adjusted ) {
97
+ define_property ( error , 'message' , {
98
+ value : adjusted . message
99
+ } ) ;
84
100
85
- if ( error . stack ) {
86
- // Filter out internal modules
87
101
define_property ( error , 'stack' , {
88
- value : error . stack
89
- . split ( '\n' )
90
- . filter ( ( line ) => ! line . includes ( 'svelte/src/internal' ) )
91
- . join ( '\n' )
102
+ value : adjusted . stack
92
103
} ) ;
93
104
}
94
105
}
0 commit comments