@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.
- package/LICENSE +21 -0
- package/README.md +1180 -0
- package/dist/__tests__/check.test.d.ts +1 -0
- package/dist/__tests__/error.test.d.ts +1 -0
- package/dist/__tests__/initialize.test.d.ts +1 -0
- package/dist/__tests__/is-form-invalid.test.d.ts +1 -0
- package/dist/__tests__/is-form-valid.test.d.ts +1 -0
- package/dist/__tests__/live-validation.test.d.ts +1 -0
- package/dist/__tests__/remove.test.d.ts +1 -0
- package/dist/__tests__/reset-form.test.d.ts +1 -0
- package/dist/__tests__/set-error.test.d.ts +1 -0
- package/dist/__tests__/set-schema.test.d.ts +1 -0
- package/dist/__tests__/submit-form.test.d.ts +1 -0
- package/dist/__tests__/use-execute-callbacks.test.d.ts +1 -0
- package/dist/__tests__/use-formbit-context.test.d.ts +1 -0
- package/dist/__tests__/validate-all.test.d.ts +1 -0
- package/dist/__tests__/validate-form.test.d.ts +1 -0
- package/dist/__tests__/validate-sync-all.test.d.ts +1 -0
- package/dist/__tests__/validate.test.d.ts +1 -0
- package/dist/__tests__/write-all.test.d.ts +1 -0
- package/dist/__tests__/write.test.d.ts +1 -0
- package/dist/formbit-context.d.ts +9 -0
- package/dist/helpers/constants.d.ts +9 -0
- package/dist/helpers/obj-leaves.d.ts +3 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +658 -0
- package/dist/index.js.map +1 -0
- package/dist/index.modern.js +654 -0
- package/dist/index.modern.js.map +1 -0
- package/dist/types/helpers.d.ts +2 -0
- package/dist/types/index.d.ts +418 -0
- package/dist/use-execute-callbacks.d.ts +11 -0
- package/dist/use-formbit.d.ts +7 -0
- package/dist/validate-sync-all.d.ts +2 -0
- 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,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
|
+
}
|