aboutsummaryrefslogtreecommitdiff
path: root/src/bundler/bundle_v2.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/bundler/bundle_v2.zig')
-rw-r--r--src/bundler/bundle_v2.zig102
1 files changed, 70 insertions, 32 deletions
diff --git a/src/bundler/bundle_v2.zig b/src/bundler/bundle_v2.zig
index 0a5b238b0..a94f74cba 100644
--- a/src/bundler/bundle_v2.zig
+++ b/src/bundler/bundle_v2.zig
@@ -2673,6 +2673,7 @@ const LinkerContext = struct {
var lazy_exports: []bool = this.graph.ast.items(.has_lazy_export);
var symbols = &this.graph.symbols;
defer this.graph.symbols = symbols.*;
+ var commonjs_named_exports: []js_ast.Ast.CommonJSNamedExports = this.graph.ast.items(.commonjs_named_exports);
// Step 1: Figure out what modules must be CommonJS
for (reachable) |source_index_| {
@@ -5344,8 +5345,8 @@ const LinkerContext = struct {
loc,
),
.value = Expr.init(
- E.Require,
- E.Require{
+ E.RequireString,
+ E.RequireString{
.import_record_index = import_record_index,
},
loc,
@@ -5389,8 +5390,8 @@ const LinkerContext = struct {
loc,
),
.value = Expr.init(
- E.Require,
- E.Require{
+ E.RequireString,
+ E.RequireString{
.import_record_index = import_record_index,
},
loc,
@@ -5692,8 +5693,8 @@ const LinkerContext = struct {
}
break :brk Expr.init(
- E.Require,
- E.Require{
+ E.RequireString,
+ E.RequireString{
.import_record_index = s.import_record_index,
},
stmt.loc,
@@ -5850,7 +5851,30 @@ const LinkerContext = struct {
stmt.loc,
);
stmt.data.s_local.is_export = false;
-
+ } else if (FeatureFlags.unwrap_commonjs_to_esm and s.was_commonjs_export and wrap == .cjs) {
+ std.debug.assert(stmt.data.s_local.decls.len == 1);
+ const decl = stmt.data.s_local.decls[0];
+ stmt = Stmt.alloc(
+ S.SExpr,
+ S.SExpr{
+ .value = Expr.init(
+ E.Binary,
+ E.Binary{
+ .op = .bin_assign,
+ .left = Expr.init(
+ E.CommonJSExportIdentifier,
+ E.CommonJSExportIdentifier{
+ .ref = decl.binding.data.b_identifier.ref,
+ },
+ decl.binding.loc,
+ ),
+ .right = decl.value orelse Expr.init(E.Undefined, E.Undefined{}, Logger.Loc.Empty),
+ },
+ stmt.loc,
+ ),
+ },
+ stmt.loc,
+ );
}
},
@@ -5986,7 +6010,10 @@ const LinkerContext = struct {
// const resolved_exports: []ResolvedExports = c.graph.meta.items(.resolved_exports);
const all_flags: []const JSMeta.Flags = c.graph.meta.items(.flags);
const flags = all_flags[part_range.source_index.get()];
- const wrapper_part_index = c.graph.meta.items(.wrapper_part_index)[part_range.source_index.get()];
+ const wrapper_part_index = if (flags.wrap != .none)
+ c.graph.meta.items(.wrapper_part_index)[part_range.source_index.get()]
+ else
+ Index.invalid;
// referencing everything by array makes the code a lot more annoying :(
const ast: js_ast.Ast = c.graph.ast.get(part_range.source_index.get());
@@ -6041,7 +6068,6 @@ const LinkerContext = struct {
const index = part_range.part_index_begin + @truncate(u32, index_);
if (!part.is_live) {
// Skip the part if it's not in this chunk
-
continue;
}
@@ -6175,17 +6201,20 @@ const LinkerContext = struct {
// TODO: mergeAdjacentLocalStmts
var out_stmts: []js_ast.Stmt = stmts.all_stmts.items;
+
// Optionally wrap all statements in a closure
if (needs_wrapper) {
switch (flags.wrap) {
.cjs => {
+ var uses_exports_ref = ast.uses_exports_ref;
+
// Only include the arguments that are actually used
var args = std.ArrayList(js_ast.G.Arg).initCapacity(
temp_allocator,
- if (ast.uses_module_ref or ast.uses_exports_ref) 2 else 0,
+ if (ast.uses_module_ref or uses_exports_ref) 2 else 0,
) catch unreachable;
- if (ast.uses_module_ref or ast.uses_exports_ref) {
+ if (ast.uses_module_ref or uses_exports_ref) {
args.appendAssumeCapacity(
js_ast.G.Arg{
.binding = js_ast.Binding.alloc(
@@ -6310,30 +6339,32 @@ const LinkerContext = struct {
var stmt: Stmt = stmt_;
switch (stmt.data) {
.s_local => |local| {
- var value: Expr = Expr.init(E.Missing, E.Missing{}, Logger.Loc.Empty);
- for (local.decls) |*decl| {
- const binding = decl.binding.toExpr(&hoisty);
- if (decl.value) |other| {
- value = value.joinWithComma(
- binding.assign(
- other,
+ if (local.was_commonjs_export or ast.commonjs_named_exports.count() == 0) {
+ var value: Expr = Expr.init(E.Missing, E.Missing{}, Logger.Loc.Empty);
+ for (local.decls) |*decl| {
+ const binding = decl.binding.toExpr(&hoisty);
+ if (decl.value) |other| {
+ value = value.joinWithComma(
+ binding.assign(
+ other,
+ temp_allocator,
+ ),
temp_allocator,
- ),
- temp_allocator,
- );
+ );
+ }
}
- }
- if (value.isEmpty()) {
- continue;
+ if (value.isEmpty()) {
+ continue;
+ }
+ stmt = Stmt.alloc(
+ S.SExpr,
+ S.SExpr{
+ .value = value,
+ },
+ stmt.loc,
+ );
}
- stmt = Stmt.alloc(
- S.SExpr,
- S.SExpr{
- .value = value,
- },
- stmt.loc,
- );
},
.s_class, .s_function => {
stmts.outside_wrapper_prefix.append(stmt) catch unreachable;
@@ -6347,7 +6378,7 @@ const LinkerContext = struct {
inner_stmts.len = end;
}
- if (!c.options.minify_syntax and hoisty.decls.items.len > 0) {
+ if (hoisty.decls.items.len > 0) {
stmts.outside_wrapper_prefix.append(
Stmt.alloc(
S.Local,
@@ -6443,6 +6474,7 @@ const LinkerContext = struct {
.commonjs_named_exports = ast.commonjs_named_exports,
.commonjs_named_exports_ref = ast.exports_ref,
+ .commonjs_named_exports_deoptimized = flags.wrap == .cjs,
.const_values = c.graph.const_values,
.allocator = allocator,
@@ -6813,6 +6845,12 @@ const LinkerContext = struct {
for (_parts, 0..) |part, part_index| {
var can_be_removed_if_unused = part.can_be_removed_if_unused;
+ if (can_be_removed_if_unused and part.tag == .commonjs_named_export) {
+ if (c.graph.meta.items(.flags)[id].wrap == .cjs) {
+ can_be_removed_if_unused = false;
+ }
+ }
+
// Also include any statement-level imports
for (part.import_record_indices.slice()) |import_record_Index| {
var record: *ImportRecord = &import_records[source_index].slice()[import_record_Index];