summaryrefslogtreecommitdiff
path: root/cli/proc_state.rs
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2022-10-28 21:53:55 +0200
committerGitHub <noreply@github.com>2022-10-28 21:53:55 +0200
commit2c674dcd20aeb19d694e03d969f5792d1581e87a (patch)
tree5cc7212935bb1a46bc0f5c3920a823c3f0f7f73b /cli/proc_state.rs
parente202f890f04e37b40b311729c2a1e2a89949af2c (diff)
refactor(npm): reorganize initialization of compat layer (#16471)
Ensures that "std/node" graph is analyzed only once.
Diffstat (limited to 'cli/proc_state.rs')
-rw-r--r--cli/proc_state.rs30
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(())
}