Skip to main content

oxc_transformer/plugins/
mod.rs

1mod options;
2mod styled_components;
3mod tagged_template_transform;
4
5pub use options::PluginsOptions;
6use oxc_ast::ast::*;
7use oxc_traverse::Traverse;
8pub use styled_components::StyledComponentsOptions;
9
10use crate::{
11    context::TraverseCtx,
12    plugins::{
13        styled_components::StyledComponents, tagged_template_transform::TaggedTemplateTransform,
14    },
15    state::TransformState,
16};
17
18pub struct Plugins<'a> {
19    styled_components: Option<StyledComponents<'a>>,
20    tagged_template_escape: Option<TaggedTemplateTransform>,
21}
22
23impl Plugins<'_> {
24    pub fn new(options: PluginsOptions) -> Self {
25        Self {
26            styled_components: options.styled_components.map(StyledComponents::new),
27            tagged_template_escape: if options.tagged_template_transform {
28                Some(TaggedTemplateTransform::new())
29            } else {
30                None
31            },
32        }
33    }
34}
35
36impl<'a> Traverse<'a, TransformState<'a>> for Plugins<'a> {
37    fn enter_program(&mut self, node: &mut Program<'a>, ctx: &mut TraverseCtx<'a>) {
38        if let Some(styled_components) = &mut self.styled_components {
39            styled_components.enter_program(node, ctx);
40        }
41    }
42
43    fn enter_variable_declarator(
44        &mut self,
45        node: &mut VariableDeclarator<'a>,
46        ctx: &mut TraverseCtx<'a>,
47    ) {
48        if let Some(styled_components) = &mut self.styled_components {
49            styled_components.enter_variable_declarator(node, ctx);
50        }
51    }
52
53    fn enter_expression(
54        &mut self,
55        node: &mut Expression<'a>,
56        ctx: &mut oxc_traverse::TraverseCtx<'a, TransformState<'a>>,
57    ) {
58        if let Some(styled_components) = &mut self.styled_components {
59            styled_components.enter_expression(node, ctx);
60        }
61        if let Some(tagged_template_escape) = &mut self.tagged_template_escape {
62            tagged_template_escape.enter_expression(node, ctx);
63        }
64    }
65
66    fn enter_call_expression(&mut self, node: &mut CallExpression<'a>, ctx: &mut TraverseCtx<'a>) {
67        if let Some(styled_components) = &mut self.styled_components {
68            styled_components.enter_call_expression(node, ctx);
69        }
70    }
71}