diff --git a/cli/args/mod.rs b/cli/args/mod.rs index ccf00425bd..9e63ce889d 100644 --- a/cli/args/mod.rs +++ b/cli/args/mod.rs @@ -72,6 +72,7 @@ use std::sync::Arc; use thiserror::Error; use crate::args::import_map::enhance_import_map_value_with_workspace_members; +use crate::cache; use crate::file_fetcher::FileFetcher; use crate::util::fs::canonicalize_path_maybe_not_exists; use crate::version; @@ -592,6 +593,7 @@ pub fn discover_npmrc( Ok(Arc::new(resolved)) } + // 1. Try `.npmrc` next to `package.json` if let Some(package_json_path) = maybe_package_json_path { if let Some(package_json_dir) = package_json_path.parent() { if let Some((source, path)) = try_to_read_npmrc(package_json_dir)? { @@ -600,6 +602,7 @@ pub fn discover_npmrc( } } + // 2. Try `.npmrc` next to `deno.json(c)` if let Some(deno_json_path) = maybe_deno_json_path { if let Some(deno_json_dir) = deno_json_path.parent() { if let Some((source, path)) = try_to_read_npmrc(deno_json_dir)? { @@ -608,6 +611,15 @@ pub fn discover_npmrc( } } + // TODO(bartlomieju): update to read both files - one in the project root and one and + // home dir and then merge them. + // 3. Try `.npmrc` in the user's home directory + if let Some(home_dir) = cache::home_dir() { + if let Some((source, path)) = try_to_read_npmrc(&home_dir)? { + return try_to_parse_npmrc(source, &path).map(|r| (r, Some(path))); + } + } + log::debug!("No .npmrc file found"); Ok((create_default_npmrc(), None)) } diff --git a/cli/cache/deno_dir.rs b/cli/cache/deno_dir.rs index 00df41c5ac..05de1cf7cc 100644 --- a/cli/cache/deno_dir.rs +++ b/cli/cache/deno_dir.rs @@ -169,7 +169,7 @@ impl DenoDir { /// To avoid the poorly managed dirs crate #[cfg(not(windows))] -mod dirs { +pub mod dirs { use std::path::PathBuf; pub fn cache_dir() -> Option { @@ -227,7 +227,7 @@ mod dirs { // https://github.com/dirs-dev/dirs-sys-rs/blob/ec7cee0b3e8685573d847f0a0f60aae3d9e07fa2/src/lib.rs#L140-L164 // MIT license. Copyright (c) 2018-2019 dirs-rs contributors #[cfg(windows)] -mod dirs { +pub mod dirs { use std::ffi::OsString; use std::os::windows::ffi::OsStringExt; use std::path::PathBuf; diff --git a/cli/cache/mod.rs b/cli/cache/mod.rs index 64d046c153..3430f74f70 100644 --- a/cli/cache/mod.rs +++ b/cli/cache/mod.rs @@ -43,6 +43,7 @@ pub use caches::Caches; pub use check::TypeCheckCache; pub use code_cache::CodeCache; pub use common::FastInsecureHasher; +pub use deno_dir::dirs::home_dir; pub use deno_dir::DenoDir; pub use deno_dir::DenoDirProvider; pub use disk_cache::DiskCache; diff --git a/tests/specs/npm/npmrc_homedir/.npmrc b/tests/specs/npm/npmrc_homedir/.npmrc new file mode 100644 index 0000000000..13552ad61f --- /dev/null +++ b/tests/specs/npm/npmrc_homedir/.npmrc @@ -0,0 +1,4 @@ +@denotest:registry=http://localhost:4261/ +//localhost:4261/:_authToken=private-reg-token +@denotest2:registry=http://localhost:4262/ +//localhost:4262/:_authToken=private-reg-token2 diff --git a/tests/specs/npm/npmrc_homedir/__test__.jsonc b/tests/specs/npm/npmrc_homedir/__test__.jsonc new file mode 100644 index 0000000000..26fce7fd8b --- /dev/null +++ b/tests/specs/npm/npmrc_homedir/__test__.jsonc @@ -0,0 +1,11 @@ +{ + "if": "unix", + "tempDir": true, + "envs": { + "DENO_FUTURE": "1", + "HOME": "$PWD/../" + }, + "cwd": "subdir", + "args": "install", + "output": "install.out" +} diff --git a/tests/specs/npm/npmrc_homedir/install.out b/tests/specs/npm/npmrc_homedir/install.out new file mode 100644 index 0000000000..5c2ff35629 --- /dev/null +++ b/tests/specs/npm/npmrc_homedir/install.out @@ -0,0 +1,9 @@ +⚠️ `deno install` behavior will change in Deno 2. To preserve the current behavior use the `-g` or `--global` flag. +[UNORDERED_START] +Download http://localhost:4261/@denotest/basic +Download http://localhost:4262/@denotest2/basic +Download http://localhost:4261/@denotest/basic/1.0.0.tgz +Download http://localhost:4262/@denotest2/basic/1.0.0.tgz +Initialize @denotest2/basic@1.0.0 +Initialize @denotest/basic@1.0.0 +[UNORDERED_END] diff --git a/tests/specs/npm/npmrc_homedir/subdir/main.js b/tests/specs/npm/npmrc_homedir/subdir/main.js new file mode 100644 index 0000000000..66b3936360 --- /dev/null +++ b/tests/specs/npm/npmrc_homedir/subdir/main.js @@ -0,0 +1,8 @@ +import { getValue, setValue } from "@denotest/basic"; +import * as test from "@denotest2/basic"; + +console.log(getValue()); +setValue(42); +console.log(getValue()); + +console.log(test.getValue()); diff --git a/tests/specs/npm/npmrc_homedir/subdir/package.json b/tests/specs/npm/npmrc_homedir/subdir/package.json new file mode 100644 index 0000000000..274d1ed7f4 --- /dev/null +++ b/tests/specs/npm/npmrc_homedir/subdir/package.json @@ -0,0 +1,8 @@ +{ + "name": "npmrc_test", + "version": "0.0.1", + "dependencies": { + "@denotest/basic": "1.0.0", + "@denotest2/basic": "1.0.0" + } +} diff --git a/tests/util/server/src/builders.rs b/tests/util/server/src/builders.rs index 58563bd03b..4130a44e7e 100644 --- a/tests/util/server/src/builders.rs +++ b/tests/util/server/src/builders.rs @@ -32,6 +32,7 @@ use crate::npm_registry_unset_url; use crate::pty::Pty; use crate::strip_ansi_codes; use crate::testdata_path; +use crate::tests_path; use crate::HttpServerGuard; use crate::TempDir; @@ -837,6 +838,7 @@ impl TestCommandBuilder { text .replace("$DENO_DIR", &self.deno_dir.path().to_string_lossy()) .replace("$TESTDATA", &testdata_path().to_string_lossy()) + .replace("$TESTS", &tests_path().to_string_lossy()) .replace("$PWD", &cwd.to_string_lossy()) } }