diff --git a/src/ast/repl_transforms.zig b/src/ast/repl_transforms.zig index dffac8c849..026036607b 100644 --- a/src/ast/repl_transforms.zig +++ b/src/ast/repl_transforms.zig @@ -68,11 +68,10 @@ pub fn ReplTransforms(comptime P: type) type { for (all_stmts) |stmt| { switch (stmt.data) { .s_local => |local| { - // Hoist the declaration, convert const to let for REPL mutability - const kind: S.Local.Kind = switch (local.kind) { - .k_const => .k_let, - else => local.kind, - }; + // Hoist all declarations as var so they become context properties + // In sloppy mode, var at top level becomes a property of the global/context object + // This is essential for REPL variable persistence across vm.runInContext calls + const kind: S.Local.Kind = .k_var; // Extract individual identifiers from binding patterns for hoisting var hoisted_decl_list = ListManaged(G.Decl).init(allocator); @@ -211,11 +210,9 @@ pub fn ReplTransforms(comptime P: type) type { for (all_stmts) |stmt| { switch (stmt.data) { .s_local => |local| { - // Hoist the declaration, convert const to let - const kind: S.Local.Kind = switch (local.kind) { - .k_const => .k_let, - else => local.kind, - }; + // Hoist all declarations as var so they become context properties + // In sloppy mode, var at top level becomes a property of the global/context object + const kind: S.Local.Kind = .k_var; // Extract individual identifiers from binding patterns for hoisting var hoisted_decl_list = ListManaged(G.Decl).init(allocator); diff --git a/test/js/bun/transpiler/repl-transform.test.ts b/test/js/bun/transpiler/repl-transform.test.ts index de7fda4929..2c8c730792 100644 --- a/test/js/bun/transpiler/repl-transform.test.ts +++ b/test/js/bun/transpiler/repl-transform.test.ts @@ -19,16 +19,18 @@ describe("Bun.Transpiler replMode", () => { expect(result).toContain("async"); }); - test("const becomes let with await", async () => { + test("const becomes var with await", async () => { const result = transpiler.transformSync("const x = await 1"); - // const should become let for REPL persistence - expect(result).toContain("let x"); + // const should become var for REPL persistence (becomes context property) + expect(result).toContain("var x"); expect(result).not.toContain("const x"); }); - test("let declaration hoisted with await", async () => { + test("let becomes var with await", async () => { const result = transpiler.transformSync("let x = await 1"); - expect(result).toContain("let x"); + // let should become var for REPL persistence (becomes context property) + expect(result).toContain("var x"); + expect(result).not.toContain("let x"); expect(result).toContain("async"); });