next_custom_transforms/transforms/
amp_attributes.rs1use 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}