Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 15 additions & 12 deletions crates/oxc_transformer/src/plugins/module_runner_transform.rs
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ impl<'a> ModuleRunnerTransform<'a> {
}
Statement::ExportAllDeclaration(export) => {
self.transform_export_all_declaration(
&mut new_stmts,
&mut hoist_imports,
&mut hoist_exports,
export,
ctx,
Expand All @@ -159,6 +159,7 @@ impl<'a> ModuleRunnerTransform<'a> {
Statement::ExportNamedDeclaration(export) => {
self.transform_export_named_declaration(
&mut new_stmts,
&mut hoist_imports,
&mut hoist_exports,
export,
ctx,
Expand Down Expand Up @@ -378,6 +379,7 @@ impl<'a> ModuleRunnerTransform<'a> {
fn transform_export_named_declaration(
&mut self,
new_stmts: &mut ArenaVec<'a, Statement<'a>>,
hoist_imports: &mut Vec<Statement<'a>>,
hoist_exports: &mut Vec<Statement<'a>>,
export: ArenaBox<'a, ExportNamedDeclaration<'a>>,
ctx: &mut TraverseCtx<'a>,
Expand Down Expand Up @@ -433,7 +435,7 @@ impl<'a> ModuleRunnerTransform<'a> {
Argument::from(Expression::StringLiteral(ctx.ast.alloc(source))),
Self::create_imported_names_object(imported_names, ctx),
]);
new_stmts.push(Self::create_import(SPAN, pattern, arguments, ctx));
hoist_imports.push(Self::create_import(SPAN, pattern, arguments, ctx));
binding
});

Expand Down Expand Up @@ -479,7 +481,7 @@ impl<'a> ModuleRunnerTransform<'a> {
/// ```
fn transform_export_all_declaration(
&mut self,
new_stmts: &mut ArenaVec<'a, Statement<'a>>,
hoist_imports: &mut Vec<Statement<'a>>,
hoist_exports: &mut Vec<Statement<'a>>,
export: ArenaBox<'a, ExportAllDeclaration<'a>>,
ctx: &mut TraverseCtx<'a>,
Expand All @@ -498,16 +500,16 @@ impl<'a> ModuleRunnerTransform<'a> {
// `export * as foo from 'vue'` ->
// `Object.defineProperty(__vite_ssr_exports__, 'foo', { enumerable: true, configurable: true, get(){ return __vite_ssr_import_0__ } });`
let export = Self::create_export(span, ident, exported.name(), ctx);
new_stmts.push(import);
hoist_imports.push(import);
hoist_exports.push(export);
} else {
let callee = ctx.ast.expression_identifier(SPAN, SSR_EXPORT_ALL_KEY);
let arguments = ctx.ast.vec1(Argument::from(ident));
// `export * from 'vue'` -> `__vite_ssr_exportAll__(__vite_ssr_import_0__);`
let call = ctx.ast.expression_call(SPAN, callee, NONE, arguments, false);
let export = ctx.ast.statement_expression(span, call);
// we cannot hoist this case, so keep at the same position
new_stmts.extend([import, export]);
// names from `export *` cannot be known, so add it right after the import.
hoist_imports.extend([import, export]);
}
}

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

#[test]
fn export_then_import_minified() {
// `import` is hoisted but `export * from` is not. this is an expected behavior.
test_same(
"export * from 'vue';import {createApp} from 'vue'",
"
const __vite_ssr_import_1__ = await __vite_ssr_import__('vue', { importedNames: ['createApp'] });
const __vite_ssr_import_0__ = await __vite_ssr_import__('vue');
__vite_ssr_exportAll__(__vite_ssr_import_0__);
const __vite_ssr_import_1__ = await __vite_ssr_import__('vue', { importedNames: ['createApp'] });
",
);
}
Expand Down Expand Up @@ -2064,10 +2065,12 @@ __vite_ssr_dynamic_import__('./bar.json', { with: { type: 'json' } });",
export * from './b'
console.log(foo + 2)",
"
const __vite_ssr_import_0__ = await __vite_ssr_import__('./a');
__vite_ssr_exportAll__(__vite_ssr_import_0__);
const __vite_ssr_import_1__ = await __vite_ssr_import__('./foo', { importedNames: ['foo']});
const __vite_ssr_import_2__ = await __vite_ssr_import__('./b');
__vite_ssr_exportAll__(__vite_ssr_import_2__);
console.log(__vite_ssr_import_1__.foo + 1);
const __vite_ssr_import_0__ = await __vite_ssr_import__('./a');__vite_ssr_exportAll__(__vite_ssr_import_0__);
const __vite_ssr_import_2__ = await __vite_ssr_import__('./b');__vite_ssr_exportAll__(__vite_ssr_import_2__);
console.log(__vite_ssr_import_1__.foo + 2);",
);
}
Expand All @@ -2090,8 +2093,8 @@ Object.defineProperty(__vite_ssr_exports__, 'bar', {
}
});
const __vite_ssr_import_0__ = await __vite_ssr_import__('./foo', { importedNames: ['foo'] });
__vite_ssr_exports__.default = (0, __vite_ssr_import_0__.foo)();
const __vite_ssr_import_1__ = await __vite_ssr_import__('./bar');
__vite_ssr_exports__.default = (0, __vite_ssr_import_0__.foo)();
console.log(bar);
",
);
Expand Down Expand Up @@ -2295,8 +2298,8 @@ const c = () => {
const __vite_ssr_import_2__ = await __vite_ssr_import__('c');
__vite_ssr_exportAll__(__vite_ssr_import_2__);
const __vite_ssr_import_3__ = await __vite_ssr_import__('d');
__vite_ssr_dynamic_import__('e');
const __vite_ssr_import_4__ = await __vite_ssr_import__('a');
__vite_ssr_dynamic_import__('e');
";
test_same_and_deps(code, expected, &["a", "b", "c", "d"], &["e"]);
}
Expand Down
Loading