@firecms/formex 3.0.0-canary.99 → 3.0.0-rc.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/dist/index.es.js CHANGED
@@ -1,29 +1,17 @@
1
+ import { c } from "react-compiler-runtime";
1
2
  import * as React from "react";
2
- import React__default, { useContext, useState, useEffect } from "react";
3
+ import React__default, { useContext, useRef, useState, useEffect, useCallback, useMemo } from "react";
3
4
  import equal from "react-fast-compare";
4
5
  const FormexContext = React__default.createContext({});
5
- const useFormex = () => useContext(FormexContext);
6
+ const useFormex = () => {
7
+ return useContext(FormexContext);
8
+ };
6
9
  const Formex = FormexContext.Provider;
7
10
  const isEmptyArray = (value) => Array.isArray(value) && value.length === 0;
8
11
  const isFunction = (obj) => typeof obj === "function";
9
12
  const isObject = (obj) => obj !== null && typeof obj === "object";
10
13
  const isInteger = (obj) => String(Math.floor(Number(obj))) === obj;
11
- const isString = (obj) => Object.prototype.toString.call(obj) === "[object String]";
12
14
  const isNaN = (obj) => obj !== obj;
13
- const isEmptyChildren = (children) => React.Children.count(children) === 0;
14
- const isPromise = (value) => isObject(value) && isFunction(value.then);
15
- const isInputEvent = (value) => value && isObject(value) && isObject(value.target);
16
- function getActiveElement(doc) {
17
- doc = doc || (typeof document !== "undefined" ? document : void 0);
18
- if (typeof doc === "undefined") {
19
- return null;
20
- }
21
- try {
22
- return doc.activeElement || doc.body;
23
- } catch (e) {
24
- return doc.body;
25
- }
26
- }
27
15
  function getIn(obj, key, def, p = 0) {
28
16
  const path = toPath(key);
29
17
  while (obj && p < path.length) {
@@ -62,26 +50,13 @@ function setIn(obj, path, value) {
62
50
  }
63
51
  return res;
64
52
  }
65
- function setNestedObjectValues(object, value, visited = /* @__PURE__ */ new WeakMap(), response = {}) {
66
- for (const k of Object.keys(object)) {
67
- const val = object[k];
68
- if (isObject(val)) {
69
- if (!visited.get(val)) {
70
- visited.set(val, true);
71
- response[k] = Array.isArray(val) ? [] : {};
72
- setNestedObjectValues(val, value, visited, response[k]);
73
- }
74
- } else {
75
- response[k] = value;
76
- }
77
- }
78
- return response;
79
- }
80
53
  function clone(value) {
81
54
  if (Array.isArray(value)) {
82
55
  return [...value];
83
56
  } else if (typeof value === "object" && value !== null) {
84
- return { ...value };
57
+ return {
58
+ ...value
59
+ };
85
60
  } else {
86
61
  return value;
87
62
  }
@@ -90,31 +65,145 @@ function toPath(value) {
90
65
  if (Array.isArray(value)) return value;
91
66
  return value.replace(/\[(\d+)]/g, ".$1").replace(/^\./, "").replace(/\.$/, "").split(".");
92
67
  }
93
- function Field({
94
- validate,
95
- name,
96
- children,
97
- as: is,
98
- // `as` is reserved in typescript lol
99
- // component,
100
- className,
101
- ...props
102
- }) {
68
+ function Field(t0) {
69
+ const $ = c(37);
70
+ let children;
71
+ let className;
72
+ let is;
73
+ let name;
74
+ let props;
75
+ if ($[0] !== t0) {
76
+ const {
77
+ validate,
78
+ name: t12,
79
+ children: t22,
80
+ as: t3,
81
+ className: t4,
82
+ ...t5
83
+ } = t0;
84
+ name = t12;
85
+ children = t22;
86
+ is = t3;
87
+ className = t4;
88
+ props = t5;
89
+ $[0] = t0;
90
+ $[1] = children;
91
+ $[2] = className;
92
+ $[3] = is;
93
+ $[4] = name;
94
+ $[5] = props;
95
+ } else {
96
+ children = $[1];
97
+ className = $[2];
98
+ is = $[3];
99
+ name = $[4];
100
+ props = $[5];
101
+ }
103
102
  const formex = useFormex();
104
- const field = getFieldProps({ name, ...props }, formex);
105
- if (isFunction(children)) {
106
- return children({ field, form: formex });
103
+ let field;
104
+ let t1;
105
+ if ($[6] !== children || $[7] !== formex || $[8] !== name || $[9] !== props) {
106
+ t1 = Symbol.for("react.early_return_sentinel");
107
+ bb0: {
108
+ field = getFieldProps({
109
+ name,
110
+ ...props
111
+ }, formex);
112
+ if (isFunction(children)) {
113
+ t1 = children({
114
+ field,
115
+ form: formex
116
+ });
117
+ break bb0;
118
+ }
119
+ }
120
+ $[6] = children;
121
+ $[7] = formex;
122
+ $[8] = name;
123
+ $[9] = props;
124
+ $[10] = field;
125
+ $[11] = t1;
126
+ } else {
127
+ field = $[10];
128
+ t1 = $[11];
129
+ }
130
+ if (t1 !== Symbol.for("react.early_return_sentinel")) {
131
+ return t1;
107
132
  }
108
133
  const asElement = is || "input";
109
134
  if (typeof asElement === "string") {
110
- const { innerRef, ...rest } = props;
111
- return React.createElement(
112
- asElement,
113
- { ref: innerRef, ...field, ...rest, className },
114
- children
115
- );
135
+ let innerRef;
136
+ let rest;
137
+ if ($[12] !== props) {
138
+ ({
139
+ innerRef,
140
+ ...rest
141
+ } = props);
142
+ $[12] = props;
143
+ $[13] = innerRef;
144
+ $[14] = rest;
145
+ } else {
146
+ innerRef = $[13];
147
+ rest = $[14];
148
+ }
149
+ let t22;
150
+ if ($[15] !== asElement || $[16] !== children || $[17] !== className || $[18] !== field || $[19] !== innerRef || $[20] !== rest) {
151
+ let t3;
152
+ if ($[22] !== className || $[23] !== field || $[24] !== innerRef || $[25] !== rest) {
153
+ t3 = {
154
+ ref: innerRef,
155
+ ...field,
156
+ ...rest,
157
+ className
158
+ };
159
+ $[22] = className;
160
+ $[23] = field;
161
+ $[24] = innerRef;
162
+ $[25] = rest;
163
+ $[26] = t3;
164
+ } else {
165
+ t3 = $[26];
166
+ }
167
+ t22 = React.createElement(asElement, t3, children);
168
+ $[15] = asElement;
169
+ $[16] = children;
170
+ $[17] = className;
171
+ $[18] = field;
172
+ $[19] = innerRef;
173
+ $[20] = rest;
174
+ $[21] = t22;
175
+ } else {
176
+ t22 = $[21];
177
+ }
178
+ return t22;
116
179
  }
117
- return React.createElement(asElement, { ...field, ...props, className }, children);
180
+ let t2;
181
+ if ($[27] !== asElement || $[28] !== children || $[29] !== className || $[30] !== field || $[31] !== props) {
182
+ let t3;
183
+ if ($[33] !== className || $[34] !== field || $[35] !== props) {
184
+ t3 = {
185
+ ...field,
186
+ ...props,
187
+ className
188
+ };
189
+ $[33] = className;
190
+ $[34] = field;
191
+ $[35] = props;
192
+ $[36] = t3;
193
+ } else {
194
+ t3 = $[36];
195
+ }
196
+ t2 = React.createElement(asElement, t3, children);
197
+ $[27] = asElement;
198
+ $[28] = children;
199
+ $[29] = className;
200
+ $[30] = field;
201
+ $[31] = props;
202
+ $[32] = t2;
203
+ } else {
204
+ t2 = $[32];
205
+ }
206
+ return t2;
118
207
  }
119
208
  const getFieldProps = (nameOrOptions, formex) => {
120
209
  const isAnObject = isObject(nameOrOptions);
@@ -151,104 +240,161 @@ const getFieldProps = (nameOrOptions, formex) => {
151
240
  }
152
241
  return field;
153
242
  };
154
- function useCreateFormex({ initialValues, initialErrors, validation, validateOnChange = false, onSubmit, validateOnInitialRender = false }) {
155
- const initialValuesRef = React__default.useRef(initialValues);
156
- const valuesRef = React__default.useRef(initialValues);
243
+ function useCreateFormex({
244
+ initialValues,
245
+ initialErrors,
246
+ initialDirty,
247
+ validation,
248
+ validateOnChange = false,
249
+ validateOnInitialRender = false,
250
+ onSubmit,
251
+ onReset,
252
+ debugId
253
+ }) {
254
+ const initialValuesRef = useRef(initialValues);
255
+ const valuesRef = useRef(initialValues);
256
+ const debugIdRef = useRef(debugId);
157
257
  const [values, setValuesInner] = useState(initialValues);
158
258
  const [touchedState, setTouchedState] = useState({});
159
259
  const [errors, setErrors] = useState(initialErrors ?? {});
160
- const [dirty, setDirty] = useState(false);
260
+ const [dirty, setDirty] = useState(initialDirty ?? false);
161
261
  const [submitCount, setSubmitCount] = useState(0);
162
262
  const [isSubmitting, setIsSubmitting] = useState(false);
163
263
  const [isValidating, setIsValidating] = useState(false);
264
+ const [version, setVersion] = useState(0);
265
+ const historyRef = useRef([initialValues]);
266
+ const historyIndexRef = useRef(0);
164
267
  useEffect(() => {
165
268
  if (validateOnInitialRender) {
166
269
  validate();
167
270
  }
168
271
  }, []);
169
- const setValues = (newValues) => {
272
+ const setValues = useCallback((newValues) => {
170
273
  valuesRef.current = newValues;
171
274
  setValuesInner(newValues);
172
- setDirty(equal(initialValuesRef.current, newValues));
173
- };
174
- const validate = async () => {
275
+ setDirty(!equal(initialValuesRef.current, newValues));
276
+ const newHistory = historyRef.current.slice(0, historyIndexRef.current + 1);
277
+ newHistory.push(newValues);
278
+ historyRef.current = newHistory;
279
+ historyIndexRef.current = newHistory.length - 1;
280
+ }, []);
281
+ const validate = useCallback(async () => {
175
282
  setIsValidating(true);
176
- const values2 = valuesRef.current;
177
- const validationErrors = await validation?.(values2);
283
+ const validationErrors = await validation?.(valuesRef.current);
178
284
  setErrors(validationErrors ?? {});
179
285
  setIsValidating(false);
180
286
  return validationErrors;
181
- };
182
- const setFieldValue = (key, value, shouldValidate) => {
183
- const newValues = setIn(valuesRef.current, key, value);
184
- valuesRef.current = newValues;
185
- setValuesInner(newValues);
287
+ }, [validation]);
288
+ const setFieldValue = useCallback((key, value, shouldValidate) => {
289
+ const newValues_0 = setIn(valuesRef.current, key, value);
290
+ valuesRef.current = newValues_0;
291
+ setValuesInner(newValues_0);
186
292
  if (!equal(getIn(initialValuesRef.current, key), value)) {
187
293
  setDirty(true);
188
294
  }
189
295
  if (shouldValidate) {
190
296
  validate();
191
297
  }
192
- };
193
- const setFieldError = (key, error) => {
194
- const newErrors = { ...errors };
195
- if (error) {
196
- newErrors[key] = error;
197
- } else {
198
- delete newErrors[key];
199
- }
200
- setErrors(newErrors);
201
- };
202
- const setFieldTouched = (key, touched, shouldValidate) => {
203
- const newTouched = { ...touchedState };
204
- newTouched[key] = touched;
205
- setTouchedState(newTouched);
206
- if (shouldValidate) {
298
+ const newHistory_0 = historyRef.current.slice(0, historyIndexRef.current + 1);
299
+ newHistory_0.push(newValues_0);
300
+ historyRef.current = newHistory_0;
301
+ historyIndexRef.current = newHistory_0.length - 1;
302
+ }, [validate]);
303
+ const setFieldError = useCallback((key_0, error) => {
304
+ setErrors((prevErrors) => {
305
+ const newErrors = {
306
+ ...prevErrors
307
+ };
308
+ if (error) {
309
+ newErrors[key_0] = error;
310
+ } else {
311
+ delete newErrors[key_0];
312
+ }
313
+ return newErrors;
314
+ });
315
+ }, []);
316
+ const setFieldTouched = useCallback((key_1, touched, shouldValidate_0) => {
317
+ setTouchedState((prev) => ({
318
+ ...prev,
319
+ [key_1]: touched
320
+ }));
321
+ if (shouldValidate_0) {
207
322
  validate();
208
323
  }
209
- };
210
- const handleChange = (event) => {
211
- const target = event.target;
212
- const value = target.type === "checkbox" ? target.checked : target.value;
213
- const name = target.name;
214
- setFieldValue(name, value, validateOnChange);
215
- setFieldTouched(name, true);
216
- };
217
- const handleBlur = (event) => {
324
+ }, [validate]);
325
+ const handleChange = useCallback((event) => {
218
326
  const target = event.target;
327
+ let value_0;
328
+ if (target.type === "checkbox") {
329
+ value_0 = target.checked;
330
+ } else if (target.type === "number") {
331
+ value_0 = target.valueAsNumber;
332
+ } else {
333
+ value_0 = target.value;
334
+ }
219
335
  const name = target.name;
336
+ setFieldValue(name, value_0, validateOnChange);
220
337
  setFieldTouched(name, true);
221
- };
222
- const submit = async (e) => {
338
+ }, [setFieldValue, setFieldTouched, validateOnChange]);
339
+ const handleBlur = useCallback((event_0) => {
340
+ const target_0 = event_0.target;
341
+ const name_0 = target_0.name;
342
+ setFieldTouched(name_0, true);
343
+ }, [setFieldTouched]);
344
+ const submit = useCallback(async (e) => {
223
345
  e?.preventDefault();
224
346
  e?.stopPropagation();
225
347
  setIsSubmitting(true);
226
- setSubmitCount(submitCount + 1);
227
- const validationErrors = await validation?.(valuesRef.current);
228
- if (validationErrors && Object.keys(validationErrors).length > 0) {
229
- setErrors(validationErrors);
348
+ setSubmitCount((prev_0) => prev_0 + 1);
349
+ const validationErrors_0 = await validation?.(valuesRef.current);
350
+ if (validationErrors_0 && Object.keys(validationErrors_0).length > 0) {
351
+ setErrors(validationErrors_0);
230
352
  } else {
231
353
  setErrors({});
232
354
  await onSubmit?.(valuesRef.current, controllerRef.current);
233
355
  }
234
356
  setIsSubmitting(false);
235
- };
236
- const resetForm = (props) => {
357
+ setVersion((prev_1) => prev_1 + 1);
358
+ }, [onSubmit, validation]);
359
+ const resetForm = useCallback((props) => {
237
360
  const {
238
361
  submitCount: submitCountProp,
239
362
  values: valuesProp,
240
363
  errors: errorsProp,
241
364
  touched: touchedProp
242
365
  } = props ?? {};
243
- initialValuesRef.current = valuesProp ?? initialValues;
244
- valuesRef.current = valuesProp ?? initialValues;
245
- setValuesInner(valuesProp ?? initialValues);
366
+ valuesRef.current = valuesProp ?? initialValuesRef.current;
367
+ initialValuesRef.current = valuesProp ?? initialValuesRef.current;
368
+ setValuesInner(valuesProp ?? initialValuesRef.current);
246
369
  setErrors(errorsProp ?? {});
247
370
  setTouchedState(touchedProp ?? {});
248
371
  setDirty(false);
249
372
  setSubmitCount(submitCountProp ?? 0);
250
- };
251
- const controller = {
373
+ setVersion((prev_2) => prev_2 + 1);
374
+ onReset?.(controllerRef.current);
375
+ historyRef.current = [valuesProp ?? initialValuesRef.current];
376
+ historyIndexRef.current = 0;
377
+ }, [onReset]);
378
+ const undo = useCallback(() => {
379
+ if (historyIndexRef.current > 0) {
380
+ const newIndex = historyIndexRef.current - 1;
381
+ const newValues_1 = historyRef.current[newIndex];
382
+ setValuesInner(newValues_1);
383
+ valuesRef.current = newValues_1;
384
+ historyIndexRef.current = newIndex;
385
+ }
386
+ }, []);
387
+ const redo = useCallback(() => {
388
+ if (historyIndexRef.current < historyRef.current.length - 1) {
389
+ const newIndex_0 = historyIndexRef.current + 1;
390
+ const newValues_2 = historyRef.current[newIndex_0];
391
+ setValuesInner(newValues_2);
392
+ valuesRef.current = newValues_2;
393
+ historyIndexRef.current = newIndex_0;
394
+ }
395
+ }, []);
396
+ const controllerRef = useRef({});
397
+ const controller = useMemo(() => ({
252
398
  values,
253
399
  initialValues: initialValuesRef.current,
254
400
  handleChange,
@@ -268,28 +414,30 @@ function useCreateFormex({ initialValues, initialErrors, validation, validateOnC
268
414
  handleBlur,
269
415
  validate,
270
416
  isValidating,
271
- resetForm
272
- };
273
- const controllerRef = React__default.useRef(controller);
274
- controllerRef.current = controller;
417
+ resetForm,
418
+ version,
419
+ debugId: debugIdRef.current,
420
+ undo,
421
+ redo,
422
+ canUndo: historyIndexRef.current > 0,
423
+ canRedo: historyIndexRef.current < historyRef.current.length - 1
424
+ }), [values, errors, touchedState, dirty, isSubmitting, submitCount, isValidating, version, handleChange, handleBlur, setValues, setFieldValue, setFieldTouched, setFieldError, validate, submit, resetForm, undo, redo]);
425
+ useEffect(() => {
426
+ controllerRef.current = controller;
427
+ }, [controller]);
275
428
  return controller;
276
429
  }
277
430
  export {
278
431
  Field,
279
432
  Formex,
280
- getActiveElement,
433
+ clone,
281
434
  getIn,
282
435
  isEmptyArray,
283
- isEmptyChildren,
284
436
  isFunction,
285
- isInputEvent,
286
437
  isInteger,
287
438
  isNaN,
288
439
  isObject,
289
- isPromise,
290
- isString,
291
440
  setIn,
292
- setNestedObjectValues,
293
441
  useCreateFormex,
294
442
  useFormex
295
443
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/Formex.tsx","../src/utils.ts","../src/Field.tsx","../src/useCreateFormex.tsx"],"sourcesContent":["import React, { useContext } from \"react\";\nimport { FormexController } from \"./types\";\n\nconst FormexContext = React.createContext<FormexController<any>>({} as any);\n\nexport const useFormex = <T extends object>() => useContext<FormexController<T>>(FormexContext);\n\nexport const Formex = FormexContext.Provider;\n","import * as React from \"react\";\n\n/** @private is the value an empty array? */\nexport const isEmptyArray = (value?: any) =>\n Array.isArray(value) && value.length === 0;\n\n/** @private is the given object a Function? */\nexport const isFunction = (obj: any): obj is Function =>\n typeof obj === \"function\";\n\n/** @private is the given object an Object? */\nexport const isObject = (obj: any): obj is Object =>\n obj !== null && typeof obj === \"object\";\n\n/** @private is the given object an integer? */\nexport const isInteger = (obj: any): boolean =>\n String(Math.floor(Number(obj))) === obj;\n\n/** @private is the given object a string? */\nexport const isString = (obj: any): obj is string =>\n Object.prototype.toString.call(obj) === \"[object String]\";\n\n/** @private is the given object a NaN? */\n// eslint-disable-next-line no-self-compare\nexport const isNaN = (obj: any): boolean => obj !== obj;\n\n/** @private Does a React component have exactly 0 children? */\nexport const isEmptyChildren = (children: any): boolean =>\n React.Children.count(children) === 0;\n\n/** @private is the given object/value a promise? */\nexport const isPromise = (value: any): value is PromiseLike<any> =>\n isObject(value) && isFunction(value.then);\n\n/** @private is the given object/value a type of synthetic event? */\nexport const isInputEvent = (value: any): value is React.SyntheticEvent<any> =>\n value && isObject(value) && isObject(value.target);\n\n/**\n * Same as document.activeElement but wraps in a try-catch block. In IE it is\n * not safe to call document.activeElement if there is nothing focused.\n *\n * The activeElement will be null only if the document or document body is not\n * yet defined.\n *\n * @param {?Document} doc Defaults to current document.\n * @return {Element | null}\n * @see https://github.com/facebook/fbjs/blob/master/packages/fbjs/src/core/dom/getActiveElement.js\n */\nexport function getActiveElement(doc?: Document): Element | null {\n doc = doc || (typeof document !== \"undefined\" ? document : undefined);\n if (typeof doc === \"undefined\") {\n return null;\n }\n try {\n return doc.activeElement || doc.body;\n } catch (e) {\n return doc.body;\n }\n}\n\n/**\n * Deeply get a value from an object via its path.\n */\nexport function getIn(\n obj: any,\n key: string | string[],\n def?: any,\n p = 0\n) {\n const path = toPath(key);\n while (obj && p < path.length) {\n obj = obj[path[p++]];\n }\n\n // check if path is not in the end\n if (p !== path.length && !obj) {\n return def;\n }\n\n return obj === undefined ? def : obj;\n}\n\nexport function setIn(obj: any, path: string, value: any): any {\n const res: any = clone(obj); // this keeps inheritance when obj is a class\n let resVal: any = res;\n let i = 0;\n const pathArray = toPath(path);\n\n for (; i < pathArray.length - 1; i++) {\n const currentPath: string = pathArray[i];\n const currentObj: any = getIn(obj, pathArray.slice(0, i + 1));\n\n if (currentObj && (isObject(currentObj) || Array.isArray(currentObj))) {\n resVal = resVal[currentPath] = clone(currentObj);\n } else {\n const nextPath: string = pathArray[i + 1];\n resVal = resVal[currentPath] =\n isInteger(nextPath) && Number(nextPath) >= 0 ? [] : {};\n }\n }\n\n // Return original object if new value is the same as current\n if ((i === 0 ? obj : resVal)[pathArray[i]] === value) {\n return obj;\n }\n\n if (value === undefined) {\n delete resVal[pathArray[i]];\n } else {\n resVal[pathArray[i]] = value;\n }\n\n // If the path array has a single element, the loop did not run.\n // Deleting on `resVal` had no effect in this scenario, so we delete on the result instead.\n if (i === 0 && value === undefined) {\n delete res[pathArray[i]];\n }\n\n return res;\n}\n\n/**\n * Recursively a set the same value for all keys and arrays nested object, cloning\n * @param object\n * @param value\n * @param visited\n * @param response\n */\nexport function setNestedObjectValues<T>(\n object: any,\n value: any,\n visited: any = new WeakMap(),\n response: any = {}\n): T {\n for (const k of Object.keys(object)) {\n const val = object[k];\n if (isObject(val)) {\n if (!visited.get(val)) {\n visited.set(val, true);\n // In order to keep array values consistent for both dot path and\n // bracket syntax, we need to check if this is an array so that\n // this will output { friends: [true] } and not { friends: { \"0\": true } }\n response[k] = Array.isArray(val) ? [] : {};\n setNestedObjectValues(val, value, visited, response[k]);\n }\n } else {\n response[k] = value;\n }\n }\n\n return response;\n}\n\nfunction clone(value: any) {\n if (Array.isArray(value)) {\n return [...value];\n } else if (typeof value === \"object\" && value !== null) {\n return { ...value };\n } else {\n return value; // This is for primitive types which do not need cloning.\n }\n}\n\nfunction toPath(value: string | string[]) {\n if (Array.isArray(value)) return value; // Already in path array form.\n // Replace brackets with dots, remove leading/trailing dots, then split by dot.\n return value.replace(/\\[(\\d+)]/g, \".$1\").replace(/^\\./, \"\").replace(/\\.$/, \"\").split(\".\");\n}\n","import * as React from \"react\";\nimport { useFormex } from \"./Formex\";\nimport { getIn, isFunction, isObject } from \"./utils\";\nimport { FormexController } from \"./types\";\n\nexport interface FieldInputProps<Value> {\n /** Value of the field */\n value: Value;\n /** Name of the field */\n name: string;\n /** Multiple select? */\n multiple?: boolean;\n /** Is the field checked? */\n checked?: boolean;\n /** Change event handler */\n onChange: (event: React.SyntheticEvent) => void,\n /** Blur event handler */\n onBlur: (event: React.FocusEvent) => void,\n}\n\nexport interface FormexFieldProps<Value = any, FormValues extends object = any> {\n field: FieldInputProps<Value>;\n form: FormexController<FormValues>;\n}\n\nexport interface FieldConfig<Value, C extends React.ElementType | undefined = undefined> {\n\n /**\n * Component to render. Can either be a string e.g. 'select', 'input', or 'textarea', or a component.\n */\n as?:\n | C\n | string\n | React.ForwardRefExoticComponent<any>;\n\n /**\n * Children render function <Field name>{props => ...}</Field>)\n */\n children?: ((props: FormexFieldProps<Value>) => React.ReactNode) | React.ReactNode;\n\n /**\n * Validate a single field value independently\n */\n // validate?: FieldValidator;\n\n /**\n * Used for 'select' and related input types.\n */\n multiple?: boolean;\n\n /**\n * Field name\n */\n name: string;\n\n /** HTML input type */\n type?: string;\n\n /** Field value */\n value?: any;\n\n /** Inner ref */\n innerRef?: (instance: any) => void;\n\n}\n\nexport type FieldProps<T, C extends React.ElementType | undefined> = {\n as?: C;\n} & (C extends React.ElementType ? (React.ComponentProps<C> & FieldConfig<T, C>) : FieldConfig<T, C>);\n\nexport function Field<T, C extends React.ElementType | undefined = undefined>({\n validate,\n name,\n children,\n as: is, // `as` is reserved in typescript lol\n // component,\n className,\n ...props\n }: FieldProps<T, C>) {\n const formex = useFormex();\n\n const field = getFieldProps({ name, ...props }, formex);\n\n if (isFunction(children)) {\n return children({ field, form: formex });\n }\n\n // if (component) {\n // if (typeof component === \"string\") {\n // const { innerRef, ...rest } = props;\n // return React.createElement(\n // component,\n // { ref: innerRef, ...field, ...rest, className },\n // children\n // );\n // }\n // return React.createElement(\n // component,\n // { field, form: formex, ...props, className },\n // children\n // );\n // }\n\n // default to input here so we can check for both `as` and `children` above\n const asElement = is || \"input\";\n\n if (typeof asElement === \"string\") {\n const { innerRef, ...rest } = props;\n return React.createElement(\n asElement,\n { ref: innerRef, ...field, ...rest, className },\n children\n );\n }\n\n return React.createElement(asElement, { ...field, ...props, className }, children);\n}\n\nconst getFieldProps = (nameOrOptions: string | FieldConfig<any>, formex: FormexController<any>): FieldInputProps<any> => {\n const isAnObject = isObject(nameOrOptions);\n const name = isAnObject\n ? (nameOrOptions as FieldConfig<any>).name\n : nameOrOptions;\n const valueState = getIn(formex.values, name);\n\n const field: FieldInputProps<any> = {\n name,\n value: valueState,\n onChange: formex.handleChange,\n onBlur: formex.handleBlur,\n };\n if (isAnObject) {\n const {\n type,\n value: valueProp, // value is special for checkboxes\n as: is,\n multiple,\n } = nameOrOptions as FieldConfig<any>;\n\n if (type === \"checkbox\") {\n if (valueProp === undefined) {\n field.checked = !!valueState;\n } else {\n field.checked = !!(\n Array.isArray(valueState) && ~valueState.indexOf(valueProp)\n );\n field.value = valueProp;\n }\n } else if (type === \"radio\") {\n field.checked = valueState === valueProp;\n field.value = valueProp;\n } else if (is === \"select\" && multiple) {\n field.value = field.value || [];\n field.multiple = true;\n }\n }\n return field;\n};\n","import React, { FormEvent, useEffect, useState } from \"react\";\nimport { getIn, setIn } from \"./utils\";\nimport equal from \"react-fast-compare\"\n\nimport { FormexController, FormexResetProps } from \"./types\";\n\nexport function useCreateFormex<T extends object>({ initialValues, initialErrors, validation, validateOnChange = false, onSubmit, validateOnInitialRender = false }: {\n initialValues: T,\n initialErrors?: Record<string, string>,\n validateOnChange?: boolean,\n validateOnInitialRender?: boolean,\n validation?: (values: T) => Record<string, string> | Promise<Record<string, string>> | undefined | void,\n onSubmit?: (values: T, controller: FormexController<T>) => void | Promise<void>\n}): FormexController<T> {\n\n const initialValuesRef = React.useRef<T>(initialValues);\n const valuesRef = React.useRef<T>(initialValues);\n\n const [values, setValuesInner] = useState<T>(initialValues);\n const [touchedState, setTouchedState] = useState<Record<string, boolean>>({});\n const [errors, setErrors] = useState<Record<string, string>>(initialErrors ?? {});\n const [dirty, setDirty] = useState(false);\n const [submitCount, setSubmitCount] = useState(0);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isValidating, setIsValidating] = useState(false);\n\n useEffect(() => {\n if (validateOnInitialRender) {\n validate();\n }\n }, []);\n\n const setValues = (newValues: T) => {\n valuesRef.current = newValues;\n setValuesInner(newValues);\n setDirty(equal(initialValuesRef.current, newValues));\n }\n\n const validate = async () => {\n setIsValidating(true);\n const values = valuesRef.current;\n const validationErrors = await validation?.(values);\n setErrors(validationErrors ?? {});\n setIsValidating(false);\n return validationErrors;\n }\n\n const setFieldValue = (key: string, value: any, shouldValidate?: boolean) => {\n const newValues = setIn(valuesRef.current, key, value);\n valuesRef.current = newValues;\n setValuesInner(newValues);\n if (!equal(getIn(initialValuesRef.current, key), value)) {\n setDirty(true);\n }\n if (shouldValidate) {\n validate();\n }\n }\n\n const setFieldError = (key: string, error: string | undefined) => {\n const newErrors = { ...errors };\n if (error) {\n newErrors[key] = error;\n } else {\n delete newErrors[key];\n }\n setErrors(newErrors);\n }\n\n const setFieldTouched = (key: string, touched: boolean, shouldValidate?: boolean | undefined) => {\n const newTouched = { ...touchedState };\n newTouched[key] = touched;\n setTouchedState(newTouched);\n if (shouldValidate) {\n validate();\n }\n }\n\n const handleChange = (event: React.SyntheticEvent) => {\n const target = event.target as HTMLInputElement;\n const value = target.type === \"checkbox\" ? target.checked : target.value;\n const name = target.name;\n setFieldValue(name, value, validateOnChange);\n setFieldTouched(name, true);\n }\n\n const handleBlur = (event: React.FocusEvent) => {\n const target = event.target as HTMLInputElement;\n const name = target.name;\n setFieldTouched(name, true);\n }\n\n const submit = async (e?: FormEvent<HTMLFormElement>) => {\n e?.preventDefault();\n e?.stopPropagation();\n setIsSubmitting(true);\n setSubmitCount(submitCount + 1);\n const validationErrors = await validation?.(valuesRef.current);\n if (validationErrors && Object.keys(validationErrors).length > 0) {\n setErrors(validationErrors);\n } else {\n setErrors({});\n await onSubmit?.(valuesRef.current, controllerRef.current);\n }\n setIsSubmitting(false);\n }\n\n const resetForm = (props?: FormexResetProps<T>) => {\n const {\n submitCount: submitCountProp,\n values: valuesProp,\n errors: errorsProp,\n touched: touchedProp\n } = props ?? {};\n initialValuesRef.current = valuesProp ?? initialValues;\n valuesRef.current = valuesProp ?? initialValues;\n setValuesInner(valuesProp ?? initialValues);\n setErrors(errorsProp ?? {});\n setTouchedState(touchedProp ?? {});\n setDirty(false);\n setSubmitCount(submitCountProp ?? 0);\n }\n\n const controller: FormexController<T> = {\n values,\n initialValues: initialValuesRef.current,\n handleChange,\n isSubmitting,\n setSubmitting: setIsSubmitting,\n setValues,\n setFieldValue,\n errors,\n setFieldError,\n touched: touchedState,\n setFieldTouched,\n dirty,\n setDirty,\n handleSubmit: submit,\n submitCount,\n setSubmitCount,\n handleBlur,\n validate,\n isValidating,\n resetForm\n };\n\n const controllerRef = React.useRef<FormexController<T>>(controller);\n controllerRef.current = controller;\n return controller\n}\n"],"names":["React","values"],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/Formex.tsx","../src/utils.ts","../src/Field.tsx","../src/useCreateFormex.tsx"],"sourcesContent":["import React, { useContext } from \"react\";\nimport { FormexController } from \"./types\";\n\nconst FormexContext = React.createContext<FormexController<any>>({} as any);\n\nexport const useFormex = <T extends object>() => useContext<FormexController<T>>(FormexContext);\n\nexport const Formex = FormexContext.Provider;\n","/** @private is the value an empty array? */\nexport const isEmptyArray = (value?: any) =>\n Array.isArray(value) && value.length === 0;\n\n/** @private is the given object a Function? */\nexport const isFunction = (obj: any): obj is Function =>\n typeof obj === \"function\";\n\n/** @private is the given object an Object? */\nexport const isObject = (obj: any): obj is Object =>\n obj !== null && typeof obj === \"object\";\n\n/** @private is the given object an integer? */\nexport const isInteger = (obj: any): boolean =>\n String(Math.floor(Number(obj))) === obj;\n\n/** @private is the given object a NaN? */\n// eslint-disable-next-line no-self-compare\nexport const isNaN = (obj: any): boolean => obj !== obj;\n\n/**\n * Deeply get a value from an object via its path.\n */\nexport function getIn(\n obj: any,\n key: string | string[],\n def?: any,\n p = 0\n) {\n const path = toPath(key);\n while (obj && p < path.length) {\n obj = obj[path[p++]];\n }\n\n // check if path is not in the end\n if (p !== path.length && !obj) {\n return def;\n }\n\n return obj === undefined ? def : obj;\n}\n\nexport function setIn(obj: any, path: string, value: any): any {\n const res: any = clone(obj); // this keeps inheritance when obj is a class\n let resVal: any = res;\n let i = 0;\n const pathArray = toPath(path);\n\n for (; i < pathArray.length - 1; i++) {\n const currentPath: string = pathArray[i];\n const currentObj: any = getIn(obj, pathArray.slice(0, i + 1));\n\n if (currentObj && (isObject(currentObj) || Array.isArray(currentObj))) {\n resVal = resVal[currentPath] = clone(currentObj);\n } else {\n const nextPath: string = pathArray[i + 1];\n resVal = resVal[currentPath] =\n isInteger(nextPath) && Number(nextPath) >= 0 ? [] : {};\n }\n }\n\n // Return original object if new value is the same as current\n if ((i === 0 ? obj : resVal)[pathArray[i]] === value) {\n return obj;\n }\n\n if (value === undefined) {\n delete resVal[pathArray[i]];\n } else {\n resVal[pathArray[i]] = value;\n }\n\n // If the path array has a single element, the loop did not run.\n // Deleting on `resVal` had no effect in this scenario, so we delete on the result instead.\n if (i === 0 && value === undefined) {\n delete res[pathArray[i]];\n }\n\n return res;\n}\n\nexport function clone(value: any) {\n if (Array.isArray(value)) {\n return [...value];\n } else if (typeof value === \"object\" && value !== null) {\n return { ...value };\n } else {\n return value; // This is for primitive types which do not need cloning.\n }\n}\n\nfunction toPath(value: string | string[]) {\n if (Array.isArray(value)) return value; // Already in path array form.\n // Replace brackets with dots, remove leading/trailing dots, then split by dot.\n return value.replace(/\\[(\\d+)]/g, \".$1\").replace(/^\\./, \"\").replace(/\\.$/, \"\").split(\".\");\n}\n","import * as React from \"react\";\nimport { useFormex } from \"./Formex\";\nimport { getIn, isFunction, isObject } from \"./utils\";\nimport { FormexController } from \"./types\";\n\nexport interface FieldInputProps<Value> {\n /** Value of the field */\n value: Value;\n /** Name of the field */\n name: string;\n /** Multiple select? */\n multiple?: boolean;\n /** Is the field checked? */\n checked?: boolean;\n /** Change event handler */\n onChange: (event: React.SyntheticEvent) => void,\n /** Blur event handler */\n onBlur: (event: React.FocusEvent) => void,\n}\n\nexport interface FormexFieldProps<Value = any, FormValues extends object = any> {\n field: FieldInputProps<Value>;\n form: FormexController<FormValues>;\n}\n\nexport interface FieldConfig<Value, C extends React.ElementType | undefined = undefined> {\n\n /**\n * Component to render. Can either be a string e.g. 'select', 'input', or 'textarea', or a component.\n */\n as?:\n | C\n | string\n | React.ForwardRefExoticComponent<any>;\n\n /**\n * Children render function <Field name>{props => ...}</Field>)\n */\n children?: ((props: FormexFieldProps<Value>) => React.ReactNode) | React.ReactNode;\n\n /**\n * Validate a single field value independently\n */\n // validate?: FieldValidator;\n\n /**\n * Used for 'select' and related input types.\n */\n multiple?: boolean;\n\n /**\n * Field name\n */\n name: string;\n\n /** HTML input type */\n type?: string;\n\n /** Field value */\n value?: any;\n\n /** Inner ref */\n innerRef?: (instance: any) => void;\n\n}\n\nexport type FieldProps<T, C extends React.ElementType | undefined> = {\n as?: C;\n} & (C extends React.ElementType ? (React.ComponentProps<C> & FieldConfig<T, C>) : FieldConfig<T, C>);\n\nexport function Field<T, C extends React.ElementType | undefined = undefined>({\n validate,\n name,\n children,\n as: is, // `as` is reserved in typescript lol\n // component,\n className,\n ...props\n }: FieldProps<T, C>) {\n const formex = useFormex();\n\n const field = getFieldProps({ name, ...props }, formex);\n\n if (isFunction(children)) {\n return children({ field, form: formex });\n }\n\n // if (component) {\n // if (typeof component === \"string\") {\n // const { innerRef, ...rest } = props;\n // return React.createElement(\n // component,\n // { ref: innerRef, ...field, ...rest, className },\n // children\n // );\n // }\n // return React.createElement(\n // component,\n // { field, form: formex, ...props, className },\n // children\n // );\n // }\n\n // default to input here so we can check for both `as` and `children` above\n const asElement = is || \"input\";\n\n if (typeof asElement === \"string\") {\n const { innerRef, ...rest } = props;\n return React.createElement(\n asElement,\n { ref: innerRef, ...field, ...rest, className },\n children\n );\n }\n\n return React.createElement(asElement, { ...field, ...props, className }, children);\n}\n\nconst getFieldProps = (nameOrOptions: string | FieldConfig<any>, formex: FormexController<any>): FieldInputProps<any> => {\n const isAnObject = isObject(nameOrOptions);\n const name = isAnObject\n ? (nameOrOptions as FieldConfig<any>).name\n : nameOrOptions;\n const valueState = getIn(formex.values, name);\n\n const field: FieldInputProps<any> = {\n name,\n value: valueState,\n onChange: formex.handleChange,\n onBlur: formex.handleBlur,\n };\n if (isAnObject) {\n const {\n type,\n value: valueProp, // value is special for checkboxes\n as: is,\n multiple,\n } = nameOrOptions as FieldConfig<any>;\n\n if (type === \"checkbox\") {\n if (valueProp === undefined) {\n field.checked = !!valueState;\n } else {\n field.checked = !!(\n Array.isArray(valueState) && ~valueState.indexOf(valueProp)\n );\n field.value = valueProp;\n }\n } else if (type === \"radio\") {\n field.checked = valueState === valueProp;\n field.value = valueProp;\n } else if (is === \"select\" && multiple) {\n field.value = field.value || [];\n field.multiple = true;\n }\n }\n return field;\n};\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { getIn, setIn } from \"./utils\";\nimport equal from \"react-fast-compare\";\n\nimport { FormexController, FormexResetProps } from \"./types\";\n\nexport function useCreateFormex<T extends object>({\n initialValues,\n initialErrors,\n initialDirty,\n validation,\n validateOnChange = false,\n validateOnInitialRender = false,\n onSubmit,\n onReset,\n debugId,\n }: {\n initialValues: T;\n initialErrors?: Record<string, string>;\n initialDirty?: boolean;\n validateOnChange?: boolean;\n validateOnInitialRender?: boolean;\n validation?: (\n values: T\n ) =>\n | Record<string, string>\n | Promise<Record<string, string>>\n | undefined\n | void;\n onSubmit?: (values: T, controller: FormexController<T>) => void | Promise<void>;\n onReset?: (controller: FormexController<T>) => void | Promise<void>;\n debugId?: string;\n}): FormexController<T> {\n const initialValuesRef = useRef<T>(initialValues);\n const valuesRef = useRef<T>(initialValues);\n const debugIdRef = useRef<string | undefined>(debugId);\n\n const [values, setValuesInner] = useState<T>(initialValues);\n const [touchedState, setTouchedState] = useState<Record<string, boolean>>({});\n const [errors, setErrors] = useState<Record<string, string>>(initialErrors ?? {});\n const [dirty, setDirty] = useState(initialDirty ?? false);\n const [submitCount, setSubmitCount] = useState(0);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isValidating, setIsValidating] = useState(false);\n const [version, setVersion] = useState(0);\n\n // Replace state for history with refs\n const historyRef = useRef<T[]>([initialValues]);\n const historyIndexRef = useRef<number>(0);\n\n useEffect(() => {\n if (validateOnInitialRender) {\n validate();\n }\n }, []);\n\n const setValues = useCallback((newValues: T) => {\n valuesRef.current = newValues;\n setValuesInner(newValues);\n setDirty(!equal(initialValuesRef.current, newValues));\n // Update history using refs\n const newHistory = historyRef.current.slice(0, historyIndexRef.current + 1);\n newHistory.push(newValues);\n historyRef.current = newHistory;\n historyIndexRef.current = newHistory.length - 1;\n }, []);\n\n const validate = useCallback(async () => {\n setIsValidating(true);\n const validationErrors = await validation?.(valuesRef.current);\n setErrors(validationErrors ?? {});\n setIsValidating(false);\n return validationErrors;\n }, [validation]);\n\n const setFieldValue = useCallback(\n (key: string, value: any, shouldValidate?: boolean) => {\n const newValues = setIn(valuesRef.current, key, value);\n valuesRef.current = newValues;\n setValuesInner(newValues);\n if (!equal(getIn(initialValuesRef.current, key), value)) {\n setDirty(true);\n }\n if (shouldValidate) {\n validate();\n }\n // Update history using refs\n const newHistory = historyRef.current.slice(0, historyIndexRef.current + 1);\n newHistory.push(newValues);\n historyRef.current = newHistory;\n historyIndexRef.current = newHistory.length - 1;\n },\n [validate]\n );\n\n const setFieldError = useCallback((key: string, error: string | undefined) => {\n setErrors((prevErrors) => {\n const newErrors = { ...prevErrors };\n if (error) {\n newErrors[key] = error;\n } else {\n delete newErrors[key];\n }\n return newErrors;\n });\n }, []);\n\n const setFieldTouched = useCallback(\n (key: string, touched: boolean, shouldValidate?: boolean) => {\n setTouchedState((prev) => ({\n ...prev,\n [key]: touched,\n }));\n if (shouldValidate) {\n validate();\n }\n },\n [validate]\n );\n\n const handleChange = useCallback(\n (event: React.SyntheticEvent) => {\n const target = event.target as HTMLInputElement;\n let value;\n if (target.type === \"checkbox\") {\n value = target.checked;\n } else if (target.type === \"number\") {\n value = target.valueAsNumber;\n } else {\n value = target.value;\n }\n const name = target.name;\n setFieldValue(name, value, validateOnChange);\n setFieldTouched(name, true);\n },\n [setFieldValue, setFieldTouched, validateOnChange]\n );\n\n const handleBlur = useCallback((event: React.FocusEvent) => {\n const target = event.target as HTMLInputElement;\n const name = target.name;\n setFieldTouched(name, true);\n }, [setFieldTouched]);\n\n const submit = useCallback(\n async (e?: React.FormEvent<HTMLFormElement>) => {\n e?.preventDefault();\n e?.stopPropagation();\n setIsSubmitting(true);\n setSubmitCount((prev) => prev + 1);\n const validationErrors = await validation?.(valuesRef.current);\n if (validationErrors && Object.keys(validationErrors).length > 0) {\n setErrors(validationErrors);\n } else {\n setErrors({});\n await onSubmit?.(valuesRef.current, controllerRef.current);\n }\n setIsSubmitting(false);\n setVersion((prev) => prev + 1);\n },\n [onSubmit, validation]\n );\n\n const resetForm = useCallback((props?: FormexResetProps<T>) => {\n const {\n submitCount: submitCountProp,\n values: valuesProp,\n errors: errorsProp,\n touched: touchedProp\n } = props ?? {};\n valuesRef.current = valuesProp ?? initialValuesRef.current;\n initialValuesRef.current = valuesProp ?? initialValuesRef.current;\n setValuesInner(valuesProp ?? initialValuesRef.current);\n setErrors(errorsProp ?? {});\n setTouchedState(touchedProp ?? {});\n setDirty(false);\n setSubmitCount(submitCountProp ?? 0);\n setVersion((prev) => prev + 1);\n onReset?.(controllerRef.current);\n // Reset history with refs\n historyRef.current = [valuesProp ?? initialValuesRef.current];\n historyIndexRef.current = 0;\n }, [onReset]);\n\n const undo = useCallback(() => {\n if (historyIndexRef.current > 0) {\n const newIndex = historyIndexRef.current - 1;\n const newValues = historyRef.current[newIndex];\n setValuesInner(newValues);\n valuesRef.current = newValues;\n historyIndexRef.current = newIndex;\n }\n }, []);\n\n const redo = useCallback(() => {\n if (historyIndexRef.current < historyRef.current.length - 1) {\n const newIndex = historyIndexRef.current + 1;\n const newValues = historyRef.current[newIndex];\n setValuesInner(newValues);\n valuesRef.current = newValues;\n historyIndexRef.current = newIndex;\n }\n }, []);\n\n const controllerRef = useRef<FormexController<T>>({} as FormexController<T>);\n\n const controller = useMemo<FormexController<T>>(\n () => ({\n values,\n initialValues: initialValuesRef.current,\n handleChange,\n isSubmitting,\n setSubmitting: setIsSubmitting,\n setValues,\n setFieldValue,\n errors,\n setFieldError,\n touched: touchedState,\n setFieldTouched,\n dirty,\n setDirty,\n handleSubmit: submit,\n submitCount,\n setSubmitCount,\n handleBlur,\n validate,\n isValidating,\n resetForm,\n version,\n debugId: debugIdRef.current,\n undo,\n redo,\n canUndo: historyIndexRef.current > 0,\n canRedo: historyIndexRef.current < historyRef.current.length - 1,\n }),\n [\n values,\n errors,\n touchedState,\n dirty,\n isSubmitting,\n submitCount,\n isValidating,\n version,\n handleChange,\n handleBlur,\n setValues,\n setFieldValue,\n setFieldTouched,\n setFieldError,\n validate,\n submit,\n resetForm,\n undo,\n redo,\n ]\n );\n\n useEffect(() => {\n controllerRef.current = controller;\n }, [controller]);\n\n return controller;\n}\n"],"names":["FormexContext","React","createContext","useFormex","useContext","Formex","Provider","isEmptyArray","value","Array","isArray","length","isFunction","obj","isObject","isInteger","String","Math","floor","Number","isNaN","getIn","key","def","p","path","toPath","undefined","setIn","res","clone","resVal","i","pathArray","currentPath","currentObj","slice","nextPath","replace","split","Field","t0","$","_c","children","className","is","name","props","validate","t1","t2","as","t3","t4","t5","formex","field","Symbol","for","bb0","getFieldProps","form","asElement","innerRef","rest","ref","createElement","nameOrOptions","isAnObject","valueState","values","onChange","handleChange","onBlur","handleBlur","type","valueProp","multiple","checked","indexOf","useCreateFormex","initialValues","initialErrors","initialDirty","validation","validateOnChange","validateOnInitialRender","onSubmit","onReset","debugId","initialValuesRef","useRef","valuesRef","debugIdRef","setValuesInner","useState","touchedState","setTouchedState","errors","setErrors","dirty","setDirty","submitCount","setSubmitCount","isSubmitting","setIsSubmitting","isValidating","setIsValidating","version","setVersion","historyRef","historyIndexRef","useEffect","setValues","useCallback","newValues","current","equal","newHistory","push","validationErrors","setFieldValue","shouldValidate","setFieldError","error","prevErrors","newErrors","setFieldTouched","touched","prev","event","target","valueAsNumber","submit","e","preventDefault","stopPropagation","Object","keys","controllerRef","resetForm","submitCountProp","valuesProp","errorsProp","touchedProp","undo","newIndex","redo","controller","useMemo","setSubmitting","handleSubmit","canUndo","canRedo"],"mappings":"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"}