@octanejs/hook-form 0.1.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.
Files changed (112) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +62 -0
  3. package/package.json +46 -0
  4. package/src/FormProvider.tsrx +76 -0
  5. package/src/FormProvider.tsrx.d.ts +10 -0
  6. package/src/constants.ts +31 -0
  7. package/src/controller.tsrx +8 -0
  8. package/src/controller.tsrx.d.ts +52 -0
  9. package/src/form.tsrx +119 -0
  10. package/src/form.tsrx.d.ts +6 -0
  11. package/src/formStateSubscribe.tsrx +10 -0
  12. package/src/formStateSubscribe.tsrx.d.ts +16 -0
  13. package/src/index.ts +19 -0
  14. package/src/logic/appendErrors.ts +19 -0
  15. package/src/logic/createFormControl.ts +1841 -0
  16. package/src/logic/generateId.ts +14 -0
  17. package/src/logic/generateWatchOutput.ts +27 -0
  18. package/src/logic/getCheckboxValue.ts +36 -0
  19. package/src/logic/getDirtyFields.ts +120 -0
  20. package/src/logic/getEventValue.ts +12 -0
  21. package/src/logic/getFieldValue.ts +33 -0
  22. package/src/logic/getFieldValueAs.ts +22 -0
  23. package/src/logic/getFocusFieldName.ts +13 -0
  24. package/src/logic/getNodeParentName.ts +4 -0
  25. package/src/logic/getProxyFormState.ts +33 -0
  26. package/src/logic/getRadioValue.ts +24 -0
  27. package/src/logic/getResolverOptions.ts +33 -0
  28. package/src/logic/getRuleValue.ts +16 -0
  29. package/src/logic/getValidateError.ts +22 -0
  30. package/src/logic/getValidationModes.ts +11 -0
  31. package/src/logic/getValueAndMessage.ts +12 -0
  32. package/src/logic/hasPromiseValidation.ts +27 -0
  33. package/src/logic/hasValidation.ts +12 -0
  34. package/src/logic/index.ts +3 -0
  35. package/src/logic/isNameInFieldArray.ts +7 -0
  36. package/src/logic/isWatched.ts +11 -0
  37. package/src/logic/iterateFieldsByAction.ts +37 -0
  38. package/src/logic/schemaErrorLookup.ts +54 -0
  39. package/src/logic/shouldRenderFormState.ts +25 -0
  40. package/src/logic/shouldSubscribeByName.ts +18 -0
  41. package/src/logic/skipValidation.ts +21 -0
  42. package/src/logic/unsetEmptyArray.ts +6 -0
  43. package/src/logic/updateFieldArrayRootError.ts +17 -0
  44. package/src/logic/validateField.ts +273 -0
  45. package/src/types/controller.ts +98 -0
  46. package/src/types/errors.ts +56 -0
  47. package/src/types/events.ts +26 -0
  48. package/src/types/fieldArray.ts +288 -0
  49. package/src/types/fields.ts +46 -0
  50. package/src/types/form.ts +961 -0
  51. package/src/types/index.ts +12 -0
  52. package/src/types/path/common.ts +391 -0
  53. package/src/types/path/eager.ts +224 -0
  54. package/src/types/path/index.ts +16 -0
  55. package/src/types/resolvers.ts +38 -0
  56. package/src/types/utils.ts +125 -0
  57. package/src/types/validator.ts +94 -0
  58. package/src/types/watch.ts +66 -0
  59. package/src/useController.ts +268 -0
  60. package/src/useFieldArray.ts +490 -0
  61. package/src/useForm.ts +182 -0
  62. package/src/useFormContext.ts +47 -0
  63. package/src/useFormControlContext.ts +25 -0
  64. package/src/useFormState.ts +86 -0
  65. package/src/useIsomorphicLayoutEffect.ts +6 -0
  66. package/src/useWatch.ts +356 -0
  67. package/src/utils/append.ts +4 -0
  68. package/src/utils/cloneObject.ts +32 -0
  69. package/src/utils/compact.ts +2 -0
  70. package/src/utils/convertToArrayPayload.ts +2 -0
  71. package/src/utils/createSubject.ts +48 -0
  72. package/src/utils/deepEqual.ts +81 -0
  73. package/src/utils/deepMerge.ts +27 -0
  74. package/src/utils/extractFormValues.ts +28 -0
  75. package/src/utils/fillEmptyArray.ts +3 -0
  76. package/src/utils/flatten.ts +23 -0
  77. package/src/utils/get.ts +29 -0
  78. package/src/utils/index.ts +3 -0
  79. package/src/utils/insert.ts +8 -0
  80. package/src/utils/isBoolean.ts +2 -0
  81. package/src/utils/isCheckBoxInput.ts +4 -0
  82. package/src/utils/isDateObject.ts +2 -0
  83. package/src/utils/isEmptyObject.ts +7 -0
  84. package/src/utils/isFileInput.ts +4 -0
  85. package/src/utils/isFunction.ts +2 -0
  86. package/src/utils/isHTMLElement.ts +13 -0
  87. package/src/utils/isKey.ts +4 -0
  88. package/src/utils/isMultipleSelect.ts +5 -0
  89. package/src/utils/isNullOrUndefined.ts +2 -0
  90. package/src/utils/isObject.ts +8 -0
  91. package/src/utils/isPlainObject.ts +8 -0
  92. package/src/utils/isPrimitive.ts +8 -0
  93. package/src/utils/isRadioInput.ts +4 -0
  94. package/src/utils/isRadioOrCheckbox.ts +8 -0
  95. package/src/utils/isRegex.ts +2 -0
  96. package/src/utils/isString.ts +2 -0
  97. package/src/utils/isUndefined.ts +2 -0
  98. package/src/utils/isWeb.ts +4 -0
  99. package/src/utils/live.ts +6 -0
  100. package/src/utils/move.ts +15 -0
  101. package/src/utils/noop.ts +2 -0
  102. package/src/utils/objectHasFunction.ts +11 -0
  103. package/src/utils/prepend.ts +7 -0
  104. package/src/utils/remove.ts +24 -0
  105. package/src/utils/set.ts +36 -0
  106. package/src/utils/sleep.ts +2 -0
  107. package/src/utils/stringToPath.ts +4 -0
  108. package/src/utils/swap.ts +4 -0
  109. package/src/utils/unset.ts +65 -0
  110. package/src/utils/update.ts +5 -0
  111. package/src/watch.tsrx +7 -0
  112. package/src/watch.tsrx.d.ts +42 -0
