Skip to main content

node_resolver/
npm.rs

1// Copyright 2018-2026 the Deno authors. MIT license.
2
3use std::path::Path;
4use std::path::PathBuf;
5
6use deno_path_util::url_from_directory_path;
7use deno_path_util::url_from_file_path;
8use deno_semver::Version;
9use url::Url;
10
11use crate::errors;
12use crate::path::PathClean;
13use crate::path::UrlOrPathRef;
14
15pub trait NpmPackageFolderResolver {
16  /// Resolves an npm package folder path from the specified referrer.
17  fn resolve_package_folder_from_package(
18    &self,
19    specifier: &str,
20    referrer: &UrlOrPathRef,
21  ) -> Result<PathBuf, errors::PackageFolderResolveError>;
22
23  /// Finds the `@types` package closest to the provided `@types` package name
24  /// and version of the original package.
25  fn resolve_types_package_folder(
26    &self,
27    types_package_name: &str,
28    maybe_package_version: Option<&Version>,
29    maybe_referrer: Option<&UrlOrPathRef>,
30  ) -> Option<PathBuf>;
31}
32
33/// Checks if a provided specifier is in an npm package.
34pub trait InNpmPackageChecker {
35  fn in_npm_package(&self, specifier: &Url) -> bool;
36
37  fn in_npm_package_at_dir_path(&self, path: &Path) -> bool {
38    let specifier = match url_from_directory_path(&path.to_path_buf().clean()) {
39      Ok(p) => p,
40      Err(_) => return false,
41    };
42    self.in_npm_package(&specifier)
43  }
44
45  fn in_npm_package_at_file_path(&self, path: &Path) -> bool {
46    let specifier = match url_from_file_path(&path.to_path_buf().clean()) {
47      Ok(p) => p,
48      Err(_) => return false,
49    };
50    self.in_npm_package(&specifier)
51  }
52}