2025-01-01 04:12:39 +09:00
|
|
|
// Copyright 2018-2025 the Deno authors. MIT license.
|
2022-09-22 11:17:02 -04:00
|
|
|
|
2022-09-13 11:59:01 -04:00
|
|
|
use std::path::Path;
|
|
|
|
use std::path::PathBuf;
|
|
|
|
|
2023-07-01 21:07:57 -04:00
|
|
|
use deno_npm::NpmPackageCacheFolderId;
|
2023-04-06 18:46:44 -04:00
|
|
|
use deno_npm::NpmPackageId;
|
2025-01-09 19:01:47 -05:00
|
|
|
use node_resolver::NpmPackageFolderResolver;
|
2025-01-27 15:23:20 -05:00
|
|
|
use node_resolver::UrlOrPathRef;
|
2025-01-14 10:01:05 -05:00
|
|
|
use sys_traits::FsCanonicalize;
|
|
|
|
use sys_traits::FsMetadata;
|
2025-01-09 12:10:07 -05:00
|
|
|
use url::Url;
|
|
|
|
|
2025-01-14 10:01:05 -05:00
|
|
|
#[derive(Debug)]
|
|
|
|
pub enum NpmPackageFsResolver<TSys: FsCanonicalize + FsMetadata> {
|
|
|
|
Local(super::local::LocalNpmPackageResolver<TSys>),
|
|
|
|
Global(super::global::GlobalNpmPackageResolver),
|
|
|
|
}
|
2022-09-13 11:59:01 -04:00
|
|
|
|
2025-01-14 10:01:05 -05:00
|
|
|
impl<TSys: FsCanonicalize + FsMetadata> NpmPackageFsResolver<TSys> {
|
|
|
|
/// The local node_modules folder (only for the local resolver).
|
|
|
|
pub fn node_modules_path(&self) -> Option<&Path> {
|
|
|
|
match self {
|
|
|
|
NpmPackageFsResolver::Local(resolver) => resolver.node_modules_path(),
|
|
|
|
NpmPackageFsResolver::Global(_) => None,
|
|
|
|
}
|
|
|
|
}
|
2023-03-12 23:32:59 -04:00
|
|
|
|
2025-01-14 10:01:05 -05:00
|
|
|
pub fn maybe_package_folder(
|
|
|
|
&self,
|
|
|
|
package_id: &NpmPackageId,
|
|
|
|
) -> Option<PathBuf> {
|
|
|
|
match self {
|
|
|
|
NpmPackageFsResolver::Local(resolver) => {
|
|
|
|
resolver.maybe_package_folder(package_id)
|
|
|
|
}
|
|
|
|
NpmPackageFsResolver::Global(resolver) => {
|
|
|
|
resolver.maybe_package_folder(package_id)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2024-07-09 12:15:03 -04:00
|
|
|
|
2025-01-14 10:01:05 -05:00
|
|
|
pub fn resolve_package_cache_folder_id_from_specifier(
|
2023-07-01 21:07:57 -04:00
|
|
|
&self,
|
2025-01-09 12:10:07 -05:00
|
|
|
specifier: &Url,
|
2025-01-14 10:01:05 -05:00
|
|
|
) -> Result<Option<NpmPackageCacheFolderId>, std::io::Error> {
|
|
|
|
match self {
|
|
|
|
NpmPackageFsResolver::Local(resolver) => {
|
|
|
|
resolver.resolve_package_cache_folder_id_from_specifier(specifier)
|
|
|
|
}
|
|
|
|
NpmPackageFsResolver::Global(resolver) => {
|
|
|
|
resolver.resolve_package_cache_folder_id_from_specifier(specifier)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<TSys: FsCanonicalize + FsMetadata> NpmPackageFolderResolver
|
|
|
|
for NpmPackageFsResolver<TSys>
|
|
|
|
{
|
|
|
|
fn resolve_package_folder_from_package(
|
|
|
|
&self,
|
|
|
|
specifier: &str,
|
2025-01-27 15:23:20 -05:00
|
|
|
referrer: &UrlOrPathRef,
|
2025-01-14 10:01:05 -05:00
|
|
|
) -> Result<PathBuf, node_resolver::errors::PackageFolderResolveError> {
|
|
|
|
match self {
|
|
|
|
NpmPackageFsResolver::Local(r) => {
|
|
|
|
r.resolve_package_folder_from_package(specifier, referrer)
|
|
|
|
}
|
|
|
|
NpmPackageFsResolver::Global(r) => {
|
|
|
|
r.resolve_package_folder_from_package(specifier, referrer)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-09-13 11:59:01 -04:00
|
|
|
}
|