aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2022-02-08 01:00:46 -0800
committerGravatar Jarred Sumner <jarred@jarredsumner.com> 2022-02-08 01:00:46 -0800
commitd4afa5477ddb3546fb9f6e88821cf1bc57316294 (patch)
treea41f62b9190410545ddae18f8ac1fdeced8f6d87
parent7792ef1bde9f753ea0285d2afa408eaa26f11959 (diff)
downloadbun-d4afa5477ddb3546fb9f6e88821cf1bc57316294.tar.gz
bun-d4afa5477ddb3546fb9f6e88821cf1bc57316294.tar.zst
bun-d4afa5477ddb3546fb9f6e88821cf1bc57316294.zip
Move __exportDefault transform to parser
-rw-r--r--src/js_parser/js_parser.zig38
-rw-r--r--src/js_printer.zig16
2 files changed, 42 insertions, 12 deletions
diff --git a/src/js_parser/js_parser.zig b/src/js_parser/js_parser.zig
index 745688e61..0f2f66842 100644
--- a/src/js_parser/js_parser.zig
+++ b/src/js_parser/js_parser.zig
@@ -313,7 +313,7 @@ pub const ImportScanner = struct {
kept_import_equals: bool = false,
removed_import_equals: bool = false,
- pub fn scan(comptime P: type, p: P, stmts: []Stmt) !ImportScanner {
+ pub fn scan(comptime P: type, p: P, stmts: []Stmt, will_transform_to_common_js: bool) !ImportScanner {
var scanner = ImportScanner{};
var stmts_end: usize = 0;
const allocator = p.allocator;
@@ -746,6 +746,25 @@ pub const ImportScanner = struct {
},
}
}
+ } else if (will_transform_to_common_js) {
+ const expr: js_ast.Expr = switch (st.value) {
+ .expr => |exp| exp,
+ .stmt => |s2| brk2: {
+ switch (s2.data) {
+ .s_function => |func| {
+ break :brk2 p.e(E.Function{ .func = func.func }, s2.loc);
+ },
+ .s_class => |class| {
+ break :brk2 p.e(class.class, s2.loc);
+ },
+ else => unreachable,
+ }
+ },
+ };
+ var export_default_args = p.allocator.alloc(Expr, 2) catch unreachable;
+ export_default_args[0] = p.@"module.exports"(expr.loc);
+ export_default_args[1] = expr;
+ stmt = p.s(S.SExpr{ .value = p.callRuntime(expr.loc, "__exportDefault", export_default_args) }, expr.loc);
}
},
.s_export_clause => |st| {
@@ -2159,6 +2178,12 @@ pub const Parser = struct {
exports_kind = .cjs;
if (p.options.transform_require_to_import) {
var args = p.allocator.alloc(Expr, 2) catch unreachable;
+
+ if (p.runtime_imports.__exportDefault == null and p.has_export_default) {
+ p.runtime_imports.__exportDefault = try p.declareGeneratedSymbol(.other, "__exportDefault");
+ p.resolveGeneratedSymbol(&p.runtime_imports.__exportDefault.?);
+ }
+
wrapper_expr = p.callRuntime(logger.Loc.Empty, "__cJS2eSM", args);
p.resolveGeneratedSymbol(&p.runtime_imports.__cJS2eSM.?);
@@ -2945,6 +2970,9 @@ pub fn NewParser(
scopes_in_order_visitor_index: usize = 0,
has_classic_runtime_warned: bool = false,
+ /// Used for transforming export default -> module.exports
+ has_export_default: bool = false,
+
hmr_module: GeneratedSymbol = GeneratedSymbol{ .primary = Ref.None, .backup = Ref.None, .ref = Ref.None },
has_called_runtime: bool = false,
@@ -5344,6 +5372,7 @@ pub fn NewParser(
var expr = try p.parseSuffix(prefix_expr, Level.comma, null, Expr.EFlags.none);
try p.lexer.expectOrInsertSemicolon();
var value = js_ast.StmtOrExpr{ .expr = expr };
+ p.has_export_default = true;
return p.s(S.ExportDefault{ .default_name = defaultName, .value = value }, loc);
}
@@ -5377,7 +5406,7 @@ pub fn NewParser(
break :default_name_getter createDefaultName(p, defaultLoc) catch unreachable;
};
-
+ p.has_export_default = true;
return p.s(
S.ExportDefault{ .default_name = default_name, .value = js_ast.StmtOrExpr{ .stmt = stmt } },
loc,
@@ -5421,7 +5450,7 @@ pub fn NewParser(
break :default_name_getter createDefaultName(p, defaultLoc) catch unreachable;
};
-
+ p.has_export_default = true;
return p.s(S.ExportDefault{ .default_name = default_name, .value = js_ast.StmtOrExpr{ .stmt = stmt } }, loc);
},
else => {
@@ -5461,6 +5490,7 @@ pub fn NewParser(
break :default_name_getter createDefaultName(p, defaultLoc) catch unreachable;
};
+ p.has_export_default = true;
return p.s(
S.ExportDefault{
.default_name = default_name,
@@ -14697,7 +14727,7 @@ pub fn NewParser(
p.import_records_for_current_part.shrinkRetainingCapacity(0);
p.declared_symbols.shrinkRetainingCapacity(0);
- var result = try ImportScanner.scan(*P, p, part.stmts);
+ var result = try ImportScanner.scan(*P, p, part.stmts, commonjs_wrapper_expr != null);
kept_import_equals = kept_import_equals or result.kept_import_equals;
removed_import_equals = removed_import_equals or result.removed_import_equals;
part.import_record_indices = part.import_record_indices;
diff --git a/src/js_printer.zig b/src/js_printer.zig
index e48af9caa..f8f56d91a 100644
--- a/src/js_printer.zig
+++ b/src/js_printer.zig
@@ -2551,7 +2551,7 @@ pub fn NewPrinter(
p.printIndent();
p.printSpaceBeforeIdentifier();
- if (!is_inside_bundle and !rewrite_esm_to_cjs) {
+ if (!is_inside_bundle) {
p.print("export default");
}
@@ -2560,7 +2560,7 @@ pub fn NewPrinter(
switch (s.value) {
.expr => |expr| {
// this is still necessary for JSON
- if (is_inside_bundle or rewrite_esm_to_cjs) {
+ if (is_inside_bundle) {
p.printModuleExportSymbol();
p.print(" = ");
}
@@ -2576,7 +2576,7 @@ pub fn NewPrinter(
switch (s2.data) {
.s_function => |func| {
p.printSpaceBeforeIdentifier();
- if (is_inside_bundle or rewrite_esm_to_cjs) {
+ if (is_inside_bundle) {
if (func.func.name == null) {
p.printModuleExportSymbol();
p.print(" = ");
@@ -2601,7 +2601,7 @@ pub fn NewPrinter(
p.printFunc(func.func);
- if (is_inside_bundle or rewrite_esm_to_cjs) {
+ if (is_inside_bundle) {
p.printSemicolonAfterStatement();
}
@@ -2611,14 +2611,14 @@ pub fn NewPrinter(
p.printBundledExport("default", p.renamer.nameForSymbol(name.ref.?));
p.printSemicolonAfterStatement();
}
- } else if (!rewrite_esm_to_cjs) {
+ } else {
p.printNewline();
}
},
.s_class => |class| {
p.printSpaceBeforeIdentifier();
- if (is_inside_bundle or rewrite_esm_to_cjs) {
+ if (is_inside_bundle) {
if (class.class.class_name == null) {
p.printModuleExportSymbol();
p.print(" = ");
@@ -2634,7 +2634,7 @@ pub fn NewPrinter(
p.printClass(class.class);
- if (is_inside_bundle or rewrite_esm_to_cjs) {
+ if (is_inside_bundle) {
p.printSemicolonAfterStatement();
}
@@ -2644,7 +2644,7 @@ pub fn NewPrinter(
p.printBundledExport("default", p.renamer.nameForSymbol(name.ref.?));
p.printSemicolonAfterStatement();
}
- } else if (!rewrite_esm_to_cjs) {
+ } else {
p.printNewline();
}
},