summaryrefslogtreecommitdiff
path: root/core/modules.rs
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2019-06-09 15:08:20 +0200
committerRyan Dahl <ry@tinyclouds.org>2019-06-09 09:08:20 -0400
commita115340288d974f141cceb16faac71914402c445 (patch)
tree80353d2579e6d6dc9febd449f1f779ffa62c8397 /core/modules.rs
parent8ec5276d30dac59ced0ca7e35e07e20644ee2188 (diff)
feat: Import maps (#2360)
Diffstat (limited to 'core/modules.rs')
-rw-r--r--core/modules.rs30
1 files changed, 20 insertions, 10 deletions
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<String, Self::Error>;
+ fn resolve(
+ &self,
+ specifier: &str,
+ referrer: &str,
+ is_root: bool,
+ ) -> Result<String, Self::Error>;
/// Given an absolute url, load its source code.
fn load(&self, url: &str) -> Box<SourceCodeInfoFuture<Self::Error>>;
@@ -98,17 +103,15 @@ impl<L: Loader> RecursiveLoad<L> {
referrer: &str,
parent_id: Option<deno_mod>,
) -> Result<String, L::Error> {
- 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<L: Loader> Future for RecursiveLoad<L> {
|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<String, Self::Error> {
+ fn resolve(
+ &self,
+ specifier: &str,
+ referrer: &str,
+ _is_root: bool,
+ ) -> Result<String, Self::Error> {
eprintln!(">> RESOLVING, S: {}, R: {}", specifier, referrer);
let output_specifier =
if specifier.starts_with("./") && referrer.starts_with("./") {