gohugoio/hugo · error
unsupported target
Error message
unsupported target: %v
What it means
Thrown when the Target slice is non-empty but none of its values match either a known ES language version (es5, esnext, etc.) nor any known engine prefix. The result is a wholly unrecognized target list.
Solutions
- Use only supported values: es5, es6/es2015, es2016 through es2024, esnext, or <engine><version> (e.g. chrome80).
Example fix
// before
{{ $opts := dict "targets" (slice "modern") }}
// after
{{ $opts := dict "targets" (slice "es2020") }} Defensive patterns
Strategy: validation
Validate before calling
allowed := map[string]bool{"es5": true, "es6": true, "es2015": true, "es2016": true, "es2017": true, "es2018": true, "es2019": true, "es2020": true, "es2021": true, "es2022": true, "es2023": true, "es2024": true, "esnext": true, "": true}
engineRe := regexp.MustCompile(`^(chrome|deno|edge|firefox|hermes|ie|ios|node|opera|rhino|safari)\d+$`)
for _, t := range opts.Target {
if !allowed[t] && !engineRe.MatchString(t) {
return fmt.Errorf("unsupported target: %q", t)
}
} Prevention
- Maintain a whitelist of accepted target strings in your config layer.
- Lowercase Target values before validation (Hugo does this internally).
- Reject unknown targets at config load rather than at build time.
When it happens
Trigger: Setting Target to ["web"], ["modern"], or any string not present in nameTarget and not starting with a known engine name.
Common situations: User invents target names like "modern" or "legacy"; typo like es2200; expects case-variants (DecodeExternalOptions lowercases Target, but a value with no lowercase mapping like "MODERN" still won't resolve).
Related errors
- invalid engine version
- invalid loader
- unsupported drop type
- unsupported jsx type
- unsupported platform type
AI-assisted analysis of gohugoio/hugo@52c9bd7908 (2026-08-09).
Data as JSON: /api/errors/234df0970d37ce85.
Report an issue: GitHub.
Appendix: source
Thrown at internal/js/esbuild/options.go:296
var engines []api.Engine
OUTER:
for _, value := range opts.Target {
for _, engine := range engineKeysSorted {
if strings.HasPrefix(value, engine) {
version := value[len(engine):]
if version == "" {
return fmt.Errorf("invalid engine version: %q", value)
}
engines = append(engines, api.Engine{Name: engineName[engine], Version: version})
continue OUTER
}
}
}
if target == 0 && len(engines) == 0 && len(opts.Target) > 0 {
return fmt.Errorf("unsupported target: %v", opts.Target)
}
if target == 0 {
target = api.ESNext
}
var loaders map[string]api.Loader
if opts.IsCSS {
loaders = make(map[string]api.Loader)
// Add default CSS file loaders.
// May be overridden by opts.Loaders.
maps.Copy(loaders, extensionToLoaderMapCSS)
}
if opts.Loaders != nil {
if loaders == nil {
loaders = make(map[string]api.Loader)
}
View on GitHub (pinned to 52c9bd7908)