| | import React, { useCallback, useMemo } from 'react' |
| | import stripAnsi from 'next/dist/compiled/strip-ansi' |
| | import { Terminal } from '../components/terminal' |
| | import { ErrorOverlayLayout } from '../components/errors/error-overlay-layout/error-overlay-layout' |
| | import type { ErrorBaseProps } from '../components/errors/error-overlay/error-overlay' |
| |
|
| | interface BuildErrorProps extends ErrorBaseProps { |
| | message: string |
| | } |
| |
|
| | const getErrorTextFromBuildErrorMessage = (multiLineMessage: string) => { |
| | const lines = multiLineMessage.split('\n') |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | return ( |
| | stripAnsi(lines[1] || '') |
| | |
| | .replace(/^Error: /, '') |
| | ) |
| | } |
| |
|
| | export const BuildError: React.FC<BuildErrorProps> = function BuildError({ |
| | message, |
| | ...props |
| | }) { |
| | const noop = useCallback(() => {}, []) |
| | const error = new Error(message) |
| | const formattedMessage = useMemo( |
| | () => getErrorTextFromBuildErrorMessage(message) || 'Failed to compile', |
| | [message] |
| | ) |
| |
|
| | const generateErrorInfo = useCallback(() => { |
| | const parts: string[] = [] |
| |
|
| | |
| | parts.push(`## Error Type\nBuild Error`) |
| |
|
| | |
| | if (formattedMessage) { |
| | parts.push(`## Error Message\n${formattedMessage}`) |
| | } |
| |
|
| | |
| | if (message) { |
| | const decodedOutput = stripAnsi(message) |
| | parts.push(`## Build Output\n${decodedOutput}`) |
| | } |
| |
|
| | |
| | const errorInfo = `${parts.join('\n\n')} |
| | |
| | Next.js version: ${props.versionInfo.installed} (${process.env.__NEXT_BUNDLER})\n` |
| |
|
| | return errorInfo |
| | }, [message, formattedMessage, props.versionInfo]) |
| |
|
| | return ( |
| | <ErrorOverlayLayout |
| | errorType="Build Error" |
| | errorMessage={formattedMessage} |
| | onClose={noop} |
| | error={error} |
| | generateErrorInfo={generateErrorInfo} |
| | {...props} |
| | > |
| | <Terminal content={message} /> |
| | </ErrorOverlayLayout> |
| | ) |
| | } |
| |
|
| | export const styles = `` |
| |
|