@regle/core 0.2.6 → 0.2.8

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 L(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,S=o==="__async"||n.constructor.name==="AsyncFunction";return {...{validator(g,...m){return e.validator(g,...L(m.length?m:t))},message(g,m){return typeof e.message=="function"?e.message(g,{...m,$params:L(m.$params?.length?m.$params:t)}):e.message},active(g,m){return typeof e.active=="function"?e.active(g,{...m,$params:L(m.$params?.length?m.$params:t)}):e.active??!0},exec(g){let m=e.validator(g,...L(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: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 z(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function nt(e){return z(e.value)}function re(e){let t=e,r={}.toString.call(e).slice(8,-1);if(r=="Set"&&(t=new Set([...e].map(n=>re(n)))),r=="Map"&&(t=new Map([...e].map(n=>[re(n[0]),re(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]=re(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((S,E)=>{a[r][E]={},de(a[r][E],o[E]);})):z(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 se=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(i){let l=t.value.get(i);if(l)return l;{let x=vue.ref({});return t.value.set(i,x),x}}function S(i){let l=r.value.get(i);if(l)return l;{let x=vue.ref([]);return r.value.set(i,x),x}}function E(i,l,x){o.value.set(`${i}-${l}`,x);}function h(i,l){return o.value.get(`${i}-${l}`)}function g(i,l){i&&l!=null&&o.value.delete(`${i}-${l}`);}function m(i,l){n.value.set(i,l);}function d(i){return n.value.get(i)??!1}function f(i,l){e.value.set(i,l);}function c(i,l){let x=e.value.get(i);return x?I(l,x)?{valid:!0}:{valid:!1}:void 0}function I(i,l){let x=Object.keys(l),j=Object.keys(i);return j.length!==x.length||!j.every(w=>x.includes(w))?!1:j.every(w=>{let b=i[w],O=l[w];return !O||!b||typeof b=="function"||typeof O=="function"||typeof b=="number"||typeof b=="boolean"?!1:b._params?b._params?.every((A,N)=>{if(typeof O=="number"||typeof O=="boolean")return !0;{let V=L(O._params),q=L(b._params);return V?.[N]===q?.[N]}}):!0})}function C(i){let l=a.value.get(i);if(l)return l;{let x=vue.ref(!1),j=vue.ref(!0),G=vue.ref({}),w=vue.ref(!1);return a.value.set(i,{$pending:x,$valid:j,$metadata:G,$validating:w}),{$pending:x,$valid:j,$metadata:G,$validating:w}}}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:S,getArrayStatus:h,addArrayStatus:E,deleteArrayStatus:g,arrayStatusStorage:o}}function ot(e,t){return z(e.value)&&z(t.value)&&!Object.entries(t.value).some(r=>me(r))}function it(e,t){return !!e.value&&"$each"in e.value||Array.isArray(t.value)}function st(e){return !!e.value&&z(e.value)}function me(e){return z(e)&&"_validator"in e}function ve(e){return typeof e.value!="function"}function Ve(e){return z(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:S}){let E=vue.effectScope(),h,g,m=vue.ref(!1),{$pending:d,$valid:f,$metadata:c,$validating:I}=u.trySetRuleStatusRef(`${o}.${n}`);function C(){h=E.run(()=>{let b=vue.computed(()=>({$invalid:!f.value,$params:q.value,...c.value})),O=vue.computed(()=>ve(r)?typeof r.value.active=="function"?r.value.active(a.value,b.value):r.value.active:!0),A=vue.computed(()=>{let y="",v=t?t[n]?.message:void 0;return v&&(typeof v=="function"?y=v(a.value,b.value):y=v),ve(r)&&(v&&!r.value._patched||(typeof r.value.message=="function"?y=r.value.message(a.value,b.value):y=r.value.message)),ee(y)&&(y="Error",console.warn(`No error message defined for ${o}.${n}`)),y}),N=vue.computed(()=>ve(r)&&r.value.type?r.value.type:n),V=vue.computed(()=>ve(r)?r.value.validator:r.value),q=vue.computed(()=>typeof r.value=="function"?[]:L(r.value._params??[])),D=vue.computed(()=>`${o}.${N.value}`);return {$active:O,$message:A,$type:N,$validator:V,$params:q,$path:D}}),g=vue.watch(h.$params,j,{deep:!0});}C();function i(){f.value=!0,e.value&&(d.value=!0);}async function l(){let b=h.$validator.value,O=b(a.value,...h.$params.value),A=!1,N=a.value;try{i();let V;if(O instanceof Promise?V=await O:V=O,a.value!==N)return !0;if(typeof V=="boolean")A=V;else {let{$valid:q,...D}=V;A=q,c.value=D;}}catch{A=!1;}finally{d.value=!1;}return A}let x=ye(l,S??200);async function j(){I.value=!0;let b=!1;if(me(r.value)&&r.value._async)b=await x();else {let O=h.$validator.value,A=O(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")b=A;else {let{$valid:N,...V}=A;b=N,c.value=V;}}return f.value=b,I.value=!1,b}function G(){f.value=!0,c.value={},d.value=!1,I.value=!1,C();}function w(){g(),E.stop(),E=vue.effectScope();}return vue.reactive({...h,$pending:d,$valid:f,$metadata:c,_haveAsync:m,$validating:I,$validate:j,$unwatch:w,$watch:C,$reset:G})}function be({state:e,rulesDef:t,customMessages:r,path:n,fieldName:a,storage:o,options:u,externalErrors:S,onUnwatch:E,$isArray:h,initialState:g,shortcuts:m}){let d=vue.effectScope(),f,c=vue.ref(!1),I=vue.ref(!1),C=vue.ref([]),i,l,x,j,G,w=()=>{};function b(){C.value=S.value??[];}b();function O(){let _=t.value,W=o.checkRuleDeclEntry(n,_);y.value=Object.fromEntries(Object.entries(_).filter(([H])=>H.startsWith("$"))),D.value=Object.fromEntries(Object.entries(t.value).filter(([H])=>!H.startsWith("$")).map(([H,X])=>{if(X){let De=vue.toRef(()=>X);return [H,ct({$dirty:c,customMessages:r,rule:De,ruleKey:H,state:e,path:n,storage:o,$debounce:y.value.$debounce})]}return []}).filter(H=>!!H.length)),V(),A(),W?.valid!=null&&(c.value=o.getDirtyState(n),c.value&&w()),o.addRuleDeclEntry(n,_);}function A(){w=f.$debounce.value?ye(q,f.$debounce.value??f.haveAnyAsyncRule?100:0):q;}function N(){D.value&&Object.entries(D.value).forEach(([_,W])=>{W.$unwatch();}),j(),c.value&&o.setDirtyEntry(n,c.value),i(),l(),x(),d.stop(),d=vue.effectScope(),E?.(),G?.();}function V(){D.value&&Object.entries(D.value).forEach(([_,W])=>{W.$watch();}),f=d.run(()=>{let _=vue.computed(()=>c.value),W=vue.computed(()=>y.value.$debounce),H=vue.computed(()=>y.value.$lazy!=null?y.value.$lazy:vue.unref(u.lazy)),X=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)),vt=vue.computed(()=>Object.entries(D.value).some(([te,Q])=>Q.$validating)),Ce=vue.computed(()=>pe.value&&!Ee.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||Ee.value)),Ee=vue.computed(()=>I.value||!X.value?Object.entries(D.value).some(([te,Q])=>Q.$pending):!1),pe=vue.computed(()=>C.value?.length?!0:!X.value||X.value&&I.value?Object.entries(D.value).some(([te,Q])=>!Q.$valid):!1),Ye=vue.computed(()=>a),Ie=vue.computed(()=>ee(D.value)?!0:c.value&&!ee(e.value)&&!vt.value?C.value?.length?!1:X.value?Object.entries(D.value).every(([te,Q])=>Q.$valid):!pe.value:!1),gt=vue.computed(()=>Object.entries(D.value).some(([te,Q])=>Q._haveAsync));function $t(){m?.fields&&Object.entries(m.fields).forEach(([te,Q])=>{let St=vue.effectScope();Qe[te]=St.run(()=>{let Xe=vue.ref();return vue.watchEffect(()=>{Xe.value=Q({$dirty:c.value,$externalErrors:C.value,$value:e,$rules:D.value,$error:Ce.value,$pending:Ee.value,$invalid:pe.value,$valid:Ie.value,$errors:Le.value,$ready:Je.value,$silentErrors:ze.value,$anyDirty:_.value,$name:Ye.value});}),Xe});});}let Qe={};return $t(),vue.watch(Ie,te=>{te&&(I.value=!1);}),{$error:Ce,$pending:Ee,$invalid:pe,$valid:Ie,$debounce:W,$lazy:H,$errors:Le,$ready:Je,$silentErrors:ze,$rewardEarly:X,$autoDirty:De,$anyDirty:_,$name:Ye,haveAnyAsyncRule:gt,$shortcuts:Qe}}),x=vue.watch(S,b),i=vue.watch(e,()=>{f.$autoDirty.value&&(c.value||(c.value=!0)),t.value instanceof Function&&O(),w(),f.$rewardEarly.value;},{deep:h?!0:se?1:!0}),j=vue.watch(c,()=>{o.setDirtyEntry(n,c.value);}),l=vue.watch(f.$valid,_=>{f.$rewardEarly.value&&_&&(I.value=!1);}),G=vue.watch(f.haveAnyAsyncRule,A);}function q(){Object.entries(D.value).forEach(([_,W])=>{W.$validate();});}let D=vue.ref(),y=vue.ref();O();function v(){c.value=!1,C.value=[],Object.entries(D.value).forEach(([_,W])=>{W.$reset();}),f.$lazy.value||Object.entries(D.value).map(([_,W])=>W.$validate());}function R(){c.value||(c.value=!0,f.$rewardEarly.value,w());}let p=f.$debounce.value?ye($,f.$debounce.value??0):$;async function $(){try{if(I.value=!0,f.$autoDirty.value&&c.value&&!f.$pending.value)return !f.$error.value;{let _=Object.entries(D.value).map(([H,X])=>X.$validate());return (await Promise.allSettled(_)).every(H=>H.status==="fulfilled"?H.value:!1)}}catch{return !1}}function s(){N(),e.value=at(e,g),v();}function T(_=!0){return c.value?e.value:null}function P(){C.value=[];}f.$lazy.value||$();let{$anyDirty:k,$error:Y,$errors:oe,$invalid:ne,$name:U,$pending:M,$ready:F,$silentErrors:ie,$valid:xe,$shortcuts:he}=f;return vue.reactive({$dirty:c,$error:Y,$errors:oe,$valid:xe,$invalid:ne,$pending:M,$silentErrors:ie,$anyDirty:k,$ready:F,$name:U,$externalErrors:C,$value:e,$rules:D,...he,$reset:v,$touch:R,$validate:p,$unwatch:N,$watch:V,$resetAll:s,$extractDirtyFields:T,$clearExternalErrors:P})}function ft({$id:e,path:t,index:r,options:n,storage:a,stateValue:o,customMessages:u,rules:S,externalErrors:E,initialState:h,shortcuts:g,fieldName:m}){let d=S.$key?S.$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=Se({state:o,rulesDef:vue.toRef(()=>S),customMessages:u,path:f,storage:a,options:n,externalErrors:c,initialState:h?.[r],shortcuts:g,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:S,shortcuts:E,fieldName:h}){let g=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,i=vue.ref({}),l=a.getCollectionsEntry(n);f=d.run(()=>{let R=vue.computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(s=>typeof s!="object"):t.value.$each&&!(t.value.$each instanceof Function)?Object.values(t.value.$each).every(s=>me(s)):!1),p=vue.computed(()=>u.value?je(u.value)?u.value.$errors??[]:[]:[]),$=vue.computed(()=>u.value?je(u.value)?u.value.$each??[]:[]:[]);return {isPrimitiveArray:R,$externalErrorsField:p,$externalErrorsEach:$}}),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=i.value.$value,Array.isArray(e.value)?l.value=e.value.map((R,p)=>{let $=Ae(t.value.$each,vue.toRef(()=>R),p),s=ft({$id:c.value,path:n,rules:$??{},stateValue:vue.toRef(()=>R),index:p,options:o,storage:a,externalErrors:f.$externalErrorsEach,initialState:S[p],shortcuts:E,fieldName:h});return s||null}).filter(R=>!!R):l.value=[],i.value=be({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:f.$externalErrorsField,$isArray:!0,initialState:S,shortcuts:E,fieldName:h}));}function j(){if(Array.isArray(e.value)){let R=re(l.value);l.value=e.value.map((p,$)=>{let s=vue.toRef(()=>p);if(p.$id&&l.value.find(T=>T.$id===p.$id)){let T=a.getArrayStatus(c.value,p.$id);return T?(T.$value=s,T):null}else {let T=Ae(t.value.$each,s,$);if(T){let P=ft({$id:c.value,path:n,rules:T,stateValue:s,index:$,options:o,storage:a,externalErrors:f.$externalErrorsEach,initialState:S[$],shortcuts:E,fieldName:h});return P||null}}}).filter(p=>!!p),R.filter(p=>!e.value.find($=>p.$id===$.$id)).forEach((p,$)=>{a.deleteArrayStatus(c.value,$.toString());});}else l.value=[];}function G(){C=vue.watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")?x():j();},{deep:se?1:!0,flush:"pre"}),m=g.run(()=>{let R=vue.computed(()=>i.value.$dirty&&l.value.every(F=>F.$dirty)),p=vue.computed(()=>i.value.$anyDirty||l.value.some(F=>F.$dirty)),$=vue.computed(()=>i.value.$invalid||l.value.some(F=>F.$invalid)),s=vue.computed(()=>i.value.$valid&&l.value.every(F=>F.$valid)),T=vue.computed(()=>i.value.$error||l.value.some(F=>F.$error)),P=vue.computed(()=>!($.value||k.value)),k=vue.computed(()=>i.value.$pending||l.value.some(F=>F.$pending)),Y=vue.computed(()=>({$errors:i.value.$errors,$each:l.value.map(F=>F.$errors)})),oe=vue.computed(()=>({$errors:i.value.$silentErrors,$each:l.value.map(F=>F.$silentErrors)})),ne=vue.computed(()=>h);function U(){E?.collections&&Object.entries(E?.collections).forEach(([F,ie])=>{let xe=vue.effectScope();M[F]=xe.run(()=>{let he=vue.ref();return vue.watchEffect(()=>{he.value=ie({$dirty:R.value,$error:T.value,$pending:k.value,$invalid:$.value,$valid:s.value,$errors:Y.value,$ready:P.value,$silentErrors:oe.value,$anyDirty:p.value,$name:ne.value,$each:l.value,$field:i.value,$value:e});}),he});});}let M={};return U(),{$dirty:R,$anyDirty:p,$invalid:$,$valid:s,$error:T,$pending:k,$errors:Y,$silentErrors:oe,$ready:P,$name:ne,$shortcuts:M}}),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 w(){C&&C(),i.value&&i.value.$unwatch(),l.value&&l.value.forEach(R=>{"$dirty"in R&&R.$unwatch();}),g.stop(),g=vue.effectScope(),d.stop(),d=vue.effectScope(!0);}function b(){i.value.$touch(),l.value.forEach(R=>{R.$touch();});}function O(){i.value.$reset(),l.value.forEach(R=>{R.$reset();});}async function A(){try{return (await Promise.all([i.value.$validate(),...l.value.map(p=>p.$validate())])).every(p=>!!p)}catch{return !1}}function N(){i.value.$clearExternalErrors(),l.value.forEach(R=>{R.$clearExternalErrors();});}function V(R=!0){let p=l.value.map($=>{if(Ve($))return $.$extractDirtyFields(R)});return R&&(p=p.filter($=>z($)?!ee($):!!$)),p}function q(){console.log(S),w(),lt(e,S),O();}async function D(){return b(),await A()?e.value:!1}let{$shortcuts:y,...v}=m;return vue.reactive({$field:i,...v,...y,$each:l,$value:e,$validate:A,$unwatch:w,$watch:G,$touch:b,$reset:O,$resetAll:q,$extractDirtyFields:V,$parse:D,$clearExternalErrors:N})}function ke({scopeRules:e,state:t,customMessages:r,path:n="",rootRules:a,storage:o,options:u,externalErrors:S,validationGroups:E,initialState:h,shortcuts:g,fieldName:m}){let d,f,c=null;function i(y=!0){l.value=null,vue.triggerRef(l);let v=Object.fromEntries(Object.entries(e.value).map(([s,T])=>{if(T){let P=vue.toRef(t.value,s),k=vue.toRef(()=>T),Y=vue.toRef(()=>S.value?.[s]);return [s,Se({state:P,rulesDef:k,customMessages:r,path:n?`${n}.${s}`:s,storage:o,options:u,externalErrors:Y,initialState:h?.[s],shortcuts:g,fieldName:s})]}return []}).filter(s=>!!s.length&&s[1]!=null)),R=Object.fromEntries(Object.entries(vue.unref(S)??{}).filter(([s])=>!(s in e.value)).map(([s,T])=>{if(T){let P=vue.toRef(t.value,s),k=vue.toRef(()=>({})),Y=vue.toRef(()=>T);return [s,Se({state:P,rulesDef:k,customMessages:r,path:n?`${n}.${s}`:s,storage:o,options:u,externalErrors:Y,initialState:h?.[s],shortcuts:g,fieldName:s})]}return []})),p=Object.fromEntries(Object.entries(t.value).filter(([s])=>!(s in e.value)&&!(s in(R.value??{}))).map(([s,T])=>{let P=vue.toRef(t.value,s),k=vue.toRef(()=>({}));return [s,Se({state:P,rulesDef:k,customMessages:r,path:n?`${n}.${s}`:s,storage:o,options:u,externalErrors:vue.ref(),initialState:h?.[s],shortcuts:g,fieldName:s})]})),$=Object.fromEntries(Object.entries(E?.(v)??{}).map(([s,T])=>T.length?[s,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(P=>[P,Ke(vue.toRef(()=>T),P)])),...Object.fromEntries(["$errors","$silentErrors"].map(P=>[P,et(vue.toRef(()=>T),P)]))}]:[]));l.value={...v,...R,...p,...$},y&&w();}let l=o.getFieldsEntry(n);i();function x(){i(!1),Object.entries(l.value).forEach(([y,v])=>{v.$reset();}),w();}function j(){Object.entries(l.value).forEach(([y,v])=>{v.$touch();});}async function G(){try{return (await Promise.allSettled(Object.entries(l.value).map(([v,R])=>R.$validate()))).every(v=>v.status==="fulfilled"?v.value:!1)}catch{return !1}}function w(){a&&(c=vue.watch(a,()=>{b(),i();},{deep:se?1:!0,flush:"post"})),d=vue.effectScope(),f=d.run(()=>{let y=vue.computed(()=>!!Object.entries(l.value).length&&Object.entries(l.value).every(([U,M])=>M?.$dirty)),v=vue.computed(()=>Object.entries(l.value).some(([U,M])=>M?.$dirty)),R=vue.computed(()=>Object.entries(l.value).some(([U,M])=>M?.$invalid)),p=vue.computed(()=>Object.entries(l.value).every(([U,M])=>M?.$valid)),$=vue.computed(()=>y.value&&!T.value&&R.value),s=vue.computed(()=>!(R.value||T.value)),T=vue.computed(()=>Object.entries(l.value).some(([U,M])=>M?.$pending)),P=vue.computed(()=>Object.fromEntries(Object.entries(l.value).map(([U,M])=>[U,M?.$errors]))),k=vue.computed(()=>Object.fromEntries(Object.entries(l.value).map(([U,M])=>[U,M?.$silentErrors]))),Y=vue.computed(()=>m);function oe(){g?.nested&&Object.entries(g.nested).forEach(([U,M])=>{let F=vue.effectScope();ne[U]=F.run(()=>{let ie=vue.ref();return vue.watchEffect(()=>{ie.value=M({$dirty:y.value,$value:t,$error:$.value,$pending:T.value,$invalid:R.value,$valid:p.value,$ready:s.value,$anyDirty:v.value,$name:Y.value,$silentErrors:k.value,$errors:P.value,$fields:l.value});}),ie});});}let ne={};return oe(),{$dirty:y,$anyDirty:v,$invalid:R,$valid:p,$error:$,$pending:T,$errors:P,$silentErrors:k,$ready:s,$name:Y,$shortcuts:ne}});}function b(){l.value&&Object.entries(l.value).forEach(([y,v])=>{v.$unwatch();}),c?.(),d.stop(),d=vue.effectScope();}function O(){Object.entries(l.value).forEach(([y,v])=>{v.$clearExternalErrors();});}function A(){b(),de(t,h??{}),x();}function N(y=!0){let v=Object.entries(l.value).map(([R,p])=>[R,p.$extractDirtyFields(y)]);return y&&(v=v.filter(([R,p])=>z(p)?!ee(p):Array.isArray(p)?p.length:!!p)),Object.fromEntries(v)}async function V(){return j(),await G()?t.value:!1}let{$shortcuts:q,...D}=f;return vue.reactive({...D,...q,$fields:l,$value:t,$resetAll:A,$reset:x,$touch:j,$validate:G,$unwatch:b,$watch:w,$clearExternalErrors:O,$extractDirtyFields:N,$parse:V})}function Se({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:u,index:S,initialState:E,shortcuts:h,onUnwatch:g,fieldName:m}){return it(t,e)?Rt({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,index:S,externalErrors:u,initialState:E,fieldName:m,shortcuts:h}):ot(e,t)&&nt(e)?ke({scopeRules:t,state:e,customMessages:r,path:n,storage:a,options:o,index:S,initialState:E,shortcuts:h,fieldName:m,externalErrors:u}):st(t)?be({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,index:S,externalErrors:u,onUnwatch:g,shortcuts:h,initialState:E,fieldName:m}):null}function Ue({initialState:e,options:t,scopeRules:r,state:n,customRules:a,shortcuts:o}){let u=Me(),S=vue.computed(()=>vue.unref(t.externalErrors));return vue.reactive(ke({rootRules:r,scopeRules:r,state:n,customMessages:a?.(),storage:u,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};function a(o,u,S){let E=vue.isRef(u)?u:vue.computed(typeof u=="function"?u:()=>u),h={...n,...S},g=vue.isRef(o)?o:vue.ref(o),m=re(vue.toRaw(g.value));return {r$:Ue({scopeRules:E,state:g,options:h,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=L;exports.useRegle=yt;
1
+ 'use strict';var vue=require('vue');var Ce=(r=>(r.Inline="__inline",r.Async="__async",r))(Ce||{});function Qe(e,t){return vue.computed(()=>e.value.some(r=>r[t]))}function Xe(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 Ze(e){return e.map(t=>t instanceof Function||vue.isRef(t)?t:vue.toRef(()=>t))}function Ke(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 Ie(e,...t){let{message:r,validator:n,active:a,type:o,...f}=e,p=o==="__async"||n.constructor.name==="AsyncFunction";return {...{validator($,...y){return e.validator($,...q(y.length?y:t))},message($,y){return typeof e.message=="function"?e.message($,{...y,$params:q(y.$params?.length?y.$params:t)}):e.message},active($,y){return typeof e.active=="function"?e.active($,{...y,$params:q(y.$params?.length?y.$params:t)}):e.active??!0},exec($){let y=e.validator($,...q(t)),d;return y instanceof Promise?y.then(v=>(d=v,typeof d=="object"&&"$valid"in d?d.$valid:typeof d=="boolean"?d:!1)):(d=y,typeof d=="object"&&"$valid"in d?d.$valid:typeof d=="boolean"?d:!1)}},...f,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:p,_params:Ze(t)}}function Pe(e){if(typeof e.validator=="function"){let r=Ie(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(Ke(e.validator)>1){let a=function(...o){return Ie(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 et(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,ht(e))),r=="Array"||r=="Object"){t=Array.isArray(e)?[]:{};for(let n in e)t[n]=te(e[n]);}return t}function ht(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 we(e,t,r){return e instanceof Function?e(t,r??0):e}function tt(e,t){vue.isRef(e)?e.value=t:e=t;}function rt(e,t){vue.isRef(e)?e.value=[]:e=[],t.forEach((r,n)=>{let a=vue.isRef(e)?e.value[n]:e[n];a={},fe(a,t[n]);});}function fe(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],f=vue.isRef(a[r])?a[r].value:a[r];Array.isArray(a[r])?(a[r]=[],Array.isArray(o)&&o.forEach((p,T)=>{a[r][T]={},fe(a[r][T],o[T]);})):L(o)?fe(f,o):vue.isRef(a[r])?a[r].value=o:a[r]=o;});}function J(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 $e(e,t,r){let n,a=(...o)=>new Promise(f=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...o])).then(f);},t);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...o)=>new Promise(f=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...o])).then(f);},0);}),a}function Tt(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]),f=Number(n[a]);if(o>f)return 1;if(f>o)return -1;if(!isNaN(o)&&isNaN(f))return 1;if(isNaN(o)&&!isNaN(f))return -1}return 0}var Se=Tt(vue.version,"3.5.0")!==-1;function Et(){return Math.floor(Math.random()*Date.now()).toString()}function Oe(){return typeof window>"u"?Et():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(10)}function Ae(){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 f(u){let l=t.value.get(u);if(l)return l;{let x=vue.ref({});return t.value.set(u,x),x}}function p(u){let l=r.value.get(u);if(l)return l;{let x=vue.ref([]);return r.value.set(u,x),x}}function T(u,l,x){o.value.set(`${u}-${l}`,x);}function S(u,l){return o.value.get(`${u}-${l}`)}function $(u,l){u&&l!=null&&o.value.delete(`${u}-${l}`);}function y(u,l){n.value.set(u,l);}function d(u){return n.value.get(u)??!1}function v(u,l){e.value.set(u,l);}function i(u,l){let x=e.value.get(u);return x?V(l,x)?{valid:!0}:{valid:!1}:void 0}function V(u,l){let x=Object.keys(l),A=Object.keys(u);return A.length!==x.length||!A.every(j=>x.includes(j))?!1:A.every(j=>{let b=u[j],P=l[j];return !P||!b||typeof b=="function"||typeof P=="function"||typeof b=="number"||typeof b=="boolean"?!1:b._params?b._params?.every((F,m)=>{if(typeof P=="number"||typeof P=="boolean")return !0;{let E=q(P._params),H=q(b._params);return E?.[m]===H?.[m]}}):!0})}function N(u){let l=a.value.get(u);if(l)return l;{let x=vue.ref(!1),A=vue.ref(!0),B=vue.ref({}),j=vue.ref(!1);return a.value.set(u,{$pending:x,$valid:A,$metadata:B,$validating:j}),{$pending:x,$valid:A,$metadata:B,$validating:j}}}return vue.onScopeDispose(()=>{e.value.clear(),t.value.clear(),r.value.clear(),n.value.clear(),a.value.clear(),o.value.clear();}),{addRuleDeclEntry:v,setDirtyEntry:y,checkRuleDeclEntry:i,getDirtyState:d,trySetRuleStatusRef:N,getFieldsEntry:f,getCollectionsEntry:p,getArrayStatus:S,addArrayStatus:T,deleteArrayStatus:$,arrayStatusStorage:o}}function nt(e,t){return L(e.value)&&L(t.value)&&!Object.entries(t.value).some(r=>Re(r))}function at(e,t){return !!e.value&&"$each"in e.value||Array.isArray(t.value)}function lt(e){return !!e.value&&L(e.value)}function Re(e){return L(e)&&"_validator"in e}function pe(e){return typeof e.value!="function"}function Fe(e){return L(e)&&"$fields"in e}function Me({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 ut({$dirty:e,customMessages:t,rule:r,ruleKey:n,state:a,path:o,storage:f,$debounce:p}){let T=vue.effectScope(),S,$,y=vue.ref(!1),{$pending:d,$valid:v,$metadata:i,$validating:V}=f.trySetRuleStatusRef(`${o}.${n}`);function N(){S=T.run(()=>{let b=vue.computed(()=>({$invalid:!v.value,$params:H.value,...i.value})),P=vue.computed(()=>pe(r)?typeof r.value.active=="function"?r.value.active(a.value,b.value):!!r.value.active:!0),F=vue.computed(()=>{let h="",s=t?t[n]?.message:void 0;return s&&(typeof s=="function"?h=s(a.value,b.value):h=s),pe(r)&&(s&&!r.value._patched||(typeof r.value.message=="function"?h=r.value.message(a.value,b.value):h=r.value.message)),J(h)&&(h="Error",console.warn(`No error message defined for ${o}.${n}`)),h}),m=vue.computed(()=>pe(r)&&r.value.type?r.value.type:n),E=vue.computed(()=>pe(r)?r.value.validator:r.value),H=vue.computed(()=>typeof r.value=="function"?[]:q(r.value._params??[])),C=vue.computed(()=>`${o}.${m.value}`);return {$active:P,$message:F,$type:m,$validator:E,$params:H,$path:C}}),$=vue.watch(S.$params,A,{deep:!0});}N();function u(){v.value=!0,e.value&&(d.value=!0);}async function l(){let b=S.$validator.value,P=b(a.value,...S.$params.value),F=!1,m=a.value;try{u();let E;if(P instanceof Promise?E=await P:E=P,a.value!==m)return !0;if(typeof E=="boolean")F=E;else {let{$valid:H,...C}=E;F=H,i.value=C;}}catch{F=!1;}finally{d.value=!1;}return F}let x=$e(l,p??200);async function A(){try{V.value=!0;let b=!1;if(Re(r.value)&&r.value._async)b=await x();else {let P=S.$validator.value,F=P(a.value,...S.$params.value);if(F 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(F!=null)if(typeof F=="boolean")b=F;else {let{$valid:m,...E}=F;b=m,i.value=E;}}return v.value=b,b}catch{return !1}finally{V.value=!1;}}function B(){v.value=!0,i.value={},d.value=!1,V.value=!1,N();}function j(){$(),T.stop(),T=vue.effectScope();}return vue.reactive({...S,$pending:d,$valid:v,$metadata:i,_haveAsync:y,$validating:V,$validate:A,$unwatch:j,$watch:N,$reset:B})}function be({state:e,rulesDef:t,customMessages:r,path:n,fieldName:a,storage:o,options:f,externalErrors:p,onUnwatch:T,$isArray:S,initialState:$,shortcuts:y}){let d=vue.effectScope(),v,i=vue.ref(!1),V=vue.ref(!1),N,u,l,x,A=()=>{};function B(){let O=t.value,G=o.checkRuleDeclEntry(n,O);E.value=Object.fromEntries(Object.entries(O).filter(([W])=>W.startsWith("$"))),m.value=Object.fromEntries(Object.entries(t.value).filter(([W])=>!W.startsWith("$")).map(([W,X])=>{if(X){let Ee=vue.toRef(()=>X);return [W,ut({$dirty:i,customMessages:r,rule:Ee,ruleKey:W,state:e,path:n,storage:o,$debounce:E.value.$debounce})]}return []}).filter(W=>!!W.length)),P(),j(),G?.valid!=null&&(i.value=o.getDirtyState(n),i.value&&A()),o.addRuleDeclEntry(n,O);}function j(){A=v.$debounce.value?$e(F,v.$debounce.value??v.haveAnyAsyncRule?100:0):F;}function b(){m.value&&Object.entries(m.value).forEach(([O,G])=>{G.$unwatch();}),l(),i.value&&o.setDirtyEntry(n,i.value),N?.(),u?.(),d.stop(),d=vue.effectScope(),T?.(),x?.();}function P(){m.value&&Object.entries(m.value).forEach(([O,G])=>{G.$watch();}),v=d.run(()=>{let O=vue.computed(()=>i.value),G=vue.computed(()=>E.value.$debounce),W=vue.computed(()=>E.value.$lazy!=null?E.value.$lazy:vue.unref(f.lazy)),X=vue.computed(()=>E.value.$rewardEarly!=null?E.value.$rewardEarly:vue.unref(f.rewardEarly)),Ee=vue.computed(()=>E.value.$clearExternalErrorsOnChange!=null?E.value.$clearExternalErrorsOnChange:vue.unref(f.clearExternalErrorsOnChange)),pt=vue.computed(()=>E.value.$autoDirty!=null?E.value.$autoDirty:vue.unref(f.autoDirty)),Ue=vue.computed(()=>Object.entries(m.value).some(([ee,z])=>z.$validating)),De=vue.computed(()=>ce.value&&!ge.value&&i.value),We=vue.computed(()=>De.value?Me({field:{$dirty:i.value,$externalErrors:p?.value,$rules:m.value}}):[]),He=vue.computed(()=>Me({field:{$dirty:i.value,$externalErrors:p?.value,$rules:m.value},silent:!0})),qe=vue.computed(()=>!(ce.value||ge.value)),ge=vue.computed(()=>V.value||!X.value?Object.entries(m.value).some(([ee,z])=>z.$pending):!1),ce=vue.computed(()=>p?.value?.length?!0:J(m.value)?!1:!X.value||X.value&&V.value?Object.entries(m.value).some(([ee,z])=>!z.$valid):!1),Le=vue.computed(()=>a),xe=vue.computed(()=>J(m.value)?!1:i.value&&!J(e.value)&&!Ue.value?p?.value?.length?!1:X.value?Object.entries(m.value).every(([ee,z])=>z.$valid):!ce.value:!1),dt=vue.computed(()=>Object.entries(m.value).some(([ee,z])=>z._haveAsync));function vt(){y?.fields&&Object.entries(y.fields).forEach(([ee,z])=>{let yt=vue.effectScope();ze[ee]=yt.run(()=>{let Je=vue.ref();return vue.watchEffect(()=>{Je.value=z({$dirty:i.value,$externalErrors:p?.value??[],$value:e,$rules:m.value,$error:De.value,$pending:ge.value,$invalid:ce.value,$valid:xe.value,$errors:We.value,$ready:qe.value,$silentErrors:He.value,$anyDirty:O.value,$name:Le.value});}),Je});});}let ze={};return vt(),vue.watch(xe,ee=>{ee&&(V.value=!1);}),{$error:De,$pending:ge,$invalid:ce,$valid:xe,$debounce:G,$lazy:W,$errors:We,$ready:qe,$silentErrors:He,$rewardEarly:X,$autoDirty:pt,$clearExternalErrorsOnChange:Ee,$anyDirty:O,$name:Le,haveAnyAsyncRule:dt,$shortcuts:ze,$validating:Ue}}),N=vue.watch(e,()=>{v.$autoDirty.value&&(i.value||(i.value=!0)),t.value instanceof Function&&B(),A(),v.$rewardEarly.value!==!0&&v.$clearExternalErrorsOnChange.value&&g();},{deep:S?!0:Se?1:!0}),l=vue.watch(i,()=>{o.setDirtyEntry(n,i.value);}),u=vue.watch(v.$valid,O=>{v.$rewardEarly.value&&O&&(V.value=!1);}),x=vue.watch(v.haveAnyAsyncRule,j);}function F(){Object.values(m.value).forEach(O=>{O.$validate();});}let m=vue.ref(),E=vue.ref();B();function H(){i.value=!1,g(),Object.entries(m.value).forEach(([O,G])=>{G.$reset();}),v.$lazy.value||Object.entries(m.value).map(([O,G])=>G.$validate());}function C(O=!0){i.value||(i.value=!0,O&&A());}async function h(){try{if(V.value=!0,!i.value)i.value=!0;else if(v.$autoDirty.value&&i.value&&!v.$pending.value)return !v.$error.value;return (await Promise.allSettled(Object.entries(m.value).map(([W,X])=>X.$validate()))).every(W=>W.status==="fulfilled"?!!W.value:!1)?e.value:!1}catch{return !1}}function s(){b(),e.value=tt(e,$),H();}function R(O=!0){return i.value?e.value:null}function g(){p?.value?.length&&(p.value=[]);}!v.$lazy.value&&!i.value&&A();let{$anyDirty:c,$error:D,$errors:I,$invalid:k,$name:K,$pending:oe,$ready:ne,$silentErrors:U,$valid:M,$shortcuts:w,$validating:se}=v;return vue.reactive({$dirty:i,$error:D,$errors:I,$valid:M,$invalid:k,$pending:oe,$silentErrors:U,$anyDirty:c,$ready:ne,$name:K,$externalErrors:p,$value:e,$rules:m,...w,$reset:H,$touch:C,$validate:h,$unwatch:b,$watch:P,$resetAll:s,$extractDirtyFields:R,$clearExternalErrors:g})}function it({$id:e,path:t,index:r,options:n,storage:a,stateValue:o,customMessages:f,rules:p,externalErrors:T,initialState:S,shortcuts:$,fieldName:y}){let d=p.$key?p.$key:Oe(),v=`${t}.${String(d)}`;typeof o.value=="object"&&o.value!=null&&(o.value.$id?v=`${t}.${o.value.$id}`:Object.defineProperties(o.value,{$id:{value:d,enumerable:!1,configurable:!1,writable:!1}}));let i=me({state:o,rulesDef:vue.toRef(()=>p),customMessages:f,path:v,storage:a,options:n,externalErrors:vue.toRef(T?.value??[],r),initialState:S?.[r],shortcuts:$,fieldName:y});if(i){let V=o.value?.$id;i.$id=V??String(d),a.addArrayStatus(e,i.$id,i);}return i}function st({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:f,initialState:p,shortcuts:T,fieldName:S}){let $=vue.effectScope(),y,d=vue.effectScope(),v;if(!Array.isArray(e.value)&&!t.value.$each)return null;let i=vue.ref(),V=vue.ref(e.value),N,u=vue.ref({}),l=a.getCollectionsEntry(n);v=d.run(()=>({isPrimitiveArray:vue.computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(R=>typeof R!="object"):t.value.$each&&!(t.value.$each instanceof Function)?Object.values(t.value.$each).every(R=>Re(R)):!1)})),x(),B();function x(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(i.value=Oe(),Object.defineProperties(e.value,{$id:{value:i.value,enumerable:!1,configurable:!1,writable:!1}})):e.value?.$id&&(i.value=e.value.$id)),!v.isPrimitiveArray.value&&(V.value=u.value.$value,Array.isArray(e.value)?l.value=e.value.map((s,R)=>{let g=we(t.value.$each,vue.toRef(()=>s),R),c=it({$id:i.value,path:n,rules:g??{},stateValue:vue.toRef(()=>s),index:R,options:o,storage:a,externalErrors:vue.toRef(f?.value??{},"$each"),initialState:p[R],shortcuts:T,fieldName:S});return c||null}).filter(s=>!!s):l.value=[],u.value=be({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:vue.toRef(f?.value??{},"$errors"),$isArray:!0,initialState:p,shortcuts:T,fieldName:S}));}function A(){if(Array.isArray(e.value)){let s=te(l.value);l.value=e.value.map((R,g)=>{let c=vue.toRef(()=>R);if(R.$id&&l.value.find(D=>D.$id===R.$id)){let D=a.getArrayStatus(i.value,R.$id);return D?(D.$value=c,D):null}else {let D=we(t.value.$each,c,g);if(D){let I=it({$id:i.value,path:n,rules:D,stateValue:c,index:g,options:o,storage:a,externalErrors:vue.toRef(f?.value??{},"$each"),initialState:p[g],shortcuts:T,fieldName:S});return I||null}}}).filter(R=>!!R),s.filter(R=>!e.value.find(g=>R.$id===g.$id)).forEach((R,g)=>{a.deleteArrayStatus(i.value,g.toString());});}else l.value=[];}function B(){N=vue.watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")?x():A();},{deep:Se?1:!0,flush:"pre"}),y=$.run(()=>{let s=vue.computed(()=>u.value.$dirty&&l.value.every(w=>w.$dirty)),R=vue.computed(()=>u.value.$anyDirty||l.value.some(w=>w.$dirty)),g=vue.computed(()=>u.value.$invalid||l.value.some(w=>w.$invalid)),c=vue.computed(()=>(J(u.value.$rules)?!0:u.value.$valid)&&l.value.every(w=>w.$valid)),D=vue.computed(()=>u.value.$error||l.value.some(w=>w.$error)),I=vue.computed(()=>!(g.value||k.value)),k=vue.computed(()=>u.value.$pending||l.value.some(w=>w.$pending)),K=vue.computed(()=>({$errors:u.value.$errors,$each:l.value.map(w=>w.$errors)})),oe=vue.computed(()=>({$errors:u.value.$silentErrors,$each:l.value.map(w=>w.$silentErrors)})),ne=vue.computed(()=>S);function U(){T?.collections&&Object.entries(T?.collections).forEach(([w,se])=>{let O=vue.effectScope();M[w]=O.run(()=>{let G=vue.ref();return vue.watchEffect(()=>{G.value=se({$dirty:s.value,$error:D.value,$pending:k.value,$invalid:g.value,$valid:c.value,$errors:K.value,$ready:I.value,$silentErrors:oe.value,$anyDirty:R.value,$name:ne.value,$each:l.value,$field:u.value,$value:e});}),G});});}let M={};return U(),{$dirty:s,$anyDirty:R,$invalid:g,$valid:c,$error:D,$pending:k,$errors:K,$silentErrors:oe,$ready:I,$name:ne,$shortcuts:M}}),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`),N());}function j(){N&&N(),u.value&&u.value.$unwatch(),l.value&&l.value.forEach(s=>{"$dirty"in s&&s.$unwatch();}),$.stop(),$=vue.effectScope(),d.stop(),d=vue.effectScope(!0);}function b(s=!0){u.value.$touch(s),l.value.forEach(R=>{R.$touch(s);});}function P(){u.value.$reset(),l.value.forEach(s=>{s.$reset();});}async function F(){try{return (await Promise.all([u.value.$validate(),...l.value.map(g=>g.$validate())])).every(g=>g.value!==!1)?e.value:!1}catch{return !1}}function m(){u.value.$clearExternalErrors(),l.value.forEach(s=>{s.$clearExternalErrors();});}function E(s=!0){let R=l.value.map(g=>{if(Fe(g))return g.$extractDirtyFields(s)});return s&&(R=R.filter(g=>L(g)?!J(g):!!g)),R}function H(){j(),rt(e,p),P();}let{$shortcuts:C,...h}=y;return vue.reactive({$field:u,...h,...C,$each:l,$value:e,$validate:F,$unwatch:j,$watch:B,$touch:b,$reset:P,$resetAll:H,$extractDirtyFields:E,$clearExternalErrors:m})}function _e({scopeRules:e,state:t,customMessages:r,path:n="",rootRules:a,storage:o,options:f,externalErrors:p,validationGroups:T,initialState:S,shortcuts:$,fieldName:y}){let d,v,i=null;function u(C=!0){l.value=null,vue.triggerRef(l);let h=Object.fromEntries(Object.entries(e.value).map(([c,D])=>{if(D){let I=vue.toRef(t.value,c),k=vue.toRef(()=>D),K=vue.toRef(p?.value,c);return [c,me({state:I,rulesDef:k,customMessages:r,path:n?`${n}.${c}`:c,storage:o,options:f,externalErrors:K,initialState:S?.[c],shortcuts:$,fieldName:c})]}return []}).filter(c=>!!c.length&&c[1]!=null)),s=Object.fromEntries(Object.entries(vue.unref(p)??{}).filter(([c])=>!(c in e.value)).map(([c,D])=>{if(D){let I=vue.toRef(t.value,c),k=vue.toRef(()=>({}));return [c,me({state:I,rulesDef:k,customMessages:r,path:n?`${n}.${c}`:c,storage:o,options:f,externalErrors:vue.toRef(p?.value??{},c),initialState:S?.[c],shortcuts:$,fieldName:c})]}return []})),R=Object.fromEntries(Object.entries(t.value).filter(([c])=>!(c in e.value)&&!(c in(s.value??{}))).map(([c,D])=>{let I=vue.toRef(t.value,c),k=vue.toRef(()=>({}));return [c,me({state:I,rulesDef:k,customMessages:r,path:n?`${n}.${c}`:c,storage:o,options:f,externalErrors:vue.toRef(p?.value??{},c),initialState:S?.[c],shortcuts:$,fieldName:c})]})),g=Object.fromEntries(Object.entries(T?.(h)??{}).map(([c,D])=>D.length?[c,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(I=>[I,Qe(vue.toRef(()=>D),I)])),...Object.fromEntries(["$errors","$silentErrors"].map(I=>[I,Xe(vue.toRef(()=>D),I)]))}]:[]));l.value={...h,...s,...R,...g},C&&j();}let l=o.getFieldsEntry(n);u();function x(){u(!1),Object.entries(l.value).forEach(([C,h])=>{h.$reset();}),j();}function A(C=!0){Object.values(l.value).forEach(h=>{h.$touch(C);});}async function B(){try{return (await Promise.allSettled(Object.values(l.value).map(s=>s.$validate()))).every(s=>s.status==="fulfilled"?s.value!==!1:!1)?t.value:!1}catch{return !1}}function j(){a&&(i=vue.watch([a,p],()=>{b(),u();},{deep:!0,flush:"post"})),d=vue.effectScope(),v=d.run(()=>{let C=vue.computed(()=>!!Object.entries(l.value).length&&Object.entries(l.value).every(([U,M])=>M?.$dirty)),h=vue.computed(()=>Object.entries(l.value).some(([U,M])=>M?.$dirty)),s=vue.computed(()=>Object.entries(l.value).some(([U,M])=>M?.$invalid)),R=vue.computed(()=>Object.entries(l.value).every(([U,M])=>M?.$valid)),g=vue.computed(()=>C.value&&!D.value&&s.value),c=vue.computed(()=>!(s.value||D.value)),D=vue.computed(()=>Object.entries(l.value).some(([U,M])=>M?.$pending)),I=vue.computed(()=>Object.fromEntries(Object.entries(l.value).map(([U,M])=>[U,M?.$errors]))),k=vue.computed(()=>Object.fromEntries(Object.entries(l.value).map(([U,M])=>[U,M?.$silentErrors]))),K=vue.computed(()=>y);function oe(){$?.nested&&Object.entries($.nested).forEach(([U,M])=>{let w=vue.effectScope();ne[U]=w.run(()=>{let se=vue.ref();return vue.watchEffect(()=>{se.value=M({$dirty:C.value,$value:t,$error:g.value,$pending:D.value,$invalid:s.value,$valid:R.value,$ready:c.value,$anyDirty:h.value,$name:K.value,$silentErrors:k.value,$errors:I.value,$fields:l.value});}),se});});}let ne={};return oe(),{$dirty:C,$anyDirty:h,$invalid:s,$valid:R,$error:g,$pending:D,$errors:I,$silentErrors:k,$ready:c,$name:K,$shortcuts:ne}});}function b(){l.value&&Object.entries(l.value).forEach(([C,h])=>{h.$unwatch();}),i?.(),d.stop(),d=vue.effectScope();}function P(){Object.entries(l.value).forEach(([C,h])=>{h.$clearExternalErrors();});}function F(){b(),fe(t,S??{}),x();}function m(C=!0){let h=Object.entries(l.value).map(([s,R])=>[s,R.$extractDirtyFields(C)]);return C&&(h=h.filter(([s,R])=>L(R)?!J(R):Array.isArray(R)?R.length:!!R)),Object.fromEntries(h)}let{$shortcuts:E,...H}=v;return vue.reactive({...H,...E,$fields:l,$value:t,$resetAll:F,$reset:x,$touch:A,$validate:B,$unwatch:b,$watch:j,$clearExternalErrors:P,$extractDirtyFields:m})}function me({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:f,index:p,initialState:T,shortcuts:S,onUnwatch:$,fieldName:y}){return at(t,e)?st({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,index:p,externalErrors:f,initialState:T,fieldName:y,shortcuts:S}):nt(e,t)&&et(e)?_e({scopeRules:t,state:e,customMessages:r,path:n,storage:a,options:o,index:p,initialState:T,shortcuts:S,fieldName:y,externalErrors:f}):lt(t)?be({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,index:p,externalErrors:f,onUnwatch:$,shortcuts:S,initialState:T,fieldName:y}):null}function Ne({initialState:e,options:t,scopeRules:r,state:n,customRules:a,shortcuts:o}){let f=Ae();return vue.reactive(_e({rootRules:r,scopeRules:r,state:n,customMessages:a?.(),storage:f,options:t,externalErrors:t.externalErrors,validationGroups:t.validationGroups,initialState:e,shortcuts:o,fieldName:"root"}))}function Ge(e,t,r){let n={autoDirty:t?.autoDirty??!0,lazy:t?.lazy??!1,rewardEarly:t?.rewardEarly??!1,clearExternalErrorsOnChange:t?.clearExternalErrorsOnChange??!0};function a(o,f,p){let T=vue.isRef(f)?f:vue.computed(typeof f=="function"?f:()=>f),S={...n,...p},$=vue.isRef(o)?o:vue.ref(o),y=te(vue.toRaw($.value));return {r$:Ne({scopeRules:T,state:$,options:S,initialState:y,customRules:e,shortcuts:r})}}return a}var ft=Ge();function Be(){function e(t,r){return r}return e}var ke=Be();function Rt({rules:e,modifiers:t,shortcuts:r}){let n=Ge(e,t,r),a=Be();return {useRegle:n,inferRules:a}}exports.InternalRuleType=Ce;exports.createRule=Pe;exports.defineRegleConfig=Rt;exports.inferRules=ke;exports.unwrapRuleParameters=q;exports.useRegle=ft;
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;
@@ -72,23 +71,6 @@ Unfortunately, `Record<string, never>`, `Record<keyof any, never>` and `Record<n
72
71
  */
73
72
  type EmptyObject = {[emptyObjectSymbol]?: never};
74
73
 
75
- /**
76
- Returns a `boolean` for whether the type is strictly equal to an empty plain object, the `{}` value.
77
-
78
- @example
79
- ```
80
- import type {IsEmptyObject} from 'type-fest';
81
-
82
- type Pass = IsEmptyObject<{}>; //=> true
83
- type Fail = IsEmptyObject<[]>; //=> false
84
- type Fail = IsEmptyObject<null>; //=> false
85
- ```
86
-
87
- @see EmptyObject
88
- @category Object
89
- */
90
- type IsEmptyObject<T> = T extends EmptyObject ? true : false;
91
-
92
74
  /**
93
75
  Matches any primitive, `void`, `Date`, or `RegExp` value.
94
76
  */
@@ -266,7 +248,7 @@ type UnionToIntersection<Union> = (
266
248
 
267
249
  interface RegleBehaviourOptions {
268
250
  /**
269
- * Only display error when calling `r$.$parse()`
251
+ * Only display error when calling `r$.$validate()`
270
252
  * @default false
271
253
  */
272
254
  lazy?: boolean;
@@ -276,15 +258,20 @@ interface RegleBehaviourOptions {
276
258
  */
277
259
  autoDirty?: boolean;
278
260
  /**
279
- * 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()`
280
262
  * @default false
281
263
  *
282
- * @experimental report any bug
283
264
  */
284
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;
285
272
  }
286
- interface LocalRegleBehaviourOptions<TState extends Record<string, any>, TRules extends ReglePartialValidationTree<TState, CustomRulesDeclarationTree>, TExternal extends RegleExternalErrorTree<TState> = {}, TValidationGroups extends Record<string, RegleValidationGroupEntry[]> = {}> {
287
- externalErrors?: MaybeRef<TExternal>;
273
+ interface LocalRegleBehaviourOptions<TState extends Record<string, any>, TRules extends ReglePartialRuleTree<TState, CustomRulesDeclarationTree>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]> = {}> {
274
+ externalErrors?: Ref<RegleExternalErrorTree<Unwrap<TState>>>;
288
275
  validationGroups?: (fields: RegleStatus<TState, TRules>['$fields']) => TValidationGroups;
289
276
  }
290
277
  type RegleValidationGroupEntry = RegleFieldStatus<any, any>;
@@ -305,43 +292,44 @@ type ShortcutCommonFn<T extends Record<string, any>> = {
305
292
  };
306
293
  type RegleShortcutDefinition<TCustomRules extends Record<string, any> = Partial<DefaultValidators>> = {
307
294
  fields?: ShortcutCommonFn<RegleFieldStatus<any, Partial<TCustomRules> & Partial<DefaultValidators>>>;
308
- 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>>>>;
309
296
  collections?: ShortcutCommonFn<RegleCollectionStatus>;
310
297
  };
311
298
  type AddDollarToOptions<T extends Record<string, any>> = {
312
299
  [K in keyof T as `$${string & K}`]: T[K];
313
300
  };
314
301
 
315
- interface Regle<TState extends Record<string, any> = EmptyObject, TRules extends ReglePartialValidationTree<TState, CustomRulesDeclarationTree> = EmptyObject, TExternal extends RegleExternalErrorTree<TState> = {}, TValidationGroups extends Record<string, RegleValidationGroupEntry[]> = {}, TShortcuts extends RegleShortcutDefinition = {}> {
316
- 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>;
317
304
  }
318
305
  type isDeepExact<T, U> = {
319
306
  [K in keyof T]-?: CheckDeepExact<NonNullable<T[K]>, K extends keyof U ? NonNullable<U[K]> : never>;
320
307
  }[keyof T] extends true ? true : false;
321
- 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;
322
309
  type DeepReactiveState<T extends Record<string, any>> = {
323
310
  [K in keyof T]: MaybeRef<T[K]>;
324
311
  };
325
- 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] ? {} : {
326
313
  [K in keyof TState as [SafeProperty<TState[K], TRules[K]>] extends [never] ? K : never]?: [
327
314
  SafeProperty<TState[K], TRules[K]>
328
315
  ] extends [never] ? TState[K] : SafeProperty<TState[K], TRules[K]>;
329
316
  } & {
330
317
  [K in keyof TState as [SafeProperty<TState[K], TRules[K]>] extends [never] ? never : K]-?: SafeProperty<TState[K], TRules[K]>;
331
318
  };
332
- 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>;
333
321
 
334
- 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>;
335
323
  declare const useRegle: useRegleFn<Partial<AllRulesDeclarations>, RegleShortcutDefinition<any>>;
336
324
 
337
325
  interface inferRulesFn<TCustomRules extends Partial<AllRulesDeclarations>> {
338
- <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;
339
- <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;
340
328
  }
341
329
  declare const inferRules: inferRulesFn<Partial<AllRulesDeclarations>>;
342
330
 
343
- type InferRegleRoot<T extends () => useRegleFn<any, any>> = T extends () => infer U ? U extends Regle ? U['r$'] : never : never;
344
- 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>> : {};
345
333
  type InferRegleShortcuts<T extends useRegleFn<any, any>> = T extends useRegleFn<any, infer U> ? U : {};
346
334
  type RegleEnforceRequiredRules<TRules extends keyof DefaultValidators> = Omit<DefaultValidators, TRules> & {
347
335
  [K in TRules as keyof TRules]-?: NonNullable<DefaultValidators[K]>;
@@ -534,25 +522,25 @@ type AllRulesDeclarations = CustomRulesDeclarationTree & {
534
522
  /**
535
523
  * @public
536
524
  */
537
- 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>> = {
538
526
  [TKey in keyof TForm]?: RegleFormPropertyType<TForm[TKey], TCustomRules>;
539
527
  };
540
528
  /**
541
529
  * @public
542
530
  */
543
- 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>> = {
544
532
  [TKey in keyof TForm]: RegleFormPropertyType<TForm[TKey], TCustomRules>;
545
533
  };
546
534
  /**
547
535
  * @public
548
536
  */
549
- 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> = {
550
538
  [TKey in keyof TState]?: RegleFormPropertyType<TState[TKey], TCustom extends Partial<AllRulesDeclarations> ? TCustom : {}>;
551
539
  };
552
540
  /**
553
541
  * @public
554
542
  */
555
- 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>;
556
544
  /**
557
545
  * @public
558
546
  * Rule tree for a form property
@@ -584,32 +572,22 @@ type InlineRuleDeclaration<TValue extends any = any, TParams extends any[] = any
584
572
  * */
585
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>;
586
574
 
587
- type RegleErrorTree<TRules extends ReglePartialValidationTree<any, any>, TExternal extends RegleExternalErrorTree<Record<string, unknown>> | undefined = {}> = {
588
- readonly [K in keyof TRules]: RegleValidationErrors<TRules[K], K extends keyof NonNullable<TExternal> ? NonNullable<TExternal>[K] : {}>;
589
- } & {
590
- readonly [K in keyof NonPresentKeys<TRules, NonNullable<TExternal>>]?: RegleExternalValidationErrorsReport<NonNullable<TExternal>[K]>;
575
+ type RegleErrorTree<TState = Record<string, any> | any[]> = {
576
+ readonly [K in keyof TState]: RegleValidationErrors<TState[K]>;
591
577
  };
592
- type RegleValidationErrors<TRule extends RegleFormPropertyType<any, any> | undefined = {}, TExternalError extends RegleExternalValidationErrors<any> | undefined = {}> = TRule extends RegleCollectionRuleDefinition ? RegleCollectionErrors<ExtractFromGetter<TRule['$each']>, TExternalError extends RegleExternalCollectionErrors ? ArrayElement<TExternalError['$each']> : {}> : TRule extends RegleRuleDecl<any, any> ? string[] : TRule extends ReglePartialValidationTree<any, any> ? RegleErrorTree<TRule, TExternalError extends RegleExternalErrorTree ? TExternalError : {}> : string[];
593
- type RegleCollectionErrors<TRule extends RegleFormPropertyType<any, any> | undefined = {}, TExternalError extends RegleExternalValidationErrors<any> | undefined = {}> = {
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>> = {
594
583
  readonly $errors: string[];
595
- readonly $each: RegleValidationErrors<TRule, TExternalError>[];
584
+ readonly $each: RegleValidationErrors<TState>[];
596
585
  };
597
- type RegleExternalErrorTree<TState extends Record<string, any> | undefined = Record<string, any>> = {
598
- [K in keyof TState]?: RegleExternalValidationErrors<TState[K]>;
599
- };
600
- type RegleExternalValidationErrors<TValue extends any> = [NonNullable<TValue>] extends [
601
- never
602
- ] ? string[] : NonNullable<TValue> extends Array<infer U extends Record<string, any> | undefined> ? RegleExternalCollectionErrors<U> : NonNullable<TValue> extends Date ? string[] : NonNullable<TValue> extends File ? string[] : TValue extends Record<string, any> ? RegleExternalErrorTree<TValue> : string[];
603
- type RegleExternalCollectionErrors<TValue extends Record<string, any> | undefined = Record<string, any>> = {
604
- $errors?: string[];
605
- $each?: RegleExternalErrorTree<TValue>[];
606
- };
607
- type RegleExternalValidationErrorsReport<TExternalError extends RegleExternalValidationErrors<any> | undefined = {}> = NonNullable<TExternalError> extends RegleExternalCollectionErrors ? TExternalError : NonNullable<TExternalError> extends string[] ? string[] : NonNullable<TExternalError> extends RegleExternalErrorTree<any> ? RegleExternalErrorTree<TExternalError> : string[];
608
586
 
609
587
  /**
610
588
  * @public
611
589
  */
612
- 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<any> = EmptyObject, TShortcuts extends RegleShortcutDefinition = {}> = 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] ? {} : {
613
591
  $groups: {
614
592
  readonly [TKey in keyof TValidationGroups]: RegleValidationGroupOutput;
615
593
  };
@@ -617,23 +595,23 @@ type RegleRoot<TState extends Record<string, any> = Record<string, any>, TRules
617
595
  /**
618
596
  * @public
619
597
  */
620
- type RegleStatus<TState extends Record<string, any> = Record<string, any>, TRules extends ReglePartialValidationTree<TState> = Record<string, any>, TExternal extends RegleExternalErrorTree<any> | undefined = {}, TShortcuts extends RegleShortcutDefinition = {}> = 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> & {
621
599
  readonly $fields: {
622
- readonly [TKey in keyof TRules]: InferRegleStatusType<NonNullable<TRules[TKey]>, TState, TKey, TKey extends keyof NonNullable<TExternal> ? NonNullable<TExternal>[TKey] extends RegleExternalErrorTree<any> ? NonNullable<TExternal>[TKey] : {} : {}, TShortcuts>;
623
- } & (IsEmptyObject<TExternal> extends true ? {} : {
624
- readonly [TKey in keyof NonPresentKeys<TRules, NonNullable<TExternal>>]?: InferRegleStatusType<ReglePartialValidationTree<TKey extends keyof TState ? TState[TKey] : {}>, TState, TKey, TKey extends keyof NonNullable<TExternal> ? NonNullable<TExternal>[TKey] extends RegleExternalErrorTree<any> ? NonNullable<TExternal>[TKey] : {} : {}, TShortcuts>;
625
- });
626
- readonly $errors: RegleErrorTree<TRules, TExternal>;
627
- readonly $silentErrors: RegleErrorTree<TRules, TExternal>;
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>;
603
+ };
604
+ readonly $errors: RegleErrorTree<TState>;
605
+ readonly $silentErrors: RegleErrorTree<TState>;
628
606
  $extractDirtyFields: (filterNullishValues?: boolean) => PartialDeep<TState>;
629
- $parse: () => Promise<false | Prettify<DeepSafeFormState<TState, TRules>>>;
607
+ $validate: () => Promise<false | Prettify<DeepSafeFormState<TState, TRules>>>;
630
608
  } & ([TShortcuts['nested']] extends [never] ? {} : {
631
609
  [K in keyof TShortcuts['nested']]: ReturnType<NonNullable<TShortcuts['nested']>[K]>;
632
610
  });
633
611
  /**
634
612
  * @public
635
613
  */
636
- type InferRegleStatusType<TRule extends RegleCollectionRuleDecl | RegleRuleDecl | ReglePartialValidationTree<any>, TState extends Record<PropertyKey, any> = any, TKey extends PropertyKey = string, TExternal extends RegleExternalErrorTree<any> | undefined = {}, TShortcuts extends RegleShortcutDefinition = {}> = NonNullable<TState[TKey]> extends Array<Record<string, any> | any> ? TRule extends RegleCollectionRuleDefinition<any, any> ? ExtractFromGetter<TRule['$each']> extends RegleRuleDecl | ReglePartialValidationTree<any> ? RegleCollectionStatus<TState[TKey], ExtractFromGetter<TRule['$each']>, TRule, TExternal, TShortcuts> : RegleFieldStatus<TState[TKey], TRule, TShortcuts> : RegleCollectionStatus<TState[TKey], ReglePartialValidationTree<TState[TKey]>, TRule, TExternal, 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, TExternal, TShortcuts> : RegleFieldStatus<TState[TKey], TRule, TShortcuts> : NonNullable<TState[TKey]> extends Record<PropertyKey, any> ? RegleStatus<TState[TKey], ReglePartialValidationTree<TState[TKey]>, TExternal, 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>;
637
615
  /**
638
616
  * @public
639
617
  */
@@ -643,6 +621,7 @@ type RegleFieldStatus<TState extends any = any, TRules extends RegleFormProperty
643
621
  readonly $silentErrors: string[];
644
622
  readonly $externalErrors: string[];
645
623
  $extractDirtyFields: (filterNullishValues?: boolean) => Maybe<TState>;
624
+ $validate: () => Promise<false | SafeFieldProperty<TState, TRules>>;
646
625
  readonly $rules: {
647
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>;
648
627
  };
@@ -663,10 +642,9 @@ interface RegleCommonStatus<TValue = any> {
663
642
  readonly $name: string;
664
643
  $id?: string;
665
644
  $value: UnwrapNestedRefs<TValue>;
666
- $touch(): void;
645
+ $touch(runCommit?: boolean): void;
667
646
  $reset(): void;
668
647
  $resetAll: () => void;
669
- $validate(): Promise<boolean>;
670
648
  $unwatch(): void;
671
649
  $watch(): void;
672
650
  $clearExternalErrors(): void;
@@ -693,14 +671,14 @@ type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata exte
693
671
  /**
694
672
  * @public
695
673
  */
696
- type RegleCollectionStatus<TState extends any[] = any[], TRules extends ReglePartialValidationTree<Record<string, any>> = Record<string, any>, TFieldRule extends RegleCollectionRuleDecl<any, any> = never, TExternal extends RegleExternalErrorTree<any> | undefined = {}, TShortcuts extends RegleShortcutDefinition = {}> = 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'> & {
697
675
  $value: Maybe<TState>;
698
- readonly $each: Array<InferRegleStatusType<NonNullable<TRules>, NonNullable<TState>, number, NonNullable<TExternal> extends RegleExternalCollectionErrors ? NonNullable<NonNullable<TExternal>['$each']> extends Array<any> ? ArrayElement<NonNullable<NonNullable<TExternal>['$each']>> : {} : {}, TShortcuts>>;
676
+ readonly $each: Array<InferRegleStatusType<NonNullable<TRules>, NonNullable<TState>, number, TShortcuts>>;
699
677
  readonly $field: RegleFieldStatus<TState, TFieldRule, TShortcuts>;
700
- readonly $errors: RegleErrorTree<TRules, TExternal>;
701
- readonly $silentErrors: RegleErrorTree<TRules, TExternal>;
678
+ readonly $errors: RegleCollectionErrors<TState>;
679
+ readonly $silentErrors: RegleCollectionErrors<TState>;
702
680
  $extractDirtyFields: (filterNullishValues?: boolean) => PartialDeep<TState>;
703
- $parse: () => Promise<false | SafeProperty<TState, TRules>>;
681
+ $validate: () => Promise<false | DeepSafeFormState<ArrayElement<TState>, TRules>>[];
704
682
  } & ([TShortcuts['collections']] extends [never] ? {} : {
705
683
  [K in keyof TShortcuts['collections']]: ReturnType<NonNullable<TShortcuts['collections']>[K]>;
706
684
  });
@@ -753,4 +731,4 @@ declare function defineRegleConfig<TCustomRules extends Partial<AllRulesDeclarat
753
731
  inferRules: inferRulesFn<TCustomRules>;
754
732
  };
755
733
 
756
- 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;
@@ -72,23 +71,6 @@ Unfortunately, `Record<string, never>`, `Record<keyof any, never>` and `Record<n
72
71
  */
73
72
  type EmptyObject = {[emptyObjectSymbol]?: never};
74
73
 
75
- /**
76
- Returns a `boolean` for whether the type is strictly equal to an empty plain object, the `{}` value.
77
-
78
- @example
79
- ```
80
- import type {IsEmptyObject} from 'type-fest';
81
-
82
- type Pass = IsEmptyObject<{}>; //=> true
83
- type Fail = IsEmptyObject<[]>; //=> false
84
- type Fail = IsEmptyObject<null>; //=> false
85
- ```
86
-
87
- @see EmptyObject
88
- @category Object
89
- */
90
- type IsEmptyObject<T> = T extends EmptyObject ? true : false;
91
-
92
74
  /**
93
75
  Matches any primitive, `void`, `Date`, or `RegExp` value.
94
76
  */
@@ -266,7 +248,7 @@ type UnionToIntersection<Union> = (
266
248
 
267
249
  interface RegleBehaviourOptions {
268
250
  /**
269
- * Only display error when calling `r$.$parse()`
251
+ * Only display error when calling `r$.$validate()`
270
252
  * @default false
271
253
  */
272
254
  lazy?: boolean;
@@ -276,15 +258,20 @@ interface RegleBehaviourOptions {
276
258
  */
277
259
  autoDirty?: boolean;
278
260
  /**
279
- * 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()`
280
262
  * @default false
281
263
  *
282
- * @experimental report any bug
283
264
  */
284
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;
285
272
  }
286
- interface LocalRegleBehaviourOptions<TState extends Record<string, any>, TRules extends ReglePartialValidationTree<TState, CustomRulesDeclarationTree>, TExternal extends RegleExternalErrorTree<TState> = {}, TValidationGroups extends Record<string, RegleValidationGroupEntry[]> = {}> {
287
- externalErrors?: MaybeRef<TExternal>;
273
+ interface LocalRegleBehaviourOptions<TState extends Record<string, any>, TRules extends ReglePartialRuleTree<TState, CustomRulesDeclarationTree>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]> = {}> {
274
+ externalErrors?: Ref<RegleExternalErrorTree<Unwrap<TState>>>;
288
275
  validationGroups?: (fields: RegleStatus<TState, TRules>['$fields']) => TValidationGroups;
289
276
  }
290
277
  type RegleValidationGroupEntry = RegleFieldStatus<any, any>;
@@ -305,43 +292,44 @@ type ShortcutCommonFn<T extends Record<string, any>> = {
305
292
  };
306
293
  type RegleShortcutDefinition<TCustomRules extends Record<string, any> = Partial<DefaultValidators>> = {
307
294
  fields?: ShortcutCommonFn<RegleFieldStatus<any, Partial<TCustomRules> & Partial<DefaultValidators>>>;
308
- 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>>>>;
309
296
  collections?: ShortcutCommonFn<RegleCollectionStatus>;
310
297
  };
311
298
  type AddDollarToOptions<T extends Record<string, any>> = {
312
299
  [K in keyof T as `$${string & K}`]: T[K];
313
300
  };
314
301
 
315
- interface Regle<TState extends Record<string, any> = EmptyObject, TRules extends ReglePartialValidationTree<TState, CustomRulesDeclarationTree> = EmptyObject, TExternal extends RegleExternalErrorTree<TState> = {}, TValidationGroups extends Record<string, RegleValidationGroupEntry[]> = {}, TShortcuts extends RegleShortcutDefinition = {}> {
316
- 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>;
317
304
  }
318
305
  type isDeepExact<T, U> = {
319
306
  [K in keyof T]-?: CheckDeepExact<NonNullable<T[K]>, K extends keyof U ? NonNullable<U[K]> : never>;
320
307
  }[keyof T] extends true ? true : false;
321
- 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;
322
309
  type DeepReactiveState<T extends Record<string, any>> = {
323
310
  [K in keyof T]: MaybeRef<T[K]>;
324
311
  };
325
- 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] ? {} : {
326
313
  [K in keyof TState as [SafeProperty<TState[K], TRules[K]>] extends [never] ? K : never]?: [
327
314
  SafeProperty<TState[K], TRules[K]>
328
315
  ] extends [never] ? TState[K] : SafeProperty<TState[K], TRules[K]>;
329
316
  } & {
330
317
  [K in keyof TState as [SafeProperty<TState[K], TRules[K]>] extends [never] ? never : K]-?: SafeProperty<TState[K], TRules[K]>;
331
318
  };
332
- 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>;
333
321
 
334
- 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>;
335
323
  declare const useRegle: useRegleFn<Partial<AllRulesDeclarations>, RegleShortcutDefinition<any>>;
336
324
 
337
325
  interface inferRulesFn<TCustomRules extends Partial<AllRulesDeclarations>> {
338
- <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;
339
- <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;
340
328
  }
341
329
  declare const inferRules: inferRulesFn<Partial<AllRulesDeclarations>>;
342
330
 
343
- type InferRegleRoot<T extends () => useRegleFn<any, any>> = T extends () => infer U ? U extends Regle ? U['r$'] : never : never;
344
- 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>> : {};
345
333
  type InferRegleShortcuts<T extends useRegleFn<any, any>> = T extends useRegleFn<any, infer U> ? U : {};
346
334
  type RegleEnforceRequiredRules<TRules extends keyof DefaultValidators> = Omit<DefaultValidators, TRules> & {
347
335
  [K in TRules as keyof TRules]-?: NonNullable<DefaultValidators[K]>;
@@ -534,25 +522,25 @@ type AllRulesDeclarations = CustomRulesDeclarationTree & {
534
522
  /**
535
523
  * @public
536
524
  */
537
- 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>> = {
538
526
  [TKey in keyof TForm]?: RegleFormPropertyType<TForm[TKey], TCustomRules>;
539
527
  };
540
528
  /**
541
529
  * @public
542
530
  */
543
- 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>> = {
544
532
  [TKey in keyof TForm]: RegleFormPropertyType<TForm[TKey], TCustomRules>;
545
533
  };
546
534
  /**
547
535
  * @public
548
536
  */
549
- 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> = {
550
538
  [TKey in keyof TState]?: RegleFormPropertyType<TState[TKey], TCustom extends Partial<AllRulesDeclarations> ? TCustom : {}>;
551
539
  };
552
540
  /**
553
541
  * @public
554
542
  */
555
- 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>;
556
544
  /**
557
545
  * @public
558
546
  * Rule tree for a form property
@@ -584,32 +572,22 @@ type InlineRuleDeclaration<TValue extends any = any, TParams extends any[] = any
584
572
  * */
585
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>;
586
574
 
587
- type RegleErrorTree<TRules extends ReglePartialValidationTree<any, any>, TExternal extends RegleExternalErrorTree<Record<string, unknown>> | undefined = {}> = {
588
- readonly [K in keyof TRules]: RegleValidationErrors<TRules[K], K extends keyof NonNullable<TExternal> ? NonNullable<TExternal>[K] : {}>;
589
- } & {
590
- readonly [K in keyof NonPresentKeys<TRules, NonNullable<TExternal>>]?: RegleExternalValidationErrorsReport<NonNullable<TExternal>[K]>;
575
+ type RegleErrorTree<TState = Record<string, any> | any[]> = {
576
+ readonly [K in keyof TState]: RegleValidationErrors<TState[K]>;
591
577
  };
592
- type RegleValidationErrors<TRule extends RegleFormPropertyType<any, any> | undefined = {}, TExternalError extends RegleExternalValidationErrors<any> | undefined = {}> = TRule extends RegleCollectionRuleDefinition ? RegleCollectionErrors<ExtractFromGetter<TRule['$each']>, TExternalError extends RegleExternalCollectionErrors ? ArrayElement<TExternalError['$each']> : {}> : TRule extends RegleRuleDecl<any, any> ? string[] : TRule extends ReglePartialValidationTree<any, any> ? RegleErrorTree<TRule, TExternalError extends RegleExternalErrorTree ? TExternalError : {}> : string[];
593
- type RegleCollectionErrors<TRule extends RegleFormPropertyType<any, any> | undefined = {}, TExternalError extends RegleExternalValidationErrors<any> | undefined = {}> = {
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>> = {
594
583
  readonly $errors: string[];
595
- readonly $each: RegleValidationErrors<TRule, TExternalError>[];
584
+ readonly $each: RegleValidationErrors<TState>[];
596
585
  };
597
- type RegleExternalErrorTree<TState extends Record<string, any> | undefined = Record<string, any>> = {
598
- [K in keyof TState]?: RegleExternalValidationErrors<TState[K]>;
599
- };
600
- type RegleExternalValidationErrors<TValue extends any> = [NonNullable<TValue>] extends [
601
- never
602
- ] ? string[] : NonNullable<TValue> extends Array<infer U extends Record<string, any> | undefined> ? RegleExternalCollectionErrors<U> : NonNullable<TValue> extends Date ? string[] : NonNullable<TValue> extends File ? string[] : TValue extends Record<string, any> ? RegleExternalErrorTree<TValue> : string[];
603
- type RegleExternalCollectionErrors<TValue extends Record<string, any> | undefined = Record<string, any>> = {
604
- $errors?: string[];
605
- $each?: RegleExternalErrorTree<TValue>[];
606
- };
607
- type RegleExternalValidationErrorsReport<TExternalError extends RegleExternalValidationErrors<any> | undefined = {}> = NonNullable<TExternalError> extends RegleExternalCollectionErrors ? TExternalError : NonNullable<TExternalError> extends string[] ? string[] : NonNullable<TExternalError> extends RegleExternalErrorTree<any> ? RegleExternalErrorTree<TExternalError> : string[];
608
586
 
609
587
  /**
610
588
  * @public
611
589
  */
612
- 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<any> = EmptyObject, TShortcuts extends RegleShortcutDefinition = {}> = 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] ? {} : {
613
591
  $groups: {
614
592
  readonly [TKey in keyof TValidationGroups]: RegleValidationGroupOutput;
615
593
  };
@@ -617,23 +595,23 @@ type RegleRoot<TState extends Record<string, any> = Record<string, any>, TRules
617
595
  /**
618
596
  * @public
619
597
  */
620
- type RegleStatus<TState extends Record<string, any> = Record<string, any>, TRules extends ReglePartialValidationTree<TState> = Record<string, any>, TExternal extends RegleExternalErrorTree<any> | undefined = {}, TShortcuts extends RegleShortcutDefinition = {}> = 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> & {
621
599
  readonly $fields: {
622
- readonly [TKey in keyof TRules]: InferRegleStatusType<NonNullable<TRules[TKey]>, TState, TKey, TKey extends keyof NonNullable<TExternal> ? NonNullable<TExternal>[TKey] extends RegleExternalErrorTree<any> ? NonNullable<TExternal>[TKey] : {} : {}, TShortcuts>;
623
- } & (IsEmptyObject<TExternal> extends true ? {} : {
624
- readonly [TKey in keyof NonPresentKeys<TRules, NonNullable<TExternal>>]?: InferRegleStatusType<ReglePartialValidationTree<TKey extends keyof TState ? TState[TKey] : {}>, TState, TKey, TKey extends keyof NonNullable<TExternal> ? NonNullable<TExternal>[TKey] extends RegleExternalErrorTree<any> ? NonNullable<TExternal>[TKey] : {} : {}, TShortcuts>;
625
- });
626
- readonly $errors: RegleErrorTree<TRules, TExternal>;
627
- readonly $silentErrors: RegleErrorTree<TRules, TExternal>;
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>;
603
+ };
604
+ readonly $errors: RegleErrorTree<TState>;
605
+ readonly $silentErrors: RegleErrorTree<TState>;
628
606
  $extractDirtyFields: (filterNullishValues?: boolean) => PartialDeep<TState>;
629
- $parse: () => Promise<false | Prettify<DeepSafeFormState<TState, TRules>>>;
607
+ $validate: () => Promise<false | Prettify<DeepSafeFormState<TState, TRules>>>;
630
608
  } & ([TShortcuts['nested']] extends [never] ? {} : {
631
609
  [K in keyof TShortcuts['nested']]: ReturnType<NonNullable<TShortcuts['nested']>[K]>;
632
610
  });
633
611
  /**
634
612
  * @public
635
613
  */
636
- type InferRegleStatusType<TRule extends RegleCollectionRuleDecl | RegleRuleDecl | ReglePartialValidationTree<any>, TState extends Record<PropertyKey, any> = any, TKey extends PropertyKey = string, TExternal extends RegleExternalErrorTree<any> | undefined = {}, TShortcuts extends RegleShortcutDefinition = {}> = NonNullable<TState[TKey]> extends Array<Record<string, any> | any> ? TRule extends RegleCollectionRuleDefinition<any, any> ? ExtractFromGetter<TRule['$each']> extends RegleRuleDecl | ReglePartialValidationTree<any> ? RegleCollectionStatus<TState[TKey], ExtractFromGetter<TRule['$each']>, TRule, TExternal, TShortcuts> : RegleFieldStatus<TState[TKey], TRule, TShortcuts> : RegleCollectionStatus<TState[TKey], ReglePartialValidationTree<TState[TKey]>, TRule, TExternal, 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, TExternal, TShortcuts> : RegleFieldStatus<TState[TKey], TRule, TShortcuts> : NonNullable<TState[TKey]> extends Record<PropertyKey, any> ? RegleStatus<TState[TKey], ReglePartialValidationTree<TState[TKey]>, TExternal, 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>;
637
615
  /**
638
616
  * @public
639
617
  */
@@ -643,6 +621,7 @@ type RegleFieldStatus<TState extends any = any, TRules extends RegleFormProperty
643
621
  readonly $silentErrors: string[];
644
622
  readonly $externalErrors: string[];
645
623
  $extractDirtyFields: (filterNullishValues?: boolean) => Maybe<TState>;
624
+ $validate: () => Promise<false | SafeFieldProperty<TState, TRules>>;
646
625
  readonly $rules: {
647
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>;
648
627
  };
@@ -663,10 +642,9 @@ interface RegleCommonStatus<TValue = any> {
663
642
  readonly $name: string;
664
643
  $id?: string;
665
644
  $value: UnwrapNestedRefs<TValue>;
666
- $touch(): void;
645
+ $touch(runCommit?: boolean): void;
667
646
  $reset(): void;
668
647
  $resetAll: () => void;
669
- $validate(): Promise<boolean>;
670
648
  $unwatch(): void;
671
649
  $watch(): void;
672
650
  $clearExternalErrors(): void;
@@ -693,14 +671,14 @@ type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata exte
693
671
  /**
694
672
  * @public
695
673
  */
696
- type RegleCollectionStatus<TState extends any[] = any[], TRules extends ReglePartialValidationTree<Record<string, any>> = Record<string, any>, TFieldRule extends RegleCollectionRuleDecl<any, any> = never, TExternal extends RegleExternalErrorTree<any> | undefined = {}, TShortcuts extends RegleShortcutDefinition = {}> = 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'> & {
697
675
  $value: Maybe<TState>;
698
- readonly $each: Array<InferRegleStatusType<NonNullable<TRules>, NonNullable<TState>, number, NonNullable<TExternal> extends RegleExternalCollectionErrors ? NonNullable<NonNullable<TExternal>['$each']> extends Array<any> ? ArrayElement<NonNullable<NonNullable<TExternal>['$each']>> : {} : {}, TShortcuts>>;
676
+ readonly $each: Array<InferRegleStatusType<NonNullable<TRules>, NonNullable<TState>, number, TShortcuts>>;
699
677
  readonly $field: RegleFieldStatus<TState, TFieldRule, TShortcuts>;
700
- readonly $errors: RegleErrorTree<TRules, TExternal>;
701
- readonly $silentErrors: RegleErrorTree<TRules, TExternal>;
678
+ readonly $errors: RegleCollectionErrors<TState>;
679
+ readonly $silentErrors: RegleCollectionErrors<TState>;
702
680
  $extractDirtyFields: (filterNullishValues?: boolean) => PartialDeep<TState>;
703
- $parse: () => Promise<false | SafeProperty<TState, TRules>>;
681
+ $validate: () => Promise<false | DeepSafeFormState<ArrayElement<TState>, TRules>>[];
704
682
  } & ([TShortcuts['collections']] extends [never] ? {} : {
705
683
  [K in keyof TShortcuts['collections']]: ReturnType<NonNullable<TShortcuts['collections']>[K]>;
706
684
  });
@@ -753,4 +731,4 @@ declare function defineRegleConfig<TCustomRules extends Partial<AllRulesDeclarat
753
731
  inferRules: inferRulesFn<TCustomRules>;
754
732
  };
755
733
 
756
- 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 L(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,S=o==="__async"||n.constructor.name==="AsyncFunction";return {...{validator(g,...m){return e.validator(g,...L(m.length?m:t))},message(g,m){return typeof e.message=="function"?e.message(g,{...m,$params:L(m.$params?.length?m.$params:t)}):e.message},active(g,m){return typeof e.active=="function"?e.active(g,{...m,$params:L(m.$params?.length?m.$params:t)}):e.active??!0},exec(g){let m=e.validator(g,...L(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: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 z(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function nt(e){return z(e.value)}function re(e){let t=e,r={}.toString.call(e).slice(8,-1);if(r=="Set"&&(t=new Set([...e].map(n=>re(n)))),r=="Map"&&(t=new Map([...e].map(n=>[re(n[0]),re(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]=re(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((S,E)=>{a[r][E]={},de(a[r][E],o[E]);})):z(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 se=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(i){let l=t.value.get(i);if(l)return l;{let x=ref({});return t.value.set(i,x),x}}function S(i){let l=r.value.get(i);if(l)return l;{let x=ref([]);return r.value.set(i,x),x}}function E(i,l,x){o.value.set(`${i}-${l}`,x);}function h(i,l){return o.value.get(`${i}-${l}`)}function g(i,l){i&&l!=null&&o.value.delete(`${i}-${l}`);}function m(i,l){n.value.set(i,l);}function d(i){return n.value.get(i)??!1}function f(i,l){e.value.set(i,l);}function c(i,l){let x=e.value.get(i);return x?I(l,x)?{valid:!0}:{valid:!1}:void 0}function I(i,l){let x=Object.keys(l),j=Object.keys(i);return j.length!==x.length||!j.every(w=>x.includes(w))?!1:j.every(w=>{let b=i[w],O=l[w];return !O||!b||typeof b=="function"||typeof O=="function"||typeof b=="number"||typeof b=="boolean"?!1:b._params?b._params?.every((A,N)=>{if(typeof O=="number"||typeof O=="boolean")return !0;{let V=L(O._params),q=L(b._params);return V?.[N]===q?.[N]}}):!0})}function C(i){let l=a.value.get(i);if(l)return l;{let x=ref(!1),j=ref(!0),G=ref({}),w=ref(!1);return a.value.set(i,{$pending:x,$valid:j,$metadata:G,$validating:w}),{$pending:x,$valid:j,$metadata:G,$validating:w}}}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:S,getArrayStatus:h,addArrayStatus:E,deleteArrayStatus:g,arrayStatusStorage:o}}function ot(e,t){return z(e.value)&&z(t.value)&&!Object.entries(t.value).some(r=>me(r))}function it(e,t){return !!e.value&&"$each"in e.value||Array.isArray(t.value)}function st(e){return !!e.value&&z(e.value)}function me(e){return z(e)&&"_validator"in e}function ve(e){return typeof e.value!="function"}function Ve(e){return z(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:S}){let E=effectScope(),h,g,m=ref(!1),{$pending:d,$valid:f,$metadata:c,$validating:I}=u.trySetRuleStatusRef(`${o}.${n}`);function C(){h=E.run(()=>{let b=computed(()=>({$invalid:!f.value,$params:q.value,...c.value})),O=computed(()=>ve(r)?typeof r.value.active=="function"?r.value.active(a.value,b.value):r.value.active:!0),A=computed(()=>{let y="",v=t?t[n]?.message:void 0;return v&&(typeof v=="function"?y=v(a.value,b.value):y=v),ve(r)&&(v&&!r.value._patched||(typeof r.value.message=="function"?y=r.value.message(a.value,b.value):y=r.value.message)),ee(y)&&(y="Error",console.warn(`No error message defined for ${o}.${n}`)),y}),N=computed(()=>ve(r)&&r.value.type?r.value.type:n),V=computed(()=>ve(r)?r.value.validator:r.value),q=computed(()=>typeof r.value=="function"?[]:L(r.value._params??[])),D=computed(()=>`${o}.${N.value}`);return {$active:O,$message:A,$type:N,$validator:V,$params:q,$path:D}}),g=watch(h.$params,j,{deep:!0});}C();function i(){f.value=!0,e.value&&(d.value=!0);}async function l(){let b=h.$validator.value,O=b(a.value,...h.$params.value),A=!1,N=a.value;try{i();let V;if(O instanceof Promise?V=await O:V=O,a.value!==N)return !0;if(typeof V=="boolean")A=V;else {let{$valid:q,...D}=V;A=q,c.value=D;}}catch{A=!1;}finally{d.value=!1;}return A}let x=ye(l,S??200);async function j(){I.value=!0;let b=!1;if(me(r.value)&&r.value._async)b=await x();else {let O=h.$validator.value,A=O(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")b=A;else {let{$valid:N,...V}=A;b=N,c.value=V;}}return f.value=b,I.value=!1,b}function G(){f.value=!0,c.value={},d.value=!1,I.value=!1,C();}function w(){g(),E.stop(),E=effectScope();}return reactive({...h,$pending:d,$valid:f,$metadata:c,_haveAsync:m,$validating:I,$validate:j,$unwatch:w,$watch:C,$reset:G})}function be({state:e,rulesDef:t,customMessages:r,path:n,fieldName:a,storage:o,options:u,externalErrors:S,onUnwatch:E,$isArray:h,initialState:g,shortcuts:m}){let d=effectScope(),f,c=ref(!1),I=ref(!1),C=ref([]),i,l,x,j,G,w=()=>{};function b(){C.value=S.value??[];}b();function O(){let _=t.value,W=o.checkRuleDeclEntry(n,_);y.value=Object.fromEntries(Object.entries(_).filter(([H])=>H.startsWith("$"))),D.value=Object.fromEntries(Object.entries(t.value).filter(([H])=>!H.startsWith("$")).map(([H,X])=>{if(X){let De=toRef(()=>X);return [H,ct({$dirty:c,customMessages:r,rule:De,ruleKey:H,state:e,path:n,storage:o,$debounce:y.value.$debounce})]}return []}).filter(H=>!!H.length)),V(),A(),W?.valid!=null&&(c.value=o.getDirtyState(n),c.value&&w()),o.addRuleDeclEntry(n,_);}function A(){w=f.$debounce.value?ye(q,f.$debounce.value??f.haveAnyAsyncRule?100:0):q;}function N(){D.value&&Object.entries(D.value).forEach(([_,W])=>{W.$unwatch();}),j(),c.value&&o.setDirtyEntry(n,c.value),i(),l(),x(),d.stop(),d=effectScope(),E?.(),G?.();}function V(){D.value&&Object.entries(D.value).forEach(([_,W])=>{W.$watch();}),f=d.run(()=>{let _=computed(()=>c.value),W=computed(()=>y.value.$debounce),H=computed(()=>y.value.$lazy!=null?y.value.$lazy:unref(u.lazy)),X=computed(()=>y.value.$rewardEarly!=null?y.value.$rewardEarly:unref(u.rewardEarly)),De=computed(()=>y.value.$autoDirty!=null?y.value.$autoDirty:unref(u.autoDirty)),vt=computed(()=>Object.entries(D.value).some(([te,Q])=>Q.$validating)),Ce=computed(()=>pe.value&&!Ee.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||Ee.value)),Ee=computed(()=>I.value||!X.value?Object.entries(D.value).some(([te,Q])=>Q.$pending):!1),pe=computed(()=>C.value?.length?!0:!X.value||X.value&&I.value?Object.entries(D.value).some(([te,Q])=>!Q.$valid):!1),Ye=computed(()=>a),Ie=computed(()=>ee(D.value)?!0:c.value&&!ee(e.value)&&!vt.value?C.value?.length?!1:X.value?Object.entries(D.value).every(([te,Q])=>Q.$valid):!pe.value:!1),gt=computed(()=>Object.entries(D.value).some(([te,Q])=>Q._haveAsync));function $t(){m?.fields&&Object.entries(m.fields).forEach(([te,Q])=>{let St=effectScope();Qe[te]=St.run(()=>{let Xe=ref();return watchEffect(()=>{Xe.value=Q({$dirty:c.value,$externalErrors:C.value,$value:e,$rules:D.value,$error:Ce.value,$pending:Ee.value,$invalid:pe.value,$valid:Ie.value,$errors:Le.value,$ready:Je.value,$silentErrors:ze.value,$anyDirty:_.value,$name:Ye.value});}),Xe});});}let Qe={};return $t(),watch(Ie,te=>{te&&(I.value=!1);}),{$error:Ce,$pending:Ee,$invalid:pe,$valid:Ie,$debounce:W,$lazy:H,$errors:Le,$ready:Je,$silentErrors:ze,$rewardEarly:X,$autoDirty:De,$anyDirty:_,$name:Ye,haveAnyAsyncRule:gt,$shortcuts:Qe}}),x=watch(S,b),i=watch(e,()=>{f.$autoDirty.value&&(c.value||(c.value=!0)),t.value instanceof Function&&O(),w(),f.$rewardEarly.value;},{deep:h?!0:se?1:!0}),j=watch(c,()=>{o.setDirtyEntry(n,c.value);}),l=watch(f.$valid,_=>{f.$rewardEarly.value&&_&&(I.value=!1);}),G=watch(f.haveAnyAsyncRule,A);}function q(){Object.entries(D.value).forEach(([_,W])=>{W.$validate();});}let D=ref(),y=ref();O();function v(){c.value=!1,C.value=[],Object.entries(D.value).forEach(([_,W])=>{W.$reset();}),f.$lazy.value||Object.entries(D.value).map(([_,W])=>W.$validate());}function R(){c.value||(c.value=!0,f.$rewardEarly.value,w());}let p=f.$debounce.value?ye($,f.$debounce.value??0):$;async function $(){try{if(I.value=!0,f.$autoDirty.value&&c.value&&!f.$pending.value)return !f.$error.value;{let _=Object.entries(D.value).map(([H,X])=>X.$validate());return (await Promise.allSettled(_)).every(H=>H.status==="fulfilled"?H.value:!1)}}catch{return !1}}function s(){N(),e.value=at(e,g),v();}function T(_=!0){return c.value?e.value:null}function P(){C.value=[];}f.$lazy.value||$();let{$anyDirty:k,$error:Y,$errors:oe,$invalid:ne,$name:U,$pending:M,$ready:F,$silentErrors:ie,$valid:xe,$shortcuts:he}=f;return reactive({$dirty:c,$error:Y,$errors:oe,$valid:xe,$invalid:ne,$pending:M,$silentErrors:ie,$anyDirty:k,$ready:F,$name:U,$externalErrors:C,$value:e,$rules:D,...he,$reset:v,$touch:R,$validate:p,$unwatch:N,$watch:V,$resetAll:s,$extractDirtyFields:T,$clearExternalErrors:P})}function ft({$id:e,path:t,index:r,options:n,storage:a,stateValue:o,customMessages:u,rules:S,externalErrors:E,initialState:h,shortcuts:g,fieldName:m}){let d=S.$key?S.$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=Se({state:o,rulesDef:toRef(()=>S),customMessages:u,path:f,storage:a,options:n,externalErrors:c,initialState:h?.[r],shortcuts:g,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:S,shortcuts:E,fieldName:h}){let g=effectScope(),m,d=effectScope(),f;if(!Array.isArray(e.value)&&!t.value.$each)return null;let c=ref(),I=ref(e.value),C,i=ref({}),l=a.getCollectionsEntry(n);f=d.run(()=>{let R=computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(s=>typeof s!="object"):t.value.$each&&!(t.value.$each instanceof Function)?Object.values(t.value.$each).every(s=>me(s)):!1),p=computed(()=>u.value?je(u.value)?u.value.$errors??[]:[]:[]),$=computed(()=>u.value?je(u.value)?u.value.$each??[]:[]:[]);return {isPrimitiveArray:R,$externalErrorsField:p,$externalErrorsEach:$}}),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=i.value.$value,Array.isArray(e.value)?l.value=e.value.map((R,p)=>{let $=Ae(t.value.$each,toRef(()=>R),p),s=ft({$id:c.value,path:n,rules:$??{},stateValue:toRef(()=>R),index:p,options:o,storage:a,externalErrors:f.$externalErrorsEach,initialState:S[p],shortcuts:E,fieldName:h});return s||null}).filter(R=>!!R):l.value=[],i.value=be({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:f.$externalErrorsField,$isArray:!0,initialState:S,shortcuts:E,fieldName:h}));}function j(){if(Array.isArray(e.value)){let R=re(l.value);l.value=e.value.map((p,$)=>{let s=toRef(()=>p);if(p.$id&&l.value.find(T=>T.$id===p.$id)){let T=a.getArrayStatus(c.value,p.$id);return T?(T.$value=s,T):null}else {let T=Ae(t.value.$each,s,$);if(T){let P=ft({$id:c.value,path:n,rules:T,stateValue:s,index:$,options:o,storage:a,externalErrors:f.$externalErrorsEach,initialState:S[$],shortcuts:E,fieldName:h});return P||null}}}).filter(p=>!!p),R.filter(p=>!e.value.find($=>p.$id===$.$id)).forEach((p,$)=>{a.deleteArrayStatus(c.value,$.toString());});}else l.value=[];}function G(){C=watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")?x():j();},{deep:se?1:!0,flush:"pre"}),m=g.run(()=>{let R=computed(()=>i.value.$dirty&&l.value.every(F=>F.$dirty)),p=computed(()=>i.value.$anyDirty||l.value.some(F=>F.$dirty)),$=computed(()=>i.value.$invalid||l.value.some(F=>F.$invalid)),s=computed(()=>i.value.$valid&&l.value.every(F=>F.$valid)),T=computed(()=>i.value.$error||l.value.some(F=>F.$error)),P=computed(()=>!($.value||k.value)),k=computed(()=>i.value.$pending||l.value.some(F=>F.$pending)),Y=computed(()=>({$errors:i.value.$errors,$each:l.value.map(F=>F.$errors)})),oe=computed(()=>({$errors:i.value.$silentErrors,$each:l.value.map(F=>F.$silentErrors)})),ne=computed(()=>h);function U(){E?.collections&&Object.entries(E?.collections).forEach(([F,ie])=>{let xe=effectScope();M[F]=xe.run(()=>{let he=ref();return watchEffect(()=>{he.value=ie({$dirty:R.value,$error:T.value,$pending:k.value,$invalid:$.value,$valid:s.value,$errors:Y.value,$ready:P.value,$silentErrors:oe.value,$anyDirty:p.value,$name:ne.value,$each:l.value,$field:i.value,$value:e});}),he});});}let M={};return U(),{$dirty:R,$anyDirty:p,$invalid:$,$valid:s,$error:T,$pending:k,$errors:Y,$silentErrors:oe,$ready:P,$name:ne,$shortcuts:M}}),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 w(){C&&C(),i.value&&i.value.$unwatch(),l.value&&l.value.forEach(R=>{"$dirty"in R&&R.$unwatch();}),g.stop(),g=effectScope(),d.stop(),d=effectScope(!0);}function b(){i.value.$touch(),l.value.forEach(R=>{R.$touch();});}function O(){i.value.$reset(),l.value.forEach(R=>{R.$reset();});}async function A(){try{return (await Promise.all([i.value.$validate(),...l.value.map(p=>p.$validate())])).every(p=>!!p)}catch{return !1}}function N(){i.value.$clearExternalErrors(),l.value.forEach(R=>{R.$clearExternalErrors();});}function V(R=!0){let p=l.value.map($=>{if(Ve($))return $.$extractDirtyFields(R)});return R&&(p=p.filter($=>z($)?!ee($):!!$)),p}function q(){console.log(S),w(),lt(e,S),O();}async function D(){return b(),await A()?e.value:!1}let{$shortcuts:y,...v}=m;return reactive({$field:i,...v,...y,$each:l,$value:e,$validate:A,$unwatch:w,$watch:G,$touch:b,$reset:O,$resetAll:q,$extractDirtyFields:V,$parse:D,$clearExternalErrors:N})}function ke({scopeRules:e,state:t,customMessages:r,path:n="",rootRules:a,storage:o,options:u,externalErrors:S,validationGroups:E,initialState:h,shortcuts:g,fieldName:m}){let d,f,c=null;function i(y=!0){l.value=null,triggerRef(l);let v=Object.fromEntries(Object.entries(e.value).map(([s,T])=>{if(T){let P=toRef(t.value,s),k=toRef(()=>T),Y=toRef(()=>S.value?.[s]);return [s,Se({state:P,rulesDef:k,customMessages:r,path:n?`${n}.${s}`:s,storage:o,options:u,externalErrors:Y,initialState:h?.[s],shortcuts:g,fieldName:s})]}return []}).filter(s=>!!s.length&&s[1]!=null)),R=Object.fromEntries(Object.entries(unref(S)??{}).filter(([s])=>!(s in e.value)).map(([s,T])=>{if(T){let P=toRef(t.value,s),k=toRef(()=>({})),Y=toRef(()=>T);return [s,Se({state:P,rulesDef:k,customMessages:r,path:n?`${n}.${s}`:s,storage:o,options:u,externalErrors:Y,initialState:h?.[s],shortcuts:g,fieldName:s})]}return []})),p=Object.fromEntries(Object.entries(t.value).filter(([s])=>!(s in e.value)&&!(s in(R.value??{}))).map(([s,T])=>{let P=toRef(t.value,s),k=toRef(()=>({}));return [s,Se({state:P,rulesDef:k,customMessages:r,path:n?`${n}.${s}`:s,storage:o,options:u,externalErrors:ref(),initialState:h?.[s],shortcuts:g,fieldName:s})]})),$=Object.fromEntries(Object.entries(E?.(v)??{}).map(([s,T])=>T.length?[s,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(P=>[P,Ke(toRef(()=>T),P)])),...Object.fromEntries(["$errors","$silentErrors"].map(P=>[P,et(toRef(()=>T),P)]))}]:[]));l.value={...v,...R,...p,...$},y&&w();}let l=o.getFieldsEntry(n);i();function x(){i(!1),Object.entries(l.value).forEach(([y,v])=>{v.$reset();}),w();}function j(){Object.entries(l.value).forEach(([y,v])=>{v.$touch();});}async function G(){try{return (await Promise.allSettled(Object.entries(l.value).map(([v,R])=>R.$validate()))).every(v=>v.status==="fulfilled"?v.value:!1)}catch{return !1}}function w(){a&&(c=watch(a,()=>{b(),i();},{deep:se?1:!0,flush:"post"})),d=effectScope(),f=d.run(()=>{let y=computed(()=>!!Object.entries(l.value).length&&Object.entries(l.value).every(([U,M])=>M?.$dirty)),v=computed(()=>Object.entries(l.value).some(([U,M])=>M?.$dirty)),R=computed(()=>Object.entries(l.value).some(([U,M])=>M?.$invalid)),p=computed(()=>Object.entries(l.value).every(([U,M])=>M?.$valid)),$=computed(()=>y.value&&!T.value&&R.value),s=computed(()=>!(R.value||T.value)),T=computed(()=>Object.entries(l.value).some(([U,M])=>M?.$pending)),P=computed(()=>Object.fromEntries(Object.entries(l.value).map(([U,M])=>[U,M?.$errors]))),k=computed(()=>Object.fromEntries(Object.entries(l.value).map(([U,M])=>[U,M?.$silentErrors]))),Y=computed(()=>m);function oe(){g?.nested&&Object.entries(g.nested).forEach(([U,M])=>{let F=effectScope();ne[U]=F.run(()=>{let ie=ref();return watchEffect(()=>{ie.value=M({$dirty:y.value,$value:t,$error:$.value,$pending:T.value,$invalid:R.value,$valid:p.value,$ready:s.value,$anyDirty:v.value,$name:Y.value,$silentErrors:k.value,$errors:P.value,$fields:l.value});}),ie});});}let ne={};return oe(),{$dirty:y,$anyDirty:v,$invalid:R,$valid:p,$error:$,$pending:T,$errors:P,$silentErrors:k,$ready:s,$name:Y,$shortcuts:ne}});}function b(){l.value&&Object.entries(l.value).forEach(([y,v])=>{v.$unwatch();}),c?.(),d.stop(),d=effectScope();}function O(){Object.entries(l.value).forEach(([y,v])=>{v.$clearExternalErrors();});}function A(){b(),de(t,h??{}),x();}function N(y=!0){let v=Object.entries(l.value).map(([R,p])=>[R,p.$extractDirtyFields(y)]);return y&&(v=v.filter(([R,p])=>z(p)?!ee(p):Array.isArray(p)?p.length:!!p)),Object.fromEntries(v)}async function V(){return j(),await G()?t.value:!1}let{$shortcuts:q,...D}=f;return reactive({...D,...q,$fields:l,$value:t,$resetAll:A,$reset:x,$touch:j,$validate:G,$unwatch:b,$watch:w,$clearExternalErrors:O,$extractDirtyFields:N,$parse:V})}function Se({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:u,index:S,initialState:E,shortcuts:h,onUnwatch:g,fieldName:m}){return it(t,e)?Rt({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,index:S,externalErrors:u,initialState:E,fieldName:m,shortcuts:h}):ot(e,t)&&nt(e)?ke({scopeRules:t,state:e,customMessages:r,path:n,storage:a,options:o,index:S,initialState:E,shortcuts:h,fieldName:m,externalErrors:u}):st(t)?be({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,index:S,externalErrors:u,onUnwatch:g,shortcuts:h,initialState:E,fieldName:m}):null}function Ue({initialState:e,options:t,scopeRules:r,state:n,customRules:a,shortcuts:o}){let u=Me(),S=computed(()=>unref(t.externalErrors));return reactive(ke({rootRules:r,scopeRules:r,state:n,customMessages:a?.(),storage:u,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};function a(o,u,S){let E=isRef(u)?u:computed(typeof u=="function"?u:()=>u),h={...n,...S},g=isRef(o)?o:ref(o),m=re(toRaw(g.value));return {r$:Ue({scopeRules:E,state:g,options:h,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,L as unwrapRuleParameters,yt as useRegle};
1
+ import {unref,version,isRef,toRef,computed,ref,toRaw,reactive,shallowRef,onScopeDispose,triggerRef,watch,effectScope,watchEffect}from'vue';var Ce=(r=>(r.Inline="__inline",r.Async="__async",r))(Ce||{});function Qe(e,t){return computed(()=>e.value.some(r=>r[t]))}function Xe(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 Ze(e){return e.map(t=>t instanceof Function||isRef(t)?t:toRef(()=>t))}function Ke(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 Ie(e,...t){let{message:r,validator:n,active:a,type:o,...f}=e,p=o==="__async"||n.constructor.name==="AsyncFunction";return {...{validator($,...y){return e.validator($,...q(y.length?y:t))},message($,y){return typeof e.message=="function"?e.message($,{...y,$params:q(y.$params?.length?y.$params:t)}):e.message},active($,y){return typeof e.active=="function"?e.active($,{...y,$params:q(y.$params?.length?y.$params:t)}):e.active??!0},exec($){let y=e.validator($,...q(t)),d;return y instanceof Promise?y.then(v=>(d=v,typeof d=="object"&&"$valid"in d?d.$valid:typeof d=="boolean"?d:!1)):(d=y,typeof d=="object"&&"$valid"in d?d.$valid:typeof d=="boolean"?d:!1)}},...f,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:p,_params:Ze(t)}}function Pe(e){if(typeof e.validator=="function"){let r=Ie(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(Ke(e.validator)>1){let a=function(...o){return Ie(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 et(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,ht(e))),r=="Array"||r=="Object"){t=Array.isArray(e)?[]:{};for(let n in e)t[n]=te(e[n]);}return t}function ht(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 we(e,t,r){return e instanceof Function?e(t,r??0):e}function tt(e,t){isRef(e)?e.value=t:e=t;}function rt(e,t){isRef(e)?e.value=[]:e=[],t.forEach((r,n)=>{let a=isRef(e)?e.value[n]:e[n];a={},fe(a,t[n]);});}function fe(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],f=isRef(a[r])?a[r].value:a[r];Array.isArray(a[r])?(a[r]=[],Array.isArray(o)&&o.forEach((p,T)=>{a[r][T]={},fe(a[r][T],o[T]);})):L(o)?fe(f,o):isRef(a[r])?a[r].value=o:a[r]=o;});}function J(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 $e(e,t,r){let n,a=(...o)=>new Promise(f=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...o])).then(f);},t);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...o)=>new Promise(f=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...o])).then(f);},0);}),a}function Tt(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]),f=Number(n[a]);if(o>f)return 1;if(f>o)return -1;if(!isNaN(o)&&isNaN(f))return 1;if(isNaN(o)&&!isNaN(f))return -1}return 0}var Se=Tt(version,"3.5.0")!==-1;function Et(){return Math.floor(Math.random()*Date.now()).toString()}function Oe(){return typeof window>"u"?Et():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(10)}function Ae(){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 f(u){let l=t.value.get(u);if(l)return l;{let x=ref({});return t.value.set(u,x),x}}function p(u){let l=r.value.get(u);if(l)return l;{let x=ref([]);return r.value.set(u,x),x}}function T(u,l,x){o.value.set(`${u}-${l}`,x);}function S(u,l){return o.value.get(`${u}-${l}`)}function $(u,l){u&&l!=null&&o.value.delete(`${u}-${l}`);}function y(u,l){n.value.set(u,l);}function d(u){return n.value.get(u)??!1}function v(u,l){e.value.set(u,l);}function i(u,l){let x=e.value.get(u);return x?V(l,x)?{valid:!0}:{valid:!1}:void 0}function V(u,l){let x=Object.keys(l),A=Object.keys(u);return A.length!==x.length||!A.every(j=>x.includes(j))?!1:A.every(j=>{let b=u[j],P=l[j];return !P||!b||typeof b=="function"||typeof P=="function"||typeof b=="number"||typeof b=="boolean"?!1:b._params?b._params?.every((F,m)=>{if(typeof P=="number"||typeof P=="boolean")return !0;{let E=q(P._params),H=q(b._params);return E?.[m]===H?.[m]}}):!0})}function N(u){let l=a.value.get(u);if(l)return l;{let x=ref(!1),A=ref(!0),B=ref({}),j=ref(!1);return a.value.set(u,{$pending:x,$valid:A,$metadata:B,$validating:j}),{$pending:x,$valid:A,$metadata:B,$validating:j}}}return onScopeDispose(()=>{e.value.clear(),t.value.clear(),r.value.clear(),n.value.clear(),a.value.clear(),o.value.clear();}),{addRuleDeclEntry:v,setDirtyEntry:y,checkRuleDeclEntry:i,getDirtyState:d,trySetRuleStatusRef:N,getFieldsEntry:f,getCollectionsEntry:p,getArrayStatus:S,addArrayStatus:T,deleteArrayStatus:$,arrayStatusStorage:o}}function nt(e,t){return L(e.value)&&L(t.value)&&!Object.entries(t.value).some(r=>Re(r))}function at(e,t){return !!e.value&&"$each"in e.value||Array.isArray(t.value)}function lt(e){return !!e.value&&L(e.value)}function Re(e){return L(e)&&"_validator"in e}function pe(e){return typeof e.value!="function"}function Fe(e){return L(e)&&"$fields"in e}function Me({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 ut({$dirty:e,customMessages:t,rule:r,ruleKey:n,state:a,path:o,storage:f,$debounce:p}){let T=effectScope(),S,$,y=ref(!1),{$pending:d,$valid:v,$metadata:i,$validating:V}=f.trySetRuleStatusRef(`${o}.${n}`);function N(){S=T.run(()=>{let b=computed(()=>({$invalid:!v.value,$params:H.value,...i.value})),P=computed(()=>pe(r)?typeof r.value.active=="function"?r.value.active(a.value,b.value):!!r.value.active:!0),F=computed(()=>{let h="",s=t?t[n]?.message:void 0;return s&&(typeof s=="function"?h=s(a.value,b.value):h=s),pe(r)&&(s&&!r.value._patched||(typeof r.value.message=="function"?h=r.value.message(a.value,b.value):h=r.value.message)),J(h)&&(h="Error",console.warn(`No error message defined for ${o}.${n}`)),h}),m=computed(()=>pe(r)&&r.value.type?r.value.type:n),E=computed(()=>pe(r)?r.value.validator:r.value),H=computed(()=>typeof r.value=="function"?[]:q(r.value._params??[])),C=computed(()=>`${o}.${m.value}`);return {$active:P,$message:F,$type:m,$validator:E,$params:H,$path:C}}),$=watch(S.$params,A,{deep:!0});}N();function u(){v.value=!0,e.value&&(d.value=!0);}async function l(){let b=S.$validator.value,P=b(a.value,...S.$params.value),F=!1,m=a.value;try{u();let E;if(P instanceof Promise?E=await P:E=P,a.value!==m)return !0;if(typeof E=="boolean")F=E;else {let{$valid:H,...C}=E;F=H,i.value=C;}}catch{F=!1;}finally{d.value=!1;}return F}let x=$e(l,p??200);async function A(){try{V.value=!0;let b=!1;if(Re(r.value)&&r.value._async)b=await x();else {let P=S.$validator.value,F=P(a.value,...S.$params.value);if(F 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(F!=null)if(typeof F=="boolean")b=F;else {let{$valid:m,...E}=F;b=m,i.value=E;}}return v.value=b,b}catch{return !1}finally{V.value=!1;}}function B(){v.value=!0,i.value={},d.value=!1,V.value=!1,N();}function j(){$(),T.stop(),T=effectScope();}return reactive({...S,$pending:d,$valid:v,$metadata:i,_haveAsync:y,$validating:V,$validate:A,$unwatch:j,$watch:N,$reset:B})}function be({state:e,rulesDef:t,customMessages:r,path:n,fieldName:a,storage:o,options:f,externalErrors:p,onUnwatch:T,$isArray:S,initialState:$,shortcuts:y}){let d=effectScope(),v,i=ref(!1),V=ref(!1),N,u,l,x,A=()=>{};function B(){let O=t.value,G=o.checkRuleDeclEntry(n,O);E.value=Object.fromEntries(Object.entries(O).filter(([W])=>W.startsWith("$"))),m.value=Object.fromEntries(Object.entries(t.value).filter(([W])=>!W.startsWith("$")).map(([W,X])=>{if(X){let Ee=toRef(()=>X);return [W,ut({$dirty:i,customMessages:r,rule:Ee,ruleKey:W,state:e,path:n,storage:o,$debounce:E.value.$debounce})]}return []}).filter(W=>!!W.length)),P(),j(),G?.valid!=null&&(i.value=o.getDirtyState(n),i.value&&A()),o.addRuleDeclEntry(n,O);}function j(){A=v.$debounce.value?$e(F,v.$debounce.value??v.haveAnyAsyncRule?100:0):F;}function b(){m.value&&Object.entries(m.value).forEach(([O,G])=>{G.$unwatch();}),l(),i.value&&o.setDirtyEntry(n,i.value),N?.(),u?.(),d.stop(),d=effectScope(),T?.(),x?.();}function P(){m.value&&Object.entries(m.value).forEach(([O,G])=>{G.$watch();}),v=d.run(()=>{let O=computed(()=>i.value),G=computed(()=>E.value.$debounce),W=computed(()=>E.value.$lazy!=null?E.value.$lazy:unref(f.lazy)),X=computed(()=>E.value.$rewardEarly!=null?E.value.$rewardEarly:unref(f.rewardEarly)),Ee=computed(()=>E.value.$clearExternalErrorsOnChange!=null?E.value.$clearExternalErrorsOnChange:unref(f.clearExternalErrorsOnChange)),pt=computed(()=>E.value.$autoDirty!=null?E.value.$autoDirty:unref(f.autoDirty)),Ue=computed(()=>Object.entries(m.value).some(([ee,z])=>z.$validating)),De=computed(()=>ce.value&&!ge.value&&i.value),We=computed(()=>De.value?Me({field:{$dirty:i.value,$externalErrors:p?.value,$rules:m.value}}):[]),He=computed(()=>Me({field:{$dirty:i.value,$externalErrors:p?.value,$rules:m.value},silent:!0})),qe=computed(()=>!(ce.value||ge.value)),ge=computed(()=>V.value||!X.value?Object.entries(m.value).some(([ee,z])=>z.$pending):!1),ce=computed(()=>p?.value?.length?!0:J(m.value)?!1:!X.value||X.value&&V.value?Object.entries(m.value).some(([ee,z])=>!z.$valid):!1),Le=computed(()=>a),xe=computed(()=>J(m.value)?!1:i.value&&!J(e.value)&&!Ue.value?p?.value?.length?!1:X.value?Object.entries(m.value).every(([ee,z])=>z.$valid):!ce.value:!1),dt=computed(()=>Object.entries(m.value).some(([ee,z])=>z._haveAsync));function vt(){y?.fields&&Object.entries(y.fields).forEach(([ee,z])=>{let yt=effectScope();ze[ee]=yt.run(()=>{let Je=ref();return watchEffect(()=>{Je.value=z({$dirty:i.value,$externalErrors:p?.value??[],$value:e,$rules:m.value,$error:De.value,$pending:ge.value,$invalid:ce.value,$valid:xe.value,$errors:We.value,$ready:qe.value,$silentErrors:He.value,$anyDirty:O.value,$name:Le.value});}),Je});});}let ze={};return vt(),watch(xe,ee=>{ee&&(V.value=!1);}),{$error:De,$pending:ge,$invalid:ce,$valid:xe,$debounce:G,$lazy:W,$errors:We,$ready:qe,$silentErrors:He,$rewardEarly:X,$autoDirty:pt,$clearExternalErrorsOnChange:Ee,$anyDirty:O,$name:Le,haveAnyAsyncRule:dt,$shortcuts:ze,$validating:Ue}}),N=watch(e,()=>{v.$autoDirty.value&&(i.value||(i.value=!0)),t.value instanceof Function&&B(),A(),v.$rewardEarly.value!==!0&&v.$clearExternalErrorsOnChange.value&&g();},{deep:S?!0:Se?1:!0}),l=watch(i,()=>{o.setDirtyEntry(n,i.value);}),u=watch(v.$valid,O=>{v.$rewardEarly.value&&O&&(V.value=!1);}),x=watch(v.haveAnyAsyncRule,j);}function F(){Object.values(m.value).forEach(O=>{O.$validate();});}let m=ref(),E=ref();B();function H(){i.value=!1,g(),Object.entries(m.value).forEach(([O,G])=>{G.$reset();}),v.$lazy.value||Object.entries(m.value).map(([O,G])=>G.$validate());}function C(O=!0){i.value||(i.value=!0,O&&A());}async function h(){try{if(V.value=!0,!i.value)i.value=!0;else if(v.$autoDirty.value&&i.value&&!v.$pending.value)return !v.$error.value;return (await Promise.allSettled(Object.entries(m.value).map(([W,X])=>X.$validate()))).every(W=>W.status==="fulfilled"?!!W.value:!1)?e.value:!1}catch{return !1}}function s(){b(),e.value=tt(e,$),H();}function R(O=!0){return i.value?e.value:null}function g(){p?.value?.length&&(p.value=[]);}!v.$lazy.value&&!i.value&&A();let{$anyDirty:c,$error:D,$errors:I,$invalid:k,$name:K,$pending:oe,$ready:ne,$silentErrors:U,$valid:M,$shortcuts:w,$validating:se}=v;return reactive({$dirty:i,$error:D,$errors:I,$valid:M,$invalid:k,$pending:oe,$silentErrors:U,$anyDirty:c,$ready:ne,$name:K,$externalErrors:p,$value:e,$rules:m,...w,$reset:H,$touch:C,$validate:h,$unwatch:b,$watch:P,$resetAll:s,$extractDirtyFields:R,$clearExternalErrors:g})}function it({$id:e,path:t,index:r,options:n,storage:a,stateValue:o,customMessages:f,rules:p,externalErrors:T,initialState:S,shortcuts:$,fieldName:y}){let d=p.$key?p.$key:Oe(),v=`${t}.${String(d)}`;typeof o.value=="object"&&o.value!=null&&(o.value.$id?v=`${t}.${o.value.$id}`:Object.defineProperties(o.value,{$id:{value:d,enumerable:!1,configurable:!1,writable:!1}}));let i=me({state:o,rulesDef:toRef(()=>p),customMessages:f,path:v,storage:a,options:n,externalErrors:toRef(T?.value??[],r),initialState:S?.[r],shortcuts:$,fieldName:y});if(i){let V=o.value?.$id;i.$id=V??String(d),a.addArrayStatus(e,i.$id,i);}return i}function st({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:f,initialState:p,shortcuts:T,fieldName:S}){let $=effectScope(),y,d=effectScope(),v;if(!Array.isArray(e.value)&&!t.value.$each)return null;let i=ref(),V=ref(e.value),N,u=ref({}),l=a.getCollectionsEntry(n);v=d.run(()=>({isPrimitiveArray:computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(R=>typeof R!="object"):t.value.$each&&!(t.value.$each instanceof Function)?Object.values(t.value.$each).every(R=>Re(R)):!1)})),x(),B();function x(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(i.value=Oe(),Object.defineProperties(e.value,{$id:{value:i.value,enumerable:!1,configurable:!1,writable:!1}})):e.value?.$id&&(i.value=e.value.$id)),!v.isPrimitiveArray.value&&(V.value=u.value.$value,Array.isArray(e.value)?l.value=e.value.map((s,R)=>{let g=we(t.value.$each,toRef(()=>s),R),c=it({$id:i.value,path:n,rules:g??{},stateValue:toRef(()=>s),index:R,options:o,storage:a,externalErrors:toRef(f?.value??{},"$each"),initialState:p[R],shortcuts:T,fieldName:S});return c||null}).filter(s=>!!s):l.value=[],u.value=be({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:toRef(f?.value??{},"$errors"),$isArray:!0,initialState:p,shortcuts:T,fieldName:S}));}function A(){if(Array.isArray(e.value)){let s=te(l.value);l.value=e.value.map((R,g)=>{let c=toRef(()=>R);if(R.$id&&l.value.find(D=>D.$id===R.$id)){let D=a.getArrayStatus(i.value,R.$id);return D?(D.$value=c,D):null}else {let D=we(t.value.$each,c,g);if(D){let I=it({$id:i.value,path:n,rules:D,stateValue:c,index:g,options:o,storage:a,externalErrors:toRef(f?.value??{},"$each"),initialState:p[g],shortcuts:T,fieldName:S});return I||null}}}).filter(R=>!!R),s.filter(R=>!e.value.find(g=>R.$id===g.$id)).forEach((R,g)=>{a.deleteArrayStatus(i.value,g.toString());});}else l.value=[];}function B(){N=watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")?x():A();},{deep:Se?1:!0,flush:"pre"}),y=$.run(()=>{let s=computed(()=>u.value.$dirty&&l.value.every(w=>w.$dirty)),R=computed(()=>u.value.$anyDirty||l.value.some(w=>w.$dirty)),g=computed(()=>u.value.$invalid||l.value.some(w=>w.$invalid)),c=computed(()=>(J(u.value.$rules)?!0:u.value.$valid)&&l.value.every(w=>w.$valid)),D=computed(()=>u.value.$error||l.value.some(w=>w.$error)),I=computed(()=>!(g.value||k.value)),k=computed(()=>u.value.$pending||l.value.some(w=>w.$pending)),K=computed(()=>({$errors:u.value.$errors,$each:l.value.map(w=>w.$errors)})),oe=computed(()=>({$errors:u.value.$silentErrors,$each:l.value.map(w=>w.$silentErrors)})),ne=computed(()=>S);function U(){T?.collections&&Object.entries(T?.collections).forEach(([w,se])=>{let O=effectScope();M[w]=O.run(()=>{let G=ref();return watchEffect(()=>{G.value=se({$dirty:s.value,$error:D.value,$pending:k.value,$invalid:g.value,$valid:c.value,$errors:K.value,$ready:I.value,$silentErrors:oe.value,$anyDirty:R.value,$name:ne.value,$each:l.value,$field:u.value,$value:e});}),G});});}let M={};return U(),{$dirty:s,$anyDirty:R,$invalid:g,$valid:c,$error:D,$pending:k,$errors:K,$silentErrors:oe,$ready:I,$name:ne,$shortcuts:M}}),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`),N());}function j(){N&&N(),u.value&&u.value.$unwatch(),l.value&&l.value.forEach(s=>{"$dirty"in s&&s.$unwatch();}),$.stop(),$=effectScope(),d.stop(),d=effectScope(!0);}function b(s=!0){u.value.$touch(s),l.value.forEach(R=>{R.$touch(s);});}function P(){u.value.$reset(),l.value.forEach(s=>{s.$reset();});}async function F(){try{return (await Promise.all([u.value.$validate(),...l.value.map(g=>g.$validate())])).every(g=>g.value!==!1)?e.value:!1}catch{return !1}}function m(){u.value.$clearExternalErrors(),l.value.forEach(s=>{s.$clearExternalErrors();});}function E(s=!0){let R=l.value.map(g=>{if(Fe(g))return g.$extractDirtyFields(s)});return s&&(R=R.filter(g=>L(g)?!J(g):!!g)),R}function H(){j(),rt(e,p),P();}let{$shortcuts:C,...h}=y;return reactive({$field:u,...h,...C,$each:l,$value:e,$validate:F,$unwatch:j,$watch:B,$touch:b,$reset:P,$resetAll:H,$extractDirtyFields:E,$clearExternalErrors:m})}function _e({scopeRules:e,state:t,customMessages:r,path:n="",rootRules:a,storage:o,options:f,externalErrors:p,validationGroups:T,initialState:S,shortcuts:$,fieldName:y}){let d,v,i=null;function u(C=!0){l.value=null,triggerRef(l);let h=Object.fromEntries(Object.entries(e.value).map(([c,D])=>{if(D){let I=toRef(t.value,c),k=toRef(()=>D),K=toRef(p?.value,c);return [c,me({state:I,rulesDef:k,customMessages:r,path:n?`${n}.${c}`:c,storage:o,options:f,externalErrors:K,initialState:S?.[c],shortcuts:$,fieldName:c})]}return []}).filter(c=>!!c.length&&c[1]!=null)),s=Object.fromEntries(Object.entries(unref(p)??{}).filter(([c])=>!(c in e.value)).map(([c,D])=>{if(D){let I=toRef(t.value,c),k=toRef(()=>({}));return [c,me({state:I,rulesDef:k,customMessages:r,path:n?`${n}.${c}`:c,storage:o,options:f,externalErrors:toRef(p?.value??{},c),initialState:S?.[c],shortcuts:$,fieldName:c})]}return []})),R=Object.fromEntries(Object.entries(t.value).filter(([c])=>!(c in e.value)&&!(c in(s.value??{}))).map(([c,D])=>{let I=toRef(t.value,c),k=toRef(()=>({}));return [c,me({state:I,rulesDef:k,customMessages:r,path:n?`${n}.${c}`:c,storage:o,options:f,externalErrors:toRef(p?.value??{},c),initialState:S?.[c],shortcuts:$,fieldName:c})]})),g=Object.fromEntries(Object.entries(T?.(h)??{}).map(([c,D])=>D.length?[c,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(I=>[I,Qe(toRef(()=>D),I)])),...Object.fromEntries(["$errors","$silentErrors"].map(I=>[I,Xe(toRef(()=>D),I)]))}]:[]));l.value={...h,...s,...R,...g},C&&j();}let l=o.getFieldsEntry(n);u();function x(){u(!1),Object.entries(l.value).forEach(([C,h])=>{h.$reset();}),j();}function A(C=!0){Object.values(l.value).forEach(h=>{h.$touch(C);});}async function B(){try{return (await Promise.allSettled(Object.values(l.value).map(s=>s.$validate()))).every(s=>s.status==="fulfilled"?s.value!==!1:!1)?t.value:!1}catch{return !1}}function j(){a&&(i=watch([a,p],()=>{b(),u();},{deep:!0,flush:"post"})),d=effectScope(),v=d.run(()=>{let C=computed(()=>!!Object.entries(l.value).length&&Object.entries(l.value).every(([U,M])=>M?.$dirty)),h=computed(()=>Object.entries(l.value).some(([U,M])=>M?.$dirty)),s=computed(()=>Object.entries(l.value).some(([U,M])=>M?.$invalid)),R=computed(()=>Object.entries(l.value).every(([U,M])=>M?.$valid)),g=computed(()=>C.value&&!D.value&&s.value),c=computed(()=>!(s.value||D.value)),D=computed(()=>Object.entries(l.value).some(([U,M])=>M?.$pending)),I=computed(()=>Object.fromEntries(Object.entries(l.value).map(([U,M])=>[U,M?.$errors]))),k=computed(()=>Object.fromEntries(Object.entries(l.value).map(([U,M])=>[U,M?.$silentErrors]))),K=computed(()=>y);function oe(){$?.nested&&Object.entries($.nested).forEach(([U,M])=>{let w=effectScope();ne[U]=w.run(()=>{let se=ref();return watchEffect(()=>{se.value=M({$dirty:C.value,$value:t,$error:g.value,$pending:D.value,$invalid:s.value,$valid:R.value,$ready:c.value,$anyDirty:h.value,$name:K.value,$silentErrors:k.value,$errors:I.value,$fields:l.value});}),se});});}let ne={};return oe(),{$dirty:C,$anyDirty:h,$invalid:s,$valid:R,$error:g,$pending:D,$errors:I,$silentErrors:k,$ready:c,$name:K,$shortcuts:ne}});}function b(){l.value&&Object.entries(l.value).forEach(([C,h])=>{h.$unwatch();}),i?.(),d.stop(),d=effectScope();}function P(){Object.entries(l.value).forEach(([C,h])=>{h.$clearExternalErrors();});}function F(){b(),fe(t,S??{}),x();}function m(C=!0){let h=Object.entries(l.value).map(([s,R])=>[s,R.$extractDirtyFields(C)]);return C&&(h=h.filter(([s,R])=>L(R)?!J(R):Array.isArray(R)?R.length:!!R)),Object.fromEntries(h)}let{$shortcuts:E,...H}=v;return reactive({...H,...E,$fields:l,$value:t,$resetAll:F,$reset:x,$touch:A,$validate:B,$unwatch:b,$watch:j,$clearExternalErrors:P,$extractDirtyFields:m})}function me({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:f,index:p,initialState:T,shortcuts:S,onUnwatch:$,fieldName:y}){return at(t,e)?st({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,index:p,externalErrors:f,initialState:T,fieldName:y,shortcuts:S}):nt(e,t)&&et(e)?_e({scopeRules:t,state:e,customMessages:r,path:n,storage:a,options:o,index:p,initialState:T,shortcuts:S,fieldName:y,externalErrors:f}):lt(t)?be({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,index:p,externalErrors:f,onUnwatch:$,shortcuts:S,initialState:T,fieldName:y}):null}function Ne({initialState:e,options:t,scopeRules:r,state:n,customRules:a,shortcuts:o}){let f=Ae();return reactive(_e({rootRules:r,scopeRules:r,state:n,customMessages:a?.(),storage:f,options:t,externalErrors:t.externalErrors,validationGroups:t.validationGroups,initialState:e,shortcuts:o,fieldName:"root"}))}function Ge(e,t,r){let n={autoDirty:t?.autoDirty??!0,lazy:t?.lazy??!1,rewardEarly:t?.rewardEarly??!1,clearExternalErrorsOnChange:t?.clearExternalErrorsOnChange??!0};function a(o,f,p){let T=isRef(f)?f:computed(typeof f=="function"?f:()=>f),S={...n,...p},$=isRef(o)?o:ref(o),y=te(toRaw($.value));return {r$:Ne({scopeRules:T,state:$,options:S,initialState:y,customRules:e,shortcuts:r})}}return a}var ft=Ge();function Be(){function e(t,r){return r}return e}var ke=Be();function Rt({rules:e,modifiers:t,shortcuts:r}){let n=Ge(e,t,r),a=Be();return {useRegle:n,inferRules:a}}export{Ce as InternalRuleType,Pe as createRule,Rt as defineRegleConfig,ke as inferRules,q as unwrapRuleParameters,ft as useRegle};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@regle/core",
3
- "version": "0.2.6",
3
+ "version": "0.2.8",
4
4
  "description": "Typescript-first model-based form validation library for Vue 3",
5
5
  "peerDependencies": {
6
6
  "vue": "^3.1.0"