evanw/esbuild · critical

Invalid color

Error message

Invalid color

What it means

A panic raised by validateColor when the StderrColor value is not ColorIfTerminal, ColorNever, or ColorAlways. Like the other validate* panics it guards an internal invariant: only Go-API misuse (an out-of-range StderrColor) can reach it.

Source

Thrown at pkg/api/api_impl.go:185

	case LegalCommentsLinked:
		return config.LegalCommentsLinkedWithComment
	case LegalCommentsExternal:
		return config.LegalCommentsExternalWithoutComment
	default:
		panic("Invalid legal comments")
	}
}

func validateColor(value StderrColor) logger.UseColor {
	switch value {
	case ColorIfTerminal:
		return logger.ColorIfTerminal
	case ColorNever:
		return logger.ColorNever
	case ColorAlways:
		return logger.ColorAlways
	default:
		panic("Invalid color")
	}
}

func validateLogLevel(value LogLevel) logger.LogLevel {
	switch value {
	case LogLevelVerbose:
		return logger.LevelVerbose
	case LogLevelDebug:
		return logger.LevelDebug
	case LogLevelInfo:
		return logger.LevelInfo
	case LogLevelWarning:
		return logger.LevelWarning
	case LogLevelError:
		return logger.LevelError
	case LogLevelSilent:
		return logger.LevelSilent
	default:

View on GitHub (pinned to 6ff1d8b0d8)

Solutions

  1. Use only ColorIfTerminal, ColorNever, or ColorAlways.
  2. Validate external input before assigning to Color.
  3. Re-vendor the official esbuild Go package to restore correct ordinals.
  4. Add a unit test exercising every color mode.

Example fix

// before
opts.Color = api.StderrColor(5)

// after
opts.Color = api.ColorIfTerminal
Defensive patterns

Strategy: type-guard

Validate before calling

func validColor(c api.StderrColor) bool {
  switch c {
  case api.ColorIfTerminal, api.ColorNever, api.ColorAlways:
    return true
  }
  return false
}

Type guard

type Color = 'if-terminal' | 'never' | 'always'
function isColor(v: unknown): v is Color {
  return ['if-terminal','never','always'].includes(v as any)
}

Prevention

When it happens

Trigger: Go API: BuildOptions.Color = StderrColor(5). The JS API does not expose this option directly in a way that can produce an invalid value.

Common situations: Deserializing color from a config file into a raw int; ABI drift between a fork and the public enum; unsafe casts.

Related errors


AI-assisted analysis of evanw/esbuild@6ff1d8b0d8 (2026-08-03). Data as JSON: /data/errors/8105158bb42bd58a.json. Report an issue: GitHub.