{"record":{"id":"d4111837b328803b","repo":"n8n-io/n8n","slug":"no-version-found-matching-version","errorCode":null,"errorMessage":"No version found matching ${version}","messagePattern":"No version found matching (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/@n8n/scan-community-package/scanner/scanner.mjs","lineNumber":357,"sourceCode":"\t\t\terror,\n\t\t};\n\t}\n};\n\nexport const analyzePackageByName = async (packageName, version) => {\n\ttry {\n\t\tlet exactVersion = version;\n\t\tlet packageMetadata;\n\n\t\t// If version is a range, get the latest matching version\n\t\tif (version && semver.validRange(version) && !semver.valid(version)) {\n\t\t\tconst { data } = await axios.get(`${registry}/${packageName}`);\n\t\t\tpackageMetadata = data;\n\t\t\tconst versions = Object.keys(data.versions);\n\t\t\texactVersion = semver.maxSatisfying(versions, version);\n\n\t\t\tif (!exactVersion) {\n\t\t\t\tthrow new Error(`No version found matching ${version}`);\n\t\t\t}\n\t\t}\n\n\t\t// If no version specified, get the latest\n\t\tif (!exactVersion) {\n\t\t\tconst { data } = await axios.get(`${registry}/${packageName}`);\n\t\t\tpackageMetadata = data;\n\t\t\texactVersion = data['dist-tags'].latest;\n\t\t}\n\n\t\tpackageMetadata ??= (await axios.get(`${registry}/${packageName}`)).data;\n\t\texactVersion = packageMetadata['dist-tags']?.[exactVersion] ?? exactVersion;\n\t\tconst label = `${packageName}@${exactVersion}`;\n\n\t\tstdout.write(`Checking provenance for ${label}...`);\n\t\tconst provenanceResult = checkPackageProvenance(packageMetadata, exactVersion);\n\t\tif (stdout.TTY) {\n\t\t\tstdout.clearLine(0);","sourceCodeStart":339,"sourceCodeEnd":375,"githubUrl":"https://github.com/n8n-io/n8n/blob/5ac6606e81f67bb9534255570cd4e86fd8101eee/packages/@n8n/scan-community-package/scanner/scanner.mjs#L339-L375","documentation":"Thrown during version resolution when the requested version is a valid semver RANGE (e.g. '^1.2.0', '~2.0', '>=3 <4') but semver.maxSatisfying(versions, version) returns null - none of the published versions in the registry metadata satisfy the range. Distinct from a 404 (the package exists, just no matching version).","triggerScenarios":"resolveVersion is called with a range; the registry metadata is fetched; Object.keys(data.versions) yields the published versions; semver.maxSatisfying returns null. Common when the range targets a version that was unpublished, a pre-release range with no matching pre-releases, or a range wider than any published major.","commonSituations":"Scanning '@scope/pkg@^5' when only 4.x is published; requesting a pre-release range ('>1.0.0-alpha') against a package with no pre-releases; a yanked version left the range unsatisfiable; tag/branch typo that resolves to a nonsensical range.","solutions":["List published versions: `npm view ${packageName} versions --json` and pick a concrete version that exists.","If you need 'latest', omit the version entirely so the scanner uses dist-tags.latest.","Loosen or correct the range (e.g. '^1.0.0' instead of '^1.2.3' when 1.2.3 was unpublished).","For pre-release ranges, ensure the range explicitly includes pre-release tags (semver only matches pre-releases when the range has a pre-release in the same [major,minor,patch] tuple)."],"exampleFix":"// before\nconst { exactVersion } = await resolveVersion(registry, packageName, '^5.0.0'); // throws if no 5.x\n\n// after - probe published versions first, fall back to latest\nconst { data } = await axios.get(`${registry}/${packageName}`);\nconst exactVersion = semver.maxSatisfying(Object.keys(data.versions), '^5.0.0')\n  ?? data['dist-tags'].latest;\nif (!exactVersion) throw new Error(`No version found matching ^5.0.0`);","handlingStrategy":"validation","validationCode":"import semver from 'semver';\nimport axios from 'axios';\n\nasync function pickVersion(registry: string, packageName: string, requested: string | null): Promise<string> {\n  const { data } = await axios.get(`${registry}/${packageName}`);\n  const versions = Object.keys(data.versions);\n  if (!requested) return data['dist-tags'].latest;\n  if (semver.valid(requested)) return requested;\n  const match = semver.maxSatisfying(versions, requested);\n  if (!match) throw new Error(`Range ${requested} matches none of ${versions.length} published versions`);\n  return match;\n}","typeGuard":"function isConcreteVersion(v: string): boolean {\n  return semver.valid(v) !== null;\n}","tryCatchPattern":null,"preventionTips":["Pre-resolve ranges to concrete versions before scanning (npm view or the registry metadata).","Prefer concrete versions or 'latest' over ranges in scanner input.","For pre-release ranges, remember semver only matches pre-releases within the same [major,minor,patch] tuple.","Surface the published version list to the user when a range fails."],"tags":["semver","npm","scanner","versioning"],"backgroundTag":null,"analyzedSha":"5ac6606e81f67bb9534255570cd4e86fd8101eee","analyzedAt":"2026-08-12T05:26:35.080Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}