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