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
- Use only ColorIfTerminal, ColorNever, or ColorAlways.
- Validate external input before assigning to Color.
- Re-vendor the official esbuild Go package to restore correct ordinals.
- 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
- Use ColorIfTerminal/ColorNever/ColorAlways only.
- Do not cast integers to StderrColor.
- Pin a single esbuild version.
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.