Skip to content

Commit 993413a

Browse files
committed
Add more tests for escape characters
1 parent e86eebc commit 993413a

File tree

2 files changed

+35
-6
lines changed

2 files changed

+35
-6
lines changed

libs/langchain-core/src/utils/json.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ export function strictParsePartialJson(s: string): unknown {
7373
result += "\\";
7474
} else if (char === '"') {
7575
result += '"';
76+
} else if (char === "b") {
77+
result += "\b";
78+
} else if (char === "f") {
79+
result += "\f";
80+
} else if (char === "/") {
81+
result += "/";
7682
} else if (char === "u") {
7783
const hex = buffer.substring(pos + 1, pos + 5);
7884
if (/^[0-9A-Fa-f]{0,4}$/.test(hex)) {
@@ -106,6 +112,7 @@ export function strictParsePartialJson(s: string): unknown {
106112
pos += 1;
107113
}
108114

115+
if (escaped) result += "\\";
109116
return result;
110117
}
111118

libs/langchain-core/src/utils/tests/json.test.ts

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ it("array", () => {
3030
expectPartialJson("[null,").toEqual([null]);
3131
expectPartialJson("[null,t").toEqual([null, true]);
3232
expectPartialJson("[null,{").toEqual([null, {}]);
33+
expectPartialJson('[null,{"').toEqual([null, {}]);
34+
expectPartialJson('[null,{"a').toEqual([null, { a: undefined }]);
35+
expectPartialJson('[null,{"a"').toEqual([null, { a: undefined }]);
36+
expectPartialJson('[null,{"a":').toEqual([null, { a: undefined }]);
3337
expectPartialJson('[null,{"a":1').toEqual([null, { a: 1 }]);
3438

3539
expect(() => expectPartialJson("[n,")).toThrow();
@@ -41,13 +45,31 @@ it("strings", () => {
4145
expectPartialJson('"hello').toBe("hello");
4246
expectPartialJson('"hello"').toBe("hello");
4347

44-
expectPartialJson('"15\\n\t\r"').toBe("15\n\t\r");
48+
expectPartialJson(String.raw`"15\n\t\r`).toBe("15\n\t\r");
4549

46-
expectPartialJson('"15\\u').toBe("15u");
47-
expectPartialJson('"15\\u00').toBe("15u00");
48-
expectPartialJson('"15\\u00f').toBe("15u00f");
49-
expectPartialJson('"15\\u00f8').toBe("15\u00f8");
50-
expectPartialJson('"15\\u00f8C').toBe("15\u00f8C");
50+
expectPartialJson(`"15\\u`).toBe("15u");
51+
expectPartialJson(`"15\\u00`).toBe("15u00");
52+
expectPartialJson(`"15\\u00f`).toBe("15u00f");
53+
expectPartialJson(String.raw`"15\u00f8`).toBe("15\u00f8");
54+
expectPartialJson(String.raw`"15\u00f8C`).toBe("15\u00f8C");
55+
expectPartialJson(String.raw`"15\u00f8C"`).toBe("15\u00f8C");
56+
57+
expectPartialJson(String.raw`"hello${"\\"}`).toBe("hello\\");
58+
expectPartialJson(String.raw`"hello\"`).toBe('hello"');
59+
expectPartialJson(String.raw`"hello\""`).toBe('hello"');
60+
61+
expectPartialJson(String.raw`"hello\\`).toBe("hello\\");
62+
63+
expectPartialJson(String.raw`"\t\n\r\b\f\/`).toBe("\t\n\r\b\f/");
64+
expectPartialJson(String.raw`"\t\n\r\b\f\/"`).toBe("\t\n\r\b\f/");
65+
66+
expectPartialJson(String.raw`"foo\bar`).toBe("foo\bar");
67+
expectPartialJson(String.raw`"foo\bar"`).toBe("foo\bar");
68+
69+
expectPartialJson(String.raw`"\u00f8${"\\"}`).toBe("\u00f8\\");
70+
71+
expect(() => expectPartialJson('"hello\\m"')).toThrow();
72+
expect(() => expectPartialJson('"hello\\x"')).toThrow();
5173
});
5274

5375
it("numbers", () => {

0 commit comments

Comments
 (0)