@jcoreio/zod-forms 1.0.0 → 1.0.2
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/package.json +1 -1
- package/src/useHtmlField.ts +28 -28
- package/useHtmlField.d.ts.map +1 -1
- package/useHtmlField.js +26 -26
- package/useHtmlField.js.map +1 -1
- package/useHtmlField.mjs +27 -25
- package/useHtmlField.mjs.map +1 -1
package/package.json
CHANGED
package/src/useHtmlField.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import z from 'zod'
|
|
2
2
|
import { BasePath, FieldPath } from './FieldPath'
|
|
3
3
|
import { useField, UseFieldProps } from './useField'
|
|
4
|
-
import React, { HTMLInputTypeAttribute } from 'react'
|
|
4
|
+
import React, { ChangeEvent, HTMLInputTypeAttribute } from 'react'
|
|
5
5
|
import { invert } from 'zod-invertible'
|
|
6
6
|
import { useFormContext } from './useFormContext'
|
|
7
7
|
import { acceptsNumber } from './util/acceptsNumber'
|
|
@@ -88,18 +88,16 @@ function useHtmlFieldBase<Field extends FieldPath>(
|
|
|
88
88
|
|
|
89
89
|
const onChange = React.useCallback(
|
|
90
90
|
(e: React.ChangeEvent) => {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
setTempRawValue(rawValue)
|
|
100
|
-
}
|
|
101
|
-
setRawValue(normalized)
|
|
91
|
+
const rawValue = getRawValue(e)
|
|
92
|
+
const normalized = normalizeRawValue(rawValue, {
|
|
93
|
+
schema,
|
|
94
|
+
tryNumber,
|
|
95
|
+
tryBigint,
|
|
96
|
+
})
|
|
97
|
+
if (typeof rawValue === 'string' && typeof normalized !== 'string') {
|
|
98
|
+
setTempRawValue(rawValue)
|
|
102
99
|
}
|
|
100
|
+
setRawValue(normalized)
|
|
103
101
|
},
|
|
104
102
|
[getRawValue, setRawValue, schema]
|
|
105
103
|
)
|
|
@@ -110,22 +108,20 @@ function useHtmlFieldBase<Field extends FieldPath>(
|
|
|
110
108
|
|
|
111
109
|
const onBlur = React.useCallback(
|
|
112
110
|
(e: React.FocusEvent) => {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
if (formatted?.success) rawValue = formatted.data
|
|
125
|
-
}
|
|
111
|
+
let rawValue = normalizeRawValue(getRawValue(e), {
|
|
112
|
+
schema,
|
|
113
|
+
tryNumber,
|
|
114
|
+
tryBigint,
|
|
115
|
+
})
|
|
116
|
+
if (normalizeOnBlur) {
|
|
117
|
+
const parsed = field.schema.safeParse(rawValue)
|
|
118
|
+
const formatted = parsed.success
|
|
119
|
+
? invert(field.schema).safeParse(parsed.data)
|
|
120
|
+
: undefined
|
|
121
|
+
if (formatted?.success) rawValue = formatted.data
|
|
126
122
|
setRawValue(rawValue)
|
|
127
|
-
setTempRawValue(undefined)
|
|
128
123
|
}
|
|
124
|
+
setTempRawValue(undefined)
|
|
129
125
|
setMeta({ visited: true, touched: true })
|
|
130
126
|
},
|
|
131
127
|
[getRawValue, setRawValue, schema]
|
|
@@ -162,8 +158,12 @@ function useHtmlFieldBase<Field extends FieldPath>(
|
|
|
162
158
|
) as any
|
|
163
159
|
}
|
|
164
160
|
|
|
165
|
-
function getRawValue(
|
|
166
|
-
|
|
161
|
+
function getRawValue(e: ChangeEvent) {
|
|
162
|
+
const { target } = e
|
|
163
|
+
if (target instanceof HTMLInputElement) {
|
|
164
|
+
return target.type === 'checkbox' ? target.checked : target.value
|
|
165
|
+
}
|
|
166
|
+
return (target as any).value
|
|
167
167
|
}
|
|
168
168
|
|
|
169
169
|
function normalizeBlank(schema: z.ZodTypeAny): any {
|
package/useHtmlField.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useHtmlField.d.ts","sourceRoot":"","sources":["src/useHtmlField.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAA;AACnB,OAAO,EAAY,SAAS,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EAAY,aAAa,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"useHtmlField.d.ts","sourceRoot":"","sources":["src/useHtmlField.ts"],"names":[],"mappings":"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"}
|
package/useHtmlField.js
CHANGED
|
@@ -51,18 +51,16 @@ function useHtmlFieldBase(options) {
|
|
|
51
51
|
return (0, _acceptsBigint.acceptsBigint)(schema);
|
|
52
52
|
}, [schema]);
|
|
53
53
|
var onChange = _react["default"].useCallback(function (e) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
setTempRawValue(_rawValue);
|
|
63
|
-
}
|
|
64
|
-
setRawValue(normalized);
|
|
54
|
+
var rawValue = getRawValue(e);
|
|
55
|
+
var normalized = normalizeRawValue(rawValue, {
|
|
56
|
+
schema: schema,
|
|
57
|
+
tryNumber: tryNumber,
|
|
58
|
+
tryBigint: tryBigint
|
|
59
|
+
});
|
|
60
|
+
if (typeof rawValue === 'string' && typeof normalized !== 'string') {
|
|
61
|
+
setTempRawValue(rawValue);
|
|
65
62
|
}
|
|
63
|
+
setRawValue(normalized);
|
|
66
64
|
}, [getRawValue, setRawValue, schema]);
|
|
67
65
|
var onFocus = _react["default"].useCallback(function () {
|
|
68
66
|
setMeta({
|
|
@@ -70,20 +68,18 @@ function useHtmlFieldBase(options) {
|
|
|
70
68
|
});
|
|
71
69
|
}, []);
|
|
72
70
|
var onBlur = _react["default"].useCallback(function (e) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}
|
|
84
|
-
setRawValue(_rawValue2);
|
|
85
|
-
setTempRawValue(undefined);
|
|
71
|
+
var rawValue = normalizeRawValue(getRawValue(e), {
|
|
72
|
+
schema: schema,
|
|
73
|
+
tryNumber: tryNumber,
|
|
74
|
+
tryBigint: tryBigint
|
|
75
|
+
});
|
|
76
|
+
if (normalizeOnBlur) {
|
|
77
|
+
var parsed = field.schema.safeParse(rawValue);
|
|
78
|
+
var formatted = parsed.success ? (0, _zodInvertible.invert)(field.schema).safeParse(parsed.data) : undefined;
|
|
79
|
+
if (formatted !== null && formatted !== void 0 && formatted.success) rawValue = formatted.data;
|
|
80
|
+
setRawValue(rawValue);
|
|
86
81
|
}
|
|
82
|
+
setTempRawValue(undefined);
|
|
87
83
|
setMeta({
|
|
88
84
|
visited: true,
|
|
89
85
|
touched: true
|
|
@@ -114,8 +110,12 @@ function useHtmlFieldBase(options) {
|
|
|
114
110
|
};
|
|
115
111
|
}, [props, tempRawValue, onChange]);
|
|
116
112
|
}
|
|
117
|
-
function getRawValue(
|
|
118
|
-
|
|
113
|
+
function getRawValue(e) {
|
|
114
|
+
var target = e.target;
|
|
115
|
+
if (target instanceof HTMLInputElement) {
|
|
116
|
+
return target.type === 'checkbox' ? target.checked : target.value;
|
|
117
|
+
}
|
|
118
|
+
return target.value;
|
|
119
119
|
}
|
|
120
120
|
function normalizeBlank(schema) {
|
|
121
121
|
if (schema.safeParse(undefined).success) return undefined;
|
package/useHtmlField.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useHtmlField.js","names":["_FieldPath","require","_useField","_react","_interopRequireDefault","_zodInvertible","_useFormContext2","_acceptsNumber","_acceptsBigint","_excluded","_excluded2","ownKeys","e","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defineProperty","useHtmlFieldBase","options","field","type","_options$normalizeOnB","normalizeOnBlur","props","useField","value","rawValue","initialValue","rawInitialValue","setValue","setRawValue","setMeta","meta","_objectWithoutProperties2","schema","_React$useState","React","useState","_React$useState2","_slicedToArray2","tempRawValue","setTempRawValue","tryNumber","useMemo","acceptsNumber","tryBigint","acceptsBigint","onChange","useCallback","currentTarget","HTMLInputElement","getRawValue","normalized","normalizeRawValue","onFocus","visited","onBlur","parsed","safeParse","formatted","success","invert","data","undefined","touched","input","name","pathstring","String","checked","Boolean","el","normalizeBlank","safeBigInt","BigInt","error","_ref","test","num","Number","isNaN","bigint","useHtmlField","_ref2","rest","_useFormContext","useFormContext","root","FieldPath","get"],"sources":["src/useHtmlField.ts"],"sourcesContent":["import z from 'zod'\nimport { BasePath, FieldPath } from './FieldPath'\nimport { useField, UseFieldProps } from './useField'\nimport React, { HTMLInputTypeAttribute } from 'react'\nimport { invert } from 'zod-invertible'\nimport { useFormContext } from './useFormContext'\nimport { acceptsNumber } from './util/acceptsNumber'\nimport { acceptsBigint } from './util/acceptsBigint'\nimport { PathInSchema, PathstringInSchema } from './util/PathInSchema'\nimport { parsePathstring } from './util/parsePathstring'\nimport { SchemaAt } from './util/SchemaAt'\n\nexport type HtmlFieldInputProps = {\n name: string\n type: HTMLInputTypeAttribute\n value: string\n checked?: boolean\n onChange: React.ChangeEventHandler\n onFocus: React.FocusEventHandler\n onBlur: React.FocusEventHandler\n}\n\nexport type ValidUseHtmlFieldProps<Field extends FieldPath> = {\n input: HtmlFieldInputProps\n meta: UseFieldProps<Field>\n}\n\nexport type UseHtmlFieldProps<Field extends FieldPath> = z.input<\n Field['schema']\n> extends string | number | bigint | boolean | null | undefined\n ? {\n input: HtmlFieldInputProps\n meta: UseFieldProps<Field>\n }\n : {\n ERROR: 'field schema input must be a nullish string, number, boolean or bigint'\n }\n\ntype UseHtmlFieldOptions<Field, Schema extends z.ZodTypeAny> = {\n field: Field\n type: z.input<Schema> extends boolean | null | undefined\n ? 'checkbox'\n : Exclude<HTMLInputTypeAttribute, 'checkbox'>\n normalizeOnBlur?: boolean\n}\n\nexport interface TypedUseHtmlField<T extends z.ZodTypeAny> {\n <Field extends FieldPath>(\n options: UseHtmlFieldOptions<Field, Field['schema']>\n ): UseHtmlFieldProps<Field>\n <Path extends PathInSchema<T>>(\n options: UseHtmlFieldOptions<Path, SchemaAt<T, Path>>\n ): UseHtmlFieldProps<FieldPath<SchemaAt<T, Path>>>\n <Path extends PathstringInSchema<T>>(\n options: UseHtmlFieldOptions<Path, SchemaAt<T, parsePathstring<Path>>>\n ): UseHtmlFieldProps<FieldPath<SchemaAt<T, parsePathstring<Path>>>>\n}\n\nfunction useHtmlFieldBase<Field extends FieldPath>(\n options: UseHtmlFieldOptions<Field, Field['schema']>\n): UseHtmlFieldProps<Field> {\n const { field, type, normalizeOnBlur = true } = options\n const props = useField(field)\n const {\n value,\n rawValue,\n initialValue,\n rawInitialValue,\n setValue,\n setRawValue,\n setMeta,\n ...meta\n } = props\n\n const { schema } = field\n\n // tempRawValue is used for storing blank text when we've coerced the\n // raw value to null or undefined, or storing numeric text when we've\n // coerced the raw value to a number or bigint.\n // This way we can set a raw value that will parse better in the form\n // state without interfering with the text the user is typing.\n const [tempRawValue, setTempRawValue] = React.useState(\n rawValue as string | null | undefined\n )\n\n const tryNumber = React.useMemo(() => acceptsNumber(schema), [schema])\n const tryBigint = React.useMemo(() => acceptsBigint(schema), [schema])\n\n const onChange = React.useCallback(\n (e: React.ChangeEvent) => {\n if (e.currentTarget instanceof HTMLInputElement) {\n const rawValue = getRawValue(e.currentTarget)\n const normalized = normalizeRawValue(rawValue, {\n schema,\n tryNumber,\n tryBigint,\n })\n if (typeof rawValue === 'string' && typeof normalized !== 'string') {\n setTempRawValue(rawValue)\n }\n setRawValue(normalized)\n }\n },\n [getRawValue, setRawValue, schema]\n )\n\n const onFocus = React.useCallback(() => {\n setMeta({ visited: true })\n }, [])\n\n const onBlur = React.useCallback(\n (e: React.FocusEvent) => {\n if (e.currentTarget instanceof HTMLInputElement) {\n let rawValue = normalizeRawValue(getRawValue(e.currentTarget), {\n schema,\n tryNumber,\n tryBigint,\n })\n if (normalizeOnBlur) {\n const parsed = field.schema.safeParse(rawValue)\n const formatted = parsed.success\n ? invert(field.schema).safeParse(parsed.data)\n : undefined\n if (formatted?.success) rawValue = formatted.data\n }\n setRawValue(rawValue)\n setTempRawValue(undefined)\n }\n setMeta({ visited: true, touched: true })\n },\n [getRawValue, setRawValue, schema]\n )\n\n return React.useMemo(\n (): ValidUseHtmlFieldProps<Field> => ({\n input: {\n name: field.pathstring,\n type,\n value:\n typeof rawValue === 'boolean'\n ? String(rawValue)\n : typeof rawValue === 'string'\n ? rawValue || tempRawValue || ''\n : tempRawValue || (rawValue == null ? '' : String(rawValue) || ''),\n ...(type === 'checkbox' && { checked: Boolean(rawValue) }),\n onChange,\n onFocus,\n onBlur,\n },\n meta: {\n ...meta,\n value,\n rawValue,\n initialValue,\n rawInitialValue,\n setValue,\n setRawValue,\n setMeta,\n },\n }),\n [props, tempRawValue, onChange]\n ) as any\n}\n\nfunction getRawValue(el: HTMLInputElement | HTMLSelectElement) {\n return el.type === 'checkbox' ? el.checked : el.value\n}\n\nfunction normalizeBlank(schema: z.ZodTypeAny): any {\n if (schema.safeParse(undefined).success) return undefined\n if (schema.safeParse(null).success) return null\n return undefined\n}\n\nfunction safeBigInt(rawValue: string): bigint | undefined {\n try {\n return BigInt(rawValue)\n } catch (error) {\n return undefined\n }\n}\n\nfunction normalizeRawValue(\n rawValue: string | boolean,\n {\n schema,\n tryNumber,\n tryBigint,\n }: { schema: z.ZodTypeAny; tryNumber: boolean; tryBigint: boolean }\n): string | boolean | number | bigint | null | undefined {\n if (typeof rawValue === 'boolean') return rawValue\n if (typeof rawValue === 'string' && !/\\S/.test(rawValue)) {\n return normalizeBlank(schema)\n }\n if (typeof rawValue === 'string' && !schema.safeParse(rawValue).success) {\n if (tryNumber) {\n const num = Number(rawValue)\n if (!isNaN(num)) return num\n }\n if (tryBigint) {\n const bigint = safeBigInt(rawValue)\n if (bigint != null) return bigint\n }\n }\n return rawValue\n}\n\nexport function useHtmlField<Field extends FieldPath>(\n options: UseHtmlFieldOptions<Field, Field['schema']>\n): UseHtmlFieldProps<Field>\nexport function useHtmlField<\n T extends z.ZodTypeAny,\n Path extends PathInSchema<T>\n>(\n options: UseHtmlFieldOptions<Path, SchemaAt<T, Path>>\n): UseHtmlFieldProps<FieldPath<SchemaAt<T, Path>>>\nexport function useHtmlField<\n T extends z.ZodTypeAny,\n Path extends PathstringInSchema<T>\n>(\n options: UseHtmlFieldOptions<Path, SchemaAt<T, parsePathstring<Path>>>\n): UseHtmlFieldProps<FieldPath<SchemaAt<T, parsePathstring<Path>>>>\nexport function useHtmlField({\n field,\n ...rest\n}: UseHtmlFieldOptions<\n FieldPath | BasePath,\n z.ZodTypeAny\n>): UseHtmlFieldProps<any> {\n const { root } = useFormContext()\n return useHtmlFieldBase({\n field: field instanceof FieldPath ? field : root.get(field),\n ...rest,\n })\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"useHtmlField.js","names":["_FieldPath","require","_useField","_react","_interopRequireDefault","_zodInvertible","_useFormContext2","_acceptsNumber","_acceptsBigint","_excluded","_excluded2","ownKeys","e","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defineProperty","useHtmlFieldBase","options","field","type","_options$normalizeOnB","normalizeOnBlur","props","useField","value","rawValue","initialValue","rawInitialValue","setValue","setRawValue","setMeta","meta","_objectWithoutProperties2","schema","_React$useState","React","useState","_React$useState2","_slicedToArray2","tempRawValue","setTempRawValue","tryNumber","useMemo","acceptsNumber","tryBigint","acceptsBigint","onChange","useCallback","getRawValue","normalized","normalizeRawValue","onFocus","visited","onBlur","parsed","safeParse","formatted","success","invert","data","undefined","touched","input","name","pathstring","String","checked","Boolean","target","HTMLInputElement","normalizeBlank","safeBigInt","BigInt","error","_ref","test","num","Number","isNaN","bigint","useHtmlField","_ref2","rest","_useFormContext","useFormContext","root","FieldPath","get"],"sources":["src/useHtmlField.ts"],"sourcesContent":["import z from 'zod'\nimport { BasePath, FieldPath } from './FieldPath'\nimport { useField, UseFieldProps } from './useField'\nimport React, { ChangeEvent, HTMLInputTypeAttribute } from 'react'\nimport { invert } from 'zod-invertible'\nimport { useFormContext } from './useFormContext'\nimport { acceptsNumber } from './util/acceptsNumber'\nimport { acceptsBigint } from './util/acceptsBigint'\nimport { PathInSchema, PathstringInSchema } from './util/PathInSchema'\nimport { parsePathstring } from './util/parsePathstring'\nimport { SchemaAt } from './util/SchemaAt'\n\nexport type HtmlFieldInputProps = {\n name: string\n type: HTMLInputTypeAttribute\n value: string\n checked?: boolean\n onChange: React.ChangeEventHandler\n onFocus: React.FocusEventHandler\n onBlur: React.FocusEventHandler\n}\n\nexport type ValidUseHtmlFieldProps<Field extends FieldPath> = {\n input: HtmlFieldInputProps\n meta: UseFieldProps<Field>\n}\n\nexport type UseHtmlFieldProps<Field extends FieldPath> = z.input<\n Field['schema']\n> extends string | number | bigint | boolean | null | undefined\n ? {\n input: HtmlFieldInputProps\n meta: UseFieldProps<Field>\n }\n : {\n ERROR: 'field schema input must be a nullish string, number, boolean or bigint'\n }\n\ntype UseHtmlFieldOptions<Field, Schema extends z.ZodTypeAny> = {\n field: Field\n type: z.input<Schema> extends boolean | null | undefined\n ? 'checkbox'\n : Exclude<HTMLInputTypeAttribute, 'checkbox'>\n normalizeOnBlur?: boolean\n}\n\nexport interface TypedUseHtmlField<T extends z.ZodTypeAny> {\n <Field extends FieldPath>(\n options: UseHtmlFieldOptions<Field, Field['schema']>\n ): UseHtmlFieldProps<Field>\n <Path extends PathInSchema<T>>(\n options: UseHtmlFieldOptions<Path, SchemaAt<T, Path>>\n ): UseHtmlFieldProps<FieldPath<SchemaAt<T, Path>>>\n <Path extends PathstringInSchema<T>>(\n options: UseHtmlFieldOptions<Path, SchemaAt<T, parsePathstring<Path>>>\n ): UseHtmlFieldProps<FieldPath<SchemaAt<T, parsePathstring<Path>>>>\n}\n\nfunction useHtmlFieldBase<Field extends FieldPath>(\n options: UseHtmlFieldOptions<Field, Field['schema']>\n): UseHtmlFieldProps<Field> {\n const { field, type, normalizeOnBlur = true } = options\n const props = useField(field)\n const {\n value,\n rawValue,\n initialValue,\n rawInitialValue,\n setValue,\n setRawValue,\n setMeta,\n ...meta\n } = props\n\n const { schema } = field\n\n // tempRawValue is used for storing blank text when we've coerced the\n // raw value to null or undefined, or storing numeric text when we've\n // coerced the raw value to a number or bigint.\n // This way we can set a raw value that will parse better in the form\n // state without interfering with the text the user is typing.\n const [tempRawValue, setTempRawValue] = React.useState(\n rawValue as string | null | undefined\n )\n\n const tryNumber = React.useMemo(() => acceptsNumber(schema), [schema])\n const tryBigint = React.useMemo(() => acceptsBigint(schema), [schema])\n\n const onChange = React.useCallback(\n (e: React.ChangeEvent) => {\n const rawValue = getRawValue(e)\n const normalized = normalizeRawValue(rawValue, {\n schema,\n tryNumber,\n tryBigint,\n })\n if (typeof rawValue === 'string' && typeof normalized !== 'string') {\n setTempRawValue(rawValue)\n }\n setRawValue(normalized)\n },\n [getRawValue, setRawValue, schema]\n )\n\n const onFocus = React.useCallback(() => {\n setMeta({ visited: true })\n }, [])\n\n const onBlur = React.useCallback(\n (e: React.FocusEvent) => {\n let rawValue = normalizeRawValue(getRawValue(e), {\n schema,\n tryNumber,\n tryBigint,\n })\n if (normalizeOnBlur) {\n const parsed = field.schema.safeParse(rawValue)\n const formatted = parsed.success\n ? invert(field.schema).safeParse(parsed.data)\n : undefined\n if (formatted?.success) rawValue = formatted.data\n setRawValue(rawValue)\n }\n setTempRawValue(undefined)\n setMeta({ visited: true, touched: true })\n },\n [getRawValue, setRawValue, schema]\n )\n\n return React.useMemo(\n (): ValidUseHtmlFieldProps<Field> => ({\n input: {\n name: field.pathstring,\n type,\n value:\n typeof rawValue === 'boolean'\n ? String(rawValue)\n : typeof rawValue === 'string'\n ? rawValue || tempRawValue || ''\n : tempRawValue || (rawValue == null ? '' : String(rawValue) || ''),\n ...(type === 'checkbox' && { checked: Boolean(rawValue) }),\n onChange,\n onFocus,\n onBlur,\n },\n meta: {\n ...meta,\n value,\n rawValue,\n initialValue,\n rawInitialValue,\n setValue,\n setRawValue,\n setMeta,\n },\n }),\n [props, tempRawValue, onChange]\n ) as any\n}\n\nfunction getRawValue(e: ChangeEvent) {\n const { target } = e\n if (target instanceof HTMLInputElement) {\n return target.type === 'checkbox' ? target.checked : target.value\n }\n return (target as any).value\n}\n\nfunction normalizeBlank(schema: z.ZodTypeAny): any {\n if (schema.safeParse(undefined).success) return undefined\n if (schema.safeParse(null).success) return null\n return undefined\n}\n\nfunction safeBigInt(rawValue: string): bigint | undefined {\n try {\n return BigInt(rawValue)\n } catch (error) {\n return undefined\n }\n}\n\nfunction normalizeRawValue(\n rawValue: string | boolean,\n {\n schema,\n tryNumber,\n tryBigint,\n }: { schema: z.ZodTypeAny; tryNumber: boolean; tryBigint: boolean }\n): string | boolean | number | bigint | null | undefined {\n if (typeof rawValue === 'boolean') return rawValue\n if (typeof rawValue === 'string' && !/\\S/.test(rawValue)) {\n return normalizeBlank(schema)\n }\n if (typeof rawValue === 'string' && !schema.safeParse(rawValue).success) {\n if (tryNumber) {\n const num = Number(rawValue)\n if (!isNaN(num)) return num\n }\n if (tryBigint) {\n const bigint = safeBigInt(rawValue)\n if (bigint != null) return bigint\n }\n }\n return rawValue\n}\n\nexport function useHtmlField<Field extends FieldPath>(\n options: UseHtmlFieldOptions<Field, Field['schema']>\n): UseHtmlFieldProps<Field>\nexport function useHtmlField<\n T extends z.ZodTypeAny,\n Path extends PathInSchema<T>\n>(\n options: UseHtmlFieldOptions<Path, SchemaAt<T, Path>>\n): UseHtmlFieldProps<FieldPath<SchemaAt<T, Path>>>\nexport function useHtmlField<\n T extends z.ZodTypeAny,\n Path extends PathstringInSchema<T>\n>(\n options: UseHtmlFieldOptions<Path, SchemaAt<T, parsePathstring<Path>>>\n): UseHtmlFieldProps<FieldPath<SchemaAt<T, parsePathstring<Path>>>>\nexport function useHtmlField({\n field,\n ...rest\n}: UseHtmlFieldOptions<\n FieldPath | BasePath,\n z.ZodTypeAny\n>): UseHtmlFieldProps<any> {\n const { root } = useFormContext()\n return useHtmlFieldBase({\n field: field instanceof FieldPath ? field : root.get(field),\n ...rest,\n })\n}\n"],"mappings":"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","ignoreList":[]}
|
package/useHtmlField.mjs
CHANGED
|
@@ -35,18 +35,16 @@ function useHtmlFieldBase(options) {
|
|
|
35
35
|
const tryNumber = React.useMemo(() => acceptsNumber(schema), [schema]);
|
|
36
36
|
const tryBigint = React.useMemo(() => acceptsBigint(schema), [schema]);
|
|
37
37
|
const onChange = React.useCallback(e => {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
setTempRawValue(rawValue);
|
|
47
|
-
}
|
|
48
|
-
setRawValue(normalized);
|
|
38
|
+
const rawValue = getRawValue(e);
|
|
39
|
+
const normalized = normalizeRawValue(rawValue, {
|
|
40
|
+
schema,
|
|
41
|
+
tryNumber,
|
|
42
|
+
tryBigint
|
|
43
|
+
});
|
|
44
|
+
if (typeof rawValue === 'string' && typeof normalized !== 'string') {
|
|
45
|
+
setTempRawValue(rawValue);
|
|
49
46
|
}
|
|
47
|
+
setRawValue(normalized);
|
|
50
48
|
}, [getRawValue, setRawValue, schema]);
|
|
51
49
|
const onFocus = React.useCallback(() => {
|
|
52
50
|
setMeta({
|
|
@@ -54,20 +52,18 @@ function useHtmlFieldBase(options) {
|
|
|
54
52
|
});
|
|
55
53
|
}, []);
|
|
56
54
|
const onBlur = React.useCallback(e => {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
if (formatted !== null && formatted !== void 0 && formatted.success) rawValue = formatted.data;
|
|
67
|
-
}
|
|
55
|
+
let rawValue = normalizeRawValue(getRawValue(e), {
|
|
56
|
+
schema,
|
|
57
|
+
tryNumber,
|
|
58
|
+
tryBigint
|
|
59
|
+
});
|
|
60
|
+
if (normalizeOnBlur) {
|
|
61
|
+
const parsed = field.schema.safeParse(rawValue);
|
|
62
|
+
const formatted = parsed.success ? invert(field.schema).safeParse(parsed.data) : undefined;
|
|
63
|
+
if (formatted !== null && formatted !== void 0 && formatted.success) rawValue = formatted.data;
|
|
68
64
|
setRawValue(rawValue);
|
|
69
|
-
setTempRawValue(undefined);
|
|
70
65
|
}
|
|
66
|
+
setTempRawValue(undefined);
|
|
71
67
|
setMeta({
|
|
72
68
|
visited: true,
|
|
73
69
|
touched: true
|
|
@@ -97,8 +93,14 @@ function useHtmlFieldBase(options) {
|
|
|
97
93
|
}
|
|
98
94
|
}), [props, tempRawValue, onChange]);
|
|
99
95
|
}
|
|
100
|
-
function getRawValue(
|
|
101
|
-
|
|
96
|
+
function getRawValue(e) {
|
|
97
|
+
const {
|
|
98
|
+
target
|
|
99
|
+
} = e;
|
|
100
|
+
if (target instanceof HTMLInputElement) {
|
|
101
|
+
return target.type === 'checkbox' ? target.checked : target.value;
|
|
102
|
+
}
|
|
103
|
+
return target.value;
|
|
102
104
|
}
|
|
103
105
|
function normalizeBlank(schema) {
|
|
104
106
|
if (schema.safeParse(undefined).success) return undefined;
|
package/useHtmlField.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useHtmlField.mjs","names":["FieldPath","useField","React","invert","useFormContext","acceptsNumber","acceptsBigint","useHtmlFieldBase","options","field","type","normalizeOnBlur","props","value","rawValue","initialValue","rawInitialValue","setValue","setRawValue","setMeta","meta","schema","tempRawValue","setTempRawValue","useState","tryNumber","useMemo","tryBigint","onChange","useCallback","e","currentTarget","HTMLInputElement","getRawValue","normalized","normalizeRawValue","onFocus","visited","onBlur","parsed","safeParse","formatted","success","data","undefined","touched","input","name","pathstring","String","checked","Boolean","el","normalizeBlank","safeBigInt","BigInt","error","test","num","Number","isNaN","bigint","useHtmlField","rest","root","get"],"sources":["src/useHtmlField.ts"],"sourcesContent":["import z from 'zod'\nimport { BasePath, FieldPath } from './FieldPath'\nimport { useField, UseFieldProps } from './useField'\nimport React, { HTMLInputTypeAttribute } from 'react'\nimport { invert } from 'zod-invertible'\nimport { useFormContext } from './useFormContext'\nimport { acceptsNumber } from './util/acceptsNumber'\nimport { acceptsBigint } from './util/acceptsBigint'\nimport { PathInSchema, PathstringInSchema } from './util/PathInSchema'\nimport { parsePathstring } from './util/parsePathstring'\nimport { SchemaAt } from './util/SchemaAt'\n\nexport type HtmlFieldInputProps = {\n name: string\n type: HTMLInputTypeAttribute\n value: string\n checked?: boolean\n onChange: React.ChangeEventHandler\n onFocus: React.FocusEventHandler\n onBlur: React.FocusEventHandler\n}\n\nexport type ValidUseHtmlFieldProps<Field extends FieldPath> = {\n input: HtmlFieldInputProps\n meta: UseFieldProps<Field>\n}\n\nexport type UseHtmlFieldProps<Field extends FieldPath> = z.input<\n Field['schema']\n> extends string | number | bigint | boolean | null | undefined\n ? {\n input: HtmlFieldInputProps\n meta: UseFieldProps<Field>\n }\n : {\n ERROR: 'field schema input must be a nullish string, number, boolean or bigint'\n }\n\ntype UseHtmlFieldOptions<Field, Schema extends z.ZodTypeAny> = {\n field: Field\n type: z.input<Schema> extends boolean | null | undefined\n ? 'checkbox'\n : Exclude<HTMLInputTypeAttribute, 'checkbox'>\n normalizeOnBlur?: boolean\n}\n\nexport interface TypedUseHtmlField<T extends z.ZodTypeAny> {\n <Field extends FieldPath>(\n options: UseHtmlFieldOptions<Field, Field['schema']>\n ): UseHtmlFieldProps<Field>\n <Path extends PathInSchema<T>>(\n options: UseHtmlFieldOptions<Path, SchemaAt<T, Path>>\n ): UseHtmlFieldProps<FieldPath<SchemaAt<T, Path>>>\n <Path extends PathstringInSchema<T>>(\n options: UseHtmlFieldOptions<Path, SchemaAt<T, parsePathstring<Path>>>\n ): UseHtmlFieldProps<FieldPath<SchemaAt<T, parsePathstring<Path>>>>\n}\n\nfunction useHtmlFieldBase<Field extends FieldPath>(\n options: UseHtmlFieldOptions<Field, Field['schema']>\n): UseHtmlFieldProps<Field> {\n const { field, type, normalizeOnBlur = true } = options\n const props = useField(field)\n const {\n value,\n rawValue,\n initialValue,\n rawInitialValue,\n setValue,\n setRawValue,\n setMeta,\n ...meta\n } = props\n\n const { schema } = field\n\n // tempRawValue is used for storing blank text when we've coerced the\n // raw value to null or undefined, or storing numeric text when we've\n // coerced the raw value to a number or bigint.\n // This way we can set a raw value that will parse better in the form\n // state without interfering with the text the user is typing.\n const [tempRawValue, setTempRawValue] = React.useState(\n rawValue as string | null | undefined\n )\n\n const tryNumber = React.useMemo(() => acceptsNumber(schema), [schema])\n const tryBigint = React.useMemo(() => acceptsBigint(schema), [schema])\n\n const onChange = React.useCallback(\n (e: React.ChangeEvent) => {\n if (e.currentTarget instanceof HTMLInputElement) {\n const rawValue = getRawValue(e.currentTarget)\n const normalized = normalizeRawValue(rawValue, {\n schema,\n tryNumber,\n tryBigint,\n })\n if (typeof rawValue === 'string' && typeof normalized !== 'string') {\n setTempRawValue(rawValue)\n }\n setRawValue(normalized)\n }\n },\n [getRawValue, setRawValue, schema]\n )\n\n const onFocus = React.useCallback(() => {\n setMeta({ visited: true })\n }, [])\n\n const onBlur = React.useCallback(\n (e: React.FocusEvent) => {\n if (e.currentTarget instanceof HTMLInputElement) {\n let rawValue = normalizeRawValue(getRawValue(e.currentTarget), {\n schema,\n tryNumber,\n tryBigint,\n })\n if (normalizeOnBlur) {\n const parsed = field.schema.safeParse(rawValue)\n const formatted = parsed.success\n ? invert(field.schema).safeParse(parsed.data)\n : undefined\n if (formatted?.success) rawValue = formatted.data\n }\n setRawValue(rawValue)\n setTempRawValue(undefined)\n }\n setMeta({ visited: true, touched: true })\n },\n [getRawValue, setRawValue, schema]\n )\n\n return React.useMemo(\n (): ValidUseHtmlFieldProps<Field> => ({\n input: {\n name: field.pathstring,\n type,\n value:\n typeof rawValue === 'boolean'\n ? String(rawValue)\n : typeof rawValue === 'string'\n ? rawValue || tempRawValue || ''\n : tempRawValue || (rawValue == null ? '' : String(rawValue) || ''),\n ...(type === 'checkbox' && { checked: Boolean(rawValue) }),\n onChange,\n onFocus,\n onBlur,\n },\n meta: {\n ...meta,\n value,\n rawValue,\n initialValue,\n rawInitialValue,\n setValue,\n setRawValue,\n setMeta,\n },\n }),\n [props, tempRawValue, onChange]\n ) as any\n}\n\nfunction getRawValue(el: HTMLInputElement | HTMLSelectElement) {\n return el.type === 'checkbox' ? el.checked : el.value\n}\n\nfunction normalizeBlank(schema: z.ZodTypeAny): any {\n if (schema.safeParse(undefined).success) return undefined\n if (schema.safeParse(null).success) return null\n return undefined\n}\n\nfunction safeBigInt(rawValue: string): bigint | undefined {\n try {\n return BigInt(rawValue)\n } catch (error) {\n return undefined\n }\n}\n\nfunction normalizeRawValue(\n rawValue: string | boolean,\n {\n schema,\n tryNumber,\n tryBigint,\n }: { schema: z.ZodTypeAny; tryNumber: boolean; tryBigint: boolean }\n): string | boolean | number | bigint | null | undefined {\n if (typeof rawValue === 'boolean') return rawValue\n if (typeof rawValue === 'string' && !/\\S/.test(rawValue)) {\n return normalizeBlank(schema)\n }\n if (typeof rawValue === 'string' && !schema.safeParse(rawValue).success) {\n if (tryNumber) {\n const num = Number(rawValue)\n if (!isNaN(num)) return num\n }\n if (tryBigint) {\n const bigint = safeBigInt(rawValue)\n if (bigint != null) return bigint\n }\n }\n return rawValue\n}\n\nexport function useHtmlField<Field extends FieldPath>(\n options: UseHtmlFieldOptions<Field, Field['schema']>\n): UseHtmlFieldProps<Field>\nexport function useHtmlField<\n T extends z.ZodTypeAny,\n Path extends PathInSchema<T>\n>(\n options: UseHtmlFieldOptions<Path, SchemaAt<T, Path>>\n): UseHtmlFieldProps<FieldPath<SchemaAt<T, Path>>>\nexport function useHtmlField<\n T extends z.ZodTypeAny,\n Path extends PathstringInSchema<T>\n>(\n options: UseHtmlFieldOptions<Path, SchemaAt<T, parsePathstring<Path>>>\n): UseHtmlFieldProps<FieldPath<SchemaAt<T, parsePathstring<Path>>>>\nexport function useHtmlField({\n field,\n ...rest\n}: UseHtmlFieldOptions<\n FieldPath | BasePath,\n z.ZodTypeAny\n>): UseHtmlFieldProps<any> {\n const { root } = useFormContext()\n return useHtmlFieldBase({\n field: field instanceof FieldPath ? field : root.get(field),\n ...rest,\n })\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"useHtmlField.mjs","names":["FieldPath","useField","React","invert","useFormContext","acceptsNumber","acceptsBigint","useHtmlFieldBase","options","field","type","normalizeOnBlur","props","value","rawValue","initialValue","rawInitialValue","setValue","setRawValue","setMeta","meta","schema","tempRawValue","setTempRawValue","useState","tryNumber","useMemo","tryBigint","onChange","useCallback","e","getRawValue","normalized","normalizeRawValue","onFocus","visited","onBlur","parsed","safeParse","formatted","success","data","undefined","touched","input","name","pathstring","String","checked","Boolean","target","HTMLInputElement","normalizeBlank","safeBigInt","BigInt","error","test","num","Number","isNaN","bigint","useHtmlField","rest","root","get"],"sources":["src/useHtmlField.ts"],"sourcesContent":["import z from 'zod'\nimport { BasePath, FieldPath } from './FieldPath'\nimport { useField, UseFieldProps } from './useField'\nimport React, { ChangeEvent, HTMLInputTypeAttribute } from 'react'\nimport { invert } from 'zod-invertible'\nimport { useFormContext } from './useFormContext'\nimport { acceptsNumber } from './util/acceptsNumber'\nimport { acceptsBigint } from './util/acceptsBigint'\nimport { PathInSchema, PathstringInSchema } from './util/PathInSchema'\nimport { parsePathstring } from './util/parsePathstring'\nimport { SchemaAt } from './util/SchemaAt'\n\nexport type HtmlFieldInputProps = {\n name: string\n type: HTMLInputTypeAttribute\n value: string\n checked?: boolean\n onChange: React.ChangeEventHandler\n onFocus: React.FocusEventHandler\n onBlur: React.FocusEventHandler\n}\n\nexport type ValidUseHtmlFieldProps<Field extends FieldPath> = {\n input: HtmlFieldInputProps\n meta: UseFieldProps<Field>\n}\n\nexport type UseHtmlFieldProps<Field extends FieldPath> = z.input<\n Field['schema']\n> extends string | number | bigint | boolean | null | undefined\n ? {\n input: HtmlFieldInputProps\n meta: UseFieldProps<Field>\n }\n : {\n ERROR: 'field schema input must be a nullish string, number, boolean or bigint'\n }\n\ntype UseHtmlFieldOptions<Field, Schema extends z.ZodTypeAny> = {\n field: Field\n type: z.input<Schema> extends boolean | null | undefined\n ? 'checkbox'\n : Exclude<HTMLInputTypeAttribute, 'checkbox'>\n normalizeOnBlur?: boolean\n}\n\nexport interface TypedUseHtmlField<T extends z.ZodTypeAny> {\n <Field extends FieldPath>(\n options: UseHtmlFieldOptions<Field, Field['schema']>\n ): UseHtmlFieldProps<Field>\n <Path extends PathInSchema<T>>(\n options: UseHtmlFieldOptions<Path, SchemaAt<T, Path>>\n ): UseHtmlFieldProps<FieldPath<SchemaAt<T, Path>>>\n <Path extends PathstringInSchema<T>>(\n options: UseHtmlFieldOptions<Path, SchemaAt<T, parsePathstring<Path>>>\n ): UseHtmlFieldProps<FieldPath<SchemaAt<T, parsePathstring<Path>>>>\n}\n\nfunction useHtmlFieldBase<Field extends FieldPath>(\n options: UseHtmlFieldOptions<Field, Field['schema']>\n): UseHtmlFieldProps<Field> {\n const { field, type, normalizeOnBlur = true } = options\n const props = useField(field)\n const {\n value,\n rawValue,\n initialValue,\n rawInitialValue,\n setValue,\n setRawValue,\n setMeta,\n ...meta\n } = props\n\n const { schema } = field\n\n // tempRawValue is used for storing blank text when we've coerced the\n // raw value to null or undefined, or storing numeric text when we've\n // coerced the raw value to a number or bigint.\n // This way we can set a raw value that will parse better in the form\n // state without interfering with the text the user is typing.\n const [tempRawValue, setTempRawValue] = React.useState(\n rawValue as string | null | undefined\n )\n\n const tryNumber = React.useMemo(() => acceptsNumber(schema), [schema])\n const tryBigint = React.useMemo(() => acceptsBigint(schema), [schema])\n\n const onChange = React.useCallback(\n (e: React.ChangeEvent) => {\n const rawValue = getRawValue(e)\n const normalized = normalizeRawValue(rawValue, {\n schema,\n tryNumber,\n tryBigint,\n })\n if (typeof rawValue === 'string' && typeof normalized !== 'string') {\n setTempRawValue(rawValue)\n }\n setRawValue(normalized)\n },\n [getRawValue, setRawValue, schema]\n )\n\n const onFocus = React.useCallback(() => {\n setMeta({ visited: true })\n }, [])\n\n const onBlur = React.useCallback(\n (e: React.FocusEvent) => {\n let rawValue = normalizeRawValue(getRawValue(e), {\n schema,\n tryNumber,\n tryBigint,\n })\n if (normalizeOnBlur) {\n const parsed = field.schema.safeParse(rawValue)\n const formatted = parsed.success\n ? invert(field.schema).safeParse(parsed.data)\n : undefined\n if (formatted?.success) rawValue = formatted.data\n setRawValue(rawValue)\n }\n setTempRawValue(undefined)\n setMeta({ visited: true, touched: true })\n },\n [getRawValue, setRawValue, schema]\n )\n\n return React.useMemo(\n (): ValidUseHtmlFieldProps<Field> => ({\n input: {\n name: field.pathstring,\n type,\n value:\n typeof rawValue === 'boolean'\n ? String(rawValue)\n : typeof rawValue === 'string'\n ? rawValue || tempRawValue || ''\n : tempRawValue || (rawValue == null ? '' : String(rawValue) || ''),\n ...(type === 'checkbox' && { checked: Boolean(rawValue) }),\n onChange,\n onFocus,\n onBlur,\n },\n meta: {\n ...meta,\n value,\n rawValue,\n initialValue,\n rawInitialValue,\n setValue,\n setRawValue,\n setMeta,\n },\n }),\n [props, tempRawValue, onChange]\n ) as any\n}\n\nfunction getRawValue(e: ChangeEvent) {\n const { target } = e\n if (target instanceof HTMLInputElement) {\n return target.type === 'checkbox' ? target.checked : target.value\n }\n return (target as any).value\n}\n\nfunction normalizeBlank(schema: z.ZodTypeAny): any {\n if (schema.safeParse(undefined).success) return undefined\n if (schema.safeParse(null).success) return null\n return undefined\n}\n\nfunction safeBigInt(rawValue: string): bigint | undefined {\n try {\n return BigInt(rawValue)\n } catch (error) {\n return undefined\n }\n}\n\nfunction normalizeRawValue(\n rawValue: string | boolean,\n {\n schema,\n tryNumber,\n tryBigint,\n }: { schema: z.ZodTypeAny; tryNumber: boolean; tryBigint: boolean }\n): string | boolean | number | bigint | null | undefined {\n if (typeof rawValue === 'boolean') return rawValue\n if (typeof rawValue === 'string' && !/\\S/.test(rawValue)) {\n return normalizeBlank(schema)\n }\n if (typeof rawValue === 'string' && !schema.safeParse(rawValue).success) {\n if (tryNumber) {\n const num = Number(rawValue)\n if (!isNaN(num)) return num\n }\n if (tryBigint) {\n const bigint = safeBigInt(rawValue)\n if (bigint != null) return bigint\n }\n }\n return rawValue\n}\n\nexport function useHtmlField<Field extends FieldPath>(\n options: UseHtmlFieldOptions<Field, Field['schema']>\n): UseHtmlFieldProps<Field>\nexport function useHtmlField<\n T extends z.ZodTypeAny,\n Path extends PathInSchema<T>\n>(\n options: UseHtmlFieldOptions<Path, SchemaAt<T, Path>>\n): UseHtmlFieldProps<FieldPath<SchemaAt<T, Path>>>\nexport function useHtmlField<\n T extends z.ZodTypeAny,\n Path extends PathstringInSchema<T>\n>(\n options: UseHtmlFieldOptions<Path, SchemaAt<T, parsePathstring<Path>>>\n): UseHtmlFieldProps<FieldPath<SchemaAt<T, parsePathstring<Path>>>>\nexport function useHtmlField({\n field,\n ...rest\n}: UseHtmlFieldOptions<\n FieldPath | BasePath,\n z.ZodTypeAny\n>): UseHtmlFieldProps<any> {\n const { root } = useFormContext()\n return useHtmlFieldBase({\n field: field instanceof FieldPath ? field : root.get(field),\n ...rest,\n })\n}\n"],"mappings":"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","ignoreList":[]}
|