swc_node_bundler/loaders/
json.rs

1use std::sync::Arc;
2
3use anyhow::{anyhow, Error};
4use swc_atoms::atom;
5use swc_common::{SourceFile, DUMMY_SP};
6use swc_ecma_ast::*;
7use swc_ecma_parser::{parse_file_as_expr, Syntax};
8
9pub(super) fn load_json_as_module(fm: &Arc<SourceFile>) -> Result<Module, Error> {
10    let expr = parse_file_as_expr(
11        fm,
12        Syntax::default(),
13        EsVersion::Es2020,
14        None,
15        &mut Vec::new(),
16    )
17    .map_err(|err| anyhow!("failed parse json as javascript object: {:#?}", err))?;
18
19    let export = ExprStmt {
20        span: DUMMY_SP,
21        expr: AssignExpr {
22            span: DUMMY_SP,
23            op: op!("="),
24            left: MemberExpr {
25                span: DUMMY_SP,
26                obj: Box::new(Ident::new_no_ctxt(atom!("module"), DUMMY_SP).into()),
27                prop: MemberProp::Ident(IdentName::new(atom!("exports"), DUMMY_SP)),
28            }
29            .into(),
30            right: expr,
31        }
32        .into(),
33    }
34    .into();
35
36    Ok(Module {
37        span: DUMMY_SP,
38        body: vec![export],
39        shebang: None,
40    })
41}