tarq_core/
lib.rs

1use serde::Serialize;
2use swc_ecma_ast::ModuleItem;
3use swc_ecma_ast::{Decl, Stmt};
4use wasm_bindgen::prelude::*;
5
6use swc_common::sync::Lrc;
7use swc_common::{FileName, SourceMap};
8use swc_ecma_parser::{Parser, StringInput, Syntax, lexer::Lexer};
9
10#[derive(Serialize, Debug)]
11struct Output {
12    class_number: usize,
13}
14
15#[wasm_bindgen]
16pub fn analyze(file_name: &str, source_code_text: &str) -> String {
17    let cm: Lrc<SourceMap> = Default::default();
18    let fm = cm.new_source_file(
19        FileName::Custom(file_name.into()).into(),
20        source_code_text.to_string(),
21    );
22    let lexer = Lexer::new(
23        Syntax::Es(Default::default()),
24        Default::default(),
25        StringInput::from(&*fm),
26        None,
27    );
28    let mut parser = Parser::new_from(lexer);
29    let module = parser.parse_module().expect("failed to parser module");
30    let class_count = module
31        .body
32        .iter()
33        .filter(|item| matches!(item, ModuleItem::Stmt(Stmt::Decl(Decl::Class(_)))))
34        .count();
35    let output = Output {
36        class_number: class_count,
37    };
38    serde_json::to_string_pretty(&output).unwrap()
39}