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

  1. Append a numeric version: chrome80, firefox73, safari13, etc.
  2. 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

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)