From b17a5fbcfaaeb70f8876ce4ca09fdcc61f7e825c Mon Sep 17 00:00:00 2001 From: Nayeem Rahman Date: Wed, 9 Sep 2020 13:23:57 +0100 Subject: [PATCH] fix(op_crates/web): Use "deno:" URLs for internal script specifiers (#7383) --- Cargo.lock | 2 +- cli/Cargo.toml | 2 +- cli/build.rs | 27 +++++++++----- cli/rt/40_error_stack.js | 2 +- cli/tests/error_009_op_crates_error.js | 2 + cli/tests/error_009_op_crates_error.js.out | 3 ++ cli/tests/integration_tests.rs | 6 +++ cli/tsc.rs | 13 ++++--- op_crates/web/Cargo.toml | 2 +- op_crates/web/lib.rs | 43 ++++++++++++++++------ 10 files changed, 73 insertions(+), 29 deletions(-) create mode 100644 cli/tests/error_009_op_crates_error.js create mode 100644 cli/tests/error_009_op_crates_error.js.out diff --git a/Cargo.lock b/Cargo.lock index 9876630543..c902fc0d23 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -499,7 +499,7 @@ dependencies = [ [[package]] name = "deno_web" -version = "0.7.0" +version = "0.7.1" dependencies = [ "deno_core", "futures", diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 6d4ca7793a..063f537535 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -21,7 +21,7 @@ path = "./bench/main.rs" [build-dependencies] deno_core = { path = "../core", version = "0.56.0" } -deno_web = { path = "../op_crates/web", version = "0.7.0" } +deno_web = { path = "../op_crates/web", version = "0.7.1" } [target.'cfg(windows)'.build-dependencies] winres = "0.1.11" diff --git a/cli/build.rs b/cli/build.rs index dcc6b41873..422bc1759f 100644 --- a/cli/build.rs +++ b/cli/build.rs @@ -15,12 +15,20 @@ use std::path::PathBuf; fn create_snapshot( mut isolate: JsRuntime, snapshot_path: &Path, - files: Vec, + files: Vec, ) { deno_web::init(&mut isolate); + // TODO(nayeemrmn): https://github.com/rust-lang/cargo/issues/3946 to get the + // workspace root. + let display_root = Path::new(env!("CARGO_MANIFEST_DIR")).parent().unwrap(); for file in files { - println!("cargo:rerun-if-changed={}", file); - js_check(isolate.execute(&file, &std::fs::read_to_string(&file).unwrap())); + println!("cargo:rerun-if-changed={}", file.display()); + let display_path = file.strip_prefix(display_root).unwrap(); + let display_path_str = display_path.display().to_string(); + js_check(isolate.execute( + &("deno:".to_string() + &display_path_str.replace('\\', "/")), + &std::fs::read_to_string(&file).unwrap(), + )); } let snapshot = isolate.snapshot(); @@ -30,7 +38,7 @@ fn create_snapshot( println!("Snapshot written to: {} ", snapshot_path.display()); } -fn create_runtime_snapshot(snapshot_path: &Path, files: Vec) { +fn create_runtime_snapshot(snapshot_path: &Path, files: Vec) { let state = BasicState::new(); let isolate = JsRuntime::new(state, StartupData::None, true); create_snapshot(isolate, snapshot_path, files); @@ -38,7 +46,7 @@ fn create_runtime_snapshot(snapshot_path: &Path, files: Vec) { fn create_compiler_snapshot( snapshot_path: &Path, - files: Vec, + files: Vec, cwd: &Path, ) { let mut custom_libs: HashMap = HashMap::new(); @@ -134,15 +142,16 @@ fn main() { } } -fn get_js_files(d: &str) -> Vec { +fn get_js_files(d: &str) -> Vec { + let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR")); let mut js_files = std::fs::read_dir(d) .unwrap() .map(|dir_entry| { let file = dir_entry.unwrap(); - file.path().to_string_lossy().to_string() + manifest_dir.join(file.path()) }) - .filter(|filename| filename.ends_with(".js")) - .collect::>(); + .filter(|path| path.extension().unwrap_or_default() == "js") + .collect::>(); js_files.sort(); js_files } diff --git a/cli/rt/40_error_stack.js b/cli/rt/40_error_stack.js index 80f4fc5edc..5d1a077ad0 100644 --- a/cli/rt/40_error_stack.js +++ b/cli/rt/40_error_stack.js @@ -240,7 +240,7 @@ }); for (const callSite of mappedCallSites) { error.__callSiteEvals.push(Object.freeze(evaluateCallSite(callSite))); - const isInternal = callSite.getFileName()?.startsWith("$deno$") ?? false; + const isInternal = callSite.getFileName()?.startsWith("deno:") ?? false; error.__formattedFrames.push(callSiteToString(callSite, isInternal)); } Object.freeze(error.__callSiteEvals); diff --git a/cli/tests/error_009_op_crates_error.js b/cli/tests/error_009_op_crates_error.js new file mode 100644 index 0000000000..01b97ea38d --- /dev/null +++ b/cli/tests/error_009_op_crates_error.js @@ -0,0 +1,2 @@ +// Missing arg. +new Event(); diff --git a/cli/tests/error_009_op_crates_error.js.out b/cli/tests/error_009_op_crates_error.js.out new file mode 100644 index 0000000000..fd428b28e9 --- /dev/null +++ b/cli/tests/error_009_op_crates_error.js.out @@ -0,0 +1,3 @@ +[WILDCARD]error: Uncaught TypeError: Event requires at least 1 argument, but only 0 present[WILDCARD] + at new Event (deno:op_crates/web/[WILDCARD]) + at [WILDCARD] diff --git a/cli/tests/integration_tests.rs b/cli/tests/integration_tests.rs index 4b1b67f7f3..2f70cf050d 100644 --- a/cli/tests/integration_tests.rs +++ b/cli/tests/integration_tests.rs @@ -1811,6 +1811,12 @@ itest!(error_008_checkjs { output: "error_008_checkjs.js.out", }); +itest!(error_009_op_crates_error { + args: "run error_009_op_crates_error.js", + output: "error_009_op_crates_error.js.out", + exit_code: 1, +}); + itest!(error_011_bad_module_specifier { args: "run --reload error_011_bad_module_specifier.ts", exit_code: 1, diff --git a/cli/tsc.rs b/cli/tsc.rs index ae2db6978f..90a1a31b55 100644 --- a/cli/tsc.rs +++ b/cli/tsc.rs @@ -1103,6 +1103,9 @@ impl TsCompiler { script_name: &str, ) -> Option> { if let Some(module_specifier) = self.try_to_resolve(script_name) { + if module_specifier.as_url().scheme() == "deno" { + return None; + } return match self.get_source_map_file(&module_specifier) { Ok(out) => Some(out.source_code.into_bytes()), Err(_) => { @@ -1848,11 +1851,11 @@ mod tests { (r#"{ "compilerOptions": { "checkJs": true } } "#, true), // JSON with comment ( - r#"{ - "compilerOptions": { - // force .js file compilation by Deno - "checkJs": true - } + r#"{ + "compilerOptions": { + // force .js file compilation by Deno + "checkJs": true + } }"#, true, ), diff --git a/op_crates/web/Cargo.toml b/op_crates/web/Cargo.toml index df138ac20f..feb562e58a 100644 --- a/op_crates/web/Cargo.toml +++ b/op_crates/web/Cargo.toml @@ -2,7 +2,7 @@ [package] name = "deno_web" -version = "0.7.0" +version = "0.7.1" edition = "2018" description = "Collection of Web APIs" authors = ["the Deno authors"] diff --git a/op_crates/web/lib.rs b/op_crates/web/lib.rs index a1ad31a61b..f98dfe7c4e 100644 --- a/op_crates/web/lib.rs +++ b/op_crates/web/lib.rs @@ -2,30 +2,32 @@ use deno_core::js_check; use deno_core::JsRuntime; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; pub fn init(isolate: &mut JsRuntime) { + let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR")); let files = vec![ - get_path("00_dom_exception.js"), - get_path("01_event.js"), - get_path("02_abort_signal.js"), - get_path("08_text_encoding.js"), + manifest_dir.join("00_dom_exception.js"), + manifest_dir.join("01_event.js"), + manifest_dir.join("02_abort_signal.js"), + manifest_dir.join("08_text_encoding.js"), ]; + // TODO(nayeemrmn): https://github.com/rust-lang/cargo/issues/3946 to get the + // workspace root. + let display_root = manifest_dir.parent().unwrap().parent().unwrap(); for file in files { println!("cargo:rerun-if-changed={}", file.display()); + let display_path = file.strip_prefix(display_root).unwrap(); + let display_path_str = display_path.display().to_string(); js_check(isolate.execute( - &file.to_string_lossy(), + &("deno:".to_string() + &display_path_str.replace('\\', "/")), &std::fs::read_to_string(&file).unwrap(), )); } } pub fn get_declaration() -> PathBuf { - get_path("lib.deno_web.d.ts") -} - -fn get_path(file_name: &str) -> PathBuf { - PathBuf::from(env!("CARGO_MANIFEST_DIR")).join(file_name) + PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("lib.deno_web.d.ts") } #[cfg(test)] @@ -78,6 +80,25 @@ mod tests { }); } + #[test] + fn test_event_error() { + run_in_task(|mut cx| { + let mut isolate = setup(); + let result = isolate.execute("foo.js", "new Event()"); + if let Err(error) = result { + let error_string = error.to_string(); + // Test that the script specifier is a URL: `deno:`. + assert!(error_string.starts_with("deno:op_crates/web/01_event.js")); + assert!(error_string.contains("Uncaught TypeError")); + } else { + unreachable!(); + } + if let Poll::Ready(Err(_)) = isolate.poll_unpin(&mut cx) { + unreachable!(); + } + }); + } + #[test] fn test_event_target() { run_in_task(|mut cx| {