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 🌍 ⚠️ |
lkoiescg2031 🌍 ⚠️ |
+ 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 🌍 ⚠️ |
lkoiescg2031 🌍 ⚠️ |
Elias Eskelinen 🌍 ⚠️ |
+ 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");
+});