summaryrefslogtreecommitdiff
path: root/cli/worker.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/worker.rs')
-rw-r--r--cli/worker.rs108
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());
})
}