{"record":{"id":"8b66579cac6e0819","repo":"goreleaser/goreleaser","slug":"no-published-node-js-release-satisfies-q","errorCode":null,"errorMessage":"no published Node.js release satisfies %q","messagePattern":"no published Node\\.js release satisfies %q","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/builders/node/download.go","lineNumber":94,"sourceCode":"\tconstraint, err := semver.NewConstraint(raw)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"invalid semver constraint: %w\", err)\n\t}\n\n\tvar found *semver.Version\n\tfor verStr := range nodedist.Releases() {\n\t\tv, err := semver.NewVersion(verStr)\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\t\tif constraint.Check(v) {\n\t\t\tif found == nil || v.GreaterThan(found) {\n\t\t\t\tfound = v\n\t\t\t}\n\t\t}\n\t}\n\tif found == nil {\n\t\treturn \"\", fmt.Errorf(\"no published Node.js release satisfies %q\", raw)\n\t}\n\tif err := validateNodeSEAVersion(found); err != nil {\n\t\treturn \"\", err\n\t}\n\treturn \"v\" + found.String(), nil\n}\n\nfunc validateNodeSEAVersion(v *semver.Version) error {\n\tminV := semver.MustParse(minNodeSEAVersion)\n\tif v.LessThan(minV) {\n\t\treturn fmt.Errorf(\"node.js SEA requires Node.js >= v%s, got v%s\", minV, v)\n\t}\n\treturn nil\n}\n\nfunc checkHostNodeVersion(ctx context.Context, tool string, env []string) error {\n\tcmd := exec.CommandContext(ctx, tool, \"--version\") //nolint:gosec\n\tcmd.Env = env","sourceCodeStart":76,"sourceCodeEnd":112,"githubUrl":"https://github.com/goreleaser/goreleaser/blob/f5edd7395693c0c6b501dc722d445d2e86af854d/internal/builders/node/download.go#L76-L112","documentation":"If the engines.node range parses successfully but no release in the embedded nodedist index satisfies it, resolveVersionString returns this error naming the raw range. Only published Node.js releases can be selected.","triggerScenarios":"engines.node specifies a range that matches no released Node version, e.g. '>=99', a version newer than any published release, or a range only matching pre-release versions not in the index.","commonSituations":"Pinning engines.node to a not-yet-released Node major, using a range with an unusual pre-release qualifier, or working with an outdated GoReleaser that predates the newest Node releases (embedded index is stale).","solutions":["Widen engines.node to a range matching a published release, e.g. '>=20' instead of '>=99'","Pin engines.node to a concrete existing version like '22.11.0'","Upgrade GoReleaser to get a newer embedded release index"],"exampleFix":"// before (package.json)\n\"engines\": { \"node\": \">=99\" }\n// after\n\"engines\": { \"node\": \">=20\" }","handlingStrategy":"validation","validationCode":"// confirm at least one known release satisfies the range before building\nconstraint, _ := semver.NewConstraint(enginesNode)\nvar any bool\nfor rel := range nodedist.Releases() {\n\tif v, err := semver.NewVersion(rel); err == nil && constraint.Check(v) {\n\t\tany = true\n\t}\n}\nif !any {\n\treturn fmt.Errorf(\"no node release satisfies %q; widen the range\", enginesNode)\n}","typeGuard":null,"tryCatchPattern":"if err := run(); err != nil {\n\tif strings.Contains(err.Error(), \"no published Node.js release satisfies\") {\n\t\tlog.Fatalf(\"widen engines.node range %v\", err)\n\t}\n\treturn err\n}","preventionTips":["Pin engines.node to an existing released version or a wide range like >=20","Upgrade goreleaser so the embedded release index includes recent Node versions","Avoid ranges referencing unreleased future majors"],"tags":["goreleaser","node","version-resolution","semver"],"backgroundTag":"no-matching-node-release","analyzedSha":"f5edd7395693c0c6b501dc722d445d2e86af854d","analyzedAt":"2026-09-05T09:57:18.807Z","contentChangedAt":"2026-09-05T09:57:18.807Z","schemaVersion":2},"datasetVersion":"2026-09-12T12:17:11.808Z"}