diff --git a/src/ast/Parser.zig b/src/ast/Parser.zig index e0e6c7acd5..bc882d7ac1 100644 --- a/src/ast/Parser.zig +++ b/src/ast/Parser.zig @@ -1494,7 +1494,7 @@ pub const Parser = struct { var state: PragmaState = .{}; - while (cursor < self.lexer.end) : (cursor += 1) { + while (cursor < end) : (cursor += 1) { switch (contents[cursor]) { '\n' => break, '@' => { diff --git a/test/bundler/bundler_banner.test.ts b/test/bundler/bundler_banner.test.ts index 19bed4f424..a4db75a7eb 100644 --- a/test/bundler/bundler_banner.test.ts +++ b/test/bundler/bundler_banner.test.ts @@ -203,4 +203,33 @@ module.exports = 1;`, `); }, }); + + itBundled("banner/SourceHashbangWithBytecodeAndCJSTargetBun", { + banner: "// Copyright 2024 Example Corp", + format: "cjs", + target: "bun", + bytecode: true, + outdir: "/out", + minifyWhitespace: true, + backend: "api", + files: { + "/a.js": `#!/usr/bin/env bun +module.exports = 1; +console.log("bun!");`, + }, + onAfterBundle(api) { + const content = api.readFile("/out/a.js"); + // Shebang from source should come first, then @bun pragma + expect(content).toMatchInlineSnapshot(` + "#!/usr/bin/env bun + // @bun @bytecode @bun-cjs + (function(exports, require, module, __filename, __dirname) {// Copyright 2024 Example Corp + module.exports=1;console.log("bun!");}) + " + `); + }, + run: { + stdout: "bun!\n", + }, + }); });