evanw/esbuild · error · Error

Invalid log override

Error message

Invalid log override: ${key}

What it means

The `logOverride` option (which forces a particular log level per syntax feature) is serialized as `--log-override:KEY=value`. An '=' inside the KEY breaks parsing, so such keys are rejected at lib/shared/common.ts:221.

Solutions

  1. Remove '=' from the logOverride key.
  2. Use the correct feature identifier (e.g. 'no-unused-labels', 'commonjs-import-assertions') without separators that include '='.

Example fix

// before
await build({ entryPoints: ['app.ts'], logOverride: { 'commonjs=x': 'verbose' } })

// after
await build({ entryPoints: ['app.ts'], logOverride: { 'commonjs': 'verbose' } })
Defensive patterns

Strategy: validation

Validate before calling

function assertKeysHaveNoEquals(map, name) {
  for (const k of Object.keys(map ?? {})) {
    if (k.includes('=')) throw new Error(`${name} key must not contain '=': ${k}`)
  }
}
assertKeysHaveNoEquals(options.logOverride, 'logOverride')

Prevention

When it happens

Trigger: Passing `logOverride: { 'default=foo': 'verbose' }` or any logOverride key containing '='.

Common situations: Generated/templated feature names that accidentally embed '='; copy-paste errors.

Related errors


AI-assisted analysis of evanw/esbuild@f6058f8364 (2026-08-09). Data as JSON: /api/errors/c6248327db28fc48. Report an issue: GitHub.

Appendix: source

Thrown at lib/shared/common.ts:221

  if (reserveProps) flags.push(`--reserve-props=${jsRegExpToGoRegExp(reserveProps)}`)
  if (mangleQuoted !== void 0) flags.push(`--mangle-quoted=${mangleQuoted}`)

  if (jsx) flags.push(`--jsx=${jsx}`)
  if (jsxFactory) flags.push(`--jsx-factory=${jsxFactory}`)
  if (jsxFragment) flags.push(`--jsx-fragment=${jsxFragment}`)
  if (jsxImportSource) flags.push(`--jsx-import-source=${jsxImportSource}`)
  if (jsxDev) flags.push(`--jsx-dev`)
  if (jsxSideEffects) flags.push(`--jsx-side-effects`)

  if (define) {
    for (let key in define) {
      if (key.indexOf('=') >= 0) throw new Error(`Invalid define: ${key}`)
      flags.push(`--define:${key}=${validateStringValue(define[key], 'define', key)}`)
    }
  }
  if (logOverride) {
    for (let key in logOverride) {
      if (key.indexOf('=') >= 0) throw new Error(`Invalid log override: ${key}`)
      flags.push(`--log-override:${key}=${validateStringValue(logOverride[key], 'log override', key)}`)
    }
  }
  if (supported) {
    for (let key in supported) {
      if (key.indexOf('=') >= 0) throw new Error(`Invalid supported: ${key}`)
      const value = supported[key]
      if (typeof value !== 'boolean') throw new Error(`Expected value for supported ${quote(key)} to be a boolean, got ${typeof value} instead`)
      flags.push(`--supported:${key}=${value}`)
    }
  }
  if (pure) for (let fn of pure) flags.push(`--pure:${validateStringValue(fn, 'pure')}`)
  if (keepNames) flags.push(`--keep-names`)
}

function flagsForBuildOptions(
  callName: string,
  options: types.BuildOptions,

View on GitHub (pinned to f6058f8364)