Skip to content

Commit 8a49752

Browse files
committed
fix(transformer/module_runner): fix execution order of re-export
1 parent 2eb1f88 commit 8a49752

File tree

1 file changed

+15
-12
lines changed

1 file changed

+15
-12
lines changed

crates/oxc_transformer/src/plugins/module_runner_transform.rs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ impl<'a> ModuleRunnerTransform<'a> {
150150
}
151151
Statement::ExportAllDeclaration(export) => {
152152
self.transform_export_all_declaration(
153-
&mut new_stmts,
153+
&mut hoist_imports,
154154
&mut hoist_exports,
155155
export,
156156
ctx,
@@ -159,6 +159,7 @@ impl<'a> ModuleRunnerTransform<'a> {
159159
Statement::ExportNamedDeclaration(export) => {
160160
self.transform_export_named_declaration(
161161
&mut new_stmts,
162+
&mut hoist_imports,
162163
&mut hoist_exports,
163164
export,
164165
ctx,
@@ -378,6 +379,7 @@ impl<'a> ModuleRunnerTransform<'a> {
378379
fn transform_export_named_declaration(
379380
&mut self,
380381
new_stmts: &mut ArenaVec<'a, Statement<'a>>,
382+
hoist_imports: &mut Vec<Statement<'a>>,
381383
hoist_exports: &mut Vec<Statement<'a>>,
382384
export: ArenaBox<'a, ExportNamedDeclaration<'a>>,
383385
ctx: &mut TraverseCtx<'a>,
@@ -433,7 +435,7 @@ impl<'a> ModuleRunnerTransform<'a> {
433435
Argument::from(Expression::StringLiteral(ctx.ast.alloc(source))),
434436
Self::create_imported_names_object(imported_names, ctx),
435437
]);
436-
new_stmts.push(Self::create_import(SPAN, pattern, arguments, ctx));
438+
hoist_imports.push(Self::create_import(SPAN, pattern, arguments, ctx));
437439
binding
438440
});
439441

@@ -479,7 +481,7 @@ impl<'a> ModuleRunnerTransform<'a> {
479481
/// ```
480482
fn transform_export_all_declaration(
481483
&mut self,
482-
new_stmts: &mut ArenaVec<'a, Statement<'a>>,
484+
hoist_imports: &mut Vec<Statement<'a>>,
483485
hoist_exports: &mut Vec<Statement<'a>>,
484486
export: ArenaBox<'a, ExportAllDeclaration<'a>>,
485487
ctx: &mut TraverseCtx<'a>,
@@ -498,16 +500,16 @@ impl<'a> ModuleRunnerTransform<'a> {
498500
// `export * as foo from 'vue'` ->
499501
// `Object.defineProperty(__vite_ssr_exports__, 'foo', { enumerable: true, configurable: true, get(){ return __vite_ssr_import_0__ } });`
500502
let export = Self::create_export(span, ident, exported.name(), ctx);
501-
new_stmts.push(import);
503+
hoist_imports.push(import);
502504
hoist_exports.push(export);
503505
} else {
504506
let callee = ctx.ast.expression_identifier(SPAN, SSR_EXPORT_ALL_KEY);
505507
let arguments = ctx.ast.vec1(Argument::from(ident));
506508
// `export * from 'vue'` -> `__vite_ssr_exportAll__(__vite_ssr_import_0__);`
507509
let call = ctx.ast.expression_call(SPAN, callee, NONE, arguments, false);
508510
let export = ctx.ast.statement_expression(span, call);
509-
// we cannot hoist this case, so keep at the same position
510-
new_stmts.extend([import, export]);
511+
// names from `export *` cannot be known, so add it right after the import.
512+
hoist_imports.extend([import, export]);
511513
}
512514
}
513515

@@ -1190,13 +1192,12 @@ const __vite_ssr_import_0__ = await __vite_ssr_import__('vue', { importedNames:
11901192

11911193
#[test]
11921194
fn export_then_import_minified() {
1193-
// `import` is hoisted but `export * from` is not. this is an expected behavior.
11941195
test_same(
11951196
"export * from 'vue';import {createApp} from 'vue'",
11961197
"
1197-
const __vite_ssr_import_1__ = await __vite_ssr_import__('vue', { importedNames: ['createApp'] });
11981198
const __vite_ssr_import_0__ = await __vite_ssr_import__('vue');
11991199
__vite_ssr_exportAll__(__vite_ssr_import_0__);
1200+
const __vite_ssr_import_1__ = await __vite_ssr_import__('vue', { importedNames: ['createApp'] });
12001201
",
12011202
);
12021203
}
@@ -2064,10 +2065,12 @@ __vite_ssr_dynamic_import__('./bar.json', { with: { type: 'json' } });",
20642065
export * from './b'
20652066
console.log(foo + 2)",
20662067
"
2068+
const __vite_ssr_import_0__ = await __vite_ssr_import__('./a');
2069+
__vite_ssr_exportAll__(__vite_ssr_import_0__);
20672070
const __vite_ssr_import_1__ = await __vite_ssr_import__('./foo', { importedNames: ['foo']});
2071+
const __vite_ssr_import_2__ = await __vite_ssr_import__('./b');
2072+
__vite_ssr_exportAll__(__vite_ssr_import_2__);
20682073
console.log(__vite_ssr_import_1__.foo + 1);
2069-
const __vite_ssr_import_0__ = await __vite_ssr_import__('./a');__vite_ssr_exportAll__(__vite_ssr_import_0__);
2070-
const __vite_ssr_import_2__ = await __vite_ssr_import__('./b');__vite_ssr_exportAll__(__vite_ssr_import_2__);
20712074
console.log(__vite_ssr_import_1__.foo + 2);",
20722075
);
20732076
}
@@ -2090,8 +2093,8 @@ Object.defineProperty(__vite_ssr_exports__, 'bar', {
20902093
}
20912094
});
20922095
const __vite_ssr_import_0__ = await __vite_ssr_import__('./foo', { importedNames: ['foo'] });
2093-
__vite_ssr_exports__.default = (0, __vite_ssr_import_0__.foo)();
20942096
const __vite_ssr_import_1__ = await __vite_ssr_import__('./bar');
2097+
__vite_ssr_exports__.default = (0, __vite_ssr_import_0__.foo)();
20952098
console.log(bar);
20962099
",
20972100
);
@@ -2295,8 +2298,8 @@ const c = () => {
22952298
const __vite_ssr_import_2__ = await __vite_ssr_import__('c');
22962299
__vite_ssr_exportAll__(__vite_ssr_import_2__);
22972300
const __vite_ssr_import_3__ = await __vite_ssr_import__('d');
2298-
__vite_ssr_dynamic_import__('e');
22992301
const __vite_ssr_import_4__ = await __vite_ssr_import__('a');
2302+
__vite_ssr_dynamic_import__('e');
23002303
";
23012304
test_same_and_deps(code, expected, &["a", "b", "c", "d"], &["e"]);
23022305
}

0 commit comments

Comments
 (0)