@firecms/formex 3.0.0-canary.286 → 3.0.0-canary.288

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
@@ -65,21 +65,6 @@ function toPath(value) {
65
65
  if (Array.isArray(value)) return value;
66
66
  return value.replace(/\[(\d+)]/g, ".$1").replace(/^\./, "").replace(/\.$/, "").split(".");
67
67
  }
68
- function flattenKeys(obj, prefix = "", result = []) {
69
- if (isObject(obj) || Array.isArray(obj)) {
70
- for (const key in obj) {
71
- if (Object.prototype.hasOwnProperty.call(obj, key)) {
72
- const newKey = prefix ? Array.isArray(obj) ? `${prefix}[${key}]` : `${prefix}.${key}` : key;
73
- if (isObject(obj[key]) || Array.isArray(obj[key])) {
74
- flattenKeys(obj[key], newKey, result);
75
- } else {
76
- result.push(newKey);
77
- }
78
- }
79
- }
80
- }
81
- return result;
82
- }
83
68
  function Field(t0) {
84
69
  const $ = c(37);
85
70
  let children;
@@ -442,6 +427,7 @@ function useCreateFormex({
442
427
  setFieldError,
443
428
  touched: touchedState,
444
429
  setFieldTouched,
430
+ setTouched: setTouchedState,
445
431
  dirty,
446
432
  setDirty,
447
433
  handleSubmit: submit,
@@ -457,7 +443,7 @@ function useCreateFormex({
457
443
  redo,
458
444
  canUndo: historyIndexRef.current > 0,
459
445
  canRedo: historyIndexRef.current < historyRef.current.length - 1
460
- }), [values, errors, touchedState, dirty, isSubmitting, submitCount, isValidating, version, handleChange, handleBlur, setValues, setFieldValue, setFieldTouched, setFieldError, validate, submit, resetForm, undo, redo]);
446
+ }), [values, errors, touchedState, dirty, isSubmitting, submitCount, isValidating, version, handleChange, handleBlur, setValues, setFieldValue, setFieldTouched, setTouchedState, setFieldError, validate, submit, resetForm, undo, redo]);
461
447
  useEffect(() => {
462
448
  controllerRef.current = controller;
463
449
  }, [controller]);
