@radicalbit/formbit 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1180 -0
  3. package/dist/__tests__/check.test.d.ts +1 -0
  4. package/dist/__tests__/error.test.d.ts +1 -0
  5. package/dist/__tests__/initialize.test.d.ts +1 -0
  6. package/dist/__tests__/is-form-invalid.test.d.ts +1 -0
  7. package/dist/__tests__/is-form-valid.test.d.ts +1 -0
  8. package/dist/__tests__/live-validation.test.d.ts +1 -0
  9. package/dist/__tests__/remove.test.d.ts +1 -0
  10. package/dist/__tests__/reset-form.test.d.ts +1 -0
  11. package/dist/__tests__/set-error.test.d.ts +1 -0
  12. package/dist/__tests__/set-schema.test.d.ts +1 -0
  13. package/dist/__tests__/submit-form.test.d.ts +1 -0
  14. package/dist/__tests__/use-execute-callbacks.test.d.ts +1 -0
  15. package/dist/__tests__/use-formbit-context.test.d.ts +1 -0
  16. package/dist/__tests__/validate-all.test.d.ts +1 -0
  17. package/dist/__tests__/validate-form.test.d.ts +1 -0
  18. package/dist/__tests__/validate-sync-all.test.d.ts +1 -0
  19. package/dist/__tests__/validate.test.d.ts +1 -0
  20. package/dist/__tests__/write-all.test.d.ts +1 -0
  21. package/dist/__tests__/write.test.d.ts +1 -0
  22. package/dist/formbit-context.d.ts +9 -0
  23. package/dist/helpers/constants.d.ts +9 -0
  24. package/dist/helpers/obj-leaves.d.ts +3 -0
  25. package/dist/index.d.ts +4 -0
  26. package/dist/index.js +658 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/index.modern.js +654 -0
  29. package/dist/index.modern.js.map +1 -0
  30. package/dist/types/helpers.d.ts +2 -0
  31. package/dist/types/index.d.ts +418 -0
  32. package/dist/use-execute-callbacks.d.ts +11 -0
  33. package/dist/use-formbit.d.ts +7 -0
  34. package/dist/validate-sync-all.d.ts +2 -0
  35. package/package.json +90 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.modern.js","sources":["../src/helpers/obj-leaves.ts","../src/helpers/constants.ts","../src/types/helpers.ts","../src/validate-sync-all.ts","../src/use-execute-callbacks.ts","../src/use-formbit.ts","../src/formbit-context.tsx"],"sourcesContent":["type ObjectLeaves = (obj: unknown, acc?: string[]) => string[]\n\nfunction isObject(val: unknown): val is Record<string, unknown> {\n return val != null && typeof val === 'object' && Array.isArray(val) === false\n}\n\nconst objLeaves: ObjectLeaves = (obj, acc = []) => {\n const fn = (o: unknown, s?: string) => {\n if (Array.isArray(o)) {\n return Object.keys(o).forEach((k) => {\n const path = s ? `${s}[${k}]` : k\n\n const isLeaf = fn(o[+k], path) === false\n if (isLeaf) {\n acc.push(path)\n }\n })\n }\n\n if (isObject(o)) {\n return Object.keys(o).forEach((k) => {\n const path = s ? `${s}.${k}` : k\n\n const isLeaf = fn(o[k], path) === false\n if (isLeaf) {\n acc.push(path)\n }\n })\n }\n\n return false\n }\n\n fn(obj)\n return acc\n}\n\nexport default objLeaves\n","export const TEST_ERROR_MESSAGES = {\n MIN: 'must be greater than or equal',\n REQUIRED: 'is a required field'\n}\n\nexport enum ACTIONS {\n write = 'write',\n remove = 'remove'\n}\n\nexport const MISSING_CONTEXT_ERROR =\n 'No FormbitContext.Provider found, useFormbitContext can only be called inside proper context'\n","import { ValidationError } from 'yup'\n\nexport const isValidationError = (error: unknown): error is ValidationError => {\n if (error && typeof error === 'object' && 'message' in error && 'path' in error && 'inner' in error) {\n const { path, message, inner } = error\n\n return (typeof path === 'string' || path === undefined) &&\n (typeof message === 'string' || path === undefined) &&\n Array.isArray(inner)\n }\n\n return false\n}\n","import { isEmpty } from 'lodash'\nimport { Form, InitialValues, ValidateOptions, ValidationFormbitError, ValidationSchema } from './types'\nimport { isValidationError } from './types/helpers'\n\n/* We implement the validateSyncAll because yup.pick won't work with\n * schema with nested values: https://github.com/jquense/yup/issues/1269 */\nexport const validateSyncAll = <Values extends InitialValues> (\n paths:string[],\n schema:ValidationSchema<Values>,\n form: Form,\n options: ValidateOptions = {}\n): ValidationFormbitError[] => {\n let errors: ValidationFormbitError[] = []\n\n if (isEmpty(paths)) {\n return errors\n }\n\n for (const pathToValidate of paths) {\n try {\n schema.validateSyncAt(pathToValidate, form, options)\n } catch (e) {\n if (isValidationError(e)) {\n const { message, path } = e\n\n errors = errors.concat({ message, path })\n }\n\n if (options?.abortEarly) {\n break\n }\n }\n }\n\n return errors\n}\n","import { useCallback, useEffect, useRef } from 'react'\nimport { GenericCallback, InitialValues, SetError, Writer } from './types'\n\ntype CbTypes<Values extends InitialValues> = GenericCallback<Values> | undefined\n\ntype RefsStore<Values extends InitialValues> = CbTypes<Values>[]\n\n/**\n * useExecuteCallbacks\n *\n * This hook is meant to give a simple way to make sure that callbacks are called only once,\n * even if they are called inside React hooks like useEffect or setState.\n *\n *\n */\nexport default <Values extends InitialValues>(writer: Writer<Values>, setError: SetError) => {\n const callbacksStore = useRef<RefsStore<Partial<Values>>>([])\n\n useEffect(() => {\n if (callbacksStore.current.length) {\n callbacksStore.current.forEach((cb) => {\n if (cb) {\n cb(writer, setError)\n }\n })\n callbacksStore.current = []\n }\n }, [setError, writer])\n\n /**\n * executeCallbacks\n * @param cb Callback that needs to be executed.\n *\n */\n return useCallback((cb?: GenericCallback<Partial<Values>>) => {\n if (cb) {\n callbacksStore.current.push(cb)\n }\n }, [])\n}\n","import objLeaves from './helpers/obj-leaves'\nimport {\n useCallback, useRef, useState\n} from 'react'\nimport { ACTIONS } from './helpers/constants'\nimport {\n Check,\n ErrorFn,\n FormbitObject,\n InitialValues,\n IsFormInvalid,\n IsFormValid,\n LiveValidation,\n LiveValidationFn,\n PrivateValidateForm,\n Remove,\n SetError,\n SubmitForm,\n SuccessCallback,\n Validate,\n ValidateAll,\n ValidateForm,\n ValidationSchema,\n Write,\n WriteAll,\n WriteOrRemove,\n Writer\n} from './types'\nimport { isValidationError } from './types/helpers'\nimport { validateSyncAll } from './validate-sync-all'\nimport useExecuteCallbacks from './use-execute-callbacks'\nimport { cloneDeep, get, isEmpty, omit, set } from 'lodash'\n\ntype UseFormbitParams<Values extends InitialValues> = {\n initialValues?: Partial<Values>,\n yup: ValidationSchema<Values>\n}\n\nexport default <Values extends InitialValues>({\n initialValues = {},\n yup: schema\n}: UseFormbitParams<Values>): FormbitObject<Values> => {\n const schemaRef = useRef<ValidationSchema<Values>>(schema)\n\n const [writer, setWriter] = useState<Writer<Partial<Values>>>({\n form: initialValues,\n initialValues,\n errors: {},\n liveValidation: {},\n isDirty: false\n })\n\n const initialize = useCallback((values: Partial<Values>) => {\n setWriter((w) => ({\n ...w,\n initialValues: values,\n form: values,\n errors: {},\n liveValidation: {},\n isDirty: false\n }))\n }, [])\n\n const setSchema = useCallback((newSchema: ValidationSchema<Values>) => { schemaRef.current = newSchema }, [])\n\n const setError: SetError = useCallback((path, value) => {\n setWriter((w) => {\n const errors = set(cloneDeep(w.errors), path, value)\n\n return { ...w, errors }\n })\n }, [])\n\n const executeCb = useExecuteCallbacks<Partial<Values>>(writer, setError)\n\n const writeOrRemove: WriteOrRemove<Values> = useCallback((\n path,\n value,\n {\n noLiveValidation = false,\n pathsToValidate = [],\n successCallback,\n errorCallback,\n options = {}\n } = {},\n action\n ) => {\n setWriter((w) => {\n const liveValidationPaths = noLiveValidation ? [] : Object.keys(w.liveValidation)\n const paths = pathsToValidate.concat(liveValidationPaths)\n\n const form = (function execute() {\n switch (action) {\n case ACTIONS.write: return set(cloneDeep(w.form), path, value)\n\n case ACTIONS.remove: return omit<Partial<Values>>(cloneDeep(w.form), path)\n\n default: return cloneDeep(w.form)\n }\n }())\n\n const newWriter: Writer<Partial<Values>> = { ...w, form, isDirty: true }\n\n if (paths.length === 0) {\n executeCb(successCallback)\n\n return newWriter\n }\n\n // Teardown errors\n const cleanErrors = paths.reduce(\n (acc, key) => set(acc, key, undefined),\n cloneDeep(newWriter.errors)\n )\n\n // VALIDATE\n const inner = validateSyncAll(paths, schemaRef.current, newWriter.form, options)\n\n if (isEmpty(inner)) {\n const neww = { ...newWriter, errors: cleanErrors }\n\n executeCb(successCallback)\n\n return neww\n }\n\n const errors = inner.reduce(\n (acc, { path: innerPath, message }) => innerPath ? set(acc, innerPath, message) : acc,\n cleanErrors\n )\n\n const liveValidation: LiveValidation = inner.reduce(\n (acc, { path: innerPath }) => innerPath ? ({ ...acc, [innerPath]: true }) : acc,\n newWriter.liveValidation\n )\n\n const neww = { ...newWriter, errors, liveValidation }\n\n executeCb(errorCallback)\n\n return neww\n })\n }, [executeCb])\n\n const write: Write<Values> = useCallback((path, value, options) =>\n writeOrRemove(path, value, options, ACTIONS.write), [writeOrRemove])\n\n const remove: Remove<Values> = useCallback((path, options) =>\n writeOrRemove(path, undefined, options, ACTIONS.remove), [writeOrRemove])\n\n const writeAll: WriteAll<Values> = useCallback((\n arr,\n {\n noLiveValidation = false,\n pathsToValidate = [],\n successCallback,\n errorCallback,\n options = {}\n } = {}\n ) => {\n setWriter((w) => {\n const liveValidationPaths = noLiveValidation ? [] : Object.keys(w.liveValidation)\n const paths = pathsToValidate.concat(liveValidationPaths)\n\n const form = arr.reduce(\n (acc, [key, val]) => set(acc, key, val),\n cloneDeep(w.form)\n )\n\n const newWriter = { ...w, form, isDirty: true }\n\n if (paths.length === 0) {\n executeCb(successCallback)\n\n return newWriter\n }\n\n // Teardown errors\n const cleanErrors = paths.reduce(\n (acc, key) => set(acc, key, undefined),\n cloneDeep(newWriter.errors)\n )\n\n // VALIDATE ALL\n const inner = validateSyncAll(paths, schemaRef.current, newWriter.form, options)\n\n if (isEmpty(inner)) {\n const neww = { ...newWriter, errors: cleanErrors }\n\n executeCb(successCallback)\n\n return neww\n }\n\n const errors = inner.reduce(\n (acc, { path = '', message }) => set(acc, path, message),\n cleanErrors\n )\n\n const liveValidation: LiveValidation = inner.reduce(\n (acc, { path = '' }) => ({ ...acc, [path]: true }),\n newWriter.liveValidation\n )\n\n const neww = { ...newWriter, errors, liveValidation }\n\n executeCb(errorCallback)\n\n return neww\n })\n }, [executeCb])\n\n const validate: Validate<Values> = useCallback((\n path,\n {\n successCallback,\n errorCallback,\n options\n } = {}\n ) => {\n setWriter((w) => {\n // Teardown errors\n const cleanErrors = set(cloneDeep(w.errors), path, undefined)\n\n // VALIDATE\n const inner = validateSyncAll([path], schemaRef.current, w.form, options)\n\n if (isEmpty(inner)) {\n const neww = { ...w, errors: cleanErrors }\n\n executeCb(successCallback)\n\n return neww\n }\n\n const errors = inner.reduce(\n (acc, { path: errorPath = '', message }) => set(acc, errorPath, message),\n cleanErrors\n )\n\n const liveValidation: LiveValidation = inner.reduce(\n (acc, { path: errorPath = '' }) => ({ ...acc, [errorPath]: true }),\n w.liveValidation\n )\n\n const neww = { ...w, errors, liveValidation }\n\n executeCb(errorCallback)\n\n return neww\n })\n }, [executeCb])\n\n const validateAll: ValidateAll<Values> = useCallback((\n paths,\n { successCallback, errorCallback, options } = {}\n ) => {\n setWriter((w) => {\n // Teardown errors\n const cleanErrors = paths.reduce(\n (acc, path) => set(acc, path, undefined),\n cloneDeep(w.errors)\n )\n\n // VALIDATE ALL\n const inner = validateSyncAll(paths, schemaRef.current, w.form, options)\n\n if (isEmpty(inner)) {\n const neww = { ...w, errors: cleanErrors }\n\n executeCb(successCallback)\n\n return neww\n }\n\n const errors = inner.reduce(\n (acc, { path = '', message }) => set(acc, path, message),\n cleanErrors\n )\n\n const liveValidation: LiveValidation = inner.reduce(\n (acc, { path = '' }) => ({ ...acc, [path]: true }),\n w.liveValidation\n )\n\n const neww = { ...w, errors, liveValidation }\n\n executeCb(errorCallback)\n\n return neww\n })\n }, [executeCb])\n\n const check: Check<Partial<Values>> = useCallback((\n json,\n {\n successCallback,\n errorCallback,\n options\n } = {}\n ) => {\n try {\n schema.validateSync(json, { abortEarly: false, ...options })\n successCallback?.(json, writer, setError)\n\n return undefined\n } catch (e) {\n if (isValidationError(e)) {\n const { inner } = e\n\n errorCallback?.(json, inner, writer, setError)\n\n return inner\n }\n\n return undefined\n }\n }, [schema, setError, writer])\n\n const privateValidateForm: PrivateValidateForm<Partial<Values>> = useCallback((\n successCallback,\n errorCallback,\n { isDirty: _, options } = {}\n ) => {\n setWriter((w) => {\n try {\n // abortEarly: false as default is to be retrocompatible\n schemaRef.current.validateSync(w.form, { abortEarly: false, ...options })\n\n executeCb(successCallback)\n\n return { ...w, errors: {} }\n } catch (e) {\n if (!isValidationError(e)) {\n // Checking if error is not formbit-related (e.g. a bug inside the successCallback)\n console.error(e)\n return w\n }\n\n const { inner } = e\n\n const errors = inner.reduce(\n (acc, { message, path = '' }) => set(acc, path, message),\n {}\n )\n\n const liveValidation: LiveValidation = inner.reduce(\n (acc, { path = '' }) => ({ ...acc, [path]: true }),\n w.liveValidation\n )\n\n const newWriter = { ...w, errors, liveValidation }\n\n executeCb(errorCallback)\n\n return newWriter\n }\n })\n }, [executeCb])\n\n const validateForm: ValidateForm<Partial<Values>> = useCallback((successCallback, errorCallback, options = {}) =>\n privateValidateForm(\n successCallback,\n errorCallback,\n { options }\n ), [privateValidateForm])\n\n const submitForm: SubmitForm<Values> =\n useCallback((successCallback, errorCallback, options = {}) => {\n const fn = () => setWriter((w) => ({ ...w, isDirty: false }))\n\n const successCallbackAndClearIsDirty: SuccessCallback<Partial<Values>> = (a, b) => {\n // Success callback is called only if the form is valid so we can safely cast a as Writer<Values>\n const writer = a as Writer<Values>\n\n // __metadata is a field used to store metadata about the form and should not be submitted\n const { __metadata: _, ...form } = writer.form\n\n return successCallback({ ...writer, form }, b, fn)\n }\n\n return privateValidateForm(\n successCallbackAndClearIsDirty,\n errorCallback,\n { options }\n )\n }, [privateValidateForm])\n\n const resetForm = useCallback(() => {\n setWriter((w) => ({\n ...w,\n form: w.initialValues,\n errors: {},\n isDirty: false,\n liveValidation: {}\n }))\n }, [])\n\n const isFormValid: IsFormValid = useCallback(() => {\n const { silent: _, ...e } = writer.errors\n return objLeaves(e).every((leaf) => !get(e, leaf))\n }, [writer.errors])\n\n const isFormInvalid: IsFormInvalid = useCallback(() => {\n const { silent: _, ...e } = writer.errors\n return objLeaves(e).some((leaf) => get(e, leaf))\n }, [writer.errors])\n\n const error: ErrorFn = useCallback((path: string) => get(writer.errors, path, undefined), [writer.errors])\n\n const liveValidation: LiveValidationFn = useCallback(\n (path: string) => get(writer.liveValidation, path, undefined),\n [writer.liveValidation]\n )\n\n return {\n check,\n error,\n errors: writer.errors,\n form: writer.form,\n initialize,\n isDirty: writer.isDirty,\n isFormInvalid,\n isFormValid,\n liveValidation,\n remove,\n resetForm,\n setError,\n setSchema,\n submitForm,\n validate,\n validateAll,\n validateForm,\n write,\n writeAll\n }\n}\n","import React, { useContext, createContext, PropsWithChildren } from 'react'\nimport useFormbit from './use-formbit'\nimport * as yup from 'yup'\nimport { FormbitObject, InitialValues, ValidationSchema } from './types'\nimport { MISSING_CONTEXT_ERROR } from './helpers/constants'\nimport { once } from 'lodash'\n\ntype Props<Values extends InitialValues> = {\n initialValues?: Partial<Values> | {}\n schema: ValidationSchema<Values>\n} & PropsWithChildren\n\nconst createFormbitContext =\n once(<Values extends InitialValues>() => createContext<FormbitObject<Values> | undefined>(undefined))\n\nexport default function FormbitContextProvider<Values extends InitialValues>({\n initialValues = {},\n schema,\n children\n}: Props<Values>) {\n const FormbitContext = createFormbitContext<Values>()\n\n const value = useFormbit({ initialValues, yup: schema || yup.object() })\n\n return (\n <FormbitContext.Provider value={value}>{children}</FormbitContext.Provider>\n )\n}\n\nexport const useFormbitContext = <Values extends InitialValues>() => {\n const context = useContext(createFormbitContext<Values>())\n\n if (!context) {\n // This error can only be thrown if this hook is called outside the context,\n // and it should only happen during develop.\n throw new Error(MISSING_CONTEXT_ERROR)\n }\n\n return context\n}\n"],"names":["isObject","val","Array","isArray","objLeaves","obj","acc","fn","o","s","Object","keys","forEach","k","path","isLeaf","push","ACTIONS","MISSING_CONTEXT_ERROR","isValidationError","error","message","inner","undefined","validateSyncAll","paths","schema","form","options","errors","isEmpty","pathToValidate","validateSyncAt","e","concat","abortEarly","writer","setError","callbacksStore","useRef","useEffect","current","length","cb","useCallback","initialValues","yup","schemaRef","useState","liveValidation","isDirty","setWriter","initialize","values","w","setSchema","newSchema","value","set","cloneDeep","executeCb","useExecuteCallbacks","writeOrRemove","action","noLiveValidation","pathsToValidate","successCallback","errorCallback","liveValidationPaths","execute","write","remove","omit","newWriter","cleanErrors","reduce","key","neww","innerPath","writeAll","arr","validate","errorPath","validateAll","check","json","validateSync","privateValidateForm","_","console","validateForm","submitForm","successCallbackAndClearIsDirty","a","b","resetForm","isFormValid","every","leaf","get","isFormInvalid","some","createFormbitContext","once","createContext","FormbitContextProvider","children","FormbitContext","useFormbit","useFormbitContext","context","useContext","Error"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { ValidationError } from 'yup';
2
+ export declare const isValidationError: (error: unknown) => error is ValidationError;
@@ -0,0 +1,418 @@
1
+ import { ObjectSchema, ValidationError as YupValidationError, ValidateOptions as YupValidateOptions } from 'yup';
2
+ import { ACTIONS } from '../helpers/constants';
3
+ /**
4
+ * @private
5
+ */
6
+ export type Action = keyof typeof ACTIONS;
7
+ /**
8
+ * Checks the given json against the form schema and returns and array of errors.
9
+ * It returns undefined if the json is valid.
10
+ *
11
+ */
12
+ export type Check<Values extends InitialValues> = (json: Form, options?: CheckFnOptions<Values>) => ValidationError[] | undefined;
13
+ /**
14
+ * Reset isDirty value to false
15
+ */
16
+ export type ClearIsDirty = () => void;
17
+ /**
18
+ * Invoked in case of errors raised by validation
19
+ */
20
+ export type ErrorCallback<Values extends InitialValues> = (writer: Writer<Values>, setError: SetError) => void;
21
+ /**
22
+ * Invoked in case of errors raised by validation of check method
23
+ *
24
+ */
25
+ export type ErrorCheckCallback<Values extends InitialValues> = (json: Form, inner: ValidationError[], writer: Writer<Values>, setError: SetError) => void;
26
+ /**
27
+ * Returns the error message for the given path if any.
28
+ * It doesn't trigger any validation
29
+ *
30
+ */
31
+ export type ErrorFn = (path: string) => string | undefined;
32
+ /**
33
+ * Object including all the registered errors messages since the last validation.
34
+ * Errors are stored using the same path of the corresponding form values.
35
+ *
36
+ * @example
37
+ * If the form object has this structure:
38
+ * ```json
39
+ * {
40
+ * "age": 1
41
+ * }
42
+ * ```
43
+ * and age is a non valid field, errors object will look like this
44
+ * ```json
45
+ * {
46
+ * "age": "Age must be greater then 18"
47
+ * }
48
+ * ```
49
+ *
50
+ */
51
+ export type Errors = Record<string, string>;
52
+ /**
53
+ * Object containing the updated form
54
+ */
55
+ export type Form = {
56
+ __metadata?: Object;
57
+ } & Object;
58
+ export type GenericCallback<Values extends InitialValues> = SuccessCallback<Values> | ErrorCallback<Values>;
59
+ /**
60
+ * Initialize the form with new initial values
61
+ */
62
+ export type Initialize<Values extends InitialValues> = (values: Partial<Values>) => void;
63
+ /**
64
+ * InitialValues used to setup formbit, used also to reset the form to the original version.
65
+ *
66
+ */
67
+ export type InitialValues = {
68
+ __metadata?: Object;
69
+ } & Object;
70
+ /**
71
+ * Returns true if the form is Dirty (user already interacted with the form), false otherwise.
72
+ *
73
+ */
74
+ export type IsDirty = boolean;
75
+ /**
76
+ * Returns true if the form is NOT valid
77
+ * It doesn't perform any validation, it checks if any errors are present
78
+ */
79
+ export type IsFormInvalid = () => boolean;
80
+ /**
81
+ * Returns true id the form is valid
82
+ * It doesn't perform any validation, it checks if any errors are present
83
+ */
84
+ export type IsFormValid = () => boolean;
85
+ /**
86
+ * Object including all the values that are being live validated.
87
+ * Usually fields that fail validation (using one of the method that triggers validation)
88
+ * will automatically set to be live-validated.
89
+ *
90
+ * A value/path is live-validated when validated at every change of the form.
91
+ *
92
+ * By default no field is live-validated
93
+ *
94
+ * @example
95
+ * If the form object has this structure:
96
+ * ```json
97
+ * {
98
+ * "age": 1
99
+ * }
100
+ * ```
101
+ * and age is a field that is being live-validated, liveValidation object will look like this
102
+ * ```json
103
+ * {
104
+ * "age": "Age must be greater then 18"
105
+ * }
106
+ * ```
107
+ *
108
+ */
109
+ export type LiveValidation = Record<string, true>;
110
+ /**
111
+ * Returns true if live validation is active for the given path
112
+ *
113
+ */
114
+ export type LiveValidationFn = (path: string) => true | undefined;
115
+ /**
116
+ * Generic object with string as keys
117
+ *
118
+ */
119
+ export type Object = Record<string, unknown>;
120
+ /**
121
+ * @private
122
+ */
123
+ export type PrivateValidateForm<Values extends InitialValues> = (successCallback?: SuccessCallback<Values>, errorCallback?: ErrorCallback<Partial<Values>>, options?: {
124
+ options?: ValidateOptions;
125
+ isDirty?: boolean;
126
+ }) => void;
127
+ /**
128
+ *
129
+ * This method updates the form state deleting value and set isDirty to true.
130
+ *
131
+ * After writing, it validates all the paths contained into pathsToValidate (if any)
132
+ * and all the fields that have the live validation active.
133
+ *
134
+ *
135
+ */
136
+ export type Remove<Values extends InitialValues> = (path: string, options?: WriteFnOptions<Values>) => void;
137
+ /**
138
+ * Reset form to the initial state.
139
+ * Errors and liveValidation are set back to empty objects.
140
+ * isDirty is set back to false
141
+ *
142
+ */
143
+ export type ResetForm = () => void;
144
+ /**
145
+ * Type imported from the yup library.
146
+ * It represents any validation schema created with the yup.object() method
147
+ *
148
+ * Link to the Yup documentation {@link https://github.com/jquense/yup}
149
+ *
150
+ */
151
+ export type ValidationSchema<Values extends InitialValues> = ObjectSchema<Values>;
152
+ /**
153
+ * Set a message(value) to the given error path.
154
+ *
155
+ */
156
+ export type SetError = (path: string, value: string) => void;
157
+ /**
158
+ * Override the current schema with the given one.
159
+ *
160
+ */
161
+ export type SetSchema<Values extends InitialValues> = (newSchema: ValidationSchema<Values>) => void;
162
+ /**
163
+ * Perform a validation against the current form object, and execute the successCallback if the validation pass
164
+ * otherwise it executes the errorCallback
165
+ *
166
+ */
167
+ export type SubmitForm<Values extends InitialValues> = (successCallback: SuccessSubmitCallback<Values>, errorCallback?: ErrorCallback<Partial<Values>>, options?: ValidateOptions) => void;
168
+ /**
169
+ * Success callback invoked by some formbit methods when the operation is successful.
170
+ *
171
+ */
172
+ export type SuccessCallback<Values extends InitialValues> = (writer: Writer<Values>, setError: SetError) => void;
173
+ /**
174
+ * Success callback invoked by the check method when the operation is successful.
175
+ *
176
+ */
177
+ export type SuccessCheckCallback<Values extends InitialValues> = (json: Form, writer: Writer<Values>, setError: SetError) => void;
178
+ /**
179
+ * Success callback invoked by the submit method when the validation is successful.
180
+ * Is the right place to send your data to the backend.
181
+ *
182
+ */
183
+ export type SuccessSubmitCallback<Values extends InitialValues> = (writer: Writer<Values | Omit<Values, '__metadata'>>, setError: SetError, clearIsDirty: ClearIsDirty) => void;
184
+ /**
185
+ *
186
+ * This method only validate the specified path. Do not check for fields that have the
187
+ * live validation active.
188
+ */
189
+ export type Validate<Values extends InitialValues> = (path: string, options?: ValidateFnOptions<Values>) => void;
190
+ /**
191
+ *
192
+ * This method only validate the specified paths. Do not check for fields that have the
193
+ * live validation active.
194
+ */
195
+ export type ValidateAll<Values extends InitialValues> = (paths: string[], options?: ValidateFnOptions<Values>) => void;
196
+ /**
197
+ * This method validates the entire form and set the corresponding errors if any.
198
+ *
199
+ */
200
+ export type ValidateForm<Values extends InitialValues> = (successCallback?: SuccessCallback<Values>, errorCallback?: ErrorCallback<Values>, options?: ValidateOptions) => void;
201
+ export type ValidationFormbitError = Pick<ValidationError, 'message' | 'path'>;
202
+ /**
203
+ * Type imported from the yup library.
204
+ * It represents the object with all the options that can be passed to the internal yup validation method,
205
+ *
206
+ * Link to the Yup documentation {@link https://github.com/jquense/yup}
207
+ *
208
+ */
209
+ export type ValidateOptions = YupValidateOptions;
210
+ /**
211
+ *
212
+ * This method update the form state writing $value into the $path, setting isDirty to true.
213
+ *
214
+ * After writing, it validates all the paths contained into $pathsToValidate (if any)
215
+ * and all the fields that have the live validation active.
216
+ */
217
+ export type Write<Values extends InitialValues> = (path: keyof Values | string, value: unknown, options?: WriteFnOptions<Values>) => void;
218
+ /**
219
+ * This method takes an array of [path, value] and update the form state writing
220
+ * all those values into the specified paths.
221
+ *
222
+ * It set isDirty to true.
223
+ *
224
+ * After writing, it validate all the paths contained into $pathToValidate and all
225
+ * the fields that have the live validation active.
226
+ *
227
+ */
228
+ export type WriteAll<Values extends InitialValues> = (arr: WriteAllValue<Values>[], options?: WriteFnOptions<Values>) => void;
229
+ /**
230
+ * Tuple of [key, value] pair.
231
+ *
232
+ */
233
+ export type WriteAllValue<Values extends InitialValues> = [keyof Values | string, unknown];
234
+ /**
235
+ * @private
236
+ */
237
+ export type WriteOrRemove<Values extends Form> = (path: keyof Values | string, value: unknown, options?: WriteFnOptions<Values>, action?: Action) => void;
238
+ /**
239
+ * Internal form state storing all the data of the form (except the validation schema)
240
+ *
241
+ */
242
+ export type Writer<Values extends InitialValues> = {
243
+ form: Values;
244
+ initialValues: Values;
245
+ errors: Errors;
246
+ liveValidation: LiveValidation;
247
+ isDirty: IsDirty;
248
+ };
249
+ /**
250
+ * Options object to change the behavior of the check method
251
+ *
252
+ */
253
+ export type CheckFnOptions<Values extends InitialValues> = {
254
+ successCallback?: SuccessCheckCallback<Values>;
255
+ errorCallback?: ErrorCheckCallback<Values>;
256
+ options?: ValidateOptions;
257
+ };
258
+ /**
259
+ * Options object to change the behavior of the validate methods
260
+ *
261
+ */
262
+ export type ValidateFnOptions<Values extends InitialValues> = {
263
+ successCallback?: SuccessCallback<Partial<Values>>;
264
+ errorCallback?: ErrorCallback<Partial<Values>>;
265
+ options?: ValidateOptions;
266
+ };
267
+ /**
268
+ * Type imported from the yup library.
269
+ * It represents the error object returned when a validation fails
270
+ *
271
+ * Link to the Yup documentation {@link https://github.com/jquense/yup}
272
+ *
273
+ */
274
+ export type ValidationError = YupValidationError;
275
+ /**
276
+ * Options object to change the behavior of the write methods
277
+ *
278
+ */
279
+ export type WriteFnOptions<Values extends InitialValues> = {
280
+ noLiveValidation?: boolean;
281
+ pathsToValidate?: string[];
282
+ } & ValidateFnOptions<Values>;
283
+ /**
284
+ * Object returned by useFormbit() and useFormbitContextHook()
285
+ * It contains all the data and methods needed to handle the form.
286
+ *
287
+ */
288
+ export type FormbitObject<Values extends InitialValues> = {
289
+ /**
290
+ * Checks the given json against the form schema and returns and array of errors.
291
+ * It returns undefined if the json is valid.
292
+ *
293
+ */
294
+ check: Check<Partial<Values>>;
295
+ /**
296
+ * Returns the error message for the given path if any.
297
+ * It doesn't trigger any validation
298
+ *
299
+ */
300
+ error: ErrorFn;
301
+ /**
302
+ * Object including all the registered errors messages since the last validation.
303
+ * Errors are stored using the same path of the corresponding form values.
304
+ *
305
+ * @example
306
+ * If the form object has this structure:
307
+ * ```json
308
+ * {
309
+ * "age": 1
310
+ * }
311
+ * ```
312
+ * and age is a non valid field, errors object will look like this
313
+ * ```json
314
+ * {
315
+ * "age": "Age must be greater then 18"
316
+ * }
317
+ * ```
318
+ *
319
+ */
320
+ errors: Errors;
321
+ /**
322
+ * Object containing the updated form
323
+ */
324
+ form: Partial<Values>;
325
+ /**
326
+ * Initialize the form with new initial values
327
+ */
328
+ initialize: Initialize<Values>;
329
+ /**
330
+ * Returns true if the form is Dirty (user already interacted with the form), false otherwise.
331
+ *
332
+ */
333
+ isDirty: boolean;
334
+ /**
335
+ * Returns true if the form is NOT valid
336
+ * It doesn't perform any validation, it checks if any errors are present
337
+ */
338
+ isFormInvalid: IsFormInvalid;
339
+ /**
340
+ * Returns true id the form is valid
341
+ * It doesn't perform any validation, it checks if any errors are present
342
+ */
343
+ isFormValid: IsFormValid;
344
+ /**
345
+ * Returns true if live validation is active for the given path
346
+ */
347
+ liveValidation: LiveValidationFn;
348
+ /**
349
+ *
350
+ * This method updates the form state deleting value, setting isDirty to true.
351
+ *
352
+ * After writing, it validates all the paths contained into pathsToValidate (if any)
353
+ * and all the fields that have the live validation active.
354
+ *
355
+ *
356
+ */
357
+ remove: Remove<Values>;
358
+ /**
359
+ * Reset form to the initial state.
360
+ * Errors and liveValidation are set back to empty objects.
361
+ * isDirty is set back to false
362
+ *
363
+ */
364
+ resetForm: ResetForm;
365
+ /**
366
+ * Set a message(value) to the given error path.
367
+ *
368
+ */
369
+ setError: SetError;
370
+ /**
371
+ * Override the current schema with the given one.
372
+ *
373
+ */
374
+ setSchema: SetSchema<Values>;
375
+ /**
376
+ * Perform a validation against the current form object, and execute the successCallback if the validation pass
377
+ * otherwise it executes the errorCallback
378
+ *
379
+ */
380
+ submitForm: SubmitForm<Values>;
381
+ /**
382
+ *
383
+ * This method only validate the specified path. Do not check for fields that have the
384
+ * live validation active.
385
+ */
386
+ validate: Validate<Values>;
387
+ /**
388
+ *
389
+ * This method only validate the specified paths. Do not check for fields that have the
390
+ * live validation active.
391
+ */
392
+ validateAll: ValidateAll<Values>;
393
+ /**
394
+ * This method validates the entire form and set the corresponding errors if any.
395
+ *
396
+ */
397
+ validateForm: ValidateForm<Partial<Values>>;
398
+ /**
399
+ *
400
+ * This method update the form state writing $value into the $path, setting isDirty to true.
401
+ *
402
+ * After writing, it validates all the paths contained into $pathsToValidate (if any)
403
+ * and all the fields that have the live validation active.
404
+ */
405
+ write: Write<Values>;
406
+ /**
407
+ *
408
+ *
409
+ * This method takes an array of [path, value] and update the form state writing
410
+ * all those values into the specified paths.
411
+ *
412
+ * It set isDirty to true.
413
+ *
414
+ * After writing, it validate all the paths contained into $pathToValidate and all
415
+ * the fields that have the live validation active.
416
+ */
417
+ writeAll: WriteAll<Values>;
418
+ };
@@ -0,0 +1,11 @@
1
+ import { GenericCallback, InitialValues, SetError, Writer } from './types';
2
+ /**
3
+ * useExecuteCallbacks
4
+ *
5
+ * This hook is meant to give a simple way to make sure that callbacks are called only once,
6
+ * even if they are called inside React hooks like useEffect or setState.
7
+ *
8
+ *
9
+ */
10
+ declare const _default: <Values extends InitialValues>(writer: Writer<Values>, setError: SetError) => (cb?: GenericCallback<Partial<Values>>) => void;
11
+ export default _default;
@@ -0,0 +1,7 @@
1
+ import { FormbitObject, InitialValues, ValidationSchema } from './types';
2
+ type UseFormbitParams<Values extends InitialValues> = {
3
+ initialValues?: Partial<Values>;
4
+ yup: ValidationSchema<Values>;
5
+ };
6
+ declare const _default: <Values extends InitialValues>({ initialValues, yup: schema }: UseFormbitParams<Values>) => FormbitObject<Values>;
7
+ export default _default;
@@ -0,0 +1,2 @@
1
+ import { Form, InitialValues, ValidateOptions, ValidationFormbitError, ValidationSchema } from './types';
2
+ export declare const validateSyncAll: <Values extends InitialValues>(paths: string[], schema: ValidationSchema<Values>, form: Form, options?: ValidateOptions) => ValidationFormbitError[];
package/package.json ADDED
@@ -0,0 +1,90 @@
1
+ {
2
+ "name": "@radicalbit/formbit",
3
+ "version": "1.0.0",
4
+ "description": "Lightweight state form library",
5
+ "author": "https://github.com/radicalbit",
6
+ "license": "MIT",
7
+ "repository": "https://github.com/radicalbit/formbit",
8
+ "main": "dist/index.js",
9
+ "module": "dist/index.modern.js",
10
+ "source": "src/index.ts",
11
+ "type": "module",
12
+ "engines": {
13
+ "node": ">=10"
14
+ },
15
+ "scripts": {
16
+ "build": "microbundle-crl --no-compress --format modern,cjs",
17
+ "start": "microbundle-crl watch --no-compress --format modern,cjs",
18
+ "prepare": "run-s build && husky",
19
+ "test": "run-s test:unit test:lint test:build",
20
+ "test:build": "run-s build",
21
+ "test:lint": "eslint \"**/*.{ts,tsx}\"",
22
+ "test:unit": "cross-env CI=1 react-scripts test --env=jsdom",
23
+ "test:watch": "react-scripts test --env=jsdom",
24
+ "test:coverage": "cross-env CI=1 react-scripts test --coverage",
25
+ "predeploy": "cd example && yarn install && yarn run build",
26
+ "deploy": "gh-pages -d example/build",
27
+ "yalc:publish": "yalc publish --push --sig",
28
+ "docs:gen": "typedoc --excludePrivate --plugin typedoc-plugin-markdown --hideInPageTOC true --hideBreadcrumbs true --hidePageTitle true --out docs src/types/index.ts",
29
+ "docs:merge": "node scripts/readme-merge.js",
30
+ "docs:toc": "doctoc --maxlevel 3 README.md --github",
31
+ "docs:clean": "rimraf docs",
32
+ "docs": "yarn docs:gen && yarn docs:merge && yarn docs:toc && yarn docs:clean"
33
+ },
34
+ "peerDependencies": {
35
+ "lodash": "^4.0.0",
36
+ "react": "^18.2.0",
37
+ "yup": "^1.4.0"
38
+ },
39
+ "devDependencies": {
40
+ "@babel/plugin-proposal-private-property-in-object": "^7.21.11",
41
+ "@testing-library/react": "^14.2.2",
42
+ "@types/jest": "^29.5.12",
43
+ "@types/lodash": "^4.0.0",
44
+ "@types/react": "^18.2.71",
45
+ "@types/react-dom": "^18.2.22",
46
+ "@typescript-eslint/eslint-plugin": "^7.4.0",
47
+ "@typescript-eslint/parser": "^7.4.0",
48
+ "babel-eslint": "^10.0.3",
49
+ "cross-env": "^7.0.2",
50
+ "doctoc": "^2.2.1",
51
+ "eslint": "^8.57.0",
52
+ "eslint-config-prettier": "^9.1.0",
53
+ "eslint-config-react-app": "^7.0.1",
54
+ "eslint-config-standard": "^17.1.0",
55
+ "eslint-config-standard-react": "^13.0.0",
56
+ "eslint-plugin-import": "^2.29.1",
57
+ "eslint-plugin-jest": "^27.9.0",
58
+ "eslint-plugin-n": "^16.6.2",
59
+ "eslint-plugin-node": "^11.0.0",
60
+ "eslint-plugin-prettier": "^3.1.1",
61
+ "eslint-plugin-promise": "^4.2.1",
62
+ "eslint-plugin-react": "^7.17.0",
63
+ "eslint-plugin-react-refresh": "^0.4.7",
64
+ "eslint-plugin-sonarjs": "^0.25.0",
65
+ "eslint-plugin-standard": "^4.0.1",
66
+ "gh-pages": "^2.2.0",
67
+ "husky": "^9.0.11",
68
+ "microbundle-crl": "^0.13.11",
69
+ "npm-run-all": "^4.1.5",
70
+ "react": "18.2.0",
71
+ "react-dom": "18.2.0",
72
+ "react-scripts": "5.0.1",
73
+ "rimraf": "^5.0.5",
74
+ "typedoc": "^0.25.12",
75
+ "typedoc-plugin-markdown": "^3.17.1",
76
+ "typescript": "^5.4.3",
77
+ "typescript-eslint": "^7.4.0"
78
+ },
79
+ "dependencies": {
80
+ "yup": "^1.4.0"
81
+ },
82
+ "resolutions": {
83
+ "**/typescript": "^5.4.3",
84
+ "**/@typescript-eslint/eslint-plugin": "^5.4.3",
85
+ "**/@typescript-eslint/parser": "^5.4.3"
86
+ },
87
+ "files": [
88
+ "dist"
89
+ ]
90
+ }