Skip to content

Commit de2aa2b

Browse files
committed
Updated functionality to match latest babel plugin & updated to SWC Core
v10
1 parent 3be063d commit de2aa2b

File tree

12 files changed

+489
-331
lines changed

12 files changed

+489
-331
lines changed

Cargo.lock

Lines changed: 131 additions & 112 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,23 +34,22 @@ rayon = { version = "1", optional = true }
3434
serde = { version = "1", features = ["derive"], optional = true }
3535
sha-1 = "=0.10.1"
3636

37-
swc_core = { version = "9", features = [
37+
swc_core = { version = "10.7.0", features = [
3838
"swc_atoms",
3939
"swc_common",
4040
"swc_ecma_ast",
41-
"swc_ecma_utils",
4241
"ecma_plugin_transform",
4342
"ecma_utils",
4443
"ecma_visit",
4544
"ecma_ast",
4645
"common",
4746
] }
48-
swc_ecma_parser = { version = "6" }
47+
swc_ecma_parser = { version = "6.0.2" }
4948
swc_config = { version = "1" }
5049

5150
[dev-dependencies]
52-
swc_ecma_codegen = { version = "5" }
53-
swc_ecma_transforms_compat = { version = "7" }
54-
swc_ecma_transforms_testing = { version = "6" }
55-
swc_ecma_transforms = { version = "8" }
51+
swc_ecma_codegen = { version = "5.1.0" }
52+
swc_ecma_transforms_compat = { version = "8" }
53+
swc_ecma_transforms_testing = { version = "7" }
54+
swc_ecma_transforms = { version = "9" }
5655
testing = { version = "5" }

src/jsx/mod.rs

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@ use swc_core::ecma::utils::{drop_span, prepend_stmt, quote_ident, ExprFactory, S
1313
use swc_core::ecma::visit::{noop_visit_mut_type, visit_mut_pass, VisitMut, VisitMutWith};
1414
use swc_core::plugin::errors::HANDLER;
1515
use swc_ecma_parser::{parse_file_as_expr, Syntax};
16-
1716
use crate::VNodeType::Component;
1817
use crate::{
1918
inferno_flags::{ChildFlags, VNodeFlags},
2019
refresh::options::{deserialize_refresh, RefreshOptions},
2120
};
21+
use crate::transformations::transform_attribute::transform_attribute;
22+
use crate::transformations::lowercase_attrs::requires_lowercasing;
23+
use crate::transformations::parse_vnode_flag::parse_vnode_flag;
2224

2325
#[cfg(test)]
2426
mod tests;
@@ -408,7 +410,7 @@ where
408410
}
409411
} else {
410412
vnode_kind = VNodeType::Element;
411-
mut_flags = crate::vnode_types::parse_vnode_flag(&ident.sym);
413+
mut_flags = parse_vnode_flag(&ident.sym);
412414
name_expr = Expr::Lit(Lit::Str(Str {
413415
span: name_span,
414416
raw: None,
@@ -494,26 +496,6 @@ where
494496
class_name_param = jsx_attr_value_to_expr(v)
495497
}
496498

497-
continue;
498-
}
499-
} else if i.sym == "htmlFor" {
500-
if vnode_kind == VNodeType::Element {
501-
props_obj.props.push(PropOrSpread::Prop(Box::new(
502-
Prop::KeyValue(KeyValueProp {
503-
key: PropName::Str(Str {
504-
span: i.span,
505-
raw: None,
506-
value: "for".into(),
507-
}),
508-
value: match attr.value {
509-
Some(v) => jsx_attr_value_to_expr(v)
510-
.expect("empty expression?"),
511-
None => Box::new(Expr::Lit(Lit::Null(Null {
512-
span: DUMMY_SP,
513-
}))),
514-
},
515-
}),
516-
)));
517499
continue;
518500
}
519501
} else if i.sym == "onDoubleClick" {
@@ -676,9 +658,14 @@ where
676658
None => true.into(),
677659
};
678660

679-
let converted_sym = crate::vnode_types::convert_svg_attrs(&i.sym);
661+
let converted_prop_name = if requires_lowercasing(&i.sym) {
662+
PropName::Ident(IdentName {
663+
span: i.span,
664+
sym: i.sym.to_lowercase().into()
665+
})
666+
} else {
667+
let converted_sym = transform_attribute(&i.sym);
680668

681-
let converted_prop_name =
682669
if converted_sym.contains('-') || converted_sym.contains(':') {
683670
PropName::Str(Str {
684671
span: i.span,
@@ -690,7 +677,8 @@ where
690677
span: i.span,
691678
sym: converted_sym.into()
692679
})
693-
};
680+
}
681+
};
694682

695683
props_obj
696684
.props

src/jsx/tests.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,19 @@ test!(
226226
"#
227227
);
228228

229+
test!(
230+
module,
231+
Syntax::Es(EsSyntax {
232+
jsx: true,
233+
..Default::default()
234+
}),
235+
|t| tr(t, Default::default(), Mark::fresh(Mark::root())),
236+
should_lowercase_certain_props,
237+
r#"
238+
<button accessKey="s"/>
239+
"#
240+
);
241+
229242
test!(
230243
module,
231244
Syntax::Es(EsSyntax {

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ mod inferno_flags;
1717
mod jsx;
1818
mod pure_annotations;
1919
mod refresh;
20-
mod vnode_types;
20+
mod transformations;
2121

2222
///
2323
/// `top_level_mark` should be [Mark] passed to
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
pub fn requires_lowercasing(sym: &str) -> bool {
2+
matches!(
3+
sym,
4+
"accessKey"
5+
| "attributeName"
6+
| "attributeType"
7+
| "autoComplete"
8+
| "autoCorrect"
9+
| "autoPictureInPicture"
10+
| "autoPlay"
11+
| "autoCapitalize"
12+
| "autoFocus"
13+
| "autosave"
14+
| "baseFrequency"
15+
| "baseProfile"
16+
| "calcMode"
17+
| "cellPadding"
18+
| "cellSpacing"
19+
| "charSet"
20+
| "classID"
21+
| "clipPathUnits"
22+
| "codeBase"
23+
| "colSpan"
24+
| "contentScriptType"
25+
| "contentStyleType"
26+
| "contextMenu"
27+
| "controlsList"
28+
| "crossOrigin"
29+
| "dateTime"
30+
| "diffuseConstant"
31+
| "disablePictureInPicture"
32+
| "disableRemotePlayback"
33+
| "edgeMode"
34+
| "encType"
35+
| "enterKeyHint"
36+
| "exportParts"
37+
| "fetchPriority"
38+
| "filterRes"
39+
| "filterUnits"
40+
| "formAction"
41+
| "formEncType"
42+
| "formMethod"
43+
| "formNoValidate"
44+
| "formTarget"
45+
| "frameBorder"
46+
| "glyphRef"
47+
| "gradientTransform"
48+
| "gradientUnits"
49+
| "hrefLang"
50+
| "imageSizes"
51+
| "imageSrcSet"
52+
| "inputMode"
53+
| "isMap"
54+
| "itemID"
55+
| "itemProp"
56+
| "itemRef"
57+
| "itemScope"
58+
| "itemType"
59+
| "kernelMatrix"
60+
| "kernelUnitLength"
61+
| "keyParams"
62+
| "keyPoints"
63+
| "keySplines"
64+
| "keyTimes"
65+
| "keyType"
66+
| "lengthAdjust"
67+
| "limitingConeAngle"
68+
| "marginHeight"
69+
| "marginWidth"
70+
| "markerUnits"
71+
| "markerWidth"
72+
| "maskContentUnits"
73+
| "maskUnits"
74+
| "maxLength"
75+
| "mediaGroup"
76+
| "minLength"
77+
| "noModule"
78+
| "noValidate"
79+
| "numOctaves"
80+
| "pathLength"
81+
| "patternContentUnits"
82+
| "patternTransform"
83+
| "patternUnits"
84+
| "pointsAtX"
85+
| "pointsAtY"
86+
| "pointsAtZ"
87+
| "popoverTarget"
88+
| "popoverTargetAction"
89+
| "preserveAlpha"
90+
| "preserveAspectRatio"
91+
| "primitiveUnits"
92+
| "radioGroup"
93+
| "readOnly"
94+
| "refX"
95+
| "refY"
96+
| "referrerPolicy"
97+
| "repeatCount"
98+
| "repeatDur"
99+
| "requiredExtensions"
100+
| "requiredFeatures"
101+
| "rowSpan"
102+
| "specularConstant"
103+
| "specularExponent"
104+
| "spellCheck"
105+
| "spreadMethod"
106+
| "srcDoc"
107+
| "srcLang"
108+
| "srcSet"
109+
| "startOffset"
110+
| "stdDeviation"
111+
| "stitchTiles"
112+
| "surfaceScale"
113+
| "systemLanguage"
114+
| "tabIndex"
115+
| "tableValues"
116+
| "targetX"
117+
| "targetY"
118+
| "textAnchor"
119+
| "textLength"
120+
| "transformOrigin"
121+
| "useMap"
122+
| "viewBox"
123+
| "viewTarget"
124+
| "xChannelSelector"
125+
| "yChannelSelector"
126+
)
127+
}

src/transformations/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
pub mod parse_vnode_flag;
2+
pub mod lowercase_attrs;
3+
pub mod transform_attribute;
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
use crate::inferno_flags::VNodeFlags;
2+
3+
pub fn parse_vnode_flag(tag: &str) -> u16 {
4+
(match tag {
5+
"input" => VNodeFlags::InputElement,
6+
"textarea" => VNodeFlags::TextareaElement,
7+
"select" => VNodeFlags::SelectElement,
8+
// SVG ELEMENTS
9+
"altGlyph" => VNodeFlags::SvgElement,
10+
"altGlyphDef" => VNodeFlags::SvgElement,
11+
"altGlyphItem" => VNodeFlags::SvgElement,
12+
"animate" => VNodeFlags::SvgElement,
13+
"animateColor" => VNodeFlags::SvgElement,
14+
"animateMotion" => VNodeFlags::SvgElement,
15+
"animateTransform" => VNodeFlags::SvgElement,
16+
"circle" => VNodeFlags::SvgElement,
17+
"clipPath" => VNodeFlags::SvgElement,
18+
"color-profile" => VNodeFlags::SvgElement,
19+
"cursor" => VNodeFlags::SvgElement,
20+
"defs" => VNodeFlags::SvgElement,
21+
"desc" => VNodeFlags::SvgElement,
22+
"discard" => VNodeFlags::SvgElement,
23+
"ellipse" => VNodeFlags::SvgElement,
24+
"feBlend" => VNodeFlags::SvgElement,
25+
"feColorMatrix" => VNodeFlags::SvgElement,
26+
"feComponentTransfer" => VNodeFlags::SvgElement,
27+
"feComposite" => VNodeFlags::SvgElement,
28+
"feConvolveMatrix" => VNodeFlags::SvgElement,
29+
"feDiffuseLighting" => VNodeFlags::SvgElement,
30+
"feDisplacementMap" => VNodeFlags::SvgElement,
31+
"feDistantLight" => VNodeFlags::SvgElement,
32+
"feDropShadow" => VNodeFlags::SvgElement,
33+
"feFlood" => VNodeFlags::SvgElement,
34+
"feFuncA" => VNodeFlags::SvgElement,
35+
"feFuncB" => VNodeFlags::SvgElement,
36+
"feFuncG" => VNodeFlags::SvgElement,
37+
"feFuncR" => VNodeFlags::SvgElement,
38+
"feGaussianBlur" => VNodeFlags::SvgElement,
39+
"feImage" => VNodeFlags::SvgElement,
40+
"feMerge" => VNodeFlags::SvgElement,
41+
"feMergeNode" => VNodeFlags::SvgElement,
42+
"feMorphology" => VNodeFlags::SvgElement,
43+
"feOffset" => VNodeFlags::SvgElement,
44+
"fePointLight" => VNodeFlags::SvgElement,
45+
"feSpecularLighting" => VNodeFlags::SvgElement,
46+
"feSpotLight" => VNodeFlags::SvgElement,
47+
"feTile" => VNodeFlags::SvgElement,
48+
"feTurbulence" => VNodeFlags::SvgElement,
49+
"filter" => VNodeFlags::SvgElement,
50+
"font-face" => VNodeFlags::SvgElement,
51+
"font-face-format" => VNodeFlags::SvgElement,
52+
"font-face-name" => VNodeFlags::SvgElement,
53+
"font-face-src" => VNodeFlags::SvgElement,
54+
"font-face-uri" => VNodeFlags::SvgElement,
55+
"foreignObject" => VNodeFlags::SvgElement,
56+
"g" => VNodeFlags::SvgElement,
57+
"glyph" => VNodeFlags::SvgElement,
58+
"glyphRef" => VNodeFlags::SvgElement,
59+
"hkern" => VNodeFlags::SvgElement,
60+
"line" => VNodeFlags::SvgElement,
61+
"linearGradient" => VNodeFlags::SvgElement,
62+
"marker" => VNodeFlags::SvgElement,
63+
"mask" => VNodeFlags::SvgElement,
64+
"metadata" => VNodeFlags::SvgElement,
65+
"missing-glyph" => VNodeFlags::SvgElement,
66+
"mpath" => VNodeFlags::SvgElement,
67+
"path" => VNodeFlags::SvgElement,
68+
"pattern" => VNodeFlags::SvgElement,
69+
"polygon" => VNodeFlags::SvgElement,
70+
"polyline" => VNodeFlags::SvgElement,
71+
"radialGradient" => VNodeFlags::SvgElement,
72+
"rect" => VNodeFlags::SvgElement,
73+
"set" => VNodeFlags::SvgElement,
74+
"stop" => VNodeFlags::SvgElement,
75+
"svg" => VNodeFlags::SvgElement,
76+
"switch" => VNodeFlags::SvgElement,
77+
"symbol" => VNodeFlags::SvgElement,
78+
"text" => VNodeFlags::SvgElement,
79+
"textPath" => VNodeFlags::SvgElement,
80+
"tref" => VNodeFlags::SvgElement,
81+
"tspan" => VNodeFlags::SvgElement,
82+
"unknown" => VNodeFlags::SvgElement,
83+
"use" => VNodeFlags::SvgElement,
84+
"view" => VNodeFlags::SvgElement,
85+
"vkern" => VNodeFlags::SvgElement,
86+
"hatch" => VNodeFlags::SvgElement,
87+
"hatchpath" => VNodeFlags::SvgElement,
88+
"mesh" => VNodeFlags::SvgElement,
89+
"meshgradient" => VNodeFlags::SvgElement,
90+
"meshpatch" => VNodeFlags::SvgElement,
91+
"meshrow" => VNodeFlags::SvgElement,
92+
"solidcolor" => VNodeFlags::SvgElement,
93+
_ => VNodeFlags::HtmlElement,
94+
}) as u16
95+
}

0 commit comments

Comments
 (0)