Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit eae1e57

Browse files
committed
feat: empty module should have ExportsKind::None
1 parent b73da4f commit eae1e57

10 files changed

Lines changed: 48 additions & 45 deletions

File tree

crates/rolldown/src/bundler/visitors/scanner.rs

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,10 @@ pub struct Scanner<'a> {
4040
current_stmt_info: StmtInfo,
4141
result: ScanResult,
4242
esm_export_keyword: Option<Span>,
43-
cjs_export_keyword: Option<Span>,
43+
esm_import_keyword: Option<Span>,
4444
pub namespace_symbol: SymbolRef,
45+
used_exports_ref: bool,
46+
used_module_ref: bool,
4547
}
4648

4749
impl<'ast> Scanner<'ast> {
@@ -68,45 +70,49 @@ impl<'ast> Scanner<'ast> {
6870
current_stmt_info: StmtInfo::default(),
6971
result,
7072
esm_export_keyword: None,
71-
cjs_export_keyword: None,
73+
esm_import_keyword: None,
7274
module_type,
7375
namespace_symbol: namespace_ref,
76+
used_exports_ref: false,
77+
used_module_ref: false,
7478
}
7579
}
7680

7781
pub fn scan(mut self, program: &Program<'ast>) -> ScanResult {
7882
self.visit_program(program);
79-
self.result
80-
}
83+
let mut exports_kind = ExportsKind::None;
8184

