diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2023-05-22 16:55:04 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-22 16:55:04 -0400 |
commit | 7b4c483aa159794cdb9d57d3252c2980fba45469 (patch) | |
tree | b1c3b0ab080e98ab20f470fbad5b1aba05045dfb /cli/worker.rs | |
parent | 612226de8e2fe3068d981866242bacedfceb9734 (diff) |
fix(npm): store npm binary command resolution in lockfile (#19219)
Part of #19038
Closes #19034 (eliminates the time spent re-resolving)
Diffstat (limited to 'cli/worker.rs')
-rw-r--r-- | cli/worker.rs | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/cli/worker.rs b/cli/worker.rs index 4d8e500b7..4a41da1a5 100644 --- a/cli/worker.rs +++ b/cli/worker.rs @@ -5,10 +5,12 @@ use std::rc::Rc; use std::sync::Arc; use deno_ast::ModuleSpecifier; +use deno_core::anyhow::Context; use deno_core::error::AnyError; use deno_core::futures::task::LocalFutureObj; use deno_core::futures::FutureExt; use deno_core::located_script_name; +use deno_core::parking_lot::Mutex; use deno_core::url::Url; use deno_core::CompiledWasmModuleStore; use deno_core::Extension; @@ -16,6 +18,7 @@ use deno_core::ModuleId; use deno_core::ModuleLoader; use deno_core::SharedArrayBufferStore; use deno_core::SourceMapGetter; +use deno_lockfile::Lockfile; use deno_runtime::colors; use deno_runtime::deno_broadcast_channel::InMemoryBroadcastChannel; use deno_runtime::deno_fs; @@ -100,6 +103,7 @@ struct SharedWorkerState { root_cert_store_provider: Arc<dyn RootCertStoreProvider>, fs: Arc<dyn deno_fs::FileSystem>, maybe_inspector_server: Option<Arc<InspectorServer>>, + maybe_lockfile: Option<Arc<Mutex<Lockfile>>>, } impl SharedWorkerState { @@ -311,6 +315,7 @@ impl CliMainWorkerFactory { root_cert_store_provider: Arc<dyn RootCertStoreProvider>, fs: Arc<dyn deno_fs::FileSystem>, maybe_inspector_server: Option<Arc<InspectorServer>>, + maybe_lockfile: Option<Arc<Mutex<Lockfile>>>, options: CliMainWorkerOptions, ) -> Self { Self { @@ -328,6 +333,7 @@ impl CliMainWorkerFactory { root_cert_store_provider, fs, maybe_inspector_server, + maybe_lockfile, }), } } @@ -360,11 +366,22 @@ impl CliMainWorkerFactory { { shared .npm_resolver - .add_package_reqs(vec![package_ref.req.clone()]) + .add_package_reqs(&[package_ref.req.clone()]) .await?; let node_resolution = shared.node_resolver.resolve_binary_export(&package_ref)?; let is_main_cjs = matches!(node_resolution, NodeResolution::CommonJs(_)); + + if let Some(lockfile) = &shared.maybe_lockfile { + // For npm binary commands, ensure that the lockfile gets updated + // so that we can re-use the npm resolution the next time it runs + // for better performance + lockfile + .lock() + .write() + .context("Failed writing lockfile.")?; + } + (node_resolution.into_url(), is_main_cjs) } else if shared.options.is_npm_main { let node_resolution = |