aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/feature_flags.zig2
-rw-r--r--src/js_parser.zig82
2 files changed, 54 insertions, 30 deletions
diff --git a/src/feature_flags.zig b/src/feature_flags.zig
index d686a4909..cdfeacb10 100644
--- a/src/feature_flags.zig
+++ b/src/feature_flags.zig
@@ -168,3 +168,5 @@ pub const boundary_based_chunking = true;
pub const source_map_debug_id = true;
pub const alignment_tweak = false;
+
+pub const export_star_redirect = false;
diff --git a/src/js_parser.zig b/src/js_parser.zig
index d312c34c8..bf73f0491 100644
--- a/src/js_parser.zig
+++ b/src/js_parser.zig
@@ -3307,40 +3307,62 @@ pub const Parser = struct {
}
}
}
- } else if (p.options.bundle and parts.items.len == 0)
- // If the file only contains "export * from './blah'
- // we pretend the file never existed in the first place.
- // the semantic difference here is in export default statements
- export_star_redirect: {
- // note: export_star_import_records are not filled in yet
- if (before.items.len > 0 and p.import_records.items.len == 1) {
- var export_star_redirect: ?js_ast.Result = null;
- for (before.items) |part| {
- for (part.stmts) |stmt| {
- switch (stmt.data) {
- .s_export_star => |star| {
- if (star.alias != null) {
- break :export_star_redirect;
- }
+ } else if (p.options.bundle and parts.items.len == 0) {
+ // This flag is disabled because it breaks circular export * as from
+ //
+ // entry.js:
+ //
+ // export * from './foo';
+ //
+ // foo.js:
+ //
+ // export const foo = 123
+ // export * as ns from './foo'
+ //
+ if (comptime FeatureFlags.export_star_redirect) {
+ // If the file only contains "export * from './blah'
+ // we pretend the file never existed in the first place.
+ // the semantic difference here is in export default statements
+ // note: export_star_import_records are not filled in yet
+
+ if (before.items.len > 0 and p.import_records.items.len == 1) {
+ var export_star_redirect: ?*S.ExportStar = brk: {
+ var export_star: ?*S.ExportStar = null;
+ for (before.items) |part| {
+ for (part.stmts) |stmt| {
+ switch (stmt.data) {
+ .s_export_star => |star| {
+ if (star.alias != null) {
+ break :brk null;
+ }
- export_star_redirect = js_ast.Result{
- .ast = .{
- .allocator = p.allocator,
- .import_records = ImportRecord.List.init(p.import_records.items),
- .redirect_import_record_index = star.import_record_index,
- .named_imports = p.named_imports,
- .named_exports = p.named_exports,
+ if (export_star != null) {
+ break :brk null;
+ }
+
+ export_star = star;
},
- };
- },
- .s_empty, .s_comment => {},
- else => break :export_star_redirect,
+ .s_empty, .s_comment => {},
+ else => {
+ break :brk null;
+ },
+ }
+ }
}
- }
- }
+ break :brk export_star;
+ };
- if (export_star_redirect) |redirect| {
- return redirect;
+ if (export_star_redirect) |star| {
+ return js_ast.Result{
+ .ast = .{
+ .allocator = p.allocator,
+ .import_records = ImportRecord.List.init(p.import_records.items),
+ .redirect_import_record_index = star.import_record_index,
+ .named_imports = p.named_imports,
+ .named_exports = p.named_exports,
+ },
+ };
+ }
}
}
}