summaryrefslogtreecommitdiff
path: root/cli/lsp/documents.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/lsp/documents.rs')
-rw-r--r--cli/lsp/documents.rs63
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())
}
}