diff options
Diffstat (limited to 'cli/worker.rs')
-rw-r--r-- | cli/worker.rs | 108 |
1 files changed, 28 insertions, 80 deletions
diff --git a/cli/worker.rs b/cli/worker.rs index 94d33e391..f11aa93e9 100644 --- a/cli/worker.rs +++ b/cli/worker.rs @@ -2,6 +2,7 @@ use crate::errors::DenoError; use crate::errors::RustOrJsError; use crate::js_errors; +use crate::module_specifier::ModuleSpecifier; use crate::state::ThreadSafeState; use crate::tokio_util; use deno; @@ -11,7 +12,6 @@ use futures::Async; use futures::Future; use std::sync::Arc; use std::sync::Mutex; -use url::Url; /// Wraps deno::Isolate to provide source maps, ops for the CLI, and /// high-level module loading @@ -57,7 +57,7 @@ impl Worker { /// Executes the provided JavaScript module. pub fn execute_mod_async( &mut self, - js_url: &Url, + module_specifier: &ModuleSpecifier, is_prefetch: bool, ) -> impl Future<Item = (), Error = RustOrJsError> { let worker = self.clone(); @@ -65,8 +65,12 @@ impl Worker { let loader = self.state.clone(); let isolate = self.isolate.clone(); let modules = self.state.modules.clone(); - let recursive_load = - deno::RecursiveLoad::new(js_url.as_str(), loader, isolate, modules); + let recursive_load = deno::RecursiveLoad::new( + &module_specifier.to_string(), + loader, + isolate, + modules, + ); recursive_load .and_then(move |id| -> Result<(), deno::JSErrorOr<DenoError>> { worker.state.progress.done(); @@ -96,10 +100,10 @@ impl Worker { /// Executes the provided JavaScript module. pub fn execute_mod( &mut self, - js_url: &Url, + module_specifier: &ModuleSpecifier, is_prefetch: bool, ) -> Result<(), RustOrJsError> { - tokio_util::block_on(self.execute_mod_async(js_url, is_prefetch)) + tokio_util::block_on(self.execute_mod_async(module_specifier, is_prefetch)) } /// Applies source map to the error. @@ -108,58 +112,6 @@ impl Worker { } } -// https://html.spec.whatwg.org/multipage/webappapis.html#resolve-a-module-specifier -// TODO(ry) Add tests. -// TODO(ry) Move this to core? -pub fn resolve_module_spec( - specifier: &str, - base: &str, -) -> Result<String, url::ParseError> { - // 1. Apply the URL parser to specifier. If the result is not failure, return - // the result. - // let specifier = parse_local_or_remote(specifier)?.to_string(); - if let Ok(specifier_url) = Url::parse(specifier) { - return Ok(specifier_url.to_string()); - } - - // 2. If specifier does not start with the character U+002F SOLIDUS (/), the - // two-character sequence U+002E FULL STOP, U+002F SOLIDUS (./), or the - // three-character sequence U+002E FULL STOP, U+002E FULL STOP, U+002F - // SOLIDUS (../), return failure. - if !specifier.starts_with('/') - && !specifier.starts_with("./") - && !specifier.starts_with("../") - { - // TODO(ry) This is (probably) not the correct error to return here. - return Err(url::ParseError::RelativeUrlWithCannotBeABaseBase); - } - - // 3. Return the result of applying the URL parser to specifier with base URL - // as the base URL. - let base_url = Url::parse(base)?; - let u = base_url.join(&specifier)?; - Ok(u.to_string()) -} - -/// Takes a string representing a path or URL to a module, but of the type -/// passed through the command-line interface for the main module. This is -/// slightly different than specifiers used in import statements: "foo.js" for -/// example is allowed here, whereas in import statements a leading "./" is -/// required ("./foo.js"). This function is aware of the current working -/// directory and returns an absolute URL. -pub fn root_specifier_to_url( - root_specifier: &str, -) -> Result<Url, url::ParseError> { - let maybe_url = Url::parse(root_specifier); - if let Ok(url) = maybe_url { - Ok(url) - } else { - let cwd = std::env::current_dir().unwrap(); - let base = Url::from_directory_path(cwd).unwrap(); - base.join(root_specifier) - } -} - impl Future for Worker { type Item = (); type Error = JSError; @@ -186,12 +138,9 @@ mod tests { #[test] fn execute_mod_esm_imports_a() { - let filename = std::env::current_dir() - .unwrap() - .join("tests/esm_imports_a.js"); - let js_url = Url::from_file_path(filename).unwrap(); - - let argv = vec![String::from("./deno"), js_url.to_string()]; + let module_specifier = + ModuleSpecifier::resolve_root("tests/esm_imports_a.js").unwrap(); + let argv = vec![String::from("./deno"), module_specifier.to_string()]; let state = ThreadSafeState::new( flags::DenoFlags::default(), argv, @@ -202,7 +151,7 @@ mod tests { tokio_util::run(lazy(move || { let mut worker = Worker::new("TEST".to_string(), StartupData::None, state); - let result = worker.execute_mod(&js_url, false); + let result = worker.execute_mod(&module_specifier, false); if let Err(err) = result { eprintln!("execute_mod err {:?}", err); } @@ -217,10 +166,9 @@ mod tests { #[test] fn execute_mod_circular() { - let filename = std::env::current_dir().unwrap().join("tests/circular1.js"); - let js_url = Url::from_file_path(filename).unwrap(); - - let argv = vec![String::from("./deno"), js_url.to_string()]; + let module_specifier = + ModuleSpecifier::resolve_root("tests/circular1.js").unwrap(); + let argv = vec![String::from("./deno"), module_specifier.to_string()]; let state = ThreadSafeState::new( flags::DenoFlags::default(), argv, @@ -231,7 +179,7 @@ mod tests { tokio_util::run(lazy(move || { let mut worker = Worker::new("TEST".to_string(), StartupData::None, state); - let result = worker.execute_mod(&js_url, false); + let result = worker.execute_mod(&module_specifier, false); if let Err(err) = result { eprintln!("execute_mod err {:?}", err); } @@ -246,11 +194,9 @@ mod tests { #[test] fn execute_006_url_imports() { - let filename = std::env::current_dir() - .unwrap() - .join("tests/006_url_imports.ts"); - let js_url = Url::from_file_path(filename).unwrap(); - let argv = vec![String::from("deno"), js_url.to_string()]; + let module_specifier = + ModuleSpecifier::resolve_root("tests/006_url_imports.ts").unwrap(); + let argv = vec![String::from("deno"), module_specifier.to_string()]; let mut flags = flags::DenoFlags::default(); flags.reload = true; let state = @@ -263,7 +209,7 @@ mod tests { state, ); js_check(worker.execute("denoMain()")); - let result = worker.execute_mod(&js_url, false); + let result = worker.execute_mod(&module_specifier, false); if let Err(err) = result { eprintln!("execute_mod err {:?}", err); } @@ -378,8 +324,9 @@ mod tests { tokio_util::init(|| { // "foo" is not a vailid module specifier so this should return an error. let mut worker = create_test_worker(); - let js_url = root_specifier_to_url("does-not-exist").unwrap(); - let result = worker.execute_mod_async(&js_url, false).wait(); + let module_specifier = + ModuleSpecifier::resolve_root("does-not-exist").unwrap(); + let result = worker.execute_mod_async(&module_specifier, false).wait(); assert!(result.is_err()); }) } @@ -390,8 +337,9 @@ mod tests { // This assumes cwd is project root (an assumption made throughout the // tests). let mut worker = create_test_worker(); - let js_url = root_specifier_to_url("./tests/002_hello.ts").unwrap(); - let result = worker.execute_mod_async(&js_url, false).wait(); + let module_specifier = + ModuleSpecifier::resolve_root("./tests/002_hello.ts").unwrap(); + let result = worker.execute_mod_async(&module_specifier, false).wait(); assert!(result.is_ok()); }) } |