├── .gitignore ├── README.md ├── dist ├── build.js └── build.js.map ├── package.json ├── src ├── Mixin.js └── Validator.js └── webpack.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | npm-debug.log 4 | .idea/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Vue-Easy-Validator 2 | Easy form validator, bridge of vee-validate 3 | 4 | ## Install 5 | 6 | ``` bash 7 | npm install vue-easy-validator --save 8 | ``` 9 | 10 | ``` js 11 | import VueEasyValidator from 'vue-easy-validator' 12 | 13 | Vue.use(VueEasyValidator) 14 | ``` 15 | 16 | ## Usage 17 | 18 | ### Template 19 | ``` html 20 | 21 |

{{form.$errors.first('email')}}

22 | 23 |

{{form.$errors.first('password')}}

24 | ``` 25 | 26 | ### Script 27 | 28 | ``` js 29 | new Vue({ 30 | data(){ 31 | return{ 32 | form: this.$form({ 33 | email: { 34 | rule: 'email|required', 35 | value: 'imamhatipler kapatılsın' // => set default value 36 | }, 37 | password: { 38 | rule: 'required|min:3', 39 | value: null 40 | } 41 | }) 42 | } 43 | }, 44 | mounted(){ 45 | console.log(this.form.$fields); // => Form values (dynamic) 46 | console.log(this.form.$rules); // => Form rules (dynamic) 47 | console.log(this.form.$errors); // Form errors (instance of vee-validate errorBag) 48 | console.log(this.$validator); // => vee-validate instance 49 | } 50 | }) 51 | ``` 52 | -------------------------------------------------------------------------------- /dist/build.js: -------------------------------------------------------------------------------- 1 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.VueEasyValidator=t():e.VueEasyValidator=t()}(this,function(){return function(e){function t(n){if(i[n])return i[n].exports;var r=i[n]={exports:{},id:n,loaded:!1};return e[n].call(r.exports,r,r.exports,t),r.loaded=!0,r.exports}var i={};return t.m=e,t.c=i,t.p="",t(0)}([function(e,t,i){e.exports=i(1)},function(e,t,i){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var r=i(3),a=n(r),s=i(2),o=n(s);t.default={install:function(e){e.use(a.default),e.mixin({beforeCreate:function(){var e=this;this.$form=function(t){return new o.default(t,e.$validator)}}})}}},function(e,t){"use strict";function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(e,t){for(var i=0;i()[\]\\.,;:#\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,6}))$/.test(e)},t=function(e,t){return!!t.filter(function(t){return t==e}).length},i=function(e){return Array.isArray(e)?!!e.length:void 0!==e&&null!==e&&!!String(e).trim().length},n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},r=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},a=function(){function e(e,t){for(var i=0;i=n},f=function(e,t){var i=o(t,1),n=i[0];return void 0===e||null===e?n>=0:String(e).length<=n},d=function(e,t){return!t.filter(function(t){return t==e}).length},h=function(e){return!Array.isArray(e)&&/^[a-zA-Z]*$/.test(e)},v=function(e){return!Array.isArray(e)&&/^[a-zA-Z0-9]*$/.test(e)},m=function(e){return!Array.isArray(e)&&/^[a-zA-Z0-9_-]*$/.test(e)},y=function(e){return!Array.isArray(e)&&/^[0-9]*$/.test(e)},g=function(e,t){var i=u(t),n=i[0],r=i.slice(1);return n instanceof RegExp?n.test(e):new RegExp(n,r).test(String(e))},p=function(e){return/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(e)},b=function(e,t){for(var i=new RegExp(".("+t.join("|")+")$","i"),n=0;nr)return!1;return!0},$=function(e,t){var i=o(t,1),n=i[0],r=String(e);return/^[0-9]*$/.test(r)&&r.length===Number(n)},x=function(e){for(var t=0;t=e},A=function(e,t){var i=o(t,1),n=i[0],r=document.querySelector("input[name='"+n+"']");return!(!r||String(e)!==r.value)},j=function(e,t){var i=/^https?:\/\/([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w\.\(\)%-]*)*\/?$/.test(e),n=t&&t[0];return n&&i?new RegExp("^https?://(([da-z.-]+).)*("+t[0].replace(".","\\$&")+")").test(e):i},L=function(e){var t=arguments.length<=1||void 0===arguments[1]?["*"]:arguments[1],i=o(t,1),n=i[0];if(Array.isArray(e))return!1;if(null===e||void 0===e||""===e)return!0;var r="*"===n?"*":"{0,"+n+"}",a=new RegExp("^[0-9]*.?[0-9]"+r+"$");return!!a.test(e)&&!Number.isNaN(parseFloat(e))},N={email:e,min:c,max:f,required:i,in:t,not_in:d,alpha:h,alpha_num:v,alpha_dash:m,numeric:y,regex:g,ip:p,ext:b,mimes:k,size:_,digits:$,image:x,dimensions:E,between:T,confirmed:A,url:j,decimal:L},O=function(){function e(){r(this,e),this.errors=[]}return a(e,[{key:"add",value:function(e,t,i){var n={field:e,msg:t};i&&(n.scope=i),this.errors.push(n)}},{key:"all",value:function(e){return e?this.errors.filter(function(t){return t.scope===e}).map(function(e){return e.msg}):this.errors.map(function(e){return e.msg})}},{key:"any",value:function(e){return e?!!this.errors.filter(function(t){return t.scope===e}).length:!!this.errors.length}},{key:"clear",value:function(e){return e?void(this.errors=this.errors.filter(function(t){return t.scope!==e})):void(this.errors=[])}},{key:"collect",value:function(e,t){var i=this;if(!e){var r=function(){var e={};return i.errors.forEach(function(t){e[t.field]||(e[t.field]=[]),e[t.field].push(t.msg)}),{v:e}}();if("object"===("undefined"==typeof r?"undefined":n(r)))return r.v}return t?this.errors.filter(function(i){return i.field===e&&i.scope===t}).map(function(e){return e.msg}):this.errors.filter(function(t){return t.field===e}).map(function(e){return e.msg})}},{key:"count",value:function(){return this.errors.length}},{key:"first",value:function(e,t){for(var i=0;i()[\\]\\\\.,;:#\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,6}))$/.test(value)\n\t );\n\t});\n\t\n\tvar In = (function (value, options) {\n\t return !!options.filter(function (option) {\n\t return option == value;\n\t }).length;\n\t}); // eslint-disable-line\n\t\n\tvar required$1 = (function (value) {\n\t if (Array.isArray(value)) {\n\t return !!value.length;\n\t }\n\t\n\t if (value === undefined || value === null) {\n\t return false;\n\t }\n\t\n\t return !!String(value).trim().length;\n\t});\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n\t return typeof obj;\n\t} : function (obj) {\n\t return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj;\n\t};\n\t\n\t\n\t\n\t\n\t\n\tvar classCallCheck = function (instance, Constructor) {\n\t if (!(instance instanceof Constructor)) {\n\t throw new TypeError(\"Cannot call a class as a function\");\n\t }\n\t};\n\t\n\tvar createClass = function () {\n\t function defineProperties(target, props) {\n\t for (var i = 0; i < props.length; i++) {\n\t var descriptor = props[i];\n\t descriptor.enumerable = descriptor.enumerable || false;\n\t descriptor.configurable = true;\n\t if (\"value\" in descriptor) descriptor.writable = true;\n\t Object.defineProperty(target, descriptor.key, descriptor);\n\t }\n\t }\n\t\n\t return function (Constructor, protoProps, staticProps) {\n\t if (protoProps) defineProperties(Constructor.prototype, protoProps);\n\t if (staticProps) defineProperties(Constructor, staticProps);\n\t return Constructor;\n\t };\n\t}();\n\t\n\t\n\t\n\t\n\t\n\tvar defineProperty = function (obj, key, value) {\n\t if (key in obj) {\n\t Object.defineProperty(obj, key, {\n\t value: value,\n\t enumerable: true,\n\t configurable: true,\n\t writable: true\n\t });\n\t } else {\n\t obj[key] = value;\n\t }\n\t\n\t return obj;\n\t};\n\t\n\tvar get$1 = function get$1(object, property, receiver) {\n\t if (object === null) object = Function.prototype;\n\t var desc = Object.getOwnPropertyDescriptor(object, property);\n\t\n\t if (desc === undefined) {\n\t var parent = Object.getPrototypeOf(object);\n\t\n\t if (parent === null) {\n\t return undefined;\n\t } else {\n\t return get$1(parent, property, receiver);\n\t }\n\t } else if (\"value\" in desc) {\n\t return desc.value;\n\t } else {\n\t var getter = desc.get;\n\t\n\t if (getter === undefined) {\n\t return undefined;\n\t }\n\t\n\t return getter.call(receiver);\n\t }\n\t};\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\tvar set = function set(object, property, value, receiver) {\n\t var desc = Object.getOwnPropertyDescriptor(object, property);\n\t\n\t if (desc === undefined) {\n\t var parent = Object.getPrototypeOf(object);\n\t\n\t if (parent !== null) {\n\t set(parent, property, value, receiver);\n\t }\n\t } else if (\"value\" in desc && desc.writable) {\n\t desc.value = value;\n\t } else {\n\t var setter = desc.set;\n\t\n\t if (setter !== undefined) {\n\t setter.call(receiver, value);\n\t }\n\t }\n\t\n\t return value;\n\t};\n\t\n\tvar slicedToArray = function () {\n\t function sliceIterator(arr, i) {\n\t var _arr = [];\n\t var _n = true;\n\t var _d = false;\n\t var _e = undefined;\n\t\n\t try {\n\t for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n\t _arr.push(_s.value);\n\t\n\t if (i && _arr.length === i) break;\n\t }\n\t } catch (err) {\n\t _d = true;\n\t _e = err;\n\t } finally {\n\t try {\n\t if (!_n && _i[\"return\"]) _i[\"return\"]();\n\t } finally {\n\t if (_d) throw _e;\n\t }\n\t }\n\t\n\t return _arr;\n\t }\n\t\n\t return function (arr, i) {\n\t if (Array.isArray(arr)) {\n\t return arr;\n\t } else if (Symbol.iterator in Object(arr)) {\n\t return sliceIterator(arr, i);\n\t } else {\n\t throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n\t }\n\t };\n\t}();\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\tvar toArray = function (arr) {\n\t return Array.isArray(arr) ? arr : Array.from(arr);\n\t};\n\t\n\tvar toConsumableArray = function (arr) {\n\t if (Array.isArray(arr)) {\n\t for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\t\n\t return arr2;\n\t } else {\n\t return Array.from(arr);\n\t }\n\t};\n\t\n\tvar min$1 = (function (value, _ref) {\n\t var _ref2 = slicedToArray(_ref, 1);\n\t\n\t var length = _ref2[0];\n\t\n\t if (value === undefined || value === null) {\n\t return false;\n\t }\n\t return String(value).length >= length;\n\t});\n\t\n\tvar max$1 = (function (value, _ref) {\n\t var _ref2 = slicedToArray(_ref, 1);\n\t\n\t var length = _ref2[0];\n\t\n\t if (value === undefined || value === null) {\n\t return length >= 0;\n\t }\n\t\n\t return String(value).length <= length;\n\t});\n\t\n\tvar not_in$1 = (function (value, options) {\n\t return !options.filter(function (option) {\n\t return option == value;\n\t }).length;\n\t}); // eslint-disable-line\n\t\n\tvar alpha$1 = (function (value) {\n\t return !Array.isArray(value) && /^[a-zA-Z]*$/.test(value);\n\t});\n\t\n\tvar alpha_num$1 = (function (value) {\n\t return !Array.isArray(value) && /^[a-zA-Z0-9]*$/.test(value);\n\t});\n\t\n\tvar alpha_dash$1 = (function (value) {\n\t return !Array.isArray(value) && /^[a-zA-Z0-9_-]*$/.test(value);\n\t});\n\t\n\tvar numeric$1 = (function (value) {\n\t return !Array.isArray(value) && /^[0-9]*$/.test(value);\n\t});\n\t\n\tvar regex$1 = (function (value, _ref) {\n\t var _ref2 = toArray(_ref);\n\t\n\t var regex = _ref2[0];\n\t\n\t var flags = _ref2.slice(1);\n\t\n\t if (regex instanceof RegExp) {\n\t return regex.test(value);\n\t }\n\t\n\t return new RegExp(regex, flags).test(String(value));\n\t});\n\t\n\t// TODO: Maybe add ipv6 flag?\n\tvar ip$1 = (function (value) {\n\t return (/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(value)\n\t );\n\t});\n\t\n\tvar ext$1 = (function (files, extensions) {\n\t var regex = new RegExp('.(' + extensions.join('|') + ')$', 'i');\n\t for (var i = 0; i < files.length; i++) {\n\t if (!regex.test(files[i].name)) {\n\t return false;\n\t }\n\t }\n\t\n\t return true;\n\t});\n\t\n\tvar mimes$1 = (function (files, mimes) {\n\t var regex = new RegExp(mimes.join('|').replace('*', '.+') + '$', 'i');\n\t for (var i = 0; i < files.length; i++) {\n\t if (!regex.test(files[i].type)) {\n\t return false;\n\t }\n\t }\n\t\n\t return true;\n\t});\n\t\n\tvar size$1 = (function (files, _ref) {\n\t var _ref2 = slicedToArray(_ref, 1);\n\t\n\t var size = _ref2[0];\n\t\n\t if (isNaN(size)) {\n\t return false;\n\t }\n\t\n\t var nSize = Number(size) * 1024;\n\t for (var i = 0; i < files.length; i++) {\n\t if (files[i].size > nSize) {\n\t return false;\n\t }\n\t }\n\t\n\t return true;\n\t});\n\t\n\tvar digits$1 = (function (value, _ref) {\n\t var _ref2 = slicedToArray(_ref, 1);\n\t\n\t var length = _ref2[0];\n\t\n\t var strVal = String(value);\n\t\n\t return (/^[0-9]*$/.test(strVal) && strVal.length === Number(length)\n\t );\n\t});\n\t\n\tvar image$1 = (function (files) {\n\t for (var i = 0; i < files.length; i++) {\n\t if (!/\\.(jpg|svg|jpeg|png|bmp|gif)$/i.test(files[i].name)) {\n\t return false;\n\t }\n\t }\n\t\n\t return true;\n\t});\n\t\n\tvar validateImage = function validateImage(file, width, height) {\n\t var URL = window.URL || window.webkitURL;\n\t return new Promise(function (resolve) {\n\t var image = new Image();\n\t image.onerror = function () {\n\t return resolve({ valid: false });\n\t };\n\t image.onload = function () {\n\t return resolve({\n\t valid: image.width === Number(width) && image.height === Number(height)\n\t });\n\t };\n\t\n\t image.src = URL.createObjectURL(file);\n\t });\n\t};\n\t\n\tvar dimensions$1 = (function (files, _ref) {\n\t var _ref2 = slicedToArray(_ref, 2);\n\t\n\t var width = _ref2[0];\n\t var height = _ref2[1];\n\t\n\t var list = [];\n\t for (var i = 0; i < files.length; i++) {\n\t // if file is not an image, reject.\n\t if (!/\\.(jpg|svg|jpeg|png|bmp|gif)$/i.test(files[i].name)) {\n\t return false;\n\t }\n\t\n\t list.push(files[i]);\n\t }\n\t\n\t return Promise.all(list.map(function (file) {\n\t return validateImage(file, width, height);\n\t }));\n\t});\n\t\n\tvar between$1 = (function (value, _ref) {\n\t var _ref2 = slicedToArray(_ref, 2);\n\t\n\t var min = _ref2[0];\n\t var max = _ref2[1];\n\t return Number(min) <= value && Number(max) >= value;\n\t});\n\t\n\tvar confirmed$1 = (function (value, _ref) {\n\t var _ref2 = slicedToArray(_ref, 1);\n\t\n\t var confirmedField = _ref2[0];\n\t\n\t var field = document.querySelector(\"input[name='\" + confirmedField + \"']\");\n\t\n\t return !!(field && String(value) === field.value);\n\t});\n\t\n\tvar url$1 = (function (value, params) {\n\t var isUrl = /^https?:\\/\\/([\\da-z\\.-]+)\\.([a-z\\.]{2,6})([\\/\\w\\.\\(\\)%-]*)*\\/?$/.test(value);\n\t\n\t var domain = params && params[0];\n\t\n\t if (domain && isUrl) {\n\t return new RegExp('^https?://(([da-z.-]+).)*(' + params[0].replace('.', '\\\\$&') + ')').test(value);\n\t }\n\t\n\t return isUrl;\n\t});\n\t\n\tvar decimal$1 = (function (value) {\n\t var _ref = arguments.length <= 1 || arguments[1] === undefined ? ['*'] : arguments[1];\n\t\n\t var _ref2 = slicedToArray(_ref, 1);\n\t\n\t var decimals = _ref2[0];\n\t\n\t if (Array.isArray(value)) {\n\t return false;\n\t }\n\t\n\t if (value === null || value === undefined || value === '') {\n\t return true;\n\t }\n\t\n\t var regexPart = decimals === '*' ? '*' : '{0,' + decimals + '}';\n\t var regex = new RegExp('^[0-9]*.?[0-9]' + regexPart + '$');\n\t\n\t if (!regex.test(value)) {\n\t return false;\n\t }\n\t\n\t return !Number.isNaN(parseFloat(value));\n\t});\n\t\n\tvar Rules = {\n\t email: email$1,\n\t min: min$1,\n\t max: max$1,\n\t required: required$1,\n\t in: In,\n\t not_in: not_in$1,\n\t alpha: alpha$1,\n\t alpha_num: alpha_num$1,\n\t alpha_dash: alpha_dash$1,\n\t numeric: numeric$1,\n\t regex: regex$1,\n\t ip: ip$1,\n\t ext: ext$1,\n\t mimes: mimes$1,\n\t size: size$1,\n\t digits: digits$1,\n\t image: image$1,\n\t dimensions: dimensions$1,\n\t between: between$1,\n\t confirmed: confirmed$1,\n\t url: url$1,\n\t decimal: decimal$1\n\t};\n\t\n\tvar ErrorBag = function () {\n\t function ErrorBag() {\n\t classCallCheck(this, ErrorBag);\n\t\n\t this.errors = [];\n\t }\n\t\n\t /**\n\t * Adds an error to the internal array.\n\t *\n\t * @param {string} field The field name.\n\t * @param {string} msg The error message.\n\t * @param {String} scope The Scope name, optional.\n\t */\n\t\n\t\n\t createClass(ErrorBag, [{\n\t key: \"add\",\n\t value: function add(field, msg, scope) {\n\t var error = {\n\t field: field,\n\t msg: msg\n\t };\n\t\n\t if (scope) {\n\t error.scope = scope;\n\t }\n\t\n\t this.errors.push(error);\n\t }\n\t\n\t /**\n\t * Gets all error messages from the internal array.\n\t *\n\t * @param {String} scope The Scope name, optional.\n\t * @return {Array} errors Array of all error messages.\n\t */\n\t\n\t }, {\n\t key: \"all\",\n\t value: function all(scope) {\n\t if (scope) {\n\t return this.errors.filter(function (e) {\n\t return e.scope === scope;\n\t }).map(function (e) {\n\t return e.msg;\n\t });\n\t }\n\t\n\t return this.errors.map(function (e) {\n\t return e.msg;\n\t });\n\t }\n\t\n\t /**\n\t * Checks if there is any errrors in the internal array.\n\t * @param {String} scope The Scope name, optional.\n\t * @return {boolean} result True if there was at least one error, false otherwise.\n\t */\n\t\n\t }, {\n\t key: \"any\",\n\t value: function any(scope) {\n\t if (scope) {\n\t return !!this.errors.filter(function (e) {\n\t return e.scope === scope;\n\t }).length;\n\t }\n\t\n\t return !!this.errors.length;\n\t }\n\t\n\t /**\n\t * Removes all items from the internal array.\n\t * @param {String} scope The Scope name, optional.\n\t */\n\t\n\t }, {\n\t key: \"clear\",\n\t value: function clear(scope) {\n\t if (scope) {\n\t this.errors = this.errors.filter(function (e) {\n\t return e.scope !== scope;\n\t });\n\t\n\t return;\n\t }\n\t\n\t this.errors = [];\n\t }\n\t\n\t /**\n\t * Collects errors into groups or for a specific field.\n\t *\n\t * @param {string} field The field name.\n\t * @param {string} scope The scope name.\n\t * @return {Array} errors The errors for the specified field.\n\t */\n\t\n\t }, {\n\t key: \"collect\",\n\t value: function collect(field, scope) {\n\t var _this = this;\n\t\n\t if (!field) {\n\t var _ret = function () {\n\t var collection = {};\n\t _this.errors.forEach(function (e) {\n\t if (!collection[e.field]) {\n\t collection[e.field] = [];\n\t }\n\t\n\t collection[e.field].push(e.msg);\n\t });\n\t\n\t return {\n\t v: collection\n\t };\n\t }();\n\t\n\t if ((typeof _ret === \"undefined\" ? \"undefined\" : _typeof(_ret)) === \"object\") return _ret.v;\n\t }\n\t\n\t if (scope) {\n\t return this.errors.filter(function (e) {\n\t return e.field === field && e.scope === scope;\n\t }).map(function (e) {\n\t return e.msg;\n\t });\n\t }\n\t\n\t return this.errors.filter(function (e) {\n\t return e.field === field;\n\t }).map(function (e) {\n\t return e.msg;\n\t });\n\t }\n\t /**\n\t * Gets the internal array length.\n\t *\n\t * @return {Number} length The internal array length.\n\t */\n\t\n\t }, {\n\t key: \"count\",\n\t value: function count() {\n\t return this.errors.length;\n\t }\n\t\n\t /**\n\t * Gets the first error message for a specific field.\n\t *\n\t * @param {string} field The field name.\n\t * @return {string|null} message The error message.\n\t */\n\t\n\t }, {\n\t key: \"first\",\n\t value: function first(field, scope) {\n\t for (var i = 0; i < this.errors.length; i++) {\n\t if (this.errors[i].field === field) {\n\t if (scope) {\n\t if (this.errors[i].scope === scope) {\n\t return this.errors[i].msg;\n\t }\n\t } else {\n\t return this.errors[i].msg;\n\t }\n\t }\n\t }\n\t\n\t return null;\n\t }\n\t\n\t /**\n\t * Checks if the internal array has at least one error for the specified field.\n\t *\n\t * @param {string} field The specified field.\n\t * @return {Boolean} result True if at least one error is found, false otherwise.\n\t */\n\t\n\t }, {\n\t key: \"has\",\n\t value: function has(field, scope) {\n\t for (var i = 0; i < this.errors.length; i++) {\n\t if (this.errors[i].field === field) {\n\t if (scope) {\n\t if (this.errors[i].scope === scope) {\n\t return true;\n\t }\n\t } else {\n\t return true;\n\t }\n\t }\n\t }\n\t\n\t return false;\n\t }\n\t\n\t /**\n\t * Removes all error messages assoicated with a specific field.\n\t *\n\t * @param {string} field The field which messages are to be removed.\n\t * @param {String} scope The Scope name, optional.\n\t */\n\t\n\t }, {\n\t key: \"remove\",\n\t value: function remove(field, scope) {\n\t if (scope) {\n\t this.errors = this.errors.filter(function (e) {\n\t return e.field !== field || e.scope !== scope;\n\t });\n\t\n\t return;\n\t }\n\t\n\t this.errors = this.errors.filter(function (e) {\n\t return e.field !== field;\n\t });\n\t }\n\t }]);\n\t return ErrorBag;\n\t}();\n\t\n\tvar _class = function () {\n\t function _class(msg) {\n\t classCallCheck(this, _class);\n\t\n\t this.msg = msg;\n\t }\n\t\n\t createClass(_class, [{\n\t key: \"toString\",\n\t value: function toString() {\n\t return this.msg;\n\t }\n\t }]);\n\t return _class;\n\t}();\n\t\n\t/* eslint-disable prefer-rest-params */\n\tvar Dictionary = function () {\n\t function Dictionary() {\n\t var dictionary = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\t classCallCheck(this, Dictionary);\n\t\n\t this.dictionary = {};\n\t this.merge(dictionary);\n\t }\n\t\n\t createClass(Dictionary, [{\n\t key: 'hasLocale',\n\t value: function hasLocale(locale) {\n\t return !!this.dictionary[locale];\n\t }\n\t }, {\n\t key: 'getMessage',\n\t value: function getMessage(locale, key) {\n\t var fallback = arguments.length <= 2 || arguments[2] === undefined ? '' : arguments[2];\n\t\n\t if (!this.hasMessage(locale, key)) {\n\t return fallback;\n\t }\n\t\n\t return this.dictionary[locale].messages[key];\n\t }\n\t }, {\n\t key: 'getAttribute',\n\t value: function getAttribute(locale, key) {\n\t var fallback = arguments.length <= 2 || arguments[2] === undefined ? '' : arguments[2];\n\t\n\t if (!this.hasAttribute(locale, key)) {\n\t return fallback;\n\t }\n\t\n\t return this.dictionary[locale].attributes[key];\n\t }\n\t }, {\n\t key: 'hasMessage',\n\t value: function hasMessage(locale, key) {\n\t return !!(this.hasLocale(locale) && this.dictionary[locale].messages && this.dictionary[locale].messages[key]);\n\t }\n\t }, {\n\t key: 'hasAttribute',\n\t value: function hasAttribute(locale, key) {\n\t return !!(this.hasLocale(locale) && this.dictionary[locale].attributes && this.dictionary[locale].attributes[key]);\n\t }\n\t }, {\n\t key: 'merge',\n\t value: function merge(dictionary) {\n\t this._merge(this.dictionary, dictionary);\n\t }\n\t }, {\n\t key: 'setMessage',\n\t value: function setMessage(locale, key, message) {\n\t if (!this.hasLocale(locale)) {\n\t this.dictionary[locale] = {\n\t messages: {},\n\t attributes: {}\n\t };\n\t }\n\t\n\t this.dictionary[locale].messages[key] = message;\n\t }\n\t }, {\n\t key: 'setAttribute',\n\t value: function setAttribute(locale, key, attribute) {\n\t if (!this.hasLocale(locale)) {\n\t this.dictionary[locale] = {\n\t messages: {},\n\t attributes: {}\n\t };\n\t }\n\t\n\t this.dictionary[locale].attributes[key] = attribute;\n\t }\n\t }, {\n\t key: '_isObject',\n\t value: function _isObject(object) {\n\t return object && (typeof object === 'undefined' ? 'undefined' : _typeof(object)) === 'object' && !Array.isArray(object) && object !== null;\n\t }\n\t }, {\n\t key: '_merge',\n\t value: function _merge(target, source) {\n\t var _this = this;\n\t\n\t if (!(this._isObject(target) && this._isObject(source))) {\n\t return target;\n\t }\n\t\n\t var assign = Object.assign || this._assign;\n\t\n\t Object.keys(source).forEach(function (key) {\n\t if (_this._isObject(source[key])) {\n\t if (!target[key]) {\n\t assign(target, defineProperty({}, key, {}));\n\t }\n\t\n\t _this._merge(target[key], source[key]);\n\t return;\n\t }\n\t\n\t assign(target, defineProperty({}, key, source[key]));\n\t });\n\t\n\t return target;\n\t }\n\t }, {\n\t key: '_assign',\n\t value: function _assign(target) {\n\t var _arguments = arguments;\n\t\n\t var output = Object(target);\n\t\n\t var _loop = function _loop(index) {\n\t var source = _arguments[index];\n\t if (source !== undefined && source !== null) {\n\t Object.keys(source).forEach(function (key) {\n\t if ({}.hasOwnProperty.call(source, key)) {\n\t output[key] = source[key];\n\t }\n\t });\n\t }\n\t };\n\t\n\t for (var index = 1; index < arguments.length; index++) {\n\t _loop(index);\n\t }\n\t\n\t return output;\n\t }\n\t }]);\n\t return Dictionary;\n\t}();\n\t\n\t/* istanbul ignore next */\n\t/* eslint-disable max-len */\n\tvar messages = {\n\t alpha_dash: function alpha_dash(field) {\n\t return 'The ' + field + ' may contain alpha-numeric characters as well as dashes and underscores.';\n\t },\n\t alpha_num: function alpha_num(field) {\n\t return 'The ' + field + ' may only contain alpha-numeric characters.';\n\t },\n\t alpha: function alpha(field) {\n\t return 'The ' + field + ' may only contain alphabetic characters.';\n\t },\n\t between: function between(field, _ref) {\n\t var _ref2 = slicedToArray(_ref, 2);\n\t\n\t var min = _ref2[0];\n\t var max = _ref2[1];\n\t return 'The ' + field + ' must be between ' + min + ' and ' + max + '.';\n\t },\n\t confirmed: function confirmed(field, _ref3) {\n\t var _ref4 = slicedToArray(_ref3, 1);\n\t\n\t var confirmedField = _ref4[0];\n\t return 'The ' + field + ' does not match the ' + confirmedField + '.';\n\t },\n\t decimal: function decimal(field) {\n\t var _ref5 = arguments.length <= 1 || arguments[1] === undefined ? ['*'] : arguments[1];\n\t\n\t var _ref6 = slicedToArray(_ref5, 1);\n\t\n\t var decimals = _ref6[0];\n\t return 'The ' + field + ' must be numeric and may contain ' + (decimals === '*' ? '' : decimals) + ' decimal points.';\n\t },\n\t digits: function digits(field, _ref7) {\n\t var _ref8 = slicedToArray(_ref7, 1);\n\t\n\t var length = _ref8[0];\n\t return 'The ' + field + ' must be numeric and exactly contain ' + length + ' digits.';\n\t },\n\t dimensions: function dimensions(field, _ref9) {\n\t var _ref10 = slicedToArray(_ref9, 2);\n\t\n\t var width = _ref10[0];\n\t var height = _ref10[1];\n\t return 'The ' + field + ' must be ' + width + ' pixels by ' + height + ' pixels.';\n\t },\n\t email: function email(field) {\n\t return 'The ' + field + ' must be a valid email.';\n\t },\n\t ext: function ext(field) {\n\t return 'The ' + field + ' must be a valid file.';\n\t },\n\t image: function image(field) {\n\t return 'The ' + field + ' must be an image.';\n\t },\n\t in: function _in(field) {\n\t return 'The ' + field + ' must be a valid value.';\n\t },\n\t ip: function ip(field) {\n\t return 'The ' + field + ' must be a valid ip address.';\n\t },\n\t max: function max(field, _ref11) {\n\t var _ref12 = slicedToArray(_ref11, 1);\n\t\n\t var length = _ref12[0];\n\t return 'The ' + field + ' may not be greater than ' + length + ' characters.';\n\t },\n\t mimes: function mimes(field) {\n\t return 'The ' + field + ' must have a valid file type.';\n\t },\n\t min: function min(field, _ref13) {\n\t var _ref14 = slicedToArray(_ref13, 1);\n\t\n\t var length = _ref14[0];\n\t return 'The ' + field + ' must be at least ' + length + ' characters.';\n\t },\n\t not_in: function not_in(field) {\n\t return 'The ' + field + ' must be a valid value.';\n\t },\n\t numeric: function numeric(field) {\n\t return 'The ' + field + ' may only contain numeric characters.';\n\t },\n\t regex: function regex(field) {\n\t return 'The ' + field + ' format is invalid.';\n\t },\n\t required: function required(field) {\n\t return 'The ' + field + ' is required.';\n\t },\n\t size: function size(field, _ref15) {\n\t var _ref16 = slicedToArray(_ref15, 1);\n\t\n\t var _size = _ref16[0];\n\t return 'The ' + field + ' must be less than ' + _size + ' KB.';\n\t },\n\t url: function url(field) {\n\t return 'The ' + field + ' is not a valid URL.';\n\t }\n\t};\n\t\n\t/**\n\t * Determines the input field scope.\n\t */\n\tvar getScope = function getScope(el) {\n\t return el.dataset.scope || el.form && el.form.dataset.scope;\n\t};\n\t\n\tvar debounce = function debounce(func) {\n\t var threshold = arguments.length <= 1 || arguments[1] === undefined ? 100 : arguments[1];\n\t var execAsap = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2];\n\t\n\t if (!threshold) {\n\t return func;\n\t }\n\t\n\t var timeout = void 0;\n\t\n\t return function debounced(_ref) {\n\t var _ref2 = toArray(_ref);\n\t\n\t var args = _ref2;\n\t\n\t var obj = this;\n\t\n\t function delayed() {\n\t if (!execAsap) {\n\t func.apply(obj, args);\n\t }\n\t timeout = null;\n\t }\n\t\n\t if (timeout) {\n\t clearTimeout(timeout);\n\t } else if (execAsap) {\n\t func.apply.apply(func, [obj].concat(toConsumableArray(args)));\n\t }\n\t\n\t timeout = setTimeout(delayed, threshold || 100);\n\t };\n\t};\n\t\n\tvar warn = function warn(message) {\n\t if (!console) {\n\t return;\n\t }\n\t\n\t console.warn(\"vee-validate: \" + message); // eslint-disable-line\n\t};\n\t\n\tvar after$1 = (function (moment) {\n\t return function (value, _ref) {\n\t var _ref2 = slicedToArray(_ref, 2);\n\t\n\t var targetField = _ref2[0];\n\t var format = _ref2[1];\n\t\n\t var dateValue = moment(value, format, true);\n\t var field = document.querySelector(\"input[name='\" + targetField + \"']\");\n\t\n\t if (!(dateValue.isValid() && field)) {\n\t return false;\n\t }\n\t\n\t var other = moment(field.value, format, true);\n\t\n\t if (!other.isValid()) {\n\t return false;\n\t }\n\t\n\t return dateValue.isAfter(other);\n\t };\n\t});\n\t\n\tvar before$1 = (function (moment) {\n\t return function (value, _ref) {\n\t var _ref2 = slicedToArray(_ref, 2);\n\t\n\t var targetField = _ref2[0];\n\t var format = _ref2[1];\n\t\n\t var dateValue = moment(value, format, true);\n\t var field = document.querySelector(\"input[name='\" + targetField + \"']\");\n\t\n\t if (!dateValue.isValid() || !field) {\n\t return false;\n\t }\n\t\n\t var other = moment(field.value, format, true);\n\t\n\t if (!other.isValid()) {\n\t return false;\n\t }\n\t\n\t return dateValue.isBefore(other);\n\t };\n\t});\n\t\n\tvar date_format$1 = (function (moment) {\n\t return function (value, _ref) {\n\t var _ref2 = slicedToArray(_ref, 1);\n\t\n\t var format = _ref2[0];\n\t return moment(value, format, true).isValid();\n\t };\n\t});\n\t\n\tvar date_between$1 = (function (moment) {\n\t return function (value, _ref) {\n\t var _ref2 = slicedToArray(_ref, 3);\n\t\n\t var min = _ref2[0];\n\t var max = _ref2[1];\n\t var format = _ref2[2];\n\t\n\t var minDate = moment(min, format, true);\n\t var maxDate = moment(max, format, true);\n\t var dateVal = moment(value, format, true);\n\t\n\t if (!(minDate.isValid() && maxDate.isValid() && dateVal.isValid())) {\n\t return false;\n\t }\n\t\n\t return dateVal.isBetween(minDate, maxDate);\n\t };\n\t});\n\t\n\t/* istanbul ignore next */\n\t/* eslint-disable max-len */\n\tvar messages$1 = {\n\t after: function after(field, _ref) {\n\t var _ref2 = slicedToArray(_ref, 1);\n\t\n\t var target = _ref2[0];\n\t return \"The \" + field + \" must be after \" + target + \".\";\n\t },\n\t before: function before(field, _ref3) {\n\t var _ref4 = slicedToArray(_ref3, 1);\n\t\n\t var target = _ref4[0];\n\t return \"The \" + field + \" must be before \" + target + \".\";\n\t },\n\t date_between: function date_between(field, _ref5) {\n\t var _ref6 = slicedToArray(_ref5, 2);\n\t\n\t var min = _ref6[0];\n\t var max = _ref6[1];\n\t return \"The \" + field + \" must be between \" + min + \" and \" + max + \".\";\n\t },\n\t date_format: function date_format(field, _ref7) {\n\t var _ref8 = slicedToArray(_ref7, 1);\n\t\n\t var format = _ref8[0];\n\t return \"The \" + field + \" must be in the format \" + format + \".\";\n\t }\n\t};\n\t\n\tvar date = {\n\t make: function make(moment) {\n\t return {\n\t date_format: date_format$1(moment),\n\t after: after$1(moment),\n\t before: before$1(moment),\n\t date_between: date_between$1(moment)\n\t };\n\t },\n\t messages: messages$1,\n\t installed: false\n\t};\n\t\n\tvar FieldBag = function () {\n\t function FieldBag($vm) {\n\t classCallCheck(this, FieldBag);\n\t\n\t this.$vm = $vm;\n\t // Needed to bypass render errors if the fields aren't populated yet.\n\t this.fields = new Proxy({}, {\n\t get: function get(target, property) {\n\t if (!(property in target) && typeof property === 'string') {\n\t // eslint-disable-next-line\n\t target[property] = {};\n\t }\n\t\n\t return target[property];\n\t }\n\t });\n\t }\n\t\n\t /**\n\t * Initializes and adds a new field to the bag.\n\t */\n\t\n\t\n\t createClass(FieldBag, [{\n\t key: '_add',\n\t value: function _add(name) {\n\t this.fields[name] = {};\n\t this._setFlags(name, { dirty: false, valid: false }, true);\n\t }\n\t\n\t /**\n\t * Remooves a field from the bag.\n\t */\n\t\n\t }, {\n\t key: '_remove',\n\t value: function _remove(name) {\n\t delete this.fields[name];\n\t }\n\t\n\t /**\n\t * Sets the flags for a specified field.\n\t */\n\t\n\t }, {\n\t key: '_setFlags',\n\t value: function _setFlags(name, flags) {\n\t var _this = this;\n\t\n\t var initial = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2];\n\t\n\t Object.keys(flags).forEach(function (flag) {\n\t return _this._setFlag(name, flag, flags[flag], initial);\n\t });\n\t\n\t /* istanbul ignore if */\n\t if (this.$vm) {\n\t this.$vm.fields = Object.assign({}, this.$vm.fields, this.fields);\n\t }\n\t }\n\t\n\t /**\n\t * Sets a flag for a specified field.\n\t */\n\t\n\t }, {\n\t key: '_setFlag',\n\t value: function _setFlag(name, flag, value) {\n\t var initial = arguments.length <= 3 || arguments[3] === undefined ? false : arguments[3];\n\t\n\t var method = 'set' + flag.charAt(0).toUpperCase() + flag.slice(1);\n\t if (typeof this[method] !== 'function') {\n\t return;\n\t }\n\t\n\t this[method](name, value, initial);\n\t }\n\t\n\t /**\n\t * Updates the dirty flag for a specified field with its dependant flags.\n\t */\n\t\n\t }, {\n\t key: 'setDirty',\n\t value: function setDirty(name, value) {\n\t var initial = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2];\n\t\n\t this.fields[name].dirty = value;\n\t this.fields[name].clean = initial || !value;\n\t this.fields[name].passed = this.fields[name].valid && value;\n\t this.fields[name].failed = !this.fields[name].valid && value;\n\t }\n\t\n\t /**\n\t * Updates the valid flag for a specified field with its dependant flags.\n\t */\n\t\n\t }, {\n\t key: 'setValid',\n\t value: function setValid(name, value) {\n\t this.fields[name].valid = value;\n\t this.fields[name].passed = this.fields[name].dirty && value;\n\t this.fields[name].failed = this.fields[name].dirty && !value;\n\t }\n\t }]);\n\t return FieldBag;\n\t}();\n\t\n\tvar EVENT_NAME = 'veeValidate';\n\tvar DEFAULT_LOCALE = 'en';\n\tvar STRICT_MODE = true;\n\t\n\tvar dictionary = new Dictionary({\n\t en: {\n\t messages: messages,\n\t attributes: {}\n\t }\n\t});\n\t\n\tvar Validator = function () {\n\t function Validator(validations, $vm) {\n\t classCallCheck(this, Validator);\n\t\n\t this.locale = DEFAULT_LOCALE;\n\t this.strictMode = STRICT_MODE;\n\t this.$fields = {};\n\t this.fieldBag = new FieldBag($vm);\n\t this._createFields(validations);\n\t this.errorBag = new ErrorBag();\n\t this.$vm = $vm;\n\t\n\t // if momentjs is present, install the validators.\n\t if (typeof moment === 'function') {\n\t // eslint-disable-next-line\n\t this.installDateTimeValidators(moment);\n\t }\n\t }\n\t\n\t /**\n\t * Sets the default locale for all validators.\n\t *\n\t * @param {String} language The locale id.\n\t */\n\t\n\t\n\t createClass(Validator, [{\n\t key: 'installDateTimeValidators',\n\t\n\t\n\t /**\n\t * Just an alias to the static method for convienece.\n\t */\n\t value: function installDateTimeValidators(moment) {\n\t Validator.installDateTimeValidators(moment);\n\t }\n\t\n\t /**\n\t * Sets the operating mode for this validator.\n\t * strictMode = true: Values without a rule are invalid and cause failure.\n\t * strictMode = false: Values without a rule are valid and are skipped.\n\t * @param {Boolean} strictMode.\n\t */\n\t\n\t }, {\n\t key: 'setStrictMode',\n\t value: function setStrictMode() {\n\t var strictMode = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];\n\t\n\t this.strictMode = strictMode;\n\t }\n\t\n\t /**\n\t * Updates the dicitionary, overwriting existing values and adding new ones.\n\t *\n\t * @param {object} data The dictionary object.\n\t = */\n\t\n\t }, {\n\t key: 'setLocale',\n\t\n\t\n\t /**\n\t * Sets the validator current langauge.\n\t *\n\t * @param {string} language locale or language id.\n\t */\n\t value: function setLocale(language) {\n\t /* istanbul ignore if */\n\t if (!dictionary.hasLocale(language)) {\n\t // eslint-disable-next-line\n\t warn('You are setting the validator locale to a locale that is not defined in the dicitionary. English messages may still be generated.');\n\t }\n\t\n\t this.locale = language;\n\t }\n\t\n\t /**\n\t * Registers a field to be validated.\n\t *\n\t * @param {string} name The field name.\n\t * @param {string} checks validations expression.\n\t * @param {string} prettyName Custom name to be used as field name in error messages.\n\t */\n\t\n\t }, {\n\t key: 'attach',\n\t value: function attach(name, checks) {\n\t var prettyName = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\t\n\t this.errorBag.remove(name);\n\t this._createField(name, checks);\n\t\n\t if (prettyName) {\n\t this.$fields[name].name = prettyName;\n\t }\n\t }\n\t\n\t /**\n\t * Updates the messages dicitionary, overwriting existing values and adding new ones.\n\t *\n\t * @param {object} data The messages object.\n\t */\n\t\n\t }, {\n\t key: 'updateDictionary',\n\t value: function updateDictionary(data) {\n\t Validator.updateDictionary(data);\n\t }\n\t\n\t /**\n\t * Removes a field from the validator.\n\t *\n\t * @param {string} name The name of the field.\n\t */\n\t\n\t }, {\n\t key: 'detach',\n\t value: function detach(name) {\n\t delete this.$fields[name];\n\t this.fieldBag._remove(name);\n\t }\n\t\n\t /**\n\t * Adds a custom validator to the list of validation rules.\n\t *\n\t * @param {string} name The name of the validator.\n\t * @param {object|function} validator The validator object/function.\n\t */\n\t\n\t }, {\n\t key: 'extend',\n\t value: function extend(name, validator) {\n\t Validator.extend(name, validator);\n\t }\n\t\n\t /**\n\t * Validates each value against the corresponding field validations.\n\t * @param {object} values The values to be validated.\n\t * @return {boolean|Promise|void} result Returns a boolean or a promise that will\n\t * resolve to a boolean.\n\t */\n\t\n\t }, {\n\t key: 'validateAll',\n\t value: function validateAll(values) {\n\t var _this = this;\n\t\n\t /* istanbul ignore if */\n\t if (this.$vm && (!values || typeof values === 'string')) {\n\t this.errorBag.clear(values);\n\t this.$vm.$emit(EVENT_NAME, values);\n\t\n\t return;\n\t }\n\t\n\t var test = true;\n\t var promises = [];\n\t this.errorBag.clear();\n\t Object.keys(values).forEach(function (property) {\n\t var result = _this.validate(property, values[property]);\n\t if (typeof result.then === 'function') {\n\t promises.push(result);\n\t return;\n\t }\n\t\n\t test = test && result;\n\t });\n\t\n\t if (promises.length) {\n\t // eslint-disable-next-line\n\t return Promise.all(promises).then(function (values) {\n\t return values.every(function (t) {\n\t return t;\n\t }) && test;\n\t });\n\t }\n\t\n\t return test; // eslint-disable-line\n\t }\n\t\n\t /**\n\t * Validates a value against a registered field validations.\n\t *\n\t * @param {string} name the field name.\n\t * @param {*} value The value to be validated.\n\t * @return {boolean|Promise} result returns a boolean or a promise that will resolve to\n\t * a boolean.\n\t */\n\t\n\t }, {\n\t key: 'validate',\n\t value: function validate(name, value, scope) {\n\t var _this2 = this;\n\t\n\t if (!this.$fields[name]) {\n\t if (!this.strictMode) {\n\t return true;\n\t }\n\t warn('Trying to validate a non-existant field: \"' + name + '\". Use \"attach()\" first.');\n\t\n\t return false;\n\t }\n\t\n\t this.errorBag.remove(name, scope);\n\t // if its not required and is empty or null or undefined then it passes.\n\t if (!this.$fields[name].required && ~[null, undefined, ''].indexOf(value)) {\n\t return true;\n\t }\n\t\n\t var test = true;\n\t var promises = [];\n\t this.$fields[name].validations.forEach(function (rule) {\n\t var result = _this2._test(name, value, rule, scope);\n\t if (typeof result.then === 'function') {\n\t promises.push(result);\n\t return;\n\t }\n\t\n\t test = test && result;\n\t });\n\t\n\t if (promises.length) {\n\t return Promise.all(promises).then(function (values) {\n\t var valid = values.every(function (t) {\n\t return t;\n\t }) && test;\n\t _this2.fieldBag._setFlags(name, { valid: valid, dirty: true });\n\t\n\t return valid;\n\t });\n\t }\n\t\n\t this.fieldBag._setFlags(name, { valid: test, dirty: true });\n\t\n\t return test;\n\t }\n\t\n\t /**\n\t * Creates the fields to be validated.\n\t *\n\t * @param {object} validations\n\t * @return {object} Normalized object.\n\t */\n\t\n\t }, {\n\t key: '_createFields',\n\t value: function _createFields(validations) {\n\t var _this3 = this;\n\t\n\t if (!validations) {\n\t return;\n\t }\n\t\n\t Object.keys(validations).forEach(function (field) {\n\t _this3._createField(field, validations[field]);\n\t });\n\t }\n\t\n\t /**\n\t * Creates a field entry in the fields object.\n\t * @param {String} name.\n\t * @param {String} Checks.\n\t */\n\t\n\t }, {\n\t key: '_createField',\n\t value: function _createField(name, checks) {\n\t var _this4 = this;\n\t\n\t if (!this.$fields[name]) {\n\t this.$fields[name] = {};\n\t }\n\t\n\t this.fieldBag._add(name);\n\t this.$fields[name].validations = [];\n\t\n\t if (Array.isArray(checks)) {\n\t this.$fields[name].validations = checks;\n\t\n\t return;\n\t }\n\t\n\t checks.split('|').forEach(function (rule) {\n\t var normalizedRule = _this4._normalizeRule(rule, _this4.$fields[name].validations);\n\t if (normalizedRule.name === 'required') {\n\t _this4.$fields[name].required = true;\n\t }\n\t\n\t _this4.$fields[name].validations.push(normalizedRule);\n\t });\n\t }\n\t\n\t /**\n\t * Normalizes a single validation object.\n\t *\n\t * @param {string} rule The rule to be normalized.\n\t * @return {object} rule The normalized rule.\n\t */\n\t\n\t }, {\n\t key: '_normalizeRule',\n\t value: function _normalizeRule(rule, validations) {\n\t var params = [];\n\t var name = rule.split(':')[0];\n\t if (~rule.indexOf(':')) {\n\t params = rule.split(':')[1].split(',');\n\t }\n\t\n\t // Those rules need the date format to parse and compare correctly.\n\t if (date.installed && ~['after', 'before', 'date_between'].indexOf(name)) {\n\t var dateFormat = validations.filter(function (v) {\n\t return v.name === 'date_format';\n\t })[0];\n\t if (dateFormat) {\n\t // pass it as the last param.\n\t params.push(dateFormat.params[0]);\n\t }\n\t }\n\t\n\t return { name: name, params: params };\n\t }\n\t\n\t /**\n\t * Formats an error message for field and a rule.\n\t *\n\t * @param {string} field The field name.\n\t * @param {object} rule Normalized rule object.\n\t * @return {string} msg Formatted error message.\n\t */\n\t\n\t }, {\n\t key: '_formatErrorMessage',\n\t value: function _formatErrorMessage(field, rule) {\n\t if (!dictionary.hasLocale(this.locale) || typeof dictionary.getMessage(this.locale, rule.name) !== 'function') {\n\t // Default to english message.\n\t return dictionary.getMessage('en', rule.name)(field, rule.params);\n\t }\n\t\n\t return dictionary.getMessage(this.locale, rule.name)(field, rule.params);\n\t }\n\t\n\t /**\n\t * Resolves an appropiate display name, first checking 'data-as' or the registered 'prettyName'\n\t * Then the dictionary, then fallsback to field name.\n\t * @return {String} displayName The name to be used in the errors.\n\t */\n\t\n\t }, {\n\t key: '_getFieldDisplayName',\n\t value: function _getFieldDisplayName(field) {\n\t return this.$fields[field].name || dictionary.getAttribute(this.locale, field, field);\n\t }\n\t\n\t /**\n\t * Tests a single input value against a rule.\n\t *\n\t * @param {*} name The name of the field.\n\t * @param {*} value [description]\n\t * @param {object} rule the rule object.\n\t * @return {boolean} Wether if it passes the check.\n\t */\n\t\n\t }, {\n\t key: '_test',\n\t value: function _test(name, value, rule, scope) {\n\t var _this5 = this;\n\t\n\t var validator = Rules[rule.name];\n\t var valid = validator(value, rule.params);\n\t var displayName = this._getFieldDisplayName(name);\n\t\n\t if (typeof valid.then === 'function') {\n\t return valid.then(function (values) {\n\t var allValid = Array.isArray(values) ? values.every(function (t) {\n\t return t.valid;\n\t }) : values.valid;\n\t\n\t if (!allValid) {\n\t _this5.errorBag.add(name, _this5._formatErrorMessage(displayName, rule), scope);\n\t }\n\t\n\t return allValid;\n\t });\n\t }\n\t\n\t if (!valid) {\n\t this.errorBag.add(name, this._formatErrorMessage(displayName, rule), scope);\n\t }\n\t\n\t return valid;\n\t }\n\t\n\t /**\n\t * Gets the internal errorBag instance.\n\t *\n\t * @return {ErrorBag} errorBag The internal error bag object.\n\t */\n\t\n\t }, {\n\t key: 'getErrors',\n\t value: function getErrors() {\n\t return this.errorBag;\n\t }\n\t }], [{\n\t key: 'setDefaultLocale',\n\t value: function setDefaultLocale() {\n\t var language = arguments.length <= 0 || arguments[0] === undefined ? 'en' : arguments[0];\n\t\n\t /* istanbul ignore if */\n\t if (!dictionary.hasLocale(language)) {\n\t // eslint-disable-next-line\n\t warn('You are setting the validator locale to a locale that is not defined in the dicitionary. English messages may still be generated.');\n\t }\n\t\n\t DEFAULT_LOCALE = language;\n\t }\n\t\n\t /**\n\t * Sets the operating mode for all newly created validators.\n\t * strictMode = true: Values without a rule are invalid and cause failure.\n\t * strictMode = false: Values without a rule are valid and are skipped.\n\t * @param {Boolean} strictMode.\n\t */\n\t\n\t }, {\n\t key: 'setStrictMode',\n\t value: function setStrictMode() {\n\t var strictMode = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];\n\t\n\t STRICT_MODE = strictMode;\n\t }\n\t\n\t /**\n\t * Installs the datetime validators and the messages.\n\t */\n\t\n\t }, {\n\t key: 'installDateTimeValidators',\n\t value: function installDateTimeValidators(moment) {\n\t if (typeof moment !== 'function') {\n\t warn('To use the date-time validators you must provide moment reference.');\n\t\n\t return false;\n\t }\n\t\n\t if (date.installed) {\n\t return true;\n\t }\n\t\n\t var validators = date.make(moment);\n\t Object.keys(validators).forEach(function (name) {\n\t Validator.extend(name, validators[name]);\n\t });\n\t\n\t Validator.updateDictionary({\n\t en: {\n\t messages: date.messages\n\t }\n\t });\n\t date.installed = true;\n\t\n\t return true;\n\t }\n\t }, {\n\t key: 'updateDictionary',\n\t value: function updateDictionary(data) {\n\t dictionary.merge(data);\n\t }\n\t\n\t /**\n\t * Static constructor.\n\t *\n\t * @param {object} validations The validations object.\n\t * @return {Validator} validator A validator object.\n\t */\n\t\n\t }, {\n\t key: 'create',\n\t value: function create(validations, $vm) {\n\t return new Validator(validations, $vm);\n\t }\n\t\n\t /**\n\t * Adds a custom validator to the list of validation rules.\n\t *\n\t * @param {string} name The name of the validator.\n\t * @param {object|function} validator The validator object/function.\n\t */\n\t\n\t }, {\n\t key: 'extend',\n\t value: function extend(name, validator) {\n\t Validator._guardExtend(name, validator);\n\t Validator._merge(name, validator);\n\t }\n\t\n\t /**\n\t * Merges a validator object into the Rules and Messages.\n\t *\n\t * @param {string} name The name of the validator.\n\t * @param {function|object} validator The validator object.\n\t */\n\t\n\t }, {\n\t key: '_merge',\n\t value: function _merge(name, validator) {\n\t if (typeof validator === 'function') {\n\t Rules[name] = validator;\n\t dictionary.setMessage('en', name, function (field) {\n\t return 'The ' + field + ' value is not valid.';\n\t });\n\t return;\n\t }\n\t\n\t Rules[name] = validator.validate;\n\t\n\t if (validator.getMessage && typeof validator.getMessage === 'function') {\n\t dictionary.setMessage('en', name, validator.getMessage);\n\t }\n\t\n\t if (validator.messages) {\n\t dictionary.merge(Object.keys(validator.messages).reduce(function (prev, curr) {\n\t var dict = prev;\n\t dict[curr] = {\n\t messages: defineProperty({}, name, validator.messages[curr])\n\t };\n\t\n\t return dict;\n\t }, {}));\n\t }\n\t }\n\t\n\t /**\n\t * Guards from extnsion violations.\n\t *\n\t * @param {string} name name of the validation rule.\n\t * @param {object} validator a validation rule object.\n\t */\n\t\n\t }, {\n\t key: '_guardExtend',\n\t value: function _guardExtend(name, validator) {\n\t if (Rules[name]) {\n\t throw new _class('Extension Error: There is an existing validator with the same name \\'' + name + '\\'.');\n\t }\n\t\n\t if (typeof validator === 'function') {\n\t return;\n\t }\n\t\n\t if (typeof validator.validate !== 'function') {\n\t throw new _class(\n\t // eslint-disable-next-line\n\t 'Extension Error: The validator \\'' + name + '\\' must be a function or have a \\'validate\\' method.');\n\t }\n\t\n\t if (typeof validator.getMessage !== 'function' && _typeof(validator.messages) !== 'object') {\n\t throw new _class(\n\t // eslint-disable-next-line\n\t 'Extension Error: The validator \\'' + name + '\\' must have a \\'getMessage\\' method or have a \\'messages\\' object.');\n\t }\n\t }\n\t }]);\n\t return Validator;\n\t}();\n\t\n\t/**\n\t * Keeps track of $vm, $validator instances.\n\t * @type {Array}\n\t */\n\tvar instances = [];\n\t\n\t/**\n\t * Finds a validator instance from the instances array.\n\t * @param {[type]} $vm The Vue instance.\n\t * @return {object} pair the $vm,$validator pair.\n\t */\n\tvar find = function find($vm) {\n\t for (var i = 0; i < instances.length; i++) {\n\t if (instances[i].$vm === $vm) {\n\t return instances[i].$validator;\n\t }\n\t }\n\t\n\t return undefined;\n\t};\n\t\n\t/**\n\t * Registers a validator for a $vm instance.\n\t * @param {*} $vm The Vue instance.\n\t * @return {Validator} $validator The validator instance.\n\t */\n\tvar register = function register($vm) {\n\t var instance = find($vm);\n\t if (!instance) {\n\t instance = Validator.create(undefined, $vm);\n\t\n\t instances.push({\n\t $vm: $vm,\n\t $validator: instance\n\t });\n\t }\n\t\n\t return instance;\n\t};\n\t\n\tvar unregister = function unregister($vm) {\n\t for (var i = 0; i < instances.length; i++) {\n\t if (instances[i].$vm === $vm) {\n\t instances.splice(i, 1);\n\t\n\t return true;\n\t }\n\t }\n\t\n\t return false;\n\t};\n\t\n\tvar mixin = (function (options) {\n\t return {\n\t data: function data() {\n\t var _ref;\n\t\n\t return _ref = {}, defineProperty(_ref, options.errorBagName, this.$validator.errorBag), defineProperty(_ref, options.fieldsBagName, this.$validator.fieldBag.fields), _ref;\n\t },\n\t ready: function ready() {\n\t var _this = this;\n\t\n\t this.$nextTick(function () {\n\t _this.$emit('validatorReady');\n\t });\n\t },\n\t destroyed: function destroyed() {\n\t unregister(this);\n\t }\n\t };\n\t});\n\t\n\tvar DEFAULT_EVENT_NAME = 'veeValidate';\n\t\n\tvar ListenerGenerator = function () {\n\t function ListenerGenerator(el, binding, context, options) {\n\t classCallCheck(this, ListenerGenerator);\n\t\n\t this.callbacks = [];\n\t this.el = el;\n\t this.binding = binding;\n\t this.vm = context;\n\t this.options = options;\n\t this.fieldName = binding.expression || el.name;\n\t }\n\t\n\t /**\n\t * Determines if the validation rule requires additional listeners on target fields.\n\t */\n\t\n\t\n\t createClass(ListenerGenerator, [{\n\t key: '_hasFieldDependency',\n\t value: function _hasFieldDependency(rules) {\n\t var results = rules.split('|').filter(function (r) {\n\t return !!r.match(/confirmed|after|before/);\n\t });\n\t if (!results.length) {\n\t return false;\n\t }\n\t\n\t return results[0].split(':')[1];\n\t }\n\t\n\t /**\n\t * Validates input value, triggered by 'input' event.\n\t */\n\t\n\t }, {\n\t key: '_inputListener',\n\t value: function _inputListener() {\n\t this.vm.$validator.validate(this.fieldName, this.el.value, getScope(this.el));\n\t }\n\t\n\t /**\n\t * Validates files, triggered by 'change' event.\n\t */\n\t\n\t }, {\n\t key: '_fileListener',\n\t value: function _fileListener() {\n\t var isValid = this.vm.$validator.validate(this.fieldName, this.el.files, getScope(this.el));\n\t if (!isValid && this.binding.modifiers.reject) {\n\t // eslint-disable-next-line\n\t el.value = '';\n\t }\n\t }\n\t\n\t /**\n\t * Validates radio buttons, triggered by 'change' event.\n\t */\n\t\n\t }, {\n\t key: '_radioListener',\n\t value: function _radioListener() {\n\t var checked = document.querySelector('input[name=\"' + this.el.name + '\"]:checked');\n\t if (!checked) {\n\t this.vm.$validator.validate(this.fieldName, null, getScope(this.el));\n\t return;\n\t }\n\t\n\t this.vm.$validator.validate(this.fieldName, checked.value, getScope(this.el));\n\t }\n\t\n\t /**\n\t * Validates checkboxes, triggered by change event.\n\t */\n\t\n\t }, {\n\t key: '_checkboxListener',\n\t value: function _checkboxListener() {\n\t var _this = this;\n\t\n\t var checkedBoxes = document.querySelectorAll('input[name=\"' + this.el.name + '\"]:checked');\n\t if (!checkedBoxes || !checkedBoxes.length) {\n\t this.vm.$validator.validate(this.fieldName, null, getScope(this.el));\n\t return;\n\t }\n\t\n\t [].concat(toConsumableArray(checkedBoxes)).forEach(function (box) {\n\t _this.vm.$validator.validate(_this.fieldName, box.value, getScope(_this.el));\n\t });\n\t }\n\t\n\t /**\n\t * Returns a scoped callback, only runs if the el scope is the same as the recieved scope\n\t * From the event.\n\t */\n\t\n\t }, {\n\t key: '_getScopedListener',\n\t value: function _getScopedListener(callback) {\n\t var _this2 = this;\n\t\n\t return function (scope) {\n\t if (!scope || scope === getScope(_this2.el) || scope instanceof Event) {\n\t callback();\n\t }\n\t };\n\t }\n\t\n\t /**\n\t * Attaches validator event-triggered validation.\n\t */\n\t\n\t }, {\n\t key: '_attachValidatorEvent',\n\t value: function _attachValidatorEvent() {\n\t var _this3 = this;\n\t\n\t var listener = this._getScopedListener(this._getSuitableListener().listener.bind(this));\n\t\n\t this.vm.$on(DEFAULT_EVENT_NAME, listener);\n\t this.callbacks.push({ event: DEFAULT_EVENT_NAME, listener: listener });\n\t\n\t var fieldName = this._hasFieldDependency(this.el.dataset.rules);\n\t if (fieldName) {\n\t // Wait for the validator ready triggered when vm is mounted because maybe\n\t // the element isn't mounted yet.\n\t this.vm.$once('validatorReady', function () {\n\t var target = document.querySelector('input[name=\\'' + fieldName + '\\']');\n\t if (!target) {\n\t warn('Cannot find target field, no additional listeners were attached.');\n\t return;\n\t }\n\t\n\t target.addEventListener('input', listener);\n\t _this3.callbacks.push({ event: 'input', listener: listener, el: target });\n\t });\n\t }\n\t }\n\t\n\t /**\n\t * Determines a suitable listener for the element.\n\t */\n\t\n\t }, {\n\t key: '_getSuitableListener',\n\t value: function _getSuitableListener() {\n\t if (this.el.type === 'file') {\n\t return {\n\t name: 'change',\n\t listener: this._fileListener\n\t };\n\t }\n\t\n\t if (this.el.type === 'radio') {\n\t return {\n\t name: 'change',\n\t listener: this._radioListener\n\t };\n\t }\n\t\n\t if (this.el.type === 'checkbox') {\n\t return {\n\t name: 'change',\n\t listener: this._checkboxListener\n\t };\n\t }\n\t\n\t return {\n\t name: 'input',\n\t listener: this._inputListener\n\t };\n\t }\n\t\n\t /**\n\t * Attachs a suitable listener for the input.\n\t */\n\t\n\t }, {\n\t key: '_attachFieldListeners',\n\t value: function _attachFieldListeners() {\n\t var _this4 = this;\n\t\n\t var handler = this._getSuitableListener();\n\t var listener = debounce(handler.listener.bind(this), this.el.dataset.delay || this.options.delay);\n\t\n\t if (~['radio', 'checkbox'].indexOf(this.el.type)) {\n\t this.vm.$once('validatorReady', function () {\n\t [].concat(toConsumableArray(document.querySelectorAll('input[name=\"' + _this4.el.name + '\"]'))).forEach(function (input) {\n\t input.addEventListener(handler.name, listener);\n\t _this4.callbacks.push({\n\t event: handler.name,\n\t callback: listener,\n\t el: input\n\t });\n\t });\n\t });\n\t\n\t return;\n\t }\n\t\n\t this.el.addEventListener(handler.name, listener);\n\t this.callbacks.push({ event: handler.name, callback: listener, el: this.el });\n\t }\n\t\n\t /**\n\t * Attaches the Event Listeners.\n\t */\n\t\n\t }, {\n\t key: 'attach',\n\t value: function attach() {\n\t this.vm.$validator.attach(this.fieldName, this.el.dataset.rules, this.el.dataset.as);\n\t this._attachValidatorEvent();\n\t\n\t if (this.binding.expression) {\n\t return;\n\t }\n\t\n\t this._attachFieldListeners();\n\t }\n\t\n\t /**\n\t * Removes all attached event listeners.\n\t */\n\t\n\t }, {\n\t key: 'detach',\n\t value: function detach() {\n\t this.vm.$off(DEFAULT_EVENT_NAME, this.callbacks.filter(function (_ref) {\n\t var event = _ref.event;\n\t return event === DEFAULT_EVENT_NAME;\n\t })[0]);\n\t\n\t this.callbacks.filter(function (_ref2) {\n\t var event = _ref2.event;\n\t return event !== DEFAULT_EVENT_NAME;\n\t }).forEach(function (h) {\n\t h.el.removeEventListener(h.event, h.listener);\n\t });\n\t }\n\t }]);\n\t return ListenerGenerator;\n\t}();\n\t\n\tvar listenersInstances = [];\n\t\n\tvar directive = (function (options) {\n\t return {\n\t bind: function bind() {\n\t var _this = this;\n\t\n\t this.vm.$nextTick(function () {\n\t _this.fieldName = _this.expression || _this.el.name;\n\t var binding = { expression: _this.expression, modifiers: _this.modifiers };\n\t var listener = new ListenerGenerator(_this.el, binding, _this.vm, options);\n\t listener.attach();\n\t listenersInstances.push({ vm: _this.vm, el: _this.el, instance: listener });\n\t });\n\t },\n\t update: function update(value) {\n\t var _this2 = this;\n\t\n\t if (!this.expression) {\n\t return;\n\t }\n\t\n\t if (this.modifiers.initial) {\n\t this.modifiers.initial = false;\n\t\n\t return;\n\t }\n\t\n\t // might be not ready yet.\n\t if (!this.fieldName) {\n\t this.vm.$nextTick(function () {\n\t _this2.vm.$validator.validate(_this2.fieldName, value, getScope(_this2.el));\n\t });\n\t\n\t return;\n\t }\n\t\n\t this.vm.$validator.validate(this.fieldName, value, getScope(this.el));\n\t },\n\t unbind: function unbind() {\n\t var _this3 = this;\n\t\n\t var holder = listenersInstances.filter(function (l) {\n\t return l.vm === _this3.vm && l.el === _this3.el;\n\t })[0];\n\t holder.instance.detach();\n\t listenersInstances.splice(listenersInstances.indexOf(holder), 1);\n\t }\n\t };\n\t});\n\t\n\t// eslint-disable-next-line\n\tvar install = function install(Vue) {\n\t var _ref = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\t\n\t var _ref$locale = _ref.locale;\n\t var locale = _ref$locale === undefined ? 'en' : _ref$locale;\n\t var _ref$delay = _ref.delay;\n\t var delay = _ref$delay === undefined ? 0 : _ref$delay;\n\t var _ref$errorBagName = _ref.errorBagName;\n\t var errorBagName = _ref$errorBagName === undefined ? 'errors' : _ref$errorBagName;\n\t var _ref$dictionary = _ref.dictionary;\n\t var dictionary = _ref$dictionary === undefined ? null : _ref$dictionary;\n\t var _ref$strict = _ref.strict;\n\t var strict = _ref$strict === undefined ? true : _ref$strict;\n\t var _ref$fieldsBagName = _ref.fieldsBagName;\n\t var fieldsBagName = _ref$fieldsBagName === undefined ? 'fields' : _ref$fieldsBagName;\n\t\n\t if (dictionary) {\n\t Validator.updateDictionary(dictionary);\n\t }\n\t\n\t Validator.setDefaultLocale(locale);\n\t Validator.setStrictMode(strict);\n\t\n\t var options = {\n\t locale: locale,\n\t delay: delay,\n\t dictionary: dictionary,\n\t errorBagName: errorBagName,\n\t fieldsBagName: fieldsBagName\n\t };\n\t\n\t Object.defineProperties(Vue.prototype, {\n\t $validator: {\n\t get: function get() {\n\t return register(this);\n\t }\n\t }\n\t });\n\t\n\t Vue.mixin(mixin(options)); // Install Mixin.\n\t Vue.directive('validate', directive(options)); // Install directive.\n\t};\n\t\n\tvar index = { install: install, Validator: Validator, ErrorBag: ErrorBag };\n\t\n\treturn index;\n\t\n\t})));\n\n\n/***/ }\n/******/ ])\n});\n;\n\n\n// WEBPACK FOOTER //\n// build.js"," \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 e5c949d519f921191da2","import Vee from 'vee-validate'\r\nimport Validator from './Validator'\r\n\r\nexport default {\r\n install(Vue){\r\n\r\n Vue.use(Vee)\r\n\r\n Vue.mixin({\r\n beforeCreate(){\r\n let _this = this;\r\n this.$form = (form) => {\r\n return (new Validator(form, _this.$validator))\r\n }\r\n }\r\n })\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/Mixin.js","export default class {\r\n\r\n constructor(form, Validator){\r\n\r\n this._rules = {}\r\n this._fields = {}\r\n\r\n this.$validator = Validator;\r\n\r\n this.$errors = this.$validator.errorBag\r\n\r\n this.$rules = new Proxy(this._rules, this.watcher());\r\n this.$fields = new Proxy(this._fields, this.watcher());\r\n\r\n Object.keys(form).forEach((key) => {\r\n this.$rules[key] = form[key].rule;\r\n this.$fields[key] = form[key].value;\r\n })\r\n\r\n this.$errors.clear();\r\n }\r\n\r\n watcher(){\r\n\r\n let _this = this;\r\n\r\n return {\r\n get(target, name){\r\n return target[name]\r\n },\r\n set(target, name, val){\r\n if(val){\r\n if(target == _this._rules) _this.$validator.attach(name, val);\r\n target[name] = val;\r\n }else{\r\n if(target == _this._rules) _this.$validator.detach(name)\r\n delete target[name]\r\n }\r\n\r\n _this.$validator.validate(name, _this.$fields[name]);\r\n\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/Validator.js","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global.VeeValidate = factory());\n}(this, (function () { 'use strict';\n\nvar email$1 = (function (value) {\n return (/^(([^<>()[\\]\\\\.,;:#\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,6}))$/.test(value)\n );\n});\n\nvar In = (function (value, options) {\n return !!options.filter(function (option) {\n return option == value;\n }).length;\n}); // eslint-disable-line\n\nvar required$1 = (function (value) {\n if (Array.isArray(value)) {\n return !!value.length;\n }\n\n if (value === undefined || value === null) {\n return false;\n }\n\n return !!String(value).trim().length;\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj;\n};\n\n\n\n\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\n\n\n\n\nvar defineProperty = function (obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n};\n\nvar get$1 = function get$1(object, property, receiver) {\n if (object === null) object = Function.prototype;\n var desc = Object.getOwnPropertyDescriptor(object, property);\n\n if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);\n\n if (parent === null) {\n return undefined;\n } else {\n return get$1(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;\n\n if (getter === undefined) {\n return undefined;\n }\n\n return getter.call(receiver);\n }\n};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar set = function set(object, property, value, receiver) {\n var desc = Object.getOwnPropertyDescriptor(object, property);\n\n if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);\n\n if (parent !== null) {\n set(parent, property, value, receiver);\n }\n } else if (\"value\" in desc && desc.writable) {\n desc.value = value;\n } else {\n var setter = desc.set;\n\n if (setter !== undefined) {\n setter.call(receiver, value);\n }\n }\n\n return value;\n};\n\nvar slicedToArray = function () {\n function sliceIterator(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"]) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n }\n\n return function (arr, i) {\n if (Array.isArray(arr)) {\n return arr;\n } else if (Symbol.iterator in Object(arr)) {\n return sliceIterator(arr, i);\n } else {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n }\n };\n}();\n\n\n\n\n\n\n\n\n\n\n\nvar toArray = function (arr) {\n return Array.isArray(arr) ? arr : Array.from(arr);\n};\n\nvar toConsumableArray = function (arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n return arr2;\n } else {\n return Array.from(arr);\n }\n};\n\nvar min$1 = (function (value, _ref) {\n var _ref2 = slicedToArray(_ref, 1);\n\n var length = _ref2[0];\n\n if (value === undefined || value === null) {\n return false;\n }\n return String(value).length >= length;\n});\n\nvar max$1 = (function (value, _ref) {\n var _ref2 = slicedToArray(_ref, 1);\n\n var length = _ref2[0];\n\n if (value === undefined || value === null) {\n return length >= 0;\n }\n\n return String(value).length <= length;\n});\n\nvar not_in$1 = (function (value, options) {\n return !options.filter(function (option) {\n return option == value;\n }).length;\n}); // eslint-disable-line\n\nvar alpha$1 = (function (value) {\n return !Array.isArray(value) && /^[a-zA-Z]*$/.test(value);\n});\n\nvar alpha_num$1 = (function (value) {\n return !Array.isArray(value) && /^[a-zA-Z0-9]*$/.test(value);\n});\n\nvar alpha_dash$1 = (function (value) {\n return !Array.isArray(value) && /^[a-zA-Z0-9_-]*$/.test(value);\n});\n\nvar numeric$1 = (function (value) {\n return !Array.isArray(value) && /^[0-9]*$/.test(value);\n});\n\nvar regex$1 = (function (value, _ref) {\n var _ref2 = toArray(_ref);\n\n var regex = _ref2[0];\n\n var flags = _ref2.slice(1);\n\n if (regex instanceof RegExp) {\n return regex.test(value);\n }\n\n return new RegExp(regex, flags).test(String(value));\n});\n\n// TODO: Maybe add ipv6 flag?\nvar ip$1 = (function (value) {\n return (/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(value)\n );\n});\n\nvar ext$1 = (function (files, extensions) {\n var regex = new RegExp('.(' + extensions.join('|') + ')$', 'i');\n for (var i = 0; i < files.length; i++) {\n if (!regex.test(files[i].name)) {\n return false;\n }\n }\n\n return true;\n});\n\nvar mimes$1 = (function (files, mimes) {\n var regex = new RegExp(mimes.join('|').replace('*', '.+') + '$', 'i');\n for (var i = 0; i < files.length; i++) {\n if (!regex.test(files[i].type)) {\n return false;\n }\n }\n\n return true;\n});\n\nvar size$1 = (function (files, _ref) {\n var _ref2 = slicedToArray(_ref, 1);\n\n var size = _ref2[0];\n\n if (isNaN(size)) {\n return false;\n }\n\n var nSize = Number(size) * 1024;\n for (var i = 0; i < files.length; i++) {\n if (files[i].size > nSize) {\n return false;\n }\n }\n\n return true;\n});\n\nvar digits$1 = (function (value, _ref) {\n var _ref2 = slicedToArray(_ref, 1);\n\n var length = _ref2[0];\n\n var strVal = String(value);\n\n return (/^[0-9]*$/.test(strVal) && strVal.length === Number(length)\n );\n});\n\nvar image$1 = (function (files) {\n for (var i = 0; i < files.length; i++) {\n if (!/\\.(jpg|svg|jpeg|png|bmp|gif)$/i.test(files[i].name)) {\n return false;\n }\n }\n\n return true;\n});\n\nvar validateImage = function validateImage(file, width, height) {\n var URL = window.URL || window.webkitURL;\n return new Promise(function (resolve) {\n var image = new Image();\n image.onerror = function () {\n return resolve({ valid: false });\n };\n image.onload = function () {\n return resolve({\n valid: image.width === Number(width) && image.height === Number(height)\n });\n };\n\n image.src = URL.createObjectURL(file);\n });\n};\n\nvar dimensions$1 = (function (files, _ref) {\n var _ref2 = slicedToArray(_ref, 2);\n\n var width = _ref2[0];\n var height = _ref2[1];\n\n var list = [];\n for (var i = 0; i < files.length; i++) {\n // if file is not an image, reject.\n if (!/\\.(jpg|svg|jpeg|png|bmp|gif)$/i.test(files[i].name)) {\n return false;\n }\n\n list.push(files[i]);\n }\n\n return Promise.all(list.map(function (file) {\n return validateImage(file, width, height);\n }));\n});\n\nvar between$1 = (function (value, _ref) {\n var _ref2 = slicedToArray(_ref, 2);\n\n var min = _ref2[0];\n var max = _ref2[1];\n return Number(min) <= value && Number(max) >= value;\n});\n\nvar confirmed$1 = (function (value, _ref) {\n var _ref2 = slicedToArray(_ref, 1);\n\n var confirmedField = _ref2[0];\n\n var field = document.querySelector(\"input[name='\" + confirmedField + \"']\");\n\n return !!(field && String(value) === field.value);\n});\n\nvar url$1 = (function (value, params) {\n var isUrl = /^https?:\\/\\/([\\da-z\\.-]+)\\.([a-z\\.]{2,6})([\\/\\w\\.\\(\\)%-]*)*\\/?$/.test(value);\n\n var domain = params && params[0];\n\n if (domain && isUrl) {\n return new RegExp('^https?://(([da-z.-]+).)*(' + params[0].replace('.', '\\\\$&') + ')').test(value);\n }\n\n return isUrl;\n});\n\nvar decimal$1 = (function (value) {\n var _ref = arguments.length <= 1 || arguments[1] === undefined ? ['*'] : arguments[1];\n\n var _ref2 = slicedToArray(_ref, 1);\n\n var decimals = _ref2[0];\n\n if (Array.isArray(value)) {\n return false;\n }\n\n if (value === null || value === undefined || value === '') {\n return true;\n }\n\n var regexPart = decimals === '*' ? '*' : '{0,' + decimals + '}';\n var regex = new RegExp('^[0-9]*.?[0-9]' + regexPart + '$');\n\n if (!regex.test(value)) {\n return false;\n }\n\n return !Number.isNaN(parseFloat(value));\n});\n\nvar Rules = {\n email: email$1,\n min: min$1,\n max: max$1,\n required: required$1,\n in: In,\n not_in: not_in$1,\n alpha: alpha$1,\n alpha_num: alpha_num$1,\n alpha_dash: alpha_dash$1,\n numeric: numeric$1,\n regex: regex$1,\n ip: ip$1,\n ext: ext$1,\n mimes: mimes$1,\n size: size$1,\n digits: digits$1,\n image: image$1,\n dimensions: dimensions$1,\n between: between$1,\n confirmed: confirmed$1,\n url: url$1,\n decimal: decimal$1\n};\n\nvar ErrorBag = function () {\n function ErrorBag() {\n classCallCheck(this, ErrorBag);\n\n this.errors = [];\n }\n\n /**\n * Adds an error to the internal array.\n *\n * @param {string} field The field name.\n * @param {string} msg The error message.\n * @param {String} scope The Scope name, optional.\n */\n\n\n createClass(ErrorBag, [{\n key: \"add\",\n value: function add(field, msg, scope) {\n var error = {\n field: field,\n msg: msg\n };\n\n if (scope) {\n error.scope = scope;\n }\n\n this.errors.push(error);\n }\n\n /**\n * Gets all error messages from the internal array.\n *\n * @param {String} scope The Scope name, optional.\n * @return {Array} errors Array of all error messages.\n */\n\n }, {\n key: \"all\",\n value: function all(scope) {\n if (scope) {\n return this.errors.filter(function (e) {\n return e.scope === scope;\n }).map(function (e) {\n return e.msg;\n });\n }\n\n return this.errors.map(function (e) {\n return e.msg;\n });\n }\n\n /**\n * Checks if there is any errrors in the internal array.\n * @param {String} scope The Scope name, optional.\n * @return {boolean} result True if there was at least one error, false otherwise.\n */\n\n }, {\n key: \"any\",\n value: function any(scope) {\n if (scope) {\n return !!this.errors.filter(function (e) {\n return e.scope === scope;\n }).length;\n }\n\n return !!this.errors.length;\n }\n\n /**\n * Removes all items from the internal array.\n * @param {String} scope The Scope name, optional.\n */\n\n }, {\n key: \"clear\",\n value: function clear(scope) {\n if (scope) {\n this.errors = this.errors.filter(function (e) {\n return e.scope !== scope;\n });\n\n return;\n }\n\n this.errors = [];\n }\n\n /**\n * Collects errors into groups or for a specific field.\n *\n * @param {string} field The field name.\n * @param {string} scope The scope name.\n * @return {Array} errors The errors for the specified field.\n */\n\n }, {\n key: \"collect\",\n value: function collect(field, scope) {\n var _this = this;\n\n if (!field) {\n var _ret = function () {\n var collection = {};\n _this.errors.forEach(function (e) {\n if (!collection[e.field]) {\n collection[e.field] = [];\n }\n\n collection[e.field].push(e.msg);\n });\n\n return {\n v: collection\n };\n }();\n\n if ((typeof _ret === \"undefined\" ? \"undefined\" : _typeof(_ret)) === \"object\") return _ret.v;\n }\n\n if (scope) {\n return this.errors.filter(function (e) {\n return e.field === field && e.scope === scope;\n }).map(function (e) {\n return e.msg;\n });\n }\n\n return this.errors.filter(function (e) {\n return e.field === field;\n }).map(function (e) {\n return e.msg;\n });\n }\n /**\n * Gets the internal array length.\n *\n * @return {Number} length The internal array length.\n */\n\n }, {\n key: \"count\",\n value: function count() {\n return this.errors.length;\n }\n\n /**\n * Gets the first error message for a specific field.\n *\n * @param {string} field The field name.\n * @return {string|null} message The error message.\n */\n\n }, {\n key: \"first\",\n value: function first(field, scope) {\n for (var i = 0; i < this.errors.length; i++) {\n if (this.errors[i].field === field) {\n if (scope) {\n if (this.errors[i].scope === scope) {\n return this.errors[i].msg;\n }\n } else {\n return this.errors[i].msg;\n }\n }\n }\n\n return null;\n }\n\n /**\n * Checks if the internal array has at least one error for the specified field.\n *\n * @param {string} field The specified field.\n * @return {Boolean} result True if at least one error is found, false otherwise.\n */\n\n }, {\n key: \"has\",\n value: function has(field, scope) {\n for (var i = 0; i < this.errors.length; i++) {\n if (this.errors[i].field === field) {\n if (scope) {\n if (this.errors[i].scope === scope) {\n return true;\n }\n } else {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Removes all error messages assoicated with a specific field.\n *\n * @param {string} field The field which messages are to be removed.\n * @param {String} scope The Scope name, optional.\n */\n\n }, {\n key: \"remove\",\n value: function remove(field, scope) {\n if (scope) {\n this.errors = this.errors.filter(function (e) {\n return e.field !== field || e.scope !== scope;\n });\n\n return;\n }\n\n this.errors = this.errors.filter(function (e) {\n return e.field !== field;\n });\n }\n }]);\n return ErrorBag;\n}();\n\nvar _class = function () {\n function _class(msg) {\n classCallCheck(this, _class);\n\n this.msg = msg;\n }\n\n createClass(_class, [{\n key: \"toString\",\n value: function toString() {\n return this.msg;\n }\n }]);\n return _class;\n}();\n\n/* eslint-disable prefer-rest-params */\nvar Dictionary = function () {\n function Dictionary() {\n var dictionary = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n classCallCheck(this, Dictionary);\n\n this.dictionary = {};\n this.merge(dictionary);\n }\n\n createClass(Dictionary, [{\n key: 'hasLocale',\n value: function hasLocale(locale) {\n return !!this.dictionary[locale];\n }\n }, {\n key: 'getMessage',\n value: function getMessage(locale, key) {\n var fallback = arguments.length <= 2 || arguments[2] === undefined ? '' : arguments[2];\n\n if (!this.hasMessage(locale, key)) {\n return fallback;\n }\n\n return this.dictionary[locale].messages[key];\n }\n }, {\n key: 'getAttribute',\n value: function getAttribute(locale, key) {\n var fallback = arguments.length <= 2 || arguments[2] === undefined ? '' : arguments[2];\n\n if (!this.hasAttribute(locale, key)) {\n return fallback;\n }\n\n return this.dictionary[locale].attributes[key];\n }\n }, {\n key: 'hasMessage',\n value: function hasMessage(locale, key) {\n return !!(this.hasLocale(locale) && this.dictionary[locale].messages && this.dictionary[locale].messages[key]);\n }\n }, {\n key: 'hasAttribute',\n value: function hasAttribute(locale, key) {\n return !!(this.hasLocale(locale) && this.dictionary[locale].attributes && this.dictionary[locale].attributes[key]);\n }\n }, {\n key: 'merge',\n value: function merge(dictionary) {\n this._merge(this.dictionary, dictionary);\n }\n }, {\n key: 'setMessage',\n value: function setMessage(locale, key, message) {\n if (!this.hasLocale(locale)) {\n this.dictionary[locale] = {\n messages: {},\n attributes: {}\n };\n }\n\n this.dictionary[locale].messages[key] = message;\n }\n }, {\n key: 'setAttribute',\n value: function setAttribute(locale, key, attribute) {\n if (!this.hasLocale(locale)) {\n this.dictionary[locale] = {\n messages: {},\n attributes: {}\n };\n }\n\n this.dictionary[locale].attributes[key] = attribute;\n }\n }, {\n key: '_isObject',\n value: function _isObject(object) {\n return object && (typeof object === 'undefined' ? 'undefined' : _typeof(object)) === 'object' && !Array.isArray(object) && object !== null;\n }\n }, {\n key: '_merge',\n value: function _merge(target, source) {\n var _this = this;\n\n if (!(this._isObject(target) && this._isObject(source))) {\n return target;\n }\n\n var assign = Object.assign || this._assign;\n\n Object.keys(source).forEach(function (key) {\n if (_this._isObject(source[key])) {\n if (!target[key]) {\n assign(target, defineProperty({}, key, {}));\n }\n\n _this._merge(target[key], source[key]);\n return;\n }\n\n assign(target, defineProperty({}, key, source[key]));\n });\n\n return target;\n }\n }, {\n key: '_assign',\n value: function _assign(target) {\n var _arguments = arguments;\n\n var output = Object(target);\n\n var _loop = function _loop(index) {\n var source = _arguments[index];\n if (source !== undefined && source !== null) {\n Object.keys(source).forEach(function (key) {\n if ({}.hasOwnProperty.call(source, key)) {\n output[key] = source[key];\n }\n });\n }\n };\n\n for (var index = 1; index < arguments.length; index++) {\n _loop(index);\n }\n\n return output;\n }\n }]);\n return Dictionary;\n}();\n\n/* istanbul ignore next */\n/* eslint-disable max-len */\nvar messages = {\n alpha_dash: function alpha_dash(field) {\n return 'The ' + field + ' may contain alpha-numeric characters as well as dashes and underscores.';\n },\n alpha_num: function alpha_num(field) {\n return 'The ' + field + ' may only contain alpha-numeric characters.';\n },\n alpha: function alpha(field) {\n return 'The ' + field + ' may only contain alphabetic characters.';\n },\n between: function between(field, _ref) {\n var _ref2 = slicedToArray(_ref, 2);\n\n var min = _ref2[0];\n var max = _ref2[1];\n return 'The ' + field + ' must be between ' + min + ' and ' + max + '.';\n },\n confirmed: function confirmed(field, _ref3) {\n var _ref4 = slicedToArray(_ref3, 1);\n\n var confirmedField = _ref4[0];\n return 'The ' + field + ' does not match the ' + confirmedField + '.';\n },\n decimal: function decimal(field) {\n var _ref5 = arguments.length <= 1 || arguments[1] === undefined ? ['*'] : arguments[1];\n\n var _ref6 = slicedToArray(_ref5, 1);\n\n var decimals = _ref6[0];\n return 'The ' + field + ' must be numeric and may contain ' + (decimals === '*' ? '' : decimals) + ' decimal points.';\n },\n digits: function digits(field, _ref7) {\n var _ref8 = slicedToArray(_ref7, 1);\n\n var length = _ref8[0];\n return 'The ' + field + ' must be numeric and exactly contain ' + length + ' digits.';\n },\n dimensions: function dimensions(field, _ref9) {\n var _ref10 = slicedToArray(_ref9, 2);\n\n var width = _ref10[0];\n var height = _ref10[1];\n return 'The ' + field + ' must be ' + width + ' pixels by ' + height + ' pixels.';\n },\n email: function email(field) {\n return 'The ' + field + ' must be a valid email.';\n },\n ext: function ext(field) {\n return 'The ' + field + ' must be a valid file.';\n },\n image: function image(field) {\n return 'The ' + field + ' must be an image.';\n },\n in: function _in(field) {\n return 'The ' + field + ' must be a valid value.';\n },\n ip: function ip(field) {\n return 'The ' + field + ' must be a valid ip address.';\n },\n max: function max(field, _ref11) {\n var _ref12 = slicedToArray(_ref11, 1);\n\n var length = _ref12[0];\n return 'The ' + field + ' may not be greater than ' + length + ' characters.';\n },\n mimes: function mimes(field) {\n return 'The ' + field + ' must have a valid file type.';\n },\n min: function min(field, _ref13) {\n var _ref14 = slicedToArray(_ref13, 1);\n\n var length = _ref14[0];\n return 'The ' + field + ' must be at least ' + length + ' characters.';\n },\n not_in: function not_in(field) {\n return 'The ' + field + ' must be a valid value.';\n },\n numeric: function numeric(field) {\n return 'The ' + field + ' may only contain numeric characters.';\n },\n regex: function regex(field) {\n return 'The ' + field + ' format is invalid.';\n },\n required: function required(field) {\n return 'The ' + field + ' is required.';\n },\n size: function size(field, _ref15) {\n var _ref16 = slicedToArray(_ref15, 1);\n\n var _size = _ref16[0];\n return 'The ' + field + ' must be less than ' + _size + ' KB.';\n },\n url: function url(field) {\n return 'The ' + field + ' is not a valid URL.';\n }\n};\n\n/**\n * Determines the input field scope.\n */\nvar getScope = function getScope(el) {\n return el.dataset.scope || el.form && el.form.dataset.scope;\n};\n\nvar debounce = function debounce(func) {\n var threshold = arguments.length <= 1 || arguments[1] === undefined ? 100 : arguments[1];\n var execAsap = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2];\n\n if (!threshold) {\n return func;\n }\n\n var timeout = void 0;\n\n return function debounced(_ref) {\n var _ref2 = toArray(_ref);\n\n var args = _ref2;\n\n var obj = this;\n\n function delayed() {\n if (!execAsap) {\n func.apply(obj, args);\n }\n timeout = null;\n }\n\n if (timeout) {\n clearTimeout(timeout);\n } else if (execAsap) {\n func.apply.apply(func, [obj].concat(toConsumableArray(args)));\n }\n\n timeout = setTimeout(delayed, threshold || 100);\n };\n};\n\nvar warn = function warn(message) {\n if (!console) {\n return;\n }\n\n console.warn(\"vee-validate: \" + message); // eslint-disable-line\n};\n\nvar after$1 = (function (moment) {\n return function (value, _ref) {\n var _ref2 = slicedToArray(_ref, 2);\n\n var targetField = _ref2[0];\n var format = _ref2[1];\n\n var dateValue = moment(value, format, true);\n var field = document.querySelector(\"input[name='\" + targetField + \"']\");\n\n if (!(dateValue.isValid() && field)) {\n return false;\n }\n\n var other = moment(field.value, format, true);\n\n if (!other.isValid()) {\n return false;\n }\n\n return dateValue.isAfter(other);\n };\n});\n\nvar before$1 = (function (moment) {\n return function (value, _ref) {\n var _ref2 = slicedToArray(_ref, 2);\n\n var targetField = _ref2[0];\n var format = _ref2[1];\n\n var dateValue = moment(value, format, true);\n var field = document.querySelector(\"input[name='\" + targetField + \"']\");\n\n if (!dateValue.isValid() || !field) {\n return false;\n }\n\n var other = moment(field.value, format, true);\n\n if (!other.isValid()) {\n return false;\n }\n\n return dateValue.isBefore(other);\n };\n});\n\nvar date_format$1 = (function (moment) {\n return function (value, _ref) {\n var _ref2 = slicedToArray(_ref, 1);\n\n var format = _ref2[0];\n return moment(value, format, true).isValid();\n };\n});\n\nvar date_between$1 = (function (moment) {\n return function (value, _ref) {\n var _ref2 = slicedToArray(_ref, 3);\n\n var min = _ref2[0];\n var max = _ref2[1];\n var format = _ref2[2];\n\n var minDate = moment(min, format, true);\n var maxDate = moment(max, format, true);\n var dateVal = moment(value, format, true);\n\n if (!(minDate.isValid() && maxDate.isValid() && dateVal.isValid())) {\n return false;\n }\n\n return dateVal.isBetween(minDate, maxDate);\n };\n});\n\n/* istanbul ignore next */\n/* eslint-disable max-len */\nvar messages$1 = {\n after: function after(field, _ref) {\n var _ref2 = slicedToArray(_ref, 1);\n\n var target = _ref2[0];\n return \"The \" + field + \" must be after \" + target + \".\";\n },\n before: function before(field, _ref3) {\n var _ref4 = slicedToArray(_ref3, 1);\n\n var target = _ref4[0];\n return \"The \" + field + \" must be before \" + target + \".\";\n },\n date_between: function date_between(field, _ref5) {\n var _ref6 = slicedToArray(_ref5, 2);\n\n var min = _ref6[0];\n var max = _ref6[1];\n return \"The \" + field + \" must be between \" + min + \" and \" + max + \".\";\n },\n date_format: function date_format(field, _ref7) {\n var _ref8 = slicedToArray(_ref7, 1);\n\n var format = _ref8[0];\n return \"The \" + field + \" must be in the format \" + format + \".\";\n }\n};\n\nvar date = {\n make: function make(moment) {\n return {\n date_format: date_format$1(moment),\n after: after$1(moment),\n before: before$1(moment),\n date_between: date_between$1(moment)\n };\n },\n messages: messages$1,\n installed: false\n};\n\nvar FieldBag = function () {\n function FieldBag($vm) {\n classCallCheck(this, FieldBag);\n\n this.$vm = $vm;\n // Needed to bypass render errors if the fields aren't populated yet.\n this.fields = new Proxy({}, {\n get: function get(target, property) {\n if (!(property in target) && typeof property === 'string') {\n // eslint-disable-next-line\n target[property] = {};\n }\n\n return target[property];\n }\n });\n }\n\n /**\n * Initializes and adds a new field to the bag.\n */\n\n\n createClass(FieldBag, [{\n key: '_add',\n value: function _add(name) {\n this.fields[name] = {};\n this._setFlags(name, { dirty: false, valid: false }, true);\n }\n\n /**\n * Remooves a field from the bag.\n */\n\n }, {\n key: '_remove',\n value: function _remove(name) {\n delete this.fields[name];\n }\n\n /**\n * Sets the flags for a specified field.\n */\n\n }, {\n key: '_setFlags',\n value: function _setFlags(name, flags) {\n var _this = this;\n\n var initial = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2];\n\n Object.keys(flags).forEach(function (flag) {\n return _this._setFlag(name, flag, flags[flag], initial);\n });\n\n /* istanbul ignore if */\n if (this.$vm) {\n this.$vm.fields = Object.assign({}, this.$vm.fields, this.fields);\n }\n }\n\n /**\n * Sets a flag for a specified field.\n */\n\n }, {\n key: '_setFlag',\n value: function _setFlag(name, flag, value) {\n var initial = arguments.length <= 3 || arguments[3] === undefined ? false : arguments[3];\n\n var method = 'set' + flag.charAt(0).toUpperCase() + flag.slice(1);\n if (typeof this[method] !== 'function') {\n return;\n }\n\n this[method](name, value, initial);\n }\n\n /**\n * Updates the dirty flag for a specified field with its dependant flags.\n */\n\n }, {\n key: 'setDirty',\n value: function setDirty(name, value) {\n var initial = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2];\n\n this.fields[name].dirty = value;\n this.fields[name].clean = initial || !value;\n this.fields[name].passed = this.fields[name].valid && value;\n this.fields[name].failed = !this.fields[name].valid && value;\n }\n\n /**\n * Updates the valid flag for a specified field with its dependant flags.\n */\n\n }, {\n key: 'setValid',\n value: function setValid(name, value) {\n this.fields[name].valid = value;\n this.fields[name].passed = this.fields[name].dirty && value;\n this.fields[name].failed = this.fields[name].dirty && !value;\n }\n }]);\n return FieldBag;\n}();\n\nvar EVENT_NAME = 'veeValidate';\nvar DEFAULT_LOCALE = 'en';\nvar STRICT_MODE = true;\n\nvar dictionary = new Dictionary({\n en: {\n messages: messages,\n attributes: {}\n }\n});\n\nvar Validator = function () {\n function Validator(validations, $vm) {\n classCallCheck(this, Validator);\n\n this.locale = DEFAULT_LOCALE;\n this.strictMode = STRICT_MODE;\n this.$fields = {};\n this.fieldBag = new FieldBag($vm);\n this._createFields(validations);\n this.errorBag = new ErrorBag();\n this.$vm = $vm;\n\n // if momentjs is present, install the validators.\n if (typeof moment === 'function') {\n // eslint-disable-next-line\n this.installDateTimeValidators(moment);\n }\n }\n\n /**\n * Sets the default locale for all validators.\n *\n * @param {String} language The locale id.\n */\n\n\n createClass(Validator, [{\n key: 'installDateTimeValidators',\n\n\n /**\n * Just an alias to the static method for convienece.\n */\n value: function installDateTimeValidators(moment) {\n Validator.installDateTimeValidators(moment);\n }\n\n /**\n * Sets the operating mode for this validator.\n * strictMode = true: Values without a rule are invalid and cause failure.\n * strictMode = false: Values without a rule are valid and are skipped.\n * @param {Boolean} strictMode.\n */\n\n }, {\n key: 'setStrictMode',\n value: function setStrictMode() {\n var strictMode = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];\n\n this.strictMode = strictMode;\n }\n\n /**\n * Updates the dicitionary, overwriting existing values and adding new ones.\n *\n * @param {object} data The dictionary object.\n = */\n\n }, {\n key: 'setLocale',\n\n\n /**\n * Sets the validator current langauge.\n *\n * @param {string} language locale or language id.\n */\n value: function setLocale(language) {\n /* istanbul ignore if */\n if (!dictionary.hasLocale(language)) {\n // eslint-disable-next-line\n warn('You are setting the validator locale to a locale that is not defined in the dicitionary. English messages may still be generated.');\n }\n\n this.locale = language;\n }\n\n /**\n * Registers a field to be validated.\n *\n * @param {string} name The field name.\n * @param {string} checks validations expression.\n * @param {string} prettyName Custom name to be used as field name in error messages.\n */\n\n }, {\n key: 'attach',\n value: function attach(name, checks) {\n var prettyName = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\n this.errorBag.remove(name);\n this._createField(name, checks);\n\n if (prettyName) {\n this.$fields[name].name = prettyName;\n }\n }\n\n /**\n * Updates the messages dicitionary, overwriting existing values and adding new ones.\n *\n * @param {object} data The messages object.\n */\n\n }, {\n key: 'updateDictionary',\n value: function updateDictionary(data) {\n Validator.updateDictionary(data);\n }\n\n /**\n * Removes a field from the validator.\n *\n * @param {string} name The name of the field.\n */\n\n }, {\n key: 'detach',\n value: function detach(name) {\n delete this.$fields[name];\n this.fieldBag._remove(name);\n }\n\n /**\n * Adds a custom validator to the list of validation rules.\n *\n * @param {string} name The name of the validator.\n * @param {object|function} validator The validator object/function.\n */\n\n }, {\n key: 'extend',\n value: function extend(name, validator) {\n Validator.extend(name, validator);\n }\n\n /**\n * Validates each value against the corresponding field validations.\n * @param {object} values The values to be validated.\n * @return {boolean|Promise|void} result Returns a boolean or a promise that will\n * resolve to a boolean.\n */\n\n }, {\n key: 'validateAll',\n value: function validateAll(values) {\n var _this = this;\n\n /* istanbul ignore if */\n if (this.$vm && (!values || typeof values === 'string')) {\n this.errorBag.clear(values);\n this.$vm.$emit(EVENT_NAME, values);\n\n return;\n }\n\n var test = true;\n var promises = [];\n this.errorBag.clear();\n Object.keys(values).forEach(function (property) {\n var result = _this.validate(property, values[property]);\n if (typeof result.then === 'function') {\n promises.push(result);\n return;\n }\n\n test = test && result;\n });\n\n if (promises.length) {\n // eslint-disable-next-line\n return Promise.all(promises).then(function (values) {\n return values.every(function (t) {\n return t;\n }) && test;\n });\n }\n\n return test; // eslint-disable-line\n }\n\n /**\n * Validates a value against a registered field validations.\n *\n * @param {string} name the field name.\n * @param {*} value The value to be validated.\n * @return {boolean|Promise} result returns a boolean or a promise that will resolve to\n * a boolean.\n */\n\n }, {\n key: 'validate',\n value: function validate(name, value, scope) {\n var _this2 = this;\n\n if (!this.$fields[name]) {\n if (!this.strictMode) {\n return true;\n }\n warn('Trying to validate a non-existant field: \"' + name + '\". Use \"attach()\" first.');\n\n return false;\n }\n\n this.errorBag.remove(name, scope);\n // if its not required and is empty or null or undefined then it passes.\n if (!this.$fields[name].required && ~[null, undefined, ''].indexOf(value)) {\n return true;\n }\n\n var test = true;\n var promises = [];\n this.$fields[name].validations.forEach(function (rule) {\n var result = _this2._test(name, value, rule, scope);\n if (typeof result.then === 'function') {\n promises.push(result);\n return;\n }\n\n test = test && result;\n });\n\n if (promises.length) {\n return Promise.all(promises).then(function (values) {\n var valid = values.every(function (t) {\n return t;\n }) && test;\n _this2.fieldBag._setFlags(name, { valid: valid, dirty: true });\n\n return valid;\n });\n }\n\n this.fieldBag._setFlags(name, { valid: test, dirty: true });\n\n return test;\n }\n\n /**\n * Creates the fields to be validated.\n *\n * @param {object} validations\n * @return {object} Normalized object.\n */\n\n }, {\n key: '_createFields',\n value: function _createFields(validations) {\n var _this3 = this;\n\n if (!validations) {\n return;\n }\n\n Object.keys(validations).forEach(function (field) {\n _this3._createField(field, validations[field]);\n });\n }\n\n /**\n * Creates a field entry in the fields object.\n * @param {String} name.\n * @param {String} Checks.\n */\n\n }, {\n key: '_createField',\n value: function _createField(name, checks) {\n var _this4 = this;\n\n if (!this.$fields[name]) {\n this.$fields[name] = {};\n }\n\n this.fieldBag._add(name);\n this.$fields[name].validations = [];\n\n if (Array.isArray(checks)) {\n this.$fields[name].validations = checks;\n\n return;\n }\n\n checks.split('|').forEach(function (rule) {\n var normalizedRule = _this4._normalizeRule(rule, _this4.$fields[name].validations);\n if (normalizedRule.name === 'required') {\n _this4.$fields[name].required = true;\n }\n\n _this4.$fields[name].validations.push(normalizedRule);\n });\n }\n\n /**\n * Normalizes a single validation object.\n *\n * @param {string} rule The rule to be normalized.\n * @return {object} rule The normalized rule.\n */\n\n }, {\n key: '_normalizeRule',\n value: function _normalizeRule(rule, validations) {\n var params = [];\n var name = rule.split(':')[0];\n if (~rule.indexOf(':')) {\n params = rule.split(':')[1].split(',');\n }\n\n // Those rules need the date format to parse and compare correctly.\n if (date.installed && ~['after', 'before', 'date_between'].indexOf(name)) {\n var dateFormat = validations.filter(function (v) {\n return v.name === 'date_format';\n })[0];\n if (dateFormat) {\n // pass it as the last param.\n params.push(dateFormat.params[0]);\n }\n }\n\n return { name: name, params: params };\n }\n\n /**\n * Formats an error message for field and a rule.\n *\n * @param {string} field The field name.\n * @param {object} rule Normalized rule object.\n * @return {string} msg Formatted error message.\n */\n\n }, {\n key: '_formatErrorMessage',\n value: function _formatErrorMessage(field, rule) {\n if (!dictionary.hasLocale(this.locale) || typeof dictionary.getMessage(this.locale, rule.name) !== 'function') {\n // Default to english message.\n return dictionary.getMessage('en', rule.name)(field, rule.params);\n }\n\n return dictionary.getMessage(this.locale, rule.name)(field, rule.params);\n }\n\n /**\n * Resolves an appropiate display name, first checking 'data-as' or the registered 'prettyName'\n * Then the dictionary, then fallsback to field name.\n * @return {String} displayName The name to be used in the errors.\n */\n\n }, {\n key: '_getFieldDisplayName',\n value: function _getFieldDisplayName(field) {\n return this.$fields[field].name || dictionary.getAttribute(this.locale, field, field);\n }\n\n /**\n * Tests a single input value against a rule.\n *\n * @param {*} name The name of the field.\n * @param {*} value [description]\n * @param {object} rule the rule object.\n * @return {boolean} Wether if it passes the check.\n */\n\n }, {\n key: '_test',\n value: function _test(name, value, rule, scope) {\n var _this5 = this;\n\n var validator = Rules[rule.name];\n var valid = validator(value, rule.params);\n var displayName = this._getFieldDisplayName(name);\n\n if (typeof valid.then === 'function') {\n return valid.then(function (values) {\n var allValid = Array.isArray(values) ? values.every(function (t) {\n return t.valid;\n }) : values.valid;\n\n if (!allValid) {\n _this5.errorBag.add(name, _this5._formatErrorMessage(displayName, rule), scope);\n }\n\n return allValid;\n });\n }\n\n if (!valid) {\n this.errorBag.add(name, this._formatErrorMessage(displayName, rule), scope);\n }\n\n return valid;\n }\n\n /**\n * Gets the internal errorBag instance.\n *\n * @return {ErrorBag} errorBag The internal error bag object.\n */\n\n }, {\n key: 'getErrors',\n value: function getErrors() {\n return this.errorBag;\n }\n }], [{\n key: 'setDefaultLocale',\n value: function setDefaultLocale() {\n var language = arguments.length <= 0 || arguments[0] === undefined ? 'en' : arguments[0];\n\n /* istanbul ignore if */\n if (!dictionary.hasLocale(language)) {\n // eslint-disable-next-line\n warn('You are setting the validator locale to a locale that is not defined in the dicitionary. English messages may still be generated.');\n }\n\n DEFAULT_LOCALE = language;\n }\n\n /**\n * Sets the operating mode for all newly created validators.\n * strictMode = true: Values without a rule are invalid and cause failure.\n * strictMode = false: Values without a rule are valid and are skipped.\n * @param {Boolean} strictMode.\n */\n\n }, {\n key: 'setStrictMode',\n value: function setStrictMode() {\n var strictMode = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];\n\n STRICT_MODE = strictMode;\n }\n\n /**\n * Installs the datetime validators and the messages.\n */\n\n }, {\n key: 'installDateTimeValidators',\n value: function installDateTimeValidators(moment) {\n if (typeof moment !== 'function') {\n warn('To use the date-time validators you must provide moment reference.');\n\n return false;\n }\n\n if (date.installed) {\n return true;\n }\n\n var validators = date.make(moment);\n Object.keys(validators).forEach(function (name) {\n Validator.extend(name, validators[name]);\n });\n\n Validator.updateDictionary({\n en: {\n messages: date.messages\n }\n });\n date.installed = true;\n\n return true;\n }\n }, {\n key: 'updateDictionary',\n value: function updateDictionary(data) {\n dictionary.merge(data);\n }\n\n /**\n * Static constructor.\n *\n * @param {object} validations The validations object.\n * @return {Validator} validator A validator object.\n */\n\n }, {\n key: 'create',\n value: function create(validations, $vm) {\n return new Validator(validations, $vm);\n }\n\n /**\n * Adds a custom validator to the list of validation rules.\n *\n * @param {string} name The name of the validator.\n * @param {object|function} validator The validator object/function.\n */\n\n }, {\n key: 'extend',\n value: function extend(name, validator) {\n Validator._guardExtend(name, validator);\n Validator._merge(name, validator);\n }\n\n /**\n * Merges a validator object into the Rules and Messages.\n *\n * @param {string} name The name of the validator.\n * @param {function|object} validator The validator object.\n */\n\n }, {\n key: '_merge',\n value: function _merge(name, validator) {\n if (typeof validator === 'function') {\n Rules[name] = validator;\n dictionary.setMessage('en', name, function (field) {\n return 'The ' + field + ' value is not valid.';\n });\n return;\n }\n\n Rules[name] = validator.validate;\n\n if (validator.getMessage && typeof validator.getMessage === 'function') {\n dictionary.setMessage('en', name, validator.getMessage);\n }\n\n if (validator.messages) {\n dictionary.merge(Object.keys(validator.messages).reduce(function (prev, curr) {\n var dict = prev;\n dict[curr] = {\n messages: defineProperty({}, name, validator.messages[curr])\n };\n\n return dict;\n }, {}));\n }\n }\n\n /**\n * Guards from extnsion violations.\n *\n * @param {string} name name of the validation rule.\n * @param {object} validator a validation rule object.\n */\n\n }, {\n key: '_guardExtend',\n value: function _guardExtend(name, validator) {\n if (Rules[name]) {\n throw new _class('Extension Error: There is an existing validator with the same name \\'' + name + '\\'.');\n }\n\n if (typeof validator === 'function') {\n return;\n }\n\n if (typeof validator.validate !== 'function') {\n throw new _class(\n // eslint-disable-next-line\n 'Extension Error: The validator \\'' + name + '\\' must be a function or have a \\'validate\\' method.');\n }\n\n if (typeof validator.getMessage !== 'function' && _typeof(validator.messages) !== 'object') {\n throw new _class(\n // eslint-disable-next-line\n 'Extension Error: The validator \\'' + name + '\\' must have a \\'getMessage\\' method or have a \\'messages\\' object.');\n }\n }\n }]);\n return Validator;\n}();\n\n/**\n * Keeps track of $vm, $validator instances.\n * @type {Array}\n */\nvar instances = [];\n\n/**\n * Finds a validator instance from the instances array.\n * @param {[type]} $vm The Vue instance.\n * @return {object} pair the $vm,$validator pair.\n */\nvar find = function find($vm) {\n for (var i = 0; i < instances.length; i++) {\n if (instances[i].$vm === $vm) {\n return instances[i].$validator;\n }\n }\n\n return undefined;\n};\n\n/**\n * Registers a validator for a $vm instance.\n * @param {*} $vm The Vue instance.\n * @return {Validator} $validator The validator instance.\n */\nvar register = function register($vm) {\n var instance = find($vm);\n if (!instance) {\n instance = Validator.create(undefined, $vm);\n\n instances.push({\n $vm: $vm,\n $validator: instance\n });\n }\n\n return instance;\n};\n\nvar unregister = function unregister($vm) {\n for (var i = 0; i < instances.length; i++) {\n if (instances[i].$vm === $vm) {\n instances.splice(i, 1);\n\n return true;\n }\n }\n\n return false;\n};\n\nvar mixin = (function (options) {\n return {\n data: function data() {\n var _ref;\n\n return _ref = {}, defineProperty(_ref, options.errorBagName, this.$validator.errorBag), defineProperty(_ref, options.fieldsBagName, this.$validator.fieldBag.fields), _ref;\n },\n ready: function ready() {\n var _this = this;\n\n this.$nextTick(function () {\n _this.$emit('validatorReady');\n });\n },\n destroyed: function destroyed() {\n unregister(this);\n }\n };\n});\n\nvar DEFAULT_EVENT_NAME = 'veeValidate';\n\nvar ListenerGenerator = function () {\n function ListenerGenerator(el, binding, context, options) {\n classCallCheck(this, ListenerGenerator);\n\n this.callbacks = [];\n this.el = el;\n this.binding = binding;\n this.vm = context;\n this.options = options;\n this.fieldName = binding.expression || el.name;\n }\n\n /**\n * Determines if the validation rule requires additional listeners on target fields.\n */\n\n\n createClass(ListenerGenerator, [{\n key: '_hasFieldDependency',\n value: function _hasFieldDependency(rules) {\n var results = rules.split('|').filter(function (r) {\n return !!r.match(/confirmed|after|before/);\n });\n if (!results.length) {\n return false;\n }\n\n return results[0].split(':')[1];\n }\n\n /**\n * Validates input value, triggered by 'input' event.\n */\n\n }, {\n key: '_inputListener',\n value: function _inputListener() {\n this.vm.$validator.validate(this.fieldName, this.el.value, getScope(this.el));\n }\n\n /**\n * Validates files, triggered by 'change' event.\n */\n\n }, {\n key: '_fileListener',\n value: function _fileListener() {\n var isValid = this.vm.$validator.validate(this.fieldName, this.el.files, getScope(this.el));\n if (!isValid && this.binding.modifiers.reject) {\n // eslint-disable-next-line\n el.value = '';\n }\n }\n\n /**\n * Validates radio buttons, triggered by 'change' event.\n */\n\n }, {\n key: '_radioListener',\n value: function _radioListener() {\n var checked = document.querySelector('input[name=\"' + this.el.name + '\"]:checked');\n if (!checked) {\n this.vm.$validator.validate(this.fieldName, null, getScope(this.el));\n return;\n }\n\n this.vm.$validator.validate(this.fieldName, checked.value, getScope(this.el));\n }\n\n /**\n * Validates checkboxes, triggered by change event.\n */\n\n }, {\n key: '_checkboxListener',\n value: function _checkboxListener() {\n var _this = this;\n\n var checkedBoxes = document.querySelectorAll('input[name=\"' + this.el.name + '\"]:checked');\n if (!checkedBoxes || !checkedBoxes.length) {\n this.vm.$validator.validate(this.fieldName, null, getScope(this.el));\n return;\n }\n\n [].concat(toConsumableArray(checkedBoxes)).forEach(function (box) {\n _this.vm.$validator.validate(_this.fieldName, box.value, getScope(_this.el));\n });\n }\n\n /**\n * Returns a scoped callback, only runs if the el scope is the same as the recieved scope\n * From the event.\n */\n\n }, {\n key: '_getScopedListener',\n value: function _getScopedListener(callback) {\n var _this2 = this;\n\n return function (scope) {\n if (!scope || scope === getScope(_this2.el) || scope instanceof Event) {\n callback();\n }\n };\n }\n\n /**\n * Attaches validator event-triggered validation.\n */\n\n }, {\n key: '_attachValidatorEvent',\n value: function _attachValidatorEvent() {\n var _this3 = this;\n\n var listener = this._getScopedListener(this._getSuitableListener().listener.bind(this));\n\n this.vm.$on(DEFAULT_EVENT_NAME, listener);\n this.callbacks.push({ event: DEFAULT_EVENT_NAME, listener: listener });\n\n var fieldName = this._hasFieldDependency(this.el.dataset.rules);\n if (fieldName) {\n // Wait for the validator ready triggered when vm is mounted because maybe\n // the element isn't mounted yet.\n this.vm.$once('validatorReady', function () {\n var target = document.querySelector('input[name=\\'' + fieldName + '\\']');\n if (!target) {\n warn('Cannot find target field, no additional listeners were attached.');\n return;\n }\n\n target.addEventListener('input', listener);\n _this3.callbacks.push({ event: 'input', listener: listener, el: target });\n });\n }\n }\n\n /**\n * Determines a suitable listener for the element.\n */\n\n }, {\n key: '_getSuitableListener',\n value: function _getSuitableListener() {\n if (this.el.type === 'file') {\n return {\n name: 'change',\n listener: this._fileListener\n };\n }\n\n if (this.el.type === 'radio') {\n return {\n name: 'change',\n listener: this._radioListener\n };\n }\n\n if (this.el.type === 'checkbox') {\n return {\n name: 'change',\n listener: this._checkboxListener\n };\n }\n\n return {\n name: 'input',\n listener: this._inputListener\n };\n }\n\n /**\n * Attachs a suitable listener for the input.\n */\n\n }, {\n key: '_attachFieldListeners',\n value: function _attachFieldListeners() {\n var _this4 = this;\n\n var handler = this._getSuitableListener();\n var listener = debounce(handler.listener.bind(this), this.el.dataset.delay || this.options.delay);\n\n if (~['radio', 'checkbox'].indexOf(this.el.type)) {\n this.vm.$once('validatorReady', function () {\n [].concat(toConsumableArray(document.querySelectorAll('input[name=\"' + _this4.el.name + '\"]'))).forEach(function (input) {\n input.addEventListener(handler.name, listener);\n _this4.callbacks.push({\n event: handler.name,\n callback: listener,\n el: input\n });\n });\n });\n\n return;\n }\n\n this.el.addEventListener(handler.name, listener);\n this.callbacks.push({ event: handler.name, callback: listener, el: this.el });\n }\n\n /**\n * Attaches the Event Listeners.\n */\n\n }, {\n key: 'attach',\n value: function attach() {\n this.vm.$validator.attach(this.fieldName, this.el.dataset.rules, this.el.dataset.as);\n this._attachValidatorEvent();\n\n if (this.binding.expression) {\n return;\n }\n\n this._attachFieldListeners();\n }\n\n /**\n * Removes all attached event listeners.\n */\n\n }, {\n key: 'detach',\n value: function detach() {\n this.vm.$off(DEFAULT_EVENT_NAME, this.callbacks.filter(function (_ref) {\n var event = _ref.event;\n return event === DEFAULT_EVENT_NAME;\n })[0]);\n\n this.callbacks.filter(function (_ref2) {\n var event = _ref2.event;\n return event !== DEFAULT_EVENT_NAME;\n }).forEach(function (h) {\n h.el.removeEventListener(h.event, h.listener);\n });\n }\n }]);\n return ListenerGenerator;\n}();\n\nvar listenersInstances = [];\n\nvar directive = (function (options) {\n return {\n bind: function bind() {\n var _this = this;\n\n this.vm.$nextTick(function () {\n _this.fieldName = _this.expression || _this.el.name;\n var binding = { expression: _this.expression, modifiers: _this.modifiers };\n var listener = new ListenerGenerator(_this.el, binding, _this.vm, options);\n listener.attach();\n listenersInstances.push({ vm: _this.vm, el: _this.el, instance: listener });\n });\n },\n update: function update(value) {\n var _this2 = this;\n\n if (!this.expression) {\n return;\n }\n\n if (this.modifiers.initial) {\n this.modifiers.initial = false;\n\n return;\n }\n\n // might be not ready yet.\n if (!this.fieldName) {\n this.vm.$nextTick(function () {\n _this2.vm.$validator.validate(_this2.fieldName, value, getScope(_this2.el));\n });\n\n return;\n }\n\n this.vm.$validator.validate(this.fieldName, value, getScope(this.el));\n },\n unbind: function unbind() {\n var _this3 = this;\n\n var holder = listenersInstances.filter(function (l) {\n return l.vm === _this3.vm && l.el === _this3.el;\n })[0];\n holder.instance.detach();\n listenersInstances.splice(listenersInstances.indexOf(holder), 1);\n }\n };\n});\n\n// eslint-disable-next-line\nvar install = function install(Vue) {\n var _ref = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var _ref$locale = _ref.locale;\n var locale = _ref$locale === undefined ? 'en' : _ref$locale;\n var _ref$delay = _ref.delay;\n var delay = _ref$delay === undefined ? 0 : _ref$delay;\n var _ref$errorBagName = _ref.errorBagName;\n var errorBagName = _ref$errorBagName === undefined ? 'errors' : _ref$errorBagName;\n var _ref$dictionary = _ref.dictionary;\n var dictionary = _ref$dictionary === undefined ? null : _ref$dictionary;\n var _ref$strict = _ref.strict;\n var strict = _ref$strict === undefined ? true : _ref$strict;\n var _ref$fieldsBagName = _ref.fieldsBagName;\n var fieldsBagName = _ref$fieldsBagName === undefined ? 'fields' : _ref$fieldsBagName;\n\n if (dictionary) {\n Validator.updateDictionary(dictionary);\n }\n\n Validator.setDefaultLocale(locale);\n Validator.setStrictMode(strict);\n\n var options = {\n locale: locale,\n delay: delay,\n dictionary: dictionary,\n errorBagName: errorBagName,\n fieldsBagName: fieldsBagName\n };\n\n Object.defineProperties(Vue.prototype, {\n $validator: {\n get: function get() {\n return register(this);\n }\n }\n });\n\n Vue.mixin(mixin(options)); // Install Mixin.\n Vue.directive('validate', directive(options)); // Install directive.\n};\n\nvar index = { install: install, Validator: Validator, ErrorBag: ErrorBag };\n\nreturn index;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/vee-validate/dist/vee-validate.js\n// module id = 3\n// module chunks = 0"],"sourceRoot":""} -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-easy-validator", 3 | "description": "Easy form validation plugin", 4 | "author": "Metin Seylan", 5 | "license": "MIT", 6 | "main": "dist/build.js", 7 | "scripts": { 8 | "build": "cross-env NODE_ENV=production webpack --progress --hide-modules" 9 | }, 10 | "devDependencies": { 11 | "babel-cli": "^6.11.4", 12 | "babel-loader": "^6.2.5", 13 | "babel-preset-es2015": "^6.3.13", 14 | "babel-preset-stage-0": "^6.3.13", 15 | "cross-env": "^2.0.0", 16 | "webpack": "^1.13.2" 17 | }, 18 | "dependencies": { 19 | "vee-validate": "^1.0.0-beta.8" 20 | }, 21 | "version": "1.0.0", 22 | "repository": { 23 | "type": "git", 24 | "url": "git+https://github.com/MetinSeylan/Vue-Easy-Validator.git" 25 | }, 26 | "keywords": [ 27 | "vuejs", 28 | "form", 29 | "validator", 30 | "validate", 31 | "comolokko" 32 | ], 33 | "bugs": { 34 | "url": "https://github.com/MetinSeylan/Vue-Easy-Validator/issues" 35 | }, 36 | "homepage": "https://github.com/MetinSeylan/Vue-Easy-Validator#readme" 37 | } 38 | -------------------------------------------------------------------------------- /src/Mixin.js: -------------------------------------------------------------------------------- 1 | import Vee from 'vee-validate' 2 | import Validator from './Validator' 3 | 4 | export default { 5 | install(Vue){ 6 | 7 | Vue.use(Vee) 8 | 9 | Vue.mixin({ 10 | beforeCreate(){ 11 | let _this = this; 12 | this.$form = (form) => { 13 | return (new Validator(form, _this.$validator)) 14 | } 15 | } 16 | }) 17 | } 18 | } -------------------------------------------------------------------------------- /src/Validator.js: -------------------------------------------------------------------------------- 1 | export default class { 2 | 3 | constructor(form, Validator){ 4 | 5 | this._rules = {} 6 | this._fields = {} 7 | 8 | this.$validator = Validator; 9 | 10 | this.$errors = this.$validator.errorBag 11 | 12 | this.$rules = new Proxy(this._rules, this.watcher()); 13 | this.$fields = new Proxy(this._fields, this.watcher()); 14 | 15 | Object.keys(form).forEach((key) => { 16 | this.$rules[key] = form[key].rule; 17 | this.$fields[key] = form[key].value; 18 | }) 19 | 20 | this.$errors.clear(); 21 | } 22 | 23 | watcher(){ 24 | 25 | let _this = this; 26 | 27 | return { 28 | get(target, name){ 29 | return target[name] 30 | }, 31 | set(target, name, val){ 32 | if(val){ 33 | if(target == _this._rules) _this.$validator.attach(name, val); 34 | target[name] = val; 35 | }else{ 36 | if(target == _this._rules) _this.$validator.detach(name) 37 | delete target[name] 38 | } 39 | 40 | _this.$validator.validate(name, _this.$fields[name]); 41 | 42 | return true; 43 | } 44 | } 45 | } 46 | 47 | } -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var webpack = require('webpack'); 3 | module.exports = { 4 | entry: ['./src/Mixin.js'], 5 | output: { 6 | path: path.resolve(__dirname, './dist'), 7 | filename: 'build.js', 8 | library: ['VueEasyValidator'], 9 | libraryTarget: 'umd' 10 | }, 11 | resolveLoader: { 12 | root: path.join(__dirname, 'node_modules'), 13 | }, 14 | module: { 15 | loaders: [ 16 | { 17 | test: /\.js$/, 18 | loader: 'babel', 19 | exclude: /node_modules/, 20 | query: { 21 | presets: ['es2015'] 22 | } 23 | }, 24 | { 25 | test: /\.json$/, 26 | loader: 'json' 27 | } 28 | ] 29 | }, 30 | devtool: 'eval-source-map' 31 | } 32 | 33 | 34 | 35 | 36 | if (process.env.NODE_ENV === 'production') { 37 | module.exports.devtool = 'source-map' 38 | 39 | module.exports.plugins = (module.exports.plugins || []).concat([ 40 | new webpack.DefinePlugin({ 41 | 'process.env': { 42 | NODE_ENV: '"production"' 43 | } 44 | }), 45 | new webpack.optimize.UglifyJsPlugin({ 46 | compress: { 47 | warnings: false 48 | } 49 | }), 50 | new webpack.optimize.OccurenceOrderPlugin() 51 | ]) 52 | } 53 | 54 | --------------------------------------------------------------------------------