summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRyan Dahl <ry@tinyclouds.org>2019-01-03 12:51:56 -0500
committerGitHub <noreply@github.com>2019-01-03 12:51:56 -0500
commita8d326b4311757b2b69bc251d460f4242d19a29f (patch)
treea2f282a9dbddabb5acebe8472e81b4be630f2f6c /src
parente809673cecef8383d4b3e873de260b35182d2ef9 (diff)
resolve_module: handle "." and ".." referrers (#1454)
Diffstat (limited to 'src')
-rw-r--r--src/deno_dir.rs56
1 files changed, 52 insertions, 4 deletions
diff --git a/src/deno_dir.rs b/src/deno_dir.rs
index 71a0f7a12..3b3a2c3d3 100644
--- a/src/deno_dir.rs
+++ b/src/deno_dir.rs
@@ -376,16 +376,20 @@ impl DenoDir {
let filename;
let specifier = self.src_file_to_url(specifier);
- let referrer = self.src_file_to_url(referrer);
+ let mut referrer = self.src_file_to_url(referrer);
debug!(
"resolve_module specifier {} referrer {}",
specifier, referrer
);
- let j: Url = if referrer == "."
- || is_remote(&specifier)
- || Path::new(&specifier).is_absolute()
+ if referrer.starts_with(".") {
+ let cwd = std::env::current_dir().unwrap();
+ let referrer_path = cwd.join(referrer);
+ referrer = referrer_path.to_str().unwrap().to_string() + "/";
+ }
+
+ let j: Url = if is_remote(&specifier) || Path::new(&specifier).is_absolute()
{
parse_local_or_remote(&specifier)?
} else if referrer.ends_with('/') {
@@ -1122,6 +1126,50 @@ mod tests {
}
#[test]
+ fn test_resolve_module_referrer_dot() {
+ let (_temp_dir, deno_dir) = test_setup();
+
+ let specifier = "tests/001_hello.js";
+
+ let cwd = std::env::current_dir().unwrap();
+ let expected_path = cwd.join(specifier);
+ let expected_module_name = deno_fs::normalize_path(&expected_path);
+ let expected_filename = expected_module_name.clone();
+
+ let (module_name, filename) =
+ deno_dir.resolve_module(specifier, ".").unwrap();
+ assert_eq!(module_name, expected_module_name);
+ assert_eq!(filename, expected_filename);
+
+ let (module_name, filename) =
+ deno_dir.resolve_module(specifier, "./").unwrap();
+ assert_eq!(module_name, expected_module_name);
+ assert_eq!(filename, expected_filename);
+ }
+
+ #[test]
+ fn test_resolve_module_referrer_dotdot() {
+ let (_temp_dir, deno_dir) = test_setup();
+
+ let specifier = "tests/001_hello.js";
+
+ let cwd = std::env::current_dir().unwrap();
+ let expected_path = cwd.join("..").join(specifier);
+ let expected_module_name = deno_fs::normalize_path(&expected_path);
+ let expected_filename = expected_module_name.clone();
+
+ let (module_name, filename) =
+ deno_dir.resolve_module(specifier, "..").unwrap();
+ assert_eq!(module_name, expected_module_name);
+ assert_eq!(filename, expected_filename);
+
+ let (module_name, filename) =
+ deno_dir.resolve_module(specifier, "../").unwrap();
+ assert_eq!(module_name, expected_module_name);
+ assert_eq!(filename, expected_filename);
+ }
+
+ #[test]
fn test_map_file_extension() {
assert_eq!(
map_file_extension(Path::new("foo/bar.ts")),