@semihbou/zod-i18n-map 0.0.4 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +431 -0
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -5
- package/dist/index.mjs.map +1 -1
- package/package.json +23 -18
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2021 AijiUejima
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
Footer
|
package/README.md
ADDED
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
This is my shot at adapting zod-i18n-map to zod v4, it's not perfect but from my first tests, it seems to work.
|
|
2
|
+
|
|
3
|
+
# Disclaimer
|
|
4
|
+
This is an experimental version, some features may be broken. <br>
|
|
5
|
+
Tests have been modified and are now passing. I tried to modify them the least possible. <br>
|
|
6
|
+
Tests that were in "TODO" are commented out as it was supposedly new features to be done
|
|
7
|
+
|
|
8
|
+
## Known regressions
|
|
9
|
+
I had to remove these translation keys and some of their functionality
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
- invalid_arguments
|
|
13
|
+
- invalid_return_type
|
|
14
|
+
|
|
15
|
+
I didn't find a way to get the issue type on functions, zod was returning the same as a z.number() or z.string()
|
|
16
|
+
```ts
|
|
17
|
+
const functionParse = z.function({
|
|
18
|
+
input: [z.string()],
|
|
19
|
+
output: z.number(),
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
const computeFunctionParse = functionParse.implement((input) => input as any);
|
|
23
|
+
expect(getErrorMessageFromZodError(() => computeFunctionParse(""))).toEqual(
|
|
24
|
+
"Expected number, received string" // invalid_arguments was used here
|
|
25
|
+
);
|
|
26
|
+
expect(
|
|
27
|
+
getErrorMessageFromZodError(() => computeFunctionParse(1 as any))
|
|
28
|
+
).toEqual(
|
|
29
|
+
"Expected string, received number" // invalid_return_type was used here
|
|
30
|
+
);
|
|
31
|
+
```
|
|
32
|
+
---
|
|
33
|
+
- invalid_intersection_types
|
|
34
|
+
|
|
35
|
+
This has been completly removed as it now throws an error instead of a returned text
|
|
36
|
+
```ts
|
|
37
|
+
// Error: Unmergable intersection. Error path: [] ❯ handleIntersectionResults ../../node_modules/zod/v4/core/schemas.js:1120:15 ❯ Object.inst._zod.parse
|
|
38
|
+
expect(
|
|
39
|
+
getErrorMessage(
|
|
40
|
+
z
|
|
41
|
+
.intersection(
|
|
42
|
+
z.number(),
|
|
43
|
+
z.number().transform((x) => x + 1)
|
|
44
|
+
)
|
|
45
|
+
.safeParse(1234)
|
|
46
|
+
)
|
|
47
|
+
).toEqual("Intersection results could not be merged");
|
|
48
|
+
```
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Installation
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
pnpm install @semihbou/zod-i18n-map
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## How I use it
|
|
58
|
+
```ts
|
|
59
|
+
import i18next, {getFixedT, init, use as i18nUse} from 'i18next';
|
|
60
|
+
import {initReactI18next} from 'react-i18next';
|
|
61
|
+
import {z} from "zod";
|
|
62
|
+
import {makeZodI18nMap} from '@semihbou/zod-i18n-map';
|
|
63
|
+
|
|
64
|
+
i18nUse(initReactI18next);
|
|
65
|
+
init({
|
|
66
|
+
ns: ['common'],
|
|
67
|
+
detection: options,
|
|
68
|
+
resources, // Same as the original
|
|
69
|
+
}).then(() => {
|
|
70
|
+
const t = getFixedT(null, 'common');
|
|
71
|
+
z.config({
|
|
72
|
+
customError: makeZodI18nMap({t, ns: "common"})
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
```
|
|
76
|
+
No need to export a new zod instance, just use the default zod export.
|
|
77
|
+
|
|
78
|
+
## ICU Message Format support
|
|
79
|
+
|
|
80
|
+
Each locale ships in two formats:
|
|
81
|
+
|
|
82
|
+
- `locales/<lang>/zod.json` — the default, `i18next`-interpolation format (`{{expected}}`). **Unchanged, fully backward compatible.**
|
|
83
|
+
- `locales/<lang>/zod.icu.json` — the same messages rewritten as [ICU MessageFormat](https://formatjs.github.io/docs/core-concepts/icu-syntax/) (`{expected}`, `{minimum, date}`, literal `'` escaped as `''`).
|
|
84
|
+
|
|
85
|
+
There is no runtime flag on `makeZodI18nMap`/`zodI18nMap` to "turn on" ICU — `t()` always just forwards the key and values to whatever `i18next` instance you configured, so the switch is entirely which JSON file you import plus whether your `i18next` instance has the [`i18next-icu`](https://github.com/i18next/i18next-icu) plugin loaded. If you don't load `i18next-icu`, keep importing `zod.json`; nothing changes for you.
|
|
86
|
+
|
|
87
|
+
To opt in to ICU (e.g. because your app already uses `i18next-icu` or a tool like [Tolgee](https://tolgee.io/) with ICU formatting):
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
import i18next from "i18next";
|
|
91
|
+
import ICU from "i18next-icu";
|
|
92
|
+
import { z } from "zod";
|
|
93
|
+
import { makeZodI18nMap } from "@semihbou/zod-i18n-map";
|
|
94
|
+
import translation from "@semihbou/zod-i18n-map/locales/en/zod.icu.json";
|
|
95
|
+
|
|
96
|
+
i18next.use(ICU).init({
|
|
97
|
+
lng: "en",
|
|
98
|
+
resources: {
|
|
99
|
+
en: { zod: translation },
|
|
100
|
+
},
|
|
101
|
+
// ICU handles interpolation; let it, don't double-escape/interpolate.
|
|
102
|
+
interpolation: { escapeValue: false },
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
z.config({ customError: makeZodI18nMap() });
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
`i18next-icu` is an optional peer dependency — only install it if you use the `.icu.json` files.
|
|
109
|
+
|
|
110
|
+
### Original readme below:
|
|
111
|
+
___
|
|
112
|
+
[](https://badge.fury.io/js/zod-i18n-map)
|
|
113
|
+
[](https://codecov.io/gh/aiji42/zod-i18n)
|
|
114
|
+
[](https://github.com/aiji42/zod-i18n/actions/workflows/ci.yml)
|
|
115
|
+
|
|
116
|
+

|
|
117
|
+
|
|
118
|
+
# Zod Internationalization
|
|
119
|
+
|
|
120
|
+
This library is used to translate Zod's default error messages.
|
|
121
|
+
|
|
122
|
+
## Installation
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
yarn add zod-i18n-map i18next
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
This library depends on `i18next`.
|
|
129
|
+
|
|
130
|
+
## How to Use
|
|
131
|
+
|
|
132
|
+
```ts
|
|
133
|
+
import i18next from "i18next";
|
|
134
|
+
import { z } from "zod";
|
|
135
|
+
import { zodI18nMap } from "zod-i18n-map";
|
|
136
|
+
// Import your language translation files
|
|
137
|
+
import translation from "zod-i18n-map/locales/es/zod.json";
|
|
138
|
+
|
|
139
|
+
// lng and resources key depend on your locale.
|
|
140
|
+
i18next.init({
|
|
141
|
+
lng: "es",
|
|
142
|
+
resources: {
|
|
143
|
+
es: { zod: translation },
|
|
144
|
+
},
|
|
145
|
+
});
|
|
146
|
+
z.setErrorMap(zodI18nMap);
|
|
147
|
+
|
|
148
|
+
// export configured zod instance
|
|
149
|
+
export { z }
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Import wherever it's required
|
|
153
|
+
|
|
154
|
+
```ts
|
|
155
|
+
import { z } from "./es-zod";
|
|
156
|
+
|
|
157
|
+
const schema = z.string().email();
|
|
158
|
+
// Translated into Spanish (es)
|
|
159
|
+
schema.parse("foo"); // => correo inválido
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## `makeZodI18nMap`
|
|
163
|
+
|
|
164
|
+
Detailed customization is possible by using `makeZodI18nMap` and option values.
|
|
165
|
+
|
|
166
|
+
```ts
|
|
167
|
+
export type MakeZodI18nMap = (option?: ZodI18nMapOption) => ZodErrorMap;
|
|
168
|
+
|
|
169
|
+
export type ZodI18nMapOption = {
|
|
170
|
+
t?: i18n["t"];
|
|
171
|
+
ns?: string | readonly string[]; // See: `Namespace`
|
|
172
|
+
handlePath?: {
|
|
173
|
+
// See: `Handling object schema keys`
|
|
174
|
+
keyPrefix?: string;
|
|
175
|
+
};
|
|
176
|
+
};
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Namespace (`ns`)
|
|
180
|
+
|
|
181
|
+
You can switch between translation files by specifying a namespace.
|
|
182
|
+
This is useful in cases where the application handles validation messages for different purposes, e.g., validation messages for forms are for end users, while input value checks for API schemas are for developers.
|
|
183
|
+
|
|
184
|
+
The default namespace is `zod`.
|
|
185
|
+
|
|
186
|
+
```ts
|
|
187
|
+
import i18next from "i18next";
|
|
188
|
+
import { z } from "zod";
|
|
189
|
+
import { makeZodI18nMap } from "zod-i18n-map";
|
|
190
|
+
|
|
191
|
+
i18next.init({
|
|
192
|
+
lng: "en",
|
|
193
|
+
resources: {
|
|
194
|
+
en: {
|
|
195
|
+
zod: {
|
|
196
|
+
// default namespace
|
|
197
|
+
invalid_type: "Error: expected {{expected}}, received {{received}}",
|
|
198
|
+
},
|
|
199
|
+
formValidation: {
|
|
200
|
+
// custom namespace
|
|
201
|
+
invalid_type:
|
|
202
|
+
"it is expected to provide {{expected}} but you provided {{received}}",
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
// use default namespace
|
|
209
|
+
z.setErrorMap(makeZodI18nMap());
|
|
210
|
+
z.string().parse(1); // => Error: expected string, received number
|
|
211
|
+
|
|
212
|
+
// select custom namespace
|
|
213
|
+
z.setErrorMap(makeZodI18nMap({ ns: "formValidation" }));
|
|
214
|
+
z.string().parse(1); // => it is expected to provide string but you provided number
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
📝 **You can also specify multiple namespaces in an array.**
|
|
218
|
+
|
|
219
|
+
### Plurals
|
|
220
|
+
|
|
221
|
+
Messages using `{{maximum}}`, `{{minimum}}` or `{{keys}}` can be converted to the plural form.
|
|
222
|
+
|
|
223
|
+
Keys are i18next compliant. (https://www.i18next.com/translation-function/plurals)
|
|
224
|
+
|
|
225
|
+
```json
|
|
226
|
+
{
|
|
227
|
+
"exact_one": "String must contain exactly {{minimum}} character",
|
|
228
|
+
"exact_other": "String must contain exactly {{minimum}} characters"
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
```ts
|
|
233
|
+
import i18next from "i18next";
|
|
234
|
+
import { z } from "zod";
|
|
235
|
+
import { zodI18nMap } from "zod-i18n-map";
|
|
236
|
+
|
|
237
|
+
i18next.init({
|
|
238
|
+
lng: "en",
|
|
239
|
+
resources: {
|
|
240
|
+
en: {
|
|
241
|
+
zod: {
|
|
242
|
+
errors: {
|
|
243
|
+
too_big: {
|
|
244
|
+
string: {
|
|
245
|
+
exact_one: "String must contain exactly {{maximum}} character",
|
|
246
|
+
exact_other: "String must contain exactly {{maximum}} characters",
|
|
247
|
+
},
|
|
248
|
+
},
|
|
249
|
+
},
|
|
250
|
+
},
|
|
251
|
+
},
|
|
252
|
+
},
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
z.setErrorMap(zodI18nMap);
|
|
256
|
+
|
|
257
|
+
z.string().length(1).safeParse("abc"); // => String must contain exactly 1 character
|
|
258
|
+
|
|
259
|
+
z.string().length(5).safeParse("abcdefgh"); // => String must contain exactly 5 characters
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### Custom errors
|
|
263
|
+
|
|
264
|
+
You can translate also custom errors, for example errors from `refine`.
|
|
265
|
+
|
|
266
|
+
Create a key for the custom error in a namespace and add `i18n` to the refine second arg(see example)
|
|
267
|
+
|
|
268
|
+
```ts
|
|
269
|
+
import i18next from "i18next";
|
|
270
|
+
import { z } from "zod";
|
|
271
|
+
import { makeZodI18nMap } from "zod-i18n-map";
|
|
272
|
+
import translation from "zod-i18n-map/locales/en/zod.json";
|
|
273
|
+
|
|
274
|
+
i18next.init({
|
|
275
|
+
lng: "en",
|
|
276
|
+
resources: {
|
|
277
|
+
en: {
|
|
278
|
+
zod: translation,
|
|
279
|
+
custom: {
|
|
280
|
+
my_error_key: "Something terrible",
|
|
281
|
+
my_error_key_with_value: "Something terrible {{msg}}",
|
|
282
|
+
},
|
|
283
|
+
},
|
|
284
|
+
},
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
z.setErrorMap(makeZodI18nMap({ ns: ["zod", "custom"] }));
|
|
288
|
+
|
|
289
|
+
z.string()
|
|
290
|
+
.refine(() => false, { params: { i18n: "my_error_key" } })
|
|
291
|
+
.safeParse(""); // => Something terrible
|
|
292
|
+
|
|
293
|
+
// Or
|
|
294
|
+
|
|
295
|
+
z.string()
|
|
296
|
+
.refine(() => false, {
|
|
297
|
+
params: {
|
|
298
|
+
i18n: { key: "my_error_key_with_value", values: { msg: "happened" } },
|
|
299
|
+
},
|
|
300
|
+
})
|
|
301
|
+
.safeParse(""); // => Something terrible happened
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
### Handling object schema keys (`handlePath`)
|
|
305
|
+
|
|
306
|
+
When dealing with structured data, such as when using Zod as a validator for form input values, it is common to generate a schema with `z.object`.
|
|
307
|
+
You can handle the object's key in the message by preparing messages with the key in the `with_path` context.
|
|
308
|
+
|
|
309
|
+
```ts
|
|
310
|
+
import i18next from "i18next";
|
|
311
|
+
import { z } from "zod";
|
|
312
|
+
import { zodI18nMap } from "zod-i18n-map";
|
|
313
|
+
|
|
314
|
+
i18next.init({
|
|
315
|
+
lng: "en",
|
|
316
|
+
resources: {
|
|
317
|
+
en: {
|
|
318
|
+
zod: {
|
|
319
|
+
errors: {
|
|
320
|
+
invalid_type: "Expected {{expected}}, received {{received}}",
|
|
321
|
+
invalid_type_with_path:
|
|
322
|
+
"{{path}} is expected {{expected}}, received {{received}}",
|
|
323
|
+
},
|
|
324
|
+
userName: "User's name",
|
|
325
|
+
},
|
|
326
|
+
},
|
|
327
|
+
},
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
z.setErrorMap(zodI18nMap);
|
|
331
|
+
|
|
332
|
+
z.string().parse(1); // => Expected string, received number
|
|
333
|
+
|
|
334
|
+
const schema = z.object({
|
|
335
|
+
userName: z.string(),
|
|
336
|
+
});
|
|
337
|
+
schema.parse({ userName: 1 }); // => User's name is expected string, received number
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
If `_with_path` is suffixed to the key of the message, that message will be adopted in the case of an object type schema.
|
|
341
|
+
If there is no message key with `_with_path`, fall back to the normal error message.
|
|
342
|
+
|
|
343
|
+
Object schema keys can be handled in the message with `{{path}}`.
|
|
344
|
+
By preparing the translated data for the same key as the key in the object schema, the translated value will be output in `{{path}}`, otherwise the key will be output as is.
|
|
345
|
+
It is possible to access nested translation data by specifying `handlePath.keyPrefix`.
|
|
346
|
+
|
|
347
|
+
```ts
|
|
348
|
+
i18next.init({
|
|
349
|
+
lng: "en",
|
|
350
|
+
resources: {
|
|
351
|
+
en: {
|
|
352
|
+
zod: {
|
|
353
|
+
errors: {
|
|
354
|
+
invalid_type: "Expected {{expected}}, received {{received}}",
|
|
355
|
+
invalid_type_with_path:
|
|
356
|
+
"{{- path}} is expected {{expected}}, received {{received}}",
|
|
357
|
+
},
|
|
358
|
+
},
|
|
359
|
+
form: {
|
|
360
|
+
paths: {
|
|
361
|
+
userName: "User's name",
|
|
362
|
+
},
|
|
363
|
+
},
|
|
364
|
+
},
|
|
365
|
+
},
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
z.setErrorMap(
|
|
369
|
+
makeZodI18nMap({
|
|
370
|
+
ns: ["zod", "form"],
|
|
371
|
+
handlePath: {
|
|
372
|
+
keyPrefix: "paths",
|
|
373
|
+
},
|
|
374
|
+
})
|
|
375
|
+
);
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
## Translation Files
|
|
379
|
+
|
|
380
|
+
`zod-i18n-map` contains translation files for several locales.
|
|
381
|
+
|
|
382
|
+
- [Arabic(ar)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/ar/zod.json)
|
|
383
|
+
- [Bulgarian(bg)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/bg/zod.json)
|
|
384
|
+
- [Czech(cs)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/cs/zod.json)
|
|
385
|
+
- [German(de)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/de/zod.json)
|
|
386
|
+
- [English(en)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/en/zod.json)
|
|
387
|
+
- [Spanish(es)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/es/zod.json)
|
|
388
|
+
- [Persian(fa)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/fa/zod.json)
|
|
389
|
+
- [Finnish(fi)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/fi/zod.json)
|
|
390
|
+
- [French(fr)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/fr/zod.json)
|
|
391
|
+
- [Hebrew(he)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/he/zod.json)
|
|
392
|
+
- [Croatian(hr-Hr)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/hr-He/zod.json)
|
|
393
|
+
- [Indonesian(id)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/id/zod.json)
|
|
394
|
+
- [Icelandic(is)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/is/zod.json)
|
|
395
|
+
- [Italian(it)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/it/zod.json)
|
|
396
|
+
- [Japanese(ja)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/ja/zod.json)
|
|
397
|
+
- [Korean(ko)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/ko/zod.json)
|
|
398
|
+
- [Lithuanian(lt)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/lt/zod.json)
|
|
399
|
+
- [Norwegian(nb)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/nb/zod.json)
|
|
400
|
+
- [Dutch(nl)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/nl/zod.json)
|
|
401
|
+
- [Polish(pl)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/pl/zod.json)
|
|
402
|
+
- [Portuguese(pt)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/pt/zod.json)
|
|
403
|
+
- [Romanian(ro)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/ro/zod.json)
|
|
404
|
+
- [Russian(ru)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/ru/zod.json)
|
|
405
|
+
- [Swedish(sv)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/sv/zod.json)
|
|
406
|
+
- [Turkish(tr)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/tr/zod.json)
|
|
407
|
+
- [Ukrainian(uk-UA)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/uk-UA/zod.json)
|
|
408
|
+
- [Uzbek(uz)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/uz/zod.json)
|
|
409
|
+
- Chinese
|
|
410
|
+
- [Simplified Chinese(zh-CN)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/zh-CN/zod.json)
|
|
411
|
+
- [Traditional Chinese(zh-TW)](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/zh-TW/zod.json)
|
|
412
|
+
|
|
413
|
+
It is also possible to create and edit translation files. You can use [this English translation file](https://github.com/aiji42/zod-i18n/blob/main/packages/core/locales/en/zod.json) as a basis for rewriting it in your language.
|
|
414
|
+
|
|
415
|
+
**If you have created a translation file for a language not yet in the repository, please send us a pull request.**
|
|
416
|
+
|
|
417
|
+
## Use with `next-i18next`
|
|
418
|
+
|
|
419
|
+
Many users will want to use it with `next-i18next` (i.e. on Next.js). [This example](https://github.com/aiji42/zod-i18n/tree/main/examples/with-next-i18next) summarizes how to use with it.
|
|
420
|
+
|
|
421
|
+
## Contributing
|
|
422
|
+
|
|
423
|
+
Please read [CONTRIBUTING.md](https://github.com/aiji42/zod-i18n/tree/main/CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us.
|
|
424
|
+
|
|
425
|
+
## License
|
|
426
|
+
|
|
427
|
+
This project is licensed under the MIT License - see the [LICENSE](https://github.com/aiji42/zod-i18n/tree/main/CONTRIBUTING.md) file for details
|
|
428
|
+
|
|
429
|
+
## Contributors ✨
|
|
430
|
+
|
|
431
|
+

|
package/dist/index.js
CHANGED
|
@@ -36,7 +36,7 @@ __export(index_exports, {
|
|
|
36
36
|
module.exports = __toCommonJS(index_exports);
|
|
37
37
|
var import_i18next = __toESM(require("i18next"));
|
|
38
38
|
var import_v4 = require("zod/v4");
|
|
39
|
-
var import_locales = require("zod/locales");
|
|
39
|
+
var import_locales = require("zod/v4/locales");
|
|
40
40
|
function joinValues(array, separator = " | ") {
|
|
41
41
|
return array.map((val) => {
|
|
42
42
|
if (typeof val === "string") return `'${val}'`;
|
|
@@ -174,10 +174,12 @@ var makeZodI18nMap = (option) => (issue) => {
|
|
|
174
174
|
});
|
|
175
175
|
break;
|
|
176
176
|
case "invalid_union":
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
177
|
+
const issueInstance = issue.inst;
|
|
178
|
+
if (issueInstance instanceof import_v4.ZodDiscriminatedUnion) {
|
|
179
|
+
const options = issueInstance.def.options.map((opt) => {
|
|
180
|
+
const discriminator = issue.discriminator ?? issueInstance.def.discriminator;
|
|
181
|
+
return opt.def.shape[discriminator].def.values[0];
|
|
182
|
+
});
|
|
181
183
|
message = t("errors.invalid_union_discriminator", {
|
|
182
184
|
options: joinValues(options),
|
|
183
185
|
ns,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { $ZodErrorMap } from \"zod/v4/core\";\nimport i18next, { i18n } from \"i18next\";\nimport { ZodLiteral, ZodEnum, ZodUnion, ZodDiscriminatedUnion } from \"zod/v4\";\nimport { en } from \"zod/locales\";\n\nconst jsonStringifyReplacer = (_: string, value: any): any => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n};\n\nfunction joinValues<T extends any[]>(array: T, separator = \" | \"): string {\n return array\n .map((val) => {\n if (typeof val === \"string\") return `'${val}'`;\n else if (typeof val === \"bigint\") return `${val.toString()}`;\n return val;\n })\n .join(separator);\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n if (typeof value !== \"object\" || value === null) return false;\n\n for (const key in value) {\n if (!Object.prototype.hasOwnProperty.call(value, key)) return false;\n }\n\n return true;\n};\n\nconst getKeyAndValues = (\n param: unknown,\n defaultKey: string\n): {\n values: Record<string, unknown>;\n key: string;\n} => {\n if (typeof param === \"string\") return { key: param, values: {} };\n\n if (isRecord(param)) {\n const key =\n \"key\" in param && typeof param.key === \"string\" ? param.key : defaultKey;\n const values =\n \"values\" in param && isRecord(param.values) ? param.values : {};\n return { key, values };\n }\n\n return { key: defaultKey, values: {} };\n};\n\nexport type MakeZodI18nMap = (option?: ZodI18nMapOption) => $ZodErrorMap;\n\nexport type ZodI18nMapOption = {\n t?: i18n[\"t\"];\n ns?: string | readonly string[];\n handlePath?: HandlePathOption | false;\n};\n\nexport type HandlePathOption = {\n context?: string;\n ns?: string | readonly string[];\n keyPrefix?: string;\n};\n\nconst defaultNs = \"zod\";\n\nconst getReceivedDataType = (data: unknown): string => {\n const typeofData = typeof data;\n\n switch (typeofData) {\n case \"number\": {\n if (Number.isNaN(data)) return \"NaN\";\n else if (Number.isInteger(data)) return \"number\";\n else return \"float\";\n }\n case \"object\": {\n if (Array.isArray(data)) return \"array\";\n else if (data === null) return \"null\";\n else if (\n Object.getPrototypeOf(data) !== Object.prototype &&\n data?.constructor\n )\n return data.constructor.name;\n }\n }\n return typeofData;\n};\n\nexport const makeZodI18nMap: MakeZodI18nMap = (option) => (issue) => {\n const { t, ns, handlePath } = {\n t: i18next.t,\n ns: defaultNs,\n ...option,\n handlePath:\n option?.handlePath !== false\n ? {\n context: \"with_path\",\n ns: option?.ns ?? defaultNs,\n keyPrefix: undefined,\n ...option?.handlePath,\n }\n : null,\n };\n\n let message: string;\n const errorMsg = en().localeError(issue);\n message = (typeof errorMsg === \"string\" ? errorMsg : errorMsg?.message) ?? \"\";\n\n const path =\n (issue.path?.length ?? 0) > 0 && !!handlePath\n ? {\n context: handlePath.context,\n path: t(\n [handlePath.keyPrefix, issue.path?.join(\".\")]\n .filter(Boolean)\n .join(\".\"),\n {\n ns: handlePath.ns,\n defaultValue: issue.path?.join(\".\"),\n }\n ),\n }\n : {};\n\n switch (issue.code) {\n case \"invalid_type\":\n if (issue.input === undefined) {\n message = t(\"errors.invalid_type_received_undefined\", {\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (issue.input === null) {\n message = t(\"errors.invalid_type_received_null\", {\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (issue.input === Infinity) {\n message = t(\"errors.not_finite\", {\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (\n issue.input instanceof Date &&\n Number.isNaN(issue.input.getTime())\n ) {\n message = t(\"errors.invalid_date\", {\n ns,\n defaultValue: message,\n ...path,\n });\n } else {\n const received = getReceivedDataType(issue.input).toLocaleLowerCase();\n message = t(\"errors.invalid_type\", {\n expected: t(`types.${issue.expected}`, {\n defaultValue: issue.expected,\n ns,\n }),\n received: t(`types.${received}`, {\n defaultValue: received,\n ns,\n }),\n ns,\n defaultValue: message,\n ...path,\n });\n }\n break;\n case \"invalid_value\":\n if (issue.inst instanceof ZodLiteral) {\n message = t(\"errors.invalid_literal\", {\n expected: joinValues(issue.values),\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (issue.inst instanceof ZodEnum) {\n message = t(\"errors.invalid_enum_value\", {\n options: joinValues(issue.values),\n received: issue.input,\n ns,\n defaultValue: message,\n ...path,\n });\n }\n break;\n case \"unrecognized_keys\":\n message = t(\"errors.unrecognized_keys\", {\n keys: joinValues(issue.keys, \", \"),\n count: issue.keys.length,\n ns,\n defaultValue: message,\n ...path,\n });\n break;\n case \"invalid_union\":\n // This one must be first (narrower type)\n if (issue.inst instanceof ZodDiscriminatedUnion) {\n const options = issue.inst?.def.options.map(\n (opt: any) => opt.def.shape.type.def.values[0]\n );\n message = t(\"errors.invalid_union_discriminator\", {\n options: joinValues(options),\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (issue.inst instanceof ZodUnion) {\n message = t(\"errors.invalid_union\", {\n ns,\n defaultValue: message,\n ...path,\n });\n } else {\n message = t(\"errors.invalid_union\", {\n ns,\n defaultValue: message,\n ...path,\n });\n }\n break;\n case \"invalid_format\":\n if (issue.format === \"date\") {\n message = t(\"errors.invalid_date\", {\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (issue.format === \"starts_with\") {\n message = t(`errors.invalid_string.startsWith`, {\n startsWith: issue.prefix,\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (issue.format === \"ends_with\") {\n message = t(`errors.invalid_string.endsWith`, {\n endsWith: issue.suffix,\n ns,\n defaultValue: message,\n ...path,\n });\n } else {\n message = t(`errors.invalid_string.${issue.format}`, {\n validation: t(`validations.${issue.format}`, {\n defaultValue: issue.format,\n ns,\n }),\n ns,\n defaultValue: message,\n ...path,\n });\n }\n break;\n case \"too_small\":\n const minimum =\n issue.origin === \"date\"\n ? new Date(Number(issue.minimum))\n : issue.minimum;\n message = t(\n `errors.too_small.${issue.origin}.${\n issue.exact\n ? \"exact\"\n : issue.inclusive\n ? \"inclusive\"\n : \"not_inclusive\"\n }`,\n {\n minimum,\n count: typeof minimum === \"number\" ? minimum : undefined,\n ns,\n defaultValue: message,\n ...path,\n }\n );\n break;\n case \"too_big\":\n const maximum =\n issue.origin === \"date\"\n ? new Date(Number(issue.maximum))\n : issue.maximum;\n message = t(\n `errors.too_big.${issue.origin}.${\n issue.exact\n ? \"exact\"\n : issue.inclusive\n ? \"inclusive\"\n : \"not_inclusive\"\n }`,\n {\n maximum,\n count: typeof maximum === \"number\" ? maximum : undefined,\n ns,\n defaultValue: message,\n ...path,\n }\n );\n break;\n case \"custom\":\n const { key, values } = getKeyAndValues(\n issue.params?.i18n,\n \"errors.custom\"\n );\n\n message = t(key, {\n ...values,\n ns,\n defaultValue: message,\n ...path,\n });\n break;\n case \"not_multiple_of\":\n message = t(\"errors.not_multiple_of\", {\n multipleOf: issue.divisor,\n ns,\n defaultValue: message,\n ...path,\n });\n break;\n default:\n }\n return { message };\n};\n\nexport const zodI18nMap = makeZodI18nMap();\n"],"mappings":"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","names":["i18next"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { $ZodErrorMap } from \"zod/v4/core\";\nimport i18next, { i18n } from \"i18next\";\nimport { ZodLiteral, ZodEnum, ZodUnion, ZodDiscriminatedUnion } from \"zod/v4\";\nimport { en } from \"zod/v4/locales\";\n\nfunction joinValues<T extends any[]>(array: T, separator = \" | \"): string {\n return array\n .map((val) => {\n if (typeof val === \"string\") return `'${val}'`;\n else if (typeof val === \"bigint\") return `${val.toString()}`;\n return val;\n })\n .join(separator);\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n if (typeof value !== \"object\" || value === null) return false;\n\n for (const key in value) {\n if (!Object.prototype.hasOwnProperty.call(value, key)) return false;\n }\n\n return true;\n};\n\nconst getKeyAndValues = (\n param: unknown,\n defaultKey: string\n): {\n values: Record<string, unknown>;\n key: string;\n} => {\n if (typeof param === \"string\") return { key: param, values: {} };\n\n if (isRecord(param)) {\n const key =\n \"key\" in param && typeof param.key === \"string\" ? param.key : defaultKey;\n const values =\n \"values\" in param && isRecord(param.values) ? param.values : {};\n return { key, values };\n }\n\n return { key: defaultKey, values: {} };\n};\n\nexport type MakeZodI18nMap = (option?: ZodI18nMapOption) => $ZodErrorMap;\n\nexport type ZodI18nMapOption = {\n t?: i18n[\"t\"];\n ns?: string | readonly string[];\n handlePath?: HandlePathOption | false;\n};\n\nexport type HandlePathOption = {\n context?: string;\n ns?: string | readonly string[];\n keyPrefix?: string;\n};\n\nconst defaultNs = \"zod\";\n\nconst getReceivedDataType = (data: unknown): string => {\n const typeofData = typeof data;\n\n switch (typeofData) {\n case \"number\": {\n if (Number.isNaN(data)) return \"NaN\";\n else if (Number.isInteger(data)) return \"number\";\n else return \"float\";\n }\n case \"object\": {\n if (Array.isArray(data)) return \"array\";\n else if (data === null) return \"null\";\n else if (\n Object.getPrototypeOf(data) !== Object.prototype &&\n data?.constructor\n )\n return data.constructor.name;\n }\n }\n return typeofData;\n};\n\nexport const makeZodI18nMap: MakeZodI18nMap = (option) => (issue) => {\n const { t, ns, handlePath } = {\n t: i18next.t,\n ns: defaultNs,\n ...option,\n handlePath:\n option?.handlePath !== false\n ? {\n context: \"with_path\",\n ns: option?.ns ?? defaultNs,\n keyPrefix: undefined,\n ...option?.handlePath,\n }\n : null,\n };\n\n let message: string;\n const errorMsg = en().localeError(issue);\n message = (typeof errorMsg === \"string\" ? errorMsg : errorMsg?.message) ?? \"\";\n\n const path =\n (issue.path?.length ?? 0) > 0 && !!handlePath\n ? {\n context: handlePath.context,\n path: t(\n [handlePath.keyPrefix, issue.path?.join(\".\")]\n .filter(Boolean)\n .join(\".\"),\n {\n ns: handlePath.ns,\n defaultValue: issue.path?.join(\".\"),\n }\n ),\n }\n : {};\n\n switch (issue.code) {\n case \"invalid_type\":\n if (issue.input === undefined) {\n message = t(\"errors.invalid_type_received_undefined\", {\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (issue.input === null) {\n message = t(\"errors.invalid_type_received_null\", {\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (issue.input === Infinity) {\n message = t(\"errors.not_finite\", {\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (\n issue.input instanceof Date &&\n Number.isNaN(issue.input.getTime())\n ) {\n message = t(\"errors.invalid_date\", {\n ns,\n defaultValue: message,\n ...path,\n });\n } else {\n const received = getReceivedDataType(issue.input).toLocaleLowerCase();\n message = t(\"errors.invalid_type\", {\n expected: t(`types.${issue.expected}`, {\n defaultValue: issue.expected,\n ns,\n }),\n received: t(`types.${received}`, {\n defaultValue: received,\n ns,\n }),\n ns,\n defaultValue: message,\n ...path,\n });\n }\n break;\n case \"invalid_value\":\n if (issue.inst instanceof ZodLiteral) {\n message = t(\"errors.invalid_literal\", {\n expected: joinValues(issue.values),\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (issue.inst instanceof ZodEnum) {\n message = t(\"errors.invalid_enum_value\", {\n options: joinValues(issue.values),\n received: issue.input,\n ns,\n defaultValue: message,\n ...path,\n });\n }\n break;\n case \"unrecognized_keys\":\n message = t(\"errors.unrecognized_keys\", {\n keys: joinValues(issue.keys, \", \"),\n count: issue.keys.length,\n ns,\n defaultValue: message,\n ...path,\n });\n break;\n case \"invalid_union\":\n // This one must be first (narrower type)\n const issueInstance = issue.inst;\n if (issueInstance instanceof ZodDiscriminatedUnion) {\n const options = issueInstance.def.options.map((opt: any) => {\n const discriminator =\n issue.discriminator ?? issueInstance.def.discriminator;\n return opt.def.shape[discriminator!].def.values[0];\n });\n message = t(\"errors.invalid_union_discriminator\", {\n options: joinValues(options),\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (issue.inst instanceof ZodUnion) {\n message = t(\"errors.invalid_union\", {\n ns,\n defaultValue: message,\n ...path,\n });\n } else {\n message = t(\"errors.invalid_union\", {\n ns,\n defaultValue: message,\n ...path,\n });\n }\n break;\n case \"invalid_format\":\n if (issue.format === \"date\") {\n message = t(\"errors.invalid_date\", {\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (issue.format === \"starts_with\") {\n message = t(`errors.invalid_string.startsWith`, {\n startsWith: issue.prefix,\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (issue.format === \"ends_with\") {\n message = t(`errors.invalid_string.endsWith`, {\n endsWith: issue.suffix,\n ns,\n defaultValue: message,\n ...path,\n });\n } else {\n message = t(`errors.invalid_string.${issue.format}`, {\n validation: t(`validations.${issue.format}`, {\n defaultValue: issue.format,\n ns,\n }),\n ns,\n defaultValue: message,\n ...path,\n });\n }\n break;\n case \"too_small\":\n const minimum =\n issue.origin === \"date\"\n ? new Date(Number(issue.minimum))\n : issue.minimum;\n message = t(\n `errors.too_small.${issue.origin}.${\n issue.exact\n ? \"exact\"\n : issue.inclusive\n ? \"inclusive\"\n : \"not_inclusive\"\n }`,\n {\n minimum,\n count: typeof minimum === \"number\" ? minimum : undefined,\n ns,\n defaultValue: message,\n ...path,\n }\n );\n break;\n case \"too_big\":\n const maximum =\n issue.origin === \"date\"\n ? new Date(Number(issue.maximum))\n : issue.maximum;\n message = t(\n `errors.too_big.${issue.origin}.${\n issue.exact\n ? \"exact\"\n : issue.inclusive\n ? \"inclusive\"\n : \"not_inclusive\"\n }`,\n {\n maximum,\n count: typeof maximum === \"number\" ? maximum : undefined,\n ns,\n defaultValue: message,\n ...path,\n }\n );\n break;\n case \"custom\":\n const { key, values } = getKeyAndValues(\n issue.params?.i18n,\n \"errors.custom\"\n );\n\n message = t(key, {\n ...values,\n ns,\n defaultValue: message,\n ...path,\n });\n break;\n case \"not_multiple_of\":\n message = t(\"errors.not_multiple_of\", {\n multipleOf: issue.divisor,\n ns,\n defaultValue: message,\n ...path,\n });\n break;\n default:\n }\n return { message };\n};\n\nexport const zodI18nMap = makeZodI18nMap();\n"],"mappings":"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","names":["i18next"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
2
|
import i18next from "i18next";
|
|
3
3
|
import { ZodLiteral, ZodEnum, ZodUnion, ZodDiscriminatedUnion } from "zod/v4";
|
|
4
|
-
import { en } from "zod/locales";
|
|
4
|
+
import { en } from "zod/v4/locales";
|
|
5
5
|
function joinValues(array, separator = " | ") {
|
|
6
6
|
return array.map((val) => {
|
|
7
7
|
if (typeof val === "string") return `'${val}'`;
|
|
@@ -139,10 +139,12 @@ var makeZodI18nMap = (option) => (issue) => {
|
|
|
139
139
|
});
|
|
140
140
|
break;
|
|
141
141
|
case "invalid_union":
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
142
|
+
const issueInstance = issue.inst;
|
|
143
|
+
if (issueInstance instanceof ZodDiscriminatedUnion) {
|
|
144
|
+
const options = issueInstance.def.options.map((opt) => {
|
|
145
|
+
const discriminator = issue.discriminator ?? issueInstance.def.discriminator;
|
|
146
|
+
return opt.def.shape[discriminator].def.values[0];
|
|
147
|
+
});
|
|
146
148
|
message = t("errors.invalid_union_discriminator", {
|
|
147
149
|
options: joinValues(options),
|
|
148
150
|
ns,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { $ZodErrorMap } from \"zod/v4/core\";\nimport i18next, { i18n } from \"i18next\";\nimport { ZodLiteral, ZodEnum, ZodUnion, ZodDiscriminatedUnion } from \"zod/v4\";\nimport { en } from \"zod/locales\";\n\nconst jsonStringifyReplacer = (_: string, value: any): any => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n};\n\nfunction joinValues<T extends any[]>(array: T, separator = \" | \"): string {\n return array\n .map((val) => {\n if (typeof val === \"string\") return `'${val}'`;\n else if (typeof val === \"bigint\") return `${val.toString()}`;\n return val;\n })\n .join(separator);\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n if (typeof value !== \"object\" || value === null) return false;\n\n for (const key in value) {\n if (!Object.prototype.hasOwnProperty.call(value, key)) return false;\n }\n\n return true;\n};\n\nconst getKeyAndValues = (\n param: unknown,\n defaultKey: string\n): {\n values: Record<string, unknown>;\n key: string;\n} => {\n if (typeof param === \"string\") return { key: param, values: {} };\n\n if (isRecord(param)) {\n const key =\n \"key\" in param && typeof param.key === \"string\" ? param.key : defaultKey;\n const values =\n \"values\" in param && isRecord(param.values) ? param.values : {};\n return { key, values };\n }\n\n return { key: defaultKey, values: {} };\n};\n\nexport type MakeZodI18nMap = (option?: ZodI18nMapOption) => $ZodErrorMap;\n\nexport type ZodI18nMapOption = {\n t?: i18n[\"t\"];\n ns?: string | readonly string[];\n handlePath?: HandlePathOption | false;\n};\n\nexport type HandlePathOption = {\n context?: string;\n ns?: string | readonly string[];\n keyPrefix?: string;\n};\n\nconst defaultNs = \"zod\";\n\nconst getReceivedDataType = (data: unknown): string => {\n const typeofData = typeof data;\n\n switch (typeofData) {\n case \"number\": {\n if (Number.isNaN(data)) return \"NaN\";\n else if (Number.isInteger(data)) return \"number\";\n else return \"float\";\n }\n case \"object\": {\n if (Array.isArray(data)) return \"array\";\n else if (data === null) return \"null\";\n else if (\n Object.getPrototypeOf(data) !== Object.prototype &&\n data?.constructor\n )\n return data.constructor.name;\n }\n }\n return typeofData;\n};\n\nexport const makeZodI18nMap: MakeZodI18nMap = (option) => (issue) => {\n const { t, ns, handlePath } = {\n t: i18next.t,\n ns: defaultNs,\n ...option,\n handlePath:\n option?.handlePath !== false\n ? {\n context: \"with_path\",\n ns: option?.ns ?? defaultNs,\n keyPrefix: undefined,\n ...option?.handlePath,\n }\n : null,\n };\n\n let message: string;\n const errorMsg = en().localeError(issue);\n message = (typeof errorMsg === \"string\" ? errorMsg : errorMsg?.message) ?? \"\";\n\n const path =\n (issue.path?.length ?? 0) > 0 && !!handlePath\n ? {\n context: handlePath.context,\n path: t(\n [handlePath.keyPrefix, issue.path?.join(\".\")]\n .filter(Boolean)\n .join(\".\"),\n {\n ns: handlePath.ns,\n defaultValue: issue.path?.join(\".\"),\n }\n ),\n }\n : {};\n\n switch (issue.code) {\n case \"invalid_type\":\n if (issue.input === undefined) {\n message = t(\"errors.invalid_type_received_undefined\", {\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (issue.input === null) {\n message = t(\"errors.invalid_type_received_null\", {\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (issue.input === Infinity) {\n message = t(\"errors.not_finite\", {\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (\n issue.input instanceof Date &&\n Number.isNaN(issue.input.getTime())\n ) {\n message = t(\"errors.invalid_date\", {\n ns,\n defaultValue: message,\n ...path,\n });\n } else {\n const received = getReceivedDataType(issue.input).toLocaleLowerCase();\n message = t(\"errors.invalid_type\", {\n expected: t(`types.${issue.expected}`, {\n defaultValue: issue.expected,\n ns,\n }),\n received: t(`types.${received}`, {\n defaultValue: received,\n ns,\n }),\n ns,\n defaultValue: message,\n ...path,\n });\n }\n break;\n case \"invalid_value\":\n if (issue.inst instanceof ZodLiteral) {\n message = t(\"errors.invalid_literal\", {\n expected: joinValues(issue.values),\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (issue.inst instanceof ZodEnum) {\n message = t(\"errors.invalid_enum_value\", {\n options: joinValues(issue.values),\n received: issue.input,\n ns,\n defaultValue: message,\n ...path,\n });\n }\n break;\n case \"unrecognized_keys\":\n message = t(\"errors.unrecognized_keys\", {\n keys: joinValues(issue.keys, \", \"),\n count: issue.keys.length,\n ns,\n defaultValue: message,\n ...path,\n });\n break;\n case \"invalid_union\":\n // This one must be first (narrower type)\n if (issue.inst instanceof ZodDiscriminatedUnion) {\n const options = issue.inst?.def.options.map(\n (opt: any) => opt.def.shape.type.def.values[0]\n );\n message = t(\"errors.invalid_union_discriminator\", {\n options: joinValues(options),\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (issue.inst instanceof ZodUnion) {\n message = t(\"errors.invalid_union\", {\n ns,\n defaultValue: message,\n ...path,\n });\n } else {\n message = t(\"errors.invalid_union\", {\n ns,\n defaultValue: message,\n ...path,\n });\n }\n break;\n case \"invalid_format\":\n if (issue.format === \"date\") {\n message = t(\"errors.invalid_date\", {\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (issue.format === \"starts_with\") {\n message = t(`errors.invalid_string.startsWith`, {\n startsWith: issue.prefix,\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (issue.format === \"ends_with\") {\n message = t(`errors.invalid_string.endsWith`, {\n endsWith: issue.suffix,\n ns,\n defaultValue: message,\n ...path,\n });\n } else {\n message = t(`errors.invalid_string.${issue.format}`, {\n validation: t(`validations.${issue.format}`, {\n defaultValue: issue.format,\n ns,\n }),\n ns,\n defaultValue: message,\n ...path,\n });\n }\n break;\n case \"too_small\":\n const minimum =\n issue.origin === \"date\"\n ? new Date(Number(issue.minimum))\n : issue.minimum;\n message = t(\n `errors.too_small.${issue.origin}.${\n issue.exact\n ? \"exact\"\n : issue.inclusive\n ? \"inclusive\"\n : \"not_inclusive\"\n }`,\n {\n minimum,\n count: typeof minimum === \"number\" ? minimum : undefined,\n ns,\n defaultValue: message,\n ...path,\n }\n );\n break;\n case \"too_big\":\n const maximum =\n issue.origin === \"date\"\n ? new Date(Number(issue.maximum))\n : issue.maximum;\n message = t(\n `errors.too_big.${issue.origin}.${\n issue.exact\n ? \"exact\"\n : issue.inclusive\n ? \"inclusive\"\n : \"not_inclusive\"\n }`,\n {\n maximum,\n count: typeof maximum === \"number\" ? maximum : undefined,\n ns,\n defaultValue: message,\n ...path,\n }\n );\n break;\n case \"custom\":\n const { key, values } = getKeyAndValues(\n issue.params?.i18n,\n \"errors.custom\"\n );\n\n message = t(key, {\n ...values,\n ns,\n defaultValue: message,\n ...path,\n });\n break;\n case \"not_multiple_of\":\n message = t(\"errors.not_multiple_of\", {\n multipleOf: issue.divisor,\n ns,\n defaultValue: message,\n ...path,\n });\n break;\n default:\n }\n return { message };\n};\n\nexport const zodI18nMap = makeZodI18nMap();\n"],"mappings":";AACA,OAAO,aAAuB;AAC9B,SAAS,YAAY,SAAS,UAAU,6BAA6B;AACrE,SAAS,UAAU;AASnB,SAAS,WAA4B,OAAU,YAAY,OAAe;AACxE,SAAO,MACJ,IAAI,CAAC,QAAQ;AACZ,QAAI,OAAO,QAAQ,SAAU,QAAO,IAAI,GAAG;AAAA,aAClC,OAAO,QAAQ,SAAU,QAAO,GAAG,IAAI,SAAS,CAAC;AAC1D,WAAO;AAAA,EACT,CAAC,EACA,KAAK,SAAS;AACnB;AAEA,IAAM,WAAW,CAAC,UAAqD;AACrE,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AAExD,aAAW,OAAO,OAAO;AACvB,QAAI,CAAC,OAAO,UAAU,eAAe,KAAK,OAAO,GAAG,EAAG,QAAO;AAAA,EAChE;AAEA,SAAO;AACT;AAEA,IAAM,kBAAkB,CACtB,OACA,eAIG;AACH,MAAI,OAAO,UAAU,SAAU,QAAO,EAAE,KAAK,OAAO,QAAQ,CAAC,EAAE;AAE/D,MAAI,SAAS,KAAK,GAAG;AACnB,UAAM,MACJ,SAAS,SAAS,OAAO,MAAM,QAAQ,WAAW,MAAM,MAAM;AAChE,UAAM,SACJ,YAAY,SAAS,SAAS,MAAM,MAAM,IAAI,MAAM,SAAS,CAAC;AAChE,WAAO,EAAE,KAAK,OAAO;AAAA,EACvB;AAEA,SAAO,EAAE,KAAK,YAAY,QAAQ,CAAC,EAAE;AACvC;AAgBA,IAAM,YAAY;AAElB,IAAM,sBAAsB,CAAC,SAA0B;AACrD,QAAM,aAAa,OAAO;AAE1B,UAAQ,YAAY;AAAA,IAClB,KAAK,UAAU;AACb,UAAI,OAAO,MAAM,IAAI,EAAG,QAAO;AAAA,eACtB,OAAO,UAAU,IAAI,EAAG,QAAO;AAAA,UACnC,QAAO;AAAA,IACd;AAAA,IACA,KAAK,UAAU;AACb,UAAI,MAAM,QAAQ,IAAI,EAAG,QAAO;AAAA,eACvB,SAAS,KAAM,QAAO;AAAA,eAE7B,OAAO,eAAe,IAAI,MAAM,OAAO,aACvC,MAAM;AAEN,eAAO,KAAK,YAAY;AAAA,IAC5B;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,iBAAiC,CAAC,WAAW,CAAC,UAAU;AACnE,QAAM,EAAE,GAAG,IAAI,WAAW,IAAI;AAAA,IAC5B,GAAG,QAAQ;AAAA,IACX,IAAI;AAAA,IACJ,GAAG;AAAA,IACH,YACE,QAAQ,eAAe,QACnB;AAAA,MACE,SAAS;AAAA,MACT,IAAI,QAAQ,MAAM;AAAA,MAClB,WAAW;AAAA,MACX,GAAG,QAAQ;AAAA,IACb,IACA;AAAA,EACR;AAEA,MAAI;AACJ,QAAM,WAAW,GAAG,EAAE,YAAY,KAAK;AACvC,aAAW,OAAO,aAAa,WAAW,WAAW,UAAU,YAAY;AAE3E,QAAM,QACH,MAAM,MAAM,UAAU,KAAK,KAAK,CAAC,CAAC,aAC/B;AAAA,IACE,SAAS,WAAW;AAAA,IACpB,MAAM;AAAA,MACJ,CAAC,WAAW,WAAW,MAAM,MAAM,KAAK,GAAG,CAAC,EACzC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACX;AAAA,QACE,IAAI,WAAW;AAAA,QACf,cAAc,MAAM,MAAM,KAAK,GAAG;AAAA,MACpC;AAAA,IACF;AAAA,EACF,IACA,CAAC;AAEP,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,UAAI,MAAM,UAAU,QAAW;AAC7B,kBAAU,EAAE,0CAA0C;AAAA,UACpD;AAAA,UACA,cAAc;AAAA,UACd,GAAG;AAAA,QACL,CAAC;AAAA,MACH,WAAW,MAAM,UAAU,MAAM;AAC/B,kBAAU,EAAE,qCAAqC;AAAA,UAC/C;AAAA,UACA,cAAc;AAAA,UACd,GAAG;AAAA,QACL,CAAC;AAAA,MACH,WAAW,MAAM,UAAU,UAAU;AACnC,kBAAU,EAAE,qBAAqB;AAAA,UAC/B;AAAA,UACA,cAAc;AAAA,UACd,GAAG;AAAA,QACL,CAAC;AAAA,MACH,WACE,MAAM,iBAAiB,QACvB,OAAO,MAAM,MAAM,MAAM,QAAQ,CAAC,GAClC;AACA,kBAAU,EAAE,uBAAuB;AAAA,UACjC;AAAA,UACA,cAAc;AAAA,UACd,GAAG;AAAA,QACL,CAAC;AAAA,MACH,OAAO;AACL,cAAM,WAAW,oBAAoB,MAAM,KAAK,EAAE,kBAAkB;AACpE,kBAAU,EAAE,uBAAuB;AAAA,UACjC,UAAU,EAAE,SAAS,MAAM,QAAQ,IAAI;AAAA,YACrC,cAAc,MAAM;AAAA,YACpB;AAAA,UACF,CAAC;AAAA,UACD,UAAU,EAAE,SAAS,QAAQ,IAAI;AAAA,YAC/B,cAAc;AAAA,YACd;AAAA,UACF,CAAC;AAAA,UACD;AAAA,UACA,cAAc;AAAA,UACd,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AACA;AAAA,IACF,KAAK;AACH,UAAI,MAAM,gBAAgB,YAAY;AACpC,kBAAU,EAAE,0BAA0B;AAAA,UACpC,UAAU,WAAW,MAAM,MAAM;AAAA,UACjC;AAAA,UACA,cAAc;AAAA,UACd,GAAG;AAAA,QACL,CAAC;AAAA,MACH,WAAW,MAAM,gBAAgB,SAAS;AACxC,kBAAU,EAAE,6BAA6B;AAAA,UACvC,SAAS,WAAW,MAAM,MAAM;AAAA,UAChC,UAAU,MAAM;AAAA,UAChB;AAAA,UACA,cAAc;AAAA,UACd,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AACA;AAAA,IACF,KAAK;AACH,gBAAU,EAAE,4BAA4B;AAAA,QACtC,MAAM,WAAW,MAAM,MAAM,IAAI;AAAA,QACjC,OAAO,MAAM,KAAK;AAAA,QAClB;AAAA,QACA,cAAc;AAAA,QACd,GAAG;AAAA,MACL,CAAC;AACD;AAAA,IACF,KAAK;AAEH,UAAI,MAAM,gBAAgB,uBAAuB;AAC/C,cAAM,UAAU,MAAM,MAAM,IAAI,QAAQ;AAAA,UACtC,CAAC,QAAa,IAAI,IAAI,MAAM,KAAK,IAAI,OAAO,CAAC;AAAA,QAC/C;AACA,kBAAU,EAAE,sCAAsC;AAAA,UAChD,SAAS,WAAW,OAAO;AAAA,UAC3B;AAAA,UACA,cAAc;AAAA,UACd,GAAG;AAAA,QACL,CAAC;AAAA,MACH,WAAW,MAAM,gBAAgB,UAAU;AACzC,kBAAU,EAAE,wBAAwB;AAAA,UAClC;AAAA,UACA,cAAc;AAAA,UACd,GAAG;AAAA,QACL,CAAC;AAAA,MACH,OAAO;AACL,kBAAU,EAAE,wBAAwB;AAAA,UAClC;AAAA,UACA,cAAc;AAAA,UACd,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AACA;AAAA,IACF,KAAK;AACH,UAAI,MAAM,WAAW,QAAQ;AAC3B,kBAAU,EAAE,uBAAuB;AAAA,UACjC;AAAA,UACA,cAAc;AAAA,UACd,GAAG;AAAA,QACL,CAAC;AAAA,MACH,WAAW,MAAM,WAAW,eAAe;AACzC,kBAAU,EAAE,oCAAoC;AAAA,UAC9C,YAAY,MAAM;AAAA,UAClB;AAAA,UACA,cAAc;AAAA,UACd,GAAG;AAAA,QACL,CAAC;AAAA,MACH,WAAW,MAAM,WAAW,aAAa;AACvC,kBAAU,EAAE,kCAAkC;AAAA,UAC5C,UAAU,MAAM;AAAA,UAChB;AAAA,UACA,cAAc;AAAA,UACd,GAAG;AAAA,QACL,CAAC;AAAA,MACH,OAAO;AACL,kBAAU,EAAE,yBAAyB,MAAM,MAAM,IAAI;AAAA,UACnD,YAAY,EAAE,eAAe,MAAM,MAAM,IAAI;AAAA,YAC3C,cAAc,MAAM;AAAA,YACpB;AAAA,UACF,CAAC;AAAA,UACD;AAAA,UACA,cAAc;AAAA,UACd,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AACA;AAAA,IACF,KAAK;AACH,YAAM,UACJ,MAAM,WAAW,SACb,IAAI,KAAK,OAAO,MAAM,OAAO,CAAC,IAC9B,MAAM;AACZ,gBAAU;AAAA,QACR,oBAAoB,MAAM,MAAM,IAC9B,MAAM,QACF,UACA,MAAM,YACN,cACA,eACN;AAAA,QACA;AAAA,UACE;AAAA,UACA,OAAO,OAAO,YAAY,WAAW,UAAU;AAAA,UAC/C;AAAA,UACA,cAAc;AAAA,UACd,GAAG;AAAA,QACL;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH,YAAM,UACJ,MAAM,WAAW,SACb,IAAI,KAAK,OAAO,MAAM,OAAO,CAAC,IAC9B,MAAM;AACZ,gBAAU;AAAA,QACR,kBAAkB,MAAM,MAAM,IAC5B,MAAM,QACF,UACA,MAAM,YACN,cACA,eACN;AAAA,QACA;AAAA,UACE;AAAA,UACA,OAAO,OAAO,YAAY,WAAW,UAAU;AAAA,UAC/C;AAAA,UACA,cAAc;AAAA,UACd,GAAG;AAAA,QACL;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH,YAAM,EAAE,KAAK,OAAO,IAAI;AAAA,QACtB,MAAM,QAAQ;AAAA,QACd;AAAA,MACF;AAEA,gBAAU,EAAE,KAAK;AAAA,QACf,GAAG;AAAA,QACH;AAAA,QACA,cAAc;AAAA,QACd,GAAG;AAAA,MACL,CAAC;AACD;AAAA,IACF,KAAK;AACH,gBAAU,EAAE,0BAA0B;AAAA,QACpC,YAAY,MAAM;AAAA,QAClB;AAAA,QACA,cAAc;AAAA,QACd,GAAG;AAAA,MACL,CAAC;AACD;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,QAAQ;AACnB;AAEO,IAAM,aAAa,eAAe;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { $ZodErrorMap } from \"zod/v4/core\";\nimport i18next, { i18n } from \"i18next\";\nimport { ZodLiteral, ZodEnum, ZodUnion, ZodDiscriminatedUnion } from \"zod/v4\";\nimport { en } from \"zod/v4/locales\";\n\nfunction joinValues<T extends any[]>(array: T, separator = \" | \"): string {\n return array\n .map((val) => {\n if (typeof val === \"string\") return `'${val}'`;\n else if (typeof val === \"bigint\") return `${val.toString()}`;\n return val;\n })\n .join(separator);\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n if (typeof value !== \"object\" || value === null) return false;\n\n for (const key in value) {\n if (!Object.prototype.hasOwnProperty.call(value, key)) return false;\n }\n\n return true;\n};\n\nconst getKeyAndValues = (\n param: unknown,\n defaultKey: string\n): {\n values: Record<string, unknown>;\n key: string;\n} => {\n if (typeof param === \"string\") return { key: param, values: {} };\n\n if (isRecord(param)) {\n const key =\n \"key\" in param && typeof param.key === \"string\" ? param.key : defaultKey;\n const values =\n \"values\" in param && isRecord(param.values) ? param.values : {};\n return { key, values };\n }\n\n return { key: defaultKey, values: {} };\n};\n\nexport type MakeZodI18nMap = (option?: ZodI18nMapOption) => $ZodErrorMap;\n\nexport type ZodI18nMapOption = {\n t?: i18n[\"t\"];\n ns?: string | readonly string[];\n handlePath?: HandlePathOption | false;\n};\n\nexport type HandlePathOption = {\n context?: string;\n ns?: string | readonly string[];\n keyPrefix?: string;\n};\n\nconst defaultNs = \"zod\";\n\nconst getReceivedDataType = (data: unknown): string => {\n const typeofData = typeof data;\n\n switch (typeofData) {\n case \"number\": {\n if (Number.isNaN(data)) return \"NaN\";\n else if (Number.isInteger(data)) return \"number\";\n else return \"float\";\n }\n case \"object\": {\n if (Array.isArray(data)) return \"array\";\n else if (data === null) return \"null\";\n else if (\n Object.getPrototypeOf(data) !== Object.prototype &&\n data?.constructor\n )\n return data.constructor.name;\n }\n }\n return typeofData;\n};\n\nexport const makeZodI18nMap: MakeZodI18nMap = (option) => (issue) => {\n const { t, ns, handlePath } = {\n t: i18next.t,\n ns: defaultNs,\n ...option,\n handlePath:\n option?.handlePath !== false\n ? {\n context: \"with_path\",\n ns: option?.ns ?? defaultNs,\n keyPrefix: undefined,\n ...option?.handlePath,\n }\n : null,\n };\n\n let message: string;\n const errorMsg = en().localeError(issue);\n message = (typeof errorMsg === \"string\" ? errorMsg : errorMsg?.message) ?? \"\";\n\n const path =\n (issue.path?.length ?? 0) > 0 && !!handlePath\n ? {\n context: handlePath.context,\n path: t(\n [handlePath.keyPrefix, issue.path?.join(\".\")]\n .filter(Boolean)\n .join(\".\"),\n {\n ns: handlePath.ns,\n defaultValue: issue.path?.join(\".\"),\n }\n ),\n }\n : {};\n\n switch (issue.code) {\n case \"invalid_type\":\n if (issue.input === undefined) {\n message = t(\"errors.invalid_type_received_undefined\", {\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (issue.input === null) {\n message = t(\"errors.invalid_type_received_null\", {\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (issue.input === Infinity) {\n message = t(\"errors.not_finite\", {\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (\n issue.input instanceof Date &&\n Number.isNaN(issue.input.getTime())\n ) {\n message = t(\"errors.invalid_date\", {\n ns,\n defaultValue: message,\n ...path,\n });\n } else {\n const received = getReceivedDataType(issue.input).toLocaleLowerCase();\n message = t(\"errors.invalid_type\", {\n expected: t(`types.${issue.expected}`, {\n defaultValue: issue.expected,\n ns,\n }),\n received: t(`types.${received}`, {\n defaultValue: received,\n ns,\n }),\n ns,\n defaultValue: message,\n ...path,\n });\n }\n break;\n case \"invalid_value\":\n if (issue.inst instanceof ZodLiteral) {\n message = t(\"errors.invalid_literal\", {\n expected: joinValues(issue.values),\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (issue.inst instanceof ZodEnum) {\n message = t(\"errors.invalid_enum_value\", {\n options: joinValues(issue.values),\n received: issue.input,\n ns,\n defaultValue: message,\n ...path,\n });\n }\n break;\n case \"unrecognized_keys\":\n message = t(\"errors.unrecognized_keys\", {\n keys: joinValues(issue.keys, \", \"),\n count: issue.keys.length,\n ns,\n defaultValue: message,\n ...path,\n });\n break;\n case \"invalid_union\":\n // This one must be first (narrower type)\n const issueInstance = issue.inst;\n if (issueInstance instanceof ZodDiscriminatedUnion) {\n const options = issueInstance.def.options.map((opt: any) => {\n const discriminator =\n issue.discriminator ?? issueInstance.def.discriminator;\n return opt.def.shape[discriminator!].def.values[0];\n });\n message = t(\"errors.invalid_union_discriminator\", {\n options: joinValues(options),\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (issue.inst instanceof ZodUnion) {\n message = t(\"errors.invalid_union\", {\n ns,\n defaultValue: message,\n ...path,\n });\n } else {\n message = t(\"errors.invalid_union\", {\n ns,\n defaultValue: message,\n ...path,\n });\n }\n break;\n case \"invalid_format\":\n if (issue.format === \"date\") {\n message = t(\"errors.invalid_date\", {\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (issue.format === \"starts_with\") {\n message = t(`errors.invalid_string.startsWith`, {\n startsWith: issue.prefix,\n ns,\n defaultValue: message,\n ...path,\n });\n } else if (issue.format === \"ends_with\") {\n message = t(`errors.invalid_string.endsWith`, {\n endsWith: issue.suffix,\n ns,\n defaultValue: message,\n ...path,\n });\n } else {\n message = t(`errors.invalid_string.${issue.format}`, {\n validation: t(`validations.${issue.format}`, {\n defaultValue: issue.format,\n ns,\n }),\n ns,\n defaultValue: message,\n ...path,\n });\n }\n break;\n case \"too_small\":\n const minimum =\n issue.origin === \"date\"\n ? new Date(Number(issue.minimum))\n : issue.minimum;\n message = t(\n `errors.too_small.${issue.origin}.${\n issue.exact\n ? \"exact\"\n : issue.inclusive\n ? \"inclusive\"\n : \"not_inclusive\"\n }`,\n {\n minimum,\n count: typeof minimum === \"number\" ? minimum : undefined,\n ns,\n defaultValue: message,\n ...path,\n }\n );\n break;\n case \"too_big\":\n const maximum =\n issue.origin === \"date\"\n ? new Date(Number(issue.maximum))\n : issue.maximum;\n message = t(\n `errors.too_big.${issue.origin}.${\n issue.exact\n ? \"exact\"\n : issue.inclusive\n ? \"inclusive\"\n : \"not_inclusive\"\n }`,\n {\n maximum,\n count: typeof maximum === \"number\" ? maximum : undefined,\n ns,\n defaultValue: message,\n ...path,\n }\n );\n break;\n case \"custom\":\n const { key, values } = getKeyAndValues(\n issue.params?.i18n,\n \"errors.custom\"\n );\n\n message = t(key, {\n ...values,\n ns,\n defaultValue: message,\n ...path,\n });\n break;\n case \"not_multiple_of\":\n message = t(\"errors.not_multiple_of\", {\n multipleOf: issue.divisor,\n ns,\n defaultValue: message,\n ...path,\n });\n break;\n default:\n }\n return { message };\n};\n\nexport const zodI18nMap = makeZodI18nMap();\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@semihbou/zod-i18n-map",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "A library for localizing zod error messages.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -9,22 +9,20 @@
|
|
|
9
9
|
"dist",
|
|
10
10
|
"locales"
|
|
11
11
|
],
|
|
12
|
-
"
|
|
12
|
+
"publishConfig": {
|
|
13
|
+
"access": "public",
|
|
14
|
+
"registry": "https://registry.npmjs.org/"
|
|
15
|
+
},
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "https://github.com/VC-Semih/zod-i18n"
|
|
19
|
+
},
|
|
13
20
|
"author": "VC-Semih <semihciftci.pro@gmail.com>",
|
|
14
21
|
"license": "MIT",
|
|
15
|
-
"scripts": {
|
|
16
|
-
"build": "tsup",
|
|
17
|
-
"dev": "tsup --watch",
|
|
18
|
-
"test": "vitest run",
|
|
19
|
-
"test:coverage": "vitest run --coverage",
|
|
20
|
-
"clean": "rimraf dist",
|
|
21
|
-
"release": "semantic-release",
|
|
22
|
-
"prepack": "yarn build"
|
|
23
|
-
},
|
|
24
22
|
"peerDependencies": {
|
|
25
23
|
"i18next": ">=21.3.0",
|
|
26
24
|
"i18next-icu": ">=2.0.0",
|
|
27
|
-
"zod": ">=4.
|
|
25
|
+
"zod": ">=4.6.4"
|
|
28
26
|
},
|
|
29
27
|
"peerDependenciesMeta": {
|
|
30
28
|
"i18next-icu": {
|
|
@@ -34,16 +32,23 @@
|
|
|
34
32
|
"devDependencies": {
|
|
35
33
|
"@tsconfig/node16": "^1.0.3",
|
|
36
34
|
"@types/node": "^18.15.3",
|
|
37
|
-
"@vitest/coverage-
|
|
38
|
-
"c8": "^7.12.0",
|
|
35
|
+
"@vitest/coverage-v8": "^5.0.0",
|
|
39
36
|
"i18next": "^22.4.9",
|
|
40
37
|
"i18next-icu": "^2.4.4",
|
|
41
38
|
"intl-messageformat": "^11.2.9",
|
|
42
39
|
"rimraf": "^5.0.0",
|
|
43
40
|
"tsup": "8.5.0",
|
|
44
41
|
"typescript": "^5.7.3",
|
|
45
|
-
"vite": "
|
|
46
|
-
"vitest": "^
|
|
47
|
-
"zod": "^4.
|
|
42
|
+
"vite": "8.0.16",
|
|
43
|
+
"vitest": "^5.0.0",
|
|
44
|
+
"zod": "^4.6.4"
|
|
45
|
+
},
|
|
46
|
+
"scripts": {
|
|
47
|
+
"build": "tsup",
|
|
48
|
+
"dev": "tsup --watch",
|
|
49
|
+
"test": "vitest run",
|
|
50
|
+
"test:coverage": "vitest run --coverage",
|
|
51
|
+
"clean": "rimraf dist",
|
|
52
|
+
"release": "semantic-release"
|
|
48
53
|
}
|
|
49
|
-
}
|
|
54
|
+
}
|