next_custom_transforms/transforms/
amp_attributes.rs

1use swc_core::ecma::{
2    ast::{
3        Ident, IdentName, JSXAttr, JSXAttrName, JSXAttrOrSpread, JSXElementName, JSXOpeningElement,
4        Pass,
5    },
6    atoms::Atom,
7    visit::{fold_pass, Fold},
8};
9
10pub fn amp_attributes() -> impl Pass {
11    fold_pass(AmpAttributePatcher::default())
12}
13
14#[derive(Debug, Default)]
15struct AmpAttributePatcher {}
16
17impl Fold for AmpAttributePatcher {
18    fn fold_jsx_opening_element(&mut self, node: JSXOpeningElement) -> JSXOpeningElement {
19        let JSXOpeningElement {
20            name,
21            mut attrs,
22            span,
23            self_closing,
24            type_args,
25        } = node;
26        let n = name.clone();
27
28        if let JSXElementName::Ident(Ident { sym, .. }) = name {
29            if sym.starts_with("amp-") {
30                for i in &mut attrs {
31                    if let JSXAttrOrSpread::JSXAttr(JSXAttr {
32                        name: JSXAttrName::Ident(IdentName { sym, span: s }),
33                        span,
34                        value,
35                    }) = &i
36                    {
37                        if sym as &str == "className" {
38                            *i = JSXAttrOrSpread::JSXAttr(JSXAttr {
39                                name: JSXAttrName::Ident(IdentName {
40                                    sym: Atom::from("class"),
41                                    span: *s,
42                                }),
43                                span: *span,
44                                value: value.clone(),
45                            })
46                        }
47                    }
48                }
49            }
50        }
51
52        JSXOpeningElement {
53            name: n,
54            attrs,
55            span,
56            self_closing,
57            type_args,
58        }
59    }
60}