@juantroconisf/lib 6.1.0 → 8.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/README.md +235 -53
- package/dist/index.d.mts +77 -64
- package/dist/index.d.ts +77 -64
- package/dist/index.js +627 -644
- package/dist/index.mjs +626 -650
- package/package.json +45 -37
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { SelectProps, AutocompleteProps } from '@heroui/react';
|
|
2
2
|
import { SingleSelection } from '@react-types/shared';
|
|
3
|
+
import { Schema, InferType } from 'yup';
|
|
3
4
|
|
|
4
5
|
type StateType = Record<string, any>;
|
|
5
6
|
interface NestedChangeProps<O extends StateType> {
|
|
@@ -13,82 +14,63 @@ declare class NextUIError {
|
|
|
13
14
|
errorMessage: string;
|
|
14
15
|
constructor(bool?: boolean, msg?: string);
|
|
15
16
|
}
|
|
16
|
-
type ValidatorFunction<T, U> = (val: T, ...args: U[]) => boolean;
|
|
17
|
-
interface Validator<T, U = any> {
|
|
18
|
-
validate: ValidatorFunction<T, U>;
|
|
19
|
-
msg: string;
|
|
20
|
-
}
|
|
21
|
-
interface ValidatorTypes {
|
|
22
|
-
required: Validator<string | number, boolean>;
|
|
23
|
-
min: Validator<number | string, number | string>;
|
|
24
|
-
max: Validator<number | string, number | string>;
|
|
25
|
-
minLength: Validator<string, number>;
|
|
26
|
-
maxLength: Validator<string, number>;
|
|
27
|
-
pattern: Validator<string, RegExp>;
|
|
28
|
-
equal: Validator<string, string>;
|
|
29
|
-
numberIsEqual: Validator<number, number>;
|
|
30
|
-
email: Validator<string, boolean>;
|
|
31
|
-
password: Validator<string, boolean>;
|
|
32
|
-
custom: Validator<any, boolean>;
|
|
33
|
-
}
|
|
34
|
-
type ValidatorParams = {
|
|
35
|
-
[K in keyof ValidatorTypes]?: ValidatorTypes[K] extends Validator<any, infer U> ? U : never;
|
|
36
|
-
};
|
|
37
|
-
type ValidatorErrorMessage = {
|
|
38
|
-
[K in keyof ValidatorTypes]?: string;
|
|
39
|
-
};
|
|
40
17
|
|
|
41
18
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* @template K The key of the array in the state.
|
|
19
|
+
* Valid types for the initial state configuration.
|
|
20
|
+
* Can be a raw value or a Yup schema.
|
|
45
21
|
*/
|
|
46
|
-
type
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
22
|
+
type ConfigType = any | Schema<any>;
|
|
23
|
+
/**
|
|
24
|
+
* Helper to infer the state type from the configuration object.
|
|
25
|
+
* If a value is a Yup schema, infer its return type.
|
|
26
|
+
* Otherwise, use the value's type directly.
|
|
27
|
+
*/
|
|
28
|
+
type InferState<S extends Record<string, ConfigType>> = {
|
|
29
|
+
[K in keyof S]: S[K] extends Schema<any, any, any, any> ? InferType<S[K]> : S[K];
|
|
30
|
+
};
|
|
50
31
|
/**
|
|
51
32
|
* Options for the useForm hook.
|
|
52
33
|
* @template O The state type.
|
|
53
34
|
*/
|
|
54
35
|
interface FormOptions<O extends StateType> {
|
|
55
|
-
/** Validation rules for top-level fields. */
|
|
56
|
-
rules?: Partial<Record<RulePath<O>, ValidatorRule>>;
|
|
57
|
-
/** Custom error messages for top-level fields. */
|
|
58
|
-
messages?: Partial<Record<RulePath<O>, ValidatorErrorMessage>>;
|
|
59
36
|
/**
|
|
60
37
|
* Custom property names used as unique identifiers for items in specific arrays.
|
|
61
38
|
* Default is "id".
|
|
62
39
|
*/
|
|
63
|
-
arrayIdentifiers?: Partial<Record<
|
|
40
|
+
arrayIdentifiers?: Partial<Record<ArrayPaths<O>, string>>;
|
|
41
|
+
}
|
|
42
|
+
type FieldMetadata = {
|
|
43
|
+
isTouched: boolean;
|
|
44
|
+
isInvalid: boolean;
|
|
45
|
+
errorMessage: string;
|
|
46
|
+
};
|
|
47
|
+
type MetadataType = Map<string, FieldMetadata>;
|
|
48
|
+
type SubmitHandler<O extends StateType> = (data: O, e: React.FormEvent) => void;
|
|
49
|
+
interface ResetOptions<O> {
|
|
50
|
+
preservedStateKeys?: (keyof O)[];
|
|
51
|
+
preserveTouched?: boolean;
|
|
64
52
|
}
|
|
65
|
-
type TouchedType = Map<string, boolean>;
|
|
66
|
-
type ErrorsType = Map<string, NextUIError>;
|
|
67
53
|
type ValueChangeFunc<O extends StateType, K extends keyof O> = (id: K, value: O[K]) => void;
|
|
68
54
|
type BlurFunc<O extends StateType> = (id: keyof O) => void;
|
|
69
|
-
interface ComponentInputProps
|
|
55
|
+
interface ComponentInputProps {
|
|
70
56
|
id: string;
|
|
71
57
|
onBlur: () => void;
|
|
72
58
|
isInvalid: boolean;
|
|
73
59
|
errorMessage: string;
|
|
74
60
|
}
|
|
75
|
-
type UXProps<O extends StateType> = Record<keyof O, {
|
|
76
|
-
isInvalid: boolean;
|
|
77
|
-
errorMessage: string;
|
|
78
|
-
}>;
|
|
79
61
|
/** Props returned by on.input() */
|
|
80
|
-
interface ItemInputProps<V = any> extends ComponentInputProps
|
|
62
|
+
interface ItemInputProps<V = any> extends ComponentInputProps {
|
|
81
63
|
onValueChange: (value: V) => void;
|
|
82
64
|
value: V;
|
|
83
65
|
}
|
|
84
66
|
/** Props returned by on.select() */
|
|
85
|
-
interface ItemSelectProps extends ComponentInputProps
|
|
86
|
-
onSelectionChange: SelectProps["onSelectionChange"]
|
|
67
|
+
interface ItemSelectProps extends ComponentInputProps {
|
|
68
|
+
onSelectionChange: NonNullable<SelectProps["onSelectionChange"]>;
|
|
87
69
|
selectedKeys: string[] | number[] | string | null;
|
|
88
70
|
}
|
|
89
71
|
/** Props returned by on.autocomplete() */
|
|
90
|
-
interface ItemAutocompleteProps extends ComponentInputProps
|
|
91
|
-
onSelectionChange: AutocompleteProps["onSelectionChange"]
|
|
72
|
+
interface ItemAutocompleteProps extends ComponentInputProps {
|
|
73
|
+
onSelectionChange: NonNullable<AutocompleteProps["onSelectionChange"]>;
|
|
92
74
|
selectedKey: SingleSelection["selectedKey"];
|
|
93
75
|
}
|
|
94
76
|
/**
|
|
@@ -98,23 +80,50 @@ interface OnMethods<O extends StateType> {
|
|
|
98
80
|
/** Registers a scalar or nested object field. */
|
|
99
81
|
input<P extends AllPaths<O>>(id: P): ItemInputProps<NestedFieldValue<O, P & string>>;
|
|
100
82
|
/** Registers an array element — adapts to primitive arrays (by index) or object arrays (by ID + field). */
|
|
101
|
-
|
|
83
|
+
/** Registers an array element — adapts to primitive arrays (by index). */
|
|
84
|
+
input<K extends ArrayKeys<O>>(arrayKey: K, index: number): ItemInputProps<any>;
|
|
85
|
+
/** Registers an object array element's field using composite syntax "array.field". */
|
|
86
|
+
input<P extends ObjectArrayFieldPaths<O>>(compositePath: P, itemId: ItemIdType<O, GetArrayKeyFromPath<O, P>>): ItemInputProps<any>;
|
|
102
87
|
/** Registers a scalar or nested object field. */
|
|
103
88
|
select<P extends AllPaths<O>>(id: P): ItemSelectProps;
|
|
89
|
+
/** Registers a complete array field for multi-selection. */
|
|
90
|
+
select<K extends ArrayKeys<O>>(arrayKey: K): ItemSelectProps;
|
|
104
91
|
/** Registers an array element — adapts to primitive arrays (by index) or object arrays (by ID + field). */
|
|
105
|
-
select<K extends ArrayKeys<O>>(arrayKey: K,
|
|
92
|
+
select<K extends ArrayKeys<O>>(arrayKey: K, index: number): ItemSelectProps;
|
|
93
|
+
/** Registers an object array element's field using composite syntax "array.field". */
|
|
94
|
+
select<P extends ObjectArrayFieldPaths<O>>(compositePath: P, itemId: ItemIdType<O, GetArrayKeyFromPath<O, P>>): ItemSelectProps;
|
|
106
95
|
/** Registers a scalar or nested object field. */
|
|
107
96
|
autocomplete<P extends AllPaths<O>>(id: P): ItemAutocompleteProps;
|
|
108
97
|
/** Registers an array element — adapts to primitive arrays (by index) or object arrays (by ID + field). */
|
|
109
|
-
|
|
98
|
+
/** Registers an array element — adapts to primitive arrays (by index). */
|
|
99
|
+
autocomplete<K extends ArrayKeys<O>>(arrayKey: K, index: number): ItemAutocompleteProps;
|
|
100
|
+
/** Registers an object array element's field using composite syntax "array.field". */
|
|
101
|
+
autocomplete<P extends ObjectArrayFieldPaths<O>>(compositePath: P, itemId: ItemIdType<O, GetArrayKeyFromPath<O, P>>): ItemAutocompleteProps;
|
|
110
102
|
}
|
|
111
103
|
type ArrayKeys<O extends StateType> = {
|
|
112
104
|
[K in keyof O]: O[K] extends any[] ? K : never;
|
|
113
105
|
}[keyof O];
|
|
106
|
+
/**
|
|
107
|
+
* Recursive type to find all paths to arrays in the state.
|
|
108
|
+
*/
|
|
109
|
+
type ArrayPaths<T> = T extends object ? {
|
|
110
|
+
[K in keyof T & string]: NonNullable<T[K]> extends (infer E)[] ? K | (E extends object ? `${K}.${ArrayPaths<E>}` : never) : NonNullable<T[K]> extends object ? NonNullable<T[K]> extends Date ? never : `${K}.${ArrayPaths<NonNullable<T[K]>>}` : never;
|
|
111
|
+
}[keyof T & string] : never;
|
|
114
112
|
/** Keys whose values are arrays of objects (not primitives). */
|
|
115
113
|
type ObjectArrayKeys<O extends StateType> = {
|
|
116
114
|
[K in keyof O]: O[K] extends Record<string, any>[] ? K : never;
|
|
117
115
|
}[keyof O];
|
|
116
|
+
/**
|
|
117
|
+
* Helper to get paths for fields within object arrays.
|
|
118
|
+
* Returns paths like "arrayKey.fieldName".
|
|
119
|
+
*/
|
|
120
|
+
type ObjectArrayFieldPaths<O extends StateType> = {
|
|
121
|
+
[K in keyof O]: O[K] extends Record<string, any>[] ? `${K & string}.${FieldPaths<ArrayElement<O[K]>>}` : never;
|
|
122
|
+
}[keyof O];
|
|
123
|
+
/**
|
|
124
|
+
* Helper to extract the array key from a path string like "arrayKey.field".
|
|
125
|
+
*/
|
|
126
|
+
type GetArrayKeyFromPath<O extends StateType, P extends string> = P extends `${infer K}.${string}` ? K extends keyof O ? O[K] extends any[] ? K : never : never : never;
|
|
118
127
|
type ArrayElement<T> = T extends (infer E)[] ? E : never;
|
|
119
128
|
/** Resolves the type of the identifier field for an array element (defaults to "id"). */
|
|
120
129
|
type ItemIdType<O extends StateType, K extends keyof O> = "id" extends keyof ArrayElement<O[K]> ? ArrayElement<O[K]>["id"] : string | number;
|
|
@@ -154,29 +163,33 @@ interface HelpersFunc<O extends StateType> {
|
|
|
154
163
|
* @template O The state type.
|
|
155
164
|
*/
|
|
156
165
|
interface UseFormResponse<O extends StateType> {
|
|
157
|
-
|
|
166
|
+
onFieldBlur: BlurFunc<O>;
|
|
158
167
|
/** Updates an object array element's field by ID. */
|
|
159
|
-
|
|
168
|
+
onFieldChange<K extends ObjectArrayKeys<O>, F extends keyof ArrayElement<O[K]> & string>(arrayKey: K, itemId: ItemIdType<O, K>, field: F, value: ArrayElement<O[K]>[F]): void;
|
|
160
169
|
/** Updates a scalar or nested object field. */
|
|
161
|
-
|
|
170
|
+
onFieldChange<P extends AllPaths<O>>(id: P, value: NestedFieldValue<O, P & string>): void;
|
|
162
171
|
onSelectionChange: ValueChangeFunc<O, keyof O>;
|
|
163
172
|
state: O;
|
|
164
173
|
setState: React.Dispatch<React.SetStateAction<O>>;
|
|
165
|
-
|
|
166
|
-
errors: ErrorsType;
|
|
174
|
+
metadata: MetadataType;
|
|
167
175
|
/** Main object to bind form elements to the state. */
|
|
168
176
|
on: OnMethods<O>;
|
|
169
177
|
/** Array manipulation helpers. */
|
|
170
178
|
helpers: HelpersFunc<O>;
|
|
171
179
|
isDirty: boolean;
|
|
172
|
-
/**
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
180
|
+
/**
|
|
181
|
+
* Resets the form state and metadata.
|
|
182
|
+
* @param options Configuration for the reset (preserve keys, preserve touched).
|
|
183
|
+
*/
|
|
184
|
+
reset: (options?: ResetOptions<O>) => void;
|
|
185
|
+
/**
|
|
186
|
+
* Wraps a form submission handler to automatically validate the form.
|
|
187
|
+
* If validation fails, identifying errors and touching fields.
|
|
188
|
+
* If validation succeeds, calls the provided handler with the current state.
|
|
189
|
+
*/
|
|
190
|
+
onSubmit: (fn: SubmitHandler<O>) => (e: React.FormEvent) => void;
|
|
178
191
|
}
|
|
179
192
|
|
|
180
|
-
declare function useForm<
|
|
193
|
+
declare function useForm<S extends Record<string, ConfigType>>(schema: S, { arrayIdentifiers }?: FormOptions<InferState<S>>): UseFormResponse<InferState<S>>;
|
|
181
194
|
|
|
182
|
-
export { type BlurFunc, type
|
|
195
|
+
export { type BlurFunc, type ConfigType, type FieldMetadata, type FormOptions, type HelpersFunc, type InferState, type MetadataType, type NestedChangeProps, NextUIError, type OnMethods, type StateType, type SubmitHandler, type UseFormResponse, type ValueChangeFunc, useForm };
|