| import { bold, cyan, red, yellow } from '../../../../lib/picocolors' | |
| import { SimpleWebpackError } from './simpleWebpackError' | |
| const regexScssError = | |
| /SassError: (.+)\n\s+on line (\d+) [\s\S]*?>> (.+)\n\s*(-+)\^$/m | |
| export function getScssError( | |
| fileName: string, | |
| fileContent: string | null, | |
| err: Error | |
| ): SimpleWebpackError | false { | |
| if (err.name !== 'SassError') { | |
| return false | |
| } | |
| const res = regexScssError.exec(err.message) | |
| if (res) { | |
| const [, reason, _lineNumer, backupFrame, columnString] = res | |
| const lineNumber = Math.max(1, parseInt(_lineNumer, 10)) | |
| const column = columnString?.length ?? 1 | |
| let frame: string | undefined | |
| if (fileContent) { | |
| try { | |
| const { codeFrameColumns } = | |
| require('next/dist/compiled/babel/code-frame') as typeof import('next/dist/compiled/babel/code-frame') | |
| frame = codeFrameColumns( | |
| fileContent, | |
| { start: { line: lineNumber, column } }, | |
| { forceColor: true } | |
| ) as string | |
| } catch {} | |
| } | |
| return new SimpleWebpackError( | |
| `${cyan(fileName)}:${yellow(lineNumber.toString())}:${yellow( | |
| column.toString() | |
| )}`, | |
| red(bold('Syntax error')).concat(`: ${reason}\n\n${frame ?? backupFrame}`) | |
| ) | |
| } | |
| return false | |
| } | |