summaryrefslogtreecommitdiff
path: root/cli/args/import_map.rs
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2024-02-24 00:21:09 -0500
committerGitHub <noreply@github.com>2024-02-24 00:21:09 -0500
commit6567dc94a901aaae1b4e5b8e84d48bc72d46ee2e (patch)
treeff3674957c66c40e9d4cc5e1fc1c04b353bf6a46 /cli/args/import_map.rs
parent76e8e02bba75f23097d28cec13829c2f5cfa4a25 (diff)
fix(lsp): import map expansion (#22553)
Diffstat (limited to 'cli/args/import_map.rs')
-rw-r--r--cli/args/import_map.rs66
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!(