/*! * vue-validator v2.1.7 * (c) 2016 kazuya kawaguchi * Released under the MIT License. */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global.VueValidator = factory()); }(this, function () { 'use strict'; var babelHelpers = {}; babelHelpers.typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; babelHelpers.classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; babelHelpers.createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); babelHelpers.inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }; babelHelpers.possibleConstructorReturn = function (self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }; babelHelpers; /** * Utilties */ // export default for holding the Vue reference var exports$1 = {}; /** * warn * * @param {String} msg * @param {Error} [err] * */ function warn(msg, err) { if (window.console) { console.warn('[vue-validator] ' + msg); if (err) { console.warn(err.stack); } } } /** * empty * * @param {Array|Object} target * @return {Boolean} */ function empty(target) { if (target === null || target === undefined) { return true; } if (Array.isArray(target)) { if (target.length > 0) { return false; } if (target.length === 0) { return true; } } else if (exports$1.Vue.util.isPlainObject(target)) { for (var key in target) { if (exports$1.Vue.util.hasOwn(target, key)) { return false; } } } return true; } /** * each * * @param {Array|Object} target * @param {Function} iterator * @param {Object} [context] */ function each(target, iterator, context) { if (Array.isArray(target)) { for (var i = 0; i < target.length; i++) { iterator.call(context || target[i], target[i], i); } } else if (exports$1.Vue.util.isPlainObject(target)) { var hasOwn = exports$1.Vue.util.hasOwn; for (var key in target) { if (hasOwn(target, key)) { iterator.call(context || target[key], target[key], key); } } } } /** * pull * * @param {Array} arr * @param {Object} item * @return {Object|null} */ function pull(arr, item) { var index = exports$1.Vue.util.indexOf(arr, item); return ~index ? arr.splice(index, 1) : null; } /** * trigger * * @param {Element} el * @param {String} event * @param {Object} [args] */ function trigger(el, event, args) { var e = document.createEvent('HTMLEvents'); e.initEvent(event, true, false); if (args) { for (var prop in args) { e[prop] = args[prop]; } } // Due to Firefox bug, events fired on disabled // non-attached form controls can throw errors try { el.dispatchEvent(e); } catch (e) {} } /** * Forgiving check for a promise * * @param {Object} p * @return {Boolean} */ function isPromise(p) { return p && typeof p.then === 'function'; } /** * Togging classes * * @param {Element} el * @param {String} key * @param {Function} fn */ function toggleClasses(el, key, fn) { key = key.trim(); if (key.indexOf(' ') === -1) { fn(el, key); return; } var keys = key.split(/\s+/); for (var i = 0, l = keys.length; i < l; i++) { fn(el, keys[i]); } } /** * Fundamental validate functions */ /** * required * * This function validate whether the value has been filled out. * * @param {*} val * @return {Boolean} */ function required(val) { if (Array.isArray(val)) { if (val.length !== 0) { var valid = true; for (var i = 0, l = val.length; i < l; i++) { valid = required(val[i]); if (!valid) { break; } } return valid; } else { return false; } } else if (typeof val === 'number' || typeof val === 'function') { return true; } else if (typeof val === 'boolean') { return val; } else if (typeof val === 'string') { return val.length > 0; } else if (val !== null && (typeof val === 'undefined' ? 'undefined' : babelHelpers.typeof(val)) === 'object') { return Object.keys(val).length > 0; } else if (val === null || val === undefined) { return false; } } /** * pattern * * This function validate whether the value matches the regex pattern * * @param val * @param {String} pat * @return {Boolean} */ function pattern(val, pat) { if (typeof pat !== 'string') { return false; } var match = pat.match(new RegExp('^/(.*?)/([gimy]*)$')); if (!match) { return false; } return new RegExp(match[1], match[2]).test(val); } /** * minlength * * This function validate whether the minimum length. * * @param {String|Array} val * @param {String|Number} min * @return {Boolean} */ function minlength(val, min) { if (typeof val === 'string') { return isInteger(min, 10) && val.length >= parseInt(min, 10); } else if (Array.isArray(val)) { return val.length >= parseInt(min, 10); } else { return false; } } /** * maxlength * * This function validate whether the maximum length. * * @param {String|Array} val * @param {String|Number} max * @return {Boolean} */ function maxlength(val, max) { if (typeof val === 'string') { return isInteger(max, 10) && val.length <= parseInt(max, 10); } else if (Array.isArray(val)) { return val.length <= parseInt(max, 10); } else { return false; } } /** * min * * This function validate whether the minimum value of the numberable value. * * @param {*} val * @param {*} arg minimum * @return {Boolean} */ function min(val, arg) { return !isNaN(+val) && !isNaN(+arg) && +val >= +arg; } /** * max * * This function validate whether the maximum value of the numberable value. * * @param {*} val * @param {*} arg maximum * @return {Boolean} */ function max(val, arg) { return !isNaN(+val) && !isNaN(+arg) && +val <= +arg; } /** * isInteger * * This function check whether the value of the string is integer. * * @param {String} val * @return {Boolean} * @private */ function isInteger(val) { return (/^(-?[1-9]\d*|0)$/.test(val) ); } var validators = Object.freeze({ required: required, pattern: pattern, minlength: minlength, maxlength: maxlength, min: min, max: max }); function Asset (Vue) { var extend = Vue.util.extend; // set global validators asset var assets = Object.create(null); extend(assets, validators); Vue.options.validators = assets; // set option merge strategy var strats = Vue.config.optionMergeStrategies; if (strats) { strats.validators = function (parent, child) { if (!child) { return parent; } if (!parent) { return child; } var ret = Object.create(null); extend(ret, parent); for (var key in child) { ret[key] = child[key]; } return ret; }; } /** * Register or retrieve a global validator definition. * * @param {String} id * @param {Function} definition */ Vue.validator = function (id, definition) { if (!definition) { return Vue.options['validators'][id]; } else { Vue.options['validators'][id] = definition; } }; } function Override (Vue) { // override _init var init = Vue.prototype._init; Vue.prototype._init = function (options) { if (!this._validatorMaps) { this._validatorMaps = Object.create(null); } init.call(this, options); }; // override _destroy var destroy = Vue.prototype._destroy; Vue.prototype._destroy = function () { destroy.apply(this, arguments); this._validatorMaps = null; }; } var VALIDATE_UPDATE = '__vue-validator-validate-update__'; var PRIORITY_VALIDATE = 4096; var PRIORITY_VALIDATE_CLASS = 32; var REGEX_FILTER = /[^|]\|[^|]/; var REGEX_VALIDATE_DIRECTIVE = /^v-validate(?:$|:(.*)$)/; var REGEX_EVENT = /^v-on:|^@/; var classId = 0; // ID for validation class function ValidateClass (Vue) { var vIf = Vue.directive('if'); var FragmentFactory = Vue.FragmentFactory; var _Vue$util = Vue.util; var toArray = _Vue$util.toArray; var replace = _Vue$util.replace; var createAnchor = _Vue$util.createAnchor; /** * `v-validate-class` directive */ Vue.directive('validate-class', { terminal: true, priority: vIf.priority + PRIORITY_VALIDATE_CLASS, bind: function bind() { var _this = this; var id = String(classId++); this.setClassIds(this.el, id); this.vm.$on(VALIDATE_UPDATE, this.cb = function (classIds, validation, results) { if (classIds.indexOf(id) > -1) { validation.updateClasses(results, _this.frag.node); } }); this.setupFragment(); }, unbind: function unbind() { this.vm.$off(VALIDATE_UPDATE, this.cb); this.teardownFragment(); }, setClassIds: function setClassIds(el, id) { var childNodes = toArray(el.childNodes); for (var i = 0, l = childNodes.length; i < l; i++) { var element = childNodes[i]; if (element.nodeType === 1) { var hasAttrs = element.hasAttributes(); var attrs = hasAttrs && toArray(element.attributes); for (var k = 0, _l = attrs.length; k < _l; k++) { var attr = attrs[k]; if (attr.name.match(REGEX_VALIDATE_DIRECTIVE)) { var existingId = element.getAttribute(VALIDATE_UPDATE); var value = existingId ? existingId + ',' + id : id; element.setAttribute(VALIDATE_UPDATE, value); } } } if (element.hasChildNodes()) { this.setClassIds(element, id); } } }, setupFragment: function setupFragment() { this.anchor = createAnchor('v-validate-class'); replace(this.el, this.anchor); this.factory = new FragmentFactory(this.vm, this.el); this.frag = this.factory.create(this._host, this._scope, this._frag); this.frag.before(this.anchor); }, teardownFragment: function teardownFragment() { if (this.frag) { this.frag.remove(); this.frag = null; this.factory = null; } replace(this.anchor, this.el); this.anchor = null; } }); } function Validate (Vue) { var FragmentFactory = Vue.FragmentFactory; var parseDirective = Vue.parsers.directive.parseDirective; var _Vue$util = Vue.util; var inBrowser = _Vue$util.inBrowser; var bind = _Vue$util.bind; var on = _Vue$util.on; var off = _Vue$util.off; var createAnchor = _Vue$util.createAnchor; var replace = _Vue$util.replace; var camelize = _Vue$util.camelize; var isPlainObject = _Vue$util.isPlainObject; // Test for IE10/11 textarea placeholder clone bug function checkTextareaCloneBug() { if (inBrowser) { var t = document.createElement('textarea'); t.placeholder = 't'; return t.cloneNode(true).value === 't'; } else { return false; } } var hasTextareaCloneBug = checkTextareaCloneBug(); /** * `v-validate` directive */ Vue.directive('validate', { deep: true, terminal: true, priority: PRIORITY_VALIDATE, params: ['group', 'field', 'detect-blur', 'detect-change', 'initial', 'classes'], paramWatchers: { detectBlur: function detectBlur(val, old) { if (this._invalid) { return; } this.validation.detectBlur = this.isDetectBlur(val); this.validator.validate(this.field); }, detectChange: function detectChange(val, old) { if (this._invalid) { return; } this.validation.detectChange = this.isDetectChange(val); this.validator.validate(this.field); } }, bind: function bind() { var el = this.el; if ('development' !== 'production' && el.__vue__) { warn('v-validate="' + this.expression + '" cannot be used on an instance root element.'); this._invalid = true; return; } if ('development' !== 'production' && (el.hasAttribute('v-if') || el.hasAttribute('v-for'))) { warn('v-validate cannot be used `v-if` or `v-for` build-in terminal directive ' + 'on an element. these is wrapped with `