impr(misc): reject nested objects in sanitize (@fehmer) (#6850)

This commit is contained in:
Christian Fehmer 2025-08-09 20:01:21 +02:00 committed by GitHub
parent 18267c737c
commit 792a222adc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 51 additions and 22 deletions

View file

@ -9,42 +9,47 @@ import {
getLanguageDisplayString,
removeLanguageSize,
} from "../../src/ts/utils/strings";
import { Language } from "@monkeytype/schemas/languages";
//todo this file is in the wrong place
describe("misc.ts", () => {
describe("getLanguageDisplayString", () => {
it("should return correctly formatted strings", () => {
const tests = [
const tests: {
input: Language;
noSizeString: boolean;
expected: string;
}[] = [
{
input: "language",
input: "english",
noSizeString: false,
expected: "language",
expected: "english",
},
{
input: "language_1k",
input: "english_1k",
noSizeString: false,
expected: "language 1k",
expected: "english 1k",
},
{
input: "language_1k",
input: "english_1k",
noSizeString: true,
expected: "language",
expected: "english",
},
{
input: "language_lang",
input: "english_medical",
noSizeString: false,
expected: "language lang",
expected: "english medical",
},
{
input: "language_lang_1k",
input: "arabic_egypt_1k",
noSizeString: false,
expected: "language lang 1k",
expected: "arabic egypt 1k",
},
{
input: "language_lang_1k",
input: "arabic_egypt_1k",
noSizeString: true,
expected: "language lang",
expected: "arabic egypt",
},
];
@ -56,22 +61,22 @@ describe("misc.ts", () => {
});
describe("removeLanguageSize", () => {
it("should remove language size", () => {
const tests = [
const tests: { input: Language; expected: Language }[] = [
{
input: "language",
expected: "language",
input: "english",
expected: "english",
},
{
input: "language_1k",
expected: "language",
input: "english_1k",
expected: "english",
},
{
input: "language_lang",
expected: "language_lang",
input: "arabic_egypt",
expected: "arabic_egypt",
},
{
input: "language_lang_1k",
expected: "language_lang",
input: "arabic_egypt_1k",
expected: "arabic_egypt",
},
];
@ -284,6 +289,25 @@ describe("misc.ts", () => {
});
});
it("should throw on nested objects", () => {
const schema = z
.object({
name: z.string(),
info: z.object({ age: z.number() }).partial(),
})
.partial();
const obj = {
name: "Alice",
info: { age: "42" as any },
};
expect(() => {
sanitize(schema, obj);
}).toThrowError(
"sanitize does not support nested objects yet. path: info.age"
);
});
it("should remove entire property if all array elements are invalid", () => {
const obj = { name: "Alice", age: 30, tags: [123, 456] as any };
const sanitized = sanitize(schema, obj);

View file

@ -734,6 +734,11 @@ export function sanitize<T extends z.ZodTypeAny>(
let val = errors.get(element);
if (typeof error.path[1] === "number") {
val = [...(val ?? []), error.path[1]];
} else if (error.path.length > 1) {
throw new Error(
"sanitize does not support nested objects yet. path: " +
error.path.join(".")
);
}
errors.set(element, val);
}