diff options
Diffstat (limited to 'cli/proc_state.rs')
-rw-r--r-- | cli/proc_state.rs | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/cli/proc_state.rs b/cli/proc_state.rs index 7fc28b553..0410fd3d9 100644 --- a/cli/proc_state.rs +++ b/cli/proc_state.rs @@ -61,6 +61,8 @@ use log::warn; use std::collections::HashSet; use std::ops::Deref; use std::path::PathBuf; +use std::sync::atomic::AtomicBool; +use std::sync::atomic::Ordering; use std::sync::Arc; /// This structure represents state of single "deno" program. @@ -93,6 +95,7 @@ pub struct Inner { pub npm_resolver: NpmPackageResolver, pub cjs_resolutions: Mutex<HashSet<ModuleSpecifier>>, progress_bar: ProgressBar, + node_std_graph_prepared: AtomicBool, } impl Deref for ProcState { @@ -280,6 +283,7 @@ impl ProcState { npm_resolver, cjs_resolutions: Default::default(), progress_bar, + node_std_graph_prepared: AtomicBool::new(false), }))) } @@ -297,12 +301,20 @@ impl ProcState { reload_on_watch: bool, ) -> Result<(), AnyError> { let _pb_clear_guard = self.progress_bar.clear_guard(); + let mut npm_package_reqs = vec![]; + + for root in &roots { + if let Ok(package_ref) = NpmPackageReference::from_specifier(root) { + npm_package_reqs.push(package_ref.req); + } + } + let roots = roots .into_iter() .map(|s| (s, ModuleKind::Esm)) .collect::<Vec<_>>(); - if !reload_on_watch { + if !reload_on_watch && npm_package_reqs.is_empty() { let graph_data = self.graph_data.read(); if self.options.type_check_mode() == TypeCheckMode::None || graph_data.is_type_checked(&roots, &lib) @@ -397,7 +409,7 @@ impl ProcState { graph_data.entries().map(|(s, _)| s).cloned().collect() }; - let npm_package_references = { + { let mut graph_data = self.graph_data.write(); graph_data.add_graph(&graph, reload_on_watch); let check_js = self.options.check_js(); @@ -408,14 +420,11 @@ impl ProcState { check_js, ) .unwrap()?; - graph_data.npm_package_reqs() + npm_package_reqs.extend(graph_data.npm_package_reqs()); }; - if !npm_package_references.is_empty() { - self - .npm_resolver - .add_package_reqs(npm_package_references) - .await?; + if !npm_package_reqs.is_empty() { + self.npm_resolver.add_package_reqs(npm_package_reqs).await?; self.prepare_node_std_graph().await?; } @@ -471,10 +480,15 @@ impl ProcState { // FIXME(bartlomieju): appears this function can be called more than once // if we have npm imports pub async fn prepare_node_std_graph(&self) -> Result<(), AnyError> { + if self.node_std_graph_prepared.load(Ordering::Relaxed) { + return Ok(()); + } + let node_std_graph = self .create_graph(vec![(node::MODULE_ALL_URL.clone(), ModuleKind::Esm)]) .await?; self.graph_data.write().add_graph(&node_std_graph, false); + self.node_std_graph_prepared.store(true, Ordering::Relaxed); Ok(()) } |