Skip to content

Commit b6afb8b

Browse files
committed
feat(showcase/vue): Add error boundary
1 parent 7b2bd7b commit b6afb8b

File tree

1 file changed

+42
-6
lines changed

1 file changed

+42
-6
lines changed

js/showcase/src/vue/ErrorBoundary.ts

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,47 @@
1-
import { h as vueH, VNode } from "vue";
1+
import {
2+
ComponentPublicInstance,
3+
defineComponent,
4+
h as vueH,
5+
VNode,
6+
} from "vue";
27
import { ErrorsDef, ErrorStack } from "../error";
38

49
export function createErrorBoundary(
510
render: () => VNode,
6-
renderErrors: (error: ErrorsDef) => VNode
11+
renderErrors: (error: ErrorsDef) => VNode,
712
): VNode {
8-
return vueH("div", null, render());
9-
// return jsxs(ErrorBoundary, { render, renderErrors });
13+
return vueH(ErrorBoundary, { render, renderErrors });
1014
}
1115

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+
1245
function errorToDef(error: Error): ErrorsDef {
1346
const stack: ErrorStack[] = (error.stack?.split?.("\n") ?? [])
1447
.map(line => {
@@ -25,8 +58,7 @@ function errorToDef(error: Error): ErrorsDef {
2558

2659
// Ignore all the internal functions of react and vite
2760
if (
28-
source.startsWith("vite/client") ||
29-
source.startsWith("react-refresh") ||
61+
source.includes("vite/client") ||
3062
name.includes("/node_modules/") ||
3163
name.startsWith("__require")
3264
) {
@@ -56,6 +88,10 @@ function errorToDef(error: Error): ErrorsDef {
5688
/^(.+)?(?:t=\d+|v=\w+):(\d+):(\d+)$/
5789
) ?? [, source, "", ""];
5890

91+
if (sourceFile.endsWith("vue.js?")) {
92+
return
93+
}
94+
5995
return {
6096
line: parseInt(lineN),
6197
column: parseInt(columnN),

0 commit comments

Comments
 (0)