From c13b6d1413859d03b41b97d4c671fccfd388b2cc Mon Sep 17 00:00:00 2001 From: Nathan Whitaker <17734409+nathanwhit@users.noreply.github.com> Date: Tue, 2 Jul 2024 15:00:16 -0700 Subject: feat(cli): Add `--frozen` flag to error out if lockfile is out of date (#24355) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #18296. Adds a `--frozen` (alias `--frozen-lockfile`) flag that errors out if the lockfile is out of date. This is useful for running in CI (where an out of date lockfile is usually a mistake) or to prevent accidental changes in dependencies. ![Screenshot 2024-06-26 at 7 11 13 PM](https://github.com/denoland/deno/assets/17734409/538404b8-b422-4f05-89e8-4c9b1c248576) --- cli/npm/managed/mod.rs | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) (limited to 'cli/npm/managed') diff --git a/cli/npm/managed/mod.rs b/cli/npm/managed/mod.rs index f0fc0f7f7..393fc8632 100644 --- a/cli/npm/managed/mod.rs +++ b/cli/npm/managed/mod.rs @@ -361,12 +361,15 @@ impl ManagedCliNpmResolver { } /// Adds package requirements to the resolver and ensures everything is setup. + /// This includes setting up the `node_modules` directory, if applicable. pub async fn add_package_reqs( &self, packages: &[PackageReq], ) -> Result<(), AnyError> { - let result = self.add_package_reqs_raw(packages).await; - result.dependencies_result + self + .add_package_reqs_raw(packages) + .await + .dependencies_result } pub async fn add_package_reqs_raw( @@ -381,6 +384,12 @@ impl ManagedCliNpmResolver { } let mut result = self.resolution.add_package_reqs(packages).await; + + if result.dependencies_result.is_ok() { + if let Some(lockfile) = self.maybe_lockfile.as_ref() { + result.dependencies_result = lockfile.error_if_changed(); + } + } if result.dependencies_result.is_ok() { result.dependencies_result = self.cache_packages().await.map_err(AnyError::from); @@ -442,14 +451,19 @@ impl ManagedCliNpmResolver { self.resolution.resolve_pkg_id_from_pkg_req(req) } + /// Ensures that the top level `package.json` dependencies are installed. + /// This may set up the `node_modules` directory. + /// + /// Returns `true` if any changes (such as caching packages) were made. + /// If this returns `false`, `node_modules` has _not_ been set up. pub async fn ensure_top_level_package_json_install( &self, - ) -> Result<(), AnyError> { + ) -> Result { let Some(reqs) = self.package_json_deps_provider.reqs() else { - return Ok(()); + return Ok(false); }; if !self.top_level_install_flag.raise() { - return Ok(()); // already did this + return Ok(false); // already did this } // check if something needs resolving before bothering to load all // the package information (which is slow) @@ -460,11 +474,11 @@ impl ManagedCliNpmResolver { log::debug!( "All package.json deps resolvable. Skipping top level install." ); - return Ok(()); // everything is already resolvable + return Ok(false); // everything is already resolvable } let reqs = reqs.into_iter().cloned().collect::>(); - self.add_package_reqs(&reqs).await + self.add_package_reqs(&reqs).await.map(|_| true) } pub async fn cache_package_info( -- cgit v1.2.3