From 11f225ef7d8d51a048c11c57f47674e1c5bb6f3e Mon Sep 17 00:00:00 2001 From: David Sherret Date: Mon, 13 Mar 2023 10:03:19 -0400 Subject: [PATCH] fix: ensure no node_modules directory is created when a package.json exists and no npm dependencies are used (#18134) Closes #18133 Closes #18038 --- cli/npm/resolution/snapshot.rs | 5 ++++ cli/npm/resolvers/local.rs | 4 ++++ cli/tests/integration/run_tests.rs | 38 ++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/cli/npm/resolution/snapshot.rs b/cli/npm/resolution/snapshot.rs index e986294eca..e8df8286ec 100644 --- a/cli/npm/resolution/snapshot.rs +++ b/cli/npm/resolution/snapshot.rs @@ -127,6 +127,11 @@ mod map_to_vec { } impl NpmResolutionSnapshot { + /// Gets if this snapshot is empty. + pub fn is_empty(&self) -> bool { + self.packages.is_empty() && self.pending_unresolved_packages.is_empty() + } + /// Resolve a package from a package requirement. pub fn resolve_pkg_from_pkg_req( &self, diff --git a/cli/npm/resolvers/local.rs b/cli/npm/resolvers/local.rs index 89f5decd85..3e2710165f 100644 --- a/cli/npm/resolvers/local.rs +++ b/cli/npm/resolvers/local.rs @@ -236,6 +236,10 @@ async fn sync_resolution_with_fs( registry_url: &Url, root_node_modules_dir_path: &Path, ) -> Result<(), AnyError> { + if snapshot.is_empty() { + return Ok(()); // don't create the directory + } + let deno_local_registry_dir = root_node_modules_dir_path.join(".deno"); fs::create_dir_all(&deno_local_registry_dir).with_context(|| { format!("Creating '{}'", deno_local_registry_dir.display()) diff --git a/cli/tests/integration/run_tests.rs b/cli/tests/integration/run_tests.rs index 0e1516cc32..3a19564a39 100644 --- a/cli/tests/integration/run_tests.rs +++ b/cli/tests/integration/run_tests.rs @@ -2867,6 +2867,44 @@ fn package_json_error_dep_value_test() { .assert_matches_file("package_json/invalid_value/task.out"); } +#[test] +fn package_json_no_node_modules_dir_created() { + // it should not create a node_modules directory + let context = TestContextBuilder::new() + .add_npm_env_vars() + .use_temp_cwd() + .build(); + let temp_dir = context.deno_dir(); + + temp_dir.write("deno.json", "{}"); + temp_dir.write("package.json", "{}"); + temp_dir.write("main.ts", ""); + + context.new_command().args("run main.ts").run(); + + assert!(!temp_dir.path().join("node_modules").exists()); +} + +#[test] +fn node_modules_dir_no_npm_specifiers_no_dir_created() { + // it should not create a node_modules directory + let context = TestContextBuilder::new() + .add_npm_env_vars() + .use_temp_cwd() + .build(); + let temp_dir = context.deno_dir(); + + temp_dir.write("deno.json", "{}"); + temp_dir.write("main.ts", ""); + + context + .new_command() + .args("run --node-modules-dir main.ts") + .run(); + + assert!(!temp_dir.path().join("node_modules").exists()); +} + itest!(wasm_streaming_panic_test { args: "run run/wasm_streaming_panic_test.js", output: "run/wasm_streaming_panic_test.js.out",