summaryrefslogtreecommitdiff
path: root/cli/module_loader.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/module_loader.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/module_loader.rs')
-rw-r--r--cli/module_loader.rs89
1 files changed, 40 insertions, 49 deletions
diff --git a/cli/module_loader.rs b/cli/module_loader.rs
index 293f41dda..37d42f78e 100644
--- a/cli/module_loader.rs
+++ b/cli/module_loader.rs
@@ -331,15 +331,23 @@ impl<TGraphContainer: ModuleGraphContainer>
maybe_referrer: Option<&ModuleSpecifier>,
requested_module_type: RequestedModuleType,
) -> Result<ModuleSource, AnyError> {
- let code_source = if let Some(result) = self
- .shared
- .npm_module_loader
- .load_if_in_npm_package(specifier, maybe_referrer)
- .await
- {
- result?
- } else {
- self.load_prepared_module(specifier, maybe_referrer).await?
+ let code_source = match self.load_prepared_module(specifier).await? {
+ Some(code_source) => code_source,
+ None => {
+ if self.shared.npm_module_loader.if_in_npm_package(specifier) {
+ self
+ .shared
+ .npm_module_loader
+ .load(specifier, maybe_referrer)
+ .await?
+ } else {
+ let mut msg = format!("Loading unprepared module: {specifier}");
+ if let Some(referrer) = maybe_referrer {
+ msg = format!("{}, imported from: {}", msg, referrer.as_str());
+ }
+ return Err(anyhow!(msg));
+ }
+ }
};
let code = if self.shared.is_inspecting {
// we need the code with the source map in order for
@@ -514,17 +522,12 @@ impl<TGraphContainer: ModuleGraphContainer>
async fn load_prepared_module(
&self,
specifier: &ModuleSpecifier,
- maybe_referrer: Option<&ModuleSpecifier>,
- ) -> Result<ModuleCodeStringSource, AnyError> {
+ ) -> Result<Option<ModuleCodeStringSource>, AnyError> {
// Note: keep this in sync with the sync version below
let graph = self.graph_container.graph();
- match self.load_prepared_module_or_defer_emit(
- &graph,
- specifier,
- maybe_referrer,
- ) {
- Ok(CodeOrDeferredEmit::Code(code_source)) => Ok(code_source),
- Ok(CodeOrDeferredEmit::DeferredEmit {
+ match self.load_prepared_module_or_defer_emit(&graph, specifier)? {
+ Some(CodeOrDeferredEmit::Code(code_source)) => Ok(Some(code_source)),
+ Some(CodeOrDeferredEmit::DeferredEmit {
specifier,
media_type,
source,
@@ -537,30 +540,25 @@ impl<TGraphContainer: ModuleGraphContainer>
// at this point, we no longer need the parsed source in memory, so free it
self.parsed_source_cache.free(specifier);
- Ok(ModuleCodeStringSource {
+ Ok(Some(ModuleCodeStringSource {
code: ModuleSourceCode::Bytes(transpile_result),
found_url: specifier.clone(),
media_type,
- })
+ }))
}
- Err(err) => Err(err),
+ None => Ok(None),
}
}
fn load_prepared_module_sync(
&self,
specifier: &ModuleSpecifier,
- maybe_referrer: Option<&ModuleSpecifier>,
- ) -> Result<ModuleCodeStringSource, AnyError> {
+ ) -> Result<Option<ModuleCodeStringSource>, AnyError> {
// Note: keep this in sync with the async version above
let graph = self.graph_container.graph();
- match self.load_prepared_module_or_defer_emit(
- &graph,
- specifier,
- maybe_referrer,
- ) {
- Ok(CodeOrDeferredEmit::Code(code_source)) => Ok(code_source),
- Ok(CodeOrDeferredEmit::DeferredEmit {
+ match self.load_prepared_module_or_defer_emit(&graph, specifier)? {
+ Some(CodeOrDeferredEmit::Code(code_source)) => Ok(Some(code_source)),
+ Some(CodeOrDeferredEmit::DeferredEmit {
specifier,
media_type,
source,
@@ -572,13 +570,13 @@ impl<TGraphContainer: ModuleGraphContainer>
// at this point, we no longer need the parsed source in memory, so free it
self.parsed_source_cache.free(specifier);
- Ok(ModuleCodeStringSource {
+ Ok(Some(ModuleCodeStringSource {
code: ModuleSourceCode::Bytes(transpile_result),
found_url: specifier.clone(),
media_type,
- })
+ }))
}
- Err(err) => Err(err),
+ None => Ok(None),
}
}
@@ -586,8 +584,7 @@ impl<TGraphContainer: ModuleGraphContainer>
&self,
graph: &'graph ModuleGraph,
specifier: &ModuleSpecifier,
- maybe_referrer: Option<&ModuleSpecifier>,
- ) -> Result<CodeOrDeferredEmit<'graph>, AnyError> {
+ ) -> Result<Option<CodeOrDeferredEmit<'graph>>, AnyError> {
if specifier.scheme() == "node" {
// Node built-in modules should be handled internally.
unreachable!("Deno bug. {} was misconfigured internally.", specifier);
@@ -599,11 +596,11 @@ impl<TGraphContainer: ModuleGraphContainer>
media_type,
specifier,
..
- })) => Ok(CodeOrDeferredEmit::Code(ModuleCodeStringSource {
+ })) => Ok(Some(CodeOrDeferredEmit::Code(ModuleCodeStringSource {
code: ModuleSourceCode::String(source.clone().into()),
found_url: specifier.clone(),
media_type: *media_type,
- })),
+ }))),
Some(deno_graph::Module::Js(JsModule {
source,
media_type,
@@ -624,11 +621,11 @@ impl<TGraphContainer: ModuleGraphContainer>
| MediaType::Cts
| MediaType::Jsx
| MediaType::Tsx => {
- return Ok(CodeOrDeferredEmit::DeferredEmit {
+ return Ok(Some(CodeOrDeferredEmit::DeferredEmit {
specifier,
media_type: *media_type,
source,
- });
+ }));
}
MediaType::TsBuildInfo | MediaType::Wasm | MediaType::SourceMap => {
panic!("Unexpected media type {media_type} for {specifier}")
@@ -638,24 +635,18 @@ impl<TGraphContainer: ModuleGraphContainer>
// at this point, we no longer need the parsed source in memory, so free it
self.parsed_source_cache.free(specifier);
- Ok(CodeOrDeferredEmit::Code(ModuleCodeStringSource {
+ Ok(Some(CodeOrDeferredEmit::Code(ModuleCodeStringSource {
code: ModuleSourceCode::String(code),
found_url: specifier.clone(),
media_type: *media_type,
- }))
+ })))
}
Some(
deno_graph::Module::External(_)
| deno_graph::Module::Node(_)
| deno_graph::Module::Npm(_),
)
- | None => {
- let mut msg = format!("Loading unprepared module: {specifier}");
- if let Some(referrer) = maybe_referrer {
- msg = format!("{}, imported from: {}", msg, referrer.as_str());
- }
- Err(anyhow!(msg))
- }
+ | None => Ok(None),
}
}
}
@@ -828,7 +819,7 @@ impl<TGraphContainer: ModuleGraphContainer> ModuleLoader
"wasm" | "file" | "http" | "https" | "data" | "blob" => (),
_ => return None,
}
- let source = self.0.load_prepared_module_sync(&specifier, None).ok()?;
+ let source = self.0.load_prepared_module_sync(&specifier).ok()??;
source_map_from_code(source.code.as_bytes())
}