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}