diff --git a/js/unit_tests.ts b/js/unit_tests.ts index 91c1745b6b3005..ccdd9e000e9787 100644 --- a/js/unit_tests.ts +++ b/js/unit_tests.ts @@ -49,4 +49,4 @@ import "./version_test.ts"; import "../website/app_test.js"; -import "deps/https/deno.land/x/std/testing/main.ts"; +import "./deps/https/deno.land/x/std/testing/main.ts"; diff --git a/src/deno_dir.rs b/src/deno_dir.rs index 829af5aa28691a..488f03bb8e489f 100644 --- a/src/deno_dir.rs +++ b/src/deno_dir.rs @@ -305,6 +305,22 @@ impl DenoDir { specifier, referrer ); + // Module specifier check. + // https://github.com/denoland/deno/issues/1769 + // https://html.spec.whatwg.org/multipage/webappapis.html#resolve-a-module-specifier + if !is_remote(&specifier) + && !is_relative(&specifier) + && !is_absolute(&specifier) + { + return Err(errors::new( + ErrorKind::NotFound, + format!( + "Cannot resolve module \"{}\" from \"{}\". Relative references must start with either \"/\", \"./\", or \"../\".", + specifier, referrer + ), + )); + } + let (module_name, filename) = self.resolve_module(specifier, referrer)?; let result = self.get_source_code(module_name.as_str(), filename.as_str()); @@ -520,6 +536,17 @@ fn is_remote(module_name: &str) -> bool { module_name.starts_with("http://") || module_name.starts_with("https://") } +fn is_relative(module_name: &str) -> bool { + module_name.starts_with("./") || module_name.starts_with("../") +} + +fn is_absolute(module_name: &str) -> bool { + module_name.starts_with("/") + || module_name.starts_with("file://") + // Windows disc character + || module_name[1..].starts_with(":\\") +} + fn parse_local_or_remote(p: &str) -> Result { if is_remote(p) || p.starts_with("file:") { Url::parse(p) @@ -1366,4 +1393,56 @@ mod tests { .to_owned(); assert_eq!(filter_shebang(code), "\nconsole.log('hello');\n".as_bytes()); } + + #[test] + fn test_specifier_prefix() { + let http_specifier = "http://deno.land/welcome.ts"; + assert!( + is_remote(http_specifier) + && !is_absolute(http_specifier) + && !is_relative(http_specifier) + ); + + let https_specifier = "https://deno.land/welcome.ts"; + assert!( + is_remote(https_specifier) + && !is_absolute(https_specifier) + && !is_relative(https_specifier) + ); + + let file_specifier = "file:///Users/enok/projects/deno/tests/exec_path.ts"; + assert!( + !is_remote(file_specifier) + && is_absolute(file_specifier) + && !is_relative(file_specifier) + ); + + let relative_specifier1 = "./hello.ts"; + assert!( + !is_remote(relative_specifier1) + && !is_absolute(relative_specifier1) + && is_relative(relative_specifier1) + ); + + let relative_specifier2 = "../hello.ts"; + assert!( + !is_remote(relative_specifier2) + && !is_absolute(relative_specifier2) + && is_relative(relative_specifier2) + ); + + let absolute_specifier1 = "/Users/enok/projects/deno/tests/exec_path.ts"; + assert!( + !is_remote(absolute_specifier1) + && is_absolute(absolute_specifier1) + && !is_relative(absolute_specifier1) + ); + + let absolute_specifier2 = "C:\\some_dir\\hello.ts"; + assert!( + !is_remote(absolute_specifier2) + && is_absolute(absolute_specifier2) + && !is_relative(absolute_specifier2) + ); + } } diff --git a/tests/circular1.js b/tests/circular1.js index b166f7e5d3ef12..8b2cc4960faddf 100644 --- a/tests/circular1.js +++ b/tests/circular1.js @@ -1,2 +1,2 @@ -import "circular2.js"; +import "./circular2.js"; console.log("circular1"); diff --git a/tests/circular2.js b/tests/circular2.js index 3d3136a0d08206..62127e04d042e1 100644 --- a/tests/circular2.js +++ b/tests/circular2.js @@ -1,2 +1,2 @@ -import "circular1.js"; +import "./circular1.js"; console.log("circular2"); diff --git a/tests/error_004_missing_module.ts b/tests/error_004_missing_module.ts index 48623320b6ba61..4a159d4220a8c1 100644 --- a/tests/error_004_missing_module.ts +++ b/tests/error_004_missing_module.ts @@ -1 +1 @@ -import * as badModule from "bad-module.ts"; +import * as badModule from "./bad-module.ts"; diff --git a/tests/error_004_missing_module.ts.out b/tests/error_004_missing_module.ts.out index cc569826bbf4ee..55b7b7e9f731e4 100644 --- a/tests/error_004_missing_module.ts.out +++ b/tests/error_004_missing_module.ts.out @@ -1,5 +1,5 @@ Compiling [WILDCARD]tests/error_004_missing_module.ts -Uncaught NotFound: Cannot resolve module "bad-module.ts" from "[WILDCARD]/tests/error_004_missing_module.ts" +Uncaught NotFound: Cannot resolve module "./bad-module.ts" from "[WILDCARD]/tests/error_004_missing_module.ts" at DenoError ([WILDCARD]/js/errors.ts:[WILDCARD]) at maybeError ([WILDCARD]/js/errors.ts:[WILDCARD]) at maybeThrowError ([WILDCARD]/js/errors.ts:[WILDCARD]) diff --git a/tests/error_005_missing_dynamic_import.ts b/tests/error_005_missing_dynamic_import.ts index 3cb081a276a5c3..534cdb5703dc8a 100644 --- a/tests/error_005_missing_dynamic_import.ts +++ b/tests/error_005_missing_dynamic_import.ts @@ -1,3 +1,3 @@ (async () => { - const badModule = await import("bad-module.ts"); + const badModule = await import("./bad-module.ts"); })(); diff --git a/tests/error_005_missing_dynamic_import.ts.out b/tests/error_005_missing_dynamic_import.ts.out index c86c65deee7b3b..94b676be73ed2e 100644 --- a/tests/error_005_missing_dynamic_import.ts.out +++ b/tests/error_005_missing_dynamic_import.ts.out @@ -1,4 +1,4 @@ -[WILDCARD]NotFound: Cannot resolve module "bad-module.ts" from "[WILDCARD]/tests/error_005_missing_dynamic_import.ts" +[WILDCARD]NotFound: Cannot resolve module "./bad-module.ts" from "[WILDCARD]/tests/error_005_missing_dynamic_import.ts" at DenoError ([WILDCARD]/js/errors.ts:[WILDCARD]) at maybeError ([WILDCARD]/js/errors.ts:[WILDCARD]) at maybeThrowError ([WILDCARD]/js/errors.ts:[WILDCARD]) diff --git a/tests/error_011_nonstandard_module_prefix.test b/tests/error_011_nonstandard_module_prefix.test new file mode 100644 index 00000000000000..c0ae7c23791498 --- /dev/null +++ b/tests/error_011_nonstandard_module_prefix.test @@ -0,0 +1,4 @@ +args: tests/error_011_nonstandard_module_prefix.ts --reload +check_stderr: true +exit_code: 1 +output: tests/error_011_nonstandard_module_prefix.ts.out diff --git a/tests/error_011_nonstandard_module_prefix.ts b/tests/error_011_nonstandard_module_prefix.ts new file mode 100644 index 00000000000000..48623320b6ba61 --- /dev/null +++ b/tests/error_011_nonstandard_module_prefix.ts @@ -0,0 +1 @@ +import * as badModule from "bad-module.ts"; diff --git a/tests/error_011_nonstandard_module_prefix.ts.out b/tests/error_011_nonstandard_module_prefix.ts.out new file mode 100644 index 00000000000000..75ffaf1cd9dac5 --- /dev/null +++ b/tests/error_011_nonstandard_module_prefix.ts.out @@ -0,0 +1,12 @@ +Compiling [WILDCARD]tests/error_011_nonstandard_module_prefix.ts +Uncaught NotFound: Cannot resolve module "bad-module.ts" from "[WILDCARD]/tests/error_011_nonstandard_module_prefix.ts". Relative references must start with either "/", "./", or "../". + at DenoError ([WILDCARD]/js/errors.ts:[WILDCARD]) + at maybeError ([WILDCARD]/js/errors.ts:[WILDCARD]) + at maybeThrowError ([WILDCARD]/js/errors.ts:[WILDCARD]) + at sendSync ([WILDCARD]/js/dispatch.ts:[WILDCARD]) + at fetchModuleMetaData ([WILDCARD]/js/os.ts:[WILDCARD]) + at _resolveModule ([WILDCARD]/js/compiler.ts:[WILDCARD]) + at resolveModuleNames ([WILDCARD]/js/compiler.ts:[WILDCARD]) + at compilerHost.resolveModuleNames ([WILDCARD]/typescript.js:[WILDCARD]) + at resolveModuleNamesWorker ([WILDCARD]/typescript.js:[WILDCARD]) + at resolveModuleNamesReusingOldState ([WILDCARD]/typescript.js:[WILDCARD]) diff --git a/tests/import_meta.ts b/tests/import_meta.ts index 2f3bec9ed891b7..d111059ea1348a 100644 --- a/tests/import_meta.ts +++ b/tests/import_meta.ts @@ -1,3 +1,3 @@ console.log("import_meta", import.meta.url, import.meta.main); -import "import_meta2.ts"; +import "./import_meta2.ts";