summaryrefslogtreecommitdiff
path: root/cli/compat
diff options
context:
space:
mode:
Diffstat (limited to 'cli/compat')
-rw-r--r--cli/compat/esm_resolver.rs48
-rw-r--r--cli/compat/mod.rs6
2 files changed, 47 insertions, 7 deletions
diff --git a/cli/compat/esm_resolver.rs b/cli/compat/esm_resolver.rs
index a4ea8cffc..f069428e5 100644
--- a/cli/compat/esm_resolver.rs
+++ b/cli/compat/esm_resolver.rs
@@ -1,6 +1,7 @@
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
use super::errors;
+use crate::resolver::ImportMapResolver;
use deno_core::error::generic_error;
use deno_core::error::AnyError;
use deno_core::serde_json;
@@ -13,21 +14,60 @@ use regex::Regex;
use std::path::PathBuf;
#[derive(Debug, Default)]
-pub struct NodeEsmResolver;
+pub(crate) struct NodeEsmResolver<'a> {
+ maybe_import_map_resolver: Option<ImportMapResolver<'a>>,
+}
+
+impl<'a> NodeEsmResolver<'a> {
+ pub fn new(maybe_import_map_resolver: Option<ImportMapResolver<'a>>) -> Self {
+ Self {
+ maybe_import_map_resolver,
+ }
+ }
-impl NodeEsmResolver {
pub fn as_resolver(&self) -> &dyn Resolver {
self
}
}
-impl Resolver for NodeEsmResolver {
+impl Resolver for NodeEsmResolver<'_> {
fn resolve(
&self,
specifier: &str,
referrer: &ModuleSpecifier,
) -> Result<ModuleSpecifier, AnyError> {
- node_resolve(specifier, referrer.as_str(), &std::env::current_dir()?)
+ // First try to resolve using import map, ignoring any errors
+ if !specifier.starts_with("node:") {
+ if let Some(import_map_resolver) = &self.maybe_import_map_resolver {
+ if let Ok(specifier) = import_map_resolver.resolve(specifier, referrer)
+ {
+ return Ok(specifier);
+ }
+ }
+ }
+
+ let node_resolution =
+ node_resolve(specifier, referrer.as_str(), &std::env::current_dir()?);
+
+ match node_resolution {
+ Ok(specifier) => {
+ // If node resolution succeeded, return the specifier
+ Ok(specifier)
+ }
+ Err(err) => {
+ // If node resolution failed, check if it's because of unsupported
+ // URL scheme, and if so try to resolve using regular resolution algorithm
+ if err
+ .to_string()
+ .starts_with("[ERR_UNSUPPORTED_ESM_URL_SCHEME]")
+ {
+ return deno_core::resolve_import(specifier, referrer.as_str())
+ .map_err(|err| err.into());
+ }
+
+ Err(err)
+ }
+ }
}
}
diff --git a/cli/compat/mod.rs b/cli/compat/mod.rs
index bcc9473eb..997265f96 100644
--- a/cli/compat/mod.rs
+++ b/cli/compat/mod.rs
@@ -8,7 +8,7 @@ use deno_core::located_script_name;
use deno_core::url::Url;
use deno_core::JsRuntime;
-pub use esm_resolver::NodeEsmResolver;
+pub(crate) use esm_resolver::NodeEsmResolver;
// TODO(bartlomieju): this needs to be bumped manually for
// each release, a better mechanism is preferable, but it's a quick and dirty
@@ -86,7 +86,7 @@ fn try_resolve_builtin_module(specifier: &str) -> Option<Url> {
}
}
-pub async fn check_if_should_use_esm_loader(
+pub(crate) async fn check_if_should_use_esm_loader(
js_runtime: &mut JsRuntime,
main_module: &str,
) -> Result<bool, AnyError> {
@@ -113,7 +113,7 @@ pub async fn check_if_should_use_esm_loader(
Ok(use_esm_loader)
}
-pub fn load_cjs_module(
+pub(crate) fn load_cjs_module(
js_runtime: &mut JsRuntime,
main_module: &str,
) -> Result<(), AnyError> {