1
- import { h as vueH , VNode } from "vue" ;
1
+ import {
2
+ ComponentPublicInstance ,
3
+ defineComponent ,
4
+ h as vueH ,
5
+ VNode ,
6
+ } from "vue" ;
2
7
import { ErrorsDef , ErrorStack } from "../error" ;
3
8
4
9
export function createErrorBoundary (
5
10
render : ( ) => VNode ,
6
- renderErrors : ( error : ErrorsDef ) => VNode
11
+ renderErrors : ( error : ErrorsDef ) => VNode ,
7
12
) : VNode {
8
- return vueH ( "div" , null , render ( ) ) ;
9
- // return jsxs(ErrorBoundary, { render, renderErrors });
13
+ return vueH ( ErrorBoundary , { render, renderErrors } ) ;
10
14
}
11
15
16
+ type ErrorBoundary = ComponentPublicInstance < { } , { } , ErrorBoundaryData > ;
17
+ type ErrorBoundaryData = {
18
+ hasError : boolean ;
19
+ errorsDef : ErrorsDef | null ;
20
+ } ;
21
+ const ErrorBoundary = defineComponent < {
22
+ render : ( ) => VNode ;
23
+ renderErrors : ( error : ErrorsDef ) => VNode ;
24
+ } > ( {
25
+ name : "ErrorBoundary" ,
26
+ props : [ "render" , "renderErrors" ] ,
27
+ data : ( ) => ( {
28
+ hasError : false ,
29
+ errorsDef : null as ErrorsDef | null ,
30
+ } as ErrorBoundaryData ) ,
31
+ setup ( { render, renderErrors } ) {
32
+ return ( ctx : ErrorBoundary ) =>
33
+ ctx . $data . hasError && ctx . $data . errorsDef != null
34
+ ? renderErrors ( ctx . $data . errorsDef )
35
+ : render ( ) ;
36
+ } ,
37
+ errorCaptured ( this : ErrorBoundary , err ) {
38
+ console . log ( "ERROR CAPTURED" , err ) ;
39
+ this . $data . hasError = true ;
40
+ this . $data . errorsDef = errorToDef ( err as Error ) ;
41
+ return false ;
42
+ } ,
43
+ } ) ;
44
+
12
45
function errorToDef ( error : Error ) : ErrorsDef {
13
46
const stack : ErrorStack [ ] = ( error . stack ?. split ?.( "\n" ) ?? [ ] )
14
47
. map ( line => {
@@ -25,8 +58,7 @@ function errorToDef(error: Error): ErrorsDef {
25
58
26
59
// Ignore all the internal functions of react and vite
27
60
if (
28
- source . startsWith ( "vite/client" ) ||
29
- source . startsWith ( "react-refresh" ) ||
61
+ source . includes ( "vite/client" ) ||
30
62
name . includes ( "/node_modules/" ) ||
31
63
name . startsWith ( "__require" )
32
64
) {
@@ -56,6 +88,10 @@ function errorToDef(error: Error): ErrorsDef {
56
88
/ ^ ( .+ ) ? (?: t = \d + | v = \w + ) : ( \d + ) : ( \d + ) $ /
57
89
) ?? [ , source , "" , "" ] ;
58
90
91
+ if ( sourceFile . endsWith ( "vue.js?" ) ) {
92
+ return
93
+ }
94
+
59
95
return {
60
96
line : parseInt ( lineN ) ,
61
97
column : parseInt ( columnN ) ,
0 commit comments