From 3e511d03ae26ca7745d5a6f5f9f11fffa0a06fc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Thu, 25 Apr 2024 17:55:36 +0200 Subject: [PATCH 01/40] bump crates --- Cargo.lock | 8 ++++---- cli/Cargo.toml | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6a3f9fd76e7063..bd8a0d20a0023c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1738,9 +1738,9 @@ dependencies = [ [[package]] name = "deno_npm" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcd4f91bb7139c031791f135aa1785e08a828795d5daaefe981b9f9292f66e91" +checksum = "576677e5490ed95c9b552a0ac52aef58fd8247403db87110d02e9e641f7d034a" dependencies = [ "anyhow", "async-trait", @@ -2520,9 +2520,9 @@ dependencies = [ [[package]] name = "eszip" -version = "0.68.2" +version = "0.68.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e478354842a7ee02c685221da61b7ecee919283e65818167d0f8ce60cca70798" +checksum = "826be631a66a753a7b0a1e3c57a3448d1a4b91689a7eb38ecfee7828245d7a7c" dependencies = [ "anyhow", "base64", diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 761be4d0691037..8f5cded865518a 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -72,12 +72,12 @@ deno_emit = "=0.40.1" deno_graph = { version = "=0.74.0", features = ["tokio_executor"] } deno_lint = { version = "=0.58.4", features = ["docs"] } deno_lockfile.workspace = true -deno_npm = "=0.18.0" +deno_npm = "=0.19.0" deno_runtime = { workspace = true, features = ["include_js_files_for_snapshotting"] } deno_semver = "=0.5.4" deno_task_shell = "=0.16.0" deno_terminal.workspace = true -eszip = "=0.68.2" +eszip = "=0.68.3" napi_sym.workspace = true async-trait.workspace = true From 0a7839ddc00f0dca637e08da0a6abc5d5272c797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Thu, 25 Apr 2024 18:23:34 +0200 Subject: [PATCH 02/40] feat: discover .npmrc file --- cli/args/mod.rs | 43 ++++++++++++++++++++++++++++ cli/lsp/config.rs | 5 ++++ cli/lsp/language_server.rs | 1 + tests/specs/npm/npmrc/.npmrc | 2 ++ tests/specs/npm/npmrc/__test__.jsonc | 5 ++++ tests/specs/npm/npmrc/deno.json | 11 +++++++ tests/specs/npm/npmrc/main.js | 5 ++++ tests/specs/npm/npmrc/main.out | 2 ++ tests/specs/npm/npmrc/package.json | 7 +++++ 9 files changed, 81 insertions(+) create mode 100644 tests/specs/npm/npmrc/.npmrc create mode 100644 tests/specs/npm/npmrc/__test__.jsonc create mode 100644 tests/specs/npm/npmrc/deno.json create mode 100644 tests/specs/npm/npmrc/main.js create mode 100644 tests/specs/npm/npmrc/main.out create mode 100644 tests/specs/npm/npmrc/package.json diff --git a/cli/args/mod.rs b/cli/args/mod.rs index bb0ef1abac8927..ec696bb99e6e4b 100644 --- a/cli/args/mod.rs +++ b/cli/args/mod.rs @@ -12,6 +12,7 @@ use self::package_json::PackageJsonDeps; use ::import_map::ImportMap; use deno_ast::SourceMapOption; use deno_core::resolve_url_or_path; +use deno_npm::npm_rc::NpmRc; use deno_npm::resolution::ValidSerializedNpmResolutionSnapshot; use deno_npm::NpmSystemInfo; use deno_runtime::deno_tls::RootCertStoreProvider; @@ -545,6 +546,39 @@ fn discover_package_json( Ok(None) } +// TODO(bartlomieju): improve discovery, right now we're just looking at CWD +/// Discover `.npmrc` file. If `maybe_stop_at` is provided, we will stop +/// crawling up the directory tree at that path. +fn discover_npmrc( + _flags: &Flags, + _maybe_stop_at: Option, + current_dir: &Path, +) -> Result>, AnyError> { + const NPMRC_NAME: &str = ".npmrc"; + + let path = current_dir.join(NPMRC_NAME); + let maybe_source = match std::fs::read_to_string(&path) { + Ok(source) => Some(source), + Err(err) if err.kind() == std::io::ErrorKind::NotFound => None, + Err(err) => bail!("Error loading .npmrc at {}. {:#}", path.display(), err), + }; + + fn get_env_var(var_name: &str) -> Option { + std::env::var(var_name).ok() + } + + if let Some(source) = maybe_source { + let npmrc = deno_npm::npm_rc::parse_npm_rc(&source, &get_env_var) + .with_context(|| { + format!("Failed to parse .npmrc at {}", path.display()) + })?; + return Ok(Some(Arc::new(npmrc))); + } + + log::debug!("No .npmrc file found"); + Ok(None) +} + struct CliRootCertStoreProvider { cell: OnceCell, maybe_root_path: Option, @@ -721,6 +755,7 @@ pub struct CliOptions { maybe_vendor_folder: Option, maybe_config_file: Option, maybe_package_json: Option, + maybe_npmrc: Option>, maybe_lockfile: Option>>, overrides: CliOptionOverrides, maybe_workspace_config: Option, @@ -735,6 +770,7 @@ impl CliOptions { maybe_config_file: Option, maybe_lockfile: Option>>, maybe_package_json: Option, + maybe_npmrc: Option>, force_global_cache: bool, ) -> Result { if let Some(insecure_allowlist) = @@ -794,6 +830,7 @@ impl CliOptions { maybe_config_file, maybe_lockfile, maybe_package_json, + maybe_npmrc, maybe_node_modules_folder, maybe_vendor_folder, overrides: Default::default(), @@ -827,6 +864,7 @@ impl CliOptions { )?; let mut maybe_package_json = None; + let mut maybe_npmrc = None; if flags.config_flag == deno_config::ConfigFlag::Disabled || flags.no_npm || has_flag_env_var("DENO_NO_PACKAGE_JSON") @@ -847,6 +885,9 @@ impl CliOptions { } else { maybe_package_json = discover_package_json(&flags, None, &initial_cwd)?; } + if maybe_package_json.is_some() { + maybe_npmrc = discover_npmrc(&flags, None, &initial_cwd)?; + } let maybe_lock_file = lockfile::discover(&flags, maybe_config_file.as_ref())?; @@ -856,6 +897,7 @@ impl CliOptions { maybe_config_file, maybe_lock_file.map(|l| Arc::new(Mutex::new(l))), maybe_package_json, + maybe_npmrc, false, ) } @@ -1157,6 +1199,7 @@ impl CliOptions { maybe_vendor_folder: self.maybe_vendor_folder.clone(), maybe_config_file: self.maybe_config_file.clone(), maybe_package_json: self.maybe_package_json.clone(), + maybe_npmrc: self.maybe_npmrc.clone(), maybe_lockfile: self.maybe_lockfile.clone(), maybe_workspace_config: self.maybe_workspace_config.clone(), overrides: self.overrides.clone(), diff --git a/cli/lsp/config.rs b/cli/lsp/config.rs index 2bbd3ea7e97483..dc58f871c6e360 100644 --- a/cli/lsp/config.rs +++ b/cli/lsp/config.rs @@ -23,6 +23,7 @@ use deno_core::serde_json::json; use deno_core::serde_json::Value; use deno_core::ModuleSpecifier; use deno_lockfile::Lockfile; +use deno_npm::npm_rc::NpmRc; use deno_runtime::deno_node::PackageJson; use deno_runtime::fs_util::specifier_to_file_path; use deno_runtime::permissions::PermissionsContainer; @@ -1160,6 +1161,7 @@ pub struct ConfigData { pub vendor_dir: Option, pub lockfile: Option>>, pub package_json: Option>, + pub npmrc: Option>, pub import_map: Option>, pub import_map_from_settings: bool, watched_files: HashMap, @@ -1342,6 +1344,8 @@ impl ConfigData { // Load package.json let mut package_json = None; + // TODO(bartlomieju): support discovering .npmrc + let npmrc = None; if let Ok(path) = specifier_to_file_path(scope) { let path = path.join("package.json"); if let Ok(specifier) = ModuleSpecifier::from_file_path(&path) { @@ -1497,6 +1501,7 @@ impl ConfigData { vendor_dir, lockfile: lockfile.map(Mutex::new).map(Arc::new), package_json: package_json.map(Arc::new), + npmrc: npmrc.map(Arc::new), import_map: import_map.map(Arc::new), import_map_from_settings, watched_files, diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs index f15f40f1bfa6cb..f16f872ba63e7d 100644 --- a/cli/lsp/language_server.rs +++ b/cli/lsp/language_server.rs @@ -3527,6 +3527,7 @@ impl Inner { config_data.and_then(|d| d.config_file.as_deref().cloned()), config_data.and_then(|d| d.lockfile.clone()), config_data.and_then(|d| d.package_json.as_deref().cloned()), + config_data.and_then(|d| d.npmrc.clone()), force_global_cache, )?; diff --git a/tests/specs/npm/npmrc/.npmrc b/tests/specs/npm/npmrc/.npmrc new file mode 100644 index 00000000000000..2c7bc791c48001 --- /dev/null +++ b/tests/specs/npm/npmrc/.npmrc @@ -0,0 +1,2 @@ +@denotest:registry=http://127.0.0.1:4251/ +//127.0.0.1:4251/denotest/:_authToken=private-reg-token-asdf diff --git a/tests/specs/npm/npmrc/__test__.jsonc b/tests/specs/npm/npmrc/__test__.jsonc new file mode 100644 index 00000000000000..f942507716987a --- /dev/null +++ b/tests/specs/npm/npmrc/__test__.jsonc @@ -0,0 +1,5 @@ +{ + "tempDir": true, + "args": "run -A main.js", + "output": "main.out" +} diff --git a/tests/specs/npm/npmrc/deno.json b/tests/specs/npm/npmrc/deno.json new file mode 100644 index 00000000000000..ae2f9c1ae854d4 --- /dev/null +++ b/tests/specs/npm/npmrc/deno.json @@ -0,0 +1,11 @@ +{ + "nodeModulesDir": true, + "imports": { + "preact": "npm:preact", + "preact-render-to-string": "npm:preact-render-to-string" + }, + "compilerOptions": { + "jsx": "react-jsx", + "jsxImportSource": "preact" + } +} diff --git a/tests/specs/npm/npmrc/main.js b/tests/specs/npm/npmrc/main.js new file mode 100644 index 00000000000000..81dd521da72565 --- /dev/null +++ b/tests/specs/npm/npmrc/main.js @@ -0,0 +1,5 @@ +import { getValue, setValue } from "@denotest/esm-basic"; + +console.log(getValue()); +setValue(42); +console.log(getValue()); diff --git a/tests/specs/npm/npmrc/main.out b/tests/specs/npm/npmrc/main.out new file mode 100644 index 00000000000000..dcd912c89fdceb --- /dev/null +++ b/tests/specs/npm/npmrc/main.out @@ -0,0 +1,2 @@ +0 +42 diff --git a/tests/specs/npm/npmrc/package.json b/tests/specs/npm/npmrc/package.json new file mode 100644 index 00000000000000..99feed9d83ae09 --- /dev/null +++ b/tests/specs/npm/npmrc/package.json @@ -0,0 +1,7 @@ +{ + "name": "npmrc_test", + "version": "0.0.1", + "dependencies": { + "@denotest/esm-basic": "1.0.0" + } +} From 6abaf3d8ebd8869a2dc73218a2602065848efde1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Thu, 25 Apr 2024 18:38:13 +0200 Subject: [PATCH 03/40] get correct URL for info --- cli/args/mod.rs | 4 ++++ cli/factory.rs | 1 + cli/lsp/language_server.rs | 2 ++ cli/npm/managed/mod.rs | 3 +++ cli/npm/managed/registry.rs | 15 ++++++++++++++- cli/standalone/mod.rs | 4 ++++ 6 files changed, 28 insertions(+), 1 deletion(-) diff --git a/cli/args/mod.rs b/cli/args/mod.rs index ec696bb99e6e4b..4d7ad747baae45 100644 --- a/cli/args/mod.rs +++ b/cli/args/mod.rs @@ -1331,6 +1331,10 @@ impl CliOptions { &self.maybe_package_json } + pub fn maybe_npmrc(&self) -> &Option> { + &self.maybe_npmrc + } + pub fn maybe_package_json_deps(&self) -> Option { if matches!( self.flags.subcommand, diff --git a/cli/factory.rs b/cli/factory.rs index bfaf96f39cdfea..e75325ce8bd103 100644 --- a/cli/factory.rs +++ b/cli/factory.rs @@ -447,6 +447,7 @@ impl CliFactory { ), npm_system_info: self.options.npm_system_info(), npm_registry_url: crate::args::npm_registry_url().to_owned(), + maybe_npmrc: self.options.maybe_npmrc().clone() }) }).await }.boxed_local()) diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs index f16f872ba63e7d..8d76323049c4ab 100644 --- a/cli/lsp/language_server.rs +++ b/cli/lsp/language_server.rs @@ -885,6 +885,8 @@ async fn create_npm_resolver( CliNpmResolverManagedPackageJsonInstallerOption::NoInstall, npm_registry_url: crate::args::npm_registry_url().to_owned(), npm_system_info: NpmSystemInfo::default(), + // TODO(bartlomieju): support .npmrc here + maybe_npmrc: None, }) }) .await diff --git a/cli/npm/managed/mod.rs b/cli/npm/managed/mod.rs index 0625911d349d74..3b0e4f676216df 100644 --- a/cli/npm/managed/mod.rs +++ b/cli/npm/managed/mod.rs @@ -11,6 +11,7 @@ use deno_core::parking_lot::Mutex; use deno_core::serde_json; use deno_core::url::Url; use deno_graph::NpmPackageReqResolution; +use deno_npm::npm_rc::NpmRc; use deno_npm::registry::NpmRegistryApi; use deno_npm::resolution::NpmResolutionSnapshot; use deno_npm::resolution::PackageReqNotFoundError; @@ -73,6 +74,7 @@ pub struct CliNpmResolverManagedCreateOptions { pub npm_system_info: NpmSystemInfo, pub package_json_installer: CliNpmResolverManagedPackageJsonInstallerOption, pub npm_registry_url: Url, + pub maybe_npmrc: Option>, } pub async fn create_managed_npm_resolver_for_lsp( @@ -191,6 +193,7 @@ fn create_api( options.npm_registry_url.clone(), npm_cache.clone(), options.http_client.clone(), + options.maybe_npmrc.clone(), options.text_only_progress_bar.clone(), )) } diff --git a/cli/npm/managed/registry.rs b/cli/npm/managed/registry.rs index 3199a3c32849f5..1bea54cfdab338 100644 --- a/cli/npm/managed/registry.rs +++ b/cli/npm/managed/registry.rs @@ -18,6 +18,7 @@ use deno_core::futures::FutureExt; use deno_core::parking_lot::Mutex; use deno_core::serde_json; use deno_core::url::Url; +use deno_npm::npm_rc::NpmRc; use deno_npm::registry::NpmPackageInfo; use deno_npm::registry::NpmRegistryApi; use deno_npm::registry::NpmRegistryPackageInfoLoadError; @@ -39,6 +40,7 @@ impl CliNpmRegistryApi { base_url: Url, cache: Arc, http_client: Arc, + maybe_npmrc: Option>, progress_bar: ProgressBar, ) -> Self { Self(Some(Arc::new(CliNpmRegistryApiInner { @@ -47,6 +49,7 @@ impl CliNpmRegistryApi { force_reload_flag: Default::default(), mem_cache: Default::default(), previously_reloaded_packages: Default::default(), + maybe_npmrc, http_client, progress_bar, }))) @@ -127,6 +130,7 @@ struct CliNpmRegistryApiInner { mem_cache: Mutex>, previously_reloaded_packages: Mutex>, http_client: Arc, + maybe_npmrc: Option>, progress_bar: ProgressBar, } @@ -303,6 +307,7 @@ impl CliNpmRegistryApiInner { let maybe_bytes = self .http_client + // TODO: Use .npmrc here to pass auth token .download_with_progress(package_url, &guard) .await?; match maybe_bytes { @@ -331,7 +336,15 @@ impl CliNpmRegistryApiInner { .remove(b'@') .remove(b'_') .remove(b'~'); - let name = percent_encoding::utf8_percent_encode(name, &ASCII_SET); + let encoded_name = percent_encoding::utf8_percent_encode(name, &ASCII_SET); + + if let Some(npmrc) = self.maybe_npmrc.as_ref() { + let maybe_config = npmrc.config_for_package(name, self.base_url.as_str()); + if let Some(config) = maybe_config { + return config.base_url.join(&encoded_name.to_string()).unwrap(); + } + } + self.base_url.join(&name.to_string()).unwrap() } diff --git a/cli/standalone/mod.rs b/cli/standalone/mod.rs index 8ff822f5a32ee5..34fbeda33ae726 100644 --- a/cli/standalone/mod.rs +++ b/cli/standalone/mod.rs @@ -386,6 +386,8 @@ pub async fn run( ), npm_registry_url, npm_system_info: Default::default(), + // TODO(bartlomieju): do we need to support it here? + maybe_npmrc: None, }), ) .await?; @@ -442,6 +444,8 @@ pub async fn run( ), npm_registry_url, npm_system_info: Default::default(), + // TODO(bartlomieju): do we need to support it here? + maybe_npmrc: None, }), ) .await?; From deb83678ad055671da7b993284d83adbfb1a3102 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Thu, 25 Apr 2024 21:14:25 +0200 Subject: [PATCH 04/40] can auth --- Cargo.lock | 4 +-- Cargo.toml | 3 ++ cli/Cargo.toml | 2 +- cli/args/mod.rs | 7 ++-- cli/http_util.rs | 27 +++++++++++---- cli/npm/managed/cache.rs | 2 +- cli/npm/managed/registry.rs | 59 ++++++++++++++++++++++++--------- cli/standalone/binary.rs | 2 +- cli/tools/installer.rs | 2 +- cli/tools/upgrade.rs | 2 +- tests/specs/npm/npmrc/.npmrc | 4 +-- tests/specs/npm/npmrc/deno.json | 11 ------ 12 files changed, 78 insertions(+), 47 deletions(-) delete mode 100644 tests/specs/npm/npmrc/deno.json diff --git a/Cargo.lock b/Cargo.lock index bd8a0d20a0023c..832e109ab8791c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1738,9 +1738,7 @@ dependencies = [ [[package]] name = "deno_npm" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "576677e5490ed95c9b552a0ac52aef58fd8247403db87110d02e9e641f7d034a" +version = "0.19.1" dependencies = [ "anyhow", "async-trait", diff --git a/Cargo.toml b/Cargo.toml index 8808058be29340..414af61d300733 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -370,3 +370,6 @@ opt-level = 3 opt-level = 3 [profile.release.package.base64-simd] opt-level = 3 + +[patch.crates-io] +deno_npm = { path = "../deno_npm" } diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 8f5cded865518a..879bf62ea46420 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -72,7 +72,7 @@ deno_emit = "=0.40.1" deno_graph = { version = "=0.74.0", features = ["tokio_executor"] } deno_lint = { version = "=0.58.4", features = ["docs"] } deno_lockfile.workspace = true -deno_npm = "=0.19.0" +deno_npm = "=0.19.1" deno_runtime = { workspace = true, features = ["include_js_files_for_snapshotting"] } deno_semver = "=0.5.4" deno_task_shell = "=0.16.0" diff --git a/cli/args/mod.rs b/cli/args/mod.rs index 4d7ad747baae45..757008140f0a84 100644 --- a/cli/args/mod.rs +++ b/cli/args/mod.rs @@ -568,10 +568,9 @@ fn discover_npmrc( } if let Some(source) = maybe_source { - let npmrc = deno_npm::npm_rc::parse_npm_rc(&source, &get_env_var) - .with_context(|| { - format!("Failed to parse .npmrc at {}", path.display()) - })?; + let npmrc = NpmRc::parse(&source, &get_env_var).with_context(|| { + format!("Failed to parse .npmrc at {}", path.display()) + })?; return Ok(Some(Arc::new(npmrc))); } diff --git a/cli/http_util.rs b/cli/http_util.rs index 30507a629b314c..029cadeeb428ff 100644 --- a/cli/http_util.rs +++ b/cli/http_util.rs @@ -17,6 +17,8 @@ use deno_runtime::deno_fetch::reqwest::header::LOCATION; use deno_runtime::deno_fetch::reqwest::Response; use deno_runtime::deno_fetch::CreateHttpClientOptions; use deno_runtime::deno_tls::RootCertStoreProvider; +use reqwest::header::HeaderName; +use reqwest::header::HeaderValue; use std::collections::HashMap; use std::sync::Arc; use std::time::Duration; @@ -294,7 +296,7 @@ impl HttpClient { &self, url: U, ) -> Result, AnyError> { - let maybe_bytes = self.inner_download(url, None).await?; + let maybe_bytes = self.inner_download(url, None, None).await?; match maybe_bytes { Some(bytes) => Ok(bytes), None => Err(custom_error("Http", "Not found.")), @@ -304,17 +306,21 @@ impl HttpClient { pub async fn download_with_progress( &self, url: U, + maybe_header: Option<(HeaderName, HeaderValue)>, progress_guard: &UpdateGuard, ) -> Result>, AnyError> { - self.inner_download(url, Some(progress_guard)).await + self + .inner_download(url, maybe_header, Some(progress_guard)) + .await } async fn inner_download( &self, url: U, + maybe_header: Option<(HeaderName, HeaderValue)>, progress_guard: Option<&UpdateGuard>, ) -> Result>, AnyError> { - let response = self.get_redirected_response(url).await?; + let response = self.get_redirected_response(url, maybe_header).await?; if response.status() == 404 { return Ok(None); @@ -339,15 +345,24 @@ impl HttpClient { pub async fn get_redirected_response( &self, url: U, + maybe_header: Option<(HeaderName, HeaderValue)>, ) -> Result { let mut url = url.into_url()?; - let mut response = self.get_no_redirect(url.clone())?.send().await?; + + let mut builder = self.get_no_redirect(url.clone())?; + if let Some((header_name, header_value)) = maybe_header.as_ref() { + builder = builder.header(header_name, header_value); + } + let mut response = builder.send().await?; let status = response.status(); if status.is_redirection() { for _ in 0..5 { let new_url = resolve_redirect_from_response(&url, &response)?; - let new_response = - self.get_no_redirect(new_url.clone())?.send().await?; + let mut builder = self.get_no_redirect(new_url.clone())?; + if let Some((header_name, header_value)) = maybe_header.as_ref() { + builder = builder.header(header_name, header_value); + } + let new_response = builder.send().await?; let status = new_response.status(); if status.is_redirection() { response = new_response; diff --git a/cli/npm/managed/cache.rs b/cli/npm/managed/cache.rs index 9ba5c1c9963082..a0ba3a920d30e1 100644 --- a/cli/npm/managed/cache.rs +++ b/cli/npm/managed/cache.rs @@ -123,7 +123,7 @@ impl NpmCache { let guard = self.progress_bar.update(&dist.tarball); let maybe_bytes = self .http_client - .download_with_progress(&dist.tarball, &guard) + .download_with_progress(&dist.tarball, None, &guard) .await?; match maybe_bytes { Some(bytes) => { diff --git a/cli/npm/managed/registry.rs b/cli/npm/managed/registry.rs index 1bea54cfdab338..dc432f2d4debdc 100644 --- a/cli/npm/managed/registry.rs +++ b/cli/npm/managed/registry.rs @@ -277,13 +277,33 @@ impl CliNpmRegistryApiInner { &self, name: &str, ) -> Result, AnyError> { + let mut registry_url = self.base_url.clone(); + let mut maybe_registry_config: Option<&deno_npm::npm_rc::RegistryConfig> = + None; + + eprintln!("{:?}", self.maybe_npmrc); + if let Some(npmrc) = self.maybe_npmrc.as_ref() { + let maybe_registry_url_and_config = + npmrc.registry_url_and_config_for_package(name, self.base_url.as_str()); + if let Some((registry_url_str, config)) = maybe_registry_url_and_config { + registry_url = Url::parse(®istry_url_str).with_context(|| { + format!("Failed to parse registry URL: '{}'", registry_url_str) + })?; + maybe_registry_config = Some(config); + } + } + self - .load_package_info_from_registry_inner(name) + .load_package_info_from_registry_inner( + name, + ®istry_url, + maybe_registry_config, + ) .await .with_context(|| { format!( "Error getting response at {} for package \"{}\"", - self.get_package_url(name), + self.get_package_url(name, ®istry_url), name ) }) @@ -292,6 +312,8 @@ impl CliNpmRegistryApiInner { async fn load_package_info_from_registry_inner( &self, name: &str, + registry_url: &Url, + maybe_registry_config: Option<&deno_npm::npm_rc::RegistryConfig>, ) -> Result, AnyError> { if *self.cache.cache_setting() == CacheSetting::Only { return Err(custom_error( @@ -302,13 +324,26 @@ impl CliNpmRegistryApiInner { )); } - let package_url = self.get_package_url(name); + let package_url = self.get_package_url(name, registry_url); let guard = self.progress_bar.update(package_url.as_str()); + let mut maybe_header = None; + + // TODO(bartlomieju): support more auth methods besides token + if let Some(registry_config) = maybe_registry_config { + if let Some(token) = registry_config.auth_token.as_ref() { + maybe_header = Some(( + reqwest::header::AUTHORIZATION, + reqwest::header::HeaderValue::from_str(&format!("Bearer {}", token)) + .unwrap(), + )) + } + } + + eprintln!("maybe header {:#?}", maybe_header); let maybe_bytes = self .http_client - // TODO: Use .npmrc here to pass auth token - .download_with_progress(package_url, &guard) + .download_with_progress(package_url, maybe_header, &guard) .await?; match maybe_bytes { Some(bytes) => { @@ -320,7 +355,7 @@ impl CliNpmRegistryApiInner { } } - fn get_package_url(&self, name: &str) -> Url { + fn get_package_url(&self, name: &str, registry_url: &Url) -> Url { // list of all characters used in npm packages: // !, ', (, ), *, -, ., /, [0-9], @, [A-Za-z], _, ~ const ASCII_SET: percent_encoding::AsciiSet = @@ -336,16 +371,8 @@ impl CliNpmRegistryApiInner { .remove(b'@') .remove(b'_') .remove(b'~'); - let encoded_name = percent_encoding::utf8_percent_encode(name, &ASCII_SET); - - if let Some(npmrc) = self.maybe_npmrc.as_ref() { - let maybe_config = npmrc.config_for_package(name, self.base_url.as_str()); - if let Some(config) = maybe_config { - return config.base_url.join(&encoded_name.to_string()).unwrap(); - } - } - - self.base_url.join(&name.to_string()).unwrap() + let name = percent_encoding::utf8_percent_encode(name, &ASCII_SET); + registry_url.join(&name.to_string()).unwrap() } fn get_package_file_cache_path(&self, name: &str) -> PathBuf { diff --git a/cli/standalone/binary.rs b/cli/standalone/binary.rs index c96d8385401079..77fc8485c001f4 100644 --- a/cli/standalone/binary.rs +++ b/cli/standalone/binary.rs @@ -535,7 +535,7 @@ impl<'a> DenoCompileBinaryWriter<'a> { self .client - .download_with_progress(download_url, &progress) + .download_with_progress(download_url, None, &progress) .await? }; let bytes = match maybe_bytes { diff --git a/cli/tools/installer.rs b/cli/tools/installer.rs index 6d9c1294e1c3f2..783703b46dcedb 100644 --- a/cli/tools/installer.rs +++ b/cli/tools/installer.rs @@ -138,7 +138,7 @@ pub async fn infer_name_from_url(url: &Url) -> Option { if url.path() == "/" { let client = HttpClient::new(None, None); - if let Ok(res) = client.get_redirected_response(url.clone()).await { + if let Ok(res) = client.get_redirected_response(url.clone(), None).await { url = res.url().clone(); } } diff --git a/cli/tools/upgrade.rs b/cli/tools/upgrade.rs index 6bb4606d3cf0b7..c4a9b4f67acd1c 100644 --- a/cli/tools/upgrade.rs +++ b/cli/tools/upgrade.rs @@ -626,7 +626,7 @@ async fn download_package( // text above which will stay alive after the progress bars are complete let progress = progress_bar.update(""); client - .download_with_progress(download_url, &progress) + .download_with_progress(download_url, None, &progress) .await? }; match maybe_bytes { diff --git a/tests/specs/npm/npmrc/.npmrc b/tests/specs/npm/npmrc/.npmrc index 2c7bc791c48001..705026e834d2a1 100644 --- a/tests/specs/npm/npmrc/.npmrc +++ b/tests/specs/npm/npmrc/.npmrc @@ -1,2 +1,2 @@ -@denotest:registry=http://127.0.0.1:4251/ -//127.0.0.1:4251/denotest/:_authToken=private-reg-token-asdf +@denotest:registry=http://127.0.0.1:4252/npm/registry/ +//127.0.0.1:4252/npm/registry/denotest/:_authToken=private-reg-token diff --git a/tests/specs/npm/npmrc/deno.json b/tests/specs/npm/npmrc/deno.json deleted file mode 100644 index ae2f9c1ae854d4..00000000000000 --- a/tests/specs/npm/npmrc/deno.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "nodeModulesDir": true, - "imports": { - "preact": "npm:preact", - "preact-render-to-string": "npm:preact-render-to-string" - }, - "compilerOptions": { - "jsx": "react-jsx", - "jsxImportSource": "preact" - } -} From e23e995a0f62399dc45c8bc283664fde3481ee58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Thu, 25 Apr 2024 21:15:27 +0200 Subject: [PATCH 05/40] bump deno_npm --- Cargo.lock | 4 +++- Cargo.toml | 3 --- cli/Cargo.toml | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 832e109ab8791c..3be7572aed1452 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1738,7 +1738,9 @@ dependencies = [ [[package]] name = "deno_npm" -version = "0.19.1" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8df6448aa37e06c1865b383dff8b2031bb2fa690874c7073e70f6f08ed3ee9d" dependencies = [ "anyhow", "async-trait", diff --git a/Cargo.toml b/Cargo.toml index 414af61d300733..8808058be29340 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -370,6 +370,3 @@ opt-level = 3 opt-level = 3 [profile.release.package.base64-simd] opt-level = 3 - -[patch.crates-io] -deno_npm = { path = "../deno_npm" } diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 879bf62ea46420..711b3ab3e9fcb0 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -72,7 +72,7 @@ deno_emit = "=0.40.1" deno_graph = { version = "=0.74.0", features = ["tokio_executor"] } deno_lint = { version = "=0.58.4", features = ["docs"] } deno_lockfile.workspace = true -deno_npm = "=0.19.1" +deno_npm = "=0.19.2" deno_runtime = { workspace = true, features = ["include_js_files_for_snapshotting"] } deno_semver = "=0.5.4" deno_task_shell = "=0.16.0" From 797ca2a411764c2e24787f79433bace4c5b20a0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Thu, 25 Apr 2024 21:25:23 +0200 Subject: [PATCH 06/40] change test --- cli/npm/managed/registry.rs | 3 --- tests/specs/npm/npmrc/main.out | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cli/npm/managed/registry.rs b/cli/npm/managed/registry.rs index dc432f2d4debdc..90f30ab5b4a871 100644 --- a/cli/npm/managed/registry.rs +++ b/cli/npm/managed/registry.rs @@ -281,7 +281,6 @@ impl CliNpmRegistryApiInner { let mut maybe_registry_config: Option<&deno_npm::npm_rc::RegistryConfig> = None; - eprintln!("{:?}", self.maybe_npmrc); if let Some(npmrc) = self.maybe_npmrc.as_ref() { let maybe_registry_url_and_config = npmrc.registry_url_and_config_for_package(name, self.base_url.as_str()); @@ -339,8 +338,6 @@ impl CliNpmRegistryApiInner { } } - eprintln!("maybe header {:#?}", maybe_header); - let maybe_bytes = self .http_client .download_with_progress(package_url, maybe_header, &guard) diff --git a/tests/specs/npm/npmrc/main.out b/tests/specs/npm/npmrc/main.out index dcd912c89fdceb..858ce04fb1374e 100644 --- a/tests/specs/npm/npmrc/main.out +++ b/tests/specs/npm/npmrc/main.out @@ -1,2 +1,5 @@ +Download http://127.0.0.1:4252/npm/registry/@denotest/esm-basic +Download http://127.0.0.1:4252/npm/registry/@denotest/esm-basic/1.0.0.tgz +Initialize @denotest/esm-basic@1.0.0 0 42 From 2fefcde61d3670dc855be5257434a2222e718bf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Thu, 25 Apr 2024 22:07:22 +0200 Subject: [PATCH 07/40] tarballs are downloaded from correct server, but not placed in the correct place --- cli/npm/managed/cache.rs | 41 ++++++++++++++++++++-- cli/npm/managed/mod.rs | 1 + cli/npm/managed/resolvers/common.rs | 6 ++-- tests/util/server/src/npm.rs | 51 +++++++++++++++++++++------- tests/util/server/src/servers/mod.rs | 27 +++++++++++---- 5 files changed, 102 insertions(+), 24 deletions(-) diff --git a/cli/npm/managed/cache.rs b/cli/npm/managed/cache.rs index a0ba3a920d30e1..611ffd50bcd6c1 100644 --- a/cli/npm/managed/cache.rs +++ b/cli/npm/managed/cache.rs @@ -13,6 +13,7 @@ use deno_core::error::custom_error; use deno_core::error::AnyError; use deno_core::parking_lot::Mutex; use deno_core::url::Url; +use deno_npm::npm_rc::NpmRc; use deno_npm::registry::NpmPackageVersionDistInfo; use deno_npm::NpmPackageCacheFolderId; use deno_runtime::deno_fs; @@ -34,6 +35,7 @@ pub struct NpmCache { fs: Arc, http_client: Arc, progress_bar: ProgressBar, + maybe_npmrc: Option>, /// ensures a package is only downloaded once per run previously_reloaded_packages: Mutex>, } @@ -45,6 +47,7 @@ impl NpmCache { fs: Arc, http_client: Arc, progress_bar: ProgressBar, + maybe_npmrc: Option>, ) -> Self { Self { cache_dir, @@ -53,6 +56,7 @@ impl NpmCache { http_client, progress_bar, previously_reloaded_packages: Default::default(), + maybe_npmrc, } } @@ -81,10 +85,28 @@ impl NpmCache { &self, package: &PackageNv, dist: &NpmPackageVersionDistInfo, - registry_url: &Url, + default_registry_url: &Url, ) -> Result<(), AnyError> { + let mut registry_url = default_registry_url.clone(); + let mut maybe_registry_config: Option<&deno_npm::npm_rc::RegistryConfig> = + None; + + if let Some(npmrc) = self.maybe_npmrc.as_ref() { + let maybe_registry_url_and_config = npmrc + .registry_url_and_config_for_package( + &package.name, + registry_url.as_str(), + ); + if let Some((registry_url_str, config)) = maybe_registry_url_and_config { + registry_url = Url::parse(®istry_url_str).with_context(|| { + format!("Failed to parse registry URL: '{}'", registry_url_str) + })?; + maybe_registry_config = Some(config); + } + } + self - .ensure_package_inner(package, dist, registry_url) + .ensure_package_inner(package, dist, ®istry_url, maybe_registry_config) .await .with_context(|| format!("Failed caching npm package '{package}'.")) } @@ -94,6 +116,7 @@ impl NpmCache { package: &PackageNv, dist: &NpmPackageVersionDistInfo, registry_url: &Url, + maybe_registry_config: Option<&deno_npm::npm_rc::RegistryConfig>, ) -> Result<(), AnyError> { let package_folder = self .cache_dir @@ -120,10 +143,22 @@ impl NpmCache { bail!("Tarball URL was empty."); } + let mut maybe_header = None; + // TODO(bartlomieju): support more auth methods besides token + if let Some(registry_config) = maybe_registry_config { + if let Some(token) = registry_config.auth_token.as_ref() { + maybe_header = Some(( + reqwest::header::AUTHORIZATION, + reqwest::header::HeaderValue::from_str(&format!("Bearer {}", token)) + .unwrap(), + )) + } + } + let guard = self.progress_bar.update(&dist.tarball); let maybe_bytes = self .http_client - .download_with_progress(&dist.tarball, None, &guard) + .download_with_progress(&dist.tarball, maybe_header, &guard) .await?; match maybe_bytes { Some(bytes) => { diff --git a/cli/npm/managed/mod.rs b/cli/npm/managed/mod.rs index 3b0e4f676216df..e5f1baf3c48af2 100644 --- a/cli/npm/managed/mod.rs +++ b/cli/npm/managed/mod.rs @@ -182,6 +182,7 @@ fn create_cache(options: &CliNpmResolverManagedCreateOptions) -> Arc { options.fs.clone(), options.http_client.clone(), options.text_only_progress_bar.clone(), + options.maybe_npmrc.clone(), )) } diff --git a/cli/npm/managed/resolvers/common.rs b/cli/npm/managed/resolvers/common.rs index 227805d4e78a8d..1f6baa17c000df 100644 --- a/cli/npm/managed/resolvers/common.rs +++ b/cli/npm/managed/resolvers/common.rs @@ -129,15 +129,15 @@ impl RegistryReadPermissionChecker { pub async fn cache_packages( packages: Vec, cache: &Arc, - registry_url: &Url, + default_registry_url: &Url, ) -> Result<(), AnyError> { let mut handles = Vec::with_capacity(packages.len()); for package in packages { let cache = cache.clone(); - let registry_url = registry_url.clone(); + let default_registry_url = default_registry_url.clone(); let handle = spawn(async move { cache - .ensure_package(&package.id.nv, &package.dist, ®istry_url) + .ensure_package(&package.id.nv, &package.dist, &default_registry_url) .await }); handles.push(handle); diff --git a/tests/util/server/src/npm.rs b/tests/util/server/src/npm.rs index 7469e9b9e3b06a..89e4207616bb5e 100644 --- a/tests/util/server/src/npm.rs +++ b/tests/util/server/src/npm.rs @@ -16,7 +16,21 @@ use tar::Builder; use crate::testdata_path; pub static CUSTOM_NPM_PACKAGE_CACHE: Lazy = - Lazy::new(CustomNpmPackageCache::default); + Lazy::new(|| { + CustomNpmPackageCache::new(format!( + "http://localhost:{}/npm/registry", + crate::servers::PORT, + )) + }); + +pub static CUSTOM_NPM_PACKAGE_CACHE_FOR_PRIVATE_REGISTRY: Lazy< + CustomNpmPackageCache, +> = Lazy::new(|| { + CustomNpmPackageCache::new(format!( + "http://localhost:{}/npm/registry", + crate::servers::PRIVATE_NPM_REGISTRY_1_PORT + )) +}); struct CustomNpmPackage { pub registry_file: String, @@ -25,10 +39,23 @@ struct CustomNpmPackage { /// Creates tarballs and a registry json file for npm packages /// in the `testdata/npm/registry/@denotest` directory. -#[derive(Default)] -pub struct CustomNpmPackageCache(Mutex>); +pub struct CustomNpmPackageCache { + registry_url: String, + cache: Mutex>, +} impl CustomNpmPackageCache { + pub fn new(registry_url: String) -> Self { + let registry_url = registry_url + .strip_suffix("/") + .unwrap_or(®istry_url) + .to_string(); + Self { + registry_url, + cache: Default::default(), + } + } + pub fn tarball_bytes( &self, name: &str, @@ -51,19 +78,22 @@ impl CustomNpmPackageCache { func: impl FnOnce(&CustomNpmPackage) -> TResult, ) -> Result> { // it's ok if multiple threads race here as they will do the same work twice - if !self.0.lock().contains_key(package_name) { - match get_npm_package(package_name)? { + if !self.cache.lock().contains_key(package_name) { + match get_npm_package(package_name, &self.registry_url)? { Some(package) => { - self.0.lock().insert(package_name.to_string(), package); + self.cache.lock().insert(package_name.to_string(), package); } None => return Ok(None), } } - Ok(self.0.lock().get(package_name).map(func)) + Ok(self.cache.lock().get(package_name).map(func)) } } -fn get_npm_package(package_name: &str) -> Result> { +fn get_npm_package( + package_name: &str, + registry_url: &str, +) -> Result> { let package_folder = testdata_path().join("npm/registry").join(package_name); if !package_folder.exists() { return Ok(None); @@ -111,10 +141,7 @@ fn get_npm_package(package_name: &str) -> Result> { dist.insert("shasum".to_string(), "dummy-value".into()); dist.insert( "tarball".to_string(), - format!( - "http://localhost:4545/npm/registry/{package_name}/{version}.tgz" - ) - .into(), + format!("{registry_url}/{package_name}/{version}.tgz").into(), ); tarballs.insert(version.clone(), tarball_bytes); diff --git a/tests/util/server/src/servers/mod.rs b/tests/util/server/src/servers/mod.rs index bc94c668e455c3..f1ffc124e72669 100644 --- a/tests/util/server/src/servers/mod.rs +++ b/tests/util/server/src/servers/mod.rs @@ -51,10 +51,11 @@ use hyper_utils::ServerOptions; use super::https::get_tls_listener_stream; use super::https::SupportedHttpVersions; use super::npm::CUSTOM_NPM_PACKAGE_CACHE; +use super::npm::CUSTOM_NPM_PACKAGE_CACHE_FOR_PRIVATE_REGISTRY; use super::std_path; use super::testdata_path; -const PORT: u16 = 4545; +pub(crate) const PORT: u16 = 4545; const TEST_AUTH_TOKEN: &str = "abcdef123456789"; const TEST_BASIC_AUTH_USERNAME: &str = "testuser123"; const TEST_BASIC_AUTH_PASSWORD: &str = "testpassabc"; @@ -85,7 +86,7 @@ const H2_GRPC_PORT: u16 = 4246; const H2S_GRPC_PORT: u16 = 4247; const REGISTRY_SERVER_PORT: u16 = 4250; const PROVENANCE_MOCK_SERVER_PORT: u16 = 4251; -const PRIVATE_NPM_REGISTRY_1_PORT: u16 = 4252; +pub(crate) const PRIVATE_NPM_REGISTRY_1_PORT: u16 = 4252; // Use the single-threaded scheduler. The hyper server is used as a point of // comparison for the (single-threaded!) benchmarks in cli/bench. We're not @@ -1091,7 +1092,9 @@ async fn main_server( } // serve npm registry files - if let Some(resp) = try_serve_npm_registry(&req, file_path.clone()).await + if let Some(resp) = + try_serve_npm_registry(&req, file_path.clone(), NpmRegistryKind::Public) + .await { return resp; } else if let Some(suffix) = req.uri().path().strip_prefix("/deno_std/") { @@ -1120,6 +1123,11 @@ async fn main_server( const PRIVATE_NPM_REGISTRY_AUTH_TOKEN: &str = "private-reg-token"; +enum NpmRegistryKind { + Public, + Private, +} + async fn wrap_private_npm_registry1(port: u16) { let npm_registry_addr = SocketAddr::from(([127, 0, 0, 1], port)); run_server( @@ -1153,7 +1161,9 @@ async fn private_npm_registry1( let mut file_path = testdata_path().to_path_buf(); file_path.push(&req.uri().path()[1..].replace("%2f", "/")); - if let Some(resp) = try_serve_npm_registry(&req, file_path).await { + if let Some(resp) = + try_serve_npm_registry(&req, file_path, NpmRegistryKind::Private).await + { return resp; } @@ -1165,12 +1175,16 @@ async fn private_npm_registry1( fn handle_custom_npm_registry_path( path: &str, + registry_kind: NpmRegistryKind, ) -> Result>>, anyhow::Error> { let parts = path .split('/') .filter(|p| !p.is_empty()) .collect::>(); - let cache = &CUSTOM_NPM_PACKAGE_CACHE; + let cache = match registry_kind { + NpmRegistryKind::Public => &CUSTOM_NPM_PACKAGE_CACHE, + NpmRegistryKind::Private => &CUSTOM_NPM_PACKAGE_CACHE_FOR_PRIVATE_REGISTRY, + }; let package_name = format!("@denotest/{}", parts[0]); if parts.len() == 2 { if let Some(file_bytes) = @@ -1198,6 +1212,7 @@ fn should_download_npm_packages() -> bool { async fn try_serve_npm_registry( req: &Request, mut file_path: PathBuf, + registry_kind: NpmRegistryKind, ) -> Option>, anyhow::Error>> { if let Some(suffix) = req .uri() @@ -1207,7 +1222,7 @@ async fn try_serve_npm_registry( { // serve all requests to /npm/registry/@deno using the file system // at that path - match handle_custom_npm_registry_path(suffix) { + match handle_custom_npm_registry_path(suffix, registry_kind) { Ok(Some(response)) => return Some(Ok(response)), Ok(None) => {} // ignore, not found Err(err) => { From b65c4db89613a54964f29f8a6d20293eaf8c0ef0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Thu, 25 Apr 2024 23:17:36 +0200 Subject: [PATCH 08/40] updates to latest changes --- Cargo.lock | 3 +-- Cargo.toml | 3 +++ cli/args/mod.rs | 39 ++++++++++++++++++++----------- cli/factory.rs | 2 +- cli/lsp/config.rs | 4 ++-- cli/lsp/language_server.rs | 7 ++++-- cli/npm/managed/cache.rs | 46 ++++++++++++------------------------- cli/npm/managed/mod.rs | 8 +++---- cli/npm/managed/registry.rs | 45 +++++++++++++----------------------- cli/standalone/mod.rs | 5 ++-- 10 files changed, 75 insertions(+), 87 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3be7572aed1452..8e2ce65757d347 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1739,8 +1739,6 @@ dependencies = [ [[package]] name = "deno_npm" version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8df6448aa37e06c1865b383dff8b2031bb2fa690874c7073e70f6f08ed3ee9d" dependencies = [ "anyhow", "async-trait", @@ -1751,6 +1749,7 @@ dependencies = [ "monch", "serde", "thiserror", + "url", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 8808058be29340..414af61d300733 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -370,3 +370,6 @@ opt-level = 3 opt-level = 3 [profile.release.package.base64-simd] opt-level = 3 + +[patch.crates-io] +deno_npm = { path = "../deno_npm" } diff --git a/cli/args/mod.rs b/cli/args/mod.rs index 757008140f0a84..c249e86af8d511 100644 --- a/cli/args/mod.rs +++ b/cli/args/mod.rs @@ -13,6 +13,7 @@ use ::import_map::ImportMap; use deno_ast::SourceMapOption; use deno_core::resolve_url_or_path; use deno_npm::npm_rc::NpmRc; +use deno_npm::npm_rc::ResolvedNpmRc; use deno_npm::resolution::ValidSerializedNpmResolutionSnapshot; use deno_npm::NpmSystemInfo; use deno_runtime::deno_tls::RootCertStoreProvider; @@ -553,7 +554,7 @@ fn discover_npmrc( _flags: &Flags, _maybe_stop_at: Option, current_dir: &Path, -) -> Result>, AnyError> { +) -> Result, AnyError> { const NPMRC_NAME: &str = ".npmrc"; let path = current_dir.join(NPMRC_NAME); @@ -571,11 +572,24 @@ fn discover_npmrc( let npmrc = NpmRc::parse(&source, &get_env_var).with_context(|| { format!("Failed to parse .npmrc at {}", path.display()) })?; - return Ok(Some(Arc::new(npmrc))); + let resolved = npmrc + .as_resolved(npm_registry_url()) + .with_context(|| format!("Failed to resolve .npmrc options"))?; + return Ok(Arc::new(resolved)); } log::debug!("No .npmrc file found"); - Ok(None) + Ok(create_default_npmrc()) +} + +pub fn create_default_npmrc() -> Arc { + Arc::new(ResolvedNpmRc { + default_config: deno_npm::npm_rc::RegistryConfigWithUrl { + registry_url: npm_registry_url().clone(), + config: Default::default(), + }, + scopes: Default::default(), + }) } struct CliRootCertStoreProvider { @@ -754,7 +768,7 @@ pub struct CliOptions { maybe_vendor_folder: Option, maybe_config_file: Option, maybe_package_json: Option, - maybe_npmrc: Option>, + npmrc: Arc, maybe_lockfile: Option>>, overrides: CliOptionOverrides, maybe_workspace_config: Option, @@ -769,7 +783,7 @@ impl CliOptions { maybe_config_file: Option, maybe_lockfile: Option>>, maybe_package_json: Option, - maybe_npmrc: Option>, + npmrc: Arc, force_global_cache: bool, ) -> Result { if let Some(insecure_allowlist) = @@ -829,7 +843,7 @@ impl CliOptions { maybe_config_file, maybe_lockfile, maybe_package_json, - maybe_npmrc, + npmrc, maybe_node_modules_folder, maybe_vendor_folder, overrides: Default::default(), @@ -863,7 +877,6 @@ impl CliOptions { )?; let mut maybe_package_json = None; - let mut maybe_npmrc = None; if flags.config_flag == deno_config::ConfigFlag::Disabled || flags.no_npm || has_flag_env_var("DENO_NO_PACKAGE_JSON") @@ -884,9 +897,7 @@ impl CliOptions { } else { maybe_package_json = discover_package_json(&flags, None, &initial_cwd)?; } - if maybe_package_json.is_some() { - maybe_npmrc = discover_npmrc(&flags, None, &initial_cwd)?; - } + let npmrc = discover_npmrc(&flags, None, &initial_cwd)?; let maybe_lock_file = lockfile::discover(&flags, maybe_config_file.as_ref())?; @@ -896,7 +907,7 @@ impl CliOptions { maybe_config_file, maybe_lock_file.map(|l| Arc::new(Mutex::new(l))), maybe_package_json, - maybe_npmrc, + npmrc, false, ) } @@ -1198,7 +1209,7 @@ impl CliOptions { maybe_vendor_folder: self.maybe_vendor_folder.clone(), maybe_config_file: self.maybe_config_file.clone(), maybe_package_json: self.maybe_package_json.clone(), - maybe_npmrc: self.maybe_npmrc.clone(), + npmrc: self.npmrc.clone(), maybe_lockfile: self.maybe_lockfile.clone(), maybe_workspace_config: self.maybe_workspace_config.clone(), overrides: self.overrides.clone(), @@ -1330,8 +1341,8 @@ impl CliOptions { &self.maybe_package_json } - pub fn maybe_npmrc(&self) -> &Option> { - &self.maybe_npmrc + pub fn npmrc(&self) -> &Arc { + &self.npmrc } pub fn maybe_package_json_deps(&self) -> Option { diff --git a/cli/factory.rs b/cli/factory.rs index e75325ce8bd103..d9e03e62c6434b 100644 --- a/cli/factory.rs +++ b/cli/factory.rs @@ -447,7 +447,7 @@ impl CliFactory { ), npm_system_info: self.options.npm_system_info(), npm_registry_url: crate::args::npm_registry_url().to_owned(), - maybe_npmrc: self.options.maybe_npmrc().clone() + npmrc: self.options.npmrc().clone() }) }).await }.boxed_local()) diff --git a/cli/lsp/config.rs b/cli/lsp/config.rs index dc58f871c6e360..651c78c66b82a9 100644 --- a/cli/lsp/config.rs +++ b/cli/lsp/config.rs @@ -23,7 +23,7 @@ use deno_core::serde_json::json; use deno_core::serde_json::Value; use deno_core::ModuleSpecifier; use deno_lockfile::Lockfile; -use deno_npm::npm_rc::NpmRc; +use deno_npm::npm_rc::ResolvedNpmRc; use deno_runtime::deno_node::PackageJson; use deno_runtime::fs_util::specifier_to_file_path; use deno_runtime::permissions::PermissionsContainer; @@ -1161,7 +1161,7 @@ pub struct ConfigData { pub vendor_dir: Option, pub lockfile: Option>>, pub package_json: Option>, - pub npmrc: Option>, + pub npmrc: Option>, pub import_map: Option>, pub import_map_from_settings: bool, watched_files: HashMap, diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs index 8d76323049c4ab..36ffe29020c9fb 100644 --- a/cli/lsp/language_server.rs +++ b/cli/lsp/language_server.rs @@ -88,6 +88,7 @@ use super::tsc::ChangeKind; use super::tsc::GetCompletionDetailsArgs; use super::tsc::TsServer; use super::urls; +use crate::args::create_default_npmrc; use crate::args::get_root_cert_store; use crate::args::CaData; use crate::args::CacheSetting; @@ -886,7 +887,7 @@ async fn create_npm_resolver( npm_registry_url: crate::args::npm_registry_url().to_owned(), npm_system_info: NpmSystemInfo::default(), // TODO(bartlomieju): support .npmrc here - maybe_npmrc: None, + npmrc: create_default_npmrc(), }) }) .await @@ -3529,7 +3530,9 @@ impl Inner { config_data.and_then(|d| d.config_file.as_deref().cloned()), config_data.and_then(|d| d.lockfile.clone()), config_data.and_then(|d| d.package_json.as_deref().cloned()), - config_data.and_then(|d| d.npmrc.clone()), + config_data + .and_then(|d| d.npmrc.clone()) + .unwrap_or_else(create_default_npmrc), force_global_cache, )?; diff --git a/cli/npm/managed/cache.rs b/cli/npm/managed/cache.rs index 611ffd50bcd6c1..7c426bcab56bdc 100644 --- a/cli/npm/managed/cache.rs +++ b/cli/npm/managed/cache.rs @@ -13,7 +13,8 @@ use deno_core::error::custom_error; use deno_core::error::AnyError; use deno_core::parking_lot::Mutex; use deno_core::url::Url; -use deno_npm::npm_rc::NpmRc; +use deno_npm::npm_rc::RegistryConfig; +use deno_npm::npm_rc::ResolvedNpmRc; use deno_npm::registry::NpmPackageVersionDistInfo; use deno_npm::NpmPackageCacheFolderId; use deno_runtime::deno_fs; @@ -35,7 +36,7 @@ pub struct NpmCache { fs: Arc, http_client: Arc, progress_bar: ProgressBar, - maybe_npmrc: Option>, + npmrc: Arc, /// ensures a package is only downloaded once per run previously_reloaded_packages: Mutex>, } @@ -47,7 +48,7 @@ impl NpmCache { fs: Arc, http_client: Arc, progress_bar: ProgressBar, - maybe_npmrc: Option>, + npmrc: Arc, ) -> Self { Self { cache_dir, @@ -56,7 +57,7 @@ impl NpmCache { http_client, progress_bar, previously_reloaded_packages: Default::default(), - maybe_npmrc, + npmrc, } } @@ -87,26 +88,11 @@ impl NpmCache { dist: &NpmPackageVersionDistInfo, default_registry_url: &Url, ) -> Result<(), AnyError> { - let mut registry_url = default_registry_url.clone(); - let mut maybe_registry_config: Option<&deno_npm::npm_rc::RegistryConfig> = - None; - - if let Some(npmrc) = self.maybe_npmrc.as_ref() { - let maybe_registry_url_and_config = npmrc - .registry_url_and_config_for_package( - &package.name, - registry_url.as_str(), - ); - if let Some((registry_url_str, config)) = maybe_registry_url_and_config { - registry_url = Url::parse(®istry_url_str).with_context(|| { - format!("Failed to parse registry URL: '{}'", registry_url_str) - })?; - maybe_registry_config = Some(config); - } - } + let registry_url = self.npmrc.get_registry_url(&package.name); + let registry_config = self.npmrc.get_registry_config(&package.name); self - .ensure_package_inner(package, dist, ®istry_url, maybe_registry_config) + .ensure_package_inner(package, dist, ®istry_url, ®istry_config) .await .with_context(|| format!("Failed caching npm package '{package}'.")) } @@ -116,7 +102,7 @@ impl NpmCache { package: &PackageNv, dist: &NpmPackageVersionDistInfo, registry_url: &Url, - maybe_registry_config: Option<&deno_npm::npm_rc::RegistryConfig>, + registry_config: &RegistryConfig, ) -> Result<(), AnyError> { let package_folder = self .cache_dir @@ -145,14 +131,12 @@ impl NpmCache { let mut maybe_header = None; // TODO(bartlomieju): support more auth methods besides token - if let Some(registry_config) = maybe_registry_config { - if let Some(token) = registry_config.auth_token.as_ref() { - maybe_header = Some(( - reqwest::header::AUTHORIZATION, - reqwest::header::HeaderValue::from_str(&format!("Bearer {}", token)) - .unwrap(), - )) - } + if let Some(token) = registry_config.auth_token.as_ref() { + maybe_header = Some(( + reqwest::header::AUTHORIZATION, + reqwest::header::HeaderValue::from_str(&format!("Bearer {}", token)) + .unwrap(), + )) } let guard = self.progress_bar.update(&dist.tarball); diff --git a/cli/npm/managed/mod.rs b/cli/npm/managed/mod.rs index e5f1baf3c48af2..1f297e048def1c 100644 --- a/cli/npm/managed/mod.rs +++ b/cli/npm/managed/mod.rs @@ -11,7 +11,7 @@ use deno_core::parking_lot::Mutex; use deno_core::serde_json; use deno_core::url::Url; use deno_graph::NpmPackageReqResolution; -use deno_npm::npm_rc::NpmRc; +use deno_npm::npm_rc::ResolvedNpmRc; use deno_npm::registry::NpmRegistryApi; use deno_npm::resolution::NpmResolutionSnapshot; use deno_npm::resolution::PackageReqNotFoundError; @@ -74,7 +74,7 @@ pub struct CliNpmResolverManagedCreateOptions { pub npm_system_info: NpmSystemInfo, pub package_json_installer: CliNpmResolverManagedPackageJsonInstallerOption, pub npm_registry_url: Url, - pub maybe_npmrc: Option>, + pub npmrc: Arc, } pub async fn create_managed_npm_resolver_for_lsp( @@ -182,7 +182,7 @@ fn create_cache(options: &CliNpmResolverManagedCreateOptions) -> Arc { options.fs.clone(), options.http_client.clone(), options.text_only_progress_bar.clone(), - options.maybe_npmrc.clone(), + options.npmrc.clone(), )) } @@ -194,7 +194,7 @@ fn create_api( options.npm_registry_url.clone(), npm_cache.clone(), options.http_client.clone(), - options.maybe_npmrc.clone(), + options.npmrc.clone(), options.text_only_progress_bar.clone(), )) } diff --git a/cli/npm/managed/registry.rs b/cli/npm/managed/registry.rs index 90f30ab5b4a871..502cca9399bdc6 100644 --- a/cli/npm/managed/registry.rs +++ b/cli/npm/managed/registry.rs @@ -18,7 +18,8 @@ use deno_core::futures::FutureExt; use deno_core::parking_lot::Mutex; use deno_core::serde_json; use deno_core::url::Url; -use deno_npm::npm_rc::NpmRc; +use deno_npm::npm_rc::RegistryConfig; +use deno_npm::npm_rc::ResolvedNpmRc; use deno_npm::registry::NpmPackageInfo; use deno_npm::registry::NpmRegistryApi; use deno_npm::registry::NpmRegistryPackageInfoLoadError; @@ -40,7 +41,7 @@ impl CliNpmRegistryApi { base_url: Url, cache: Arc, http_client: Arc, - maybe_npmrc: Option>, + npmrc: Arc, progress_bar: ProgressBar, ) -> Self { Self(Some(Arc::new(CliNpmRegistryApiInner { @@ -49,7 +50,7 @@ impl CliNpmRegistryApi { force_reload_flag: Default::default(), mem_cache: Default::default(), previously_reloaded_packages: Default::default(), - maybe_npmrc, + npmrc, http_client, progress_bar, }))) @@ -130,7 +131,7 @@ struct CliNpmRegistryApiInner { mem_cache: Mutex>, previously_reloaded_packages: Mutex>, http_client: Arc, - maybe_npmrc: Option>, + npmrc: Arc, progress_bar: ProgressBar, } @@ -277,26 +278,14 @@ impl CliNpmRegistryApiInner { &self, name: &str, ) -> Result, AnyError> { - let mut registry_url = self.base_url.clone(); - let mut maybe_registry_config: Option<&deno_npm::npm_rc::RegistryConfig> = - None; - - if let Some(npmrc) = self.maybe_npmrc.as_ref() { - let maybe_registry_url_and_config = - npmrc.registry_url_and_config_for_package(name, self.base_url.as_str()); - if let Some((registry_url_str, config)) = maybe_registry_url_and_config { - registry_url = Url::parse(®istry_url_str).with_context(|| { - format!("Failed to parse registry URL: '{}'", registry_url_str) - })?; - maybe_registry_config = Some(config); - } - } + let registry_url = self.npmrc.get_registry_url(name); + let registry_config = self.npmrc.get_registry_config(name); self .load_package_info_from_registry_inner( name, ®istry_url, - maybe_registry_config, + ®istry_config, ) .await .with_context(|| { @@ -312,7 +301,7 @@ impl CliNpmRegistryApiInner { &self, name: &str, registry_url: &Url, - maybe_registry_config: Option<&deno_npm::npm_rc::RegistryConfig>, + registry_config: &RegistryConfig, ) -> Result, AnyError> { if *self.cache.cache_setting() == CacheSetting::Only { return Err(custom_error( @@ -325,17 +314,15 @@ impl CliNpmRegistryApiInner { let package_url = self.get_package_url(name, registry_url); let guard = self.progress_bar.update(package_url.as_str()); - let mut maybe_header = None; + let mut maybe_header = None; // TODO(bartlomieju): support more auth methods besides token - if let Some(registry_config) = maybe_registry_config { - if let Some(token) = registry_config.auth_token.as_ref() { - maybe_header = Some(( - reqwest::header::AUTHORIZATION, - reqwest::header::HeaderValue::from_str(&format!("Bearer {}", token)) - .unwrap(), - )) - } + if let Some(token) = registry_config.auth_token.as_ref() { + maybe_header = Some(( + reqwest::header::AUTHORIZATION, + reqwest::header::HeaderValue::from_str(&format!("Bearer {}", token)) + .unwrap(), + )) } let maybe_bytes = self diff --git a/cli/standalone/mod.rs b/cli/standalone/mod.rs index 34fbeda33ae726..92f3d7a8196bd6 100644 --- a/cli/standalone/mod.rs +++ b/cli/standalone/mod.rs @@ -1,5 +1,6 @@ // Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. +use crate::args::create_default_npmrc; use crate::args::get_root_cert_store; use crate::args::npm_pkg_req_ref_to_binary_command; use crate::args::CaData; @@ -387,7 +388,7 @@ pub async fn run( npm_registry_url, npm_system_info: Default::default(), // TODO(bartlomieju): do we need to support it here? - maybe_npmrc: None, + npmrc: create_default_npmrc(), }), ) .await?; @@ -445,7 +446,7 @@ pub async fn run( npm_registry_url, npm_system_info: Default::default(), // TODO(bartlomieju): do we need to support it here? - maybe_npmrc: None, + npmrc: create_default_npmrc(), }), ) .await?; From 9c40f3c6c2103a7b3968172deb9a25d55ed89f67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Thu, 25 Apr 2024 23:37:50 +0200 Subject: [PATCH 09/40] remove some registry_url vars --- cli/npm/managed/cache.rs | 6 +++--- cli/npm/managed/resolvers/common.rs | 6 +----- cli/npm/managed/resolvers/global.rs | 7 +------ cli/npm/managed/resolvers/local.rs | 14 +++----------- cli/npm/managed/resolvers/mod.rs | 1 - 5 files changed, 8 insertions(+), 26 deletions(-) diff --git a/cli/npm/managed/cache.rs b/cli/npm/managed/cache.rs index 7c426bcab56bdc..3d8bf1903dddaa 100644 --- a/cli/npm/managed/cache.rs +++ b/cli/npm/managed/cache.rs @@ -36,7 +36,7 @@ pub struct NpmCache { fs: Arc, http_client: Arc, progress_bar: ProgressBar, - npmrc: Arc, + pub(crate) npmrc: Arc, /// ensures a package is only downloaded once per run previously_reloaded_packages: Mutex>, } @@ -86,7 +86,6 @@ impl NpmCache { &self, package: &PackageNv, dist: &NpmPackageVersionDistInfo, - default_registry_url: &Url, ) -> Result<(), AnyError> { let registry_url = self.npmrc.get_registry_url(&package.name); let registry_config = self.npmrc.get_registry_config(&package.name); @@ -197,8 +196,9 @@ impl NpmCache { pub fn package_folder_for_name_and_version( &self, package: &PackageNv, - registry_url: &Url, ) -> PathBuf { + // TODO: move downstream + let registry_url = self.npmrc.get_registry_url(&package.name); self .cache_dir .package_folder_for_name_and_version(package, registry_url) diff --git a/cli/npm/managed/resolvers/common.rs b/cli/npm/managed/resolvers/common.rs index 1f6baa17c000df..d25e2b0c7f048a 100644 --- a/cli/npm/managed/resolvers/common.rs +++ b/cli/npm/managed/resolvers/common.rs @@ -129,16 +129,12 @@ impl RegistryReadPermissionChecker { pub async fn cache_packages( packages: Vec, cache: &Arc, - default_registry_url: &Url, ) -> Result<(), AnyError> { let mut handles = Vec::with_capacity(packages.len()); for package in packages { let cache = cache.clone(); - let default_registry_url = default_registry_url.clone(); let handle = spawn(async move { - cache - .ensure_package(&package.id.nv, &package.dist, &default_registry_url) - .await + cache.ensure_package(&package.id.nv, &package.dist).await }); handles.push(handle); } diff --git a/cli/npm/managed/resolvers/global.rs b/cli/npm/managed/resolvers/global.rs index 4b3c9d6131cdbd..0b82398baf71ca 100644 --- a/cli/npm/managed/resolvers/global.rs +++ b/cli/npm/managed/resolvers/global.rs @@ -153,12 +153,7 @@ impl NpmPackageFsResolver for GlobalNpmPackageResolver { .resolution .all_system_packages_partitioned(&self.system_info); - cache_packages( - package_partitions.packages, - &self.cache, - &self.registry_url, - ) - .await?; + cache_packages(package_partitions.packages, &self.cache).await?; // create the copy package folders for copy in package_partitions.copy_packages { diff --git a/cli/npm/managed/resolvers/local.rs b/cli/npm/managed/resolvers/local.rs index f8d69d1482e54a..832e58b6a6e345 100644 --- a/cli/npm/managed/resolvers/local.rs +++ b/cli/npm/managed/resolvers/local.rs @@ -58,7 +58,6 @@ pub struct LocalNpmPackageResolver { cache: Arc, progress_bar: ProgressBar, resolution: Arc, - registry_url: Url, root_node_modules_path: PathBuf, root_node_modules_url: Url, system_info: NpmSystemInfo, @@ -70,7 +69,6 @@ impl LocalNpmPackageResolver { fs: Arc, cache: Arc, progress_bar: ProgressBar, - registry_url: Url, node_modules_folder: PathBuf, resolution: Arc, system_info: NpmSystemInfo, @@ -80,7 +78,6 @@ impl LocalNpmPackageResolver { cache, progress_bar, resolution, - registry_url, root_node_modules_url: Url::from_directory_path(&node_modules_folder) .unwrap(), root_node_modules_path: node_modules_folder.clone(), @@ -231,7 +228,6 @@ impl NpmPackageFsResolver for LocalNpmPackageResolver { &self.resolution.snapshot(), &self.cache, &self.progress_bar, - &self.registry_url, &self.root_node_modules_path, &self.system_info, ) @@ -254,7 +250,6 @@ async fn sync_resolution_with_fs( snapshot: &NpmResolutionSnapshot, cache: &Arc, progress_bar: &ProgressBar, - registry_url: &Url, root_node_modules_dir_path: &Path, system_info: &NpmSystemInfo, ) -> Result<(), AnyError> { @@ -317,12 +312,9 @@ async fn sync_resolution_with_fs( let pb = progress_bar.clone(); let cache = cache.clone(); - let registry_url = registry_url.clone(); let package = package.clone(); let handle = spawn(async move { - cache - .ensure_package(&package.id.nv, &package.dist, ®istry_url) - .await?; + cache.ensure_package(&package.id.nv, &package.dist).await?; let pb_guard = pb.update_with_prompt( ProgressMessagePrompt::Initialize, &package.id.nv.to_string(), @@ -332,8 +324,8 @@ async fn sync_resolution_with_fs( join_package_name(&sub_node_modules, &package.id.nv.name); fs::create_dir_all(&package_path) .with_context(|| format!("Creating '{}'", folder_path.display()))?; - let cache_folder = cache - .package_folder_for_name_and_version(&package.id.nv, ®istry_url); + let cache_folder = + cache.package_folder_for_name_and_version(&package.id.nv); if hard_link_dir_recursive(&cache_folder, &package_path).is_err() { // Fallback to copying the directory. // diff --git a/cli/npm/managed/resolvers/mod.rs b/cli/npm/managed/resolvers/mod.rs index dfd291afc287da..83f83cb77eb94d 100644 --- a/cli/npm/managed/resolvers/mod.rs +++ b/cli/npm/managed/resolvers/mod.rs @@ -35,7 +35,6 @@ pub fn create_npm_fs_resolver( fs, cache, progress_bar.clone(), - registry_url, node_modules_folder, resolution, system_info, From 803535717101417608691d2175091c135f60d777 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Thu, 25 Apr 2024 23:59:09 +0200 Subject: [PATCH 10/40] test is passing --- cli/npm/managed/cache.rs | 18 ++++++++---------- cli/npm/managed/registry.rs | 3 ++- cli/npm/managed/resolvers/global.rs | 7 +++---- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/cli/npm/managed/cache.rs b/cli/npm/managed/cache.rs index 3d8bf1903dddaa..cc2705e358370a 100644 --- a/cli/npm/managed/cache.rs +++ b/cli/npm/managed/cache.rs @@ -13,7 +13,6 @@ use deno_core::error::custom_error; use deno_core::error::AnyError; use deno_core::parking_lot::Mutex; use deno_core::url::Url; -use deno_npm::npm_rc::RegistryConfig; use deno_npm::npm_rc::ResolvedNpmRc; use deno_npm::registry::NpmPackageVersionDistInfo; use deno_npm::NpmPackageCacheFolderId; @@ -87,11 +86,8 @@ impl NpmCache { package: &PackageNv, dist: &NpmPackageVersionDistInfo, ) -> Result<(), AnyError> { - let registry_url = self.npmrc.get_registry_url(&package.name); - let registry_config = self.npmrc.get_registry_config(&package.name); - self - .ensure_package_inner(package, dist, ®istry_url, ®istry_config) + .ensure_package_inner(package, dist) .await .with_context(|| format!("Failed caching npm package '{package}'.")) } @@ -100,9 +96,10 @@ impl NpmCache { &self, package: &PackageNv, dist: &NpmPackageVersionDistInfo, - registry_url: &Url, - registry_config: &RegistryConfig, ) -> Result<(), AnyError> { + let registry_url = self.npmrc.get_registry_url(&package.name); + let registry_config = self.npmrc.get_registry_config(&package.name); + let package_folder = self .cache_dir .package_folder_for_name_and_version(package, registry_url); @@ -160,8 +157,8 @@ impl NpmCache { pub fn ensure_copy_package( &self, folder_id: &NpmPackageCacheFolderId, - registry_url: &Url, ) -> Result<(), AnyError> { + let registry_url = self.npmrc.get_registry_url(&folder_id.nv.name); assert_ne!(folder_id.copy_index, 0); let package_folder = self .cache_dir @@ -197,17 +194,18 @@ impl NpmCache { &self, package: &PackageNv, ) -> PathBuf { - // TODO: move downstream let registry_url = self.npmrc.get_registry_url(&package.name); self .cache_dir .package_folder_for_name_and_version(package, registry_url) } - pub fn package_name_folder(&self, name: &str, registry_url: &Url) -> PathBuf { + pub fn package_name_folder(&self, name: &str) -> PathBuf { + let registry_url = self.npmrc.get_registry_url(name); self.cache_dir.package_name_folder(name, registry_url) } + // TODO: remove registry_url pub fn registry_folder(&self, registry_url: &Url) -> PathBuf { self.cache_dir.registry_folder(registry_url) } diff --git a/cli/npm/managed/registry.rs b/cli/npm/managed/registry.rs index 502cca9399bdc6..7886ce8fb9ca29 100644 --- a/cli/npm/managed/registry.rs +++ b/cli/npm/managed/registry.rs @@ -125,6 +125,7 @@ enum CacheItem { #[derive(Debug)] struct CliNpmRegistryApiInner { + // TODO: remove base_url: Url, cache: Arc, force_reload_flag: AtomicFlag, @@ -360,7 +361,7 @@ impl CliNpmRegistryApiInner { } fn get_package_file_cache_path(&self, name: &str) -> PathBuf { - let name_folder_path = self.cache.package_name_folder(name, &self.base_url); + let name_folder_path = self.cache.package_name_folder(name); name_folder_path.join("registry.json") } diff --git a/cli/npm/managed/resolvers/global.rs b/cli/npm/managed/resolvers/global.rs index 0b82398baf71ca..5ea85a0cea3f60 100644 --- a/cli/npm/managed/resolvers/global.rs +++ b/cli/npm/managed/resolvers/global.rs @@ -157,10 +157,9 @@ impl NpmPackageFsResolver for GlobalNpmPackageResolver { // create the copy package folders for copy in package_partitions.copy_packages { - self.cache.ensure_copy_package( - ©.get_package_cache_folder_id(), - &self.registry_url, - )?; + self + .cache + .ensure_copy_package(©.get_package_cache_folder_id())?; } Ok(()) From b2653f6de05256f7ac7ffae1ba7fe51ce485906f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Fri, 26 Apr 2024 00:01:56 +0200 Subject: [PATCH 11/40] remove some omre --- cli/npm/managed/cache.rs | 7 ++----- cli/npm/managed/resolvers/global.rs | 12 ++---------- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/cli/npm/managed/cache.rs b/cli/npm/managed/cache.rs index cc2705e358370a..e7967f39611cf9 100644 --- a/cli/npm/managed/cache.rs +++ b/cli/npm/managed/cache.rs @@ -182,11 +182,8 @@ impl NpmCache { Ok(()) } - pub fn package_folder_for_id( - &self, - id: &NpmPackageCacheFolderId, - registry_url: &Url, - ) -> PathBuf { + pub fn package_folder_for_id(&self, id: &NpmPackageCacheFolderId) -> PathBuf { + let registry_url = self.npmrc.get_registry_url(&id.nv.name); self.cache_dir.package_folder_for_id(id, registry_url) } diff --git a/cli/npm/managed/resolvers/global.rs b/cli/npm/managed/resolvers/global.rs index 5ea85a0cea3f60..679b0222d17548 100644 --- a/cli/npm/managed/resolvers/global.rs +++ b/cli/npm/managed/resolvers/global.rs @@ -84,11 +84,7 @@ impl NpmPackageFsResolver for GlobalNpmPackageResolver { .resolution .resolve_pkg_cache_folder_id_from_pkg_id(id) .unwrap(); - Ok( - self - .cache - .package_folder_for_id(&folder_id, &self.registry_url), - ) + Ok(self.cache.package_folder_for_id(&folder_id)) } fn resolve_package_folder_from_package( @@ -129,11 +125,7 @@ impl NpmPackageFsResolver for GlobalNpmPackageResolver { else { return Ok(None); }; - Ok(Some( - self - .cache - .package_folder_for_id(&pkg_folder_id, &self.registry_url), - )) + Ok(Some(self.cache.package_folder_for_id(&pkg_folder_id))) } fn resolve_package_cache_folder_id_from_specifier( From 61b64077d3f007d474386c9263dc9065fa4ad59b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Fri, 26 Apr 2024 16:12:30 +0200 Subject: [PATCH 12/40] only two left --- cli/args/mod.rs | 2 +- cli/npm/cache_dir.rs | 5 +++++ cli/npm/managed/registry.rs | 6 +++--- cli/npm/managed/resolvers/common.rs | 5 ----- cli/npm/managed/resolvers/global.rs | 14 +------------- cli/npm/managed/resolvers/local.rs | 22 +++++++++++----------- tests/util/server/src/npm.rs | 2 +- 7 files changed, 22 insertions(+), 34 deletions(-) diff --git a/cli/args/mod.rs b/cli/args/mod.rs index c249e86af8d511..1647e6627cc652 100644 --- a/cli/args/mod.rs +++ b/cli/args/mod.rs @@ -574,7 +574,7 @@ fn discover_npmrc( })?; let resolved = npmrc .as_resolved(npm_registry_url()) - .with_context(|| format!("Failed to resolve .npmrc options"))?; + .context("Failed to resolve .npmrc options")?; return Ok(Arc::new(resolved)); } diff --git a/cli/npm/cache_dir.rs b/cli/npm/cache_dir.rs index 1c28a9b81edfdf..c71832489643d2 100644 --- a/cli/npm/cache_dir.rs +++ b/cli/npm/cache_dir.rs @@ -99,6 +99,10 @@ impl NpmCacheDir { specifier: &ModuleSpecifier, registry_url: &Url, ) -> Option { + eprintln!( + "resolve package folder id from specifier {}", + specifier.as_str() + ); let registry_root_dir = self .root_dir_url .join(&format!( @@ -109,6 +113,7 @@ impl NpmCacheDir { )) // this not succeeding indicates a fatal issue, so unwrap .unwrap(); + eprintln!("registry root url {}", registry_root_dir.as_str()); let mut relative_url = registry_root_dir.make_relative(specifier)?; if relative_url.starts_with("../") { return None; diff --git a/cli/npm/managed/registry.rs b/cli/npm/managed/registry.rs index 7886ce8fb9ca29..5f6b0da4bd608a 100644 --- a/cli/npm/managed/registry.rs +++ b/cli/npm/managed/registry.rs @@ -285,14 +285,14 @@ impl CliNpmRegistryApiInner { self .load_package_info_from_registry_inner( name, - ®istry_url, - ®istry_config, + registry_url, + registry_config, ) .await .with_context(|| { format!( "Error getting response at {} for package \"{}\"", - self.get_package_url(name, ®istry_url), + self.get_package_url(name, registry_url), name ) }) diff --git a/cli/npm/managed/resolvers/common.rs b/cli/npm/managed/resolvers/common.rs index d25e2b0c7f048a..9ee204aa28cc2e 100644 --- a/cli/npm/managed/resolvers/common.rs +++ b/cli/npm/managed/resolvers/common.rs @@ -43,11 +43,6 @@ pub trait NpmPackageFsResolver: Send + Sync { mode: NodeResolutionMode, ) -> Result; - fn resolve_package_folder_from_specifier( - &self, - specifier: &ModuleSpecifier, - ) -> Result, AnyError>; - fn resolve_package_cache_folder_id_from_specifier( &self, specifier: &ModuleSpecifier, diff --git a/cli/npm/managed/resolvers/global.rs b/cli/npm/managed/resolvers/global.rs index 679b0222d17548..192e77a4860a18 100644 --- a/cli/npm/managed/resolvers/global.rs +++ b/cli/npm/managed/resolvers/global.rs @@ -32,6 +32,7 @@ use super::common::RegistryReadPermissionChecker; pub struct GlobalNpmPackageResolver { cache: Arc, resolution: Arc, + // TODO(remove): registry_url: Url, system_info: NpmSystemInfo, registry_read_permission_checker: RegistryReadPermissionChecker, @@ -115,19 +116,6 @@ impl NpmPackageFsResolver for GlobalNpmPackageResolver { self.package_folder(&pkg.id) } - fn resolve_package_folder_from_specifier( - &self, - specifier: &ModuleSpecifier, - ) -> Result, AnyError> { - let Some(pkg_folder_id) = self - .cache - .resolve_package_folder_id_from_specifier(specifier, &self.registry_url) - else { - return Ok(None); - }; - Ok(Some(self.cache.package_folder_for_id(&pkg_folder_id))) - } - fn resolve_package_cache_folder_id_from_specifier( &self, specifier: &ModuleSpecifier, diff --git a/cli/npm/managed/resolvers/local.rs b/cli/npm/managed/resolvers/local.rs index 832e58b6a6e345..9d0ca3f8c5a075 100644 --- a/cli/npm/managed/resolvers/local.rs +++ b/cli/npm/managed/resolvers/local.rs @@ -123,6 +123,17 @@ impl LocalNpmPackageResolver { .map(Some) .map_err(|err| err.into()) } + + fn resolve_package_folder_from_specifier( + &self, + specifier: &ModuleSpecifier, + ) -> Result, AnyError> { + let Some(local_path) = self.resolve_folder_for_specifier(specifier)? else { + return Ok(None); + }; + let package_root_path = self.resolve_package_root(&local_path); + Ok(Some(package_root_path)) + } } #[async_trait] @@ -199,17 +210,6 @@ impl NpmPackageFsResolver for LocalNpmPackageResolver { ); } - fn resolve_package_folder_from_specifier( - &self, - specifier: &ModuleSpecifier, - ) -> Result, AnyError> { - let Some(local_path) = self.resolve_folder_for_specifier(specifier)? else { - return Ok(None); - }; - let package_root_path = self.resolve_package_root(&local_path); - Ok(Some(package_root_path)) - } - fn resolve_package_cache_folder_id_from_specifier( &self, specifier: &ModuleSpecifier, diff --git a/tests/util/server/src/npm.rs b/tests/util/server/src/npm.rs index 89e4207616bb5e..62105cebe8920c 100644 --- a/tests/util/server/src/npm.rs +++ b/tests/util/server/src/npm.rs @@ -47,7 +47,7 @@ pub struct CustomNpmPackageCache { impl CustomNpmPackageCache { pub fn new(registry_url: String) -> Self { let registry_url = registry_url - .strip_suffix("/") + .strip_suffix('/') .unwrap_or(®istry_url) .to_string(); Self { From c39adb3aaad7c5c302f4956372b31b1e3d2d2f26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Fri, 26 Apr 2024 16:28:01 +0200 Subject: [PATCH 13/40] use a candidate list --- cli/npm/cache_dir.rs | 71 ++++++++++++++++++++++------- cli/npm/managed/cache.rs | 3 +- cli/npm/managed/mod.rs | 5 +- cli/npm/managed/resolvers/global.rs | 9 ++-- cli/standalone/mod.rs | 3 +- 5 files changed, 65 insertions(+), 26 deletions(-) diff --git a/cli/npm/cache_dir.rs b/cli/npm/cache_dir.rs index c71832489643d2..4933c8c302f2e7 100644 --- a/cli/npm/cache_dir.rs +++ b/cli/npm/cache_dir.rs @@ -20,10 +20,12 @@ pub struct NpmCacheDir { root_dir: PathBuf, // cached url representation of the root directory root_dir_url: Url, + // A list of all registry URLs that were discovered via `.npmrc` files + known_registries_urls: Vec, } impl NpmCacheDir { - pub fn new(root_dir: PathBuf) -> Self { + pub fn new(root_dir: PathBuf, known_registries_urls: Vec) -> Self { fn try_get_canonicalized_root_dir( root_dir: &Path, ) -> Result { @@ -41,6 +43,7 @@ impl NpmCacheDir { Self { root_dir, root_dir_url, + known_registries_urls, } } @@ -97,28 +100,62 @@ impl NpmCacheDir { pub fn resolve_package_folder_id_from_specifier( &self, specifier: &ModuleSpecifier, - registry_url: &Url, ) -> Option { eprintln!( "resolve package folder id from specifier {}", specifier.as_str() ); - let registry_root_dir = self - .root_dir_url - .join(&format!( - "{}/", - root_url_to_safe_local_dirname(registry_url) - .to_string_lossy() - .replace('\\', "/") - )) - // this not succeeding indicates a fatal issue, so unwrap - .unwrap(); - eprintln!("registry root url {}", registry_root_dir.as_str()); - let mut relative_url = registry_root_dir.make_relative(specifier)?; - if relative_url.starts_with("../") { - return None; + + let mut maybe_relative_url = None; + + // Iterate through known registries and try to get a match. + for registry_url in &self.known_registries_urls { + let registry_root_dir = self + .root_dir_url + .join(&format!( + "{}/", + root_url_to_safe_local_dirname(registry_url) + .to_string_lossy() + .replace('\\', "/") + )) + // this not succeeding indicates a fatal issue, so unwrap + .unwrap(); + + let Some(relative_url) = registry_root_dir.make_relative(specifier) + else { + continue; + }; + + if relative_url.starts_with("../") { + continue; + } + + maybe_relative_url = Some(relative_url); + eprintln!("registry root url {}", registry_root_dir.as_str()); + break; } + let Some(mut relative_url) = maybe_relative_url else { + return None; + }; + + eprintln!("relative_url {}", relative_url); + // let registry_root_dir = self + // .root_dir_url + // .join(&format!( + // "{}/", + // root_url_to_safe_local_dirname(registry_url) + // .to_string_lossy() + // .replace('\\', "/") + // )) + // // this not succeeding indicates a fatal issue, so unwrap + // .unwrap(); + // eprintln!("registry root url {}", registry_root_dir.as_str()); + // let mut relative_url = registry_root_dir.make_relative(specifier)?; + // if relative_url.starts_with("../") { + // return None; + // } + // base32 decode the url if it starts with an underscore // * Ex. _{base32(package_name)}/ if let Some(end_url) = relative_url.strip_prefix('_') { @@ -199,8 +236,8 @@ mod test { fn should_get_package_folder() { let deno_dir = crate::cache::DenoDir::new(None).unwrap(); let root_dir = deno_dir.npm_folder_path(); - let cache = NpmCacheDir::new(root_dir.clone()); let registry_url = Url::parse("https://registry.npmjs.org/").unwrap(); + let cache = NpmCacheDir::new(root_dir.clone(), vec![registry_url.clone()]); assert_eq!( cache.package_folder_for_id( diff --git a/cli/npm/managed/cache.rs b/cli/npm/managed/cache.rs index e7967f39611cf9..22782d596aa410 100644 --- a/cli/npm/managed/cache.rs +++ b/cli/npm/managed/cache.rs @@ -210,11 +210,10 @@ impl NpmCache { pub fn resolve_package_folder_id_from_specifier( &self, specifier: &ModuleSpecifier, - registry_url: &Url, ) -> Option { self .cache_dir - .resolve_package_folder_id_from_specifier(specifier, registry_url) + .resolve_package_folder_id_from_specifier(specifier) } } diff --git a/cli/npm/managed/mod.rs b/cli/npm/managed/mod.rs index 1f297e048def1c..b234f98376d7dd 100644 --- a/cli/npm/managed/mod.rs +++ b/cli/npm/managed/mod.rs @@ -177,7 +177,10 @@ fn create_inner( fn create_cache(options: &CliNpmResolverManagedCreateOptions) -> Arc { Arc::new(NpmCache::new( - NpmCacheDir::new(options.npm_global_cache_dir.clone()), + NpmCacheDir::new( + options.npm_global_cache_dir.clone(), + options.npmrc.get_all_known_registries_urls(), + ), options.cache_setting.clone(), options.fs.clone(), options.http_client.clone(), diff --git a/cli/npm/managed/resolvers/global.rs b/cli/npm/managed/resolvers/global.rs index 192e77a4860a18..e41fd03f5416b7 100644 --- a/cli/npm/managed/resolvers/global.rs +++ b/cli/npm/managed/resolvers/global.rs @@ -96,7 +96,7 @@ impl NpmPackageFsResolver for GlobalNpmPackageResolver { ) -> Result { let Some(referrer_pkg_id) = self .cache - .resolve_package_folder_id_from_specifier(referrer, &self.registry_url) + .resolve_package_folder_id_from_specifier(referrer) else { bail!("could not find npm package for '{}'", referrer); }; @@ -121,10 +121,9 @@ impl NpmPackageFsResolver for GlobalNpmPackageResolver { specifier: &ModuleSpecifier, ) -> Result, AnyError> { Ok( - self.cache.resolve_package_folder_id_from_specifier( - specifier, - &self.registry_url, - ), + self + .cache + .resolve_package_folder_id_from_specifier(specifier), ) } diff --git a/cli/standalone/mod.rs b/cli/standalone/mod.rs index 92f3d7a8196bd6..e055f05ebdd225 100644 --- a/cli/standalone/mod.rs +++ b/cli/standalone/mod.rs @@ -342,7 +342,8 @@ pub async fn run( let root_path = std::env::temp_dir() .join(format!("deno-compile-{}", current_exe_name)) .join("node_modules"); - let npm_cache_dir = NpmCacheDir::new(root_path.clone()); + let npm_cache_dir = + NpmCacheDir::new(root_path.clone(), vec![npm_registry_url.clone()]); let npm_global_cache_dir = npm_cache_dir.get_cache_location(); let cache_setting = CacheSetting::Only; let (package_json_deps_provider, fs, npm_resolver, maybe_vfs_root) = From 105f47b5710befe06c1f2b00a3f18512e6e12e27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Fri, 26 Apr 2024 16:33:25 +0200 Subject: [PATCH 14/40] cowsay still working --- cli/npm/cache_dir.rs | 31 +++++------------------------ cli/npm/managed/cache.rs | 4 ++++ cli/npm/managed/mod.rs | 1 + cli/npm/managed/resolvers/global.rs | 6 +----- cli/npm/managed/resolvers/mod.rs | 1 - 5 files changed, 11 insertions(+), 32 deletions(-) diff --git a/cli/npm/cache_dir.rs b/cli/npm/cache_dir.rs index 4933c8c302f2e7..3f7611ea9a93ba 100644 --- a/cli/npm/cache_dir.rs +++ b/cli/npm/cache_dir.rs @@ -47,6 +47,10 @@ impl NpmCacheDir { } } + pub fn root_dir(&self) -> &Path { + &self.root_dir + } + pub fn root_dir_url(&self) -> &Url { &self.root_dir_url } @@ -101,11 +105,6 @@ impl NpmCacheDir { &self, specifier: &ModuleSpecifier, ) -> Option { - eprintln!( - "resolve package folder id from specifier {}", - specifier.as_str() - ); - let mut maybe_relative_url = None; // Iterate through known registries and try to get a match. @@ -131,30 +130,10 @@ impl NpmCacheDir { } maybe_relative_url = Some(relative_url); - eprintln!("registry root url {}", registry_root_dir.as_str()); break; } - let Some(mut relative_url) = maybe_relative_url else { - return None; - }; - - eprintln!("relative_url {}", relative_url); - // let registry_root_dir = self - // .root_dir_url - // .join(&format!( - // "{}/", - // root_url_to_safe_local_dirname(registry_url) - // .to_string_lossy() - // .replace('\\', "/") - // )) - // // this not succeeding indicates a fatal issue, so unwrap - // .unwrap(); - // eprintln!("registry root url {}", registry_root_dir.as_str()); - // let mut relative_url = registry_root_dir.make_relative(specifier)?; - // if relative_url.starts_with("../") { - // return None; - // } + let mut relative_url = maybe_relative_url?; // base32 decode the url if it starts with an underscore // * Ex. _{base32(package_name)}/ diff --git a/cli/npm/managed/cache.rs b/cli/npm/managed/cache.rs index 22782d596aa410..f89661c48cbb9f 100644 --- a/cli/npm/managed/cache.rs +++ b/cli/npm/managed/cache.rs @@ -202,6 +202,10 @@ impl NpmCache { self.cache_dir.package_name_folder(name, registry_url) } + pub fn root_folder(&self) -> PathBuf { + self.cache_dir.root_dir().to_owned() + } + // TODO: remove registry_url pub fn registry_folder(&self, registry_url: &Url) -> PathBuf { self.cache_dir.registry_folder(registry_url) diff --git a/cli/npm/managed/mod.rs b/cli/npm/managed/mod.rs index b234f98376d7dd..277582d3ee62c9 100644 --- a/cli/npm/managed/mod.rs +++ b/cli/npm/managed/mod.rs @@ -494,6 +494,7 @@ impl ManagedCliNpmResolver { self.api.base_url() } + // TODO: maybe remove pub fn registry_folder_in_global_cache( &self, registry_url: &ModuleSpecifier, diff --git a/cli/npm/managed/resolvers/global.rs b/cli/npm/managed/resolvers/global.rs index e41fd03f5416b7..cfc57e5913e1ca 100644 --- a/cli/npm/managed/resolvers/global.rs +++ b/cli/npm/managed/resolvers/global.rs @@ -32,8 +32,6 @@ use super::common::RegistryReadPermissionChecker; pub struct GlobalNpmPackageResolver { cache: Arc, resolution: Arc, - // TODO(remove): - registry_url: Url, system_info: NpmSystemInfo, registry_read_permission_checker: RegistryReadPermissionChecker, } @@ -42,18 +40,16 @@ impl GlobalNpmPackageResolver { pub fn new( fs: Arc, cache: Arc, - registry_url: Url, resolution: Arc, system_info: NpmSystemInfo, ) -> Self { Self { cache: cache.clone(), resolution, - registry_url: registry_url.clone(), system_info, registry_read_permission_checker: RegistryReadPermissionChecker::new( fs, - cache.registry_folder(®istry_url), + cache.root_folder(), ), } } diff --git a/cli/npm/managed/resolvers/mod.rs b/cli/npm/managed/resolvers/mod.rs index 83f83cb77eb94d..a175c1e386d6ef 100644 --- a/cli/npm/managed/resolvers/mod.rs +++ b/cli/npm/managed/resolvers/mod.rs @@ -42,7 +42,6 @@ pub fn create_npm_fs_resolver( None => Arc::new(GlobalNpmPackageResolver::new( fs, cache, - registry_url, resolution, system_info, )), From 35a8bb102ed250c96ac8a6bf0b991fa48f34d79b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Fri, 26 Apr 2024 16:35:36 +0200 Subject: [PATCH 15/40] keep removing --- cli/npm/managed/mod.rs | 5 ----- cli/npm/managed/resolvers/mod.rs | 2 -- 2 files changed, 7 deletions(-) diff --git a/cli/npm/managed/mod.rs b/cli/npm/managed/mod.rs index 277582d3ee62c9..964257d17c603c 100644 --- a/cli/npm/managed/mod.rs +++ b/cli/npm/managed/mod.rs @@ -98,7 +98,6 @@ pub async fn create_managed_npm_resolver_for_lsp( options.text_only_progress_bar, options.maybe_node_modules_path, options.package_json_installer, - options.npm_registry_url, options.npm_system_info, ) } @@ -118,7 +117,6 @@ pub async fn create_managed_npm_resolver( options.text_only_progress_bar, options.maybe_node_modules_path, options.package_json_installer, - options.npm_registry_url, options.npm_system_info, )) } @@ -133,7 +131,6 @@ fn create_inner( text_only_progress_bar: crate::util::progress_bar::ProgressBar, node_modules_dir_path: Option, package_json_installer: CliNpmResolverManagedPackageJsonInstallerOption, - npm_registry_url: Url, npm_system_info: NpmSystemInfo, ) -> Arc { let resolution = Arc::new(NpmResolution::from_serialized( @@ -145,7 +142,6 @@ fn create_inner( fs.clone(), npm_cache.clone(), &text_only_progress_bar, - npm_registry_url, resolution.clone(), node_modules_dir_path, npm_system_info.clone(), @@ -572,7 +568,6 @@ impl CliNpmResolver for ManagedCliNpmResolver { self.fs.clone(), self.global_npm_cache.clone(), &self.progress_bar, - self.api.base_url().clone(), npm_resolution, self.root_node_modules_path().map(ToOwned::to_owned), self.npm_system_info.clone(), diff --git a/cli/npm/managed/resolvers/mod.rs b/cli/npm/managed/resolvers/mod.rs index a175c1e386d6ef..d5472344ab56eb 100644 --- a/cli/npm/managed/resolvers/mod.rs +++ b/cli/npm/managed/resolvers/mod.rs @@ -7,7 +7,6 @@ mod local; use std::path::PathBuf; use std::sync::Arc; -use deno_core::url::Url; use deno_npm::NpmSystemInfo; use deno_runtime::deno_fs::FileSystem; @@ -25,7 +24,6 @@ pub fn create_npm_fs_resolver( fs: Arc, cache: Arc, progress_bar: &ProgressBar, - registry_url: Url, resolution: Arc, maybe_node_modules_path: Option, system_info: NpmSystemInfo, From 49d93f0dca6973360e7d906c2cc73e1b3d94b6d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Fri, 26 Apr 2024 16:48:04 +0200 Subject: [PATCH 16/40] add TODOs --- cli/npm/managed/mod.rs | 1 + cli/npm/managed/registry.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/cli/npm/managed/mod.rs b/cli/npm/managed/mod.rs index 964257d17c603c..46a688ced22f4e 100644 --- a/cli/npm/managed/mod.rs +++ b/cli/npm/managed/mod.rs @@ -486,6 +486,7 @@ impl ManagedCliNpmResolver { .map_err(|err| err.into()) } + // TODO: remove this one pub fn registry_base_url(&self) -> &ModuleSpecifier { self.api.base_url() } diff --git a/cli/npm/managed/registry.rs b/cli/npm/managed/registry.rs index 5f6b0da4bd608a..6837a28f2ccf9e 100644 --- a/cli/npm/managed/registry.rs +++ b/cli/npm/managed/registry.rs @@ -68,6 +68,7 @@ impl CliNpmRegistryApi { self.inner().get_cached_package_info(name) } + // TODO: remove pub fn base_url(&self) -> &Url { &self.inner().base_url } From 69a6fb1534f7b8deab51f5b2ff9e037d376cc592 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Fri, 26 Apr 2024 17:02:33 +0200 Subject: [PATCH 17/40] compile test passing again? --- cli/factory.rs | 1 - cli/lsp/language_server.rs | 1 - cli/npm/cache_dir.rs | 2 +- cli/npm/managed/cache.rs | 5 ----- cli/npm/managed/mod.rs | 16 ++-------------- cli/npm/managed/registry.rs | 9 --------- cli/standalone/binary.rs | 4 +--- cli/standalone/mod.rs | 4 +--- 8 files changed, 5 insertions(+), 37 deletions(-) diff --git a/cli/factory.rs b/cli/factory.rs index d9e03e62c6434b..9921b6d3e79ce5 100644 --- a/cli/factory.rs +++ b/cli/factory.rs @@ -446,7 +446,6 @@ impl CliFactory { self.package_json_deps_provider().clone(), ), npm_system_info: self.options.npm_system_info(), - npm_registry_url: crate::args::npm_registry_url().to_owned(), npmrc: self.options.npmrc().clone() }) }).await diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs index 36ffe29020c9fb..436848b332e724 100644 --- a/cli/lsp/language_server.rs +++ b/cli/lsp/language_server.rs @@ -884,7 +884,6 @@ async fn create_npm_resolver( // do not install while resolving in the lsp—leave that to the cache command package_json_installer: CliNpmResolverManagedPackageJsonInstallerOption::NoInstall, - npm_registry_url: crate::args::npm_registry_url().to_owned(), npm_system_info: NpmSystemInfo::default(), // TODO(bartlomieju): support .npmrc here npmrc: create_default_npmrc(), diff --git a/cli/npm/cache_dir.rs b/cli/npm/cache_dir.rs index 3f7611ea9a93ba..7fd0e23c97c7fd 100644 --- a/cli/npm/cache_dir.rs +++ b/cli/npm/cache_dir.rs @@ -95,7 +95,7 @@ impl NpmCacheDir { } } - pub fn registry_folder(&self, registry_url: &Url) -> PathBuf { + fn registry_folder(&self, registry_url: &Url) -> PathBuf { self .root_dir .join(root_url_to_safe_local_dirname(registry_url)) diff --git a/cli/npm/managed/cache.rs b/cli/npm/managed/cache.rs index f89661c48cbb9f..fb93861c95143e 100644 --- a/cli/npm/managed/cache.rs +++ b/cli/npm/managed/cache.rs @@ -206,11 +206,6 @@ impl NpmCache { self.cache_dir.root_dir().to_owned() } - // TODO: remove registry_url - pub fn registry_folder(&self, registry_url: &Url) -> PathBuf { - self.cache_dir.registry_folder(registry_url) - } - pub fn resolve_package_folder_id_from_specifier( &self, specifier: &ModuleSpecifier, diff --git a/cli/npm/managed/mod.rs b/cli/npm/managed/mod.rs index 46a688ced22f4e..3a2657cfb4638d 100644 --- a/cli/npm/managed/mod.rs +++ b/cli/npm/managed/mod.rs @@ -9,7 +9,6 @@ use deno_core::anyhow::Context; use deno_core::error::AnyError; use deno_core::parking_lot::Mutex; use deno_core::serde_json; -use deno_core::url::Url; use deno_graph::NpmPackageReqResolution; use deno_npm::npm_rc::ResolvedNpmRc; use deno_npm::registry::NpmRegistryApi; @@ -73,7 +72,6 @@ pub struct CliNpmResolverManagedCreateOptions { pub maybe_node_modules_path: Option, pub npm_system_info: NpmSystemInfo, pub package_json_installer: CliNpmResolverManagedPackageJsonInstallerOption, - pub npm_registry_url: Url, pub npmrc: Arc, } @@ -190,7 +188,6 @@ fn create_api( npm_cache: Arc, ) -> Arc { Arc::new(CliNpmRegistryApi::new( - options.npm_registry_url.clone(), npm_cache.clone(), options.http_client.clone(), options.npmrc.clone(), @@ -486,17 +483,8 @@ impl ManagedCliNpmResolver { .map_err(|err| err.into()) } - // TODO: remove this one - pub fn registry_base_url(&self) -> &ModuleSpecifier { - self.api.base_url() - } - - // TODO: maybe remove - pub fn registry_folder_in_global_cache( - &self, - registry_url: &ModuleSpecifier, - ) -> PathBuf { - self.global_npm_cache.registry_folder(registry_url) + pub fn global_cache_root_folder(&self) -> PathBuf { + self.global_npm_cache.root_folder() } } diff --git a/cli/npm/managed/registry.rs b/cli/npm/managed/registry.rs index 6837a28f2ccf9e..0bbe09ebd024be 100644 --- a/cli/npm/managed/registry.rs +++ b/cli/npm/managed/registry.rs @@ -38,14 +38,12 @@ pub struct CliNpmRegistryApi(Option>); impl CliNpmRegistryApi { pub fn new( - base_url: Url, cache: Arc, http_client: Arc, npmrc: Arc, progress_bar: ProgressBar, ) -> Self { Self(Some(Arc::new(CliNpmRegistryApiInner { - base_url, cache, force_reload_flag: Default::default(), mem_cache: Default::default(), @@ -68,11 +66,6 @@ impl CliNpmRegistryApi { self.inner().get_cached_package_info(name) } - // TODO: remove - pub fn base_url(&self) -> &Url { - &self.inner().base_url - } - fn inner(&self) -> &Arc { // this panicking indicates a bug in the code where this // wasn't initialized @@ -126,8 +119,6 @@ enum CacheItem { #[derive(Debug)] struct CliNpmRegistryApiInner { - // TODO: remove - base_url: Url, cache: Arc, force_reload_flag: AtomicFlag, mem_cache: Mutex>, diff --git a/cli/standalone/binary.rs b/cli/standalone/binary.rs index 77fc8485c001f4..db5f10d81bb3b1 100644 --- a/cli/standalone/binary.rs +++ b/cli/standalone/binary.rs @@ -668,9 +668,7 @@ impl<'a> DenoCompileBinaryWriter<'a> { } else { // DO NOT include the user's registry url as it may contain credentials, // but also don't make this dependent on the registry url - let registry_url = npm_resolver.registry_base_url(); - let root_path = - npm_resolver.registry_folder_in_global_cache(registry_url); + let root_path = npm_resolver.global_cache_root_folder(); let mut builder = VfsBuilder::new(root_path)?; for package in npm_resolver.all_system_packages(&self.npm_system_info) { diff --git a/cli/standalone/mod.rs b/cli/standalone/mod.rs index e055f05ebdd225..f620acdebf8ce6 100644 --- a/cli/standalone/mod.rs +++ b/cli/standalone/mod.rs @@ -357,7 +357,7 @@ pub async fn run( let vfs_root_dir_path = if node_modules_dir { root_path } else { - npm_cache_dir.registry_folder(&npm_registry_url) + npm_cache_dir.root_dir().to_owned() }; let vfs = load_npm_vfs(vfs_root_dir_path.clone()) .context("Failed to load npm vfs.")?; @@ -386,7 +386,6 @@ pub async fn run( CliNpmResolverManagedPackageJsonInstallerOption::ConditionalInstall( package_json_deps_provider.clone(), ), - npm_registry_url, npm_system_info: Default::default(), // TODO(bartlomieju): do we need to support it here? npmrc: create_default_npmrc(), @@ -444,7 +443,6 @@ pub async fn run( CliNpmResolverManagedPackageJsonInstallerOption::ConditionalInstall( package_json_deps_provider.clone(), ), - npm_registry_url, npm_system_info: Default::default(), // TODO(bartlomieju): do we need to support it here? npmrc: create_default_npmrc(), From caf15566da50cc7a7791cd09ee7459234f80ddee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Fri, 26 Apr 2024 17:43:28 +0200 Subject: [PATCH 18/40] bump crates --- Cargo.lock | 8 +++++--- Cargo.toml | 3 --- cli/Cargo.toml | 4 ++-- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8e2ce65757d347..83ce0245fb8790 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1738,7 +1738,9 @@ dependencies = [ [[package]] name = "deno_npm" -version = "0.19.2" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d2c41ced17886dc0a8d889d5c2ac7cd4d2b357964c3ad7f76c7580673b2f89f" dependencies = [ "anyhow", "async-trait", @@ -2519,9 +2521,9 @@ dependencies = [ [[package]] name = "eszip" -version = "0.68.3" +version = "0.68.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "826be631a66a753a7b0a1e3c57a3448d1a4b91689a7eb38ecfee7828245d7a7c" +checksum = "14cbb0e1910cd068e7c946e0d9a4d9e1859fc5596acdf99baca404e24e728136" dependencies = [ "anyhow", "base64", diff --git a/Cargo.toml b/Cargo.toml index 414af61d300733..8808058be29340 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -370,6 +370,3 @@ opt-level = 3 opt-level = 3 [profile.release.package.base64-simd] opt-level = 3 - -[patch.crates-io] -deno_npm = { path = "../deno_npm" } diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 711b3ab3e9fcb0..228c43bc5fb8ec 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -72,12 +72,12 @@ deno_emit = "=0.40.1" deno_graph = { version = "=0.74.0", features = ["tokio_executor"] } deno_lint = { version = "=0.58.4", features = ["docs"] } deno_lockfile.workspace = true -deno_npm = "=0.19.2" +deno_npm = "=0.20.0" deno_runtime = { workspace = true, features = ["include_js_files_for_snapshotting"] } deno_semver = "=0.5.4" deno_task_shell = "=0.16.0" deno_terminal.workspace = true -eszip = "=0.68.3" +eszip = "=0.68.4" napi_sym.workspace = true async-trait.workspace = true From 896ea1e38baae682eebc826f306e682b25bfcd7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Fri, 26 Apr 2024 17:48:29 +0200 Subject: [PATCH 19/40] tests --- tests/specs/npm/npmrc/main.out | 2 +- tests/specs/npm/npmrc_bad_token/.npmrc | 2 ++ tests/specs/npm/npmrc_bad_token/__test__.jsonc | 5 +++++ tests/specs/npm/npmrc_bad_token/main.js | 5 +++++ tests/specs/npm/npmrc_bad_token/main.out | 4 ++++ tests/specs/npm/npmrc_bad_token/package.json | 7 +++++++ 6 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 tests/specs/npm/npmrc_bad_token/.npmrc create mode 100644 tests/specs/npm/npmrc_bad_token/__test__.jsonc create mode 100644 tests/specs/npm/npmrc_bad_token/main.js create mode 100644 tests/specs/npm/npmrc_bad_token/main.out create mode 100644 tests/specs/npm/npmrc_bad_token/package.json diff --git a/tests/specs/npm/npmrc/main.out b/tests/specs/npm/npmrc/main.out index 858ce04fb1374e..bf8a54ddd798a6 100644 --- a/tests/specs/npm/npmrc/main.out +++ b/tests/specs/npm/npmrc/main.out @@ -1,5 +1,5 @@ Download http://127.0.0.1:4252/npm/registry/@denotest/esm-basic -Download http://127.0.0.1:4252/npm/registry/@denotest/esm-basic/1.0.0.tgz +Download http://localhost:4252/npm/registry/@denotest/esm-basic/1.0.0.tgz Initialize @denotest/esm-basic@1.0.0 0 42 diff --git a/tests/specs/npm/npmrc_bad_token/.npmrc b/tests/specs/npm/npmrc_bad_token/.npmrc new file mode 100644 index 00000000000000..d2ade47bf53cf6 --- /dev/null +++ b/tests/specs/npm/npmrc_bad_token/.npmrc @@ -0,0 +1,2 @@ +@denotest:registry=http://127.0.0.1:4252/npm/registry/ +//127.0.0.1:4252/npm/registry/denotest/:_authToken=invalid-token diff --git a/tests/specs/npm/npmrc_bad_token/__test__.jsonc b/tests/specs/npm/npmrc_bad_token/__test__.jsonc new file mode 100644 index 00000000000000..f942507716987a --- /dev/null +++ b/tests/specs/npm/npmrc_bad_token/__test__.jsonc @@ -0,0 +1,5 @@ +{ + "tempDir": true, + "args": "run -A main.js", + "output": "main.out" +} diff --git a/tests/specs/npm/npmrc_bad_token/main.js b/tests/specs/npm/npmrc_bad_token/main.js new file mode 100644 index 00000000000000..81dd521da72565 --- /dev/null +++ b/tests/specs/npm/npmrc_bad_token/main.js @@ -0,0 +1,5 @@ +import { getValue, setValue } from "@denotest/esm-basic"; + +console.log(getValue()); +setValue(42); +console.log(getValue()); diff --git a/tests/specs/npm/npmrc_bad_token/main.out b/tests/specs/npm/npmrc_bad_token/main.out new file mode 100644 index 00000000000000..9ff84ae3df4087 --- /dev/null +++ b/tests/specs/npm/npmrc_bad_token/main.out @@ -0,0 +1,4 @@ +Download http://127.0.0.1:4252/npm/registry/@denotest/esm-basic +Download http://127.0.0.1:4252/npm/registry/@denotest/esm-basic +error: Error getting response at http://127.0.0.1:4252/npm/registry/@denotest/esm-basic for package "@denotest/esm-basic": Bad response: 401 + diff --git a/tests/specs/npm/npmrc_bad_token/package.json b/tests/specs/npm/npmrc_bad_token/package.json new file mode 100644 index 00000000000000..99feed9d83ae09 --- /dev/null +++ b/tests/specs/npm/npmrc_bad_token/package.json @@ -0,0 +1,7 @@ +{ + "name": "npmrc_test", + "version": "0.0.1", + "dependencies": { + "@denotest/esm-basic": "1.0.0" + } +} From a688f445e95de7a8e170c2c17a16a550c8bbedce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Fri, 26 Apr 2024 18:09:27 +0200 Subject: [PATCH 20/40] fix test --- tests/specs/npm/npmrc_bad_token/__test__.jsonc | 3 ++- tests/specs/npm/npmrc_bad_token/main.out | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/specs/npm/npmrc_bad_token/__test__.jsonc b/tests/specs/npm/npmrc_bad_token/__test__.jsonc index f942507716987a..852d39831d0ed9 100644 --- a/tests/specs/npm/npmrc_bad_token/__test__.jsonc +++ b/tests/specs/npm/npmrc_bad_token/__test__.jsonc @@ -1,5 +1,6 @@ { "tempDir": true, "args": "run -A main.js", - "output": "main.out" + "output": "main.out", + "exitCode": 1 } diff --git a/tests/specs/npm/npmrc_bad_token/main.out b/tests/specs/npm/npmrc_bad_token/main.out index 9ff84ae3df4087..deefbc49440db7 100644 --- a/tests/specs/npm/npmrc_bad_token/main.out +++ b/tests/specs/npm/npmrc_bad_token/main.out @@ -1,4 +1,4 @@ Download http://127.0.0.1:4252/npm/registry/@denotest/esm-basic Download http://127.0.0.1:4252/npm/registry/@denotest/esm-basic error: Error getting response at http://127.0.0.1:4252/npm/registry/@denotest/esm-basic for package "@denotest/esm-basic": Bad response: 401 - +[WILDCARD] \ No newline at end of file From 24e8510d0837a8dc60d3554cfcc6f6ab04f4509c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Sat, 27 Apr 2024 23:08:28 +0200 Subject: [PATCH 21/40] change server path --- tests/specs/npm/npmrc/.npmrc | 4 ++-- tests/specs/npm/npmrc/main.out | 4 ++-- tests/specs/npm/npmrc_bad_token/.npmrc | 4 ++-- tests/specs/npm/npmrc_bad_token/main.out | 6 +++--- tests/util/server/src/npm.rs | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/specs/npm/npmrc/.npmrc b/tests/specs/npm/npmrc/.npmrc index 705026e834d2a1..7e14ea3253e750 100644 --- a/tests/specs/npm/npmrc/.npmrc +++ b/tests/specs/npm/npmrc/.npmrc @@ -1,2 +1,2 @@ -@denotest:registry=http://127.0.0.1:4252/npm/registry/ -//127.0.0.1:4252/npm/registry/denotest/:_authToken=private-reg-token +@denotest:registry=http://127.0.0.1:4252/private_registry_1/ +//127.0.0.1:4252/private_registry_1/denotest/:_authToken=private-reg-token diff --git a/tests/specs/npm/npmrc/main.out b/tests/specs/npm/npmrc/main.out index bf8a54ddd798a6..5a49a38acf44e3 100644 --- a/tests/specs/npm/npmrc/main.out +++ b/tests/specs/npm/npmrc/main.out @@ -1,5 +1,5 @@ -Download http://127.0.0.1:4252/npm/registry/@denotest/esm-basic -Download http://localhost:4252/npm/registry/@denotest/esm-basic/1.0.0.tgz +Download http://127.0.0.1:4252/private_registry_1/@denotest/esm-basic +Download http://localhost:4252/private_registry_1/@denotest/esm-basic/1.0.0.tgz Initialize @denotest/esm-basic@1.0.0 0 42 diff --git a/tests/specs/npm/npmrc_bad_token/.npmrc b/tests/specs/npm/npmrc_bad_token/.npmrc index d2ade47bf53cf6..3b8e9173ac7c88 100644 --- a/tests/specs/npm/npmrc_bad_token/.npmrc +++ b/tests/specs/npm/npmrc_bad_token/.npmrc @@ -1,2 +1,2 @@ -@denotest:registry=http://127.0.0.1:4252/npm/registry/ -//127.0.0.1:4252/npm/registry/denotest/:_authToken=invalid-token +@denotest:registry=http://127.0.0.1:4252/private_registry_1/ +//127.0.0.1:4252/private_registry_1/denotest/:_authToken=invalid-token diff --git a/tests/specs/npm/npmrc_bad_token/main.out b/tests/specs/npm/npmrc_bad_token/main.out index deefbc49440db7..7ccba5eea0cf73 100644 --- a/tests/specs/npm/npmrc_bad_token/main.out +++ b/tests/specs/npm/npmrc_bad_token/main.out @@ -1,4 +1,4 @@ -Download http://127.0.0.1:4252/npm/registry/@denotest/esm-basic -Download http://127.0.0.1:4252/npm/registry/@denotest/esm-basic -error: Error getting response at http://127.0.0.1:4252/npm/registry/@denotest/esm-basic for package "@denotest/esm-basic": Bad response: 401 +Download http://127.0.0.1:4252/private_registry_1/@denotest/esm-basic +Download http://127.0.0.1:4252/private_registry_1/@denotest/esm-basic +error: Error getting response at http://127.0.0.1:4252/private_registry_1/@denotest/esm-basic for package "@denotest/esm-basic": Bad response: 401 [WILDCARD] \ No newline at end of file diff --git a/tests/util/server/src/npm.rs b/tests/util/server/src/npm.rs index b747ca2912a46f..3b8dd7ce5e882f 100644 --- a/tests/util/server/src/npm.rs +++ b/tests/util/server/src/npm.rs @@ -35,7 +35,7 @@ pub static PRIVATE_TEST_NPM_REGISTRY_1: Lazy = crate::servers::PRIVATE_NPM_REGISTRY_1_PORT ), // TODO: change it - "/npm/registry", + "/private_registry_1", ) }); From f5d10e78eed396e78022a60b8f255f8c47b97322 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Sat, 27 Apr 2024 23:15:26 +0200 Subject: [PATCH 22/40] don't pass auth header if origin changes --- cli/http_util.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cli/http_util.rs b/cli/http_util.rs index 029cadeeb428ff..af0b334e3b8e77 100644 --- a/cli/http_util.rs +++ b/cli/http_util.rs @@ -359,9 +359,15 @@ impl HttpClient { for _ in 0..5 { let new_url = resolve_redirect_from_response(&url, &response)?; let mut builder = self.get_no_redirect(new_url.clone())?; - if let Some((header_name, header_value)) = maybe_header.as_ref() { - builder = builder.header(header_name, header_value); + + if new_url.origin() == url.origin() { + if let Some((header_name, header_value)) = maybe_header.as_ref() { + builder = builder.header(header_name, header_value); + } + } else { + maybe_header = None; } + let new_response = builder.send().await?; let status = new_response.status(); if status.is_redirection() { From fc556d822f925177d69ed18a9a85c4fc92025afa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Mon, 29 Apr 2024 23:17:21 +0200 Subject: [PATCH 23/40] clippy --- cli/http_util.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/http_util.rs b/cli/http_util.rs index af0b334e3b8e77..832ccec1c0b75a 100644 --- a/cli/http_util.rs +++ b/cli/http_util.rs @@ -345,7 +345,7 @@ impl HttpClient { pub async fn get_redirected_response( &self, url: U, - maybe_header: Option<(HeaderName, HeaderValue)>, + mut maybe_header: Option<(HeaderName, HeaderValue)>, ) -> Result { let mut url = url.into_url()?; From d2510c5ef7438d6caefcda74787941e4e3a61e9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Mon, 29 Apr 2024 23:42:49 +0200 Subject: [PATCH 24/40] update discovery algorithm --- cli/args/mod.rs | 71 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 56 insertions(+), 15 deletions(-) diff --git a/cli/args/mod.rs b/cli/args/mod.rs index 5298e54816ccc9..ae1ad57227a18f 100644 --- a/cli/args/mod.rs +++ b/cli/args/mod.rs @@ -547,28 +547,44 @@ fn discover_package_json( Ok(None) } -// TODO(bartlomieju): improve discovery, right now we're just looking at CWD -/// Discover `.npmrc` file. If `maybe_stop_at` is provided, we will stop -/// crawling up the directory tree at that path. +/// Discover `.npmrc` file - currently we only support it next to `package.json` +/// or next to `deno.json`. +/// +/// In the future we will need to support it in user directory or global directory +/// as per https://docs.npmjs.com/cli/v10/configuring-npm/npmrc#files. fn discover_npmrc( - _flags: &Flags, - _maybe_stop_at: Option, - current_dir: &Path, + maybe_package_json_path: Option, + maybe_deno_json_path: Option, ) -> Result, AnyError> { const NPMRC_NAME: &str = ".npmrc"; - let path = current_dir.join(NPMRC_NAME); - let maybe_source = match std::fs::read_to_string(&path) { - Ok(source) => Some(source), - Err(err) if err.kind() == std::io::ErrorKind::NotFound => None, - Err(err) => bail!("Error loading .npmrc at {}. {:#}", path.display(), err), - }; - fn get_env_var(var_name: &str) -> Option { std::env::var(var_name).ok() } - if let Some(source) = maybe_source { + fn try_to_read_npmrc( + dir: &Path, + ) -> Result, AnyError> { + let path = dir.join(NPMRC_NAME); + let maybe_source = match std::fs::read_to_string(&path) { + Ok(source) => Some(source), + Err(err) if err.kind() == std::io::ErrorKind::NotFound => None, + Err(err) => { + bail!("Error loading .npmrc at {}. {:#}", path.display(), err) + } + }; + + Ok(if let Some(source) = maybe_source { + Some((source, path)) + } else { + None + }) + } + + fn try_to_parse_npmrc( + source: String, + path: &Path, + ) -> Result, AnyError> { let npmrc = NpmRc::parse(&source, &get_env_var).with_context(|| { format!("Failed to parse .npmrc at {}", path.display()) })?; @@ -578,6 +594,22 @@ fn discover_npmrc( return Ok(Arc::new(resolved)); } + 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)? { + return try_to_parse_npmrc(source, &path); + } + } + } + + 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)? { + return try_to_parse_npmrc(source, &path); + } + } + } + log::debug!("No .npmrc file found"); Ok(create_default_npmrc()) } @@ -897,7 +929,16 @@ impl CliOptions { } else { maybe_package_json = discover_package_json(&flags, None, &initial_cwd)?; } - let npmrc = discover_npmrc(&flags, None, &initial_cwd)?; + let npmrc = discover_npmrc( + maybe_package_json.as_ref().map(|p| p.path.clone()), + maybe_config_file.as_ref().and_then(|cf| { + if cf.specifier.scheme() == "file" { + Some(cf.specifier.to_file_path().unwrap()) + } else { + None + } + }), + )?; let maybe_lock_file = lockfile::discover(&flags, maybe_config_file.as_ref())?; From 17d7f9028a7af75ee30d75f7f42b308251920fe0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Tue, 30 Apr 2024 00:10:25 +0200 Subject: [PATCH 25/40] add more tests --- tests/specs/npm/npmrc_deno_json/.npmrc | 2 ++ tests/specs/npm/npmrc_deno_json/__test__.jsonc | 5 +++++ tests/specs/npm/npmrc_deno_json/deno.json | 3 +++ tests/specs/npm/npmrc_deno_json/main.js | 5 +++++ tests/specs/npm/npmrc_deno_json/main.out | 4 ++++ .../specs/npm/npmrc_not_next_to_package_json/.npmrc | 2 ++ .../npmrc_not_next_to_package_json/__test__.jsonc | 5 +++++ .../npm/npmrc_not_next_to_package_json/main.out | 12 ++++++++++++ .../npmrc_not_next_to_package_json/subdir/main.js | 5 +++++ .../subdir/package.json | 7 +++++++ tests/util/server/src/npm.rs | 2 -- 11 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 tests/specs/npm/npmrc_deno_json/.npmrc create mode 100644 tests/specs/npm/npmrc_deno_json/__test__.jsonc create mode 100644 tests/specs/npm/npmrc_deno_json/deno.json create mode 100644 tests/specs/npm/npmrc_deno_json/main.js create mode 100644 tests/specs/npm/npmrc_deno_json/main.out create mode 100644 tests/specs/npm/npmrc_not_next_to_package_json/.npmrc create mode 100644 tests/specs/npm/npmrc_not_next_to_package_json/__test__.jsonc create mode 100644 tests/specs/npm/npmrc_not_next_to_package_json/main.out create mode 100644 tests/specs/npm/npmrc_not_next_to_package_json/subdir/main.js create mode 100644 tests/specs/npm/npmrc_not_next_to_package_json/subdir/package.json diff --git a/tests/specs/npm/npmrc_deno_json/.npmrc b/tests/specs/npm/npmrc_deno_json/.npmrc new file mode 100644 index 00000000000000..7e14ea3253e750 --- /dev/null +++ b/tests/specs/npm/npmrc_deno_json/.npmrc @@ -0,0 +1,2 @@ +@denotest:registry=http://127.0.0.1:4252/private_registry_1/ +//127.0.0.1:4252/private_registry_1/denotest/:_authToken=private-reg-token diff --git a/tests/specs/npm/npmrc_deno_json/__test__.jsonc b/tests/specs/npm/npmrc_deno_json/__test__.jsonc new file mode 100644 index 00000000000000..f942507716987a --- /dev/null +++ b/tests/specs/npm/npmrc_deno_json/__test__.jsonc @@ -0,0 +1,5 @@ +{ + "tempDir": true, + "args": "run -A main.js", + "output": "main.out" +} diff --git a/tests/specs/npm/npmrc_deno_json/deno.json b/tests/specs/npm/npmrc_deno_json/deno.json new file mode 100644 index 00000000000000..f6ca8454c56395 --- /dev/null +++ b/tests/specs/npm/npmrc_deno_json/deno.json @@ -0,0 +1,3 @@ +{ + "imports": {} +} diff --git a/tests/specs/npm/npmrc_deno_json/main.js b/tests/specs/npm/npmrc_deno_json/main.js new file mode 100644 index 00000000000000..90ea6b48e14178 --- /dev/null +++ b/tests/specs/npm/npmrc_deno_json/main.js @@ -0,0 +1,5 @@ +import { getValue, setValue } from "npm:@denotest/esm-basic"; + +console.log(getValue()); +setValue(42); +console.log(getValue()); diff --git a/tests/specs/npm/npmrc_deno_json/main.out b/tests/specs/npm/npmrc_deno_json/main.out new file mode 100644 index 00000000000000..5c1427ad97a11d --- /dev/null +++ b/tests/specs/npm/npmrc_deno_json/main.out @@ -0,0 +1,4 @@ +Download http://127.0.0.1:4252/private_registry_1/@denotest/esm-basic +Download http://localhost:4252/private_registry_1/@denotest/esm-basic/1.0.0.tgz +0 +42 diff --git a/tests/specs/npm/npmrc_not_next_to_package_json/.npmrc b/tests/specs/npm/npmrc_not_next_to_package_json/.npmrc new file mode 100644 index 00000000000000..7e14ea3253e750 --- /dev/null +++ b/tests/specs/npm/npmrc_not_next_to_package_json/.npmrc @@ -0,0 +1,2 @@ +@denotest:registry=http://127.0.0.1:4252/private_registry_1/ +//127.0.0.1:4252/private_registry_1/denotest/:_authToken=private-reg-token diff --git a/tests/specs/npm/npmrc_not_next_to_package_json/__test__.jsonc b/tests/specs/npm/npmrc_not_next_to_package_json/__test__.jsonc new file mode 100644 index 00000000000000..596e2e71cfdc88 --- /dev/null +++ b/tests/specs/npm/npmrc_not_next_to_package_json/__test__.jsonc @@ -0,0 +1,5 @@ +{ + "tempDir": true, + "args": "run -A -L debug subdir/main.js", + "output": "main.out" +} diff --git a/tests/specs/npm/npmrc_not_next_to_package_json/main.out b/tests/specs/npm/npmrc_not_next_to_package_json/main.out new file mode 100644 index 00000000000000..020b170d21ddab --- /dev/null +++ b/tests/specs/npm/npmrc_not_next_to_package_json/main.out @@ -0,0 +1,12 @@ +[# This test is still downloading code, because we have a private registry] +[# that serves the same packages. The important bit is the message below.] +[WILDCARD] No .npmrc file found +[WILDCARD] +Download http://localhost:4545/npm/registry/@denotest/esm-basic +[WILDCARD] +Download http://localhost:4545/npm/registry/@denotest/esm-basic/1.0.0.tgz +Initialize @denotest/esm-basic@1.0.0 +[WILDCARD] +0 +42 +[WILDCARD] diff --git a/tests/specs/npm/npmrc_not_next_to_package_json/subdir/main.js b/tests/specs/npm/npmrc_not_next_to_package_json/subdir/main.js new file mode 100644 index 00000000000000..81dd521da72565 --- /dev/null +++ b/tests/specs/npm/npmrc_not_next_to_package_json/subdir/main.js @@ -0,0 +1,5 @@ +import { getValue, setValue } from "@denotest/esm-basic"; + +console.log(getValue()); +setValue(42); +console.log(getValue()); diff --git a/tests/specs/npm/npmrc_not_next_to_package_json/subdir/package.json b/tests/specs/npm/npmrc_not_next_to_package_json/subdir/package.json new file mode 100644 index 00000000000000..99feed9d83ae09 --- /dev/null +++ b/tests/specs/npm/npmrc_not_next_to_package_json/subdir/package.json @@ -0,0 +1,7 @@ +{ + "name": "npmrc_test", + "version": "0.0.1", + "dependencies": { + "@denotest/esm-basic": "1.0.0" + } +} diff --git a/tests/util/server/src/npm.rs b/tests/util/server/src/npm.rs index 3b8dd7ce5e882f..dfd5e21c62c05a 100644 --- a/tests/util/server/src/npm.rs +++ b/tests/util/server/src/npm.rs @@ -25,7 +25,6 @@ pub static PUBLIC_TEST_NPM_REGISTRY: Lazy = Lazy::new(|| { ) }); -// TODO: rewrite to use config pub static PRIVATE_TEST_NPM_REGISTRY_1: Lazy = Lazy::new(|| { TestNpmRegistry::new( @@ -34,7 +33,6 @@ pub static PRIVATE_TEST_NPM_REGISTRY_1: Lazy = "http://localhost:{}", crate::servers::PRIVATE_NPM_REGISTRY_1_PORT ), - // TODO: change it "/private_registry_1", ) }); From 707fb7aeda14c1bc03d9d3628fa54974beddfc27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Sat, 4 May 2024 00:44:20 +0200 Subject: [PATCH 26/40] add a second registry --- tests/specs/npm/npmrc/.npmrc | 2 + tests/specs/npm/npmrc/main.js | 3 ++ tests/specs/npm/npmrc/main.out | 6 +++ tests/specs/npm/npmrc/package.json | 3 +- tests/util/server/src/npm.rs | 12 ++++++ tests/util/server/src/servers/mod.rs | 59 +++++++++++++++++++++++++++- 6 files changed, 82 insertions(+), 3 deletions(-) diff --git a/tests/specs/npm/npmrc/.npmrc b/tests/specs/npm/npmrc/.npmrc index 7e14ea3253e750..87eeb9f6fa795c 100644 --- a/tests/specs/npm/npmrc/.npmrc +++ b/tests/specs/npm/npmrc/.npmrc @@ -1,2 +1,4 @@ @denotest:registry=http://127.0.0.1:4252/private_registry_1/ //127.0.0.1:4252/private_registry_1/denotest/:_authToken=private-reg-token +@denotest2:registry=http://127.0.0.1:4253/private_registry_2/ +//127.0.0.1:4253/private_registry_2/denotest2/:_authToken=private-reg-token2 diff --git a/tests/specs/npm/npmrc/main.js b/tests/specs/npm/npmrc/main.js index 81dd521da72565..771ef18732586d 100644 --- a/tests/specs/npm/npmrc/main.js +++ b/tests/specs/npm/npmrc/main.js @@ -1,5 +1,8 @@ import { getValue, setValue } from "@denotest/esm-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/main.out b/tests/specs/npm/npmrc/main.out index 5a49a38acf44e3..7115414a0a3130 100644 --- a/tests/specs/npm/npmrc/main.out +++ b/tests/specs/npm/npmrc/main.out @@ -1,5 +1,11 @@ +[UNORDERED_START] Download http://127.0.0.1:4252/private_registry_1/@denotest/esm-basic Download http://localhost:4252/private_registry_1/@denotest/esm-basic/1.0.0.tgz +Download http://127.0.0.1:4253/private_registry_2/@denotest2/basic +Download http://localhost:4253/private_registry_2/@denotest2/basic/1.0.0.tgz Initialize @denotest/esm-basic@1.0.0 +Initialize @denotest2/basic@1.0.0 +[UNORDERED_END] 0 42 +0 diff --git a/tests/specs/npm/npmrc/package.json b/tests/specs/npm/npmrc/package.json index 99feed9d83ae09..ec31d83492fe4a 100644 --- a/tests/specs/npm/npmrc/package.json +++ b/tests/specs/npm/npmrc/package.json @@ -2,6 +2,7 @@ "name": "npmrc_test", "version": "0.0.1", "dependencies": { - "@denotest/esm-basic": "1.0.0" + "@denotest/esm-basic": "1.0.0", + "@denotest2/basic": "1.0.0" } } diff --git a/tests/util/server/src/npm.rs b/tests/util/server/src/npm.rs index 837680ae5e1db2..56191daf39d8ca 100644 --- a/tests/util/server/src/npm.rs +++ b/tests/util/server/src/npm.rs @@ -38,6 +38,18 @@ pub static PRIVATE_TEST_NPM_REGISTRY_1: Lazy = ) }); +pub static PRIVATE_TEST_NPM_REGISTRY_2: Lazy = + Lazy::new(|| { + TestNpmRegistry::new( + NpmRegistryKind::Private, + &format!( + "http://localhost:{}", + crate::servers::PRIVATE_NPM_REGISTRY_2_PORT + ), + "/private_registry_2", + ) + }); + pub enum NpmRegistryKind { Public, Private, diff --git a/tests/util/server/src/servers/mod.rs b/tests/util/server/src/servers/mod.rs index abc45171569fe9..63bec23e2276c8 100644 --- a/tests/util/server/src/servers/mod.rs +++ b/tests/util/server/src/servers/mod.rs @@ -86,6 +86,7 @@ const H2S_GRPC_PORT: u16 = 4247; const REGISTRY_SERVER_PORT: u16 = 4250; const PROVENANCE_MOCK_SERVER_PORT: u16 = 4251; pub(crate) const PRIVATE_NPM_REGISTRY_1_PORT: u16 = 4252; +pub(crate) const PRIVATE_NPM_REGISTRY_2_PORT: u16 = 4253; // Use the single-threaded scheduler. The hyper server is used as a point of // comparison for the (single-threaded!) benchmarks in cli/bench. We're not @@ -133,6 +134,8 @@ pub async fn run_all_servers() { registry::provenance_mock_server(PROVENANCE_MOCK_SERVER_PORT); let private_npm_registry_1_server_fut = wrap_private_npm_registry1(PRIVATE_NPM_REGISTRY_1_PORT); + let private_npm_registry_2_server_fut = + wrap_private_npm_registry2(PRIVATE_NPM_REGISTRY_2_PORT); let server_fut = async { futures::join!( @@ -162,6 +165,7 @@ pub async fn run_all_servers() { registry_server_fut, provenance_mock_server_fut, private_npm_registry_1_server_fut, + private_npm_registry_2_server_fut, ) } .boxed_local(); @@ -1164,7 +1168,8 @@ async fn main_server( }; } -const PRIVATE_NPM_REGISTRY_AUTH_TOKEN: &str = "private-reg-token"; +const PRIVATE_NPM_REGISTRY_1_AUTH_TOKEN: &str = "private-reg-token"; +const PRIVATE_NPM_REGISTRY_2_AUTH_TOKEN: &str = "private-reg-token2"; async fn wrap_private_npm_registry1(port: u16) { let npm_registry_addr = SocketAddr::from(([127, 0, 0, 1], port)); @@ -1179,6 +1184,19 @@ async fn wrap_private_npm_registry1(port: u16) { .await; } +async fn wrap_private_npm_registry2(port: u16) { + let npm_registry_addr = SocketAddr::from(([127, 0, 0, 1], port)); + run_server( + ServerOptions { + addr: npm_registry_addr, + kind: ServerKind::Auto, + error_msg: "HTTP server error", + }, + private_npm_registry2, + ) + .await; +} + async fn private_npm_registry1( req: Request, ) -> Result>, anyhow::Error> { @@ -1187,7 +1205,7 @@ async fn private_npm_registry1( .get("authorization") .and_then(|x| x.to_str().ok()) .unwrap_or_default(); - if auth != format!("Bearer {}", PRIVATE_NPM_REGISTRY_AUTH_TOKEN) { + if auth != format!("Bearer {}", PRIVATE_NPM_REGISTRY_1_AUTH_TOKEN) { return Ok( Response::builder() .status(StatusCode::UNAUTHORIZED) @@ -1216,6 +1234,43 @@ async fn private_npm_registry1( .map_err(|e| e.into()) } +async fn private_npm_registry2( + req: Request, +) -> Result>, anyhow::Error> { + let auth = req + .headers() + .get("authorization") + .and_then(|x| x.to_str().ok()) + .unwrap_or_default(); + if auth != format!("Bearer {}", PRIVATE_NPM_REGISTRY_2_AUTH_TOKEN) { + return Ok( + Response::builder() + .status(StatusCode::UNAUTHORIZED) + .body(empty_body()) + .unwrap(), + ); + } + + let uri_path = req.uri().path(); + let mut testdata_file_path = testdata_path().to_path_buf(); + testdata_file_path.push(&uri_path[1..].replace("%2f", "/")); + + if let Some(resp) = try_serve_npm_registry( + uri_path, + testdata_file_path, + &npm::PRIVATE_TEST_NPM_REGISTRY_2, + ) + .await + { + return resp; + } + + Response::builder() + .status(StatusCode::NOT_FOUND) + .body(empty_body()) + .map_err(|e| e.into()) +} + fn handle_custom_npm_registry_path( scope_name: &str, path: &str, From afc61d5d0ec6e02da0033f42f7bab52252303027 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Sat, 4 May 2024 01:27:55 +0200 Subject: [PATCH 27/40] lint --- cli/args/mod.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/cli/args/mod.rs b/cli/args/mod.rs index 4dce0e5787621c..21e07cdd16ed66 100644 --- a/cli/args/mod.rs +++ b/cli/args/mod.rs @@ -575,11 +575,7 @@ fn discover_npmrc( } }; - Ok(if let Some(source) = maybe_source { - Some((source, path)) - } else { - None - }) + Ok(maybe_source.map(|source| (source, path))) } fn try_to_parse_npmrc( @@ -592,7 +588,7 @@ fn discover_npmrc( let resolved = npmrc .as_resolved(npm_registry_url()) .context("Failed to resolve .npmrc options")?; - return Ok(Arc::new(resolved)); + Ok(Arc::new(resolved)) } if let Some(package_json_path) = maybe_package_json_path { From 24e7f859f180146afc6e57e38e2510bb1b846813 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Sat, 4 May 2024 01:46:20 +0200 Subject: [PATCH 28/40] update the test url --- tests/integration/npm_tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/npm_tests.rs b/tests/integration/npm_tests.rs index 3bfd62680d7ad9..ebaebeba116620 100644 --- a/tests/integration/npm_tests.rs +++ b/tests/integration/npm_tests.rs @@ -3094,7 +3094,7 @@ async fn test_private_npm_registry() { let client = reqwest::Client::new(); let url = - Url::parse("http://127.0.0.1:4252/npm/registry/@denotest/bin/0.5.0") + Url::parse("http://127.0.0.1:4252/private_registry_1/@denotest/bin/0.5.0") .unwrap(); let req = reqwest::Request::new(reqwest::Method::GET, url.clone()); From 4186e73b801a054c1890d640074b7cb4f321d93f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Mon, 6 May 2024 21:48:15 +0200 Subject: [PATCH 29/40] only enable with DENO_FUTURE --- cli/args/mod.rs | 6 ++++++ tests/specs/npm/npmrc/__test__.jsonc | 3 +++ tests/specs/npm/npmrc_bad_token/__test__.jsonc | 5 ++++- tests/specs/npm/npmrc_deno_json/__test__.jsonc | 5 ++++- .../specs/npm/npmrc_not_next_to_package_json/__test__.jsonc | 5 ++++- 5 files changed, 21 insertions(+), 3 deletions(-) diff --git a/cli/args/mod.rs b/cli/args/mod.rs index 21e07cdd16ed66..84b17f0e2c38ad 100644 --- a/cli/args/mod.rs +++ b/cli/args/mod.rs @@ -557,6 +557,12 @@ fn discover_npmrc( maybe_package_json_path: Option, maybe_deno_json_path: Option, ) -> Result, AnyError> { + // Only support discovering `.npmrc` with `DENO_FUTURE` to not break existing + // workflows. + if !*DENO_FUTURE { + return Ok(create_default_npmrc()); + } + const NPMRC_NAME: &str = ".npmrc"; fn get_env_var(var_name: &str) -> Option { diff --git a/tests/specs/npm/npmrc/__test__.jsonc b/tests/specs/npm/npmrc/__test__.jsonc index f942507716987a..2e626e2f16afe0 100644 --- a/tests/specs/npm/npmrc/__test__.jsonc +++ b/tests/specs/npm/npmrc/__test__.jsonc @@ -1,5 +1,8 @@ { "tempDir": true, "args": "run -A main.js", + "envs": { + "DENO_FUTURE": "1" + }, "output": "main.out" } diff --git a/tests/specs/npm/npmrc_bad_token/__test__.jsonc b/tests/specs/npm/npmrc_bad_token/__test__.jsonc index 852d39831d0ed9..c3e2a9af463c8f 100644 --- a/tests/specs/npm/npmrc_bad_token/__test__.jsonc +++ b/tests/specs/npm/npmrc_bad_token/__test__.jsonc @@ -2,5 +2,8 @@ "tempDir": true, "args": "run -A main.js", "output": "main.out", - "exitCode": 1 + "exitCode": 1, + "envs": { + "DENO_FUTURE": "1" + } } diff --git a/tests/specs/npm/npmrc_deno_json/__test__.jsonc b/tests/specs/npm/npmrc_deno_json/__test__.jsonc index f942507716987a..ad990c26a1d1ef 100644 --- a/tests/specs/npm/npmrc_deno_json/__test__.jsonc +++ b/tests/specs/npm/npmrc_deno_json/__test__.jsonc @@ -1,5 +1,8 @@ { "tempDir": true, "args": "run -A main.js", - "output": "main.out" + "output": "main.out", + "envs": { + "DENO_FUTURE": "1" + } } diff --git a/tests/specs/npm/npmrc_not_next_to_package_json/__test__.jsonc b/tests/specs/npm/npmrc_not_next_to_package_json/__test__.jsonc index 596e2e71cfdc88..cf4917ef8222a3 100644 --- a/tests/specs/npm/npmrc_not_next_to_package_json/__test__.jsonc +++ b/tests/specs/npm/npmrc_not_next_to_package_json/__test__.jsonc @@ -1,5 +1,8 @@ { "tempDir": true, "args": "run -A -L debug subdir/main.js", - "output": "main.out" + "output": "main.out", + "envs": { + "DENO_FUTURE": "1" + } } From 1077f8e593c35a5446af38625ea04a6f8724a110 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Tue, 7 May 2024 03:37:39 +0200 Subject: [PATCH 30/40] Revert "only enable with DENO_FUTURE" This reverts commit 4186e73b801a054c1890d640074b7cb4f321d93f. --- cli/args/mod.rs | 6 ------ tests/specs/npm/npmrc/__test__.jsonc | 3 --- tests/specs/npm/npmrc_bad_token/__test__.jsonc | 5 +---- tests/specs/npm/npmrc_deno_json/__test__.jsonc | 5 +---- .../specs/npm/npmrc_not_next_to_package_json/__test__.jsonc | 5 +---- 5 files changed, 3 insertions(+), 21 deletions(-) diff --git a/cli/args/mod.rs b/cli/args/mod.rs index 84b17f0e2c38ad..21e07cdd16ed66 100644 --- a/cli/args/mod.rs +++ b/cli/args/mod.rs @@ -557,12 +557,6 @@ fn discover_npmrc( maybe_package_json_path: Option, maybe_deno_json_path: Option, ) -> Result, AnyError> { - // Only support discovering `.npmrc` with `DENO_FUTURE` to not break existing - // workflows. - if !*DENO_FUTURE { - return Ok(create_default_npmrc()); - } - const NPMRC_NAME: &str = ".npmrc"; fn get_env_var(var_name: &str) -> Option { diff --git a/tests/specs/npm/npmrc/__test__.jsonc b/tests/specs/npm/npmrc/__test__.jsonc index 2e626e2f16afe0..f942507716987a 100644 --- a/tests/specs/npm/npmrc/__test__.jsonc +++ b/tests/specs/npm/npmrc/__test__.jsonc @@ -1,8 +1,5 @@ { "tempDir": true, "args": "run -A main.js", - "envs": { - "DENO_FUTURE": "1" - }, "output": "main.out" } diff --git a/tests/specs/npm/npmrc_bad_token/__test__.jsonc b/tests/specs/npm/npmrc_bad_token/__test__.jsonc index c3e2a9af463c8f..852d39831d0ed9 100644 --- a/tests/specs/npm/npmrc_bad_token/__test__.jsonc +++ b/tests/specs/npm/npmrc_bad_token/__test__.jsonc @@ -2,8 +2,5 @@ "tempDir": true, "args": "run -A main.js", "output": "main.out", - "exitCode": 1, - "envs": { - "DENO_FUTURE": "1" - } + "exitCode": 1 } diff --git a/tests/specs/npm/npmrc_deno_json/__test__.jsonc b/tests/specs/npm/npmrc_deno_json/__test__.jsonc index ad990c26a1d1ef..f942507716987a 100644 --- a/tests/specs/npm/npmrc_deno_json/__test__.jsonc +++ b/tests/specs/npm/npmrc_deno_json/__test__.jsonc @@ -1,8 +1,5 @@ { "tempDir": true, "args": "run -A main.js", - "output": "main.out", - "envs": { - "DENO_FUTURE": "1" - } + "output": "main.out" } diff --git a/tests/specs/npm/npmrc_not_next_to_package_json/__test__.jsonc b/tests/specs/npm/npmrc_not_next_to_package_json/__test__.jsonc index cf4917ef8222a3..596e2e71cfdc88 100644 --- a/tests/specs/npm/npmrc_not_next_to_package_json/__test__.jsonc +++ b/tests/specs/npm/npmrc_not_next_to_package_json/__test__.jsonc @@ -1,8 +1,5 @@ { "tempDir": true, "args": "run -A -L debug subdir/main.js", - "output": "main.out", - "envs": { - "DENO_FUTURE": "1" - } + "output": "main.out" } From 280a395c37ac1b31990bc2c57f7936a4800792ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Tue, 7 May 2024 13:40:22 +0200 Subject: [PATCH 31/40] try to fix tests --- .../{@denotest2 => @denotest}/basic/1.0.0/main.d.mts | 0 .../{@denotest2 => @denotest}/basic/1.0.0/main.mjs | 0 .../{@denotest2 => @denotest}/basic/1.0.0/other.mjs | 0 .../npm-private/@denotest/basic/1.0.0/package.json | 7 +++++++ .../npm-private2/@denotest2/basic/1.0.0/main.d.mts | 3 +++ .../npm-private2/@denotest2/basic/1.0.0/main.mjs | 11 +++++++++++ .../npm-private2/@denotest2/basic/1.0.0/other.mjs | 3 +++ .../@denotest2/basic/1.0.0/package.json | 0 tests/specs/npm/npmrc/.npmrc | 8 ++++---- tests/specs/npm/npmrc/main.js | 2 +- tests/specs/npm/npmrc/main.out | 10 +++++----- tests/specs/npm/npmrc/package.json | 2 +- tests/specs/npm/npmrc_bad_token/.npmrc | 4 ++-- tests/specs/npm/npmrc_bad_token/main.js | 2 +- tests/specs/npm/npmrc_bad_token/main.out | 6 +++--- tests/specs/npm/npmrc_bad_token/package.json | 2 +- tests/specs/npm/npmrc_deno_json/.npmrc | 4 ++-- tests/specs/npm/npmrc_deno_json/main.js | 2 +- tests/specs/npm/npmrc_deno_json/main.out | 4 ++-- tests/specs/npm/npmrc_not_next_to_package_json/.npmrc | 4 ++-- .../specs/npm/npmrc_not_next_to_package_json/main.out | 4 ++-- 21 files changed, 51 insertions(+), 27 deletions(-) rename tests/registry/npm-private/{@denotest2 => @denotest}/basic/1.0.0/main.d.mts (100%) rename tests/registry/npm-private/{@denotest2 => @denotest}/basic/1.0.0/main.mjs (100%) rename tests/registry/npm-private/{@denotest2 => @denotest}/basic/1.0.0/other.mjs (100%) create mode 100644 tests/registry/npm-private/@denotest/basic/1.0.0/package.json create mode 100644 tests/registry/npm-private2/@denotest2/basic/1.0.0/main.d.mts create mode 100644 tests/registry/npm-private2/@denotest2/basic/1.0.0/main.mjs create mode 100644 tests/registry/npm-private2/@denotest2/basic/1.0.0/other.mjs rename tests/registry/{npm-private => npm-private2}/@denotest2/basic/1.0.0/package.json (100%) diff --git a/tests/registry/npm-private/@denotest2/basic/1.0.0/main.d.mts b/tests/registry/npm-private/@denotest/basic/1.0.0/main.d.mts similarity index 100% rename from tests/registry/npm-private/@denotest2/basic/1.0.0/main.d.mts rename to tests/registry/npm-private/@denotest/basic/1.0.0/main.d.mts diff --git a/tests/registry/npm-private/@denotest2/basic/1.0.0/main.mjs b/tests/registry/npm-private/@denotest/basic/1.0.0/main.mjs similarity index 100% rename from tests/registry/npm-private/@denotest2/basic/1.0.0/main.mjs rename to tests/registry/npm-private/@denotest/basic/1.0.0/main.mjs diff --git a/tests/registry/npm-private/@denotest2/basic/1.0.0/other.mjs b/tests/registry/npm-private/@denotest/basic/1.0.0/other.mjs similarity index 100% rename from tests/registry/npm-private/@denotest2/basic/1.0.0/other.mjs rename to tests/registry/npm-private/@denotest/basic/1.0.0/other.mjs diff --git a/tests/registry/npm-private/@denotest/basic/1.0.0/package.json b/tests/registry/npm-private/@denotest/basic/1.0.0/package.json new file mode 100644 index 00000000000000..8f7324aa53a6d2 --- /dev/null +++ b/tests/registry/npm-private/@denotest/basic/1.0.0/package.json @@ -0,0 +1,7 @@ +{ + "name": "@denotest/basic", + "version": "1.0.0", + "type": "module", + "main": "main.mjs", + "types": "main.d.mts" +} diff --git a/tests/registry/npm-private2/@denotest2/basic/1.0.0/main.d.mts b/tests/registry/npm-private2/@denotest2/basic/1.0.0/main.d.mts new file mode 100644 index 00000000000000..29da1e6d7b2ef4 --- /dev/null +++ b/tests/registry/npm-private2/@denotest2/basic/1.0.0/main.d.mts @@ -0,0 +1,3 @@ +export declare function setValue(val: number): void; +export declare function getValue(): number; +export declare const url: string; diff --git a/tests/registry/npm-private2/@denotest2/basic/1.0.0/main.mjs b/tests/registry/npm-private2/@denotest2/basic/1.0.0/main.mjs new file mode 100644 index 00000000000000..0a44f75859e9b0 --- /dev/null +++ b/tests/registry/npm-private2/@denotest2/basic/1.0.0/main.mjs @@ -0,0 +1,11 @@ +let value = 0; + +export function setValue(newValue) { + value = newValue; +} + +export function getValue() { + return value; +} + +export const url = import.meta.url; diff --git a/tests/registry/npm-private2/@denotest2/basic/1.0.0/other.mjs b/tests/registry/npm-private2/@denotest2/basic/1.0.0/other.mjs new file mode 100644 index 00000000000000..00ed99da45d6da --- /dev/null +++ b/tests/registry/npm-private2/@denotest2/basic/1.0.0/other.mjs @@ -0,0 +1,3 @@ +export function hello() { + return "hello, world!"; +} \ No newline at end of file diff --git a/tests/registry/npm-private/@denotest2/basic/1.0.0/package.json b/tests/registry/npm-private2/@denotest2/basic/1.0.0/package.json similarity index 100% rename from tests/registry/npm-private/@denotest2/basic/1.0.0/package.json rename to tests/registry/npm-private2/@denotest2/basic/1.0.0/package.json diff --git a/tests/specs/npm/npmrc/.npmrc b/tests/specs/npm/npmrc/.npmrc index 87eeb9f6fa795c..3b95fd6abaea1f 100644 --- a/tests/specs/npm/npmrc/.npmrc +++ b/tests/specs/npm/npmrc/.npmrc @@ -1,4 +1,4 @@ -@denotest:registry=http://127.0.0.1:4252/private_registry_1/ -//127.0.0.1:4252/private_registry_1/denotest/:_authToken=private-reg-token -@denotest2:registry=http://127.0.0.1:4253/private_registry_2/ -//127.0.0.1:4253/private_registry_2/denotest2/:_authToken=private-reg-token2 +@denotest:registry=http://127.0.0.1:4559/npm-private/ +//127.0.0.1:4559/npm-private/denotest/:_authToken=private-reg-token +@denotest2:registry=http://127.0.0.1:4560/npm-private2/ +//127.0.0.1:4560/npm-private2/denotest2/:_authToken=private-reg-token2 diff --git a/tests/specs/npm/npmrc/main.js b/tests/specs/npm/npmrc/main.js index 771ef18732586d..66b39363600109 100644 --- a/tests/specs/npm/npmrc/main.js +++ b/tests/specs/npm/npmrc/main.js @@ -1,4 +1,4 @@ -import { getValue, setValue } from "@denotest/esm-basic"; +import { getValue, setValue } from "@denotest/basic"; import * as test from "@denotest2/basic"; console.log(getValue()); diff --git a/tests/specs/npm/npmrc/main.out b/tests/specs/npm/npmrc/main.out index 7115414a0a3130..04cf4dc2bd1a5b 100644 --- a/tests/specs/npm/npmrc/main.out +++ b/tests/specs/npm/npmrc/main.out @@ -1,9 +1,9 @@ [UNORDERED_START] -Download http://127.0.0.1:4252/private_registry_1/@denotest/esm-basic -Download http://localhost:4252/private_registry_1/@denotest/esm-basic/1.0.0.tgz -Download http://127.0.0.1:4253/private_registry_2/@denotest2/basic -Download http://localhost:4253/private_registry_2/@denotest2/basic/1.0.0.tgz -Initialize @denotest/esm-basic@1.0.0 +Download http://127.0.0.1:4559/npm-private/@denotest/basic +Download http://localhost:4559/npm-private/@denotest/basic/1.0.0.tgz +Download http://127.0.0.1:4560/npm-private2/@denotest2/basic +Download http://localhost:4560/npm-private2/@denotest2/basic/1.0.0.tgz +Initialize @denotest/basic@1.0.0 Initialize @denotest2/basic@1.0.0 [UNORDERED_END] 0 diff --git a/tests/specs/npm/npmrc/package.json b/tests/specs/npm/npmrc/package.json index ec31d83492fe4a..274d1ed7f437b8 100644 --- a/tests/specs/npm/npmrc/package.json +++ b/tests/specs/npm/npmrc/package.json @@ -2,7 +2,7 @@ "name": "npmrc_test", "version": "0.0.1", "dependencies": { - "@denotest/esm-basic": "1.0.0", + "@denotest/basic": "1.0.0", "@denotest2/basic": "1.0.0" } } diff --git a/tests/specs/npm/npmrc_bad_token/.npmrc b/tests/specs/npm/npmrc_bad_token/.npmrc index 3b8e9173ac7c88..df3de2310a2d38 100644 --- a/tests/specs/npm/npmrc_bad_token/.npmrc +++ b/tests/specs/npm/npmrc_bad_token/.npmrc @@ -1,2 +1,2 @@ -@denotest:registry=http://127.0.0.1:4252/private_registry_1/ -//127.0.0.1:4252/private_registry_1/denotest/:_authToken=invalid-token +@denotest:registry=http://127.0.0.1:4559/npm-private/ +//127.0.0.1:4559/npm-private/denotest/:_authToken=invalid-token diff --git a/tests/specs/npm/npmrc_bad_token/main.js b/tests/specs/npm/npmrc_bad_token/main.js index 81dd521da72565..e8ccf7611c787d 100644 --- a/tests/specs/npm/npmrc_bad_token/main.js +++ b/tests/specs/npm/npmrc_bad_token/main.js @@ -1,4 +1,4 @@ -import { getValue, setValue } from "@denotest/esm-basic"; +import { getValue, setValue } from "@denotest/basic"; console.log(getValue()); setValue(42); diff --git a/tests/specs/npm/npmrc_bad_token/main.out b/tests/specs/npm/npmrc_bad_token/main.out index 7ccba5eea0cf73..007b36fc5bfe87 100644 --- a/tests/specs/npm/npmrc_bad_token/main.out +++ b/tests/specs/npm/npmrc_bad_token/main.out @@ -1,4 +1,4 @@ -Download http://127.0.0.1:4252/private_registry_1/@denotest/esm-basic -Download http://127.0.0.1:4252/private_registry_1/@denotest/esm-basic -error: Error getting response at http://127.0.0.1:4252/private_registry_1/@denotest/esm-basic for package "@denotest/esm-basic": Bad response: 401 +Download http://127.0.0.1:4559/npm-private/@denotest/basic +Download http://127.0.0.1:4559/npm-private/@denotest/basic +error: Error getting response at http://127.0.0.1:4559/npm-private/@denotest/basic for package "@denotest/basic": Bad response: 401 [WILDCARD] \ No newline at end of file diff --git a/tests/specs/npm/npmrc_bad_token/package.json b/tests/specs/npm/npmrc_bad_token/package.json index 99feed9d83ae09..b5ca7df4216a28 100644 --- a/tests/specs/npm/npmrc_bad_token/package.json +++ b/tests/specs/npm/npmrc_bad_token/package.json @@ -2,6 +2,6 @@ "name": "npmrc_test", "version": "0.0.1", "dependencies": { - "@denotest/esm-basic": "1.0.0" + "@denotest/basic": "1.0.0" } } diff --git a/tests/specs/npm/npmrc_deno_json/.npmrc b/tests/specs/npm/npmrc_deno_json/.npmrc index 7e14ea3253e750..8bf41e8496e9a9 100644 --- a/tests/specs/npm/npmrc_deno_json/.npmrc +++ b/tests/specs/npm/npmrc_deno_json/.npmrc @@ -1,2 +1,2 @@ -@denotest:registry=http://127.0.0.1:4252/private_registry_1/ -//127.0.0.1:4252/private_registry_1/denotest/:_authToken=private-reg-token +@denotest:registry=http://127.0.0.1:4559/npm-private/ +//127.0.0.1:4559/npm-private/denotest/:_authToken=private-reg-token diff --git a/tests/specs/npm/npmrc_deno_json/main.js b/tests/specs/npm/npmrc_deno_json/main.js index 90ea6b48e14178..9246715d1f1006 100644 --- a/tests/specs/npm/npmrc_deno_json/main.js +++ b/tests/specs/npm/npmrc_deno_json/main.js @@ -1,4 +1,4 @@ -import { getValue, setValue } from "npm:@denotest/esm-basic"; +import { getValue, setValue } from "npm:@denotest/basic"; console.log(getValue()); setValue(42); diff --git a/tests/specs/npm/npmrc_deno_json/main.out b/tests/specs/npm/npmrc_deno_json/main.out index 5c1427ad97a11d..30b8777f3d321f 100644 --- a/tests/specs/npm/npmrc_deno_json/main.out +++ b/tests/specs/npm/npmrc_deno_json/main.out @@ -1,4 +1,4 @@ -Download http://127.0.0.1:4252/private_registry_1/@denotest/esm-basic -Download http://localhost:4252/private_registry_1/@denotest/esm-basic/1.0.0.tgz +Download http://127.0.0.1:4559/npm-private/@denotest/basic +Download http://localhost:4559/npm-private/@denotest/basic/1.0.0.tgz 0 42 diff --git a/tests/specs/npm/npmrc_not_next_to_package_json/.npmrc b/tests/specs/npm/npmrc_not_next_to_package_json/.npmrc index 7e14ea3253e750..8bf41e8496e9a9 100644 --- a/tests/specs/npm/npmrc_not_next_to_package_json/.npmrc +++ b/tests/specs/npm/npmrc_not_next_to_package_json/.npmrc @@ -1,2 +1,2 @@ -@denotest:registry=http://127.0.0.1:4252/private_registry_1/ -//127.0.0.1:4252/private_registry_1/denotest/:_authToken=private-reg-token +@denotest:registry=http://127.0.0.1:4559/npm-private/ +//127.0.0.1:4559/npm-private/denotest/:_authToken=private-reg-token diff --git a/tests/specs/npm/npmrc_not_next_to_package_json/main.out b/tests/specs/npm/npmrc_not_next_to_package_json/main.out index 020b170d21ddab..204304a0aeecfa 100644 --- a/tests/specs/npm/npmrc_not_next_to_package_json/main.out +++ b/tests/specs/npm/npmrc_not_next_to_package_json/main.out @@ -2,9 +2,9 @@ [# that serves the same packages. The important bit is the message below.] [WILDCARD] No .npmrc file found [WILDCARD] -Download http://localhost:4545/npm/registry/@denotest/esm-basic +Download http://localhost:4558/@denotest/esm-basic [WILDCARD] -Download http://localhost:4545/npm/registry/@denotest/esm-basic/1.0.0.tgz +Download http://localhost:4558/@denotest/esm-basic/1.0.0.tgz Initialize @denotest/esm-basic@1.0.0 [WILDCARD] 0 From 0386add1c06328d9f0f7cb9b37495d37fb160f61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Tue, 7 May 2024 13:56:14 +0200 Subject: [PATCH 32/40] tests passing again --- tests/integration/npm_tests.rs | 2 +- tests/specs/npm/npmrc/.npmrc | 8 ++++---- tests/specs/npm/npmrc/main.out | 8 ++++---- tests/specs/npm/npmrc_bad_token/.npmrc | 4 ++-- tests/specs/npm/npmrc_bad_token/main.out | 6 +++--- tests/specs/npm/npmrc_deno_json/.npmrc | 4 ++-- tests/specs/npm/npmrc_deno_json/main.out | 4 ++-- tests/specs/npm/npmrc_not_next_to_package_json/.npmrc | 4 ++-- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/tests/integration/npm_tests.rs b/tests/integration/npm_tests.rs index cdad7462efa18c..dd8a23ede56ca4 100644 --- a/tests/integration/npm_tests.rs +++ b/tests/integration/npm_tests.rs @@ -3087,7 +3087,7 @@ async fn test_private_npm_registry() { let client = reqwest::Client::new(); - let url = Url::parse("http://127.0.0.1:4559/@denotest2/basic").unwrap(); + let url = Url::parse("http://127.0.0.1:4559/@denotest/basic").unwrap(); let req = reqwest::Request::new(reqwest::Method::GET, url.clone()); let resp = client.execute(req).await.unwrap(); diff --git a/tests/specs/npm/npmrc/.npmrc b/tests/specs/npm/npmrc/.npmrc index 3b95fd6abaea1f..cd7615aa5842c5 100644 --- a/tests/specs/npm/npmrc/.npmrc +++ b/tests/specs/npm/npmrc/.npmrc @@ -1,4 +1,4 @@ -@denotest:registry=http://127.0.0.1:4559/npm-private/ -//127.0.0.1:4559/npm-private/denotest/:_authToken=private-reg-token -@denotest2:registry=http://127.0.0.1:4560/npm-private2/ -//127.0.0.1:4560/npm-private2/denotest2/:_authToken=private-reg-token2 +@denotest:registry=http://127.0.0.1:4559/ +//127.0.0.1:4559/denotest/:_authToken=private-reg-token +@denotest2:registry=http://127.0.0.1:4560/ +//127.0.0.1:4560/denotest2/:_authToken=private-reg-token2 diff --git a/tests/specs/npm/npmrc/main.out b/tests/specs/npm/npmrc/main.out index 04cf4dc2bd1a5b..e6b69af7b9bf9a 100644 --- a/tests/specs/npm/npmrc/main.out +++ b/tests/specs/npm/npmrc/main.out @@ -1,8 +1,8 @@ [UNORDERED_START] -Download http://127.0.0.1:4559/npm-private/@denotest/basic -Download http://localhost:4559/npm-private/@denotest/basic/1.0.0.tgz -Download http://127.0.0.1:4560/npm-private2/@denotest2/basic -Download http://localhost:4560/npm-private2/@denotest2/basic/1.0.0.tgz +Download http://127.0.0.1:4559/@denotest/basic +Download http://localhost:4559/@denotest/basic/1.0.0.tgz +Download http://127.0.0.1:4560/@denotest2/basic +Download http://localhost:4560/@denotest2/basic/1.0.0.tgz Initialize @denotest/basic@1.0.0 Initialize @denotest2/basic@1.0.0 [UNORDERED_END] diff --git a/tests/specs/npm/npmrc_bad_token/.npmrc b/tests/specs/npm/npmrc_bad_token/.npmrc index df3de2310a2d38..7c8dfb50e24d4d 100644 --- a/tests/specs/npm/npmrc_bad_token/.npmrc +++ b/tests/specs/npm/npmrc_bad_token/.npmrc @@ -1,2 +1,2 @@ -@denotest:registry=http://127.0.0.1:4559/npm-private/ -//127.0.0.1:4559/npm-private/denotest/:_authToken=invalid-token +@denotest:registry=http://127.0.0.1:4559/ +//127.0.0.1:4559/denotest/:_authToken=invalid-token diff --git a/tests/specs/npm/npmrc_bad_token/main.out b/tests/specs/npm/npmrc_bad_token/main.out index 007b36fc5bfe87..fc6eb9f545c8c6 100644 --- a/tests/specs/npm/npmrc_bad_token/main.out +++ b/tests/specs/npm/npmrc_bad_token/main.out @@ -1,4 +1,4 @@ -Download http://127.0.0.1:4559/npm-private/@denotest/basic -Download http://127.0.0.1:4559/npm-private/@denotest/basic -error: Error getting response at http://127.0.0.1:4559/npm-private/@denotest/basic for package "@denotest/basic": Bad response: 401 +Download http://127.0.0.1:4559/@denotest/basic +Download http://127.0.0.1:4559/@denotest/basic +error: Error getting response at http://127.0.0.1:4559/@denotest/basic for package "@denotest/basic": Bad response: 401 [WILDCARD] \ No newline at end of file diff --git a/tests/specs/npm/npmrc_deno_json/.npmrc b/tests/specs/npm/npmrc_deno_json/.npmrc index 8bf41e8496e9a9..c235dacf294b9e 100644 --- a/tests/specs/npm/npmrc_deno_json/.npmrc +++ b/tests/specs/npm/npmrc_deno_json/.npmrc @@ -1,2 +1,2 @@ -@denotest:registry=http://127.0.0.1:4559/npm-private/ -//127.0.0.1:4559/npm-private/denotest/:_authToken=private-reg-token +@denotest:registry=http://127.0.0.1:4559/ +//127.0.0.1:4559/denotest/:_authToken=private-reg-token diff --git a/tests/specs/npm/npmrc_deno_json/main.out b/tests/specs/npm/npmrc_deno_json/main.out index 30b8777f3d321f..a6ce9b302edbf5 100644 --- a/tests/specs/npm/npmrc_deno_json/main.out +++ b/tests/specs/npm/npmrc_deno_json/main.out @@ -1,4 +1,4 @@ -Download http://127.0.0.1:4559/npm-private/@denotest/basic -Download http://localhost:4559/npm-private/@denotest/basic/1.0.0.tgz +Download http://127.0.0.1:4559/@denotest/basic +Download http://localhost:4559/@denotest/basic/1.0.0.tgz 0 42 diff --git a/tests/specs/npm/npmrc_not_next_to_package_json/.npmrc b/tests/specs/npm/npmrc_not_next_to_package_json/.npmrc index 8bf41e8496e9a9..c235dacf294b9e 100644 --- a/tests/specs/npm/npmrc_not_next_to_package_json/.npmrc +++ b/tests/specs/npm/npmrc_not_next_to_package_json/.npmrc @@ -1,2 +1,2 @@ -@denotest:registry=http://127.0.0.1:4559/npm-private/ -//127.0.0.1:4559/npm-private/denotest/:_authToken=private-reg-token +@denotest:registry=http://127.0.0.1:4559/ +//127.0.0.1:4559/denotest/:_authToken=private-reg-token From bc7b91ffe3545b46303b96d383a20f0bf1270e47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Thu, 9 May 2024 18:24:18 +0200 Subject: [PATCH 33/40] fix test --- tests/integration/npm_tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/npm_tests.rs b/tests/integration/npm_tests.rs index 4c4868c6522fb5..b26de619a89e74 100644 --- a/tests/integration/npm_tests.rs +++ b/tests/integration/npm_tests.rs @@ -3087,7 +3087,7 @@ async fn test_private_npm_registry() { let client = reqwest::Client::new(); - let url = Url::parse("http://127.0.0.1:4261/@denotest2/basic").unwrap(); + let url = Url::parse("http://127.0.0.1:4261/@denotest/basic").unwrap(); let req = reqwest::Request::new(reqwest::Method::GET, url.clone()); let resp = client.execute(req).await.unwrap(); From 1d6bc5e8181c3937253f4567e3fdb0bf18cb5fc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Thu, 9 May 2024 22:29:52 +0200 Subject: [PATCH 34/40] guard behind DENO_FUTURE --- cli/args/mod.rs | 4 ++++ tests/specs/npm/npmrc/__test__.jsonc | 12 ++++++++++-- tests/specs/npm/npmrc/install.out | 9 +++++++++ tests/specs/npm/npmrc/main.out | 8 -------- tests/specs/npm/npmrc_bad_token/__test__.jsonc | 5 ++++- tests/specs/npm/npmrc_bad_token/main.out | 2 +- tests/specs/npm/npmrc_deno_json/__test__.jsonc | 3 +++ .../npmrc_not_next_to_package_json/__test__.jsonc | 8 ++++++-- .../npm/npmrc_not_next_to_package_json/main.out | 6 ------ 9 files changed, 37 insertions(+), 20 deletions(-) create mode 100644 tests/specs/npm/npmrc/install.out diff --git a/cli/args/mod.rs b/cli/args/mod.rs index 4502caf2a2b4ff..923802a7275c0c 100644 --- a/cli/args/mod.rs +++ b/cli/args/mod.rs @@ -557,6 +557,10 @@ fn discover_npmrc( maybe_package_json_path: Option, maybe_deno_json_path: Option, ) -> Result, AnyError> { + if !*DENO_FUTURE { + return Ok(create_default_npmrc()); + } + const NPMRC_NAME: &str = ".npmrc"; fn get_env_var(var_name: &str) -> Option { diff --git a/tests/specs/npm/npmrc/__test__.jsonc b/tests/specs/npm/npmrc/__test__.jsonc index f942507716987a..44298ed2f5e07b 100644 --- a/tests/specs/npm/npmrc/__test__.jsonc +++ b/tests/specs/npm/npmrc/__test__.jsonc @@ -1,5 +1,13 @@ { + "envs": { + "DENO_FUTURE": "1" + }, "tempDir": true, - "args": "run -A main.js", - "output": "main.out" + "steps": [{ + "args": "install", + "output": "install.out" + }, { + "args": "run -A main.js", + "output": "main.out" + }] } diff --git a/tests/specs/npm/npmrc/install.out b/tests/specs/npm/npmrc/install.out new file mode 100644 index 00000000000000..7484405db9dd8b --- /dev/null +++ b/tests/specs/npm/npmrc/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://127.0.0.1:4261/@denotest/basic +Download http://127.0.0.1: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/main.out b/tests/specs/npm/npmrc/main.out index e608f7fd6e86ca..bbe210bdbc6684 100644 --- a/tests/specs/npm/npmrc/main.out +++ b/tests/specs/npm/npmrc/main.out @@ -1,11 +1,3 @@ -[UNORDERED_START] -Download http://127.0.0.1:4261/@denotest/basic -Download http://localhost:4261/@denotest/basic/1.0.0.tgz -Download http://127.0.0.1:4262/@denotest2/basic -Download http://localhost:4262/@denotest2/basic/1.0.0.tgz -Initialize @denotest/basic@1.0.0 -Initialize @denotest2/basic@1.0.0 -[UNORDERED_END] 0 42 0 diff --git a/tests/specs/npm/npmrc_bad_token/__test__.jsonc b/tests/specs/npm/npmrc_bad_token/__test__.jsonc index 852d39831d0ed9..fe99247b1bbe26 100644 --- a/tests/specs/npm/npmrc_bad_token/__test__.jsonc +++ b/tests/specs/npm/npmrc_bad_token/__test__.jsonc @@ -1,6 +1,9 @@ { + "envs": { + "DENO_FUTURE": "1" + }, "tempDir": true, - "args": "run -A main.js", + "args": "install", "output": "main.out", "exitCode": 1 } diff --git a/tests/specs/npm/npmrc_bad_token/main.out b/tests/specs/npm/npmrc_bad_token/main.out index 362d26a339e3c9..ceee1fed42bf61 100644 --- a/tests/specs/npm/npmrc_bad_token/main.out +++ b/tests/specs/npm/npmrc_bad_token/main.out @@ -1,4 +1,4 @@ -Download http://127.0.0.1:4261/@denotest/basic +⚠️ `deno install` behavior will change in Deno 2. To preserve the current behavior use the `-g` or `--global` flag. Download http://127.0.0.1:4261/@denotest/basic error: Error getting response at http://127.0.0.1:4261/@denotest/basic for package "@denotest/basic": Bad response: 401 [WILDCARD] \ No newline at end of file diff --git a/tests/specs/npm/npmrc_deno_json/__test__.jsonc b/tests/specs/npm/npmrc_deno_json/__test__.jsonc index f942507716987a..5d07b70342f580 100644 --- a/tests/specs/npm/npmrc_deno_json/__test__.jsonc +++ b/tests/specs/npm/npmrc_deno_json/__test__.jsonc @@ -1,4 +1,7 @@ { + "envs": { + "DENO_FUTURE": "1" + }, "tempDir": true, "args": "run -A main.js", "output": "main.out" diff --git a/tests/specs/npm/npmrc_not_next_to_package_json/__test__.jsonc b/tests/specs/npm/npmrc_not_next_to_package_json/__test__.jsonc index 596e2e71cfdc88..fa545c2902bf3a 100644 --- a/tests/specs/npm/npmrc_not_next_to_package_json/__test__.jsonc +++ b/tests/specs/npm/npmrc_not_next_to_package_json/__test__.jsonc @@ -1,5 +1,9 @@ { + "envs": { + "DENO_FUTURE": "1" + }, "tempDir": true, - "args": "run -A -L debug subdir/main.js", - "output": "main.out" + "args": "install -A -L debug", + "output": "main.out", + "cwd": "subdir" } diff --git a/tests/specs/npm/npmrc_not_next_to_package_json/main.out b/tests/specs/npm/npmrc_not_next_to_package_json/main.out index bb27afc189d946..8f42fb6d817958 100644 --- a/tests/specs/npm/npmrc_not_next_to_package_json/main.out +++ b/tests/specs/npm/npmrc_not_next_to_package_json/main.out @@ -2,11 +2,5 @@ [# that serves the same packages. The important bit is the message below.] [WILDCARD] No .npmrc file found [WILDCARD] -Download http://localhost:4260/@denotest/esm-basic -[WILDCARD] Download http://localhost:4260/@denotest/esm-basic/1.0.0.tgz Initialize @denotest/esm-basic@1.0.0 -[WILDCARD] -0 -42 -[WILDCARD] From d0edd15e5770404dde25f4de587a1dab86ddd0c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Mon, 13 May 2024 15:15:42 +0200 Subject: [PATCH 35/40] update lockfile --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 014149514c4966..543ad201593fc8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1747,9 +1747,9 @@ dependencies = [ [[package]] name = "deno_npm" -version = "0.20.1" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9db4bc4de6c0d2935662dcd99542b03a0db5f1778bada7ef2afc074e7819068d" +checksum = "5d2c41ced17886dc0a8d889d5c2ac7cd4d2b357964c3ad7f76c7580673b2f89f" dependencies = [ "anyhow", "async-trait", From 29047ee55abb6edea3712e1e0566b5675c83d486 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Tue, 14 May 2024 23:16:07 +0200 Subject: [PATCH 36/40] add tests for deno compile --- cli/npm/managed/cache.rs | 4 ++-- cli/standalone/mod.rs | 6 +++-- tests/specs/compile/npmrc/.npmrc | 4 ++++ tests/specs/compile/npmrc/__test__.jsonc | 28 ++++++++++++++++++++++++ tests/specs/compile/npmrc/install.out | 9 ++++++++ tests/specs/compile/npmrc/main.js | 8 +++++++ tests/specs/compile/npmrc/main.out | 3 +++ tests/specs/compile/npmrc/package.json | 8 +++++++ 8 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 tests/specs/compile/npmrc/.npmrc create mode 100644 tests/specs/compile/npmrc/__test__.jsonc create mode 100644 tests/specs/compile/npmrc/install.out create mode 100644 tests/specs/compile/npmrc/main.js create mode 100644 tests/specs/compile/npmrc/main.out create mode 100644 tests/specs/compile/npmrc/package.json diff --git a/cli/npm/managed/cache.rs b/cli/npm/managed/cache.rs index 218893a79731d3..d6cfb3c7b01b51 100644 --- a/cli/npm/managed/cache.rs +++ b/cli/npm/managed/cache.rs @@ -98,8 +98,8 @@ impl NpmCache { package_nv: &PackageNv, dist: &NpmPackageVersionDistInfo, ) -> Result<(), AnyError> { - let registry_url = self.npmrc.get_registry_url(&package.name); - let registry_config = self.npmrc.get_registry_config(&package.name); + let registry_url = self.npmrc.get_registry_url(&package_nv.name); + let registry_config = self.npmrc.get_registry_config(&package_nv.name); let package_folder = self .cache_dir diff --git a/cli/standalone/mod.rs b/cli/standalone/mod.rs index 4529ddc1f2cae6..9786b349ca586f 100644 --- a/cli/standalone/mod.rs +++ b/cli/standalone/mod.rs @@ -394,7 +394,8 @@ pub async fn run( package_json_deps_provider.clone(), ), npm_system_info: Default::default(), - // TODO(bartlomieju): do we need to support it here? + // Package from different registries are already inlined in the ESZip, + // so no need to create actual `.npmrc` configuration. npmrc: create_default_npmrc(), }), ) @@ -451,7 +452,8 @@ pub async fn run( package_json_deps_provider.clone(), ), npm_system_info: Default::default(), - // TODO(bartlomieju): do we need to support it here? + // Package from different registries are already inlined in the ESZip, + // so no need to create actual `.npmrc` configuration. npmrc: create_default_npmrc(), }), ) diff --git a/tests/specs/compile/npmrc/.npmrc b/tests/specs/compile/npmrc/.npmrc new file mode 100644 index 00000000000000..0624091f00304a --- /dev/null +++ b/tests/specs/compile/npmrc/.npmrc @@ -0,0 +1,4 @@ +@denotest:registry=http://127.0.0.1:4261/ +//127.0.0.1:4261/denotest/:_authToken=private-reg-token +@denotest2:registry=http://127.0.0.1:4262/ +//127.0.0.1:4262/denotest2/:_authToken=private-reg-token2 diff --git a/tests/specs/compile/npmrc/__test__.jsonc b/tests/specs/compile/npmrc/__test__.jsonc new file mode 100644 index 00000000000000..470e5299c856d6 --- /dev/null +++ b/tests/specs/compile/npmrc/__test__.jsonc @@ -0,0 +1,28 @@ +{ + "envs": { + "DENO_FUTURE": "1" + }, + "tempDir": true, + "steps": [{ + "args": "install", + "output": "install.out" + }, { + "if": "unix", + "args": "compile --output main main.js", + "output": "[WILDCARD]" + }, { + "if": "unix", + "commandName": "./main", + "args": [], + "output": "main.out" + }, { + "if": "windows", + "args": "compile --output main.exe main.js", + "output": "[WILDCARD]" + }, { + "if": "windows", + "commandName": "./main.exe", + "args": [], + "output": "main.out" + }] +} diff --git a/tests/specs/compile/npmrc/install.out b/tests/specs/compile/npmrc/install.out new file mode 100644 index 00000000000000..7484405db9dd8b --- /dev/null +++ b/tests/specs/compile/npmrc/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://127.0.0.1:4261/@denotest/basic +Download http://127.0.0.1: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/compile/npmrc/main.js b/tests/specs/compile/npmrc/main.js new file mode 100644 index 00000000000000..66b39363600109 --- /dev/null +++ b/tests/specs/compile/npmrc/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/compile/npmrc/main.out b/tests/specs/compile/npmrc/main.out new file mode 100644 index 00000000000000..bbe210bdbc6684 --- /dev/null +++ b/tests/specs/compile/npmrc/main.out @@ -0,0 +1,3 @@ +0 +42 +0 diff --git a/tests/specs/compile/npmrc/package.json b/tests/specs/compile/npmrc/package.json new file mode 100644 index 00000000000000..274d1ed7f437b8 --- /dev/null +++ b/tests/specs/compile/npmrc/package.json @@ -0,0 +1,8 @@ +{ + "name": "npmrc_test", + "version": "0.0.1", + "dependencies": { + "@denotest/basic": "1.0.0", + "@denotest2/basic": "1.0.0" + } +} From 23b54dc5256127b1fbb98e4bd3a0c2295a466e65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Tue, 14 May 2024 23:56:36 +0200 Subject: [PATCH 37/40] typo --- cli/standalone/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/standalone/mod.rs b/cli/standalone/mod.rs index 9786b349ca586f..22790b723b3112 100644 --- a/cli/standalone/mod.rs +++ b/cli/standalone/mod.rs @@ -394,7 +394,7 @@ pub async fn run( package_json_deps_provider.clone(), ), npm_system_info: Default::default(), - // Package from different registries are already inlined in the ESZip, + // Packages from different registries are already inlined in the ESZip, // so no need to create actual `.npmrc` configuration. npmrc: create_default_npmrc(), }), @@ -452,7 +452,7 @@ pub async fn run( package_json_deps_provider.clone(), ), npm_system_info: Default::default(), - // Package from different registries are already inlined in the ESZip, + // Packages from different registries are already inlined in the ESZip, // so no need to create actual `.npmrc` configuration. npmrc: create_default_npmrc(), }), From 00cedbde3e18243c41ce7d35a30c6c2cbccd0765 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Wed, 15 May 2024 00:42:50 +0200 Subject: [PATCH 38/40] compute registry dirname in the constructor --- cli/npm/cache_dir.rs | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/cli/npm/cache_dir.rs b/cli/npm/cache_dir.rs index 7fd0e23c97c7fd..c25733e3f99ddd 100644 --- a/cli/npm/cache_dir.rs +++ b/cli/npm/cache_dir.rs @@ -20,8 +20,9 @@ pub struct NpmCacheDir { root_dir: PathBuf, // cached url representation of the root directory root_dir_url: Url, - // A list of all registry URLs that were discovered via `.npmrc` files - known_registries_urls: Vec, + // A list of all registry that were discovered via `.npmrc` files + // turned into a safe directory names. + known_registries_dirnames: Vec, } impl NpmCacheDir { @@ -40,10 +41,20 @@ impl NpmCacheDir { let root_dir = try_get_canonicalized_root_dir(&root_dir).unwrap_or(root_dir); let root_dir_url = Url::from_directory_path(&root_dir).unwrap(); + + let known_registries_dirnames: Vec<_> = known_registries_urls + .into_iter() + .map(|url| { + root_url_to_safe_local_dirname(&url) + .to_string_lossy() + .replace('\\', "/") + }) + .collect(); + Self { root_dir, root_dir_url, - known_registries_urls, + known_registries_dirnames, } } @@ -107,16 +118,14 @@ impl NpmCacheDir { ) -> Option { let mut maybe_relative_url = None; + // let _relative_url = self.root_dir_url.make_relative(specifier).unwrap(); + // panic!("relative url {}", _relative_url); + // Iterate through known registries and try to get a match. - for registry_url in &self.known_registries_urls { + for registry_dirname in &self.known_registries_dirnames { let registry_root_dir = self .root_dir_url - .join(&format!( - "{}/", - root_url_to_safe_local_dirname(registry_url) - .to_string_lossy() - .replace('\\', "/") - )) + .join(&format!("{}/", registry_dirname)) // this not succeeding indicates a fatal issue, so unwrap .unwrap(); From 30cca3e900528fbce479b84b3556c7d17e01f49a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Thu, 23 May 2024 01:31:57 +0200 Subject: [PATCH 39/40] add support for _auth --- cli/npm/common.rs | 24 +++++++++++++++++++ cli/npm/managed/cache.rs | 13 +++------- cli/npm/managed/registry.rs | 13 +++------- tests/specs/npm/npmrc/.npmrc | 4 ++-- tests/specs/npm/npmrc_basic_auth/.npmrc | 4 ++++ .../specs/npm/npmrc_basic_auth/__test__.jsonc | 13 ++++++++++ tests/specs/npm/npmrc_basic_auth/install.out | 9 +++++++ tests/specs/npm/npmrc_basic_auth/main.js | 8 +++++++ tests/specs/npm/npmrc_basic_auth/main.out | 3 +++ tests/specs/npm/npmrc_basic_auth/package.json | 8 +++++++ tests/util/server/src/servers/npm_registry.rs | 13 ++++++++-- 11 files changed, 88 insertions(+), 24 deletions(-) create mode 100644 tests/specs/npm/npmrc_basic_auth/.npmrc create mode 100644 tests/specs/npm/npmrc_basic_auth/__test__.jsonc create mode 100644 tests/specs/npm/npmrc_basic_auth/install.out create mode 100644 tests/specs/npm/npmrc_basic_auth/main.js create mode 100644 tests/specs/npm/npmrc_basic_auth/main.out create mode 100644 tests/specs/npm/npmrc_basic_auth/package.json diff --git a/cli/npm/common.rs b/cli/npm/common.rs index e409248382e9d7..bf45aa5b816a67 100644 --- a/cli/npm/common.rs +++ b/cli/npm/common.rs @@ -1,5 +1,8 @@ // Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. +use deno_npm::npm_rc::RegistryConfig; +use reqwest::header; + /// Gets the corresponding @types package for the provided package name. pub fn types_package_name(package_name: &str) -> String { debug_assert!(!package_name.starts_with("@types/")); @@ -8,6 +11,27 @@ pub fn types_package_name(package_name: &str) -> String { format!("@types/{}", package_name.replace('/', "__")) } +// TODO(bartlomieju): support more auth methods besides token and basic auth +pub fn maybe_auth_header_for_npm_registry( + registry_config: &RegistryConfig, +) -> Option<(header::HeaderName, header::HeaderValue)> { + if let Some(token) = registry_config.auth_token.as_ref() { + return Some(( + header::AUTHORIZATION, + header::HeaderValue::from_str(&format!("Bearer {}", token)).unwrap(), + )); + } + + if let Some(auth) = registry_config.auth.as_ref() { + return Some(( + header::AUTHORIZATION, + header::HeaderValue::from_str(&format!("Basic {}", auth)).unwrap(), + )); + } + + None +} + #[cfg(test)] mod test { use super::types_package_name; diff --git a/cli/npm/managed/cache.rs b/cli/npm/managed/cache.rs index d6cfb3c7b01b51..4056c97ad9ed16 100644 --- a/cli/npm/managed/cache.rs +++ b/cli/npm/managed/cache.rs @@ -21,6 +21,7 @@ use deno_semver::package::PackageNv; use crate::args::CacheSetting; use crate::http_util::HttpClient; +use crate::npm::common::maybe_auth_header_for_npm_registry; use crate::npm::NpmCacheDir; use crate::util::fs::hard_link_dir_recursive; use crate::util::progress_bar::ProgressBar; @@ -123,20 +124,12 @@ impl NpmCache { bail!("Tarball URL was empty."); } - let mut maybe_header = None; - // TODO(bartlomieju): support more auth methods besides token - if let Some(token) = registry_config.auth_token.as_ref() { - maybe_header = Some(( - reqwest::header::AUTHORIZATION, - reqwest::header::HeaderValue::from_str(&format!("Bearer {}", token)) - .unwrap(), - )) - } + let maybe_auth_header = maybe_auth_header_for_npm_registry(registry_config); let guard = self.progress_bar.update(&dist.tarball); let maybe_bytes = self .http_client - .download_with_progress(&dist.tarball, maybe_header, &guard) + .download_with_progress(&dist.tarball, maybe_auth_header, &guard) .await?; match maybe_bytes { Some(bytes) => { diff --git a/cli/npm/managed/registry.rs b/cli/npm/managed/registry.rs index 0bbe09ebd024be..391ff06401cd1d 100644 --- a/cli/npm/managed/registry.rs +++ b/cli/npm/managed/registry.rs @@ -27,6 +27,7 @@ use deno_npm::registry::NpmRegistryPackageInfoLoadError; use crate::args::CacheSetting; use crate::cache::CACHE_PERM; use crate::http_util::HttpClient; +use crate::npm::common::maybe_auth_header_for_npm_registry; use crate::util::fs::atomic_write_file; use crate::util::progress_bar::ProgressBar; use crate::util::sync::AtomicFlag; @@ -308,19 +309,11 @@ impl CliNpmRegistryApiInner { let package_url = self.get_package_url(name, registry_url); let guard = self.progress_bar.update(package_url.as_str()); - let mut maybe_header = None; - // TODO(bartlomieju): support more auth methods besides token - if let Some(token) = registry_config.auth_token.as_ref() { - maybe_header = Some(( - reqwest::header::AUTHORIZATION, - reqwest::header::HeaderValue::from_str(&format!("Bearer {}", token)) - .unwrap(), - )) - } + let maybe_auth_header = maybe_auth_header_for_npm_registry(registry_config); let maybe_bytes = self .http_client - .download_with_progress(package_url, maybe_header, &guard) + .download_with_progress(package_url, maybe_auth_header, &guard) .await?; match maybe_bytes { Some(bytes) => { diff --git a/tests/specs/npm/npmrc/.npmrc b/tests/specs/npm/npmrc/.npmrc index 0624091f00304a..085885ec8fdf81 100644 --- a/tests/specs/npm/npmrc/.npmrc +++ b/tests/specs/npm/npmrc/.npmrc @@ -1,4 +1,4 @@ @denotest:registry=http://127.0.0.1:4261/ -//127.0.0.1:4261/denotest/:_authToken=private-reg-token +//127.0.0.1:4261/denotest/:_auth=ZGVubzpsYW5k @denotest2:registry=http://127.0.0.1:4262/ -//127.0.0.1:4262/denotest2/:_authToken=private-reg-token2 +//127.0.0.1:4262/denotest2/:_auth=ZGVubzpsYW5kMg== diff --git a/tests/specs/npm/npmrc_basic_auth/.npmrc b/tests/specs/npm/npmrc_basic_auth/.npmrc new file mode 100644 index 00000000000000..0624091f00304a --- /dev/null +++ b/tests/specs/npm/npmrc_basic_auth/.npmrc @@ -0,0 +1,4 @@ +@denotest:registry=http://127.0.0.1:4261/ +//127.0.0.1:4261/denotest/:_authToken=private-reg-token +@denotest2:registry=http://127.0.0.1:4262/ +//127.0.0.1:4262/denotest2/:_authToken=private-reg-token2 diff --git a/tests/specs/npm/npmrc_basic_auth/__test__.jsonc b/tests/specs/npm/npmrc_basic_auth/__test__.jsonc new file mode 100644 index 00000000000000..44298ed2f5e07b --- /dev/null +++ b/tests/specs/npm/npmrc_basic_auth/__test__.jsonc @@ -0,0 +1,13 @@ +{ + "envs": { + "DENO_FUTURE": "1" + }, + "tempDir": true, + "steps": [{ + "args": "install", + "output": "install.out" + }, { + "args": "run -A main.js", + "output": "main.out" + }] +} diff --git a/tests/specs/npm/npmrc_basic_auth/install.out b/tests/specs/npm/npmrc_basic_auth/install.out new file mode 100644 index 00000000000000..7484405db9dd8b --- /dev/null +++ b/tests/specs/npm/npmrc_basic_auth/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://127.0.0.1:4261/@denotest/basic +Download http://127.0.0.1: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_basic_auth/main.js b/tests/specs/npm/npmrc_basic_auth/main.js new file mode 100644 index 00000000000000..66b39363600109 --- /dev/null +++ b/tests/specs/npm/npmrc_basic_auth/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_basic_auth/main.out b/tests/specs/npm/npmrc_basic_auth/main.out new file mode 100644 index 00000000000000..bbe210bdbc6684 --- /dev/null +++ b/tests/specs/npm/npmrc_basic_auth/main.out @@ -0,0 +1,3 @@ +0 +42 +0 diff --git a/tests/specs/npm/npmrc_basic_auth/package.json b/tests/specs/npm/npmrc_basic_auth/package.json new file mode 100644 index 00000000000000..274d1ed7f437b8 --- /dev/null +++ b/tests/specs/npm/npmrc_basic_auth/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/servers/npm_registry.rs b/tests/util/server/src/servers/npm_registry.rs index 79d1cc007f41b7..7e5547b5bab090 100644 --- a/tests/util/server/src/servers/npm_registry.rs +++ b/tests/util/server/src/servers/npm_registry.rs @@ -35,6 +35,11 @@ pub fn public_npm_registry(port: u16) -> Vec> { const PRIVATE_NPM_REGISTRY_AUTH_TOKEN: &str = "private-reg-token"; const PRIVATE_NPM_REGISTRY_2_AUTH_TOKEN: &str = "private-reg-token2"; +// `deno:land` encoded using base64 +const PRIVATE_NPM_REGISTRY_AUTH_BASE64: &str = "ZGVubzpsYW5k"; +// `deno:land2` encoded using base64 +const PRIVATE_NPM_REGISTRY_2_AUTH_BASE64: &str = "ZGVubzpsYW5kMg=="; + pub fn private_npm_registry1(port: u16) -> Vec> { run_npm_server( port, @@ -100,7 +105,9 @@ async fn private_npm_registry1_handler( .get("authorization") .and_then(|x| x.to_str().ok()) .unwrap_or_default(); - if auth != format!("Bearer {}", PRIVATE_NPM_REGISTRY_AUTH_TOKEN) { + if auth != format!("Bearer {}", PRIVATE_NPM_REGISTRY_AUTH_TOKEN) + && auth != format!("Basic {}", PRIVATE_NPM_REGISTRY_AUTH_BASE64) + { return Ok( Response::builder() .status(StatusCode::UNAUTHORIZED) @@ -120,7 +127,9 @@ async fn private_npm_registry2_handler( .get("authorization") .and_then(|x| x.to_str().ok()) .unwrap_or_default(); - if auth != format!("Bearer {}", PRIVATE_NPM_REGISTRY_2_AUTH_TOKEN) { + if auth != format!("Bearer {}", PRIVATE_NPM_REGISTRY_2_AUTH_TOKEN) + && auth != format!("Basic {}", PRIVATE_NPM_REGISTRY_2_AUTH_BASE64) + { return Ok( Response::builder() .status(StatusCode::UNAUTHORIZED) From 88bc5203f850beb8d85d04253dc835ce4ccd780d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Thu, 23 May 2024 01:36:12 +0200 Subject: [PATCH 40/40] remove debug output --- cli/npm/cache_dir.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/cli/npm/cache_dir.rs b/cli/npm/cache_dir.rs index c25733e3f99ddd..d519137757e2ff 100644 --- a/cli/npm/cache_dir.rs +++ b/cli/npm/cache_dir.rs @@ -118,9 +118,6 @@ impl NpmCacheDir { ) -> Option { let mut maybe_relative_url = None; - // let _relative_url = self.root_dir_url.make_relative(specifier).unwrap(); - // panic!("relative url {}", _relative_url); - // Iterate through known registries and try to get a match. for registry_dirname in &self.known_registries_dirnames { let registry_root_dir = self