formoose
Version:
Schema-based run time validation engine, made to integrate back and front-end validations using Mongoose like schemas.
1 lines • 46.2 kB
Source Map (JSON)
{"version":3,"file":"index.esm.mjs","sources":["../src/custom-errors/FormooseError/FormooseError.ts","../src/custom-errors/ErrorHandler/ErrorHandler.ts","../src/tools/checkIfBelongsToSchema/checkIfBelongsToSchema.validation.ts","../src/custom-errors/ErrorCodes/ErrorCodes.ts","../src/validators/isString/isString.ts","../src/validators/isArray/isArray.ts","../src/validators/isEmpty/isEmpty.ts","../src/validators/isNumber/isNumber.ts","../src/validators/isBoolean/isBoolean.ts","../src/validators/matchValidate/matchValidate.ts","../src/validators/matchEnum/matchEnum.ts","../src/validators/maxLength/maxLength.ts","../src/validators/minLength/minLength.ts","../src/core/TypeChecker/TypeChecker.ts","../src/core/RequiredChecker/RequiredChecker.ts","../src/core/MinLengthChecker/MinLengthChecker.ts","../src/core/MaxLengthChecker/MaxLengthChecker.ts","../src/core/CustomValidate/CustomValidate.ts","../src/core/EnumChecker/EnumChecker.ts","../src/core/EnsureSchema/EnsureSchema.ts","../src/core/Validate/Validate.ts","../src/core/Formoose/Formoose.ts","../src/tools/cleanError/cleanError.ts","../src/tools/convertModelToForm/convertModelToForm.ts","../src/tools/setMessage/setMessage.ts","../src/tools/setError/setError.ts","../src/tools/setValue/setValue.ts","../src/tools/handleFieldChange/handleFieldChange.ts","../src/tools/getModel/getModel.ts","../src/tools/validateAllFieldsSync/validateAllFieldsSync.ts","../src/tools/validateOneField/validateOneField.ts","../src/tools/getMaxLength/getMaxLength.ts","../src/tools/updateFormDataValues/updateFormDataValues.ts","../src/tools/getSimpleObject/getSimpleObject.ts","../src/tools/mountFormState/MountFormState.ts","../src/models/SupportedTypes.enum.ts","../src/hooks/useFormoose/useFormoose.tsx"],"sourcesContent":["import { CustomError } from '@/models';\nimport { ErrorCodes } from '../ErrorCodes';\n\n/**\n * @class FormooseError\n * @category Custom Errors\n */\nexport class FormooseError extends Error implements CustomError {\n public message: string;\n public field: string | undefined;\n public translatedMessageKey: ErrorCodes | undefined | string;\n public translatedMessageInterpolators: any | undefined;\n\n constructor(\n message?: string,\n field?: string | undefined,\n translatedMessageKey?: ErrorCodes | undefined | string,\n translatedMessageInterpolators?: any | undefined\n ) {\n super(message);\n Object.setPrototypeOf(this, FormooseError.prototype);\n this.name = 'FormooseError';\n this.message = message || 'Unxpected validation error detected by Formoose.';\n this.field = field;\n this.translatedMessageKey = translatedMessageKey;\n this.translatedMessageInterpolators = translatedMessageInterpolators;\n }\n}\n","import { ErrorCodes } from '../ErrorCodes';\nimport { FormooseError } from '../FormooseError';\n\n/**\n * @category Custom Errors\n * @throws FormooseError\n */\nexport class ErrorHandler {\n /**\n * Throws a Custom Error to be used on fields and validation process\n * @throws {FormooseError}\n */\n public static throw(\n message: string,\n fieldName?: string,\n translatedMessageKey?: ErrorCodes | string,\n translatedMessageInterpolators = {}\n ): never {\n throw new FormooseError(message, fieldName, translatedMessageKey, translatedMessageInterpolators);\n }\n}\n","import { Schema } from 'src/models';\nimport { ErrorHandler } from '../../custom-errors/ErrorHandler';\n\n/**\n * checkIfBelongsToSchema\n * @category Tools\n * @param {string[]} props Properties to check existence on Schema\n * @param {Schema} schema\n * @throws {FormooseError} When a property is not found on Schema\n * @returns {boolean}\n */\nexport const checkIfBelongsToSchema = (props: string[], schema: Schema): boolean => {\n let errorFound = '';\n\n props.map((propToCheck) => {\n const doesNotHasPropertyOnSchema = !Object.prototype.hasOwnProperty.call(schema, propToCheck);\n\n if (doesNotHasPropertyOnSchema) {\n errorFound = `${propToCheck} not found on Schema.`;\n }\n\n return errorFound;\n });\n\n if (errorFound !== '') {\n ErrorHandler.throw(errorFound);\n }\n\n return errorFound === '';\n};\n","/**\n * @category Custom Errors\n */\nexport enum ErrorCodes {\n 'alphabetical-chars-only' = 'alphabetical-chars-only',\n 'is-not-a-boolean' = 'is-not-a-boolean',\n 'is-empty' = 'is-empty',\n 'is-not-a-number' = 'is-not-a-number',\n 'does-not-match-enum' = 'does-not-match-enum',\n 'chars-limit-exceeded' = 'chars-limit-exceeded',\n 'chars-lenght-is-too-short' = 'chars-lenght-is-too-short',\n 'is-not-an-array' = 'is-not-an-array',\n 'failed-custom-validate' = 'failed-custom-validate'\n}\n","import { ErrorCodes } from '@/custom-errors';\nimport { ErrorHandler } from '../../custom-errors/ErrorHandler';\n\n/**\n * @category Validators\n * @param {string} fieldValue Value to be validated\n * @param {string} fieldName Form Field where error happened\n * @throws {FormooseError} Throws Exception when invalid\n * @returns {boolean}\n */\nexport function isString(fieldValue: string, fieldName: string): boolean {\n if (typeof fieldValue !== 'string') {\n ErrorHandler.throw(\n `String expected, type sent: ${typeof fieldValue} - on field: ${fieldName}`,\n fieldName,\n ErrorCodes['alphabetical-chars-only'],\n { fieldName, fieldValue }\n );\n }\n\n return true;\n}\n","import { ErrorCodes, ErrorHandler } from '@/custom-errors';\n\n/**\n * @category Validators\n * @param {string} fieldValue Value to be validated\n * @param {string} fieldName Field name of where error happened\n * @throws {FormooseError} Throws Exception when invalid\n */\nexport function isArray(fieldValue: any, fieldName: string): boolean {\n if (!Array.isArray(fieldValue)) {\n ErrorHandler.throw(\n `Array expected, type sent: ${typeof fieldValue} - on field: ${fieldName}`,\n fieldName,\n ErrorCodes['is-not-an-array'],\n { fieldName, fieldValue }\n );\n }\n return true;\n}\n","import { ErrorCodes, ErrorHandler } from '@/custom-errors';\n\n/**\n * @category Validators\n * @param {string} fieldValue Value to be validated\n * @param {string} fieldName Form Field where error happened\n * @throws {FormooseError} Throws Exception when invalid\n * @returns {boolean}\n */\nexport function isEmpty(fieldValue: any, fieldName: string): boolean {\n if (fieldValue === undefined || fieldValue === null || fieldValue === '' || fieldValue.length < 1) {\n ErrorHandler.throw(\n `Required field \"${fieldName}\" is empty, sent type '${typeof fieldValue}' with value: '${fieldValue}' - on field: ${fieldName}`,\n fieldName,\n ErrorCodes['is-empty'],\n { fieldName, fieldValue }\n );\n }\n return true;\n}\n","import { ErrorCodes, ErrorHandler } from '@/custom-errors';\n\n/**\n * @category Validators\n * @param {string} fieldValue Value to be validated\n * @param {string} fieldName Form Field where error happened\n * @throws {FormooseError} Throws Exception when invalid\n * @returns {boolean}\n */\nexport function isNumber(fieldValue: any, fieldName: string): boolean {\n if (typeof fieldValue !== 'number') {\n ErrorHandler.throw(\n `Number expected, type sent: ${typeof fieldValue} - on field: ${fieldName}`,\n fieldName,\n ErrorCodes['is-not-a-number'],\n { fieldName, fieldValue }\n );\n }\n\n return true;\n}\n","import { ErrorCodes, ErrorHandler } from '@/custom-errors';\n\n/**\n * @category Validators\n * @param {string} fieldValue Value to be validated\n * @param {string} fieldName Form Field where error happened\n * @throws {FormooseError} Throws Exception when invalid\n */\nexport function isBoolean(fieldValue: any, fieldName: string): boolean {\n if (typeof fieldValue !== 'boolean') {\n ErrorHandler.throw(\n `Expected type boolean, sent '${typeof fieldValue}' - on field: ${fieldName}`,\n fieldName,\n ErrorCodes['is-not-a-boolean'],\n { fieldName, fieldValue }\n );\n }\n\n return true;\n}\n","import { ErrorCodes, ErrorHandler } from '@/custom-errors';\nimport { SchemaItem } from '@/models';\n\n/**\n * matchValidate\n * @category Validators\n * @param {any} fieldValue Field Value to be validated\n * @param {SchemaItem} schemaItem The field/item configuration over the Schema\n * @param {string} fieldName the name of the field being validated\n * @throws {FormooseError} Throws Exception when invalid\n * @returns {boolean}\n */\nexport function matchValidate(fieldValue: any, schemaItem: SchemaItem, fieldName: string): boolean {\n const { validate } = schemaItem;\n\n if (!validate?.validator(fieldValue)) {\n const defaultMessage = `Custom Validation failed on field: ${fieldName}`;\n\n ErrorHandler.throw(\n validate?.message || defaultMessage,\n fieldName,\n validate?.message || ErrorCodes['failed-custom-validate'],\n { fieldName, fieldValue }\n );\n }\n\n return true;\n}\n","import { ErrorCodes, ErrorHandler } from '@/custom-errors';\n\n/**\n * @category Validators\n * @param {string} fieldValue Value to be validated\n * @param {string} fieldName Form Field where error happened\n * @param {enum} enumObject Enumerable with possible values\n * @throws {FormooseError} Throws Exception when invalid\n * @returns {boolean}\n */\nexport function matchEnum(fieldValue: string, enumObject: Record<string, string>, fieldName: string): boolean {\n const existsInEnum = Object.values(enumObject).indexOf(fieldValue) > -1;\n\n if (!existsInEnum) {\n ErrorHandler.throw(\n `The value '${fieldValue}' isn't listed in the possible enumerable list '${JSON.stringify(\n enumObject\n )}' - on field: ${fieldName}`,\n fieldName,\n ErrorCodes['does-not-match-enum'],\n { fieldName, fieldValue }\n );\n }\n\n return true;\n}\n","import { ErrorCodes, ErrorHandler } from '@/custom-errors';\nimport { isString } from '../isString';\n\n/**\n * @category Validators\n * @param {string} fieldValue Value to be validated\n * @param {string} fieldName Form Field where error happened\n * @param {number} size Length quantifier to be used on validation\n * @throws {FormooseError} Throws Exception when invalid\n * @returns {boolean}\n */\nexport function maxLength(fieldValue: any, size: number, fieldName: string): boolean {\n const stringHelper = String(fieldValue);\n\n if (isString(fieldValue, fieldName) && stringHelper.length > size) {\n ErrorHandler.throw(\n `String exceed the size of ${size} characters with ${stringHelper.length} - on field: ${fieldName}`,\n fieldName,\n ErrorCodes['chars-limit-exceeded'],\n { fieldValue, size, length: fieldValue.length, fieldName }\n );\n }\n\n return true;\n}\n","import { ErrorCodes, ErrorHandler } from '@/custom-errors';\nimport { isString } from '../isString';\n\n/**\n * @category Validators\n * @param {any} fieldValue Value to be validated\n * @param {string} fieldName Form Field where error happened\n * @param {number} size Length quantifier to be used on validation\n * @throws {FormooseError} Throws Exception when invalid\n * @returns {boolean}\n */\nexport function minLength(fieldValue: any, size: number, fieldName: string): boolean {\n const stringHelper = String(fieldValue);\n\n if (isString(fieldValue, fieldName) && stringHelper.length < size) {\n ErrorHandler.throw(\n `String with length of ${stringHelper.length}, expected at least ${size} characters - on field: ${fieldName}`,\n fieldName,\n ErrorCodes['chars-lenght-is-too-short'],\n { fieldValue, size, length: fieldValue.length, fieldName }\n );\n }\n\n return true;\n}\n","import { SupportedTypesEnum } from '@/models';\nimport { isString, isNumber, isBoolean, isArray } from '@/validators';\nimport { DataChecker } from 'src/models/DataChecker';\n\nexport const getTypeValidator = (primitiveTypeName: SupportedTypesEnum) => {\n const types = {\n Array: isArray,\n Boolean: isBoolean,\n Number: isNumber,\n String: isString,\n default: () => null\n };\n\n return types[primitiveTypeName] || types.default;\n};\n\n/**\n * @description Checks if type is supported\n * @category Validators\n */\nexport const TypeChecker = (dataChecker: DataChecker) => {\n const { fieldValue, schemaItem, fieldName } = dataChecker;\n\n getTypeValidator(schemaItem.type)(fieldValue, fieldName);\n};\n","import { DataChecker } from '@/models';\nimport { isEmpty } from '@/validators';\n\n/**\n * @description Checks if required value is fulfilled\n * @category Validators\n */\nexport const RequiredChecker = (dataChecker: DataChecker) => {\n const { fieldValue, schemaItem, fieldName } = dataChecker;\n\n if (schemaItem?.required) {\n isEmpty(fieldValue, fieldName);\n }\n};\n","import { DataChecker } from '@/models';\nimport { minLength } from '../../validators';\n\n/**\n * @description Checks if the value has the minimum length set on schema\n * @category Validators\n * @param {DataChecker} dataChecker\n */\nexport const MinLengthChecker = (dataChecker: DataChecker) => {\n const { fieldValue, schemaItem, fieldName } = dataChecker;\n\n if (schemaItem?.min) {\n minLength(fieldValue, schemaItem.min, fieldName);\n }\n};\n","import { DataChecker } from 'src/models/DataChecker';\nimport { maxLength } from '../../validators';\n\n/**\n * @description Checks if the value exceeds the Maximum length set on schema\n * @category Validators\n */\nexport const MaxLengthChecker = (dataChecker: DataChecker) => {\n const { fieldValue, schemaItem, fieldName } = dataChecker;\n\n if (schemaItem?.max) {\n maxLength(fieldValue, schemaItem.max, fieldName);\n }\n};\n","import { DataChecker } from 'src/models/DataChecker';\nimport { matchValidate } from '../../validators';\n\n/**\n * @category Validators\n * @throws FormooseError\n */\nexport const CustomValidate = (dataChecker: DataChecker) => {\n const { fieldValue, schemaItem, fieldName } = dataChecker;\n\n if (schemaItem?.validate) {\n matchValidate(fieldValue, schemaItem, fieldName);\n }\n};\n","import { DataChecker } from 'src/models/DataChecker';\nimport { matchEnum } from '../../validators';\n\n/**\n * @description Checks if the value is one of the possible values listed on Enum\n * @category Validators\n * @throws FormooseError\n */\nexport const EnumChecker = (dataChecker: DataChecker) => {\n const { fieldValue, schemaItem, fieldName } = dataChecker;\n\n if (schemaItem?.enum) {\n matchEnum(fieldValue, schemaItem.enum, fieldName);\n }\n};\n","import { CustomValidate } from '../CustomValidate';\nimport { EnumChecker } from '../EnumChecker';\nimport { MaxLengthChecker } from '../MaxLengthChecker';\nimport { MinLengthChecker } from '../MinLengthChecker';\nimport { RequiredChecker } from '../RequiredChecker';\nimport { TypeChecker } from '../TypeChecker';\nimport { DataChecker } from 'src/models/DataChecker';\n\n/**\n * @description Runs all validations needed to ensure the whole schema\n * @category Validators\n * @throws FormooseError\n * @returns {boolean}\n */\nexport const EnsureSchema = (dataChecker: DataChecker): boolean | null => {\n const { required } = dataChecker.schemaItem;\n const { fieldValue } = dataChecker;\n const validationNotNeeded = !required && (fieldValue === undefined || fieldValue === '' || fieldValue === null);\n\n if (validationNotNeeded) {\n return null;\n }\n\n for (const prop in dataChecker.schemaItem) {\n if (Object.prototype.hasOwnProperty.call(dataChecker?.schemaItem, prop)) {\n if (prop === 'type') {\n TypeChecker(dataChecker);\n }\n\n if (prop === 'required') {\n RequiredChecker(dataChecker);\n }\n\n if (prop === 'min') {\n MinLengthChecker(dataChecker);\n }\n\n if (prop === 'max') {\n MaxLengthChecker(dataChecker);\n }\n\n if (prop === 'validate') {\n CustomValidate(dataChecker);\n }\n\n if (prop === 'enum') {\n EnumChecker(dataChecker);\n }\n }\n }\n\n return true;\n};\n","import { EnsureSchema } from '../EnsureSchema';\nimport { checkIfBelongsToSchema } from '../../tools/checkIfBelongsToSchema';\nimport { Schema } from 'src/models';\n\n/**\n * Main validator method, returns a Promise that throws an error\n * when something is invalid according to schema set up, or true when all validations are fine.\n * @category Validators\n * @param {Object} model the object that represents the model, with key and values to be validated e.g. { name: 'Emmanuel' }\n * @param {string[]} fieldNames list of fields to be validated\n * @param {Schema} schema The Mongoose like schema containing all validations\n * @throws {FormooseError} FormooseError\n */\nexport const Validate = (model: any, fieldNames: string[], schema: Schema) =>\n new Promise((resolve) => {\n checkIfBelongsToSchema(fieldNames, schema);\n\n for (let i = 0; i < fieldNames.length; i++) {\n EnsureSchema({\n fieldName: fieldNames[i],\n schemaItem: schema[fieldNames[i]],\n fieldValue: model[fieldNames[i]]\n });\n }\n\n resolve(true);\n });\n","/**\n * Formoose\n * @deprecated\n */\nexport class Formoose {\n /**\n * @constructor\n * @deprecated\n * @throws Error\n */\n constructor() {\n throw new Error('Instancing Formoose Class is deperacted. Please use the new hook useFormoose.');\n }\n}\n","import { FormState, StateSetter } from 'src/models';\n\n/**\n * Shared Method to Clean Errors in a specific Field of a Data Form integrated with domains\n * @category Tools\n * @alias tools/cleanError\n * @param {StateSetter} stateSetter\n * @param {string} field\n */\nexport function cleanError(stateSetter: StateSetter<FormState>, field: string) {\n stateSetter((state) => ({\n ...state,\n [field]: {\n ...state[field],\n error: null,\n message: null\n }\n }));\n}\n","import { FormState, PayloadFormat } from 'src/models';\n\n/**\n * Tranform a simple object, usually passed in json requests, in a form object\n * @category Tools\n * @alias tools/updateFormDataValues\n * @param formData All fields state from component\n * @param {PayloadFormat} model User Model Abstraction\n * @returns {FormState}\n */\nfunction convertModelToForm(model: PayloadFormat): FormState {\n const objectAdapter: FormState = {};\n\n Object.keys(model).forEach((key: string) => {\n objectAdapter[key] = {\n error: null,\n message: null,\n value: model[key]\n };\n });\n\n return objectAdapter;\n}\n\nexport default convertModelToForm;\n","import { FormState, StateSetter } from 'src/models';\n\n/**\n * Shared Method to Set a message in a specific Field\n * @category Tools\n * @alias tools/setMessage\n * @param {stateSetter} stateSetter\n * @param {string} field - The field to set the error\n * @param {string} message\n */\nfunction setMessage(stateSetter: StateSetter<FormState>, field: string, message: string) {\n stateSetter((state) => ({\n ...state,\n [field]: {\n ...state[field],\n message\n }\n }));\n}\n\nexport default setMessage;\n","/**\n * Shared Method to Set an error in a specific Field\n * @category Tools\n * @param {StateSetter} stateSetter\n * @param {string} fieldName The field to set the error\n * @param {FormooseError} error The error object coming from Validators\n * @param {FormooseTFunction} translation i18n t function\n */\nimport { CustomError, FormState, StateSetter } from 'src/models';\nimport { FormooseTFunction } from 'src/models/I18nTypes';\n\nexport function setError(\n stateSetter: StateSetter<FormState>,\n fieldName: string,\n error: CustomError,\n t: FormooseTFunction\n) {\n stateSetter((state: FormState) => ({\n ...state,\n [fieldName]: {\n ...state[fieldName],\n error,\n message: t(error?.translatedMessageKey, error?.translatedMessageInterpolators)\n }\n }));\n}\n","/**\n * Shared Method to change the value of a specific Field\n * @category Tools\n * @alias tools/setValue\n * @param {StateSetter} stateSetter\n * @param {string} field - The field to be validated\n * @param value\n */\nimport { FormState, StateSetter } from '@/models';\n\nexport function setValue(\n stateSetter: StateSetter<FormState>,\n field: string,\n value: string | number | Record<string, any>\n) {\n stateSetter((formState) => {\n return {\n ...formState,\n [field]: {\n ...formState[field],\n value\n }\n };\n });\n}\n","import { setValue } from '../setValue';\nimport { FormState, StateSetter } from 'src/models';\n\n/**\n * Shared Method to manipulate FieldChanges\n * @alias tools/handleFieldChange\n * @category Tools\n * @param {any} event Dom event\n * @param {stateSetter} stateSetter\n * @param {string} fieldName - The field to be validated\n */\nexport function handleFieldChange(event: any, fieldName: string, stateSetter: StateSetter<FormState>): void {\n const { target } = event;\n const { type } = target;\n let fieldValue = null;\n\n switch (type) {\n case 'radio':\n fieldValue = target.value;\n break;\n case 'checkbox':\n fieldValue = target.checked;\n break;\n default:\n fieldValue = target.value;\n break;\n }\n\n setValue(stateSetter, fieldName, fieldValue);\n}\n","import { FormState } from '@/models';\n\nexport function getModel(formState: FormState, fieldName: string): Record<string, string> {\n return {\n [fieldName]: formState[fieldName].value\n };\n}\n","import { getModel } from '../getModel';\nimport { cleanError } from '../cleanError';\nimport { setError } from '../setError';\nimport { Validate } from '@/core';\nimport { Schema, FormState, StateSetter } from '../../models';\nimport { FormooseTFunction } from '@/models';\n\n/**\n * Shared Method To validateAllFieldsSync Fields in a Form, returning if all them are valid or not\n * @category Tools\n * @alias tools/validateAll\n * @param schema\n * @param formData - All fields state from component\n * @param {Function} stateSetter\n * @param {FormooseTFunction} t i18n get translation method\n * @returns {Promise<any>}\n */\nfunction validateAllFieldsSync(\n schema: Schema,\n formData: FormState,\n stateSetter: StateSetter<FormState>,\n t: FormooseTFunction\n): Promise<boolean> {\n return new Promise((resolve, reject) => {\n const fakeFormData = Object.assign({}, formData);\n\n const fakeSetFormData = (fakeState) => {\n Object.assign(fakeFormData, fakeState(fakeFormData));\n return fakeFormData;\n };\n\n const promiseList = Object.keys(formData).map((field) =>\n Validate(getModel(formData, field), [field], schema)\n .then(() => {\n cleanError(fakeSetFormData, field);\n })\n .catch((error) => {\n setError(fakeSetFormData, field, error, t);\n throw error;\n })\n );\n\n Promise.all(promiseList)\n .then(() => {\n stateSetter(fakeFormData);\n resolve(true);\n })\n .catch((e) => {\n console.error(e);\n stateSetter(fakeFormData);\n reject({\n formData: fakeFormData,\n message: 'Invalid Form',\n result: false\n });\n });\n });\n}\n\nexport default validateAllFieldsSync;\n","import { getModel } from '../getModel';\nimport { cleanError } from '../cleanError';\nimport { setError } from '../setError';\nimport { Validate } from '@/core';\nimport { Schema, FormState, StateSetter, FormooseTFunction } from '@/models';\n\n/**\n * Method to validate only one field and set related errors and messages\n * @param {string} fieldName\n * @param {Schema} schema\n * @param {FormState} formData\n * @param {StateSetter} stateSetter\n * @param {FormooseTFunction} t\n * @returns {*}\n */\nconst validateOneField = (\n fieldName: string,\n schema: Schema,\n formData: FormState,\n stateSetter: StateSetter<FormState>,\n t: FormooseTFunction\n): Promise<boolean> => {\n return new Promise((resolve) => {\n Validate(getModel(formData, fieldName), [fieldName], schema)\n .then(() => {\n cleanError(stateSetter, fieldName);\n resolve(true);\n })\n .catch((error) => {\n console.error(error);\n setError(stateSetter, fieldName, error, t);\n resolve(false);\n });\n });\n};\n\nexport default validateOneField;\n","import { Schema } from 'src/models';\n\n/**\n * @category Tools\n */\nfunction getMaxLength(fieldName: string, schema: Schema) {\n return schema[fieldName]?.max;\n}\n\nexport default getMaxLength;\n","import { FormState, PayloadFormat } from '../../models';\n\n/**\n * Updates all form data based on an User\n * @category Tools\n * @alias tools/updateFormDataValues\n * @param formData All fields state from component\n * @param {PayloadFormat} model User Model Abstraction\n * @returns {void}\n */\nfunction updateFormDataValues(formData: FormState, model: PayloadFormat) {\n const objectAdapter = {};\n\n Object.keys(model).map((key) => {\n objectAdapter[key] = { value: model[key] };\n });\n\n Object.assign(formData, objectAdapter);\n}\n\nexport default updateFormDataValues;\n","import { FormState } from 'src/models';\n\n/**\n * Usually an FormState contains complex objects to each field, with error, value and message\n * This method returns a simpler object, with keys and values only\n * @param {FormState} formData\n * @param {string[]} fieldsToSkip The list of field to remove from result\n * @param {boolean} getEmptyValuesToo returns empty fields too\n */\nfunction getSimpleObject(\n formData: FormState,\n fieldsToSkip: string[] | null = null,\n getEmptyValuesToo: boolean = false\n) {\n const objectAdapter = {};\n const allFieldNames = Object.keys(formData);\n\n allFieldNames.map((fieldName: string) => {\n const fieldHasAnyValue = formData[fieldName].value !== '' && formData[fieldName].value !== undefined;\n if (getEmptyValuesToo || fieldHasAnyValue) {\n objectAdapter[fieldName] = formData[fieldName].value;\n }\n });\n\n if (fieldsToSkip) {\n fieldsToSkip.forEach((fieldName: string) => {\n delete objectAdapter[fieldName];\n });\n }\n\n return objectAdapter;\n}\n\nexport default getSimpleObject;\n","import { Schema, FormState } from 'src/models';\n\nexport const mountFormState = (schema: Schema): FormState => {\n const formData: FormState = {};\n\n Object.keys(schema).map((key: string) => {\n return (formData[key] = {\n error: undefined,\n message: undefined,\n value: ''\n });\n });\n\n return formData;\n};\n","/**\n * @category Types and Interfaces\n */\nexport enum SupportedTypesEnum {\n Array,\n Boolean,\n Number,\n String\n}\n","import { useCallback, useState, useEffect, ChangeEvent } from 'react';\nimport { ChangeEventOrName, CustomError, FormooseTFunction, PayloadFormat, Schema } from 'src/models';\nimport {\n mountFormState,\n handleFieldChange,\n validateOneField,\n convertModelToForm,\n cleanError,\n getMaxLength,\n getModel,\n getSimpleObject,\n setMessage,\n setValue,\n updateFormDataValues,\n validateAllFieldsSync,\n setError\n} from '@/tools';\nimport { UseFormooseReturn } from 'src/models/UseFormooseReturn';\n\nlet validateAfterAllTimer: NodeJS.Timeout | number | null = null;\n\nconst getFieldName = (fieldNameOrEvent: ChangeEventOrName) => {\n if (typeof fieldNameOrEvent === 'string') {\n return fieldNameOrEvent;\n }\n\n return fieldNameOrEvent?.target?.name;\n};\n\nexport function useFormoose<State>(schema: Schema, t: FormooseTFunction): UseFormooseReturn<State> {\n const [formData, setFormData] = useState(mountFormState(schema));\n const [lastChangedField, setLastChangedField] = useState<{\n fieldName: string;\n fieldValue: any;\n }>();\n\n const tools = {\n cleanError: (fieldNameOrEvent: ChangeEventOrName): void => {\n cleanError(setFormData, getFieldName(fieldNameOrEvent));\n },\n\n convertModelToForm,\n\n getMaxLength: (fieldName: string) => getMaxLength(fieldName, schema),\n\n getModel: (fieldName: string) => getModel(formData, fieldName),\n\n getSimpleObject: (fieldsToSkip: string[], getEmptyValuesToo: boolean) =>\n getSimpleObject(formData, fieldsToSkip, getEmptyValuesToo),\n\n handleFieldChange: (event: ChangeEvent<HTMLInputElement | HTMLSelectElement>) => {\n const fieldName = event?.target?.name;\n handleFieldChange(event, fieldName, setFormData);\n setLastChangedField({ fieldName, fieldValue: event.target.value });\n },\n\n mountFormState: () => mountFormState(schema),\n\n setError: (fieldName: string, error: CustomError) => setError(setFormData, fieldName, error, t),\n\n setMessage: (fieldName: string, message: string) => setMessage(setFormData, fieldName, message),\n\n setValue: (fieldName: string, fieldValue: any) => setValue(setFormData, fieldName, fieldValue),\n\n updateFormDataValues: (updatedModel: PayloadFormat) => updateFormDataValues(formData, updatedModel),\n\n validateAllFieldsSync: () => validateAllFieldsSync(schema, formData, setFormData, t),\n\n validateOneField: async (fieldNameOrEvent: ChangeEventOrName) => {\n return await validateOneField(getFieldName(fieldNameOrEvent), schema, formData, setFormData, t);\n }\n };\n\n const setProps = useCallback(\n (fieldName: string) => {\n return {\n name: fieldName,\n value: formData[fieldName].value,\n onChange: tools.handleFieldChange,\n onFocus: tools.cleanError,\n onBlur: tools.validateOneField\n };\n },\n [tools]\n );\n\n useEffect(() => {\n clearTimeout(validateAfterAllTimer);\n\n if (lastChangedField?.fieldName) {\n validateAfterAllTimer = setTimeout(() => {\n tools.validateOneField(lastChangedField.fieldName);\n }, 500);\n }\n }, [lastChangedField]);\n\n return {\n formData,\n setFormData,\n setProps,\n ...tools\n } as unknown as UseFormooseReturn<State>;\n}\n"],"names":[],"mappings":"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"}