diff --git a/cli/file_fetcher.rs b/cli/file_fetcher.rs index 5b2f6f74cb..a17a8fc247 100644 --- a/cli/file_fetcher.rs +++ b/cli/file_fetcher.rs @@ -26,7 +26,7 @@ use std::pin::Pin; use std::sync::Arc; use std::sync::Mutex; -const SUPPORTED_SCHEMES: [&str; 3] = ["http", "https", "file"]; +pub const SUPPORTED_SCHEMES: [&str; 3] = ["http", "https", "file"]; /// A structure representing a source file. #[derive(Debug, Clone, Eq, PartialEq)] diff --git a/cli/lsp/sources.rs b/cli/lsp/sources.rs index c6a15461ff..09b0a4cc8b 100644 --- a/cli/lsp/sources.rs +++ b/cli/lsp/sources.rs @@ -5,6 +5,7 @@ use super::text; use crate::file_fetcher::get_source_from_bytes; use crate::file_fetcher::map_content_type; +use crate::file_fetcher::SUPPORTED_SCHEMES; use crate::http_cache; use crate::http_cache::HttpCache; use crate::import_map::ImportMap; @@ -279,7 +280,12 @@ impl Sources { &mut self, specifier: &ModuleSpecifier, ) -> Option { - if specifier.as_url().scheme() == "file" { + let scheme = specifier.as_url().scheme(); + if !SUPPORTED_SCHEMES.contains(&scheme) { + return None; + } + + if scheme == "file" { if let Ok(path) = specifier.as_url().to_file_path() { if path.is_file() { return Some(specifier.clone()); @@ -377,4 +383,13 @@ mod tests { let actual = actual.unwrap(); assert_eq!(actual, 28); } + + #[test] + fn test_sources_resolve_specifier_non_supported_schema() { + let (mut sources, _) = setup(); + let specifier = ModuleSpecifier::resolve_url("foo://a/b/c.ts") + .expect("could not create specifier"); + let actual = sources.resolve_specifier(&specifier); + assert!(actual.is_none()); + } }