From a115340288d974f141cceb16faac71914402c445 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Sun, 9 Jun 2019 15:08:20 +0200 Subject: feat: Import maps (#2360) --- core/modules.rs | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) (limited to 'core') diff --git a/core/modules.rs b/core/modules.rs index 8a600fd7e..fbfdb0b07 100644 --- a/core/modules.rs +++ b/core/modules.rs @@ -43,7 +43,12 @@ pub trait Loader: Send + Sync { /// When implementing an spec-complaint VM, this should be exactly the /// algorithm described here: /// https://html.spec.whatwg.org/multipage/webappapis.html#resolve-a-module-specifier - fn resolve(specifier: &str, referrer: &str) -> Result; + fn resolve( + &self, + specifier: &str, + referrer: &str, + is_root: bool, + ) -> Result; /// Given an absolute url, load its source code. fn load(&self, url: &str) -> Box>; @@ -98,17 +103,15 @@ impl RecursiveLoad { referrer: &str, parent_id: Option, ) -> Result { - let url = L::resolve(specifier, referrer)?; + let is_root = parent_id.is_none(); + let url = self.loader.resolve(specifier, referrer, is_root)?; - let is_root = if let Some(parent_id) = parent_id { + if !is_root { { let mut m = self.modules.lock().unwrap(); - m.add_child(parent_id, &url); + m.add_child(parent_id.unwrap(), &url); } - false - } else { - true - }; + } { // #B We only add modules that have not yet been resolved for RecursiveLoad. @@ -251,7 +254,9 @@ impl Future for RecursiveLoad { |specifier: &str, referrer_id: deno_mod| -> deno_mod { let modules = self.modules.lock().unwrap(); let referrer = modules.get_name(referrer_id).unwrap(); - match L::resolve(specifier, &referrer) { + // TODO(bartlomieju): there must be a better way + let is_root = referrer == "."; + match self.loader.resolve(specifier, &referrer, is_root) { Ok(url) => match modules.get_id(&url) { Some(id) => id, None => 0, @@ -619,7 +624,12 @@ mod tests { impl Loader for MockLoader { type Error = MockError; - fn resolve(specifier: &str, referrer: &str) -> Result { + fn resolve( + &self, + specifier: &str, + referrer: &str, + _is_root: bool, + ) -> Result { eprintln!(">> RESOLVING, S: {}, R: {}", specifier, referrer); let output_specifier = if specifier.starts_with("./") && referrer.starts_with("./") { -- cgit v1.2.3