diff options
author | 2021-09-23 19:19:32 -0700 | |
---|---|---|
committer | 2021-09-23 19:19:32 -0700 | |
commit | 843391934202dbfc6113a985dd5b127db5850ca5 (patch) | |
tree | 9cc5d591b407e8fb1114a9a51a80705bf88796ca | |
parent | 8150b9aebab5c63df738fa1fca6c931cc60f5746 (diff) | |
download | bun-843391934202dbfc6113a985dd5b127db5850ca5.tar.gz bun-843391934202dbfc6113a985dd5b127db5850ca5.tar.zst bun-843391934202dbfc6113a985dd5b127db5850ca5.zip |
Safer export default transform for bundled code
Diffstat (limited to '')
-rw-r--r-- | src/js_parser/js_parser.zig | 47 | ||||
-rw-r--r-- | src/js_printer.zig | 8 |
2 files changed, 52 insertions, 3 deletions
diff --git a/src/js_parser/js_parser.zig b/src/js_parser/js_parser.zig index 74d670d00..b548416cc 100644 --- a/src/js_parser/js_parser.zig +++ b/src/js_parser/js_parser.zig @@ -682,6 +682,8 @@ const StaticSymbolName = struct { pub const @"$$m" = NewStaticSymbol("$$m"); + pub const __exportValue = NewStaticSymbol("__exportValue"); + pub const __exportDefault = NewStaticSymbol("__exportDefault"); pub const hmr = NewStaticSymbol("hmr"); }; }; @@ -3555,7 +3557,9 @@ pub fn NewParser( p.runtime_imports.@"$$lzy" = try p.declareGeneratedSymbol(.other, "$$lzy"); - p.runtime_imports.__export = GeneratedSymbol{ .ref = p.exports_ref, .primary = Ref.None, .backup = Ref.None }; + p.runtime_imports.__export = try p.declareGeneratedSymbol(.other, "__export"); + p.runtime_imports.__exportValue = try p.declareGeneratedSymbol(.other, "__exportValue"); + p.runtime_imports.__exportDefault = try p.declareGeneratedSymbol(.other, "__exportDefault"); } if (p.options.features.hot_module_reloading) { @@ -3625,6 +3629,9 @@ pub fn NewParser( p.resolveGeneratedSymbol(&p.runtime_imports.__reExport.?); p.resolveGeneratedSymbol(&p.runtime_imports.@"$$m".?); p.resolveGeneratedSymbol(&p.runtime_imports.@"$$lzy".?); + p.resolveGeneratedSymbol(&p.runtime_imports.__export.?); + p.resolveGeneratedSymbol(&p.runtime_imports.__exportValue.?); + p.resolveGeneratedSymbol(&p.runtime_imports.__exportDefault.?); } pub fn resolveHMRSymbols(p: *P) void { @@ -12431,6 +12438,15 @@ pub fn NewParser( else => {}, } } + + // When bundling, replace ExportDefault with __exportDefault(exportsRef, expr); + if (p.options.enable_bundling) { + var export_default_args = p.allocator.alloc(Expr, 2) catch unreachable; + export_default_args[0] = p.e(E.Identifier{ .ref = p.exports_ref }, expr.loc); + export_default_args[1] = expr; + stmts.append(p.s(S.SExpr{ .value = p.callRuntime(expr.loc, "__exportDefault", export_default_args) }, expr.loc)) catch unreachable; + return; + } }, .stmt => |s2| { @@ -12445,6 +12461,16 @@ pub fn NewParser( } func.func = p.visitFunc(func.func, func.func.open_parens_loc); + + if (p.options.enable_bundling) { + var export_default_args = p.allocator.alloc(Expr, 2) catch unreachable; + export_default_args[0] = p.e(E.Identifier{ .ref = p.exports_ref }, s2.loc); + export_default_args[1] = p.e(E.Function{ .func = func.func }, s2.loc); + + stmts.append(p.s(S.SExpr{ .value = p.callRuntime(s2.loc, "__exportDefault", export_default_args) }, s2.loc)) catch unreachable; + return; + } + stmts.append(stmt.*) catch unreachable; // if (func.func.name != null and func.func.name.?.ref != null) { @@ -12455,7 +12481,16 @@ pub fn NewParser( }, .s_class => |class| { var shadow_ref = p.visitClass(s2.loc, &class.class); - stmts.appendSlice(p.lowerClass(js_ast.StmtOrExpr{ .stmt = stmt.* }, shadow_ref)) catch unreachable; + if (p.options.enable_bundling) { + var export_default_args = p.allocator.alloc(Expr, 2) catch unreachable; + export_default_args[0] = p.e(E.Identifier{ .ref = p.exports_ref }, s2.loc); + export_default_args[1] = p.e(class.class, s2.loc); + + stmts.append(p.s(S.SExpr{ .value = p.callRuntime(s2.loc, "__exportDefault", export_default_args) }, s2.loc)) catch unreachable; + return; + } + + stmts.append(stmt.*) catch unreachable; return; }, else => {}, @@ -12464,6 +12499,14 @@ pub fn NewParser( } }, .s_export_equals => |data| { + if (p.options.enable_bundling) { + var export_default_args = p.allocator.alloc(Expr, 2) catch unreachable; + export_default_args[0] = p.e(E.Identifier{ .ref = p.exports_ref }, stmt.loc); + export_default_args[1] = data.value; + + stmts.append(p.s(S.SExpr{ .value = p.callRuntime(stmt.loc, "__exportDefault", export_default_args) }, stmt.loc)) catch unreachable; + return; + } // "module.exports = value" stmts.append( diff --git a/src/js_printer.zig b/src/js_printer.zig index fc9ee97d7..c73e03464 100644 --- a/src/js_printer.zig +++ b/src/js_printer.zig @@ -2313,6 +2313,7 @@ pub fn NewPrinter( switch (s.value) { .expr => |expr| { + // this is still necessary for JSON if (is_inside_bundle) { p.printModuleExportSymbol(); p.print(".default = "); @@ -2483,7 +2484,12 @@ pub fn NewPrinter( // Object.assign(__export, {prop1, prop2, prop3}); else => { - p.print("Object.assign"); + if (comptime is_inside_bundle) { + p.printSymbol(p.options.runtime_imports.__exportValue.?.ref); + } else { + p.print("Object.assign"); + } + p.print("("); p.printModuleExportSymbol(); p.print(", {"); |