Skip to content

Commit 792a222

Browse files
authored
impr(misc): reject nested objects in sanitize (@fehmer) (monkeytypegame#6850)
1 parent 18267c7 commit 792a222

File tree

2 files changed

+51
-22
lines changed

2 files changed

+51
-22
lines changed

frontend/__tests__/utils/misc.spec.ts

Lines changed: 46 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,42 +9,47 @@ import {
99
getLanguageDisplayString,
1010
removeLanguageSize,
1111
} from "../../src/ts/utils/strings";
12+
import { Language } from "@monkeytype/schemas/languages";
1213

1314
//todo this file is in the wrong place
1415

1516
describe("misc.ts", () => {
1617
describe("getLanguageDisplayString", () => {
1718
it("should return correctly formatted strings", () => {
18-
const tests = [
19+
const tests: {
20+
input: Language;
21+
noSizeString: boolean;
22+
expected: string;
23+
}[] = [
1924
{
20-
input: "language",
25+
input: "english",
2126
noSizeString: false,
22-
expected: "language",
27+
expected: "english",
2328
},
2429
{
25-
input: "language_1k",
30+
input: "english_1k",
2631
noSizeString: false,
27-
expected: "language 1k",
32+
expected: "english 1k",
2833
},
2934
{
30-
input: "language_1k",
35+
input: "english_1k",
3136
noSizeString: true,
32-
expected: "language",
37+
expected: "english",
3338
},
3439
{
35-
input: "language_lang",
40+
input: "english_medical",
3641
noSizeString: false,
37-
expected: "language lang",
42+
expected: "english medical",
3843
},
3944
{
40-
input: "language_lang_1k",
45+
input: "arabic_egypt_1k",
4146
noSizeString: false,
42-
expected: "language lang 1k",
47+
expected: "arabic egypt 1k",
4348
},
4449
{
45-
input: "language_lang_1k",
50+
input: "arabic_egypt_1k",
4651
noSizeString: true,
47-
expected: "language lang",
52+
expected: "arabic egypt",
4853
},
4954
];
5055

@@ -56,22 +61,22 @@ describe("misc.ts", () => {
5661
});
5762
describe("removeLanguageSize", () => {
5863
it("should remove language size", () => {
59-
const tests = [
64+
const tests: { input: Language; expected: Language }[] = [
6065
{
61-
input: "language",
62-
expected: "language",
66+
input: "english",
67+
expected: "english",
6368
},
6469
{
65-
input: "language_1k",
66-
expected: "language",
70+
input: "english_1k",
71+
expected: "english",
6772
},
6873
{
69-
input: "language_lang",
70-
expected: "language_lang",
74+
input: "arabic_egypt",
75+
expected: "arabic_egypt",
7176
},
7277
{
73-
input: "language_lang_1k",
74-
expected: "language_lang",
78+
input: "arabic_egypt_1k",
79+
expected: "arabic_egypt",
7580
},
7681
];
7782

@@ -284,6 +289,25 @@ describe("misc.ts", () => {
284289
});
285290
});
286291

292+
it("should throw on nested objects", () => {
293+
const schema = z
294+
.object({
295+
name: z.string(),
296+
info: z.object({ age: z.number() }).partial(),
297+
})
298+
.partial();
299+
const obj = {
300+
name: "Alice",
301+
info: { age: "42" as any },
302+
};
303+
304+
expect(() => {
305+
sanitize(schema, obj);
306+
}).toThrowError(
307+
"sanitize does not support nested objects yet. path: info.age"
308+
);
309+
});
310+
287311
it("should remove entire property if all array elements are invalid", () => {
288312
const obj = { name: "Alice", age: 30, tags: [123, 456] as any };
289313
const sanitized = sanitize(schema, obj);

frontend/src/ts/utils/misc.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,11 @@ export function sanitize<T extends z.ZodTypeAny>(
734734
let val = errors.get(element);
735735
if (typeof error.path[1] === "number") {
736736
val = [...(val ?? []), error.path[1]];
737+
} else if (error.path.length > 1) {
738+
throw new Error(
739+
"sanitize does not support nested objects yet. path: " +
740+
error.path.join(".")
741+
);
737742
}
738743
errors.set(element, val);
739744
}

0 commit comments

Comments
 (0)