chore: extract utils escapeUnicode
This commit is contained in:
@@ -16,23 +16,7 @@ import {
|
|||||||
import { AlertCircle, Send } from "lucide-react";
|
import { AlertCircle, Send } from "lucide-react";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import ListPane from "./ListPane";
|
import ListPane from "./ListPane";
|
||||||
|
import { escapeUnicode } from "@/utils/escapeUnicode";
|
||||||
// Utility function to escape Unicode characters
|
|
||||||
function escapeUnicode(obj: any): string {
|
|
||||||
return JSON.stringify(
|
|
||||||
obj,
|
|
||||||
(_key: string, value) => {
|
|
||||||
if (typeof value === "string") {
|
|
||||||
// Replace non-ASCII characters with their Unicode escape sequences
|
|
||||||
return value.replace(/[^\0-\x7F]/g, (char) => {
|
|
||||||
return "\\u" + ("0000" + char.charCodeAt(0).toString(16)).slice(-4);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return value;
|
|
||||||
},
|
|
||||||
2,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const ToolsTab = ({
|
const ToolsTab = ({
|
||||||
tools,
|
tools,
|
||||||
|
|||||||
27
client/src/utils/__tests__/escapeUnicode.test.ts
Normal file
27
client/src/utils/__tests__/escapeUnicode.test.ts
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
import { escapeUnicode } from "../escapeUnicode";
|
||||||
|
|
||||||
|
describe("escapeUnicode", () => {
|
||||||
|
it("should escape Unicode characters in a string", () => {
|
||||||
|
const input = { text: "你好世界" };
|
||||||
|
const expected = '{\n "text": "\\\\u4f60\\\\u597d\\\\u4e16\\\\u754c"\n}';
|
||||||
|
expect(escapeUnicode(input)).toBe(expected);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should handle empty strings", () => {
|
||||||
|
const input = { text: "" };
|
||||||
|
const expected = '{\n "text": ""\n}';
|
||||||
|
expect(escapeUnicode(input)).toBe(expected);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should handle null and undefined values", () => {
|
||||||
|
const input = { text: null, value: undefined };
|
||||||
|
const expected = '{\n "text": null\n}';
|
||||||
|
expect(escapeUnicode(input)).toBe(expected);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should handle numbers and booleans", () => {
|
||||||
|
const input = { number: 123, boolean: true };
|
||||||
|
const expected = '{\n "number": 123,\n "boolean": true\n}';
|
||||||
|
expect(escapeUnicode(input)).toBe(expected);
|
||||||
|
});
|
||||||
|
});
|
||||||
16
client/src/utils/escapeUnicode.ts
Normal file
16
client/src/utils/escapeUnicode.ts
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
// Utility function to escape Unicode characters
|
||||||
|
export function escapeUnicode(obj: unknown): string {
|
||||||
|
return JSON.stringify(
|
||||||
|
obj,
|
||||||
|
(_key: string, value) => {
|
||||||
|
if (typeof value === "string") {
|
||||||
|
// Replace non-ASCII characters with their Unicode escape sequences
|
||||||
|
return value.replace(/[^\0-\x7F]/g, (char) => {
|
||||||
|
return "\\u" + ("0000" + char.charCodeAt(0).toString(16)).slice(-4);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
},
|
||||||
|
2,
|
||||||
|
);
|
||||||
|
}
|
||||||
1
package-lock.json
generated
1
package-lock.json
generated
@@ -24,6 +24,7 @@
|
|||||||
"mcp-inspector": "bin/cli.js"
|
"mcp-inspector": "bin/cli.js"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@types/jest": "^29.5.14",
|
||||||
"@types/node": "^22.7.5",
|
"@types/node": "^22.7.5",
|
||||||
"@types/shell-quote": "^1.7.5",
|
"@types/shell-quote": "^1.7.5",
|
||||||
"prettier": "3.3.3"
|
"prettier": "3.3.3"
|
||||||
|
|||||||
@@ -42,6 +42,7 @@
|
|||||||
"ts-node": "^10.9.2"
|
"ts-node": "^10.9.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@types/jest": "^29.5.14",
|
||||||
"@types/node": "^22.7.5",
|
"@types/node": "^22.7.5",
|
||||||
"@types/shell-quote": "^1.7.5",
|
"@types/shell-quote": "^1.7.5",
|
||||||
"prettier": "3.3.3"
|
"prettier": "3.3.3"
|
||||||
|
|||||||
Reference in New Issue
Block a user