{"version":3,"sources":["../../../../../src/next-devtools/userspace/app/errors/use-error-handler.ts"],"sourcesContent":["import { useEffect } from 'react'\nimport { isNextRouterError } from '../../../../client/components/is-next-router-error'\nimport {\n formatConsoleArgs,\n parseConsoleArgs,\n} from '../../../../client/lib/console'\nimport isError from '../../../../lib/is-error'\nimport { createConsoleError } from '../../../shared/console-error'\nimport { coerceError, setOwnerStackIfAvailable } from './stitched-error'\nimport { forwardUnhandledError, logUnhandledRejection } from '../forward-logs'\n\nconst queueMicroTask =\n globalThis.queueMicrotask || ((cb: () => void) => Promise.resolve().then(cb))\n\ntype ErrorHandler = (error: Error) => void\n\nconst errorQueue: Array = []\nconst errorHandlers: Array = []\nconst rejectionQueue: Array = []\nconst rejectionHandlers: Array = []\n\nexport function handleConsoleError(\n originError: unknown,\n consoleErrorArgs: any[]\n) {\n let error: Error\n const { environmentName } = parseConsoleArgs(consoleErrorArgs)\n if (isError(originError)) {\n error = createConsoleError(originError, environmentName)\n } else {\n error = createConsoleError(\n formatConsoleArgs(consoleErrorArgs),\n environmentName\n )\n }\n setOwnerStackIfAvailable(error)\n\n errorQueue.push(error)\n for (const handler of errorHandlers) {\n // Delayed the error being passed to React Dev Overlay,\n // avoid the state being synchronously updated in the component.\n queueMicroTask(() => {\n handler(error)\n })\n }\n}\n\nexport function handleClientError(error: Error) {\n errorQueue.push(error)\n for (const handler of errorHandlers) {\n // Delayed the error being passed to React Dev Overlay,\n // avoid the state being synchronously updated in the component.\n queueMicroTask(() => {\n handler(error)\n })\n }\n}\n\nexport function useErrorHandler(\n handleOnUnhandledError: ErrorHandler,\n handleOnUnhandledRejection: ErrorHandler\n) {\n useEffect(() => {\n // Handle queued errors.\n errorQueue.forEach(handleOnUnhandledError)\n rejectionQueue.forEach(handleOnUnhandledRejection)\n\n // Listen to new errors.\n errorHandlers.push(handleOnUnhandledError)\n rejectionHandlers.push(handleOnUnhandledRejection)\n\n return () => {\n // Remove listeners.\n errorHandlers.splice(errorHandlers.indexOf(handleOnUnhandledError), 1)\n rejectionHandlers.splice(\n rejectionHandlers.indexOf(handleOnUnhandledRejection),\n 1\n )\n\n // Reset error queues.\n errorQueue.splice(0, errorQueue.length)\n rejectionQueue.splice(0, rejectionQueue.length)\n }\n }, [handleOnUnhandledError, handleOnUnhandledRejection])\n}\n\nfunction onUnhandledError(event: WindowEventMap['error']): void | boolean {\n const thrownValue: unknown = event.error\n if (isNextRouterError(thrownValue)) {\n event.preventDefault()\n return false\n }\n // When there's an error property present, we log the error to error overlay.\n // Otherwise we don't do anything as it's not logging in the console either.\n if (thrownValue) {\n const error = coerceError(thrownValue)\n setOwnerStackIfAvailable(error)\n handleClientError(error)\n forwardUnhandledError(error)\n }\n}\n\nfunction onUnhandledRejection(ev: WindowEventMap['unhandledrejection']): void {\n const reason: unknown = ev?.reason\n if (isNextRouterError(reason)) {\n ev.preventDefault()\n return\n }\n\n const error = coerceError(reason)\n setOwnerStackIfAvailable(error)\n\n rejectionQueue.push(error)\n for (const handler of rejectionHandlers) {\n handler(error)\n }\n\n logUnhandledRejection(reason)\n}\n\nexport function handleGlobalErrors() {\n if (typeof window !== 'undefined') {\n try {\n // Increase the number of stack frames on the client\n Error.stackTraceLimit = 50\n } catch {}\n\n window.addEventListener('error', onUnhandledError)\n window.addEventListener('unhandledrejection', onUnhandledRejection)\n }\n}\n"],"names":["handleClientError","handleConsoleError","handleGlobalErrors","useErrorHandler","queueMicroTask","globalThis","queueMicrotask","cb","Promise","resolve","then","errorQueue","errorHandlers","rejectionQueue","rejectionHandlers","originError","consoleErrorArgs","error","environmentName","parseConsoleArgs","isError","createConsoleError","formatConsoleArgs","setOwnerStackIfAvailable","push","handler","handleOnUnhandledError","handleOnUnhandledRejection","useEffect","forEach","splice","indexOf","length","onUnhandledError","event","thrownValue","isNextRouterError","preventDefault","coerceError","forwardUnhandledError","onUnhandledRejection","ev","reason","logUnhandledRejection","window","Error","stackTraceLimit","addEventListener"],"mappings":"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","ignoreList":[0]}