From 0b6aa96672fe09dd4e24a52f84d3f907f794e5dd Mon Sep 17 00:00:00 2001 From: chloe caruso Date: Sat, 15 Feb 2025 05:45:02 -0800 Subject: [PATCH] Chloe/hmr4 (#17353) Co-authored-by: Zack Radisic <56137411+zackradisic@users.noreply.github.com> Co-authored-by: Jarred Sumner --- src/bake/DevServer.zig | 490 ++++++++++++++++++------ src/bake/hmr-runtime-client.ts | 7 +- src/bundler/bundle_v2.zig | 179 ++++++--- src/css/css_internals.zig | 14 +- src/css/css_parser.zig | 24 +- src/css/printer.zig | 75 ++-- src/css/properties/transform.zig | 2 +- src/css/selectors/parser.zig | 4 +- src/css/selectors/selector.zig | 2 +- src/css/values/url.zig | 6 +- src/js_ast.zig | 2 +- test/bake/client-fixture.mjs | 11 + test/bake/dev-server-harness.ts | 174 +++++++-- test/bake/dev/css.test.ts | 283 ++++++++++---- test/js/bun/http/bun-serve-html.test.ts | 2 +- 15 files changed, 940 insertions(+), 335 deletions(-) diff --git a/src/bake/DevServer.zig b/src/bake/DevServer.zig index b89bb9aed3..33c6e29d85 100644 --- a/src/bake/DevServer.zig +++ b/src/bake/DevServer.zig @@ -896,6 +896,12 @@ pub fn attachRoutes(dev: *DevServer, server: anytype) !bool { dev, wrapGenericRequestHandler(onIncrementalVisualizer, is_ssl), ); + app.get( + internal_prefix ++ "/iv", + *DevServer, + dev, + redirectHandler(internal_prefix ++ "/incremental_visualizer", is_ssl), + ); } // Only attach a catch-all handler if the framework has filesystem router @@ -992,6 +998,22 @@ inline fn wrapGenericRequestHandler( }.handle; } +inline fn redirectHandler(comptime path: []const u8, comptime is_ssl: bool) fn ( + dev: *DevServer, + req: *Request, + resp: *uws.NewApp(is_ssl).Response, +) void { + return struct { + fn handle(dev: *DevServer, req: *Request, resp: *uws.NewApp(is_ssl).Response) void { + _ = dev; + _ = req; + resp.writeStatus("302 Found"); + resp.writeHeader("Location", path); + resp.endWithoutBody(false); + } + }.handle; +} + fn onIncrementalVisualizer(_: *DevServer, _: *Request, resp: anytype) void { resp.corked(onIncrementalVisualizerCorked, .{resp}); } @@ -1107,7 +1129,7 @@ fn ensureRouteIsBundled( switch (try checkRouteFailures(dev, route_bundle_index, resp)) { .stop => return, .ok => {}, // Errors were cleared or not in the way. - .rebuild => continue :sw .unqueued, + .rebuild => continue :sw .unqueued, // Do the build all over again } } @@ -1158,7 +1180,7 @@ fn checkRouteFailures( ) !enum { stop, ok, rebuild } { var sfa_state = std.heap.stackFallback(65536, dev.allocator); const sfa = sfa_state.get(); - var gts = try dev.initGraphTraceState(sfa); + var gts = try dev.initGraphTraceState(sfa, 0); defer gts.deinit(sfa); defer dev.incremental_result.failures_added.clearRetainingCapacity(); dev.graph_safety_lock.lock(); @@ -1349,7 +1371,7 @@ fn generateHTMLPayload(dev: *DevServer, route_bundle_index: RouteBundle.Index, r // Prepare bitsets for tracing var sfa_state = std.heap.stackFallback(65536, dev.allocator); const sfa = sfa_state.get(); - var gts = try dev.initGraphTraceState(sfa); + var gts = try dev.initGraphTraceState(sfa, 0); defer gts.deinit(sfa); // Run tracing dev.client_graph.reset(); @@ -1359,7 +1381,7 @@ fn generateHTMLPayload(dev: *DevServer, route_bundle_index: RouteBundle.Index, r const payload_size = bundled_html.len + ("").len * css_ids.len + - "".len + + "".len + client_prefix.len + "/".len + display_name.len + "-0000000000000000.js".len; @@ -1375,7 +1397,7 @@ fn generateHTMLPayload(dev: *DevServer, route_bundle_index: RouteBundle.Index, r } array.appendSliceAssumeCapacity(before_body_end); // Insert the client script tag before "" - array.appendSliceAssumeCapacity("