diff options
author | 2023-02-10 19:05:32 -0800 | |
---|---|---|
committer | 2023-02-10 19:05:32 -0800 | |
commit | c208c4e3197920ae4bf78463cc91014ede8dd951 (patch) | |
tree | 4fdeac0536a2417e3a2f4af0c62fa65e62177e0f | |
parent | 10650cced26da994c29ac482674f010523d365c2 (diff) | |
download | bun-c208c4e3197920ae4bf78463cc91014ede8dd951.tar.gz bun-c208c4e3197920ae4bf78463cc91014ede8dd951.tar.zst bun-c208c4e3197920ae4bf78463cc91014ede8dd951.zip |
Fix #631: bun add throwing JSON lexer bug (#2041)
* add double-backslash to list of control chars
* update test
* stderr as string
-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 }); +}) |