summaryrefslogtreecommitdiff
path: root/cli/npm/managed/resolvers/local.rs
diff options
context:
space:
mode:
authorNathan Whitaker <17734409+nathanwhit@users.noreply.github.com>2024-11-12 09:23:39 -0800
committerGitHub <noreply@github.com>2024-11-12 09:23:39 -0800
commitc371b2a492c60f47ce6b96b4df129c5d01706e1b (patch)
treee61641ac48950014d2f3207cb5175c580f5243f3 /cli/npm/managed/resolvers/local.rs
parent15b6baff33bb2405b174c5eaa919f9219421d513 (diff)
fix(install): re-setup bin entries after running lifecycle scripts (#26752)
Fixes #26677 Some packages (like supabase) declare bin entries that don't exist until lifecycle scripts are run. For instance, the lifecycle script downloads a binary file which serves as a bin entrypoint. Unfortunately you can't just defer setting up the bin entries until after lifecycle scripts have run, because the scripts may rely on them. I looked into this, and PNPM just re-links bin entries after running lifecycle scripts. I think that's about the best we can do as well. Note that we'll only re-setup bin entries for packages whose lifecycle scripts we run. This should limit the performance cost, as typically a given project will not have many lifecycle scripts (and of those, many of them probably don't have bin entries to set up).
Diffstat (limited to 'cli/npm/managed/resolvers/local.rs')
-rw-r--r--cli/npm/managed/resolvers/local.rs29
1 files changed, 25 insertions, 4 deletions
diff --git a/cli/npm/managed/resolvers/local.rs b/cli/npm/managed/resolvers/local.rs
index eddb0dc9b..50c5bd268 100644
--- a/cli/npm/managed/resolvers/local.rs
+++ b/cli/npm/managed/resolvers/local.rs
@@ -55,6 +55,7 @@ use crate::util::progress_bar::ProgressMessagePrompt;
use super::super::cache::NpmCache;
use super::super::cache::TarballCache;
use super::super::resolution::NpmResolution;
+use super::common::bin_entries;
use super::common::NpmPackageFsResolver;
use super::common::RegistryReadPermissionChecker;
@@ -329,8 +330,7 @@ async fn sync_resolution_with_fs(
let mut cache_futures = FuturesUnordered::new();
let mut newest_packages_by_name: HashMap<&String, &NpmResolutionPackage> =
HashMap::with_capacity(package_partitions.packages.len());
- let bin_entries =
- Rc::new(RefCell::new(super::common::bin_entries::BinEntries::new()));
+ let bin_entries = Rc::new(RefCell::new(bin_entries::BinEntries::new()));
let mut lifecycle_scripts =
super::common::lifecycle_scripts::LifecycleScripts::new(
lifecycle_scripts,
@@ -658,7 +658,28 @@ async fn sync_resolution_with_fs(
// 7. Set up `node_modules/.bin` entries for packages that need it.
{
let bin_entries = std::mem::take(&mut *bin_entries.borrow_mut());
- bin_entries.finish(snapshot, &bin_node_modules_dir_path)?;
+ bin_entries.finish(
+ snapshot,
+ &bin_node_modules_dir_path,
+ |setup_outcome| {
+ match setup_outcome {
+ bin_entries::EntrySetupOutcome::MissingEntrypoint {
+ package,
+ package_path,
+ ..
+ } if super::common::lifecycle_scripts::has_lifecycle_scripts(
+ package,
+ package_path,
+ ) && lifecycle_scripts.can_run_scripts(&package.id.nv)
+ && !lifecycle_scripts.has_run_scripts(package) =>
+ {
+ // ignore, it might get fixed when the lifecycle scripts run.
+ // if not, we'll warn then
+ }
+ outcome => outcome.warn_if_failed(),
+ }
+ },
+ )?;
}
// 8. Create symlinks for the workspace packages
@@ -708,7 +729,7 @@ async fn sync_resolution_with_fs(
.finish(
snapshot,
&package_partitions.packages,
- Some(root_node_modules_dir_path),
+ root_node_modules_dir_path,
progress_bar,
)
.await?;