From 3b27d722079f2c9f76f9517176b01e9c2f607343 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Sat, 13 Apr 2024 15:01:55 +0900 Subject: [PATCH 1/7] wip --- packages/react-server/examples/basic/package.json | 1 + .../react-server/examples/basic/src/routes/test/error.tsx | 5 +++++ packages/react-server/examples/basic/vite.config.ts | 2 ++ pnpm-lock.yaml | 3 +++ 4 files changed, 11 insertions(+) diff --git a/packages/react-server/examples/basic/package.json b/packages/react-server/examples/basic/package.json index ca0f3fe0b..7400f03a3 100644 --- a/packages/react-server/examples/basic/package.json +++ b/packages/react-server/examples/basic/package.json @@ -30,6 +30,7 @@ "@hattip/adapter-node": "^0.0.44", "@hiogawa/unocss-preset-antd": "2.2.1-pre.7", "@hiogawa/utils": "^1.6.3", + "@hiogawa/vite-plugin-error-overlay": "latest", "@hiogawa/vite-plugin-ssr-middleware": "latest", "@iconify-json/ri": "^1.1.20", "@playwright/test": "^1.42.1", diff --git a/packages/react-server/examples/basic/src/routes/test/error.tsx b/packages/react-server/examples/basic/src/routes/test/error.tsx index 5702012dc..36b043d48 100644 --- a/packages/react-server/examples/basic/src/routes/test/error.tsx +++ b/packages/react-server/examples/basic/src/routes/test/error.tsx @@ -1,8 +1,13 @@ "use client"; import type { ErrorPageProps } from "@hiogawa/react-server/server"; +import React from "react"; export default function ErrorPage(props: ErrorPageProps) { + React.useEffect(() => { + (async () => { throw props.error; })(); + }, []); + return (

ErrorPage

diff --git a/packages/react-server/examples/basic/vite.config.ts b/packages/react-server/examples/basic/vite.config.ts index d42616e07..ec603df2f 100644 --- a/packages/react-server/examples/basic/vite.config.ts +++ b/packages/react-server/examples/basic/vite.config.ts @@ -4,6 +4,7 @@ import { vitePluginLogger, vitePluginSsrMiddleware, } from "@hiogawa/vite-plugin-ssr-middleware"; +import { vitePluginErrorOverlay } from "@hiogawa/vite-plugin-error-overlay" import react from "@vitejs/plugin-react"; import unocss from "unocss/vite"; import { type Plugin, defineConfig } from "vite"; @@ -13,6 +14,7 @@ export default defineConfig({ plugins: [ react(), unocss(), + vitePluginErrorOverlay(), vitePluginReactServer({ plugins: [ testVitePluginVirtual(), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1ca121a11..76d3970df 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -166,6 +166,9 @@ importers: '@hiogawa/utils': specifier: ^1.6.3 version: 1.6.3 + '@hiogawa/vite-plugin-error-overlay': + specifier: latest + version: link:../../../error-overlay '@hiogawa/vite-plugin-ssr-middleware': specifier: latest version: link:../../../vite-plugin-ssr-middleware From ea5a221627e71ed318616c8fbef37b0d08bf1b37 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Sat, 13 Apr 2024 15:02:42 +0900 Subject: [PATCH 2/7] chore: lint --- .../react-server/examples/basic/src/routes/test/error.tsx | 4 +++- packages/react-server/examples/basic/vite.config.ts | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/react-server/examples/basic/src/routes/test/error.tsx b/packages/react-server/examples/basic/src/routes/test/error.tsx index 36b043d48..1fdc354f0 100644 --- a/packages/react-server/examples/basic/src/routes/test/error.tsx +++ b/packages/react-server/examples/basic/src/routes/test/error.tsx @@ -5,7 +5,9 @@ import React from "react"; export default function ErrorPage(props: ErrorPageProps) { React.useEffect(() => { - (async () => { throw props.error; })(); + (async () => { + throw props.error; + })(); }, []); return ( diff --git a/packages/react-server/examples/basic/vite.config.ts b/packages/react-server/examples/basic/vite.config.ts index ec603df2f..4ca1473e6 100644 --- a/packages/react-server/examples/basic/vite.config.ts +++ b/packages/react-server/examples/basic/vite.config.ts @@ -1,10 +1,10 @@ import path from "node:path"; import { vitePluginReactServer } from "@hiogawa/react-server/plugin"; +import { vitePluginErrorOverlay } from "@hiogawa/vite-plugin-error-overlay"; import { vitePluginLogger, vitePluginSsrMiddleware, } from "@hiogawa/vite-plugin-ssr-middleware"; -import { vitePluginErrorOverlay } from "@hiogawa/vite-plugin-error-overlay" import react from "@vitejs/plugin-react"; import unocss from "unocss/vite"; import { type Plugin, defineConfig } from "vite"; From 8572e1f609c43ebc5a6325155a8c91bec7e98773 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Sat, 13 Apr 2024 15:38:19 +0900 Subject: [PATCH 3/7] feat(error-overlay): collect errors from `console.error` --- packages/error-overlay/src/index.ts | 28 +++++++++++++++---- .../examples/basic/src/routes/test/error.tsx | 2 +- .../examples/basic/vite.config.ts | 4 ++- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/packages/error-overlay/src/index.ts b/packages/error-overlay/src/index.ts index 1ae6fc05c..9ccecd8cc 100644 --- a/packages/error-overlay/src/index.ts +++ b/packages/error-overlay/src/index.ts @@ -3,9 +3,12 @@ import { name as packageName } from "../package.json"; const virtualName = "virtual:runtime-error-overlay"; -export function vitePluginErrorOverlay(options?: { - filter?: (error: Error) => boolean; -}): Plugin { +export function vitePluginErrorOverlay( + options: { + filter?: (error: Error) => boolean; + patchConsoleError?: boolean; + } = {}, +): Plugin { return { name: packageName, apply: "serve", @@ -23,7 +26,7 @@ export function vitePluginErrorOverlay(options?: { }, load(id, _options) { if (id === "\0" + virtualName) { - return `(${clientScriptFn.toString()})()`; + return `(${clientScriptFn.toString()})(${JSON.stringify(options)})`; } return; }, @@ -45,7 +48,7 @@ export function vitePluginErrorOverlay(options?: { }; } -function clientScriptFn() { +function clientScriptFn(options: { patchConsoleError?: boolean }) { if (import.meta.hot) { window.addEventListener("error", (evt) => { sendError(evt.error); @@ -55,6 +58,21 @@ function clientScriptFn() { sendError(evt.reason); }); + // monkey-patch console.error to collect errors handled by error boundaries + // https://github.com/facebook/react/blob/9defcd56bc3cd53ac2901ed93f29218007010434/packages/react-reconciler/src/ReactFiberErrorLogger.js#L24-L31 + // https://github.com/vercel/next.js/blob/904908cf33bda1dfc50d81a19f3fc60c2c20f8da/packages/next/src/client/components/react-dev-overlay/internal/helpers/hydration-error-info.ts#L56 + if (options.patchConsoleError) { + const oldFn = console.error; + console.error = function (...args) { + for (const arg of args) { + if (arg instanceof Error) { + sendError(arg); + } + } + oldFn.apply(this, args); + }; + } + function sendError(e: unknown) { const error = e instanceof Error ? e : new Error("(unknown error)", { cause: e }); diff --git a/packages/react-server/examples/basic/src/routes/test/error.tsx b/packages/react-server/examples/basic/src/routes/test/error.tsx index 1fdc354f0..bddc80268 100644 --- a/packages/react-server/examples/basic/src/routes/test/error.tsx +++ b/packages/react-server/examples/basic/src/routes/test/error.tsx @@ -6,7 +6,7 @@ import React from "react"; export default function ErrorPage(props: ErrorPageProps) { React.useEffect(() => { (async () => { - throw props.error; + // throw props.error; })(); }, []); diff --git a/packages/react-server/examples/basic/vite.config.ts b/packages/react-server/examples/basic/vite.config.ts index 4ca1473e6..e7cfc9037 100644 --- a/packages/react-server/examples/basic/vite.config.ts +++ b/packages/react-server/examples/basic/vite.config.ts @@ -14,7 +14,9 @@ export default defineConfig({ plugins: [ react(), unocss(), - vitePluginErrorOverlay(), + vitePluginErrorOverlay({ + patchConsoleError: true, + }), vitePluginReactServer({ plugins: [ testVitePluginVirtual(), From d13cbcd5b21a3255984c4d709745452087c81e29 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Sat, 13 Apr 2024 15:41:28 +0900 Subject: [PATCH 4/7] chore: revert --- .../react-server/examples/basic/src/routes/test/error.tsx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/packages/react-server/examples/basic/src/routes/test/error.tsx b/packages/react-server/examples/basic/src/routes/test/error.tsx index bddc80268..5702012dc 100644 --- a/packages/react-server/examples/basic/src/routes/test/error.tsx +++ b/packages/react-server/examples/basic/src/routes/test/error.tsx @@ -1,15 +1,8 @@ "use client"; import type { ErrorPageProps } from "@hiogawa/react-server/server"; -import React from "react"; export default function ErrorPage(props: ErrorPageProps) { - React.useEffect(() => { - (async () => { - // throw props.error; - })(); - }, []); - return (

ErrorPage

From 19214b55f27ef4afbb4c7fc4ec72729eebd6debc Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Sat, 13 Apr 2024 15:45:32 +0900 Subject: [PATCH 5/7] ci: not on ci --- packages/react-server/examples/basic/vite.config.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/react-server/examples/basic/vite.config.ts b/packages/react-server/examples/basic/vite.config.ts index e7cfc9037..2c5ae1b08 100644 --- a/packages/react-server/examples/basic/vite.config.ts +++ b/packages/react-server/examples/basic/vite.config.ts @@ -14,9 +14,10 @@ export default defineConfig({ plugins: [ react(), unocss(), - vitePluginErrorOverlay({ - patchConsoleError: true, - }), + !process.env["CI"] && + vitePluginErrorOverlay({ + patchConsoleError: true, + }), vitePluginReactServer({ plugins: [ testVitePluginVirtual(), From d9c167a8f16ca5ea28546f1ef48aa209c6d2b9b5 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Sat, 13 Apr 2024 15:49:05 +0900 Subject: [PATCH 6/7] chore: release --- packages/error-overlay/CHANGELOG.md | 9 +++++++++ packages/error-overlay/package.json | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 packages/error-overlay/CHANGELOG.md diff --git a/packages/error-overlay/CHANGELOG.md b/packages/error-overlay/CHANGELOG.md new file mode 100644 index 000000000..b68d44046 --- /dev/null +++ b/packages/error-overlay/CHANGELOG.md @@ -0,0 +1,9 @@ +# Changelog + +## v0.0.1 + +- feat: collect errors from `console.error` + +## v0.0.0 + +- feat: create `vite-plugin-error-overlay` ([#272](https://github.com/hi-ogawa/vite-plugins/pull/272)) diff --git a/packages/error-overlay/package.json b/packages/error-overlay/package.json index 75dac86cc..bf87334d0 100644 --- a/packages/error-overlay/package.json +++ b/packages/error-overlay/package.json @@ -1,6 +1,6 @@ { "name": "@hiogawa/vite-plugin-error-overlay", - "version": "0.0.0", + "version": "0.0.1", "homepage": "https://github.com/hi-ogawa/vite-plugins/tree/main/packages/error-overlay", "repository": { "type": "git", From 3f7ca089ec9404508cca34b22034b308d640e717 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Sat, 13 Apr 2024 15:52:33 +0900 Subject: [PATCH 7/7] chore: changelog --- packages/error-overlay/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/error-overlay/CHANGELOG.md b/packages/error-overlay/CHANGELOG.md index b68d44046..895d068dc 100644 --- a/packages/error-overlay/CHANGELOG.md +++ b/packages/error-overlay/CHANGELOG.md @@ -2,7 +2,7 @@ ## v0.0.1 -- feat: collect errors from `console.error` +- feat: collect errors from `console.error` ([#273](https://github.com/hi-ogawa/vite-plugins/pull/293)) ## v0.0.0