{"record":{"id":"194ee65f30ebf372","repo":"coreybutler/nvm-windows","slug":"invalid-character-s-found-in-build-meta-data-q","errorCode":null,"errorMessage":"Invalid character(s) found in build meta data %q","messagePattern":"Invalid character\\(s\\) found in build meta data %q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/semver/semver.go","lineNumber":277,"sourceCode":"\t\tfor _, prstr := range prparts {\n\t\t\tparsedPR, err := NewPRVersion(prstr)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tv.Pre = append(v.Pre, parsedPR)\n\t\t}\n\t}\n\n\t// There is build meta data\n\tif buildIndex != -1 {\n\t\tbuildStr := parts[2][buildIndex+1:]\n\t\tbuildParts := strings.Split(buildStr, \".\")\n\t\tfor _, str := range buildParts {\n\t\t\tif len(str) == 0 {\n\t\t\t\treturn nil, errors.New(\"Build meta data is empty\")\n\t\t\t}\n\t\t\tif !containsOnly(str, alphanum) {\n\t\t\t\treturn nil, fmt.Errorf(\"Invalid character(s) found in build meta data %q\", str)\n\t\t\t}\n\t\t\tv.Build = append(v.Build, str)\n\t\t}\n\t}\n\n\treturn v, nil\n}\n\n// PreRelease Version\ntype PRVersion struct {\n\tVersionStr string\n\tVersionNum uint64\n\tIsNum      bool\n}\n\n// Creates a new valid prerelease version\nfunc NewPRVersion(s string) (*PRVersion, error) {\n\tif len(s) == 0 {","sourceCodeStart":259,"sourceCodeEnd":295,"githubUrl":"https://github.com/coreybutler/nvm-windows/blob/5b18223ca19ff50d707f35410dbc6bd440a9f74d/src/semver/semver.go#L259-L295","documentation":"Semver parse error: a dot-separated identifier in the build metadata (the part after '+' in MAJOR.MINOR.PATCH-pre+build) contains characters outside [0-9A-Za-z]. Build identifiers must be alphanumeric per SEMVER 2.0.0; hyphens and other symbols are not allowed there.","triggerScenarios":"semver.NewVersion(\"1.2.3+build-1\"), \"1.2.3+linux_x64\", or any '+'-suffix where an identifier between dots contains '_', '-', or other non-alphanumerics.","commonSituations":"Versions enriched with platform tags using underscores (common from CI build metadata), or build hashes with dashes concatenated into the metadata.","solutions":["Sanitize build metadata to alphanumerics and dots only (replace '_'/'-' with '.')","Drop the build metadata before parsing — semver precedence ignores it: parse s[:strings.IndexByte(s,'+')]","Fix the CI job that stamps non-alphanumeric characters into build metadata"],"exampleFix":"// before\nv, err := semver.NewVersion(\"1.2.3+linux_x64\")\n\n// after\nv, err := semver.NewVersion(\"1.2.3+linux.x64\")","handlingStrategy":"validation","validationCode":"func sanitizeBuild(v string) string {\n    if i := strings.IndexByte(v, '+'); i >= 0 {\n        meta := strings.Map(func(r rune) rune {\n            if (r >= '0' && r <= '9') || (r >= 'A' && r <= 'Z') || (r >= 'a' && r <= 'z') || r == '.' { return r }\n            return '.'\n        }, v[i+1:])\n        return v[:i+1] + meta\n    }\n    return v\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Constrain build metadata to [0-9A-Za-z.] at generation time","If metadata is irrelevant, drop everything after '+' before parsing","Encode platform tags with dots (linux.x64) not underscores"],"tags":["semver","parsing","build-metadata","validation"],"backgroundTag":null,"analyzedSha":"5b18223ca19ff50d707f35410dbc6bd440a9f74d","analyzedAt":"2026-08-15T10:06:51.428Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}