From c1fc05fed97cf5b73fd8746a2fd14c76c4aa5b53 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 26 Sep 2023 03:30:01 +0000 Subject: [PATCH 1/5] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c0b4de7..bb98d8d 100644 --- a/README.md +++ b/README.md @@ -302,7 +302,7 @@ This project is licensed under the MIT License - see the [LICENSE](https://githu ## Contributors ✨ -[![All Contributors](https://img.shields.io/badge/all_contributors-30-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-31-orange.svg?style=flat-square)](#contributors-) Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): @@ -351,6 +351,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Umidullo Suyunov
Umidullo Suyunov

🌍 ⚠️ lkoiescg2031
lkoiescg2031

🌍 ⚠️ + Elias Eskelinen
Elias Eskelinen

🌍 ⚠️ From 78230c12d584a5a7f9366b35565d835384b3506e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 26 Sep 2023 03:30:01 +0000 Subject: [PATCH 2/5] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 81a7fd2..2d38472 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -303,6 +303,16 @@ "translation", "test" ] + }, + { + "login": "xypine", + "name": "Elias Eskelinen", + "avatar_url": "https://avatars.githubusercontent.com/u/29503504?v=4", + "profile": "http://eliaseskelinen.fi", + "contributions": [ + "translation", + "test" + ] } ], "contributorsPerLine": 7, From 374429440c1f7fea058e6c9646de8b7fc5798f17 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 26 Sep 2023 03:37:23 +0000 Subject: [PATCH 3/5] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bb98d8d..5498eca 100644 --- a/README.md +++ b/README.md @@ -302,7 +302,7 @@ This project is licensed under the MIT License - see the [LICENSE](https://githu ## Contributors ✨ -[![All Contributors](https://img.shields.io/badge/all_contributors-31-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-32-orange.svg?style=flat-square)](#contributors-) Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): @@ -352,6 +352,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Umidullo Suyunov
Umidullo Suyunov

🌍 ⚠️ lkoiescg2031
lkoiescg2031

🌍 ⚠️ Elias Eskelinen
Elias Eskelinen

🌍 ⚠️ + Boris Martinovic
Boris Martinovic

🌍 ⚠️ From 06b4fef3e987a651e160f831eda814387bced3be Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 26 Sep 2023 03:37:24 +0000 Subject: [PATCH 4/5] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 2d38472..e1c1fe9 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -313,6 +313,16 @@ "translation", "test" ] + }, + { + "login": "martinovicdev", + "name": "Boris Martinovic", + "avatar_url": "https://avatars.githubusercontent.com/u/46416972?v=4", + "profile": "https://martinovic.dev", + "contributions": [ + "translation", + "test" + ] } ], "contributorsPerLine": 7, From 5e93029b17b76066ff2724b2c4471bd4f1e5481d Mon Sep 17 00:00:00 2001 From: Elias Eskelinen Date: Tue, 26 Sep 2023 06:39:13 +0300 Subject: [PATCH 5/5] feat: add Finnish language (#165) --- .../with-next-i18next/next-i18next.config.js | 1 + examples/with-next-i18next/pages/index.tsx | 1 + .../public/locales/fi/common.json | 7 + .../public/locales/fi/zod.json | 112 +++++++++ packages/core/locales/fi/zod.json | 112 +++++++++ packages/core/tests/integrations/fi.test.ts | 217 ++++++++++++++++++ 6 files changed, 450 insertions(+) create mode 100644 examples/with-next-i18next/public/locales/fi/common.json create mode 100644 examples/with-next-i18next/public/locales/fi/zod.json create mode 100644 packages/core/locales/fi/zod.json create mode 100644 packages/core/tests/integrations/fi.test.ts diff --git a/examples/with-next-i18next/next-i18next.config.js b/examples/with-next-i18next/next-i18next.config.js index 2a99f31..3898752 100644 --- a/examples/with-next-i18next/next-i18next.config.js +++ b/examples/with-next-i18next/next-i18next.config.js @@ -29,6 +29,7 @@ module.exports = { "ro", "uk-UA", "uz", + "fi", ], }, localePath: path.resolve("./public/locales"), diff --git a/examples/with-next-i18next/pages/index.tsx b/examples/with-next-i18next/pages/index.tsx index c955338..a48a7c8 100644 --- a/examples/with-next-i18next/pages/index.tsx +++ b/examples/with-next-i18next/pages/index.tsx @@ -81,6 +81,7 @@ export default function HookForm() { + diff --git a/examples/with-next-i18next/public/locales/fi/common.json b/examples/with-next-i18next/public/locales/fi/common.json new file mode 100644 index 0000000..e94ce01 --- /dev/null +++ b/examples/with-next-i18next/public/locales/fi/common.json @@ -0,0 +1,7 @@ +{ + "username": "Käyttäjänimi", + "username_placeholder": "Matti Meikäläinen", + "email": "Sähköpostiosoite", + "favoriteNumber": "Lempinumero", + "submit": "Lähetä" +} diff --git a/examples/with-next-i18next/public/locales/fi/zod.json b/examples/with-next-i18next/public/locales/fi/zod.json new file mode 100644 index 0000000..54e6647 --- /dev/null +++ b/examples/with-next-i18next/public/locales/fi/zod.json @@ -0,0 +1,112 @@ +{ + "errors": { + "invalid_type": "Odotettiin arvon olevan {{expected}}, saatiin {{received}}", + "invalid_type_received_undefined": "Vaadittu", + "invalid_literal": "Virheellinen merkkijono, odotettiin {{expected}}", + "unrecognized_keys": "Tuntemattomia avaimia objektissa: {{- keys}}", + "invalid_union": "Virheellinen syöte", + "invalid_union_discriminator": "Virheellinen erottimen arvo. Odotettiin {{- options}}", + "invalid_enum_value": "Virheellinen vaihtoehto. Odotettiin {{- options}}, saatiin '{{received}}'", + "invalid_arguments": "Virheelliset funktion argumentit", + "invalid_return_type": "Virheellinen funktion palautustyyppi", + "invalid_date": "Virheellinen päivämäärä", + "custom": "Virheellinen syöte", + "invalid_intersection_types": "Risteystuloksia ei voitu yhdistää", + "not_multiple_of": "Numeron tulee olla luvun {{multipleOf}} monikerta", + "not_finite": "Numeron tulee olla äärellinen", + "invalid_string": { + "email": "Virheellinen {{validation}}", + "url": "Virheellinen {{validation}}", + "uuid": "Virheellinen {{validation}}", + "cuid": "Virheellinen {{validation}}", + "regex": "Virheellinen", + "datetime": "Virheellinen {{validation}}", + "startsWith": "Virheellinen syöte: täytyy alkaa \"{{startsWith}}\"", + "endsWith": "Virheellinen syöte: täytyy päättyä \"{{endsWith}}\"" + }, + "too_small": { + "array": { + "exact": "Taulukon tulee sisältää tarkalleen {{minimum}} alkiota", + "inclusive": "Taulukon tulee sisältää vähintään {{minimum}} alkiota", + "not_inclusive": "Taulukon tulee sisältää yli {{minimum}} alkiota" + }, + "string": { + "exact": "Merkkijonon tulee sisältää täsmälleen {{minimum}} merkkiä", + "inclusive": "Merkkijonon tulee sisältää vähintään {{minimum}} merkkiä", + "not_inclusive": "Merkkijonon tulee sisältää yli {{minimum}} merkkiä" + }, + "number": { + "exact": "Numeron tulee olla täsmälleen {{minimum}}", + "inclusive": "Numeron tulee olla suurempi tai yhtä suuri kuin {{minimum}}", + "not_inclusive": "Numeron tulee olla suurempi kuin {{minimum}}" + }, + "set": { + "exact": "Virheellinen syöte", + "inclusive": "Virheellinen syöte", + "not_inclusive": "Virheellinen syöte" + }, + "date": { + "exact": "Päivämäärän on oltava täsmälleen {{- minimum, datetime}}", + "inclusive": "Päivämäärän on oltava suurempi tai yhtä suuri kuin {{- minimum, datetime}}", + "not_inclusive": "Päivämäärän on oltava suurempi kuin {{- minimum, datetime}}" + } + }, + "too_big": { + "array": { + "exact": "Taulukon tulee sisältää tarkalleen {{maximum}} alkiota", + "inclusive": "Taulukon tulee sisältää enintään {{maximum}} alkiota", + "not_inclusive": "Taulukon tulee sisältää vähemmän kuin {{maximum}} alkiota" + }, + "string": { + "exact": "Merkkijonon tulee sisältää täsmälleen {{maximum}} merkkiä", + "inclusive": "Merkkijonon tulee sisältää enintään {{maximum}} merkkiä", + "not_inclusive": "Merkkijonon tulee sisältää alle {{maximum}} merkkiä" + }, + "number": { + "exact": "Numeron tulee olla täsmälleen {{maximum}}", + "inclusive": "Numeron tulee olla pienempi tai yhtä suuri kuin {{maximum}}", + "not_inclusive": "Numeron tulee olla pienempi kuin {{maximum}}" + }, + "set": { + "exact": "Virheellinen syöte", + "inclusive": "Virheellinen syöte", + "not_inclusive": "Virheellinen syöte" + }, + "date": { + "exact": "Päivämäärän on oltava täsmälleen {{- maximum, datetime}}", + "inclusive": "Päivämäärän on oltava pienempi tai yhtä suuri kuin {{- maximum, datetime}}", + "not_inclusive": "Päivämäärän on oltava pienempi kuin {{- maximum, datetime}}" + } + } + }, + "validations": { + "email": "sähköpostiosoite", + "url": "URL", + "uuid": "uuid", + "cuid": "cuid", + "regex": "regex", + "datetime": "päivämäärä" + }, + "types": { + "function": "funktio", + "number": "numero", + "string": "merkkijono", + "nan": "ei-luku", + "integer": "kokonaisluku", + "float": "desimaaliluku", + "boolean": "totuusarvo", + "date": "päivämäärä", + "bigint": "iso kokonaisluku", + "undefined": "määrittelemätön", + "symbol": "symboli", + "null": "null", + "array": "taulukko", + "object": "objekti", + "unknown": "tuntematon", + "promise": "promise", + "void": "void", + "never": "never", + "map": "map", + "set": "set" + } +} diff --git a/packages/core/locales/fi/zod.json b/packages/core/locales/fi/zod.json new file mode 100644 index 0000000..54e6647 --- /dev/null +++ b/packages/core/locales/fi/zod.json @@ -0,0 +1,112 @@ +{ + "errors": { + "invalid_type": "Odotettiin arvon olevan {{expected}}, saatiin {{received}}", + "invalid_type_received_undefined": "Vaadittu", + "invalid_literal": "Virheellinen merkkijono, odotettiin {{expected}}", + "unrecognized_keys": "Tuntemattomia avaimia objektissa: {{- keys}}", + "invalid_union": "Virheellinen syöte", + "invalid_union_discriminator": "Virheellinen erottimen arvo. Odotettiin {{- options}}", + "invalid_enum_value": "Virheellinen vaihtoehto. Odotettiin {{- options}}, saatiin '{{received}}'", + "invalid_arguments": "Virheelliset funktion argumentit", + "invalid_return_type": "Virheellinen funktion palautustyyppi", + "invalid_date": "Virheellinen päivämäärä", + "custom": "Virheellinen syöte", + "invalid_intersection_types": "Risteystuloksia ei voitu yhdistää", + "not_multiple_of": "Numeron tulee olla luvun {{multipleOf}} monikerta", + "not_finite": "Numeron tulee olla äärellinen", + "invalid_string": { + "email": "Virheellinen {{validation}}", + "url": "Virheellinen {{validation}}", + "uuid": "Virheellinen {{validation}}", + "cuid": "Virheellinen {{validation}}", + "regex": "Virheellinen", + "datetime": "Virheellinen {{validation}}", + "startsWith": "Virheellinen syöte: täytyy alkaa \"{{startsWith}}\"", + "endsWith": "Virheellinen syöte: täytyy päättyä \"{{endsWith}}\"" + }, + "too_small": { + "array": { + "exact": "Taulukon tulee sisältää tarkalleen {{minimum}} alkiota", + "inclusive": "Taulukon tulee sisältää vähintään {{minimum}} alkiota", + "not_inclusive": "Taulukon tulee sisältää yli {{minimum}} alkiota" + }, + "string": { + "exact": "Merkkijonon tulee sisältää täsmälleen {{minimum}} merkkiä", + "inclusive": "Merkkijonon tulee sisältää vähintään {{minimum}} merkkiä", + "not_inclusive": "Merkkijonon tulee sisältää yli {{minimum}} merkkiä" + }, + "number": { + "exact": "Numeron tulee olla täsmälleen {{minimum}}", + "inclusive": "Numeron tulee olla suurempi tai yhtä suuri kuin {{minimum}}", + "not_inclusive": "Numeron tulee olla suurempi kuin {{minimum}}" + }, + "set": { + "exact": "Virheellinen syöte", + "inclusive": "Virheellinen syöte", + "not_inclusive": "Virheellinen syöte" + }, + "date": { + "exact": "Päivämäärän on oltava täsmälleen {{- minimum, datetime}}", + "inclusive": "Päivämäärän on oltava suurempi tai yhtä suuri kuin {{- minimum, datetime}}", + "not_inclusive": "Päivämäärän on oltava suurempi kuin {{- minimum, datetime}}" + } + }, + "too_big": { + "array": { + "exact": "Taulukon tulee sisältää tarkalleen {{maximum}} alkiota", + "inclusive": "Taulukon tulee sisältää enintään {{maximum}} alkiota", + "not_inclusive": "Taulukon tulee sisältää vähemmän kuin {{maximum}} alkiota" + }, + "string": { + "exact": "Merkkijonon tulee sisältää täsmälleen {{maximum}} merkkiä", + "inclusive": "Merkkijonon tulee sisältää enintään {{maximum}} merkkiä", + "not_inclusive": "Merkkijonon tulee sisältää alle {{maximum}} merkkiä" + }, + "number": { + "exact": "Numeron tulee olla täsmälleen {{maximum}}", + "inclusive": "Numeron tulee olla pienempi tai yhtä suuri kuin {{maximum}}", + "not_inclusive": "Numeron tulee olla pienempi kuin {{maximum}}" + }, + "set": { + "exact": "Virheellinen syöte", + "inclusive": "Virheellinen syöte", + "not_inclusive": "Virheellinen syöte" + }, + "date": { + "exact": "Päivämäärän on oltava täsmälleen {{- maximum, datetime}}", + "inclusive": "Päivämäärän on oltava pienempi tai yhtä suuri kuin {{- maximum, datetime}}", + "not_inclusive": "Päivämäärän on oltava pienempi kuin {{- maximum, datetime}}" + } + } + }, + "validations": { + "email": "sähköpostiosoite", + "url": "URL", + "uuid": "uuid", + "cuid": "cuid", + "regex": "regex", + "datetime": "päivämäärä" + }, + "types": { + "function": "funktio", + "number": "numero", + "string": "merkkijono", + "nan": "ei-luku", + "integer": "kokonaisluku", + "float": "desimaaliluku", + "boolean": "totuusarvo", + "date": "päivämäärä", + "bigint": "iso kokonaisluku", + "undefined": "määrittelemätön", + "symbol": "symboli", + "null": "null", + "array": "taulukko", + "object": "objekti", + "unknown": "tuntematon", + "promise": "promise", + "void": "void", + "never": "never", + "map": "map", + "set": "set" + } +} diff --git a/packages/core/tests/integrations/fi.test.ts b/packages/core/tests/integrations/fi.test.ts new file mode 100644 index 0000000..aa46c6d --- /dev/null +++ b/packages/core/tests/integrations/fi.test.ts @@ -0,0 +1,217 @@ +import { test, expect, beforeAll } from "vitest"; +import { z } from "zod"; +import { init, getErrorMessage, getErrorMessageFromZodError } from "./helpers"; + +const LOCALE = "fi"; + +beforeAll(async () => { + await init(LOCALE); +}); + +test("string parser error messages", () => { + const schema = z.string(); + + expect(getErrorMessage(schema.safeParse(undefined))).toEqual("Vaadittu"); + expect(getErrorMessage(schema.safeParse(1))).toEqual( + "Odotettiin arvon olevan merkkijono, saatiin numero" + ); + expect(getErrorMessage(schema.safeParse(true))).toEqual( + "Odotettiin arvon olevan merkkijono, saatiin totuusarvo" + ); + expect(getErrorMessage(schema.safeParse(Date))).toEqual( + "Odotettiin arvon olevan merkkijono, saatiin funktio" + ); + expect(getErrorMessage(schema.safeParse(new Date()))).toEqual( + "Odotettiin arvon olevan merkkijono, saatiin päivämäärä" + ); + expect(getErrorMessage(schema.email().safeParse(""))).toEqual( + "Virheellinen sähköpostiosoite" + ); + expect(getErrorMessage(schema.url().safeParse(""))).toEqual( + "Virheellinen URL" + ); + expect(getErrorMessage(schema.regex(/aaa/).safeParse(""))).toEqual( + "Virheellinen" + ); + expect(getErrorMessage(schema.startsWith("foo").safeParse(""))).toEqual( + 'Virheellinen syöte: täytyy alkaa "foo"' + ); + expect(getErrorMessage(schema.endsWith("bar").safeParse(""))).toEqual( + 'Virheellinen syöte: täytyy päättyä "bar"' + ); + expect(getErrorMessage(schema.min(5).safeParse("a"))).toEqual( + "Merkkijonon tulee sisältää vähintään 5 merkkiä" + ); + expect(getErrorMessage(schema.max(5).safeParse("abcdef"))).toEqual( + "Merkkijonon tulee sisältää enintään 5 merkkiä" + ); + expect(getErrorMessage(schema.length(5).safeParse("abcdef"))).toEqual( + "Merkkijonon tulee sisältää täsmälleen 5 merkkiä" + ); + expect( + getErrorMessage(schema.datetime().safeParse("2020-01-01T00:00:00+02:00")) + ).toEqual("Virheellinen päivämäärä"); +}); + +test("number parser error messages", () => { + const schema = z.number(); + + expect(getErrorMessage(schema.safeParse(undefined))).toEqual("Vaadittu"); + expect(getErrorMessage(schema.safeParse(""))).toEqual( + "Odotettiin arvon olevan numero, saatiin merkkijono" + ); + expect(getErrorMessage(schema.safeParse(null))).toEqual( + "Odotettiin arvon olevan numero, saatiin null" + ); + expect(getErrorMessage(schema.safeParse(NaN))).toEqual( + "Odotettiin arvon olevan numero, saatiin ei-luku" + ); + expect(getErrorMessage(schema.int().safeParse(0.1))).toEqual( + "Odotettiin arvon olevan kokonaisluku, saatiin desimaaliluku" + ); + expect(getErrorMessage(schema.multipleOf(5).safeParse(2))).toEqual( + "Numeron tulee olla luvun 5 monikerta" + ); + expect(getErrorMessage(schema.step(0.1).safeParse(0.0001))).toEqual( + "Numeron tulee olla luvun 0.1 monikerta" + ); + expect(getErrorMessage(schema.lt(5).safeParse(10))).toEqual( + "Numeron tulee olla pienempi kuin 5" + ); + expect(getErrorMessage(schema.lte(5).safeParse(10))).toEqual( + "Numeron tulee olla pienempi tai yhtä suuri kuin 5" + ); + expect(getErrorMessage(schema.gt(5).safeParse(1))).toEqual( + "Numeron tulee olla suurempi kuin 5" + ); + expect(getErrorMessage(schema.gte(5).safeParse(1))).toEqual( + "Numeron tulee olla suurempi tai yhtä suuri kuin 5" + ); + expect(getErrorMessage(schema.nonnegative().safeParse(-1))).toEqual( + "Numeron tulee olla suurempi tai yhtä suuri kuin 0" + ); + expect(getErrorMessage(schema.nonpositive().safeParse(1))).toEqual( + "Numeron tulee olla pienempi tai yhtä suuri kuin 0" + ); + expect(getErrorMessage(schema.negative().safeParse(1))).toEqual( + "Numeron tulee olla pienempi kuin 0" + ); + expect(getErrorMessage(schema.positive().safeParse(0))).toEqual( + "Numeron tulee olla suurempi kuin 0" + ); + expect(getErrorMessage(schema.finite().safeParse(Infinity))).toEqual( + "Numeron tulee olla äärellinen" + ); +}); + +test("date parser error messages", async () => { + const testDate = new Date("2022-08-01"); + const schema = z.date(); + + expect(getErrorMessage(schema.safeParse("2022-12-01"))).toEqual( + "Odotettiin arvon olevan päivämäärä, saatiin merkkijono" + ); + expect( + getErrorMessage(schema.min(testDate).safeParse(new Date("2022-07-29"))) + ).toEqual( + `Päivämäärän on oltava suurempi tai yhtä suuri kuin ${testDate.toLocaleDateString( + LOCALE + )}` + ); + expect( + getErrorMessage(schema.max(testDate).safeParse(new Date("2022-08-02"))) + ).toEqual( + `Päivämäärän on oltava pienempi tai yhtä suuri kuin ${testDate.toLocaleDateString( + LOCALE + )}` + ); + try { + await schema.parseAsync(new Date("invalid")); + } catch (err) { + expect((err as z.ZodError).issues[0].message).toEqual( + "Virheellinen päivämäärä" + ); + } +}); + +test("array parser error messages", () => { + const schema = z.string().array(); + + expect(getErrorMessage(schema.safeParse(""))).toEqual( + "Odotettiin arvon olevan taulukko, saatiin merkkijono" + ); + expect(getErrorMessage(schema.min(5).safeParse([""]))).toEqual( + "Taulukon tulee sisältää vähintään 5 alkiota" + ); + expect(getErrorMessage(schema.max(2).safeParse(["", "", ""]))).toEqual( + "Taulukon tulee sisältää enintään 2 alkiota" + ); + expect(getErrorMessage(schema.nonempty().safeParse([]))).toEqual( + "Taulukon tulee sisältää vähintään 1 alkiota" + ); + expect(getErrorMessage(schema.length(2).safeParse([]))).toEqual( + "Taulukon tulee sisältää tarkalleen 2 alkiota" + ); +}); + +test("function parser error messages", () => { + const functionParse = z + .function(z.tuple([z.string()]), z.number()) + .parse((a: any) => a); + expect(getErrorMessageFromZodError(() => functionParse(""))).toEqual( + "Virheellinen funktion palautustyyppi" + ); + expect(getErrorMessageFromZodError(() => functionParse(1 as any))).toEqual( + "Virheelliset funktion argumentit" + ); +}); + +test("other parser error messages", () => { + expect( + getErrorMessage( + z + .intersection( + z.number(), + z.number().transform((x) => x + 1) + ) + .safeParse(1234) + ) + ).toEqual("Risteystuloksia ei voitu yhdistää"); + expect(getErrorMessage(z.literal(12).safeParse(""))).toEqual( + "Virheellinen merkkijono, odotettiin 12" + ); + expect(getErrorMessage(z.enum(["A", "B", "C"]).safeParse("D"))).toEqual( + "Virheellinen vaihtoehto. Odotettiin 'A' | 'B' | 'C', saatiin 'D'" + ); + expect( + getErrorMessage( + z + .object({ dog: z.string() }) + .strict() + .safeParse({ dog: "", cat: "", rat: "" }) + ) + ).toEqual("Tuntemattomia avaimia objektissa: 'cat', 'rat'"); + expect( + getErrorMessage( + z + .discriminatedUnion("type", [ + z.object({ type: z.literal("a"), a: z.string() }), + z.object({ type: z.literal("b"), b: z.string() }), + ]) + .safeParse({ type: "c", c: "abc" }) + ) + ).toEqual("Virheellinen erottimen arvo. Odotettiin 'a' | 'b'"); + expect( + getErrorMessage(z.union([z.string(), z.number()]).safeParse([true])) + ).toEqual("Virheellinen syöte"); + expect( + getErrorMessage( + z + .string() + .refine(() => { + return false; + }) + .safeParse("") + ) + ).toEqual("Virheellinen syöte"); +});