{"record":{"id":"b45bc1a61e4f0f52","repo":"denoland/deno","slug":"invalid-filter-input","errorCode":null,"errorMessage":"Invalid filter \"{input}\"","messagePattern":"Invalid filter \"(.+?)\"","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cli/tools/pm/outdated/mod.rs","lineNumber":753,"sourceCode":"        if let Some(scope_name) = s.strip_prefix('@') {\n          if let Some(idx) = scope_name.find('@') {\n            let (pattern, version_spec) = s.split_at(idx + 1);\n            (\n              pattern,\n              Some(\n                VersionReq::parse_from_specifier(\n                  version_spec.trim_start_matches('@'),\n                )\n                .with_context(|| format!(\"Invalid filter \\\"{input}\\\"\"))?,\n              ),\n            )\n          } else {\n            (s, None)\n          }\n        } else {\n          let mut parts = s.split('@');\n          let Some(pattern) = parts.next() else {\n            return Err(anyhow!(\"Invalid filter \\\"{input}\\\"\"));\n          };\n          (\n            pattern,\n            parts\n              .next()\n              .map(VersionReq::parse_from_specifier)\n              .transpose()\n              .with_context(|| format!(\"Invalid filter \\\"{input}\\\"\"))?,\n          )\n        };\n\n      Ok(Filter {\n        kind,\n        regex: pattern_to_regex(pattern)\n          .with_context(|| format!(\"Invalid filter \\\"{input}\\\"\"))?,\n        version_spec,\n      })\n    }","sourceCodeStart":735,"sourceCodeEnd":771,"githubUrl":"https://github.com/denoland/deno/blob/89f33cbef296a2b287f323d42de54c871fa69c77/cli/tools/pm/outdated/mod.rs#L735-L771","documentation":"`deno outdated` accepts package filters of the form pkg, pkg@<semver-range>, or @scope/pkg@<semver-range>. The filter is split on '@' and any version part must parse as a semver range; failures are reported as an invalid filter. The bare form of this message (empty pattern after splitting) is effectively defensive and near-unreachable.","triggerScenarios":"Passing a filter whose version part is not a valid semver range, e.g. `deno outdated 'pkg@two'` or a shell-mangled range like '>=1 <2'; stray leading/trailing '@' (e.g. 'pkg@')","commonSituations":"Typos in ranges; copy-pasting npm dist-tags (latest, next) where a range is expected; shell quoting splitting the filter into multiple arguments.","solutions":["Start with a bare name: deno outdated pkg","When bounding updates, use valid range syntax: pkg@^1.2 or @scope/pkg@~2.0","Single-quote the whole filter so operators and spaces survive the shell","Check for a stray '@' with no version after it"],"exampleFix":"# before\ndeno outdated 'chalk@latest'\n# after\ndeno outdated chalk   # or: deno outdated 'chalk@^4.0.0'","handlingStrategy":"validation","validationCode":"// validate a deno outdated filter before shelling out\nimport semver from \"npm:semver\";\nfunction checkFilter(input: string): boolean {\n  const i = input.lastIndexOf(\"@\");\n  if (i <= 0) return true; // no version part (covers plain and scoped names)\n  const range = input.slice(i + 1);\n  return range === \"\" || semver.validRange(range) !== null;\n}","typeGuard":"function isSemverRange(s: string, validRange: (r: string) => string | null): boolean {\n  return validRange(s) !== null;\n}","tryCatchPattern":null,"preventionTips":["Prefer bare package names unless you truly need to bound the update","Always single-quote the filter so shell operators survive intact","Remember dist-tags like latest are not valid range syntax here"],"tags":["outdated","filters","semver","cli"],"backgroundTag":null,"analyzedSha":"89f33cbef296a2b287f323d42de54c871fa69c77","analyzedAt":"2026-08-16T07:54:21.310Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}