From 8adad6fa61af573aacba917d327ec2302db6182f Mon Sep 17 00:00:00 2001 From: egrs Date: Mon, 9 Mar 2026 08:58:07 +0100 Subject: [PATCH] fix module re-import when previous compilation failed When a module's compilation fails after its imported_modules entry has been consumed by waitForImport, sibling modules that import the same dependency would get UnknownModule errors. Fix by re-preloading modules whose cache entry exists but has no compiled module. --- src/browser/js/Context.zig | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/browser/js/Context.zig b/src/browser/js/Context.zig index 7400744e..9180223c 100644 --- a/src/browser/js/Context.zig +++ b/src/browser/js/Context.zig @@ -535,6 +535,14 @@ fn postCompileModule(self: *Context, mod: js.Module, url: [:0]const u8, local: * nested_gop.key_ptr.* = owned_specifier; nested_gop.value_ptr.* = .{}; try script_manager.preloadImport(owned_specifier, url); + } else if (nested_gop.value_ptr.module == null) { + // Entry exists but module failed to compile previously. + // The imported_modules entry may have been consumed, so + // re-preload to ensure waitForImport can find it. + // Key was stored via dupeZ so it has a sentinel in memory. + const key = nested_gop.key_ptr.*; + const key_z: [:0]const u8 = key.ptr[0..key.len :0]; + try script_manager.preloadImport(key_z, url); } } } @@ -683,7 +691,15 @@ fn _resolveModuleCallback(self: *Context, referrer: js.Module, specifier: [:0]co return local.toLocal(m).handle; } - var source = try self.script_manager.?.waitForImport(normalized_specifier); + var source = self.script_manager.?.waitForImport(normalized_specifier) catch |err| switch (err) { + error.UnknownModule => blk: { + // Module is in cache but was consumed from imported_modules + // (e.g., by a previous failed resolution). Re-preload and retry. + try self.script_manager.?.preloadImport(normalized_specifier, referrer_path); + break :blk try self.script_manager.?.waitForImport(normalized_specifier); + }, + else => return err, + }; defer source.deinit(); var try_catch: js.TryCatch = undefined;