From ea8c479a32bb9b18fb6af1ba8615f9ac1fc3d825 Mon Sep 17 00:00:00 2001 From: Lakshan Perera Date: Wed, 29 Nov 2023 23:18:33 +1100 Subject: [PATCH] fix: load import map from eszip --- crates/base/src/deno_runtime.rs | 6 ++-- crates/sb_module_loader/standalone/mod.rs | 37 ++++++++++++++++++----- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/crates/base/src/deno_runtime.rs b/crates/base/src/deno_runtime.rs index 6ad7e71da..c803f7f89 100644 --- a/crates/base/src/deno_runtime.rs +++ b/crates/base/src/deno_runtime.rs @@ -147,11 +147,11 @@ impl DenoRuntime { allow_remote_modules = user_conf.allow_remote_modules; } - let import_map = load_import_map(import_map_path)?; - let eszip = if let Some(eszip_payload) = maybe_eszip { eszip_payload } else { + let import_map = load_import_map(import_map_path.clone())?; + let cache_strategy = if no_module_cache { CacheSetting::ReloadAll } else { @@ -222,7 +222,7 @@ impl DenoRuntime { let fs = Arc::new(deno_fs::RealFs); let rt_provider = - create_module_loader_for_standalone_from_eszip_kind(eszip, import_map).await; + create_module_loader_for_standalone_from_eszip_kind(eszip, import_map_path).await; let RuntimeProviders { npm_resolver, diff --git a/crates/sb_module_loader/standalone/mod.rs b/crates/sb_module_loader/standalone/mod.rs index cc309c0ab..2853de1c4 100644 --- a/crates/sb_module_loader/standalone/mod.rs +++ b/crates/sb_module_loader/standalone/mod.rs @@ -4,11 +4,13 @@ use crate::standalone::standalone_module_loader::{EmbeddedModuleLoader, SharedMo use crate::RuntimeProviders; use anyhow::Context; use deno_core::error::AnyError; +use deno_core::url::Url; use deno_core::{FastString, ModuleSpecifier}; use deno_npm::NpmSystemInfo; use deno_tls::rustls::RootCertStore; use deno_tls::RootCertStoreProvider; -use import_map::ImportMap; +use import_map::parse_from_json; +use log::warn; use module_fetcher::args::package_json::PackageJsonDepsProvider; use module_fetcher::cache::{Caches, DenoDirProvider, NodeAnalysisCache}; use module_fetcher::file_fetcher::CacheSetting; @@ -51,7 +53,7 @@ impl RootCertStoreProvider for StandaloneRootCertStoreProvider { pub async fn create_module_loader_for_eszip( mut eszip: eszip::EszipV2, metadata: Metadata, - maybe_import_map: Option, + maybe_import_map_path: Option, ) -> Result { // let main_module = &metadata.entrypoint; let current_exe_path = std::env::current_exe().unwrap(); @@ -159,9 +161,30 @@ pub async fn create_module_loader_for_eszip( .package_json_deps .map(|serialized| serialized.into_deps()), )); - let maybe_import_map = maybe_import_map - .map(|import_map| Some(Arc::new(import_map))) - .unwrap_or_else(|| None); + + let mut maybe_import_map = None; + if let Some(import_map_path) = maybe_import_map_path { + let import_map_url = Url::parse(import_map_path.as_str())?; + + if let Some(import_map_module) = eszip.get_import_map(import_map_url.as_str()) { + if let Some(source) = import_map_module.source().await { + let source = std::str::from_utf8(&source)?.to_string(); + let result = parse_from_json(&import_map_url, &source)?; + if !result.diagnostics.is_empty() { + warn!( + "Import map diagnostics:\n{}", + result + .diagnostics + .iter() + .map(|d| format!(" - {d}")) + .collect::>() + .join("\n") + ); + } + maybe_import_map = Some(Arc::new(result.import_map)); + } + } + } let module_loader_factory = StandaloneModuleLoaderFactory { shared: Arc::new(SharedModuleLoaderState { @@ -191,7 +214,7 @@ pub async fn create_module_loader_for_eszip( pub async fn create_module_loader_for_standalone_from_eszip_kind( eszip_payload_kind: EszipPayloadKind, - maybe_import_map: Option, + maybe_import_map_path: Option, ) -> RuntimeProviders { use deno_core::futures::io::{AllowStdIo, BufReader}; @@ -221,7 +244,7 @@ pub async fn create_module_loader_for_standalone_from_eszip_kind( unsafely_ignore_certificate_errors: None, package_json_deps: None, }, - maybe_import_map, + maybe_import_map_path, ) .await .unwrap()