@@ -45,8 +45,13 @@ use swc_ecma_parser::{parse_file_as_expr, Syntax, TsSyntax};
45
45
pub use swc_ecma_transforms:: proposals:: DecoratorVersion ;
46
46
use swc_ecma_transforms:: {
47
47
feature:: FeatureFlag ,
48
- hygiene, modules,
49
- modules:: { path:: NodeImportResolver , rewriter:: import_rewriter, EsModuleConfig } ,
48
+ hygiene,
49
+ modules:: {
50
+ self ,
51
+ path:: { ImportResolver , NodeImportResolver , Resolver } ,
52
+ rewriter:: import_rewriter,
53
+ EsModuleConfig ,
54
+ } ,
50
55
optimization:: { const_modules, json_parse, simplifier} ,
51
56
pass:: { noop, Optional } ,
52
57
proposals:: {
@@ -540,6 +545,9 @@ impl Options {
540
545
. unwrap_or_default ( )
541
546
} ;
542
547
548
+ let paths = paths. into_iter ( ) . collect ( ) ;
549
+ let resolver = ModuleConfig :: get_resolver ( & base_url, paths, base, cfg. module . as_ref ( ) ) ;
550
+
543
551
let pass = PassBuilder :: new (
544
552
cm,
545
553
handler,
@@ -564,12 +572,10 @@ impl Options {
564
572
. preset_env ( cfg. env )
565
573
. regenerator ( regenerator)
566
574
. finalize (
567
- base_url,
568
- paths. into_iter ( ) . collect ( ) ,
569
- base,
570
575
syntax,
571
576
cfg. module ,
572
577
comments. map ( |v| v as _ ) ,
578
+ resolver. clone ( ) ,
573
579
) ;
574
580
575
581
let keep_import_attributes = experimental. keep_import_attributes . into_bool ( ) ;
@@ -782,6 +788,7 @@ impl Options {
782
788
. emit_assert_for_import_attributes
783
789
. into_bool ( ) ,
784
790
emit_isolated_dts : experimental. emit_isolated_dts . into_bool ( ) ,
791
+ resolver,
785
792
} )
786
793
}
787
794
}
@@ -1090,6 +1097,7 @@ pub struct BuiltInput<P: swc_ecma_visit::Fold> {
1090
1097
pub emit_assert_for_import_attributes : bool ,
1091
1098
1092
1099
pub emit_isolated_dts : bool ,
1100
+ pub resolver : Option < ( FileName , Arc < dyn ImportResolver > ) > ,
1093
1101
}
1094
1102
1095
1103
impl < P > BuiltInput < P >
@@ -1120,6 +1128,7 @@ where
1120
1128
output : self . output ,
1121
1129
emit_assert_for_import_attributes : self . emit_assert_for_import_attributes ,
1122
1130
emit_isolated_dts : self . emit_isolated_dts ,
1131
+ resolver : self . resolver ,
1123
1132
}
1124
1133
}
1125
1134
}
@@ -1288,116 +1297,91 @@ impl ModuleConfig {
1288
1297
pub fn build < ' cmt > (
1289
1298
cm : Arc < SourceMap > ,
1290
1299
comments : Option < & ' cmt dyn Comments > ,
1291
- base_url : PathBuf ,
1292
- paths : CompiledPaths ,
1293
- base : & FileName ,
1294
- unresolved_mark : Mark ,
1295
1300
config : Option < ModuleConfig > ,
1301
+ unresolved_mark : Mark ,
1296
1302
available_features : FeatureFlag ,
1303
+ resolver : Option < ( FileName , Arc < dyn ImportResolver > ) > ,
1297
1304
) -> Box < dyn swc_ecma_visit:: Fold + ' cmt > {
1305
+ let resolver = if let Some ( ( base, resolver) ) = resolver {
1306
+ Resolver :: Real { base, resolver }
1307
+ } else {
1308
+ Resolver :: Default
1309
+ } ;
1310
+
1311
+ match config {
1312
+ None | Some ( ModuleConfig :: Es6 ( ..) ) | Some ( ModuleConfig :: NodeNext ( ..) ) => match resolver
1313
+ {
1314
+ Resolver :: Default => Box :: new ( noop ( ) ) ,
1315
+ Resolver :: Real { base, resolver } => Box :: new ( import_rewriter ( base, resolver) ) ,
1316
+ } ,
1317
+ Some ( ModuleConfig :: CommonJs ( config) ) => Box :: new ( modules:: common_js:: common_js (
1318
+ resolver,
1319
+ unresolved_mark,
1320
+ config,
1321
+ available_features,
1322
+ ) ) ,
1323
+ Some ( ModuleConfig :: Umd ( config) ) => Box :: new ( modules:: umd:: umd (
1324
+ cm,
1325
+ resolver,
1326
+ unresolved_mark,
1327
+ config,
1328
+ available_features,
1329
+ ) ) ,
1330
+ Some ( ModuleConfig :: Amd ( config) ) => Box :: new ( modules:: amd:: amd (
1331
+ resolver,
1332
+ unresolved_mark,
1333
+ config,
1334
+ available_features,
1335
+ comments,
1336
+ ) ) ,
1337
+ Some ( ModuleConfig :: SystemJs ( config) ) => Box :: new ( modules:: system_js:: system_js (
1338
+ resolver,
1339
+ unresolved_mark,
1340
+ config,
1341
+ ) ) ,
1342
+ }
1343
+ }
1344
+
1345
+ pub fn get_resolver (
1346
+ base_url : & Path ,
1347
+ paths : CompiledPaths ,
1348
+ base : & FileName ,
1349
+ config : Option < & ModuleConfig > ,
1350
+ ) -> Option < ( FileName , Arc < dyn ImportResolver > ) > {
1298
1351
let skip_resolver = base_url. as_os_str ( ) . is_empty ( ) && paths. is_empty ( ) ;
1299
1352
1353
+ if skip_resolver {
1354
+ return None ;
1355
+ }
1356
+
1300
1357
let base = match base {
1301
1358
FileName :: Real ( v) if !skip_resolver => {
1302
1359
FileName :: Real ( v. canonicalize ( ) . unwrap_or_else ( |_| v. to_path_buf ( ) ) )
1303
1360
}
1304
1361
_ => base. clone ( ) ,
1305
1362
} ;
1306
1363
1307
- match config {
1308
- None => {
1309
- if skip_resolver {
1310
- Box :: new ( noop ( ) )
1311
- } else {
1312
- let resolver = build_resolver ( base_url, paths, false ) ;
1313
-
1314
- Box :: new ( import_rewriter ( base, resolver) )
1315
- }
1316
- }
1364
+ let base_url = base_url. to_path_buf ( ) ;
1365
+ let resolver = match config {
1366
+ None => build_resolver ( base_url, paths, false ) ,
1317
1367
Some ( ModuleConfig :: Es6 ( config) ) | Some ( ModuleConfig :: NodeNext ( config) ) => {
1318
- if skip_resolver {
1319
- Box :: new ( noop ( ) )
1320
- } else {
1321
- let resolver = build_resolver ( base_url, paths, config. resolve_fully ) ;
1322
-
1323
- Box :: new ( import_rewriter ( base, resolver) )
1324
- }
1368
+ build_resolver ( base_url, paths, config. resolve_fully )
1325
1369
}
1326
1370
Some ( ModuleConfig :: CommonJs ( config) ) => {
1327
- if skip_resolver {
1328
- Box :: new ( modules:: common_js:: common_js (
1329
- unresolved_mark,
1330
- config,
1331
- available_features,
1332
- ) )
1333
- } else {
1334
- let resolver = build_resolver ( base_url, paths, config. resolve_fully ) ;
1335
- Box :: new ( modules:: common_js:: common_js_with_resolver (
1336
- resolver,
1337
- base,
1338
- unresolved_mark,
1339
- config,
1340
- available_features,
1341
- ) )
1342
- }
1371
+ build_resolver ( base_url, paths, config. resolve_fully )
1343
1372
}
1344
1373
Some ( ModuleConfig :: Umd ( config) ) => {
1345
- if skip_resolver {
1346
- Box :: new ( modules:: umd:: umd (
1347
- cm,
1348
- unresolved_mark,
1349
- config,
1350
- available_features,
1351
- ) )
1352
- } else {
1353
- let resolver = build_resolver ( base_url, paths, config. config . resolve_fully ) ;
1354
-
1355
- Box :: new ( modules:: umd:: umd_with_resolver (
1356
- cm,
1357
- resolver,
1358
- base,
1359
- unresolved_mark,
1360
- config,
1361
- available_features,
1362
- ) )
1363
- }
1374
+ build_resolver ( base_url, paths, config. config . resolve_fully )
1364
1375
}
1365
1376
Some ( ModuleConfig :: Amd ( config) ) => {
1366
- if skip_resolver {
1367
- Box :: new ( modules:: amd:: amd (
1368
- unresolved_mark,
1369
- config,
1370
- available_features,
1371
- comments,
1372
- ) )
1373
- } else {
1374
- let resolver = build_resolver ( base_url, paths, config. config . resolve_fully ) ;
1375
-
1376
- Box :: new ( modules:: amd:: amd_with_resolver (
1377
- resolver,
1378
- base,
1379
- unresolved_mark,
1380
- config,
1381
- available_features,
1382
- comments,
1383
- ) )
1384
- }
1377
+ build_resolver ( base_url, paths, config. config . resolve_fully )
1385
1378
}
1386
1379
Some ( ModuleConfig :: SystemJs ( config) ) => {
1387
- if skip_resolver {
1388
- Box :: new ( modules:: system_js:: system_js ( unresolved_mark, config) )
1389
- } else {
1390
- let resolver = build_resolver ( base_url, paths, config. resolve_fully ) ;
1391
-
1392
- Box :: new ( modules:: system_js:: system_js_with_resolver (
1393
- resolver,
1394
- base,
1395
- unresolved_mark,
1396
- config,
1397
- ) )
1398
- }
1380
+ build_resolver ( base_url, paths, config. resolve_fully )
1399
1381
}
1400
- }
1382
+ } ;
1383
+
1384
+ Some ( ( base, resolver) )
1401
1385
}
1402
1386
}
1403
1387
@@ -1712,7 +1696,7 @@ fn build_resolver(
1712
1696
mut base_url : PathBuf ,
1713
1697
paths : CompiledPaths ,
1714
1698
resolve_fully : bool ,
1715
- ) -> Box < SwcImportResolver > {
1699
+ ) -> SwcImportResolver {
1716
1700
static CACHE : Lazy < DashMap < ( PathBuf , CompiledPaths , bool ) , SwcImportResolver , ARandomState > > =
1717
1701
Lazy :: new ( Default :: default) ;
1718
1702
@@ -1731,7 +1715,7 @@ fn build_resolver(
1731
1715
}
1732
1716
1733
1717
if let Some ( cached) = CACHE . get ( & ( base_url. clone ( ) , paths. clone ( ) , resolve_fully) ) {
1734
- return Box :: new ( ( * cached) . clone ( ) ) ;
1718
+ return cached. clone ( ) ;
1735
1719
}
1736
1720
1737
1721
let r = {
@@ -1758,5 +1742,5 @@ fn build_resolver(
1758
1742
1759
1743
CACHE . insert ( ( base_url, paths, resolve_fully) , r. clone ( ) ) ;
1760
1744
1761
- Box :: new ( r )
1745
+ r
1762
1746
}
0 commit comments