From fb406ce4c0fe6da3333c9d1c00477b2880d46352 Mon Sep 17 00:00:00 2001 From: Alec Larson <1925840+aleclarson@users.noreply.github.com> Date: Wed, 4 Aug 2021 13:08:54 -0400 Subject: [PATCH] feat: add `logger.hasErrorLogged(error)` method (#3957) Co-authored-by: Anthony Fu --- packages/vite/src/node/build.ts | 12 ++++++------ packages/vite/src/node/cli.ts | 12 ++++++++---- packages/vite/src/node/config.ts | 3 ++- packages/vite/src/node/index.ts | 1 + packages/vite/src/node/logger.ts | 17 +++++++++++++++-- .../vite/src/node/optimizer/registerMissing.ts | 2 +- .../vite/src/node/server/middlewares/error.ts | 3 ++- .../vite/src/node/server/middlewares/proxy.ts | 3 ++- packages/vite/src/node/server/openBrowser.ts | 9 +++++---- packages/vite/src/node/server/ws.ts | 3 ++- packages/vite/src/node/ssr/ssrModuleLoader.ts | 3 ++- 11 files changed, 46 insertions(+), 22 deletions(-) diff --git a/packages/vite/src/node/build.ts b/packages/vite/src/node/build.ts index 5d086f98269169..a9f7796d7767d0 100644 --- a/packages/vite/src/node/build.ts +++ b/packages/vite/src/node/build.ts @@ -409,16 +409,16 @@ async function doBuild( } const outputBuildError = (e: RollupError) => { - config.logger.error( - chalk.red(`${e.plugin ? `[${e.plugin}] ` : ''}${e.message}`) - ) + let msg = chalk.red((e.plugin ? `[${e.plugin}] ` : '') + e.message) if (e.id) { - const loc = e.loc ? `:${e.loc.line}:${e.loc.column}` : '' - config.logger.error(`file: ${chalk.cyan(`${e.id}${loc}`)}`) + msg += `\nfile: ${chalk.cyan( + e.id + (e.loc ? `:${e.loc.line}:${e.loc.column}` : '') + )}` } if (e.frame) { - config.logger.error(chalk.yellow(e.frame)) + msg += `\n` + chalk.yellow(e.frame) } + config.logger.error(msg, { error: e }) } try { diff --git a/packages/vite/src/node/cli.ts b/packages/vite/src/node/cli.ts index 4cbe1a3d4e94f2..5c2566a7eef87a 100644 --- a/packages/vite/src/node/cli.ts +++ b/packages/vite/src/node/cli.ts @@ -93,7 +93,8 @@ cli await server.listen() } catch (e) { createLogger(options.logLevel).error( - chalk.red(`error when starting dev server:\n${e.stack}`) + chalk.red(`error when starting dev server:\n${e.stack}`), + { error: e } ) process.exit(1) } @@ -148,7 +149,8 @@ cli }) } catch (e) { createLogger(options.logLevel).error( - chalk.red(`error during build:\n${e.stack}`) + chalk.red(`error during build:\n${e.stack}`), + { error: e } ) process.exit(1) } @@ -178,7 +180,8 @@ cli await optimizeDeps(config, options.force, true) } catch (e) { createLogger(options.logLevel).error( - chalk.red(`error when optimizing deps:\n${e.stack}`) + chalk.red(`error when optimizing deps:\n${e.stack}`), + { error: e } ) process.exit(1) } @@ -222,7 +225,8 @@ cli await preview(config, cleanOptions(options)) } catch (e) { createLogger(options.logLevel).error( - chalk.red(`error when starting preview server:\n${e.stack}`) + chalk.red(`error when starting preview server:\n${e.stack}`), + { error: e } ) process.exit(1) } diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index 464e18f18d35d3..fb8c3a5bba0aac 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -854,7 +854,8 @@ export async function loadConfigFromFile( } } catch (e) { createLogger(logLevel).error( - chalk.red(`failed to load config from ${resolvedPath}`) + chalk.red(`failed to load config from ${resolvedPath}`), + { error: e } ) throw e } diff --git a/packages/vite/src/node/index.ts b/packages/vite/src/node/index.ts index 7f2f8a203f3535..b5b4735f5fc632 100644 --- a/packages/vite/src/node/index.ts +++ b/packages/vite/src/node/index.ts @@ -31,6 +31,7 @@ export type { Plugin } from './plugin' export type { Logger, LogOptions, + LogErrorOptions, LogLevel, LogType, LoggerOptions diff --git a/packages/vite/src/node/logger.ts b/packages/vite/src/node/logger.ts index 417b8f164986ae..fb2365db14055c 100644 --- a/packages/vite/src/node/logger.ts +++ b/packages/vite/src/node/logger.ts @@ -3,6 +3,7 @@ import chalk from 'chalk' import readline from 'readline' import os from 'os' +import { RollupError } from 'rollup' import { Hostname } from './utils' export type LogType = 'error' | 'warn' | 'info' @@ -11,8 +12,9 @@ export interface Logger { info(msg: string, options?: LogOptions): void warn(msg: string, options?: LogOptions): void warnOnce(msg: string, options?: LogOptions): void - error(msg: string, options?: LogOptions): void + error(msg: string, options?: LogErrorOptions): void clearScreen(type: LogType): void + hasErrorLogged(error: Error | RollupError): boolean hasWarned: boolean } @@ -21,6 +23,10 @@ export interface LogOptions { timestamp?: boolean } +export interface LogErrorOptions extends LogOptions { + error?: Error | RollupError | null +} + export const LogLevels: Record = { silent: 0, error: 1, @@ -54,6 +60,7 @@ export function createLogger( return options.customLogger } + const loggedErrors = new WeakSet() const { prefix = '[vite]', allowClearScreen = true } = options const thresh = LogLevels[level] const clear = @@ -61,7 +68,7 @@ export function createLogger( ? clearScreen : () => {} - function output(type: LogType, msg: string, options: LogOptions = {}) { + function output(type: LogType, msg: string, options: LogErrorOptions = {}) { if (thresh >= LogLevels[type]) { const method = type === 'info' ? 'log' : type const format = () => { @@ -77,6 +84,9 @@ export function createLogger( return msg } } + if (options.error) { + loggedErrors.add(options.error) + } if (type === lastType && msg === lastMsg) { sameCount++ clear() @@ -118,6 +128,9 @@ export function createLogger( if (thresh >= LogLevels[type]) { clear() } + }, + hasErrorLogged(error) { + return loggedErrors.has(error) } } diff --git a/packages/vite/src/node/optimizer/registerMissing.ts b/packages/vite/src/node/optimizer/registerMissing.ts index e6f1b95d595421..6883fc9f262a81 100644 --- a/packages/vite/src/node/optimizer/registerMissing.ts +++ b/packages/vite/src/node/optimizer/registerMissing.ts @@ -66,7 +66,7 @@ export function createMissingImporterRegisterFn( } catch (e) { logger.error( chalk.red(`error while updating dependencies:\n${e.stack}`), - { timestamp: true } + { timestamp: true, error: e } ) } finally { server._isRunningOptimizer = false diff --git a/packages/vite/src/node/server/middlewares/error.ts b/packages/vite/src/node/server/middlewares/error.ts index 5bb4e8ae7253bb..3d1ac17d22fc01 100644 --- a/packages/vite/src/node/server/middlewares/error.ts +++ b/packages/vite/src/node/server/middlewares/error.ts @@ -52,7 +52,8 @@ export function errorMiddleware( server.config.logger.error(msg, { clear: true, - timestamp: true + timestamp: true, + error: err }) server.ws.send({ diff --git a/packages/vite/src/node/server/middlewares/proxy.ts b/packages/vite/src/node/server/middlewares/proxy.ts index 7a59d729307bc9..f23237d0c7852f 100644 --- a/packages/vite/src/node/server/middlewares/proxy.ts +++ b/packages/vite/src/node/server/middlewares/proxy.ts @@ -46,7 +46,8 @@ export function proxyMiddleware( proxy.on('error', (err) => { config.logger.error(`${chalk.red(`http proxy error:`)}\n${err.stack}`, { - timestamp: true + timestamp: true, + error: err }) }) diff --git a/packages/vite/src/node/server/openBrowser.ts b/packages/vite/src/node/server/openBrowser.ts index 5f1d025d73e81e..658e7ab3e859eb 100644 --- a/packages/vite/src/node/server/openBrowser.ts +++ b/packages/vite/src/node/server/openBrowser.ts @@ -47,11 +47,12 @@ function executeNodeScript(scriptPath: string, url: string, logger: Logger) { if (code !== 0) { logger.error( chalk.red( - '\nThe script specified as BROWSER environment variable failed.\n' - ) + `\nThe script specified as BROWSER environment variable failed.\n\n${chalk.cyan( + scriptPath + )} exited with code ${code}.` + ), + { error: null } ) - logger.error(chalk.cyan(scriptPath) + ' exited with code ' + code + '.') - return } }) return true diff --git a/packages/vite/src/node/server/ws.ts b/packages/vite/src/node/server/ws.ts index a37d8080bbdcf8..09598c7c13944f 100644 --- a/packages/vite/src/node/server/ws.ts +++ b/packages/vite/src/node/server/ws.ts @@ -78,7 +78,8 @@ export function createWebSocketServer( wss.on('error', (e: Error & { code: string }) => { if (e.code !== 'EADDRINUSE') { config.logger.error( - chalk.red(`WebSocket server error:\n${e.stack || e.message}`) + chalk.red(`WebSocket server error:\n${e.stack || e.message}`), + { error: e } ) } }) diff --git a/packages/vite/src/node/ssr/ssrModuleLoader.ts b/packages/vite/src/node/ssr/ssrModuleLoader.ts index ee216d797687d8..6a64d6a0fdaca9 100644 --- a/packages/vite/src/node/ssr/ssrModuleLoader.ts +++ b/packages/vite/src/node/ssr/ssrModuleLoader.ts @@ -159,7 +159,8 @@ async function instantiateModule( `Error when evaluating SSR module ${url}:\n${stacktrace}`, { timestamp: true, - clear: server.config.clearScreen + clear: server.config.clearScreen, + error: e } ) throw e