summaryrefslogtreecommitdiff
path: root/cli/emit.rs
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2024-05-20 13:49:12 -0400
committerGitHub <noreply@github.com>2024-05-20 13:49:12 -0400
commitc89f9f9ad1e3d940a460092ee7bc44eb046fa1e1 (patch)
tree9cc36742793d565678d86e0cd3e5811eea0fb955 /cli/emit.rs
parenteb97f110db2a48516dd18646d211af08ade9889f (diff)
perf(cache): compile ts to js in parallel for `deno cache` (#23892)
Closes https://github.com/denoland/deno/issues/23860
Diffstat (limited to 'cli/emit.rs')
-rw-r--r--cli/emit.rs38
1 files changed, 25 insertions, 13 deletions
diff --git a/cli/emit.rs b/cli/emit.rs
index a3352e01f..210644226 100644
--- a/cli/emit.rs
+++ b/cli/emit.rs
@@ -7,6 +7,9 @@ use crate::cache::ParsedSourceCache;
use deno_ast::SourceMapOption;
use deno_ast::TranspileResult;
use deno_core::error::AnyError;
+use deno_core::futures::stream::FuturesUnordered;
+use deno_core::futures::FutureExt;
+use deno_core::futures::StreamExt;
use deno_core::ModuleCodeString;
use deno_core::ModuleSpecifier;
use deno_graph::MediaType;
@@ -48,28 +51,37 @@ impl Emitter {
&self,
graph: &ModuleGraph,
) -> Result<(), AnyError> {
- // todo(dsherret): we could do this concurrently
+ let mut futures = FuturesUnordered::new();
for module in graph.modules() {
- if let Module::Js(module) = module {
- let is_emittable = matches!(
- module.media_type,
- MediaType::TypeScript
- | MediaType::Mts
- | MediaType::Cts
- | MediaType::Jsx
- | MediaType::Tsx
- );
- if is_emittable {
+ let Module::Js(module) = module else {
+ continue;
+ };
+
+ let is_emittable = matches!(
+ module.media_type,
+ MediaType::TypeScript
+ | MediaType::Mts
+ | MediaType::Cts
+ | MediaType::Jsx
+ | MediaType::Tsx
+ );
+ if is_emittable {
+ futures.push(
self
.emit_parsed_source(
&module.specifier,
module.media_type,
&module.source,
)
- .await?;
- }
+ .boxed_local(),
+ );
}
}
+
+ while let Some(result) = futures.next().await {
+ result?; // surface errors
+ }
+
Ok(())
}