swc_plugin_inferno/
lib.rs

1#![deny(clippy::all)]
2#![allow(clippy::arc_with_non_send_sync)]
3
4pub use self::{
5    jsx::*,
6    pure_annotations::pure_annotations,
7    refresh::{options::RefreshOptions, refresh},
8};
9use swc_core::ecma::ast::Pass;
10use swc_core::{
11    common::{comments::Comments, sync::Lrc, Mark, SourceMap},
12    ecma::ast::Program,
13    plugin::{plugin_transform, proxies::TransformPluginProgramMetadata},
14};
15
16mod inferno_flags;
17mod jsx;
18mod pure_annotations;
19mod refresh;
20mod transformations;
21
22///
23/// `top_level_mark` should be [Mark] passed to
24/// [swc_ecma_transforms_base::resolver::resolver_with_mark].
25///
26///
27///
28/// # Note
29///
30/// This pass uses [swc_ecma_utils::HANDLER].
31pub fn inferno<C>(
32    cm: Lrc<SourceMap>,
33    comments: Option<C>,
34    mut options: Options,
35    top_level_mark: Mark,
36    unresolved_mark: Mark,
37) -> impl Pass
38where
39    C: Comments + Clone,
40{
41    let Options { development, .. } = options;
42    let development = development.unwrap_or(false);
43
44    let refresh_options = options.refresh.take();
45
46    (
47        refresh(
48            development,
49            refresh_options,
50            cm.clone(),
51            comments.clone(),
52            top_level_mark,
53        ),
54        jsx(comments.clone(), options, unresolved_mark),
55        pure_annotations(comments),
56    )
57}
58
59#[plugin_transform]
60fn inferno_jsx_plugin(program: Program, metadata: TransformPluginProgramMetadata) -> Program {
61    let top_level_mark = Mark::new();
62
63    // TODO: Where to get source map
64    let cm = Lrc::new(SourceMap::default());
65
66    program.apply(&mut inferno(
67        cm,
68        Some(&metadata.comments),
69        Default::default(),
70        top_level_mark,
71        metadata.unresolved_mark,
72    ))
73}