tyrol/
lib.rs

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}