mirror of
https://github.com/denoland/deno.git
synced 2025-02-23 21:53:26 -05:00

As title. Will allow consumers to create this struct and use our behaviour. Closes #27409
77 lines
2 KiB
Rust
77 lines
2 KiB
Rust
// Copyright 2018-2025 the Deno authors. MIT license.
|
|
|
|
mod common;
|
|
mod global;
|
|
mod local;
|
|
mod resolution;
|
|
|
|
use std::path::Path;
|
|
use std::path::PathBuf;
|
|
|
|
use node_resolver::InNpmPackageChecker;
|
|
use sys_traits::FsCanonicalize;
|
|
use sys_traits::FsMetadata;
|
|
use url::Url;
|
|
|
|
pub use self::common::NpmPackageFsResolver;
|
|
pub use self::common::NpmPackageFsResolverPackageFolderError;
|
|
use self::common::NpmPackageFsResolverRc;
|
|
use self::global::GlobalNpmPackageResolver;
|
|
use self::local::LocalNpmPackageResolver;
|
|
pub use self::resolution::NpmResolution;
|
|
use self::resolution::NpmResolutionRc;
|
|
use crate::sync::new_rc;
|
|
use crate::NpmCacheDirRc;
|
|
use crate::ResolvedNpmRcRc;
|
|
|
|
pub fn create_npm_fs_resolver<
|
|
TSys: FsCanonicalize + FsMetadata + Send + Sync + 'static,
|
|
>(
|
|
npm_cache_dir: &NpmCacheDirRc,
|
|
npm_rc: &ResolvedNpmRcRc,
|
|
resolution: NpmResolutionRc,
|
|
sys: TSys,
|
|
maybe_node_modules_path: Option<PathBuf>,
|
|
) -> NpmPackageFsResolverRc {
|
|
match maybe_node_modules_path {
|
|
Some(node_modules_folder) => new_rc(LocalNpmPackageResolver::new(
|
|
resolution,
|
|
sys,
|
|
node_modules_folder,
|
|
)),
|
|
None => new_rc(GlobalNpmPackageResolver::new(
|
|
npm_cache_dir.clone(),
|
|
npm_rc.clone(),
|
|
resolution,
|
|
)),
|
|
}
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub struct ManagedInNpmPackageChecker {
|
|
root_dir: Url,
|
|
}
|
|
|
|
impl InNpmPackageChecker for ManagedInNpmPackageChecker {
|
|
fn in_npm_package(&self, specifier: &Url) -> bool {
|
|
specifier.as_ref().starts_with(self.root_dir.as_str())
|
|
}
|
|
}
|
|
|
|
pub struct ManagedInNpmPkgCheckerCreateOptions<'a> {
|
|
pub root_cache_dir_url: &'a Url,
|
|
pub maybe_node_modules_path: Option<&'a Path>,
|
|
}
|
|
|
|
pub fn create_managed_in_npm_pkg_checker(
|
|
options: ManagedInNpmPkgCheckerCreateOptions,
|
|
) -> ManagedInNpmPackageChecker {
|
|
let root_dir = match options.maybe_node_modules_path {
|
|
Some(node_modules_folder) => {
|
|
deno_path_util::url_from_directory_path(node_modules_folder).unwrap()
|
|
}
|
|
None => options.root_cache_dir_url.clone(),
|
|
};
|
|
debug_assert!(root_dir.as_str().ends_with('/'));
|
|
ManagedInNpmPackageChecker { root_dir }
|
|
}
|