@@ -0,0 +1,288 @@
1
+ // Vendored from react-hook-form@7.81.0 src/types/fieldArray.ts (octane port).
2
+ import type { FieldValues } from './fields';
3
+ import type { Control } from './form';
4
+ import type { FieldArrayPath, FieldArrayPathValue } from './path';
5
+ import type { RegisterOptions, Validate } from './validator';
6
+
7
+ export type UseFieldArrayProps<
8
+ TFieldValues extends FieldValues = FieldValues,
9
+ TFieldArrayName extends FieldArrayPath<TFieldValues> = FieldArrayPath<TFieldValues>,
10
+ TKeyName extends string = 'id',
11
+ TTransformedValues = TFieldValues,
12
+ > = {
13
+ name: TFieldArrayName;
14
+ keyName?: TKeyName;
15
+ control?: Control<TFieldValues, any, TTransformedValues>;
16
+ rules?: {
17
+ validate?:
18
+ | Validate<FieldArray<TFieldValues, TFieldArrayName>[], TFieldValues>
19
+ | Record<string, Validate<FieldArray<TFieldValues, TFieldArrayName>[], TFieldValues>>;
20
+ } & Pick<RegisterOptions<TFieldValues>, 'maxLength' | 'minLength' | 'required'>;
21
+ shouldUnregister?: boolean;
22
+ disabled?: boolean;
23
+ };
24
+
25
+ /**
26
+ * `useFieldArray` returned `fields` with unique id
27
+ */
28
+ export type FieldArrayWithId<
29
+ TFieldValues extends FieldValues = FieldValues,
30
+ TFieldArrayName extends FieldArrayPath<TFieldValues> = FieldArrayPath<TFieldValues>,
31
+ TKeyName extends string = 'id',
32
+ > = FieldArray<TFieldValues, TFieldArrayName> & Record<TKeyName, string>;
33
+
34
+ export type FieldArray<
35
+ TFieldValues extends FieldValues = FieldValues,
36
+ TFieldArrayName extends FieldArrayPath<TFieldValues> = FieldArrayPath<TFieldValues>,
37
+ > =
38
+ FieldArrayPathValue<TFieldValues, TFieldArrayName> extends
39
+ | ReadonlyArray<infer U>
40
+ | null
41
+ | undefined
42
+ ? U
43
+ : never;
44
+
45
+ /**
46
+ * `useFieldArray` focus option, ability to toggle focus on and off with `shouldFocus` and setting focus by either field index or name.
47
+ */
48
+ export type FieldArrayMethodProps = {
49
+ shouldFocus?: boolean;
50
+ focusIndex?: number;
51
+ focusName?: string;
52
+ };
53
+
54
+ /**
55
+ * Swap field array by supplying from and to index
56
+ *
57
+ * @remarks
58
+ * [API](https://react-hook-form.com/docs/usefieldarray) • [Demo](https://codesandbox.io/s/calc-i231d)
59
+ *
60
+ * @param indexA - from index
61
+ * @param indexB - to index
62
+ *
63
+ * @example
64
+ * ```tsx
65
+ * <button type="button" onClick={() => swap(0, 1)}>swap</button>
66
+ * ```
67
+ */
68
+ export type UseFieldArraySwap = (indexA: number, indexB: number) => void;
69
+
70
+ /**
71
+ * Move field array by supplying from and to index
72
+ *
73
+ * @remarks
74
+ * [API](https://react-hook-form.com/docs/usefieldarray) • [Demo](https://codesandbox.io/s/calc-i231d)
75
+ *
76
+ * @param indexA - from index
77
+ * @param indexB - to index
78
+ *
79
+ * @example
80
+ * ```tsx
81
+ * <button type="button" onClick={() => move(0, 1)}>swap</button>
82
+ * ```
83
+ */
84
+ export type UseFieldArrayMove = (indexA: number, indexB: number) => void;
85
+
86
+ /**
87
+ * Prepend field/fields to the start of the fields and optionally focus. The input value will be registered during this action.
88
+ *
89
+ * @remarks
90
+ * [API](https://react-hook-form.com/docs/usefieldarray) • [Demo](https://codesandbox.io/s/calc-i231d)
91
+ *
92
+ * @param value - prepend items or items
93
+ * @param options - focus options
94
+ *
95
+ * @example
96
+ * ```tsx
97
+ * <button type="button" onClick={() => prepend({ name: "data" })}>Prepend</button>
98
+ * <button type="button" onClick={() => prepend({ name: "data" }, { shouldFocus: false })}>Prepend</button>
99
+ * <button
100
+ * type="button"
101
+ * onClick={() => prepend([{ name: "data" }, { name: "data" }])}
102
+ * >
103
+ * Prepend
104
+ * </button>
105
+ * ```
106
+ */
107
+ export type UseFieldArrayPrepend<
108
+ TFieldValues extends FieldValues,
109
+ TFieldArrayName extends FieldArrayPath<TFieldValues> = FieldArrayPath<TFieldValues>,
110
+ > = (
111
+ value: FieldArray<TFieldValues, TFieldArrayName> | FieldArray<TFieldValues, TFieldArrayName>[],
112
+ options?: FieldArrayMethodProps,
113
+ ) => void;
114
+
115
+ /**
116
+ * Append field/fields to the end of your fields and focus. The input value will be registered during this action.
117
+ *
118
+ * @remarks
119
+ * [API](https://react-hook-form.com/docs/usefieldarray) • [Demo](https://codesandbox.io/s/calc-i231d)
120
+ *
121
+ * @param value - append items or items.
122
+ * @param options - focus options
123
+ *
124
+ * @example
125
+ * ```tsx
126
+ * <button type="button" onClick={() => append({ name: "data" })}>Append</button>
127
+ * <button type="button" onClick={() => append({ name: "data" }, { shouldFocus: false })}>Append</button>
128
+ * <button
129
+ * type="button"
130
+ * onClick={() => append([{ name: "data" }, { name: "data" }])}
131
+ * >
132
+ * Append
133
+ * </button>
134
+ * ```
135
+ */
136
+ export type UseFieldArrayAppend<
137
+ TFieldValues extends FieldValues,
138
+ TFieldArrayName extends FieldArrayPath<TFieldValues> = FieldArrayPath<TFieldValues>,
139
+ > = (
140
+ value: FieldArray<TFieldValues, TFieldArrayName> | FieldArray<TFieldValues, TFieldArrayName>[],
141
+ options?: FieldArrayMethodProps,
142
+ ) => void;
143
+
144
+ /**
145
+ * Remove field/fields at particular position.
146
+ *
147
+ * @remarks
148
+ * [API](https://react-hook-form.com/docs/usefieldarray) • [Demo](https://codesandbox.io/s/calc-i231d)
149
+ *
150
+ * @param index - index to remove at, or remove all when no index provided.
151
+ *
152
+ * @example
153
+ * ```tsx
154
+ * <button type="button" onClick={() => remove(0)}>Remove</button>
155
+ * <button
156
+ * type="button"
157
+ * onClick={() => remove()}
158
+ * >
159
+ * Remove all
160
+ * </button>
161
+ * ```
162
+ */
163
+ export type UseFieldArrayRemove = (index?: number | number[]) => void;
164
+
165
+ /**
166
+ * Insert field/fields at particular position and focus.
167
+ *
168
+ * @remarks
169
+ * [API](https://react-hook-form.com/docs/usefieldarray) • [Demo](https://codesandbox.io/s/calc-i231d)
170
+ *
171
+ * @param index - insert position
172
+ * @param value - insert field or fields
173
+ * @param options - focus options
174
+ *
175
+ * @example
176
+ * ```tsx
177
+ * <button type="button" onClick={() => insert(1, { name: "data" })}>Insert</button>
178
+ * <button type="button" onClick={() => insert(1, { name: "data" }, { shouldFocus: false })}>Insert</button>
179
+ * <button
180
+ * type="button"
181
+ * onClick={() => insert(1, [{ name: "data" }, { name: "data" }])}
182
+ * >
183
+ * Insert
184
+ * </button>
185
+ * ```
186
+ */
187
+ export type UseFieldArrayInsert<
188
+ TFieldValues extends FieldValues,
189
+ TFieldArrayName extends FieldArrayPath<TFieldValues> = FieldArrayPath<TFieldValues>,
190
+ > = (
191
+ index: number,
192
+ value: FieldArray<TFieldValues, TFieldArrayName> | FieldArray<TFieldValues, TFieldArrayName>[],
193
+ options?: FieldArrayMethodProps,
194
+ ) => void;
195
+
196
+ /**
197
+ * Update field/fields at particular position.
198
+ *
199
+ * @remarks
200
+ * [API](https://react-hook-form.com/docs/usefieldarray) • [Demo](https://codesandbox.io/s/calc-i231d)
201
+ *
202
+ * @param index - insert position
203
+ * @param value - insert field or fields
204
+ *
205
+ * @example
206
+ * ```tsx
207
+ * <button type="button" onClick={() => update(1, { name: "data" })}>Update</button>
208
+ * <button
209
+ * type="button"
210
+ * onClick={() => update(1, [{ name: "data" }, { name: "data" }])}
211
+ * >
212
+ * Update
213
+ * </button>
214
+ * ```
215
+ */
216
+ export type UseFieldArrayUpdate<
217
+ TFieldValues extends FieldValues,
218
+ TFieldArrayName extends FieldArrayPath<TFieldValues> = FieldArrayPath<TFieldValues>,
219
+ > = (index: number, value: FieldArray<TFieldValues, TFieldArrayName>) => void;
220
+
221
+ /**
222
+ * Replace the entire field array values.
223
+ *
224
+ * @remarks
225
+ * [API](https://react-hook-form.com/docs/usefieldarray) • [Demo](https://codesandbox.io/s/calc-i231d)
226
+ *
227
+ * @param value - the entire field values.
228
+ *
229
+ * @example
230
+ * ```tsx
231
+ * <button
232
+ * type="button"
233
+ * onClick={() => replace([{ name: "data" }, { name: "data" }])}
234
+ * >
235
+ * Replace
236
+ * </button>
237
+ * ```
238
+ */
239
+ export type UseFieldArrayReplace<
240
+ TFieldValues extends FieldValues,
241
+ TFieldArrayName extends FieldArrayPath<TFieldValues> = FieldArrayPath<TFieldValues>,
242
+ > = (
243
+ value: FieldArray<TFieldValues, TFieldArrayName> | FieldArray<TFieldValues, TFieldArrayName>[],
244
+ ) => void;
245
+
246
+ export type UseFieldArrayReturn<
247
+ TFieldValues extends FieldValues = FieldValues,
248
+ TFieldArrayName extends FieldArrayPath<TFieldValues> = FieldArrayPath<TFieldValues>,
249
+ TKeyName extends string = 'id',
250
+ > = {
251
+ swap: UseFieldArraySwap;
252
+ move: UseFieldArrayMove;
253
+ prepend: UseFieldArrayPrepend<TFieldValues, TFieldArrayName>;
254
+ append: UseFieldArrayAppend<TFieldValues, TFieldArrayName>;
255
+ remove: UseFieldArrayRemove;
256
+ insert: UseFieldArrayInsert<TFieldValues, TFieldArrayName>;
257
+ update: UseFieldArrayUpdate<TFieldValues, TFieldArrayName>;
258
+ replace: UseFieldArrayReplace<TFieldValues, TFieldArrayName>;
259
+ fields: (FieldArrayWithId<TFieldValues, TFieldArrayName, TKeyName> & {
260
+ disabled?: boolean;
261
+ })[];
262
+ };
263
+
264
+ /**
265
+
266
+ *
267
+ * @example
268
+ * ```tsx
269
+ * const { fields } = useFieldArray({
270
+ * name: 'test',
271
+ * });
272
+ *
273
+ * <FieldArray
274
+ * render={({ fields }) =>
275
+ * fields.map((field, index) => (
276
+ * <input key={field.id} {...register(`test.${index}.value`)} />
277
+ * ))
278
+ * }
279
+ * />
280
+ * ```
281
+ */
282
+ export type FieldArrayProps<
283
+ TFieldValues extends FieldValues = FieldValues,
284
+ TFieldArrayName extends FieldArrayPath<TFieldValues> = FieldArrayPath<TFieldValues>,
285
+ TKeyName extends string = 'id',
286
+ > = {
287
+ render: (fieldArray: UseFieldArrayReturn<TFieldValues, TFieldArrayName, TKeyName>) => unknown; // octane: upstream's React.ReactElement — any octane renderable
288
+ } & UseFieldArrayProps<TFieldValues, TFieldArrayName, TKeyName>;
@@ -0,0 +1,46 @@
1
+ // Vendored from react-hook-form@7.81.0 src/types/fields.ts (octane port).
2
+ import type { IsFlatObject, Noop } from './utils';
3
+ import type { RegisterOptions } from './validator';
4
+
5
+ export type InternalFieldName = string;
6
+
7
+ export type FieldName<TFieldValues extends FieldValues> =
8
+ IsFlatObject<TFieldValues> extends true ? Extract<keyof TFieldValues, string> : string;
9
+
10
+ export type CustomElement<TFieldValues extends FieldValues> = Partial<HTMLElement> & {
11
+ name: FieldName<TFieldValues>;
12
+ type?: string;
13
+ value?: any;
14
+ disabled?: boolean;
15
+ checked?: boolean;
16
+ options?: HTMLOptionsCollection;
17
+ files?: FileList | null;
18
+ focus?: Noop;
19
+ };
20
+
21
+ export type FieldValue<TFieldValues extends FieldValues> = TFieldValues[InternalFieldName];
22
+
23
+ export type FieldValues = Record<string, any>;
24
+
25
+ export type NativeFieldValue = string | number | boolean | null | undefined | unknown[];
26
+
27
+ export type FieldElement<TFieldValues extends FieldValues = FieldValues> =
28
+ | HTMLInputElement
29
+ | HTMLSelectElement
30
+ | HTMLTextAreaElement
31
+ | CustomElement<TFieldValues>;
32
+
33
+ export type Ref = FieldElement;
34
+
35
+ export type Field = {
36
+ _f: {
37
+ ref: Ref;
38
+ name: InternalFieldName;
39
+ refs?: HTMLInputElement[];
40
+ mount?: boolean;
41
+ } & RegisterOptions;
42
+ };
43
+
44
+ export type FieldRefs = Partial<{
45
+ [key: InternalFieldName]: Field | FieldRefs;
46
+ }>;