Skip to content

Commit b48a33a

Browse files
authored
fix: should use exported name of the imported module (#12423)
1 parent b73f59a commit b48a33a

File tree

4 files changed

+45
-36
lines changed

4 files changed

+45
-36
lines changed

crates/rspack_plugin_esm_library/src/link.rs

Lines changed: 32 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1267,6 +1267,7 @@ var {} = {{}};
12671267
}
12681268

12691269
let chunk_link = link.get_mut_unwrap(&current_chunk);
1270+
12701271
match re_exports {
12711272
rspack_core::ExportMode::Missing
12721273
| rspack_core::ExportMode::LazyMake
@@ -1422,8 +1423,6 @@ var {} = {{}};
14221423
);
14231424
}
14241425
rspack_core::ExportMode::NormalReexport(mode) => {
1425-
let exports_info = module_graph.get_exports_info(&ref_module);
1426-
14271426
for item in mode.items {
14281427
let mut ref_module = orig_ref_module;
14291428

@@ -1439,34 +1438,21 @@ var {} = {{}};
14391438
continue;
14401439
}
14411440

1442-
let name = item.ids.first().unwrap_or(&item.name);
1443-
let mut unknown_export_info = false;
1444-
let mut export_info =
1445-
if let Some(export_info) = exports_info.as_data(module_graph).named_exports(name) {
1446-
export_info
1447-
} else {
1448-
unknown_export_info = true;
1449-
// export info not found, this is likely because the export is from unknown
1450-
item.export_info.as_data(module_graph)
1451-
};
1452-
1453-
let resolved_target = get_target(export_info, module_graph);
1441+
let item_export_info = item.export_info.as_data(module_graph);
1442+
let resolved_target = get_target(item_export_info, module_graph);
14541443

1455-
let ids = match resolved_target {
1444+
let export_name = match resolved_target {
14561445
Some(result) => {
14571446
ref_module = result.module;
1458-
if let Some(export_name) = &result.export {
1459-
export_info = module_graph
1460-
.get_exports_info(&ref_module)
1461-
.as_data(module_graph)
1462-
.named_exports(&export_name[0])
1463-
.unwrap_or(export_info);
1464-
export_name.clone()
1447+
if let Some(export_name) = &result.export
1448+
&& !export_name.is_empty()
1449+
{
1450+
export_name.first().unwrap_or(&item.name).clone()
14651451
} else {
1466-
item.ids.clone()
1452+
item.name.clone()
14671453
}
14681454
}
1469-
None => item.ids.clone(),
1455+
None => item.name.clone(),
14701456
};
14711457

14721458
if ref_module != orig_ref_module
@@ -1486,7 +1472,7 @@ var {} = {{}};
14861472
&rspack_core::ExportMode::NormalReexport(ExportModeNormalReexport {
14871473
items: vec![NormalReexportItem {
14881474
name: item.name.clone(),
1489-
ids: ids.clone(),
1475+
ids: vec![export_name.clone()],
14901476
hidden: false,
14911477
checked: item.checked,
14921478
export_info: item.export_info.clone(),
@@ -1498,14 +1484,23 @@ var {} = {{}};
14981484
}
14991485

15001486
let chunk_link = link.get_mut_unwrap(&current_chunk);
1501-
let used_name = if unknown_export_info {
1502-
UsedNameItem::Str(item.name.clone())
1503-
} else {
1504-
export_info.get_used_name(None, None).unwrap_or_else(|| {
1487+
1488+
// Note that the export_info is current module's export info **NOT** ref module's export info
1489+
// so in order to find used name, we should go find the ref export info
1490+
let ref_exports_info = module_graph
1491+
.get_prefetched_exports_info(&ref_module, PrefetchExportsInfoMode::Default);
1492+
1493+
let ref_export_info_tmp =
1494+
ref_exports_info.get_export_info_without_mut_module_graph(&export_name);
1495+
1496+
let ref_export_info = ref_export_info_tmp.to_data();
1497+
1498+
let used_name = ref_export_info
1499+
.get_used_name(None, None)
1500+
.unwrap_or_else(|| {
15051501
// dynamic export
15061502
UsedNameItem::Str(item.name.clone())
1507-
})
1508-
};
1503+
});
15091504

15101505
if let UsedNameItem::Inlined(inlined) = used_name {
15111506
let new_name = find_new_name(&item.name, &chunk_link.used_names, &vec![]);
@@ -1558,8 +1553,12 @@ var {} = {{}};
15581553
);
15591554
}
15601555
ModuleInfo::Concatenated(ref_info) => {
1561-
let Some(internal_name) =
1562-
ref_info.get_internal_name(ids.first().unwrap_or(&item.name))
1556+
let Some(internal_name) = ref_info
1557+
.export_map
1558+
.as_ref()
1559+
.and_then(|export_map| export_map.get(&export_name))
1560+
.map(|export_name| Atom::from(export_name.clone()))
1561+
.and_then(|export_local| ref_info.get_internal_name(&export_local))
15631562
else {
15641563
continue;
15651564
};

tests/rspack-test/esmOutputCases/re-exports/deep-re-exports-esm/__snapshots__/esm.snap.txt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
// ./lib3.js
33
const lib3_lib3 = 42
44

5+
const lib_local = 24
6+
7+
8+
59
// ./lib2.js
610

711

@@ -16,12 +20,13 @@ const lib_lib = 42
1620

1721

1822
it('should re-export esm correctly', async () => {
19-
const { lib, lib2, lib3 } = await import(/* webpackIgnore: true */ './main.mjs')
23+
const { lib, lib2, lib3, lib4 } = await import(/* webpackIgnore: true */ './main.mjs')
2024
expect(lib).toBe(42)
2125
expect(lib2).toBe(42)
2226
expect(lib3).toBe(42)
27+
expect(lib4).toBe(24)
2328
})
2429

25-
export { lib2_lib2 as lib2, lib3_lib3 as lib3, lib_lib as lib };
30+
export { lib2_lib2 as lib2, lib3_lib3 as lib3, lib_lib as lib, lib_local as lib4 };
2631

2732
```
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
export * from './lib'
22

33
it('should re-export esm correctly', async () => {
4-
const { lib, lib2, lib3 } = await import(/* webpackIgnore: true */ './main.mjs')
4+
const { lib, lib2, lib3, lib4 } = await import(/* webpackIgnore: true */ './main.mjs')
55
expect(lib).toBe(42)
66
expect(lib2).toBe(42)
77
expect(lib3).toBe(42)
8+
expect(lib4).toBe(24)
89
})
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,5 @@
11
export const lib3 = 42
2+
3+
const lib_local = 24
4+
5+
export { lib_local as lib4 }

0 commit comments

Comments
 (0)