@rebasepro/formex 0.0.1-canary.0 → 0.0.1-canary.0e2f892
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/Field.d.ts +4 -4
- package/dist/Formex.d.ts +3 -3
- package/dist/index.es.js +13 -9
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +13 -9
- package/dist/index.umd.js.map +1 -1
- package/dist/types.d.ts +3 -3
- package/dist/useCreateFormex.d.ts +1 -1
- package/dist/utils.d.ts +8 -8
- package/package.json +72 -75
- package/src/Field.tsx +26 -20
- package/src/Formex.tsx +8 -3
- package/src/types.ts +3 -3
- package/src/useCreateFormex.tsx +14 -14
- package/src/utils.ts +22 -20
package/dist/Field.d.ts
CHANGED
|
@@ -14,7 +14,7 @@ export interface FieldInputProps<Value> {
|
|
|
14
14
|
/** Blur event handler */
|
|
15
15
|
onBlur: (event: React.FocusEvent) => void;
|
|
16
16
|
}
|
|
17
|
-
export interface FormexFieldProps<Value = any, FormValues extends object =
|
|
17
|
+
export interface FormexFieldProps<Value = any, FormValues extends object = object> {
|
|
18
18
|
field: FieldInputProps<Value>;
|
|
19
19
|
form: FormexController<FormValues>;
|
|
20
20
|
}
|
|
@@ -22,7 +22,7 @@ export interface FieldConfig<Value, C extends React.ElementType | undefined = un
|
|
|
22
22
|
/**
|
|
23
23
|
* Component to render. Can either be a string e.g. 'select', 'input', or 'textarea', or a component.
|
|
24
24
|
*/
|
|
25
|
-
as?: C | string | React.ForwardRefExoticComponent<
|
|
25
|
+
as?: C | string | React.ForwardRefExoticComponent<Record<string, unknown>>;
|
|
26
26
|
/**
|
|
27
27
|
* Children render function <Field name>{props => ...}</Field>)
|
|
28
28
|
*/
|
|
@@ -41,9 +41,9 @@ export interface FieldConfig<Value, C extends React.ElementType | undefined = un
|
|
|
41
41
|
/** HTML input type */
|
|
42
42
|
type?: string;
|
|
43
43
|
/** Field value */
|
|
44
|
-
value?:
|
|
44
|
+
value?: unknown;
|
|
45
45
|
/** Inner ref */
|
|
46
|
-
innerRef?: (instance:
|
|
46
|
+
innerRef?: (instance: unknown) => void;
|
|
47
47
|
}
|
|
48
48
|
export type FieldProps<T, C extends React.ElementType | undefined> = {
|
|
49
49
|
as?: C;
|
package/dist/Formex.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { FormexController } from "./types";
|
|
3
|
-
export declare const useFormex: <T
|
|
4
|
-
export declare const Formex: ({ value, children }: {
|
|
5
|
-
value: FormexController<
|
|
3
|
+
export declare const useFormex: <T = any>() => FormexController<T>;
|
|
4
|
+
export declare const Formex: <T = any>({ value, children }: {
|
|
5
|
+
value: FormexController<T>;
|
|
6
6
|
children: React.ReactNode;
|
|
7
7
|
}) => import("react/jsx-runtime").JSX.Element;
|
package/dist/index.es.js
CHANGED
|
@@ -3,9 +3,13 @@ import * as React from "react";
|
|
|
3
3
|
import React__default, { useContext, useRef, useState, useCallback, useEffect, useMemo } from "react";
|
|
4
4
|
import { jsx } from "react/jsx-runtime";
|
|
5
5
|
import { deepEqual } from "fast-equals";
|
|
6
|
-
const FormexContext = React__default.createContext(
|
|
6
|
+
const FormexContext = React__default.createContext(null);
|
|
7
7
|
const useFormex = () => {
|
|
8
|
-
|
|
8
|
+
const ctx = useContext(FormexContext);
|
|
9
|
+
if (!ctx) {
|
|
10
|
+
throw new Error("useFormex must be used within a Formex provider");
|
|
11
|
+
}
|
|
12
|
+
return ctx;
|
|
9
13
|
};
|
|
10
14
|
const Formex = (t0) => {
|
|
11
15
|
const $ = c(3);
|
|
@@ -31,13 +35,14 @@ const isInteger = (obj) => String(Math.floor(Number(obj))) === obj;
|
|
|
31
35
|
const isNaN = (obj) => obj !== obj;
|
|
32
36
|
function getIn(obj, key, def, p = 0) {
|
|
33
37
|
const path = toPath(key);
|
|
34
|
-
|
|
35
|
-
|
|
38
|
+
let current = obj;
|
|
39
|
+
while (current && p < path.length) {
|
|
40
|
+
current = current[path[p++]];
|
|
36
41
|
}
|
|
37
|
-
if (p !== path.length && !
|
|
42
|
+
if (p !== path.length && !current) {
|
|
38
43
|
return def;
|
|
39
44
|
}
|
|
40
|
-
return
|
|
45
|
+
return current === void 0 ? def : current;
|
|
41
46
|
}
|
|
42
47
|
function setIn(obj, path, value) {
|
|
43
48
|
const res = clone(obj);
|
|
@@ -226,8 +231,7 @@ function Field(t0) {
|
|
|
226
231
|
return t2;
|
|
227
232
|
}
|
|
228
233
|
const getFieldProps = (nameOrOptions, formex) => {
|
|
229
|
-
const
|
|
230
|
-
const name = isAnObject ? nameOrOptions.name : nameOrOptions;
|
|
234
|
+
const name = typeof nameOrOptions === "string" ? nameOrOptions : nameOrOptions.name;
|
|
231
235
|
const valueState = getIn(formex.values, name);
|
|
232
236
|
const field = {
|
|
233
237
|
name,
|
|
@@ -235,7 +239,7 @@ const getFieldProps = (nameOrOptions, formex) => {
|
|
|
235
239
|
onChange: formex.handleChange,
|
|
236
240
|
onBlur: formex.handleBlur
|
|
237
241
|
};
|
|
238
|
-
if (
|
|
242
|
+
if (typeof nameOrOptions !== "string") {
|
|
239
243
|
const {
|
|
240
244
|
type,
|
|
241
245
|
value: valueProp,
|
package/dist/index.es.js.map
CHANGED
|
@@ -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 = ({ value, children }: { value: FormexController<any>, children: React.ReactNode }) => {\n return <FormexContext.Provider value={value}>{children}</FormexContext.Provider>;\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 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 // Preserve class instances (EntityReference, GeoPoint, etc.) - don't spread them\n if (Object.getPrototypeOf(value) !== Object.prototype) {\n return value;\n }\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 { deepEqual as equal } from \"fast-equals\";\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>(undefined);\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","t0","$","_c","value","children","t1","isEmptyArray","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","Object","getPrototypeOf","prototype","replace","split","Field","className","is","name","props","validate","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","keys","resetForm","submitCountProp","valuesProp","errorsProp","touchedProp","undo","newIndex","redo","controller","useMemo","setSubmitting","setTouched","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\n\nconst FormexContext = React.createContext<FormexController<any> | null>(null);\n\nexport const useFormex = <T = any>() => {\n const ctx = useContext(FormexContext);\n if (!ctx) throw new Error(\"useFormex must be used within a Formex provider\");\n return ctx as FormexController<T>;\n};\n\nexport const Formex = <T = any>({ value, children }: { value: FormexController<T>, children: React.ReactNode }) => {\n return <FormexContext.Provider value={value}>{children}</FormexContext.Provider>;\n};\n","/** @private is the value an empty array? */\nexport const isEmptyArray = (value?: unknown) =>\n Array.isArray(value) && value.length === 0;\n\n/** @private is the given object a Function? */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const isFunction = (obj: unknown): obj is Function =>\n typeof obj === \"function\";\n\n/** @private is the given object an Object? */\nexport const isObject = (obj: unknown): obj is Record<string, unknown> =>\n obj !== null && typeof obj === \"object\";\n\n/** @private is the given object an integer? */\nexport const isInteger = (obj: unknown): boolean =>\n String(Math.floor(Number(obj))) === obj;\n\n/** @private is the given object a NaN? */\n\nexport const isNaN = (obj: unknown): 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?: unknown,\n p = 0\n): any {\n const path = toPath(key);\n let current: unknown = obj;\n while (current && p < path.length) {\n current = (current as Record<string, unknown>)[path[p++]];\n }\n\n // check if path is not in the end\n if (p !== path.length && !current) {\n return def;\n }\n\n return current === undefined ? def : current;\n}\n\nexport function setIn(obj: any, path: string, value: unknown): any {\n const res = clone(obj) as Record<string, unknown>; // this keeps inheritance when obj is a class\n let resVal: Record<string, unknown> = 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 = getIn(obj, pathArray.slice(0, i + 1));\n\n if (currentObj && (isObject(currentObj) || Array.isArray(currentObj))) {\n resVal = resVal[currentPath] = clone(currentObj) as Record<string, unknown>;\n } else {\n const nextPath: string = pathArray[i + 1];\n resVal = resVal[currentPath] =\n (isInteger(nextPath) && Number(nextPath) >= 0 ? [] : {}) as Record<string, unknown>;\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: unknown): unknown {\n if (Array.isArray(value)) {\n return [...value];\n } else if (typeof value === \"object\" && value !== null) {\n // Preserve class instances (EntityReference, GeoPoint, etc.) - don't spread them\n if (Object.getPrototypeOf(value) !== Object.prototype) {\n return value;\n }\n return { ...(value as Record<string, unknown>) };\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 = object> {\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<Record<string, unknown>>;\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?: unknown;\n\n /** Inner ref */\n innerRef?: (instance: unknown) => 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,\n...props }, formex);\n\n if (isFunction(children)) {\n return children({ field,\nform: 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,\n...field,\n...rest,\nclassName },\n children\n );\n }\n\n return React.createElement(asElement, { ...field,\n...props,\nclassName }, children);\n}\n\nconst getFieldProps = (nameOrOptions: string | FieldConfig<unknown>, formex: FormexController<object>): FieldInputProps<unknown> => {\n const name: string = typeof nameOrOptions === \"string\"\n ? nameOrOptions\n : nameOrOptions.name;\n const valueState = getIn(formex.values as Record<string, unknown>, name);\n\n const field: FieldInputProps<unknown> = {\n name: name as string,\n value: valueState,\n onChange: formex.handleChange,\n onBlur: formex.handleBlur\n };\n if (typeof nameOrOptions !== \"string\") {\n const {\n type,\n value: valueProp, // value is special for checkboxes\n as: is,\n multiple\n } = nameOrOptions as FieldConfig<unknown>;\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 { deepEqual as equal } from \"fast-equals\";\n\nimport { FormexController, FormexResetProps } from \"./types\";\n\nexport function useCreateFormex<T = any>({\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<ReturnType<typeof setTimeout> | undefined>(undefined);\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: unknown, shouldValidate?: boolean) => {\n const newValues = setIn(valuesRef.current as Record<string, unknown>, key, value) as T;\n valuesRef.current = newValues;\n setValuesInner(newValues);\n if (!equal(getIn(initialValuesRef.current as Record<string, unknown>, 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: Record<string, string>) => {\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: Record<string, boolean>) => ({\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: number) => 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: number) => 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: number) => 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","ctx","useContext","Error","Formex","t0","$","_c","value","children","t1","isEmptyArray","Array","isArray","length","isFunction","obj","isObject","isInteger","String","Math","floor","Number","isNaN","getIn","key","def","p","path","toPath","current","undefined","setIn","res","clone","resVal","i","pathArray","currentPath","currentObj","slice","nextPath","Object","getPrototypeOf","prototype","replace","split","Field","className","is","name","props","validate","t2","as","t3","t4","t5","formex","field","Symbol","for","bb0","getFieldProps","form","asElement","innerRef","rest","ref","createElement","nameOrOptions","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","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","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
|
@@ -19,9 +19,13 @@
|
|
|
19
19
|
return Object.freeze(n);
|
|
20
20
|
}
|
|
21
21
|
const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
|
|
22
|
-
const FormexContext = React.createContext(
|
|
22
|
+
const FormexContext = React.createContext(null);
|
|
23
23
|
const useFormex = () => {
|
|
24
|
-
|
|
24
|
+
const ctx = React.useContext(FormexContext);
|
|
25
|
+
if (!ctx) {
|
|
26
|
+
throw new Error("useFormex must be used within a Formex provider");
|
|
27
|
+
}
|
|
28
|
+
return ctx;
|
|
25
29
|
};
|
|
26
30
|
const Formex = (t0) => {
|
|
27
31
|
const $ = reactCompilerRuntime.c(3);
|
|
@@ -47,13 +51,14 @@
|
|
|
47
51
|
const isNaN = (obj) => obj !== obj;
|
|
48
52
|
function getIn(obj, key, def, p = 0) {
|
|
49
53
|
const path = toPath(key);
|
|
50
|
-
|
|
51
|
-
|
|
54
|
+
let current = obj;
|
|
55
|
+
while (current && p < path.length) {
|
|
56
|
+
current = current[path[p++]];
|
|
52
57
|
}
|
|
53
|
-
if (p !== path.length && !
|
|
58
|
+
if (p !== path.length && !current) {
|
|
54
59
|
return def;
|
|
55
60
|
}
|
|
56
|
-
return
|
|
61
|
+
return current === void 0 ? def : current;
|
|
57
62
|
}
|
|
58
63
|
function setIn(obj, path, value) {
|
|
59
64
|
const res = clone(obj);
|
|
@@ -242,8 +247,7 @@
|
|
|
242
247
|
return t2;
|
|
243
248
|
}
|
|
244
249
|
const getFieldProps = (nameOrOptions, formex) => {
|
|
245
|
-
const
|
|
246
|
-
const name = isAnObject ? nameOrOptions.name : nameOrOptions;
|
|
250
|
+
const name = typeof nameOrOptions === "string" ? nameOrOptions : nameOrOptions.name;
|
|
247
251
|
const valueState = getIn(formex.values, name);
|
|
248
252
|
const field = {
|
|
249
253
|
name,
|
|
@@ -251,7 +255,7 @@
|
|
|
251
255
|
onChange: formex.handleChange,
|
|
252
256
|
onBlur: formex.handleBlur
|
|
253
257
|
};
|
|
254
|
-
if (
|
|
258
|
+
if (typeof nameOrOptions !== "string") {
|
|
255
259
|
const {
|
|
256
260
|
type,
|
|
257
261
|
value: valueProp,
|
package/dist/index.umd.js.map
CHANGED
|
@@ -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 = ({ value, children }: { value: FormexController<any>, children: React.ReactNode }) => {\n return <FormexContext.Provider value={value}>{children}</FormexContext.Provider>;\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 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 // Preserve class instances (EntityReference, GeoPoint, etc.) - don't spread them\n if (Object.getPrototypeOf(value) !== Object.prototype) {\n return value;\n }\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 { deepEqual as equal } from \"fast-equals\";\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>(undefined);\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","t0","$","_c","value","children","t1","jsx","isEmptyArray","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","Object","getPrototypeOf","prototype","replace","split","Field","className","is","name","props","validate","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","keys","resetForm","submitCountProp","valuesProp","errorsProp","touchedProp","undo","newIndex","redo","controller","useMemo","setSubmitting","setTouched","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\n\nconst FormexContext = React.createContext<FormexController<any> | null>(null);\n\nexport const useFormex = <T = any>() => {\n const ctx = useContext(FormexContext);\n if (!ctx) throw new Error(\"useFormex must be used within a Formex provider\");\n return ctx as FormexController<T>;\n};\n\nexport const Formex = <T = any>({ value, children }: { value: FormexController<T>, children: React.ReactNode }) => {\n return <FormexContext.Provider value={value}>{children}</FormexContext.Provider>;\n};\n","/** @private is the value an empty array? */\nexport const isEmptyArray = (value?: unknown) =>\n Array.isArray(value) && value.length === 0;\n\n/** @private is the given object a Function? */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const isFunction = (obj: unknown): obj is Function =>\n typeof obj === \"function\";\n\n/** @private is the given object an Object? */\nexport const isObject = (obj: unknown): obj is Record<string, unknown> =>\n obj !== null && typeof obj === \"object\";\n\n/** @private is the given object an integer? */\nexport const isInteger = (obj: unknown): boolean =>\n String(Math.floor(Number(obj))) === obj;\n\n/** @private is the given object a NaN? */\n\nexport const isNaN = (obj: unknown): 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?: unknown,\n p = 0\n): any {\n const path = toPath(key);\n let current: unknown = obj;\n while (current && p < path.length) {\n current = (current as Record<string, unknown>)[path[p++]];\n }\n\n // check if path is not in the end\n if (p !== path.length && !current) {\n return def;\n }\n\n return current === undefined ? def : current;\n}\n\nexport function setIn(obj: any, path: string, value: unknown): any {\n const res = clone(obj) as Record<string, unknown>; // this keeps inheritance when obj is a class\n let resVal: Record<string, unknown> = 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 = getIn(obj, pathArray.slice(0, i + 1));\n\n if (currentObj && (isObject(currentObj) || Array.isArray(currentObj))) {\n resVal = resVal[currentPath] = clone(currentObj) as Record<string, unknown>;\n } else {\n const nextPath: string = pathArray[i + 1];\n resVal = resVal[currentPath] =\n (isInteger(nextPath) && Number(nextPath) >= 0 ? [] : {}) as Record<string, unknown>;\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: unknown): unknown {\n if (Array.isArray(value)) {\n return [...value];\n } else if (typeof value === \"object\" && value !== null) {\n // Preserve class instances (EntityReference, GeoPoint, etc.) - don't spread them\n if (Object.getPrototypeOf(value) !== Object.prototype) {\n return value;\n }\n return { ...(value as Record<string, unknown>) };\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 = object> {\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<Record<string, unknown>>;\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?: unknown;\n\n /** Inner ref */\n innerRef?: (instance: unknown) => 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,\n...props }, formex);\n\n if (isFunction(children)) {\n return children({ field,\nform: 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,\n...field,\n...rest,\nclassName },\n children\n );\n }\n\n return React.createElement(asElement, { ...field,\n...props,\nclassName }, children);\n}\n\nconst getFieldProps = (nameOrOptions: string | FieldConfig<unknown>, formex: FormexController<object>): FieldInputProps<unknown> => {\n const name: string = typeof nameOrOptions === \"string\"\n ? nameOrOptions\n : nameOrOptions.name;\n const valueState = getIn(formex.values as Record<string, unknown>, name);\n\n const field: FieldInputProps<unknown> = {\n name: name as string,\n value: valueState,\n onChange: formex.handleChange,\n onBlur: formex.handleBlur\n };\n if (typeof nameOrOptions !== \"string\") {\n const {\n type,\n value: valueProp, // value is special for checkboxes\n as: is,\n multiple\n } = nameOrOptions as FieldConfig<unknown>;\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 { deepEqual as equal } from \"fast-equals\";\n\nimport { FormexController, FormexResetProps } from \"./types\";\n\nexport function useCreateFormex<T = any>({\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<ReturnType<typeof setTimeout> | undefined>(undefined);\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: unknown, shouldValidate?: boolean) => {\n const newValues = setIn(valuesRef.current as Record<string, unknown>, key, value) as T;\n valuesRef.current = newValues;\n setValuesInner(newValues);\n if (!equal(getIn(initialValuesRef.current as Record<string, unknown>, 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: Record<string, string>) => {\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: Record<string, boolean>) => ({\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: number) => 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: number) => 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: number) => 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","ctx","useContext","Error","Formex","t0","$","_c","value","children","t1","jsx","isEmptyArray","Array","isArray","length","isFunction","obj","isObject","isInteger","String","Math","floor","Number","isNaN","getIn","key","def","p","path","toPath","current","undefined","setIn","res","clone","resVal","i","pathArray","currentPath","currentObj","slice","nextPath","Object","getPrototypeOf","prototype","replace","split","Field","className","is","name","props","validate","t2","as","t3","t4","t5","formex","field","Symbol","for","bb0","getFieldProps","form","asElement","innerRef","rest","ref","createElement","nameOrOptions","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","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","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
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import React, { FormEvent } from "react";
|
|
2
|
-
export type FormexController<T
|
|
2
|
+
export type FormexController<T = any> = {
|
|
3
3
|
values: T;
|
|
4
4
|
initialValues: T;
|
|
5
5
|
setValues: (values: T) => void;
|
|
6
|
-
setFieldValue: (key: string, value:
|
|
6
|
+
setFieldValue: (key: string, value: unknown, shouldValidate?: boolean) => void;
|
|
7
7
|
touched: Record<string, boolean>;
|
|
8
8
|
setFieldTouched: (key: string, touched: boolean, shouldValidate?: boolean) => void;
|
|
9
9
|
setTouched: (touched: Record<string, boolean>) => void;
|
|
@@ -32,7 +32,7 @@ export type FormexController<T extends object> = {
|
|
|
32
32
|
canUndo: boolean;
|
|
33
33
|
canRedo: boolean;
|
|
34
34
|
};
|
|
35
|
-
export type FormexResetProps<T
|
|
35
|
+
export type FormexResetProps<T = any> = {
|
|
36
36
|
values?: T;
|
|
37
37
|
submitCount?: number;
|
|
38
38
|
errors?: Record<string, string>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FormexController } from "./types";
|
|
2
|
-
export declare function useCreateFormex<T
|
|
2
|
+
export declare function useCreateFormex<T = any>({ initialValues, initialErrors, initialDirty, initialTouched, validation, validateOnChange, validateOnInitialRender, onSubmit, onReset, onValuesChangeDeferred, debugId }: {
|
|
3
3
|
initialValues: T;
|
|
4
4
|
initialErrors?: Record<string, string>;
|
|
5
5
|
initialDirty?: boolean;
|
package/dist/utils.d.ts
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
/** @private is the value an empty array? */
|
|
2
|
-
export declare const isEmptyArray: (value?:
|
|
2
|
+
export declare const isEmptyArray: (value?: unknown) => boolean;
|
|
3
3
|
/** @private is the given object a Function? */
|
|
4
|
-
export declare const isFunction: (obj:
|
|
4
|
+
export declare const isFunction: (obj: unknown) => obj is Function;
|
|
5
5
|
/** @private is the given object an Object? */
|
|
6
|
-
export declare const isObject: (obj:
|
|
6
|
+
export declare const isObject: (obj: unknown) => obj is Record<string, unknown>;
|
|
7
7
|
/** @private is the given object an integer? */
|
|
8
|
-
export declare const isInteger: (obj:
|
|
8
|
+
export declare const isInteger: (obj: unknown) => boolean;
|
|
9
9
|
/** @private is the given object a NaN? */
|
|
10
|
-
export declare const isNaN: (obj:
|
|
10
|
+
export declare const isNaN: (obj: unknown) => boolean;
|
|
11
11
|
/**
|
|
12
12
|
* Deeply get a value from an object via its path.
|
|
13
13
|
*/
|
|
14
|
-
export declare function getIn(obj: any, key: string | string[], def?:
|
|
15
|
-
export declare function setIn(obj: any, path: string, value:
|
|
16
|
-
export declare function clone(value:
|
|
14
|
+
export declare function getIn(obj: any, key: string | string[], def?: unknown, p?: number): any;
|
|
15
|
+
export declare function setIn(obj: any, path: string, value: unknown): any;
|
|
16
|
+
export declare function clone(value: unknown): unknown;
|
package/package.json
CHANGED
|
@@ -1,78 +1,75 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
"name": "@rebasepro/formex",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "0.0.1-canary.0e2f892",
|
|
5
|
+
"publishConfig": {
|
|
6
|
+
"access": "public"
|
|
7
|
+
},
|
|
8
|
+
"keywords": [
|
|
9
|
+
"rebase",
|
|
10
|
+
"forms",
|
|
11
|
+
"typescript",
|
|
12
|
+
"react",
|
|
13
|
+
"admin"
|
|
14
|
+
],
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"development": "./src/index.ts",
|
|
19
|
+
"import": "./dist/index.es.js",
|
|
20
|
+
"require": "./dist/index.umd.js"
|
|
7
21
|
},
|
|
8
|
-
"
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
"
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
"./package.json": "./package.json"
|
|
23
|
+
},
|
|
24
|
+
"main": "./dist/index.umd.js",
|
|
25
|
+
"module": "./dist/index.es.js",
|
|
26
|
+
"types": "dist/index.d.ts",
|
|
27
|
+
"source": "src/index.ts",
|
|
28
|
+
"peerDependencies": {
|
|
29
|
+
"react": ">=19.0.0",
|
|
30
|
+
"react-dom": ">=19.0.0"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"fast-equals": "5.3.0"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@jest/globals": "^30.2.0",
|
|
37
|
+
"@types/jest": "^29.5.14",
|
|
38
|
+
"@types/node": "^20.19.17",
|
|
39
|
+
"@types/react": "^19.0.8",
|
|
40
|
+
"@types/react-dom": "^19.0.3",
|
|
41
|
+
"@vitejs/plugin-react": "^4.3.4",
|
|
42
|
+
"babel-plugin-react-compiler": "^19.0.0-beta-af1b7da-20250417",
|
|
43
|
+
"eslint-plugin-react-compiler": "^19.1.0-rc.2",
|
|
44
|
+
"jest": "^29.7.0",
|
|
45
|
+
"ts-jest": "^29.4.5",
|
|
46
|
+
"typescript": "^5.9.3",
|
|
47
|
+
"vite": "^7.2.4"
|
|
48
|
+
},
|
|
49
|
+
"files": [
|
|
50
|
+
"dist",
|
|
51
|
+
"src",
|
|
52
|
+
"bin"
|
|
53
|
+
],
|
|
54
|
+
"jest": {
|
|
55
|
+
"transform": {
|
|
56
|
+
"^.+\\.tsx?$": "ts-jest"
|
|
27
57
|
},
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
"eslint-plugin-react-compiler": "^19.1.0-rc.2",
|
|
47
|
-
"jest": "^29.7.0",
|
|
48
|
-
"ts-jest": "^29.4.5",
|
|
49
|
-
"typescript": "^5.9.3",
|
|
50
|
-
"vite": "^7.2.4"
|
|
51
|
-
},
|
|
52
|
-
"scripts": {
|
|
53
|
-
"dev": "vite",
|
|
54
|
-
"build": "vite build && tsc --emitDeclarationOnly -p tsconfig.prod.json",
|
|
55
|
-
"clean": "rm -rf dist && find ./src -name '*.js' -type f | xargs rm -f",
|
|
56
|
-
"test": "jest --passWithNoTests"
|
|
57
|
-
},
|
|
58
|
-
"files": [
|
|
59
|
-
"dist",
|
|
60
|
-
"src",
|
|
61
|
-
"bin"
|
|
62
|
-
],
|
|
63
|
-
"jest": {
|
|
64
|
-
"transform": {
|
|
65
|
-
"^.+\\.tsx?$": "ts-jest"
|
|
66
|
-
},
|
|
67
|
-
"testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$",
|
|
68
|
-
"moduleFileExtensions": [
|
|
69
|
-
"ts",
|
|
70
|
-
"tsx",
|
|
71
|
-
"js",
|
|
72
|
-
"jsx",
|
|
73
|
-
"json",
|
|
74
|
-
"node"
|
|
75
|
-
]
|
|
76
|
-
},
|
|
77
|
-
"gitHead": "646afae9c387c3ce02c699d98cd8c7272bdd1929"
|
|
78
|
-
}
|
|
58
|
+
"testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$",
|
|
59
|
+
"moduleFileExtensions": [
|
|
60
|
+
"ts",
|
|
61
|
+
"tsx",
|
|
62
|
+
"js",
|
|
63
|
+
"jsx",
|
|
64
|
+
"json",
|
|
65
|
+
"node"
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
"gitHead": "d935eefa5aa8d1009a2398cfac2c1e4ee9aeb6b6",
|
|
69
|
+
"scripts": {
|
|
70
|
+
"dev": "vite",
|
|
71
|
+
"build": "vite build && tsc --emitDeclarationOnly -p tsconfig.prod.json",
|
|
72
|
+
"clean": "rm -rf dist && find ./src -name '*.js' -type f | xargs rm -f",
|
|
73
|
+
"test": "jest --passWithNoTests"
|
|
74
|
+
}
|
|
75
|
+
}
|
package/src/Field.tsx
CHANGED
|
@@ -18,7 +18,7 @@ export interface FieldInputProps<Value> {
|
|
|
18
18
|
onBlur: (event: React.FocusEvent) => void,
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
export interface FormexFieldProps<Value = any, FormValues extends object =
|
|
21
|
+
export interface FormexFieldProps<Value = any, FormValues extends object = object> {
|
|
22
22
|
field: FieldInputProps<Value>;
|
|
23
23
|
form: FormexController<FormValues>;
|
|
24
24
|
}
|
|
@@ -31,7 +31,7 @@ export interface FieldConfig<Value, C extends React.ElementType | undefined = un
|
|
|
31
31
|
as?:
|
|
32
32
|
| C
|
|
33
33
|
| string
|
|
34
|
-
| React.ForwardRefExoticComponent<
|
|
34
|
+
| React.ForwardRefExoticComponent<Record<string, unknown>>;
|
|
35
35
|
|
|
36
36
|
/**
|
|
37
37
|
* Children render function <Field name>{props => ...}</Field>)
|
|
@@ -57,10 +57,10 @@ export interface FieldConfig<Value, C extends React.ElementType | undefined = un
|
|
|
57
57
|
type?: string;
|
|
58
58
|
|
|
59
59
|
/** Field value */
|
|
60
|
-
value?:
|
|
60
|
+
value?: unknown;
|
|
61
61
|
|
|
62
62
|
/** Inner ref */
|
|
63
|
-
innerRef?: (instance:
|
|
63
|
+
innerRef?: (instance: unknown) => void;
|
|
64
64
|
|
|
65
65
|
}
|
|
66
66
|
|
|
@@ -79,10 +79,12 @@ export function Field<T, C extends React.ElementType | undefined = undefined>({
|
|
|
79
79
|
}: FieldProps<T, C>) {
|
|
80
80
|
const formex = useFormex();
|
|
81
81
|
|
|
82
|
-
const field = getFieldProps({ name,
|
|
82
|
+
const field = getFieldProps({ name,
|
|
83
|
+
...props }, formex);
|
|
83
84
|
|
|
84
85
|
if (isFunction(children)) {
|
|
85
|
-
return children({ field,
|
|
86
|
+
return children({ field,
|
|
87
|
+
form: formex });
|
|
86
88
|
}
|
|
87
89
|
|
|
88
90
|
// if (component) {
|
|
@@ -108,34 +110,38 @@ export function Field<T, C extends React.ElementType | undefined = undefined>({
|
|
|
108
110
|
const { innerRef, ...rest } = props;
|
|
109
111
|
return React.createElement(
|
|
110
112
|
asElement,
|
|
111
|
-
{ ref: innerRef,
|
|
113
|
+
{ ref: innerRef,
|
|
114
|
+
...field,
|
|
115
|
+
...rest,
|
|
116
|
+
className },
|
|
112
117
|
children
|
|
113
118
|
);
|
|
114
119
|
}
|
|
115
120
|
|
|
116
|
-
return React.createElement(asElement, { ...field,
|
|
121
|
+
return React.createElement(asElement, { ...field,
|
|
122
|
+
...props,
|
|
123
|
+
className }, children);
|
|
117
124
|
}
|
|
118
125
|
|
|
119
|
-
const getFieldProps = (nameOrOptions: string | FieldConfig<
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
const valueState = getIn(formex.values, name);
|
|
126
|
+
const getFieldProps = (nameOrOptions: string | FieldConfig<unknown>, formex: FormexController<object>): FieldInputProps<unknown> => {
|
|
127
|
+
const name: string = typeof nameOrOptions === "string"
|
|
128
|
+
? nameOrOptions
|
|
129
|
+
: nameOrOptions.name;
|
|
130
|
+
const valueState = getIn(formex.values as Record<string, unknown>, name);
|
|
125
131
|
|
|
126
|
-
const field: FieldInputProps<
|
|
127
|
-
name,
|
|
132
|
+
const field: FieldInputProps<unknown> = {
|
|
133
|
+
name: name as string,
|
|
128
134
|
value: valueState,
|
|
129
135
|
onChange: formex.handleChange,
|
|
130
|
-
onBlur: formex.handleBlur
|
|
136
|
+
onBlur: formex.handleBlur
|
|
131
137
|
};
|
|
132
|
-
if (
|
|
138
|
+
if (typeof nameOrOptions !== "string") {
|
|
133
139
|
const {
|
|
134
140
|
type,
|
|
135
141
|
value: valueProp, // value is special for checkboxes
|
|
136
142
|
as: is,
|
|
137
|
-
multiple
|
|
138
|
-
} = nameOrOptions as FieldConfig<
|
|
143
|
+
multiple
|
|
144
|
+
} = nameOrOptions as FieldConfig<unknown>;
|
|
139
145
|
|
|
140
146
|
if (type === "checkbox") {
|
|
141
147
|
if (valueProp === undefined) {
|
package/src/Formex.tsx
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import React, { useContext } from "react";
|
|
2
2
|
import { FormexController } from "./types";
|
|
3
3
|
|
|
4
|
-
const FormexContext = React.createContext<FormexController<any>>({} as any);
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
const FormexContext = React.createContext<FormexController<any> | null>(null);
|
|
7
6
|
|
|
8
|
-
export const
|
|
7
|
+
export const useFormex = <T = any>() => {
|
|
8
|
+
const ctx = useContext(FormexContext);
|
|
9
|
+
if (!ctx) throw new Error("useFormex must be used within a Formex provider");
|
|
10
|
+
return ctx as FormexController<T>;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const Formex = <T = any>({ value, children }: { value: FormexController<T>, children: React.ReactNode }) => {
|
|
9
14
|
return <FormexContext.Provider value={value}>{children}</FormexContext.Provider>;
|
|
10
15
|
};
|
package/src/types.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import React, { FormEvent } from "react";
|
|
2
2
|
|
|
3
|
-
export type FormexController<T
|
|
3
|
+
export type FormexController<T = any> = {
|
|
4
4
|
values: T;
|
|
5
5
|
initialValues: T;
|
|
6
6
|
setValues: (values: T) => void;
|
|
7
|
-
setFieldValue: (key: string, value:
|
|
7
|
+
setFieldValue: (key: string, value: unknown, shouldValidate?: boolean) => void;
|
|
8
8
|
touched: Record<string, boolean>;
|
|
9
9
|
setFieldTouched: (key: string, touched: boolean, shouldValidate?: boolean) => void;
|
|
10
10
|
setTouched: (touched: Record<string, boolean>) => void;
|
|
@@ -37,7 +37,7 @@ export type FormexController<T extends object> = {
|
|
|
37
37
|
canRedo: boolean;
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
export type FormexResetProps<T
|
|
40
|
+
export type FormexResetProps<T = any> = {
|
|
41
41
|
values?: T;
|
|
42
42
|
submitCount?: number;
|
|
43
43
|
errors?: Record<string, string>;
|
package/src/useCreateFormex.tsx
CHANGED
|
@@ -4,7 +4,7 @@ import { deepEqual as equal } from "fast-equals";
|
|
|
4
4
|
|
|
5
5
|
import { FormexController, FormexResetProps } from "./types";
|
|
6
6
|
|
|
7
|
-
export function useCreateFormex<T
|
|
7
|
+
export function useCreateFormex<T = any>({
|
|
8
8
|
initialValues,
|
|
9
9
|
initialErrors,
|
|
10
10
|
initialDirty,
|
|
@@ -15,7 +15,7 @@ export function useCreateFormex<T extends object>({
|
|
|
15
15
|
onSubmit,
|
|
16
16
|
onReset,
|
|
17
17
|
onValuesChangeDeferred,
|
|
18
|
-
debugId
|
|
18
|
+
debugId
|
|
19
19
|
}: {
|
|
20
20
|
initialValues: T;
|
|
21
21
|
initialErrors?: Record<string, string>;
|
|
@@ -50,7 +50,7 @@ export function useCreateFormex<T extends object>({
|
|
|
50
50
|
|
|
51
51
|
const onValuesChangeRef = useRef(onValuesChangeDeferred);
|
|
52
52
|
onValuesChangeRef.current = onValuesChangeDeferred;
|
|
53
|
-
const debounceTimeoutRef = useRef<
|
|
53
|
+
const debounceTimeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);
|
|
54
54
|
|
|
55
55
|
const callDebouncedOnValuesChange = useCallback((values: T) => {
|
|
56
56
|
if (onValuesChangeRef.current) {
|
|
@@ -94,11 +94,11 @@ export function useCreateFormex<T extends object>({
|
|
|
94
94
|
}, [validation]);
|
|
95
95
|
|
|
96
96
|
const setFieldValue = useCallback(
|
|
97
|
-
(key: string, value:
|
|
98
|
-
const newValues = setIn(valuesRef.current, key, value);
|
|
97
|
+
(key: string, value: unknown, shouldValidate?: boolean) => {
|
|
98
|
+
const newValues = setIn(valuesRef.current as Record<string, unknown>, key, value) as T;
|
|
99
99
|
valuesRef.current = newValues;
|
|
100
100
|
setValuesInner(newValues);
|
|
101
|
-
if (!equal(getIn(initialValuesRef.current, key), value)) {
|
|
101
|
+
if (!equal(getIn(initialValuesRef.current as Record<string, unknown>, key), value)) {
|
|
102
102
|
setDirty(true);
|
|
103
103
|
}
|
|
104
104
|
if (shouldValidate) {
|
|
@@ -115,7 +115,7 @@ export function useCreateFormex<T extends object>({
|
|
|
115
115
|
);
|
|
116
116
|
|
|
117
117
|
const setFieldError = useCallback((key: string, error: string | undefined) => {
|
|
118
|
-
setErrors((prevErrors) => {
|
|
118
|
+
setErrors((prevErrors: Record<string, string>) => {
|
|
119
119
|
const newErrors = { ...prevErrors };
|
|
120
120
|
if (error) {
|
|
121
121
|
newErrors[key] = error;
|
|
@@ -128,9 +128,9 @@ export function useCreateFormex<T extends object>({
|
|
|
128
128
|
|
|
129
129
|
const setFieldTouched = useCallback(
|
|
130
130
|
(key: string, touched: boolean, shouldValidate?: boolean) => {
|
|
131
|
-
setTouchedState((prev) => ({
|
|
131
|
+
setTouchedState((prev: Record<string, boolean>) => ({
|
|
132
132
|
...prev,
|
|
133
|
-
[key]: touched
|
|
133
|
+
[key]: touched
|
|
134
134
|
}));
|
|
135
135
|
if (shouldValidate) {
|
|
136
136
|
validate();
|
|
@@ -168,7 +168,7 @@ export function useCreateFormex<T extends object>({
|
|
|
168
168
|
e?.preventDefault();
|
|
169
169
|
e?.stopPropagation();
|
|
170
170
|
setIsSubmitting(true);
|
|
171
|
-
setSubmitCount((prev) => prev + 1);
|
|
171
|
+
setSubmitCount((prev: number) => prev + 1);
|
|
172
172
|
const validationErrors = await validation?.(valuesRef.current);
|
|
173
173
|
if (validationErrors && Object.keys(validationErrors).length > 0) {
|
|
174
174
|
setErrors(validationErrors);
|
|
@@ -177,7 +177,7 @@ export function useCreateFormex<T extends object>({
|
|
|
177
177
|
await onSubmit?.(valuesRef.current, controllerRef.current);
|
|
178
178
|
}
|
|
179
179
|
setIsSubmitting(false);
|
|
180
|
-
setVersion((prev) => prev + 1);
|
|
180
|
+
setVersion((prev: number) => prev + 1);
|
|
181
181
|
},
|
|
182
182
|
[onSubmit, validation]
|
|
183
183
|
);
|
|
@@ -196,7 +196,7 @@ export function useCreateFormex<T extends object>({
|
|
|
196
196
|
setTouchedState(touchedProp ?? initialTouched ?? {});
|
|
197
197
|
setDirty(false);
|
|
198
198
|
setSubmitCount(submitCountProp ?? 0);
|
|
199
|
-
setVersion((prev) => prev + 1);
|
|
199
|
+
setVersion((prev: number) => prev + 1);
|
|
200
200
|
onReset?.(controllerRef.current);
|
|
201
201
|
// Reset history with refs
|
|
202
202
|
historyRef.current = [valuesProp ?? initialValuesRef.current];
|
|
@@ -257,7 +257,7 @@ export function useCreateFormex<T extends object>({
|
|
|
257
257
|
undo,
|
|
258
258
|
redo,
|
|
259
259
|
canUndo: historyIndexRef.current > 0,
|
|
260
|
-
canRedo: historyIndexRef.current < historyRef.current.length - 1
|
|
260
|
+
canRedo: historyIndexRef.current < historyRef.current.length - 1
|
|
261
261
|
}),
|
|
262
262
|
[
|
|
263
263
|
values,
|
|
@@ -279,7 +279,7 @@ export function useCreateFormex<T extends object>({
|
|
|
279
279
|
submit,
|
|
280
280
|
resetForm,
|
|
281
281
|
undo,
|
|
282
|
-
redo
|
|
282
|
+
redo
|
|
283
283
|
]
|
|
284
284
|
);
|
|
285
285
|
|
package/src/utils.ts
CHANGED
|
@@ -1,22 +1,23 @@
|
|
|
1
1
|
/** @private is the value an empty array? */
|
|
2
|
-
export const isEmptyArray = (value?:
|
|
2
|
+
export const isEmptyArray = (value?: unknown) =>
|
|
3
3
|
Array.isArray(value) && value.length === 0;
|
|
4
4
|
|
|
5
5
|
/** @private is the given object a Function? */
|
|
6
|
-
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
|
|
7
|
+
export const isFunction = (obj: unknown): obj is Function =>
|
|
7
8
|
typeof obj === "function";
|
|
8
9
|
|
|
9
10
|
/** @private is the given object an Object? */
|
|
10
|
-
export const isObject = (obj:
|
|
11
|
+
export const isObject = (obj: unknown): obj is Record<string, unknown> =>
|
|
11
12
|
obj !== null && typeof obj === "object";
|
|
12
13
|
|
|
13
14
|
/** @private is the given object an integer? */
|
|
14
|
-
export const isInteger = (obj:
|
|
15
|
+
export const isInteger = (obj: unknown): boolean =>
|
|
15
16
|
String(Math.floor(Number(obj))) === obj;
|
|
16
17
|
|
|
17
18
|
/** @private is the given object a NaN? */
|
|
18
|
-
|
|
19
|
-
export const isNaN = (obj:
|
|
19
|
+
|
|
20
|
+
export const isNaN = (obj: unknown): boolean => obj !== obj;
|
|
20
21
|
|
|
21
22
|
/**
|
|
22
23
|
* Deeply get a value from an object via its path.
|
|
@@ -24,38 +25,39 @@ export const isNaN = (obj: any): boolean => obj !== obj;
|
|
|
24
25
|
export function getIn(
|
|
25
26
|
obj: any,
|
|
26
27
|
key: string | string[],
|
|
27
|
-
def?:
|
|
28
|
+
def?: unknown,
|
|
28
29
|
p = 0
|
|
29
|
-
) {
|
|
30
|
+
): any {
|
|
30
31
|
const path = toPath(key);
|
|
31
|
-
|
|
32
|
-
|
|
32
|
+
let current: unknown = obj;
|
|
33
|
+
while (current && p < path.length) {
|
|
34
|
+
current = (current as Record<string, unknown>)[path[p++]];
|
|
33
35
|
}
|
|
34
36
|
|
|
35
37
|
// check if path is not in the end
|
|
36
|
-
if (p !== path.length && !
|
|
38
|
+
if (p !== path.length && !current) {
|
|
37
39
|
return def;
|
|
38
40
|
}
|
|
39
41
|
|
|
40
|
-
return
|
|
42
|
+
return current === undefined ? def : current;
|
|
41
43
|
}
|
|
42
44
|
|
|
43
|
-
export function setIn(obj: any, path: string, value:
|
|
44
|
-
const res
|
|
45
|
-
let resVal:
|
|
45
|
+
export function setIn(obj: any, path: string, value: unknown): any {
|
|
46
|
+
const res = clone(obj) as Record<string, unknown>; // this keeps inheritance when obj is a class
|
|
47
|
+
let resVal: Record<string, unknown> = res;
|
|
46
48
|
let i = 0;
|
|
47
49
|
const pathArray = toPath(path);
|
|
48
50
|
|
|
49
51
|
for (; i < pathArray.length - 1; i++) {
|
|
50
52
|
const currentPath: string = pathArray[i];
|
|
51
|
-
const currentObj
|
|
53
|
+
const currentObj = getIn(obj, pathArray.slice(0, i + 1));
|
|
52
54
|
|
|
53
55
|
if (currentObj && (isObject(currentObj) || Array.isArray(currentObj))) {
|
|
54
|
-
resVal = resVal[currentPath] = clone(currentObj)
|
|
56
|
+
resVal = resVal[currentPath] = clone(currentObj) as Record<string, unknown>;
|
|
55
57
|
} else {
|
|
56
58
|
const nextPath: string = pathArray[i + 1];
|
|
57
59
|
resVal = resVal[currentPath] =
|
|
58
|
-
isInteger(nextPath) && Number(nextPath) >= 0 ? [] : {}
|
|
60
|
+
(isInteger(nextPath) && Number(nextPath) >= 0 ? [] : {}) as Record<string, unknown>;
|
|
59
61
|
}
|
|
60
62
|
}
|
|
61
63
|
|
|
@@ -79,7 +81,7 @@ export function setIn(obj: any, path: string, value: any): any {
|
|
|
79
81
|
return res;
|
|
80
82
|
}
|
|
81
83
|
|
|
82
|
-
export function clone(value:
|
|
84
|
+
export function clone(value: unknown): unknown {
|
|
83
85
|
if (Array.isArray(value)) {
|
|
84
86
|
return [...value];
|
|
85
87
|
} else if (typeof value === "object" && value !== null) {
|
|
@@ -87,7 +89,7 @@ export function clone(value: any) {
|
|
|
87
89
|
if (Object.getPrototypeOf(value) !== Object.prototype) {
|
|
88
90
|
return value;
|
|
89
91
|
}
|
|
90
|
-
return { ...value };
|
|
92
|
+
return { ...(value as Record<string, unknown>) };
|
|
91
93
|
} else {
|
|
92
94
|
return value; // This is for primitive types which do not need cloning.
|
|
93
95
|
}
|