diff options
Diffstat (limited to 'cli/lsp/documents.rs')
-rw-r--r-- | cli/lsp/documents.rs | 63 |
1 files changed, 57 insertions, 6 deletions
diff --git a/cli/lsp/documents.rs b/cli/lsp/documents.rs index 1c672f623..14c01d13b 100644 --- a/cli/lsp/documents.rs +++ b/cli/lsp/documents.rs @@ -16,7 +16,6 @@ use crate::cache::HttpCache; use crate::file_fetcher::get_source_from_bytes; use crate::file_fetcher::get_source_from_data_url; use crate::file_fetcher::map_content_type; -use crate::file_fetcher::SUPPORTED_SCHEMES; use crate::lsp::logging::lsp_warn; use crate::npm::CliNpmRegistryApi; use crate::npm::NpmResolution; @@ -93,6 +92,15 @@ static TSX_HEADERS: Lazy<HashMap<String, String>> = Lazy::new(|| { .collect() }); +pub const DOCUMENT_SCHEMES: [&str; 6] = [ + "data", + "blob", + "file", + "http", + "https", + "deno-notebook-cell", +]; + #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum LanguageId { JavaScript, @@ -254,6 +262,27 @@ impl AssetOrDocument { } } +/// Convert a `deno-notebook-cell:` specifier to a `file:` specifier. +/// ```rust +/// assert_eq!( +/// cell_to_file_specifier( +/// &Url::parse("deno-notebook-cell:/path/to/file.ipynb#abc").unwrap(), +/// ), +/// Some(Url::parse("file:///path/to/file.ipynb#abc").unwrap()), +/// ); +pub fn cell_to_file_specifier(specifier: &Url) -> Option<Url> { + if specifier.scheme() == "deno-notebook-cell" { + if let Ok(specifier) = ModuleSpecifier::parse(&format!( + "file://{}", + &specifier.as_str() + [url::quirks::internal_components(specifier).host_end as usize..], + )) { + return Some(specifier); + } + } + None +} + #[derive(Debug, Default)] struct DocumentDependencies { deps: IndexMap<String, deno_graph::Dependency>, @@ -270,10 +299,32 @@ impl DocumentDependencies { } pub fn from_module(module: &deno_graph::EsmModule) -> Self { - Self { + let mut deps = Self { deps: module.dependencies.clone(), maybe_types_dependency: module.maybe_types_dependency.clone(), + }; + if module.specifier.scheme() == "deno-notebook-cell" { + for (_, dep) in &mut deps.deps { + if let Resolution::Ok(resolved) = &mut dep.maybe_code { + if let Some(specifier) = cell_to_file_specifier(&resolved.specifier) { + resolved.specifier = specifier; + } + } + if let Resolution::Ok(resolved) = &mut dep.maybe_type { + if let Some(specifier) = cell_to_file_specifier(&resolved.specifier) { + resolved.specifier = specifier; + } + } + } + if let Some(dep) = &mut deps.maybe_types_dependency { + if let Resolution::Ok(resolved) = &mut dep.dependency { + if let Some(specifier) = cell_to_file_specifier(&resolved.specifier) { + resolved.specifier = specifier; + } + } + } } + deps } } @@ -677,13 +728,11 @@ impl SpecifierResolver { specifier: &ModuleSpecifier, ) -> Option<ModuleSpecifier> { let scheme = specifier.scheme(); - if !SUPPORTED_SCHEMES.contains(&scheme) { + if !DOCUMENT_SCHEMES.contains(&scheme) { return None; } - if scheme == "data" || scheme == "blob" || scheme == "file" { - Some(specifier.clone()) - } else { + if scheme == "http" || scheme == "https" { let mut redirects = self.redirects.lock(); if let Some(specifier) = redirects.get(specifier) { Some(specifier.clone()) @@ -692,6 +741,8 @@ impl SpecifierResolver { redirects.insert(specifier.clone(), redirect.clone()); Some(redirect) } + } else { + Some(specifier.clone()) } } |