1use std::path::{Path, PathBuf};
2
3use color_eyre::eyre::eyre;
4use swc_common::{
5 SourceMap,
6 errors::{ColorConfig, Handler},
7 sync::Lrc,
8};
9use swc_ecma_ast::EsVersion;
10use swc_ecma_parser::{Parser, StringInput, Syntax, TsSyntax, lexer::Lexer};
11
12pub struct Bundler {
13 root_dir: PathBuf,
14 cm: Lrc<SourceMap>,
15 handler: Handler,
16}
17
18impl Bundler {
19 pub fn new(root_dir: PathBuf) -> Self {
20 let cm = Lrc::<SourceMap>::default();
21 Bundler {
22 root_dir,
23 cm: cm.clone(),
24 handler: Handler::with_tty_emitter(ColorConfig::Auto, true, false, Some(cm)),
25 }
26 }
27
28 pub fn bundle(&self, entrypoint: impl AsRef<Path>) -> color_eyre::Result<()> {
29 let mut path = self.root_dir.clone();
30 path.push(entrypoint);
31
32 let fm = self.cm.load_file(&path)?;
33
34 let lexer = Lexer::new(
35 Syntax::Typescript(TsSyntax::default()),
36 EsVersion::latest(),
37 StringInput::from(&*fm),
38 None,
39 );
40
41 let mut parser = Parser::new_from(lexer);
42
43 for e in parser.take_errors() {
44 e.into_diagnostic(&self.handler).emit();
45 }
46
47 let module = parser.parse_module().map_err(|e| {
48 e.into_diagnostic(&self.handler).emit();
49 eyre!("couldn't parse {}", fm.name)
50 })?;
51
52 dbg!(module);
53
54 Ok(())
55 }
56}