@zod-utils/react-hook-form 0.1.0 → 0.2.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/README.md +100 -108
- package/dist/index.d.mts +210 -47
- package/dist/index.d.ts +210 -47
- package/dist/index.js +1 -281
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -278
- package/dist/index.mjs.map +1 -1
- package/package.json +13 -5
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
export * from '@zod-utils/core';
|
|
1
2
|
import { zodResolver } from '@hookform/resolvers/zod';
|
|
2
3
|
import { useForm } from 'react-hook-form';
|
|
3
|
-
export * from '@zod-utils/core';
|
|
4
4
|
|
|
5
5
|
var __defProp = Object.defineProperty;
|
|
6
6
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
@@ -44,282 +44,6 @@ var useZodForm = (_a) => {
|
|
|
44
44
|
}, formOptions));
|
|
45
45
|
};
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
var Nouns = {
|
|
49
|
-
regex: "\u5165\u529B\u5024",
|
|
50
|
-
email: "\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9",
|
|
51
|
-
url: "URL",
|
|
52
|
-
emoji: "\u7D75\u6587\u5B57",
|
|
53
|
-
uuid: "UUID",
|
|
54
|
-
uuidv4: "UUIDv4",
|
|
55
|
-
uuidv6: "UUIDv6",
|
|
56
|
-
nanoid: "nanoid",
|
|
57
|
-
guid: "GUID",
|
|
58
|
-
cuid: "cuid",
|
|
59
|
-
cuid2: "cuid2",
|
|
60
|
-
ulid: "ULID",
|
|
61
|
-
xid: "XID",
|
|
62
|
-
ksuid: "KSUID",
|
|
63
|
-
datetime: "ISO\u65E5\u6642",
|
|
64
|
-
date: "ISO\u65E5\u4ED8",
|
|
65
|
-
time: "ISO\u6642\u523B",
|
|
66
|
-
duration: "ISO\u671F\u9593",
|
|
67
|
-
ipv4: "IPv4\u30A2\u30C9\u30EC\u30B9",
|
|
68
|
-
ipv6: "IPv6\u30A2\u30C9\u30EC\u30B9",
|
|
69
|
-
cidrv4: "IPv4\u7BC4\u56F2",
|
|
70
|
-
cidrv6: "IPv6\u7BC4\u56F2",
|
|
71
|
-
base64: "base64\u30A8\u30F3\u30B3\u30FC\u30C9\u6587\u5B57\u5217",
|
|
72
|
-
base64url: "base64url\u30A8\u30F3\u30B3\u30FC\u30C9\u6587\u5B57\u5217",
|
|
73
|
-
json_string: "JSON\u6587\u5B57\u5217",
|
|
74
|
-
e164: "E.164\u756A\u53F7",
|
|
75
|
-
jwt: "JWT",
|
|
76
|
-
template_literal: "\u5165\u529B\u5024"
|
|
77
|
-
};
|
|
78
|
-
function stringifyPrimitive(value) {
|
|
79
|
-
if (typeof value === "bigint") return `${value.toString()}n`;
|
|
80
|
-
if (typeof value === "string") return `"${value}"`;
|
|
81
|
-
return `${value}`;
|
|
82
|
-
}
|
|
83
|
-
function joinValues(array, separator = "\u3001") {
|
|
84
|
-
return array.map((val) => stringifyPrimitive(val)).join(separator);
|
|
85
|
-
}
|
|
86
|
-
var Sizable = {
|
|
87
|
-
string: { unit: "\u6587\u5B57", verb: "\u3067\u3042\u308B" },
|
|
88
|
-
file: { unit: "\u30D0\u30A4\u30C8", verb: "\u3067\u3042\u308B" },
|
|
89
|
-
array: { unit: "\u8981\u7D20", verb: "\u3067\u3042\u308B" },
|
|
90
|
-
set: { unit: "\u8981\u7D20", verb: "\u3067\u3042\u308B" }
|
|
91
|
-
};
|
|
92
|
-
function getSizing(origin) {
|
|
93
|
-
var _a;
|
|
94
|
-
return (_a = Sizable[origin]) != null ? _a : null;
|
|
95
|
-
}
|
|
96
|
-
function parsedType(data) {
|
|
97
|
-
const t = typeof data;
|
|
98
|
-
switch (t) {
|
|
99
|
-
case "number": {
|
|
100
|
-
return Number.isNaN(data) ? "NaN" : "\u6570\u5024";
|
|
101
|
-
}
|
|
102
|
-
case "object": {
|
|
103
|
-
if (Array.isArray(data)) {
|
|
104
|
-
return "\u914D\u5217";
|
|
105
|
-
}
|
|
106
|
-
if (data === null) {
|
|
107
|
-
return "null";
|
|
108
|
-
}
|
|
109
|
-
if (Object.getPrototypeOf(data) !== Object.prototype && data && data.constructor) {
|
|
110
|
-
return data.constructor.name;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
return t;
|
|
115
|
-
}
|
|
116
|
-
function createJapaneseErrorMap(fieldName) {
|
|
117
|
-
return (issue) => {
|
|
118
|
-
var _a;
|
|
119
|
-
const field = fieldName || "\u3053\u306E\u9805\u76EE";
|
|
120
|
-
switch (issue.code) {
|
|
121
|
-
case "custom": {
|
|
122
|
-
return "\u7121\u52B9\u306A\u5165\u529B";
|
|
123
|
-
}
|
|
124
|
-
case "invalid_type":
|
|
125
|
-
return `\u7121\u52B9\u306A\u5165\u529B: ${issue.expected}\u304C\u671F\u5F85\u3055\u308C\u307E\u3057\u305F\u304C\u3001${parsedType(issue.input)}\u304C\u5165\u529B\u3055\u308C\u307E\u3057\u305F`;
|
|
126
|
-
case "invalid_value":
|
|
127
|
-
if (issue.values.length === 1)
|
|
128
|
-
return `\u7121\u52B9\u306A\u5165\u529B: ${stringifyPrimitive(issue.values[0])}\u304C\u671F\u5F85\u3055\u308C\u307E\u3057\u305F`;
|
|
129
|
-
return `\u7121\u52B9\u306A\u9078\u629E: ${joinValues(issue.values)}\u306E\u3044\u305A\u308C\u304B\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;
|
|
130
|
-
case "too_big": {
|
|
131
|
-
const adj = issue.inclusive ? "\u4EE5\u4E0B\u3067\u3042\u308B" : "\u3088\u308A\u5C0F\u3055\u3044";
|
|
132
|
-
const sizing = getSizing(issue.origin);
|
|
133
|
-
if (sizing)
|
|
134
|
-
return `\u5927\u304D\u3059\u304E\u308B\u5024: ${field}\u306F${issue.maximum.toString()}${sizing.unit}${adj}\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;
|
|
135
|
-
return `\u5927\u304D\u3059\u304E\u308B\u5024: ${field}\u306F${issue.maximum.toString()}${adj}\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;
|
|
136
|
-
}
|
|
137
|
-
case "too_small": {
|
|
138
|
-
const adj = issue.inclusive ? "\u4EE5\u4E0A\u3067\u3042\u308B" : "\u3088\u308A\u5927\u304D\u3044";
|
|
139
|
-
const sizing = getSizing(issue.origin);
|
|
140
|
-
if (issue.minimum === 1) {
|
|
141
|
-
return "\u5FC5\u9808\u9805\u76EE\u3067\u3059";
|
|
142
|
-
}
|
|
143
|
-
if (sizing)
|
|
144
|
-
return `\u5C0F\u3055\u3059\u304E\u308B\u5024: ${field}\u306F${issue.minimum.toString()}${sizing.unit}${adj}\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;
|
|
145
|
-
return `\u5C0F\u3055\u3059\u304E\u308B\u5024: ${field}\u306F${issue.minimum.toString()}${adj}\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;
|
|
146
|
-
}
|
|
147
|
-
case "invalid_format": {
|
|
148
|
-
const _issue = issue;
|
|
149
|
-
if (_issue.format === "starts_with")
|
|
150
|
-
return `\u7121\u52B9\u306A\u6587\u5B57\u5217: "${_issue.prefix}"\u3067\u59CB\u307E\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;
|
|
151
|
-
if (_issue.format === "ends_with")
|
|
152
|
-
return `\u7121\u52B9\u306A\u6587\u5B57\u5217: "${_issue.suffix}"\u3067\u7D42\u308F\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;
|
|
153
|
-
if (_issue.format === "includes")
|
|
154
|
-
return `\u7121\u52B9\u306A\u6587\u5B57\u5217: "${_issue.includes}"\u3092\u542B\u3080\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;
|
|
155
|
-
if (_issue.format === "regex")
|
|
156
|
-
return `\u7121\u52B9\u306A\u6587\u5B57\u5217: \u30D1\u30BF\u30FC\u30F3${_issue.pattern}\u306B\u4E00\u81F4\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;
|
|
157
|
-
return `\u7121\u52B9\u306A${(_a = Nouns[_issue.format]) != null ? _a : issue.format}`;
|
|
158
|
-
}
|
|
159
|
-
case "not_multiple_of":
|
|
160
|
-
return `\u7121\u52B9\u306A\u6570\u5024: ${issue.divisor}\u306E\u500D\u6570\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;
|
|
161
|
-
case "unrecognized_keys":
|
|
162
|
-
return `\u8A8D\u8B58\u3055\u308C\u3066\u3044\u306A\u3044\u30AD\u30FC${issue.keys.length > 1 ? "\u7FA4" : ""}: ${joinValues(issue.keys)}`;
|
|
163
|
-
case "invalid_key":
|
|
164
|
-
return `${field}\u5185\u306E\u7121\u52B9\u306A\u30AD\u30FC`;
|
|
165
|
-
case "invalid_union":
|
|
166
|
-
return "\u7121\u52B9\u306A\u5165\u529B";
|
|
167
|
-
case "invalid_element":
|
|
168
|
-
return `${field}\u5185\u306E\u7121\u52B9\u306A\u5024`;
|
|
169
|
-
default:
|
|
170
|
-
return "\u7121\u52B9\u306A\u5165\u529B";
|
|
171
|
-
}
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
// src/locales/en.ts
|
|
176
|
-
var Nouns2 = {
|
|
177
|
-
regex: "input",
|
|
178
|
-
email: "email address",
|
|
179
|
-
url: "URL",
|
|
180
|
-
emoji: "emoji",
|
|
181
|
-
uuid: "UUID",
|
|
182
|
-
uuidv4: "UUIDv4",
|
|
183
|
-
uuidv6: "UUIDv6",
|
|
184
|
-
nanoid: "nanoid",
|
|
185
|
-
guid: "GUID",
|
|
186
|
-
cuid: "cuid",
|
|
187
|
-
cuid2: "cuid2",
|
|
188
|
-
ulid: "ULID",
|
|
189
|
-
xid: "XID",
|
|
190
|
-
ksuid: "KSUID",
|
|
191
|
-
datetime: "ISO datetime",
|
|
192
|
-
date: "ISO date",
|
|
193
|
-
time: "ISO time",
|
|
194
|
-
duration: "ISO duration",
|
|
195
|
-
ipv4: "IPv4 address",
|
|
196
|
-
ipv6: "IPv6 address",
|
|
197
|
-
cidrv4: "IPv4 CIDR",
|
|
198
|
-
cidrv6: "IPv6 CIDR",
|
|
199
|
-
base64: "base64 encoded string",
|
|
200
|
-
base64url: "base64url encoded string",
|
|
201
|
-
json_string: "JSON string",
|
|
202
|
-
e164: "E.164 phone number",
|
|
203
|
-
jwt: "JWT",
|
|
204
|
-
template_literal: "input"
|
|
205
|
-
};
|
|
206
|
-
function stringifyPrimitive2(value) {
|
|
207
|
-
if (typeof value === "bigint") return `${value.toString()}n`;
|
|
208
|
-
if (typeof value === "string") return `"${value}"`;
|
|
209
|
-
return `${value}`;
|
|
210
|
-
}
|
|
211
|
-
function joinValues2(array, separator = " | ") {
|
|
212
|
-
return array.map((val) => stringifyPrimitive2(val)).join(separator);
|
|
213
|
-
}
|
|
214
|
-
var Sizable2 = {
|
|
215
|
-
string: "character",
|
|
216
|
-
file: "byte",
|
|
217
|
-
array: "item",
|
|
218
|
-
set: "item"
|
|
219
|
-
};
|
|
220
|
-
function getSizing2(origin) {
|
|
221
|
-
var _a;
|
|
222
|
-
return (_a = Sizable2[origin]) != null ? _a : null;
|
|
223
|
-
}
|
|
224
|
-
function parsedType2(data) {
|
|
225
|
-
const t = typeof data;
|
|
226
|
-
switch (t) {
|
|
227
|
-
case "number": {
|
|
228
|
-
return Number.isNaN(data) ? "NaN" : "number";
|
|
229
|
-
}
|
|
230
|
-
case "object": {
|
|
231
|
-
if (Array.isArray(data)) {
|
|
232
|
-
return "array";
|
|
233
|
-
}
|
|
234
|
-
if (data === null) {
|
|
235
|
-
return "null";
|
|
236
|
-
}
|
|
237
|
-
if (Object.getPrototypeOf(data) !== Object.prototype && data && data.constructor) {
|
|
238
|
-
return data.constructor.name;
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
return t;
|
|
243
|
-
}
|
|
244
|
-
function createEnglishErrorMap(fieldName) {
|
|
245
|
-
return (issue) => {
|
|
246
|
-
var _a;
|
|
247
|
-
const field = fieldName || "This field";
|
|
248
|
-
switch (issue.code) {
|
|
249
|
-
case "custom": {
|
|
250
|
-
return "Invalid input";
|
|
251
|
-
}
|
|
252
|
-
case "invalid_type":
|
|
253
|
-
return `Invalid type: expected ${issue.expected}, received ${parsedType2(issue.input)}`;
|
|
254
|
-
case "invalid_value":
|
|
255
|
-
if (issue.values.length === 1)
|
|
256
|
-
return `Invalid input: expected ${stringifyPrimitive2(issue.values[0])}`;
|
|
257
|
-
return `Invalid option: must be one of ${joinValues2(issue.values)}`;
|
|
258
|
-
case "too_big": {
|
|
259
|
-
const unit = getSizing2(issue.origin);
|
|
260
|
-
const plural = issue.maximum !== 1 ? "s" : "";
|
|
261
|
-
if (unit) {
|
|
262
|
-
return issue.inclusive ? `${field} must be at most ${issue.maximum} ${unit}${plural}` : `${field} must be less than ${issue.maximum} ${unit}${plural}`;
|
|
263
|
-
}
|
|
264
|
-
return issue.inclusive ? `${field} must be at most ${issue.maximum}` : `${field} must be less than ${issue.maximum}`;
|
|
265
|
-
}
|
|
266
|
-
case "too_small": {
|
|
267
|
-
const unit = getSizing2(issue.origin);
|
|
268
|
-
const plural = issue.minimum !== 1 ? "s" : "";
|
|
269
|
-
if (issue.minimum === 1 && !unit) {
|
|
270
|
-
return `${field} is required`;
|
|
271
|
-
}
|
|
272
|
-
if (unit) {
|
|
273
|
-
return issue.inclusive ? `${field} must be at least ${issue.minimum} ${unit}${plural}` : `${field} must be greater than ${issue.minimum} ${unit}${plural}`;
|
|
274
|
-
}
|
|
275
|
-
return issue.inclusive ? `${field} must be at least ${issue.minimum}` : `${field} must be greater than ${issue.minimum}`;
|
|
276
|
-
}
|
|
277
|
-
case "invalid_format": {
|
|
278
|
-
const _issue = issue;
|
|
279
|
-
if (_issue.format === "starts_with")
|
|
280
|
-
return `Invalid string: must start with "${_issue.prefix}"`;
|
|
281
|
-
if (_issue.format === "ends_with")
|
|
282
|
-
return `Invalid string: must end with "${_issue.suffix}"`;
|
|
283
|
-
if (_issue.format === "includes")
|
|
284
|
-
return `Invalid string: must include "${_issue.includes}"`;
|
|
285
|
-
if (_issue.format === "regex")
|
|
286
|
-
return `Invalid string: must match pattern ${_issue.pattern}`;
|
|
287
|
-
return `Invalid ${(_a = Nouns2[_issue.format]) != null ? _a : _issue.format}`;
|
|
288
|
-
}
|
|
289
|
-
case "not_multiple_of":
|
|
290
|
-
return `Invalid number: must be a multiple of ${issue.divisor}`;
|
|
291
|
-
case "unrecognized_keys":
|
|
292
|
-
return `Unrecognized key${issue.keys.length > 1 ? "s" : ""}: ${joinValues2(issue.keys)}`;
|
|
293
|
-
case "invalid_key":
|
|
294
|
-
return `Invalid key in ${field}`;
|
|
295
|
-
case "invalid_union":
|
|
296
|
-
return "Invalid input";
|
|
297
|
-
case "invalid_element":
|
|
298
|
-
return `Invalid value in ${field}`;
|
|
299
|
-
default:
|
|
300
|
-
return "Invalid input";
|
|
301
|
-
}
|
|
302
|
-
};
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
// src/error-map.ts
|
|
306
|
-
var FieldNamespaceMapping = {
|
|
307
|
-
department: {
|
|
308
|
-
groupName: "\u90E8\u7F72\u30FB\u5E97\u8217\u540D"
|
|
309
|
-
}
|
|
310
|
-
};
|
|
311
|
-
var customErrorResolver = ({
|
|
312
|
-
fieldNamespace
|
|
313
|
-
}) => {
|
|
314
|
-
return (issue) => {
|
|
315
|
-
var _a;
|
|
316
|
-
const fieldName = FieldNamespaceMapping[fieldNamespace][String(
|
|
317
|
-
(_a = issue.path) == null ? void 0 : _a[0]
|
|
318
|
-
)] || void 0;
|
|
319
|
-
return createJapaneseErrorMap(fieldName)(issue);
|
|
320
|
-
};
|
|
321
|
-
};
|
|
322
|
-
|
|
323
|
-
export { FieldNamespaceMapping, createEnglishErrorMap, createJapaneseErrorMap, customErrorResolver, useZodForm };
|
|
47
|
+
export { useZodForm };
|
|
324
48
|
//# sourceMappingURL=index.mjs.map
|
|
325
49
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/use-zod-form.ts","../src/locales/ja.ts","../src/locales/en.ts","../src/error-map.ts"],"names":["Nouns","stringifyPrimitive","joinValues","Sizable","getSizing","parsedType"],"mappings":"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","file":"index.mjs","sourcesContent":["import { zodResolver } from '@hookform/resolvers/zod';\nimport type { MakeOptionalAndNullable } from '@zod-utils/core';\nimport {\n type DefaultValues,\n type FieldValues,\n type UseFormProps,\n useForm,\n} from 'react-hook-form';\nimport type { ZodTypeAny } from 'zod';\n\n/**\n * Type-safe wrapper around useForm with Zod v4 schema integration\n * Automatically sets up zodResolver and provides better type inference\n *\n * @example\n * ```ts\n * const schema = z.object({\n * name: z.string(),\n * age: z.number()\n * });\n *\n * const form = useZodForm({\n * schema,\n * defaultValues: { name: '', age: 0 }\n * });\n * ```\n */\nexport const useZodForm = <T extends FieldValues>({\n schema,\n zodResolverOptions,\n ...formOptions\n}: {\n schema: ZodTypeAny;\n defaultValues?: DefaultValues<MakeOptionalAndNullable<T>>;\n zodResolverOptions?: Parameters<typeof zodResolver>[1];\n} & Omit<\n UseFormProps<MakeOptionalAndNullable<T>, unknown, T>,\n 'resolver' | 'defaultValues'\n>) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const resolver = zodResolver(schema as any, zodResolverOptions);\n\n return useForm({\n resolver,\n ...formOptions,\n });\n};\n","import type { ZodErrorMap } from 'zod';\n\nconst Nouns: Record<string, string> = {\n regex: '入力値',\n email: 'メールアドレス',\n url: 'URL',\n emoji: '絵文字',\n uuid: 'UUID',\n uuidv4: 'UUIDv4',\n uuidv6: 'UUIDv6',\n nanoid: 'nanoid',\n guid: 'GUID',\n cuid: 'cuid',\n cuid2: 'cuid2',\n ulid: 'ULID',\n xid: 'XID',\n ksuid: 'KSUID',\n datetime: 'ISO日時',\n date: 'ISO日付',\n time: 'ISO時刻',\n duration: 'ISO期間',\n ipv4: 'IPv4アドレス',\n ipv6: 'IPv6アドレス',\n cidrv4: 'IPv4範囲',\n cidrv6: 'IPv6範囲',\n base64: 'base64エンコード文字列',\n base64url: 'base64urlエンコード文字列',\n json_string: 'JSON文字列',\n e164: 'E.164番号',\n jwt: 'JWT',\n template_literal: '入力値',\n};\n\nfunction stringifyPrimitive(value: unknown): string {\n if (typeof value === 'bigint') return `${value.toString()}n`;\n if (typeof value === 'string') return `\"${value}\"`;\n return `${value}`;\n}\n\ntype Primitive = string | number | symbol | bigint | boolean | null | undefined;\nfunction joinValues<T extends Primitive[]>(array: T, separator = '、'): string {\n return array.map((val) => stringifyPrimitive(val)).join(separator);\n}\n\nconst Sizable: Record<string, { unit: string; verb: string }> = {\n string: { unit: '文字', verb: 'である' },\n file: { unit: 'バイト', verb: 'である' },\n array: { unit: '要素', verb: 'である' },\n set: { unit: '要素', verb: 'である' },\n};\n\nfunction getSizing(origin: string): { unit: string; verb: string } | null {\n return Sizable[origin] ?? null;\n}\n\nfunction parsedType(data: unknown): string {\n const t = typeof data;\n\n switch (t) {\n case 'number': {\n return Number.isNaN(data) ? 'NaN' : '数値';\n }\n case 'object': {\n if (Array.isArray(data)) {\n return '配列';\n }\n if (data === null) {\n return 'null';\n }\n\n if (\n Object.getPrototypeOf(data) !== Object.prototype &&\n data &&\n data.constructor\n ) {\n return data.constructor.name;\n }\n }\n }\n return t;\n}\n\n/**\n * Japanese error map for Zod validation errors\n * @param fieldName - Optional custom field name to use in error messages\n * @returns Zod error map function\n */\nexport function createJapaneseErrorMap(\n fieldName?: string,\n): (issue: Parameters<ZodErrorMap>[0]) => string {\n return (issue: Parameters<ZodErrorMap>[0]) => {\n const field = fieldName || 'この項目';\n\n switch (issue.code) {\n case 'custom': {\n return '無効な入力';\n }\n case 'invalid_type':\n return `無効な入力: ${issue.expected}が期待されましたが、${parsedType(issue.input)}が入力されました`;\n case 'invalid_value':\n if (issue.values.length === 1)\n return `無効な入力: ${stringifyPrimitive(issue.values[0])}が期待されました`;\n return `無効な選択: ${joinValues(issue.values)}のいずれかである必要があります`;\n case 'too_big': {\n const adj = issue.inclusive ? '以下である' : 'より小さい';\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `大きすぎる値: ${field}は${issue.maximum.toString()}${sizing.unit}${adj}必要があります`;\n return `大きすぎる値: ${field}は${issue.maximum.toString()}${adj}必要があります`;\n }\n case 'too_small': {\n const adj = issue.inclusive ? '以上である' : 'より大きい';\n const sizing = getSizing(issue.origin);\n if (issue.minimum === 1) {\n return '必須項目です';\n }\n if (sizing)\n return `小さすぎる値: ${field}は${issue.minimum.toString()}${sizing.unit}${adj}必要があります`;\n return `小さすぎる値: ${field}は${issue.minimum.toString()}${adj}必要があります`;\n }\n case 'invalid_format': {\n const _issue = issue as Extract<\n Parameters<ZodErrorMap>[0],\n { code: 'invalid_format' }\n >;\n if (_issue.format === 'starts_with')\n return `無効な文字列: \"${_issue.prefix}\"で始まる必要があります`;\n if (_issue.format === 'ends_with')\n return `無効な文字列: \"${_issue.suffix}\"で終わる必要があります`;\n if (_issue.format === 'includes')\n return `無効な文字列: \"${_issue.includes}\"を含む必要があります`;\n if (_issue.format === 'regex')\n return `無効な文字列: パターン${_issue.pattern}に一致する必要があります`;\n return `無効な${Nouns[_issue.format] ?? issue.format}`;\n }\n case 'not_multiple_of':\n return `無効な数値: ${issue.divisor}の倍数である必要があります`;\n case 'unrecognized_keys':\n return `認識されていないキー${issue.keys.length > 1 ? '群' : ''}: ${joinValues(issue.keys)}`;\n case 'invalid_key':\n return `${field}内の無効なキー`;\n case 'invalid_union':\n return '無効な入力';\n case 'invalid_element':\n return `${field}内の無効な値`;\n default:\n return '無効な入力';\n }\n };\n}\n","import type { ZodErrorMap } from 'zod';\n\nconst Nouns: Record<string, string> = {\n regex: 'input',\n email: 'email address',\n url: 'URL',\n emoji: 'emoji',\n uuid: 'UUID',\n uuidv4: 'UUIDv4',\n uuidv6: 'UUIDv6',\n nanoid: 'nanoid',\n guid: 'GUID',\n cuid: 'cuid',\n cuid2: 'cuid2',\n ulid: 'ULID',\n xid: 'XID',\n ksuid: 'KSUID',\n datetime: 'ISO datetime',\n date: 'ISO date',\n time: 'ISO time',\n duration: 'ISO duration',\n ipv4: 'IPv4 address',\n ipv6: 'IPv6 address',\n cidrv4: 'IPv4 CIDR',\n cidrv6: 'IPv6 CIDR',\n base64: 'base64 encoded string',\n base64url: 'base64url encoded string',\n json_string: 'JSON string',\n e164: 'E.164 phone number',\n jwt: 'JWT',\n template_literal: 'input',\n};\n\nfunction stringifyPrimitive(value: unknown): string {\n if (typeof value === 'bigint') return `${value.toString()}n`;\n if (typeof value === 'string') return `\"${value}\"`;\n return `${value}`;\n}\n\ntype Primitive = string | number | symbol | bigint | boolean | null | undefined;\nfunction joinValues<T extends Primitive[]>(\n array: T,\n separator = ' | ',\n): string {\n return array.map((val) => stringifyPrimitive(val)).join(separator);\n}\n\nconst Sizable: Record<string, string> = {\n string: 'character',\n file: 'byte',\n array: 'item',\n set: 'item',\n};\n\nfunction getSizing(origin: string): string | null {\n return Sizable[origin] ?? null;\n}\n\nfunction parsedType(data: unknown): string {\n const t = typeof data;\n\n switch (t) {\n case 'number': {\n return Number.isNaN(data) ? 'NaN' : 'number';\n }\n case 'object': {\n if (Array.isArray(data)) {\n return 'array';\n }\n if (data === null) {\n return 'null';\n }\n\n if (\n Object.getPrototypeOf(data) !== Object.prototype &&\n data &&\n data.constructor\n ) {\n return data.constructor.name;\n }\n }\n }\n return t;\n}\n\n/**\n * English error map for Zod validation errors\n * @param fieldName - Optional custom field name to use in error messages\n * @returns Zod error map function\n */\nexport function createEnglishErrorMap(\n fieldName?: string,\n): (issue: Parameters<ZodErrorMap>[0]) => string {\n return (issue: Parameters<ZodErrorMap>[0]) => {\n const field = fieldName || 'This field';\n\n switch (issue.code) {\n case 'custom': {\n return 'Invalid input';\n }\n case 'invalid_type':\n return `Invalid type: expected ${issue.expected}, received ${parsedType(issue.input)}`;\n case 'invalid_value':\n if (issue.values.length === 1)\n return `Invalid input: expected ${stringifyPrimitive(issue.values[0])}`;\n return `Invalid option: must be one of ${joinValues(issue.values)}`;\n case 'too_big': {\n const unit = getSizing(issue.origin);\n const plural = issue.maximum !== 1 ? 's' : '';\n if (unit) {\n return issue.inclusive\n ? `${field} must be at most ${issue.maximum} ${unit}${plural}`\n : `${field} must be less than ${issue.maximum} ${unit}${plural}`;\n }\n return issue.inclusive\n ? `${field} must be at most ${issue.maximum}`\n : `${field} must be less than ${issue.maximum}`;\n }\n case 'too_small': {\n const unit = getSizing(issue.origin);\n const plural = issue.minimum !== 1 ? 's' : '';\n if (issue.minimum === 1 && !unit) {\n return `${field} is required`;\n }\n if (unit) {\n return issue.inclusive\n ? `${field} must be at least ${issue.minimum} ${unit}${plural}`\n : `${field} must be greater than ${issue.minimum} ${unit}${plural}`;\n }\n return issue.inclusive\n ? `${field} must be at least ${issue.minimum}`\n : `${field} must be greater than ${issue.minimum}`;\n }\n case 'invalid_format': {\n const _issue = issue as Extract<\n Parameters<ZodErrorMap>[0],\n { code: 'invalid_format' }\n >;\n if (_issue.format === 'starts_with')\n return `Invalid string: must start with \"${_issue.prefix}\"`;\n if (_issue.format === 'ends_with')\n return `Invalid string: must end with \"${_issue.suffix}\"`;\n if (_issue.format === 'includes')\n return `Invalid string: must include \"${_issue.includes}\"`;\n if (_issue.format === 'regex')\n return `Invalid string: must match pattern ${_issue.pattern}`;\n return `Invalid ${Nouns[_issue.format] ?? _issue.format}`;\n }\n case 'not_multiple_of':\n return `Invalid number: must be a multiple of ${issue.divisor}`;\n case 'unrecognized_keys':\n return `Unrecognized key${issue.keys.length > 1 ? 's' : ''}: ${joinValues(issue.keys)}`;\n case 'invalid_key':\n return `Invalid key in ${field}`;\n case 'invalid_union':\n return 'Invalid input';\n case 'invalid_element':\n return `Invalid value in ${field}`;\n default:\n return 'Invalid input';\n }\n };\n}\n","import type { ZodErrorMap } from 'zod';\nimport { createEnglishErrorMap } from './locales/en';\nimport { createJapaneseErrorMap } from './locales/ja';\n\n/**\n * Field namespace mapping for custom error messages\n * You can extend this mapping to customize field names in error messages\n */\nexport const FieldNamespaceMapping = {\n department: {\n groupName: '部署・店舗名',\n },\n};\n\nexport type FIELD_NAMESPACE = keyof typeof FieldNamespaceMapping;\n\n/**\n * Custom error resolver with field namespace support (Japanese locale)\n * @deprecated Use createJapaneseErrorMap or createEnglishErrorMap instead\n * @param options - Configuration options\n * @param options.fieldNamespace - Namespace for field name mappings\n * @returns Error resolver function\n */\nexport const customErrorResolver = ({\n fieldNamespace,\n}: {\n fieldNamespace: FIELD_NAMESPACE;\n}) => {\n return (issue: Parameters<ZodErrorMap>[0]) => {\n const fieldName =\n FieldNamespaceMapping[fieldNamespace][\n String(\n issue.path?.[0],\n ) as keyof (typeof FieldNamespaceMapping)[typeof fieldNamespace]\n ] || undefined;\n\n return createJapaneseErrorMap(fieldName)(issue);\n };\n};\n\n// Re-export locale-specific error maps\nexport { createJapaneseErrorMap } from './locales/ja';\nexport { createEnglishErrorMap } from './locales/en';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/use-zod-form.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyJO,IAAM,UAAA,GAAa,CAAwB,EAAA,KAW5C;AAX4C,EAAA,IAAA,EAAA,GAAA,EAAA,EAChD;AAAA,IAAA,MAAA;AAAA,IACA;AAAA,GA3JF,GAyJkD,EAAA,EAG7C,WAAA,GAAA,SAAA,CAH6C,EAAA,EAG7C;AAAA,IAFH,QAAA;AAAA,IACA;AAAA,GAAA,CAAA;AAUA,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,MAAA,EAAQ,kBAAkB,CAAA;AAEvD,EAAA,OAAO,OAAA,CAAQ,cAAA,CAAA;AAAA,IACb;AAAA,GAAA,EACG,WAAA,CACJ,CAAA;AACH","file":"index.mjs","sourcesContent":["import { zodResolver } from '@hookform/resolvers/zod';\nimport {\n type DefaultValues,\n type FieldValues,\n type UseFormProps,\n useForm,\n} from 'react-hook-form';\nimport type { z } from 'zod';\nimport type { MakeOptionalAndNullable } from './types';\n\n/**\n * Type-safe React Hook Form wrapper with automatic Zod v4 schema validation and type transformation.\n *\n * This hook eliminates the TypeScript friction between React Hook Form's nullable field values\n * and Zod's strict output types. It uses a two-type schema pattern where:\n * - **Input type** (`MakeOptionalAndNullable<T>`): Form fields accept `null | undefined` during editing\n * - **Output type** (`T`): Validated data matches exact schema type (no `null | undefined`)\n *\n * **Key Benefits:**\n * - ✅ No more \"Type 'null' is not assignable to...\" TypeScript errors\n * - ✅ Use `form.setValue()` and `form.reset()` with `null` values freely\n * - ✅ Validated output is still type-safe with exact Zod schema types\n * - ✅ Automatic zodResolver setup - no manual configuration needed\n *\n * @template T - The Zod schema output type (extends FieldValues)\n *\n * @param options - Configuration object\n * @param options.schema - Zod schema with two-type signature `z.ZodType<T, MakeOptionalAndNullable<T>>`\n * @param options.defaultValues - Default form values (accepts nullable/undefined values)\n * @param options.zodResolverOptions - Optional zodResolver configuration\n * @param options....formOptions - All other react-hook-form useForm options\n *\n * @returns React Hook Form instance with type-safe methods\n *\n * @example\n * Basic usage with required fields\n * ```typescript\n * import { useZodForm } from '@zod-utils/react-hook-form';\n * import { z } from 'zod';\n *\n * const schema = z.object({\n * name: z.string().min(1), // Required field\n * age: z.number().min(0),\n * }) satisfies z.ZodType<{ name: string; age: number }, any>;\n *\n * function MyForm() {\n * const form = useZodForm({ schema });\n *\n * // ✅ These work without type errors:\n * form.setValue('name', null); // Accepts null during editing\n * form.reset({ name: null, age: null }); // Reset with null\n *\n * const onSubmit = (data: { name: string; age: number }) => {\n * // ✅ data is exact type - no null | undefined\n * console.log(data.name.toUpperCase()); // Safe to use string methods\n * };\n *\n * return <form onSubmit={form.handleSubmit(onSubmit)}>...</form>;\n * }\n * ```\n *\n * @example\n * With default values\n * ```typescript\n * const schema = z.object({\n * username: z.string(),\n * email: z.string().email(),\n * notifications: z.boolean().default(true),\n * }) satisfies z.ZodType<{\n * username: string;\n * email: string;\n * notifications: boolean;\n * }, any>;\n *\n * const form = useZodForm({\n * schema,\n * defaultValues: {\n * username: '',\n * email: '',\n * // notifications gets default from schema\n * },\n * });\n * ```\n *\n * @example\n * With optional and nullable fields\n * ```typescript\n * const schema = z.object({\n * title: z.string(),\n * description: z.string().optional(), // Optional in output\n * tags: z.array(z.string()).nullable(), // Nullable in output\n * }) satisfies z.ZodType<{\n * title: string;\n * description?: string;\n * tags: string[] | null;\n * }, any>;\n *\n * const form = useZodForm({ schema });\n *\n * // All fields accept null/undefined during editing\n * form.setValue('title', null);\n * form.setValue('description', undefined);\n * form.setValue('tags', null);\n * ```\n *\n * @example\n * With zodResolver options\n * ```typescript\n * const form = useZodForm({\n * schema,\n * zodResolverOptions: {\n * async: true, // Enable async validation\n * errorMap: customErrorMap, // Custom error messages\n * },\n * });\n * ```\n *\n * @example\n * Complete form example\n * ```typescript\n * const userSchema = z.object({\n * name: z.string().min(1, 'Name is required'),\n * email: z.string().email('Invalid email'),\n * age: z.number().min(18, 'Must be 18+'),\n * }) satisfies z.ZodType<{ name: string; email: string; age: number }, any>;\n *\n * function UserForm() {\n * const form = useZodForm({\n * schema: userSchema,\n * defaultValues: { name: '', email: '', age: null },\n * });\n *\n * const onSubmit = (data: { name: string; email: string; age: number }) => {\n * // Type-safe: data has exact types, no null/undefined\n * console.log(`${data.name} is ${data.age} years old`);\n * };\n *\n * return (\n * <form onSubmit={form.handleSubmit(onSubmit)}>\n * <input {...form.register('name')} />\n * <input {...form.register('email')} type=\"email\" />\n * <input {...form.register('age', { valueAsNumber: true })} type=\"number\" />\n * <button type=\"submit\">Submit</button>\n * </form>\n * );\n * }\n * ```\n *\n * @see {@link MakeOptionalAndNullable} for the type transformation utility\n * @see https://react-hook-form.com/docs/useform for React Hook Form documentation\n * @see https://zod.dev for Zod schema documentation\n * @since 0.1.0\n */\nexport const useZodForm = <T extends FieldValues>({\n schema,\n zodResolverOptions,\n ...formOptions\n}: {\n schema: z.ZodType<T, MakeOptionalAndNullable<T>>;\n defaultValues?: DefaultValues<MakeOptionalAndNullable<T>>;\n zodResolverOptions?: Parameters<typeof zodResolver>[1];\n} & Omit<\n UseFormProps<MakeOptionalAndNullable<T>, unknown, T>,\n 'resolver' | 'defaultValues'\n>) => {\n const resolver = zodResolver(schema, zodResolverOptions);\n\n return useForm({\n resolver,\n ...formOptions,\n });\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,22 +1,30 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zod-utils/react-hook-form",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "React Hook Form integration and utilities for Zod schemas",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
8
8
|
"exports": {
|
|
9
9
|
".": {
|
|
10
|
+
"development": "./src/index.ts",
|
|
10
11
|
"types": "./dist/index.d.ts",
|
|
11
12
|
"import": "./dist/index.mjs",
|
|
12
13
|
"require": "./dist/index.js"
|
|
13
14
|
}
|
|
14
15
|
},
|
|
15
|
-
"files": [
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"!dist/**/*.test.*",
|
|
19
|
+
"!dist/**/__tests__",
|
|
20
|
+
"README.md"
|
|
21
|
+
],
|
|
16
22
|
"scripts": {
|
|
17
23
|
"build": "tsup",
|
|
18
24
|
"dev": "tsup --watch",
|
|
19
|
-
"
|
|
25
|
+
"lint:typescript": "tsc --project tsconfig.json",
|
|
26
|
+
"lint": "biome check . && npm run lint:typescript",
|
|
27
|
+
"lint:fix": "biome check --write .",
|
|
20
28
|
"test": "vitest run",
|
|
21
29
|
"test:watch": "vitest",
|
|
22
30
|
"test:coverage": "vitest run --coverage",
|
|
@@ -56,14 +64,14 @@
|
|
|
56
64
|
"devDependencies": {
|
|
57
65
|
"@testing-library/react": "^16.1.0",
|
|
58
66
|
"@types/react": "^19",
|
|
59
|
-
"@vitest/coverage-v8": "^
|
|
67
|
+
"@vitest/coverage-v8": "^4.0.8",
|
|
60
68
|
"jsdom": "^25.0.1",
|
|
61
69
|
"react": "^19.2.0",
|
|
62
70
|
"react-dom": "^19.2.0",
|
|
63
71
|
"react-hook-form": "^7.66.0",
|
|
64
72
|
"tsup": "^8.3.5",
|
|
65
73
|
"typescript": "^5",
|
|
66
|
-
"vitest": "^
|
|
74
|
+
"vitest": "^4.0.8",
|
|
67
75
|
"zod": "^4.1.12"
|
|
68
76
|
}
|
|
69
77
|
}
|