From 8d24be1a59714761665516e0d78d25059608c29b Mon Sep 17 00:00:00 2001 From: David Sherret Date: Sat, 30 Sep 2023 12:06:38 -0400 Subject: refactor(npm): create `cli::npm::managed` module (#20740) Creates the `cli::npm::managed` module and starts moving more functionality into it. --- cli/npm/mod.rs | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 91 insertions(+), 11 deletions(-) (limited to 'cli/npm/mod.rs') diff --git a/cli/npm/mod.rs b/cli/npm/mod.rs index 1b6ec243c..114bf15f2 100644 --- a/cli/npm/mod.rs +++ b/cli/npm/mod.rs @@ -1,20 +1,100 @@ // Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. +mod managed; + +// todo(#18967): move the cache, registry, and tarball into the managed folder mod cache; -mod installer; mod registry; -mod resolution; -mod resolvers; mod tarball; +use std::collections::HashMap; +use std::path::PathBuf; +use std::sync::Arc; + +use deno_ast::ModuleSpecifier; +use deno_core::error::AnyError; +use deno_core::url::Url; +use deno_graph::NpmPackageReqResolution; +use deno_npm::resolution::PackageReqNotFoundError; +use deno_runtime::deno_node::NpmResolver; + pub use cache::NpmCache; pub use cache::NpmCacheDir; -pub use installer::PackageJsonDepsInstaller; +use deno_semver::npm::NpmPackageNvReference; +use deno_semver::npm::NpmPackageReqReference; +use deno_semver::package::PackageNv; +use deno_semver::package::PackageReq; +pub use managed::create_npm_fs_resolver; +pub use managed::ManagedCliNpmResolver; +pub use managed::NpmPackageFsResolver; +pub use managed::NpmProcessState; +pub use managed::NpmResolution; +pub use managed::PackageJsonDepsInstaller; pub use registry::CliNpmRegistryApi; -pub use resolution::NpmResolution; -pub use resolvers::create_npm_fs_resolver; -pub use resolvers::CliNpmResolver; -pub use resolvers::InnerCliNpmResolverRef; -pub use resolvers::ManagedCliNpmResolver; -pub use resolvers::NpmPackageFsResolver; -pub use resolvers::NpmProcessState; + +pub enum InnerCliNpmResolverRef<'a> { + Managed(&'a ManagedCliNpmResolver), + #[allow(dead_code)] + Byonm(&'a ByonmCliNpmResolver), +} + +pub trait CliNpmResolver: NpmResolver { + fn into_npm_resolver(self: Arc) -> Arc; + + fn root_dir_url(&self) -> &Url; + + fn as_inner(&self) -> InnerCliNpmResolverRef; + + fn as_managed(&self) -> Option<&ManagedCliNpmResolver> { + match self.as_inner() { + InnerCliNpmResolverRef::Managed(inner) => Some(inner), + InnerCliNpmResolverRef::Byonm(_) => None, + } + } + + fn node_modules_path(&self) -> Option; + + /// Checks if the provided package req's folder is cached. + fn is_pkg_req_folder_cached(&self, req: &PackageReq) -> bool; + + /// Resolves a package requirement for deno graph. This should only be + /// called by deno_graph's NpmResolver or for resolving packages in + /// a package.json + fn resolve_npm_for_deno_graph( + &self, + pkg_req: &PackageReq, + ) -> NpmPackageReqResolution; + + fn resolve_pkg_nv_ref_from_pkg_req_ref( + &self, + req_ref: &NpmPackageReqReference, + ) -> Result; + + /// Resolve the root folder of the package the provided specifier is in. + /// + /// This will error when the provided specifier is not in an npm package. + fn resolve_pkg_folder_from_specifier( + &self, + specifier: &ModuleSpecifier, + ) -> Result, AnyError>; + + fn resolve_pkg_folder_from_deno_module_req( + &self, + req: &PackageReq, + ) -> Result; + + fn resolve_pkg_folder_from_deno_module( + &self, + nv: &PackageNv, + ) -> Result; + + /// Gets the state of npm for the process. + fn get_npm_process_state(&self) -> String; + + // todo(#18967): should instead return a hash state of the resolver + // or perhaps this could be non-BYONM only and byonm always runs deno check + fn package_reqs(&self) -> HashMap; +} + +// todo(#18967): implement this +pub struct ByonmCliNpmResolver; -- cgit v1.2.3