diff options
-rw-r--r-- | src/js_lexer.zig | 2 | ||||
-rw-r--r-- | test/bun.js/repro_631.test.js | 38 |
2 files changed, 39 insertions, 1 deletions
diff --git a/src/js_lexer.zig b/src/js_lexer.zig index c009a01db..f067392c4 100644 --- a/src/js_lexer.zig +++ b/src/js_lexer.zig @@ -624,7 +624,7 @@ fn NewLexer_( switch (lexer.code_point) { // 0 cannot be in this list because it may be a legacy octal literal - 'v', 'f', 't', 'r', 'n', '`', '\'', '"', 0x2028, 0x2029 => { + 'v', 'f', 't', 'r', 'n', '`', '\'', '"', '\\', 0x2028, 0x2029 => { lexer.step(); continue :stringLiteral; diff --git a/test/bun.js/repro_631.test.js b/test/bun.js/repro_631.test.js new file mode 100644 index 000000000..b418306dd --- /dev/null +++ b/test/bun.js/repro_631.test.js @@ -0,0 +1,38 @@ +import { expect, it } from "bun:test"; +import { bunExe } from "./bunExe.ts"; +import { bunEnv } from "./bunEnv.ts"; +import { mkdirSync, rmSync, writeFileSync, readFileSync } from "fs"; + +it("JSON strings escaped properly", async () => { + const testDir = import.meta.dir + "/repro_631/"; + + // Clean up from prior runs if necessary + rmSync(testDir, { recursive: true }); + + // Create a directory with our test package file + mkdirSync(testDir); + writeFileSync(testDir + "package.json", String.raw`{"testRegex":"\\a\n\\b\\"}`); + + // Attempt to add a package, causing the package file to be parsed, modified, + // written, and reparsed. This verifies that escaped backslashes in JSON + // survive the roundtrip + const {exitCode, stderr} = Bun.spawnSync({ + cmd: [bunExe(), "add", "left-pad"], + env: bunEnv, + cwd: testDir + }); + console.log(stderr.toString()); + expect(exitCode).toBe(0); + + const packageContents = readFileSync(testDir + "package.json", { encoding: "utf8" }); + expect(packageContents).toBe(String.raw +`{ + "testRegex": "\\a\n\\b\\", + "dependencies": { + "left-pad": "^1.3.0" + } +}`); + + //// If successful clean up test artifacts + rmSync(testDir, { recursive: true }); +}) |