UNPKG

48.5 kBSource Map (JSON)View Raw
1{"version":3,"file":"formsy-react.cjs.production.min.js","sources":["../src/utils.ts","../src/validationRules.ts","../src/FormsyContext.ts","../src/withFormsy.ts","../src/Formsy.ts"],"sourcesContent":["import { isPlainObject } from 'lodash';\n\nimport { ValidationError, Validations, Values } from './interfaces';\n\nexport function isArray(value: unknown): value is unknown[] {\n return Array.isArray(value);\n}\n\nexport function isObject(value: unknown): value is object {\n return isPlainObject(value);\n}\n\nexport function isTypeUndefined(value: unknown): value is undefined {\n return typeof value === 'undefined';\n}\n\nexport function isDate(value: unknown): value is Date {\n return value instanceof Date;\n}\n\nexport function isFunction(value: unknown): value is Function {\n return value !== null && typeof value === 'function';\n}\n\nexport function isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\nexport function isNumber(value: unknown): value is number {\n return typeof value === 'number';\n}\n\nexport function isRegex(value: unknown): value is RegExp {\n return value instanceof RegExp;\n}\n\nexport function isValueStringEmpty(value: string): boolean {\n return value === '';\n}\n\nexport function isValueNullOrUndefined(value: unknown): boolean {\n return value === null || value === undefined;\n}\n\nexport function isValueUndefined(value: unknown): boolean {\n return value === undefined;\n}\n\nexport function noop() {\n // do nothing.\n}\n\nexport function protectAgainstParamReassignment(value: unknown) {\n // Clone objects to avoid accidental param reassignment\n if (isObject(value)) return { ...value };\n if (isArray(value)) return [...value];\n return value;\n}\n\nexport function isSame(a: unknown, b: unknown) {\n if (typeof a !== typeof b) {\n return false;\n }\n\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n\n return a.every((item, index) => isSame(item, b[index]));\n }\n\n if (isFunction(a) && isFunction(b)) {\n return a.toString() === b.toString();\n }\n\n if (isDate(a) && isDate(b)) {\n return a.toString() === b.toString();\n }\n\n if (isObject(a) && isObject(b)) {\n if (Object.keys(a).length !== Object.keys(b).length) {\n return false;\n }\n\n return Object.keys(a).every((key) => isSame(a[key], b[key]));\n }\n\n if (isRegex(a) && isRegex(b)) {\n return a.toString() === b.toString();\n }\n\n return a === b;\n}\n\ninterface RulesResult {\n errors: ValidationError[];\n failed: string[];\n success: string[];\n}\n\nexport function runRules<V>(\n value: V,\n currentValues: Values,\n validations: Validations<V>,\n validationRules: Validations<V>,\n) {\n const results: RulesResult = {\n errors: [],\n failed: [],\n success: [],\n };\n\n Object.keys(validations).forEach((validationName) => {\n const validationsVal = validations[validationName];\n const validationRulesVal = validationRules[validationName];\n const addToResults = (validation) => {\n if (isString(validation)) {\n results.errors.push(validation);\n results.failed.push(validationName);\n } else if (!validation) {\n results.failed.push(validationName);\n } else {\n results.success.push(validationName);\n }\n };\n\n if (validationRulesVal && isFunction(validationsVal)) {\n throw new Error(`Formsy does not allow you to override default validations: ${validationName}`);\n }\n\n if (!validationRulesVal && !isFunction(validationsVal)) {\n throw new Error(`Formsy does not have the validation rule: ${validationName}`);\n }\n\n if (isFunction(validationsVal)) {\n return addToResults(validationsVal(currentValues, value));\n }\n\n return addToResults(validationRulesVal(currentValues, value, validationsVal));\n });\n\n return results;\n}\n\nexport function throttle(callback, interval) {\n let enableCall = true;\n\n return function (...args) {\n if (!enableCall) return;\n\n enableCall = false;\n callback.apply(this, args);\n setTimeout(() => (enableCall = true), interval);\n };\n}\n","import { ValidationFunction, Values } from './interfaces';\nimport {\n isNumber,\n isString,\n isTypeUndefined,\n isValueNullOrUndefined,\n isValueStringEmpty,\n isValueUndefined,\n} from './utils';\n\nexport function isExisty<V>(value: V) {\n return !isValueNullOrUndefined(value);\n}\n\nexport function isEmpty<V>(value: V) {\n if (isString(value)) {\n return isValueStringEmpty(value);\n }\n if (isTypeUndefined(value)) {\n return false;\n }\n return isValueUndefined(value);\n}\n\nexport function isDefaultRequiredValue(value: unknown) {\n return isString(value) ? isValueStringEmpty(value) : isValueNullOrUndefined(value);\n}\n\nexport function matchRegexp<V>(_values: Values, value: V, regexp: RegExp) {\n return !isExisty(value) || isEmpty(value) || regexp.test(`${value}`);\n}\n\ninterface Validations<V> {\n [key: string]: ValidationFunction<V>;\n}\n\nconst REGEX_PATTERNS = {\n ALPHA: /^[A-Z]+$/i,\n ALPHANUMERIC: /^[0-9A-Z]+$/i,\n EMAIL: /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/i, // from http://emailregex.com/\n FLOAT: /^(?:[-+]?(?:\\d+))?(?:\\.\\d*)?(?:[eE][+-]?(?:\\d+))?$/,\n INT: /^(?:[-+]?(?:0|[1-9]\\d*))$/,\n NUMERIC: /^[-+]?(?:\\d*[.])?\\d+$/,\n SPECIAL_WORDS: /^[\\sA-ZÀ-ÖØ-öø-ÿ]+$/i,\n URL: /^(?:\\w+:)?\\/\\/([^\\s.]+\\.\\S{2}|localhost[:?\\d]*)\\S*$/i,\n WORDS: /^[A-Z\\s]+$/i,\n};\n\nconst validations: Validations<any> = {\n equals: <V>(_values, value: V, eql: V) => !isExisty(value) || isEmpty(value) || value === eql,\n equalsField: <V>(values, value: V, field: string) => value === values[field],\n isAlpha: <V>(values, value: V) => matchRegexp(values, value, REGEX_PATTERNS.ALPHA),\n isAlphanumeric: <V>(values, value: V) => matchRegexp(values, value, REGEX_PATTERNS.ALPHANUMERIC),\n isDefaultRequiredValue: <V>(_values, value: V) => isDefaultRequiredValue(value),\n isEmail: (values, value: string) => matchRegexp(values, value, REGEX_PATTERNS.EMAIL),\n isEmptyString: (_values, value: string) => isEmpty(value),\n isExisty: <V>(_values, value: V) => isExisty(value),\n isFalse: (_values, value: boolean | string) => value === false,\n isFloat: <V>(values, value: V) => matchRegexp(values, value, REGEX_PATTERNS.FLOAT),\n isInt: <V>(values, value: V) => matchRegexp(values, value, REGEX_PATTERNS.INT),\n isLength: (_values, value: string, length: number) => !isExisty(value) || isEmpty(value) || value.length === length,\n isNumeric: <V>(values, value: V) => isNumber(value) || matchRegexp(values, value, REGEX_PATTERNS.NUMERIC),\n isSpecialWords: <V>(values, value: V) => matchRegexp(values, value, REGEX_PATTERNS.SPECIAL_WORDS),\n isTrue: (_values, value: boolean | string) => value === true,\n isUndefined: <V>(_values, value: V) => isValueUndefined(value),\n isUrl: <V>(values, value: V) => matchRegexp(values, value, REGEX_PATTERNS.URL),\n isWords: <V>(values, value: V) => matchRegexp(values, value, REGEX_PATTERNS.WORDS),\n matchRegexp,\n maxLength: (_values, value: string, length: number) => !isExisty(value) || value.length <= length,\n minLength: (_values, value: string, length: number) => !isExisty(value) || isEmpty(value) || value.length >= length,\n};\n\nexport const addValidationRule = <V>(name: string, func: ValidationFunction<V>) => {\n validations[name] = func;\n};\n\nexport default validations;\n","import React from 'react';\nimport { FormsyContextInterface } from './interfaces';\n\nconst noFormsyErrorMessage = 'Could not find Formsy Context Provider. Did you use withFormsy outside <Formsy />?';\n\nconst throwNoFormsyProvider = () => {\n // istanbul ignore next\n throw new Error(noFormsyErrorMessage);\n};\n\nconst defaultValue = {\n attachToForm: throwNoFormsyProvider,\n detachFromForm: throwNoFormsyProvider,\n isFormDisabled: true,\n isValidValue: throwNoFormsyProvider,\n validate: throwNoFormsyProvider,\n runValidation: throwNoFormsyProvider,\n};\n\nexport default React.createContext<FormsyContextInterface>(defaultValue);\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport FormsyContext from './FormsyContext';\nimport {\n ComponentWithStaticAttributes,\n FormsyContextInterface,\n RequiredValidation,\n ValidationError,\n Validations,\n WrappedComponentClass,\n} from './interfaces';\n\nimport * as utils from './utils';\nimport { isString } from './utils';\nimport { isDefaultRequiredValue } from './validationRules';\n\n/* eslint-disable react/default-props-match-prop-types */\n\nconst convertValidationsToObject = <V>(validations: false | Validations<V>): Validations<V> => {\n if (isString(validations)) {\n return validations.split(/,(?![^{[]*[}\\]])/g).reduce((validationsAccumulator, validation) => {\n let args: string[] = validation.split(':');\n const validateMethod: string = args.shift();\n\n args = args.map((arg) => {\n try {\n return JSON.parse(arg);\n } catch (e) {\n return arg; // It is a string if it can not parse it\n }\n });\n\n if (args.length > 1) {\n throw new Error(\n 'Formsy does not support multiple args on string validations. Use object format of validations instead.',\n );\n }\n\n // Avoid parameter reassignment\n const validationsAccumulatorCopy: Validations<V> = { ...validationsAccumulator };\n validationsAccumulatorCopy[validateMethod] = args.length ? args[0] : true;\n return validationsAccumulatorCopy;\n }, {});\n }\n\n return validations || {};\n};\n\nexport const propTypes = {\n innerRef: PropTypes.func,\n name: PropTypes.string.isRequired,\n required: PropTypes.oneOfType([PropTypes.bool, PropTypes.object, PropTypes.string]),\n validations: PropTypes.oneOfType([PropTypes.object, PropTypes.string]),\n value: PropTypes.any, // eslint-disable-line react/forbid-prop-types\n};\n\nexport interface WrapperProps<V> {\n innerRef?: (ref: React.Ref<any>) => void;\n name: string;\n required?: RequiredValidation<V>;\n validationError?: ValidationError;\n validationErrors?: { [key: string]: ValidationError };\n validations?: Validations<V>;\n value?: V;\n}\n\nexport interface WrapperState<V> {\n [key: string]: unknown;\n formSubmitted: boolean;\n isPristine: boolean;\n isRequired: boolean;\n isValid: boolean;\n pristineValue: V;\n validationError: ValidationError[];\n value: V;\n}\n\nexport interface InjectedProps<V> {\n errorMessage: ValidationError;\n errorMessages: ValidationError[];\n hasValue: boolean;\n isFormDisabled: boolean;\n isFormSubmitted: boolean;\n isPristine: boolean;\n isRequired: boolean;\n isValid: boolean;\n isValidValue: (value: V) => boolean;\n ref?: React.Ref<any>;\n resetValue: () => void;\n setValidations: (validations: Validations<V>, required: RequiredValidation<V>) => void;\n setValue: (value: V, validate?: boolean) => void;\n showError: boolean;\n showRequired: boolean;\n}\n\nexport interface WrapperInstanceMethods<V> {\n getErrorMessage: () => null | ValidationError;\n getErrorMessages: () => ValidationError[];\n getValue: () => V;\n isFormDisabled: () => boolean;\n isFormSubmitted: () => boolean;\n isValid: () => boolean;\n isValidValue: (value: V) => boolean;\n setValue: (value: V, validate?: boolean) => void;\n}\n\nexport type PassDownProps<V> = WrapperProps<V> & InjectedProps<V>;\n\nfunction getDisplayName(component: WrappedComponentClass) {\n return component.displayName || component.name || (utils.isString(component) ? component : 'Component');\n}\n\nexport default function withFormsy<T, V>(\n WrappedComponent: React.ComponentType<T & PassDownProps<V>>,\n): React.ComponentType<Omit<T & WrapperProps<V>, keyof InjectedProps<V>>> {\n class WithFormsyWrapper\n extends React.Component<T & WrapperProps<V> & FormsyContextInterface, WrapperState<V>>\n implements WrapperInstanceMethods<V> {\n public validations?: Validations<V>;\n\n public requiredValidations?: Validations<V>;\n\n public static displayName = `Formsy(${getDisplayName(WrappedComponent)})`;\n\n public static propTypes: any = propTypes;\n\n public static defaultProps: any = {\n innerRef: null,\n required: false,\n validationError: '',\n validationErrors: {},\n validations: null,\n value: (WrappedComponent as ComponentWithStaticAttributes).defaultValue,\n };\n\n public constructor(props) {\n super(props);\n const { runValidation, validations, required, value } = props;\n\n this.state = { value } as any;\n\n this.setValidations(validations, required);\n\n this.state = {\n formSubmitted: false,\n isPristine: true,\n pristineValue: props.value,\n value: props.value,\n ...runValidation(this, props.value),\n };\n }\n\n public componentDidMount() {\n const { name, attachToForm } = this.props;\n\n if (!name) {\n throw new Error('Form Input requires a name property when used');\n }\n\n attachToForm(this);\n }\n\n public shouldComponentUpdate(nextProps, nextState) {\n const { props, state } = this;\n const isChanged = (a: object, b: object): boolean => Object.keys(a).some((k) => a[k] !== b[k]);\n const isPropsChanged = isChanged(props, nextProps);\n const isStateChanged = isChanged(state, nextState);\n\n return isPropsChanged || isStateChanged;\n }\n\n public componentDidUpdate(prevProps) {\n const { value, validations, required, validate } = this.props;\n\n // If the value passed has changed, set it. If value is not passed it will\n // internally update, and this will never run\n if (!utils.isSame(value, prevProps.value)) {\n this.setValue(value);\n }\n\n // If validations or required is changed, run a new validation\n if (!utils.isSame(validations, prevProps.validations) || !utils.isSame(required, prevProps.required)) {\n this.setValidations(validations, required);\n validate(this);\n }\n }\n\n // Detach it when component unmounts\n public componentWillUnmount() {\n const { detachFromForm } = this.props;\n detachFromForm(this);\n }\n\n public getErrorMessage = (): ValidationError | null => {\n const messages = this.getErrorMessages();\n return messages.length ? messages[0] : null;\n };\n\n public getErrorMessages = (): ValidationError[] => {\n const { validationError } = this.state;\n\n if (!this.isValid() || this.showRequired()) {\n return validationError || [];\n }\n return [];\n };\n\n // eslint-disable-next-line react/destructuring-assignment\n public getValue = (): V => this.state.value;\n\n public setValidations = (validations: Validations<V>, required: RequiredValidation<V>): void => {\n // Add validations to the store itself as the props object can not be modified\n this.validations = convertValidationsToObject(validations) || {};\n this.requiredValidations =\n required === true ? { isDefaultRequiredValue: required } : convertValidationsToObject(required);\n };\n\n // By default, we validate after the value has been set.\n // A user can override this and pass a second parameter of `false` to skip validation.\n public setValue = (value: V, validate = true): void => {\n const { validate: validateForm } = this.props;\n\n if (!validate) {\n this.setState({ value });\n } else {\n this.setState(\n {\n value,\n isPristine: false,\n },\n () => {\n validateForm(this);\n },\n );\n }\n };\n\n // eslint-disable-next-line react/destructuring-assignment\n public hasValue = () => {\n const { value } = this.state;\n return isDefaultRequiredValue(value);\n };\n\n // eslint-disable-next-line react/destructuring-assignment\n public isFormDisabled = (): boolean => this.props.isFormDisabled;\n\n // eslint-disable-next-line react/destructuring-assignment\n public isFormSubmitted = (): boolean => this.state.formSubmitted;\n\n // eslint-disable-next-line react/destructuring-assignment\n public isPristine = (): boolean => this.state.isPristine;\n\n // eslint-disable-next-line react/destructuring-assignment\n public isRequired = (): boolean => !!this.props.required;\n\n // eslint-disable-next-line react/destructuring-assignment\n public isValid = (): boolean => this.state.isValid;\n\n // eslint-disable-next-line react/destructuring-assignment\n public isValidValue = (value: V) => this.props.isValidValue(this, value);\n\n public resetValue = () => {\n const { pristineValue } = this.state;\n const { validate } = this.props;\n\n this.setState(\n {\n value: pristineValue,\n isPristine: true,\n },\n () => {\n validate(this);\n },\n );\n };\n\n public showError = (): boolean => !this.showRequired() && !this.isValid();\n\n // eslint-disable-next-line react/destructuring-assignment\n public showRequired = (): boolean => this.state.isRequired;\n\n public render() {\n const { innerRef } = this.props;\n const propsForElement: T & PassDownProps<V> = {\n ...this.props,\n errorMessage: this.getErrorMessage(),\n errorMessages: this.getErrorMessages(),\n hasValue: this.hasValue(),\n isFormDisabled: this.isFormDisabled(),\n isFormSubmitted: this.isFormSubmitted(),\n isPristine: this.isPristine(),\n isRequired: this.isRequired(),\n isValid: this.isValid(),\n isValidValue: this.isValidValue,\n resetValue: this.resetValue,\n setValidations: this.setValidations,\n setValue: this.setValue,\n showError: this.showError(),\n showRequired: this.showRequired(),\n value: this.getValue(),\n };\n\n if (innerRef) {\n propsForElement.ref = innerRef;\n }\n\n return React.createElement(WrappedComponent, propsForElement);\n }\n }\n\n // eslint-disable-next-line react/display-name\n return (props) =>\n React.createElement(FormsyContext.Consumer, null, (contextValue) => {\n return React.createElement(WithFormsyWrapper, { ...props, ...contextValue });\n });\n}\n","/* eslint-disable react/no-unused-state, react/default-props-match-prop-types */\nimport { get, has, set } from 'lodash';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport FormsyContext from './FormsyContext';\nimport {\n FormsyContextInterface,\n IModel,\n InputComponent,\n IResetModel,\n IUpdateInputsWithError,\n IUpdateInputsWithValue,\n ValidationError,\n} from './interfaces';\nimport { throttle, isObject, isString } from './utils';\nimport * as utils from './utils';\nimport validationRules from './validationRules';\nimport { PassDownProps } from './withFormsy';\n\ntype FormHTMLAttributesCleaned = Omit<React.FormHTMLAttributes<HTMLFormElement>, 'onChange' | 'onSubmit'>;\n\ntype OnSubmitCallback = (\n model: IModel,\n resetModel: IResetModel,\n updateInputsWithError: IUpdateInputsWithError,\n event: React.SyntheticEvent<React.FormHTMLAttributes<any>>,\n) => void;\n\ntype FormElementType =\n | string\n | React.ComponentType<{\n onReset?: (e: React.SyntheticEvent) => void;\n onSubmit?: (e: React.SyntheticEvent) => void;\n disabled?: boolean;\n children?: React.ReactChildren;\n }>;\n\nexport interface FormsyProps extends FormHTMLAttributesCleaned {\n disabled: boolean;\n mapping: null | ((model: IModel) => IModel);\n onChange: (model: IModel, isChanged: boolean) => void;\n onInvalid: () => void;\n onReset?: () => void;\n onSubmit?: OnSubmitCallback;\n onValidSubmit?: OnSubmitCallback;\n onInvalidSubmit: OnSubmitCallback;\n onValid: () => void;\n preventDefaultSubmit?: boolean;\n preventExternalInvalidation?: boolean;\n validationErrors?: null | object;\n formElement?: FormElementType;\n}\n\nexport interface FormsyState {\n canChange: boolean;\n contextValue: FormsyContextInterface;\n formSubmitted?: boolean;\n isPristine?: boolean;\n isSubmitting: boolean;\n isValid: boolean;\n}\n\nconst ONE_RENDER_FRAME = 66;\n\nexport class Formsy extends React.Component<FormsyProps, FormsyState> {\n public inputs: InstanceType<any & PassDownProps<any>>[];\n\n public emptyArray: any[];\n\n public prevInputNames: any[] | null = null;\n\n public static displayName = 'Formsy';\n\n public static propTypes = {\n disabled: PropTypes.bool,\n mapping: PropTypes.func,\n formElement: PropTypes.oneOfType([PropTypes.string, PropTypes.object, PropTypes.func]),\n onChange: PropTypes.func,\n onInvalid: PropTypes.func,\n onInvalidSubmit: PropTypes.func,\n onReset: PropTypes.func,\n onSubmit: PropTypes.func,\n onValid: PropTypes.func,\n onValidSubmit: PropTypes.func,\n preventDefaultSubmit: PropTypes.bool,\n preventExternalInvalidation: PropTypes.bool,\n validationErrors: PropTypes.object, // eslint-disable-line\n };\n\n public static defaultProps: Partial<FormsyProps> = {\n disabled: false,\n mapping: null,\n onChange: utils.noop,\n onInvalid: utils.noop,\n onInvalidSubmit: utils.noop,\n onReset: utils.noop,\n onSubmit: utils.noop,\n onValid: utils.noop,\n onValidSubmit: utils.noop,\n preventDefaultSubmit: true,\n preventExternalInvalidation: false,\n validationErrors: {},\n formElement: 'form',\n };\n\n private readonly throttledValidateForm: () => void;\n\n public constructor(props: FormsyProps) {\n super(props);\n this.state = {\n canChange: false,\n isSubmitting: false,\n isValid: true,\n contextValue: {\n attachToForm: this.attachToForm,\n detachFromForm: this.detachFromForm,\n isFormDisabled: props.disabled,\n isValidValue: this.isValidValue,\n validate: this.validate,\n runValidation: this.runValidation,\n },\n };\n this.inputs = [];\n this.emptyArray = [];\n this.throttledValidateForm = throttle(this.validateForm, ONE_RENDER_FRAME);\n }\n\n public componentDidMount = () => {\n this.prevInputNames = this.inputs.map((component) => component.props.name);\n this.validateForm();\n };\n\n public componentDidUpdate = (prevProps: FormsyProps) => {\n const { validationErrors, disabled } = this.props;\n\n if (validationErrors && isObject(validationErrors) && Object.keys(validationErrors).length > 0) {\n this.setInputValidationErrors(validationErrors);\n }\n\n const newInputNames = this.inputs.map((component) => component.props.name);\n if (this.prevInputNames && !utils.isSame(this.prevInputNames, newInputNames)) {\n this.prevInputNames = newInputNames;\n this.validateForm();\n }\n\n // Keep the disabled value in state/context the same as from props\n if (disabled !== prevProps.disabled) {\n // eslint-disable-next-line\n this.setState((state) => ({\n ...state,\n contextValue: {\n ...state.contextValue,\n isFormDisabled: disabled,\n },\n }));\n }\n };\n\n public getCurrentValues = () =>\n this.inputs.reduce((valueAccumulator, component) => {\n const {\n props: { name },\n state: { value },\n } = component;\n // eslint-disable-next-line no-param-reassign\n valueAccumulator[name] = utils.protectAgainstParamReassignment(value);\n return valueAccumulator;\n }, {});\n\n public getModel = () => {\n const currentValues = this.getCurrentValues();\n return this.mapModel(currentValues);\n };\n\n public getPristineValues = () =>\n this.inputs.reduce((valueAccumulator, component) => {\n const {\n props: { name, value },\n } = component;\n // eslint-disable-next-line no-param-reassign\n valueAccumulator[name] = utils.protectAgainstParamReassignment(value);\n return valueAccumulator;\n }, {});\n\n public setFormPristine = (isPristine: boolean) => {\n this.setState({\n formSubmitted: !isPristine,\n });\n\n // Iterate through each component and set it as pristine\n // or \"dirty\".\n this.inputs.forEach((component) => {\n component.setState({\n formSubmitted: !isPristine,\n isPristine,\n });\n });\n };\n\n public setInputValidationErrors = (errors) => {\n const { preventExternalInvalidation } = this.props;\n const { isValid } = this.state;\n\n this.inputs.forEach((component) => {\n const { name } = component.props;\n component.setState({\n isValid: !(name in errors),\n validationError: isString(errors[name]) ? [errors[name]] : errors[name],\n });\n });\n if (!preventExternalInvalidation && isValid) {\n this.setFormValidState(false);\n }\n };\n\n public setFormValidState = (allIsValid: boolean) => {\n const { onValid, onInvalid } = this.props;\n\n this.setState({\n isValid: allIsValid,\n });\n\n if (allIsValid) {\n onValid();\n } else {\n onInvalid();\n }\n };\n\n public isValidValue = (component, value) => this.runValidation(component, value).isValid;\n\n // eslint-disable-next-line react/destructuring-assignment\n public isFormDisabled = () => this.props.disabled;\n\n public mapModel = (model: IModel): IModel => {\n const { mapping } = this.props;\n\n if (mapping) {\n return mapping(model);\n }\n\n const returnModel = {};\n Object.keys(model).forEach((key) => {\n set(returnModel, key, model[key]);\n });\n return returnModel;\n };\n\n public reset = (model?: IModel) => {\n this.setFormPristine(true);\n this.resetModel(model);\n };\n\n private resetInternal = (event) => {\n const { onReset } = this.props;\n\n event.preventDefault();\n this.reset();\n if (onReset) {\n onReset();\n }\n };\n\n // Reset each key in the model to the original / initial / specified value\n private resetModel: IResetModel = (data) => {\n this.inputs.forEach((component) => {\n const { name } = component.props;\n if (data && has(data, name)) {\n component.setValue(get(data, name));\n } else {\n component.resetValue();\n }\n });\n this.validateForm();\n };\n\n // Checks validation on current value or a passed value\n public runValidation = <V>(\n component: InputComponent<V>,\n value = component.state.value,\n ): { isRequired: boolean; isValid: boolean; validationError: ValidationError[] } => {\n const { validationErrors } = this.props;\n const { validationError, validationErrors: componentValidationErrors, name } = component.props;\n const currentValues = this.getCurrentValues();\n const validationResults = utils.runRules(value, currentValues, component.validations, validationRules);\n const requiredResults = utils.runRules(value, currentValues, component.requiredValidations, validationRules);\n const isRequired = Object.keys(component.requiredValidations).length ? !!requiredResults.success.length : false;\n const isValid = !validationResults.failed.length && !(validationErrors && validationErrors[component.props.name]);\n\n return {\n isRequired,\n isValid: isRequired ? false : isValid,\n validationError: (() => {\n if (isValid && !isRequired) {\n return this.emptyArray;\n }\n\n if (validationResults.errors.length) {\n return validationResults.errors;\n }\n\n if (validationErrors && validationErrors[name]) {\n return isString(validationErrors[name]) ? [validationErrors[name]] : validationErrors[name];\n }\n\n if (isRequired) {\n const error = componentValidationErrors[requiredResults.success[0]] || validationError;\n return error ? [error] : null;\n }\n\n if (validationResults.failed.length) {\n return validationResults.failed\n .map((failed) => (componentValidationErrors[failed] ? componentValidationErrors[failed] : validationError))\n .filter((x, pos, arr) => arr.indexOf(x) === pos); // remove duplicates\n }\n\n // This line is not reachable\n // istanbul ignore next\n return undefined;\n })(),\n };\n };\n\n // Method put on each input component to register\n // itself to the form\n public attachToForm = (component) => {\n if (this.inputs.indexOf(component) === -1) {\n this.inputs.push(component);\n }\n\n const { onChange } = this.props;\n const { canChange } = this.state;\n\n // Trigger onChange\n if (canChange) {\n onChange(this.getModel(), this.isChanged());\n }\n\n // Will be triggered immediately & every one frame rate\n this.throttledValidateForm();\n };\n\n // Method put on each input component to unregister\n // itself from the form\n public detachFromForm = <V>(component: InputComponent<V>) => {\n const componentPos = this.inputs.indexOf(component);\n\n if (componentPos !== -1) {\n this.inputs = this.inputs.slice(0, componentPos).concat(this.inputs.slice(componentPos + 1));\n }\n\n this.validateForm();\n };\n\n // Checks if the values have changed from their initial value\n public isChanged = () => !utils.isSame(this.getPristineValues(), this.getCurrentValues());\n\n // Update model, submit to url prop and send the model\n public submit = (event?: React.SyntheticEvent) => {\n const { onSubmit, onValidSubmit, onInvalidSubmit, preventDefaultSubmit } = this.props;\n const { isValid } = this.state;\n\n if (preventDefaultSubmit && event && event.preventDefault) {\n event.preventDefault();\n }\n\n // Trigger form as not pristine.\n // If any inputs have not been touched yet this will make them dirty\n // so validation becomes visible (if based on isPristine)\n this.setFormPristine(false);\n const model = this.getModel();\n onSubmit(model, this.resetModel, this.updateInputsWithError, event);\n\n if (isValid) {\n onValidSubmit(model, this.resetModel, this.updateInputsWithError, event);\n } else {\n onInvalidSubmit(model, this.resetModel, this.updateInputsWithError, event);\n }\n };\n\n // Go through errors from server and grab the components\n // stored in the inputs map. Change their state to invalid\n // and set the serverError message\n public updateInputsWithError: IUpdateInputsWithError = (errors, invalidate) => {\n const { preventExternalInvalidation } = this.props;\n const { isValid } = this.state;\n\n Object.entries(errors).forEach(([name, error]) => {\n const component = this.inputs.find((input) => input.props.name === name);\n if (!component) {\n throw new Error(\n `You are trying to update an input that does not exist. Verify errors object with input names. ${JSON.stringify(\n errors,\n )}`,\n );\n }\n component.setState({\n isValid: preventExternalInvalidation,\n validationError: utils.isString(error) ? [error] : error,\n });\n });\n\n if (invalidate && isValid) {\n this.setFormValidState(false);\n }\n };\n\n // Set the value of components\n public updateInputsWithValue: IUpdateInputsWithValue<any> = (data, validate) => {\n this.inputs.forEach((component) => {\n const { name } = component.props;\n if (data && has(data, name)) {\n component.setValue(get(data, name), validate);\n }\n });\n };\n\n // Use the binded values and the actual input value to\n // validate the input and set its state. Then check the\n // state of the form itself\n public validate = <V>(component: InputComponent<V>) => {\n const { onChange } = this.props;\n const { canChange } = this.state;\n\n // Trigger onChange\n if (canChange) {\n onChange(this.getModel(), this.isChanged());\n }\n\n const validationState = this.runValidation<V>(component);\n // Run through the validations, split them up and call\n // the validator IF there is a value or it is required\n component.setState(validationState, this.validateForm);\n };\n\n // Validate the form by going through all child input components\n // and check their state\n public validateForm = () => {\n // We need a callback as we are validating all inputs again. This will\n // run when the last component has set its state\n const onValidationComplete = () => {\n const allIsValid = this.inputs.every((component) => component.state.isValid);\n\n this.setFormValidState(allIsValid);\n\n // Tell the form that it can start to trigger change events\n this.setState({\n canChange: true,\n });\n };\n\n // Run validation again in case affected by other inputs. The\n // last component validated will run the onValidationComplete callback\n this.inputs.forEach((component, index) => {\n const validationState = this.runValidation(component);\n const isFinalInput = index === this.inputs.length - 1;\n const callback = isFinalInput ? onValidationComplete : null;\n component.setState(validationState, callback);\n });\n\n // If there are no inputs, set state where form is ready to trigger\n // change event. New inputs might be added later\n if (!this.inputs.length) {\n this.setState(\n {\n canChange: true,\n },\n onValidationComplete,\n );\n }\n };\n\n public render() {\n const {\n /* eslint-disable @typescript-eslint/no-unused-vars */\n children,\n mapping,\n onChange,\n onInvalid,\n onInvalidSubmit,\n onReset,\n onSubmit,\n onValid,\n onValidSubmit,\n preventDefaultSubmit,\n preventExternalInvalidation,\n validationErrors,\n disabled,\n formElement,\n ...nonFormsyProps\n } = this.props;\n const { contextValue } = this.state;\n\n return React.createElement(\n FormsyContext.Provider,\n {\n value: contextValue,\n },\n React.createElement(\n formElement,\n {\n onReset: this.resetInternal,\n onSubmit: this.submit,\n ...nonFormsyProps,\n disabled,\n },\n children,\n ),\n );\n }\n}\n"],"names":["isArray","value","Array","isObject","isPlainObject","isDate","Date","isFunction","isString","isRegex","RegExp","isValueStringEmpty","isValueNullOrUndefined","isValueUndefined","undefined","noop","protectAgainstParamReassignment","isSame","a","b","length","every","item","index","toString","Object","keys","key","runRules","currentValues","validations","validationRules","results","errors","failed","success","forEach","validationName","validationsVal","validationRulesVal","addToResults","validation","push","Error","isExisty","isEmpty","isTypeUndefined","isDefaultRequiredValue","matchRegexp","_values","regexp","test","REGEX_PATTERNS","equals","eql","equalsField","values","field","isAlpha","isAlphanumeric","isEmail","isEmptyString","isFalse","isFloat","isInt","isLength","isNumeric","isNumber","isSpecialWords","isTrue","isUndefined","isUrl","isWords","maxLength","minLength","throwNoFormsyProvider","React","createContext","attachToForm","detachFromForm","isFormDisabled","isValidValue","validate","runValidation","convertValidationsToObject","split","reduce","validationsAccumulator","args","validateMethod","shift","map","arg","JSON","parse","e","validationsAccumulatorCopy","propTypes","innerRef","PropTypes","func","name","string","isRequired","required","oneOfType","bool","object","any","Formsy","props","callback","enableCall","prevInputNames","_this","inputs","component","validateForm","prevProps","validationErrors","disabled","setInputValidationErrors","newInputNames","utils","setState","state","contextValue","valueAccumulator","getCurrentValues","mapModel","isPristine","formSubmitted","preventExternalInvalidation","isValid","validationError","setFormValidState","allIsValid","onValid","onInvalid","model","mapping","returnModel","set","setFormPristine","resetModel","event","onReset","preventDefault","reset","data","has","setValue","get","resetValue","componentValidationErrors","validationResults","requiredResults","requiredValidations","emptyArray","error","filter","x","pos","arr","indexOf","canChange","onChange","getModel","isChanged","throttledValidateForm","componentPos","slice","concat","getPristineValues","onSubmit","onValidSubmit","onInvalidSubmit","preventDefaultSubmit","updateInputsWithError","invalidate","entries","find","input","stringify","validationState","onValidationComplete","isSubmitting","apply","this","setTimeout","render","children","formElement","nonFormsyProps","createElement","FormsyContext","Provider","resetInternal","submit","Component","WrappedComponent","WithFormsyWrapper","messages","getErrorMessages","showRequired","pristineValue","setValidations","componentDidMount","shouldComponentUpdate","nextProps","nextState","some","k","isPropsChanged","isStateChanged","componentDidUpdate","componentWillUnmount","propsForElement","errorMessage","getErrorMessage","errorMessages","hasValue","isFormSubmitted","showError","getValue","ref","displayName","defaultValue","Consumer"],"mappings":"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"}
\No newline at end of file