summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNayeem Rahman <nayeemrmn99@gmail.com>2020-09-09 13:23:57 +0100
committerGitHub <noreply@github.com>2020-09-09 14:23:57 +0200
commitb17a5fbcfaaeb70f8876ce4ca09fdcc61f7e825c (patch)
treeb59175137a0c7db162895feb6fe35213ab326b20
parentc14436a424449d845a769a70ca7bc3d313201482 (diff)
fix(op_crates/web): Use "deno:" URLs for internal script specifiers (#7383)
-rw-r--r--Cargo.lock2
-rw-r--r--cli/Cargo.toml2
-rw-r--r--cli/build.rs27
-rw-r--r--cli/rt/40_error_stack.js2
-rw-r--r--cli/tests/error_009_op_crates_error.js2
-rw-r--r--cli/tests/error_009_op_crates_error.js.out3
-rw-r--r--cli/tests/integration_tests.rs6
-rw-r--r--cli/tsc.rs13
-rw-r--r--op_crates/web/Cargo.toml2
-rw-r--r--op_crates/web/lib.rs43
10 files changed, 73 insertions, 29 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 987663054..c902fc0d2 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 6d4ca7793..063f53753 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 dcc6b4187..422bc1759 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<String>,
+ files: Vec<PathBuf>,
) {
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<String>) {
+fn create_runtime_snapshot(snapshot_path: &Path, files: Vec<PathBuf>) {
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<String>) {
fn create_compiler_snapshot(
snapshot_path: &Path,
- files: Vec<String>,
+ files: Vec<PathBuf>,
cwd: &Path,
) {
let mut custom_libs: HashMap<String, PathBuf> = HashMap::new();
@@ -134,15 +142,16 @@ fn main() {
}
}
-fn get_js_files(d: &str) -> Vec<String> {
+fn get_js_files(d: &str) -> Vec<PathBuf> {
+ 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::<Vec<String>>();
+ .filter(|path| path.extension().unwrap_or_default() == "js")
+ .collect::<Vec<PathBuf>>();
js_files.sort();
js_files
}
diff --git a/cli/rt/40_error_stack.js b/cli/rt/40_error_stack.js
index 80f4fc5ed..5d1a077ad 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 000000000..01b97ea38
--- /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 000000000..fd428b28e
--- /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 4b1b67f7f..2f70cf050 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 ae2db6978..90a1a31b5 100644
--- a/cli/tsc.rs
+++ b/cli/tsc.rs
@@ -1103,6 +1103,9 @@ impl TsCompiler {
script_name: &str,
) -> Option<Vec<u8>> {
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 df138ac20..feb562e58 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 a1ad31a61..f98dfe7c4 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)]
@@ -79,6 +81,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:<repo-relative path>`.
+ 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| {
let mut isolate = setup();