Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions packages/zod/src/v4/classic/tests/error-utils.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -551,6 +551,24 @@ test("disc union treeify/format", () => {
`);
});

test("prettifyError for Infinity and NaN", () => {
const numberSchema = z.number();

const infinityResult = numberSchema.safeParse(Number.POSITIVE_INFINITY);
expect(infinityResult.success).toBe(false);
if (!infinityResult.success) {
expect(z.prettifyError(infinityResult.error)).toMatchInlineSnapshot(
`"✖ Invalid input: expected number, received Infinity"`
);
}

const nanResult = numberSchema.safeParse(Number.NaN);
expect(nanResult.success).toBe(false);
if (!nanResult.success) {
expect(z.prettifyError(nanResult.error)).toMatchInlineSnapshot(`"✖ Invalid input: expected number, received NaN"`);
}
});

test("update message after adding issues", () => {
const e = new z.ZodError([]);
e.addIssue({
Expand Down
19 changes: 15 additions & 4 deletions packages/zod/src/v4/classic/tests/number.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,17 @@ test("z.number() basic validation", () => {
test("NaN validation", () => {
const schema = z.number();
expect(() => schema.parse(Number.NaN)).toThrow();

const result = schema.safeParse(Number.NaN);
expect(result.success).toBe(false);
if (!result.success) {
expect(result.error.issues[0]).toMatchObject({
code: "invalid_type",
expected: "number",
received: "NaN",
message: "Invalid input: expected number, received NaN",
});
}
});

test("Infinity validation", () => {
Expand All @@ -22,7 +33,7 @@ test("Infinity validation", () => {
"code": "invalid_type",
"received": "Infinity",
"path": [],
"message": "Invalid input: expected number, received number"
"message": "Invalid input: expected number, received Infinity"
}
]],
"success": false,
Expand All @@ -36,7 +47,7 @@ test("Infinity validation", () => {
"code": "invalid_type",
"received": "Infinity",
"path": [],
"message": "Invalid input: expected number, received number"
"message": "Invalid input: expected number, received Infinity"
}
]],
"success": false,
Expand Down Expand Up @@ -178,7 +189,7 @@ test(".finite() validation", () => {
"code": "invalid_type",
"received": "Infinity",
"path": [],
"message": "Invalid input: expected number, received number"
"message": "Invalid input: expected number, received Infinity"
}
]],
"success": false,
Expand All @@ -192,7 +203,7 @@ test(".finite() validation", () => {
"code": "invalid_type",
"received": "Infinity",
"path": [],
"message": "Invalid input: expected number, received number"
"message": "Invalid input: expected number, received Infinity"
}
]],
"success": false,
Expand Down
2 changes: 1 addition & 1 deletion packages/zod/src/v4/classic/tests/primitive.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ test("date schema", async () => {
"code": "invalid_type",
"received": "Invalid Date",
"path": [],
"message": "Invalid input: expected date, received Date"
"message": "Invalid input: expected date, received Invalid Date"
}
]],
"success": false,
Expand Down
4 changes: 2 additions & 2 deletions packages/zod/src/v4/locales/ar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const error: () => errors.$ZodErrorMap = () => {

switch (t) {
case "number": {
return Number.isNaN(data) ? "NaN" : "number";
return Number.isNaN(data) ? "NaN" : !Number.isFinite(data) ? "Infinity" : "number";
}
case "object": {
if (Array.isArray(data)) {
Expand Down Expand Up @@ -73,7 +73,7 @@ const error: () => errors.$ZodErrorMap = () => {
return (issue) => {
switch (issue.code) {
case "invalid_type":
return `مدخلات غير مقبولة: يفترض إدخال ${issue.expected}، ولكن تم إدخال ${parsedType(issue.input)}`;
return `مدخلات غير مقبولة: يفترض إدخال ${issue.expected}، ولكن تم إدخال ${issue.received ?? parsedType(issue.input)}`;
case "invalid_value":
if (issue.values.length === 1)
return `مدخلات غير مقبولة: يفترض إدخال ${util.stringifyPrimitive(issue.values[0])}`;
Expand Down
4 changes: 2 additions & 2 deletions packages/zod/src/v4/locales/az.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const error: () => errors.$ZodErrorMap = () => {

switch (t) {
case "number": {
return Number.isNaN(data) ? "NaN" : "number";
return Number.isNaN(data) ? "NaN" : !Number.isFinite(data) ? "Infinity" : "number";
}
case "object": {
if (Array.isArray(data)) {
Expand Down Expand Up @@ -73,7 +73,7 @@ const error: () => errors.$ZodErrorMap = () => {
return (issue) => {
switch (issue.code) {
case "invalid_type":
return `Yanlış dəyər: gözlənilən ${issue.expected}, daxil olan ${parsedType(issue.input)}`;
return `Yanlış dəyər: gözlənilən ${issue.expected}, daxil olan ${issue.received ?? parsedType(issue.input)}`;
case "invalid_value":
if (issue.values.length === 1) return `Yanlış dəyər: gözlənilən ${util.stringifyPrimitive(issue.values[0])}`;
return `Yanlış seçim: aşağıdakılardan biri olmalıdır: ${util.joinValues(issue.values, "|")}`;
Expand Down
4 changes: 2 additions & 2 deletions packages/zod/src/v4/locales/be.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ const error: () => errors.$ZodErrorMap = () => {

switch (t) {
case "number": {
return Number.isNaN(data) ? "NaN" : "лік";
return Number.isNaN(data) ? "NaN" : !Number.isFinite(data) ? "Infinity" : "лік";
}
case "object": {
if (Array.isArray(data)) {
Expand Down Expand Up @@ -129,7 +129,7 @@ const error: () => errors.$ZodErrorMap = () => {
return (issue) => {
switch (issue.code) {
case "invalid_type":
return `Няправільны ўвод: чакаўся ${issue.expected}, атрымана ${parsedType(issue.input)}`;
return `Няправільны ўвод: чакаўся ${issue.expected}, атрымана ${issue.received ?? parsedType(issue.input)}`;
case "invalid_value":
if (issue.values.length === 1) return `Няправільны ўвод: чакалася ${util.stringifyPrimitive(issue.values[0])}`;
return `Няправільны варыянт: чакаўся адзін з ${util.joinValues(issue.values, "|")}`;
Expand Down
4 changes: 2 additions & 2 deletions packages/zod/src/v4/locales/bg.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export const parsedType = (data: any): string => {

switch (t) {
case "number": {
return Number.isNaN(data) ? "NaN" : "число";
return Number.isNaN(data) ? "NaN" : !Number.isFinite(data) ? "Infinity" : "число";
}
case "object": {
if (Array.isArray(data)) {
Expand Down Expand Up @@ -73,7 +73,7 @@ const error: () => errors.$ZodErrorMap = () => {
return (issue) => {
switch (issue.code) {
case "invalid_type":
return `Невалиден вход: очакван ${issue.expected}, получен ${parsedType(issue.input)}`;
return `Невалиден вход: очакван ${issue.expected}, получен ${issue.received ?? parsedType(issue.input)}`;

case "invalid_value":
if (issue.values.length === 1) return `Невалиден вход: очакван ${util.stringifyPrimitive(issue.values[0])}`;
Expand Down
4 changes: 2 additions & 2 deletions packages/zod/src/v4/locales/ca.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const error: () => errors.$ZodErrorMap = () => {

switch (t) {
case "number": {
return Number.isNaN(data) ? "NaN" : "number";
return Number.isNaN(data) ? "NaN" : !Number.isFinite(data) ? "Infinity" : "number";
}
case "object": {
if (Array.isArray(data)) {
Expand Down Expand Up @@ -73,7 +73,7 @@ const error: () => errors.$ZodErrorMap = () => {
return (issue) => {
switch (issue.code) {
case "invalid_type":
return `Tipus invàlid: s'esperava ${issue.expected}, s'ha rebut ${parsedType(issue.input)}`;
return `Tipus invàlid: s'esperava ${issue.expected}, s'ha rebut ${issue.received ?? parsedType(issue.input)}`;
// return `Tipus invàlid: s'esperava ${issue.expected}, s'ha rebut ${util.getParsedType(issue.input)}`;
case "invalid_value":
if (issue.values.length === 1) return `Valor invàlid: s'esperava ${util.stringifyPrimitive(issue.values[0])}`;
Expand Down
4 changes: 2 additions & 2 deletions packages/zod/src/v4/locales/cs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const error: () => errors.$ZodErrorMap = () => {

switch (t) {
case "number": {
return Number.isNaN(data) ? "NaN" : "číslo";
return Number.isNaN(data) ? "NaN" : !Number.isFinite(data) ? "Infinity" : "číslo";
}
case "string": {
return "řetězec";
Expand Down Expand Up @@ -91,7 +91,7 @@ const error: () => errors.$ZodErrorMap = () => {
return (issue) => {
switch (issue.code) {
case "invalid_type":
return `Neplatný vstup: očekáváno ${issue.expected}, obdrženo ${parsedType(issue.input)}`;
return `Neplatný vstup: očekáváno ${issue.expected}, obdrženo ${issue.received ?? parsedType(issue.input)}`;
case "invalid_value":
if (issue.values.length === 1) return `Neplatný vstup: očekáváno ${util.stringifyPrimitive(issue.values[0])}`;
return `Neplatná možnost: očekávána jedna z hodnot ${util.joinValues(issue.values, "|")}`;
Expand Down
4 changes: 2 additions & 2 deletions packages/zod/src/v4/locales/da.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ const error: () => errors.$ZodErrorMap = () => {

switch (t) {
case "number": {
return Number.isNaN(data) ? "NaN" : "tal";
return Number.isNaN(data) ? "NaN" : !Number.isFinite(data) ? "Infinity" : "tal";
}
case "object": {
if (Array.isArray(data)) {
Expand Down Expand Up @@ -88,7 +88,7 @@ const error: () => errors.$ZodErrorMap = () => {
return (issue) => {
switch (issue.code) {
case "invalid_type":
return `Ugyldigt input: forventede ${getTypeName(issue.expected)}, fik ${getTypeName(parsedType(issue.input))}`;
return `Ugyldigt input: forventede ${getTypeName(issue.expected)}, fik ${(issue as any).received ?? getTypeName(parsedType(issue.input))}`;
case "invalid_value":
if (issue.values.length === 1) return `Ugyldig værdi: forventede ${util.stringifyPrimitive(issue.values[0])}`;
return `Ugyldigt valg: forventede en af følgende ${util.joinValues(issue.values, "|")}`;
Expand Down
4 changes: 2 additions & 2 deletions packages/zod/src/v4/locales/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const error: () => errors.$ZodErrorMap = () => {

switch (t) {
case "number": {
return Number.isNaN(data) ? "NaN" : "Zahl";
return Number.isNaN(data) ? "NaN" : !Number.isFinite(data) ? "Infinity" : "Zahl";
}
case "object": {
if (Array.isArray(data)) {
Expand Down Expand Up @@ -73,7 +73,7 @@ const error: () => errors.$ZodErrorMap = () => {
return (issue) => {
switch (issue.code) {
case "invalid_type":
return `Ungültige Eingabe: erwartet ${issue.expected}, erhalten ${parsedType(issue.input)}`;
return `Ungültige Eingabe: erwartet ${issue.expected}, erhalten ${issue.received ?? parsedType(issue.input)}`;
case "invalid_value":
if (issue.values.length === 1) return `Ungültige Eingabe: erwartet ${util.stringifyPrimitive(issue.values[0])}`;
return `Ungültige Option: erwartet eine von ${util.joinValues(issue.values, "|")}`;
Expand Down
4 changes: 2 additions & 2 deletions packages/zod/src/v4/locales/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export const parsedType = (data: any): string => {

switch (t) {
case "number": {
return Number.isNaN(data) ? "NaN" : "number";
return Number.isNaN(data) ? "NaN" : !Number.isFinite(data) ? "Infinity" : "number";
}
case "object": {
if (Array.isArray(data)) {
Expand Down Expand Up @@ -73,7 +73,7 @@ const error: () => errors.$ZodErrorMap = () => {
return (issue) => {
switch (issue.code) {
case "invalid_type":
return `Invalid input: expected ${issue.expected}, received ${parsedType(issue.input)}`;
return `Invalid input: expected ${issue.expected}, received ${issue.received ?? parsedType(issue.input)}`;

case "invalid_value":
if (issue.values.length === 1) return `Invalid input: expected ${util.stringifyPrimitive(issue.values[0])}`;
Expand Down
4 changes: 2 additions & 2 deletions packages/zod/src/v4/locales/eo.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export const parsedType = (data: any): string => {

switch (t) {
case "number": {
return Number.isNaN(data) ? "NaN" : "nombro";
return Number.isNaN(data) ? "NaN" : !Number.isFinite(data) ? "Infinity" : "nombro";
}
case "object": {
if (Array.isArray(data)) {
Expand Down Expand Up @@ -73,7 +73,7 @@ const error: () => errors.$ZodErrorMap = () => {
return (issue) => {
switch (issue.code) {
case "invalid_type":
return `Nevalida enigo: atendiĝis ${issue.expected}, riceviĝis ${parsedType(issue.input)}`;
return `Nevalida enigo: atendiĝis ${issue.expected}, riceviĝis ${issue.received ?? parsedType(issue.input)}`;

case "invalid_value":
if (issue.values.length === 1) return `Nevalida enigo: atendiĝis ${util.stringifyPrimitive(issue.values[0])}`;
Expand Down
4 changes: 2 additions & 2 deletions packages/zod/src/v4/locales/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ const error: () => errors.$ZodErrorMap = () => {

switch (t) {
case "number": {
return Number.isNaN(data) ? "NaN" : "number";
return Number.isNaN(data) ? "NaN" : !Number.isFinite(data) ? "Infinity" : "number";
}
case "object": {
if (Array.isArray(data)) {
Expand Down Expand Up @@ -104,7 +104,7 @@ const error: () => errors.$ZodErrorMap = () => {
return (issue) => {
switch (issue.code) {
case "invalid_type":
return `Entrada inválida: se esperaba ${getTypeName(issue.expected)}, recibido ${getTypeName(parsedType(issue.input))}`;
return `Entrada inválida: se esperaba ${getTypeName(issue.expected)}, recibido ${(issue as any).received ?? getTypeName(parsedType(issue.input))}`;
// return `Entrada inválida: se esperaba ${issue.expected}, recibido ${util.getParsedType(issue.input)}`;
case "invalid_value":
if (issue.values.length === 1)
Expand Down
4 changes: 2 additions & 2 deletions packages/zod/src/v4/locales/fa.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const error: () => errors.$ZodErrorMap = () => {

switch (t) {
case "number": {
return Number.isNaN(data) ? "NaN" : "عدد";
return Number.isNaN(data) ? "NaN" : !Number.isFinite(data) ? "Infinity" : "عدد";
}
case "object": {
if (Array.isArray(data)) {
Expand Down Expand Up @@ -73,7 +73,7 @@ const error: () => errors.$ZodErrorMap = () => {
return (issue) => {
switch (issue.code) {
case "invalid_type":
return `ورودی نامعتبر: می‌بایست ${issue.expected} می‌بود، ${parsedType(issue.input)} دریافت شد`;
return `ورودی نامعتبر: می‌بایست ${issue.expected} می‌بود، ${issue.received ?? parsedType(issue.input)} دریافت شد`;
case "invalid_value":
if (issue.values.length === 1) {
return `ورودی نامعتبر: می‌بایست ${util.stringifyPrimitive(issue.values[0])} می‌بود`;
Expand Down
4 changes: 2 additions & 2 deletions packages/zod/src/v4/locales/fi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ const error: () => errors.$ZodErrorMap = () => {

switch (t) {
case "number": {
return Number.isNaN(data) ? "NaN" : "number";
return Number.isNaN(data) ? "NaN" : !Number.isFinite(data) ? "Infinity" : "number";
}
case "object": {
if (Array.isArray(data)) {
Expand Down Expand Up @@ -77,7 +77,7 @@ const error: () => errors.$ZodErrorMap = () => {
return (issue) => {
switch (issue.code) {
case "invalid_type":
return `Virheellinen tyyppi: odotettiin ${issue.expected}, oli ${parsedType(issue.input)}`;
return `Virheellinen tyyppi: odotettiin ${issue.expected}, oli ${issue.received ?? parsedType(issue.input)}`;
case "invalid_value":
if (issue.values.length === 1)
return `Virheellinen syöte: täytyy olla ${util.stringifyPrimitive(issue.values[0])}`;
Expand Down
4 changes: 2 additions & 2 deletions packages/zod/src/v4/locales/fr-CA.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const error: () => errors.$ZodErrorMap = () => {

switch (t) {
case "number": {
return Number.isNaN(data) ? "NaN" : "number";
return Number.isNaN(data) ? "NaN" : !Number.isFinite(data) ? "Infinity" : "number";
}
case "object": {
if (Array.isArray(data)) {
Expand Down Expand Up @@ -73,7 +73,7 @@ const error: () => errors.$ZodErrorMap = () => {
return (issue) => {
switch (issue.code) {
case "invalid_type":
return `Entrée invalide : attendu ${issue.expected}, reçu ${parsedType(issue.input)}`;
return `Entrée invalide : attendu ${issue.expected}, reçu ${issue.received ?? parsedType(issue.input)}`;
case "invalid_value":
if (issue.values.length === 1) return `Entrée invalide : attendu ${util.stringifyPrimitive(issue.values[0])}`;
return `Option invalide : attendu l'une des valeurs suivantes ${util.joinValues(issue.values, "|")}`;
Expand Down
4 changes: 2 additions & 2 deletions packages/zod/src/v4/locales/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const error: () => errors.$ZodErrorMap = () => {

switch (t) {
case "number": {
return Number.isNaN(data) ? "NaN" : "nombre";
return Number.isNaN(data) ? "NaN" : !Number.isFinite(data) ? "Infinity" : "nombre";
}
case "object": {
if (Array.isArray(data)) {
Expand Down Expand Up @@ -73,7 +73,7 @@ const error: () => errors.$ZodErrorMap = () => {
return (issue) => {
switch (issue.code) {
case "invalid_type":
return `Entrée invalide : ${issue.expected} attendu, ${parsedType(issue.input)} reçu`;
return `Entrée invalide : ${issue.expected} attendu, ${issue.received ?? parsedType(issue.input)} reçu`;
case "invalid_value":
if (issue.values.length === 1) return `Entrée invalide : ${util.stringifyPrimitive(issue.values[0])} attendu`;
return `Option invalide : une valeur parmi ${util.joinValues(issue.values, "|")} attendue`;
Expand Down
4 changes: 2 additions & 2 deletions packages/zod/src/v4/locales/he.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const error: () => errors.$ZodErrorMap = () => {

switch (t) {
case "number": {
return Number.isNaN(data) ? "NaN" : "number";
return Number.isNaN(data) ? "NaN" : !Number.isFinite(data) ? "Infinity" : "number";
}
case "object": {
if (Array.isArray(data)) {
Expand Down Expand Up @@ -73,7 +73,7 @@ const error: () => errors.$ZodErrorMap = () => {
return (issue) => {
switch (issue.code) {
case "invalid_type":
return `קלט לא תקין: צריך ${issue.expected}, התקבל ${parsedType(issue.input)}`;
return `קלט לא תקין: צריך ${issue.expected}, התקבל ${issue.received ?? parsedType(issue.input)}`;
// return `Invalid input: expected ${issue.expected}, received ${util.getParsedType(issue.input)}`;
case "invalid_value":
if (issue.values.length === 1) return `קלט לא תקין: צריך ${util.stringifyPrimitive(issue.values[0])}`;
Expand Down
4 changes: 2 additions & 2 deletions packages/zod/src/v4/locales/hu.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const error: () => errors.$ZodErrorMap = () => {

switch (t) {
case "number": {
return Number.isNaN(data) ? "NaN" : "szám";
return Number.isNaN(data) ? "NaN" : !Number.isFinite(data) ? "Infinity" : "szám";
}
case "object": {
if (Array.isArray(data)) {
Expand Down Expand Up @@ -73,7 +73,7 @@ const error: () => errors.$ZodErrorMap = () => {
return (issue) => {
switch (issue.code) {
case "invalid_type":
return `Érvénytelen bemenet: a várt érték ${issue.expected}, a kapott érték ${parsedType(issue.input)}`;
return `Érvénytelen bemenet: a várt érték ${issue.expected}, a kapott érték ${issue.received ?? parsedType(issue.input)}`;
// return `Invalid input: expected ${issue.expected}, received ${util.getParsedType(issue.input)}`;
case "invalid_value":
if (issue.values.length === 1)
Expand Down
Loading