UNPKG

next

Version:

The React Framework

79 lines (78 loc) 4.13 kB
import { formatIssue, isRelevantWarning } from '../shared/lib/turbopack/utils'; export function formatWarningsHeader(count) { return `Turbopack build encountered ${count} ${count === 1 ? 'warning' : 'warnings'}:`; } /** * Processes and reports build issues from Turbopack entrypoints. * * @param entrypoints - The result object containing build issues to process. * @param isDev - A flag indicating if the build is running in development mode. * @param opts.deferWarnings - When true, warnings are returned instead of * printed so the caller can print them later. * @return The formatted warnings when `deferWarnings` is set and nothing threw. * @throws {Error} If a fatal issue is encountered, this function throws an error. In development mode, we only throw on * 'fatal' and 'bug' issues. In production mode, we also throw on 'error' issues. */ export function printBuildErrors(entrypoints, isDev, opts) { // Issues that we want to stop the server from executing const topLevelFatalIssues = []; // Issues that are true errors, but we believe we can keep running and allow the user to address the issue const topLevelErrors = []; // Issues that are warnings but should not affect the running of the build const topLevelWarnings = []; // Track seen formatted error messages to avoid duplicates const seenFatalIssues = new Set(); const seenErrors = new Set(); const seenWarnings = new Set(); for (const issue of entrypoints.issues){ // We only want to completely shut down the server if (issue.severity === 'fatal' || issue.severity === 'bug') { const formatted = formatIssue(issue); if (!seenFatalIssues.has(formatted)) { seenFatalIssues.add(formatted); topLevelFatalIssues.push(formatted); } } else if (isRelevantWarning(issue)) { const formatted = formatIssue(issue); if (!seenWarnings.has(formatted)) { seenWarnings.add(formatted); topLevelWarnings.push(formatted); } } else if (issue.severity === 'error') { const formatted = formatIssue(issue); if (isDev) { // We want to treat errors as recoverable in development // so that we can show the errors in the site and allow users // to respond to the errors when necessary. In production builds // though we want to error out and stop the build process. if (!seenErrors.has(formatted)) { seenErrors.add(formatted); topLevelErrors.push(formatted); } } else { if (!seenFatalIssues.has(formatted)) { seenFatalIssues.add(formatted); topLevelFatalIssues.push(formatted); } } } } // TODO: print in order by source location so issues from the same file are displayed together and then add a summary at the end about the number of warnings/errors const deferWarnings = ((opts == null ? void 0 : opts.deferWarnings) ?? false) && topLevelFatalIssues.length === 0; if (topLevelWarnings.length > 0 && !deferWarnings) { console.warn(`${formatWarningsHeader(topLevelWarnings.length)}\n${topLevelWarnings.join('\n')}`); } if (topLevelErrors.length > 0) { console.error(`Turbopack build encountered ${topLevelErrors.length} ${topLevelErrors.length === 1 ? 'error' : 'errors'}:\n${topLevelErrors.join('\n')}`); } if (topLevelFatalIssues.length > 0) { throw Object.defineProperty(new Error(`Turbopack build failed with ${topLevelFatalIssues.length} ${topLevelFatalIssues.length === 1 ? 'error' : 'errors'}:\n${topLevelFatalIssues.join('\n')}`), "__NEXT_ERROR_CODE", { value: "E1366", enumerable: false, configurable: true }); } return { warnings: deferWarnings ? topLevelWarnings : [] }; } //# sourceMappingURL=print-build-errors.js.map