aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/js_lexer.zig2
-rw-r--r--test/regression/issue/4893.test.ts23
2 files changed, 24 insertions, 1 deletions
diff --git a/src/js_lexer.zig b/src/js_lexer.zig
index 01852bb65..47b6fdcb9 100644
--- a/src/js_lexer.zig
+++ b/src/js_lexer.zig
@@ -642,7 +642,7 @@ fn NewLexer_(
lexer.step();
// Handle Windows CRLF
- if (lexer.code_point == 'r' and comptime !is_json) {
+ if (lexer.code_point == '\r' and comptime !is_json) {
lexer.step();
if (lexer.code_point == '\n') {
lexer.step();
diff --git a/test/regression/issue/4893.test.ts b/test/regression/issue/4893.test.ts
new file mode 100644
index 000000000..43850693b
--- /dev/null
+++ b/test/regression/issue/4893.test.ts
@@ -0,0 +1,23 @@
+import { bunEnv, bunExe } from "harness";
+import { mkdirSync, rmSync, writeFileSync, readFileSync, mkdtempSync } from "fs";
+import { tmpdir } from "os";
+import { join } from "path";
+
+it("correctly handles CRLF multiline string in CRLF terminated files", async () => {
+ const testDir = mkdtempSync(join(tmpdir(), "issue4893-"));
+
+ // Clean up from prior runs if necessary
+ rmSync(testDir, { recursive: true, force: true });
+
+ // Create a directory with our test CRLF terminated file
+ mkdirSync(testDir, { recursive: true });
+ writeFileSync(join(testDir, "crlf.js"), '"a\\\r\nb"');
+
+ const { stdout, exitCode } = Bun.spawnSync({
+ cmd: [bunExe(), "run", join(testDir, "crlf.js")],
+ env: bunEnv,
+ stderr: "inherit",
+ });
+
+ expect(exitCode).toBe(0);
+});