summaryrefslogtreecommitdiff
path: root/cli/npm/mod.rs
diff options
context:
space:
mode:
authorhaturau <135221985+haturatu@users.noreply.github.com>2024-11-20 01:20:47 +0900
committerGitHub <noreply@github.com>2024-11-20 01:20:47 +0900
commit85719a67e59c7aa45bead26e4942d7df8b1b42d4 (patch)
treeface0aecaac53e93ce2f23b53c48859bcf1a36ec /cli/npm/mod.rs
parent67697bc2e4a62a9670699fd18ad0dd8efc5bd955 (diff)
parent186b52731c6bb326c4d32905c5e732d082e83465 (diff)
Merge branch 'denoland:main' into main
Diffstat (limited to 'cli/npm/mod.rs')
-rw-r--r--cli/npm/mod.rs99
1 files changed, 72 insertions, 27 deletions
diff --git a/cli/npm/mod.rs b/cli/npm/mod.rs
index 53baaf77b..0e955ac5b 100644
--- a/cli/npm/mod.rs
+++ b/cli/npm/mod.rs
@@ -4,43 +4,40 @@ mod byonm;
mod common;
mod managed;
+use std::borrow::Cow;
use std::path::Path;
-use std::path::PathBuf;
use std::sync::Arc;
+use common::maybe_auth_header_for_npm_registry;
use dashmap::DashMap;
-use deno_ast::ModuleSpecifier;
use deno_core::error::AnyError;
use deno_core::serde_json;
+use deno_npm::npm_rc::ResolvedNpmRc;
use deno_npm::registry::NpmPackageInfo;
+use deno_resolver::npm::ByonmInNpmPackageChecker;
use deno_resolver::npm::ByonmNpmResolver;
-use deno_resolver::npm::ByonmResolvePkgFolderFromDenoReqError;
-use deno_runtime::deno_node::NodeRequireResolver;
+use deno_resolver::npm::CliNpmReqResolver;
+use deno_resolver::npm::ResolvePkgFolderFromDenoReqError;
+use deno_runtime::deno_node::NodePermissions;
use deno_runtime::ops::process::NpmProcessStateProvider;
use deno_semver::package::PackageNv;
use deno_semver::package::PackageReq;
-use node_resolver::NpmResolver;
-use thiserror::Error;
+use managed::cache::registry_info::get_package_url;
+use managed::create_managed_in_npm_pkg_checker;
+use node_resolver::InNpmPackageChecker;
+use node_resolver::NpmPackageFolderResolver;
-use crate::args::npm_registry_url;
use crate::file_fetcher::FileFetcher;
pub use self::byonm::CliByonmNpmResolver;
pub use self::byonm::CliByonmNpmResolverCreateOptions;
-pub use self::managed::CliNpmResolverManagedCreateOptions;
+pub use self::managed::CliManagedInNpmPkgCheckerCreateOptions;
+pub use self::managed::CliManagedNpmResolverCreateOptions;
pub use self::managed::CliNpmResolverManagedSnapshotOption;
pub use self::managed::ManagedCliNpmResolver;
-#[derive(Debug, Error)]
-pub enum ResolvePkgFolderFromDenoReqError {
- #[error(transparent)]
- Managed(deno_core::error::AnyError),
- #[error(transparent)]
- Byonm(#[from] ByonmResolvePkgFolderFromDenoReqError),
-}
-
pub enum CliNpmResolverCreateOptions {
- Managed(CliNpmResolverManagedCreateOptions),
+ Managed(CliManagedNpmResolverCreateOptions),
Byonm(CliByonmNpmResolverCreateOptions),
}
@@ -66,18 +63,39 @@ pub async fn create_cli_npm_resolver(
}
}
+pub enum CreateInNpmPkgCheckerOptions<'a> {
+ Managed(CliManagedInNpmPkgCheckerCreateOptions<'a>),
+ Byonm,
+}
+
+pub fn create_in_npm_pkg_checker(
+ options: CreateInNpmPkgCheckerOptions,
+) -> Arc<dyn InNpmPackageChecker> {
+ match options {
+ CreateInNpmPkgCheckerOptions::Managed(options) => {
+ create_managed_in_npm_pkg_checker(options)
+ }
+ CreateInNpmPkgCheckerOptions::Byonm => Arc::new(ByonmInNpmPackageChecker),
+ }
+}
+
pub enum InnerCliNpmResolverRef<'a> {
Managed(&'a ManagedCliNpmResolver),
#[allow(dead_code)]
Byonm(&'a CliByonmNpmResolver),
}
-pub trait CliNpmResolver: NpmResolver {
- fn into_npm_resolver(self: Arc<Self>) -> Arc<dyn NpmResolver>;
- fn into_require_resolver(self: Arc<Self>) -> Arc<dyn NodeRequireResolver>;
+pub trait CliNpmResolver: NpmPackageFolderResolver + CliNpmReqResolver {
+ fn into_npm_pkg_folder_resolver(
+ self: Arc<Self>,
+ ) -> Arc<dyn NpmPackageFolderResolver>;
+ fn into_npm_req_resolver(self: Arc<Self>) -> Arc<dyn CliNpmReqResolver>;
fn into_process_state_provider(
self: Arc<Self>,
) -> Arc<dyn NpmProcessStateProvider>;
+ fn into_maybe_byonm(self: Arc<Self>) -> Option<Arc<CliByonmNpmResolver>> {
+ None
+ }
fn clone_snapshotted(&self) -> Arc<dyn CliNpmResolver>;
@@ -99,11 +117,11 @@ pub trait CliNpmResolver: NpmResolver {
fn root_node_modules_path(&self) -> Option<&Path>;
- fn resolve_pkg_folder_from_deno_module_req(
+ fn ensure_read_permission<'a>(
&self,
- req: &PackageReq,
- referrer: &ModuleSpecifier,
- ) -> Result<PathBuf, ResolvePkgFolderFromDenoReqError>;
+ permissions: &mut dyn NodePermissions,
+ path: &'a Path,
+ ) -> Result<Cow<'a, Path>, AnyError>;
/// Returns a hash returning the state of the npm resolver
/// or `None` if the state currently can't be determined.
@@ -115,14 +133,19 @@ pub struct NpmFetchResolver {
nv_by_req: DashMap<PackageReq, Option<PackageNv>>,
info_by_name: DashMap<String, Option<Arc<NpmPackageInfo>>>,
file_fetcher: Arc<FileFetcher>,
+ npmrc: Arc<ResolvedNpmRc>,
}
impl NpmFetchResolver {
- pub fn new(file_fetcher: Arc<FileFetcher>) -> Self {
+ pub fn new(
+ file_fetcher: Arc<FileFetcher>,
+ npmrc: Arc<ResolvedNpmRc>,
+ ) -> Self {
Self {
nv_by_req: Default::default(),
info_by_name: Default::default(),
file_fetcher,
+ npmrc,
}
}
@@ -157,11 +180,21 @@ impl NpmFetchResolver {
return info.value().clone();
}
let fetch_package_info = || async {
- let info_url = npm_registry_url().join(name).ok()?;
+ let info_url = get_package_url(&self.npmrc, name);
let file_fetcher = self.file_fetcher.clone();
+ let registry_config = self.npmrc.get_registry_config(name);
+ // TODO(bartlomieju): this should error out, not use `.ok()`.
+ let maybe_auth_header =
+ maybe_auth_header_for_npm_registry(registry_config).ok()?;
// spawn due to the lsp's `Send` requirement
let file = deno_core::unsync::spawn(async move {
- file_fetcher.fetch_bypass_permissions(&info_url).await.ok()
+ file_fetcher
+ .fetch_bypass_permissions_with_maybe_auth(
+ &info_url,
+ maybe_auth_header,
+ )
+ .await
+ .ok()
})
.await
.ok()??;
@@ -172,3 +205,15 @@ impl NpmFetchResolver {
info
}
}
+
+pub const NPM_CONFIG_USER_AGENT_ENV_VAR: &str = "npm_config_user_agent";
+
+pub fn get_npm_config_user_agent() -> String {
+ format!(
+ "deno/{} npm/? deno/{} {} {}",
+ env!("CARGO_PKG_VERSION"),
+ env!("CARGO_PKG_VERSION"),
+ std::env::consts::OS,
+ std::env::consts::ARCH
+ )
+}