{"record":{"id":"fb46ed02f156bcf0","repo":"gleam-lang/gleam","slug":"version-should-be-a-valid-range","errorCode":null,"errorMessage":"== {version} should be a valid range","messagePattern":"== (.+?) should be a valid range","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"compiler-cli/src/dependencies.rs","lineNumber":1514,"sourceCode":"\n    // Return early if a package cycle is detected\n    if parents.contains(&package_name) {\n        let mut last_cycle = parents\n            .split(|p| p == &package_name)\n            .next_back()\n            .unwrap_or_default()\n            .to_vec();\n        last_cycle.push(package_name);\n        return Err(Error::PackageCycle {\n            packages: last_cycle,\n        });\n    }\n    // Check that we do not have a cached version of this package already\n    match provided.get(&package_name) {\n        Some(package) if package.source == package_source => {\n            // This package has already been provided from this source, return the version\n            let version = hexpm::version::Range::new(format!(\"== {}\", package.version))\n                .expect(\"== {version} should be a valid range\");\n            return Ok(version);\n        }\n        Some(package) => {\n            // This package has already been provided from a different source which conflicts\n            return Err(Error::ProvidedDependencyConflict {\n                package: package_name.into(),\n                source_1: package_source.to_toml(),\n                source_2: package.source.to_toml(),\n            });\n        }\n        None => (),\n    }\n    // Load the package\n    let config = crate::config::read(package_path.join(\"gleam.toml\"))?;\n    // Check that we are loading the correct project\n    if config.name != package_name {\n        return Err(Error::WrongDependencyProvided {\n            expected: package_name.into(),","sourceCodeStart":1496,"sourceCodeEnd":1532,"githubUrl":"https://github.com/gleam-lang/gleam/blob/15b07c783065c92bb016b1b74ed0995a5259850f/compiler-cli/src/dependencies.rs#L1496-L1532","documentation":"When a package was already provided by the same source, the resolver constructs a version constraint \"== {version}\" via hexpm::version::Range::new and unwraps it. It panics only if the stored package version string is not a syntactically valid version, since \"== \" + a valid semver is always a valid range.","triggerScenarios":"Re-resolving dependencies where manifest.toml or build/packages.toml contains a package version string that hexpm's parser rejects (corrupt, empty, or non-semver version).","commonSituations":"Hand-edited or corrupted manifest.toml/package cache files; truncation of files during a crash; a dependency source writing malformed versions.","solutions":["Fix the malformed version string in manifest.toml or delete build/packages.toml to regenerate it","Run `gleam deps download` after removing the build directory to rebuild the cache from Hex","Restore manifest.toml from version control or regenerate it with `gleam add <package>`","If the version genuinely is valid but rejected, report a hexpm/gleam version-parsing bug"],"exampleFix":"// before: corrupt entry in manifest.toml\n{ name = \"gleam_stdlib\", version = \"\" }\n// after\n{ name = \"gleam_stdlib\", version = \"0.38.0\" }","handlingStrategy":"validation","validationCode":"// Validate versions in manifest.toml are strict semver before resolving\nfn valid_semver(v: &str) -> bool {\n    v.split('.').count() == 3 && v.split('.').all(|p| p.parse::<u64>().is_ok())\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat manifest.toml as generated — never hand-edit it","Restore manifest.toml from version control after crashes or corruption","Validate dependency versions are x.y.z semver in CI before running builds"],"tags":["semver","dependency-resolution","panic","manifest"],"backgroundTag":"invalid-argument-format","analyzedSha":"15b07c783065c92bb016b1b74ed0995a5259850f","analyzedAt":"2026-09-14T11:14:59.388Z","contentChangedAt":"2026-09-14T11:14:59.388Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}