evanw/esbuild · error · Error
Invalid supported
Error message
Invalid supported: ${key} What it means
The `supported` option (feature compatibility flags) is serialized as `--supported:KEY=value`. An '=' inside the KEY breaks parsing, so such keys are rejected at lib/shared/common.ts:227.
Solutions
- Remove '=' from the supported key.
- Use the canonical feature name from esbuild's supported list.
Example fix
// before
await build({ entryPoints: ['app.ts'], supported: { 'async-await=1': true } })
// after
await build({ entryPoints: ['app.ts'], supported: { 'async-await': true } }) 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.supported, 'supported') Prevention
- Use canonical feature names from esbuild's supported list as keys.
- Don't embed '=' in generated feature identifiers.
- Unit-test the supported map for valid keys before building.
When it happens
Trigger: Passing `supported: { 'object-rest-spread=x': true }` or any supported key containing '='.
Common situations: Generated feature names that embed '='; mis-delimited config.
Related errors
- Expected value for supported
- Expected in mangle cache to map to either a string or false
- Expected value for to be a string, got instead
- Invalid banner file type
- Invalid charset
AI-assisted analysis of evanw/esbuild@f6058f8364 (2026-08-09).
Data as JSON: /api/errors/77a9819feac07823.
Report an issue: GitHub.
Appendix: source
Thrown at lib/shared/common.ts:227
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,
isTTY: boolean,
logLevelDefault: types.LogLevel,
writeDefault: boolean,
): {
entries: [string, string][],
flags: string[],View on GitHub (pinned to f6058f8364)