82-
fn set_esm_export_keyword(&mut self, span: Span) {
83-
if self.esm_export_keyword.is_none() {
84-
self.esm_export_keyword = Some(span);
85+
if self.esm_export_keyword.is_some() {
86+
exports_kind = ExportsKind::Esm;
87+
} else if self.used_exports_ref || self.used_module_ref {
88+
exports_kind = ExportsKind::CommonJs;
89+
} else {
90+
// TODO(hyf0): need review this. Why `ModuleType` doesn't have higher priority?
91+
match self.module_type {
92+
ModuleType::CJS | ModuleType::CjsPackageJson => {
93+
exports_kind = ExportsKind::CommonJs;
94+
}
95+
ModuleType::EsmMjs | ModuleType::EsmPackageJson => {
96+
exports_kind = ExportsKind::Esm;
97+
}
98+
ModuleType::Unknown => {
99+
if self.esm_import_keyword.is_some() {
100+
exports_kind = ExportsKind::Esm;
101+
}
102+
}
103+
}
85104
}
105+
106+
self.result.exports_kind = exports_kind;
107+
self.result
86108
}
87109

88110
fn is_unresolved_reference(&self, ident_ref: &IdentifierReference) -> bool {
89111
self.scope.is_unresolved(ident_ref.reference_id.get().unwrap())
90112
}
91113

92-
fn set_cjs_export_keyword(&mut self, span: Span) {
93-
if self.cjs_export_keyword.is_none() {
94-
self.cjs_export_keyword = Some(span);
95-
}
96-
}
97-
98-
fn set_exports_kind(&mut self) {
99-
if self.esm_export_keyword.is_some() {
100-
self.result.exports_kind = ExportsKind::Esm;
101-
} else if self.cjs_export_keyword.is_some() {
102-
self.result.exports_kind = ExportsKind::CommonJs;
103-
} else if self.module_type.is_esm() {
104-
self.result.exports_kind = ExportsKind::Esm;
105-
} else if self.module_type.is_commonjs() {
106-
self.result.exports_kind = ExportsKind::CommonJs;
107-
} else {
108-
self.result.exports_kind = ExportsKind::Esm;
109-
}
114+
fn set_esm_export_keyword(&mut self, span: Span) {
115+
self.esm_export_keyword.get_or_insert(span);
110116
}
111117

112118
fn add_declared_id(&mut self, id: SymbolId) {
@@ -276,6 +282,8 @@ impl<'ast> Scanner<'ast> {
276282
fn scan_module_decl(&mut self, decl: &ModuleDeclaration) {
277283
match decl {
278284
oxc::ast::ast::ModuleDeclaration::ImportDeclaration(decl) => {
285+
// TODO: this should be the span of `import` keyword, while now it is the span of the whole import declaration.
286+
self.esm_import_keyword.get_or_insert(decl.span);
279287
self.scan_import_decl(decl);
280288
}
281289
oxc::ast::ast::ModuleDeclaration::ExportAllDeclaration(decl) => {
@@ -311,7 +319,6 @@ impl<'ast> Visit<'ast> for Scanner<'ast> {
311319
self.visit_statement(stmt);
312320
self.result.stmt_infos.add_stmt_info(std::mem::take(&mut self.current_stmt_info));
313321
}
314-
self.set_exports_kind();
315322
}
316323

317324
fn visit_binding_identifier(&mut self, ident: &oxc::ast::ast::BindingIdentifier) {
@@ -327,14 +334,15 @@ impl<'ast> Visit<'ast> for Scanner<'ast> {
327334
Some(symbol_id) if self.is_top_level(symbol_id) => {
328335
self.add_referenced_symbol(symbol_id);
329336
}
330-
_ => {}
331-
}
332-
if ident.name == "module" || ident.name == "exports" {
333-
if let Some(refs) = self.scope.root_unresolved_references().get(&ident.name) {
334-
if refs.iter().any(|r| (*r).eq(&ident.reference_id.get().unwrap())) {
335-
self.set_cjs_export_keyword(ident.span);
337+
None => {
338+
if ident.name == "module" {
339+
self.used_module_ref = true;
340+
}
341+
if ident.name == "exports" {
342+
self.used_exports_ref = true;
336343
}
337344
}
345+
_ => {}
338346
}
339347
}
340348

crates/rolldown/tests/esbuild/default/nested_common_js/artifacts.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ input_file: crates/rolldown/tests/esbuild/default/nested_common_js
88
## entry_js.mjs
99

1010
```js
11-
import { __commonJS, __toESM } from "./_rolldown_runtime.mjs";
11+
import { __commonJS } from "./_rolldown_runtime.mjs";
1212
1313
// foo.js
1414
var require_foo = __commonJS({

crates/rolldown/tests/esbuild/default/new_expression_common_js/artifacts.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ input_file: crates/rolldown/tests/esbuild/default/new_expression_common_js
88
## entry_js.mjs
99

1010
```js
11-
import { __commonJS, __toESM } from "./_rolldown_runtime.mjs";
11+
import { __commonJS } from "./_rolldown_runtime.mjs";
1212
1313
// foo.js
1414
var require_foo = __commonJS({

crates/rolldown/tests/esbuild/default/require_child_dir_common_js/artifacts.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ input_file: crates/rolldown/tests/esbuild/default/require_child_dir_common_js
88
## entry_js.mjs
99

1010
```js
11-
import { __commonJS, __toESM } from "./_rolldown_runtime.mjs";
11+
import { __commonJS } from "./_rolldown_runtime.mjs";
1212
1313
// dir/index.js
1414
var require_dir_index = __commonJS({

crates/rolldown/tests/esbuild/default/require_parent_dir_common_js/artifacts.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ input_file: crates/rolldown/tests/esbuild/default/require_parent_dir_common_js
88
## dir_entry_js.mjs
99

1010
```js
11-
import { __commonJS, __toESM } from "./_rolldown_runtime.mjs";
11+
import { __commonJS } from "./_rolldown_runtime.mjs";
1212
1313
// index.js
1414
var require_require_parent_dir_common_js_index = __commonJS({

crates/rolldown/tests/esbuild/default/simple_common_js/artifacts.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ input_file: crates/rolldown/tests/esbuild/default/simple_common_js
88
## entry_js.mjs
99

1010
```js
11-
import { __commonJS, __toESM } from "./_rolldown_runtime.mjs";
11+
import { __commonJS } from "./_rolldown_runtime.mjs";
1212
1313
// foo.js
1414
var require_foo = __commonJS({

crates/rolldown/tests/esbuild/default/use_strict_directive_bundle_issue1837/artifacts.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ input_file: crates/rolldown/tests/esbuild/default/use_strict_directive_bundle_is
88
## entry_js.mjs
99

1010
```js
11-
import { __commonJS, __toESM } from "./_rolldown_runtime.mjs";
11+
import { __commonJS } from "./_rolldown_runtime.mjs";
1212
1313
// cjs.js
1414
var require_cjs = __commonJS({

crates/rolldown/tests/esbuild/splitting/shared-commonjs-into-es6/artifacts.snap

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ export { require_shared };
2121
## a.mjs
2222

2323
```js
24-
import { __toESM } from "./_rolldown_runtime.mjs";
2524
import { require_shared } from "./2.mjs";
2625
2726
// a.js
@@ -31,7 +30,6 @@ console.log(foo)
3130
## b.mjs
3231

3332
```js
34-
import { __toESM } from "./_rolldown_runtime.mjs";
3533
import { require_shared } from "./2.mjs";
3634
3735
// b.js

crates/rolldown/tests/fixtures/mix-cjs-esm/artifacts.snap

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,12 @@ input_file: crates/rolldown/tests/fixtures/mix-cjs-esm
88
## main.mjs
99

1010
```js
11-
import { __commonJS, __esm, __toCommonJS, __toESM } from "./_rolldown_runtime.mjs";
11+
import { __commonJS, __esm, __toESM } from "./_rolldown_runtime.mjs";
1212
1313
// esm-export-cjs-export.js
1414
module.exports = 1;
1515
const value$1 = 1;
1616
// foo.js
17-
var foo_ns = {
18-
19-
};
2017
var init_foo = __esm({
2118
'foo.js'() {
2219

crates/rolldown/tests/fixtures/require/require_cjs/artifacts.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ input_file: crates/rolldown/tests/fixtures/require/require_cjs
88
## main.mjs
99

1010
```js
11-
import { __commonJS, __toESM } from "./_rolldown_runtime.mjs";
11+
import { __commonJS } from "./_rolldown_runtime.mjs";
1212
1313
// cjs.js
1414
var require_cjs = __commonJS({

0 commit comments

Comments
 (0)