diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2024-02-24 00:21:09 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-24 00:21:09 -0500 |
commit | 6567dc94a901aaae1b4e5b8e84d48bc72d46ee2e (patch) | |
tree | ff3674957c66c40e9d4cc5e1fc1c04b353bf6a46 /cli/args/import_map.rs | |
parent | 76e8e02bba75f23097d28cec13829c2f5cfa4a25 (diff) |
fix(lsp): import map expansion (#22553)
Diffstat (limited to 'cli/args/import_map.rs')
-rw-r--r-- | cli/args/import_map.rs | 66 |
1 files changed, 49 insertions, 17 deletions
diff --git a/cli/args/import_map.rs b/cli/args/import_map.rs index da4f0eb85..517c3bff6 100644 --- a/cli/args/import_map.rs +++ b/cli/args/import_map.rs @@ -1,5 +1,6 @@ // Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. +use deno_core::anyhow::Context; use deno_core::error::AnyError; use deno_core::serde_json; use deno_core::url::Url; @@ -11,35 +12,66 @@ use log::warn; use super::ConfigFile; use crate::file_fetcher::FileFetcher; -pub async fn resolve_import_map_from_specifier( - specifier: &Url, +pub async fn resolve_import_map( + specified_specifier: Option<&Url>, maybe_config_file: Option<&ConfigFile>, file_fetcher: &FileFetcher, +) -> Result<Option<ImportMap>, AnyError> { + if let Some(specifier) = specified_specifier { + resolve_import_map_from_specifier(specifier.clone(), file_fetcher) + .await + .with_context(|| format!("Unable to load '{}' import map", specifier)) + .map(Some) + } else if let Some(config_file) = maybe_config_file { + let maybe_url_and_value = config_file + .to_import_map_value(|specifier| { + let specifier = specifier.clone(); + async move { + let file = file_fetcher + .fetch(&specifier, PermissionsContainer::allow_all()) + .await? + .into_text_decoded()?; + Ok(file.source.to_string()) + } + }) + .await + .with_context(|| { + format!( + "Unable to resolve import map in '{}'", + config_file.specifier + ) + })?; + match maybe_url_and_value { + Some((url, value)) => { + import_map_from_value(url.into_owned(), value).map(Some) + } + None => Ok(None), + } + } else { + Ok(None) + } +} + +async fn resolve_import_map_from_specifier( + specifier: Url, + file_fetcher: &FileFetcher, ) -> Result<ImportMap, AnyError> { let value: serde_json::Value = if specifier.scheme() == "data" { let data_url_text = - deno_graph::source::RawDataUrl::parse(specifier)?.decode()?; + deno_graph::source::RawDataUrl::parse(&specifier)?.decode()?; serde_json::from_str(&data_url_text)? } else { - let import_map_config = maybe_config_file - .as_ref() - .filter(|c| c.specifier == *specifier); - match import_map_config { - Some(config) => config.to_import_map_value(), - None => { - let file = file_fetcher - .fetch(specifier, PermissionsContainer::allow_all()) - .await? - .into_text_decoded()?; - serde_json::from_str(&file.source)? - } - } + let file = file_fetcher + .fetch(&specifier, PermissionsContainer::allow_all()) + .await? + .into_text_decoded()?; + serde_json::from_str(&file.source)? }; import_map_from_value(specifier, value) } pub fn import_map_from_value( - specifier: &Url, + specifier: Url, json_value: serde_json::Value, ) -> Result<ImportMap, AnyError> { debug_assert!( |