@overgaming/valiform 0.4.9 → 0.4.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.js +96 -102
- package/dist/src/components/Form.vue.d.ts +4 -12
- package/dist/src/components/__tests__/components/ExampleForm.vue.d.ts +5 -10
- package/dist/src/components/__tests__/components/ExampleFormWithNestedFields.vue.d.ts +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/types.d.ts +7 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("vue"),T=Symbol("locale-context"),q=(e=null)=>{const t=o.inject(T,e);if(!t&&t!==null)throw new Error("Context with localeContextKey not found");return t},E={required:"This field is required",email:"Please enter a valid email address",min:({value:e})=>`Must be at least ${e}`,max:({value:e})=>`Must be at most ${e}`,matches:"Format is not valid",number:"Must be a valid number",accepted:"Must be accepted",alpha:"Must contain only alphabetical characters",alphanumeric:"Must contain only letters and numbers",alphaSpaces:"Must contain only letters and spaces",between:({min:e,max:t})=>`Must be between ${e} and ${t}`,confirm:({fieldName:e})=>`Must match ${e}`,containsAlpha:"Must contain at least one letter",containsAlphanumeric:"Must contain at least one letter or number",containsAlphaSpaces:"Must contain at least one letter or space",containsLowercase:"Must contain at least one lowercase letter",containsNumeric:"Must contain at least one number",containsSymbol:"Must contain at least one symbol",containsUppercase:"Must contain at least one uppercase letter",dateAfter:({date:e})=>e?`Must be after ${e}`:"Must be after today",dateAfterOrEqual:({date:e})=>e?`Must be after or equal to ${e}`:"Must be after or equal to today",dateBefore:({date:e})=>e?`Must be before ${e}`:"Must be before today",dateBeforeOrEqual:({date:e})=>e?`Must be before or equal to ${e}`:"Must be before or equal to today",dateBetween:({startDate:e,endDate:t})=>`Must be between ${e} and ${t}`,dateFormat:({format:e})=>`Must match the format ${e}`,endsWith:({suffix:e})=>Array.isArray(e)?`Must end with one of: ${e.map(t=>`"${t}"`).join(", ")}`:`Must end with "${e}"`,is:({allowedValues:e})=>`Must be one of: ${Array.isArray(e)?e.join(", "):e}`,length:({value:e,min:t,max:n})=>t!==void 0&&n!==void 0?`Must be between ${t} and ${n} characters`:e!==void 0?`Must be exactly ${e} characters`:"Invalid length",lowercase:"Must contain only lowercase characters",not:({disallowedValues:e})=>`Must not be one of: ${Array.isArray(e)?e.join(", "):e}`,startsWith:({prefix:e})=>Array.isArray(e)?`Must start with one of: ${e.join(", ")}`:`Must start with "${e}"`,symbol:"Must contain only symbols",uppercase:"Must contain only uppercase characters",url:"Must be a valid URL"},R=o.shallowRef(new Map),B=(e,t)=>{R.value.set(e,t)},D=e=>{Object.entries(e).forEach(([t,n])=>{B(t,n)})},_=e=>R.value.get(e);function z(e){const t=e.accepted;return typeof t=="function"?t({}):t??"Must be accepted"}function U(e){return e?["yes","on","1","true"].includes(String(e).toLowerCase()):!1}function k(e,t={}){const{messages:n={}}=t;return U(e)?!0:z(n)}function K(e){const t=e.alpha;return typeof t=="function"?t({}):t??"Must contain only alphabetical characters"}function Z(e){return e?/^[a-zA-Z]+$/.test(String(e)):!0}function Y(e,t={}){const{messages:n={}}=t;return Z(e)?!0:K(n)}function G(e){const t=e.alphanumeric;return typeof t=="function"?t({}):t??"Must contain only letters and numbers"}function H(e){return e?/^[a-zA-Z0-9]+$/.test(String(e)):!0}function J(e,t={}){const{messages:n={}}=t;return H(e)?!0:G(n)}function Q(e){const t=e.alphaSpaces;return typeof t=="function"?t({}):t??"Must contain only letters and spaces"}function X(e){return e?/^[a-zA-Z\s]+$/.test(String(e)):!0}function ee(e,t={}){const{messages:n={}}=t;return X(e)?!0:Q(n)}function te(e,t,n){const r=e.between;return typeof r=="function"?r({min:t,max:n}):r??`Must be between ${t} and ${n}`}function ne(e,t,n){if(!e&&e!==0)return!0;const r=Number(e);if(isNaN(r))return!1;const s=Number(t),a=Number(n);return isNaN(s)||isNaN(a)?!1:r>=s&&r<=a}function re(e,t={}){const{args:n=[],messages:r={}}=t,[s,a]=n;return ne(e,s,a)?!0:te(r,s,a)}function se(e,t){const n=e.confirm;return typeof n=="function"?n({fieldName:t}):n??`Must match ${t}`}function oe(e,t,n){var r;return e?n?e===((r=n[t])==null?void 0:r.value):!1:!0}function ae(e,t={}){const{args:n=[],messages:r={},fields:s={}}=t,[a]=n;return oe(e,a,s)?!0:se(r,a)}function ue(e){const t=e.containsAlpha;return typeof t=="function"?t({}):t??"Must contain at least one letter"}function ie(e){return e?/[a-zA-Z]/.test(String(e)):!0}function ce(e,t={}){const{messages:n={}}=t;return ie(e)?!0:ue(n)}function le(e){const t=e.containsAlphanumeric;return typeof t=="function"?t({}):t??"Must contain at least one letter or number"}function fe(e){return e?/[a-zA-Z0-9]/.test(String(e)):!0}function me(e,t={}){const{messages:n={}}=t;return fe(e)?!0:le(n)}function de(e){const t=e.containsAlphaSpaces;return typeof t=="function"?t({}):t??"Must contain at least one letter or space"}function ge(e){return e?/[a-zA-Z\s]/.test(String(e)):!0}function pe(e,t={}){const{messages:n={}}=t;return ge(e)?!0:de(n)}function be(e){const t=e.containsLowercase;return typeof t=="function"?t({}):t??"Must contain at least one lowercase letter"}function ye(e){return e?/[a-z]/.test(String(e)):!0}function $e(e,t={}){const{messages:n={}}=t;return ye(e)?!0:be(n)}function he(e){const t=e.containsNumeric;return typeof t=="function"?t({}):t??"Must contain at least one number"}function ve(e){return e?/\d/.test(String(e)):!0}function Me(e,t={}){const{messages:n={}}=t;return ve(e)?!0:he(n)}function Ne(e){const t=e.containsSymbol;return typeof t=="function"?t({}):t??"Must contain at least one symbol"}function we(e){return e?/[^\w\s]/.test(String(e)):!0}function Ae(e,t={}){const{messages:n={}}=t;return we(e)?!0:Ne(n)}function De(e){const t=e.containsUppercase;return typeof t=="function"?t({}):t??"Must contain at least one uppercase letter"}function Se(e){return e?/[A-Z]/.test(String(e)):!0}function Fe(e,t={}){const{messages:n={}}=t;return Se(e)?!0:De(n)}function Ve(e,t){const n=e.dateAfter;return typeof n=="function"?n({date:t}):n??(t?`Must be after ${t}`:"Must be after today")}function xe(e,t){if(!e)return!0;const n=new Date(String(e)),r=t?new Date(t):new Date;return!isNaN(n.getTime())&&!isNaN(r.getTime())&&n>r}function je(e,t={}){const{args:n=[],messages:r={}}=t,[s]=n;return xe(e,s)?!0:Ve(r,s)}function Pe(e,t){const n=e.dateAfterOrEqual;return typeof n=="function"?n({date:t}):n??(t?`Must be after or equal to ${t}`:"Must be after or equal to today")}function Ce(e,t){if(!e)return!0;const n=new Date(String(e)),r=t?new Date(t):new Date;return!isNaN(n.getTime())&&!isNaN(r.getTime())&&n>=r}function Te(e,t={}){const{args:n=[],messages:r={}}=t,[s]=n;return Ce(e,s)?!0:Pe(r,s)}function qe(e,t){const n=e.dateBefore;return typeof n=="function"?n({date:t}):n??(t?`Must be before ${t}`:"Must be before today")}function Ee(e,t){if(!e)return!0;const n=new Date(String(e)),r=t?new Date(t):new Date;return!isNaN(n.getTime())&&!isNaN(r.getTime())&&n<r}function Re(e,t={}){const{args:n=[],messages:r={}}=t,[s]=n;return Ee(e,s)?!0:qe(r,s)}function Be(e,t){const n=e.dateBeforeOrEqual;return typeof n=="function"?n({date:t}):n??(t?`Must be before or equal to ${t}`:"Must be before or equal to today")}function Oe(e,t){if(!e)return!0;const n=new Date(String(e)),r=t?new Date(t):new Date;return!isNaN(n.getTime())&&!isNaN(r.getTime())&&n<=r}function Ie(e,t={}){const{args:n=[],messages:r={}}=t,[s]=n;return Oe(e,s)?!0:Be(r,s)}function Le(e,t,n){const r=e.dateBetween;return typeof r=="function"?r({startDate:t,endDate:n}):r??`Must be between ${t} and ${n}`}function We(e,t,n){if(!e)return!0;const r=new Date(String(e)),s=new Date(t),a=new Date(n);return!isNaN(r.getTime())&&!isNaN(s.getTime())&&!isNaN(a.getTime())&&r>=s&&r<=a}function _e(e,t={}){const{args:n=[],messages:r={}}=t,[s,a]=n;return We(e,s,a)?!0:Le(r,s,a)}const ze=e=>{const t=e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"),n={YYYY:"\\d{4}",YY:"\\d{2}",MM:"(0[1-9]|1[012])",M:"([1-9]|1[012])",DD:"([012][0-9]|3[01])",D:"([012]?[0-9]|3[01])"};let r=t;return Object.keys(n).forEach(s=>{r=r.replace(new RegExp(s,"g"),n[s])}),new RegExp(`^${r}$`)};function Ue(e,t){const n=e.dateFormat;return typeof n=="function"?n({format:t}):n??`Must match the format ${t}`}function ke(e,t){return e?t&&typeof t=="string"?ze(t).test(String(e)):!isNaN(Date.parse(String(e))):!0}function Ke(e,t={}){const{args:n=[],messages:r={}}=t,[s]=n;return ke(e,s)?!0:Ue(r,s)}function Ze(e){const t=e.email;return typeof t=="function"?t({}):t??"Please enter a valid email address"}function Ye(e){return e?/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(String(e)):!0}function Ge(e,t={}){const{messages:n={}}=t;return Ye(e)?!0:Ze(n)}function He(e,t){const n=e.endsWith;return typeof n=="function"?n({suffix:t.length===1?t[0]:t}):n??`Must end with: ${t.join(", ")}`}function Je(e,...t){if(!e)return!0;const n=String(e);return t.some(r=>n.endsWith(r))}function Qe(e,t={}){const{args:n=[],messages:r={}}=t;return Je(e,...n)?!0:He(r,n)}function Xe(e,t){const n=e.is;return typeof n=="function"?n({allowedValues:t}):n??`Must be one of: ${t.join(", ")}`}function et(e,...t){return!e&&e!==0&&e!==!1?!0:t.includes(String(e))}function tt(e,t={}){const{args:n=[],messages:r={}}=t;return et(e,...n)?!0:Xe(r,n)}function nt(e,t,n){const r=e.length;return n!==void 0?typeof r=="function"?r({min:t,max:n}):r??`Must be between ${t} and ${n} characters`:typeof r=="function"?r({value:t}):r??`Must be exactly ${t} characters`}function rt(e,t,n){if(!e&&e!==0)return!0;let r=0;if(typeof e=="string")r=e.length;else if(Array.isArray(e))r=e.length;else if(typeof e=="object"&&e!==null)r=Object.keys(e).length;else return!1;if(n!==void 0){const a=Number(t),u=Number(n);return!isNaN(a)&&!isNaN(u)&&r>=a&&r<=u}const s=Number(t);return!isNaN(s)&&r===s}function st(e,t={}){const{args:n=[],messages:r={}}=t,[s,a]=n;return rt(e,s,a)?!0:nt(r,s,a)}function ot(e){const t=e.lowercase;return typeof t=="function"?t({}):t??"Must contain only lowercase characters"}function at(e){return e?/^[a-z]+$/.test(String(e)):!0}function ut(e,t={}){const{messages:n={}}=t;return at(e)?!0:ot(n)}function it(e,t,n){const r=t.matches;return typeof r=="function"?r({value:e,pattern:n}):r??"Format is not valid"}function ct(e,t){if(!e)return!0;if(!t)return!1;try{if(t.startsWith("/")&&t.includes("/",1)){const n=t.lastIndexOf("/"),r=t.slice(1,n),s=t.slice(n+1);return new RegExp(r,s).test(String(e))}return String(e)===t}catch{return!1}}function lt(e,t={}){const{args:n=[],messages:r={}}=t,[s]=n;return ct(e,s)?!0:it(e,r,s)}function ft(e,t){const n=e.max;return typeof n=="function"?n({value:t}):n??`Must be at most ${t}`}function mt(e,t){if(!e&&e!==0)return!0;const n=Number(t);if(isNaN(n))return!1;if(typeof e=="number")return e<=n;if(typeof e=="string"){const r=Number(e);return isNaN(r)?e.length<=n:r<=n}return Array.isArray(e)?e.length<=n:!1}function dt(e,t={}){const{args:n=[],messages:r={}}=t,[s]=n;return mt(e,s)?!0:ft(r,s)}function gt(e,t){const n=e.min;return typeof n=="function"?n({value:t}):n??`Must be at least ${t}`}function pt(e,t){if(!e&&e!==0)return!0;const n=Number(t);if(isNaN(n))return!1;if(typeof e=="number")return e>=n;if(typeof e=="string"){const r=Number(e);return isNaN(r)?e.length>=n:r>=n}return Array.isArray(e)?e.length>=n:!1}function bt(e,t={}){const{args:n=[],messages:r={}}=t,[s]=n;return pt(e,s)?!0:gt(r,s)}function yt(e,t){const n=e.not;return typeof n=="function"?n({disallowedValues:t}):n??`Must not be one of: ${t.join(", ")}`}function $t(e,...t){return!e&&e!==0&&e!==!1?!0:!t.includes(String(e))}function ht(e,t={}){const{args:n=[],messages:r={}}=t;return $t(e,...n)?!0:yt(r,n)}function vt(e){const t=e.number;return typeof t=="function"?t({}):t??"Must be a valid number"}function Mt(e){if(e==null||e==="")return!0;if(Number.isNaN(e))return!1;const t=Number(e);return!isNaN(t)&&isFinite(t)}function Nt(e,t={}){const{messages:n={}}=t;return Mt(e)?!0:vt(n)}function wt(e){const t=e.required;return typeof t=="function"?t({}):t??"This field is required"}function At(e){return e==null||e===""?!1:typeof e=="string"?e.trim().length>0:Array.isArray(e)?e.length>0:typeof e=="object"?Object.keys(e).length>0:e===0?!0:!!e}function Dt(e,t={}){const{messages:n={}}=t;return At(e)?!0:wt(n)}function St(e,t){const n=e.startsWith;return typeof n=="function"?n({prefix:t.length===1?t[0]:t}):n??`Must start with: ${t.join(", ")}`}function Ft(e,...t){if(!e)return!0;const n=String(e);return t.some(r=>n.startsWith(r))}function Vt(e,t={}){const{args:n=[],messages:r={}}=t;return Ft(e,...n)?!0:St(r,n)}function xt(e){const t=e.symbol;return typeof t=="function"?t({}):t??"Must contain only symbols"}function jt(e){return e?/^[^\w\s]+$/.test(String(e)):!0}function Pt(e,t={}){const{messages:n={}}=t;return jt(e)?!0:xt(n)}function Ct(e){const t=e.uppercase;return typeof t=="function"?t({}):t??"Must contain only uppercase characters"}function Tt(e){return e?/^[A-Z]+$/.test(String(e)):!0}function qt(e,t={}){const{messages:n={}}=t;return Tt(e)?!0:Ct(n)}function Et(e){const t=e.url;return typeof t=="function"?t({}):t??"Must be a valid URL"}function Rt(e){if(!e)return!0;try{const t=new URL(String(e));return["http:","https:","ftp:","ftps:"].includes(t.protocol)}catch{return!1}}function Bt(e,t={}){const{messages:n={}}=t;return Rt(e)?!0:Et(n)}const Ot=Object.freeze(Object.defineProperty({__proto__:null,accepted:k,alpha:Y,alphaSpaces:ee,alphanumeric:J,between:re,confirm:ae,containsAlpha:ce,containsAlphaSpaces:pe,containsAlphanumeric:me,containsLowercase:$e,containsNumeric:Me,containsSymbol:Ae,containsUppercase:Fe,dateAfter:je,dateAfterOrEqual:Te,dateBefore:Re,dateBeforeOrEqual:Ie,dateBetween:_e,dateFormat:Ke,email:Ge,endsWith:Qe,is:tt,length:st,lowercase:ut,matches:lt,max:dt,min:bt,not:ht,number:Nt,required:Dt,startsWith:Vt,symbol:Pt,uppercase:qt,url:Bt},Symbol.toStringTag,{value:"Module"})),It={install(e,t={}){D(Ot),t.rules&&D(t.rules);const n=o.isRef(t.locale)?t.locale:o.ref(t.locale??"en"),r={en:E};t.locales&&Object.keys(t.locales).forEach(a=>{r[a]={...r[a]??{},...t.locales[a]}});const s=o.shallowRef(r);e.provide(T,{locale:o.readonly(n),locales:o.readonly(s),setLocale:a=>{s.value[a]?n.value=a:console.warn(`Locale "${a}" not available.`)}})}},O=Symbol("form-state-context"),Lt=e=>{o.provide(O,e)},Wt=(e=null)=>{const t=o.inject(O,e);if(!t&&t!==null)throw new Error("Context with formStateContextKey not found");return t},I=Symbol("form-context"),_t=e=>{o.provide(I,e)},zt=(e=null)=>{const t=o.inject(I,e);if(!t&&t!==null)throw new Error("Context with formContextKey not found");return t};function Ut(e,t){if(!(!e||!t))return t.split(".").reduce((n,r)=>n==null?void 0:n[r],e)}function kt(e,t,n){if(!e||!t)return e;const r=t.split("."),s=r.pop(),a=r.reduce((u,l,c)=>{if(u[l]===null||u[l]===void 0){const g=r[c+1]||s;u[l]=/^\d+$/.test(g)?[]:{}}return u[l]},e);return a[s]=n,e}const Kt=o.defineComponent({__name:"Form",props:{modelValue:{default:()=>({})},modelModifiers:{}},emits:o.mergeModels(["submit"],["update:modelValue"]),setup(e,{emit:t}){const n=t,r=o.useModel(e,"modelValue");o.isReactive(r.value)||(r.value=o.reactive(r.value??{}));const s=o.ref({}),a=o.ref([]),u=o.computed(()=>r.value),l=o.computed(()=>a.value[0]??null),c=o.computed(()=>Object.keys(s.value).every(i=>s.value[i].isValid)),g=()=>{Object.keys(s.value).forEach(i=>{var b,p;(p=(b=s.value[i]).validate)==null||p.call(b)})},f=()=>{g(),c.value&&(a.value=[],n("submit",r.value,{setErrors:m,reset:d}))},m=(...i)=>{var b;if(i.length===1){const p=i[0];if(typeof p=="object"&&!Array.isArray(p)&&p!==null){Object.keys(p).forEach($=>{m($,p[$])});return}a.value=Array.isArray(p)?p:[p]}else if(i.length===2){const[p,$]=i;(b=s.value[p])==null||b.setErrors($)}},d=()=>{a.value=[],Object.keys(s.value).forEach(i=>{s.value[i].reset()})};return Lt({getFields(){return s.value},getField(i){return s.value[i]},addField(i,b){s.value[i]=b},removeField(i){delete s.value[i]},setFieldValue(i,b){kt(r.value,i,b)},getFieldValue(i){return Ut(r.value,i)}}),_t({values:u,isValid:c,error:l,errors:a,fields:s,reset:d,setErrors:m,validate:g}),(i,b)=>(o.openBlock(),o.createElementBlock("form",{onSubmit:o.withModifiers(f,["prevent"])},[o.renderSlot(i.$slots,"default",o.normalizeProps(o.guardReactiveProps({isValid:c.value,error:l.value,errors:a.value,values:u.value,fields:s.value,reset:d,setErrors:m,validate:g})))],32))}});function L(e){if(!e||typeof e!="string")return{};const t=e.split("|").filter(Boolean),n={};for(const r of t){const[s,...a]=r.split(":"),u=s.trim();if(a.length===0)n[u]=!0;else{const c=a.join(":").split(",").map(g=>g.trim());n[u]=c.length===1?c[0]:c}}return n}const Zt=(e,t,n={},r={})=>{if(!t)return!0;const s=L(t),a=[];for(const[u,l]of Object.entries(s)){const c=_(u);if(c){const f={args:l===!0?[]:Array.isArray(l)?l:[l],messages:n,fields:r},m=c(e,f);m!==!0&&a.push(m??"Invalid value")}else console.warn(`[Forms] Validation rule "${u}" not found.`)}return a.length===0?!0:a},Yt=(e,t)=>{const n=t(e);return n===!0?!0:typeof n=="string"?[n]:Array.isArray(n)?n:!!n?!0:["Invalid value"]};typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const P=()=>{};function Gt(e,t){function n(...r){return new Promise((s,a)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(s).catch(a)})}return n}const Ht=e=>e();function Jt(e,t={}){let n,r,s=P;const a=c=>{clearTimeout(c),s(),s=P};let u;return c=>{const g=o.toValue(e),f=o.toValue(t.maxWait);return n&&a(n),g<=0||f!==void 0&&f<=0?(r&&(a(r),r=void 0),Promise.resolve(c())):new Promise((m,d)=>{s=t.rejectOnCancel?d:m,u=c,f&&!r&&(r=setTimeout(()=>{n&&a(n),r=void 0,m(u())},f)),n=setTimeout(()=>{r&&a(r),r=void 0,m(c())},g)})}}function Qt(e,t,n={}){const{eventFilter:r=Ht,...s}=n;return o.watch(e,Gt(r,t),s)}function C(e,t,n={}){const{debounce:r=0,maxWait:s=void 0,...a}=n;return Qt(e,t,{...a,eventFilter:Jt(r,{maxWait:s})})}function Xt(e,t={}){const n=o.ref(!0),r=o.ref(!1),s=o.ref([]),a=o.ref(null),u=o.computed(()=>o.toValue(t.rules)??null),l=o.computed(()=>o.toValue(t.messages)??{}),c=o.computed(()=>o.toValue(t.fields)??{}),g=o.computed(()=>{if(!u.value||typeof u.value!="string")return null;const i=L(u.value).confirm;if(!i||i===!0)return null;const b=c.value[i];return(b==null?void 0:b.value)??null}),f=()=>{let d;return typeof u.value=="function"?d=Yt(o.toValue(e),u.value):d=Zt(o.toValue(e),u.value,l.value,c.value),d===!0?(n.value=!0,s.value=[],!0):Array.isArray(d)?(n.value=!1,s.value=d,!1):d},m=()=>{a.value&&clearTimeout(a.value),r.value=!0,n.value=!0,s.value=[],a.value=setTimeout(()=>{r.value=!1,a.value=null},1e3)};return C(()=>o.toValue(e),()=>{r.value||f()},{debounce:300}),C(()=>o.toValue(g),()=>{r.value||o.toValue(e)&&f()},{debounce:300}),{validate:f,reset:m,isValid:o.readonly(n),errors:o.readonly(s)}}const M=Symbol("field-context"),en=e=>{o.provide(M,e)};function tn(e){if(e===void 0){const t=o.inject(M);if(!t)throw new Error("useFieldContext() must be called inside a Field component");return t}return o.inject(M,e)}const nn=o.defineComponent({__name:"Field",props:o.mergeModels({id:{},name:{},validation:{type:[String,Function,null]},validationMessages:{},error:{}},{modelValue:{},modelModifiers:{}}),emits:["update:modelValue"],setup(e){const t=e,n=o.useModel(e,"modelValue"),r=o.useId(),s=Wt(),a=q(),u=o.computed({get:()=>s?s.getFieldValue(t.name):n.value,set:y=>{s?s.setFieldValue(t.name,y):n.value=y}}),l=o.computed(()=>t.validation??null),c=o.computed(()=>({...a?a.locales.value[a.locale.value]:{},...t.validationMessages??{}})),g=o.computed({get:()=>s?s.getFields():{},set:()=>{}}),f=Xt(u,{rules:l,messages:c,fields:g}),m=o.ref(!1),d=o.ref(!1),i=o.ref([]),b=o.computed(()=>u.value??null),p=o.computed(()=>f.isValid.value&&i.value.length===0),$=o.computed(()=>[...f.errors.value,...i.value]),h=o.computed(()=>$.value[0]??null),S=o.toValue(u),v=t.id??r,N=`${v}-error`,w=`${v}-help`,W=y=>{i.value=Array.isArray(y)?y:[y]},A=()=>{u.value=S,m.value=!1,d.value=!1,i.value=[],f.reset()};o.watch(()=>t.error,y=>{y?i.value=Array.isArray(y)?y:[y]:i.value=[]},{immediate:!0});const F=o.computed(()=>({id:v,name:t.name,modelValue:u.value,"aria-invalid":!!h.value,"aria-describedby":h.value?`${N} ${w}`:w,"aria-errormessage":h.value?N:void 0,"onUpdate:modelValue":y=>{u.value=y,!d.value&&y!==S&&(d.value=!0)},onBlur:()=>{m.value||(m.value=!0,f.validate())}})),V={for:v},x={id:N,role:"alert","aria-live":"polite"},j={id:w};return o.onMounted(()=>{s&&s.addField(t.name,{value:b,isValid:p,isTouched:m,isDirty:d,error:h,errors:$,setErrors:W,reset:A,validate:f.validate})}),o.onUnmounted(()=>{s&&s.removeField(t.name)}),en({inputValue:u,inputProps:F,labelProps:V,helpProps:j,errorProps:x,isValid:p,isTouched:m,isDirty:d,error:h,errors:$,validate:f.validate,reset:A}),(y,un)=>(o.openBlock(),o.createElementBlock("div",null,[o.renderSlot(y.$slots,"default",o.normalizeProps(o.guardReactiveProps({inputValue:u.value,inputProps:F.value,labelProps:V,helpProps:j,errorProps:x,isValid:p.value,isTouched:m.value,isDirty:d.value,error:h.value,errors:$.value,validate:o.unref(f).validate,reset:A})))]))}});function rn(){const e=q();if(!e)throw new Error("[Valiform] useLocale() must be used inside a component with FormsPlugin installed.");return{locale:e.locale,locales:e.locales,setLocale:e.setLocale}}function sn(e){const t=o.inject(M,null);if(t)return t;const n=o.toValue(e),r=o.useId(),s=`${r}-error`,a=`${r}-help`,u=o.ref(!1),l=o.ref(!1),c=o.computed(()=>({id:r,name:r,modelValue:e.value,"aria-invalid":!1,"aria-describedby":a,"aria-errormessage":void 0,"onUpdate:modelValue":g=>{e.value=g,!l.value&&g!==n&&(l.value=!0)},onBlur:()=>{u.value||(u.value=!0)}}));return{inputValue:e,inputProps:c,labelProps:{for:r},helpProps:{id:a},errorProps:{id:s,role:"alert","aria-live":"polite"},isValid:o.computed(()=>!0),isTouched:u,isDirty:l,error:o.computed(()=>null),errors:o.computed(()=>[]),validate:()=>!0,reset:()=>{e.value=n,u.value=!1,l.value=!1}}}function on(e){return e}const an={required:"Este campo es obligatorio",email:"Por favor ingresa un email válido",min:({value:e})=>`Debe ser al menos ${e}`,max:({value:e})=>`Debe ser como máximo ${e}`,matches:"El formato no es válido",number:"Debe ser un número válido",accepted:"Debe ser aceptado",alpha:"Debe contener solo caracteres alfabéticos",alphanumeric:"Debe contener solo letras y números",alphaSpaces:"Debe contener solo letras y espacios",between:({min:e,max:t})=>`Debe estar entre ${e} y ${t}`,confirm:({fieldName:e})=>`Debe coincidir con ${e}`,containsAlpha:"Debe contener al menos una letra",containsAlphanumeric:"Debe contener al menos una letra o número",containsAlphaSpaces:"Debe contener al menos una letra o espacio",containsLowercase:"Debe contener al menos una letra minúscula",containsNumeric:"Debe contener al menos un número",containsSymbol:"Debe contener al menos un símbolo",containsUppercase:"Debe contener al menos una letra mayúscula",dateAfter:({date:e})=>e?`Debe ser posterior a ${e}`:"Debe ser posterior a hoy",dateAfterOrEqual:({date:e})=>e?`Debe ser posterior o igual a ${e}`:"Debe ser posterior o igual a hoy",dateBefore:({date:e})=>e?`Debe ser anterior a ${e}`:"Debe ser anterior a hoy",dateBeforeOrEqual:({date:e})=>e?`Debe ser anterior o igual a ${e}`:"Debe ser anterior o igual a hoy",dateBetween:({startDate:e,endDate:t})=>`Debe estar entre ${e} y ${t}`,dateFormat:({format:e})=>`Debe coincidir con el formato ${e}`,endsWith:({suffix:e})=>Array.isArray(e)?`Debe terminar con uno de: ${e.map(t=>`"${t}"`).join(", ")}`:`Debe terminar con "${e}"`,is:({allowedValues:e})=>`Debe ser uno de: ${Array.isArray(e)?e.join(", "):e}`,length:({value:e,min:t,max:n})=>t!==void 0&&n!==void 0?`Debe tener entre ${t} y ${n} caracteres`:e!==void 0?`Debe tener exactamente ${e} caracteres`:"Longitud inválida",lowercase:"Debe contener solo caracteres en minúscula",not:({disallowedValues:e})=>`No debe ser uno de: ${Array.isArray(e)?e.join(", "):e}`,startsWith:({prefix:e})=>Array.isArray(e)?`Debe comenzar con uno de: ${e.join(", ")}`:`Debe comenzar con "${e}"`,symbol:"Debe contener solo símbolos",uppercase:"Debe contener solo caracteres en mayúscula",url:"Debe ser una URL válida"};exports.Field=nn;exports.Form=Kt;exports.FormsPlugin=It;exports.defineValiformConfig=on;exports.en=E;exports.es=an;exports.registerRule=B;exports.registerRules=D;exports.useFieldContext=tn;exports.useFormContext=zt;exports.useInputContext=sn;exports.useLocale=rn;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("vue"),T=Symbol("locale-context"),q=(e=null)=>{const t=o.inject(T,e);if(!t&&t!==null)throw new Error("Context with localeContextKey not found");return t},E={required:"This field is required",email:"Please enter a valid email address",min:({value:e})=>`Must be at least ${e}`,max:({value:e})=>`Must be at most ${e}`,matches:"Format is not valid",number:"Must be a valid number",accepted:"Must be accepted",alpha:"Must contain only alphabetical characters",alphanumeric:"Must contain only letters and numbers",alphaSpaces:"Must contain only letters and spaces",between:({min:e,max:t})=>`Must be between ${e} and ${t}`,confirm:({fieldName:e})=>`Must match ${e}`,containsAlpha:"Must contain at least one letter",containsAlphanumeric:"Must contain at least one letter or number",containsAlphaSpaces:"Must contain at least one letter or space",containsLowercase:"Must contain at least one lowercase letter",containsNumeric:"Must contain at least one number",containsSymbol:"Must contain at least one symbol",containsUppercase:"Must contain at least one uppercase letter",dateAfter:({date:e})=>e?`Must be after ${e}`:"Must be after today",dateAfterOrEqual:({date:e})=>e?`Must be after or equal to ${e}`:"Must be after or equal to today",dateBefore:({date:e})=>e?`Must be before ${e}`:"Must be before today",dateBeforeOrEqual:({date:e})=>e?`Must be before or equal to ${e}`:"Must be before or equal to today",dateBetween:({startDate:e,endDate:t})=>`Must be between ${e} and ${t}`,dateFormat:({format:e})=>`Must match the format ${e}`,endsWith:({suffix:e})=>Array.isArray(e)?`Must end with one of: ${e.map(t=>`"${t}"`).join(", ")}`:`Must end with "${e}"`,is:({allowedValues:e})=>`Must be one of: ${Array.isArray(e)?e.join(", "):e}`,length:({value:e,min:t,max:n})=>t!==void 0&&n!==void 0?`Must be between ${t} and ${n} characters`:e!==void 0?`Must be exactly ${e} characters`:"Invalid length",lowercase:"Must contain only lowercase characters",not:({disallowedValues:e})=>`Must not be one of: ${Array.isArray(e)?e.join(", "):e}`,startsWith:({prefix:e})=>Array.isArray(e)?`Must start with one of: ${e.join(", ")}`:`Must start with "${e}"`,symbol:"Must contain only symbols",uppercase:"Must contain only uppercase characters",url:"Must be a valid URL"},R=o.shallowRef(new Map),B=(e,t)=>{R.value.set(e,t)},D=e=>{Object.entries(e).forEach(([t,n])=>{B(t,n)})},_=e=>R.value.get(e);function z(e){const t=e.accepted;return typeof t=="function"?t({}):t??"Must be accepted"}function U(e){return e?["yes","on","1","true"].includes(String(e).toLowerCase()):!1}function k(e,t={}){const{messages:n={}}=t;return U(e)?!0:z(n)}function K(e){const t=e.alpha;return typeof t=="function"?t({}):t??"Must contain only alphabetical characters"}function Z(e){return e?/^[a-zA-Z]+$/.test(String(e)):!0}function Y(e,t={}){const{messages:n={}}=t;return Z(e)?!0:K(n)}function G(e){const t=e.alphanumeric;return typeof t=="function"?t({}):t??"Must contain only letters and numbers"}function H(e){return e?/^[a-zA-Z0-9]+$/.test(String(e)):!0}function J(e,t={}){const{messages:n={}}=t;return H(e)?!0:G(n)}function Q(e){const t=e.alphaSpaces;return typeof t=="function"?t({}):t??"Must contain only letters and spaces"}function X(e){return e?/^[a-zA-Z\s]+$/.test(String(e)):!0}function ee(e,t={}){const{messages:n={}}=t;return X(e)?!0:Q(n)}function te(e,t,n){const r=e.between;return typeof r=="function"?r({min:t,max:n}):r??`Must be between ${t} and ${n}`}function ne(e,t,n){if(!e&&e!==0)return!0;const r=Number(e);if(isNaN(r))return!1;const s=Number(t),a=Number(n);return isNaN(s)||isNaN(a)?!1:r>=s&&r<=a}function re(e,t={}){const{args:n=[],messages:r={}}=t,[s,a]=n;return ne(e,s,a)?!0:te(r,s,a)}function se(e,t){const n=e.confirm;return typeof n=="function"?n({fieldName:t}):n??`Must match ${t}`}function oe(e,t,n){var r;return e?n?e===((r=n[t])==null?void 0:r.value):!1:!0}function ae(e,t={}){const{args:n=[],messages:r={},fields:s={}}=t,[a]=n;return oe(e,a,s)?!0:se(r,a)}function ue(e){const t=e.containsAlpha;return typeof t=="function"?t({}):t??"Must contain at least one letter"}function ie(e){return e?/[a-zA-Z]/.test(String(e)):!0}function ce(e,t={}){const{messages:n={}}=t;return ie(e)?!0:ue(n)}function le(e){const t=e.containsAlphanumeric;return typeof t=="function"?t({}):t??"Must contain at least one letter or number"}function fe(e){return e?/[a-zA-Z0-9]/.test(String(e)):!0}function me(e,t={}){const{messages:n={}}=t;return fe(e)?!0:le(n)}function de(e){const t=e.containsAlphaSpaces;return typeof t=="function"?t({}):t??"Must contain at least one letter or space"}function ge(e){return e?/[a-zA-Z\s]/.test(String(e)):!0}function pe(e,t={}){const{messages:n={}}=t;return ge(e)?!0:de(n)}function be(e){const t=e.containsLowercase;return typeof t=="function"?t({}):t??"Must contain at least one lowercase letter"}function ye(e){return e?/[a-z]/.test(String(e)):!0}function $e(e,t={}){const{messages:n={}}=t;return ye(e)?!0:be(n)}function ve(e){const t=e.containsNumeric;return typeof t=="function"?t({}):t??"Must contain at least one number"}function he(e){return e?/\d/.test(String(e)):!0}function Me(e,t={}){const{messages:n={}}=t;return he(e)?!0:ve(n)}function we(e){const t=e.containsSymbol;return typeof t=="function"?t({}):t??"Must contain at least one symbol"}function Ne(e){return e?/[^\w\s]/.test(String(e)):!0}function Ae(e,t={}){const{messages:n={}}=t;return Ne(e)?!0:we(n)}function De(e){const t=e.containsUppercase;return typeof t=="function"?t({}):t??"Must contain at least one uppercase letter"}function Se(e){return e?/[A-Z]/.test(String(e)):!0}function Fe(e,t={}){const{messages:n={}}=t;return Se(e)?!0:De(n)}function Ve(e,t){const n=e.dateAfter;return typeof n=="function"?n({date:t}):n??(t?`Must be after ${t}`:"Must be after today")}function xe(e,t){if(!e)return!0;const n=new Date(String(e)),r=t?new Date(t):new Date;return!isNaN(n.getTime())&&!isNaN(r.getTime())&&n>r}function je(e,t={}){const{args:n=[],messages:r={}}=t,[s]=n;return xe(e,s)?!0:Ve(r,s)}function Pe(e,t){const n=e.dateAfterOrEqual;return typeof n=="function"?n({date:t}):n??(t?`Must be after or equal to ${t}`:"Must be after or equal to today")}function Ce(e,t){if(!e)return!0;const n=new Date(String(e)),r=t?new Date(t):new Date;return!isNaN(n.getTime())&&!isNaN(r.getTime())&&n>=r}function Te(e,t={}){const{args:n=[],messages:r={}}=t,[s]=n;return Ce(e,s)?!0:Pe(r,s)}function qe(e,t){const n=e.dateBefore;return typeof n=="function"?n({date:t}):n??(t?`Must be before ${t}`:"Must be before today")}function Ee(e,t){if(!e)return!0;const n=new Date(String(e)),r=t?new Date(t):new Date;return!isNaN(n.getTime())&&!isNaN(r.getTime())&&n<r}function Re(e,t={}){const{args:n=[],messages:r={}}=t,[s]=n;return Ee(e,s)?!0:qe(r,s)}function Be(e,t){const n=e.dateBeforeOrEqual;return typeof n=="function"?n({date:t}):n??(t?`Must be before or equal to ${t}`:"Must be before or equal to today")}function Oe(e,t){if(!e)return!0;const n=new Date(String(e)),r=t?new Date(t):new Date;return!isNaN(n.getTime())&&!isNaN(r.getTime())&&n<=r}function Le(e,t={}){const{args:n=[],messages:r={}}=t,[s]=n;return Oe(e,s)?!0:Be(r,s)}function We(e,t,n){const r=e.dateBetween;return typeof r=="function"?r({startDate:t,endDate:n}):r??`Must be between ${t} and ${n}`}function Ie(e,t,n){if(!e)return!0;const r=new Date(String(e)),s=new Date(t),a=new Date(n);return!isNaN(r.getTime())&&!isNaN(s.getTime())&&!isNaN(a.getTime())&&r>=s&&r<=a}function _e(e,t={}){const{args:n=[],messages:r={}}=t,[s,a]=n;return Ie(e,s,a)?!0:We(r,s,a)}const ze=e=>{const t=e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"),n={YYYY:"\\d{4}",YY:"\\d{2}",MM:"(0[1-9]|1[012])",M:"([1-9]|1[012])",DD:"([012][0-9]|3[01])",D:"([012]?[0-9]|3[01])"};let r=t;return Object.keys(n).forEach(s=>{r=r.replace(new RegExp(s,"g"),n[s])}),new RegExp(`^${r}$`)};function Ue(e,t){const n=e.dateFormat;return typeof n=="function"?n({format:t}):n??`Must match the format ${t}`}function ke(e,t){return e?t&&typeof t=="string"?ze(t).test(String(e)):!isNaN(Date.parse(String(e))):!0}function Ke(e,t={}){const{args:n=[],messages:r={}}=t,[s]=n;return ke(e,s)?!0:Ue(r,s)}function Ze(e){const t=e.email;return typeof t=="function"?t({}):t??"Please enter a valid email address"}function Ye(e){return e?/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(String(e)):!0}function Ge(e,t={}){const{messages:n={}}=t;return Ye(e)?!0:Ze(n)}function He(e,t){const n=e.endsWith;return typeof n=="function"?n({suffix:t.length===1?t[0]:t}):n??`Must end with: ${t.join(", ")}`}function Je(e,...t){if(!e)return!0;const n=String(e);return t.some(r=>n.endsWith(r))}function Qe(e,t={}){const{args:n=[],messages:r={}}=t;return Je(e,...n)?!0:He(r,n)}function Xe(e,t){const n=e.is;return typeof n=="function"?n({allowedValues:t}):n??`Must be one of: ${t.join(", ")}`}function et(e,...t){return!e&&e!==0&&e!==!1?!0:t.includes(String(e))}function tt(e,t={}){const{args:n=[],messages:r={}}=t;return et(e,...n)?!0:Xe(r,n)}function nt(e,t,n){const r=e.length;return n!==void 0?typeof r=="function"?r({min:t,max:n}):r??`Must be between ${t} and ${n} characters`:typeof r=="function"?r({value:t}):r??`Must be exactly ${t} characters`}function rt(e,t,n){if(!e&&e!==0)return!0;let r=0;if(typeof e=="string")r=e.length;else if(Array.isArray(e))r=e.length;else if(typeof e=="object"&&e!==null)r=Object.keys(e).length;else return!1;if(n!==void 0){const a=Number(t),u=Number(n);return!isNaN(a)&&!isNaN(u)&&r>=a&&r<=u}const s=Number(t);return!isNaN(s)&&r===s}function st(e,t={}){const{args:n=[],messages:r={}}=t,[s,a]=n;return rt(e,s,a)?!0:nt(r,s,a)}function ot(e){const t=e.lowercase;return typeof t=="function"?t({}):t??"Must contain only lowercase characters"}function at(e){return e?/^[a-z]+$/.test(String(e)):!0}function ut(e,t={}){const{messages:n={}}=t;return at(e)?!0:ot(n)}function it(e,t,n){const r=t.matches;return typeof r=="function"?r({value:e,pattern:n}):r??"Format is not valid"}function ct(e,t){if(!e)return!0;if(!t)return!1;try{if(t.startsWith("/")&&t.includes("/",1)){const n=t.lastIndexOf("/"),r=t.slice(1,n),s=t.slice(n+1);return new RegExp(r,s).test(String(e))}return String(e)===t}catch{return!1}}function lt(e,t={}){const{args:n=[],messages:r={}}=t,[s]=n;return ct(e,s)?!0:it(e,r,s)}function ft(e,t){const n=e.max;return typeof n=="function"?n({value:t}):n??`Must be at most ${t}`}function mt(e,t){if(!e&&e!==0)return!0;const n=Number(t);if(isNaN(n))return!1;if(typeof e=="number")return e<=n;if(typeof e=="string"){const r=Number(e);return isNaN(r)?e.length<=n:r<=n}return Array.isArray(e)?e.length<=n:!1}function dt(e,t={}){const{args:n=[],messages:r={}}=t,[s]=n;return mt(e,s)?!0:ft(r,s)}function gt(e,t){const n=e.min;return typeof n=="function"?n({value:t}):n??`Must be at least ${t}`}function pt(e,t){if(!e&&e!==0)return!0;const n=Number(t);if(isNaN(n))return!1;if(typeof e=="number")return e>=n;if(typeof e=="string"){const r=Number(e);return isNaN(r)?e.length>=n:r>=n}return Array.isArray(e)?e.length>=n:!1}function bt(e,t={}){const{args:n=[],messages:r={}}=t,[s]=n;return pt(e,s)?!0:gt(r,s)}function yt(e,t){const n=e.not;return typeof n=="function"?n({disallowedValues:t}):n??`Must not be one of: ${t.join(", ")}`}function $t(e,...t){return!e&&e!==0&&e!==!1?!0:!t.includes(String(e))}function vt(e,t={}){const{args:n=[],messages:r={}}=t;return $t(e,...n)?!0:yt(r,n)}function ht(e){const t=e.number;return typeof t=="function"?t({}):t??"Must be a valid number"}function Mt(e){if(e==null||e==="")return!0;if(Number.isNaN(e))return!1;const t=Number(e);return!isNaN(t)&&isFinite(t)}function wt(e,t={}){const{messages:n={}}=t;return Mt(e)?!0:ht(n)}function Nt(e){const t=e.required;return typeof t=="function"?t({}):t??"This field is required"}function At(e){return e==null||e===""?!1:typeof e=="string"?e.trim().length>0:Array.isArray(e)?e.length>0:typeof e=="object"?Object.keys(e).length>0:e===0?!0:!!e}function Dt(e,t={}){const{messages:n={}}=t;return At(e)?!0:Nt(n)}function St(e,t){const n=e.startsWith;return typeof n=="function"?n({prefix:t.length===1?t[0]:t}):n??`Must start with: ${t.join(", ")}`}function Ft(e,...t){if(!e)return!0;const n=String(e);return t.some(r=>n.startsWith(r))}function Vt(e,t={}){const{args:n=[],messages:r={}}=t;return Ft(e,...n)?!0:St(r,n)}function xt(e){const t=e.symbol;return typeof t=="function"?t({}):t??"Must contain only symbols"}function jt(e){return e?/^[^\w\s]+$/.test(String(e)):!0}function Pt(e,t={}){const{messages:n={}}=t;return jt(e)?!0:xt(n)}function Ct(e){const t=e.uppercase;return typeof t=="function"?t({}):t??"Must contain only uppercase characters"}function Tt(e){return e?/^[A-Z]+$/.test(String(e)):!0}function qt(e,t={}){const{messages:n={}}=t;return Tt(e)?!0:Ct(n)}function Et(e){const t=e.url;return typeof t=="function"?t({}):t??"Must be a valid URL"}function Rt(e){if(!e)return!0;try{const t=new URL(String(e));return["http:","https:","ftp:","ftps:"].includes(t.protocol)}catch{return!1}}function Bt(e,t={}){const{messages:n={}}=t;return Rt(e)?!0:Et(n)}const Ot=Object.freeze(Object.defineProperty({__proto__:null,accepted:k,alpha:Y,alphaSpaces:ee,alphanumeric:J,between:re,confirm:ae,containsAlpha:ce,containsAlphaSpaces:pe,containsAlphanumeric:me,containsLowercase:$e,containsNumeric:Me,containsSymbol:Ae,containsUppercase:Fe,dateAfter:je,dateAfterOrEqual:Te,dateBefore:Re,dateBeforeOrEqual:Le,dateBetween:_e,dateFormat:Ke,email:Ge,endsWith:Qe,is:tt,length:st,lowercase:ut,matches:lt,max:dt,min:bt,not:vt,number:wt,required:Dt,startsWith:Vt,symbol:Pt,uppercase:qt,url:Bt},Symbol.toStringTag,{value:"Module"})),Lt={install(e,t={}){D(Ot),t.rules&&D(t.rules);const n=o.isRef(t.locale)?t.locale:o.ref(t.locale??"en"),r={en:E};t.locales&&Object.keys(t.locales).forEach(a=>{r[a]={...r[a]??{},...t.locales[a]}});const s=o.shallowRef(r);e.provide(T,{locale:o.readonly(n),locales:o.readonly(s),setLocale:a=>{s.value[a]?n.value=a:console.warn(`Locale "${a}" not available.`)}})}},O=Symbol("form-state-context"),Wt=e=>{o.provide(O,e)},It=(e=null)=>{const t=o.inject(O,e);if(!t&&t!==null)throw new Error("Context with formStateContextKey not found");return t},L=Symbol("form-context"),_t=e=>{o.provide(L,e)},zt=(e=null)=>{const t=o.inject(L,e);if(!t&&t!==null)throw new Error("Context with formContextKey not found");return t};function Ut(e,t){if(!(!e||!t))return t.split(".").reduce((n,r)=>n==null?void 0:n[r],e)}function kt(e,t,n){if(!e||!t)return e;const r=t.split("."),s=r.pop(),a=r.reduce((u,l,c)=>{if(u[l]===null||u[l]===void 0){const g=r[c+1]||s;u[l]=/^\d+$/.test(g)?[]:{}}return u[l]},e);return a[s]=n,e}const Kt=o.defineComponent({__name:"Form",props:{modelValue:{default:()=>({})},modelModifiers:{}},emits:o.mergeModels(["submit"],["update:modelValue"]),setup(e,{emit:t}){const n=t,r=o.useModel(e,"modelValue");o.isReactive(r.value)||(r.value=o.reactive(r.value??{}));const s=o.ref({}),a=o.ref([]),u=o.computed(()=>r.value),l=o.computed(()=>a.value[0]??null),c=o.computed(()=>Object.keys(s.value).every(i=>s.value[i].isValid)),g=()=>{Object.keys(s.value).forEach(i=>{var p,y;(y=(p=s.value[i]).validate)==null||y.call(p)})},f=()=>{g(),c.value&&(a.value=[],n("submit",r.value,{setErrors:d,reset:m}))},d=i=>{if(typeof i=="object"&&!Array.isArray(i)&&i!==null){Object.keys(i).forEach(p=>{var y;(y=s.value[p])==null||y.setErrors(i[p])});return}a.value=Array.isArray(i)?i:[i]},m=()=>{a.value=[],Object.keys(s.value).forEach(i=>{s.value[i].reset()})};return Wt({getFields(){return s.value},getField(i){return s.value[i]},addField(i,p){s.value[i]=p},removeField(i){delete s.value[i]},setFieldValue(i,p){kt(r.value,i,p)},getFieldValue(i){return Ut(r.value,i)}}),_t({values:u,isValid:c,error:l,errors:a,fields:s,reset:m,setErrors:d,validate:g}),(i,p)=>(o.openBlock(),o.createElementBlock("form",{onSubmit:o.withModifiers(f,["prevent"])},[o.renderSlot(i.$slots,"default",o.normalizeProps(o.guardReactiveProps({isValid:c.value,error:l.value,errors:a.value,values:u.value,fields:s.value,reset:m,setErrors:d,validate:g})))],32))}});function W(e){if(!e||typeof e!="string")return{};const t=e.split("|").filter(Boolean),n={};for(const r of t){const[s,...a]=r.split(":"),u=s.trim();if(a.length===0)n[u]=!0;else{const c=a.join(":").split(",").map(g=>g.trim());n[u]=c.length===1?c[0]:c}}return n}const Zt=(e,t,n={},r={})=>{if(!t)return!0;const s=W(t),a=[];for(const[u,l]of Object.entries(s)){const c=_(u);if(c){const f={args:l===!0?[]:Array.isArray(l)?l:[l],messages:n,fields:r},d=c(e,f);d!==!0&&a.push(d??"Invalid value")}else console.warn(`[Forms] Validation rule "${u}" not found.`)}return a.length===0?!0:a},Yt=(e,t)=>{const n=t(e);return n===!0?!0:typeof n=="string"?[n]:Array.isArray(n)?n:!!n?!0:["Invalid value"]};typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const P=()=>{};function Gt(e,t){function n(...r){return new Promise((s,a)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(s).catch(a)})}return n}const Ht=e=>e();function Jt(e,t={}){let n,r,s=P;const a=c=>{clearTimeout(c),s(),s=P};let u;return c=>{const g=o.toValue(e),f=o.toValue(t.maxWait);return n&&a(n),g<=0||f!==void 0&&f<=0?(r&&(a(r),r=void 0),Promise.resolve(c())):new Promise((d,m)=>{s=t.rejectOnCancel?m:d,u=c,f&&!r&&(r=setTimeout(()=>{n&&a(n),r=void 0,d(u())},f)),n=setTimeout(()=>{r&&a(r),r=void 0,d(c())},g)})}}function Qt(e,t,n={}){const{eventFilter:r=Ht,...s}=n;return o.watch(e,Gt(r,t),s)}function C(e,t,n={}){const{debounce:r=0,maxWait:s=void 0,...a}=n;return Qt(e,t,{...a,eventFilter:Jt(r,{maxWait:s})})}function Xt(e,t={}){const n=o.ref(!0),r=o.ref(!1),s=o.ref([]),a=o.ref(null),u=o.computed(()=>o.toValue(t.rules)??null),l=o.computed(()=>o.toValue(t.messages)??{}),c=o.computed(()=>o.toValue(t.fields)??{}),g=o.computed(()=>{if(!u.value||typeof u.value!="string")return null;const i=W(u.value).confirm;if(!i||i===!0)return null;const p=c.value[i];return(p==null?void 0:p.value)??null}),f=()=>{let m;return typeof u.value=="function"?m=Yt(o.toValue(e),u.value):m=Zt(o.toValue(e),u.value,l.value,c.value),m===!0?(n.value=!0,s.value=[],!0):Array.isArray(m)?(n.value=!1,s.value=m,!1):m},d=()=>{a.value&&clearTimeout(a.value),r.value=!0,n.value=!0,s.value=[],a.value=setTimeout(()=>{r.value=!1,a.value=null},1e3)};return C(()=>o.toValue(e),()=>{r.value||f()},{debounce:300}),C(()=>o.toValue(g),()=>{r.value||o.toValue(e)&&f()},{debounce:300}),{validate:f,reset:d,isValid:o.readonly(n),errors:o.readonly(s)}}const M=Symbol("field-context"),en=e=>{o.provide(M,e)};function tn(e){if(e===void 0){const t=o.inject(M);if(!t)throw new Error("useFieldContext() must be called inside a Field component");return t}return o.inject(M,e)}const nn=o.defineComponent({__name:"Field",props:o.mergeModels({id:{},name:{},validation:{type:[String,Function,null]},validationMessages:{},error:{}},{modelValue:{},modelModifiers:{}}),emits:["update:modelValue"],setup(e){const t=e,n=o.useModel(e,"modelValue"),r=o.useId(),s=It(),a=q(),u=o.computed({get:()=>s?s.getFieldValue(t.name):n.value,set:b=>{s?s.setFieldValue(t.name,b):n.value=b}}),l=o.computed(()=>t.validation??null),c=o.computed(()=>({...a?a.locales.value[a.locale.value]:{},...t.validationMessages??{}})),g=o.computed({get:()=>s?s.getFields():{},set:()=>{}}),f=Xt(u,{rules:l,messages:c,fields:g}),d=o.ref(!1),m=o.ref(!1),i=o.ref([]),p=o.computed(()=>u.value??null),y=o.computed(()=>f.isValid.value&&i.value.length===0),v=o.computed(()=>[...f.errors.value,...i.value]),$=o.computed(()=>v.value[0]??null),S=o.toValue(u),h=t.id??r,w=`${h}-error`,N=`${h}-help`,I=b=>{i.value=Array.isArray(b)?b:[b]},A=()=>{u.value=S,d.value=!1,m.value=!1,i.value=[],f.reset()};o.watch(()=>t.error,b=>{b?i.value=Array.isArray(b)?b:[b]:i.value=[]},{immediate:!0});const F=o.computed(()=>({id:h,name:t.name,modelValue:u.value,"aria-invalid":!!$.value,"aria-describedby":$.value?`${w} ${N}`:N,"aria-errormessage":$.value?w:void 0,"onUpdate:modelValue":b=>{u.value=b,!m.value&&b!==S&&(m.value=!0)},onBlur:()=>{d.value||(d.value=!0,f.validate())}})),V={for:h},x={id:w,role:"alert","aria-live":"polite"},j={id:N};return o.onMounted(()=>{s&&s.addField(t.name,{value:p,isValid:y,isTouched:d,isDirty:m,error:$,errors:v,setErrors:I,reset:A,validate:f.validate})}),o.onUnmounted(()=>{s&&s.removeField(t.name)}),en({inputValue:u,inputProps:F,labelProps:V,helpProps:j,errorProps:x,isValid:y,isTouched:d,isDirty:m,error:$,errors:v,validate:f.validate,reset:A}),(b,un)=>(o.openBlock(),o.createElementBlock("div",null,[o.renderSlot(b.$slots,"default",o.normalizeProps(o.guardReactiveProps({inputValue:u.value,inputProps:F.value,labelProps:V,helpProps:j,errorProps:x,isValid:y.value,isTouched:d.value,isDirty:m.value,error:$.value,errors:v.value,validate:o.unref(f).validate,reset:A})))]))}});function rn(){const e=q();if(!e)throw new Error("[Valiform] useLocale() must be used inside a component with FormsPlugin installed.");return{locale:e.locale,locales:e.locales,setLocale:e.setLocale}}function sn(e){const t=o.inject(M,null);if(t)return t;const n=o.toValue(e),r=o.useId(),s=`${r}-error`,a=`${r}-help`,u=o.ref(!1),l=o.ref(!1),c=o.computed(()=>({id:r,name:r,modelValue:e.value,"aria-invalid":!1,"aria-describedby":a,"aria-errormessage":void 0,"onUpdate:modelValue":g=>{e.value=g,!l.value&&g!==n&&(l.value=!0)},onBlur:()=>{u.value||(u.value=!0)}}));return{inputValue:e,inputProps:c,labelProps:{for:r},helpProps:{id:a},errorProps:{id:s,role:"alert","aria-live":"polite"},isValid:o.computed(()=>!0),isTouched:u,isDirty:l,error:o.computed(()=>null),errors:o.computed(()=>[]),validate:()=>!0,reset:()=>{e.value=n,u.value=!1,l.value=!1}}}function on(e){return e}const an={required:"Este campo es obligatorio",email:"Por favor ingresa un email válido",min:({value:e})=>`Debe ser al menos ${e}`,max:({value:e})=>`Debe ser como máximo ${e}`,matches:"El formato no es válido",number:"Debe ser un número válido",accepted:"Debe ser aceptado",alpha:"Debe contener solo caracteres alfabéticos",alphanumeric:"Debe contener solo letras y números",alphaSpaces:"Debe contener solo letras y espacios",between:({min:e,max:t})=>`Debe estar entre ${e} y ${t}`,confirm:({fieldName:e})=>`Debe coincidir con ${e}`,containsAlpha:"Debe contener al menos una letra",containsAlphanumeric:"Debe contener al menos una letra o número",containsAlphaSpaces:"Debe contener al menos una letra o espacio",containsLowercase:"Debe contener al menos una letra minúscula",containsNumeric:"Debe contener al menos un número",containsSymbol:"Debe contener al menos un símbolo",containsUppercase:"Debe contener al menos una letra mayúscula",dateAfter:({date:e})=>e?`Debe ser posterior a ${e}`:"Debe ser posterior a hoy",dateAfterOrEqual:({date:e})=>e?`Debe ser posterior o igual a ${e}`:"Debe ser posterior o igual a hoy",dateBefore:({date:e})=>e?`Debe ser anterior a ${e}`:"Debe ser anterior a hoy",dateBeforeOrEqual:({date:e})=>e?`Debe ser anterior o igual a ${e}`:"Debe ser anterior o igual a hoy",dateBetween:({startDate:e,endDate:t})=>`Debe estar entre ${e} y ${t}`,dateFormat:({format:e})=>`Debe coincidir con el formato ${e}`,endsWith:({suffix:e})=>Array.isArray(e)?`Debe terminar con uno de: ${e.map(t=>`"${t}"`).join(", ")}`:`Debe terminar con "${e}"`,is:({allowedValues:e})=>`Debe ser uno de: ${Array.isArray(e)?e.join(", "):e}`,length:({value:e,min:t,max:n})=>t!==void 0&&n!==void 0?`Debe tener entre ${t} y ${n} caracteres`:e!==void 0?`Debe tener exactamente ${e} caracteres`:"Longitud inválida",lowercase:"Debe contener solo caracteres en minúscula",not:({disallowedValues:e})=>`No debe ser uno de: ${Array.isArray(e)?e.join(", "):e}`,startsWith:({prefix:e})=>Array.isArray(e)?`Debe comenzar con uno de: ${e.join(", ")}`:`Debe comenzar con "${e}"`,symbol:"Debe contener solo símbolos",uppercase:"Debe contener solo caracteres en mayúscula",url:"Debe ser una URL válida"};exports.Field=nn;exports.Form=Kt;exports.FormsPlugin=Lt;exports.defineValiformConfig=on;exports.en=E;exports.es=an;exports.registerRule=B;exports.registerRules=D;exports.useFieldContext=tn;exports.useFormContext=zt;exports.useInputContext=sn;exports.useLocale=rn;
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { inject as
|
|
1
|
+
import { inject as M, shallowRef as R, isRef as ne, ref as $, readonly as A, provide as V, defineComponent as W, useModel as L, isReactive as re, reactive as se, computed as m, openBlock as _, createElementBlock as I, withModifiers as oe, renderSlot as z, normalizeProps as U, guardReactiveProps as K, mergeModels as Z, watch as k, toValue as y, useId as Y, onMounted as ae, onUnmounted as ue, unref as ie } from "vue";
|
|
2
2
|
const G = Symbol("locale-context"), H = (e = null) => {
|
|
3
|
-
const t =
|
|
3
|
+
const t = M(G, e);
|
|
4
4
|
if (!t && t !== null)
|
|
5
5
|
throw new Error("Context with localeContextKey not found");
|
|
6
6
|
return t;
|
|
@@ -157,11 +157,11 @@ function We(e) {
|
|
|
157
157
|
function Le(e) {
|
|
158
158
|
return e ? /[a-z]/.test(String(e)) : !0;
|
|
159
159
|
}
|
|
160
|
-
function
|
|
160
|
+
function _e(e, t = {}) {
|
|
161
161
|
const { messages: n = {} } = t;
|
|
162
162
|
return Le(e) ? !0 : We(n);
|
|
163
163
|
}
|
|
164
|
-
function
|
|
164
|
+
function Ie(e) {
|
|
165
165
|
const t = e.containsNumeric;
|
|
166
166
|
return typeof t == "function" ? t({}) : t ?? "Must contain at least one number";
|
|
167
167
|
}
|
|
@@ -170,7 +170,7 @@ function ze(e) {
|
|
|
170
170
|
}
|
|
171
171
|
function Ue(e, t = {}) {
|
|
172
172
|
const { messages: n = {} } = t;
|
|
173
|
-
return ze(e) ? !0 :
|
|
173
|
+
return ze(e) ? !0 : Ie(n);
|
|
174
174
|
}
|
|
175
175
|
function Ke(e) {
|
|
176
176
|
const t = e.containsSymbol;
|
|
@@ -419,12 +419,12 @@ function Lt(e, t) {
|
|
|
419
419
|
const n = e.not;
|
|
420
420
|
return typeof n == "function" ? n({ disallowedValues: t }) : n ?? `Must not be one of: ${t.join(", ")}`;
|
|
421
421
|
}
|
|
422
|
-
function
|
|
422
|
+
function _t(e, ...t) {
|
|
423
423
|
return !e && e !== 0 && e !== !1 ? !0 : !t.includes(String(e));
|
|
424
424
|
}
|
|
425
|
-
function
|
|
425
|
+
function It(e, t = {}) {
|
|
426
426
|
const { args: n = [], messages: r = {} } = t;
|
|
427
|
-
return
|
|
427
|
+
return _t(e, ...n) ? !0 : Lt(r, n);
|
|
428
428
|
}
|
|
429
429
|
function zt(e) {
|
|
430
430
|
const t = e.number;
|
|
@@ -514,7 +514,7 @@ const un = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
|
514
514
|
containsAlpha: Te,
|
|
515
515
|
containsAlphaSpaces: Re,
|
|
516
516
|
containsAlphanumeric: Ee,
|
|
517
|
-
containsLowercase:
|
|
517
|
+
containsLowercase: _e,
|
|
518
518
|
containsNumeric: Ue,
|
|
519
519
|
containsSymbol: ke,
|
|
520
520
|
containsUppercase: He,
|
|
@@ -532,7 +532,7 @@ const un = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
|
532
532
|
matches: Ct,
|
|
533
533
|
max: Bt,
|
|
534
534
|
min: Wt,
|
|
535
|
-
not:
|
|
535
|
+
not: It,
|
|
536
536
|
number: Kt,
|
|
537
537
|
required: Yt,
|
|
538
538
|
startsWith: Jt,
|
|
@@ -542,7 +542,7 @@ const un = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
|
542
542
|
}, Symbol.toStringTag, { value: "Module" })), An = {
|
|
543
543
|
install(e, t = {}) {
|
|
544
544
|
E(un), t.rules && E(t.rules);
|
|
545
|
-
const n = ne(t.locale) ? t.locale :
|
|
545
|
+
const n = ne(t.locale) ? t.locale : $(t.locale ?? "en"), r = { en: ce };
|
|
546
546
|
t.locales && Object.keys(t.locales).forEach((o) => {
|
|
547
547
|
r[o] = { ...r[o] ?? {}, ...t.locales[o] };
|
|
548
548
|
});
|
|
@@ -558,14 +558,14 @@ const un = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
|
558
558
|
}, Q = Symbol("form-state-context"), cn = (e) => {
|
|
559
559
|
V(Q, e);
|
|
560
560
|
}, ln = (e = null) => {
|
|
561
|
-
const t =
|
|
561
|
+
const t = M(Q, e);
|
|
562
562
|
if (!t && t !== null)
|
|
563
563
|
throw new Error("Context with formStateContextKey not found");
|
|
564
564
|
return t;
|
|
565
565
|
}, X = Symbol("form-context"), fn = (e) => {
|
|
566
566
|
V(X, e);
|
|
567
567
|
}, Dn = (e = null) => {
|
|
568
|
-
const t =
|
|
568
|
+
const t = M(X, e);
|
|
569
569
|
if (!t && t !== null)
|
|
570
570
|
throw new Error("Context with formContextKey not found");
|
|
571
571
|
return t;
|
|
@@ -597,31 +597,25 @@ const Sn = /* @__PURE__ */ W({
|
|
|
597
597
|
setup(e, { emit: t }) {
|
|
598
598
|
const n = t, r = L(e, "modelValue");
|
|
599
599
|
re(r.value) || (r.value = se(r.value ?? {}));
|
|
600
|
-
const s =
|
|
600
|
+
const s = $({}), o = $([]), a = m(() => r.value), c = m(() => o.value[0] ?? null), i = m(
|
|
601
601
|
() => Object.keys(s.value).every((u) => s.value[u].isValid)
|
|
602
602
|
), g = () => {
|
|
603
603
|
Object.keys(s.value).forEach((u) => {
|
|
604
|
-
var
|
|
605
|
-
(
|
|
604
|
+
var p, h;
|
|
605
|
+
(h = (p = s.value[u]).validate) == null || h.call(p);
|
|
606
606
|
});
|
|
607
607
|
}, l = () => {
|
|
608
|
-
g(), i.value && (o.value = [], n("submit", r.value, { setErrors:
|
|
609
|
-
},
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
});
|
|
617
|
-
return;
|
|
618
|
-
}
|
|
619
|
-
o.value = Array.isArray(p) ? p : [p];
|
|
620
|
-
} else if (u.length === 2) {
|
|
621
|
-
const [p, v] = u;
|
|
622
|
-
(b = s.value[p]) == null || b.setErrors(v);
|
|
608
|
+
g(), i.value && (o.value = [], n("submit", r.value, { setErrors: d, reset: f }));
|
|
609
|
+
}, d = (u) => {
|
|
610
|
+
if (typeof u == "object" && !Array.isArray(u) && u !== null) {
|
|
611
|
+
Object.keys(u).forEach((p) => {
|
|
612
|
+
var h;
|
|
613
|
+
(h = s.value[p]) == null || h.setErrors(u[p]);
|
|
614
|
+
});
|
|
615
|
+
return;
|
|
623
616
|
}
|
|
624
|
-
|
|
617
|
+
o.value = Array.isArray(u) ? u : [u];
|
|
618
|
+
}, f = () => {
|
|
625
619
|
o.value = [], Object.keys(s.value).forEach((u) => {
|
|
626
620
|
s.value[u].reset();
|
|
627
621
|
});
|
|
@@ -633,14 +627,14 @@ const Sn = /* @__PURE__ */ W({
|
|
|
633
627
|
getField(u) {
|
|
634
628
|
return s.value[u];
|
|
635
629
|
},
|
|
636
|
-
addField(u,
|
|
637
|
-
s.value[u] =
|
|
630
|
+
addField(u, p) {
|
|
631
|
+
s.value[u] = p;
|
|
638
632
|
},
|
|
639
633
|
removeField(u) {
|
|
640
634
|
delete s.value[u];
|
|
641
635
|
},
|
|
642
|
-
setFieldValue(u,
|
|
643
|
-
dn(r.value, u,
|
|
636
|
+
setFieldValue(u, p) {
|
|
637
|
+
dn(r.value, u, p);
|
|
644
638
|
},
|
|
645
639
|
getFieldValue(u) {
|
|
646
640
|
return mn(r.value, u);
|
|
@@ -651,10 +645,10 @@ const Sn = /* @__PURE__ */ W({
|
|
|
651
645
|
error: c,
|
|
652
646
|
errors: o,
|
|
653
647
|
fields: s,
|
|
654
|
-
reset:
|
|
655
|
-
setErrors:
|
|
648
|
+
reset: f,
|
|
649
|
+
setErrors: d,
|
|
656
650
|
validate: g
|
|
657
|
-
}), (u,
|
|
651
|
+
}), (u, p) => (_(), I("form", {
|
|
658
652
|
onSubmit: oe(l, ["prevent"])
|
|
659
653
|
}, [
|
|
660
654
|
z(u.$slots, "default", U(K({
|
|
@@ -663,8 +657,8 @@ const Sn = /* @__PURE__ */ W({
|
|
|
663
657
|
errors: o.value,
|
|
664
658
|
values: a.value,
|
|
665
659
|
fields: s.value,
|
|
666
|
-
reset:
|
|
667
|
-
setErrors:
|
|
660
|
+
reset: f,
|
|
661
|
+
setErrors: d,
|
|
668
662
|
validate: g
|
|
669
663
|
})))
|
|
670
664
|
], 32));
|
|
@@ -691,8 +685,8 @@ const gn = (e, t, n = {}, r = {}) => {
|
|
|
691
685
|
for (const [a, c] of Object.entries(s)) {
|
|
692
686
|
const i = fe(a);
|
|
693
687
|
if (i) {
|
|
694
|
-
const l = { args: c === !0 ? [] : Array.isArray(c) ? c : [c], messages: n, fields: r },
|
|
695
|
-
|
|
688
|
+
const l = { args: c === !0 ? [] : Array.isArray(c) ? c : [c], messages: n, fields: r }, d = i(e, l);
|
|
689
|
+
d !== !0 && o.push(d ?? "Invalid value");
|
|
696
690
|
} else
|
|
697
691
|
console.warn(`[Forms] Validation rule "${a}" not found.`);
|
|
698
692
|
}
|
|
@@ -724,12 +718,12 @@ function $n(e, t = {}) {
|
|
|
724
718
|
};
|
|
725
719
|
let a;
|
|
726
720
|
return (i) => {
|
|
727
|
-
const g =
|
|
728
|
-
return n && o(n), g <= 0 || l !== void 0 && l <= 0 ? (r && (o(r), r = void 0), Promise.resolve(i())) : new Promise((
|
|
729
|
-
s = t.rejectOnCancel ?
|
|
730
|
-
n && o(n), r = void 0,
|
|
721
|
+
const g = y(e), l = y(t.maxWait);
|
|
722
|
+
return n && o(n), g <= 0 || l !== void 0 && l <= 0 ? (r && (o(r), r = void 0), Promise.resolve(i())) : new Promise((d, f) => {
|
|
723
|
+
s = t.rejectOnCancel ? f : d, a = i, l && !r && (r = setTimeout(() => {
|
|
724
|
+
n && o(n), r = void 0, d(a());
|
|
731
725
|
}, l)), n = setTimeout(() => {
|
|
732
|
-
r && o(r), r = void 0,
|
|
726
|
+
r && o(r), r = void 0, d(i());
|
|
733
727
|
}, g);
|
|
734
728
|
});
|
|
735
729
|
};
|
|
@@ -746,40 +740,40 @@ function O(e, t, n = {}) {
|
|
|
746
740
|
});
|
|
747
741
|
}
|
|
748
742
|
function vn(e, t = {}) {
|
|
749
|
-
const n =
|
|
743
|
+
const n = $(!0), r = $(!1), s = $([]), o = $(null), a = m(() => y(t.rules) ?? null), c = m(() => y(t.messages) ?? {}), i = m(() => y(t.fields) ?? {}), g = m(() => {
|
|
750
744
|
if (!a.value || typeof a.value != "string") return null;
|
|
751
745
|
const u = ee(a.value).confirm;
|
|
752
746
|
if (!u || u === !0) return null;
|
|
753
|
-
const
|
|
754
|
-
return (
|
|
747
|
+
const p = i.value[u];
|
|
748
|
+
return (p == null ? void 0 : p.value) ?? null;
|
|
755
749
|
}), l = () => {
|
|
756
|
-
let
|
|
757
|
-
return typeof a.value == "function" ?
|
|
758
|
-
|
|
750
|
+
let f;
|
|
751
|
+
return typeof a.value == "function" ? f = pn(y(e), a.value) : f = gn(
|
|
752
|
+
y(e),
|
|
759
753
|
a.value,
|
|
760
754
|
c.value,
|
|
761
755
|
i.value
|
|
762
|
-
),
|
|
763
|
-
},
|
|
756
|
+
), f === !0 ? (n.value = !0, s.value = [], !0) : Array.isArray(f) ? (n.value = !1, s.value = f, !1) : f;
|
|
757
|
+
}, d = () => {
|
|
764
758
|
o.value && clearTimeout(o.value), r.value = !0, n.value = !0, s.value = [], o.value = setTimeout(() => {
|
|
765
759
|
r.value = !1, o.value = null;
|
|
766
760
|
}, 1e3);
|
|
767
761
|
};
|
|
768
762
|
return O(
|
|
769
|
-
() =>
|
|
763
|
+
() => y(e),
|
|
770
764
|
() => {
|
|
771
765
|
r.value || l();
|
|
772
766
|
},
|
|
773
767
|
{ debounce: 300 }
|
|
774
768
|
), O(
|
|
775
|
-
() =>
|
|
769
|
+
() => y(g),
|
|
776
770
|
() => {
|
|
777
|
-
r.value ||
|
|
771
|
+
r.value || y(e) && l();
|
|
778
772
|
},
|
|
779
773
|
{ debounce: 300 }
|
|
780
774
|
), {
|
|
781
775
|
validate: l,
|
|
782
|
-
reset:
|
|
776
|
+
reset: d,
|
|
783
777
|
isValid: A(n),
|
|
784
778
|
errors: A(s)
|
|
785
779
|
};
|
|
@@ -789,11 +783,11 @@ const D = Symbol("field-context"), Mn = (e) => {
|
|
|
789
783
|
};
|
|
790
784
|
function Fn(e) {
|
|
791
785
|
if (e === void 0) {
|
|
792
|
-
const t =
|
|
786
|
+
const t = M(D);
|
|
793
787
|
if (!t) throw new Error("useFieldContext() must be called inside a Field component");
|
|
794
788
|
return t;
|
|
795
789
|
}
|
|
796
|
-
return
|
|
790
|
+
return M(D, e);
|
|
797
791
|
}
|
|
798
792
|
const xn = /* @__PURE__ */ W({
|
|
799
793
|
__name: "Field",
|
|
@@ -809,52 +803,52 @@ const xn = /* @__PURE__ */ W({
|
|
|
809
803
|
}),
|
|
810
804
|
emits: ["update:modelValue"],
|
|
811
805
|
setup(e) {
|
|
812
|
-
const t = e, n = L(e, "modelValue"), r = Y(), s = ln(), o = H(), a =
|
|
806
|
+
const t = e, n = L(e, "modelValue"), r = Y(), s = ln(), o = H(), a = m({
|
|
813
807
|
get: () => s ? s.getFieldValue(t.name) : n.value,
|
|
814
|
-
set: (
|
|
815
|
-
s ? s.setFieldValue(t.name,
|
|
808
|
+
set: (b) => {
|
|
809
|
+
s ? s.setFieldValue(t.name, b) : n.value = b;
|
|
816
810
|
}
|
|
817
|
-
}), c =
|
|
811
|
+
}), c = m(() => t.validation ?? null), i = m(() => ({
|
|
818
812
|
...o ? o.locales.value[o.locale.value] : {},
|
|
819
813
|
...t.validationMessages ?? {}
|
|
820
|
-
})), g =
|
|
814
|
+
})), g = m({
|
|
821
815
|
get: () => s ? s.getFields() : {},
|
|
822
816
|
set: () => {
|
|
823
817
|
}
|
|
824
|
-
}), l = vn(a, { rules: c, messages: i, fields: g }),
|
|
825
|
-
u.value = Array.isArray(
|
|
818
|
+
}), l = vn(a, { rules: c, messages: i, fields: g }), d = $(!1), f = $(!1), u = $([]), p = m(() => a.value ?? null), h = m(() => l.isValid.value && u.value.length === 0), N = m(() => [...l.errors.value, ...u.value]), v = m(() => N.value[0] ?? null), j = y(a), w = t.id ?? r, S = `${w}-error`, F = `${w}-help`, te = (b) => {
|
|
819
|
+
u.value = Array.isArray(b) ? b : [b];
|
|
826
820
|
}, x = () => {
|
|
827
|
-
a.value = j,
|
|
821
|
+
a.value = j, d.value = !1, f.value = !1, u.value = [], l.reset();
|
|
828
822
|
};
|
|
829
823
|
k(
|
|
830
824
|
() => t.error,
|
|
831
|
-
(
|
|
832
|
-
|
|
825
|
+
(b) => {
|
|
826
|
+
b ? u.value = Array.isArray(b) ? b : [b] : u.value = [];
|
|
833
827
|
},
|
|
834
828
|
{ immediate: !0 }
|
|
835
829
|
);
|
|
836
|
-
const P =
|
|
830
|
+
const P = m(() => ({
|
|
837
831
|
id: w,
|
|
838
832
|
name: t.name,
|
|
839
833
|
modelValue: a.value,
|
|
840
|
-
"aria-invalid": !!
|
|
841
|
-
"aria-describedby":
|
|
842
|
-
"aria-errormessage":
|
|
843
|
-
"onUpdate:modelValue": (
|
|
844
|
-
a.value =
|
|
834
|
+
"aria-invalid": !!v.value,
|
|
835
|
+
"aria-describedby": v.value ? `${S} ${F}` : F,
|
|
836
|
+
"aria-errormessage": v.value ? S : void 0,
|
|
837
|
+
"onUpdate:modelValue": (b) => {
|
|
838
|
+
a.value = b, !f.value && b !== j && (f.value = !0);
|
|
845
839
|
},
|
|
846
840
|
onBlur: () => {
|
|
847
|
-
|
|
841
|
+
d.value || (d.value = !0, l.validate());
|
|
848
842
|
}
|
|
849
843
|
})), T = { for: w }, C = { id: S, role: "alert", "aria-live": "polite" }, q = { id: F };
|
|
850
844
|
return ae(() => {
|
|
851
845
|
s && s.addField(t.name, {
|
|
852
|
-
value:
|
|
853
|
-
isValid:
|
|
854
|
-
isTouched:
|
|
855
|
-
isDirty:
|
|
856
|
-
error:
|
|
857
|
-
errors:
|
|
846
|
+
value: p,
|
|
847
|
+
isValid: h,
|
|
848
|
+
isTouched: d,
|
|
849
|
+
isDirty: f,
|
|
850
|
+
error: v,
|
|
851
|
+
errors: N,
|
|
858
852
|
setErrors: te,
|
|
859
853
|
reset: x,
|
|
860
854
|
validate: l.validate
|
|
@@ -867,25 +861,25 @@ const xn = /* @__PURE__ */ W({
|
|
|
867
861
|
labelProps: T,
|
|
868
862
|
helpProps: q,
|
|
869
863
|
errorProps: C,
|
|
870
|
-
isValid:
|
|
871
|
-
isTouched:
|
|
872
|
-
isDirty:
|
|
873
|
-
error:
|
|
874
|
-
errors:
|
|
864
|
+
isValid: h,
|
|
865
|
+
isTouched: d,
|
|
866
|
+
isDirty: f,
|
|
867
|
+
error: v,
|
|
868
|
+
errors: N,
|
|
875
869
|
validate: l.validate,
|
|
876
870
|
reset: x
|
|
877
|
-
}), (
|
|
878
|
-
z(
|
|
871
|
+
}), (b, Nn) => (_(), I("div", null, [
|
|
872
|
+
z(b.$slots, "default", U(K({
|
|
879
873
|
inputValue: a.value,
|
|
880
874
|
inputProps: P.value,
|
|
881
875
|
labelProps: T,
|
|
882
876
|
helpProps: q,
|
|
883
877
|
errorProps: C,
|
|
884
|
-
isValid:
|
|
885
|
-
isTouched:
|
|
886
|
-
isDirty:
|
|
887
|
-
error:
|
|
888
|
-
errors:
|
|
878
|
+
isValid: h.value,
|
|
879
|
+
isTouched: d.value,
|
|
880
|
+
isDirty: f.value,
|
|
881
|
+
error: v.value,
|
|
882
|
+
errors: N.value,
|
|
889
883
|
validate: ie(l).validate,
|
|
890
884
|
reset: x
|
|
891
885
|
})))
|
|
@@ -905,10 +899,10 @@ function Vn() {
|
|
|
905
899
|
};
|
|
906
900
|
}
|
|
907
901
|
function jn(e) {
|
|
908
|
-
const t =
|
|
902
|
+
const t = M(D, null);
|
|
909
903
|
if (t)
|
|
910
904
|
return t;
|
|
911
|
-
const n =
|
|
905
|
+
const n = y(e), r = Y(), s = `${r}-error`, o = `${r}-help`, a = $(!1), c = $(!1), i = m(() => ({
|
|
912
906
|
id: r,
|
|
913
907
|
name: r,
|
|
914
908
|
modelValue: e.value,
|
|
@@ -928,11 +922,11 @@ function jn(e) {
|
|
|
928
922
|
labelProps: { for: r },
|
|
929
923
|
helpProps: { id: o },
|
|
930
924
|
errorProps: { id: s, role: "alert", "aria-live": "polite" },
|
|
931
|
-
isValid:
|
|
925
|
+
isValid: m(() => !0),
|
|
932
926
|
isTouched: a,
|
|
933
927
|
isDirty: c,
|
|
934
|
-
error:
|
|
935
|
-
errors:
|
|
928
|
+
error: m(() => null),
|
|
929
|
+
errors: m(() => []),
|
|
936
930
|
validate: () => !0,
|
|
937
931
|
reset: () => {
|
|
938
932
|
e.value = n, a.value = !1, c.value = !1;
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import type { FieldState } from '../types';
|
|
2
|
-
declare const setErrors: (...args: unknown[]) => void;
|
|
3
|
-
declare const reset: () => void;
|
|
1
|
+
import type { FieldState, FormSubmitHelpers } from '../types';
|
|
4
2
|
type __VLS_PublicProps = {
|
|
5
3
|
modelValue?: Record<string, unknown>;
|
|
6
4
|
};
|
|
@@ -11,23 +9,17 @@ declare var __VLS_1: {
|
|
|
11
9
|
values: Record<string, unknown>;
|
|
12
10
|
fields: Record<string, FieldState>;
|
|
13
11
|
reset: () => void;
|
|
14
|
-
setErrors: (
|
|
12
|
+
setErrors: (input: string | string[] | Record<string, string | string[]>) => void;
|
|
15
13
|
validate: () => void;
|
|
16
14
|
};
|
|
17
15
|
type __VLS_Slots = {} & {
|
|
18
16
|
default?: (props: typeof __VLS_1) => any;
|
|
19
17
|
};
|
|
20
18
|
declare const __VLS_component: import("vue").DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
21
|
-
submit: (values: Record<string, unknown>, helpers:
|
|
22
|
-
setErrors: typeof setErrors;
|
|
23
|
-
reset: typeof reset;
|
|
24
|
-
}) => any;
|
|
19
|
+
submit: (values: Record<string, unknown>, helpers: FormSubmitHelpers) => any;
|
|
25
20
|
"update:modelValue": (value: Record<string, unknown>) => any;
|
|
26
21
|
}, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
27
|
-
onSubmit?: (values: Record<string, unknown>, helpers:
|
|
28
|
-
setErrors: typeof setErrors;
|
|
29
|
-
reset: typeof reset;
|
|
30
|
-
}) => any;
|
|
22
|
+
onSubmit?: (values: Record<string, unknown>, helpers: FormSubmitHelpers) => any;
|
|
31
23
|
"onUpdate:modelValue"?: (value: Record<string, unknown>) => any;
|
|
32
24
|
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
33
25
|
declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { FormSubmitHelpers } from '../../../types';
|
|
1
2
|
interface FormValues {
|
|
2
3
|
name: string;
|
|
3
4
|
email: string;
|
|
@@ -5,10 +6,7 @@ interface FormValues {
|
|
|
5
6
|
confirmPassword: string;
|
|
6
7
|
}
|
|
7
8
|
type __VLS_Props = {
|
|
8
|
-
handleSubmit?: (values: Record<string, unknown>, helpers:
|
|
9
|
-
setErrors: (...args: unknown[]) => void;
|
|
10
|
-
reset: () => void;
|
|
11
|
-
}) => void;
|
|
9
|
+
handleSubmit?: (values: Record<string, unknown>, helpers: FormSubmitHelpers) => void;
|
|
12
10
|
initialValues?: FormValues;
|
|
13
11
|
};
|
|
14
12
|
declare var __VLS_32: {
|
|
@@ -16,19 +14,16 @@ declare var __VLS_32: {
|
|
|
16
14
|
error: string;
|
|
17
15
|
errors: string[];
|
|
18
16
|
values: Record<string, unknown>;
|
|
19
|
-
fields: Record<string, import("../../../types
|
|
17
|
+
fields: Record<string, import("../../../types").FieldState>;
|
|
20
18
|
reset: () => void;
|
|
21
|
-
setErrors: (
|
|
19
|
+
setErrors: (input: string | string[] | Record<string, string | string[]>) => void;
|
|
22
20
|
validate: () => void;
|
|
23
21
|
};
|
|
24
22
|
type __VLS_Slots = {} & {
|
|
25
23
|
default?: (props: typeof __VLS_32) => any;
|
|
26
24
|
};
|
|
27
25
|
declare const __VLS_component: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
28
|
-
handleSubmit: (values: Record<string, unknown>, helpers:
|
|
29
|
-
setErrors: (...args: unknown[]) => void;
|
|
30
|
-
reset: () => void;
|
|
31
|
-
}) => void;
|
|
26
|
+
handleSubmit: (values: Record<string, unknown>, helpers: FormSubmitHelpers) => void;
|
|
32
27
|
initialValues: FormValues;
|
|
33
28
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
34
29
|
declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
|
|
@@ -29,7 +29,7 @@ declare var __VLS_52: {
|
|
|
29
29
|
values: Record<string, unknown>;
|
|
30
30
|
fields: Record<string, import("../../../types.js").FieldState>;
|
|
31
31
|
reset: () => void;
|
|
32
|
-
setErrors: (
|
|
32
|
+
setErrors: (input: string | string[] | Record<string, string | string[]>) => void;
|
|
33
33
|
validate: () => void;
|
|
34
34
|
};
|
|
35
35
|
type __VLS_Slots = {} & {
|
package/dist/src/index.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export { useLocale } from './composables/useLocale';
|
|
|
6
6
|
export { useFormContext } from './context/useFormContext';
|
|
7
7
|
export { useFieldContext } from './context/useFieldContext';
|
|
8
8
|
export { useInputContext } from './context/useInputContext';
|
|
9
|
-
export type { FieldContext, FieldState, FormContext, InputProps, RuleFunction, RuleOptions, LocaleMessageFn, LocaleMessage, LocaleMessages, FormsPluginOptions, ValiformConfig } from './types';
|
|
9
|
+
export type { FieldContext, FieldState, FormContext, FormSubmitHelpers, FormSubmitHandler, InputProps, RuleFunction, RuleOptions, LocaleMessageFn, LocaleMessage, LocaleMessages, FormsPluginOptions, ValiformConfig } from './types';
|
|
10
10
|
export { defineValiformConfig } from './defineValiformConfig';
|
|
11
11
|
export { en } from './locales/en';
|
|
12
12
|
export { es } from './locales/es';
|
package/dist/src/types.d.ts
CHANGED
|
@@ -54,6 +54,7 @@ export interface FieldContext {
|
|
|
54
54
|
validate: () => boolean | void;
|
|
55
55
|
reset: () => void;
|
|
56
56
|
}
|
|
57
|
+
export type SetErrorsInput = string | string[] | Record<string, string | string[]>;
|
|
57
58
|
export interface FormStateContext {
|
|
58
59
|
getFields: () => Record<string, FieldState>;
|
|
59
60
|
getField: (name: string) => FieldState | undefined;
|
|
@@ -69,9 +70,14 @@ export interface FormContext {
|
|
|
69
70
|
errors: Ref<string[]>;
|
|
70
71
|
fields: Ref<Record<string, FieldState>>;
|
|
71
72
|
reset: () => void;
|
|
72
|
-
setErrors: (
|
|
73
|
+
setErrors: (input: SetErrorsInput) => void;
|
|
73
74
|
validate: () => void;
|
|
74
75
|
}
|
|
76
|
+
export type FormSubmitHelpers = {
|
|
77
|
+
setErrors: (input: SetErrorsInput) => void;
|
|
78
|
+
reset: () => void;
|
|
79
|
+
};
|
|
80
|
+
export type FormSubmitHandler<T extends object = Record<string, unknown>> = (values: T, helpers: FormSubmitHelpers) => void | Promise<void>;
|
|
75
81
|
export interface LocaleContextData {
|
|
76
82
|
locale: Readonly<Ref<string>>;
|
|
77
83
|
locales: Readonly<ShallowRef<Record<string, LocaleMessages>>>;
|