{"record":{"id":"ac86b2322a366739","repo":"denoland/deno","slug":"invalid-deep-link-scheme-scheme-reason","errorCode":null,"errorMessage":"Invalid deep-link scheme {scheme:?}: {reason}.","messagePattern":"Invalid deep-link scheme (.+?): (.+?)\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cli/tools/desktop.rs","lineNumber":686,"sourceCode":"      }\n    }\n  };\n  match target_os {\n    \"macos\" => make_self_extracting_macos(bundle_path, format, desktop_flags),\n    \"windows\" => make_self_extracting_dir(bundle_path, format, true),\n    _ => make_self_extracting_dir(bundle_path, format, false),\n  }\n}\n\n/// Validate a deep-link URL scheme. Follows the RFC 3986 `scheme` grammar:\n/// `ALPHA *( ALPHA / DIGIT / \"+\" / \"-\" / \".\" )`. We additionally reject the\n/// common reserved schemes (`http`, `https`, `file`, `ftp`, `ws`, `wss`) since\n/// registering those as app handlers is almost never intended and would hijack\n/// normal browsing.\nfn validate_url_scheme(scheme: &str) -> Result<(), AnyError> {\n  let reserved = [\"http\", \"https\", \"file\", \"ftp\", \"ws\", \"wss\"];\n  let bail = |reason: &str| {\n    Err(deno_core::anyhow::anyhow!(\n      \"Invalid deep-link scheme {scheme:?}: {reason}.\"\n    ))\n  };\n  match scheme.chars().next() {\n    None => return bail(\"scheme is empty\"),\n    Some(c) if !c.is_ascii_alphabetic() => {\n      return bail(\"scheme must start with an ASCII letter\");\n    }\n    _ => {}\n  }\n  if !scheme\n    .chars()\n    .all(|c| c.is_ascii_alphanumeric() || matches!(c, '+' | '-' | '.'))\n  {\n    return bail(\"scheme may only contain letters, digits, '+', '-', and '.'\");\n  }\n  if reserved.contains(&scheme) {\n    return bail(\"scheme is reserved and cannot be used as a deep link\");","sourceCodeStart":668,"sourceCodeEnd":704,"githubUrl":"https://github.com/denoland/deno/blob/89f33cbef296a2b287f323d42de54c871fa69c77/cli/tools/desktop.rs#L668-L704","documentation":"Error \"Invalid deep-link scheme {scheme:?}: {reason}.\" thrown in denoland/deno.","triggerScenarios":"Thrown at cli/tools/desktop.rs:686 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"89f33cbef296a2b287f323d42de54c871fa69c77","analyzedAt":"2026-08-16T07:54:21.310Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}