summaryrefslogtreecommitdiff
path: root/cli/worker.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/worker.rs')
-rw-r--r--cli/worker.rs114
1 files changed, 80 insertions, 34 deletions
diff --git a/cli/worker.rs b/cli/worker.rs
index 9c4ae55d8..b2cc508bb 100644
--- a/cli/worker.rs
+++ b/cli/worker.rs
@@ -1,4 +1,5 @@
use std::path::PathBuf;
+use std::rc::Rc;
use std::sync::Arc;
use deno_ast::ModuleSpecifier;
@@ -24,6 +25,7 @@ use crate::compat;
use crate::errors;
use crate::fmt_errors::format_js_error;
use crate::module_loader::CliModuleLoader;
+use crate::node;
use crate::ops;
use crate::proc_state::ProcState;
use crate::tools;
@@ -99,7 +101,7 @@ impl CliMainWorker {
}
} else {
// Regular ES module execution
- self.worker.execute_main_module(&self.main_module).await?;
+ self.execute_main_module_possibly_with_npm().await?;
}
self.worker.dispatch_load_event(&located_script_name!())?;
@@ -134,39 +136,39 @@ impl CliMainWorker {
/// state of any pending events and emitting accordingly on drop in the case of a future
/// cancellation.
struct FileWatcherModuleExecutor {
- worker: MainWorker,
+ inner: CliMainWorker,
pending_unload: bool,
- ps: ProcState,
}
impl FileWatcherModuleExecutor {
- pub fn new(
- worker: MainWorker,
- ps: ProcState,
- ) -> FileWatcherModuleExecutor {
+ pub fn new(worker: CliMainWorker) -> FileWatcherModuleExecutor {
FileWatcherModuleExecutor {
- worker,
+ inner: worker,
pending_unload: false,
- ps,
}
}
/// Execute the given main module emitting load and unload events before and after execution
/// respectively.
- pub async fn execute(
- &mut self,
- main_module: &ModuleSpecifier,
- ) -> Result<(), AnyError> {
- if self.ps.options.compat() {
- self.worker.execute_side_module(&compat::GLOBAL_URL).await?;
+ pub async fn execute(&mut self) -> Result<(), AnyError> {
+ if self.inner.ps.options.compat() {
+ self
+ .inner
+ .worker
+ .execute_side_module(&compat::GLOBAL_URL)
+ .await?;
}
- self.worker.execute_main_module(main_module).await?;
- self.worker.dispatch_load_event(&located_script_name!())?;
+ self.inner.execute_main_module_possibly_with_npm().await?;
+ self
+ .inner
+ .worker
+ .dispatch_load_event(&located_script_name!())?;
self.pending_unload = true;
let result = loop {
- let result = self.worker.run_event_loop(false).await;
+ let result = self.inner.worker.run_event_loop(false).await;
if !self
+ .inner
.worker
.dispatch_beforeunload_event(&located_script_name!())?
{
@@ -179,7 +181,10 @@ impl CliMainWorker {
return Err(err);
}
- self.worker.dispatch_unload_event(&located_script_name!())?;
+ self
+ .inner
+ .worker
+ .dispatch_unload_event(&located_script_name!())?;
Ok(())
}
@@ -189,6 +194,7 @@ impl CliMainWorker {
fn drop(&mut self) {
if self.pending_unload {
self
+ .inner
.worker
.dispatch_unload_event(&located_script_name!())
.unwrap();
@@ -196,8 +202,8 @@ impl CliMainWorker {
}
}
- let mut executor = FileWatcherModuleExecutor::new(self.worker, self.ps);
- executor.execute(&self.main_module).await
+ let mut executor = FileWatcherModuleExecutor::new(self);
+ executor.execute().await
}
pub async fn run_test_specifier(
@@ -252,7 +258,7 @@ impl CliMainWorker {
}
} else {
// We execute the module module as a side module so that import.meta.main is not set.
- self.worker.execute_side_module(&self.main_module).await?;
+ self.execute_side_module_possibly_with_npm().await?;
}
}
@@ -307,7 +313,8 @@ impl CliMainWorker {
.unwrap();
if mode != TestMode::Documentation {
- self.worker.execute_side_module(&self.main_module).await?;
+ // We execute the module module as a side module so that import.meta.main is not set.
+ self.execute_side_module_possibly_with_npm().await?;
}
self.worker.dispatch_load_event(&located_script_name!())?;
@@ -362,7 +369,7 @@ impl CliMainWorker {
}
} else {
// We execute the module module as a side module so that import.meta.main is not set.
- self.worker.execute_side_module(&self.main_module).await?;
+ self.execute_side_module_possibly_with_npm().await?;
}
self.worker.dispatch_load_event(&located_script_name!())?;
@@ -387,6 +394,30 @@ impl CliMainWorker {
Ok(())
}
+ async fn execute_main_module_possibly_with_npm(
+ &mut self,
+ ) -> Result<(), AnyError> {
+ let id = self.worker.preload_main_module(&self.main_module).await?;
+ self.evaluate_module_possibly_with_npm(id).await
+ }
+
+ async fn execute_side_module_possibly_with_npm(
+ &mut self,
+ ) -> Result<(), AnyError> {
+ let id = self.worker.preload_side_module(&self.main_module).await?;
+ self.evaluate_module_possibly_with_npm(id).await
+ }
+
+ async fn evaluate_module_possibly_with_npm(
+ &mut self,
+ id: ModuleId,
+ ) -> Result<(), AnyError> {
+ if self.ps.npm_resolver.has_packages() {
+ node::initialize_runtime(&mut self.worker.js_runtime).await?;
+ }
+ self.worker.evaluate_module(id).await
+ }
+
async fn maybe_setup_coverage_collector(
&mut self,
) -> Result<Option<CoverageCollector>, AnyError> {
@@ -423,6 +454,8 @@ pub fn create_main_worker(
create_web_worker_callback(ps.clone(), stdio.clone());
let web_worker_preload_module_cb =
create_web_worker_preload_module_callback(ps.clone());
+ let web_worker_pre_execute_module_cb =
+ create_web_worker_pre_execute_module_callback(ps.clone());
let maybe_storage_key = ps.options.resolve_storage_key(&main_module);
let origin_storage_dir = maybe_storage_key.map(|key| {
@@ -466,14 +499,11 @@ pub fn create_main_worker(
format_js_error_fn: Some(Arc::new(format_js_error)),
create_web_worker_cb,
web_worker_preload_module_cb,
- web_worker_pre_execute_module_cb: Arc::new(|worker| {
- LocalFutureObj::new(Box::new(deno_core::futures::future::ready(Ok(
- worker,
- ))))
- }),
+ web_worker_pre_execute_module_cb,
maybe_inspector_server,
should_break_on_first_statement,
module_loader,
+ npm_resolver: Some(Rc::new(ps.npm_resolver.clone())),
get_error_class_fn: Some(&errors::get_error_class_name),
origin_storage_dir,
blob_store: ps.blob_store.clone(),
@@ -513,6 +543,23 @@ fn create_web_worker_preload_module_callback(
})
}
+fn create_web_worker_pre_execute_module_callback(
+ ps: ProcState,
+) -> Arc<WorkerEventCb> {
+ Arc::new(move |mut worker| {
+ let ps = ps.clone();
+ let fut = async move {
+ // this will be up to date after pre-load
+ if ps.npm_resolver.has_packages() {
+ node::initialize_runtime(&mut worker.js_runtime).await?;
+ }
+
+ Ok(worker)
+ };
+ LocalFutureObj::new(Box::new(fut))
+ })
+}
+
fn create_web_worker_callback(
ps: ProcState,
stdio: deno_runtime::ops::io::Stdio,
@@ -528,6 +575,8 @@ fn create_web_worker_callback(
create_web_worker_callback(ps.clone(), stdio.clone());
let preload_module_cb =
create_web_worker_preload_module_callback(ps.clone());
+ let pre_execute_module_cb =
+ create_web_worker_pre_execute_module_callback(ps.clone());
let extensions = ops::cli_exts(ps.clone());
@@ -559,14 +608,11 @@ fn create_web_worker_callback(
seed: ps.options.seed(),
create_web_worker_cb,
preload_module_cb,
- pre_execute_module_cb: Arc::new(|worker| {
- LocalFutureObj::new(Box::new(deno_core::futures::future::ready(Ok(
- worker,
- ))))
- }),
+ pre_execute_module_cb,
format_js_error_fn: Some(Arc::new(format_js_error)),
source_map_getter: Some(Box::new(module_loader.clone())),
module_loader,
+ npm_resolver: Some(Rc::new(ps.npm_resolver.clone())),
worker_type: args.worker_type,
maybe_inspector_server,
get_error_class_fn: Some(&errors::get_error_class_name),