diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2024-05-20 13:49:12 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-20 13:49:12 -0400 |
commit | c89f9f9ad1e3d940a460092ee7bc44eb046fa1e1 (patch) | |
tree | 9cc36742793d565678d86e0cd3e5811eea0fb955 /cli/emit.rs | |
parent | eb97f110db2a48516dd18646d211af08ade9889f (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.rs | 38 |
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(()) } |