@@ -6,7 +6,7 @@ use crate::resolve::{
6
6
} ;
7
7
8
8
use path_slash:: PathBufExt ;
9
- use rand :: { distributions :: Alphanumeric , Rng } ;
9
+ use sha1 :: { Digest , Sha1 } ;
10
10
use std:: { cell:: RefCell , path:: PathBuf , rc:: Rc } ;
11
11
use swc_common:: { SourceMap , Spanned , DUMMY_SP } ;
12
12
use swc_ecma_ast:: * ;
@@ -22,6 +22,7 @@ pub fn aleph_jsx_fold(
22
22
AlephJsxFold {
23
23
resolver : resolver. clone ( ) ,
24
24
source,
25
+ inline_style_idx : 0 ,
25
26
is_dev,
26
27
} ,
27
28
AlephJsxBuiltinModuleResolveFold {
@@ -42,27 +43,41 @@ pub fn aleph_jsx_fold(
42
43
struct AlephJsxFold {
43
44
resolver : Rc < RefCell < Resolver > > ,
44
45
source : Rc < SourceMap > ,
46
+ inline_style_idx : i32 ,
45
47
is_dev : bool ,
46
48
}
47
49
48
50
impl AlephJsxFold {
51
+ fn new_inline_style_ident ( & mut self ) -> String {
52
+ let resolver = self . resolver . borrow_mut ( ) ;
53
+ self . inline_style_idx = self . inline_style_idx + 1 ;
54
+ let path = format ! ( "{}-{}" , resolver. specifier, self . inline_style_idx) ;
55
+ let mut ident: String = "inline-style-" . to_owned ( ) ;
56
+ let mut hasher = Sha1 :: new ( ) ;
57
+ hasher. update ( path. as_bytes ( ) ) ;
58
+ let hash = hasher. finalize ( ) ;
59
+ ident. push_str ( format ! ( "{:x}" , hash) . as_str ( ) ) ;
60
+ ident
61
+ }
62
+
49
63
fn fold_jsx_opening_element (
50
64
& mut self ,
51
65
mut el : JSXOpeningElement ,
52
66
) -> ( JSXOpeningElement , Option < ( String , String ) > ) {
53
- let mut resolver = self . resolver . borrow_mut ( ) ;
54
67
let mut inline_style: Option < ( String , String ) > = None ;
55
68
56
69
match & el. name {
57
70
JSXElementName :: Ident ( id) => {
58
71
let name = id. sym . as_ref ( ) ;
59
72
match name {
60
73
"head" | "script" => {
74
+ let mut resolver = self . resolver . borrow_mut ( ) ;
61
75
resolver. builtin_jsx_tags . insert ( name. into ( ) ) ;
62
76
el. name = JSXElementName :: Ident ( quote_ident ! ( rename_builtin_tag( name) ) ) ;
63
77
}
64
78
65
79
"a" => {
80
+ let mut resolver = self . resolver . borrow_mut ( ) ;
66
81
let mut should_replace = true ;
67
82
68
83
for attr in & el. attrs {
@@ -143,6 +158,7 @@ impl AlephJsxFold {
143
158
} ;
144
159
}
145
160
161
+ let mut resolver = self . resolver . borrow_mut ( ) ;
146
162
let ( resolved_path, fixed_url) =
147
163
resolver. resolve ( href_prop_value, true ) ;
148
164
@@ -229,7 +245,7 @@ impl AlephJsxFold {
229
245
} ;
230
246
}
231
247
232
- let id = new_inline_style_ident ( ) ;
248
+ let id = self . new_inline_style_ident ( ) ;
233
249
let id_attr = JSXAttrOrSpread :: JSXAttr ( JSXAttr {
234
250
span : DUMMY_SP ,
235
251
name : JSXAttrName :: Ident ( quote_ident ! ( "__styleId" ) ) ,
@@ -246,11 +262,11 @@ impl AlephJsxFold {
246
262
el. attrs . push ( id_attr) ;
247
263
}
248
264
265
+ let mut resolver = self . resolver . borrow_mut ( ) ;
249
266
resolver. dep_graph . push ( DependencyDescriptor {
250
267
specifier : "#" . to_owned ( ) + id. as_str ( ) ,
251
268
is_dynamic : false ,
252
269
} ) ;
253
-
254
270
resolver. builtin_jsx_tags . insert ( name. into ( ) ) ;
255
271
el. name = JSXElementName :: Ident ( quote_ident ! ( rename_builtin_tag( name) ) ) ;
256
272
inline_style = Some ( ( type_prop_value, id. into ( ) ) ) ;
@@ -268,6 +284,7 @@ impl AlephJsxFold {
268
284
269
285
// copy from https://github.com/swc-project/swc/blob/master/ecmascript/transforms/src/react/jsx_src.rs
270
286
if self . is_dev {
287
+ let resolver = self . resolver . borrow_mut ( ) ;
271
288
match self . source . span_to_lines ( el. span ) {
272
289
Ok ( file_lines) => {
273
290
el. attrs . push ( JSXAttrOrSpread :: JSXAttr ( JSXAttr {
@@ -463,14 +480,3 @@ fn rename_builtin_tag(name: &str) -> String {
463
480
}
464
481
"__ALEPH_" . to_owned ( ) + name. as_str ( )
465
482
}
466
-
467
- fn new_inline_style_ident ( ) -> String {
468
- let mut ident: String = "inline-style-" . to_owned ( ) ;
469
- let rand_id = rand:: thread_rng ( )
470
- . sample_iter ( & Alphanumeric )
471
- . take ( 9 )
472
- . map ( char:: from)
473
- . collect :: < String > ( ) ;
474
- ident. push_str ( rand_id. as_str ( ) ) ;
475
- return ident;
476
- }
0 commit comments