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 false

View on GitHub (pinned to 6ff1d8b0d8)

Solutions

  1. Use only the documented LogLevel constants.
  2. Validate deserialized values against an allowlist.
  3. Do not cast integers to LogLevel.
  4. 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

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.