diff --git a/dist/formulario.esm.js b/dist/formulario.esm.js index 7c0e77e..d5304b8 100644 --- a/dist/formulario.esm.js +++ b/dist/formulario.esm.js @@ -1,49 +1,7 @@ -import isPlainObject from 'is-plain-object'; import isUrl from 'is-url'; import Vue from 'vue'; import { Inject, Model, Prop, Watch, Component, Provide } from 'vue-property-decorator'; -/** - * Shorthand for Object.prototype.hasOwnProperty.call (space saving) - */ -function has(ctx, prop) { - return Object.prototype.hasOwnProperty.call(ctx, prop); -} - -/** - * Create a new object by copying properties of base and mergeWith. - * Note: arrays don't overwrite - they push - * - * @param {Object} a - * @param {Object} b - * @param {boolean} concatArrays - */ -function merge(a, b, concatArrays = true) { - const merged = {}; - for (const key in a) { - if (has(b, key)) { - if (isPlainObject(b[key]) && isPlainObject(a[key])) { - merged[key] = merge(a[key], b[key], concatArrays); - } - else if (concatArrays && Array.isArray(a[key]) && Array.isArray(b[key])) { - merged[key] = a[key].concat(b[key]); - } - else { - merged[key] = b[key]; - } - } - else { - merged[key] = a[key]; - } - } - for (const prop in b) { - if (!has(merged, prop)) { - merged[prop] = b[prop]; - } - } - return merged; -} - const registry = new Map(); var id = (prefix) => { const current = registry.get(prefix) || 0; @@ -106,7 +64,7 @@ function typeOf(value) { } return 'InstanceOf<' + constructorOf(value).name + '>'; } - throw new Error(); + throw new Error('[Formulario] typeOf - unknown type detected'); } function isScalar(value) { switch (typeof value) { @@ -147,6 +105,13 @@ function clone(value) { return Object.keys(source).reduce((copy, key) => (Object.assign(Object.assign({}, copy), { [key]: clone(source[key]) })), {}); } +/** + * Shorthand for Object.prototype.hasOwnProperty.call (space saving) + */ +function has(ctx, prop) { + return Object.prototype.hasOwnProperty.call(ctx, prop); +} + /*! ***************************************************************************** Copyright (c) Microsoft Corporation. @@ -663,14 +628,11 @@ const messages = { } }; -/** - * The base formulario library. - */ class Formulario { constructor(options) { this.validationRules = {}; this.validationMessages = {}; - this.registry = new Map(); + this._registry = new Map(); this.validationRules = rules; this.validationMessages = messages; this.extend(options || {}); @@ -680,24 +642,24 @@ class Formulario { */ extend(extendWith) { if (typeof extendWith === 'object') { - this.validationRules = merge(this.validationRules, extendWith.validationRules || {}); - this.validationMessages = merge(this.validationMessages, extendWith.validationMessages || {}); + this.validationRules = Object.assign(Object.assign({}, this.validationRules), (extendWith.validationRules || {})); + this.validationMessages = Object.assign(Object.assign({}, this.validationMessages), (extendWith.validationMessages || {})); return this; } throw new Error(`[Formulario]: Formulario.extend(): should be passed an object (was ${typeof extendWith})`); } runValidation(id) { - if (!this.registry.has(id)) { + if (!this._registry.has(id)) { throw new Error(`[Formulario]: Formulario.runValidation(): no forms with id "${id}"`); } - const form = this.registry.get(id); + const form = this._registry.get(id); return form.runValidation(); } resetValidation(id) { - if (!this.registry.has(id)) { + if (!this._registry.has(id)) { return; } - const form = this.registry.get(id); + const form = this._registry.get(id); form.resetValidation(); } /** @@ -705,18 +667,18 @@ class Formulario { * @internal */ register(id, form) { - if (this.registry.has(id)) { + if (this._registry.has(id)) { throw new Error(`[Formulario]: Formulario.register(): id "${id}" is already in use`); } - this.registry.set(id, form); + this._registry.set(id, form); } /** * Used by forms instances to remove themselves from a registry * @internal */ unregister(id) { - if (this.registry.has(id)) { - this.registry.delete(id); + if (this._registry.has(id)) { + this._registry.delete(id); } } /** @@ -724,18 +686,19 @@ class Formulario { * @internal */ getRules(extendWith = {}) { - return merge(this.validationRules, extendWith); + return Object.assign(Object.assign({}, this.validationRules), extendWith); } /** * Get validation messages by merging any passed in with global messages. * @internal */ getMessages(vm, extendWith) { - const raw = merge(this.validationMessages || {}, extendWith); + const raw = Object.assign(Object.assign({}, this.validationMessages), extendWith); const messages = {}; for (const name in raw) { messages[name] = (context, ...args) => { - return typeof raw[name] === 'string' ? raw[name] : raw[name](vm, context, ...args); + const fn = raw[name]; + return typeof fn === 'string' ? fn : fn(vm, context, ...args); }; } return messages; @@ -886,16 +849,6 @@ function validate(validators, context) { }); } -const UNREGISTER_BEHAVIOR = { - NONE: 'none', - UNSET: 'unset', -}; - -const VALIDATION_BEHAVIOR = { - DEMAND: 'demand', - LIVE: 'live', - SUBMIT: 'submit', -}; let FormularioField = class FormularioField extends Vue { constructor() { super(...arguments); @@ -907,9 +860,7 @@ let FormularioField = class FormularioField extends Vue { get fullPath() { return this.__Formulario_path !== '' ? `${this.__Formulario_path}.${this.name}` : this.name; } - /** - * Determines if this formulario element is v-modeled or not. - */ + /** Determines if this formulario element is v-modeled or not. */ get hasModel() { return has(this.$options.propsData || {}, 'value'); } @@ -924,55 +875,77 @@ let FormularioField = class FormularioField extends Vue { }, 'model', { get: () => this.modelGetConverter(this.proxy), set: (value) => { - this.syncProxy(this.modelSetConverter(value, this.proxy)); + this._syncProxy(this.modelSetConverter(value, this.proxy)); }, }); } - get normalizedValidationRules() { + get _normalizedValidationRules() { const rules = {}; Object.keys(this.validationRules).forEach(key => { rules[snakeToCamel(key)] = this.validationRules[key]; }); return rules; } - get normalizedValidationMessages() { + get _normalizedValidationMessages() { const messages = {}; Object.keys(this.validationMessages).forEach(key => { messages[snakeToCamel(key)] = this.validationMessages[key]; }); return messages; } - onValueChange() { - this.syncProxy(this.value); + _onValueChange() { + this._syncProxy(this.value); } - onProxyChange() { - if (this.validationBehavior === VALIDATION_BEHAVIOR.LIVE) { + _onProxyChange() { + if (this.validationBehavior === 'live') { this.runValidation(); } else { this.resetValidation(); } } - /** - * @internal - */ + /** @internal */ created() { if (typeof this.__FormularioForm_register === 'function') { this.__FormularioForm_register(this.fullPath, this); } - if (this.validationBehavior === VALIDATION_BEHAVIOR.LIVE) { + if (this.validationBehavior === 'live') { this.runValidation(); } } - /** - * @internal - */ + /** @internal */ beforeDestroy() { if (typeof this.__FormularioForm_unregister === 'function') { this.__FormularioForm_unregister(this.fullPath, this.unregisterBehavior); } } - syncProxy(value) { + runValidation() { + this.validationRun = this._validate().then(violations => { + this.violations = violations; + this._emitValidation(this.fullPath, violations); + return this.violations; + }); + return this.validationRun; + } + hasValidationErrors() { + return new Promise(resolve => { + this.$nextTick(() => { + this.validationRun.then(() => resolve(this.violations.length > 0)); + }); + }); + } + /** @internal */ + setErrors(errors) { + if (!this.errorsDisabled) { + this.localErrors = errors; + } + } + /** @internal */ + resetValidation() { + this.localErrors = []; + this.violations = []; + } + _syncProxy(value) { if (!deepEquals(value, this.proxy)) { this.proxy = value; this.$emit('input', value); @@ -982,49 +955,19 @@ let FormularioField = class FormularioField extends Vue { } } } - runValidation() { - this.validationRun = this.validate().then(violations => { - this.violations = violations; - this.emitValidation(this.fullPath, violations); - return this.violations; - }); - return this.validationRun; - } - validate() { - return validate(processConstraints(this.validation, this.$formulario.getRules(this.normalizedValidationRules), this.$formulario.getMessages(this, this.normalizedValidationMessages)), { + _validate() { + return validate(processConstraints(this.validation, this.$formulario.getRules(this._normalizedValidationRules), this.$formulario.getMessages(this, this._normalizedValidationMessages)), { value: this.proxy, name: this.fullPath, formValues: this.__FormularioForm_getState(), }); } - emitValidation(path, violations) { + _emitValidation(path, violations) { this.$emit('validation', { path, violations }); if (typeof this.__FormularioForm_emitValidation === 'function') { this.__FormularioForm_emitValidation(path, violations); } } - hasValidationErrors() { - return new Promise(resolve => { - this.$nextTick(() => { - this.validationRun.then(() => resolve(this.violations.length > 0)); - }); - }); - } - /** - * @internal - */ - setErrors(errors) { - if (!this.errorsDisabled) { - this.localErrors = errors; - } - } - /** - * @internal - */ - resetValidation() { - this.localErrors = []; - this.violations = []; - } }; __decorate([ Inject({ default: '' }) @@ -1067,8 +1010,8 @@ __decorate([ ], FormularioField.prototype, "validationMessages", void 0); __decorate([ Prop({ - default: VALIDATION_BEHAVIOR.DEMAND, - validator: behavior => Object.values(VALIDATION_BEHAVIOR).includes(behavior) + default: 'demand', + validator: (behavior) => ['demand', 'live', 'submit'].includes(behavior) }) ], FormularioField.prototype, "validationBehavior", void 0); __decorate([ @@ -1084,14 +1027,14 @@ __decorate([ Prop({ default: 'div' }) ], FormularioField.prototype, "tag", void 0); __decorate([ - Prop({ default: UNREGISTER_BEHAVIOR.NONE }) + Prop({ default: 'none' }) ], FormularioField.prototype, "unregisterBehavior", void 0); __decorate([ Watch('value') -], FormularioField.prototype, "onValueChange", null); +], FormularioField.prototype, "_onValueChange", null); __decorate([ Watch('proxy') -], FormularioField.prototype, "onProxyChange", null); +], FormularioField.prototype, "_onProxyChange", null); FormularioField = __decorate([ Component({ name: 'FormularioField', inheritAttrs: false }) ], FormularioField); @@ -1303,7 +1246,7 @@ let FormularioForm = class FormularioForm extends Vue { this.localFormErrors = []; } get fieldsErrorsComputed() { - return merge(this.fieldsErrors || {}, this.localFieldsErrors); + return Object.assign(Object.assign({}, this.fieldsErrors), this.localFieldsErrors); } get formErrorsComputed() { return [...this.formErrors, ...this.localFormErrors]; @@ -1333,7 +1276,7 @@ let FormularioForm = class FormularioForm extends Vue { unregister(path, behavior) { if (this.registry.has(path)) { this.registry.delete(path); - if (behavior === UNREGISTER_BEHAVIOR.UNSET) { + if (behavior === 'unset') { this.proxy = unset(this.proxy, path); this.emitInput(); } @@ -1397,13 +1340,13 @@ let FormularioForm = class FormularioForm extends Vue { return Object.keys(violations).some(path => violations[path].length > 0); }); } - setErrors({ fieldsErrors, formErrors }) { - this.localFieldsErrors = fieldsErrors || {}; + setErrors({ formErrors, fieldsErrors }) { this.localFormErrors = formErrors || []; + this.localFieldsErrors = fieldsErrors || {}; } resetValidation() { - this.localFieldsErrors = {}; this.localFormErrors = []; + this.localFieldsErrors = {}; this.registry.forEach((field) => { field.resetValidation(); }); @@ -1521,10 +1464,6 @@ var index = { Vue.component('FormularioField', __vue_component__); Vue.component('FormularioFieldGroup', __vue_component__$1); Vue.component('FormularioForm', __vue_component__$2); - // @deprecated Use FormularioField instead - Vue.component('FormularioInput', __vue_component__); - // @deprecated Use FormularioFieldGroup instead - Vue.component('FormularioGrouping', __vue_component__$1); Vue.mixin({ beforeCreate() { const o = this.$options; @@ -1543,3 +1482,4 @@ var index = { }; export default index; +export { Formulario, __vue_component__ as FormularioField, __vue_component__$1 as FormularioFieldGroup, __vue_component__$2 as FormularioForm }; diff --git a/dist/formulario.min.js b/dist/formulario.min.js index 2dec8c8..5b79aaa 100644 --- a/dist/formulario.min.js +++ b/dist/formulario.min.js @@ -1,18 +1,4 @@ -var VueFormulario=function(t){"use strict"; -/*! - * is-plain-object - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - */ -function e(t){return!0==(null!=(e=t)&&"object"==typeof e&&!1===Array.isArray(e))&&"[object Object]"===Object.prototype.toString.call(t); -/*! - * isobject - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - */ -var e}function r(t){var r,o;return!1!==e(t)&&("function"==typeof(r=t.constructor)&&(!1!==e(o=r.prototype)&&!1!==o.hasOwnProperty("isPrototypeOf")))}function o(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function n(t,e,i=!0){const a={};for(const s in t)o(e,s)?r(e[s])&&r(t[s])?a[s]=n(t[s],e[s],i):i&&Array.isArray(t[s])&&Array.isArray(e[s])?a[s]=t[s].concat(e[s]):a[s]=e[s]:a[s]=t[s];for(const t in e)o(a,t)||(a[t]=e[t]);return a}t=t&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t;var i=function(t){if("string"!=typeof t)return!1;var e=t.match(a);if(!e)return!1;var r=e[1];if(!r)return!1;if(s.test(r)||l.test(r))return!0;return!1},a=/^(?:\w+:)?\/\/(\S+)$/,s=/^localhost[\:?\d]*(?:[^\:?\d]\S*)?$/,l=/^[^\s\.]+\.\S{2,}$/;const u=new Map;var c;!function(t){t.ARRAY="ARRAY",t.BIGINT="BIGINT",t.BOOLEAN="BOOLEAN",t.DATE="DATE",t.FUNCTION="FUNCTION",t.NUMBER="NUMBER",t.RECORD="RECORD",t.STRING="STRING",t.SYMBOL="SYMBOL",t.UNDEFINED="UNDEFINED",t.NULL="NULL"}(c||(c={}));const f=t=>Object.getPrototypeOf(t).constructor;function d(t){return f(t)===Object&&0===Object.keys(Object.getPrototypeOf(t)).length}function p(t){return"object"==typeof t&&null!==t&&(d(t)||Array.isArray(t))}function h(t){switch(typeof t){case"bigint":return c.BIGINT;case"boolean":return c.BOOLEAN;case"function":return c.FUNCTION;case"number":return c.NUMBER;case"string":return c.STRING;case"symbol":return c.SYMBOL;case"undefined":return c.UNDEFINED;case"object":return null===t?c.NULL:t instanceof Date?c.DATE:Array.isArray(t)?c.ARRAY:d(t)?c.RECORD:"InstanceOf<"+f(t).name+">"}throw new Error}function m(t){switch(typeof t){case"bigint":case"boolean":case"number":case"string":case"symbol":case"undefined":return!0;default:return null===t}}function y(t){if(m(t)||t instanceof Blob)return t;if(t instanceof Date)return new Date(t);if(!p(t))return e=t,Object.assign(Object.create(Object.getPrototypeOf(e)),e);var e;if(Array.isArray(t))return t.slice().map(y);const r=t;return Object.keys(r).reduce(((t,e)=>Object.assign(Object.assign({},t),{[e]:y(r[e])})),{})} +var VueFormulario=function(t,e){"use strict";e=e&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e;var r=function(t){if("string"!=typeof t)return!1;var e=t.match(o);if(!e)return!1;var r=e[1];if(!r)return!1;if(i.test(r)||n.test(r))return!0;return!1},o=/^(?:\w+:)?\/\/(\S+)$/,i=/^localhost[\:?\d]*(?:[^\:?\d]\S*)?$/,n=/^[^\s\.]+\.\S{2,}$/;const a=new Map;var s;!function(t){t.ARRAY="ARRAY",t.BIGINT="BIGINT",t.BOOLEAN="BOOLEAN",t.DATE="DATE",t.FUNCTION="FUNCTION",t.NUMBER="NUMBER",t.RECORD="RECORD",t.STRING="STRING",t.SYMBOL="SYMBOL",t.UNDEFINED="UNDEFINED",t.NULL="NULL"}(s||(s={}));const l=t=>Object.getPrototypeOf(t).constructor;function u(t){return l(t)===Object&&0===Object.keys(Object.getPrototypeOf(t)).length}function c(t){return"object"==typeof t&&null!==t&&(u(t)||Array.isArray(t))}function f(t){switch(typeof t){case"bigint":return s.BIGINT;case"boolean":return s.BOOLEAN;case"function":return s.FUNCTION;case"number":return s.NUMBER;case"string":return s.STRING;case"symbol":return s.SYMBOL;case"undefined":return s.UNDEFINED;case"object":return null===t?s.NULL:t instanceof Date?s.DATE:Array.isArray(t)?s.ARRAY:u(t)?s.RECORD:"InstanceOf<"+l(t).name+">"}throw new Error("[Formulario] typeOf - unknown type detected")}function d(t){switch(typeof t){case"bigint":case"boolean":case"number":case"string":case"symbol":case"undefined":return!0;default:return null===t}}function p(t){if(d(t)||t instanceof Blob)return t;if(t instanceof Date)return new Date(t);if(!c(t))return e=t,Object.assign(Object.create(Object.getPrototypeOf(e)),e);var e;if(Array.isArray(t))return t.slice().map(p);const r=t;return Object.keys(r).reduce(((t,e)=>Object.assign(Object.assign({},t),{[e]:p(r[e])})),{})}function h(t,e){return Object.prototype.hasOwnProperty.call(t,e)} /*! ***************************************************************************** Copyright (c) Microsoft Corporation. @@ -26,9 +12,9 @@ var e}function r(t){var r,o;return!1!==e(t)&&("function"==typeof(r=t.constructor LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */function v(t,e,r,o){var n,i=arguments.length,a=i<3?e:null===o?o=Object.getOwnPropertyDescriptor(e,r):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(t,e,r,o);else for(var s=t.length-1;s>=0;s--)(n=t[s])&&(a=(i<3?n(a):i>3?n(e,r,a):n(e,r))||a);return i>3&&a&&Object.defineProperty(e,r,a),a}const g=t=>{const e=parseInt(t);return e.toString()===t?e:NaN},_=t=>{const e=[];return t.split(".").forEach((t=>{/(.*)\[(\d+)]$/.test(t)?e.push(...t.substr(0,t.length-1).split("[").filter((t=>t.length))):e.push(t)})),e};function b(t,e,r){const n="string"==typeof e?_(e):e;if(m(t)||0===n.length)return r;const i=n.shift(),a=g(i);if(!isNaN(a))return Array.isArray(t)&&a>=0&&a{const r=t,o=e;r[o];return function(t,e){var r={};for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&e.indexOf(o)<0&&(r[o]=t[o]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(o=Object.getOwnPropertySymbols(t);n=0&&i0!==t.indexOf(e)&&"_"!==t[t.indexOf(e)-1]?e.toUpperCase().replace("_",""):e))}const A={accepted:({value:t})=>["yes","on","1",1,!0,"true"].includes(t),after({value:t},e=!1){const r=!1!==e?Date.parse(e):Date.now(),o=t instanceof Date?t.getTime():Date.parse(t);return!isNaN(o)&&o>r},alpha({value:t},e="default"){const r={default:/^[a-zA-ZÀ-ÖØ-öø-ÿ]+$/,latin:/^[a-zA-Z]+$/};return"string"==typeof t&&r[o(r,e)?e:"default"].test(t)},alphanumeric({value:t},e="default"){const r={default:/^[a-zA-Z0-9À-ÖØ-öø-ÿ]+$/,latin:/^[a-zA-Z0-9]+$/};return"string"==typeof t&&r[o(r,e)?e:"default"].test(t)},before({value:t},e=!1){const r=!1!==e?Date.parse(e):Date.now(),o=t instanceof Date?t.getTime():Date.parse(t);return!isNaN(o)&&onull!==e&&null!==r&&!isNaN(e)&&!isNaN(r)&&(!isNaN(Number(t))&&"length"!==o||"value"===o?(t=Number(t))>Number(e)&&te&&t.lengthe?function(t){const e=`^${r=t,r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}$`;var r;const o={MM:"(0[1-9]|1[012])",M:"([1-9]|1[012])",DD:"([012][1-9]|3[01])",D:"([012]?[1-9]|3[01])",YYYY:"\\d{4}",YY:"\\d{2}"};return new RegExp(Object.keys(o).reduce(((t,e)=>t.replace(e,o[e])),e))}(e).test(t):!isNaN(Date.parse(t)),email({value:t}){if(!t)return!0;return/^(([^<>()\[\].,;:\s@"]+(\.[^<>()\[\].,;:\s@"]+)*)|(".+"))@(([^<>()[\].,;:\s@"]+\.)+[^<>()[\].,;:\s@"]{2,})$/i.test(t)},endsWith:({value:t},...e)=>!t||"string"==typeof t&&(0===e.length||e.some((e=>t.endsWith(e)))),in:({value:t},...e)=>e.some((e=>w(e,t))),matches:({value:t},...e)=>!!e.find((e=>("string"==typeof e&&"/"===e.substr(0,1)&&"/"===e.substr(-1)&&(e=new RegExp(e.substr(1,e.length-2))),e instanceof RegExp?e.test(t):e===t))),max:({value:t},e=10,r)=>Array.isArray(t)?(e=isNaN(Number(e))?e:Number(e),t.length<=e):!isNaN(t)&&"length"!==r||"value"===r?(t=isNaN(t)?t:Number(t))<=e:("string"==typeof t||"length"===r)&&(t=isNaN(t)?t:String(t)).length<=e,min:({value:t},e=1,r)=>Array.isArray(t)?(e=isNaN(e)?e:Number(e),t.length>=e):!isNaN(t)&&"length"!==r||"value"===r?(t=isNaN(t)?t:Number(t))>=e:("string"==typeof t||"length"===r)&&(t=isNaN(t)?t:String(t)).length>=e,not:({value:t},...e)=>!e.some((e=>w(e,t))),number:({value:t})=>String(t).length>0&&!isNaN(Number(t)),required:({value:t},e=!0)=>!(e&&!["no","false"].includes(e))||(Array.isArray(t)?!!t.length:"string"==typeof t?!!t:"object"!=typeof t||!!t&&!!Object.keys(t).length),startsWith:({value:t},...e)=>!t||"string"==typeof t&&(0===e.length||e.some((e=>t.startsWith(e)))),url:({value:t})=>!t||i(t),bail:()=>!0},x={default:(t,e)=>t.$t("validation.default",e),accepted:(t,e)=>t.$t("validation.accepted",e),after:(t,e,r=!1)=>"string"==typeof r&&r.length?t.$t("validation.after.compare",e):t.$t("validation.after.default",e),alpha:(t,e)=>t.$t("validation.alpha",e),alphanumeric:(t,e)=>t.$t("validation.alphanumeric",e),before:(t,e,r=!1)=>"string"==typeof r&&r.length?t.$t("validation.before.compare",e):t.$t("validation.before.default",e),between(t,e,r=0,o=10,n){const i=Object.assign(Object.assign({},e),{from:r,to:o});return!isNaN(e.value)&&"length"!==n||"value"===n?t.$t("validation.between.force",i):t.$t("validation.between.default",i)},confirm:(t,e)=>t.$t("validation.confirm",e),date:(t,e,r=!1)=>"string"==typeof r&&r.length?t.$t("validation.date.format",e):t.$t("validation.date.default",e),email:(t,e)=>t.$t("validation.email.default",e),endsWith:(t,e)=>t.$t("validation.endsWith.default",e),in:(t,e)=>"string"==typeof e.value&&e.value?t.$t("validation.in.string",e):t.$t("validation.in.default",e),matches:(t,e)=>t.$t("validation.matches.default",e),max:(t,e,r=10,o)=>Array.isArray(e.value)?t.$tc("validation.max.array",r,e):!isNaN(e.value)&&"length"!==o||"value"===o?t.$tc("validation.max.force",r,e):t.$tc("validation.max.default",r,e),min:(t,e,r=1,o)=>Array.isArray(e.value)?t.$tc("validation.min.array",r,e):!isNaN(e.value)&&"length"!==o||"value"===o?t.$tc("validation.min.force",r,e):t.$tc("validation.min.default",r,e),not:(t,e)=>t.$t("validation.not.default",e),number:(t,e)=>t.$t("validation.number.default",e),required:(t,e)=>t.$t("validation.required.default",e),startsWith:(t,e)=>t.$t("validation.startsWith.default",e),url:(t,e)=>t.$t("validation.url.default",e)};class V{constructor(t){this.validationRules={},this.validationMessages={},this.registry=new Map,this.validationRules=A,this.validationMessages=x,this.extend(t||{})}extend(t){if("object"==typeof t)return this.validationRules=n(this.validationRules,t.validationRules||{}),this.validationMessages=n(this.validationMessages,t.validationMessages||{}),this;throw new Error(`[Formulario]: Formulario.extend(): should be passed an object (was ${typeof t})`)}runValidation(t){if(!this.registry.has(t))throw new Error(`[Formulario]: Formulario.runValidation(): no forms with id "${t}"`);return this.registry.get(t).runValidation()}resetValidation(t){if(!this.registry.has(t))return;this.registry.get(t).resetValidation()}register(t,e){if(this.registry.has(t))throw new Error(`[Formulario]: Formulario.register(): id "${t}" is already in use`);this.registry.set(t,e)}unregister(t){this.registry.has(t)&&this.registry.delete(t)}getRules(t={}){return n(this.validationRules,t)}getMessages(t,e){const r=n(this.validationMessages||{},e),o={};for(const e in r)o[e]=(o,...n)=>"string"==typeof r[e]?r[e]:r[e](t,o,...n);return o}} + ***************************************************************************** */function m(t,e,r,o){var i,n=arguments.length,a=n<3?e:null===o?o=Object.getOwnPropertyDescriptor(e,r):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(t,e,r,o);else for(var s=t.length-1;s>=0;s--)(i=t[s])&&(a=(n<3?i(a):n>3?i(e,r,a):i(e,r))||a);return n>3&&a&&Object.defineProperty(e,r,a),a}const y=t=>{const e=parseInt(t);return e.toString()===t?e:NaN},v=t=>{const e=[];return t.split(".").forEach((t=>{/(.*)\[(\d+)]$/.test(t)?e.push(...t.substr(0,t.length-1).split("[").filter((t=>t.length))):e.push(t)})),e};function g(t,e,r){const o="string"==typeof e?v(e):e;if(d(t)||0===o.length)return r;const i=o.shift(),n=y(i);if(!isNaN(n))return Array.isArray(t)&&n>=0&&n{const r=t,o=e;r[o];return function(t,e){var r={};for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&e.indexOf(o)<0&&(r[o]=t[o]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(o=Object.getOwnPropertySymbols(t);i=0&&i0!==t.indexOf(e)&&"_"!==t[t.indexOf(e)-1]?e.toUpperCase().replace("_",""):e))}const w={accepted:({value:t})=>["yes","on","1",1,!0,"true"].includes(t),after({value:t},e=!1){const r=!1!==e?Date.parse(e):Date.now(),o=t instanceof Date?t.getTime():Date.parse(t);return!isNaN(o)&&o>r},alpha({value:t},e="default"){const r={default:/^[a-zA-ZÀ-ÖØ-öø-ÿ]+$/,latin:/^[a-zA-Z]+$/};return"string"==typeof t&&r[h(r,e)?e:"default"].test(t)},alphanumeric({value:t},e="default"){const r={default:/^[a-zA-Z0-9À-ÖØ-öø-ÿ]+$/,latin:/^[a-zA-Z0-9]+$/};return"string"==typeof t&&r[h(r,e)?e:"default"].test(t)},before({value:t},e=!1){const r=!1!==e?Date.parse(e):Date.now(),o=t instanceof Date?t.getTime():Date.parse(t);return!isNaN(o)&&onull!==e&&null!==r&&!isNaN(e)&&!isNaN(r)&&(!isNaN(Number(t))&&"length"!==o||"value"===o?(t=Number(t))>Number(e)&&te&&t.lengthe?function(t){const e=`^${r=t,r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}$`;var r;const o={MM:"(0[1-9]|1[012])",M:"([1-9]|1[012])",DD:"([012][1-9]|3[01])",D:"([012]?[1-9]|3[01])",YYYY:"\\d{4}",YY:"\\d{2}"};return new RegExp(Object.keys(o).reduce(((t,e)=>t.replace(e,o[e])),e))}(e).test(t):!isNaN(Date.parse(t)),email({value:t}){if(!t)return!0;return/^(([^<>()\[\].,;:\s@"]+(\.[^<>()\[\].,;:\s@"]+)*)|(".+"))@(([^<>()[\].,;:\s@"]+\.)+[^<>()[\].,;:\s@"]{2,})$/i.test(t)},endsWith:({value:t},...e)=>!t||"string"==typeof t&&(0===e.length||e.some((e=>t.endsWith(e)))),in:({value:t},...e)=>e.some((e=>j(e,t))),matches:({value:t},...e)=>!!e.find((e=>("string"==typeof e&&"/"===e.substr(0,1)&&"/"===e.substr(-1)&&(e=new RegExp(e.substr(1,e.length-2))),e instanceof RegExp?e.test(t):e===t))),max:({value:t},e=10,r)=>Array.isArray(t)?(e=isNaN(Number(e))?e:Number(e),t.length<=e):!isNaN(t)&&"length"!==r||"value"===r?(t=isNaN(t)?t:Number(t))<=e:("string"==typeof t||"length"===r)&&(t=isNaN(t)?t:String(t)).length<=e,min:({value:t},e=1,r)=>Array.isArray(t)?(e=isNaN(e)?e:Number(e),t.length>=e):!isNaN(t)&&"length"!==r||"value"===r?(t=isNaN(t)?t:Number(t))>=e:("string"==typeof t||"length"===r)&&(t=isNaN(t)?t:String(t)).length>=e,not:({value:t},...e)=>!e.some((e=>j(e,t))),number:({value:t})=>String(t).length>0&&!isNaN(Number(t)),required:({value:t},e=!0)=>!(e&&!["no","false"].includes(e))||(Array.isArray(t)?!!t.length:"string"==typeof t?!!t:"object"!=typeof t||!!t&&!!Object.keys(t).length),startsWith:({value:t},...e)=>!t||"string"==typeof t&&(0===e.length||e.some((e=>t.startsWith(e)))),url:({value:t})=>!t||r(t),bail:()=>!0},R={default:(t,e)=>t.$t("validation.default",e),accepted:(t,e)=>t.$t("validation.accepted",e),after:(t,e,r=!1)=>"string"==typeof r&&r.length?t.$t("validation.after.compare",e):t.$t("validation.after.default",e),alpha:(t,e)=>t.$t("validation.alpha",e),alphanumeric:(t,e)=>t.$t("validation.alphanumeric",e),before:(t,e,r=!1)=>"string"==typeof r&&r.length?t.$t("validation.before.compare",e):t.$t("validation.before.default",e),between(t,e,r=0,o=10,i){const n=Object.assign(Object.assign({},e),{from:r,to:o});return!isNaN(e.value)&&"length"!==i||"value"===i?t.$t("validation.between.force",n):t.$t("validation.between.default",n)},confirm:(t,e)=>t.$t("validation.confirm",e),date:(t,e,r=!1)=>"string"==typeof r&&r.length?t.$t("validation.date.format",e):t.$t("validation.date.default",e),email:(t,e)=>t.$t("validation.email.default",e),endsWith:(t,e)=>t.$t("validation.endsWith.default",e),in:(t,e)=>"string"==typeof e.value&&e.value?t.$t("validation.in.string",e):t.$t("validation.in.default",e),matches:(t,e)=>t.$t("validation.matches.default",e),max:(t,e,r=10,o)=>Array.isArray(e.value)?t.$tc("validation.max.array",r,e):!isNaN(e.value)&&"length"!==o||"value"===o?t.$tc("validation.max.force",r,e):t.$tc("validation.max.default",r,e),min:(t,e,r=1,o)=>Array.isArray(e.value)?t.$tc("validation.min.array",r,e):!isNaN(e.value)&&"length"!==o||"value"===o?t.$tc("validation.min.force",r,e):t.$tc("validation.min.default",r,e),not:(t,e)=>t.$t("validation.not.default",e),number:(t,e)=>t.$t("validation.number.default",e),required:(t,e)=>t.$t("validation.required.default",e),startsWith:(t,e)=>t.$t("validation.startsWith.default",e),url:(t,e)=>t.$t("validation.url.default",e)};class x{constructor(t){this.validationRules={},this.validationMessages={},this._registry=new Map,this.validationRules=w,this.validationMessages=R,this.extend(t||{})}extend(t){if("object"==typeof t)return this.validationRules=Object.assign(Object.assign({},this.validationRules),t.validationRules||{}),this.validationMessages=Object.assign(Object.assign({},this.validationMessages),t.validationMessages||{}),this;throw new Error(`[Formulario]: Formulario.extend(): should be passed an object (was ${typeof t})`)}runValidation(t){if(!this._registry.has(t))throw new Error(`[Formulario]: Formulario.runValidation(): no forms with id "${t}"`);return this._registry.get(t).runValidation()}resetValidation(t){if(!this._registry.has(t))return;this._registry.get(t).resetValidation()}register(t,e){if(this._registry.has(t))throw new Error(`[Formulario]: Formulario.register(): id "${t}" is already in use`);this._registry.set(t,e)}unregister(t){this._registry.has(t)&&this._registry.delete(t)}getRules(t={}){return Object.assign(Object.assign({},this.validationRules),t)}getMessages(t,e){const r=Object.assign(Object.assign({},this.validationMessages),e),o={};for(const e in r)o[e]=(o,...i)=>{const n=r[e];return"string"==typeof n?n:n(t,o,...i)};return o}} /** * vue-class-component v7.2.3 * (c) 2015-present Evan You * @license MIT - */function P(t){return(P="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function D(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function S(t){return function(t){if(Array.isArray(t)){for(var e=0,r=new Array(t.length);e0&&U("Component class must inherit Vue or its descendant class when class property is used."),i}var k=["data","beforeCreate","created","beforeMount","mounted","beforeDestroy","destroyed","beforeUpdate","updated","activated","deactivated","render","errorCaptured","serverPrefetch"];function Y(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};r.name=r.name||e._componentTag||e.name;var o=e.prototype;Object.getOwnPropertyNames(o).forEach((function(t){if("constructor"!==t)if(k.indexOf(t)>-1)r[t]=o[t];else{var e=Object.getOwnPropertyDescriptor(o,t);void 0!==e.value?"function"==typeof e.value?(r.methods||(r.methods={}))[t]=e.value:(r.mixins||(r.mixins=[])).push({data:function(){return D({},t,e.value)}}):(e.get||e.set)&&((r.computed||(r.computed={}))[t]={get:e.get,set:e.set})}})),(r.mixins||(r.mixins=[])).push({data:function(){return L(this,e)}});var n=e.__decorators__;n&&(n.forEach((function(t){return t(r)})),delete e.__decorators__);var i=Object.getPrototypeOf(e.prototype),a=i instanceof t?i.constructor:t,s=a.extend(r);return W(s,e,a),C()&&M(s,e),s}var G=["cid","super","options","superOptions","extendOptions","sealedOptions","component","directive","filter"],z={prototype:!0,arguments:!0,callee:!0,caller:!0};function W(t,e,r){Object.getOwnPropertyNames(e).forEach((function(o){if(!z[o]){var n=Object.getOwnPropertyDescriptor(t,o);if(!n||n.configurable){var i,a,s=Object.getOwnPropertyDescriptor(e,o);if(!T){if("cid"===o)return;var l=Object.getOwnPropertyDescriptor(r,o);if(i=s.value,a=P(i),null!=i&&("object"===a||"function"===a)&&l&&l.value===s.value)return}"production"!==process.env.NODE_ENV&&G.indexOf(o)>=0&&U("Static property name '".concat(o,"' declared on class '").concat(e.name,"' ")+"conflicts with reserved property name of Vue internal. It may cause unexpected behavior of the component. Consider renaming the property."),Object.defineProperty(t,o,s)}}}))}function q(t){return"function"==typeof t?Y(t):function(e){return Y(e,t)}}q.registerHooks=function(t){k.push.apply(k,S(t))};function Z(t){return B((function(e,r){void 0===e.inject&&(e.inject={}),Array.isArray(e.inject)||(e.inject[r]=t||r)}))}function K(t){return B((function(e,r){var o,n=e.provide;("function"!=typeof(o=n)||!o.managed&&!o.managedReactive)&&(n=e.provide=function(t){var e=function(){var r=this,o="function"==typeof t?t.call(this):t;for(var n in(o=Object.create(o||null)).__reactiveInject__=this.__reactiveInject__||{},e.managed)o[e.managed[n]]=this[n];var i=function(t){o[e.managedReactive[t]]=a[t],Object.defineProperty(o.__reactiveInject__,e.managedReactive[t],{enumerable:!0,get:function(){return r[t]}})},a=this;for(var n in e.managedReactive)i(n);return o};return e.managed={},e.managedReactive={},e}(n)),n.managed[r]=t||r}))}var X="undefined"!=typeof Reflect&&void 0!==Reflect.getMetadata;function H(t,e,r){if(X&&!Array.isArray(t)&&"function"!=typeof t&&void 0===t.type){var o=Reflect.getMetadata("design:type",e,r);o!==Object&&(t.type=o)}}function J(t,e){return void 0===e&&(e={}),function(r,o){H(e,r,o),B((function(r,o){(r.props||(r.props={}))[o]=e,r.model={prop:o,event:t||o}}))(r,o)}}function Q(t){return void 0===t&&(t={}),function(e,r){H(t,e,r),B((function(e,r){(e.props||(e.props={}))[r]=t}))(e,r)}}function tt(t,e){void 0===e&&(e={});var r=e.deep,o=void 0!==r&&r,n=e.immediate,i=void 0!==n&&n;return B((function(e,r){"object"!=typeof e.watch&&(e.watch=Object.create(null));var n=e.watch;"object"!=typeof n[t]||Array.isArray(n[t])?void 0===n[t]&&(n[t]=[]):n[t]=[n[t]],n[t].push({handler:r,deep:o,immediate:i})}))}function et(t,e,r,o){return n=>Promise.resolve(t(n,...r)).then((t=>t?null:{rule:e,args:r,context:n,message:o(n,...r)}))}function rt(t){return/^[\^]/.test(t.charAt(0))?[R(t.substr(1)),t.charAt(0)]:[R(t),null]}function ot(t,e,r){return"function"==typeof t?[t,null,null]:Array.isArray(t)&&t.length?function(t,e,r){const n=t.slice(),i=n.shift();if("function"==typeof i)return[i,null,null];if("string"!=typeof i)throw new Error("[Formulario]: For array constraint first element must be rule name or Validator function");const[a,s]=rt(i);if(o(e,a))return[et(e[a],a,n,r[a]||r.default),a,s];throw new Error("[Formulario] Can't create validator for constraint: "+JSON.stringify(t))}(t,e,r):"string"==typeof t?function(t,e,r){const n=t.split(":"),[i,a]=rt(n.shift()||"");if(o(e,i))return[et(e[i],i,n.length?n.join(":").split(","):[],r[i]||r.default),i,a];throw new Error("[Formulario] Can't create validator for constraint: "+t)}(t,e,r):[()=>Promise.resolve(null),null,null]}function nt(t,e,r){return"string"==typeof t?nt(t.split("|").filter((t=>t.length)),e,r):Array.isArray(t)?t.map((t=>ot(t,e,r))):[]}function it(t){const e=[];if(t.length){let r=t.shift();e.push(r),t.forEach((t=>{t.bail||t.bail!==r.bail?(r=Object.assign({},t),e.push(r)):r.validators.push(...t.validators)}))}return e}function at(t,e){return new Promise((r=>{const o=(t,n=[])=>{if(t.length){const i=t.shift();(function(t,e){return Promise.all(t.validators.map((t=>t(e)))).then((t=>t.filter((t=>null!==t))))})(i,e).then((e=>0!==e.length&&i.bail||!t.length?r(n.concat(e)):o(t,n.concat(e))))}else r([])};o(function(t){const e=([t,,e])=>({validators:[t],bail:"^"===e}),r=[],o=t.findIndex((([,t])=>t&&"bail"===t.toLowerCase()));return o>=0?(r.push(...it(t.splice(0,o+1).slice(0,-1).map(e))),r.push(...t.map((([t])=>({validators:[t],bail:!0}))))):r.push(...it(t.map(e))),r}(t))}))}const st="none",lt="unset",ut={DEMAND:"demand",LIVE:"live",SUBMIT:"submit"};let ct=class extends t{constructor(){super(...arguments),this.proxy=this.hasModel?this.value:"",this.localErrors=[],this.violations=[],this.validationRun=Promise.resolve([])}get fullPath(){return""!==this.__Formulario_path?`${this.__Formulario_path}.${this.name}`:this.name}get hasModel(){return o(this.$options.propsData||{},"value")}get context(){return Object.defineProperty({name:this.fullPath,path:this.fullPath,runValidation:this.runValidation.bind(this),violations:this.violations,errors:this.localErrors,allErrors:[...this.localErrors,...this.violations.map((t=>t.message))]},"model",{get:()=>this.modelGetConverter(this.proxy),set:t=>{this.syncProxy(this.modelSetConverter(t,this.proxy))}})}get normalizedValidationRules(){const t={};return Object.keys(this.validationRules).forEach((e=>{t[R(e)]=this.validationRules[e]})),t}get normalizedValidationMessages(){const t={};return Object.keys(this.validationMessages).forEach((e=>{t[R(e)]=this.validationMessages[e]})),t}onValueChange(){this.syncProxy(this.value)}onProxyChange(){this.validationBehavior===ut.LIVE?this.runValidation():this.resetValidation()}created(){"function"==typeof this.__FormularioForm_register&&this.__FormularioForm_register(this.fullPath,this),this.validationBehavior===ut.LIVE&&this.runValidation()}beforeDestroy(){"function"==typeof this.__FormularioForm_unregister&&this.__FormularioForm_unregister(this.fullPath,this.unregisterBehavior)}syncProxy(t){j(t,this.proxy)||(this.proxy=t,this.$emit("input",t),"function"==typeof this.__FormularioForm_set&&(this.__FormularioForm_set(this.fullPath,t),this.__FormularioForm_emitInput()))}runValidation(){return this.validationRun=this.validate().then((t=>(this.violations=t,this.emitValidation(this.fullPath,t),this.violations))),this.validationRun}validate(){return at(nt(this.validation,this.$formulario.getRules(this.normalizedValidationRules),this.$formulario.getMessages(this,this.normalizedValidationMessages)),{value:this.proxy,name:this.fullPath,formValues:this.__FormularioForm_getState()})}emitValidation(t,e){this.$emit("validation",{path:t,violations:e}),"function"==typeof this.__FormularioForm_emitValidation&&this.__FormularioForm_emitValidation(t,e)}hasValidationErrors(){return new Promise((t=>{this.$nextTick((()=>{this.validationRun.then((()=>t(this.violations.length>0)))}))}))}setErrors(t){this.errorsDisabled||(this.localErrors=t)}resetValidation(){this.localErrors=[],this.violations=[]}};function ft(t,e,r,o,n,i,a,s,l,u){"boolean"!=typeof a&&(l=s,s=a,a=!1);const c="function"==typeof r?r.options:r;let f;if(t&&t.render&&(c.render=t.render,c.staticRenderFns=t.staticRenderFns,c._compiled=!0,n&&(c.functional=!0)),o&&(c._scopeId=o),i?(f=function(t){(t=t||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(t=__VUE_SSR_CONTEXT__),e&&e.call(this,l(t)),t&&t._registeredComponents&&t._registeredComponents.add(i)},c._ssrRegister=f):e&&(f=a?function(t){e.call(this,u(t,this.$root.$options.shadowRoot))}:function(t){e.call(this,s(t))}),f)if(c.functional){const t=c.render;c.render=function(e,r){return f.call(r),t(e,r)}}else{const t=c.beforeCreate;c.beforeCreate=t?[].concat(t,f):[f]}return r}v([Z({default:""})],ct.prototype,"__Formulario_path",void 0),v([Z({default:void 0})],ct.prototype,"__FormularioForm_set",void 0),v([Z({default:()=>()=>{}})],ct.prototype,"__FormularioForm_emitInput",void 0),v([Z({default:()=>()=>{}})],ct.prototype,"__FormularioForm_emitValidation",void 0),v([Z({default:void 0})],ct.prototype,"__FormularioForm_register",void 0),v([Z({default:void 0})],ct.prototype,"__FormularioForm_unregister",void 0),v([Z({default:()=>()=>({})})],ct.prototype,"__FormularioForm_getState",void 0),v([J("input",{default:""})],ct.prototype,"value",void 0),v([Q({required:!0,validator:t=>"string"==typeof t&&t.length>0})],ct.prototype,"name",void 0),v([Q({default:""})],ct.prototype,"validation",void 0),v([Q({default:()=>({})})],ct.prototype,"validationRules",void 0),v([Q({default:()=>({})})],ct.prototype,"validationMessages",void 0),v([Q({default:ut.DEMAND,validator:t=>Object.values(ut).includes(t)})],ct.prototype,"validationBehavior",void 0),v([Q({default:!1})],ct.prototype,"errorsDisabled",void 0),v([Q({default:()=>t=>t})],ct.prototype,"modelGetConverter",void 0),v([Q({default:()=>t=>t})],ct.prototype,"modelSetConverter",void 0),v([Q({default:"div"})],ct.prototype,"tag",void 0),v([Q({default:st})],ct.prototype,"unregisterBehavior",void 0),v([tt("value")],ct.prototype,"onValueChange",null),v([tt("proxy")],ct.prototype,"onProxyChange",null),ct=v([q({name:"FormularioField",inheritAttrs:!1})],ct);const dt=ct;var pt=function(){var t=this,e=t.$createElement;return(t._self._c||e)(t.tag,t._b({tag:"component"},"component",t.$attrs,!1),[t._t("default",null,{context:t.context})],2)};pt._withStripped=!0;const ht=ft({render:pt,staticRenderFns:[]},undefined,dt,undefined,false,undefined,!1,void 0,void 0,void 0);let mt=class extends t{get fullPath(){const t=""+this.name;return parseInt(t).toString()===t?`${this.__Formulario_path}[${t}]`:""===this.__Formulario_path?t:`${this.__Formulario_path}.${t}`}};v([Z({default:""})],mt.prototype,"__Formulario_path",void 0),v([Q({required:!0})],mt.prototype,"name",void 0),v([K("__Formulario_path")],mt.prototype,"fullPath",null),mt=v([q({name:"FormularioFieldGroup"})],mt);const yt=mt;var vt=function(){var t=this,e=t.$createElement;return(t._self._c||e)("div",[t._t("default")],2)};vt._withStripped=!0;const gt=ft({render:vt,staticRenderFns:[]},undefined,yt,undefined,false,undefined,!1,void 0,void 0,void 0),_t=(t,e,r)=>void 0===r?N(t,e):O(t,e,r);let bt=class extends t{constructor(){super(...arguments),this.proxy={},this.registry=new Map,this.localFieldsErrors={},this.localFormErrors=[]}get fieldsErrorsComputed(){return n(this.fieldsErrors||{},this.localFieldsErrors)}get formErrorsComputed(){return[...this.formErrors,...this.localFormErrors]}register(t,e){this.registry.has(t)||this.registry.set(t,e);const r=b(this.proxy,t);e.hasModel?j(e.proxy,r)||(this.setFieldValue(t,e.proxy),this.emitInput()):void 0!==r?e.proxy=r:(this.setFieldValue(t,null),this.emitInput()),o(this.fieldsErrorsComputed,t)&&e.setErrors(this.fieldsErrorsComputed[t])}unregister(t,e){this.registry.has(t)&&(this.registry.delete(t),e===lt&&(this.proxy=N(this.proxy,t),this.emitInput()))}getState(){return this.proxy}setFieldValue(t,e){this.proxy=_t(this.proxy,t,e)}emitInput(){this.$emit("input",y(this.proxy))}emitValidation(t,e){this.$emit("validation",{path:t,violations:e})}onStateChange(t){const e=y(t),r=this.proxy;let o=!1;this.registry.forEach(((n,i)=>{const a=b(t,i,null),s=b(r,i,null);n.proxy=a,j(a,s)||(n.$emit("input",a),_t(e,i,a),o=!0)})),this.proxy=e,o&&this.emitInput()}onFieldsErrorsChange(t){this.registry.forEach(((e,r)=>{e.setErrors(t[r]||[])}))}created(){this.$formulario.register(this.id,this),"object"==typeof this.state&&(this.proxy=y(this.state))}beforeDestroy(){this.$formulario.unregister(this.id)}runValidation(){const t=[],e={};return this.registry.forEach(((r,o)=>{t.push(r.runValidation().then((t=>{e[o]=t})))})),Promise.all(t).then((()=>e))}hasValidationErrors(){return this.runValidation().then((t=>Object.keys(t).some((e=>t[e].length>0))))}setErrors({fieldsErrors:t,formErrors:e}){this.localFieldsErrors=t||{},this.localFormErrors=e||[]}resetValidation(){this.localFieldsErrors={},this.localFormErrors=[],this.registry.forEach((t=>{t.resetValidation()}))}onSubmit(){return this.runValidation().then((t=>{Object.keys(t).some((e=>t[e].length>0))?this.$emit("error",t):this.$emit("submit",y(this.proxy))}))}};v([J("input",{default:()=>({})})],bt.prototype,"state",void 0),v([Q({default:()=>(t=>{const e=(u.get(t)||0)+1;return u.set(t,e),`${t}-${e}`})("formulario-form")})],bt.prototype,"id",void 0),v([Q({default:()=>({})})],bt.prototype,"fieldsErrors",void 0),v([Q({default:()=>[]})],bt.prototype,"formErrors",void 0),v([K("__FormularioForm_register")],bt.prototype,"register",null),v([K("__FormularioForm_unregister")],bt.prototype,"unregister",null),v([K("__FormularioForm_getState")],bt.prototype,"getState",null),v([K("__FormularioForm_set")],bt.prototype,"setFieldValue",null),v([K("__FormularioForm_emitInput")],bt.prototype,"emitInput",null),v([K("__FormularioForm_emitValidation")],bt.prototype,"emitValidation",null),v([tt("state",{deep:!0})],bt.prototype,"onStateChange",null),v([tt("fieldsErrorsComputed",{deep:!0,immediate:!0})],bt.prototype,"onFieldsErrorsChange",null),bt=v([q({name:"FormularioForm"})],bt);const Ot=bt;var Ft=function(){var t=this,e=t.$createElement;return(t._self._c||e)("form",{on:{submit:function(e){return e.preventDefault(),t.onSubmit(e)}}},[t._t("default",null,{errors:t.formErrorsComputed})],2)};Ft._withStripped=!0;const Nt=ft({render:Ft,staticRenderFns:[]},undefined,Ot,undefined,false,undefined,!1,void 0,void 0,void 0);return{Formulario:V,install(t,e){t.component("FormularioField",ht),t.component("FormularioFieldGroup",gt),t.component("FormularioForm",Nt),t.component("FormularioInput",ht),t.component("FormularioGrouping",gt),t.mixin({beforeCreate(){const t=this.$options;"function"==typeof t.formulario?this.$formulario=t.formulario():t.parent&&t.parent.$formulario?this.$formulario=t.parent.$formulario:this.$formulario=new V(e)}})}}}(Vue); + */function A(t){return(A="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function P(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function V(t){return function(t){if(Array.isArray(t)){for(var e=0,r=new Array(t.length);e0&&T("Component class must inherit Vue or its descendant class when class property is used."),n}var U=["data","beforeCreate","created","beforeMount","mounted","beforeDestroy","destroyed","beforeUpdate","updated","activated","deactivated","render","errorCaptured","serverPrefetch"];function k(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};r.name=r.name||t._componentTag||t.name;var o=t.prototype;Object.getOwnPropertyNames(o).forEach((function(t){if("constructor"!==t)if(U.indexOf(t)>-1)r[t]=o[t];else{var e=Object.getOwnPropertyDescriptor(o,t);void 0!==e.value?"function"==typeof e.value?(r.methods||(r.methods={}))[t]=e.value:(r.mixins||(r.mixins=[])).push({data:function(){return P({},t,e.value)}}):(e.get||e.set)&&((r.computed||(r.computed={}))[t]={get:e.get,set:e.set})}})),(r.mixins||(r.mixins=[])).push({data:function(){return B(this,t)}});var i=t.__decorators__;i&&(i.forEach((function(t){return t(r)})),delete t.__decorators__);var n=Object.getPrototypeOf(t.prototype),a=n instanceof e?n.constructor:e,s=a.extend(r);return G(s,t,a),S()&&D(s,t),s}var L=["cid","super","options","superOptions","extendOptions","sealedOptions","component","directive","filter"],Y={prototype:!0,arguments:!0,callee:!0,caller:!0};function G(t,e,r){Object.getOwnPropertyNames(e).forEach((function(o){if(!Y[o]){var i=Object.getOwnPropertyDescriptor(t,o);if(!i||i.configurable){var n,a,s=Object.getOwnPropertyDescriptor(e,o);if(!M){if("cid"===o)return;var l=Object.getOwnPropertyDescriptor(r,o);if(n=s.value,a=A(n),null!=n&&("object"===a||"function"===a)&&l&&l.value===s.value)return}"production"!==process.env.NODE_ENV&&L.indexOf(o)>=0&&T("Static property name '".concat(o,"' declared on class '").concat(e.name,"' ")+"conflicts with reserved property name of Vue internal. It may cause unexpected behavior of the component. Consider renaming the property."),Object.defineProperty(t,o,s)}}}))}function z(t){return"function"==typeof t?k(t):function(e){return k(e,t)}}z.registerHooks=function(t){U.push.apply(U,V(t))};function W(t){return I((function(e,r){void 0===e.inject&&(e.inject={}),Array.isArray(e.inject)||(e.inject[r]=t||r)}))}function q(t){return I((function(e,r){var o,i=e.provide;("function"!=typeof(o=i)||!o.managed&&!o.managedReactive)&&(i=e.provide=function(t){var e=function(){var r=this,o="function"==typeof t?t.call(this):t;for(var i in(o=Object.create(o||null)).__reactiveInject__=this.__reactiveInject__||{},e.managed)o[e.managed[i]]=this[i];var n=function(t){o[e.managedReactive[t]]=a[t],Object.defineProperty(o.__reactiveInject__,e.managedReactive[t],{enumerable:!0,get:function(){return r[t]}})},a=this;for(var i in e.managedReactive)n(i);return o};return e.managed={},e.managedReactive={},e}(i)),i.managed[r]=t||r}))}var Z="undefined"!=typeof Reflect&&void 0!==Reflect.getMetadata;function K(t,e,r){if(Z&&!Array.isArray(t)&&"function"!=typeof t&&void 0===t.type){var o=Reflect.getMetadata("design:type",e,r);o!==Object&&(t.type=o)}}function X(t,e){return void 0===e&&(e={}),function(r,o){K(e,r,o),I((function(r,o){(r.props||(r.props={}))[o]=e,r.model={prop:o,event:t||o}}))(r,o)}}function H(t){return void 0===t&&(t={}),function(e,r){K(t,e,r),I((function(e,r){(e.props||(e.props={}))[r]=t}))(e,r)}}function J(t,e){void 0===e&&(e={});var r=e.deep,o=void 0!==r&&r,i=e.immediate,n=void 0!==i&&i;return I((function(e,r){"object"!=typeof e.watch&&(e.watch=Object.create(null));var i=e.watch;"object"!=typeof i[t]||Array.isArray(i[t])?void 0===i[t]&&(i[t]=[]):i[t]=[i[t]],i[t].push({handler:r,deep:o,immediate:n})}))}function Q(t,e,r,o){return i=>Promise.resolve(t(i,...r)).then((t=>t?null:{rule:e,args:r,context:i,message:o(i,...r)}))}function tt(t){return/^[\^]/.test(t.charAt(0))?[$(t.substr(1)),t.charAt(0)]:[$(t),null]}function et(t,e,r){return"function"==typeof t?[t,null,null]:Array.isArray(t)&&t.length?function(t,e,r){const o=t.slice(),i=o.shift();if("function"==typeof i)return[i,null,null];if("string"!=typeof i)throw new Error("[Formulario]: For array constraint first element must be rule name or Validator function");const[n,a]=tt(i);if(h(e,n))return[Q(e[n],n,o,r[n]||r.default),n,a];throw new Error("[Formulario] Can't create validator for constraint: "+JSON.stringify(t))}(t,e,r):"string"==typeof t?function(t,e,r){const o=t.split(":"),[i,n]=tt(o.shift()||"");if(h(e,i))return[Q(e[i],i,o.length?o.join(":").split(","):[],r[i]||r.default),i,n];throw new Error("[Formulario] Can't create validator for constraint: "+t)}(t,e,r):[()=>Promise.resolve(null),null,null]}function rt(t,e,r){return"string"==typeof t?rt(t.split("|").filter((t=>t.length)),e,r):Array.isArray(t)?t.map((t=>et(t,e,r))):[]}function ot(t){const e=[];if(t.length){let r=t.shift();e.push(r),t.forEach((t=>{t.bail||t.bail!==r.bail?(r=Object.assign({},t),e.push(r)):r.validators.push(...t.validators)}))}return e}function it(t,e){return new Promise((r=>{const o=(t,i=[])=>{if(t.length){const n=t.shift();(function(t,e){return Promise.all(t.validators.map((t=>t(e)))).then((t=>t.filter((t=>null!==t))))})(n,e).then((e=>0!==e.length&&n.bail||!t.length?r(i.concat(e)):o(t,i.concat(e))))}else r([])};o(function(t){const e=([t,,e])=>({validators:[t],bail:"^"===e}),r=[],o=t.findIndex((([,t])=>t&&"bail"===t.toLowerCase()));return o>=0?(r.push(...ot(t.splice(0,o+1).slice(0,-1).map(e))),r.push(...t.map((([t])=>({validators:[t],bail:!0}))))):r.push(...ot(t.map(e))),r}(t))}))}let nt=class extends e{constructor(){super(...arguments),this.proxy=this.hasModel?this.value:"",this.localErrors=[],this.violations=[],this.validationRun=Promise.resolve([])}get fullPath(){return""!==this.__Formulario_path?`${this.__Formulario_path}.${this.name}`:this.name}get hasModel(){return h(this.$options.propsData||{},"value")}get context(){return Object.defineProperty({name:this.fullPath,path:this.fullPath,runValidation:this.runValidation.bind(this),violations:this.violations,errors:this.localErrors,allErrors:[...this.localErrors,...this.violations.map((t=>t.message))]},"model",{get:()=>this.modelGetConverter(this.proxy),set:t=>{this._syncProxy(this.modelSetConverter(t,this.proxy))}})}get _normalizedValidationRules(){const t={};return Object.keys(this.validationRules).forEach((e=>{t[$(e)]=this.validationRules[e]})),t}get _normalizedValidationMessages(){const t={};return Object.keys(this.validationMessages).forEach((e=>{t[$(e)]=this.validationMessages[e]})),t}_onValueChange(){this._syncProxy(this.value)}_onProxyChange(){"live"===this.validationBehavior?this.runValidation():this.resetValidation()}created(){"function"==typeof this.__FormularioForm_register&&this.__FormularioForm_register(this.fullPath,this),"live"===this.validationBehavior&&this.runValidation()}beforeDestroy(){"function"==typeof this.__FormularioForm_unregister&&this.__FormularioForm_unregister(this.fullPath,this.unregisterBehavior)}runValidation(){return this.validationRun=this._validate().then((t=>(this.violations=t,this._emitValidation(this.fullPath,t),this.violations))),this.validationRun}hasValidationErrors(){return new Promise((t=>{this.$nextTick((()=>{this.validationRun.then((()=>t(this.violations.length>0)))}))}))}setErrors(t){this.errorsDisabled||(this.localErrors=t)}resetValidation(){this.localErrors=[],this.violations=[]}_syncProxy(t){E(t,this.proxy)||(this.proxy=t,this.$emit("input",t),"function"==typeof this.__FormularioForm_set&&(this.__FormularioForm_set(this.fullPath,t),this.__FormularioForm_emitInput()))}_validate(){return it(rt(this.validation,this.$formulario.getRules(this._normalizedValidationRules),this.$formulario.getMessages(this,this._normalizedValidationMessages)),{value:this.proxy,name:this.fullPath,formValues:this.__FormularioForm_getState()})}_emitValidation(t,e){this.$emit("validation",{path:t,violations:e}),"function"==typeof this.__FormularioForm_emitValidation&&this.__FormularioForm_emitValidation(t,e)}};function at(t,e,r,o,i,n,a,s,l,u){"boolean"!=typeof a&&(l=s,s=a,a=!1);const c="function"==typeof r?r.options:r;let f;if(t&&t.render&&(c.render=t.render,c.staticRenderFns=t.staticRenderFns,c._compiled=!0,i&&(c.functional=!0)),o&&(c._scopeId=o),n?(f=function(t){(t=t||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(t=__VUE_SSR_CONTEXT__),e&&e.call(this,l(t)),t&&t._registeredComponents&&t._registeredComponents.add(n)},c._ssrRegister=f):e&&(f=a?function(t){e.call(this,u(t,this.$root.$options.shadowRoot))}:function(t){e.call(this,s(t))}),f)if(c.functional){const t=c.render;c.render=function(e,r){return f.call(r),t(e,r)}}else{const t=c.beforeCreate;c.beforeCreate=t?[].concat(t,f):[f]}return r}m([W({default:""})],nt.prototype,"__Formulario_path",void 0),m([W({default:void 0})],nt.prototype,"__FormularioForm_set",void 0),m([W({default:()=>()=>{}})],nt.prototype,"__FormularioForm_emitInput",void 0),m([W({default:()=>()=>{}})],nt.prototype,"__FormularioForm_emitValidation",void 0),m([W({default:void 0})],nt.prototype,"__FormularioForm_register",void 0),m([W({default:void 0})],nt.prototype,"__FormularioForm_unregister",void 0),m([W({default:()=>()=>({})})],nt.prototype,"__FormularioForm_getState",void 0),m([X("input",{default:""})],nt.prototype,"value",void 0),m([H({required:!0,validator:t=>"string"==typeof t&&t.length>0})],nt.prototype,"name",void 0),m([H({default:""})],nt.prototype,"validation",void 0),m([H({default:()=>({})})],nt.prototype,"validationRules",void 0),m([H({default:()=>({})})],nt.prototype,"validationMessages",void 0),m([H({default:"demand",validator:t=>["demand","live","submit"].includes(t)})],nt.prototype,"validationBehavior",void 0),m([H({default:!1})],nt.prototype,"errorsDisabled",void 0),m([H({default:()=>t=>t})],nt.prototype,"modelGetConverter",void 0),m([H({default:()=>t=>t})],nt.prototype,"modelSetConverter",void 0),m([H({default:"div"})],nt.prototype,"tag",void 0),m([H({default:"none"})],nt.prototype,"unregisterBehavior",void 0),m([J("value")],nt.prototype,"_onValueChange",null),m([J("proxy")],nt.prototype,"_onProxyChange",null),nt=m([z({name:"FormularioField",inheritAttrs:!1})],nt);const st=nt;var lt=function(){var t=this,e=t.$createElement;return(t._self._c||e)(t.tag,t._b({tag:"component"},"component",t.$attrs,!1),[t._t("default",null,{context:t.context})],2)};lt._withStripped=!0;const ut=at({render:lt,staticRenderFns:[]},undefined,st,undefined,false,undefined,!1,void 0,void 0,void 0);let ct=class extends e{get fullPath(){const t=""+this.name;return parseInt(t).toString()===t?`${this.__Formulario_path}[${t}]`:""===this.__Formulario_path?t:`${this.__Formulario_path}.${t}`}};m([W({default:""})],ct.prototype,"__Formulario_path",void 0),m([H({required:!0})],ct.prototype,"name",void 0),m([q("__Formulario_path")],ct.prototype,"fullPath",null),ct=m([z({name:"FormularioFieldGroup"})],ct);const ft=ct;var dt=function(){var t=this,e=t.$createElement;return(t._self._c||e)("div",[t._t("default")],2)};dt._withStripped=!0;const pt=at({render:dt,staticRenderFns:[]},undefined,ft,undefined,false,undefined,!1,void 0,void 0,void 0),ht=(t,e,r)=>void 0===r?O(t,e):_(t,e,r);let mt=class extends e{constructor(){super(...arguments),this.proxy={},this.registry=new Map,this.localFieldsErrors={},this.localFormErrors=[]}get fieldsErrorsComputed(){return Object.assign(Object.assign({},this.fieldsErrors),this.localFieldsErrors)}get formErrorsComputed(){return[...this.formErrors,...this.localFormErrors]}register(t,e){this.registry.has(t)||this.registry.set(t,e);const r=g(this.proxy,t);e.hasModel?E(e.proxy,r)||(this.setFieldValue(t,e.proxy),this.emitInput()):void 0!==r?e.proxy=r:(this.setFieldValue(t,null),this.emitInput()),h(this.fieldsErrorsComputed,t)&&e.setErrors(this.fieldsErrorsComputed[t])}unregister(t,e){this.registry.has(t)&&(this.registry.delete(t),"unset"===e&&(this.proxy=O(this.proxy,t),this.emitInput()))}getState(){return this.proxy}setFieldValue(t,e){this.proxy=ht(this.proxy,t,e)}emitInput(){this.$emit("input",p(this.proxy))}emitValidation(t,e){this.$emit("validation",{path:t,violations:e})}onStateChange(t){const e=p(t),r=this.proxy;let o=!1;this.registry.forEach(((i,n)=>{const a=g(t,n,null),s=g(r,n,null);i.proxy=a,E(a,s)||(i.$emit("input",a),ht(e,n,a),o=!0)})),this.proxy=e,o&&this.emitInput()}onFieldsErrorsChange(t){this.registry.forEach(((e,r)=>{e.setErrors(t[r]||[])}))}created(){this.$formulario.register(this.id,this),"object"==typeof this.state&&(this.proxy=p(this.state))}beforeDestroy(){this.$formulario.unregister(this.id)}runValidation(){const t=[],e={};return this.registry.forEach(((r,o)=>{t.push(r.runValidation().then((t=>{e[o]=t})))})),Promise.all(t).then((()=>e))}hasValidationErrors(){return this.runValidation().then((t=>Object.keys(t).some((e=>t[e].length>0))))}setErrors({formErrors:t,fieldsErrors:e}){this.localFormErrors=t||[],this.localFieldsErrors=e||{}}resetValidation(){this.localFormErrors=[],this.localFieldsErrors={},this.registry.forEach((t=>{t.resetValidation()}))}onSubmit(){return this.runValidation().then((t=>{Object.keys(t).some((e=>t[e].length>0))?this.$emit("error",t):this.$emit("submit",p(this.proxy))}))}};m([X("input",{default:()=>({})})],mt.prototype,"state",void 0),m([H({default:()=>(t=>{const e=(a.get(t)||0)+1;return a.set(t,e),`${t}-${e}`})("formulario-form")})],mt.prototype,"id",void 0),m([H({default:()=>({})})],mt.prototype,"fieldsErrors",void 0),m([H({default:()=>[]})],mt.prototype,"formErrors",void 0),m([q("__FormularioForm_register")],mt.prototype,"register",null),m([q("__FormularioForm_unregister")],mt.prototype,"unregister",null),m([q("__FormularioForm_getState")],mt.prototype,"getState",null),m([q("__FormularioForm_set")],mt.prototype,"setFieldValue",null),m([q("__FormularioForm_emitInput")],mt.prototype,"emitInput",null),m([q("__FormularioForm_emitValidation")],mt.prototype,"emitValidation",null),m([J("state",{deep:!0})],mt.prototype,"onStateChange",null),m([J("fieldsErrorsComputed",{deep:!0,immediate:!0})],mt.prototype,"onFieldsErrorsChange",null),mt=m([z({name:"FormularioForm"})],mt);const yt=mt;var vt=function(){var t=this,e=t.$createElement;return(t._self._c||e)("form",{on:{submit:function(e){return e.preventDefault(),t.onSubmit(e)}}},[t._t("default",null,{errors:t.formErrorsComputed})],2)};vt._withStripped=!0;const gt=at({render:vt,staticRenderFns:[]},undefined,yt,undefined,false,undefined,!1,void 0,void 0,void 0);var _t={Formulario:x,install(t,e){t.component("FormularioField",ut),t.component("FormularioFieldGroup",pt),t.component("FormularioForm",gt),t.mixin({beforeCreate(){const t=this.$options;"function"==typeof t.formulario?this.$formulario=t.formulario():t.parent&&t.parent.$formulario?this.$formulario=t.parent.$formulario:this.$formulario=new x(e)}})}};return t.Formulario=x,t.FormularioField=ut,t.FormularioFieldGroup=pt,t.FormularioForm=gt,t.default=_t,t}({},Vue); diff --git a/dist/formulario.umd.js b/dist/formulario.umd.js index f4fcac2..1c17c08 100644 --- a/dist/formulario.umd.js +++ b/dist/formulario.umd.js @@ -1,54 +1,12 @@ (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('is-plain-object'), require('is-url'), require('vue'), require('vue-property-decorator')) : - typeof define === 'function' && define.amd ? define(['is-plain-object', 'is-url', 'vue', 'vue-property-decorator'], factory) : - (global = global || self, global.Formulario = factory(global.isPlainObject, global.isUrl, global.Vue, global.vuePropertyDecorator)); -}(this, (function (isPlainObject, isUrl, Vue, vuePropertyDecorator) { 'use strict'; + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('is-url'), require('vue'), require('vue-property-decorator')) : + typeof define === 'function' && define.amd ? define(['exports', 'is-url', 'vue', 'vue-property-decorator'], factory) : + (global = global || self, factory(global.Formulario = {}, global.isUrl, global.Vue, global.vuePropertyDecorator)); +}(this, (function (exports, isUrl, Vue, vuePropertyDecorator) { 'use strict'; - isPlainObject = isPlainObject && Object.prototype.hasOwnProperty.call(isPlainObject, 'default') ? isPlainObject['default'] : isPlainObject; isUrl = isUrl && Object.prototype.hasOwnProperty.call(isUrl, 'default') ? isUrl['default'] : isUrl; Vue = Vue && Object.prototype.hasOwnProperty.call(Vue, 'default') ? Vue['default'] : Vue; - /** - * Shorthand for Object.prototype.hasOwnProperty.call (space saving) - */ - function has(ctx, prop) { - return Object.prototype.hasOwnProperty.call(ctx, prop); - } - - /** - * Create a new object by copying properties of base and mergeWith. - * Note: arrays don't overwrite - they push - * - * @param {Object} a - * @param {Object} b - * @param {boolean} concatArrays - */ - function merge(a, b, concatArrays = true) { - const merged = {}; - for (const key in a) { - if (has(b, key)) { - if (isPlainObject(b[key]) && isPlainObject(a[key])) { - merged[key] = merge(a[key], b[key], concatArrays); - } - else if (concatArrays && Array.isArray(a[key]) && Array.isArray(b[key])) { - merged[key] = a[key].concat(b[key]); - } - else { - merged[key] = b[key]; - } - } - else { - merged[key] = a[key]; - } - } - for (const prop in b) { - if (!has(merged, prop)) { - merged[prop] = b[prop]; - } - } - return merged; - } - const registry = new Map(); var id = (prefix) => { const current = registry.get(prefix) || 0; @@ -111,7 +69,7 @@ } return 'InstanceOf<' + constructorOf(value).name + '>'; } - throw new Error(); + throw new Error('[Formulario] typeOf - unknown type detected'); } function isScalar(value) { switch (typeof value) { @@ -152,6 +110,13 @@ return Object.keys(source).reduce((copy, key) => (Object.assign(Object.assign({}, copy), { [key]: clone(source[key]) })), {}); } + /** + * Shorthand for Object.prototype.hasOwnProperty.call (space saving) + */ + function has(ctx, prop) { + return Object.prototype.hasOwnProperty.call(ctx, prop); + } + /*! ***************************************************************************** Copyright (c) Microsoft Corporation. @@ -668,14 +633,11 @@ } }; - /** - * The base formulario library. - */ class Formulario { constructor(options) { this.validationRules = {}; this.validationMessages = {}; - this.registry = new Map(); + this._registry = new Map(); this.validationRules = rules; this.validationMessages = messages; this.extend(options || {}); @@ -685,24 +647,24 @@ */ extend(extendWith) { if (typeof extendWith === 'object') { - this.validationRules = merge(this.validationRules, extendWith.validationRules || {}); - this.validationMessages = merge(this.validationMessages, extendWith.validationMessages || {}); + this.validationRules = Object.assign(Object.assign({}, this.validationRules), (extendWith.validationRules || {})); + this.validationMessages = Object.assign(Object.assign({}, this.validationMessages), (extendWith.validationMessages || {})); return this; } throw new Error(`[Formulario]: Formulario.extend(): should be passed an object (was ${typeof extendWith})`); } runValidation(id) { - if (!this.registry.has(id)) { + if (!this._registry.has(id)) { throw new Error(`[Formulario]: Formulario.runValidation(): no forms with id "${id}"`); } - const form = this.registry.get(id); + const form = this._registry.get(id); return form.runValidation(); } resetValidation(id) { - if (!this.registry.has(id)) { + if (!this._registry.has(id)) { return; } - const form = this.registry.get(id); + const form = this._registry.get(id); form.resetValidation(); } /** @@ -710,18 +672,18 @@ * @internal */ register(id, form) { - if (this.registry.has(id)) { + if (this._registry.has(id)) { throw new Error(`[Formulario]: Formulario.register(): id "${id}" is already in use`); } - this.registry.set(id, form); + this._registry.set(id, form); } /** * Used by forms instances to remove themselves from a registry * @internal */ unregister(id) { - if (this.registry.has(id)) { - this.registry.delete(id); + if (this._registry.has(id)) { + this._registry.delete(id); } } /** @@ -729,18 +691,19 @@ * @internal */ getRules(extendWith = {}) { - return merge(this.validationRules, extendWith); + return Object.assign(Object.assign({}, this.validationRules), extendWith); } /** * Get validation messages by merging any passed in with global messages. * @internal */ getMessages(vm, extendWith) { - const raw = merge(this.validationMessages || {}, extendWith); + const raw = Object.assign(Object.assign({}, this.validationMessages), extendWith); const messages = {}; for (const name in raw) { messages[name] = (context, ...args) => { - return typeof raw[name] === 'string' ? raw[name] : raw[name](vm, context, ...args); + const fn = raw[name]; + return typeof fn === 'string' ? fn : fn(vm, context, ...args); }; } return messages; @@ -891,16 +854,6 @@ }); } - const UNREGISTER_BEHAVIOR = { - NONE: 'none', - UNSET: 'unset', - }; - - const VALIDATION_BEHAVIOR = { - DEMAND: 'demand', - LIVE: 'live', - SUBMIT: 'submit', - }; let FormularioField = class FormularioField extends Vue { constructor() { super(...arguments); @@ -912,9 +865,7 @@ get fullPath() { return this.__Formulario_path !== '' ? `${this.__Formulario_path}.${this.name}` : this.name; } - /** - * Determines if this formulario element is v-modeled or not. - */ + /** Determines if this formulario element is v-modeled or not. */ get hasModel() { return has(this.$options.propsData || {}, 'value'); } @@ -929,55 +880,77 @@ }, 'model', { get: () => this.modelGetConverter(this.proxy), set: (value) => { - this.syncProxy(this.modelSetConverter(value, this.proxy)); + this._syncProxy(this.modelSetConverter(value, this.proxy)); }, }); } - get normalizedValidationRules() { + get _normalizedValidationRules() { const rules = {}; Object.keys(this.validationRules).forEach(key => { rules[snakeToCamel(key)] = this.validationRules[key]; }); return rules; } - get normalizedValidationMessages() { + get _normalizedValidationMessages() { const messages = {}; Object.keys(this.validationMessages).forEach(key => { messages[snakeToCamel(key)] = this.validationMessages[key]; }); return messages; } - onValueChange() { - this.syncProxy(this.value); + _onValueChange() { + this._syncProxy(this.value); } - onProxyChange() { - if (this.validationBehavior === VALIDATION_BEHAVIOR.LIVE) { + _onProxyChange() { + if (this.validationBehavior === 'live') { this.runValidation(); } else { this.resetValidation(); } } - /** - * @internal - */ + /** @internal */ created() { if (typeof this.__FormularioForm_register === 'function') { this.__FormularioForm_register(this.fullPath, this); } - if (this.validationBehavior === VALIDATION_BEHAVIOR.LIVE) { + if (this.validationBehavior === 'live') { this.runValidation(); } } - /** - * @internal - */ + /** @internal */ beforeDestroy() { if (typeof this.__FormularioForm_unregister === 'function') { this.__FormularioForm_unregister(this.fullPath, this.unregisterBehavior); } } - syncProxy(value) { + runValidation() { + this.validationRun = this._validate().then(violations => { + this.violations = violations; + this._emitValidation(this.fullPath, violations); + return this.violations; + }); + return this.validationRun; + } + hasValidationErrors() { + return new Promise(resolve => { + this.$nextTick(() => { + this.validationRun.then(() => resolve(this.violations.length > 0)); + }); + }); + } + /** @internal */ + setErrors(errors) { + if (!this.errorsDisabled) { + this.localErrors = errors; + } + } + /** @internal */ + resetValidation() { + this.localErrors = []; + this.violations = []; + } + _syncProxy(value) { if (!deepEquals(value, this.proxy)) { this.proxy = value; this.$emit('input', value); @@ -987,49 +960,19 @@ } } } - runValidation() { - this.validationRun = this.validate().then(violations => { - this.violations = violations; - this.emitValidation(this.fullPath, violations); - return this.violations; - }); - return this.validationRun; - } - validate() { - return validate(processConstraints(this.validation, this.$formulario.getRules(this.normalizedValidationRules), this.$formulario.getMessages(this, this.normalizedValidationMessages)), { + _validate() { + return validate(processConstraints(this.validation, this.$formulario.getRules(this._normalizedValidationRules), this.$formulario.getMessages(this, this._normalizedValidationMessages)), { value: this.proxy, name: this.fullPath, formValues: this.__FormularioForm_getState(), }); } - emitValidation(path, violations) { + _emitValidation(path, violations) { this.$emit('validation', { path, violations }); if (typeof this.__FormularioForm_emitValidation === 'function') { this.__FormularioForm_emitValidation(path, violations); } } - hasValidationErrors() { - return new Promise(resolve => { - this.$nextTick(() => { - this.validationRun.then(() => resolve(this.violations.length > 0)); - }); - }); - } - /** - * @internal - */ - setErrors(errors) { - if (!this.errorsDisabled) { - this.localErrors = errors; - } - } - /** - * @internal - */ - resetValidation() { - this.localErrors = []; - this.violations = []; - } }; __decorate([ vuePropertyDecorator.Inject({ default: '' }) @@ -1072,8 +1015,8 @@ ], FormularioField.prototype, "validationMessages", void 0); __decorate([ vuePropertyDecorator.Prop({ - default: VALIDATION_BEHAVIOR.DEMAND, - validator: behavior => Object.values(VALIDATION_BEHAVIOR).includes(behavior) + default: 'demand', + validator: (behavior) => ['demand', 'live', 'submit'].includes(behavior) }) ], FormularioField.prototype, "validationBehavior", void 0); __decorate([ @@ -1089,14 +1032,14 @@ vuePropertyDecorator.Prop({ default: 'div' }) ], FormularioField.prototype, "tag", void 0); __decorate([ - vuePropertyDecorator.Prop({ default: UNREGISTER_BEHAVIOR.NONE }) + vuePropertyDecorator.Prop({ default: 'none' }) ], FormularioField.prototype, "unregisterBehavior", void 0); __decorate([ vuePropertyDecorator.Watch('value') - ], FormularioField.prototype, "onValueChange", null); + ], FormularioField.prototype, "_onValueChange", null); __decorate([ vuePropertyDecorator.Watch('proxy') - ], FormularioField.prototype, "onProxyChange", null); + ], FormularioField.prototype, "_onProxyChange", null); FormularioField = __decorate([ vuePropertyDecorator.Component({ name: 'FormularioField', inheritAttrs: false }) ], FormularioField); @@ -1308,7 +1251,7 @@ this.localFormErrors = []; } get fieldsErrorsComputed() { - return merge(this.fieldsErrors || {}, this.localFieldsErrors); + return Object.assign(Object.assign({}, this.fieldsErrors), this.localFieldsErrors); } get formErrorsComputed() { return [...this.formErrors, ...this.localFormErrors]; @@ -1338,7 +1281,7 @@ unregister(path, behavior) { if (this.registry.has(path)) { this.registry.delete(path); - if (behavior === UNREGISTER_BEHAVIOR.UNSET) { + if (behavior === 'unset') { this.proxy = unset(this.proxy, path); this.emitInput(); } @@ -1402,13 +1345,13 @@ return Object.keys(violations).some(path => violations[path].length > 0); }); } - setErrors({ fieldsErrors, formErrors }) { - this.localFieldsErrors = fieldsErrors || {}; + setErrors({ formErrors, fieldsErrors }) { this.localFormErrors = formErrors || []; + this.localFieldsErrors = fieldsErrors || {}; } resetValidation() { - this.localFieldsErrors = {}; this.localFormErrors = []; + this.localFieldsErrors = {}; this.registry.forEach((field) => { field.resetValidation(); }); @@ -1526,10 +1469,6 @@ Vue.component('FormularioField', __vue_component__); Vue.component('FormularioFieldGroup', __vue_component__$1); Vue.component('FormularioForm', __vue_component__$2); - // @deprecated Use FormularioField instead - Vue.component('FormularioInput', __vue_component__); - // @deprecated Use FormularioFieldGroup instead - Vue.component('FormularioGrouping', __vue_component__$1); Vue.mixin({ beforeCreate() { const o = this.$options; @@ -1547,6 +1486,12 @@ }, }; - return index; + exports.Formulario = Formulario; + exports.FormularioField = __vue_component__; + exports.FormularioFieldGroup = __vue_component__$1; + exports.FormularioForm = __vue_component__$2; + exports.default = index; + + Object.defineProperty(exports, '__esModule', { value: true }); }))); diff --git a/package.json b/package.json index f90a49e..5171163 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,9 @@ "vue-class-component": "^7.2.3", "vue-property-decorator": "^8.4.2" }, + "peerDependencies": { + "vue": "^2.6" + }, "bugs": { "url": "https://github.com/retailcrm/vue-formulario/issues" },