summaryrefslogtreecommitdiff
path: root/resolvers/deno/npm/byonm.rs
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2024-11-01 12:27:00 -0400
committerGitHub <noreply@github.com>2024-11-01 12:27:00 -0400
commit826e42a5b5880c974ae019a7a21aade6a718062c (patch)
treea46502ecc3c73e4f7fc3a4517d83c7b2f3d0c0d3 /resolvers/deno/npm/byonm.rs
parent4774eab64d5176e997b6431f03f075782321b3d9 (diff)
fix: improved support for cjs and cts modules (#26558)
* cts support * better cjs/cts type checking * deno compile cjs/cts support * More efficient detect cjs (going towards stabilization) * Determination of whether .js, .ts, .jsx, or .tsx is cjs or esm is only done after loading * Support `import x = require(...);` Co-authored-by: Bartek IwaƄczuk <biwanczuk@gmail.com>
Diffstat (limited to 'resolvers/deno/npm/byonm.rs')
-rw-r--r--resolvers/deno/npm/byonm.rs41
1 files changed, 29 insertions, 12 deletions
diff --git a/resolvers/deno/npm/byonm.rs b/resolvers/deno/npm/byonm.rs
index 3394b3e50..b85117052 100644
--- a/resolvers/deno/npm/byonm.rs
+++ b/resolvers/deno/npm/byonm.rs
@@ -10,16 +10,17 @@ use deno_package_json::PackageJsonDepValue;
use deno_path_util::url_to_file_path;
use deno_semver::package::PackageReq;
use deno_semver::Version;
+use node_resolver::env::NodeResolverEnv;
use node_resolver::errors::PackageFolderResolveError;
use node_resolver::errors::PackageFolderResolveIoError;
use node_resolver::errors::PackageJsonLoadError;
use node_resolver::errors::PackageNotFoundError;
-use node_resolver::load_pkg_json;
+use node_resolver::InNpmPackageChecker;
use node_resolver::NpmResolver;
+use node_resolver::PackageJsonResolverRc;
use thiserror::Error;
use url::Url;
-use crate::fs::DenoPkgJsonFsAdapter;
use crate::fs::DenoResolverFs;
use super::local::normalize_pkg_name_for_node_modules_deno_folder;
@@ -36,32 +37,41 @@ pub enum ByonmResolvePkgFolderFromDenoReqError {
Io(#[from] std::io::Error),
}
-pub struct ByonmNpmResolverCreateOptions<Fs: DenoResolverFs> {
- pub fs: Fs,
+pub struct ByonmNpmResolverCreateOptions<
+ Fs: DenoResolverFs,
+ TEnv: NodeResolverEnv,
+> {
// todo(dsherret): investigate removing this
pub root_node_modules_dir: Option<PathBuf>,
+ pub fs: Fs,
+ pub pkg_json_resolver: PackageJsonResolverRc<TEnv>,
}
#[derive(Debug)]
-pub struct ByonmNpmResolver<Fs: DenoResolverFs> {
+pub struct ByonmNpmResolver<Fs: DenoResolverFs, TEnv: NodeResolverEnv> {
fs: Fs,
+ pkg_json_resolver: PackageJsonResolverRc<TEnv>,
root_node_modules_dir: Option<PathBuf>,
}
-impl<Fs: DenoResolverFs + Clone> Clone for ByonmNpmResolver<Fs> {
+impl<Fs: DenoResolverFs + Clone, TEnv: NodeResolverEnv> Clone
+ for ByonmNpmResolver<Fs, TEnv>
+{
fn clone(&self) -> Self {
Self {
fs: self.fs.clone(),
+ pkg_json_resolver: self.pkg_json_resolver.clone(),
root_node_modules_dir: self.root_node_modules_dir.clone(),
}
}
}
-impl<Fs: DenoResolverFs> ByonmNpmResolver<Fs> {
- pub fn new(options: ByonmNpmResolverCreateOptions<Fs>) -> Self {
+impl<Fs: DenoResolverFs, TEnv: NodeResolverEnv> ByonmNpmResolver<Fs, TEnv> {
+ pub fn new(options: ByonmNpmResolverCreateOptions<Fs, TEnv>) -> Self {
Self {
- fs: options.fs,
root_node_modules_dir: options.root_node_modules_dir,
+ fs: options.fs,
+ pkg_json_resolver: options.pkg_json_resolver,
}
}
@@ -73,7 +83,7 @@ impl<Fs: DenoResolverFs> ByonmNpmResolver<Fs> {
&self,
path: &Path,
) -> Result<Option<Arc<PackageJson>>, PackageJsonLoadError> {
- load_pkg_json(&DenoPkgJsonFsAdapter(&self.fs), path)
+ self.pkg_json_resolver.load_package_json(path)
}
/// Finds the ancestor package.json that contains the specified dependency.
@@ -290,8 +300,10 @@ impl<Fs: DenoResolverFs> ByonmNpmResolver<Fs> {
}
}
-impl<Fs: DenoResolverFs + Send + Sync + std::fmt::Debug> NpmResolver
- for ByonmNpmResolver<Fs>
+impl<
+ Fs: DenoResolverFs + Send + Sync + std::fmt::Debug,
+ TEnv: NodeResolverEnv,
+ > NpmResolver for ByonmNpmResolver<Fs, TEnv>
{
fn resolve_package_folder_from_package(
&self,
@@ -342,7 +354,12 @@ impl<Fs: DenoResolverFs + Send + Sync + std::fmt::Debug> NpmResolver
.into()
})
}
+}
+
+#[derive(Debug)]
+pub struct ByonmInNpmPackageChecker;
+impl InNpmPackageChecker for ByonmInNpmPackageChecker {
fn in_npm_package(&self, specifier: &Url) -> bool {
specifier.scheme() == "file"
&& specifier