summaryrefslogtreecommitdiff
path: root/cli/standalone.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/standalone.rs')
-rw-r--r--cli/standalone.rs34
1 files changed, 28 insertions, 6 deletions
diff --git a/cli/standalone.rs b/cli/standalone.rs
index 9fa210795..b7c026cec 100644
--- a/cli/standalone.rs
+++ b/cli/standalone.rs
@@ -6,6 +6,7 @@ use crate::flags::Flags;
use crate::ops;
use crate::proc_state::ProcState;
use crate::version;
+use crate::ImportMapResolver;
use deno_core::anyhow::anyhow;
use deno_core::anyhow::Context;
use deno_core::error::type_error;
@@ -19,6 +20,7 @@ use deno_core::url::Url;
use deno_core::v8_set_flags;
use deno_core::ModuleLoader;
use deno_core::ModuleSpecifier;
+use deno_graph::source::Resolver;
use deno_runtime::deno_broadcast_channel::InMemoryBroadcastChannel;
use deno_runtime::deno_tls::create_default_root_cert_store;
use deno_runtime::deno_tls::rustls_pemfile;
@@ -28,6 +30,7 @@ use deno_runtime::permissions::PermissionsOptions;
use deno_runtime::worker::MainWorker;
use deno_runtime::worker::WorkerOptions;
use deno_runtime::BootstrapOptions;
+use import_map::parse_from_json;
use log::Level;
use std::env::current_exe;
use std::io::BufReader;
@@ -51,6 +54,7 @@ pub struct Metadata {
pub ca_stores: Option<Vec<String>>,
pub ca_data: Option<Vec<u8>>,
pub unsafely_ignore_certificate_errors: Option<Vec<String>>,
+ pub maybe_import_map: Option<(Url, String)>,
pub entrypoint: ModuleSpecifier,
}
@@ -119,17 +123,26 @@ fn u64_from_bytes(arr: &[u8]) -> Result<u64, AnyError> {
Ok(u64::from_be_bytes(*fixed_arr))
}
-struct EmbeddedModuleLoader(eszip::EszipV2);
+struct EmbeddedModuleLoader {
+ eszip: eszip::EszipV2,
+ maybe_import_map_resolver: Option<ImportMapResolver>,
+}
impl ModuleLoader for EmbeddedModuleLoader {
fn resolve(
&self,
specifier: &str,
- base: &str,
+ referrer: &str,
_is_main: bool,
) -> Result<ModuleSpecifier, AnyError> {
- let resolve = deno_core::resolve_import(specifier, base)?;
- Ok(resolve)
+ let referrer = deno_core::resolve_url_or_path(referrer).unwrap();
+ self.maybe_import_map_resolver.as_ref().map_or_else(
+ || {
+ deno_core::resolve_import(specifier, referrer.as_str())
+ .map_err(|err| err.into())
+ },
+ |r| r.resolve(specifier, &referrer).to_result(),
+ )
}
fn load(
@@ -143,7 +156,7 @@ impl ModuleLoader for EmbeddedModuleLoader {
let is_data_uri = get_source_from_data_url(&module_specifier).ok();
let module = self
- .0
+ .eszip
.get_module(module_specifier.as_str())
.ok_or_else(|| type_error("Module not found"));
@@ -208,7 +221,16 @@ pub async fn run(
let permissions = Permissions::from_options(&metadata.permissions);
let blob_store = BlobStore::default();
let broadcast_channel = InMemoryBroadcastChannel::default();
- let module_loader = Rc::new(EmbeddedModuleLoader(eszip));
+ let module_loader = Rc::new(EmbeddedModuleLoader {
+ eszip,
+ maybe_import_map_resolver: metadata.maybe_import_map.map(
+ |(base, source)| {
+ ImportMapResolver::new(Arc::new(
+ parse_from_json(&base, &source).unwrap().import_map,
+ ))
+ },
+ ),
+ });
let create_web_worker_cb = Arc::new(|_| {
todo!("Worker are currently not supported in standalone binaries");
});