@regle/core 0.2.5 → 0.2.7

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 CHANGED
@@ -1 +1 @@
1
- 'use strict';var vue=require('vue');var Pe=(r=>(r.Inline="__inline",r.Async="__async",r))(Pe||{});function Ke(e,t){return vue.computed(()=>e.value.some(r=>r[t]))}function et(e,t){return vue.computed(()=>e.value.reduce((r,n)=>{let a=n[t]||[];return r.concat(a)},[]))}function q(e){return e.map(t=>t instanceof Function?t():vue.unref(t))}function tt(e){return e.map(t=>t instanceof Function||vue.isRef(t)?t:vue.toRef(()=>t))}function rt(e){let t=e.toString();return (t.includes("=>")?t.split("=>")[0]:t).slice(t.indexOf("(")+1,t.indexOf(")")).split(",").map(o=>o.trim()).filter(o=>o.includes("=")).length+e.length}function we(e,...t){let{message:r,validator:n,active:a,type:o,...u}=e,v=o==="__async"||n.constructor.name==="AsyncFunction";return {...{validator(S,...m){return e.validator(S,...q(m.length?m:t))},message(S,m){return typeof e.message=="function"?e.message(S,{...m,$params:q(m.$params?.length?m.$params:t)}):e.message},active(S,m){return typeof e.active=="function"?e.active(S,{...m,$params:q(m.$params?.length?m.$params:t)}):e.active??!0},exec(S){let m=e.validator(S,...q(t)),d;return m instanceof Promise?m.then(f=>(d=f,typeof d=="object"&&"$valid"in d?d.$valid:typeof d=="boolean"?d:!1)):(d=m,typeof d=="object"&&"$valid"in d?d.$valid:typeof d=="boolean"?d:!1)}},...u,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:v,_params:tt(t)}}function Oe(e){if(typeof e.validator=="function"){let r=we(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(rt(e.validator)>1){let a=function(...o){return we(e,...o)};return a.validator=r.validator,a.message=r.message,a.active=r.active,a.type=r.type,a.exec=r.exec,a._validator=r.validator,a._message=r.message,a._active=r.active,a._type=e.type,a._patched=!1,a._async=n,a}else return r}throw new Error("Validator must be a function")}function L(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function nt(e){return L(e.value)}function K(e){let t=e,r={}.toString.call(e).slice(8,-1);if(r=="Set"&&(t=new Set([...e].map(n=>K(n)))),r=="Map"&&(t=new Map([...e].map(n=>[K(n[0]),K(n[1])]))),r=="Date"&&(t=new Date(e.getTime())),r=="RegExp"&&(t=RegExp(e.source,xt(e))),r=="Array"||r=="Object"){t=Array.isArray(e)?[]:{};for(let n in e)t[n]=K(e[n]);}return t}function xt(e){if(typeof e.source.flags=="string")return e.source.flags;{let t=[];return e.global&&t.push("g"),e.ignoreCase&&t.push("i"),e.multiline&&t.push("m"),e.sticky&&t.push("y"),e.unicode&&t.push("u"),t.join("")}}function Ae(e,t,r){return e instanceof Function?e(t,r??0):e}function at(e,t){vue.isRef(e)?e.value=t:e=t;}function lt(e,t){vue.isRef(e)?e.value=[]:e=[],t.forEach((r,n)=>{let a=vue.isRef(e)?e.value[n]:e[n];a={},de(a,t[n]);});}function de(e,t){Object.entries({...vue.unref(e),...t}).forEach(([r,n])=>{let a=vue.isRef(e)?e.value:e,o=vue.isRef(t[r])?t[r]._value:t[r],u=vue.isRef(a[r])?a[r].value:a[r];Array.isArray(a[r])?(a[r]=[],Array.isArray(o)&&o.forEach((v,E)=>{a[r][E]={},de(a[r][E],o[E]);})):L(o)?de(u,o):vue.isRef(a[r])?a[r].value=o:a[r]=o;});}function ee(e){return e==null?!0:e===!1?!1:e instanceof Date?isNaN(e.getTime()):Array.isArray(e)?e.length===0:typeof e=="object"&&e!=null?Object.keys(e).length===0:typeof e=="string"?!String(e.trim()).length:!1}function ye(e,t,r){let n,a=(...o)=>new Promise(u=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...o])).then(u);},t);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...o)=>new Promise(u=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...o])).then(u);},0);}),a}function Ct(e,t){let r=String(e).split("."),n=String(t).split(".");for(let a=0;a<Math.min(r.length,n.length);a++){let o=Number(r[a]),u=Number(n[a]);if(o>u)return 1;if(u>o)return -1;if(!isNaN(o)&&isNaN(u))return 1;if(isNaN(o)&&!isNaN(u))return -1}return 0}var ie=Ct(vue.version,"3.5.0")!==-1;function It(){return Math.floor(Math.random()*Date.now()).toString()}function Fe(){return typeof window>"u"?It():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(10)}function Me(){let e=vue.shallowRef(new Map),t=vue.shallowRef(new Map),r=vue.shallowRef(new Map),n=vue.shallowRef(new Map),a=vue.shallowRef(new Map),o=vue.shallowRef(new Map);function u(s){let l=t.value.get(s);if(l)return l;{let x=vue.ref({});return t.value.set(s,x),x}}function v(s){let l=r.value.get(s);if(l)return l;{let x=vue.ref([]);return r.value.set(s,x),x}}function E(s,l,x){o.value.set(`${s}-${l}`,x);}function $(s,l){return o.value.get(`${s}-${l}`)}function S(s,l){s&&l!=null&&o.value.delete(`${s}-${l}`);}function m(s,l){n.value.set(s,l);}function d(s){return n.value.get(s)??!1}function f(s,l){e.value.set(s,l);}function c(s,l){let x=e.value.get(s);return x?I(l,x)?{valid:!0}:{valid:!1}:void 0}function I(s,l){let x=Object.keys(l),V=Object.keys(s);return V.length!==x.length||!V.every(P=>x.includes(P))?!1:V.every(P=>{let h=s[P],w=l[P];return !w||!h||typeof h=="function"||typeof w=="function"||typeof h=="number"||typeof h=="boolean"?!1:h._params?h._params?.every((O,_)=>{if(typeof w=="number"||typeof w=="boolean")return !0;{let M=q(w._params),H=q(h._params);return M?.[_]===H?.[_]}}):!0})}function C(s){let l=a.value.get(s);if(l)return l;{let x=vue.ref(!1),V=vue.ref(!0),G=vue.ref({}),P=vue.ref(!1);return a.value.set(s,{$pending:x,$valid:V,$metadata:G,$validating:P}),{$pending:x,$valid:V,$metadata:G,$validating:P}}}return vue.onScopeDispose(()=>{e.value.clear(),t.value.clear(),r.value.clear(),n.value.clear(),a.value.clear(),o.value.clear();}),{addRuleDeclEntry:f,setDirtyEntry:m,checkRuleDeclEntry:c,getDirtyState:d,trySetRuleStatusRef:C,getFieldsEntry:u,getCollectionsEntry:v,getArrayStatus:$,addArrayStatus:E,deleteArrayStatus:S,arrayStatusStorage:o}}function ot(e,t){return L(e.value)&&L(t.value)&&!Object.entries(t.value).some(r=>me(r))}function st(e){return !!e.value&&"$each"in e.value}function it(e){return !!e.value&&L(e.value)}function me(e){return L(e)&&"_validator"in e}function ge(e){return typeof e.value!="function"}function Ve(e){return L(e)&&"$fields"in e}function je(e){return "$each"in e||"$errors"in e}function _e({field:e,silent:t=!1}){return Object.entries(e.$rules??{}).map(([r,n])=>t||!n.$valid&&e.$dirty&&!n.$validating?n.$message:null).filter(r=>!!r).reduce((r,n)=>typeof n=="string"?r?.concat([n]):r?.concat(n),[]).concat(e.$externalErrors??[])}function ct({$dirty:e,customMessages:t,rule:r,ruleKey:n,state:a,path:o,storage:u,$debounce:v}){let E=vue.effectScope(),$,S,m=vue.ref(!1),{$pending:d,$valid:f,$metadata:c,$validating:I}=u.trySetRuleStatusRef(`${o}.${n}`);function C(){$=E.run(()=>{let h=vue.computed(()=>({$invalid:!f.value,$params:H.value,...c.value})),w=vue.computed(()=>ge(r)?typeof r.value.active=="function"?r.value.active(a.value,h.value):r.value.active:!0),O=vue.computed(()=>{let y="",g=t?t[n]?.message:void 0;return g&&(typeof g=="function"?y=g(a.value,h.value):y=g),ge(r)&&(g&&!r.value._patched||(typeof r.value.message=="function"?y=r.value.message(a.value,h.value):y=r.value.message)),ee(y)&&(y="Error",console.warn(`No error message defined for ${o}.${n}`)),y}),_=vue.computed(()=>ge(r)&&r.value.type?r.value.type:n),M=vue.computed(()=>ge(r)?r.value.validator:r.value),H=vue.computed(()=>typeof r.value=="function"?[]:q(r.value._params??[])),D=vue.computed(()=>`${o}.${_.value}`);return {$active:w,$message:O,$type:_,$validator:M,$params:H,$path:D}}),S=vue.watch($.$params,V,{deep:!0});}C();function s(){f.value=!0,e.value&&(d.value=!0);}async function l(){let h=$.$validator.value,w=h(a.value,...$.$params.value),O=!1,_=a.value;try{s();let M;if(w instanceof Promise?M=await w:M=w,a.value!==_)return !0;if(typeof M=="boolean")O=M;else {let{$valid:H,...D}=M;O=H,c.value=D;}}catch{O=!1;}finally{d.value=!1;}return O}let x=ye(l,v??200);async function V(){I.value=!0;let h=!1;if(me(r.value)&&r.value._async)h=await x();else {let w=$.$validator.value,O=w(a.value,...$.$params.value);if(O instanceof Promise)console.warn('You used a async validator function on a non-async rule, please use "async await" or the "withAsync" helper');else if(O!=null)if(typeof O=="boolean")h=O;else {let{$valid:_,...M}=O;h=_,c.value=M;}}return f.value=h,I.value=!1,h}function G(){f.value=!0,c.value={},d.value=!1,I.value=!1,C();}function P(){S(),E.stop(),E=vue.effectScope();}return vue.reactive({...$,$pending:d,$valid:f,$metadata:c,_haveAsync:m,$validating:I,$validate:V,$unwatch:P,$watch:C,$reset:G})}function Ee({state:e,rulesDef:t,customMessages:r,path:n,fieldName:a,storage:o,options:u,externalErrors:v,onUnwatch:E,$isArray:$,initialState:S,shortcuts:m}){let d=vue.effectScope(),f,c=vue.ref(!1),I=vue.ref(!1),C=vue.ref([]),s,l,x,V,G,P=()=>{};function h(){C.value=v.value??[];}h();function w(){let j=t.value,U=o.checkRuleDeclEntry(n,j);y.value=Object.fromEntries(Object.entries(j).filter(([W])=>W.startsWith("$"))),D.value=Object.fromEntries(Object.entries(t.value).filter(([W])=>!W.startsWith("$")).map(([W,Q])=>{if(Q){let De=vue.toRef(()=>Q);return [W,ct({$dirty:c,customMessages:r,rule:De,ruleKey:W,state:e,path:n,storage:o,$debounce:y.value.$debounce})]}return []}).filter(W=>!!W.length)),M(),O(),U?.valid!=null&&(c.value=o.getDirtyState(n),c.value&&P()),o.addRuleDeclEntry(n,j);}function O(){P=f.$debounce.value?ye(H,f.$debounce.value??f.haveAnyAsyncRule?100:0):H;}function _(){D.value&&Object.entries(D.value).forEach(([j,U])=>{U.$unwatch();}),V(),c.value&&o.setDirtyEntry(n,c.value),s(),l(),x(),d.stop(),d=vue.effectScope(),E?.(),G?.();}function M(){D.value&&Object.entries(D.value).forEach(([j,U])=>{U.$watch();}),f=d.run(()=>{let j=vue.computed(()=>c.value),U=vue.computed(()=>y.value.$debounce),W=vue.computed(()=>y.value.$lazy!=null?y.value.$lazy:vue.unref(u.lazy)),Q=vue.computed(()=>y.value.$rewardEarly!=null?y.value.$rewardEarly:vue.unref(u.rewardEarly)),De=vue.computed(()=>y.value.$autoDirty!=null?y.value.$autoDirty:vue.unref(u.autoDirty)),gt=vue.computed(()=>Object.entries(D.value).some(([Z,J])=>J.$validating)),Ce=vue.computed(()=>pe.value&&!he.value&&c.value),Le=vue.computed(()=>Ce.value?_e({field:{$dirty:c.value,$externalErrors:C.value,$rules:D.value}}):[]),ze=vue.computed(()=>_e({field:{$dirty:c.value,$externalErrors:C.value,$rules:D.value},silent:!0})),Je=vue.computed(()=>!(pe.value||he.value)),he=vue.computed(()=>I.value||!Q.value?Object.entries(D.value).some(([Z,J])=>J.$pending):!1),pe=vue.computed(()=>C.value?.length?!0:!Q.value||Q.value&&I.value?Object.entries(D.value).some(([Z,J])=>!J.$valid):!1),Ye=vue.computed(()=>a),Ie=vue.computed(()=>c.value&&!ee(e.value)&&!gt.value?C.value?.length?!1:Q.value?Object.entries(D.value).every(([Z,J])=>J.$valid):!pe.value:!1),vt=vue.computed(()=>Object.entries(D.value).some(([Z,J])=>J._haveAsync));function $t(){m?.fields&&Object.entries(m.fields).forEach(([Z,J])=>{let St=vue.effectScope();Qe[Z]=St.run(()=>{let Xe=vue.ref();return vue.watchEffect(()=>{Xe.value=J({$dirty:c.value,$externalErrors:C.value,$value:e,$rules:D.value,$error:Ce.value,$pending:he.value,$invalid:pe.value,$valid:Ie.value,$errors:Le.value,$ready:Je.value,$silentErrors:ze.value,$anyDirty:j.value,$name:Ye.value});}),Xe});});}let Qe={};return $t(),vue.watch(Ie,Z=>{Z&&(I.value=!1);}),{$error:Ce,$pending:he,$invalid:pe,$valid:Ie,$debounce:U,$lazy:W,$errors:Le,$ready:Je,$silentErrors:ze,$rewardEarly:Q,$autoDirty:De,$anyDirty:j,$name:Ye,haveAnyAsyncRule:vt,$shortcuts:Qe}}),x=vue.watch(v,h),s=vue.watch(e,()=>{f.$autoDirty.value&&(c.value||(c.value=!0)),t.value instanceof Function&&w(),P(),f.$rewardEarly.value;},{deep:$?!0:ie?1:!0}),V=vue.watch(c,()=>{o.setDirtyEntry(n,c.value);}),l=vue.watch(f.$valid,j=>{f.$rewardEarly.value&&j&&(I.value=!1);}),G=vue.watch(f.haveAnyAsyncRule,O);}function H(){Object.entries(D.value).forEach(([j,U])=>{U.$validate();});}let D=vue.ref(),y=vue.ref();w();function g(){c.value=!1,C.value=[],Object.entries(D.value).forEach(([j,U])=>{U.$reset();}),f.$lazy.value||Object.entries(D.value).map(([j,U])=>U.$validate());}function p(){c.value||(c.value=!0,f.$rewardEarly.value,P());}let R=f.$debounce.value?ye(i,f.$debounce.value??0):i;async function i(){try{if(I.value=!0,f.$autoDirty.value&&c.value&&!f.$pending.value)return !f.$error.value;{let j=Object.entries(D.value).map(([W,Q])=>Q.$validate());return (await Promise.allSettled(j)).every(W=>W.status==="fulfilled"?W.value:!1)}}catch{return !1}}function b(){_(),e.value=at(e,S),g();}function T(j=!0){return c.value?e.value:null}function N(){C.value=[];}f.$lazy.value||i();let{$anyDirty:Y,$error:te,$errors:oe,$invalid:re,$name:B,$pending:F,$ready:A,$silentErrors:se,$valid:xe,$shortcuts:Se}=f;return vue.reactive({$dirty:c,$error:te,$errors:oe,$valid:xe,$invalid:re,$pending:F,$silentErrors:se,$anyDirty:Y,$ready:A,$name:B,$externalErrors:C,$value:e,$rules:D,...Se,$reset:g,$touch:p,$validate:R,$unwatch:_,$watch:M,$resetAll:b,$extractDirtyFields:T,$clearExternalErrors:N})}function ft({$id:e,path:t,index:r,options:n,storage:a,stateValue:o,customMessages:u,rules:v,externalErrors:E,initialState:$,shortcuts:S,fieldName:m}){let d=v.$key?v.$key:Fe(),f=`${t}.${String(d)}`;typeof o.value=="object"&&o.value!=null&&(o.value.$id?f=`${t}.${o.value.$id}`:Object.defineProperties(o.value,{$id:{value:d,enumerable:!1,configurable:!1,writable:!1}}));let c=vue.toRef(()=>E.value?.[r]),I=Te({state:o,rulesDef:vue.toRef(()=>v),customMessages:u,path:f,storage:a,options:n,externalErrors:c,initialState:$?.[r],shortcuts:S,fieldName:m});if(I){let C=o.value?.$id;I.$id=C??String(d),a.addArrayStatus(e,I.$id,I);}return I}function Rt({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:u,initialState:v,shortcuts:E,fieldName:$}){let S=vue.effectScope(),m,d=vue.effectScope(),f;if(Array.isArray(e.value)&&!t.value.$each)return null;let c=vue.ref(),I=vue.ref(e.value),C,s=vue.ref({}),l=a.getCollectionsEntry(n);f=d.run(()=>{let p=vue.computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(b=>typeof b!="object"):t.value.$each&&!(t.value.$each instanceof Function)?Object.values(t.value.$each).every(b=>me(b)):!1),R=vue.computed(()=>u.value?je(u.value)?u.value.$errors??[]:[]:[]),i=vue.computed(()=>u.value?je(u.value)?u.value.$each??[]:[]:[]);return {isPrimitiveArray:p,$externalErrorsField:R,$externalErrorsEach:i}}),x(),G();function x(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(c.value=Fe(),Object.defineProperties(e.value,{$id:{value:c.value,enumerable:!1,configurable:!1,writable:!1}})):e.value?.$id&&(c.value=e.value.$id)),!f.isPrimitiveArray.value&&(I.value=s.value.$value,Array.isArray(e.value)&&t.value.$each?l.value=e.value.map((p,R)=>{let i=Ae(t.value.$each,vue.toRef(()=>p),R);if(i){let b=ft({$id:c.value,path:n,rules:i,stateValue:vue.toRef(()=>p),index:R,options:o,storage:a,externalErrors:f.$externalErrorsEach,initialState:v[R],shortcuts:E,fieldName:$});return b||null}}).filter(p=>!!p):l.value=[],s.value=Ee({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:f.$externalErrorsField,$isArray:!0,initialState:v,shortcuts:E,fieldName:$}));}function V(){if(Array.isArray(e.value)){let p=K(l.value);l.value=e.value.map((R,i)=>{let b=vue.toRef(()=>R);if(R.$id&&l.value.find(T=>T.$id===R.$id)){let T=a.getArrayStatus(c.value,R.$id);return T?(T.$value=b,T):null}else {let T=Ae(t.value.$each,b,i);if(T){let N=ft({$id:c.value,path:n,rules:T,stateValue:b,index:i,options:o,storage:a,externalErrors:f.$externalErrorsEach,initialState:v[i],fieldName:$});return N||null}}}).filter(R=>!!R),p.filter(R=>!e.value.find(i=>R.$id===i.$id)).forEach((R,i)=>{a.deleteArrayStatus(c.value,i.toString());});}else l.value=[];}function G(){C=vue.watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")?x():V();},{deep:ie?1:!0,flush:"pre"}),m=S.run(()=>{let p=vue.computed(()=>s.value.$dirty&&l.value.every(A=>A.$dirty)),R=vue.computed(()=>s.value.$anyDirty||l.value.some(A=>A.$dirty)),i=vue.computed(()=>s.value.$invalid||l.value.some(A=>A.$invalid)),b=vue.computed(()=>s.value.$valid&&l.value.every(A=>A.$valid)),T=vue.computed(()=>s.value.$error||l.value.some(A=>A.$error)),N=vue.computed(()=>!(i.value||Y.value)),Y=vue.computed(()=>s.value.$pending||l.value.some(A=>A.$pending)),te=vue.computed(()=>({$errors:s.value.$errors,$each:l.value.map(A=>A.$errors)})),oe=vue.computed(()=>({$errors:s.value.$silentErrors,$each:l.value.map(A=>A.$silentErrors)})),re=vue.computed(()=>$);function B(){E?.collections&&Object.entries(E?.collections).forEach(([A,se])=>{let xe=vue.effectScope();F[A]=xe.run(()=>{let Se=vue.ref();return vue.watchEffect(()=>{Se.value=se({$dirty:p.value,$error:T.value,$pending:Y.value,$invalid:i.value,$valid:b.value,$errors:te.value,$ready:N.value,$silentErrors:oe.value,$anyDirty:R.value,$name:re.value,$each:l.value,$field:s.value,$value:e});}),Se});});}let F={};return B(),{$dirty:p,$anyDirty:R,$invalid:i,$valid:b,$error:T,$pending:Y,$errors:te,$silentErrors:oe,$ready:N,$name:re,$shortcuts:F}}),f.isPrimitiveArray.value&&(console.warn(`${n} is a Array of primitives. Tracking can be lost when reassigning the Array. We advise to use an Array of objects instead`),C());}function P(){C&&C(),s.value&&s.value.$unwatch(),l.value&&l.value.forEach(p=>{"$dirty"in p&&p.$unwatch();}),S.stop(),S=vue.effectScope(),d.stop(),d=vue.effectScope(!0);}function h(){s.value.$touch(),l.value.forEach(p=>{p.$touch();});}function w(){s.value.$reset(),l.value.forEach(p=>{p.$reset();});}async function O(){try{return (await Promise.all([s.value.$validate(),...l.value.map(R=>R.$validate())])).every(R=>!!R)}catch{return !1}}function _(){s.value.$clearExternalErrors(),l.value.forEach(p=>{p.$clearExternalErrors();});}function M(p=!0){let R=l.value.map(i=>{if(Ve(i))return i.$extractDirtyFields(p)});return p&&(R=R.filter(i=>L(i)?!ee(i):!!i)),R}function H(){console.log(v),P(),lt(e,v),w();}async function D(){return h(),await O()?e.value:!1}let{$shortcuts:y,...g}=m;return vue.reactive({$field:s,...g,...y,$each:l,$value:e,$validate:O,$unwatch:P,$watch:G,$touch:h,$reset:w,$resetAll:H,$extractDirtyFields:M,$parse:D,$clearExternalErrors:_})}function Be({scopeRules:e,state:t,customMessages:r,path:n="",rootRules:a,storage:o,options:u,externalErrors:v,validationGroups:E,initialState:$,shortcuts:S,fieldName:m}){let d,f,c=null;function s(y=!0){l.value=null,vue.triggerRef(l);let g=Object.fromEntries(Object.entries(e.value).map(([i,b])=>{if(b){let T=vue.toRef(t.value,i),N=vue.toRef(()=>b),Y=vue.toRef(()=>v.value?.[i]);return [i,Te({state:T,rulesDef:N,customMessages:r,path:n?`${n}.${i}`:i,storage:o,options:u,externalErrors:Y,initialState:$?.[i],shortcuts:S,fieldName:i})]}return []}).filter(i=>!!i.length&&i[1]!=null)),p=Object.fromEntries(Object.entries(vue.unref(v)??{}).filter(([i])=>!(i in e.value)).map(([i,b])=>{if(b){let T=vue.toRef(()=>({})),N=vue.toRef(()=>b);return [i,Te({state:vue.ref(void 0),rulesDef:T,customMessages:r,path:n?`${n}.${i}`:i,storage:o,options:u,externalErrors:N,initialState:$?.[i],fieldName:i})]}return []})),R=Object.fromEntries(Object.entries(E?.(g)??{}).map(([i,b])=>b.length?[i,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(T=>[T,Ke(vue.toRef(()=>b),T)])),...Object.fromEntries(["$errors","$silentErrors"].map(T=>[T,et(vue.toRef(()=>b),T)]))}]:[]));l.value={...g,...p,...R},y&&P();}let l=o.getFieldsEntry(n);s();function x(){s(!1),Object.entries(l.value).forEach(([y,g])=>{g.$reset();}),P();}function V(){Object.entries(l.value).forEach(([y,g])=>{g.$touch();});}async function G(){try{return (await Promise.allSettled(Object.entries(l.value).map(([g,p])=>p.$validate()))).every(g=>g.status==="fulfilled"?g.value:!1)}catch{return !1}}function P(){a&&(c=vue.watch(a,()=>{h(),s();},{deep:ie?1:!0,flush:"post"})),d=vue.effectScope(),f=d.run(()=>{let y=vue.computed(()=>!!Object.entries(l.value).length&&Object.entries(l.value).every(([B,F])=>F.$dirty)),g=vue.computed(()=>Object.entries(l.value).some(([B,F])=>F.$dirty)),p=vue.computed(()=>Object.entries(l.value).some(([B,F])=>F.$invalid)),R=vue.computed(()=>Object.entries(l.value).every(([B,F])=>F.$valid)),i=vue.computed(()=>y.value&&!T.value&&p.value),b=vue.computed(()=>!(p.value||T.value)),T=vue.computed(()=>Object.entries(l.value).some(([B,F])=>F.$pending)),N=vue.computed(()=>Object.fromEntries(Object.entries(l.value).map(([B,F])=>[B,F.$errors]))),Y=vue.computed(()=>Object.fromEntries(Object.entries(l.value).map(([B,F])=>[B,F.$silentErrors]))),te=vue.computed(()=>m);function oe(){S?.nested&&Object.entries(S.nested).forEach(([B,F])=>{let A=vue.effectScope();re[B]=A.run(()=>{let se=vue.ref();return vue.watchEffect(()=>{se.value=F({$dirty:y.value,$value:t,$error:i.value,$pending:T.value,$invalid:p.value,$valid:R.value,$ready:b.value,$anyDirty:g.value,$name:te.value,$silentErrors:Y.value,$errors:N.value,$fields:l.value});}),se});});}let re={};return oe(),{$dirty:y,$anyDirty:g,$invalid:p,$valid:R,$error:i,$pending:T,$errors:N,$silentErrors:Y,$ready:b,$name:te,$shortcuts:re}});}function h(){l.value&&Object.entries(l.value).forEach(([y,g])=>{g.$unwatch();}),c?.(),d.stop(),d=vue.effectScope();}function w(){Object.entries(l.value).forEach(([y,g])=>{g.$clearExternalErrors();});}function O(){h(),de(t,$??{}),x();}function _(y=!0){let g=Object.entries(l.value).map(([p,R])=>[p,R.$extractDirtyFields(y)]);return y&&(g=g.filter(([p,R])=>L(R)?!ee(R):Array.isArray(R)?R.length:!!R)),Object.fromEntries(g)}async function M(){return V(),await G()?t.value:!1}let{$shortcuts:H,...D}=f;return vue.reactive({...D,...H,$fields:l,$value:t,$resetAll:O,$reset:x,$touch:V,$validate:G,$unwatch:h,$watch:P,$clearExternalErrors:w,$extractDirtyFields:_,$parse:M})}function Te({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:u,index:v,initialState:E,shortcuts:$,onUnwatch:S,fieldName:m}){return st(t)?Rt({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,index:v,externalErrors:u,initialState:E,fieldName:m,shortcuts:$}):ot(e,t)&&nt(e)?Be({scopeRules:t,state:e,customMessages:r,path:n,storage:a,options:o,index:v,initialState:E,shortcuts:$,fieldName:m,externalErrors:u}):it(t)?Ee({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,index:v,externalErrors:u,onUnwatch:S,shortcuts:$,initialState:E,fieldName:m}):null}function Ue({initialState:e,options:t,scopeRules:r,state:n,customRules:a,shortcuts:o}){let u=Me(),v=vue.computed(()=>vue.unref(t.externalErrors));return vue.reactive(Be({rootRules:r,scopeRules:r,state:n,customMessages:a?.(),storage:u,options:t,externalErrors:v,validationGroups:t.validationGroups,initialState:e,shortcuts:o,fieldName:"root"}))}function We(e,t,r){let n={autoDirty:t?.autoDirty??!0,lazy:t?.lazy??!1,rewardEarly:t?.rewardEarly??!1};function a(o,u,v){let E=vue.isRef(u)?u:vue.computed(typeof u=="function"?u:()=>u),$={...n,...v},S=vue.isRef(o)?o:vue.ref(o),m=K(vue.toRaw(S.value));return {r$:Ue({scopeRules:E,state:S,options:$,initialState:m,customRules:e,shortcuts:r})}}return a}var yt=We();function He(){function e(t,r){return r}return e}var qe=He();function mt({rules:e,modifiers:t,shortcuts:r}){let n=We(e,t,r),a=He();return {useRegle:n,inferRules:a}}exports.InternalRuleType=Pe;exports.createRule=Oe;exports.defineRegleConfig=mt;exports.inferRules=qe;exports.unwrapRuleParameters=q;exports.useRegle=yt;
1
+ 'use strict';var vue=require('vue');var Pe=(r=>(r.Inline="__inline",r.Async="__async",r))(Pe||{});function Ke(e,t){return vue.computed(()=>e.value.some(r=>r[t]))}function et(e,t){return vue.computed(()=>e.value.reduce((r,n)=>{let a=n[t]||[];return r.concat(a)},[]))}function q(e){return e.map(t=>t instanceof Function?t():vue.unref(t))}function tt(e){return e.map(t=>t instanceof Function||vue.isRef(t)?t:vue.toRef(()=>t))}function rt(e){let t=e.toString();return (t.includes("=>")?t.split("=>")[0]:t).slice(t.indexOf("(")+1,t.indexOf(")")).split(",").map(o=>o.trim()).filter(o=>o.includes("=")).length+e.length}function we(e,...t){let{message:r,validator:n,active:a,type:o,...c}=e,S=o==="__async"||n.constructor.name==="AsyncFunction";return {...{validator($,...g){return e.validator($,...q(g.length?g:t))},message($,g){return typeof e.message=="function"?e.message($,{...g,$params:q(g.$params?.length?g.$params:t)}):e.message},active($,g){return typeof e.active=="function"?e.active($,{...g,$params:q(g.$params?.length?g.$params:t)}):e.active??!0},exec($){let g=e.validator($,...q(t)),y;return g instanceof Promise?g.then(v=>(y=v,typeof y=="object"&&"$valid"in y?y.$valid:typeof y=="boolean"?y:!1)):(y=g,typeof y=="object"&&"$valid"in y?y.$valid:typeof y=="boolean"?y:!1)}},...c,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:S,_params:tt(t)}}function Oe(e){if(typeof e.validator=="function"){let r=we(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(rt(e.validator)>1){let a=function(...o){return we(e,...o)};return a.validator=r.validator,a.message=r.message,a.active=r.active,a.type=r.type,a.exec=r.exec,a._validator=r.validator,a._message=r.message,a._active=r.active,a._type=e.type,a._patched=!1,a._async=n,a}else return r}throw new Error("Validator must be a function")}function L(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function nt(e){return L(e.value)}function te(e){let t=e,r={}.toString.call(e).slice(8,-1);if(r=="Set"&&(t=new Set([...e].map(n=>te(n)))),r=="Map"&&(t=new Map([...e].map(n=>[te(n[0]),te(n[1])]))),r=="Date"&&(t=new Date(e.getTime())),r=="RegExp"&&(t=RegExp(e.source,Tt(e))),r=="Array"||r=="Object"){t=Array.isArray(e)?[]:{};for(let n in e)t[n]=te(e[n]);}return t}function Tt(e){if(typeof e.source.flags=="string")return e.source.flags;{let t=[];return e.global&&t.push("g"),e.ignoreCase&&t.push("i"),e.multiline&&t.push("m"),e.sticky&&t.push("y"),e.unicode&&t.push("u"),t.join("")}}function Ae(e,t,r){return e instanceof Function?e(t,r??0):e}function at(e,t){vue.isRef(e)?e.value=t:e=t;}function lt(e,t){vue.isRef(e)?e.value=[]:e=[],t.forEach((r,n)=>{let a=vue.isRef(e)?e.value[n]:e[n];a={},pe(a,t[n]);});}function pe(e,t){Object.entries({...vue.unref(e),...t}).forEach(([r,n])=>{let a=vue.isRef(e)?e.value:e,o=vue.isRef(t[r])?t[r]._value:t[r],c=vue.isRef(a[r])?a[r].value:a[r];Array.isArray(a[r])?(a[r]=[],Array.isArray(o)&&o.forEach((S,b)=>{a[r][b]={},pe(a[r][b],o[b]);})):L(o)?pe(c,o):vue.isRef(a[r])?a[r].value=o:a[r]=o;});}function Q(e){return e==null?!0:e===!1?!1:e instanceof Date?isNaN(e.getTime()):Array.isArray(e)?e.length===0:typeof e=="object"&&e!=null?Object.keys(e).length===0:typeof e=="string"?!String(e.trim()).length:!1}function he(e,t,r){let n,a=(...o)=>new Promise(c=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...o])).then(c);},t);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...o)=>new Promise(c=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...o])).then(c);},0);}),a}function Dt(e,t){let r=String(e).split("."),n=String(t).split(".");for(let a=0;a<Math.min(r.length,n.length);a++){let o=Number(r[a]),c=Number(n[a]);if(o>c)return 1;if(c>o)return -1;if(!isNaN(o)&&isNaN(c))return 1;if(isNaN(o)&&!isNaN(c))return -1}return 0}var se=Dt(vue.version,"3.5.0")!==-1;function Ct(){return Math.floor(Math.random()*Date.now()).toString()}function Fe(){return typeof window>"u"?Ct():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(10)}function Me(){let e=vue.shallowRef(new Map),t=vue.shallowRef(new Map),r=vue.shallowRef(new Map),n=vue.shallowRef(new Map),a=vue.shallowRef(new Map),o=vue.shallowRef(new Map);function c(s){let l=t.value.get(s);if(l)return l;{let x=vue.ref({});return t.value.set(s,x),x}}function S(s){let l=r.value.get(s);if(l)return l;{let x=vue.ref([]);return r.value.set(s,x),x}}function b(s,l,x){o.value.set(`${s}-${l}`,x);}function h(s,l){return o.value.get(`${s}-${l}`)}function $(s,l){s&&l!=null&&o.value.delete(`${s}-${l}`);}function g(s,l){n.value.set(s,l);}function y(s){return n.value.get(s)??!1}function v(s,l){e.value.set(s,l);}function f(s,l){let x=e.value.get(s);return x?I(l,x)?{valid:!0}:{valid:!1}:void 0}function I(s,l){let x=Object.keys(l),V=Object.keys(s);return V.length!==x.length||!V.every(P=>x.includes(P))?!1:V.every(P=>{let E=s[P],w=l[P];return !w||!E||typeof E=="function"||typeof w=="function"||typeof E=="number"||typeof E=="boolean"?!1:E._params?E._params?.every((A,_)=>{if(typeof w=="number"||typeof w=="boolean")return !0;{let M=q(w._params),U=q(E._params);return M?.[_]===U?.[_]}}):!0})}function D(s){let l=a.value.get(s);if(l)return l;{let x=vue.ref(!1),V=vue.ref(!0),G=vue.ref({}),P=vue.ref(!1);return a.value.set(s,{$pending:x,$valid:V,$metadata:G,$validating:P}),{$pending:x,$valid:V,$metadata:G,$validating:P}}}return vue.onScopeDispose(()=>{e.value.clear(),t.value.clear(),r.value.clear(),n.value.clear(),a.value.clear(),o.value.clear();}),{addRuleDeclEntry:v,setDirtyEntry:g,checkRuleDeclEntry:f,getDirtyState:y,trySetRuleStatusRef:D,getFieldsEntry:c,getCollectionsEntry:S,getArrayStatus:h,addArrayStatus:b,deleteArrayStatus:$,arrayStatusStorage:o}}function ot(e,t){return L(e.value)&&L(t.value)&&!Object.entries(t.value).some(r=>de(r))}function st(e,t){return !!e.value&&"$each"in e.value||Array.isArray(t.value)}function ut(e){return !!e.value&&L(e.value)}function de(e){return L(e)&&"_validator"in e}function ve(e){return typeof e.value!="function"}function je(e){return L(e)&&"$fields"in e}function Ve(e){return "$each"in e||"$errors"in e}function _e({field:e,silent:t=!1}){return Object.entries(e.$rules??{}).map(([r,n])=>t||!n.$valid&&e.$dirty&&!n.$validating?n.$message:null).filter(r=>!!r).reduce((r,n)=>typeof n=="string"?r?.concat([n]):r?.concat(n),[]).concat(e.$dirty?e.$externalErrors??[]:[])}function ct({$dirty:e,customMessages:t,rule:r,ruleKey:n,state:a,path:o,storage:c,$debounce:S}){let b=vue.effectScope(),h,$,g=vue.ref(!1),{$pending:y,$valid:v,$metadata:f,$validating:I}=c.trySetRuleStatusRef(`${o}.${n}`);function D(){h=b.run(()=>{let E=vue.computed(()=>({$invalid:!v.value,$params:U.value,...f.value})),w=vue.computed(()=>ve(r)?typeof r.value.active=="function"?r.value.active(a.value,E.value):!!r.value.active:!0),A=vue.computed(()=>{let p="",u=t?t[n]?.message:void 0;return u&&(typeof u=="function"?p=u(a.value,E.value):p=u),ve(r)&&(u&&!r.value._patched||(typeof r.value.message=="function"?p=r.value.message(a.value,E.value):p=r.value.message)),Q(p)&&(p="Error",console.warn(`No error message defined for ${o}.${n}`)),p}),_=vue.computed(()=>ve(r)&&r.value.type?r.value.type:n),M=vue.computed(()=>ve(r)?r.value.validator:r.value),U=vue.computed(()=>typeof r.value=="function"?[]:q(r.value._params??[])),R=vue.computed(()=>`${o}.${_.value}`);return {$active:w,$message:A,$type:_,$validator:M,$params:U,$path:R}}),$=vue.watch(h.$params,V,{deep:!0});}D();function s(){v.value=!0,e.value&&(y.value=!0);}async function l(){let E=h.$validator.value,w=E(a.value,...h.$params.value),A=!1,_=a.value;try{s();let M;if(w instanceof Promise?M=await w:M=w,a.value!==_)return !0;if(typeof M=="boolean")A=M;else {let{$valid:U,...R}=M;A=U,f.value=R;}}catch{A=!1;}finally{y.value=!1;}return A}let x=he(l,S??200);async function V(){try{I.value=!0;let E=!1;if(de(r.value)&&r.value._async)E=await x();else {let w=h.$validator.value,A=w(a.value,...h.$params.value);if(A instanceof Promise)console.warn('You used a async validator function on a non-async rule, please use "async await" or the "withAsync" helper');else if(A!=null)if(typeof A=="boolean")E=A;else {let{$valid:_,...M}=A;E=_,f.value=M;}}return v.value=E,E}catch{return !1}finally{I.value=!1;}}function G(){v.value=!0,f.value={},y.value=!1,I.value=!1,D();}function P(){$(),b.stop(),b=vue.effectScope();}return vue.reactive({...h,$pending:y,$valid:v,$metadata:f,_haveAsync:g,$validating:I,$validate:V,$unwatch:P,$watch:D,$reset:G})}function Ee({state:e,rulesDef:t,customMessages:r,path:n,fieldName:a,storage:o,options:c,externalErrors:S,onUnwatch:b,$isArray:h,initialState:$,shortcuts:g}){let y=vue.effectScope(),v,f=vue.ref(!1),I=vue.ref(!1),D=vue.ref([]),s,l,x,V,G,P=()=>{};function E(){D.value=S.value??[];}E();function w(){let j=t.value,J=o.checkRuleDeclEntry(n,j);p.value=Object.fromEntries(Object.entries(j).filter(([W])=>W.startsWith("$"))),R.value=Object.fromEntries(Object.entries(t.value).filter(([W])=>!W.startsWith("$")).map(([W,Z])=>{if(Z){let De=vue.toRef(()=>Z);return [W,ct({$dirty:f,customMessages:r,rule:De,ruleKey:W,state:e,path:n,storage:o,$debounce:p.value.$debounce})]}return []}).filter(W=>!!W.length)),M(),A(),J?.valid!=null&&(f.value=o.getDirtyState(n),f.value&&P()),o.addRuleDeclEntry(n,j);}function A(){P=v.$debounce.value?he(U,v.$debounce.value??v.haveAnyAsyncRule?100:0):U;}function _(){R.value&&Object.entries(R.value).forEach(([j,J])=>{J.$unwatch();}),V(),f.value&&o.setDirtyEntry(n,f.value),s(),l(),x(),y.stop(),y=vue.effectScope(),b?.(),G?.();}function M(){R.value&&Object.entries(R.value).forEach(([j,J])=>{J.$watch();}),v=y.run(()=>{let j=vue.computed(()=>f.value),J=vue.computed(()=>p.value.$debounce),W=vue.computed(()=>p.value.$lazy!=null?p.value.$lazy:vue.unref(c.lazy)),Z=vue.computed(()=>p.value.$rewardEarly!=null?p.value.$rewardEarly:vue.unref(c.rewardEarly)),De=vue.computed(()=>p.value.$clearExternalErrorsOnChange!=null?p.value.$clearExternalErrorsOnChange:vue.unref(c.clearExternalErrorsOnChange)),yt=vue.computed(()=>p.value.$autoDirty!=null?p.value.$autoDirty:vue.unref(c.autoDirty)),qe=vue.computed(()=>Object.entries(R.value).some(([ee,Y])=>Y.$validating)),Ce=vue.computed(()=>Re.value&&!Se.value&&f.value),Le=vue.computed(()=>Ce.value?_e({field:{$dirty:f.value,$externalErrors:D.value,$rules:R.value}}):[]),ze=vue.computed(()=>_e({field:{$dirty:f.value,$externalErrors:D.value,$rules:R.value},silent:!0})),Je=vue.computed(()=>!(Re.value||Se.value)),Se=vue.computed(()=>I.value||!Z.value?Object.entries(R.value).some(([ee,Y])=>Y.$pending):!1),Re=vue.computed(()=>D.value?.length?!0:Q(R.value)?!1:!Z.value||Z.value&&I.value?Object.entries(R.value).some(([ee,Y])=>!Y.$valid):!1),Ye=vue.computed(()=>a),Ie=vue.computed(()=>Q(R.value)?!1:f.value&&!Q(e.value)&&!qe.value?D.value?.length?!1:Z.value?Object.entries(R.value).every(([ee,Y])=>Y.$valid):!Re.value:!1),gt=vue.computed(()=>Object.entries(R.value).some(([ee,Y])=>Y._haveAsync));function mt(){g?.fields&&Object.entries(g.fields).forEach(([ee,Y])=>{let $t=vue.effectScope();Qe[ee]=$t.run(()=>{let Xe=vue.ref();return vue.watchEffect(()=>{Xe.value=Y({$dirty:f.value,$externalErrors:D.value,$value:e,$rules:R.value,$error:Ce.value,$pending:Se.value,$invalid:Re.value,$valid:Ie.value,$errors:Le.value,$ready:Je.value,$silentErrors:ze.value,$anyDirty:j.value,$name:Ye.value});}),Xe});});}let Qe={};return mt(),vue.watch(Ie,ee=>{ee&&(I.value=!1);}),{$error:Ce,$pending:Se,$invalid:Re,$valid:Ie,$debounce:J,$lazy:W,$errors:Le,$ready:Je,$silentErrors:ze,$rewardEarly:Z,$autoDirty:yt,$clearExternalErrorsOnChange:De,$anyDirty:j,$name:Ye,haveAnyAsyncRule:gt,$shortcuts:Qe,$validating:qe}}),x=vue.watch(S,E),s=vue.watch(e,()=>{v.$autoDirty.value&&(f.value||(f.value=!0)),t.value instanceof Function&&w(),P(),v.$rewardEarly.value!==!0&&v.$clearExternalErrorsOnChange.value&&C();},{deep:h?!0:se?1:!0}),V=vue.watch(f,()=>{o.setDirtyEntry(n,f.value);}),l=vue.watch(v.$valid,j=>{v.$rewardEarly.value&&j&&(I.value=!1);}),G=vue.watch(v.haveAnyAsyncRule,A);}function U(){Object.values(R.value).forEach(j=>{j.$validate();});}let R=vue.ref(),p=vue.ref();w();function u(){f.value=!1,D.value=[],Object.entries(R.value).forEach(([j,J])=>{J.$reset();}),v.$lazy.value||Object.entries(R.value).map(([j,J])=>J.$validate());}function d(j=!0){f.value||(f.value=!0,j&&P());}async function m(){try{if(I.value=!0,!f.value)f.value=!0;else if(v.$autoDirty.value&&f.value&&!v.$pending.value)return !v.$error.value;return (await Promise.allSettled(Object.entries(R.value).map(([W,Z])=>Z.$validate()))).every(W=>W.status==="fulfilled"?!!W.value:!1)?e.value:!1}catch{return !1}}function i(){_(),e.value=at(e,$),u();}function T(j=!0){return f.value?e.value:null}function C(){D.value=[];}v.$lazy.value||P();let{$anyDirty:B,$error:H,$errors:le,$invalid:re,$name:k,$pending:F,$ready:O,$silentErrors:oe,$valid:xe,$shortcuts:$e,$validating:Qt}=v;return vue.reactive({$dirty:f,$error:H,$errors:le,$valid:xe,$invalid:re,$pending:F,$silentErrors:oe,$anyDirty:B,$ready:O,$name:k,$externalErrors:D,$value:e,$rules:R,...$e,$reset:u,$touch:d,$validate:m,$unwatch:_,$watch:M,$resetAll:i,$extractDirtyFields:T,$clearExternalErrors:C})}function ft({$id:e,path:t,index:r,options:n,storage:a,stateValue:o,customMessages:c,rules:S,externalErrors:b,initialState:h,shortcuts:$,fieldName:g}){let y=S.$key?S.$key:Fe(),v=`${t}.${String(y)}`;typeof o.value=="object"&&o.value!=null&&(o.value.$id?v=`${t}.${o.value.$id}`:Object.defineProperties(o.value,{$id:{value:y,enumerable:!1,configurable:!1,writable:!1}}));let f=vue.toRef(()=>b.value?.[r]),I=me({state:o,rulesDef:vue.toRef(()=>S),customMessages:c,path:v,storage:a,options:n,externalErrors:f,initialState:h?.[r],shortcuts:$,fieldName:g});if(I){let D=o.value?.$id;I.$id=D??String(y),a.addArrayStatus(e,I.$id,I);}return I}function Rt({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:c,initialState:S,shortcuts:b,fieldName:h}){let $=vue.effectScope(),g,y=vue.effectScope(),v;if(!Array.isArray(e.value)&&!t.value.$each)return null;let f=vue.ref(),I=vue.ref(e.value),D,s=vue.ref({}),l=a.getCollectionsEntry(n);v=y.run(()=>{let u=vue.computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(i=>typeof i!="object"):t.value.$each&&!(t.value.$each instanceof Function)?Object.values(t.value.$each).every(i=>de(i)):!1),d=vue.computed(()=>c.value?Ve(c.value)?c.value.$errors??[]:[]:[]),m=vue.computed(()=>c.value?Ve(c.value)?c.value.$each??[]:[]:[]);return {isPrimitiveArray:u,$externalErrorsField:d,$externalErrorsEach:m}}),x(),G();function x(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(f.value=Fe(),Object.defineProperties(e.value,{$id:{value:f.value,enumerable:!1,configurable:!1,writable:!1}})):e.value?.$id&&(f.value=e.value.$id)),!v.isPrimitiveArray.value&&(I.value=s.value.$value,Array.isArray(e.value)?l.value=e.value.map((u,d)=>{let m=Ae(t.value.$each,vue.toRef(()=>u),d),i=ft({$id:f.value,path:n,rules:m??{},stateValue:vue.toRef(()=>u),index:d,options:o,storage:a,externalErrors:v.$externalErrorsEach,initialState:S[d],shortcuts:b,fieldName:h});return i||null}).filter(u=>!!u):l.value=[],s.value=Ee({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:v.$externalErrorsField,$isArray:!0,initialState:S,shortcuts:b,fieldName:h}));}function V(){if(Array.isArray(e.value)){let u=te(l.value);l.value=e.value.map((d,m)=>{let i=vue.toRef(()=>d);if(d.$id&&l.value.find(T=>T.$id===d.$id)){let T=a.getArrayStatus(f.value,d.$id);return T?(T.$value=i,T):null}else {let T=Ae(t.value.$each,i,m);if(T){let C=ft({$id:f.value,path:n,rules:T,stateValue:i,index:m,options:o,storage:a,externalErrors:v.$externalErrorsEach,initialState:S[m],shortcuts:b,fieldName:h});return C||null}}}).filter(d=>!!d),u.filter(d=>!e.value.find(m=>d.$id===m.$id)).forEach((d,m)=>{a.deleteArrayStatus(f.value,m.toString());});}else l.value=[];}function G(){D=vue.watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")?x():V();},{deep:se?1:!0,flush:"pre"}),g=$.run(()=>{let u=vue.computed(()=>s.value.$dirty&&l.value.every(O=>O.$dirty)),d=vue.computed(()=>s.value.$anyDirty||l.value.some(O=>O.$dirty)),m=vue.computed(()=>s.value.$invalid||l.value.some(O=>O.$invalid)),i=vue.computed(()=>(Q(s.value.$rules)?!0:s.value.$valid)&&l.value.every(O=>O.$valid)),T=vue.computed(()=>s.value.$error||l.value.some(O=>O.$error)),C=vue.computed(()=>!(m.value||B.value)),B=vue.computed(()=>s.value.$pending||l.value.some(O=>O.$pending)),H=vue.computed(()=>({$errors:s.value.$errors,$each:l.value.map(O=>O.$errors)})),le=vue.computed(()=>({$errors:s.value.$silentErrors,$each:l.value.map(O=>O.$silentErrors)})),re=vue.computed(()=>h);function k(){b?.collections&&Object.entries(b?.collections).forEach(([O,oe])=>{let xe=vue.effectScope();F[O]=xe.run(()=>{let $e=vue.ref();return vue.watchEffect(()=>{$e.value=oe({$dirty:u.value,$error:T.value,$pending:B.value,$invalid:m.value,$valid:i.value,$errors:H.value,$ready:C.value,$silentErrors:le.value,$anyDirty:d.value,$name:re.value,$each:l.value,$field:s.value,$value:e});}),$e});});}let F={};return k(),{$dirty:u,$anyDirty:d,$invalid:m,$valid:i,$error:T,$pending:B,$errors:H,$silentErrors:le,$ready:C,$name:re,$shortcuts:F}}),v.isPrimitiveArray.value&&(console.warn(`${n} is a Array of primitives. Tracking can be lost when reassigning the Array. We advise to use an Array of objects instead`),D());}function P(){D&&D(),s.value&&s.value.$unwatch(),l.value&&l.value.forEach(u=>{"$dirty"in u&&u.$unwatch();}),$.stop(),$=vue.effectScope(),y.stop(),y=vue.effectScope(!0);}function E(u=!0){s.value.$touch(u),l.value.forEach(d=>{d.$touch(u);});}function w(){s.value.$reset(),l.value.forEach(u=>{u.$reset();});}async function A(){try{return (await Promise.all([s.value.$validate(),...l.value.map(m=>m.$validate())])).every(m=>m.value!==!1)?e.value:!1}catch{return !1}}function _(){s.value.$clearExternalErrors(),l.value.forEach(u=>{u.$clearExternalErrors();});}function M(u=!0){let d=l.value.map(m=>{if(je(m))return m.$extractDirtyFields(u)});return u&&(d=d.filter(m=>L(m)?!Q(m):!!m)),d}function U(){P(),lt(e,S),w();}let{$shortcuts:R,...p}=g;return vue.reactive({$field:s,...p,...R,$each:l,$value:e,$validate:A,$unwatch:P,$watch:G,$touch:E,$reset:w,$resetAll:U,$extractDirtyFields:M,$clearExternalErrors:_})}function Be({scopeRules:e,state:t,customMessages:r,path:n="",rootRules:a,storage:o,options:c,externalErrors:S,validationGroups:b,initialState:h,shortcuts:$,fieldName:g}){let y,v,f=null;function s(R=!0){l.value=null,vue.triggerRef(l);let p=Object.fromEntries(Object.entries(e.value).map(([i,T])=>{if(T){let C=vue.toRef(t.value,i),B=vue.toRef(()=>T),H=vue.toRef(()=>S.value?.[i]);return [i,me({state:C,rulesDef:B,customMessages:r,path:n?`${n}.${i}`:i,storage:o,options:c,externalErrors:H,initialState:h?.[i],shortcuts:$,fieldName:i})]}return []}).filter(i=>!!i.length&&i[1]!=null)),u=Object.fromEntries(Object.entries(vue.unref(S)??{}).filter(([i])=>!(i in e.value)).map(([i,T])=>{if(T){let C=vue.toRef(t.value,i),B=vue.toRef(()=>({})),H=vue.toRef(()=>T);return [i,me({state:C,rulesDef:B,customMessages:r,path:n?`${n}.${i}`:i,storage:o,options:c,externalErrors:H,initialState:h?.[i],shortcuts:$,fieldName:i})]}return []})),d=Object.fromEntries(Object.entries(t.value).filter(([i])=>!(i in e.value)&&!(i in(u.value??{}))).map(([i,T])=>{let C=vue.toRef(t.value,i),B=vue.toRef(()=>({})),H=vue.toRef(()=>S.value?.[i]);return [i,me({state:C,rulesDef:B,customMessages:r,path:n?`${n}.${i}`:i,storage:o,options:c,externalErrors:H,initialState:h?.[i],shortcuts:$,fieldName:i})]})),m=Object.fromEntries(Object.entries(b?.(p)??{}).map(([i,T])=>T.length?[i,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(C=>[C,Ke(vue.toRef(()=>T),C)])),...Object.fromEntries(["$errors","$silentErrors"].map(C=>[C,et(vue.toRef(()=>T),C)]))}]:[]));l.value={...p,...u,...d,...m},R&&P();}let l=o.getFieldsEntry(n);s();function x(){s(!1),Object.entries(l.value).forEach(([R,p])=>{p.$reset();}),P();}function V(R=!0){Object.values(l.value).forEach(p=>{p.$touch(R);});}async function G(){try{return (await Promise.allSettled(Object.values(l.value).map(u=>u.$validate()))).every(u=>u.status==="fulfilled"?u.value!==!1:!1)?t.value:!1}catch{return !1}}function P(){a&&(f=vue.watch(a,()=>{E(),s();},{deep:se?1:!0,flush:"post"})),y=vue.effectScope(),v=y.run(()=>{let R=vue.computed(()=>!!Object.entries(l.value).length&&Object.entries(l.value).every(([k,F])=>F?.$dirty)),p=vue.computed(()=>Object.entries(l.value).some(([k,F])=>F?.$dirty)),u=vue.computed(()=>Object.entries(l.value).some(([k,F])=>F?.$invalid)),d=vue.computed(()=>Object.entries(l.value).every(([k,F])=>F?.$valid)),m=vue.computed(()=>R.value&&!T.value&&u.value),i=vue.computed(()=>!(u.value||T.value)),T=vue.computed(()=>Object.entries(l.value).some(([k,F])=>F?.$pending)),C=vue.computed(()=>Object.fromEntries(Object.entries(l.value).map(([k,F])=>[k,F?.$errors]))),B=vue.computed(()=>Object.fromEntries(Object.entries(l.value).map(([k,F])=>[k,F?.$silentErrors]))),H=vue.computed(()=>g);function le(){$?.nested&&Object.entries($.nested).forEach(([k,F])=>{let O=vue.effectScope();re[k]=O.run(()=>{let oe=vue.ref();return vue.watchEffect(()=>{oe.value=F({$dirty:R.value,$value:t,$error:m.value,$pending:T.value,$invalid:u.value,$valid:d.value,$ready:i.value,$anyDirty:p.value,$name:H.value,$silentErrors:B.value,$errors:C.value,$fields:l.value});}),oe});});}let re={};return le(),{$dirty:R,$anyDirty:p,$invalid:u,$valid:d,$error:m,$pending:T,$errors:C,$silentErrors:B,$ready:i,$name:H,$shortcuts:re}});}function E(){l.value&&Object.entries(l.value).forEach(([R,p])=>{p.$unwatch();}),f?.(),y.stop(),y=vue.effectScope();}function w(){Object.entries(l.value).forEach(([R,p])=>{p.$clearExternalErrors();});}function A(){E(),pe(t,h??{}),x();}function _(R=!0){let p=Object.entries(l.value).map(([u,d])=>[u,d.$extractDirtyFields(R)]);return R&&(p=p.filter(([u,d])=>L(d)?!Q(d):Array.isArray(d)?d.length:!!d)),Object.fromEntries(p)}let{$shortcuts:M,...U}=v;return vue.reactive({...U,...M,$fields:l,$value:t,$resetAll:A,$reset:x,$touch:V,$validate:G,$unwatch:E,$watch:P,$clearExternalErrors:w,$extractDirtyFields:_})}function me({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:c,index:S,initialState:b,shortcuts:h,onUnwatch:$,fieldName:g}){return st(t,e)?Rt({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,index:S,externalErrors:c,initialState:b,fieldName:g,shortcuts:h}):ot(e,t)&&nt(e)?Be({scopeRules:t,state:e,customMessages:r,path:n,storage:a,options:o,index:S,initialState:b,shortcuts:h,fieldName:g,externalErrors:c}):ut(t)?Ee({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,index:S,externalErrors:c,onUnwatch:$,shortcuts:h,initialState:b,fieldName:g}):null}function ke({initialState:e,options:t,scopeRules:r,state:n,customRules:a,shortcuts:o}){let c=Me(),S=vue.computed(()=>vue.unref(t.externalErrors));return vue.reactive(Be({rootRules:r,scopeRules:r,state:n,customMessages:a?.(),storage:c,options:t,externalErrors:S,validationGroups:t.validationGroups,initialState:e,shortcuts:o,fieldName:"root"}))}function We(e,t,r){let n={autoDirty:t?.autoDirty??!0,lazy:t?.lazy??!1,rewardEarly:t?.rewardEarly??!1,clearExternalErrorsOnChange:t?.clearExternalErrorsOnChange??!0};function a(o,c,S){let b=vue.isRef(c)?c:vue.computed(typeof c=="function"?c:()=>c),h={...n,...S},$=vue.isRef(o)?o:vue.ref(o),g=te(vue.toRaw($.value));return {r$:ke({scopeRules:b,state:$,options:h,initialState:g,customRules:e,shortcuts:r})}}return a}var dt=We();function Ue(){function e(t,r){return r}return e}var He=Ue();function vt({rules:e,modifiers:t,shortcuts:r}){let n=We(e,t,r),a=Ue();return {useRegle:n,inferRules:a}}exports.InternalRuleType=Pe;exports.createRule=Oe;exports.defineRegleConfig=vt;exports.inferRules=He;exports.unwrapRuleParameters=q;exports.useRegle=dt;
package/dist/index.d.cts CHANGED
@@ -16,7 +16,6 @@ type DeepMaybeRef<T extends Record<string, any>> = {
16
16
  type ExcludeByType<T, U> = {
17
17
  [K in keyof T as T[K] extends U ? never : K]: T[K] extends U ? never : T[K];
18
18
  };
19
- type NonPresentKeys<TSource extends Record<string, any>, Target extends Record<string, any>> = Omit<Target, keyof TSource>;
20
19
  type NoInferLegacy<A extends any> = [A][A extends any ? 0 : never];
21
20
 
22
21
  type ArrayElement<T> = T extends Array<infer U> ? U : never;
@@ -249,7 +248,7 @@ type UnionToIntersection<Union> = (
249
248
 
250
249
  interface RegleBehaviourOptions {
251
250
  /**
252
- * Only display error when calling `r$.$parse()`
251
+ * Only display error when calling `r$.$validate()`
253
252
  * @default false
254
253
  */
255
254
  lazy?: boolean;
@@ -259,15 +258,20 @@ interface RegleBehaviourOptions {
259
258
  */
260
259
  autoDirty?: boolean;
261
260
  /**
262
- * The fields will turn valid when they are, but not invalid unless calling `r$.$parse()`
261
+ * The fields will turn valid when they are, but not invalid unless calling `r$.$validate()`
263
262
  * @default false
264
263
  *
265
- * @experimental report any bug
266
264
  */
267
265
  rewardEarly?: boolean;
266
+ /**
267
+ * Define wether or not the external errors should be cleared when updating a field
268
+ * @default true
269
+ *
270
+ */
271
+ clearExternalErrorsOnChange?: boolean;
268
272
  }
269
- interface LocalRegleBehaviourOptions<TState extends Record<string, any>, TRules extends ReglePartialValidationTree<TState, CustomRulesDeclarationTree>, TExternal extends RegleExternalErrorTree<TState>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]>> {
270
- externalErrors?: MaybeRef<TExternal>;
273
+ interface LocalRegleBehaviourOptions<TState extends Record<string, any>, TRules extends ReglePartialRuleTree<TState, CustomRulesDeclarationTree>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]> = {}> {
274
+ externalErrors?: MaybeRef<RegleExternalErrorTree<Unwrap<TState>>>;
271
275
  validationGroups?: (fields: RegleStatus<TState, TRules>['$fields']) => TValidationGroups;
272
276
  }
273
277
  type RegleValidationGroupEntry = RegleFieldStatus<any, any>;
@@ -288,43 +292,44 @@ type ShortcutCommonFn<T extends Record<string, any>> = {
288
292
  };
289
293
  type RegleShortcutDefinition<TCustomRules extends Record<string, any> = Partial<DefaultValidators>> = {
290
294
  fields?: ShortcutCommonFn<RegleFieldStatus<any, Partial<TCustomRules> & Partial<DefaultValidators>>>;
291
- nested?: ShortcutCommonFn<RegleStatus<Record<string, any>, ReglePartialValidationTree<any, Partial<TCustomRules> & Partial<DefaultValidators>>>>;
295
+ nested?: ShortcutCommonFn<RegleStatus<Record<string, any>, ReglePartialRuleTree<any, Partial<TCustomRules> & Partial<DefaultValidators>>>>;
292
296
  collections?: ShortcutCommonFn<RegleCollectionStatus>;
293
297
  };
294
298
  type AddDollarToOptions<T extends Record<string, any>> = {
295
299
  [K in keyof T as `$${string & K}`]: T[K];
296
300
  };
297
301
 
298
- interface Regle<TState extends Record<string, any> = EmptyObject, TRules extends ReglePartialValidationTree<TState, CustomRulesDeclarationTree> = EmptyObject, TExternal extends RegleExternalErrorTree<TState> = never, TValidationGroups extends Record<string, RegleValidationGroupEntry[]> = never, TShortcuts extends RegleShortcutDefinition = never> {
299
- r$: RegleRoot<TState, TRules, TValidationGroups, TExternal, TShortcuts>;
302
+ interface Regle<TState extends Record<string, any> = EmptyObject, TRules extends ReglePartialRuleTree<TState, CustomRulesDeclarationTree> = EmptyObject, TValidationGroups extends Record<string, RegleValidationGroupEntry[]> = {}, TShortcuts extends RegleShortcutDefinition = {}> {
303
+ r$: RegleRoot<TState, TRules, TValidationGroups, TShortcuts>;
300
304
  }
301
305
  type isDeepExact<T, U> = {
302
306
  [K in keyof T]-?: CheckDeepExact<NonNullable<T[K]>, K extends keyof U ? NonNullable<U[K]> : never>;
303
307
  }[keyof T] extends true ? true : false;
304
- type CheckDeepExact<T, U> = [U] extends [never] ? false : T extends RegleCollectionRuleDecl ? U extends RegleCollectionRuleDecl ? isDeepExact<NonNullable<T['$each']>, UnionToIntersection<NonNullable<U['$each']>>> : T extends RegleRuleDecl ? true : T extends ReglePartialValidationTree<any> ? isDeepExact<T, U> : false : T extends RegleRuleDecl ? true : T extends ReglePartialValidationTree<any> ? isDeepExact<T, U> : false;
308
+ type CheckDeepExact<T, U> = [U] extends [never] ? false : T extends RegleCollectionRuleDecl ? U extends RegleCollectionRuleDecl ? isDeepExact<NonNullable<T['$each']>, UnionToIntersection<NonNullable<U['$each']>>> : T extends RegleRuleDecl ? true : T extends ReglePartialRuleTree<any> ? isDeepExact<T, U> : false : T extends RegleRuleDecl ? true : T extends ReglePartialRuleTree<any> ? isDeepExact<T, U> : false;
305
309
  type DeepReactiveState<T extends Record<string, any>> = {
306
310
  [K in keyof T]: MaybeRef<T[K]>;
307
311
  };
308
- type DeepSafeFormState<TState extends Record<string, any>, TRules extends ReglePartialValidationTree<TState, CustomRulesDeclarationTree>> = [unknown] extends [TState] ? {} : {
312
+ type DeepSafeFormState<TState extends Record<string, any>, TRules extends ReglePartialRuleTree<TState, CustomRulesDeclarationTree>> = [unknown] extends [TState] ? {} : {
309
313
  [K in keyof TState as [SafeProperty<TState[K], TRules[K]>] extends [never] ? K : never]?: [
310
314
  SafeProperty<TState[K], TRules[K]>
311
315
  ] extends [never] ? TState[K] : SafeProperty<TState[K], TRules[K]>;
312
316
  } & {
313
317
  [K in keyof TState as [SafeProperty<TState[K], TRules[K]>] extends [never] ? never : K]-?: SafeProperty<TState[K], TRules[K]>;
314
318
  };
315
- type SafeProperty<TState, TRule extends RegleFormPropertyType<any, any> | undefined = never> = TRule extends RegleCollectionRuleDefinition<any, any> ? TState extends Array<any> ? SafeProperty<TState[number], ExtractFromGetter<TRule['$each']>>[] : never : TRule extends ReglePartialValidationTree<any, any> ? TState extends Record<string, any> ? DeepSafeFormState<TState, TRule> : TRule extends RegleRuleDecl<any, any> ? unknown extends TRule['required'] ? never : TRule['required'] extends undefined ? never : TRule['required'] extends RegleRuleDefinition<any, infer Params, any, any, any> ? Params extends never[] ? TState : never : never : never : never;
319
+ type SafeProperty<TState, TRule extends RegleFormPropertyType<any, any> | undefined = never> = [unknown] extends [TState] ? unknown : TRule extends RegleCollectionRuleDefinition<any, any> ? TState extends Array<any> ? SafeProperty<TState[number], ExtractFromGetter<TRule['$each']>>[] : never : TRule extends ReglePartialRuleTree<any, any> ? TState extends Record<string, any> ? DeepSafeFormState<TState, TRule> : TRule extends RegleRuleDecl<any, any> ? unknown extends TRule['required'] ? never : TRule['required'] extends undefined ? never : TRule['required'] extends RegleRuleDefinition<any, infer Params, any, any, any> ? Params extends never[] ? TState : never : never : never : never;
320
+ type SafeFieldProperty<TState, TRule extends RegleFormPropertyType<any, any> | undefined = never> = TRule extends RegleRuleDecl<any, any> ? unknown extends TRule['required'] ? Maybe<TState> : TRule['required'] extends undefined ? never : TRule['required'] extends RegleRuleDefinition<any, infer Params, any, any, any> ? Params extends never[] ? Maybe<TState> : Maybe<TState> : Maybe<TState> : Maybe<TState>;
316
321
 
317
- type useRegleFn<TCustomRules extends Partial<AllRulesDeclarations>, TShortcuts extends RegleShortcutDefinition<any> = never> = <TState extends Record<string, any>, TRules extends ReglePartialValidationTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules> & TValid, TExternal extends RegleExternalErrorTree<Unwrap<TState>>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]>, TValid = isDeepExact<NoInferLegacy<TRules>, ReglePartialValidationTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules>> extends true ? {} : never>(state: MaybeRef<TState> | DeepReactiveState<TState>, rulesFactory: MaybeRefOrGetter<TRules>, options?: Partial<DeepMaybeRef<RegleBehaviourOptions>> & LocalRegleBehaviourOptions<Unwrap<TState>, TRules, TExternal, TValidationGroups>) => Regle<Unwrap<TState>, TRules, TExternal, TValidationGroups, TShortcuts>;
322
+ type useRegleFn<TCustomRules extends Partial<AllRulesDeclarations>, TShortcuts extends RegleShortcutDefinition<any> = never> = <TState extends Record<string, any>, TRules extends ReglePartialRuleTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules> & TValid, TValidationGroups extends Record<string, RegleValidationGroupEntry[]>, TValid = isDeepExact<NoInferLegacy<TRules>, ReglePartialRuleTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules>> extends true ? {} : never>(state: MaybeRef<TState> | DeepReactiveState<TState>, rulesFactory: MaybeRefOrGetter<TRules>, options?: Partial<DeepMaybeRef<RegleBehaviourOptions>> & LocalRegleBehaviourOptions<Unwrap<TState>, TRules, TValidationGroups>) => Regle<Unwrap<TState>, TRules, TValidationGroups, TShortcuts>;
318
323
  declare const useRegle: useRegleFn<Partial<AllRulesDeclarations>, RegleShortcutDefinition<any>>;
319
324
 
320
325
  interface inferRulesFn<TCustomRules extends Partial<AllRulesDeclarations>> {
321
- <TState extends Record<string, any>, TRules extends ReglePartialValidationTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules> & TValid, TValid = isDeepExact<NoInferLegacy<TRules>, ReglePartialValidationTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules>> extends true ? {} : never>(state: MaybeRef<TState> | DeepReactiveState<TState>, rulesFactory: TRules): typeof rulesFactory;
322
- <TState extends unknown, TRules extends RegleRuleDecl>(state: MaybeRef<TState>, rulesFactory: TRules): typeof rulesFactory;
326
+ <TState extends Record<string, any>, TRules extends ReglePartialRuleTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules> & TValid, TValid = isDeepExact<NoInferLegacy<TRules>, ReglePartialRuleTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules>> extends true ? {} : never>(state: MaybeRef<TState> | DeepReactiveState<TState>, rulesFactory: TRules): TRules;
327
+ <TState extends unknown, TRules extends RegleRuleDecl>(state: MaybeRef<TState>, rulesFactory: TRules): TRules;
323
328
  }
324
329
  declare const inferRules: inferRulesFn<Partial<AllRulesDeclarations>>;
325
330
 
326
- type InferRegleRoot<T extends () => useRegleFn<any, any>> = T extends () => infer U ? U extends Regle ? U['r$'] : never : never;
327
- type InferRegleRules<T extends useRegleFn<any>> = T extends useRegleFn<infer U> ? UnwrapRuleTree<Partial<U> & Partial<DefaultValidators>> : {};
331
+ type InferRegleRoot<T extends (...args: any[]) => Regle<any, any, any, any>> = T extends (...args: any[]) => infer U ? U extends Regle<any, any, any, any> ? Prettify<U['r$']> : never : never;
332
+ type InferRegleRules<T extends useRegleFn<any, any>> = T extends useRegleFn<infer U, any> ? UnwrapRuleTree<Partial<U> & Partial<DefaultValidators>> : {};
328
333
  type InferRegleShortcuts<T extends useRegleFn<any, any>> = T extends useRegleFn<any, infer U> ? U : {};
329
334
  type RegleEnforceRequiredRules<TRules extends keyof DefaultValidators> = Omit<DefaultValidators, TRules> & {
330
335
  [K in TRules as keyof TRules]-?: NonNullable<DefaultValidators[K]>;
@@ -517,25 +522,25 @@ type AllRulesDeclarations = CustomRulesDeclarationTree & {
517
522
  /**
518
523
  * @public
519
524
  */
520
- type ReglePartialValidationTree<TForm extends Record<string, any>, TCustomRules extends Partial<AllRulesDeclarations> = Partial<AllRulesDeclarations>> = {
525
+ type ReglePartialRuleTree<TForm extends Record<string, any>, TCustomRules extends Partial<AllRulesDeclarations> = Partial<AllRulesDeclarations>> = {
521
526
  [TKey in keyof TForm]?: RegleFormPropertyType<TForm[TKey], TCustomRules>;
522
527
  };
523
528
  /**
524
529
  * @public
525
530
  */
526
- type RegleValidationTree<TForm extends Record<string, any>, TCustomRules extends Partial<AllRulesDeclarations> = Partial<AllRulesDeclarations>> = {
531
+ type RegleRuleTree<TForm extends Record<string, any>, TCustomRules extends Partial<AllRulesDeclarations> = Partial<AllRulesDeclarations>> = {
527
532
  [TKey in keyof TForm]: RegleFormPropertyType<TForm[TKey], TCustomRules>;
528
533
  };
529
534
  /**
530
535
  * @public
531
536
  */
532
- type RegleComputedRules<TForm extends MaybeRef<Record<string, any>> | DeepReactiveState<Record<string, any>>, TCustomRules extends Partial<AllRulesDeclarations> | Regle<any, any> = Partial<AllRulesDeclarations>, TState = Unwrap<TForm>, TCustom = TCustomRules extends Regle<any, infer R> ? R extends ReglePartialValidationTree<any, infer C> ? C : Partial<AllRulesDeclarations> : TCustomRules> = {
537
+ type RegleComputedRules<TForm extends MaybeRef<Record<string, any>> | DeepReactiveState<Record<string, any>>, TCustomRules extends Partial<AllRulesDeclarations> | Regle<any, any> = Partial<AllRulesDeclarations>, TState = Unwrap<TForm>, TCustom = TCustomRules extends Regle<any, infer R> ? R extends ReglePartialRuleTree<any, infer C> ? C : Partial<AllRulesDeclarations> : TCustomRules> = {
533
538
  [TKey in keyof TState]?: RegleFormPropertyType<TState[TKey], TCustom extends Partial<AllRulesDeclarations> ? TCustom : {}>;
534
539
  };
535
540
  /**
536
541
  * @public
537
542
  */
538
- type RegleFormPropertyType<TValue = any, TCustomRules extends Partial<AllRulesDeclarations> = Partial<AllRulesDeclarations>> = [NonNullable<TValue>] extends [never] ? RegleRuleDecl<TValue, TCustomRules> : NonNullable<TValue> extends Array<any> ? RegleCollectionRuleDecl<TValue, TCustomRules> : NonNullable<TValue> extends Date ? RegleRuleDecl<NonNullable<TValue>, TCustomRules> : NonNullable<TValue> extends File ? RegleRuleDecl<NonNullable<TValue>, TCustomRules> : NonNullable<TValue> extends Ref<infer V> ? RegleFormPropertyType<V, TCustomRules> : NonNullable<TValue> extends Record<string, any> ? ReglePartialValidationTree<NonNullable<TValue>, TCustomRules> : RegleRuleDecl<NonNullable<TValue>, TCustomRules>;
543
+ type RegleFormPropertyType<TValue = any, TCustomRules extends Partial<AllRulesDeclarations> = Partial<AllRulesDeclarations>> = [NonNullable<TValue>] extends [never] ? RegleRuleDecl<TValue, TCustomRules> : NonNullable<TValue> extends Array<any> ? RegleCollectionRuleDecl<TValue, TCustomRules> : NonNullable<TValue> extends Date ? RegleRuleDecl<NonNullable<TValue>, TCustomRules> : NonNullable<TValue> extends File ? RegleRuleDecl<NonNullable<TValue>, TCustomRules> : NonNullable<TValue> extends Ref<infer V> ? RegleFormPropertyType<V, TCustomRules> : NonNullable<TValue> extends Record<string, any> ? ReglePartialRuleTree<NonNullable<TValue>, TCustomRules> : RegleRuleDecl<NonNullable<TValue>, TCustomRules>;
539
544
  /**
540
545
  * @public
541
546
  * Rule tree for a form property
@@ -567,32 +572,22 @@ type InlineRuleDeclaration<TValue extends any = any, TParams extends any[] = any
567
572
  * */
568
573
  type FormRuleDeclaration<TValue extends any, TParams extends any[], TReturn extends RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition> = RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition>, TMetadata extends RegleRuleMetadataDefinition = TReturn extends Promise<infer M> ? M : TReturn, TAsync extends boolean = boolean> = InlineRuleDeclaration<TValue, TParams, TReturn> | RegleRuleDefinition<TValue, TParams, TAsync, TMetadata>;
569
574
 
570
- type RegleErrorTree<TRules extends ReglePartialValidationTree<any, any>, TExternal extends RegleExternalErrorTree<Record<string, unknown>> = never> = {
571
- readonly [K in keyof TRules]: RegleValidationErrors<TRules[K], K extends keyof TExternal ? TExternal[K] : never>;
572
- } & {
573
- readonly [K in keyof NonPresentKeys<TRules, TExternal>]: RegleExternalValidationErrorsReport<TExternal[K]>;
575
+ type RegleErrorTree<TState = Record<string, any> | any[]> = {
576
+ readonly [K in keyof TState]: RegleValidationErrors<TState[K]>;
574
577
  };
575
- type RegleValidationErrors<TRule extends RegleFormPropertyType<any, any> | undefined = never, TExternalError extends RegleExternalValidationErrors<any> | undefined = never> = TRule extends RegleCollectionRuleDefinition ? RegleCollectionErrors<ExtractFromGetter<TRule['$each']>, TExternalError extends RegleExternalCollectionErrors ? ArrayElement<TExternalError['$each']> : never> : TRule extends RegleRuleDecl<any, any> ? string[] : TRule extends ReglePartialValidationTree<any, any> ? RegleErrorTree<TRule, TExternalError extends RegleExternalErrorTree ? TExternalError : never> : string[];
576
- type RegleCollectionErrors<TRule extends RegleFormPropertyType<any, any> | undefined = never, TExternalError extends RegleExternalValidationErrors<any> | undefined = never> = {
578
+ type RegleExternalErrorTree<TState = Record<string, any> | any[]> = PartialDeep<RegleErrorTree<TState>, {
579
+ recurseIntoArrays: true;
580
+ }>;
581
+ type RegleValidationErrors<TState extends Record<string, any> | any[] | unknown = never> = NonNullable<TState> extends Array<infer U extends Record<string, any>> ? RegleCollectionErrors<U> : NonNullable<TState> extends Date | File ? string[] : NonNullable<TState> extends Record<string, any> ? RegleErrorTree<TState> : string[];
582
+ type RegleCollectionErrors<TState extends Record<string, any>> = {
577
583
  readonly $errors: string[];
578
- readonly $each: RegleValidationErrors<TRule, TExternalError>[];
579
- };
580
- type RegleExternalErrorTree<TState extends Record<string, any> = Record<string, any>> = {
581
- [K in keyof TState]?: RegleExternalValidationErrors<TState[K]>;
584
+ readonly $each: RegleValidationErrors<TState>[];
582
585
  };
583
- type RegleExternalValidationErrors<TValue extends any> = [NonNullable<TValue>] extends [
584
- never
585
- ] ? string[] : TValue extends Array<infer U> ? RegleExternalCollectionErrors<U> : NonNullable<TValue> extends Date ? string[] : NonNullable<TValue> extends File ? string[] : TValue extends Record<string, any> ? RegleExternalErrorTree<TValue> : string[];
586
- type RegleExternalCollectionErrors<TValue extends any = any> = {
587
- $errors?: string[];
588
- $each?: RegleExternalValidationErrors<TValue>[];
589
- };
590
- type RegleExternalValidationErrorsReport<TExternalError extends RegleExternalValidationErrors<any> | undefined = never> = TExternalError extends RegleExternalCollectionErrors ? RegleCollectionErrors<TExternalError['$each']> : TExternalError extends string[] ? string[] : TExternalError extends RegleExternalErrorTree<any> ? RegleErrorTree<TExternalError> : string[];
591
586
 
592
587
  /**
593
588
  * @public
594
589
  */
595
- type RegleRoot<TState extends Record<string, any> = Record<string, any>, TRules extends ReglePartialValidationTree<TState> = Record<string, any>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]> = never, TExternal extends RegleExternalErrorTree<TState> = never, TShortcuts extends RegleShortcutDefinition = never> = RegleStatus<TState, TRules, TExternal, TShortcuts> & {} & ([TValidationGroups] extends [never] ? {} : {
590
+ type RegleRoot<TState extends Record<string, any> = Record<string, any>, TRules extends ReglePartialRuleTree<TState> = Record<string, any>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]> = never, TShortcuts extends RegleShortcutDefinition = {}> = RegleStatus<TState, TRules, TShortcuts> & ([TValidationGroups] extends [never] ? {} : {
596
591
  $groups: {
597
592
  readonly [TKey in keyof TValidationGroups]: RegleValidationGroupOutput;
598
593
  };
@@ -600,21 +595,23 @@ type RegleRoot<TState extends Record<string, any> = Record<string, any>, TRules
600
595
  /**
601
596
  * @public
602
597
  */
603
- type RegleStatus<TState extends Record<string, any> = Record<string, any>, TRules extends ReglePartialValidationTree<TState> = Record<string, any>, TExternal extends RegleExternalErrorTree<TState> = never, TShortcuts extends RegleShortcutDefinition = never> = RegleCommonStatus<TState> & {
598
+ type RegleStatus<TState extends Record<string, any> = Record<string, any>, TRules extends ReglePartialRuleTree<TState> = Record<string, any>, TShortcuts extends RegleShortcutDefinition = {}> = RegleCommonStatus<TState> & {
604
599
  readonly $fields: {
605
- readonly [TKey in keyof TRules]: InferRegleStatusType<NonNullable<TRules[TKey]>, TState, TKey, TShortcuts>;
600
+ readonly [TKey in keyof TState]: InferRegleStatusType<NonNullable<TRules[TKey]>, TState, TKey, TShortcuts>;
601
+ } & {
602
+ readonly [TKey in keyof TState as TRules[TKey] extends NonNullable<TRules[TKey]> ? TKey : never]-?: InferRegleStatusType<NonNullable<TRules[TKey]>, TState, TKey, TShortcuts>;
606
603
  };
607
- readonly $errors: RegleErrorTree<TRules, TExternal>;
608
- readonly $silentErrors: RegleErrorTree<TRules, TExternal>;
604
+ readonly $errors: RegleErrorTree<TState>;
605
+ readonly $silentErrors: RegleErrorTree<TState>;
609
606
  $extractDirtyFields: (filterNullishValues?: boolean) => PartialDeep<TState>;
610
- $parse: () => Promise<false | Prettify<DeepSafeFormState<TState, TRules>>>;
607
+ $validate: () => Promise<false | Prettify<DeepSafeFormState<TState, TRules>>>;
611
608
  } & ([TShortcuts['nested']] extends [never] ? {} : {
612
609
  [K in keyof TShortcuts['nested']]: ReturnType<NonNullable<TShortcuts['nested']>[K]>;
613
610
  });
614
611
  /**
615
612
  * @public
616
613
  */
617
- type InferRegleStatusType<TRule extends RegleCollectionRuleDecl | RegleRuleDecl | ReglePartialValidationTree<any>, TState extends Record<PropertyKey, any> = any, TKey extends PropertyKey = string, TShortcuts extends RegleShortcutDefinition = never> = TRule extends RegleCollectionRuleDefinition<any, any> ? NonNullable<TState[TKey]> extends Array<Record<string, any> | any> ? ExtractFromGetter<TRule['$each']> extends RegleRuleDecl | ReglePartialValidationTree<any> ? RegleCollectionStatus<TState[TKey], ExtractFromGetter<TRule['$each']>, TRule, TShortcuts> : never : RegleFieldStatus<TState[TKey], TRule, TShortcuts> : TRule extends ReglePartialValidationTree<any> ? NonNullable<TState[TKey]> extends Array<any> ? RegleCommonStatus<TState[TKey]> : NonNullable<TState[TKey]> extends Record<PropertyKey, any> ? RegleStatus<TState[TKey], TRule, never, TShortcuts> : RegleFieldStatus<TState[TKey], TRule, TShortcuts> : RegleFieldStatus<TState[TKey], TRule, TShortcuts>;
614
+ type InferRegleStatusType<TRule extends RegleCollectionRuleDecl | RegleRuleDecl | ReglePartialRuleTree<any>, TState extends Record<PropertyKey, any> = any, TKey extends PropertyKey = string, TShortcuts extends RegleShortcutDefinition = {}> = NonNullable<TState[TKey]> extends Array<Record<string, any> | any> ? TRule extends RegleCollectionRuleDefinition<any, any> ? ExtractFromGetter<TRule['$each']> extends ReglePartialRuleTree<any> ? RegleCollectionStatus<TState[TKey], ExtractFromGetter<TRule['$each']>, TRule, TShortcuts> : RegleFieldStatus<TState[TKey], TRule, TShortcuts> : RegleCollectionStatus<TState[TKey], {}, TRule, TShortcuts> : TRule extends ReglePartialRuleTree<any> ? NonNullable<TState[TKey]> extends Array<any> ? RegleCommonStatus<TState[TKey]> : NonNullable<TState[TKey]> extends Date | File ? RegleFieldStatus<TState[TKey], TRule, TShortcuts> : NonNullable<TState[TKey]> extends Record<PropertyKey, any> ? RegleStatus<TState[TKey], TRule, TShortcuts> : RegleFieldStatus<TState[TKey], TRule, TShortcuts> : NonNullable<TState[TKey]> extends Date | File ? RegleFieldStatus<TState[TKey], TRule, TShortcuts> : NonNullable<TState[TKey]> extends Record<PropertyKey, any> ? RegleStatus<TState[TKey], ReglePartialRuleTree<TState[TKey]>, TShortcuts> : RegleFieldStatus<TState[TKey], TRule, TShortcuts>;
618
615
  /**
619
616
  * @public
620
617
  */
@@ -624,6 +621,7 @@ type RegleFieldStatus<TState extends any = any, TRules extends RegleFormProperty
624
621
  readonly $silentErrors: string[];
625
622
  readonly $externalErrors: string[];
626
623
  $extractDirtyFields: (filterNullishValues?: boolean) => Maybe<TState>;
624
+ $validate: () => Promise<false | SafeFieldProperty<TState, TRules>>;
627
625
  readonly $rules: {
628
626
  readonly [TRuleKey in keyof Omit<TRules, '$each' | keyof FieldRegleBehaviourOptions>]: RegleRuleStatus<TState, TRules[TRuleKey] extends RegleRuleDefinition<any, infer TParams, any> ? TParams : [], TRules[TRuleKey] extends RegleRuleDefinition<any, any, any, infer TMetadata> ? TMetadata : TRules[TRuleKey] extends InlineRuleDeclaration<any, any[], infer TMetadata> ? TMetadata extends Promise<infer P> ? P : TMetadata : any>;
629
627
  };
@@ -644,10 +642,9 @@ interface RegleCommonStatus<TValue = any> {
644
642
  readonly $name: string;
645
643
  $id?: string;
646
644
  $value: UnwrapNestedRefs<TValue>;
647
- $touch(): void;
645
+ $touch(runCommit?: boolean): void;
648
646
  $reset(): void;
649
647
  $resetAll: () => void;
650
- $validate(): Promise<boolean>;
651
648
  $unwatch(): void;
652
649
  $watch(): void;
653
650
  $clearExternalErrors(): void;
@@ -674,14 +671,14 @@ type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata exte
674
671
  /**
675
672
  * @public
676
673
  */
677
- type RegleCollectionStatus<TState extends any[] = any[], TRules extends ReglePartialValidationTree<Record<string, any>> = Record<string, any>, TFieldRule extends RegleCollectionRuleDecl<any, any> = never, TShortcuts extends RegleShortcutDefinition = never> = Omit<RegleFieldStatus<TState, TRules, TShortcuts>, '$errors' | '$silentErrors' | '$extractDirtyFields' | '$externalErrors' | '$rules' | '$value'> & {
674
+ type RegleCollectionStatus<TState extends any[] = any[], TRules extends ReglePartialRuleTree<ArrayElement<TState>> = Record<string, any>, TFieldRule extends RegleCollectionRuleDecl<any, any> = never, TShortcuts extends RegleShortcutDefinition = {}> = Omit<RegleFieldStatus<TState, TRules, TShortcuts>, '$errors' | '$silentErrors' | '$extractDirtyFields' | '$externalErrors' | '$rules' | '$value' | '$validate'> & {
678
675
  $value: Maybe<TState>;
679
676
  readonly $each: Array<InferRegleStatusType<NonNullable<TRules>, NonNullable<TState>, number, TShortcuts>>;
680
677
  readonly $field: RegleFieldStatus<TState, TFieldRule, TShortcuts>;
681
- readonly $errors: RegleErrorTree<TRules>;
682
- readonly $silentErrors: RegleErrorTree<TRules>;
678
+ readonly $errors: RegleCollectionErrors<TState>;
679
+ readonly $silentErrors: RegleCollectionErrors<TState>;
683
680
  $extractDirtyFields: (filterNullishValues?: boolean) => PartialDeep<TState>;
684
- $parse: () => Promise<false | SafeProperty<TState, TRules>>;
681
+ $validate: () => Promise<false | DeepSafeFormState<ArrayElement<TState>, TRules>>[];
685
682
  } & ([TShortcuts['collections']] extends [never] ? {} : {
686
683
  [K in keyof TShortcuts['collections']]: ReturnType<NonNullable<TShortcuts['collections']>[K]>;
687
684
  });
@@ -734,4 +731,4 @@ declare function defineRegleConfig<TCustomRules extends Partial<AllRulesDeclarat
734
731
  inferRules: inferRulesFn<TCustomRules>;
735
732
  };
736
733
 
737
- export { type AllRulesDeclarations, type DeepMaybeRef, type FormRuleDeclaration, type InferRegleRoot, type InferRegleRule, type InferRegleRules, type InferRegleShortcuts, type InlineRuleDeclaration, InternalRuleType, type LocalRegleBehaviourOptions, type Maybe, type ParamDecl, type Regle, type RegleBehaviourOptions, type RegleCollectionErrors, type RegleCollectionRuleDecl, type RegleCollectionRuleDefinition, type RegleCollectionStatus, type RegleCommonStatus, type RegleComputedRules, type RegleEnforceCustomRequiredRules, type RegleEnforceRequiredRules, type RegleErrorTree, type RegleExternalCollectionErrors, type RegleExternalErrorTree, type RegleExternalValidationErrors, type RegleExternalValidationErrorsReport, type RegleFieldStatus, type RegleFormPropertyType, type RegleInternalRuleDefs, type ReglePartialValidationTree, type RegleRoot, type RegleRuleCore, type RegleRuleDecl, type RegleRuleDefinition, type RegleRuleDefinitionProcessor, type RegleRuleDefinitionWithMetadataProcessor, type RegleRuleInit, type RegleRuleMetadataConsumer, type RegleRuleMetadataDefinition, type RegleRuleRaw, type RegleRuleStatus, type RegleRuleWithParamsDefinition, type RegleStatus, type RegleUniversalParams, type RegleValidationErrors, type RegleValidationGroupEntry, type RegleValidationGroupOutput, type RegleValidationTree, type Unwrap, type UnwrapRegleUniversalParams, type UnwrapRuleWithParams, createRule, defineRegleConfig, inferRules, unwrapRuleParameters, useRegle };
734
+ export { type AllRulesDeclarations, type DeepMaybeRef, type FormRuleDeclaration, type InferRegleRoot, type InferRegleRule, type InferRegleRules, type InferRegleShortcuts, type InlineRuleDeclaration, InternalRuleType, type LocalRegleBehaviourOptions, type Maybe, type ParamDecl, type Regle, type RegleBehaviourOptions, type RegleCollectionErrors, type RegleCollectionRuleDecl, type RegleCollectionRuleDefinition, type RegleCollectionStatus, type RegleCommonStatus, type RegleComputedRules, type RegleEnforceCustomRequiredRules, type RegleEnforceRequiredRules, type RegleErrorTree, type RegleExternalErrorTree, type RegleFieldStatus, type RegleFormPropertyType, type RegleInternalRuleDefs, type ReglePartialRuleTree, type RegleRoot, type RegleRuleCore, type RegleRuleDecl, type RegleRuleDefinition, type RegleRuleDefinitionProcessor, type RegleRuleDefinitionWithMetadataProcessor, type RegleRuleInit, type RegleRuleMetadataConsumer, type RegleRuleMetadataDefinition, type RegleRuleRaw, type RegleRuleStatus, type RegleRuleWithParamsDefinition, type RegleStatus, type RegleUniversalParams, type RegleValidationErrors, type RegleValidationGroupEntry, type RegleValidationGroupOutput, type RegleRuleTree as RegleValidationTree, type Unwrap, type UnwrapRegleUniversalParams, type UnwrapRuleWithParams, createRule, defineRegleConfig, inferRules, unwrapRuleParameters, useRegle };
package/dist/index.d.ts CHANGED
@@ -16,7 +16,6 @@ type DeepMaybeRef<T extends Record<string, any>> = {
16
16
  type ExcludeByType<T, U> = {
17
17
  [K in keyof T as T[K] extends U ? never : K]: T[K] extends U ? never : T[K];
18
18
  };
19
- type NonPresentKeys<TSource extends Record<string, any>, Target extends Record<string, any>> = Omit<Target, keyof TSource>;
20
19
  type NoInferLegacy<A extends any> = [A][A extends any ? 0 : never];
21
20
 
22
21
  type ArrayElement<T> = T extends Array<infer U> ? U : never;
@@ -249,7 +248,7 @@ type UnionToIntersection<Union> = (
249
248
 
250
249
  interface RegleBehaviourOptions {
251
250
  /**
252
- * Only display error when calling `r$.$parse()`
251
+ * Only display error when calling `r$.$validate()`
253
252
  * @default false
254
253
  */
255
254
  lazy?: boolean;
@@ -259,15 +258,20 @@ interface RegleBehaviourOptions {
259
258
  */
260
259
  autoDirty?: boolean;
261
260
  /**
262
- * The fields will turn valid when they are, but not invalid unless calling `r$.$parse()`
261
+ * The fields will turn valid when they are, but not invalid unless calling `r$.$validate()`
263
262
  * @default false
264
263
  *
265
- * @experimental report any bug
266
264
  */
267
265
  rewardEarly?: boolean;
266
+ /**
267
+ * Define wether or not the external errors should be cleared when updating a field
268
+ * @default true
269
+ *
270
+ */
271
+ clearExternalErrorsOnChange?: boolean;
268
272
  }
269
- interface LocalRegleBehaviourOptions<TState extends Record<string, any>, TRules extends ReglePartialValidationTree<TState, CustomRulesDeclarationTree>, TExternal extends RegleExternalErrorTree<TState>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]>> {
270
- externalErrors?: MaybeRef<TExternal>;
273
+ interface LocalRegleBehaviourOptions<TState extends Record<string, any>, TRules extends ReglePartialRuleTree<TState, CustomRulesDeclarationTree>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]> = {}> {
274
+ externalErrors?: MaybeRef<RegleExternalErrorTree<Unwrap<TState>>>;
271
275
  validationGroups?: (fields: RegleStatus<TState, TRules>['$fields']) => TValidationGroups;
272
276
  }
273
277
  type RegleValidationGroupEntry = RegleFieldStatus<any, any>;
@@ -288,43 +292,44 @@ type ShortcutCommonFn<T extends Record<string, any>> = {
288
292
  };
289
293
  type RegleShortcutDefinition<TCustomRules extends Record<string, any> = Partial<DefaultValidators>> = {
290
294
  fields?: ShortcutCommonFn<RegleFieldStatus<any, Partial<TCustomRules> & Partial<DefaultValidators>>>;
291
- nested?: ShortcutCommonFn<RegleStatus<Record<string, any>, ReglePartialValidationTree<any, Partial<TCustomRules> & Partial<DefaultValidators>>>>;
295
+ nested?: ShortcutCommonFn<RegleStatus<Record<string, any>, ReglePartialRuleTree<any, Partial<TCustomRules> & Partial<DefaultValidators>>>>;
292
296
  collections?: ShortcutCommonFn<RegleCollectionStatus>;
293
297
  };
294
298
  type AddDollarToOptions<T extends Record<string, any>> = {
295
299
  [K in keyof T as `$${string & K}`]: T[K];
296
300
  };
297
301
 
298
- interface Regle<TState extends Record<string, any> = EmptyObject, TRules extends ReglePartialValidationTree<TState, CustomRulesDeclarationTree> = EmptyObject, TExternal extends RegleExternalErrorTree<TState> = never, TValidationGroups extends Record<string, RegleValidationGroupEntry[]> = never, TShortcuts extends RegleShortcutDefinition = never> {
299
- r$: RegleRoot<TState, TRules, TValidationGroups, TExternal, TShortcuts>;
302
+ interface Regle<TState extends Record<string, any> = EmptyObject, TRules extends ReglePartialRuleTree<TState, CustomRulesDeclarationTree> = EmptyObject, TValidationGroups extends Record<string, RegleValidationGroupEntry[]> = {}, TShortcuts extends RegleShortcutDefinition = {}> {
303
+ r$: RegleRoot<TState, TRules, TValidationGroups, TShortcuts>;
300
304
  }
301
305
  type isDeepExact<T, U> = {
302
306
  [K in keyof T]-?: CheckDeepExact<NonNullable<T[K]>, K extends keyof U ? NonNullable<U[K]> : never>;
303
307
  }[keyof T] extends true ? true : false;
304
- type CheckDeepExact<T, U> = [U] extends [never] ? false : T extends RegleCollectionRuleDecl ? U extends RegleCollectionRuleDecl ? isDeepExact<NonNullable<T['$each']>, UnionToIntersection<NonNullable<U['$each']>>> : T extends RegleRuleDecl ? true : T extends ReglePartialValidationTree<any> ? isDeepExact<T, U> : false : T extends RegleRuleDecl ? true : T extends ReglePartialValidationTree<any> ? isDeepExact<T, U> : false;
308
+ type CheckDeepExact<T, U> = [U] extends [never] ? false : T extends RegleCollectionRuleDecl ? U extends RegleCollectionRuleDecl ? isDeepExact<NonNullable<T['$each']>, UnionToIntersection<NonNullable<U['$each']>>> : T extends RegleRuleDecl ? true : T extends ReglePartialRuleTree<any> ? isDeepExact<T, U> : false : T extends RegleRuleDecl ? true : T extends ReglePartialRuleTree<any> ? isDeepExact<T, U> : false;
305
309
  type DeepReactiveState<T extends Record<string, any>> = {
306
310
  [K in keyof T]: MaybeRef<T[K]>;
307
311
  };
308
- type DeepSafeFormState<TState extends Record<string, any>, TRules extends ReglePartialValidationTree<TState, CustomRulesDeclarationTree>> = [unknown] extends [TState] ? {} : {
312
+ type DeepSafeFormState<TState extends Record<string, any>, TRules extends ReglePartialRuleTree<TState, CustomRulesDeclarationTree>> = [unknown] extends [TState] ? {} : {
309
313
  [K in keyof TState as [SafeProperty<TState[K], TRules[K]>] extends [never] ? K : never]?: [
310
314
  SafeProperty<TState[K], TRules[K]>
311
315
  ] extends [never] ? TState[K] : SafeProperty<TState[K], TRules[K]>;
312
316
  } & {
313
317
  [K in keyof TState as [SafeProperty<TState[K], TRules[K]>] extends [never] ? never : K]-?: SafeProperty<TState[K], TRules[K]>;
314
318
  };
315
- type SafeProperty<TState, TRule extends RegleFormPropertyType<any, any> | undefined = never> = TRule extends RegleCollectionRuleDefinition<any, any> ? TState extends Array<any> ? SafeProperty<TState[number], ExtractFromGetter<TRule['$each']>>[] : never : TRule extends ReglePartialValidationTree<any, any> ? TState extends Record<string, any> ? DeepSafeFormState<TState, TRule> : TRule extends RegleRuleDecl<any, any> ? unknown extends TRule['required'] ? never : TRule['required'] extends undefined ? never : TRule['required'] extends RegleRuleDefinition<any, infer Params, any, any, any> ? Params extends never[] ? TState : never : never : never : never;
319
+ type SafeProperty<TState, TRule extends RegleFormPropertyType<any, any> | undefined = never> = [unknown] extends [TState] ? unknown : TRule extends RegleCollectionRuleDefinition<any, any> ? TState extends Array<any> ? SafeProperty<TState[number], ExtractFromGetter<TRule['$each']>>[] : never : TRule extends ReglePartialRuleTree<any, any> ? TState extends Record<string, any> ? DeepSafeFormState<TState, TRule> : TRule extends RegleRuleDecl<any, any> ? unknown extends TRule['required'] ? never : TRule['required'] extends undefined ? never : TRule['required'] extends RegleRuleDefinition<any, infer Params, any, any, any> ? Params extends never[] ? TState : never : never : never : never;
320
+ type SafeFieldProperty<TState, TRule extends RegleFormPropertyType<any, any> | undefined = never> = TRule extends RegleRuleDecl<any, any> ? unknown extends TRule['required'] ? Maybe<TState> : TRule['required'] extends undefined ? never : TRule['required'] extends RegleRuleDefinition<any, infer Params, any, any, any> ? Params extends never[] ? Maybe<TState> : Maybe<TState> : Maybe<TState> : Maybe<TState>;
316
321
 
317
- type useRegleFn<TCustomRules extends Partial<AllRulesDeclarations>, TShortcuts extends RegleShortcutDefinition<any> = never> = <TState extends Record<string, any>, TRules extends ReglePartialValidationTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules> & TValid, TExternal extends RegleExternalErrorTree<Unwrap<TState>>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]>, TValid = isDeepExact<NoInferLegacy<TRules>, ReglePartialValidationTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules>> extends true ? {} : never>(state: MaybeRef<TState> | DeepReactiveState<TState>, rulesFactory: MaybeRefOrGetter<TRules>, options?: Partial<DeepMaybeRef<RegleBehaviourOptions>> & LocalRegleBehaviourOptions<Unwrap<TState>, TRules, TExternal, TValidationGroups>) => Regle<Unwrap<TState>, TRules, TExternal, TValidationGroups, TShortcuts>;
322
+ type useRegleFn<TCustomRules extends Partial<AllRulesDeclarations>, TShortcuts extends RegleShortcutDefinition<any> = never> = <TState extends Record<string, any>, TRules extends ReglePartialRuleTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules> & TValid, TValidationGroups extends Record<string, RegleValidationGroupEntry[]>, TValid = isDeepExact<NoInferLegacy<TRules>, ReglePartialRuleTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules>> extends true ? {} : never>(state: MaybeRef<TState> | DeepReactiveState<TState>, rulesFactory: MaybeRefOrGetter<TRules>, options?: Partial<DeepMaybeRef<RegleBehaviourOptions>> & LocalRegleBehaviourOptions<Unwrap<TState>, TRules, TValidationGroups>) => Regle<Unwrap<TState>, TRules, TValidationGroups, TShortcuts>;
318
323
  declare const useRegle: useRegleFn<Partial<AllRulesDeclarations>, RegleShortcutDefinition<any>>;
319
324
 
320
325
  interface inferRulesFn<TCustomRules extends Partial<AllRulesDeclarations>> {
321
- <TState extends Record<string, any>, TRules extends ReglePartialValidationTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules> & TValid, TValid = isDeepExact<NoInferLegacy<TRules>, ReglePartialValidationTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules>> extends true ? {} : never>(state: MaybeRef<TState> | DeepReactiveState<TState>, rulesFactory: TRules): typeof rulesFactory;
322
- <TState extends unknown, TRules extends RegleRuleDecl>(state: MaybeRef<TState>, rulesFactory: TRules): typeof rulesFactory;
326
+ <TState extends Record<string, any>, TRules extends ReglePartialRuleTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules> & TValid, TValid = isDeepExact<NoInferLegacy<TRules>, ReglePartialRuleTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules>> extends true ? {} : never>(state: MaybeRef<TState> | DeepReactiveState<TState>, rulesFactory: TRules): TRules;
327
+ <TState extends unknown, TRules extends RegleRuleDecl>(state: MaybeRef<TState>, rulesFactory: TRules): TRules;
323
328
  }
324
329
  declare const inferRules: inferRulesFn<Partial<AllRulesDeclarations>>;
325
330
 
326
- type InferRegleRoot<T extends () => useRegleFn<any, any>> = T extends () => infer U ? U extends Regle ? U['r$'] : never : never;
327
- type InferRegleRules<T extends useRegleFn<any>> = T extends useRegleFn<infer U> ? UnwrapRuleTree<Partial<U> & Partial<DefaultValidators>> : {};
331
+ type InferRegleRoot<T extends (...args: any[]) => Regle<any, any, any, any>> = T extends (...args: any[]) => infer U ? U extends Regle<any, any, any, any> ? Prettify<U['r$']> : never : never;
332
+ type InferRegleRules<T extends useRegleFn<any, any>> = T extends useRegleFn<infer U, any> ? UnwrapRuleTree<Partial<U> & Partial<DefaultValidators>> : {};
328
333
  type InferRegleShortcuts<T extends useRegleFn<any, any>> = T extends useRegleFn<any, infer U> ? U : {};
329
334
  type RegleEnforceRequiredRules<TRules extends keyof DefaultValidators> = Omit<DefaultValidators, TRules> & {
330
335
  [K in TRules as keyof TRules]-?: NonNullable<DefaultValidators[K]>;
@@ -517,25 +522,25 @@ type AllRulesDeclarations = CustomRulesDeclarationTree & {
517
522
  /**
518
523
  * @public
519
524
  */
520
- type ReglePartialValidationTree<TForm extends Record<string, any>, TCustomRules extends Partial<AllRulesDeclarations> = Partial<AllRulesDeclarations>> = {
525
+ type ReglePartialRuleTree<TForm extends Record<string, any>, TCustomRules extends Partial<AllRulesDeclarations> = Partial<AllRulesDeclarations>> = {
521
526
  [TKey in keyof TForm]?: RegleFormPropertyType<TForm[TKey], TCustomRules>;
522
527
  };
523
528
  /**
524
529
  * @public
525
530
  */
526
- type RegleValidationTree<TForm extends Record<string, any>, TCustomRules extends Partial<AllRulesDeclarations> = Partial<AllRulesDeclarations>> = {
531
+ type RegleRuleTree<TForm extends Record<string, any>, TCustomRules extends Partial<AllRulesDeclarations> = Partial<AllRulesDeclarations>> = {
527
532
  [TKey in keyof TForm]: RegleFormPropertyType<TForm[TKey], TCustomRules>;
528
533
  };
529
534
  /**
530
535
  * @public
531
536
  */
532
- type RegleComputedRules<TForm extends MaybeRef<Record<string, any>> | DeepReactiveState<Record<string, any>>, TCustomRules extends Partial<AllRulesDeclarations> | Regle<any, any> = Partial<AllRulesDeclarations>, TState = Unwrap<TForm>, TCustom = TCustomRules extends Regle<any, infer R> ? R extends ReglePartialValidationTree<any, infer C> ? C : Partial<AllRulesDeclarations> : TCustomRules> = {
537
+ type RegleComputedRules<TForm extends MaybeRef<Record<string, any>> | DeepReactiveState<Record<string, any>>, TCustomRules extends Partial<AllRulesDeclarations> | Regle<any, any> = Partial<AllRulesDeclarations>, TState = Unwrap<TForm>, TCustom = TCustomRules extends Regle<any, infer R> ? R extends ReglePartialRuleTree<any, infer C> ? C : Partial<AllRulesDeclarations> : TCustomRules> = {
533
538
  [TKey in keyof TState]?: RegleFormPropertyType<TState[TKey], TCustom extends Partial<AllRulesDeclarations> ? TCustom : {}>;
534
539
  };
535
540
  /**
536
541
  * @public
537
542
  */
538
- type RegleFormPropertyType<TValue = any, TCustomRules extends Partial<AllRulesDeclarations> = Partial<AllRulesDeclarations>> = [NonNullable<TValue>] extends [never] ? RegleRuleDecl<TValue, TCustomRules> : NonNullable<TValue> extends Array<any> ? RegleCollectionRuleDecl<TValue, TCustomRules> : NonNullable<TValue> extends Date ? RegleRuleDecl<NonNullable<TValue>, TCustomRules> : NonNullable<TValue> extends File ? RegleRuleDecl<NonNullable<TValue>, TCustomRules> : NonNullable<TValue> extends Ref<infer V> ? RegleFormPropertyType<V, TCustomRules> : NonNullable<TValue> extends Record<string, any> ? ReglePartialValidationTree<NonNullable<TValue>, TCustomRules> : RegleRuleDecl<NonNullable<TValue>, TCustomRules>;
543
+ type RegleFormPropertyType<TValue = any, TCustomRules extends Partial<AllRulesDeclarations> = Partial<AllRulesDeclarations>> = [NonNullable<TValue>] extends [never] ? RegleRuleDecl<TValue, TCustomRules> : NonNullable<TValue> extends Array<any> ? RegleCollectionRuleDecl<TValue, TCustomRules> : NonNullable<TValue> extends Date ? RegleRuleDecl<NonNullable<TValue>, TCustomRules> : NonNullable<TValue> extends File ? RegleRuleDecl<NonNullable<TValue>, TCustomRules> : NonNullable<TValue> extends Ref<infer V> ? RegleFormPropertyType<V, TCustomRules> : NonNullable<TValue> extends Record<string, any> ? ReglePartialRuleTree<NonNullable<TValue>, TCustomRules> : RegleRuleDecl<NonNullable<TValue>, TCustomRules>;
539
544
  /**
540
545
  * @public
541
546
  * Rule tree for a form property
@@ -567,32 +572,22 @@ type InlineRuleDeclaration<TValue extends any = any, TParams extends any[] = any
567
572
  * */
568
573
  type FormRuleDeclaration<TValue extends any, TParams extends any[], TReturn extends RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition> = RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition>, TMetadata extends RegleRuleMetadataDefinition = TReturn extends Promise<infer M> ? M : TReturn, TAsync extends boolean = boolean> = InlineRuleDeclaration<TValue, TParams, TReturn> | RegleRuleDefinition<TValue, TParams, TAsync, TMetadata>;
569
574
 
570
- type RegleErrorTree<TRules extends ReglePartialValidationTree<any, any>, TExternal extends RegleExternalErrorTree<Record<string, unknown>> = never> = {
571
- readonly [K in keyof TRules]: RegleValidationErrors<TRules[K], K extends keyof TExternal ? TExternal[K] : never>;
572
- } & {
573
- readonly [K in keyof NonPresentKeys<TRules, TExternal>]: RegleExternalValidationErrorsReport<TExternal[K]>;
575
+ type RegleErrorTree<TState = Record<string, any> | any[]> = {
576
+ readonly [K in keyof TState]: RegleValidationErrors<TState[K]>;
574
577
  };
575
- type RegleValidationErrors<TRule extends RegleFormPropertyType<any, any> | undefined = never, TExternalError extends RegleExternalValidationErrors<any> | undefined = never> = TRule extends RegleCollectionRuleDefinition ? RegleCollectionErrors<ExtractFromGetter<TRule['$each']>, TExternalError extends RegleExternalCollectionErrors ? ArrayElement<TExternalError['$each']> : never> : TRule extends RegleRuleDecl<any, any> ? string[] : TRule extends ReglePartialValidationTree<any, any> ? RegleErrorTree<TRule, TExternalError extends RegleExternalErrorTree ? TExternalError : never> : string[];
576
- type RegleCollectionErrors<TRule extends RegleFormPropertyType<any, any> | undefined = never, TExternalError extends RegleExternalValidationErrors<any> | undefined = never> = {
578
+ type RegleExternalErrorTree<TState = Record<string, any> | any[]> = PartialDeep<RegleErrorTree<TState>, {
579
+ recurseIntoArrays: true;
580
+ }>;
581
+ type RegleValidationErrors<TState extends Record<string, any> | any[] | unknown = never> = NonNullable<TState> extends Array<infer U extends Record<string, any>> ? RegleCollectionErrors<U> : NonNullable<TState> extends Date | File ? string[] : NonNullable<TState> extends Record<string, any> ? RegleErrorTree<TState> : string[];
582
+ type RegleCollectionErrors<TState extends Record<string, any>> = {
577
583
  readonly $errors: string[];
578
- readonly $each: RegleValidationErrors<TRule, TExternalError>[];
579
- };
580
- type RegleExternalErrorTree<TState extends Record<string, any> = Record<string, any>> = {
581
- [K in keyof TState]?: RegleExternalValidationErrors<TState[K]>;
584
+ readonly $each: RegleValidationErrors<TState>[];
582
585
  };
583
- type RegleExternalValidationErrors<TValue extends any> = [NonNullable<TValue>] extends [
584
- never
585
- ] ? string[] : TValue extends Array<infer U> ? RegleExternalCollectionErrors<U> : NonNullable<TValue> extends Date ? string[] : NonNullable<TValue> extends File ? string[] : TValue extends Record<string, any> ? RegleExternalErrorTree<TValue> : string[];
586
- type RegleExternalCollectionErrors<TValue extends any = any> = {
587
- $errors?: string[];
588
- $each?: RegleExternalValidationErrors<TValue>[];
589
- };
590
- type RegleExternalValidationErrorsReport<TExternalError extends RegleExternalValidationErrors<any> | undefined = never> = TExternalError extends RegleExternalCollectionErrors ? RegleCollectionErrors<TExternalError['$each']> : TExternalError extends string[] ? string[] : TExternalError extends RegleExternalErrorTree<any> ? RegleErrorTree<TExternalError> : string[];
591
586
 
592
587
  /**
593
588
  * @public
594
589
  */
595
- type RegleRoot<TState extends Record<string, any> = Record<string, any>, TRules extends ReglePartialValidationTree<TState> = Record<string, any>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]> = never, TExternal extends RegleExternalErrorTree<TState> = never, TShortcuts extends RegleShortcutDefinition = never> = RegleStatus<TState, TRules, TExternal, TShortcuts> & {} & ([TValidationGroups] extends [never] ? {} : {
590
+ type RegleRoot<TState extends Record<string, any> = Record<string, any>, TRules extends ReglePartialRuleTree<TState> = Record<string, any>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]> = never, TShortcuts extends RegleShortcutDefinition = {}> = RegleStatus<TState, TRules, TShortcuts> & ([TValidationGroups] extends [never] ? {} : {
596
591
  $groups: {
597
592
  readonly [TKey in keyof TValidationGroups]: RegleValidationGroupOutput;
598
593
  };
@@ -600,21 +595,23 @@ type RegleRoot<TState extends Record<string, any> = Record<string, any>, TRules
600
595
  /**
601
596
  * @public
602
597
  */
603
- type RegleStatus<TState extends Record<string, any> = Record<string, any>, TRules extends ReglePartialValidationTree<TState> = Record<string, any>, TExternal extends RegleExternalErrorTree<TState> = never, TShortcuts extends RegleShortcutDefinition = never> = RegleCommonStatus<TState> & {
598
+ type RegleStatus<TState extends Record<string, any> = Record<string, any>, TRules extends ReglePartialRuleTree<TState> = Record<string, any>, TShortcuts extends RegleShortcutDefinition = {}> = RegleCommonStatus<TState> & {
604
599
  readonly $fields: {
605
- readonly [TKey in keyof TRules]: InferRegleStatusType<NonNullable<TRules[TKey]>, TState, TKey, TShortcuts>;
600
+ readonly [TKey in keyof TState]: InferRegleStatusType<NonNullable<TRules[TKey]>, TState, TKey, TShortcuts>;
601
+ } & {
602
+ readonly [TKey in keyof TState as TRules[TKey] extends NonNullable<TRules[TKey]> ? TKey : never]-?: InferRegleStatusType<NonNullable<TRules[TKey]>, TState, TKey, TShortcuts>;
606
603
  };
607
- readonly $errors: RegleErrorTree<TRules, TExternal>;
608
- readonly $silentErrors: RegleErrorTree<TRules, TExternal>;
604
+ readonly $errors: RegleErrorTree<TState>;
605
+ readonly $silentErrors: RegleErrorTree<TState>;
609
606
  $extractDirtyFields: (filterNullishValues?: boolean) => PartialDeep<TState>;
610
- $parse: () => Promise<false | Prettify<DeepSafeFormState<TState, TRules>>>;
607
+ $validate: () => Promise<false | Prettify<DeepSafeFormState<TState, TRules>>>;
611
608
  } & ([TShortcuts['nested']] extends [never] ? {} : {
612
609
  [K in keyof TShortcuts['nested']]: ReturnType<NonNullable<TShortcuts['nested']>[K]>;
613
610
  });
614
611
  /**
615
612
  * @public
616
613
  */
617
- type InferRegleStatusType<TRule extends RegleCollectionRuleDecl | RegleRuleDecl | ReglePartialValidationTree<any>, TState extends Record<PropertyKey, any> = any, TKey extends PropertyKey = string, TShortcuts extends RegleShortcutDefinition = never> = TRule extends RegleCollectionRuleDefinition<any, any> ? NonNullable<TState[TKey]> extends Array<Record<string, any> | any> ? ExtractFromGetter<TRule['$each']> extends RegleRuleDecl | ReglePartialValidationTree<any> ? RegleCollectionStatus<TState[TKey], ExtractFromGetter<TRule['$each']>, TRule, TShortcuts> : never : RegleFieldStatus<TState[TKey], TRule, TShortcuts> : TRule extends ReglePartialValidationTree<any> ? NonNullable<TState[TKey]> extends Array<any> ? RegleCommonStatus<TState[TKey]> : NonNullable<TState[TKey]> extends Record<PropertyKey, any> ? RegleStatus<TState[TKey], TRule, never, TShortcuts> : RegleFieldStatus<TState[TKey], TRule, TShortcuts> : RegleFieldStatus<TState[TKey], TRule, TShortcuts>;
614
+ type InferRegleStatusType<TRule extends RegleCollectionRuleDecl | RegleRuleDecl | ReglePartialRuleTree<any>, TState extends Record<PropertyKey, any> = any, TKey extends PropertyKey = string, TShortcuts extends RegleShortcutDefinition = {}> = NonNullable<TState[TKey]> extends Array<Record<string, any> | any> ? TRule extends RegleCollectionRuleDefinition<any, any> ? ExtractFromGetter<TRule['$each']> extends ReglePartialRuleTree<any> ? RegleCollectionStatus<TState[TKey], ExtractFromGetter<TRule['$each']>, TRule, TShortcuts> : RegleFieldStatus<TState[TKey], TRule, TShortcuts> : RegleCollectionStatus<TState[TKey], {}, TRule, TShortcuts> : TRule extends ReglePartialRuleTree<any> ? NonNullable<TState[TKey]> extends Array<any> ? RegleCommonStatus<TState[TKey]> : NonNullable<TState[TKey]> extends Date | File ? RegleFieldStatus<TState[TKey], TRule, TShortcuts> : NonNullable<TState[TKey]> extends Record<PropertyKey, any> ? RegleStatus<TState[TKey], TRule, TShortcuts> : RegleFieldStatus<TState[TKey], TRule, TShortcuts> : NonNullable<TState[TKey]> extends Date | File ? RegleFieldStatus<TState[TKey], TRule, TShortcuts> : NonNullable<TState[TKey]> extends Record<PropertyKey, any> ? RegleStatus<TState[TKey], ReglePartialRuleTree<TState[TKey]>, TShortcuts> : RegleFieldStatus<TState[TKey], TRule, TShortcuts>;
618
615
  /**
619
616
  * @public
620
617
  */
@@ -624,6 +621,7 @@ type RegleFieldStatus<TState extends any = any, TRules extends RegleFormProperty
624
621
  readonly $silentErrors: string[];
625
622
  readonly $externalErrors: string[];
626
623
  $extractDirtyFields: (filterNullishValues?: boolean) => Maybe<TState>;
624
+ $validate: () => Promise<false | SafeFieldProperty<TState, TRules>>;
627
625
  readonly $rules: {
628
626
  readonly [TRuleKey in keyof Omit<TRules, '$each' | keyof FieldRegleBehaviourOptions>]: RegleRuleStatus<TState, TRules[TRuleKey] extends RegleRuleDefinition<any, infer TParams, any> ? TParams : [], TRules[TRuleKey] extends RegleRuleDefinition<any, any, any, infer TMetadata> ? TMetadata : TRules[TRuleKey] extends InlineRuleDeclaration<any, any[], infer TMetadata> ? TMetadata extends Promise<infer P> ? P : TMetadata : any>;
629
627
  };
@@ -644,10 +642,9 @@ interface RegleCommonStatus<TValue = any> {
644
642
  readonly $name: string;
645
643
  $id?: string;
646
644
  $value: UnwrapNestedRefs<TValue>;
647
- $touch(): void;
645
+ $touch(runCommit?: boolean): void;
648
646
  $reset(): void;
649
647
  $resetAll: () => void;
650
- $validate(): Promise<boolean>;
651
648
  $unwatch(): void;
652
649
  $watch(): void;
653
650
  $clearExternalErrors(): void;
@@ -674,14 +671,14 @@ type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata exte
674
671
  /**
675
672
  * @public
676
673
  */
677
- type RegleCollectionStatus<TState extends any[] = any[], TRules extends ReglePartialValidationTree<Record<string, any>> = Record<string, any>, TFieldRule extends RegleCollectionRuleDecl<any, any> = never, TShortcuts extends RegleShortcutDefinition = never> = Omit<RegleFieldStatus<TState, TRules, TShortcuts>, '$errors' | '$silentErrors' | '$extractDirtyFields' | '$externalErrors' | '$rules' | '$value'> & {
674
+ type RegleCollectionStatus<TState extends any[] = any[], TRules extends ReglePartialRuleTree<ArrayElement<TState>> = Record<string, any>, TFieldRule extends RegleCollectionRuleDecl<any, any> = never, TShortcuts extends RegleShortcutDefinition = {}> = Omit<RegleFieldStatus<TState, TRules, TShortcuts>, '$errors' | '$silentErrors' | '$extractDirtyFields' | '$externalErrors' | '$rules' | '$value' | '$validate'> & {
678
675
  $value: Maybe<TState>;
679
676
  readonly $each: Array<InferRegleStatusType<NonNullable<TRules>, NonNullable<TState>, number, TShortcuts>>;
680
677
  readonly $field: RegleFieldStatus<TState, TFieldRule, TShortcuts>;
681
- readonly $errors: RegleErrorTree<TRules>;
682
- readonly $silentErrors: RegleErrorTree<TRules>;
678
+ readonly $errors: RegleCollectionErrors<TState>;
679
+ readonly $silentErrors: RegleCollectionErrors<TState>;
683
680
  $extractDirtyFields: (filterNullishValues?: boolean) => PartialDeep<TState>;
684
- $parse: () => Promise<false | SafeProperty<TState, TRules>>;
681
+ $validate: () => Promise<false | DeepSafeFormState<ArrayElement<TState>, TRules>>[];
685
682
  } & ([TShortcuts['collections']] extends [never] ? {} : {
686
683
  [K in keyof TShortcuts['collections']]: ReturnType<NonNullable<TShortcuts['collections']>[K]>;
687
684
  });
@@ -734,4 +731,4 @@ declare function defineRegleConfig<TCustomRules extends Partial<AllRulesDeclarat
734
731
  inferRules: inferRulesFn<TCustomRules>;
735
732
  };
736
733
 
737
- export { type AllRulesDeclarations, type DeepMaybeRef, type FormRuleDeclaration, type InferRegleRoot, type InferRegleRule, type InferRegleRules, type InferRegleShortcuts, type InlineRuleDeclaration, InternalRuleType, type LocalRegleBehaviourOptions, type Maybe, type ParamDecl, type Regle, type RegleBehaviourOptions, type RegleCollectionErrors, type RegleCollectionRuleDecl, type RegleCollectionRuleDefinition, type RegleCollectionStatus, type RegleCommonStatus, type RegleComputedRules, type RegleEnforceCustomRequiredRules, type RegleEnforceRequiredRules, type RegleErrorTree, type RegleExternalCollectionErrors, type RegleExternalErrorTree, type RegleExternalValidationErrors, type RegleExternalValidationErrorsReport, type RegleFieldStatus, type RegleFormPropertyType, type RegleInternalRuleDefs, type ReglePartialValidationTree, type RegleRoot, type RegleRuleCore, type RegleRuleDecl, type RegleRuleDefinition, type RegleRuleDefinitionProcessor, type RegleRuleDefinitionWithMetadataProcessor, type RegleRuleInit, type RegleRuleMetadataConsumer, type RegleRuleMetadataDefinition, type RegleRuleRaw, type RegleRuleStatus, type RegleRuleWithParamsDefinition, type RegleStatus, type RegleUniversalParams, type RegleValidationErrors, type RegleValidationGroupEntry, type RegleValidationGroupOutput, type RegleValidationTree, type Unwrap, type UnwrapRegleUniversalParams, type UnwrapRuleWithParams, createRule, defineRegleConfig, inferRules, unwrapRuleParameters, useRegle };
734
+ export { type AllRulesDeclarations, type DeepMaybeRef, type FormRuleDeclaration, type InferRegleRoot, type InferRegleRule, type InferRegleRules, type InferRegleShortcuts, type InlineRuleDeclaration, InternalRuleType, type LocalRegleBehaviourOptions, type Maybe, type ParamDecl, type Regle, type RegleBehaviourOptions, type RegleCollectionErrors, type RegleCollectionRuleDecl, type RegleCollectionRuleDefinition, type RegleCollectionStatus, type RegleCommonStatus, type RegleComputedRules, type RegleEnforceCustomRequiredRules, type RegleEnforceRequiredRules, type RegleErrorTree, type RegleExternalErrorTree, type RegleFieldStatus, type RegleFormPropertyType, type RegleInternalRuleDefs, type ReglePartialRuleTree, type RegleRoot, type RegleRuleCore, type RegleRuleDecl, type RegleRuleDefinition, type RegleRuleDefinitionProcessor, type RegleRuleDefinitionWithMetadataProcessor, type RegleRuleInit, type RegleRuleMetadataConsumer, type RegleRuleMetadataDefinition, type RegleRuleRaw, type RegleRuleStatus, type RegleRuleWithParamsDefinition, type RegleStatus, type RegleUniversalParams, type RegleValidationErrors, type RegleValidationGroupEntry, type RegleValidationGroupOutput, type RegleRuleTree as RegleValidationTree, type Unwrap, type UnwrapRegleUniversalParams, type UnwrapRuleWithParams, createRule, defineRegleConfig, inferRules, unwrapRuleParameters, useRegle };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import {unref,version,isRef,toRef,computed,ref,toRaw,reactive,shallowRef,onScopeDispose,triggerRef,watch,effectScope,watchEffect}from'vue';var Pe=(r=>(r.Inline="__inline",r.Async="__async",r))(Pe||{});function Ke(e,t){return computed(()=>e.value.some(r=>r[t]))}function et(e,t){return computed(()=>e.value.reduce((r,n)=>{let a=n[t]||[];return r.concat(a)},[]))}function q(e){return e.map(t=>t instanceof Function?t():unref(t))}function tt(e){return e.map(t=>t instanceof Function||isRef(t)?t:toRef(()=>t))}function rt(e){let t=e.toString();return (t.includes("=>")?t.split("=>")[0]:t).slice(t.indexOf("(")+1,t.indexOf(")")).split(",").map(o=>o.trim()).filter(o=>o.includes("=")).length+e.length}function we(e,...t){let{message:r,validator:n,active:a,type:o,...u}=e,v=o==="__async"||n.constructor.name==="AsyncFunction";return {...{validator(S,...m){return e.validator(S,...q(m.length?m:t))},message(S,m){return typeof e.message=="function"?e.message(S,{...m,$params:q(m.$params?.length?m.$params:t)}):e.message},active(S,m){return typeof e.active=="function"?e.active(S,{...m,$params:q(m.$params?.length?m.$params:t)}):e.active??!0},exec(S){let m=e.validator(S,...q(t)),d;return m instanceof Promise?m.then(f=>(d=f,typeof d=="object"&&"$valid"in d?d.$valid:typeof d=="boolean"?d:!1)):(d=m,typeof d=="object"&&"$valid"in d?d.$valid:typeof d=="boolean"?d:!1)}},...u,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:v,_params:tt(t)}}function Oe(e){if(typeof e.validator=="function"){let r=we(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(rt(e.validator)>1){let a=function(...o){return we(e,...o)};return a.validator=r.validator,a.message=r.message,a.active=r.active,a.type=r.type,a.exec=r.exec,a._validator=r.validator,a._message=r.message,a._active=r.active,a._type=e.type,a._patched=!1,a._async=n,a}else return r}throw new Error("Validator must be a function")}function L(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function nt(e){return L(e.value)}function K(e){let t=e,r={}.toString.call(e).slice(8,-1);if(r=="Set"&&(t=new Set([...e].map(n=>K(n)))),r=="Map"&&(t=new Map([...e].map(n=>[K(n[0]),K(n[1])]))),r=="Date"&&(t=new Date(e.getTime())),r=="RegExp"&&(t=RegExp(e.source,xt(e))),r=="Array"||r=="Object"){t=Array.isArray(e)?[]:{};for(let n in e)t[n]=K(e[n]);}return t}function xt(e){if(typeof e.source.flags=="string")return e.source.flags;{let t=[];return e.global&&t.push("g"),e.ignoreCase&&t.push("i"),e.multiline&&t.push("m"),e.sticky&&t.push("y"),e.unicode&&t.push("u"),t.join("")}}function Ae(e,t,r){return e instanceof Function?e(t,r??0):e}function at(e,t){isRef(e)?e.value=t:e=t;}function lt(e,t){isRef(e)?e.value=[]:e=[],t.forEach((r,n)=>{let a=isRef(e)?e.value[n]:e[n];a={},de(a,t[n]);});}function de(e,t){Object.entries({...unref(e),...t}).forEach(([r,n])=>{let a=isRef(e)?e.value:e,o=isRef(t[r])?t[r]._value:t[r],u=isRef(a[r])?a[r].value:a[r];Array.isArray(a[r])?(a[r]=[],Array.isArray(o)&&o.forEach((v,E)=>{a[r][E]={},de(a[r][E],o[E]);})):L(o)?de(u,o):isRef(a[r])?a[r].value=o:a[r]=o;});}function ee(e){return e==null?!0:e===!1?!1:e instanceof Date?isNaN(e.getTime()):Array.isArray(e)?e.length===0:typeof e=="object"&&e!=null?Object.keys(e).length===0:typeof e=="string"?!String(e.trim()).length:!1}function ye(e,t,r){let n,a=(...o)=>new Promise(u=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...o])).then(u);},t);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...o)=>new Promise(u=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...o])).then(u);},0);}),a}function Ct(e,t){let r=String(e).split("."),n=String(t).split(".");for(let a=0;a<Math.min(r.length,n.length);a++){let o=Number(r[a]),u=Number(n[a]);if(o>u)return 1;if(u>o)return -1;if(!isNaN(o)&&isNaN(u))return 1;if(isNaN(o)&&!isNaN(u))return -1}return 0}var ie=Ct(version,"3.5.0")!==-1;function It(){return Math.floor(Math.random()*Date.now()).toString()}function Fe(){return typeof window>"u"?It():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(10)}function Me(){let e=shallowRef(new Map),t=shallowRef(new Map),r=shallowRef(new Map),n=shallowRef(new Map),a=shallowRef(new Map),o=shallowRef(new Map);function u(s){let l=t.value.get(s);if(l)return l;{let x=ref({});return t.value.set(s,x),x}}function v(s){let l=r.value.get(s);if(l)return l;{let x=ref([]);return r.value.set(s,x),x}}function E(s,l,x){o.value.set(`${s}-${l}`,x);}function $(s,l){return o.value.get(`${s}-${l}`)}function S(s,l){s&&l!=null&&o.value.delete(`${s}-${l}`);}function m(s,l){n.value.set(s,l);}function d(s){return n.value.get(s)??!1}function f(s,l){e.value.set(s,l);}function c(s,l){let x=e.value.get(s);return x?I(l,x)?{valid:!0}:{valid:!1}:void 0}function I(s,l){let x=Object.keys(l),V=Object.keys(s);return V.length!==x.length||!V.every(P=>x.includes(P))?!1:V.every(P=>{let h=s[P],w=l[P];return !w||!h||typeof h=="function"||typeof w=="function"||typeof h=="number"||typeof h=="boolean"?!1:h._params?h._params?.every((O,_)=>{if(typeof w=="number"||typeof w=="boolean")return !0;{let M=q(w._params),H=q(h._params);return M?.[_]===H?.[_]}}):!0})}function C(s){let l=a.value.get(s);if(l)return l;{let x=ref(!1),V=ref(!0),G=ref({}),P=ref(!1);return a.value.set(s,{$pending:x,$valid:V,$metadata:G,$validating:P}),{$pending:x,$valid:V,$metadata:G,$validating:P}}}return onScopeDispose(()=>{e.value.clear(),t.value.clear(),r.value.clear(),n.value.clear(),a.value.clear(),o.value.clear();}),{addRuleDeclEntry:f,setDirtyEntry:m,checkRuleDeclEntry:c,getDirtyState:d,trySetRuleStatusRef:C,getFieldsEntry:u,getCollectionsEntry:v,getArrayStatus:$,addArrayStatus:E,deleteArrayStatus:S,arrayStatusStorage:o}}function ot(e,t){return L(e.value)&&L(t.value)&&!Object.entries(t.value).some(r=>me(r))}function st(e){return !!e.value&&"$each"in e.value}function it(e){return !!e.value&&L(e.value)}function me(e){return L(e)&&"_validator"in e}function ge(e){return typeof e.value!="function"}function Ve(e){return L(e)&&"$fields"in e}function je(e){return "$each"in e||"$errors"in e}function _e({field:e,silent:t=!1}){return Object.entries(e.$rules??{}).map(([r,n])=>t||!n.$valid&&e.$dirty&&!n.$validating?n.$message:null).filter(r=>!!r).reduce((r,n)=>typeof n=="string"?r?.concat([n]):r?.concat(n),[]).concat(e.$externalErrors??[])}function ct({$dirty:e,customMessages:t,rule:r,ruleKey:n,state:a,path:o,storage:u,$debounce:v}){let E=effectScope(),$,S,m=ref(!1),{$pending:d,$valid:f,$metadata:c,$validating:I}=u.trySetRuleStatusRef(`${o}.${n}`);function C(){$=E.run(()=>{let h=computed(()=>({$invalid:!f.value,$params:H.value,...c.value})),w=computed(()=>ge(r)?typeof r.value.active=="function"?r.value.active(a.value,h.value):r.value.active:!0),O=computed(()=>{let y="",g=t?t[n]?.message:void 0;return g&&(typeof g=="function"?y=g(a.value,h.value):y=g),ge(r)&&(g&&!r.value._patched||(typeof r.value.message=="function"?y=r.value.message(a.value,h.value):y=r.value.message)),ee(y)&&(y="Error",console.warn(`No error message defined for ${o}.${n}`)),y}),_=computed(()=>ge(r)&&r.value.type?r.value.type:n),M=computed(()=>ge(r)?r.value.validator:r.value),H=computed(()=>typeof r.value=="function"?[]:q(r.value._params??[])),D=computed(()=>`${o}.${_.value}`);return {$active:w,$message:O,$type:_,$validator:M,$params:H,$path:D}}),S=watch($.$params,V,{deep:!0});}C();function s(){f.value=!0,e.value&&(d.value=!0);}async function l(){let h=$.$validator.value,w=h(a.value,...$.$params.value),O=!1,_=a.value;try{s();let M;if(w instanceof Promise?M=await w:M=w,a.value!==_)return !0;if(typeof M=="boolean")O=M;else {let{$valid:H,...D}=M;O=H,c.value=D;}}catch{O=!1;}finally{d.value=!1;}return O}let x=ye(l,v??200);async function V(){I.value=!0;let h=!1;if(me(r.value)&&r.value._async)h=await x();else {let w=$.$validator.value,O=w(a.value,...$.$params.value);if(O instanceof Promise)console.warn('You used a async validator function on a non-async rule, please use "async await" or the "withAsync" helper');else if(O!=null)if(typeof O=="boolean")h=O;else {let{$valid:_,...M}=O;h=_,c.value=M;}}return f.value=h,I.value=!1,h}function G(){f.value=!0,c.value={},d.value=!1,I.value=!1,C();}function P(){S(),E.stop(),E=effectScope();}return reactive({...$,$pending:d,$valid:f,$metadata:c,_haveAsync:m,$validating:I,$validate:V,$unwatch:P,$watch:C,$reset:G})}function Ee({state:e,rulesDef:t,customMessages:r,path:n,fieldName:a,storage:o,options:u,externalErrors:v,onUnwatch:E,$isArray:$,initialState:S,shortcuts:m}){let d=effectScope(),f,c=ref(!1),I=ref(!1),C=ref([]),s,l,x,V,G,P=()=>{};function h(){C.value=v.value??[];}h();function w(){let j=t.value,U=o.checkRuleDeclEntry(n,j);y.value=Object.fromEntries(Object.entries(j).filter(([W])=>W.startsWith("$"))),D.value=Object.fromEntries(Object.entries(t.value).filter(([W])=>!W.startsWith("$")).map(([W,Q])=>{if(Q){let De=toRef(()=>Q);return [W,ct({$dirty:c,customMessages:r,rule:De,ruleKey:W,state:e,path:n,storage:o,$debounce:y.value.$debounce})]}return []}).filter(W=>!!W.length)),M(),O(),U?.valid!=null&&(c.value=o.getDirtyState(n),c.value&&P()),o.addRuleDeclEntry(n,j);}function O(){P=f.$debounce.value?ye(H,f.$debounce.value??f.haveAnyAsyncRule?100:0):H;}function _(){D.value&&Object.entries(D.value).forEach(([j,U])=>{U.$unwatch();}),V(),c.value&&o.setDirtyEntry(n,c.value),s(),l(),x(),d.stop(),d=effectScope(),E?.(),G?.();}function M(){D.value&&Object.entries(D.value).forEach(([j,U])=>{U.$watch();}),f=d.run(()=>{let j=computed(()=>c.value),U=computed(()=>y.value.$debounce),W=computed(()=>y.value.$lazy!=null?y.value.$lazy:unref(u.lazy)),Q=computed(()=>y.value.$rewardEarly!=null?y.value.$rewardEarly:unref(u.rewardEarly)),De=computed(()=>y.value.$autoDirty!=null?y.value.$autoDirty:unref(u.autoDirty)),gt=computed(()=>Object.entries(D.value).some(([Z,J])=>J.$validating)),Ce=computed(()=>pe.value&&!he.value&&c.value),Le=computed(()=>Ce.value?_e({field:{$dirty:c.value,$externalErrors:C.value,$rules:D.value}}):[]),ze=computed(()=>_e({field:{$dirty:c.value,$externalErrors:C.value,$rules:D.value},silent:!0})),Je=computed(()=>!(pe.value||he.value)),he=computed(()=>I.value||!Q.value?Object.entries(D.value).some(([Z,J])=>J.$pending):!1),pe=computed(()=>C.value?.length?!0:!Q.value||Q.value&&I.value?Object.entries(D.value).some(([Z,J])=>!J.$valid):!1),Ye=computed(()=>a),Ie=computed(()=>c.value&&!ee(e.value)&&!gt.value?C.value?.length?!1:Q.value?Object.entries(D.value).every(([Z,J])=>J.$valid):!pe.value:!1),vt=computed(()=>Object.entries(D.value).some(([Z,J])=>J._haveAsync));function $t(){m?.fields&&Object.entries(m.fields).forEach(([Z,J])=>{let St=effectScope();Qe[Z]=St.run(()=>{let Xe=ref();return watchEffect(()=>{Xe.value=J({$dirty:c.value,$externalErrors:C.value,$value:e,$rules:D.value,$error:Ce.value,$pending:he.value,$invalid:pe.value,$valid:Ie.value,$errors:Le.value,$ready:Je.value,$silentErrors:ze.value,$anyDirty:j.value,$name:Ye.value});}),Xe});});}let Qe={};return $t(),watch(Ie,Z=>{Z&&(I.value=!1);}),{$error:Ce,$pending:he,$invalid:pe,$valid:Ie,$debounce:U,$lazy:W,$errors:Le,$ready:Je,$silentErrors:ze,$rewardEarly:Q,$autoDirty:De,$anyDirty:j,$name:Ye,haveAnyAsyncRule:vt,$shortcuts:Qe}}),x=watch(v,h),s=watch(e,()=>{f.$autoDirty.value&&(c.value||(c.value=!0)),t.value instanceof Function&&w(),P(),f.$rewardEarly.value;},{deep:$?!0:ie?1:!0}),V=watch(c,()=>{o.setDirtyEntry(n,c.value);}),l=watch(f.$valid,j=>{f.$rewardEarly.value&&j&&(I.value=!1);}),G=watch(f.haveAnyAsyncRule,O);}function H(){Object.entries(D.value).forEach(([j,U])=>{U.$validate();});}let D=ref(),y=ref();w();function g(){c.value=!1,C.value=[],Object.entries(D.value).forEach(([j,U])=>{U.$reset();}),f.$lazy.value||Object.entries(D.value).map(([j,U])=>U.$validate());}function p(){c.value||(c.value=!0,f.$rewardEarly.value,P());}let R=f.$debounce.value?ye(i,f.$debounce.value??0):i;async function i(){try{if(I.value=!0,f.$autoDirty.value&&c.value&&!f.$pending.value)return !f.$error.value;{let j=Object.entries(D.value).map(([W,Q])=>Q.$validate());return (await Promise.allSettled(j)).every(W=>W.status==="fulfilled"?W.value:!1)}}catch{return !1}}function b(){_(),e.value=at(e,S),g();}function T(j=!0){return c.value?e.value:null}function N(){C.value=[];}f.$lazy.value||i();let{$anyDirty:Y,$error:te,$errors:oe,$invalid:re,$name:B,$pending:F,$ready:A,$silentErrors:se,$valid:xe,$shortcuts:Se}=f;return reactive({$dirty:c,$error:te,$errors:oe,$valid:xe,$invalid:re,$pending:F,$silentErrors:se,$anyDirty:Y,$ready:A,$name:B,$externalErrors:C,$value:e,$rules:D,...Se,$reset:g,$touch:p,$validate:R,$unwatch:_,$watch:M,$resetAll:b,$extractDirtyFields:T,$clearExternalErrors:N})}function ft({$id:e,path:t,index:r,options:n,storage:a,stateValue:o,customMessages:u,rules:v,externalErrors:E,initialState:$,shortcuts:S,fieldName:m}){let d=v.$key?v.$key:Fe(),f=`${t}.${String(d)}`;typeof o.value=="object"&&o.value!=null&&(o.value.$id?f=`${t}.${o.value.$id}`:Object.defineProperties(o.value,{$id:{value:d,enumerable:!1,configurable:!1,writable:!1}}));let c=toRef(()=>E.value?.[r]),I=Te({state:o,rulesDef:toRef(()=>v),customMessages:u,path:f,storage:a,options:n,externalErrors:c,initialState:$?.[r],shortcuts:S,fieldName:m});if(I){let C=o.value?.$id;I.$id=C??String(d),a.addArrayStatus(e,I.$id,I);}return I}function Rt({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:u,initialState:v,shortcuts:E,fieldName:$}){let S=effectScope(),m,d=effectScope(),f;if(Array.isArray(e.value)&&!t.value.$each)return null;let c=ref(),I=ref(e.value),C,s=ref({}),l=a.getCollectionsEntry(n);f=d.run(()=>{let p=computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(b=>typeof b!="object"):t.value.$each&&!(t.value.$each instanceof Function)?Object.values(t.value.$each).every(b=>me(b)):!1),R=computed(()=>u.value?je(u.value)?u.value.$errors??[]:[]:[]),i=computed(()=>u.value?je(u.value)?u.value.$each??[]:[]:[]);return {isPrimitiveArray:p,$externalErrorsField:R,$externalErrorsEach:i}}),x(),G();function x(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(c.value=Fe(),Object.defineProperties(e.value,{$id:{value:c.value,enumerable:!1,configurable:!1,writable:!1}})):e.value?.$id&&(c.value=e.value.$id)),!f.isPrimitiveArray.value&&(I.value=s.value.$value,Array.isArray(e.value)&&t.value.$each?l.value=e.value.map((p,R)=>{let i=Ae(t.value.$each,toRef(()=>p),R);if(i){let b=ft({$id:c.value,path:n,rules:i,stateValue:toRef(()=>p),index:R,options:o,storage:a,externalErrors:f.$externalErrorsEach,initialState:v[R],shortcuts:E,fieldName:$});return b||null}}).filter(p=>!!p):l.value=[],s.value=Ee({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:f.$externalErrorsField,$isArray:!0,initialState:v,shortcuts:E,fieldName:$}));}function V(){if(Array.isArray(e.value)){let p=K(l.value);l.value=e.value.map((R,i)=>{let b=toRef(()=>R);if(R.$id&&l.value.find(T=>T.$id===R.$id)){let T=a.getArrayStatus(c.value,R.$id);return T?(T.$value=b,T):null}else {let T=Ae(t.value.$each,b,i);if(T){let N=ft({$id:c.value,path:n,rules:T,stateValue:b,index:i,options:o,storage:a,externalErrors:f.$externalErrorsEach,initialState:v[i],fieldName:$});return N||null}}}).filter(R=>!!R),p.filter(R=>!e.value.find(i=>R.$id===i.$id)).forEach((R,i)=>{a.deleteArrayStatus(c.value,i.toString());});}else l.value=[];}function G(){C=watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")?x():V();},{deep:ie?1:!0,flush:"pre"}),m=S.run(()=>{let p=computed(()=>s.value.$dirty&&l.value.every(A=>A.$dirty)),R=computed(()=>s.value.$anyDirty||l.value.some(A=>A.$dirty)),i=computed(()=>s.value.$invalid||l.value.some(A=>A.$invalid)),b=computed(()=>s.value.$valid&&l.value.every(A=>A.$valid)),T=computed(()=>s.value.$error||l.value.some(A=>A.$error)),N=computed(()=>!(i.value||Y.value)),Y=computed(()=>s.value.$pending||l.value.some(A=>A.$pending)),te=computed(()=>({$errors:s.value.$errors,$each:l.value.map(A=>A.$errors)})),oe=computed(()=>({$errors:s.value.$silentErrors,$each:l.value.map(A=>A.$silentErrors)})),re=computed(()=>$);function B(){E?.collections&&Object.entries(E?.collections).forEach(([A,se])=>{let xe=effectScope();F[A]=xe.run(()=>{let Se=ref();return watchEffect(()=>{Se.value=se({$dirty:p.value,$error:T.value,$pending:Y.value,$invalid:i.value,$valid:b.value,$errors:te.value,$ready:N.value,$silentErrors:oe.value,$anyDirty:R.value,$name:re.value,$each:l.value,$field:s.value,$value:e});}),Se});});}let F={};return B(),{$dirty:p,$anyDirty:R,$invalid:i,$valid:b,$error:T,$pending:Y,$errors:te,$silentErrors:oe,$ready:N,$name:re,$shortcuts:F}}),f.isPrimitiveArray.value&&(console.warn(`${n} is a Array of primitives. Tracking can be lost when reassigning the Array. We advise to use an Array of objects instead`),C());}function P(){C&&C(),s.value&&s.value.$unwatch(),l.value&&l.value.forEach(p=>{"$dirty"in p&&p.$unwatch();}),S.stop(),S=effectScope(),d.stop(),d=effectScope(!0);}function h(){s.value.$touch(),l.value.forEach(p=>{p.$touch();});}function w(){s.value.$reset(),l.value.forEach(p=>{p.$reset();});}async function O(){try{return (await Promise.all([s.value.$validate(),...l.value.map(R=>R.$validate())])).every(R=>!!R)}catch{return !1}}function _(){s.value.$clearExternalErrors(),l.value.forEach(p=>{p.$clearExternalErrors();});}function M(p=!0){let R=l.value.map(i=>{if(Ve(i))return i.$extractDirtyFields(p)});return p&&(R=R.filter(i=>L(i)?!ee(i):!!i)),R}function H(){console.log(v),P(),lt(e,v),w();}async function D(){return h(),await O()?e.value:!1}let{$shortcuts:y,...g}=m;return reactive({$field:s,...g,...y,$each:l,$value:e,$validate:O,$unwatch:P,$watch:G,$touch:h,$reset:w,$resetAll:H,$extractDirtyFields:M,$parse:D,$clearExternalErrors:_})}function Be({scopeRules:e,state:t,customMessages:r,path:n="",rootRules:a,storage:o,options:u,externalErrors:v,validationGroups:E,initialState:$,shortcuts:S,fieldName:m}){let d,f,c=null;function s(y=!0){l.value=null,triggerRef(l);let g=Object.fromEntries(Object.entries(e.value).map(([i,b])=>{if(b){let T=toRef(t.value,i),N=toRef(()=>b),Y=toRef(()=>v.value?.[i]);return [i,Te({state:T,rulesDef:N,customMessages:r,path:n?`${n}.${i}`:i,storage:o,options:u,externalErrors:Y,initialState:$?.[i],shortcuts:S,fieldName:i})]}return []}).filter(i=>!!i.length&&i[1]!=null)),p=Object.fromEntries(Object.entries(unref(v)??{}).filter(([i])=>!(i in e.value)).map(([i,b])=>{if(b){let T=toRef(()=>({})),N=toRef(()=>b);return [i,Te({state:ref(void 0),rulesDef:T,customMessages:r,path:n?`${n}.${i}`:i,storage:o,options:u,externalErrors:N,initialState:$?.[i],fieldName:i})]}return []})),R=Object.fromEntries(Object.entries(E?.(g)??{}).map(([i,b])=>b.length?[i,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(T=>[T,Ke(toRef(()=>b),T)])),...Object.fromEntries(["$errors","$silentErrors"].map(T=>[T,et(toRef(()=>b),T)]))}]:[]));l.value={...g,...p,...R},y&&P();}let l=o.getFieldsEntry(n);s();function x(){s(!1),Object.entries(l.value).forEach(([y,g])=>{g.$reset();}),P();}function V(){Object.entries(l.value).forEach(([y,g])=>{g.$touch();});}async function G(){try{return (await Promise.allSettled(Object.entries(l.value).map(([g,p])=>p.$validate()))).every(g=>g.status==="fulfilled"?g.value:!1)}catch{return !1}}function P(){a&&(c=watch(a,()=>{h(),s();},{deep:ie?1:!0,flush:"post"})),d=effectScope(),f=d.run(()=>{let y=computed(()=>!!Object.entries(l.value).length&&Object.entries(l.value).every(([B,F])=>F.$dirty)),g=computed(()=>Object.entries(l.value).some(([B,F])=>F.$dirty)),p=computed(()=>Object.entries(l.value).some(([B,F])=>F.$invalid)),R=computed(()=>Object.entries(l.value).every(([B,F])=>F.$valid)),i=computed(()=>y.value&&!T.value&&p.value),b=computed(()=>!(p.value||T.value)),T=computed(()=>Object.entries(l.value).some(([B,F])=>F.$pending)),N=computed(()=>Object.fromEntries(Object.entries(l.value).map(([B,F])=>[B,F.$errors]))),Y=computed(()=>Object.fromEntries(Object.entries(l.value).map(([B,F])=>[B,F.$silentErrors]))),te=computed(()=>m);function oe(){S?.nested&&Object.entries(S.nested).forEach(([B,F])=>{let A=effectScope();re[B]=A.run(()=>{let se=ref();return watchEffect(()=>{se.value=F({$dirty:y.value,$value:t,$error:i.value,$pending:T.value,$invalid:p.value,$valid:R.value,$ready:b.value,$anyDirty:g.value,$name:te.value,$silentErrors:Y.value,$errors:N.value,$fields:l.value});}),se});});}let re={};return oe(),{$dirty:y,$anyDirty:g,$invalid:p,$valid:R,$error:i,$pending:T,$errors:N,$silentErrors:Y,$ready:b,$name:te,$shortcuts:re}});}function h(){l.value&&Object.entries(l.value).forEach(([y,g])=>{g.$unwatch();}),c?.(),d.stop(),d=effectScope();}function w(){Object.entries(l.value).forEach(([y,g])=>{g.$clearExternalErrors();});}function O(){h(),de(t,$??{}),x();}function _(y=!0){let g=Object.entries(l.value).map(([p,R])=>[p,R.$extractDirtyFields(y)]);return y&&(g=g.filter(([p,R])=>L(R)?!ee(R):Array.isArray(R)?R.length:!!R)),Object.fromEntries(g)}async function M(){return V(),await G()?t.value:!1}let{$shortcuts:H,...D}=f;return reactive({...D,...H,$fields:l,$value:t,$resetAll:O,$reset:x,$touch:V,$validate:G,$unwatch:h,$watch:P,$clearExternalErrors:w,$extractDirtyFields:_,$parse:M})}function Te({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:u,index:v,initialState:E,shortcuts:$,onUnwatch:S,fieldName:m}){return st(t)?Rt({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,index:v,externalErrors:u,initialState:E,fieldName:m,shortcuts:$}):ot(e,t)&&nt(e)?Be({scopeRules:t,state:e,customMessages:r,path:n,storage:a,options:o,index:v,initialState:E,shortcuts:$,fieldName:m,externalErrors:u}):it(t)?Ee({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,index:v,externalErrors:u,onUnwatch:S,shortcuts:$,initialState:E,fieldName:m}):null}function Ue({initialState:e,options:t,scopeRules:r,state:n,customRules:a,shortcuts:o}){let u=Me(),v=computed(()=>unref(t.externalErrors));return reactive(Be({rootRules:r,scopeRules:r,state:n,customMessages:a?.(),storage:u,options:t,externalErrors:v,validationGroups:t.validationGroups,initialState:e,shortcuts:o,fieldName:"root"}))}function We(e,t,r){let n={autoDirty:t?.autoDirty??!0,lazy:t?.lazy??!1,rewardEarly:t?.rewardEarly??!1};function a(o,u,v){let E=isRef(u)?u:computed(typeof u=="function"?u:()=>u),$={...n,...v},S=isRef(o)?o:ref(o),m=K(toRaw(S.value));return {r$:Ue({scopeRules:E,state:S,options:$,initialState:m,customRules:e,shortcuts:r})}}return a}var yt=We();function He(){function e(t,r){return r}return e}var qe=He();function mt({rules:e,modifiers:t,shortcuts:r}){let n=We(e,t,r),a=He();return {useRegle:n,inferRules:a}}export{Pe as InternalRuleType,Oe as createRule,mt as defineRegleConfig,qe as inferRules,q as unwrapRuleParameters,yt as useRegle};
1
+ import {unref,version,isRef,toRef,computed,ref,toRaw,reactive,shallowRef,onScopeDispose,triggerRef,watch,effectScope,watchEffect}from'vue';var Pe=(r=>(r.Inline="__inline",r.Async="__async",r))(Pe||{});function Ke(e,t){return computed(()=>e.value.some(r=>r[t]))}function et(e,t){return computed(()=>e.value.reduce((r,n)=>{let a=n[t]||[];return r.concat(a)},[]))}function q(e){return e.map(t=>t instanceof Function?t():unref(t))}function tt(e){return e.map(t=>t instanceof Function||isRef(t)?t:toRef(()=>t))}function rt(e){let t=e.toString();return (t.includes("=>")?t.split("=>")[0]:t).slice(t.indexOf("(")+1,t.indexOf(")")).split(",").map(o=>o.trim()).filter(o=>o.includes("=")).length+e.length}function we(e,...t){let{message:r,validator:n,active:a,type:o,...c}=e,S=o==="__async"||n.constructor.name==="AsyncFunction";return {...{validator($,...g){return e.validator($,...q(g.length?g:t))},message($,g){return typeof e.message=="function"?e.message($,{...g,$params:q(g.$params?.length?g.$params:t)}):e.message},active($,g){return typeof e.active=="function"?e.active($,{...g,$params:q(g.$params?.length?g.$params:t)}):e.active??!0},exec($){let g=e.validator($,...q(t)),y;return g instanceof Promise?g.then(v=>(y=v,typeof y=="object"&&"$valid"in y?y.$valid:typeof y=="boolean"?y:!1)):(y=g,typeof y=="object"&&"$valid"in y?y.$valid:typeof y=="boolean"?y:!1)}},...c,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:S,_params:tt(t)}}function Oe(e){if(typeof e.validator=="function"){let r=we(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(rt(e.validator)>1){let a=function(...o){return we(e,...o)};return a.validator=r.validator,a.message=r.message,a.active=r.active,a.type=r.type,a.exec=r.exec,a._validator=r.validator,a._message=r.message,a._active=r.active,a._type=e.type,a._patched=!1,a._async=n,a}else return r}throw new Error("Validator must be a function")}function L(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function nt(e){return L(e.value)}function te(e){let t=e,r={}.toString.call(e).slice(8,-1);if(r=="Set"&&(t=new Set([...e].map(n=>te(n)))),r=="Map"&&(t=new Map([...e].map(n=>[te(n[0]),te(n[1])]))),r=="Date"&&(t=new Date(e.getTime())),r=="RegExp"&&(t=RegExp(e.source,Tt(e))),r=="Array"||r=="Object"){t=Array.isArray(e)?[]:{};for(let n in e)t[n]=te(e[n]);}return t}function Tt(e){if(typeof e.source.flags=="string")return e.source.flags;{let t=[];return e.global&&t.push("g"),e.ignoreCase&&t.push("i"),e.multiline&&t.push("m"),e.sticky&&t.push("y"),e.unicode&&t.push("u"),t.join("")}}function Ae(e,t,r){return e instanceof Function?e(t,r??0):e}function at(e,t){isRef(e)?e.value=t:e=t;}function lt(e,t){isRef(e)?e.value=[]:e=[],t.forEach((r,n)=>{let a=isRef(e)?e.value[n]:e[n];a={},pe(a,t[n]);});}function pe(e,t){Object.entries({...unref(e),...t}).forEach(([r,n])=>{let a=isRef(e)?e.value:e,o=isRef(t[r])?t[r]._value:t[r],c=isRef(a[r])?a[r].value:a[r];Array.isArray(a[r])?(a[r]=[],Array.isArray(o)&&o.forEach((S,b)=>{a[r][b]={},pe(a[r][b],o[b]);})):L(o)?pe(c,o):isRef(a[r])?a[r].value=o:a[r]=o;});}function Q(e){return e==null?!0:e===!1?!1:e instanceof Date?isNaN(e.getTime()):Array.isArray(e)?e.length===0:typeof e=="object"&&e!=null?Object.keys(e).length===0:typeof e=="string"?!String(e.trim()).length:!1}function he(e,t,r){let n,a=(...o)=>new Promise(c=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...o])).then(c);},t);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...o)=>new Promise(c=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...o])).then(c);},0);}),a}function Dt(e,t){let r=String(e).split("."),n=String(t).split(".");for(let a=0;a<Math.min(r.length,n.length);a++){let o=Number(r[a]),c=Number(n[a]);if(o>c)return 1;if(c>o)return -1;if(!isNaN(o)&&isNaN(c))return 1;if(isNaN(o)&&!isNaN(c))return -1}return 0}var se=Dt(version,"3.5.0")!==-1;function Ct(){return Math.floor(Math.random()*Date.now()).toString()}function Fe(){return typeof window>"u"?Ct():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(10)}function Me(){let e=shallowRef(new Map),t=shallowRef(new Map),r=shallowRef(new Map),n=shallowRef(new Map),a=shallowRef(new Map),o=shallowRef(new Map);function c(s){let l=t.value.get(s);if(l)return l;{let x=ref({});return t.value.set(s,x),x}}function S(s){let l=r.value.get(s);if(l)return l;{let x=ref([]);return r.value.set(s,x),x}}function b(s,l,x){o.value.set(`${s}-${l}`,x);}function h(s,l){return o.value.get(`${s}-${l}`)}function $(s,l){s&&l!=null&&o.value.delete(`${s}-${l}`);}function g(s,l){n.value.set(s,l);}function y(s){return n.value.get(s)??!1}function v(s,l){e.value.set(s,l);}function f(s,l){let x=e.value.get(s);return x?I(l,x)?{valid:!0}:{valid:!1}:void 0}function I(s,l){let x=Object.keys(l),V=Object.keys(s);return V.length!==x.length||!V.every(P=>x.includes(P))?!1:V.every(P=>{let E=s[P],w=l[P];return !w||!E||typeof E=="function"||typeof w=="function"||typeof E=="number"||typeof E=="boolean"?!1:E._params?E._params?.every((A,_)=>{if(typeof w=="number"||typeof w=="boolean")return !0;{let M=q(w._params),U=q(E._params);return M?.[_]===U?.[_]}}):!0})}function D(s){let l=a.value.get(s);if(l)return l;{let x=ref(!1),V=ref(!0),G=ref({}),P=ref(!1);return a.value.set(s,{$pending:x,$valid:V,$metadata:G,$validating:P}),{$pending:x,$valid:V,$metadata:G,$validating:P}}}return onScopeDispose(()=>{e.value.clear(),t.value.clear(),r.value.clear(),n.value.clear(),a.value.clear(),o.value.clear();}),{addRuleDeclEntry:v,setDirtyEntry:g,checkRuleDeclEntry:f,getDirtyState:y,trySetRuleStatusRef:D,getFieldsEntry:c,getCollectionsEntry:S,getArrayStatus:h,addArrayStatus:b,deleteArrayStatus:$,arrayStatusStorage:o}}function ot(e,t){return L(e.value)&&L(t.value)&&!Object.entries(t.value).some(r=>de(r))}function st(e,t){return !!e.value&&"$each"in e.value||Array.isArray(t.value)}function ut(e){return !!e.value&&L(e.value)}function de(e){return L(e)&&"_validator"in e}function ve(e){return typeof e.value!="function"}function je(e){return L(e)&&"$fields"in e}function Ve(e){return "$each"in e||"$errors"in e}function _e({field:e,silent:t=!1}){return Object.entries(e.$rules??{}).map(([r,n])=>t||!n.$valid&&e.$dirty&&!n.$validating?n.$message:null).filter(r=>!!r).reduce((r,n)=>typeof n=="string"?r?.concat([n]):r?.concat(n),[]).concat(e.$dirty?e.$externalErrors??[]:[])}function ct({$dirty:e,customMessages:t,rule:r,ruleKey:n,state:a,path:o,storage:c,$debounce:S}){let b=effectScope(),h,$,g=ref(!1),{$pending:y,$valid:v,$metadata:f,$validating:I}=c.trySetRuleStatusRef(`${o}.${n}`);function D(){h=b.run(()=>{let E=computed(()=>({$invalid:!v.value,$params:U.value,...f.value})),w=computed(()=>ve(r)?typeof r.value.active=="function"?r.value.active(a.value,E.value):!!r.value.active:!0),A=computed(()=>{let p="",u=t?t[n]?.message:void 0;return u&&(typeof u=="function"?p=u(a.value,E.value):p=u),ve(r)&&(u&&!r.value._patched||(typeof r.value.message=="function"?p=r.value.message(a.value,E.value):p=r.value.message)),Q(p)&&(p="Error",console.warn(`No error message defined for ${o}.${n}`)),p}),_=computed(()=>ve(r)&&r.value.type?r.value.type:n),M=computed(()=>ve(r)?r.value.validator:r.value),U=computed(()=>typeof r.value=="function"?[]:q(r.value._params??[])),R=computed(()=>`${o}.${_.value}`);return {$active:w,$message:A,$type:_,$validator:M,$params:U,$path:R}}),$=watch(h.$params,V,{deep:!0});}D();function s(){v.value=!0,e.value&&(y.value=!0);}async function l(){let E=h.$validator.value,w=E(a.value,...h.$params.value),A=!1,_=a.value;try{s();let M;if(w instanceof Promise?M=await w:M=w,a.value!==_)return !0;if(typeof M=="boolean")A=M;else {let{$valid:U,...R}=M;A=U,f.value=R;}}catch{A=!1;}finally{y.value=!1;}return A}let x=he(l,S??200);async function V(){try{I.value=!0;let E=!1;if(de(r.value)&&r.value._async)E=await x();else {let w=h.$validator.value,A=w(a.value,...h.$params.value);if(A instanceof Promise)console.warn('You used a async validator function on a non-async rule, please use "async await" or the "withAsync" helper');else if(A!=null)if(typeof A=="boolean")E=A;else {let{$valid:_,...M}=A;E=_,f.value=M;}}return v.value=E,E}catch{return !1}finally{I.value=!1;}}function G(){v.value=!0,f.value={},y.value=!1,I.value=!1,D();}function P(){$(),b.stop(),b=effectScope();}return reactive({...h,$pending:y,$valid:v,$metadata:f,_haveAsync:g,$validating:I,$validate:V,$unwatch:P,$watch:D,$reset:G})}function Ee({state:e,rulesDef:t,customMessages:r,path:n,fieldName:a,storage:o,options:c,externalErrors:S,onUnwatch:b,$isArray:h,initialState:$,shortcuts:g}){let y=effectScope(),v,f=ref(!1),I=ref(!1),D=ref([]),s,l,x,V,G,P=()=>{};function E(){D.value=S.value??[];}E();function w(){let j=t.value,J=o.checkRuleDeclEntry(n,j);p.value=Object.fromEntries(Object.entries(j).filter(([W])=>W.startsWith("$"))),R.value=Object.fromEntries(Object.entries(t.value).filter(([W])=>!W.startsWith("$")).map(([W,Z])=>{if(Z){let De=toRef(()=>Z);return [W,ct({$dirty:f,customMessages:r,rule:De,ruleKey:W,state:e,path:n,storage:o,$debounce:p.value.$debounce})]}return []}).filter(W=>!!W.length)),M(),A(),J?.valid!=null&&(f.value=o.getDirtyState(n),f.value&&P()),o.addRuleDeclEntry(n,j);}function A(){P=v.$debounce.value?he(U,v.$debounce.value??v.haveAnyAsyncRule?100:0):U;}function _(){R.value&&Object.entries(R.value).forEach(([j,J])=>{J.$unwatch();}),V(),f.value&&o.setDirtyEntry(n,f.value),s(),l(),x(),y.stop(),y=effectScope(),b?.(),G?.();}function M(){R.value&&Object.entries(R.value).forEach(([j,J])=>{J.$watch();}),v=y.run(()=>{let j=computed(()=>f.value),J=computed(()=>p.value.$debounce),W=computed(()=>p.value.$lazy!=null?p.value.$lazy:unref(c.lazy)),Z=computed(()=>p.value.$rewardEarly!=null?p.value.$rewardEarly:unref(c.rewardEarly)),De=computed(()=>p.value.$clearExternalErrorsOnChange!=null?p.value.$clearExternalErrorsOnChange:unref(c.clearExternalErrorsOnChange)),yt=computed(()=>p.value.$autoDirty!=null?p.value.$autoDirty:unref(c.autoDirty)),qe=computed(()=>Object.entries(R.value).some(([ee,Y])=>Y.$validating)),Ce=computed(()=>Re.value&&!Se.value&&f.value),Le=computed(()=>Ce.value?_e({field:{$dirty:f.value,$externalErrors:D.value,$rules:R.value}}):[]),ze=computed(()=>_e({field:{$dirty:f.value,$externalErrors:D.value,$rules:R.value},silent:!0})),Je=computed(()=>!(Re.value||Se.value)),Se=computed(()=>I.value||!Z.value?Object.entries(R.value).some(([ee,Y])=>Y.$pending):!1),Re=computed(()=>D.value?.length?!0:Q(R.value)?!1:!Z.value||Z.value&&I.value?Object.entries(R.value).some(([ee,Y])=>!Y.$valid):!1),Ye=computed(()=>a),Ie=computed(()=>Q(R.value)?!1:f.value&&!Q(e.value)&&!qe.value?D.value?.length?!1:Z.value?Object.entries(R.value).every(([ee,Y])=>Y.$valid):!Re.value:!1),gt=computed(()=>Object.entries(R.value).some(([ee,Y])=>Y._haveAsync));function mt(){g?.fields&&Object.entries(g.fields).forEach(([ee,Y])=>{let $t=effectScope();Qe[ee]=$t.run(()=>{let Xe=ref();return watchEffect(()=>{Xe.value=Y({$dirty:f.value,$externalErrors:D.value,$value:e,$rules:R.value,$error:Ce.value,$pending:Se.value,$invalid:Re.value,$valid:Ie.value,$errors:Le.value,$ready:Je.value,$silentErrors:ze.value,$anyDirty:j.value,$name:Ye.value});}),Xe});});}let Qe={};return mt(),watch(Ie,ee=>{ee&&(I.value=!1);}),{$error:Ce,$pending:Se,$invalid:Re,$valid:Ie,$debounce:J,$lazy:W,$errors:Le,$ready:Je,$silentErrors:ze,$rewardEarly:Z,$autoDirty:yt,$clearExternalErrorsOnChange:De,$anyDirty:j,$name:Ye,haveAnyAsyncRule:gt,$shortcuts:Qe,$validating:qe}}),x=watch(S,E),s=watch(e,()=>{v.$autoDirty.value&&(f.value||(f.value=!0)),t.value instanceof Function&&w(),P(),v.$rewardEarly.value!==!0&&v.$clearExternalErrorsOnChange.value&&C();},{deep:h?!0:se?1:!0}),V=watch(f,()=>{o.setDirtyEntry(n,f.value);}),l=watch(v.$valid,j=>{v.$rewardEarly.value&&j&&(I.value=!1);}),G=watch(v.haveAnyAsyncRule,A);}function U(){Object.values(R.value).forEach(j=>{j.$validate();});}let R=ref(),p=ref();w();function u(){f.value=!1,D.value=[],Object.entries(R.value).forEach(([j,J])=>{J.$reset();}),v.$lazy.value||Object.entries(R.value).map(([j,J])=>J.$validate());}function d(j=!0){f.value||(f.value=!0,j&&P());}async function m(){try{if(I.value=!0,!f.value)f.value=!0;else if(v.$autoDirty.value&&f.value&&!v.$pending.value)return !v.$error.value;return (await Promise.allSettled(Object.entries(R.value).map(([W,Z])=>Z.$validate()))).every(W=>W.status==="fulfilled"?!!W.value:!1)?e.value:!1}catch{return !1}}function i(){_(),e.value=at(e,$),u();}function T(j=!0){return f.value?e.value:null}function C(){D.value=[];}v.$lazy.value||P();let{$anyDirty:B,$error:H,$errors:le,$invalid:re,$name:k,$pending:F,$ready:O,$silentErrors:oe,$valid:xe,$shortcuts:$e,$validating:Qt}=v;return reactive({$dirty:f,$error:H,$errors:le,$valid:xe,$invalid:re,$pending:F,$silentErrors:oe,$anyDirty:B,$ready:O,$name:k,$externalErrors:D,$value:e,$rules:R,...$e,$reset:u,$touch:d,$validate:m,$unwatch:_,$watch:M,$resetAll:i,$extractDirtyFields:T,$clearExternalErrors:C})}function ft({$id:e,path:t,index:r,options:n,storage:a,stateValue:o,customMessages:c,rules:S,externalErrors:b,initialState:h,shortcuts:$,fieldName:g}){let y=S.$key?S.$key:Fe(),v=`${t}.${String(y)}`;typeof o.value=="object"&&o.value!=null&&(o.value.$id?v=`${t}.${o.value.$id}`:Object.defineProperties(o.value,{$id:{value:y,enumerable:!1,configurable:!1,writable:!1}}));let f=toRef(()=>b.value?.[r]),I=me({state:o,rulesDef:toRef(()=>S),customMessages:c,path:v,storage:a,options:n,externalErrors:f,initialState:h?.[r],shortcuts:$,fieldName:g});if(I){let D=o.value?.$id;I.$id=D??String(y),a.addArrayStatus(e,I.$id,I);}return I}function Rt({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:c,initialState:S,shortcuts:b,fieldName:h}){let $=effectScope(),g,y=effectScope(),v;if(!Array.isArray(e.value)&&!t.value.$each)return null;let f=ref(),I=ref(e.value),D,s=ref({}),l=a.getCollectionsEntry(n);v=y.run(()=>{let u=computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(i=>typeof i!="object"):t.value.$each&&!(t.value.$each instanceof Function)?Object.values(t.value.$each).every(i=>de(i)):!1),d=computed(()=>c.value?Ve(c.value)?c.value.$errors??[]:[]:[]),m=computed(()=>c.value?Ve(c.value)?c.value.$each??[]:[]:[]);return {isPrimitiveArray:u,$externalErrorsField:d,$externalErrorsEach:m}}),x(),G();function x(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(f.value=Fe(),Object.defineProperties(e.value,{$id:{value:f.value,enumerable:!1,configurable:!1,writable:!1}})):e.value?.$id&&(f.value=e.value.$id)),!v.isPrimitiveArray.value&&(I.value=s.value.$value,Array.isArray(e.value)?l.value=e.value.map((u,d)=>{let m=Ae(t.value.$each,toRef(()=>u),d),i=ft({$id:f.value,path:n,rules:m??{},stateValue:toRef(()=>u),index:d,options:o,storage:a,externalErrors:v.$externalErrorsEach,initialState:S[d],shortcuts:b,fieldName:h});return i||null}).filter(u=>!!u):l.value=[],s.value=Ee({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:v.$externalErrorsField,$isArray:!0,initialState:S,shortcuts:b,fieldName:h}));}function V(){if(Array.isArray(e.value)){let u=te(l.value);l.value=e.value.map((d,m)=>{let i=toRef(()=>d);if(d.$id&&l.value.find(T=>T.$id===d.$id)){let T=a.getArrayStatus(f.value,d.$id);return T?(T.$value=i,T):null}else {let T=Ae(t.value.$each,i,m);if(T){let C=ft({$id:f.value,path:n,rules:T,stateValue:i,index:m,options:o,storage:a,externalErrors:v.$externalErrorsEach,initialState:S[m],shortcuts:b,fieldName:h});return C||null}}}).filter(d=>!!d),u.filter(d=>!e.value.find(m=>d.$id===m.$id)).forEach((d,m)=>{a.deleteArrayStatus(f.value,m.toString());});}else l.value=[];}function G(){D=watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")?x():V();},{deep:se?1:!0,flush:"pre"}),g=$.run(()=>{let u=computed(()=>s.value.$dirty&&l.value.every(O=>O.$dirty)),d=computed(()=>s.value.$anyDirty||l.value.some(O=>O.$dirty)),m=computed(()=>s.value.$invalid||l.value.some(O=>O.$invalid)),i=computed(()=>(Q(s.value.$rules)?!0:s.value.$valid)&&l.value.every(O=>O.$valid)),T=computed(()=>s.value.$error||l.value.some(O=>O.$error)),C=computed(()=>!(m.value||B.value)),B=computed(()=>s.value.$pending||l.value.some(O=>O.$pending)),H=computed(()=>({$errors:s.value.$errors,$each:l.value.map(O=>O.$errors)})),le=computed(()=>({$errors:s.value.$silentErrors,$each:l.value.map(O=>O.$silentErrors)})),re=computed(()=>h);function k(){b?.collections&&Object.entries(b?.collections).forEach(([O,oe])=>{let xe=effectScope();F[O]=xe.run(()=>{let $e=ref();return watchEffect(()=>{$e.value=oe({$dirty:u.value,$error:T.value,$pending:B.value,$invalid:m.value,$valid:i.value,$errors:H.value,$ready:C.value,$silentErrors:le.value,$anyDirty:d.value,$name:re.value,$each:l.value,$field:s.value,$value:e});}),$e});});}let F={};return k(),{$dirty:u,$anyDirty:d,$invalid:m,$valid:i,$error:T,$pending:B,$errors:H,$silentErrors:le,$ready:C,$name:re,$shortcuts:F}}),v.isPrimitiveArray.value&&(console.warn(`${n} is a Array of primitives. Tracking can be lost when reassigning the Array. We advise to use an Array of objects instead`),D());}function P(){D&&D(),s.value&&s.value.$unwatch(),l.value&&l.value.forEach(u=>{"$dirty"in u&&u.$unwatch();}),$.stop(),$=effectScope(),y.stop(),y=effectScope(!0);}function E(u=!0){s.value.$touch(u),l.value.forEach(d=>{d.$touch(u);});}function w(){s.value.$reset(),l.value.forEach(u=>{u.$reset();});}async function A(){try{return (await Promise.all([s.value.$validate(),...l.value.map(m=>m.$validate())])).every(m=>m.value!==!1)?e.value:!1}catch{return !1}}function _(){s.value.$clearExternalErrors(),l.value.forEach(u=>{u.$clearExternalErrors();});}function M(u=!0){let d=l.value.map(m=>{if(je(m))return m.$extractDirtyFields(u)});return u&&(d=d.filter(m=>L(m)?!Q(m):!!m)),d}function U(){P(),lt(e,S),w();}let{$shortcuts:R,...p}=g;return reactive({$field:s,...p,...R,$each:l,$value:e,$validate:A,$unwatch:P,$watch:G,$touch:E,$reset:w,$resetAll:U,$extractDirtyFields:M,$clearExternalErrors:_})}function Be({scopeRules:e,state:t,customMessages:r,path:n="",rootRules:a,storage:o,options:c,externalErrors:S,validationGroups:b,initialState:h,shortcuts:$,fieldName:g}){let y,v,f=null;function s(R=!0){l.value=null,triggerRef(l);let p=Object.fromEntries(Object.entries(e.value).map(([i,T])=>{if(T){let C=toRef(t.value,i),B=toRef(()=>T),H=toRef(()=>S.value?.[i]);return [i,me({state:C,rulesDef:B,customMessages:r,path:n?`${n}.${i}`:i,storage:o,options:c,externalErrors:H,initialState:h?.[i],shortcuts:$,fieldName:i})]}return []}).filter(i=>!!i.length&&i[1]!=null)),u=Object.fromEntries(Object.entries(unref(S)??{}).filter(([i])=>!(i in e.value)).map(([i,T])=>{if(T){let C=toRef(t.value,i),B=toRef(()=>({})),H=toRef(()=>T);return [i,me({state:C,rulesDef:B,customMessages:r,path:n?`${n}.${i}`:i,storage:o,options:c,externalErrors:H,initialState:h?.[i],shortcuts:$,fieldName:i})]}return []})),d=Object.fromEntries(Object.entries(t.value).filter(([i])=>!(i in e.value)&&!(i in(u.value??{}))).map(([i,T])=>{let C=toRef(t.value,i),B=toRef(()=>({})),H=toRef(()=>S.value?.[i]);return [i,me({state:C,rulesDef:B,customMessages:r,path:n?`${n}.${i}`:i,storage:o,options:c,externalErrors:H,initialState:h?.[i],shortcuts:$,fieldName:i})]})),m=Object.fromEntries(Object.entries(b?.(p)??{}).map(([i,T])=>T.length?[i,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(C=>[C,Ke(toRef(()=>T),C)])),...Object.fromEntries(["$errors","$silentErrors"].map(C=>[C,et(toRef(()=>T),C)]))}]:[]));l.value={...p,...u,...d,...m},R&&P();}let l=o.getFieldsEntry(n);s();function x(){s(!1),Object.entries(l.value).forEach(([R,p])=>{p.$reset();}),P();}function V(R=!0){Object.values(l.value).forEach(p=>{p.$touch(R);});}async function G(){try{return (await Promise.allSettled(Object.values(l.value).map(u=>u.$validate()))).every(u=>u.status==="fulfilled"?u.value!==!1:!1)?t.value:!1}catch{return !1}}function P(){a&&(f=watch(a,()=>{E(),s();},{deep:se?1:!0,flush:"post"})),y=effectScope(),v=y.run(()=>{let R=computed(()=>!!Object.entries(l.value).length&&Object.entries(l.value).every(([k,F])=>F?.$dirty)),p=computed(()=>Object.entries(l.value).some(([k,F])=>F?.$dirty)),u=computed(()=>Object.entries(l.value).some(([k,F])=>F?.$invalid)),d=computed(()=>Object.entries(l.value).every(([k,F])=>F?.$valid)),m=computed(()=>R.value&&!T.value&&u.value),i=computed(()=>!(u.value||T.value)),T=computed(()=>Object.entries(l.value).some(([k,F])=>F?.$pending)),C=computed(()=>Object.fromEntries(Object.entries(l.value).map(([k,F])=>[k,F?.$errors]))),B=computed(()=>Object.fromEntries(Object.entries(l.value).map(([k,F])=>[k,F?.$silentErrors]))),H=computed(()=>g);function le(){$?.nested&&Object.entries($.nested).forEach(([k,F])=>{let O=effectScope();re[k]=O.run(()=>{let oe=ref();return watchEffect(()=>{oe.value=F({$dirty:R.value,$value:t,$error:m.value,$pending:T.value,$invalid:u.value,$valid:d.value,$ready:i.value,$anyDirty:p.value,$name:H.value,$silentErrors:B.value,$errors:C.value,$fields:l.value});}),oe});});}let re={};return le(),{$dirty:R,$anyDirty:p,$invalid:u,$valid:d,$error:m,$pending:T,$errors:C,$silentErrors:B,$ready:i,$name:H,$shortcuts:re}});}function E(){l.value&&Object.entries(l.value).forEach(([R,p])=>{p.$unwatch();}),f?.(),y.stop(),y=effectScope();}function w(){Object.entries(l.value).forEach(([R,p])=>{p.$clearExternalErrors();});}function A(){E(),pe(t,h??{}),x();}function _(R=!0){let p=Object.entries(l.value).map(([u,d])=>[u,d.$extractDirtyFields(R)]);return R&&(p=p.filter(([u,d])=>L(d)?!Q(d):Array.isArray(d)?d.length:!!d)),Object.fromEntries(p)}let{$shortcuts:M,...U}=v;return reactive({...U,...M,$fields:l,$value:t,$resetAll:A,$reset:x,$touch:V,$validate:G,$unwatch:E,$watch:P,$clearExternalErrors:w,$extractDirtyFields:_})}function me({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:c,index:S,initialState:b,shortcuts:h,onUnwatch:$,fieldName:g}){return st(t,e)?Rt({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,index:S,externalErrors:c,initialState:b,fieldName:g,shortcuts:h}):ot(e,t)&&nt(e)?Be({scopeRules:t,state:e,customMessages:r,path:n,storage:a,options:o,index:S,initialState:b,shortcuts:h,fieldName:g,externalErrors:c}):ut(t)?Ee({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,index:S,externalErrors:c,onUnwatch:$,shortcuts:h,initialState:b,fieldName:g}):null}function ke({initialState:e,options:t,scopeRules:r,state:n,customRules:a,shortcuts:o}){let c=Me(),S=computed(()=>unref(t.externalErrors));return reactive(Be({rootRules:r,scopeRules:r,state:n,customMessages:a?.(),storage:c,options:t,externalErrors:S,validationGroups:t.validationGroups,initialState:e,shortcuts:o,fieldName:"root"}))}function We(e,t,r){let n={autoDirty:t?.autoDirty??!0,lazy:t?.lazy??!1,rewardEarly:t?.rewardEarly??!1,clearExternalErrorsOnChange:t?.clearExternalErrorsOnChange??!0};function a(o,c,S){let b=isRef(c)?c:computed(typeof c=="function"?c:()=>c),h={...n,...S},$=isRef(o)?o:ref(o),g=te(toRaw($.value));return {r$:ke({scopeRules:b,state:$,options:h,initialState:g,customRules:e,shortcuts:r})}}return a}var dt=We();function Ue(){function e(t,r){return r}return e}var He=Ue();function vt({rules:e,modifiers:t,shortcuts:r}){let n=We(e,t,r),a=Ue();return {useRegle:n,inferRules:a}}export{Pe as InternalRuleType,Oe as createRule,vt as defineRegleConfig,He as inferRules,q as unwrapRuleParameters,dt as useRegle};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@regle/core",
3
- "version": "0.2.5",
3
+ "version": "0.2.7",
4
4
  "description": "Typescript-first model-based form validation library for Vue 3",
5
5
  "peerDependencies": {
6
6
  "vue": "^3.1.0"