evanw/esbuild · critical
Invalid log level
Error message
Invalid log level
What it means
A panic raised by validateLogLevel when the LogLevel value is not one of LogLevelVerbose/Debug/Info/Warning/Error/Silent. Internal invariant: only reachable via Go-API misuse producing an out-of-range LogLevel.
Source
Thrown at pkg/api/api_impl.go:204
}
}
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:
panic("Invalid log level")
}
}
func validateASCIIOnly(value Charset) bool {
switch value {
case CharsetDefault, CharsetASCII:
return true
case CharsetUTF8:
return false
default:
panic("Invalid charset")
}
}
func validateExternalPackages(value Packages) bool {
switch value {
case PackagesDefault, PackagesBundle:
return falseView on GitHub (pinned to 6ff1d8b0d8)
Solutions
- Use only the documented LogLevel constants.
- Validate deserialized values against an allowlist.
- Do not cast integers to LogLevel.
- Pin a single esbuild version.
Example fix
// before opts.LogLevel = api.LogLevel(99) // after opts.LogLevel = api.LogLevelInfo
Defensive patterns
Strategy: type-guard
Validate before calling
func validLogLevel(l api.LogLevel) bool {
switch l {
case api.LogLevelVerbose, api.LogLevelDebug, api.LogLevelInfo, api.LogLevelWarning, api.LogLevelError, api.LogLevelSilent:
return true
}
return false
} Type guard
type LogLevel = 'verbose' | 'debug' | 'info' | 'warning' | 'error' | 'silent'
function isLogLevel(v: unknown): v is LogLevel {
return ['verbose','debug','info','warning','error','silent'].includes(v as any)
} Prevention
- Use documented LogLevel constants only.
- Validate deserialized config values.
- Do not cast integers to LogLevel.
When it happens
Trigger: Go API: BuildOptions.LogLevel = LogLevel(99). The JS API types LogLevel as a closed string union and cannot reach this panic.
Common situations: Reflective config decoding; ordinal drift in a fork; unsafe struct copying across versions.
Related errors
AI-assisted analysis of evanw/esbuild@6ff1d8b0d8 (2026-08-03).
Data as JSON: /data/errors/b5604ab734b19e86.json.
Report an issue: GitHub.