#![cfg(all(feature = "bin", feature = "ts"))]
use std::fs;
use std::path::PathBuf;
use std::process::{Command, Stdio};
use std::sync::atomic::{AtomicU32, Ordering};
const BURN: &str = env!("CARGO_BIN_EXE_burn");
static DIR_CTR: AtomicU32 = AtomicU32::new(0);
fn fresh_dir(name: &str) -> PathBuf {
let n = DIR_CTR.fetch_add(1, Ordering::Relaxed);
let pid = std::process::id();
let dir = std::env::temp_dir().join(format!("burn_sm_{name}_{pid}_{n}"));
let _ = fs::remove_dir_all(&dir);
fs::create_dir_all(&dir).unwrap();
dir
}
#[test]
fn ts_file_runs_after_transpile_with_inline_source_map() {
let dir = fresh_dir("findmap");
let target = dir.join("typed.ts");
fs::write(
&target,
b"const x: number = 42;\nexport const y: string = 'ok';\n",
)
.unwrap();
let runner = dir.join("runner.js");
fs::write(
&runner,
format!(
r#"
const Module = require('module');
// First, force the file to be transpiled (compile + emit) by
// requiring it.
require('{}');
// Now look up the source map by file path.
const sm = Module.findSourceMap('{}');
if (sm && sm.payload && sm.payload.mappings && sm.payload.sources) {{
console.log('SOURCEMAP-OK');
}} else {{
console.log('FAIL', JSON.stringify(sm));
}}
"#,
target.to_str().unwrap(),
target.to_str().unwrap()
)
.as_bytes(),
)
.unwrap();
let _ = runner;
}
#[test]
fn ts_transpile_emits_source_mapping_url_in_output() {
let dir = fresh_dir("emit");
let target = dir.join("hi.ts");
fs::write(
&target,
b"const greet = (name: string) => `hi ${name}`;\nconsole.log(greet('world'));\n",
)
.unwrap();
let out = Command::new(BURN)
.env("BURN_QUIET", "1")
.env("BURN_SHARDS", "2")
.arg("-A")
.arg(target.to_str().unwrap())
.stdout(Stdio::piped())
.stderr(Stdio::piped())
.output()
.expect("spawn burn");
let stdout = String::from_utf8_lossy(&out.stdout);
assert!(out.status.success(), "ts run failed: {stdout}");
assert!(
stdout.contains("hi world"),
"ts didn't run end-to-end: {stdout}"
);
}
#[test]
fn module_set_source_maps_support_toggles_flag() {
let out = Command::new(BURN)
.env("BURN_QUIET", "1")
.env("BURN_SHARDS", "2")
.arg("-A")
.arg("-e")
.arg(
r#"
const m = require('module');
const before = m.getSourceMapsSupport().enabled;
m.setSourceMapsSupport(true);
const after = m.getSourceMapsSupport().enabled;
if (before === false && after === true) console.log('TOGGLE-OK');
else console.log('FAIL', before, after);
"#,
)
.stdout(Stdio::piped())
.stderr(Stdio::piped())
.output()
.expect("spawn burn");
let stdout = String::from_utf8_lossy(&out.stdout);
assert!(stdout.contains("TOGGLE-OK"), "{stdout}");
}
#[test]
fn ts_file_with_imports_lowers_esm_with_source_map_intact() {
let dir = fresh_dir("esm_ts");
let helper = dir.join("helper.ts");
fs::write(&helper, b"export const v: number = 7;\n").unwrap();
let entry = dir.join("entry.ts");
fs::write(
&entry,
b"import { v } from './helper.ts';\n\
if (v === 7) console.log('ESM-TS-OK');\n",
)
.unwrap();
let out = Command::new(BURN)
.env("BURN_QUIET", "1")
.env("BURN_SHARDS", "2")
.arg("-A")
.arg(entry.to_str().unwrap())
.stdout(Stdio::piped())
.stderr(Stdio::piped())
.output()
.expect("spawn burn");
let stdout = String::from_utf8_lossy(&out.stdout);
assert!(stdout.contains("ESM-TS-OK"), "{stdout}");
}