gohugoio/hugo · error
invalid engine version
Error message
invalid engine version: %q
What it means
Thrown during option compilation when a Target value matches a known engine name prefix (chrome, firefox, safari, node, etc.) but has no version suffix appended. Engine targets require a version, e.g. chrome80.
Solutions
- Append a numeric version: chrome80, firefox73, safari13, etc.
- If you only want a JS language version, use es2020, esnext, etc. instead of an engine name.
Example fix
// before
{{ $opts := dict "targets" (slice "chrome") }}
// after
{{ $opts := dict "targets" (slice "chrome80") }} Defensive patterns
Strategy: validation
Validate before calling
engineRe := regexp.MustCompile(`^(chrome|deno|edge|firefox|hermes|ie|ios|node|opera|rhino|safari)\d+$`)
for _, t := range opts.Target {
if _, ok := nameTarget[t]; ok { continue }
if engineRe.MatchString(t) { continue }
if strings.HasPrefix(t, "chrome") || strings.HasPrefix(t, "safari") /* ... */ {
return fmt.Errorf("engine target needs a version number: %q", t)
}
} Prevention
- Validate Target strings before Build.
- Document that engine names require a numeric version suffix.
- Prefer ES language versions (es2020) unless you specifically need engine targeting.
When it happens
Trigger: Setting Target to ["chrome"] or ["safari"] (no version). The loop at options.go:282-293 strips the matched engine prefix and finds the remainder empty, triggering the error.
Common situations: User thinks a bare engine name is a valid target; trailing whitespace was stripped accidentally; copy-paste from docs that elided the version number.
Related errors
AI-assisted analysis of gohugoio/hugo@52c9bd7908 (2026-08-09).
Data as JSON: /api/errors/5fefb45cd4dd3988.
Report an issue: GitHub.
Appendix: source
Thrown at internal/js/esbuild/options.go:287
func (opts *Options) compile() (err error) {
var target api.Target
for _, value := range opts.Target {
if v, found := nameTarget[value]; found {
if v > target {
target = v
}
}
}
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)View on GitHub (pinned to 52c9bd7908)