diff --git a/.gitignore b/.gitignore index 491fc359..3c3629e6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ node_modules -lib diff --git a/.idea/jsLibraryMappings.xml b/.idea/jsLibraryMappings.xml new file mode 100644 index 00000000..bd3d48df --- /dev/null +++ b/.idea/jsLibraryMappings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/libraries/formsy_react_node_modules.xml b/.idea/libraries/formsy_react_node_modules.xml new file mode 100644 index 00000000..4a02519a --- /dev/null +++ b/.idea/libraries/formsy_react_node_modules.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/lib/Decorator.js b/lib/Decorator.js new file mode 100644 index 00000000..d7c99fd7 --- /dev/null +++ b/lib/Decorator.js @@ -0,0 +1,32 @@ +'use strict'; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var React = global.React || require('react'); +var Mixin = require('./Mixin.js'); +module.exports = function () { + return function (Component) { + return React.createClass({ + mixins: [Mixin], + render: function render() { + return React.createElement(Component, _extends({ + setValidations: this.setValidations, + setValue: this.setValue, + resetValue: this.resetValue, + getValue: this.getValue, + hasValue: this.hasValue, + getErrorMessage: this.getErrorMessage, + getErrorMessages: this.getErrorMessages, + isFormDisabled: this.isFormDisabled, + isValid: this.isValid, + isPristine: this.isPristine, + isFormSubmitted: this.isFormSubmitted, + isRequired: this.isRequired, + showRequired: this.showRequired, + showError: this.showError, + isValidValue: this.isValidValue + }, this.props)); + } + }); + }; +}; \ No newline at end of file diff --git a/lib/HOC.js b/lib/HOC.js new file mode 100644 index 00000000..1d9f71b9 --- /dev/null +++ b/lib/HOC.js @@ -0,0 +1,35 @@ +'use strict'; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var React = global.React || require('react'); +var Mixin = require('./Mixin.js'); +module.exports = function (Component) { + return React.createClass({ + displayName: 'Formsy(' + getDisplayName(Component) + ')', + mixins: [Mixin], + render: function render() { + return React.createElement(Component, _extends({ + setValidations: this.setValidations, + setValue: this.setValue, + resetValue: this.resetValue, + getValue: this.getValue, + hasValue: this.hasValue, + getErrorMessage: this.getErrorMessage, + getErrorMessages: this.getErrorMessages, + isFormDisabled: this.isFormDisabled, + isValid: this.isValid, + isPristine: this.isPristine, + isFormSubmitted: this.isFormSubmitted, + isRequired: this.isRequired, + showRequired: this.showRequired, + showError: this.showError, + isValidValue: this.isValidValue + }, this.props)); + } + }); +}; + +function getDisplayName(Component) { + return Component.displayName || Component.name || (typeof Component === 'string' ? Component : 'Component'); +} \ No newline at end of file diff --git a/lib/Mixin.js b/lib/Mixin.js new file mode 100644 index 00000000..3afb7615 --- /dev/null +++ b/lib/Mixin.js @@ -0,0 +1,178 @@ +'use strict'; + +var utils = require('./utils.js'); +var React = global.React || require('react'); + +var convertValidationsToObject = function convertValidationsToObject(validations) { + + if (typeof validations === 'string') { + + return validations.split(/\,(?![^{\[]*[}\]])/g).reduce(function (validations, validation) { + var args = validation.split(':'); + var validateMethod = args.shift(); + + args = args.map(function (arg) { + try { + return JSON.parse(arg); + } catch (e) { + return arg; // It is a string if it can not parse it + } + }); + + if (args.length > 1) { + throw new Error('Formsy does not support multiple args on string validations. Use object format of validations instead.'); + } + + validations[validateMethod] = args.length ? args[0] : true; + return validations; + }, {}); + } + + return validations || {}; +}; + +module.exports = { + getInitialState: function getInitialState() { + return { + _value: this.props.value, + _isRequired: false, + _isValid: true, + _isPristine: true, + _pristineValue: this.props.value, + _validationError: [], + _externalError: null, + _formSubmitted: false + }; + }, + contextTypes: { + formsy: React.PropTypes.object // What about required? + }, + getDefaultProps: function getDefaultProps() { + return { + validationError: '', + validationErrors: {} + }; + }, + + componentWillMount: function componentWillMount() { + var configure = function () { + this.setValidations(this.props.validations, this.props.required); + + // Pass a function instead? + this.context.formsy.attachToForm(this); + //this.props._attachToForm(this); + }.bind(this); + + if (!this.props.name) { + throw new Error('Form Input requires a name property when used'); + } + + /* + if (!this.props._attachToForm) { + return setTimeout(function () { + if (!this.isMounted()) return; + if (!this.props._attachToForm) { + throw new Error('Form Mixin requires component to be nested in a Form'); + } + configure(); + }.bind(this), 0); + } + */ + configure(); + }, + + // We have to make the validate method is kept when new props are added + componentWillReceiveProps: function componentWillReceiveProps(nextProps) { + this.setValidations(nextProps.validations, nextProps.required); + }, + + componentDidUpdate: function componentDidUpdate(prevProps) { + + // If the value passed has changed, set it. If value is not passed it will + // internally update, and this will never run + if (!utils.isSame(this.props.value, prevProps.value)) { + this.setValue(this.props.value); + } + + // If validations or required is changed, run a new validation + if (!utils.isSame(this.props.validations, prevProps.validations) || !utils.isSame(this.props.required, prevProps.required)) { + this.context.formsy.validate(this); + } + }, + + // Detach it when component unmounts + componentWillUnmount: function componentWillUnmount() { + this.context.formsy.detachFromForm(this); + //this.props._detachFromForm(this); + }, + + setValidations: function setValidations(validations, required) { + + // Add validations to the store itself as the props object can not be modified + this._validations = convertValidationsToObject(validations) || {}; + this._requiredValidations = required === true ? { isDefaultRequiredValue: true } : convertValidationsToObject(required); + }, + + // We validate after the value has been set + setValue: function setValue(value, callback) { + this.setState({ + _value: value, + _isPristine: false + }, function () { + this.context.formsy.validate(this); + //this.props._validate(this); + + if (callback) { + callback(); + } + }.bind(this)); + }, + resetValue: function resetValue() { + this.setState({ + _value: this.state._pristineValue, + _isPristine: true + }, function () { + this.context.formsy.validate(this); + //this.props._validate(this); + }); + }, + getValue: function getValue() { + return this.state._value; + }, + hasValue: function hasValue() { + return this.state._value !== ''; + }, + getErrorMessage: function getErrorMessage() { + var messages = this.getErrorMessages(); + return messages.length ? messages[0] : null; + }, + getErrorMessages: function getErrorMessages() { + return !this.isValid() || this.showRequired() ? this.state._externalError || this.state._validationError || [] : []; + }, + isFormDisabled: function isFormDisabled() { + return this.context.formsy.isFormDisabled(); + //return this.props._isFormDisabled(); + }, + isValid: function isValid() { + return this.state._isValid; + }, + isPristine: function isPristine() { + return this.state._isPristine; + }, + isFormSubmitted: function isFormSubmitted() { + return this.state._formSubmitted; + }, + isRequired: function isRequired() { + return !!this.props.required; + }, + showRequired: function showRequired() { + return this.state._isRequired; + }, + showError: function showError() { + return !this.showRequired() && !this.isValid(); + }, + isValidValue: function isValidValue(value) { + return this.context.formsy.isValidValue.call(null, this, value); + //return this.props._isValidValue.call(null, this, value); + } +}; \ No newline at end of file diff --git a/lib/main.js b/lib/main.js new file mode 100644 index 00000000..661f7b07 --- /dev/null +++ b/lib/main.js @@ -0,0 +1,460 @@ +'use strict'; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; + +function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } + +var React = global.React || require('react'); +var Formsy = {}; +var validationRules = require('./validationRules.js'); +var formDataToObject = require('form-data-to-object'); +var utils = require('./utils.js'); +var Mixin = require('./Mixin.js'); +var HOC = require('./HOC.js'); +var Decorator = require('./Decorator.js'); +var options = {}; +var emptyArray = []; + +Formsy.Mixin = Mixin; +Formsy.HOC = HOC; +Formsy.Decorator = Decorator; + +Formsy.defaults = function (passedOptions) { + options = passedOptions; +}; + +Formsy.addValidationRule = function (name, func) { + validationRules[name] = func; +}; + +Formsy.Form = React.createClass({ + displayName: 'Formsy', + getInitialState: function getInitialState() { + return { + isValid: true, + isSubmitting: false, + canChange: false + }; + }, + getDefaultProps: function getDefaultProps() { + return { + onSuccess: function onSuccess() {}, + onError: function onError() {}, + onSubmit: function onSubmit() {}, + onValidSubmit: function onValidSubmit() {}, + onInvalidSubmit: function onInvalidSubmit() {}, + onValid: function onValid() {}, + onInvalid: function onInvalid() {}, + onChange: function onChange() {}, + validationErrors: null, + preventExternalInvalidation: false + }; + }, + + childContextTypes: { + formsy: React.PropTypes.object + }, + getChildContext: function getChildContext() { + var _this = this; + + return { + formsy: { + attachToForm: this.attachToForm, + detachFromForm: this.detachFromForm, + validate: this.validate, + isFormDisabled: this.isFormDisabled, + isValidValue: function isValidValue(component, value) { + return _this.runValidation(component, value).isValid; + } + } + }; + }, + + // Add a map to store the inputs of the form, a model to store + // the values of the form and register child inputs + componentWillMount: function componentWillMount() { + this.inputs = []; + }, + + componentDidMount: function componentDidMount() { + this.validateForm(); + }, + + componentWillUpdate: function componentWillUpdate() { + // Keep a reference to input names before form updates, + // to check if inputs has changed after render + this.prevInputNames = this.inputs.map(function (component) { + return component.props.name; + }); + }, + + componentDidUpdate: function componentDidUpdate() { + + if (this.props.validationErrors && _typeof(this.props.validationErrors) === 'object' && Object.keys(this.props.validationErrors).length > 0) { + this.setInputValidationErrors(this.props.validationErrors); + } + + var newInputNames = this.inputs.map(function (component) { + return component.props.name; + }); + if (utils.arraysDiffer(this.prevInputNames, newInputNames)) { + this.validateForm(); + } + }, + + // Allow resetting to specified data + reset: function reset(data) { + this.setFormPristine(true); + this.resetModel(data); + }, + + // Update model, submit to url prop and send the model + submit: function submit(event) { + + event && event.preventDefault(); + + // Trigger form as not pristine. + // If any inputs have not been touched yet this will make them dirty + // so validation becomes visible (if based on isPristine) + this.setFormPristine(false); + var model = this.getModel(); + this.props.onSubmit(model, this.resetModel, this.updateInputsWithError); + this.state.isValid ? this.props.onValidSubmit(model, this.resetModel, this.updateInputsWithError) : this.props.onInvalidSubmit(model, this.resetModel, this.updateInputsWithError); + }, + + mapModel: function mapModel(model) { + + if (this.props.mapping) { + return this.props.mapping(model); + } else { + return formDataToObject.toObj(Object.keys(model).reduce(function (mappedModel, key) { + + var keyArray = key.split('.'); + var base = mappedModel; + while (keyArray.length) { + var currentKey = keyArray.shift(); + base = base[currentKey] = keyArray.length ? base[currentKey] || {} : model[key]; + } + + return mappedModel; + }, {})); + } + }, + + getModel: function getModel() { + var currentValues = this.getCurrentValues(); + return this.mapModel(currentValues); + }, + + // Reset each key in the model to the original / initial / specified value + resetModel: function resetModel(data) { + this.inputs.forEach(function (component) { + var name = component.props.name; + if (data && data.hasOwnProperty(name)) { + component.setValue(data[name]); + } else { + component.resetValue(); + } + }); + this.validateForm(); + }, + + setInputValidationErrors: function setInputValidationErrors(errors) { + this.inputs.forEach(function (component) { + var name = component.props.name; + var args = [{ + _isValid: !(name in errors), + _validationError: typeof errors[name] === 'string' ? [errors[name]] : errors[name] + }]; + component.setState.apply(component, args); + }); + }, + + // Checks if the values have changed from their initial value + isChanged: function isChanged() { + return !utils.isSame(this.getPristineValues(), this.getCurrentValues()); + }, + + getPristineValues: function getPristineValues() { + return this.inputs.reduce(function (data, component) { + var name = component.props.name; + data[name] = component.props.value; + return data; + }, {}); + }, + + // Go through errors from server and grab the components + // stored in the inputs map. Change their state to invalid + // and set the serverError message + updateInputsWithError: function updateInputsWithError(errors) { + var _this2 = this; + + Object.keys(errors).forEach(function (name, index) { + var component = utils.find(_this2.inputs, function (component) { + return component.props.name === name; + }); + if (!component) { + throw new Error('You are trying to update an input that does not exist. ' + 'Verify errors object with input names. ' + JSON.stringify(errors)); + } + var args = [{ + _isValid: _this2.props.preventExternalInvalidation || false, + _externalError: typeof errors[name] === 'string' ? [errors[name]] : errors[name] + }]; + component.setState.apply(component, args); + }); + }, + + isFormDisabled: function isFormDisabled() { + return this.props.disabled; + }, + + getCurrentValues: function getCurrentValues() { + return this.inputs.reduce(function (data, component) { + var name = component.props.name; + data[name] = component.state._value; + return data; + }, {}); + }, + + setFormPristine: function setFormPristine(isPristine) { + this.setState({ + _formSubmitted: !isPristine + }); + + // Iterate through each component and set it as pristine + // or "dirty". + this.inputs.forEach(function (component, index) { + component.setState({ + _formSubmitted: !isPristine, + _isPristine: isPristine + }); + }); + }, + + // Use the binded values and the actual input value to + // validate the input and set its state. Then check the + // state of the form itself + validate: function validate(component) { + + // Trigger onChange + if (this.state.canChange) { + this.props.onChange(this.getCurrentValues(), this.isChanged()); + } + + var validation = this.runValidation(component); + // Run through the validations, split them up and call + // the validator IF there is a value or it is required + component.setState({ + _isValid: validation.isValid, + _isRequired: validation.isRequired, + _validationError: validation.error, + _externalError: null + }, this.validateForm); + }, + + // Checks validation on current value or a passed value + runValidation: function runValidation(component, value) { + + var currentValues = this.getCurrentValues(); + var validationErrors = component.props.validationErrors; + var validationError = component.props.validationError; + value = arguments.length === 2 ? value : component.state._value; + + var validationResults = this.runRules(value, currentValues, component._validations); + var requiredResults = this.runRules(value, currentValues, component._requiredValidations); + + // the component defines an explicit validate function + if (typeof component.validate === "function") { + validationResults.failed = component.validate() ? [] : ['failed']; + } + + var isRequired = Object.keys(component._requiredValidations).length ? !!requiredResults.success.length : false; + var isValid = !validationResults.failed.length && !(this.props.validationErrors && this.props.validationErrors[component.props.name]); + + return { + isRequired: isRequired, + isValid: isRequired ? false : isValid, + error: function () { + + if (isValid && !isRequired) { + return emptyArray; + } + + if (validationResults.errors.length) { + return validationResults.errors; + } + + if (this.props.validationErrors && this.props.validationErrors[component.props.name]) { + return typeof this.props.validationErrors[component.props.name] === 'string' ? [this.props.validationErrors[component.props.name]] : this.props.validationErrors[component.props.name]; + } + + if (isRequired) { + var error = validationErrors[requiredResults.success[0]]; + return error ? [error] : null; + } + + if (validationResults.failed.length) { + return validationResults.failed.map(function (failed) { + return validationErrors[failed] ? validationErrors[failed] : validationError; + }).filter(function (x, pos, arr) { + // Remove duplicates + return arr.indexOf(x) === pos; + }); + } + }.call(this) + }; + }, + + runRules: function runRules(value, currentValues, validations) { + + var results = { + errors: [], + failed: [], + success: [] + }; + if (Object.keys(validations).length) { + Object.keys(validations).forEach(function (validationMethod) { + + if (validationRules[validationMethod] && typeof validations[validationMethod] === 'function') { + throw new Error('Formsy does not allow you to override default validations: ' + validationMethod); + } + + if (!validationRules[validationMethod] && typeof validations[validationMethod] !== 'function') { + throw new Error('Formsy does not have the validation rule: ' + validationMethod); + } + + if (typeof validations[validationMethod] === 'function') { + var validation = validations[validationMethod](currentValues, value); + if (typeof validation === 'string') { + results.errors.push(validation); + results.failed.push(validationMethod); + } else if (!validation) { + results.failed.push(validationMethod); + } + return; + } else if (typeof validations[validationMethod] !== 'function') { + var validation = validationRules[validationMethod](currentValues, value, validations[validationMethod]); + if (typeof validation === 'string') { + results.errors.push(validation); + results.failed.push(validationMethod); + } else if (!validation) { + results.failed.push(validationMethod); + } else { + results.success.push(validationMethod); + } + return; + } + + return results.success.push(validationMethod); + }); + } + + return results; + }, + + // Validate the form by going through all child input components + // and check their state + validateForm: function validateForm() { + var _this3 = this; + + // We need a callback as we are validating all inputs again. This will + // run when the last component has set its state + var onValidationComplete = function () { + var allIsValid = this.inputs.every(function (component) { + return component.state._isValid; + }); + + this.setState({ + isValid: allIsValid + }); + + if (allIsValid) { + this.props.onValid(); + } else { + this.props.onInvalid(); + } + + // Tell the form that it can start to trigger change events + this.setState({ + canChange: true + }); + }.bind(this); + + // Run validation again in case affected by other inputs. The + // last component validated will run the onValidationComplete callback + this.inputs.forEach(function (component, index) { + var validation = _this3.runValidation(component); + if (validation.isValid && component.state._externalError) { + validation.isValid = false; + } + component.setState({ + _isValid: validation.isValid, + _isRequired: validation.isRequired, + _validationError: validation.error, + _externalError: !validation.isValid && component.state._externalError ? component.state._externalError : null + }, index === _this3.inputs.length - 1 ? onValidationComplete : null); + }); + + // If there are no inputs, set state where form is ready to trigger + // change event. New inputs might be added later + if (!this.inputs.length && this.isMounted()) { + this.setState({ + canChange: true + }); + } + }, + + // Method put on each input component to register + // itself to the form + attachToForm: function attachToForm(component) { + + if (this.inputs.indexOf(component) === -1) { + this.inputs.push(component); + } + + this.validate(component); + }, + + // Method put on each input component to unregister + // itself from the form + detachFromForm: function detachFromForm(component) { + var componentPos = this.inputs.indexOf(component); + + if (componentPos !== -1) { + this.inputs = this.inputs.slice(0, componentPos).concat(this.inputs.slice(componentPos + 1)); + } + + this.validateForm(); + }, + render: function render() { + var _props = this.props; + var mapping = _props.mapping; + var validationErrors = _props.validationErrors; + var onSubmit = _props.onSubmit; + var onValid = _props.onValid; + var onValidSubmit = _props.onValidSubmit; + var onInvalid = _props.onInvalid; + var onInvalidSubmit = _props.onInvalidSubmit; + var onChange = _props.onChange; + var reset = _props.reset; + var preventExternalInvalidation = _props.preventExternalInvalidation; + var onSuccess = _props.onSuccess; + var onError = _props.onError; + + var nonFormsyProps = _objectWithoutProperties(_props, ['mapping', 'validationErrors', 'onSubmit', 'onValid', 'onValidSubmit', 'onInvalid', 'onInvalidSubmit', 'onChange', 'reset', 'preventExternalInvalidation', 'onSuccess', 'onError']); + + return React.createElement( + 'form', + _extends({}, nonFormsyProps, { onSubmit: this.submit }), + this.props.children + ); + } +}); + +if (!global.exports && !global.module && (!global.define || !global.define.amd)) { + global.Formsy = Formsy; +} + +module.exports = Formsy; \ No newline at end of file diff --git a/lib/utils.js b/lib/utils.js new file mode 100644 index 00000000..91e6e50b --- /dev/null +++ b/lib/utils.js @@ -0,0 +1,57 @@ +'use strict'; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; + +module.exports = { + arraysDiffer: function arraysDiffer(a, b) { + var isDifferent = false; + if (a.length !== b.length) { + isDifferent = true; + } else { + a.forEach(function (item, index) { + if (!this.isSame(item, b[index])) { + isDifferent = true; + } + }, this); + } + return isDifferent; + }, + + objectsDiffer: function objectsDiffer(a, b) { + var isDifferent = false; + if (Object.keys(a).length !== Object.keys(b).length) { + isDifferent = true; + } else { + Object.keys(a).forEach(function (key) { + if (!this.isSame(a[key], b[key])) { + isDifferent = true; + } + }, this); + } + return isDifferent; + }, + + isSame: function isSame(a, b) { + if ((typeof a === 'undefined' ? 'undefined' : _typeof(a)) !== (typeof b === 'undefined' ? 'undefined' : _typeof(b))) { + return false; + } else if (Array.isArray(a)) { + return !this.arraysDiffer(a, b); + } else if (typeof a === 'function') { + return a.toString() === b.toString(); + } else if ((typeof a === 'undefined' ? 'undefined' : _typeof(a)) === 'object' && a !== null && b !== null) { + return !this.objectsDiffer(a, b); + } + + return a === b; + }, + + find: function find(collection, fn) { + for (var i = 0, l = collection.length; i < l; i++) { + var item = collection[i]; + if (fn(item)) { + return item; + } + } + return null; + } +}; \ No newline at end of file diff --git a/lib/validationRules.js b/lib/validationRules.js new file mode 100644 index 00000000..6baaf501 --- /dev/null +++ b/lib/validationRules.js @@ -0,0 +1,80 @@ +'use strict'; + +var _isExisty = function _isExisty(value) { + return value !== null && value !== undefined; +}; + +var isEmpty = function isEmpty(value) { + return value === ''; +}; + +var validations = { + isDefaultRequiredValue: function isDefaultRequiredValue(values, value) { + return value === undefined || value === ''; + }, + isExisty: function isExisty(values, value) { + return _isExisty(value); + }, + matchRegexp: function matchRegexp(values, value, regexp) { + return !_isExisty(value) || isEmpty(value) || regexp.test(value); + }, + isUndefined: function isUndefined(values, value) { + return value === undefined; + }, + isEmptyString: function isEmptyString(values, value) { + return isEmpty(value); + }, + isEmail: function isEmail(values, value) { + return validations.matchRegexp(values, value, /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i); + }, + isUrl: function isUrl(values, value) { + return validations.matchRegexp(values, value, /^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i); + }, + isTrue: function isTrue(values, value) { + return value === true; + }, + isFalse: function isFalse(values, value) { + return value === false; + }, + isNumeric: function isNumeric(values, value) { + if (typeof value === 'number') { + return true; + } + return validations.matchRegexp(values, value, /^[-+]?(?:\d*[.])?\d+$/); + }, + isAlpha: function isAlpha(values, value) { + return validations.matchRegexp(values, value, /^[A-Z]+$/i); + }, + isAlphanumeric: function isAlphanumeric(values, value) { + return validations.matchRegexp(values, value, /^[0-9A-Z]+$/i); + }, + isInt: function isInt(values, value) { + return validations.matchRegexp(values, value, /^(?:[-+]?(?:0|[1-9]\d*))$/); + }, + isFloat: function isFloat(values, value) { + return validations.matchRegexp(values, value, /^(?:[-+]?(?:\d+))?(?:\.\d*)?(?:[eE][\+\-]?(?:\d+))?$/); + }, + isWords: function isWords(values, value) { + return validations.matchRegexp(values, value, /^[A-Z\s]+$/i); + }, + isSpecialWords: function isSpecialWords(values, value) { + return validations.matchRegexp(values, value, /^[A-Z\s\u00C0-\u017F]+$/i); + }, + isLength: function isLength(values, value, length) { + return !_isExisty(value) || isEmpty(value) || value.length === length; + }, + equals: function equals(values, value, eql) { + return !_isExisty(value) || isEmpty(value) || value == eql; + }, + equalsField: function equalsField(values, value, field) { + return value == values[field]; + }, + maxLength: function maxLength(values, value, length) { + return !_isExisty(value) || value.length <= length; + }, + minLength: function minLength(values, value, length) { + return !_isExisty(value) || isEmpty(value) || value.length >= length; + } +}; + +module.exports = validations; \ No newline at end of file diff --git a/release/formsy-react.js b/release/formsy-react.js index 5dffb8cf..66c40983 100644 --- a/release/formsy-react.js +++ b/release/formsy-react.js @@ -1,2 +1,2 @@ -!function(t,i){"object"==typeof exports&&"object"==typeof module?module.exports=i(require("react")):"function"==typeof define&&define.amd?define(["react"],i):"object"==typeof exports?exports.Formsy=i(require("react")):t.Formsy=i(t.react)}(this,function(t){return function(t){function i(r){if(e[r])return e[r].exports;var n=e[r]={exports:{},id:r,loaded:!1};return t[r].call(n.exports,n,n.exports,i),n.loaded=!0,n.exports}var e={};return i.m=t,i.c=e,i.p="",i(0)}([function(t,i,e){(function(i){"use strict";function r(t,i){var e={};for(var r in t)i.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e}var n=Object.assign||function(t){for(var i=1;i0&&this.setInputValidationErrors(this.props.validationErrors);var t=this.inputs.map(function(t){return t.props.name});d.arraysDiffer(this.prevInputNames,t)&&this.validateForm()},reset:function(t){this.setFormPristine(!0),this.resetModel(t)},submit:function(t){t&&t.preventDefault(),this.setFormPristine(!1);var i=this.getModel();this.props.onSubmit(i,this.resetModel,this.updateInputsWithError),this.state.isValid?this.props.onValidSubmit(i,this.resetModel,this.updateInputsWithError):this.props.onInvalidSubmit(i,this.resetModel,this.updateInputsWithError)},mapModel:function(t){return this.props.mapping?this.props.mapping(t):l.toObj(Object.keys(t).reduce(function(i,e){for(var r=e.split("."),n=i;r.length;){var s=r.shift();n=n[s]=r.length?n[s]||{}:t[e]}return i},{}))},getModel:function(){var t=this.getCurrentValues();return this.mapModel(t)},resetModel:function(t){this.inputs.forEach(function(i){var e=i.props.name;t&&t.hasOwnProperty(e)?i.setValue(t[e]):i.resetValue()}),this.validateForm()},setInputValidationErrors:function(t){this.inputs.forEach(function(i){var e=i.props.name,r=[{_isValid:!(e in t),_validationError:"string"==typeof t[e]?[t[e]]:t[e]}];i.setState.apply(i,r)})},isChanged:function(){return!d.isSame(this.getPristineValues(),this.getCurrentValues())},getPristineValues:function(){return this.inputs.reduce(function(t,i){var e=i.props.name;return t[e]=i.props.value,t},{})},updateInputsWithError:function(t){var i=this;Object.keys(t).forEach(function(e,r){var n=d.find(i.inputs,function(t){return t.props.name===e});if(!n)throw new Error("You are trying to update an input that does not exist. Verify errors object with input names. "+JSON.stringify(t));var s=[{_isValid:i.props.preventExternalInvalidation||!1,_externalError:"string"==typeof t[e]?[t[e]]:t[e]}];n.setState.apply(n,s)})},isFormDisabled:function(){return this.props.disabled},getCurrentValues:function(){return this.inputs.reduce(function(t,i){var e=i.props.name;return t[e]=i.state._value,t},{})},setFormPristine:function(t){this.setState({_formSubmitted:!t}),this.inputs.forEach(function(i,e){i.setState({_formSubmitted:!t,_isPristine:t})})},validate:function(t){this.state.canChange&&this.props.onChange(this.getCurrentValues(),this.isChanged());var i=this.runValidation(t);t.setState({_isValid:i.isValid,_isRequired:i.isRequired,_validationError:i.error,_externalError:null},this.validateForm)},runValidation:function(t,i){var e=this.getCurrentValues(),r=t.props.validationErrors,n=t.props.validationError;i=2===arguments.length?i:t.state._value;var s=this.runRules(i,e,t._validations),u=this.runRules(i,e,t._requiredValidations);"function"==typeof t.validate&&(s.failed=t.validate()?[]:["failed"]);var o=Object.keys(t._requiredValidations).length?!!u.success.length:!1,a=!(s.failed.length||this.props.validationErrors&&this.props.validationErrors[t.props.name]);return{isRequired:o,isValid:o?!1:a,error:function(){if(a&&!o)return p;if(s.errors.length)return s.errors;if(this.props.validationErrors&&this.props.validationErrors[t.props.name])return"string"==typeof this.props.validationErrors[t.props.name]?[this.props.validationErrors[t.props.name]]:this.props.validationErrors[t.props.name];if(o){var i=r[u.success[0]];return i?[i]:null}return s.failed.length?s.failed.map(function(t){return r[t]?r[t]:n}).filter(function(t,i,e){return e.indexOf(t)===i}):void 0}.call(this)}},runRules:function(t,i,e){var r={errors:[],failed:[],success:[]};return Object.keys(e).length&&Object.keys(e).forEach(function(n){if(a[n]&&"function"==typeof e[n])throw new Error("Formsy does not allow you to override default validations: "+n);if(!a[n]&&"function"!=typeof e[n])throw new Error("Formsy does not have the validation rule: "+n);if("function"==typeof e[n]){var s=e[n](i,t);return void("string"==typeof s?(r.errors.push(s),r.failed.push(n)):s||r.failed.push(n))}if("function"!=typeof e[n]){var s=a[n](i,t,e[n]);return void("string"==typeof s?(r.errors.push(s),r.failed.push(n)):s?r.success.push(n):r.failed.push(n))}return r.success.push(n)}),r},validateForm:function(){var t=this,i=function(){var t=this.inputs.every(function(t){return t.state._isValid});this.setState({isValid:t}),t?this.props.onValid():this.props.onInvalid(),this.setState({canChange:!0})}.bind(this);this.inputs.forEach(function(e,r){var n=t.runValidation(e);n.isValid&&e.state._externalError&&(n.isValid=!1),e.setState({_isValid:n.isValid,_isRequired:n.isRequired,_validationError:n.error,_externalError:!n.isValid&&e.state._externalError?e.state._externalError:null},r===t.inputs.length-1?i:null)}),!this.inputs.length&&this.isMounted()&&this.setState({canChange:!0})},attachToForm:function(t){-1===this.inputs.indexOf(t)&&this.inputs.push(t),this.validate(t)},detachFromForm:function(t){var i=this.inputs.indexOf(t);-1!==i&&(this.inputs=this.inputs.slice(0,i).concat(this.inputs.slice(i+1))),this.validateForm()},render:function(){var t=this.props,i=(t.mapping,t.validationErrors,t.onSubmit,t.onValid,t.onValidSubmit,t.onInvalid,t.onInvalidSubmit,t.onChange,t.reset,t.preventExternalInvalidation,t.onSuccess,t.onError,r(t,["mapping","validationErrors","onSubmit","onValid","onValidSubmit","onInvalid","onInvalidSubmit","onChange","reset","preventExternalInvalidation","onSuccess","onError"]));return u.createElement("form",n({},i,{onSubmit:this.submit}),this.props.children)}}),i.exports||i.module||i.define&&i.define.amd||(i.Formsy=o),t.exports=o}).call(i,function(){return this}())},function(i,e){i.exports=t},function(t,i,e){(function(i){"use strict";var r=e(3),n=i.React||e(1),s=function(t){return"string"==typeof t?t.split(/\,(?![^{\[]*[}\]])/g).reduce(function(t,i){var e=i.split(":"),r=e.shift();if(e=e.map(function(t){try{return JSON.parse(t)}catch(i){return t}}),e.length>1)throw new Error("Formsy does not support multiple args on string validations. Use object format of validations instead.");return t[r]=e.length?e[0]:!0,t},{}):t||{}};t.exports={getInitialState:function(){return{_value:this.props.value,_isRequired:!1,_isValid:!0,_isPristine:!0,_pristineValue:this.props.value,_validationError:[],_externalError:null,_formSubmitted:!1}},contextTypes:{formsy:n.PropTypes.object},getDefaultProps:function(){return{validationError:"",validationErrors:{}}},componentWillMount:function(){var t=function(){this.setValidations(this.props.validations,this.props.required),this.context.formsy.attachToForm(this)}.bind(this);if(!this.props.name)throw new Error("Form Input requires a name property when used");t()},componentWillReceiveProps:function(t){this.setValidations(t.validations,t.required)},componentDidUpdate:function(t){r.isSame(this.props.value,t.value)||this.setValue(this.props.value),r.isSame(this.props.validations,t.validations)&&r.isSame(this.props.required,t.required)||this.context.formsy.validate(this)},componentWillUnmount:function(){this.context.formsy.detachFromForm(this)},setValidations:function(t,i){this._validations=s(t)||{},this._requiredValidations=i===!0?{isDefaultRequiredValue:!0}:s(i)},setValue:function(t){this.setState({_value:t,_isPristine:!1},function(){this.context.formsy.validate(this)}.bind(this))},resetValue:function(){this.setState({_value:this.state._pristineValue,_isPristine:!0},function(){this.context.formsy.validate(this)})},getValue:function(){return this.state._value},hasValue:function(){return""!==this.state._value},getErrorMessage:function(){var t=this.getErrorMessages();return t.length?t[0]:null},getErrorMessages:function(){return!this.isValid()||this.showRequired()?this.state._externalError||this.state._validationError||[]:[]},isFormDisabled:function(){return this.context.formsy.isFormDisabled()},isValid:function(){return this.state._isValid},isPristine:function(){return this.state._isPristine},isFormSubmitted:function(){return this.state._formSubmitted},isRequired:function(){return!!this.props.required},showRequired:function(){return this.state._isRequired},showError:function(){return!this.showRequired()&&!this.isValid()},isValidValue:function(t){return this.context.formsy.isValidValue.call(null,this,t)}}}).call(i,function(){return this}())},function(t,i){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol?"symbol":typeof t};t.exports={arraysDiffer:function(t,i){var e=!1;return t.length!==i.length?e=!0:t.forEach(function(t,r){this.isSame(t,i[r])||(e=!0)},this),e},objectsDiffer:function(t,i){var e=!1;return Object.keys(t).length!==Object.keys(i).length?e=!0:Object.keys(t).forEach(function(r){this.isSame(t[r],i[r])||(e=!0)},this),e},isSame:function(t,i){return("undefined"==typeof t?"undefined":e(t))!==("undefined"==typeof i?"undefined":e(i))?!1:Array.isArray(t)?!this.arraysDiffer(t,i):"function"==typeof t?t.toString()===i.toString():"object"===("undefined"==typeof t?"undefined":e(t))&&null!==t&&null!==i?!this.objectsDiffer(t,i):t===i},find:function(t,i){for(var e=0,r=t.length;r>e;e++){var n=t[e];if(i(n))return n}return null}}},function(t,i,e){(function(i){"use strict";var r=Object.assign||function(t){for(var i=1;i=n}};t.exports=n},function(t,i){function e(t){return Object.keys(t).reduce(function(i,e){var r=e.match(/[^\[]*/i),n=e.match(/\[.*?\]/g)||[];n=[r[0]].concat(n).map(function(t){return t.replace(/\[|\]/g,"")});for(var s=i;n.length;){var u=n.shift();u in s?s=s[u]:(s[u]=n.length?isNaN(n[0])?{}:[]:t[e],s=s[u])}return i},{})}function r(t){function i(t,e,r){return Array.isArray(r)||"[object Object]"===Object.prototype.toString.call(r)?(Object.keys(r).forEach(function(n){i(t,e+"["+n+"]",r[n])}),t):(t[e]=r,t)}var e=Object.keys(t);return e.reduce(function(e,r){return i(e,r,t[r])},{})}t.exports={fromObj:r,toObj:e}}])}); +!function(t,i){"object"==typeof exports&&"object"==typeof module?module.exports=i(require("react")):"function"==typeof define&&define.amd?define(["react"],i):"object"==typeof exports?exports.Formsy=i(require("react")):t.Formsy=i(t.react)}(this,function(t){return function(t){function i(r){if(e[r])return e[r].exports;var n=e[r]={exports:{},id:r,loaded:!1};return t[r].call(n.exports,n,n.exports,i),n.loaded=!0,n.exports}var e={};return i.m=t,i.c=e,i.p="",i(0)}([function(t,i,e){(function(i){"use strict";function r(t,i){var e={};for(var r in t)i.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e}var n=Object.assign||function(t){for(var i=1;i0&&this.setInputValidationErrors(this.props.validationErrors);var t=this.inputs.map(function(t){return t.props.name});d.arraysDiffer(this.prevInputNames,t)&&this.validateForm()},reset:function(t){this.setFormPristine(!0),this.resetModel(t)},submit:function(t){t&&t.preventDefault(),this.setFormPristine(!1);var i=this.getModel();this.props.onSubmit(i,this.resetModel,this.updateInputsWithError),this.state.isValid?this.props.onValidSubmit(i,this.resetModel,this.updateInputsWithError):this.props.onInvalidSubmit(i,this.resetModel,this.updateInputsWithError)},mapModel:function(t){return this.props.mapping?this.props.mapping(t):l.toObj(Object.keys(t).reduce(function(i,e){for(var r=e.split("."),n=i;r.length;){var s=r.shift();n=n[s]=r.length?n[s]||{}:t[e]}return i},{}))},getModel:function(){var t=this.getCurrentValues();return this.mapModel(t)},resetModel:function(t){this.inputs.forEach(function(i){var e=i.props.name;t&&t.hasOwnProperty(e)?i.setValue(t[e]):i.resetValue()}),this.validateForm()},setInputValidationErrors:function(t){this.inputs.forEach(function(i){var e=i.props.name,r=[{_isValid:!(e in t),_validationError:"string"==typeof t[e]?[t[e]]:t[e]}];i.setState.apply(i,r)})},isChanged:function(){return!d.isSame(this.getPristineValues(),this.getCurrentValues())},getPristineValues:function(){return this.inputs.reduce(function(t,i){var e=i.props.name;return t[e]=i.props.value,t},{})},updateInputsWithError:function(t){var i=this;Object.keys(t).forEach(function(e,r){var n=d.find(i.inputs,function(t){return t.props.name===e});if(!n)throw new Error("You are trying to update an input that does not exist. Verify errors object with input names. "+JSON.stringify(t));var s=[{_isValid:i.props.preventExternalInvalidation||!1,_externalError:"string"==typeof t[e]?[t[e]]:t[e]}];n.setState.apply(n,s)})},isFormDisabled:function(){return this.props.disabled},getCurrentValues:function(){return this.inputs.reduce(function(t,i){var e=i.props.name;return t[e]=i.state._value,t},{})},setFormPristine:function(t){this.setState({_formSubmitted:!t}),this.inputs.forEach(function(i,e){i.setState({_formSubmitted:!t,_isPristine:t})})},validate:function(t){this.state.canChange&&this.props.onChange(this.getCurrentValues(),this.isChanged());var i=this.runValidation(t);t.setState({_isValid:i.isValid,_isRequired:i.isRequired,_validationError:i.error,_externalError:null},this.validateForm)},runValidation:function(t,i){var e=this.getCurrentValues(),r=t.props.validationErrors,n=t.props.validationError;i=2===arguments.length?i:t.state._value;var s=this.runRules(i,e,t._validations),u=this.runRules(i,e,t._requiredValidations);"function"==typeof t.validate&&(s.failed=t.validate()?[]:["failed"]);var o=Object.keys(t._requiredValidations).length?!!u.success.length:!1,a=!(s.failed.length||this.props.validationErrors&&this.props.validationErrors[t.props.name]);return{isRequired:o,isValid:o?!1:a,error:function(){if(a&&!o)return p;if(s.errors.length)return s.errors;if(this.props.validationErrors&&this.props.validationErrors[t.props.name])return"string"==typeof this.props.validationErrors[t.props.name]?[this.props.validationErrors[t.props.name]]:this.props.validationErrors[t.props.name];if(o){var i=r[u.success[0]];return i?[i]:null}return s.failed.length?s.failed.map(function(t){return r[t]?r[t]:n}).filter(function(t,i,e){return e.indexOf(t)===i}):void 0}.call(this)}},runRules:function(t,i,e){var r={errors:[],failed:[],success:[]};return Object.keys(e).length&&Object.keys(e).forEach(function(n){if(a[n]&&"function"==typeof e[n])throw new Error("Formsy does not allow you to override default validations: "+n);if(!a[n]&&"function"!=typeof e[n])throw new Error("Formsy does not have the validation rule: "+n);if("function"==typeof e[n]){var s=e[n](i,t);return void("string"==typeof s?(r.errors.push(s),r.failed.push(n)):s||r.failed.push(n))}if("function"!=typeof e[n]){var s=a[n](i,t,e[n]);return void("string"==typeof s?(r.errors.push(s),r.failed.push(n)):s?r.success.push(n):r.failed.push(n))}return r.success.push(n)}),r},validateForm:function(){var t=this,i=function(){var t=this.inputs.every(function(t){return t.state._isValid});this.setState({isValid:t}),t?this.props.onValid():this.props.onInvalid(),this.setState({canChange:!0})}.bind(this);this.inputs.forEach(function(e,r){var n=t.runValidation(e);n.isValid&&e.state._externalError&&(n.isValid=!1),e.setState({_isValid:n.isValid,_isRequired:n.isRequired,_validationError:n.error,_externalError:!n.isValid&&e.state._externalError?e.state._externalError:null},r===t.inputs.length-1?i:null)}),!this.inputs.length&&this.isMounted()&&this.setState({canChange:!0})},attachToForm:function(t){-1===this.inputs.indexOf(t)&&this.inputs.push(t),this.validate(t)},detachFromForm:function(t){var i=this.inputs.indexOf(t);-1!==i&&(this.inputs=this.inputs.slice(0,i).concat(this.inputs.slice(i+1))),this.validateForm()},render:function(){var t=this.props,i=(t.mapping,t.validationErrors,t.onSubmit,t.onValid,t.onValidSubmit,t.onInvalid,t.onInvalidSubmit,t.onChange,t.reset,t.preventExternalInvalidation,t.onSuccess,t.onError,r(t,["mapping","validationErrors","onSubmit","onValid","onValidSubmit","onInvalid","onInvalidSubmit","onChange","reset","preventExternalInvalidation","onSuccess","onError"]));return u.createElement("form",n({},i,{onSubmit:this.submit}),this.props.children)}}),i.exports||i.module||i.define&&i.define.amd||(i.Formsy=o),t.exports=o}).call(i,function(){return this}())},function(i,e){i.exports=t},function(t,i,e){(function(i){"use strict";var r=e(3),n=i.React||e(1),s=function(t){return"string"==typeof t?t.split(/\,(?![^{\[]*[}\]])/g).reduce(function(t,i){var e=i.split(":"),r=e.shift();if(e=e.map(function(t){try{return JSON.parse(t)}catch(i){return t}}),e.length>1)throw new Error("Formsy does not support multiple args on string validations. Use object format of validations instead.");return t[r]=e.length?e[0]:!0,t},{}):t||{}};t.exports={getInitialState:function(){return{_value:this.props.value,_isRequired:!1,_isValid:!0,_isPristine:!0,_pristineValue:this.props.value,_validationError:[],_externalError:null,_formSubmitted:!1}},contextTypes:{formsy:n.PropTypes.object},getDefaultProps:function(){return{validationError:"",validationErrors:{}}},componentWillMount:function(){var t=function(){this.setValidations(this.props.validations,this.props.required),this.context.formsy.attachToForm(this)}.bind(this);if(!this.props.name)throw new Error("Form Input requires a name property when used");t()},componentWillReceiveProps:function(t){this.setValidations(t.validations,t.required)},componentDidUpdate:function(t){r.isSame(this.props.value,t.value)||this.setValue(this.props.value),r.isSame(this.props.validations,t.validations)&&r.isSame(this.props.required,t.required)||this.context.formsy.validate(this)},componentWillUnmount:function(){this.context.formsy.detachFromForm(this)},setValidations:function(t,i){this._validations=s(t)||{},this._requiredValidations=i===!0?{isDefaultRequiredValue:!0}:s(i)},setValue:function(t,i){this.setState({_value:t,_isPristine:!1},function(){this.context.formsy.validate(this),i&&i()}.bind(this))},resetValue:function(){this.setState({_value:this.state._pristineValue,_isPristine:!0},function(){this.context.formsy.validate(this)})},getValue:function(){return this.state._value},hasValue:function(){return""!==this.state._value},getErrorMessage:function(){var t=this.getErrorMessages();return t.length?t[0]:null},getErrorMessages:function(){return!this.isValid()||this.showRequired()?this.state._externalError||this.state._validationError||[]:[]},isFormDisabled:function(){return this.context.formsy.isFormDisabled()},isValid:function(){return this.state._isValid},isPristine:function(){return this.state._isPristine},isFormSubmitted:function(){return this.state._formSubmitted},isRequired:function(){return!!this.props.required},showRequired:function(){return this.state._isRequired},showError:function(){return!this.showRequired()&&!this.isValid()},isValidValue:function(t){return this.context.formsy.isValidValue.call(null,this,t)}}}).call(i,function(){return this}())},function(t,i){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol?"symbol":typeof t};t.exports={arraysDiffer:function(t,i){var e=!1;return t.length!==i.length?e=!0:t.forEach(function(t,r){this.isSame(t,i[r])||(e=!0)},this),e},objectsDiffer:function(t,i){var e=!1;return Object.keys(t).length!==Object.keys(i).length?e=!0:Object.keys(t).forEach(function(r){this.isSame(t[r],i[r])||(e=!0)},this),e},isSame:function(t,i){return("undefined"==typeof t?"undefined":e(t))!==("undefined"==typeof i?"undefined":e(i))?!1:Array.isArray(t)?!this.arraysDiffer(t,i):"function"==typeof t?t.toString()===i.toString():"object"===("undefined"==typeof t?"undefined":e(t))&&null!==t&&null!==i?!this.objectsDiffer(t,i):t===i},find:function(t,i){for(var e=0,r=t.length;r>e;e++){var n=t[e];if(i(n))return n}return null}}},function(t,i,e){(function(i){"use strict";var r=Object.assign||function(t){for(var i=1;i=n}};t.exports=n},function(t,i){function e(t){return Object.keys(t).reduce(function(i,e){var r=e.match(/[^\[]*/i),n=e.match(/\[.*?\]/g)||[];n=[r[0]].concat(n).map(function(t){return t.replace(/\[|\]/g,"")});for(var s=i;n.length;){var u=n.shift();u in s?s=s[u]:(s[u]=n.length?isNaN(n[0])?{}:[]:t[e],s=s[u])}return i},{})}function r(t){function i(t,e,r){return Array.isArray(r)||"[object Object]"===Object.prototype.toString.call(r)?(Object.keys(r).forEach(function(n){i(t,e+"["+n+"]",r[n])}),t):(t[e]=r,t)}var e=Object.keys(t);return e.reduce(function(e,r){return i(e,r,t[r])},{})}t.exports={fromObj:r,toObj:e}}])}); //# sourceMappingURL=formsy-react.js.map \ No newline at end of file diff --git a/release/formsy-react.js.map b/release/formsy-react.js.map index f18572d1..12195840 100644 --- a/release/formsy-react.js.map +++ b/release/formsy-react.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///formsy-react.js","webpack:///webpack/bootstrap de6fab39ce2fbdab0e4e","webpack:///./src/main.js","webpack:///external \"react\"","webpack:///./src/Mixin.js","webpack:///./src/utils.js","webpack:///./src/Decorator.js","webpack:///./src/HOC.js","webpack:///./src/validationRules.js","webpack:///./~/form-data-to-object/index.js"],"names":["root","factory","exports","module","require","define","amd","this","__WEBPACK_EXTERNAL_MODULE_1__","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","global","_objectWithoutProperties","obj","keys","target","i","indexOf","Object","prototype","hasOwnProperty","_extends","assign","arguments","length","source","key","_typeof","Symbol","iterator","constructor","React","Formsy","validationRules","formDataToObject","utils","Mixin","HOC","Decorator","options","emptyArray","defaults","passedOptions","addValidationRule","name","func","Form","createClass","displayName","getInitialState","isValid","isSubmitting","canChange","getDefaultProps","onSuccess","onError","onSubmit","onValidSubmit","onInvalidSubmit","onValid","onInvalid","onChange","validationErrors","preventExternalInvalidation","childContextTypes","formsy","PropTypes","object","getChildContext","_this","attachToForm","detachFromForm","validate","isFormDisabled","isValidValue","component","value","runValidation","componentWillMount","inputs","componentDidMount","validateForm","componentWillUpdate","prevInputNames","map","props","componentDidUpdate","setInputValidationErrors","newInputNames","arraysDiffer","reset","data","setFormPristine","resetModel","submit","event","preventDefault","model","getModel","updateInputsWithError","state","mapModel","mapping","toObj","reduce","mappedModel","keyArray","split","base","currentKey","shift","currentValues","getCurrentValues","forEach","setValue","resetValue","errors","args","_isValid","_validationError","setState","apply","isChanged","isSame","getPristineValues","_this2","index","find","Error","JSON","stringify","_externalError","disabled","_value","isPristine","_formSubmitted","_isPristine","validation","_isRequired","isRequired","error","validationError","validationResults","runRules","_validations","requiredResults","_requiredValidations","failed","success","filter","x","pos","arr","validations","results","validationMethod","push","_this3","onValidationComplete","allIsValid","every","bind","isMounted","componentPos","slice","concat","render","_props","nonFormsyProps","createElement","children","convertValidationsToObject","validateMethod","arg","parse","e","_pristineValue","contextTypes","configure","setValidations","required","context","componentWillReceiveProps","nextProps","prevProps","componentWillUnmount","isDefaultRequiredValue","getValue","hasValue","getErrorMessage","messages","getErrorMessages","showRequired","isFormSubmitted","showError","a","b","isDifferent","item","objectsDiffer","Array","isArray","toString","collection","fn","l","Component","mixins","getDisplayName","_isExisty","undefined","isEmpty","values","isExisty","matchRegexp","regexp","test","isUndefined","isEmptyString","isEmail","isUrl","isTrue","isFalse","isNumeric","isAlpha","isAlphanumeric","isInt","isFloat","isWords","isSpecialWords","isLength","equals","eql","equalsField","field","maxLength","minLength","output","parentKey","match","paths","replace","currentPath","pathKey","isNaN","fromObj","recur","newObj","propName","currVal","v"],"mappings":"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","file":"formsy-react.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"react\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"react\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Formsy\"] = factory(require(\"react\"));\n\telse\n\t\troot[\"Formsy\"] = factory(root[\"react\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_1__) {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"react\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"react\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Formsy\"] = factory(require(\"react\"));\n\telse\n\t\troot[\"Formsy\"] = factory(root[\"react\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_1__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\t\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\t\n\tfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\t\n\tvar React = global.React || __webpack_require__(1);\n\tvar Formsy = {};\n\tvar validationRules = __webpack_require__(6);\n\tvar formDataToObject = __webpack_require__(7);\n\tvar utils = __webpack_require__(3);\n\tvar Mixin = __webpack_require__(2);\n\tvar HOC = __webpack_require__(5);\n\tvar Decorator = __webpack_require__(4);\n\tvar options = {};\n\tvar emptyArray = [];\n\t\n\tFormsy.Mixin = Mixin;\n\tFormsy.HOC = HOC;\n\tFormsy.Decorator = Decorator;\n\t\n\tFormsy.defaults = function (passedOptions) {\n\t options = passedOptions;\n\t};\n\t\n\tFormsy.addValidationRule = function (name, func) {\n\t validationRules[name] = func;\n\t};\n\t\n\tFormsy.Form = React.createClass({\n\t displayName: 'Formsy',\n\t getInitialState: function getInitialState() {\n\t return {\n\t isValid: true,\n\t isSubmitting: false,\n\t canChange: false\n\t };\n\t },\n\t getDefaultProps: function getDefaultProps() {\n\t return {\n\t onSuccess: function onSuccess() {},\n\t onError: function onError() {},\n\t onSubmit: function onSubmit() {},\n\t onValidSubmit: function onValidSubmit() {},\n\t onInvalidSubmit: function onInvalidSubmit() {},\n\t onValid: function onValid() {},\n\t onInvalid: function onInvalid() {},\n\t onChange: function onChange() {},\n\t validationErrors: null,\n\t preventExternalInvalidation: false\n\t };\n\t },\n\t\n\t childContextTypes: {\n\t formsy: React.PropTypes.object\n\t },\n\t getChildContext: function getChildContext() {\n\t var _this = this;\n\t\n\t return {\n\t formsy: {\n\t attachToForm: this.attachToForm,\n\t detachFromForm: this.detachFromForm,\n\t validate: this.validate,\n\t isFormDisabled: this.isFormDisabled,\n\t isValidValue: function isValidValue(component, value) {\n\t return _this.runValidation(component, value).isValid;\n\t }\n\t }\n\t };\n\t },\n\t\n\t // Add a map to store the inputs of the form, a model to store\n\t // the values of the form and register child inputs\n\t componentWillMount: function componentWillMount() {\n\t this.inputs = [];\n\t },\n\t\n\t componentDidMount: function componentDidMount() {\n\t this.validateForm();\n\t },\n\t\n\t componentWillUpdate: function componentWillUpdate() {\n\t // Keep a reference to input names before form updates,\n\t // to check if inputs has changed after render\n\t this.prevInputNames = this.inputs.map(function (component) {\n\t return component.props.name;\n\t });\n\t },\n\t\n\t componentDidUpdate: function componentDidUpdate() {\n\t\n\t if (this.props.validationErrors && _typeof(this.props.validationErrors) === 'object' && Object.keys(this.props.validationErrors).length > 0) {\n\t this.setInputValidationErrors(this.props.validationErrors);\n\t }\n\t\n\t var newInputNames = this.inputs.map(function (component) {\n\t return component.props.name;\n\t });\n\t if (utils.arraysDiffer(this.prevInputNames, newInputNames)) {\n\t this.validateForm();\n\t }\n\t },\n\t\n\t // Allow resetting to specified data\n\t reset: function reset(data) {\n\t this.setFormPristine(true);\n\t this.resetModel(data);\n\t },\n\t\n\t // Update model, submit to url prop and send the model\n\t submit: function submit(event) {\n\t\n\t event && event.preventDefault();\n\t\n\t // Trigger form as not pristine.\n\t // If any inputs have not been touched yet this will make them dirty\n\t // so validation becomes visible (if based on isPristine)\n\t this.setFormPristine(false);\n\t var model = this.getModel();\n\t this.props.onSubmit(model, this.resetModel, this.updateInputsWithError);\n\t this.state.isValid ? this.props.onValidSubmit(model, this.resetModel, this.updateInputsWithError) : this.props.onInvalidSubmit(model, this.resetModel, this.updateInputsWithError);\n\t },\n\t\n\t mapModel: function mapModel(model) {\n\t\n\t if (this.props.mapping) {\n\t return this.props.mapping(model);\n\t } else {\n\t return formDataToObject.toObj(Object.keys(model).reduce(function (mappedModel, key) {\n\t\n\t var keyArray = key.split('.');\n\t var base = mappedModel;\n\t while (keyArray.length) {\n\t var currentKey = keyArray.shift();\n\t base = base[currentKey] = keyArray.length ? base[currentKey] || {} : model[key];\n\t }\n\t\n\t return mappedModel;\n\t }, {}));\n\t }\n\t },\n\t\n\t getModel: function getModel() {\n\t var currentValues = this.getCurrentValues();\n\t return this.mapModel(currentValues);\n\t },\n\t\n\t // Reset each key in the model to the original / initial / specified value\n\t resetModel: function resetModel(data) {\n\t this.inputs.forEach(function (component) {\n\t var name = component.props.name;\n\t if (data && data.hasOwnProperty(name)) {\n\t component.setValue(data[name]);\n\t } else {\n\t component.resetValue();\n\t }\n\t });\n\t this.validateForm();\n\t },\n\t\n\t setInputValidationErrors: function setInputValidationErrors(errors) {\n\t this.inputs.forEach(function (component) {\n\t var name = component.props.name;\n\t var args = [{\n\t _isValid: !(name in errors),\n\t _validationError: typeof errors[name] === 'string' ? [errors[name]] : errors[name]\n\t }];\n\t component.setState.apply(component, args);\n\t });\n\t },\n\t\n\t // Checks if the values have changed from their initial value\n\t isChanged: function isChanged() {\n\t return !utils.isSame(this.getPristineValues(), this.getCurrentValues());\n\t },\n\t\n\t getPristineValues: function getPristineValues() {\n\t return this.inputs.reduce(function (data, component) {\n\t var name = component.props.name;\n\t data[name] = component.props.value;\n\t return data;\n\t }, {});\n\t },\n\t\n\t // Go through errors from server and grab the components\n\t // stored in the inputs map. Change their state to invalid\n\t // and set the serverError message\n\t updateInputsWithError: function updateInputsWithError(errors) {\n\t var _this2 = this;\n\t\n\t Object.keys(errors).forEach(function (name, index) {\n\t var component = utils.find(_this2.inputs, function (component) {\n\t return component.props.name === name;\n\t });\n\t if (!component) {\n\t throw new Error('You are trying to update an input that does not exist. ' + 'Verify errors object with input names. ' + JSON.stringify(errors));\n\t }\n\t var args = [{\n\t _isValid: _this2.props.preventExternalInvalidation || false,\n\t _externalError: typeof errors[name] === 'string' ? [errors[name]] : errors[name]\n\t }];\n\t component.setState.apply(component, args);\n\t });\n\t },\n\t\n\t isFormDisabled: function isFormDisabled() {\n\t return this.props.disabled;\n\t },\n\t\n\t getCurrentValues: function getCurrentValues() {\n\t return this.inputs.reduce(function (data, component) {\n\t var name = component.props.name;\n\t data[name] = component.state._value;\n\t return data;\n\t }, {});\n\t },\n\t\n\t setFormPristine: function setFormPristine(isPristine) {\n\t this.setState({\n\t _formSubmitted: !isPristine\n\t });\n\t\n\t // Iterate through each component and set it as pristine\n\t // or \"dirty\".\n\t this.inputs.forEach(function (component, index) {\n\t component.setState({\n\t _formSubmitted: !isPristine,\n\t _isPristine: isPristine\n\t });\n\t });\n\t },\n\t\n\t // Use the binded values and the actual input value to\n\t // validate the input and set its state. Then check the\n\t // state of the form itself\n\t validate: function validate(component) {\n\t\n\t // Trigger onChange\n\t if (this.state.canChange) {\n\t this.props.onChange(this.getCurrentValues(), this.isChanged());\n\t }\n\t\n\t var validation = this.runValidation(component);\n\t // Run through the validations, split them up and call\n\t // the validator IF there is a value or it is required\n\t component.setState({\n\t _isValid: validation.isValid,\n\t _isRequired: validation.isRequired,\n\t _validationError: validation.error,\n\t _externalError: null\n\t }, this.validateForm);\n\t },\n\t\n\t // Checks validation on current value or a passed value\n\t runValidation: function runValidation(component, value) {\n\t\n\t var currentValues = this.getCurrentValues();\n\t var validationErrors = component.props.validationErrors;\n\t var validationError = component.props.validationError;\n\t value = arguments.length === 2 ? value : component.state._value;\n\t\n\t var validationResults = this.runRules(value, currentValues, component._validations);\n\t var requiredResults = this.runRules(value, currentValues, component._requiredValidations);\n\t\n\t // the component defines an explicit validate function\n\t if (typeof component.validate === \"function\") {\n\t validationResults.failed = component.validate() ? [] : ['failed'];\n\t }\n\t\n\t var isRequired = Object.keys(component._requiredValidations).length ? !!requiredResults.success.length : false;\n\t var isValid = !validationResults.failed.length && !(this.props.validationErrors && this.props.validationErrors[component.props.name]);\n\t\n\t return {\n\t isRequired: isRequired,\n\t isValid: isRequired ? false : isValid,\n\t error: function () {\n\t\n\t if (isValid && !isRequired) {\n\t return emptyArray;\n\t }\n\t\n\t if (validationResults.errors.length) {\n\t return validationResults.errors;\n\t }\n\t\n\t if (this.props.validationErrors && this.props.validationErrors[component.props.name]) {\n\t return typeof this.props.validationErrors[component.props.name] === 'string' ? [this.props.validationErrors[component.props.name]] : this.props.validationErrors[component.props.name];\n\t }\n\t\n\t if (isRequired) {\n\t var error = validationErrors[requiredResults.success[0]];\n\t return error ? [error] : null;\n\t }\n\t\n\t if (validationResults.failed.length) {\n\t return validationResults.failed.map(function (failed) {\n\t return validationErrors[failed] ? validationErrors[failed] : validationError;\n\t }).filter(function (x, pos, arr) {\n\t // Remove duplicates\n\t return arr.indexOf(x) === pos;\n\t });\n\t }\n\t }.call(this)\n\t };\n\t },\n\t\n\t runRules: function runRules(value, currentValues, validations) {\n\t\n\t var results = {\n\t errors: [],\n\t failed: [],\n\t success: []\n\t };\n\t if (Object.keys(validations).length) {\n\t Object.keys(validations).forEach(function (validationMethod) {\n\t\n\t if (validationRules[validationMethod] && typeof validations[validationMethod] === 'function') {\n\t throw new Error('Formsy does not allow you to override default validations: ' + validationMethod);\n\t }\n\t\n\t if (!validationRules[validationMethod] && typeof validations[validationMethod] !== 'function') {\n\t throw new Error('Formsy does not have the validation rule: ' + validationMethod);\n\t }\n\t\n\t if (typeof validations[validationMethod] === 'function') {\n\t var validation = validations[validationMethod](currentValues, value);\n\t if (typeof validation === 'string') {\n\t results.errors.push(validation);\n\t results.failed.push(validationMethod);\n\t } else if (!validation) {\n\t results.failed.push(validationMethod);\n\t }\n\t return;\n\t } else if (typeof validations[validationMethod] !== 'function') {\n\t var validation = validationRules[validationMethod](currentValues, value, validations[validationMethod]);\n\t if (typeof validation === 'string') {\n\t results.errors.push(validation);\n\t results.failed.push(validationMethod);\n\t } else if (!validation) {\n\t results.failed.push(validationMethod);\n\t } else {\n\t results.success.push(validationMethod);\n\t }\n\t return;\n\t }\n\t\n\t return results.success.push(validationMethod);\n\t });\n\t }\n\t\n\t return results;\n\t },\n\t\n\t // Validate the form by going through all child input components\n\t // and check their state\n\t validateForm: function validateForm() {\n\t var _this3 = this;\n\t\n\t // We need a callback as we are validating all inputs again. This will\n\t // run when the last component has set its state\n\t var onValidationComplete = function () {\n\t var allIsValid = this.inputs.every(function (component) {\n\t return component.state._isValid;\n\t });\n\t\n\t this.setState({\n\t isValid: allIsValid\n\t });\n\t\n\t if (allIsValid) {\n\t this.props.onValid();\n\t } else {\n\t this.props.onInvalid();\n\t }\n\t\n\t // Tell the form that it can start to trigger change events\n\t this.setState({\n\t canChange: true\n\t });\n\t }.bind(this);\n\t\n\t // Run validation again in case affected by other inputs. The\n\t // last component validated will run the onValidationComplete callback\n\t this.inputs.forEach(function (component, index) {\n\t var validation = _this3.runValidation(component);\n\t if (validation.isValid && component.state._externalError) {\n\t validation.isValid = false;\n\t }\n\t component.setState({\n\t _isValid: validation.isValid,\n\t _isRequired: validation.isRequired,\n\t _validationError: validation.error,\n\t _externalError: !validation.isValid && component.state._externalError ? component.state._externalError : null\n\t }, index === _this3.inputs.length - 1 ? onValidationComplete : null);\n\t });\n\t\n\t // If there are no inputs, set state where form is ready to trigger\n\t // change event. New inputs might be added later\n\t if (!this.inputs.length && this.isMounted()) {\n\t this.setState({\n\t canChange: true\n\t });\n\t }\n\t },\n\t\n\t // Method put on each input component to register\n\t // itself to the form\n\t attachToForm: function attachToForm(component) {\n\t\n\t if (this.inputs.indexOf(component) === -1) {\n\t this.inputs.push(component);\n\t }\n\t\n\t this.validate(component);\n\t },\n\t\n\t // Method put on each input component to unregister\n\t // itself from the form\n\t detachFromForm: function detachFromForm(component) {\n\t var componentPos = this.inputs.indexOf(component);\n\t\n\t if (componentPos !== -1) {\n\t this.inputs = this.inputs.slice(0, componentPos).concat(this.inputs.slice(componentPos + 1));\n\t }\n\t\n\t this.validateForm();\n\t },\n\t render: function render() {\n\t var _props = this.props;\n\t var mapping = _props.mapping;\n\t var validationErrors = _props.validationErrors;\n\t var onSubmit = _props.onSubmit;\n\t var onValid = _props.onValid;\n\t var onValidSubmit = _props.onValidSubmit;\n\t var onInvalid = _props.onInvalid;\n\t var onInvalidSubmit = _props.onInvalidSubmit;\n\t var onChange = _props.onChange;\n\t var reset = _props.reset;\n\t var preventExternalInvalidation = _props.preventExternalInvalidation;\n\t var onSuccess = _props.onSuccess;\n\t var onError = _props.onError;\n\t\n\t var nonFormsyProps = _objectWithoutProperties(_props, ['mapping', 'validationErrors', 'onSubmit', 'onValid', 'onValidSubmit', 'onInvalid', 'onInvalidSubmit', 'onChange', 'reset', 'preventExternalInvalidation', 'onSuccess', 'onError']);\n\t\n\t return React.createElement(\n\t 'form',\n\t _extends({}, nonFormsyProps, { onSubmit: this.submit }),\n\t this.props.children\n\t );\n\t }\n\t});\n\t\n\tif (!global.exports && !global.module && (!global.define || !global.define.amd)) {\n\t global.Formsy = Formsy;\n\t}\n\t\n\tmodule.exports = Formsy;\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 1 */\n/***/ function(module, exports) {\n\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_1__;\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\t\n\tvar utils = __webpack_require__(3);\n\tvar React = global.React || __webpack_require__(1);\n\t\n\tvar convertValidationsToObject = function convertValidationsToObject(validations) {\n\t\n\t if (typeof validations === 'string') {\n\t\n\t return validations.split(/\\,(?![^{\\[]*[}\\]])/g).reduce(function (validations, validation) {\n\t var args = validation.split(':');\n\t var validateMethod = args.shift();\n\t\n\t args = args.map(function (arg) {\n\t try {\n\t return JSON.parse(arg);\n\t } catch (e) {\n\t return arg; // It is a string if it can not parse it\n\t }\n\t });\n\t\n\t if (args.length > 1) {\n\t throw new Error('Formsy does not support multiple args on string validations. Use object format of validations instead.');\n\t }\n\t\n\t validations[validateMethod] = args.length ? args[0] : true;\n\t return validations;\n\t }, {});\n\t }\n\t\n\t return validations || {};\n\t};\n\t\n\tmodule.exports = {\n\t getInitialState: function getInitialState() {\n\t return {\n\t _value: this.props.value,\n\t _isRequired: false,\n\t _isValid: true,\n\t _isPristine: true,\n\t _pristineValue: this.props.value,\n\t _validationError: [],\n\t _externalError: null,\n\t _formSubmitted: false\n\t };\n\t },\n\t contextTypes: {\n\t formsy: React.PropTypes.object // What about required?\n\t },\n\t getDefaultProps: function getDefaultProps() {\n\t return {\n\t validationError: '',\n\t validationErrors: {}\n\t };\n\t },\n\t\n\t componentWillMount: function componentWillMount() {\n\t var configure = function () {\n\t this.setValidations(this.props.validations, this.props.required);\n\t\n\t // Pass a function instead?\n\t this.context.formsy.attachToForm(this);\n\t //this.props._attachToForm(this);\n\t }.bind(this);\n\t\n\t if (!this.props.name) {\n\t throw new Error('Form Input requires a name property when used');\n\t }\n\t\n\t /*\r\n\t if (!this.props._attachToForm) {\r\n\t return setTimeout(function () {\r\n\t if (!this.isMounted()) return;\r\n\t if (!this.props._attachToForm) {\r\n\t throw new Error('Form Mixin requires component to be nested in a Form');\r\n\t }\r\n\t configure();\r\n\t }.bind(this), 0);\r\n\t }\r\n\t */\n\t configure();\n\t },\n\t\n\t // We have to make the validate method is kept when new props are added\n\t componentWillReceiveProps: function componentWillReceiveProps(nextProps) {\n\t this.setValidations(nextProps.validations, nextProps.required);\n\t },\n\t\n\t componentDidUpdate: function componentDidUpdate(prevProps) {\n\t\n\t // If the value passed has changed, set it. If value is not passed it will\n\t // internally update, and this will never run\n\t if (!utils.isSame(this.props.value, prevProps.value)) {\n\t this.setValue(this.props.value);\n\t }\n\t\n\t // If validations or required is changed, run a new validation\n\t if (!utils.isSame(this.props.validations, prevProps.validations) || !utils.isSame(this.props.required, prevProps.required)) {\n\t this.context.formsy.validate(this);\n\t }\n\t },\n\t\n\t // Detach it when component unmounts\n\t componentWillUnmount: function componentWillUnmount() {\n\t this.context.formsy.detachFromForm(this);\n\t //this.props._detachFromForm(this);\n\t },\n\t\n\t setValidations: function setValidations(validations, required) {\n\t\n\t // Add validations to the store itself as the props object can not be modified\n\t this._validations = convertValidationsToObject(validations) || {};\n\t this._requiredValidations = required === true ? { isDefaultRequiredValue: true } : convertValidationsToObject(required);\n\t },\n\t\n\t // We validate after the value has been set\n\t setValue: function setValue(value) {\n\t this.setState({\n\t _value: value,\n\t _isPristine: false\n\t }, function () {\n\t this.context.formsy.validate(this);\n\t //this.props._validate(this);\n\t }.bind(this));\n\t },\n\t resetValue: function resetValue() {\n\t this.setState({\n\t _value: this.state._pristineValue,\n\t _isPristine: true\n\t }, function () {\n\t this.context.formsy.validate(this);\n\t //this.props._validate(this);\n\t });\n\t },\n\t getValue: function getValue() {\n\t return this.state._value;\n\t },\n\t hasValue: function hasValue() {\n\t return this.state._value !== '';\n\t },\n\t getErrorMessage: function getErrorMessage() {\n\t var messages = this.getErrorMessages();\n\t return messages.length ? messages[0] : null;\n\t },\n\t getErrorMessages: function getErrorMessages() {\n\t return !this.isValid() || this.showRequired() ? this.state._externalError || this.state._validationError || [] : [];\n\t },\n\t isFormDisabled: function isFormDisabled() {\n\t return this.context.formsy.isFormDisabled();\n\t //return this.props._isFormDisabled();\n\t },\n\t isValid: function isValid() {\n\t return this.state._isValid;\n\t },\n\t isPristine: function isPristine() {\n\t return this.state._isPristine;\n\t },\n\t isFormSubmitted: function isFormSubmitted() {\n\t return this.state._formSubmitted;\n\t },\n\t isRequired: function isRequired() {\n\t return !!this.props.required;\n\t },\n\t showRequired: function showRequired() {\n\t return this.state._isRequired;\n\t },\n\t showError: function showError() {\n\t return !this.showRequired() && !this.isValid();\n\t },\n\t isValidValue: function isValidValue(value) {\n\t return this.context.formsy.isValidValue.call(null, this, value);\n\t //return this.props._isValidValue.call(null, this, value);\n\t }\n\t};\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\t\n\tmodule.exports = {\n\t arraysDiffer: function arraysDiffer(a, b) {\n\t var isDifferent = false;\n\t if (a.length !== b.length) {\n\t isDifferent = true;\n\t } else {\n\t a.forEach(function (item, index) {\n\t if (!this.isSame(item, b[index])) {\n\t isDifferent = true;\n\t }\n\t }, this);\n\t }\n\t return isDifferent;\n\t },\n\t\n\t objectsDiffer: function objectsDiffer(a, b) {\n\t var isDifferent = false;\n\t if (Object.keys(a).length !== Object.keys(b).length) {\n\t isDifferent = true;\n\t } else {\n\t Object.keys(a).forEach(function (key) {\n\t if (!this.isSame(a[key], b[key])) {\n\t isDifferent = true;\n\t }\n\t }, this);\n\t }\n\t return isDifferent;\n\t },\n\t\n\t isSame: function isSame(a, b) {\n\t if ((typeof a === 'undefined' ? 'undefined' : _typeof(a)) !== (typeof b === 'undefined' ? 'undefined' : _typeof(b))) {\n\t return false;\n\t } else if (Array.isArray(a)) {\n\t return !this.arraysDiffer(a, b);\n\t } else if (typeof a === 'function') {\n\t return a.toString() === b.toString();\n\t } else if ((typeof a === 'undefined' ? 'undefined' : _typeof(a)) === 'object' && a !== null && b !== null) {\n\t return !this.objectsDiffer(a, b);\n\t }\n\t\n\t return a === b;\n\t },\n\t\n\t find: function find(collection, fn) {\n\t for (var i = 0, l = collection.length; i < l; i++) {\n\t var item = collection[i];\n\t if (fn(item)) {\n\t return item;\n\t }\n\t }\n\t return null;\n\t }\n\t};\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\t\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\t\n\tvar React = global.React || __webpack_require__(1);\n\tvar Mixin = __webpack_require__(2);\n\tmodule.exports = function () {\n\t return function (Component) {\n\t return React.createClass({\n\t mixins: [Mixin],\n\t render: function render() {\n\t return React.createElement(Component, _extends({\n\t setValidations: this.setValidations,\n\t setValue: this.setValue,\n\t resetValue: this.resetValue,\n\t getValue: this.getValue,\n\t hasValue: this.hasValue,\n\t getErrorMessage: this.getErrorMessage,\n\t getErrorMessages: this.getErrorMessages,\n\t isFormDisabled: this.isFormDisabled,\n\t isValid: this.isValid,\n\t isPristine: this.isPristine,\n\t isFormSubmitted: this.isFormSubmitted,\n\t isRequired: this.isRequired,\n\t showRequired: this.showRequired,\n\t showError: this.showError,\n\t isValidValue: this.isValidValue\n\t }, this.props));\n\t }\n\t });\n\t };\n\t};\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\t\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\t\n\tvar React = global.React || __webpack_require__(1);\n\tvar Mixin = __webpack_require__(2);\n\tmodule.exports = function (Component) {\n\t return React.createClass({\n\t displayName: 'Formsy(' + getDisplayName(Component) + ')',\n\t mixins: [Mixin],\n\t render: function render() {\n\t return React.createElement(Component, _extends({\n\t setValidations: this.setValidations,\n\t setValue: this.setValue,\n\t resetValue: this.resetValue,\n\t getValue: this.getValue,\n\t hasValue: this.hasValue,\n\t getErrorMessage: this.getErrorMessage,\n\t getErrorMessages: this.getErrorMessages,\n\t isFormDisabled: this.isFormDisabled,\n\t isValid: this.isValid,\n\t isPristine: this.isPristine,\n\t isFormSubmitted: this.isFormSubmitted,\n\t isRequired: this.isRequired,\n\t showRequired: this.showRequired,\n\t showError: this.showError,\n\t isValidValue: this.isValidValue\n\t }, this.props));\n\t }\n\t });\n\t};\n\t\n\tfunction getDisplayName(Component) {\n\t return Component.displayName || Component.name || (typeof Component === 'string' ? Component : 'Component');\n\t}\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tvar _isExisty = function _isExisty(value) {\n\t return value !== null && value !== undefined;\n\t};\n\t\n\tvar isEmpty = function isEmpty(value) {\n\t return value === '';\n\t};\n\t\n\tvar validations = {\n\t isDefaultRequiredValue: function isDefaultRequiredValue(values, value) {\n\t return value === undefined || value === '';\n\t },\n\t isExisty: function isExisty(values, value) {\n\t return _isExisty(value);\n\t },\n\t matchRegexp: function matchRegexp(values, value, regexp) {\n\t return !_isExisty(value) || isEmpty(value) || regexp.test(value);\n\t },\n\t isUndefined: function isUndefined(values, value) {\n\t return value === undefined;\n\t },\n\t isEmptyString: function isEmptyString(values, value) {\n\t return isEmpty(value);\n\t },\n\t isEmail: function isEmail(values, value) {\n\t return validations.matchRegexp(values, value, /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i);\n\t },\n\t isUrl: function isUrl(values, value) {\n\t return validations.matchRegexp(values, value, /^(https?|s?ftp):\\/\\/(((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(#((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i);\n\t },\n\t isTrue: function isTrue(values, value) {\n\t return value === true;\n\t },\n\t isFalse: function isFalse(values, value) {\n\t return value === false;\n\t },\n\t isNumeric: function isNumeric(values, value) {\n\t if (typeof value === 'number') {\n\t return true;\n\t }\n\t return validations.matchRegexp(values, value, /^[-+]?(?:\\d*[.])?\\d+$/);\n\t },\n\t isAlpha: function isAlpha(values, value) {\n\t return validations.matchRegexp(values, value, /^[A-Z]+$/i);\n\t },\n\t isAlphanumeric: function isAlphanumeric(values, value) {\n\t return validations.matchRegexp(values, value, /^[0-9A-Z]+$/i);\n\t },\n\t isInt: function isInt(values, value) {\n\t return validations.matchRegexp(values, value, /^(?:[-+]?(?:0|[1-9]\\d*))$/);\n\t },\n\t isFloat: function isFloat(values, value) {\n\t return validations.matchRegexp(values, value, /^(?:[-+]?(?:\\d+))?(?:\\.\\d*)?(?:[eE][\\+\\-]?(?:\\d+))?$/);\n\t },\n\t isWords: function isWords(values, value) {\n\t return validations.matchRegexp(values, value, /^[A-Z\\s]+$/i);\n\t },\n\t isSpecialWords: function isSpecialWords(values, value) {\n\t return validations.matchRegexp(values, value, /^[A-Z\\s\\u00C0-\\u017F]+$/i);\n\t },\n\t isLength: function isLength(values, value, length) {\n\t return !_isExisty(value) || isEmpty(value) || value.length === length;\n\t },\n\t equals: function equals(values, value, eql) {\n\t return !_isExisty(value) || isEmpty(value) || value == eql;\n\t },\n\t equalsField: function equalsField(values, value, field) {\n\t return value == values[field];\n\t },\n\t maxLength: function maxLength(values, value, length) {\n\t return !_isExisty(value) || value.length <= length;\n\t },\n\t minLength: function minLength(values, value, length) {\n\t return !_isExisty(value) || isEmpty(value) || value.length >= length;\n\t }\n\t};\n\t\n\tmodule.exports = validations;\n\n/***/ },\n/* 7 */\n/***/ function(module, exports) {\n\n\tfunction toObj(source) {\n\t return Object.keys(source).reduce(function (output, key) {\n\t var parentKey = key.match(/[^\\[]*/i);\n\t var paths = key.match(/\\[.*?\\]/g) || [];\n\t paths = [parentKey[0]].concat(paths).map(function (key) {\n\t return key.replace(/\\[|\\]/g, '');\n\t });\n\t var currentPath = output;\n\t while (paths.length) {\n\t var pathKey = paths.shift();\n\t\n\t if (pathKey in currentPath) {\n\t currentPath = currentPath[pathKey];\n\t } else {\n\t currentPath[pathKey] = paths.length ? isNaN(paths[0]) ? {} : [] : source[key];\n\t currentPath = currentPath[pathKey];\n\t }\n\t }\n\t\n\t return output;\n\t }, {});\n\t}\n\t\n\tfunction fromObj(obj) {\n\t function recur(newObj, propName, currVal) {\n\t if (Array.isArray(currVal) || Object.prototype.toString.call(currVal) === '[object Object]') {\n\t Object.keys(currVal).forEach(function(v) {\n\t recur(newObj, propName + \"[\" + v + \"]\", currVal[v]);\n\t });\n\t return newObj;\n\t }\n\t\n\t newObj[propName] = currVal;\n\t return newObj;\n\t }\n\t\n\t var keys = Object.keys(obj);\n\t return keys.reduce(function(newObj, propName) {\n\t return recur(newObj, propName, obj[propName]);\n\t }, {});\n\t}\n\t\n\tmodule.exports = {\n\t fromObj: fromObj,\n\t toObj: toObj\n\t}\n\n/***/ }\n/******/ ])\n});\n;\n\n\n/** WEBPACK FOOTER **\n ** formsy-react.js\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap de6fab39ce2fbdab0e4e\n **/","var React = global.React || require('react');\nvar Formsy = {};\nvar validationRules = require('./validationRules.js');\nvar formDataToObject = require('form-data-to-object');\nvar utils = require('./utils.js');\nvar Mixin = require('./Mixin.js');\nvar HOC = require('./HOC.js');\nvar Decorator = require('./Decorator.js');\nvar options = {};\nvar emptyArray = [];\n\nFormsy.Mixin = Mixin;\nFormsy.HOC = HOC;\nFormsy.Decorator = Decorator;\n\nFormsy.defaults = function (passedOptions) {\n options = passedOptions;\n};\n\nFormsy.addValidationRule = function (name, func) {\n validationRules[name] = func;\n};\n\nFormsy.Form = React.createClass({\n displayName: 'Formsy',\n getInitialState: function () {\n return {\n isValid: true,\n isSubmitting: false,\n canChange: false\n };\n },\n getDefaultProps: function () {\n return {\n onSuccess: function () {},\n onError: function () {},\n onSubmit: function () {},\n onValidSubmit: function () {},\n onInvalidSubmit: function () {},\n onValid: function () {},\n onInvalid: function () {},\n onChange: function () {},\n validationErrors: null,\n preventExternalInvalidation: false\n };\n },\n\n childContextTypes: {\n formsy: React.PropTypes.object\n },\n getChildContext: function () {\n return {\n formsy: {\n attachToForm: this.attachToForm,\n detachFromForm: this.detachFromForm,\n validate: this.validate,\n isFormDisabled: this.isFormDisabled,\n isValidValue: (component, value) => {\n return this.runValidation(component, value).isValid;\n }\n }\n }\n },\n\n // Add a map to store the inputs of the form, a model to store\n // the values of the form and register child inputs\n componentWillMount: function () {\n this.inputs = [];\n },\n\n componentDidMount: function () {\n this.validateForm();\n },\n\n componentWillUpdate: function () {\n // Keep a reference to input names before form updates,\n // to check if inputs has changed after render\n this.prevInputNames = this.inputs.map(component => component.props.name);\n },\n\n componentDidUpdate: function () {\n\n if (this.props.validationErrors && typeof this.props.validationErrors === 'object' && Object.keys(this.props.validationErrors).length > 0) {\n this.setInputValidationErrors(this.props.validationErrors);\n }\n\n var newInputNames = this.inputs.map(component => component.props.name);\n if (utils.arraysDiffer(this.prevInputNames, newInputNames)) {\n this.validateForm();\n }\n\n },\n\n // Allow resetting to specified data\n reset: function (data) {\n this.setFormPristine(true);\n this.resetModel(data);\n },\n\n // Update model, submit to url prop and send the model\n submit: function (event) {\n\n event && event.preventDefault();\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 var model = this.getModel();\n this.props.onSubmit(model, this.resetModel, this.updateInputsWithError);\n this.state.isValid ? this.props.onValidSubmit(model, this.resetModel, this.updateInputsWithError) : this.props.onInvalidSubmit(model, this.resetModel, this.updateInputsWithError);\n\n },\n\n mapModel: function (model) {\n\n if (this.props.mapping) {\n return this.props.mapping(model)\n } else {\n return formDataToObject.toObj(Object.keys(model).reduce((mappedModel, key) => {\n\n var keyArray = key.split('.');\n var base = mappedModel;\n while (keyArray.length) {\n var currentKey = keyArray.shift();\n base = (base[currentKey] = keyArray.length ? base[currentKey] || {} : model[key]);\n }\n\n return mappedModel;\n\n }, {}));\n }\n },\n\n getModel: function () {\n var currentValues = this.getCurrentValues();\n return this.mapModel(currentValues);\n },\n\n // Reset each key in the model to the original / initial / specified value\n resetModel: function (data) {\n this.inputs.forEach(component => {\n var name = component.props.name;\n if (data && data.hasOwnProperty(name)) {\n component.setValue(data[name]);\n } else {\n component.resetValue();\n }\n });\n this.validateForm();\n },\n\n setInputValidationErrors: function (errors) {\n this.inputs.forEach(component => {\n var name = component.props.name;\n var args = [{\n _isValid: !(name in errors),\n _validationError: typeof errors[name] === 'string' ? [errors[name]] : errors[name]\n }];\n component.setState.apply(component, args);\n });\n },\n\n // Checks if the values have changed from their initial value\n isChanged: function() {\n return !utils.isSame(this.getPristineValues(), this.getCurrentValues());\n },\n\n getPristineValues: function() {\n return this.inputs.reduce((data, component) => {\n var name = component.props.name;\n data[name] = component.props.value;\n return data;\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 updateInputsWithError: function (errors) {\n Object.keys(errors).forEach((name, index) => {\n var component = utils.find(this.inputs, component => component.props.name === name);\n if (!component) {\n throw new Error('You are trying to update an input that does not exist. ' +\n 'Verify errors object with input names. ' + JSON.stringify(errors));\n }\n var args = [{\n _isValid: this.props.preventExternalInvalidation || false,\n _externalError: typeof errors[name] === 'string' ? [errors[name]] : errors[name]\n }];\n component.setState.apply(component, args);\n });\n },\n\n isFormDisabled: function () {\n return this.props.disabled;\n },\n\n getCurrentValues: function () {\n return this.inputs.reduce((data, component) => {\n var name = component.props.name;\n data[name] = component.state._value;\n return data;\n }, {});\n },\n\n setFormPristine: function (isPristine) {\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, index) => {\n component.setState({\n _formSubmitted: !isPristine,\n _isPristine: isPristine\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 validate: function (component) {\n\n // Trigger onChange\n if (this.state.canChange) {\n this.props.onChange(this.getCurrentValues(), this.isChanged());\n }\n\n var validation = this.runValidation(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({\n _isValid: validation.isValid,\n _isRequired: validation.isRequired,\n _validationError: validation.error,\n _externalError: null\n }, this.validateForm);\n\n },\n\n // Checks validation on current value or a passed value\n runValidation: function (component, value) {\n\n var currentValues = this.getCurrentValues();\n var validationErrors = component.props.validationErrors;\n var validationError = component.props.validationError;\n value = arguments.length === 2 ? value : component.state._value;\n\n var validationResults = this.runRules(value, currentValues, component._validations);\n var requiredResults = this.runRules(value, currentValues, component._requiredValidations);\n\n // the component defines an explicit validate function\n if (typeof component.validate === \"function\") {\n validationResults.failed = component.validate() ? [] : ['failed'];\n }\n\n var isRequired = Object.keys(component._requiredValidations).length ? !!requiredResults.success.length : false;\n var isValid = !validationResults.failed.length && !(this.props.validationErrors && this.props.validationErrors[component.props.name]);\n\n return {\n isRequired: isRequired,\n isValid: isRequired ? false : isValid,\n error: (function () {\n\n if (isValid && !isRequired) {\n return emptyArray;\n }\n\n if (validationResults.errors.length) {\n return validationResults.errors;\n }\n\n if (this.props.validationErrors && this.props.validationErrors[component.props.name]) {\n return typeof this.props.validationErrors[component.props.name] === 'string' ? [this.props.validationErrors[component.props.name]] : this.props.validationErrors[component.props.name];\n }\n\n if (isRequired) {\n var error = validationErrors[requiredResults.success[0]];\n return error ? [error] : null;\n }\n\n if (validationResults.failed.length) {\n return validationResults.failed.map(function(failed) {\n return validationErrors[failed] ? validationErrors[failed] : validationError;\n }).filter(function(x, pos, arr) {\n // Remove duplicates\n return arr.indexOf(x) === pos;\n });\n }\n\n }.call(this))\n };\n\n },\n\n runRules: function (value, currentValues, validations) {\n\n var results = {\n errors: [],\n failed: [],\n success: []\n };\n if (Object.keys(validations).length) {\n Object.keys(validations).forEach(function (validationMethod) {\n\n if (validationRules[validationMethod] && typeof validations[validationMethod] === 'function') {\n throw new Error('Formsy does not allow you to override default validations: ' + validationMethod);\n }\n\n if (!validationRules[validationMethod] && typeof validations[validationMethod] !== 'function') {\n throw new Error('Formsy does not have the validation rule: ' + validationMethod);\n }\n\n if (typeof validations[validationMethod] === 'function') {\n var validation = validations[validationMethod](currentValues, value);\n if (typeof validation === 'string') {\n results.errors.push(validation);\n results.failed.push(validationMethod);\n } else if (!validation) {\n results.failed.push(validationMethod);\n }\n return;\n\n } else if (typeof validations[validationMethod] !== 'function') {\n var validation = validationRules[validationMethod](currentValues, value, validations[validationMethod]);\n if (typeof validation === 'string') {\n results.errors.push(validation);\n results.failed.push(validationMethod);\n } else if (!validation) {\n results.failed.push(validationMethod);\n } else {\n results.success.push(validationMethod);\n }\n return;\n\n }\n\n return results.success.push(validationMethod);\n\n });\n }\n\n return results;\n\n },\n\n // Validate the form by going through all child input components\n // and check their state\n validateForm: function () {\n\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 var onValidationComplete = function () {\n var allIsValid = this.inputs.every(component => {\n return component.state._isValid;\n });\n\n this.setState({\n isValid: allIsValid\n });\n\n if (allIsValid) {\n this.props.onValid();\n } else {\n this.props.onInvalid();\n }\n\n // Tell the form that it can start to trigger change events\n this.setState({\n canChange: true\n });\n\n }.bind(this);\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 var validation = this.runValidation(component);\n if (validation.isValid && component.state._externalError) {\n validation.isValid = false;\n }\n component.setState({\n _isValid: validation.isValid,\n _isRequired: validation.isRequired,\n _validationError: validation.error,\n _externalError: !validation.isValid && component.state._externalError ? component.state._externalError : null\n }, index === this.inputs.length - 1 ? onValidationComplete : null);\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 && this.isMounted()) {\n this.setState({\n canChange: true\n });\n }\n },\n\n // Method put on each input component to register\n // itself to the form\n attachToForm: function (component) {\n\n if (this.inputs.indexOf(component) === -1) {\n this.inputs.push(component);\n }\n\n this.validate(component);\n },\n\n // Method put on each input component to unregister\n // itself from the form\n detachFromForm: function (component) {\n var componentPos = this.inputs.indexOf(component);\n\n if (componentPos !== -1) {\n this.inputs = this.inputs.slice(0, componentPos)\n .concat(this.inputs.slice(componentPos + 1));\n }\n\n this.validateForm();\n },\n render: function () {\n var {\n mapping,\n validationErrors,\n onSubmit,\n onValid,\n onValidSubmit,\n onInvalid,\n onInvalidSubmit,\n onChange,\n reset,\n preventExternalInvalidation,\n onSuccess,\n onError,\n ...nonFormsyProps\n } = this.props;\n\n return (\n
\n {this.props.children}\n
\n );\n\n }\n});\n\nif (!global.exports && !global.module && (!global.define || !global.define.amd)) {\n global.Formsy = Formsy;\n}\n\nmodule.exports = Formsy;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/main.js\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_1__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"react\"\n ** module id = 1\n ** module chunks = 0\n **/","var utils = require('./utils.js');\r\nvar React = global.React || require('react');\r\n\r\nvar convertValidationsToObject = function (validations) {\r\n\r\n if (typeof validations === 'string') {\r\n\r\n return validations.split(/\\,(?![^{\\[]*[}\\]])/g).reduce(function (validations, validation) {\r\n var args = validation.split(':');\r\n var validateMethod = args.shift();\r\n\r\n args = args.map(function (arg) {\r\n try {\r\n return JSON.parse(arg);\r\n } catch (e) {\r\n return arg; // It is a string if it can not parse it\r\n }\r\n });\r\n\r\n if (args.length > 1) {\r\n throw new Error('Formsy does not support multiple args on string validations. Use object format of validations instead.');\r\n }\r\n\r\n validations[validateMethod] = args.length ? args[0] : true;\r\n return validations;\r\n }, {});\r\n\r\n }\r\n\r\n return validations || {};\r\n};\r\n\r\nmodule.exports = {\r\n getInitialState: function () {\r\n return {\r\n _value: this.props.value,\r\n _isRequired: false,\r\n _isValid: true,\r\n _isPristine: true,\r\n _pristineValue: this.props.value,\r\n _validationError: [],\r\n _externalError: null,\r\n _formSubmitted: false\r\n };\r\n },\r\n contextTypes: {\r\n formsy: React.PropTypes.object // What about required?\r\n },\r\n getDefaultProps: function () {\r\n return {\r\n validationError: '',\r\n validationErrors: {}\r\n };\r\n },\r\n\r\n componentWillMount: function () {\r\n var configure = function () {\r\n this.setValidations(this.props.validations, this.props.required);\r\n\r\n // Pass a function instead?\r\n this.context.formsy.attachToForm(this);\r\n //this.props._attachToForm(this);\r\n }.bind(this);\r\n\r\n if (!this.props.name) {\r\n throw new Error('Form Input requires a name property when used');\r\n }\r\n\r\n /*\r\n if (!this.props._attachToForm) {\r\n return setTimeout(function () {\r\n if (!this.isMounted()) return;\r\n if (!this.props._attachToForm) {\r\n throw new Error('Form Mixin requires component to be nested in a Form');\r\n }\r\n configure();\r\n }.bind(this), 0);\r\n }\r\n */\r\n configure();\r\n },\r\n\r\n // We have to make the validate method is kept when new props are added\r\n componentWillReceiveProps: function (nextProps) {\r\n this.setValidations(nextProps.validations, nextProps.required);\r\n\r\n },\r\n\r\n componentDidUpdate: function (prevProps) {\r\n\r\n // If the value passed has changed, set it. If value is not passed it will\r\n // internally update, and this will never run\r\n if (!utils.isSame(this.props.value, prevProps.value)) {\r\n this.setValue(this.props.value);\r\n }\r\n\r\n // If validations or required is changed, run a new validation\r\n if (!utils.isSame(this.props.validations, prevProps.validations) || !utils.isSame(this.props.required, prevProps.required)) {\r\n this.context.formsy.validate(this);\r\n }\r\n },\r\n\r\n // Detach it when component unmounts\r\n componentWillUnmount: function () {\r\n this.context.formsy.detachFromForm(this);\r\n //this.props._detachFromForm(this);\r\n },\r\n\r\n setValidations: function (validations, required) {\r\n\r\n // Add validations to the store itself as the props object can not be modified\r\n this._validations = convertValidationsToObject(validations) || {};\r\n this._requiredValidations = required === true ? {isDefaultRequiredValue: true} : convertValidationsToObject(required);\r\n\r\n },\r\n\r\n // We validate after the value has been set\r\n setValue: function (value) {\r\n this.setState({\r\n _value: value,\r\n _isPristine: false\r\n }, function () {\r\n this.context.formsy.validate(this);\r\n //this.props._validate(this);\r\n }.bind(this));\r\n },\r\n resetValue: function () {\r\n this.setState({\r\n _value: this.state._pristineValue,\r\n _isPristine: true\r\n }, function () {\r\n this.context.formsy.validate(this);\r\n //this.props._validate(this);\r\n });\r\n },\r\n getValue: function () {\r\n return this.state._value;\r\n },\r\n hasValue: function () {\r\n return this.state._value !== '';\r\n },\r\n getErrorMessage: function () {\r\n var messages = this.getErrorMessages();\r\n return messages.length ? messages[0] : null;\r\n },\r\n getErrorMessages: function () {\r\n return !this.isValid() || this.showRequired() ? (this.state._externalError || this.state._validationError || []) : [];\r\n },\r\n isFormDisabled: function () {\r\n return this.context.formsy.isFormDisabled();\r\n //return this.props._isFormDisabled();\r\n },\r\n isValid: function () {\r\n return this.state._isValid;\r\n },\r\n isPristine: function () {\r\n return this.state._isPristine;\r\n },\r\n isFormSubmitted: function () {\r\n return this.state._formSubmitted;\r\n },\r\n isRequired: function () {\r\n return !!this.props.required;\r\n },\r\n showRequired: function () {\r\n return this.state._isRequired;\r\n },\r\n showError: function () {\r\n return !this.showRequired() && !this.isValid();\r\n },\r\n isValidValue: function (value) {\r\n return this.context.formsy.isValidValue.call(null, this, value);\r\n //return this.props._isValidValue.call(null, this, value);\r\n }\r\n};\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/Mixin.js\n **/","module.exports = {\n arraysDiffer: function (a, b) {\n var isDifferent = false;\n if (a.length !== b.length) {\n isDifferent = true;\n } else {\n a.forEach(function (item, index) {\n if (!this.isSame(item, b[index])) {\n isDifferent = true;\n }\n }, this);\n }\n return isDifferent;\n },\n\n objectsDiffer: function (a, b) {\n var isDifferent = false;\n if (Object.keys(a).length !== Object.keys(b).length) {\n isDifferent = true;\n } else {\n Object.keys(a).forEach(function (key) {\n if (!this.isSame(a[key], b[key])) {\n isDifferent = true;\n }\n }, this);\n }\n return isDifferent;\n },\n\n isSame: function (a, b) {\n if (typeof a !== typeof b) {\n return false;\n } else if (Array.isArray(a)) {\n return !this.arraysDiffer(a, b);\n } else if (typeof a === 'function') {\n return a.toString() === b.toString();\n } else if (typeof a === 'object' && a !== null && b !== null) {\n return !this.objectsDiffer(a, b);\n }\n\n return a === b;\n },\n\n find: function (collection, fn) {\n for (var i = 0, l = collection.length; i < l; i++) {\n var item = collection[i];\n if (fn(item)) {\n return item;\n }\n }\n return null;\n }\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils.js\n **/","var React = global.React || require('react');\r\nvar Mixin = require('./Mixin.js');\r\nmodule.exports = function () {\r\n return function (Component) {\r\n return React.createClass({\r\n mixins: [Mixin],\r\n render: function () {\r\n return React.createElement(Component, {\r\n setValidations: this.setValidations,\r\n setValue: this.setValue,\r\n resetValue: this.resetValue,\r\n getValue: this.getValue,\r\n hasValue: this.hasValue,\r\n getErrorMessage: this.getErrorMessage,\r\n getErrorMessages: this.getErrorMessages,\r\n isFormDisabled: this.isFormDisabled,\r\n isValid: this.isValid,\r\n isPristine: this.isPristine,\r\n isFormSubmitted: this.isFormSubmitted,\r\n isRequired: this.isRequired,\r\n showRequired: this.showRequired,\r\n showError: this.showError,\r\n isValidValue: this.isValidValue,\r\n ...this.props\r\n });\r\n }\r\n });\r\n };\r\n};\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/Decorator.js\n **/","var React = global.React || require('react');\r\nvar Mixin = require('./Mixin.js');\r\nmodule.exports = function (Component) {\r\n return React.createClass({\r\n displayName: 'Formsy(' + getDisplayName(Component) + ')',\r\n mixins: [Mixin],\r\n render: function () {\r\n return React.createElement(Component, {\r\n setValidations: this.setValidations,\r\n setValue: this.setValue,\r\n resetValue: this.resetValue,\r\n getValue: this.getValue,\r\n hasValue: this.hasValue,\r\n getErrorMessage: this.getErrorMessage,\r\n getErrorMessages: this.getErrorMessages,\r\n isFormDisabled: this.isFormDisabled,\r\n isValid: this.isValid,\r\n isPristine: this.isPristine,\r\n isFormSubmitted: this.isFormSubmitted,\r\n isRequired: this.isRequired,\r\n showRequired: this.showRequired,\r\n showError: this.showError,\r\n isValidValue: this.isValidValue,\r\n ...this.props\r\n });\r\n }\r\n });\r\n};\r\n\r\nfunction getDisplayName(Component) {\r\n return (\r\n Component.displayName ||\r\n Component.name ||\r\n (typeof Component === 'string' ? Component : 'Component')\r\n );\r\n}\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/HOC.js\n **/","var isExisty = function (value) {\r\n return value !== null && value !== undefined;\r\n};\r\n\r\nvar isEmpty = function (value) {\r\n return value === '';\r\n};\r\n\r\nvar validations = {\r\n isDefaultRequiredValue: function (values, value) {\r\n return value === undefined || value === '';\r\n },\r\n isExisty: function (values, value) {\r\n return isExisty(value);\r\n },\r\n matchRegexp: function (values, value, regexp) {\r\n return !isExisty(value) || isEmpty(value) || regexp.test(value);\r\n },\r\n isUndefined: function (values, value) {\r\n return value === undefined;\r\n },\r\n isEmptyString: function (values, value) {\r\n return isEmpty(value);\r\n },\r\n isEmail: function (values, value) {\r\n return validations.matchRegexp(values, value, /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i);\r\n },\r\n isUrl: function (values, value) {\r\n return validations.matchRegexp(values, value, /^(https?|s?ftp):\\/\\/(((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(#((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i);\r\n },\r\n isTrue: function (values, value) {\r\n return value === true;\r\n },\r\n isFalse: function (values, value) {\r\n return value === false;\r\n },\r\n isNumeric: function (values, value) {\r\n if (typeof value === 'number') {\r\n return true;\r\n }\r\n return validations.matchRegexp(values, value, /^[-+]?(?:\\d*[.])?\\d+$/);\r\n },\r\n isAlpha: function (values, value) {\r\n return validations.matchRegexp(values, value, /^[A-Z]+$/i);\r\n },\r\n isAlphanumeric: function (values, value) {\r\n return validations.matchRegexp(values, value, /^[0-9A-Z]+$/i);\r\n },\r\n isInt: function (values, value) {\r\n return validations.matchRegexp(values, value, /^(?:[-+]?(?:0|[1-9]\\d*))$/);\r\n },\r\n isFloat: function (values, value) {\r\n return validations.matchRegexp(values, value, /^(?:[-+]?(?:\\d+))?(?:\\.\\d*)?(?:[eE][\\+\\-]?(?:\\d+))?$/);\r\n },\r\n isWords: function (values, value) {\r\n return validations.matchRegexp(values, value, /^[A-Z\\s]+$/i);\r\n },\r\n isSpecialWords: function (values, value) {\r\n return validations.matchRegexp(values, value, /^[A-Z\\s\\u00C0-\\u017F]+$/i);\r\n },\r\n isLength: function (values, value, length) {\r\n return !isExisty(value) || isEmpty(value) || value.length === length;\r\n },\r\n equals: function (values, value, eql) {\r\n return !isExisty(value) || isEmpty(value) || value == eql;\r\n },\r\n equalsField: function (values, value, field) {\r\n return value == values[field];\r\n },\r\n maxLength: function (values, value, length) {\r\n return !isExisty(value) || value.length <= length;\r\n },\r\n minLength: function (values, value, length) {\r\n return !isExisty(value) || isEmpty(value) || value.length >= length;\r\n }\r\n};\r\n\r\nmodule.exports = validations;\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/validationRules.js\n **/","function toObj(source) {\n return Object.keys(source).reduce(function (output, key) {\n var parentKey = key.match(/[^\\[]*/i);\n var paths = key.match(/\\[.*?\\]/g) || [];\n paths = [parentKey[0]].concat(paths).map(function (key) {\n return key.replace(/\\[|\\]/g, '');\n });\n var currentPath = output;\n while (paths.length) {\n var pathKey = paths.shift();\n\n if (pathKey in currentPath) {\n currentPath = currentPath[pathKey];\n } else {\n currentPath[pathKey] = paths.length ? isNaN(paths[0]) ? {} : [] : source[key];\n currentPath = currentPath[pathKey];\n }\n }\n\n return output;\n }, {});\n}\n\nfunction fromObj(obj) {\n function recur(newObj, propName, currVal) {\n if (Array.isArray(currVal) || Object.prototype.toString.call(currVal) === '[object Object]') {\n Object.keys(currVal).forEach(function(v) {\n recur(newObj, propName + \"[\" + v + \"]\", currVal[v]);\n });\n return newObj;\n }\n\n newObj[propName] = currVal;\n return newObj;\n }\n\n var keys = Object.keys(obj);\n return keys.reduce(function(newObj, propName) {\n return recur(newObj, propName, obj[propName]);\n }, {});\n}\n\nmodule.exports = {\n fromObj: fromObj,\n toObj: toObj\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/form-data-to-object/index.js\n ** module id = 7\n ** module chunks = 0\n **/"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///formsy-react.js","webpack:///webpack/bootstrap 6e7bbdf9d78f49cc65b9","webpack:///./src/main.js","webpack:///external \"react\"","webpack:///./src/Mixin.js","webpack:///./src/utils.js","webpack:///./src/Decorator.js","webpack:///./src/HOC.js","webpack:///./src/validationRules.js","webpack:///./~/form-data-to-object/index.js"],"names":["root","factory","exports","module","require","define","amd","this","__WEBPACK_EXTERNAL_MODULE_1__","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","global","_objectWithoutProperties","obj","keys","target","i","indexOf","Object","prototype","hasOwnProperty","_extends","assign","arguments","length","source","key","_typeof","Symbol","iterator","constructor","React","Formsy","validationRules","formDataToObject","utils","Mixin","HOC","Decorator","options","emptyArray","defaults","passedOptions","addValidationRule","name","func","Form","createClass","displayName","getInitialState","isValid","isSubmitting","canChange","getDefaultProps","onSuccess","onError","onSubmit","onValidSubmit","onInvalidSubmit","onValid","onInvalid","onChange","validationErrors","preventExternalInvalidation","childContextTypes","formsy","PropTypes","object","getChildContext","_this","attachToForm","detachFromForm","validate","isFormDisabled","isValidValue","component","value","runValidation","componentWillMount","inputs","componentDidMount","validateForm","componentWillUpdate","prevInputNames","map","props","componentDidUpdate","setInputValidationErrors","newInputNames","arraysDiffer","reset","data","setFormPristine","resetModel","submit","event","preventDefault","model","getModel","updateInputsWithError","state","mapModel","mapping","toObj","reduce","mappedModel","keyArray","split","base","currentKey","shift","currentValues","getCurrentValues","forEach","setValue","resetValue","errors","args","_isValid","_validationError","setState","apply","isChanged","isSame","getPristineValues","_this2","index","find","Error","JSON","stringify","_externalError","disabled","_value","isPristine","_formSubmitted","_isPristine","validation","_isRequired","isRequired","error","validationError","validationResults","runRules","_validations","requiredResults","_requiredValidations","failed","success","filter","x","pos","arr","validations","results","validationMethod","push","_this3","onValidationComplete","allIsValid","every","bind","isMounted","componentPos","slice","concat","render","_props","nonFormsyProps","createElement","children","convertValidationsToObject","validateMethod","arg","parse","e","_pristineValue","contextTypes","configure","setValidations","required","context","componentWillReceiveProps","nextProps","prevProps","componentWillUnmount","isDefaultRequiredValue","callback","getValue","hasValue","getErrorMessage","messages","getErrorMessages","showRequired","isFormSubmitted","showError","a","b","isDifferent","item","objectsDiffer","Array","isArray","toString","collection","fn","l","Component","mixins","getDisplayName","_isExisty","undefined","isEmpty","values","isExisty","matchRegexp","regexp","test","isUndefined","isEmptyString","isEmail","isUrl","isTrue","isFalse","isNumeric","isAlpha","isAlphanumeric","isInt","isFloat","isWords","isSpecialWords","isLength","equals","eql","equalsField","field","maxLength","minLength","output","parentKey","match","paths","replace","currentPath","pathKey","isNaN","fromObj","recur","newObj","propName","currVal","v"],"mappings":"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","file":"formsy-react.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"react\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"react\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Formsy\"] = factory(require(\"react\"));\n\telse\n\t\troot[\"Formsy\"] = factory(root[\"react\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_1__) {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"react\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"react\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Formsy\"] = factory(require(\"react\"));\n\telse\n\t\troot[\"Formsy\"] = factory(root[\"react\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_1__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\t\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\t\n\tfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\t\n\tvar React = global.React || __webpack_require__(1);\n\tvar Formsy = {};\n\tvar validationRules = __webpack_require__(6);\n\tvar formDataToObject = __webpack_require__(7);\n\tvar utils = __webpack_require__(3);\n\tvar Mixin = __webpack_require__(2);\n\tvar HOC = __webpack_require__(5);\n\tvar Decorator = __webpack_require__(4);\n\tvar options = {};\n\tvar emptyArray = [];\n\t\n\tFormsy.Mixin = Mixin;\n\tFormsy.HOC = HOC;\n\tFormsy.Decorator = Decorator;\n\t\n\tFormsy.defaults = function (passedOptions) {\n\t options = passedOptions;\n\t};\n\t\n\tFormsy.addValidationRule = function (name, func) {\n\t validationRules[name] = func;\n\t};\n\t\n\tFormsy.Form = React.createClass({\n\t displayName: 'Formsy',\n\t getInitialState: function getInitialState() {\n\t return {\n\t isValid: true,\n\t isSubmitting: false,\n\t canChange: false\n\t };\n\t },\n\t getDefaultProps: function getDefaultProps() {\n\t return {\n\t onSuccess: function onSuccess() {},\n\t onError: function onError() {},\n\t onSubmit: function onSubmit() {},\n\t onValidSubmit: function onValidSubmit() {},\n\t onInvalidSubmit: function onInvalidSubmit() {},\n\t onValid: function onValid() {},\n\t onInvalid: function onInvalid() {},\n\t onChange: function onChange() {},\n\t validationErrors: null,\n\t preventExternalInvalidation: false\n\t };\n\t },\n\t\n\t childContextTypes: {\n\t formsy: React.PropTypes.object\n\t },\n\t getChildContext: function getChildContext() {\n\t var _this = this;\n\t\n\t return {\n\t formsy: {\n\t attachToForm: this.attachToForm,\n\t detachFromForm: this.detachFromForm,\n\t validate: this.validate,\n\t isFormDisabled: this.isFormDisabled,\n\t isValidValue: function isValidValue(component, value) {\n\t return _this.runValidation(component, value).isValid;\n\t }\n\t }\n\t };\n\t },\n\t\n\t // Add a map to store the inputs of the form, a model to store\n\t // the values of the form and register child inputs\n\t componentWillMount: function componentWillMount() {\n\t this.inputs = [];\n\t },\n\t\n\t componentDidMount: function componentDidMount() {\n\t this.validateForm();\n\t },\n\t\n\t componentWillUpdate: function componentWillUpdate() {\n\t // Keep a reference to input names before form updates,\n\t // to check if inputs has changed after render\n\t this.prevInputNames = this.inputs.map(function (component) {\n\t return component.props.name;\n\t });\n\t },\n\t\n\t componentDidUpdate: function componentDidUpdate() {\n\t\n\t if (this.props.validationErrors && _typeof(this.props.validationErrors) === 'object' && Object.keys(this.props.validationErrors).length > 0) {\n\t this.setInputValidationErrors(this.props.validationErrors);\n\t }\n\t\n\t var newInputNames = this.inputs.map(function (component) {\n\t return component.props.name;\n\t });\n\t if (utils.arraysDiffer(this.prevInputNames, newInputNames)) {\n\t this.validateForm();\n\t }\n\t },\n\t\n\t // Allow resetting to specified data\n\t reset: function reset(data) {\n\t this.setFormPristine(true);\n\t this.resetModel(data);\n\t },\n\t\n\t // Update model, submit to url prop and send the model\n\t submit: function submit(event) {\n\t\n\t event && event.preventDefault();\n\t\n\t // Trigger form as not pristine.\n\t // If any inputs have not been touched yet this will make them dirty\n\t // so validation becomes visible (if based on isPristine)\n\t this.setFormPristine(false);\n\t var model = this.getModel();\n\t this.props.onSubmit(model, this.resetModel, this.updateInputsWithError);\n\t this.state.isValid ? this.props.onValidSubmit(model, this.resetModel, this.updateInputsWithError) : this.props.onInvalidSubmit(model, this.resetModel, this.updateInputsWithError);\n\t },\n\t\n\t mapModel: function mapModel(model) {\n\t\n\t if (this.props.mapping) {\n\t return this.props.mapping(model);\n\t } else {\n\t return formDataToObject.toObj(Object.keys(model).reduce(function (mappedModel, key) {\n\t\n\t var keyArray = key.split('.');\n\t var base = mappedModel;\n\t while (keyArray.length) {\n\t var currentKey = keyArray.shift();\n\t base = base[currentKey] = keyArray.length ? base[currentKey] || {} : model[key];\n\t }\n\t\n\t return mappedModel;\n\t }, {}));\n\t }\n\t },\n\t\n\t getModel: function getModel() {\n\t var currentValues = this.getCurrentValues();\n\t return this.mapModel(currentValues);\n\t },\n\t\n\t // Reset each key in the model to the original / initial / specified value\n\t resetModel: function resetModel(data) {\n\t this.inputs.forEach(function (component) {\n\t var name = component.props.name;\n\t if (data && data.hasOwnProperty(name)) {\n\t component.setValue(data[name]);\n\t } else {\n\t component.resetValue();\n\t }\n\t });\n\t this.validateForm();\n\t },\n\t\n\t setInputValidationErrors: function setInputValidationErrors(errors) {\n\t this.inputs.forEach(function (component) {\n\t var name = component.props.name;\n\t var args = [{\n\t _isValid: !(name in errors),\n\t _validationError: typeof errors[name] === 'string' ? [errors[name]] : errors[name]\n\t }];\n\t component.setState.apply(component, args);\n\t });\n\t },\n\t\n\t // Checks if the values have changed from their initial value\n\t isChanged: function isChanged() {\n\t return !utils.isSame(this.getPristineValues(), this.getCurrentValues());\n\t },\n\t\n\t getPristineValues: function getPristineValues() {\n\t return this.inputs.reduce(function (data, component) {\n\t var name = component.props.name;\n\t data[name] = component.props.value;\n\t return data;\n\t }, {});\n\t },\n\t\n\t // Go through errors from server and grab the components\n\t // stored in the inputs map. Change their state to invalid\n\t // and set the serverError message\n\t updateInputsWithError: function updateInputsWithError(errors) {\n\t var _this2 = this;\n\t\n\t Object.keys(errors).forEach(function (name, index) {\n\t var component = utils.find(_this2.inputs, function (component) {\n\t return component.props.name === name;\n\t });\n\t if (!component) {\n\t throw new Error('You are trying to update an input that does not exist. ' + 'Verify errors object with input names. ' + JSON.stringify(errors));\n\t }\n\t var args = [{\n\t _isValid: _this2.props.preventExternalInvalidation || false,\n\t _externalError: typeof errors[name] === 'string' ? [errors[name]] : errors[name]\n\t }];\n\t component.setState.apply(component, args);\n\t });\n\t },\n\t\n\t isFormDisabled: function isFormDisabled() {\n\t return this.props.disabled;\n\t },\n\t\n\t getCurrentValues: function getCurrentValues() {\n\t return this.inputs.reduce(function (data, component) {\n\t var name = component.props.name;\n\t data[name] = component.state._value;\n\t return data;\n\t }, {});\n\t },\n\t\n\t setFormPristine: function setFormPristine(isPristine) {\n\t this.setState({\n\t _formSubmitted: !isPristine\n\t });\n\t\n\t // Iterate through each component and set it as pristine\n\t // or \"dirty\".\n\t this.inputs.forEach(function (component, index) {\n\t component.setState({\n\t _formSubmitted: !isPristine,\n\t _isPristine: isPristine\n\t });\n\t });\n\t },\n\t\n\t // Use the binded values and the actual input value to\n\t // validate the input and set its state. Then check the\n\t // state of the form itself\n\t validate: function validate(component) {\n\t\n\t // Trigger onChange\n\t if (this.state.canChange) {\n\t this.props.onChange(this.getCurrentValues(), this.isChanged());\n\t }\n\t\n\t var validation = this.runValidation(component);\n\t // Run through the validations, split them up and call\n\t // the validator IF there is a value or it is required\n\t component.setState({\n\t _isValid: validation.isValid,\n\t _isRequired: validation.isRequired,\n\t _validationError: validation.error,\n\t _externalError: null\n\t }, this.validateForm);\n\t },\n\t\n\t // Checks validation on current value or a passed value\n\t runValidation: function runValidation(component, value) {\n\t\n\t var currentValues = this.getCurrentValues();\n\t var validationErrors = component.props.validationErrors;\n\t var validationError = component.props.validationError;\n\t value = arguments.length === 2 ? value : component.state._value;\n\t\n\t var validationResults = this.runRules(value, currentValues, component._validations);\n\t var requiredResults = this.runRules(value, currentValues, component._requiredValidations);\n\t\n\t // the component defines an explicit validate function\n\t if (typeof component.validate === \"function\") {\n\t validationResults.failed = component.validate() ? [] : ['failed'];\n\t }\n\t\n\t var isRequired = Object.keys(component._requiredValidations).length ? !!requiredResults.success.length : false;\n\t var isValid = !validationResults.failed.length && !(this.props.validationErrors && this.props.validationErrors[component.props.name]);\n\t\n\t return {\n\t isRequired: isRequired,\n\t isValid: isRequired ? false : isValid,\n\t error: function () {\n\t\n\t if (isValid && !isRequired) {\n\t return emptyArray;\n\t }\n\t\n\t if (validationResults.errors.length) {\n\t return validationResults.errors;\n\t }\n\t\n\t if (this.props.validationErrors && this.props.validationErrors[component.props.name]) {\n\t return typeof this.props.validationErrors[component.props.name] === 'string' ? [this.props.validationErrors[component.props.name]] : this.props.validationErrors[component.props.name];\n\t }\n\t\n\t if (isRequired) {\n\t var error = validationErrors[requiredResults.success[0]];\n\t return error ? [error] : null;\n\t }\n\t\n\t if (validationResults.failed.length) {\n\t return validationResults.failed.map(function (failed) {\n\t return validationErrors[failed] ? validationErrors[failed] : validationError;\n\t }).filter(function (x, pos, arr) {\n\t // Remove duplicates\n\t return arr.indexOf(x) === pos;\n\t });\n\t }\n\t }.call(this)\n\t };\n\t },\n\t\n\t runRules: function runRules(value, currentValues, validations) {\n\t\n\t var results = {\n\t errors: [],\n\t failed: [],\n\t success: []\n\t };\n\t if (Object.keys(validations).length) {\n\t Object.keys(validations).forEach(function (validationMethod) {\n\t\n\t if (validationRules[validationMethod] && typeof validations[validationMethod] === 'function') {\n\t throw new Error('Formsy does not allow you to override default validations: ' + validationMethod);\n\t }\n\t\n\t if (!validationRules[validationMethod] && typeof validations[validationMethod] !== 'function') {\n\t throw new Error('Formsy does not have the validation rule: ' + validationMethod);\n\t }\n\t\n\t if (typeof validations[validationMethod] === 'function') {\n\t var validation = validations[validationMethod](currentValues, value);\n\t if (typeof validation === 'string') {\n\t results.errors.push(validation);\n\t results.failed.push(validationMethod);\n\t } else if (!validation) {\n\t results.failed.push(validationMethod);\n\t }\n\t return;\n\t } else if (typeof validations[validationMethod] !== 'function') {\n\t var validation = validationRules[validationMethod](currentValues, value, validations[validationMethod]);\n\t if (typeof validation === 'string') {\n\t results.errors.push(validation);\n\t results.failed.push(validationMethod);\n\t } else if (!validation) {\n\t results.failed.push(validationMethod);\n\t } else {\n\t results.success.push(validationMethod);\n\t }\n\t return;\n\t }\n\t\n\t return results.success.push(validationMethod);\n\t });\n\t }\n\t\n\t return results;\n\t },\n\t\n\t // Validate the form by going through all child input components\n\t // and check their state\n\t validateForm: function validateForm() {\n\t var _this3 = this;\n\t\n\t // We need a callback as we are validating all inputs again. This will\n\t // run when the last component has set its state\n\t var onValidationComplete = function () {\n\t var allIsValid = this.inputs.every(function (component) {\n\t return component.state._isValid;\n\t });\n\t\n\t this.setState({\n\t isValid: allIsValid\n\t });\n\t\n\t if (allIsValid) {\n\t this.props.onValid();\n\t } else {\n\t this.props.onInvalid();\n\t }\n\t\n\t // Tell the form that it can start to trigger change events\n\t this.setState({\n\t canChange: true\n\t });\n\t }.bind(this);\n\t\n\t // Run validation again in case affected by other inputs. The\n\t // last component validated will run the onValidationComplete callback\n\t this.inputs.forEach(function (component, index) {\n\t var validation = _this3.runValidation(component);\n\t if (validation.isValid && component.state._externalError) {\n\t validation.isValid = false;\n\t }\n\t component.setState({\n\t _isValid: validation.isValid,\n\t _isRequired: validation.isRequired,\n\t _validationError: validation.error,\n\t _externalError: !validation.isValid && component.state._externalError ? component.state._externalError : null\n\t }, index === _this3.inputs.length - 1 ? onValidationComplete : null);\n\t });\n\t\n\t // If there are no inputs, set state where form is ready to trigger\n\t // change event. New inputs might be added later\n\t if (!this.inputs.length && this.isMounted()) {\n\t this.setState({\n\t canChange: true\n\t });\n\t }\n\t },\n\t\n\t // Method put on each input component to register\n\t // itself to the form\n\t attachToForm: function attachToForm(component) {\n\t\n\t if (this.inputs.indexOf(component) === -1) {\n\t this.inputs.push(component);\n\t }\n\t\n\t this.validate(component);\n\t },\n\t\n\t // Method put on each input component to unregister\n\t // itself from the form\n\t detachFromForm: function detachFromForm(component) {\n\t var componentPos = this.inputs.indexOf(component);\n\t\n\t if (componentPos !== -1) {\n\t this.inputs = this.inputs.slice(0, componentPos).concat(this.inputs.slice(componentPos + 1));\n\t }\n\t\n\t this.validateForm();\n\t },\n\t render: function render() {\n\t var _props = this.props;\n\t var mapping = _props.mapping;\n\t var validationErrors = _props.validationErrors;\n\t var onSubmit = _props.onSubmit;\n\t var onValid = _props.onValid;\n\t var onValidSubmit = _props.onValidSubmit;\n\t var onInvalid = _props.onInvalid;\n\t var onInvalidSubmit = _props.onInvalidSubmit;\n\t var onChange = _props.onChange;\n\t var reset = _props.reset;\n\t var preventExternalInvalidation = _props.preventExternalInvalidation;\n\t var onSuccess = _props.onSuccess;\n\t var onError = _props.onError;\n\t\n\t var nonFormsyProps = _objectWithoutProperties(_props, ['mapping', 'validationErrors', 'onSubmit', 'onValid', 'onValidSubmit', 'onInvalid', 'onInvalidSubmit', 'onChange', 'reset', 'preventExternalInvalidation', 'onSuccess', 'onError']);\n\t\n\t return React.createElement(\n\t 'form',\n\t _extends({}, nonFormsyProps, { onSubmit: this.submit }),\n\t this.props.children\n\t );\n\t }\n\t});\n\t\n\tif (!global.exports && !global.module && (!global.define || !global.define.amd)) {\n\t global.Formsy = Formsy;\n\t}\n\t\n\tmodule.exports = Formsy;\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 1 */\n/***/ function(module, exports) {\n\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_1__;\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\t\n\tvar utils = __webpack_require__(3);\n\tvar React = global.React || __webpack_require__(1);\n\t\n\tvar convertValidationsToObject = function convertValidationsToObject(validations) {\n\t\n\t if (typeof validations === 'string') {\n\t\n\t return validations.split(/\\,(?![^{\\[]*[}\\]])/g).reduce(function (validations, validation) {\n\t var args = validation.split(':');\n\t var validateMethod = args.shift();\n\t\n\t args = args.map(function (arg) {\n\t try {\n\t return JSON.parse(arg);\n\t } catch (e) {\n\t return arg; // It is a string if it can not parse it\n\t }\n\t });\n\t\n\t if (args.length > 1) {\n\t throw new Error('Formsy does not support multiple args on string validations. Use object format of validations instead.');\n\t }\n\t\n\t validations[validateMethod] = args.length ? args[0] : true;\n\t return validations;\n\t }, {});\n\t }\n\t\n\t return validations || {};\n\t};\n\t\n\tmodule.exports = {\n\t getInitialState: function getInitialState() {\n\t return {\n\t _value: this.props.value,\n\t _isRequired: false,\n\t _isValid: true,\n\t _isPristine: true,\n\t _pristineValue: this.props.value,\n\t _validationError: [],\n\t _externalError: null,\n\t _formSubmitted: false\n\t };\n\t },\n\t contextTypes: {\n\t formsy: React.PropTypes.object // What about required?\n\t },\n\t getDefaultProps: function getDefaultProps() {\n\t return {\n\t validationError: '',\n\t validationErrors: {}\n\t };\n\t },\n\t\n\t componentWillMount: function componentWillMount() {\n\t var configure = function () {\n\t this.setValidations(this.props.validations, this.props.required);\n\t\n\t // Pass a function instead?\n\t this.context.formsy.attachToForm(this);\n\t //this.props._attachToForm(this);\n\t }.bind(this);\n\t\n\t if (!this.props.name) {\n\t throw new Error('Form Input requires a name property when used');\n\t }\n\t\n\t /*\n\t if (!this.props._attachToForm) {\n\t return setTimeout(function () {\n\t if (!this.isMounted()) return;\n\t if (!this.props._attachToForm) {\n\t throw new Error('Form Mixin requires component to be nested in a Form');\n\t }\n\t configure();\n\t }.bind(this), 0);\n\t }\n\t */\n\t configure();\n\t },\n\t\n\t // We have to make the validate method is kept when new props are added\n\t componentWillReceiveProps: function componentWillReceiveProps(nextProps) {\n\t this.setValidations(nextProps.validations, nextProps.required);\n\t },\n\t\n\t componentDidUpdate: function componentDidUpdate(prevProps) {\n\t\n\t // If the value passed has changed, set it. If value is not passed it will\n\t // internally update, and this will never run\n\t if (!utils.isSame(this.props.value, prevProps.value)) {\n\t this.setValue(this.props.value);\n\t }\n\t\n\t // If validations or required is changed, run a new validation\n\t if (!utils.isSame(this.props.validations, prevProps.validations) || !utils.isSame(this.props.required, prevProps.required)) {\n\t this.context.formsy.validate(this);\n\t }\n\t },\n\t\n\t // Detach it when component unmounts\n\t componentWillUnmount: function componentWillUnmount() {\n\t this.context.formsy.detachFromForm(this);\n\t //this.props._detachFromForm(this);\n\t },\n\t\n\t setValidations: function setValidations(validations, required) {\n\t\n\t // Add validations to the store itself as the props object can not be modified\n\t this._validations = convertValidationsToObject(validations) || {};\n\t this._requiredValidations = required === true ? { isDefaultRequiredValue: true } : convertValidationsToObject(required);\n\t },\n\t\n\t // We validate after the value has been set\n\t setValue: function setValue(value, callback) {\n\t this.setState({\n\t _value: value,\n\t _isPristine: false\n\t }, function () {\n\t this.context.formsy.validate(this);\n\t //this.props._validate(this);\n\t\n\t if (callback) {\n\t callback();\n\t }\n\t }.bind(this));\n\t },\n\t resetValue: function resetValue() {\n\t this.setState({\n\t _value: this.state._pristineValue,\n\t _isPristine: true\n\t }, function () {\n\t this.context.formsy.validate(this);\n\t //this.props._validate(this);\n\t });\n\t },\n\t getValue: function getValue() {\n\t return this.state._value;\n\t },\n\t hasValue: function hasValue() {\n\t return this.state._value !== '';\n\t },\n\t getErrorMessage: function getErrorMessage() {\n\t var messages = this.getErrorMessages();\n\t return messages.length ? messages[0] : null;\n\t },\n\t getErrorMessages: function getErrorMessages() {\n\t return !this.isValid() || this.showRequired() ? this.state._externalError || this.state._validationError || [] : [];\n\t },\n\t isFormDisabled: function isFormDisabled() {\n\t return this.context.formsy.isFormDisabled();\n\t //return this.props._isFormDisabled();\n\t },\n\t isValid: function isValid() {\n\t return this.state._isValid;\n\t },\n\t isPristine: function isPristine() {\n\t return this.state._isPristine;\n\t },\n\t isFormSubmitted: function isFormSubmitted() {\n\t return this.state._formSubmitted;\n\t },\n\t isRequired: function isRequired() {\n\t return !!this.props.required;\n\t },\n\t showRequired: function showRequired() {\n\t return this.state._isRequired;\n\t },\n\t showError: function showError() {\n\t return !this.showRequired() && !this.isValid();\n\t },\n\t isValidValue: function isValidValue(value) {\n\t return this.context.formsy.isValidValue.call(null, this, value);\n\t //return this.props._isValidValue.call(null, this, value);\n\t }\n\t};\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\t\n\tmodule.exports = {\n\t arraysDiffer: function arraysDiffer(a, b) {\n\t var isDifferent = false;\n\t if (a.length !== b.length) {\n\t isDifferent = true;\n\t } else {\n\t a.forEach(function (item, index) {\n\t if (!this.isSame(item, b[index])) {\n\t isDifferent = true;\n\t }\n\t }, this);\n\t }\n\t return isDifferent;\n\t },\n\t\n\t objectsDiffer: function objectsDiffer(a, b) {\n\t var isDifferent = false;\n\t if (Object.keys(a).length !== Object.keys(b).length) {\n\t isDifferent = true;\n\t } else {\n\t Object.keys(a).forEach(function (key) {\n\t if (!this.isSame(a[key], b[key])) {\n\t isDifferent = true;\n\t }\n\t }, this);\n\t }\n\t return isDifferent;\n\t },\n\t\n\t isSame: function isSame(a, b) {\n\t if ((typeof a === 'undefined' ? 'undefined' : _typeof(a)) !== (typeof b === 'undefined' ? 'undefined' : _typeof(b))) {\n\t return false;\n\t } else if (Array.isArray(a)) {\n\t return !this.arraysDiffer(a, b);\n\t } else if (typeof a === 'function') {\n\t return a.toString() === b.toString();\n\t } else if ((typeof a === 'undefined' ? 'undefined' : _typeof(a)) === 'object' && a !== null && b !== null) {\n\t return !this.objectsDiffer(a, b);\n\t }\n\t\n\t return a === b;\n\t },\n\t\n\t find: function find(collection, fn) {\n\t for (var i = 0, l = collection.length; i < l; i++) {\n\t var item = collection[i];\n\t if (fn(item)) {\n\t return item;\n\t }\n\t }\n\t return null;\n\t }\n\t};\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\t\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\t\n\tvar React = global.React || __webpack_require__(1);\n\tvar Mixin = __webpack_require__(2);\n\tmodule.exports = function () {\n\t return function (Component) {\n\t return React.createClass({\n\t mixins: [Mixin],\n\t render: function render() {\n\t return React.createElement(Component, _extends({\n\t setValidations: this.setValidations,\n\t setValue: this.setValue,\n\t resetValue: this.resetValue,\n\t getValue: this.getValue,\n\t hasValue: this.hasValue,\n\t getErrorMessage: this.getErrorMessage,\n\t getErrorMessages: this.getErrorMessages,\n\t isFormDisabled: this.isFormDisabled,\n\t isValid: this.isValid,\n\t isPristine: this.isPristine,\n\t isFormSubmitted: this.isFormSubmitted,\n\t isRequired: this.isRequired,\n\t showRequired: this.showRequired,\n\t showError: this.showError,\n\t isValidValue: this.isValidValue\n\t }, this.props));\n\t }\n\t });\n\t };\n\t};\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\t\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\t\n\tvar React = global.React || __webpack_require__(1);\n\tvar Mixin = __webpack_require__(2);\n\tmodule.exports = function (Component) {\n\t return React.createClass({\n\t displayName: 'Formsy(' + getDisplayName(Component) + ')',\n\t mixins: [Mixin],\n\t render: function render() {\n\t return React.createElement(Component, _extends({\n\t setValidations: this.setValidations,\n\t setValue: this.setValue,\n\t resetValue: this.resetValue,\n\t getValue: this.getValue,\n\t hasValue: this.hasValue,\n\t getErrorMessage: this.getErrorMessage,\n\t getErrorMessages: this.getErrorMessages,\n\t isFormDisabled: this.isFormDisabled,\n\t isValid: this.isValid,\n\t isPristine: this.isPristine,\n\t isFormSubmitted: this.isFormSubmitted,\n\t isRequired: this.isRequired,\n\t showRequired: this.showRequired,\n\t showError: this.showError,\n\t isValidValue: this.isValidValue\n\t }, this.props));\n\t }\n\t });\n\t};\n\t\n\tfunction getDisplayName(Component) {\n\t return Component.displayName || Component.name || (typeof Component === 'string' ? Component : 'Component');\n\t}\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tvar _isExisty = function _isExisty(value) {\n\t return value !== null && value !== undefined;\n\t};\n\t\n\tvar isEmpty = function isEmpty(value) {\n\t return value === '';\n\t};\n\t\n\tvar validations = {\n\t isDefaultRequiredValue: function isDefaultRequiredValue(values, value) {\n\t return value === undefined || value === '';\n\t },\n\t isExisty: function isExisty(values, value) {\n\t return _isExisty(value);\n\t },\n\t matchRegexp: function matchRegexp(values, value, regexp) {\n\t return !_isExisty(value) || isEmpty(value) || regexp.test(value);\n\t },\n\t isUndefined: function isUndefined(values, value) {\n\t return value === undefined;\n\t },\n\t isEmptyString: function isEmptyString(values, value) {\n\t return isEmpty(value);\n\t },\n\t isEmail: function isEmail(values, value) {\n\t return validations.matchRegexp(values, value, /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i);\n\t },\n\t isUrl: function isUrl(values, value) {\n\t return validations.matchRegexp(values, value, /^(https?|s?ftp):\\/\\/(((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(#((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i);\n\t },\n\t isTrue: function isTrue(values, value) {\n\t return value === true;\n\t },\n\t isFalse: function isFalse(values, value) {\n\t return value === false;\n\t },\n\t isNumeric: function isNumeric(values, value) {\n\t if (typeof value === 'number') {\n\t return true;\n\t }\n\t return validations.matchRegexp(values, value, /^[-+]?(?:\\d*[.])?\\d+$/);\n\t },\n\t isAlpha: function isAlpha(values, value) {\n\t return validations.matchRegexp(values, value, /^[A-Z]+$/i);\n\t },\n\t isAlphanumeric: function isAlphanumeric(values, value) {\n\t return validations.matchRegexp(values, value, /^[0-9A-Z]+$/i);\n\t },\n\t isInt: function isInt(values, value) {\n\t return validations.matchRegexp(values, value, /^(?:[-+]?(?:0|[1-9]\\d*))$/);\n\t },\n\t isFloat: function isFloat(values, value) {\n\t return validations.matchRegexp(values, value, /^(?:[-+]?(?:\\d+))?(?:\\.\\d*)?(?:[eE][\\+\\-]?(?:\\d+))?$/);\n\t },\n\t isWords: function isWords(values, value) {\n\t return validations.matchRegexp(values, value, /^[A-Z\\s]+$/i);\n\t },\n\t isSpecialWords: function isSpecialWords(values, value) {\n\t return validations.matchRegexp(values, value, /^[A-Z\\s\\u00C0-\\u017F]+$/i);\n\t },\n\t isLength: function isLength(values, value, length) {\n\t return !_isExisty(value) || isEmpty(value) || value.length === length;\n\t },\n\t equals: function equals(values, value, eql) {\n\t return !_isExisty(value) || isEmpty(value) || value == eql;\n\t },\n\t equalsField: function equalsField(values, value, field) {\n\t return value == values[field];\n\t },\n\t maxLength: function maxLength(values, value, length) {\n\t return !_isExisty(value) || value.length <= length;\n\t },\n\t minLength: function minLength(values, value, length) {\n\t return !_isExisty(value) || isEmpty(value) || value.length >= length;\n\t }\n\t};\n\t\n\tmodule.exports = validations;\n\n/***/ },\n/* 7 */\n/***/ function(module, exports) {\n\n\tfunction toObj(source) {\n\t return Object.keys(source).reduce(function (output, key) {\n\t var parentKey = key.match(/[^\\[]*/i);\n\t var paths = key.match(/\\[.*?\\]/g) || [];\n\t paths = [parentKey[0]].concat(paths).map(function (key) {\n\t return key.replace(/\\[|\\]/g, '');\n\t });\n\t var currentPath = output;\n\t while (paths.length) {\n\t var pathKey = paths.shift();\n\t\n\t if (pathKey in currentPath) {\n\t currentPath = currentPath[pathKey];\n\t } else {\n\t currentPath[pathKey] = paths.length ? isNaN(paths[0]) ? {} : [] : source[key];\n\t currentPath = currentPath[pathKey];\n\t }\n\t }\n\t\n\t return output;\n\t }, {});\n\t}\n\t\n\tfunction fromObj(obj) {\n\t function recur(newObj, propName, currVal) {\n\t if (Array.isArray(currVal) || Object.prototype.toString.call(currVal) === '[object Object]') {\n\t Object.keys(currVal).forEach(function(v) {\n\t recur(newObj, propName + \"[\" + v + \"]\", currVal[v]);\n\t });\n\t return newObj;\n\t }\n\t\n\t newObj[propName] = currVal;\n\t return newObj;\n\t }\n\t\n\t var keys = Object.keys(obj);\n\t return keys.reduce(function(newObj, propName) {\n\t return recur(newObj, propName, obj[propName]);\n\t }, {});\n\t}\n\t\n\tmodule.exports = {\n\t fromObj: fromObj,\n\t toObj: toObj\n\t}\n\n/***/ }\n/******/ ])\n});\n;\n\n\n/** WEBPACK FOOTER **\n ** formsy-react.js\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 6e7bbdf9d78f49cc65b9\n **/","var React = global.React || require('react');\nvar Formsy = {};\nvar validationRules = require('./validationRules.js');\nvar formDataToObject = require('form-data-to-object');\nvar utils = require('./utils.js');\nvar Mixin = require('./Mixin.js');\nvar HOC = require('./HOC.js');\nvar Decorator = require('./Decorator.js');\nvar options = {};\nvar emptyArray = [];\n\nFormsy.Mixin = Mixin;\nFormsy.HOC = HOC;\nFormsy.Decorator = Decorator;\n\nFormsy.defaults = function (passedOptions) {\n options = passedOptions;\n};\n\nFormsy.addValidationRule = function (name, func) {\n validationRules[name] = func;\n};\n\nFormsy.Form = React.createClass({\n displayName: 'Formsy',\n getInitialState: function () {\n return {\n isValid: true,\n isSubmitting: false,\n canChange: false\n };\n },\n getDefaultProps: function () {\n return {\n onSuccess: function () {},\n onError: function () {},\n onSubmit: function () {},\n onValidSubmit: function () {},\n onInvalidSubmit: function () {},\n onValid: function () {},\n onInvalid: function () {},\n onChange: function () {},\n validationErrors: null,\n preventExternalInvalidation: false\n };\n },\n\n childContextTypes: {\n formsy: React.PropTypes.object\n },\n getChildContext: function () {\n return {\n formsy: {\n attachToForm: this.attachToForm,\n detachFromForm: this.detachFromForm,\n validate: this.validate,\n isFormDisabled: this.isFormDisabled,\n isValidValue: (component, value) => {\n return this.runValidation(component, value).isValid;\n }\n }\n }\n },\n\n // Add a map to store the inputs of the form, a model to store\n // the values of the form and register child inputs\n componentWillMount: function () {\n this.inputs = [];\n },\n\n componentDidMount: function () {\n this.validateForm();\n },\n\n componentWillUpdate: function () {\n // Keep a reference to input names before form updates,\n // to check if inputs has changed after render\n this.prevInputNames = this.inputs.map(component => component.props.name);\n },\n\n componentDidUpdate: function () {\n\n if (this.props.validationErrors && typeof this.props.validationErrors === 'object' && Object.keys(this.props.validationErrors).length > 0) {\n this.setInputValidationErrors(this.props.validationErrors);\n }\n\n var newInputNames = this.inputs.map(component => component.props.name);\n if (utils.arraysDiffer(this.prevInputNames, newInputNames)) {\n this.validateForm();\n }\n\n },\n\n // Allow resetting to specified data\n reset: function (data) {\n this.setFormPristine(true);\n this.resetModel(data);\n },\n\n // Update model, submit to url prop and send the model\n submit: function (event) {\n\n event && event.preventDefault();\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 var model = this.getModel();\n this.props.onSubmit(model, this.resetModel, this.updateInputsWithError);\n this.state.isValid ? this.props.onValidSubmit(model, this.resetModel, this.updateInputsWithError) : this.props.onInvalidSubmit(model, this.resetModel, this.updateInputsWithError);\n\n },\n\n mapModel: function (model) {\n\n if (this.props.mapping) {\n return this.props.mapping(model)\n } else {\n return formDataToObject.toObj(Object.keys(model).reduce((mappedModel, key) => {\n\n var keyArray = key.split('.');\n var base = mappedModel;\n while (keyArray.length) {\n var currentKey = keyArray.shift();\n base = (base[currentKey] = keyArray.length ? base[currentKey] || {} : model[key]);\n }\n\n return mappedModel;\n\n }, {}));\n }\n },\n\n getModel: function () {\n var currentValues = this.getCurrentValues();\n return this.mapModel(currentValues);\n },\n\n // Reset each key in the model to the original / initial / specified value\n resetModel: function (data) {\n this.inputs.forEach(component => {\n var name = component.props.name;\n if (data && data.hasOwnProperty(name)) {\n component.setValue(data[name]);\n } else {\n component.resetValue();\n }\n });\n this.validateForm();\n },\n\n setInputValidationErrors: function (errors) {\n this.inputs.forEach(component => {\n var name = component.props.name;\n var args = [{\n _isValid: !(name in errors),\n _validationError: typeof errors[name] === 'string' ? [errors[name]] : errors[name]\n }];\n component.setState.apply(component, args);\n });\n },\n\n // Checks if the values have changed from their initial value\n isChanged: function() {\n return !utils.isSame(this.getPristineValues(), this.getCurrentValues());\n },\n\n getPristineValues: function() {\n return this.inputs.reduce((data, component) => {\n var name = component.props.name;\n data[name] = component.props.value;\n return data;\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 updateInputsWithError: function (errors) {\n Object.keys(errors).forEach((name, index) => {\n var component = utils.find(this.inputs, component => component.props.name === name);\n if (!component) {\n throw new Error('You are trying to update an input that does not exist. ' +\n 'Verify errors object with input names. ' + JSON.stringify(errors));\n }\n var args = [{\n _isValid: this.props.preventExternalInvalidation || false,\n _externalError: typeof errors[name] === 'string' ? [errors[name]] : errors[name]\n }];\n component.setState.apply(component, args);\n });\n },\n\n isFormDisabled: function () {\n return this.props.disabled;\n },\n\n getCurrentValues: function () {\n return this.inputs.reduce((data, component) => {\n var name = component.props.name;\n data[name] = component.state._value;\n return data;\n }, {});\n },\n\n setFormPristine: function (isPristine) {\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, index) => {\n component.setState({\n _formSubmitted: !isPristine,\n _isPristine: isPristine\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 validate: function (component) {\n\n // Trigger onChange\n if (this.state.canChange) {\n this.props.onChange(this.getCurrentValues(), this.isChanged());\n }\n\n var validation = this.runValidation(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({\n _isValid: validation.isValid,\n _isRequired: validation.isRequired,\n _validationError: validation.error,\n _externalError: null\n }, this.validateForm);\n\n },\n\n // Checks validation on current value or a passed value\n runValidation: function (component, value) {\n\n var currentValues = this.getCurrentValues();\n var validationErrors = component.props.validationErrors;\n var validationError = component.props.validationError;\n value = arguments.length === 2 ? value : component.state._value;\n\n var validationResults = this.runRules(value, currentValues, component._validations);\n var requiredResults = this.runRules(value, currentValues, component._requiredValidations);\n\n // the component defines an explicit validate function\n if (typeof component.validate === \"function\") {\n validationResults.failed = component.validate() ? [] : ['failed'];\n }\n\n var isRequired = Object.keys(component._requiredValidations).length ? !!requiredResults.success.length : false;\n var isValid = !validationResults.failed.length && !(this.props.validationErrors && this.props.validationErrors[component.props.name]);\n\n return {\n isRequired: isRequired,\n isValid: isRequired ? false : isValid,\n error: (function () {\n\n if (isValid && !isRequired) {\n return emptyArray;\n }\n\n if (validationResults.errors.length) {\n return validationResults.errors;\n }\n\n if (this.props.validationErrors && this.props.validationErrors[component.props.name]) {\n return typeof this.props.validationErrors[component.props.name] === 'string' ? [this.props.validationErrors[component.props.name]] : this.props.validationErrors[component.props.name];\n }\n\n if (isRequired) {\n var error = validationErrors[requiredResults.success[0]];\n return error ? [error] : null;\n }\n\n if (validationResults.failed.length) {\n return validationResults.failed.map(function(failed) {\n return validationErrors[failed] ? validationErrors[failed] : validationError;\n }).filter(function(x, pos, arr) {\n // Remove duplicates\n return arr.indexOf(x) === pos;\n });\n }\n\n }.call(this))\n };\n\n },\n\n runRules: function (value, currentValues, validations) {\n\n var results = {\n errors: [],\n failed: [],\n success: []\n };\n if (Object.keys(validations).length) {\n Object.keys(validations).forEach(function (validationMethod) {\n\n if (validationRules[validationMethod] && typeof validations[validationMethod] === 'function') {\n throw new Error('Formsy does not allow you to override default validations: ' + validationMethod);\n }\n\n if (!validationRules[validationMethod] && typeof validations[validationMethod] !== 'function') {\n throw new Error('Formsy does not have the validation rule: ' + validationMethod);\n }\n\n if (typeof validations[validationMethod] === 'function') {\n var validation = validations[validationMethod](currentValues, value);\n if (typeof validation === 'string') {\n results.errors.push(validation);\n results.failed.push(validationMethod);\n } else if (!validation) {\n results.failed.push(validationMethod);\n }\n return;\n\n } else if (typeof validations[validationMethod] !== 'function') {\n var validation = validationRules[validationMethod](currentValues, value, validations[validationMethod]);\n if (typeof validation === 'string') {\n results.errors.push(validation);\n results.failed.push(validationMethod);\n } else if (!validation) {\n results.failed.push(validationMethod);\n } else {\n results.success.push(validationMethod);\n }\n return;\n\n }\n\n return results.success.push(validationMethod);\n\n });\n }\n\n return results;\n\n },\n\n // Validate the form by going through all child input components\n // and check their state\n validateForm: function () {\n\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 var onValidationComplete = function () {\n var allIsValid = this.inputs.every(component => {\n return component.state._isValid;\n });\n\n this.setState({\n isValid: allIsValid\n });\n\n if (allIsValid) {\n this.props.onValid();\n } else {\n this.props.onInvalid();\n }\n\n // Tell the form that it can start to trigger change events\n this.setState({\n canChange: true\n });\n\n }.bind(this);\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 var validation = this.runValidation(component);\n if (validation.isValid && component.state._externalError) {\n validation.isValid = false;\n }\n component.setState({\n _isValid: validation.isValid,\n _isRequired: validation.isRequired,\n _validationError: validation.error,\n _externalError: !validation.isValid && component.state._externalError ? component.state._externalError : null\n }, index === this.inputs.length - 1 ? onValidationComplete : null);\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 && this.isMounted()) {\n this.setState({\n canChange: true\n });\n }\n },\n\n // Method put on each input component to register\n // itself to the form\n attachToForm: function (component) {\n\n if (this.inputs.indexOf(component) === -1) {\n this.inputs.push(component);\n }\n\n this.validate(component);\n },\n\n // Method put on each input component to unregister\n // itself from the form\n detachFromForm: function (component) {\n var componentPos = this.inputs.indexOf(component);\n\n if (componentPos !== -1) {\n this.inputs = this.inputs.slice(0, componentPos)\n .concat(this.inputs.slice(componentPos + 1));\n }\n\n this.validateForm();\n },\n render: function () {\n var {\n mapping,\n validationErrors,\n onSubmit,\n onValid,\n onValidSubmit,\n onInvalid,\n onInvalidSubmit,\n onChange,\n reset,\n preventExternalInvalidation,\n onSuccess,\n onError,\n ...nonFormsyProps\n } = this.props;\n\n return (\n
\n {this.props.children}\n
\n );\n\n }\n});\n\nif (!global.exports && !global.module && (!global.define || !global.define.amd)) {\n global.Formsy = Formsy;\n}\n\nmodule.exports = Formsy;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/main.js\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_1__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"react\"\n ** module id = 1\n ** module chunks = 0\n **/","var utils = require('./utils.js');\nvar React = global.React || require('react');\n\nvar convertValidationsToObject = function (validations) {\n\n if (typeof validations === 'string') {\n\n return validations.split(/\\,(?![^{\\[]*[}\\]])/g).reduce(function (validations, validation) {\n var args = validation.split(':');\n var validateMethod = args.shift();\n\n args = args.map(function (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('Formsy does not support multiple args on string validations. Use object format of validations instead.');\n }\n\n validations[validateMethod] = args.length ? args[0] : true;\n return validations;\n }, {});\n\n }\n\n return validations || {};\n};\n\nmodule.exports = {\n getInitialState: function () {\n return {\n _value: this.props.value,\n _isRequired: false,\n _isValid: true,\n _isPristine: true,\n _pristineValue: this.props.value,\n _validationError: [],\n _externalError: null,\n _formSubmitted: false\n };\n },\n contextTypes: {\n formsy: React.PropTypes.object // What about required?\n },\n getDefaultProps: function () {\n return {\n validationError: '',\n validationErrors: {}\n };\n },\n\n componentWillMount: function () {\n var configure = function () {\n this.setValidations(this.props.validations, this.props.required);\n\n // Pass a function instead?\n this.context.formsy.attachToForm(this);\n //this.props._attachToForm(this);\n }.bind(this);\n\n if (!this.props.name) {\n throw new Error('Form Input requires a name property when used');\n }\n\n /*\n if (!this.props._attachToForm) {\n return setTimeout(function () {\n if (!this.isMounted()) return;\n if (!this.props._attachToForm) {\n throw new Error('Form Mixin requires component to be nested in a Form');\n }\n configure();\n }.bind(this), 0);\n }\n */\n configure();\n },\n\n // We have to make the validate method is kept when new props are added\n componentWillReceiveProps: function (nextProps) {\n this.setValidations(nextProps.validations, nextProps.required);\n\n },\n\n componentDidUpdate: function (prevProps) {\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(this.props.value, prevProps.value)) {\n this.setValue(this.props.value);\n }\n\n // If validations or required is changed, run a new validation\n if (!utils.isSame(this.props.validations, prevProps.validations) || !utils.isSame(this.props.required, prevProps.required)) {\n this.context.formsy.validate(this);\n }\n },\n\n // Detach it when component unmounts\n componentWillUnmount: function () {\n this.context.formsy.detachFromForm(this);\n //this.props._detachFromForm(this);\n },\n\n setValidations: function (validations, required) {\n\n // Add validations to the store itself as the props object can not be modified\n this._validations = convertValidationsToObject(validations) || {};\n this._requiredValidations = required === true ? {isDefaultRequiredValue: true} : convertValidationsToObject(required);\n\n },\n\n // We validate after the value has been set\n setValue: function (value, callback) {\n this.setState({\n _value: value,\n _isPristine: false\n }, function () {\n this.context.formsy.validate(this);\n //this.props._validate(this);\n\n if (callback) {\n callback();\n }\n }.bind(this));\n },\n resetValue: function () {\n this.setState({\n _value: this.state._pristineValue,\n _isPristine: true\n }, function () {\n this.context.formsy.validate(this);\n //this.props._validate(this);\n });\n },\n getValue: function () {\n return this.state._value;\n },\n hasValue: function () {\n return this.state._value !== '';\n },\n getErrorMessage: function () {\n var messages = this.getErrorMessages();\n return messages.length ? messages[0] : null;\n },\n getErrorMessages: function () {\n return !this.isValid() || this.showRequired() ? (this.state._externalError || this.state._validationError || []) : [];\n },\n isFormDisabled: function () {\n return this.context.formsy.isFormDisabled();\n //return this.props._isFormDisabled();\n },\n isValid: function () {\n return this.state._isValid;\n },\n isPristine: function () {\n return this.state._isPristine;\n },\n isFormSubmitted: function () {\n return this.state._formSubmitted;\n },\n isRequired: function () {\n return !!this.props.required;\n },\n showRequired: function () {\n return this.state._isRequired;\n },\n showError: function () {\n return !this.showRequired() && !this.isValid();\n },\n isValidValue: function (value) {\n return this.context.formsy.isValidValue.call(null, this, value);\n //return this.props._isValidValue.call(null, this, value);\n }\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/Mixin.js\n **/","module.exports = {\n arraysDiffer: function (a, b) {\n var isDifferent = false;\n if (a.length !== b.length) {\n isDifferent = true;\n } else {\n a.forEach(function (item, index) {\n if (!this.isSame(item, b[index])) {\n isDifferent = true;\n }\n }, this);\n }\n return isDifferent;\n },\n\n objectsDiffer: function (a, b) {\n var isDifferent = false;\n if (Object.keys(a).length !== Object.keys(b).length) {\n isDifferent = true;\n } else {\n Object.keys(a).forEach(function (key) {\n if (!this.isSame(a[key], b[key])) {\n isDifferent = true;\n }\n }, this);\n }\n return isDifferent;\n },\n\n isSame: function (a, b) {\n if (typeof a !== typeof b) {\n return false;\n } else if (Array.isArray(a)) {\n return !this.arraysDiffer(a, b);\n } else if (typeof a === 'function') {\n return a.toString() === b.toString();\n } else if (typeof a === 'object' && a !== null && b !== null) {\n return !this.objectsDiffer(a, b);\n }\n\n return a === b;\n },\n\n find: function (collection, fn) {\n for (var i = 0, l = collection.length; i < l; i++) {\n var item = collection[i];\n if (fn(item)) {\n return item;\n }\n }\n return null;\n }\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils.js\n **/","var React = global.React || require('react');\nvar Mixin = require('./Mixin.js');\nmodule.exports = function () {\n return function (Component) {\n return React.createClass({\n mixins: [Mixin],\n render: function () {\n return React.createElement(Component, {\n setValidations: this.setValidations,\n setValue: this.setValue,\n resetValue: this.resetValue,\n getValue: this.getValue,\n hasValue: this.hasValue,\n getErrorMessage: this.getErrorMessage,\n getErrorMessages: this.getErrorMessages,\n isFormDisabled: this.isFormDisabled,\n isValid: this.isValid,\n isPristine: this.isPristine,\n isFormSubmitted: this.isFormSubmitted,\n isRequired: this.isRequired,\n showRequired: this.showRequired,\n showError: this.showError,\n isValidValue: this.isValidValue,\n ...this.props\n });\n }\n });\n };\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/Decorator.js\n **/","var React = global.React || require('react');\nvar Mixin = require('./Mixin.js');\nmodule.exports = function (Component) {\n return React.createClass({\n displayName: 'Formsy(' + getDisplayName(Component) + ')',\n mixins: [Mixin],\n render: function () {\n return React.createElement(Component, {\n setValidations: this.setValidations,\n setValue: this.setValue,\n resetValue: this.resetValue,\n getValue: this.getValue,\n hasValue: this.hasValue,\n getErrorMessage: this.getErrorMessage,\n getErrorMessages: this.getErrorMessages,\n isFormDisabled: this.isFormDisabled,\n isValid: this.isValid,\n isPristine: this.isPristine,\n isFormSubmitted: this.isFormSubmitted,\n isRequired: this.isRequired,\n showRequired: this.showRequired,\n showError: this.showError,\n isValidValue: this.isValidValue,\n ...this.props\n });\n }\n });\n};\n\nfunction getDisplayName(Component) {\n return (\n Component.displayName ||\n Component.name ||\n (typeof Component === 'string' ? Component : 'Component')\n );\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/HOC.js\n **/","var isExisty = function (value) {\n return value !== null && value !== undefined;\n};\n\nvar isEmpty = function (value) {\n return value === '';\n};\n\nvar validations = {\n isDefaultRequiredValue: function (values, value) {\n return value === undefined || value === '';\n },\n isExisty: function (values, value) {\n return isExisty(value);\n },\n matchRegexp: function (values, value, regexp) {\n return !isExisty(value) || isEmpty(value) || regexp.test(value);\n },\n isUndefined: function (values, value) {\n return value === undefined;\n },\n isEmptyString: function (values, value) {\n return isEmpty(value);\n },\n isEmail: function (values, value) {\n return validations.matchRegexp(values, value, /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i);\n },\n isUrl: function (values, value) {\n return validations.matchRegexp(values, value, /^(https?|s?ftp):\\/\\/(((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(#((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i);\n },\n isTrue: function (values, value) {\n return value === true;\n },\n isFalse: function (values, value) {\n return value === false;\n },\n isNumeric: function (values, value) {\n if (typeof value === 'number') {\n return true;\n }\n return validations.matchRegexp(values, value, /^[-+]?(?:\\d*[.])?\\d+$/);\n },\n isAlpha: function (values, value) {\n return validations.matchRegexp(values, value, /^[A-Z]+$/i);\n },\n isAlphanumeric: function (values, value) {\n return validations.matchRegexp(values, value, /^[0-9A-Z]+$/i);\n },\n isInt: function (values, value) {\n return validations.matchRegexp(values, value, /^(?:[-+]?(?:0|[1-9]\\d*))$/);\n },\n isFloat: function (values, value) {\n return validations.matchRegexp(values, value, /^(?:[-+]?(?:\\d+))?(?:\\.\\d*)?(?:[eE][\\+\\-]?(?:\\d+))?$/);\n },\n isWords: function (values, value) {\n return validations.matchRegexp(values, value, /^[A-Z\\s]+$/i);\n },\n isSpecialWords: function (values, value) {\n return validations.matchRegexp(values, value, /^[A-Z\\s\\u00C0-\\u017F]+$/i);\n },\n isLength: function (values, value, length) {\n return !isExisty(value) || isEmpty(value) || value.length === length;\n },\n equals: function (values, value, eql) {\n return !isExisty(value) || isEmpty(value) || value == eql;\n },\n equalsField: function (values, value, field) {\n return value == values[field];\n },\n maxLength: function (values, value, length) {\n return !isExisty(value) || value.length <= length;\n },\n minLength: function (values, value, length) {\n return !isExisty(value) || isEmpty(value) || value.length >= length;\n }\n};\n\nmodule.exports = validations;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/validationRules.js\n **/","function toObj(source) {\n return Object.keys(source).reduce(function (output, key) {\n var parentKey = key.match(/[^\\[]*/i);\n var paths = key.match(/\\[.*?\\]/g) || [];\n paths = [parentKey[0]].concat(paths).map(function (key) {\n return key.replace(/\\[|\\]/g, '');\n });\n var currentPath = output;\n while (paths.length) {\n var pathKey = paths.shift();\n\n if (pathKey in currentPath) {\n currentPath = currentPath[pathKey];\n } else {\n currentPath[pathKey] = paths.length ? isNaN(paths[0]) ? {} : [] : source[key];\n currentPath = currentPath[pathKey];\n }\n }\n\n return output;\n }, {});\n}\n\nfunction fromObj(obj) {\n function recur(newObj, propName, currVal) {\n if (Array.isArray(currVal) || Object.prototype.toString.call(currVal) === '[object Object]') {\n Object.keys(currVal).forEach(function(v) {\n recur(newObj, propName + \"[\" + v + \"]\", currVal[v]);\n });\n return newObj;\n }\n\n newObj[propName] = currVal;\n return newObj;\n }\n\n var keys = Object.keys(obj);\n return keys.reduce(function(newObj, propName) {\n return recur(newObj, propName, obj[propName]);\n }, {});\n}\n\nmodule.exports = {\n fromObj: fromObj,\n toObj: toObj\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/form-data-to-object/index.js\n ** module id = 7\n ** module chunks = 0\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/src/Mixin.js b/src/Mixin.js index d615fc7a..4d8e9d05 100644 --- a/src/Mixin.js +++ b/src/Mixin.js @@ -115,13 +115,17 @@ module.exports = { }, // We validate after the value has been set - setValue: function (value) { + setValue: function (value, callback) { this.setState({ _value: value, _isPristine: false }, function () { this.context.formsy.validate(this); //this.props._validate(this); + + if (callback) { + callback(); + } }.bind(this)); }, resetValue: function () {