@@ -467,7 +453,6 @@ export {
467
453
  Field,
468
454
  Formex,
469
455
  clone,
470
- flattenKeys,
471
456
  getIn,
472
457
  isEmptyArray,
473
458
  isFunction,
@@ -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","/** @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\nexport function flattenKeys(obj: any, prefix = \"\", result: string[] = []): string[] {\n if (isObject(obj) || Array.isArray(obj)) {\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const newKey = prefix\n ? Array.isArray(obj)\n ? `${prefix}[${key}]`\n : `${prefix}.${key}`\n : key;\n if (isObject(obj[key]) || Array.isArray(obj[key])) {\n flattenKeys(obj[key], newKey, result);\n } else {\n result.push(newKey);\n }\n }\n }\n }\n return result;\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 initialTouched,\n validation,\n validateOnChange = false,\n validateOnInitialRender = false,\n onSubmit,\n onReset,\n onValuesChangeDeferred,\n debugId,\n }: {\n initialValues: T;\n initialErrors?: Record<string, string>;\n initialDirty?: boolean;\n initialTouched?: Record<string, 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 onValuesChangeDeferred?: (values: T, controller: FormexController<T>) => 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>>(initialTouched ?? {});\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 const onValuesChangeRef = useRef(onValuesChangeDeferred);\n onValuesChangeRef.current = onValuesChangeDeferred;\n const debounceTimeoutRef = useRef<any>();\n\n const callDebouncedOnValuesChange = useCallback((values: T) => {\n if (onValuesChangeRef.current) {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n }\n debounceTimeoutRef.current = setTimeout(() => {\n onValuesChangeRef.current?.(values, controllerRef.current);\n }, 300);\n }\n }, []);\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 callDebouncedOnValuesChange(newValues);\n }, [callDebouncedOnValuesChange]);\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 callDebouncedOnValuesChange(newValues);\n },\n [validate, callDebouncedOnValuesChange]\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 ?? initialTouched ?? {});\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, initialTouched]);\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 setDirty(!equal(initialValuesRef.current, newValues));\n callDebouncedOnValuesChange(newValues);\n }\n }, [callDebouncedOnValuesChange]);\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 setDirty(!equal(initialValuesRef.current, newValues));\n callDebouncedOnValuesChange(newValues);\n }\n }, [callDebouncedOnValuesChange]);\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","flattenKeys","prefix","result","Object","prototype","hasOwnProperty","call","newKey","push","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","initialTouched","validation","validateOnChange","validateOnInitialRender","onSubmit","onReset","onValuesChangeDeferred","debugId","initialValuesRef","useRef","valuesRef","debugIdRef","setValuesInner","useState","touchedState","setTouchedState","errors","setErrors","dirty","setDirty","submitCount","setSubmitCount","isSubmitting","setIsSubmitting","isValidating","setIsValidating","version","setVersion","onValuesChangeRef","current","debounceTimeoutRef","callDebouncedOnValuesChange","useCallback","clearTimeout","setTimeout","controllerRef","historyRef","historyIndexRef","useEffect","setValues","newValues","equal","newHistory","validationErrors","setFieldValue","shouldValidate","setFieldError","error","prevErrors","newErrors","setFieldTouched","touched","prev","event","target","valueAsNumber","submit","e","preventDefault","stopPropagation","keys","resetForm","submitCountProp","valuesProp","errorsProp","touchedProp","undo","newIndex","redo","controller","useMemo","setSubmitting","handleSubmit","canUndo","canRedo"],"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 initialTouched,\n validation,\n validateOnChange = false,\n validateOnInitialRender = false,\n onSubmit,\n onReset,\n onValuesChangeDeferred,\n debugId,\n }: {\n initialValues: T;\n initialErrors?: Record<string, string>;\n initialDirty?: boolean;\n initialTouched?: Record<string, 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 onValuesChangeDeferred?: (values: T, controller: FormexController<T>) => 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>>(initialTouched ?? {});\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 const onValuesChangeRef = useRef(onValuesChangeDeferred);\n onValuesChangeRef.current = onValuesChangeDeferred;\n const debounceTimeoutRef = useRef<any>();\n\n const callDebouncedOnValuesChange = useCallback((values: T) => {\n if (onValuesChangeRef.current) {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n }\n debounceTimeoutRef.current = setTimeout(() => {\n onValuesChangeRef.current?.(values, controllerRef.current);\n }, 300);\n }\n }, []);\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 callDebouncedOnValuesChange(newValues);\n }, [callDebouncedOnValuesChange]);\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 callDebouncedOnValuesChange(newValues);\n },\n [validate, callDebouncedOnValuesChange]\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 ?? initialTouched ?? {});\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, initialTouched]);\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 setDirty(!equal(initialValuesRef.current, newValues));\n callDebouncedOnValuesChange(newValues);\n }\n }, [callDebouncedOnValuesChange]);\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 setDirty(!equal(initialValuesRef.current, newValues));\n callDebouncedOnValuesChange(newValues);\n }\n }, [callDebouncedOnValuesChange]);\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 setTouched: setTouchedState,\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 setTouchedState,\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","initialTouched","validation","validateOnChange","validateOnInitialRender","onSubmit","onReset","onValuesChangeDeferred","debugId","initialValuesRef","useRef","valuesRef","debugIdRef","setValuesInner","useState","touchedState","setTouchedState","errors","setErrors","dirty","setDirty","submitCount","setSubmitCount","isSubmitting","setIsSubmitting","isValidating","setIsValidating","version","setVersion","onValuesChangeRef","current","debounceTimeoutRef","callDebouncedOnValuesChange","useCallback","clearTimeout","setTimeout","controllerRef","historyRef","historyIndexRef","useEffect","setValues","newValues","equal","newHistory","push","validationErrors","setFieldValue","shouldValidate","setFieldError","error","prevErrors","newErrors","setFieldTouched","touched","prev","event","target","valueAsNumber","submit","e","preventDefault","stopPropagation","Object","keys","resetForm","submitCountProp","valuesProp","errorsProp","touchedProp","undo","newIndex","redo","controller","useMemo","setSubmitting","setTouched","handleSubmit","canUndo","canRedo"],"mappings":"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"}
package/dist/index.umd.js CHANGED
@@ -82,21 +82,6 @@
82
82
  if (Array.isArray(value)) return value;
83
83
  return value.replace(/\[(\d+)]/g, ".$1").replace(/^\./, "").replace(/\.$/, "").split(".");
84
84
  }
85
- function flattenKeys(obj, prefix = "", result = []) {
86
- if (isObject(obj) || Array.isArray(obj)) {
87
- for (const key in obj) {
88
- if (Object.prototype.hasOwnProperty.call(obj, key)) {
89
- const newKey = prefix ? Array.isArray(obj) ? `${prefix}[${key}]` : `${prefix}.${key}` : key;
90
- if (isObject(obj[key]) || Array.isArray(obj[key])) {
91
- flattenKeys(obj[key], newKey, result);
92
- } else {
93
- result.push(newKey);
94
- }
95
- }
96
- }
97
- }
98
- return result;
99
- }
100
85
  function Field(t0) {
101
86
  const $ = reactCompilerRuntime.c(37);
102
87
  let children;
@@ -459,6 +444,7 @@
459
444
  setFieldError,
460
445
  touched: touchedState,
461
446
  setFieldTouched,
447
+ setTouched: setTouchedState,
462
448
  dirty,
463
449
  setDirty,
464
450
  handleSubmit: submit,
@@ -474,7 +460,7 @@
474
460
  redo,
475
461
  canUndo: historyIndexRef.current > 0,
476
462
  canRedo: historyIndexRef.current < historyRef.current.length - 1
477
- }), [values, errors, touchedState, dirty, isSubmitting, submitCount, isValidating, version, handleChange, handleBlur, setValues, setFieldValue, setFieldTouched, setFieldError, validate, submit, resetForm, undo, redo]);
463
+ }), [values, errors, touchedState, dirty, isSubmitting, submitCount, isValidating, version, handleChange, handleBlur, setValues, setFieldValue, setFieldTouched, setTouchedState, setFieldError, validate, submit, resetForm, undo, redo]);
478
464
  React.useEffect(() => {
479
465
  controllerRef.current = controller;
480
466
  }, [controller]);
@@ -483,7 +469,6 @@
483
469
  exports2.Field = Field;
484
470
  exports2.Formex = Formex;
485
471
  exports2.clone = clone;
486
- exports2.flattenKeys = flattenKeys;
487
472
  exports2.getIn = getIn;
488
473
  exports2.isEmptyArray = isEmptyArray;
489
474
  exports2.isFunction = isFunction;
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.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\nexport function flattenKeys(obj: any, prefix = \"\", result: string[] = []): string[] {\n if (isObject(obj) || Array.isArray(obj)) {\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const newKey = prefix\n ? Array.isArray(obj)\n ? `${prefix}[${key}]`\n : `${prefix}.${key}`\n : key;\n if (isObject(obj[key]) || Array.isArray(obj[key])) {\n flattenKeys(obj[key], newKey, result);\n } else {\n result.push(newKey);\n }\n }\n }\n }\n return result;\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 initialTouched,\n validation,\n validateOnChange = false,\n validateOnInitialRender = false,\n onSubmit,\n onReset,\n onValuesChangeDeferred,\n debugId,\n }: {\n initialValues: T;\n initialErrors?: Record<string, string>;\n initialDirty?: boolean;\n initialTouched?: Record<string, 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 onValuesChangeDeferred?: (values: T, controller: FormexController<T>) => 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>>(initialTouched ?? {});\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 const onValuesChangeRef = useRef(onValuesChangeDeferred);\n onValuesChangeRef.current = onValuesChangeDeferred;\n const debounceTimeoutRef = useRef<any>();\n\n const callDebouncedOnValuesChange = useCallback((values: T) => {\n if (onValuesChangeRef.current) {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n }\n debounceTimeoutRef.current = setTimeout(() => {\n onValuesChangeRef.current?.(values, controllerRef.current);\n }, 300);\n }\n }, []);\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 callDebouncedOnValuesChange(newValues);\n }, [callDebouncedOnValuesChange]);\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 callDebouncedOnValuesChange(newValues);\n },\n [validate, callDebouncedOnValuesChange]\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 ?? initialTouched ?? {});\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, initialTouched]);\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 setDirty(!equal(initialValuesRef.current, newValues));\n callDebouncedOnValuesChange(newValues);\n }\n }, [callDebouncedOnValuesChange]);\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 setDirty(!equal(initialValuesRef.current, newValues));\n callDebouncedOnValuesChange(newValues);\n }\n }, [callDebouncedOnValuesChange]);\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","flattenKeys","prefix","result","Object","prototype","hasOwnProperty","call","newKey","push","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","initialTouched","validation","validateOnChange","validateOnInitialRender","onSubmit","onReset","onValuesChangeDeferred","debugId","initialValuesRef","useRef","valuesRef","debugIdRef","setValuesInner","useState","touchedState","setTouchedState","errors","setErrors","dirty","setDirty","submitCount","setSubmitCount","isSubmitting","setIsSubmitting","isValidating","setIsValidating","version","setVersion","onValuesChangeRef","current","debounceTimeoutRef","callDebouncedOnValuesChange","useCallback","clearTimeout","setTimeout","controllerRef","historyRef","historyIndexRef","useEffect","setValues","newValues","equal","newHistory","validationErrors","setFieldValue","shouldValidate","setFieldError","error","prevErrors","newErrors","setFieldTouched","touched","prev","event","target","valueAsNumber","submit","e","preventDefault","stopPropagation","keys","resetForm","submitCountProp","valuesProp","errorsProp","touchedProp","undo","newIndex","redo","controller","useMemo","setSubmitting","handleSubmit","canUndo","canRedo"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.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 initialTouched,\n validation,\n validateOnChange = false,\n validateOnInitialRender = false,\n onSubmit,\n onReset,\n onValuesChangeDeferred,\n debugId,\n }: {\n initialValues: T;\n initialErrors?: Record<string, string>;\n initialDirty?: boolean;\n initialTouched?: Record<string, 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 onValuesChangeDeferred?: (values: T, controller: FormexController<T>) => 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>>(initialTouched ?? {});\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 const onValuesChangeRef = useRef(onValuesChangeDeferred);\n onValuesChangeRef.current = onValuesChangeDeferred;\n const debounceTimeoutRef = useRef<any>();\n\n const callDebouncedOnValuesChange = useCallback((values: T) => {\n if (onValuesChangeRef.current) {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n }\n debounceTimeoutRef.current = setTimeout(() => {\n onValuesChangeRef.current?.(values, controllerRef.current);\n }, 300);\n }\n }, []);\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 callDebouncedOnValuesChange(newValues);\n }, [callDebouncedOnValuesChange]);\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 callDebouncedOnValuesChange(newValues);\n },\n [validate, callDebouncedOnValuesChange]\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 ?? initialTouched ?? {});\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, initialTouched]);\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 setDirty(!equal(initialValuesRef.current, newValues));\n callDebouncedOnValuesChange(newValues);\n }\n }, [callDebouncedOnValuesChange]);\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 setDirty(!equal(initialValuesRef.current, newValues));\n callDebouncedOnValuesChange(newValues);\n }\n }, [callDebouncedOnValuesChange]);\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 setTouched: setTouchedState,\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 setTouchedState,\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","initialTouched","validation","validateOnChange","validateOnInitialRender","onSubmit","onReset","onValuesChangeDeferred","debugId","initialValuesRef","useRef","valuesRef","debugIdRef","setValuesInner","useState","touchedState","setTouchedState","errors","setErrors","dirty","setDirty","submitCount","setSubmitCount","isSubmitting","setIsSubmitting","isValidating","setIsValidating","version","setVersion","onValuesChangeRef","current","debounceTimeoutRef","callDebouncedOnValuesChange","useCallback","clearTimeout","setTimeout","controllerRef","historyRef","historyIndexRef","useEffect","setValues","newValues","equal","newHistory","push","validationErrors","setFieldValue","shouldValidate","setFieldError","error","prevErrors","newErrors","setFieldTouched","touched","prev","event","target","valueAsNumber","submit","e","preventDefault","stopPropagation","Object","keys","resetForm","submitCountProp","valuesProp","errorsProp","touchedProp","undo","newIndex","redo","controller","useMemo","setSubmitting","setTouched","handleSubmit","canUndo","canRedo"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -6,6 +6,7 @@ export type FormexController<T extends object> = {
6
6
  setFieldValue: (key: string, value: any, shouldValidate?: boolean) => void;
7
7
  touched: Record<string, boolean>;
8
8
  setFieldTouched: (key: string, touched: boolean, shouldValidate?: boolean) => void;
9
+ setTouched: (touched: Record<string, boolean>) => void;
9
10
  dirty: boolean;
10
11
  setDirty: (dirty: boolean) => void;
11
12
  setSubmitCount: (submitCount: number) => void;
package/dist/utils.d.ts CHANGED
@@ -14,4 +14,3 @@ export declare const isNaN: (obj: any) => boolean;
14
14
  export declare function getIn(obj: any, key: string | string[], def?: any, p?: number): any;
15
15
  export declare function setIn(obj: any, path: string, value: any): any;
16
16
  export declare function clone(value: any): any;
17
- export declare function flattenKeys(obj: any, prefix?: string, result?: string[]): string[];
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@firecms/formex",
3
3
  "type": "module",
4
- "version": "3.0.0-canary.286",
4
+ "version": "3.0.0-canary.288",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -74,5 +74,5 @@
74
74
  "node"
75
75
  ]
76
76
  },
77
- "gitHead": "67c7145be1866d52ac71fc6281537c388d074722"
77
+ "gitHead": "e609cafa0c505803a4628324a77404ebdfbb62c4"
78
78
  }
package/src/types.ts CHANGED
@@ -7,6 +7,7 @@ export type FormexController<T extends object> = {
7
7
  setFieldValue: (key: string, value: any, shouldValidate?: boolean) => void;
8
8
  touched: Record<string, boolean>;
9
9
  setFieldTouched: (key: string, touched: boolean, shouldValidate?: boolean) => void;
10
+ setTouched: (touched: Record<string, boolean>) => void;
10
11
  dirty: boolean;
11
12
  setDirty: (dirty: boolean) => void;
12
13
  setSubmitCount: (submitCount: number) => void;
@@ -242,6 +242,7 @@ export function useCreateFormex<T extends object>({
242
242
  setFieldError,
243
243
  touched: touchedState,
244
244
  setFieldTouched,
245
+ setTouched: setTouchedState,
245
246
  dirty,
246
247
  setDirty,
247
248
  handleSubmit: submit,
@@ -272,6 +273,7 @@ export function useCreateFormex<T extends object>({
272
273
  setValues,
273
274
  setFieldValue,
274
275
  setFieldTouched,
276
+ setTouchedState,
275
277
  setFieldError,
276
278
  validate,
277
279
  submit,
package/src/utils.ts CHANGED
@@ -94,23 +94,3 @@ function toPath(value: string | string[]) {
94
94
  // Replace brackets with dots, remove leading/trailing dots, then split by dot.
95
95
  return value.replace(/\[(\d+)]/g, ".$1").replace(/^\./, "").replace(/\.$/, "").split(".");
96
96
  }
97
-
98
- export function flattenKeys(obj: any, prefix = "", result: string[] = []): string[] {
99
- if (isObject(obj) || Array.isArray(obj)) {
100
- for (const key in obj) {
101
- if (Object.prototype.hasOwnProperty.call(obj, key)) {
102
- const newKey = prefix
103
- ? Array.isArray(obj)
104
- ? `${prefix}[${key}]`
105
- : `${prefix}.${key}`
106
- : key;
107
- if (isObject(obj[key]) || Array.isArray(obj[key])) {
108
- flattenKeys(obj[key], newKey, result);
109
- } else {
110
- result.push(newKey);
111
- }
112
- }
113
- }
114
- }
115
- return result;
116
- }