1use std::{
2 process::{Command, Stdio},
3 sync::Arc,
4};
5
6use anyhow::{bail, Context, Result};
7use swc_common::{FileName, SourceMap};
8use swc_timer::timer;
9
10use crate::util::{parse_js, wrap_task, ModuleRecord};
11
12pub fn bundle(cm: Arc<SourceMap>, entry_url: &str) -> Result<ModuleRecord> {
13 wrap_task(|| {
14 let _timer = timer!("bundle");
15
16 let mut cmd = Command::new("deno");
17 cmd.arg("bundle");
18 cmd.arg(entry_url);
19
20 cmd.stderr(Stdio::inherit());
21
22 let output = cmd.output().context("failed to invoke `deno bundle`")?;
23
24 if !output.status.success() {
25 bail!("`deno bundle` failed with status code {}", output.status);
26 }
27
28 let code =
29 String::from_utf8(output.stdout).context("deno bundle emitted non-utf8 output")?;
30
31 let fm = cm.new_source_file(FileName::Anon.into(), code);
32 parse_js(fm).context("failed to parse js filed emitted by `deno bundle`")
33 })
34 .with_context(|| format!("failed to bundle `{entry_url}`"))
35}