aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/js_lexer.zig2
-rw-r--r--test/bun.js/repro_631.test.js38
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 });
+})