summaryrefslogtreecommitdiff
path: root/cli/resolver.rs
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2024-10-14 20:48:39 -0400
committerGitHub <noreply@github.com>2024-10-14 20:48:39 -0400
commit1a0cb5b5312941521ab021cfe9eaed498f35900b (patch)
tree2e5c58e25e8506b993ac678e83ba0c2feac37d75 /cli/resolver.rs
parentee7d4501435f0ebd655c8b50bd6e41ca19e71abc (diff)
feat(unstable): `--unstable-detect-cjs` for respecting explicit `"type": "commonjs"` (#26149)
When using the `--unstable-detect-cjs` flag or adding `"unstable": ["detect-cjs"]` to a deno.json, it will make a JS file CJS if the closest package.json contains `"type": "commonjs"` and the file is not an ESM module (no TLA, no `import.meta`, no `import`/`export`).
Diffstat (limited to 'cli/resolver.rs')
-rw-r--r--cli/resolver.rs50
1 files changed, 21 insertions, 29 deletions
diff --git a/cli/resolver.rs b/cli/resolver.rs
index 7804261b8..84c671268 100644
--- a/cli/resolver.rs
+++ b/cli/resolver.rs
@@ -43,7 +43,6 @@ use node_resolver::NodeModuleKind;
use node_resolver::NodeResolution;
use node_resolver::NodeResolutionMode;
use node_resolver::PackageJson;
-use std::borrow::Cow;
use std::path::Path;
use std::path::PathBuf;
use std::sync::Arc;
@@ -53,7 +52,9 @@ use crate::args::DENO_DISABLE_PEDANTIC_NODE_WARNINGS;
use crate::node::CliNodeCodeTranslator;
use crate::npm::CliNpmResolver;
use crate::npm::InnerCliNpmResolverRef;
+use crate::util::path::specifier_has_extension;
use crate::util::sync::AtomicFlag;
+use crate::util::text_encoding::from_utf8_lossy_owned;
pub struct ModuleCodeStringSource {
pub code: ModuleSourceCode,
@@ -215,7 +216,7 @@ impl CliNodeResolver {
referrer: &ModuleSpecifier,
mode: NodeResolutionMode,
) -> Result<NodeResolution, NodeResolveError> {
- let referrer_kind = if self.cjs_resolutions.contains(referrer) {
+ let referrer_kind = if self.cjs_resolutions.is_known_cjs(referrer) {
NodeModuleKind::Cjs
} else {
NodeModuleKind::Esm
@@ -310,9 +311,7 @@ impl CliNodeResolver {
if self.in_npm_package(&specifier) {
let resolution =
self.node_resolver.url_to_node_resolution(specifier)?;
- if let NodeResolution::CommonJs(specifier) = &resolution {
- self.cjs_resolutions.insert(specifier.clone());
- }
+ let resolution = self.handle_node_resolution(resolution);
return Ok(Some(resolution.into_url()));
}
}
@@ -333,12 +332,17 @@ impl CliNodeResolver {
) -> NodeResolution {
if let NodeResolution::CommonJs(specifier) = &resolution {
// remember that this was a common js resolution
- self.cjs_resolutions.insert(specifier.clone());
+ self.mark_cjs_resolution(specifier.clone());
}
resolution
}
+
+ pub fn mark_cjs_resolution(&self, specifier: ModuleSpecifier) {
+ self.cjs_resolutions.insert(specifier);
+ }
}
+// todo(dsherret): move to module_loader.rs
#[derive(Clone)]
pub struct NpmModuleLoader {
cjs_resolutions: Arc<CjsResolutionStore>,
@@ -362,18 +366,9 @@ impl NpmModuleLoader {
}
}
- pub async fn load_if_in_npm_package(
- &self,
- specifier: &ModuleSpecifier,
- maybe_referrer: Option<&ModuleSpecifier>,
- ) -> Option<Result<ModuleCodeStringSource, AnyError>> {
- if self.node_resolver.in_npm_package(specifier)
- || (specifier.scheme() == "file" && specifier.path().ends_with(".cjs"))
- {
- Some(self.load(specifier, maybe_referrer).await)
- } else {
- None
- }
+ pub fn if_in_npm_package(&self, specifier: &ModuleSpecifier) -> bool {
+ self.node_resolver.in_npm_package(specifier)
+ || self.cjs_resolutions.is_known_cjs(specifier)
}
pub async fn load(
@@ -418,16 +413,9 @@ impl NpmModuleLoader {
}
})?;
- let code = if self.cjs_resolutions.contains(specifier)
- || (specifier.scheme() == "file" && specifier.path().ends_with(".cjs"))
- {
+ let code = if self.cjs_resolutions.is_known_cjs(specifier) {
// translate cjs to esm if it's cjs and inject node globals
- let code = match String::from_utf8_lossy(&code) {
- Cow::Owned(code) => code,
- // SAFETY: `String::from_utf8_lossy` guarantees that the result is valid
- // UTF-8 if `Cow::Borrowed` is returned.
- Cow::Borrowed(_) => unsafe { String::from_utf8_unchecked(code) },
- };
+ let code = from_utf8_lossy_owned(code);
ModuleSourceCode::String(
self
.node_code_translator
@@ -452,8 +440,12 @@ impl NpmModuleLoader {
pub struct CjsResolutionStore(DashSet<ModuleSpecifier>);
impl CjsResolutionStore {
- pub fn contains(&self, specifier: &ModuleSpecifier) -> bool {
- self.0.contains(specifier)
+ pub fn is_known_cjs(&self, specifier: &ModuleSpecifier) -> bool {
+ if specifier.scheme() != "file" {
+ return false;
+ }
+
+ specifier_has_extension(specifier, "cjs") || self.0.contains(specifier)
}
pub fn insert(&self, specifier: ModuleSpecifier) {