@regle/core 0.2.13 → 0.3.1-beta.4

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,2 +1,2 @@
1
- 'use strict';var vue=require('vue');var De=(r=>(r.Inline="__inline",r.Async="__async",r))(De||{});function ke(e,t){return e.some(r=>r[t])}function He(e,t){return e.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 Le(e){return e.map(t=>t instanceof Function||vue.isRef(t)?t:vue.toRef(()=>t))}function qe(e){let n=e.toString().replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").match(/^(?:async\s*)?(?:function\b.*?\(|\((.*?)\)|(\w+))\s*=>|\((.*?)\)\s*=>|function.*?\((.*?)\)|\((.*?)\)/);return n?(n[0]||n[1]||n[2]||n[3]||n[4]||"").split(",").map(s=>s.trim()).filter(s=>s.length>0).length:0}function xe(e,...t){let{message:r,validator:n,active:a,type:l,...s}=e,v=l==="__async"||n.constructor.name==="AsyncFunction";return {...{validator(T,...S){return e.validator(T,...L(S.length?S:t))},message(T,S){return typeof e.message=="function"?e.message(T,{...S,$params:L(S.$params?.length?S.$params:t)}):e.message},active(T,S){return typeof e.active=="function"?e.active(T,{...S,$params:L(S.$params?.length?S.$params:t)}):e.active??!0},exec(T){let S=e.validator(T,...L(t)),h;return S instanceof Promise?S.then(y=>(h=y,typeof h=="object"&&"$valid"in h?h.$valid:typeof h=="boolean"?h:!1)):(h=S,typeof h=="object"&&"$valid"in h?h.$valid:typeof h=="boolean"?h:!1)}},...s,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:v,_params:Le(t)}}function Ce(e){if(typeof e.validator=="function"){let r=xe(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(qe(e.validator)>1){let a=function(...l){return xe(e,...l)};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 q(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ze(e){return q(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,vt(e))),r=="Array"||r=="Object"){t=Array.isArray(e)?[]:{};for(let n in e)t[n]=te(e[n]);}return t}function vt(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 Ie(e,t,r){return e instanceof Function?e(t,r??0):e}function Je(e,t){vue.isRef(e)?e.value=t:e=t;}function Ye(e,t){vue.isRef(e)?e.value=[]:e=[],t.forEach((r,n)=>{let a=vue.isRef(e)?e.value[n]:e[n];a={},ce(a,t[n]);});}function ce(e,t){Object.entries({...vue.unref(e),...t}).forEach(([r,n])=>{let a=vue.isRef(e)?e.value:e,l=vue.isRef(t[r])?t[r]._value:t[r],s=vue.isRef(a[r])?a[r].value:a[r];Array.isArray(a[r])?(a[r]=[],Array.isArray(l)&&l.forEach((v,D)=>{a[r][D]={},ce(a[r][D],l[D]);})):q(l)?ce(s,l):vue.isRef(a[r])?a[r].value=l:a[r]=l;});}function J(e){return e==null?!0:e===!1?!1:e instanceof Date?isNaN(e.getTime()):Array.isArray(e)?!1: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=(...l)=>new Promise(s=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(s);},t);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...l)=>new Promise(s=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(s);},0);}),a}function mt(e,t){let r=String(e).split("."),n=String(t).split(".");for(let a=0;a<Math.min(r.length,n.length);a++){let l=Number(r[a]),s=Number(n[a]);if(l>s)return 1;if(s>l)return -1;if(!isNaN(l)&&isNaN(s))return 1;if(isNaN(l)&&!isNaN(s))return -1}return 0}var Se=mt(vue.version,"3.5.0")!==-1;function gt(){return Math.floor(Math.random()*Date.now()).toString()}function Pe(){return typeof window>"u"?gt():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(10)}function we(){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),l=vue.shallowRef(new Map);function s(d){let o=t.value.get(d);if(o)return o;{let u=vue.ref({});return t.value.set(d,u),u}}function v(d){let o=r.value.get(d);if(o)return o;{let u=vue.ref([]);return r.value.set(d,u),u}}function D(d,o,u){l.value.set(`${d}-${o}`,u);}function E(d,o){return l.value.get(`${d}-${o}`)}function T(d,o){d&&o!=null&&l.value.delete(`${d}-${o}`);}function S(d,o){n.value.set(d,o);}function h(d){return n.value.get(d)??!1}function y(d,o){e.value.set(d,o);}function C(d,o){let u=e.value.get(d);return u?R(o,u)?{valid:!0}:{valid:!1}:void 0}function R(d,o){let u=Object.keys(o),$=Object.keys(d);return $.length!==u.length||!$.every(j=>u.includes(j))?!1:$.every(j=>{let x=d[j],A=o[j];return !A||!x||typeof x=="function"||typeof A=="function"||typeof x=="number"||typeof x=="boolean"?!1:x._params?x._params?.every((P,M)=>{if(typeof A=="number"||typeof A=="boolean")return !0;{let m=L(A._params),O=L(x._params);return m?.[M]===O?.[M]}}):!0})}function G(d){let o=a.value.get(d);if(o)return o;{let u=vue.ref(!1),$=vue.ref(!0),N=vue.ref({}),j=vue.ref(!1);return a.value.set(d,{$pending:u,$valid:$,$metadata:N,$validating:j}),{$pending:u,$valid:$,$metadata:N,$validating:j}}}return vue.onScopeDispose(()=>{e.value.clear(),t.value.clear(),r.value.clear(),n.value.clear(),a.value.clear(),l.value.clear();}),{addRuleDeclEntry:y,setDirtyEntry:S,checkRuleDeclEntry:C,getDirtyState:h,trySetRuleStatusRef:G,getFieldsEntry:s,getCollectionsEntry:v,getArrayStatus:E,addArrayStatus:D,deleteArrayStatus:T,arrayStatusStorage:l}}function Qe(e,t){return q(e.value)&&q(t.value)&&!Object.entries(t.value).some(r=>fe(r))}function Xe(e,t){return !!e.value&&"$each"in e.value||Array.isArray(t.value)}function Ze(e){return !!e.value&&q(e.value)}function fe(e){return q(e)&&"_validator"in e}function Re(e){return typeof e.value!="function"}function Ke(e){return q(e)&&"$fields"in e}function Oe({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 tt({$dirty:e,customMessages:t,rule:r,ruleKey:n,state:a,path:l,storage:s,$debounce:v}){let D=vue.effectScope(),E,T,S=vue.ref(!1),{$pending:h,$valid:y,$metadata:C,$validating:R}=s.trySetRuleStatusRef(`${l}.${n}`);function G(){E=D.run(()=>{let x=vue.computed(()=>({$invalid:!y.value,$params:O.value,...C.value})),A=vue.computed(()=>Re(r)?typeof r.value.active=="function"?r.value.active(a.value,x.value):!!r.value.active:!0),P=vue.computed(()=>{let H="",Y=t?t[n]?.message:void 0;return Y&&(typeof Y=="function"?H=Y(a.value,x.value):H=Y),Re(r)&&(Y&&!r.value._patched||(typeof r.value.message=="function"?H=r.value.message(a.value,x.value):H=r.value.message)),J(H)&&(H="Error",console.warn(`No error message defined for ${l}.${n}`)),H}),M=vue.computed(()=>Re(r)&&r.value.type?r.value.type:n),m=vue.computed(()=>Re(r)?r.value.validator:r.value),O=vue.computed(()=>typeof r.value=="function"?[]:L(r.value._params??[])),X=vue.computed(()=>`${l}.${M.value}`);return {$active:A,$message:P,$type:M,$validator:m,$params:O,$path:X}}),T=vue.watch(E.$params,$,{deep:!0});}G();function d(){y.value=!0,e.value&&(h.value=!0);}async function o(){let x=E.$validator.value,A=x(a.value,...E.$params.value),P=!1,M=a.value;try{d();let m;if(A instanceof Promise?m=await A:m=A,a.value!==M)return !0;if(typeof m=="boolean")P=m;else {let{$valid:O,...X}=m;P=O,C.value=X;}}catch{P=!1;}finally{h.value=!1;}return P}let u=$e(o,v??200);async function $(){try{R.value=!0;let x=!1;if(fe(r.value)&&r.value._async)x=await u();else {let A=E.$validator.value,P=A(a.value,...E.$params.value);if(P 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(P!=null)if(typeof P=="boolean")x=P;else {let{$valid:M,...m}=P;x=M,C.value=m;}}return y.value=x,x}catch{return !1}finally{R.value=!1;}}function N(){y.value=!0,C.value={},h.value=!1,R.value=!1,G();}function j(){T(),D.stop(),D=vue.effectScope();}return vue.reactive({...E,$pending:h,$valid:y,$metadata:C,_haveAsync:S,$validating:R,$validate:$,$unwatch:j,$watch:G,$reset:N})}function be({state:e,rulesDef:t,customMessages:r,path:n,fieldName:a,storage:l,options:s,externalErrors:v,onUnwatch:D,$isArray:E,initialState:T,shortcuts:S}){let h=vue.effectScope(),y,C=[],R=vue.ref(!1),G=vue.ref(!1),d,o,u,$,N=()=>{};function j(){let p=t.value,V=l.checkRuleDeclEntry(n,p);O.value=Object.fromEntries(Object.entries(p).filter(([F])=>F.startsWith("$"))),m.value=Object.fromEntries(Object.entries(t.value).filter(([F])=>!F.startsWith("$")).map(([F,B])=>{if(B){let K=vue.toRef(()=>B);return [F,tt({$dirty:R,customMessages:r,rule:K,ruleKey:F,state:e,path:n,storage:l,$debounce:O.value.$debounce})]}return []}).filter(F=>!!F.length)),P(),x(),V?.valid!=null&&(R.value=l.getDirtyState(n),R.value&&N()),l.addRuleDeclEntry(n,p);}function x(){N=y.$debounce.value?$e(M,y.$debounce.value??y.haveAnyAsyncRule?100:0):M;}function A(){m.value&&Object.entries(m.value).forEach(([p,V])=>{V.$unwatch();}),u(),R.value&&l.setDirtyEntry(n,R.value),d?.(),o?.(),h.stop(),h=vue.effectScope(),C.forEach(p=>p.stop()),C=[],D?.(),$?.();}function P(){m.value&&Object.entries(m.value).forEach(([p,V])=>{V.$watch();}),y=h.run(()=>{let p=vue.computed(()=>R.value),V=vue.computed(()=>O.value.$debounce),F=vue.computed(()=>O.value.$lazy!=null?O.value.$lazy:vue.unref(s.lazy)),B=vue.computed(()=>O.value.$rewardEarly!=null?O.value.$rewardEarly:vue.unref(s.rewardEarly)),K=vue.computed(()=>O.value.$clearExternalErrorsOnChange!=null?O.value.$clearExternalErrorsOnChange:vue.unref(s.clearExternalErrorsOnChange)),oe=vue.computed(()=>O.value.$autoDirty!=null?O.value.$autoDirty:vue.unref(s.autoDirty)),w=vue.computed(()=>Object.entries(m.value).some(([Z,ee])=>ee.$validating)),_=vue.computed(()=>ge.value&&!me.value&&R.value),I=vue.computed(()=>_.value?Oe({field:{$dirty:R.value,$externalErrors:v?.value,$rules:m.value}}):[]),k=vue.computed(()=>Oe({field:{$dirty:R.value,$externalErrors:v?.value,$rules:m.value},silent:!0})),se=vue.computed(()=>!(ge.value||me.value)),me=vue.computed(()=>G.value||!B.value?Object.entries(m.value).some(([Z,ee])=>ee.$pending):!1),ge=vue.computed(()=>v?.value?.length?!0:J(m.value)?!1:!B.value||B.value&&G.value?Object.entries(m.value).some(([Z,ee])=>!ee.$valid):!1),Ne=vue.computed(()=>a),Ee=vue.computed(()=>v?.value?.length||J(m.value)?!1:R.value&&!J(e.value)&&!w.value?Object.values(m.value).every(Z=>Z.$valid&&Z.$active):!1),st=vue.computed(()=>Object.entries(m.value).some(([Z,ee])=>ee._haveAsync));function ct(){S?.fields&&Object.entries(S.fields).forEach(([Z,ee])=>{let We=vue.effectScope();Be[Z]=We.run(()=>{let Ue=vue.ref();return vue.watchEffect(()=>{Ue.value=ee({$dirty:R.value,$externalErrors:v?.value??[],$value:e,$rules:m.value,$error:_.value,$pending:me.value,$invalid:ge.value,$valid:Ee.value,$errors:I.value,$ready:se.value,$silentErrors:k.value,$anyDirty:p.value,$name:Ne.value});}),Ue}),C.push(We);});}let Be={};return ct(),vue.watch(Ee,Z=>{Z&&(G.value=!1);}),{$error:_,$pending:me,$invalid:ge,$valid:Ee,$debounce:V,$lazy:F,$errors:I,$ready:se,$silentErrors:k,$rewardEarly:B,$autoDirty:oe,$clearExternalErrorsOnChange:K,$anyDirty:p,$name:Ne,haveAnyAsyncRule:st,$shortcuts:Be,$validating:w}}),d=vue.watch(e,()=>{y.$autoDirty.value&&(R.value||(R.value=!0)),t.value instanceof Function&&j(),N(),y.$rewardEarly.value!==!0&&y.$clearExternalErrorsOnChange.value&&g();},{deep:E?!0:Se?1:!0}),u=vue.watch(R,()=>{l.setDirtyEntry(n,R.value);}),o=vue.watch(y.$valid,p=>{y.$rewardEarly.value&&p&&(G.value=!1);}),$=vue.watch(y.haveAnyAsyncRule,x);}function M(){Object.values(m.value).forEach(p=>{p.$validate();});}let m=vue.ref(),O=vue.ref();j();function X(){g(),R.value=!1,Object.entries(m.value).forEach(([p,V])=>{V.$reset();}),!y.$lazy.value&&y.$autoDirty.value&&Object.values(m.value).forEach(p=>p.$validate());}function H(p=!0){R.value||(R.value=!0,p&&N());}async function Y(){try{let p=e.value;if(G.value=!0,!R.value)R.value=!0;else if(y.$autoDirty.value&&R.value&&!y.$pending.value)return {result:!y.$error.value,data:p};return J(m.value)?{result:!0,data:p}:{result:(await Promise.allSettled(Object.entries(m.value).map(([B,K])=>K.$validate()))).every(B=>B.status==="fulfilled"?B.value===!0:!1),data:p}}catch{return {result:!1,data:e.value}}}function i(){A(),e.value=Je(e,T),X();}function c(p=!0){return R.value?e.value:null}function g(){v?.value?.length&&(v.value=[]);}!y.$lazy.value&&!R.value&&y.$autoDirty.value&&N();let{$shortcuts:b,$validating:f,...W}=y;return vue.reactive({$dirty:R,...W,$externalErrors:v,$value:e,$rules:m,...b,$reset:X,$touch:H,$validate:Y,$unwatch:A,$watch:P,$resetAll:i,$extractDirtyFields:c,$clearExternalErrors:g})}function rt({$id:e,path:t,index:r,options:n,storage:a,stateValue:l,customMessages:s,rules:v,externalErrors:D,initialState:E,shortcuts:T,fieldName:S}){let h=v.$key?v.$key:Pe(),y=`${t}.${String(h)}`;typeof l.value=="object"&&l.value!=null&&(l.value.$id?y=`${t}.${l.value.$id}`:Object.defineProperties(l.value,{$id:{value:h,enumerable:!1,configurable:!1,writable:!1}}));let C=ye({state:l,rulesDef:vue.toRef(()=>v),customMessages:s,path:y,storage:a,options:n,externalErrors:vue.toRef(D?.value??[],r),initialState:E?.[r],shortcuts:T,fieldName:S});if(C){let R=l.value?.$id;C.$id=R??String(h),a.addArrayStatus(e,C.$id,C);}return C}function nt({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:s,initialState:v,shortcuts:D,fieldName:E}){let T=vue.effectScope(),S,h=vue.effectScope(),y,C=[];if(!Array.isArray(e.value)&&!t.value.$each)return null;let R=vue.ref(),G=vue.ref(e.value),d,o=vue.ref({}),u=a.getCollectionsEntry(n);y=h.run(()=>({isPrimitiveArray:vue.computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(c=>typeof c!="object"):t.value.$each&&!(t.value.$each instanceof Function)?Object.values(t.value.$each).every(c=>fe(c)):!1)})),$(),j();function $(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(R.value=Pe(),Object.defineProperties(e.value,{$id:{value:R.value,enumerable:!1,configurable:!1,writable:!1}})):e.value?.$id&&(R.value=e.value.$id)),!y.isPrimitiveArray.value&&(G.value=o.value.$value,Array.isArray(e.value)?u.value=e.value.map((i,c)=>{let g=Ie(t.value.$each,vue.toRef(()=>i),c),b=rt({$id:R.value,path:n,rules:g??{},stateValue:vue.toRef(()=>i),index:c,options:l,storage:a,externalErrors:vue.toRef(s?.value??{},"$each"),initialState:v?.[c],shortcuts:D,fieldName:E});return b||null}).filter(i=>!!i):u.value=[],o.value=be({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:vue.toRef(s?.value??{},"$errors"),$isArray:!0,initialState:v,shortcuts:D,fieldName:E}));}function N(){if(Array.isArray(e.value)){let i=te(u.value);u.value=e.value.map((c,g)=>{let b=vue.toRef(()=>c);if(c.$id&&u.value.find(f=>f.$id===c.$id)){let f=a.getArrayStatus(R.value,c.$id);return f?(f.$value=b,f):null}else {let f=Ie(t.value.$each,b,g);if(f){let W=rt({$id:R.value,path:n,rules:f,stateValue:b,index:g,options:l,storage:a,externalErrors:vue.toRef(s?.value??{},"$each"),initialState:v?.[g],shortcuts:D,fieldName:E});return W||null}}}).filter(c=>!!c),i.filter(c=>!e.value.find(g=>c.$id===g.$id)).forEach((c,g)=>{a.deleteArrayStatus(R.value,g.toString());});}else u.value=[];}function j(){d=vue.watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")?$():N();},{deep:Se?1:!0,flush:"pre"}),S=T.run(()=>{let i=vue.computed(()=>o.value.$dirty&&u.value.every(w=>w.$dirty)),c=vue.computed(()=>o.value.$anyDirty||u.value.some(w=>w.$dirty)),g=vue.computed(()=>o.value.$invalid||u.value.some(w=>w.$invalid)),b=vue.computed(()=>(J(o.value.$rules)?!0:o.value.$valid)&&u.value.every(w=>w.$valid)),f=vue.computed(()=>o.value.$error||u.value.some(w=>w.$error)),W=vue.computed(()=>!(g.value||p.value)),p=vue.computed(()=>o.value.$pending||u.value.some(w=>w.$pending)),V=vue.computed(()=>({$errors:o.value.$errors,$each:u.value.map(w=>w.$errors)})),F=vue.computed(()=>({$errors:o.value.$silentErrors,$each:u.value.map(w=>w.$silentErrors)})),B=vue.computed(()=>E);function K(){D?.collections&&Object.entries(D?.collections).forEach(([w,_])=>{let I=vue.effectScope();oe[w]=I.run(()=>{let k=vue.ref();return vue.watchEffect(()=>{k.value=_({$dirty:i.value,$error:f.value,$pending:p.value,$invalid:g.value,$valid:b.value,$errors:V.value,$ready:W.value,$silentErrors:F.value,$anyDirty:c.value,$name:B.value,$each:u.value,$field:o.value,$value:e});}),k}),C.push(I);});}let oe={};return K(),{$dirty:i,$anyDirty:c,$invalid:g,$valid:b,$error:f,$pending:p,$errors:V,$silentErrors:F,$ready:W,$name:B,$shortcuts:oe}}),y.isPrimitiveArray.value&&(console.warn(`${n} is a Array of primitives. Tracking can be lost when reassigning the Array. We advise to use an Array of objects instead`),d());}function x(){d&&d(),o.value&&o.value.$unwatch(),u.value&&u.value.forEach(i=>{"$dirty"in i&&i.$unwatch();}),T.stop(),T=vue.effectScope(),h.stop(),h=vue.effectScope(!0),C.forEach(i=>i.stop()),C=[];}function A(i=!0){o.value.$touch(i),u.value.forEach(c=>{c.$touch(i);});}function P(){o.value.$reset(),u.value.forEach(i=>{i.$reset();});}async function M(){let i=e.value;try{return {result:(await Promise.allSettled([o.value.$validate(),...u.value.map(b=>b.$validate())])).every(b=>b.status==="fulfilled"?b.value.result===!0:!1),data:i}}catch{return {result:!1,data:i}}}function m(){o.value.$clearExternalErrors(),u.value.forEach(i=>{i.$clearExternalErrors();});}function O(i=!0){let c=u.value.map(g=>{if(Ke(g))return g.$extractDirtyFields(i)});return i&&(c=c.filter(g=>q(g)?!J(g):!!g)),c}function X(){x(),Ye(e,v),P();}let{$shortcuts:H,...Y}=S;return vue.reactive({$field:o,...Y,...H,$each:u,$value:e,$validate:M,$unwatch:x,$watch:j,$touch:A,$reset:P,$resetAll:X,$extractDirtyFields:O,$clearExternalErrors:m})}function Fe({scopeRules:e,state:t,customMessages:r,path:n="",rootRules:a,storage:l,options:s,externalErrors:v,validationGroups:D,initialState:E,shortcuts:T,fieldName:S}){let h=vue.effectScope(),y,C=[],R=null,G=null,d=null;async function u(i=!0){let c=Object.fromEntries(Object.entries(e.value).map(([f,W])=>{if(W){let p=vue.toRef(t.value,f);vue.triggerRef(p);let V=vue.toRef(()=>W),F=vue.toRef(v?.value,f);return [f,ye({state:p,rulesDef:V,customMessages:r,path:n?`${n}.${f}`:f,storage:l,options:s,externalErrors:F,initialState:E?.[f],shortcuts:T,fieldName:f})]}return []}).filter(f=>!!f.length&&f[1]!=null)),g=Object.fromEntries(Object.entries(vue.unref(v)??{}).filter(([f])=>!(f in e.value)).map(([f,W])=>{if(W){let p=vue.toRef(t.value,f);return [f,ye({state:p,rulesDef:vue.computed(()=>({})),customMessages:r,path:n?`${n}.${f}`:f,storage:l,options:s,externalErrors:vue.toRef(v?.value??{},f),initialState:E?.[f],shortcuts:T,fieldName:f})]}return []})),b=Object.fromEntries(Object.entries(t.value).filter(([f])=>!(f in e.value)&&!(f in(g.value??{}))).map(([f,W])=>{let p=vue.toRef(t.value,f);return [f,ye({state:p,rulesDef:vue.computed(()=>({})),customMessages:r,path:n?`${n}.${f}`:f,storage:l,options:s,externalErrors:vue.toRef(v?.value??{},f),initialState:E?.[f],shortcuts:T,fieldName:f})]}));$.value={...c,...g,...b},i&&P();}let $=l.getFieldsEntry(n);u();function N(){G?.(),Object.values($.value).forEach(i=>{i.$reset();}),A();}function j(i=!0){Object.values($.value).forEach(c=>{c.$touch(i);});}async function x(){try{let i=t.value;return {result:(await Promise.allSettled(Object.values($.value).map(b=>b.$validate()))).every(b=>b.status==="fulfilled"?b.value.result===!0:!1),data:i}}catch{return {result:!1,data:t.value}}}function A(){v?.value&&(G=vue.watch(v,()=>{M(),u();},{deep:!0}));}function P(){a&&(R=vue.watch(a,()=>{M(),u();},{deep:!0,flush:"post"}),A()),d=vue.watch(t,()=>{M(),u(),j();},{flush:"sync"}),y=h.run(()=>{let i=vue.computed(()=>!!Object.entries($.value).length&&Object.entries($.value).every(([_,I])=>I?.$dirty)),c=vue.computed(()=>Object.entries($.value).some(([_,I])=>I?.$dirty)),g=vue.computed(()=>Object.entries($.value).some(([_,I])=>I?.$invalid)),b=vue.computed(()=>Object.entries($.value).every(([_,I])=>I?.$valid)),f=vue.computed(()=>i.value&&!p.value&&g.value),W=vue.computed(()=>vue.unref(s.autoDirty)?c.value&&!(g.value||p.value):!(g.value||p.value)),p=vue.computed(()=>Object.entries($.value).some(([_,I])=>I?.$pending)),V=vue.computed(()=>Object.fromEntries(Object.entries($.value).map(([_,I])=>[_,I?.$errors]))),F=vue.computed(()=>Object.fromEntries(Object.entries($.value).map(([_,I])=>[_,I?.$silentErrors]))),B=vue.computed(()=>S);function K(){T?.nested&&Object.entries(T.nested).forEach(([_,I])=>{let k=vue.effectScope();w[_]=k.run(()=>{let se=vue.ref();return vue.watchEffect(()=>{se.value=I({$dirty:i.value,$value:t,$error:f.value,$pending:p.value,$invalid:g.value,$valid:b.value,$ready:W.value,$anyDirty:c.value,$name:B.value,$silentErrors:F.value,$errors:V.value,$fields:$.value});}),se}),C.push(k);});}let oe=vue.computed(()=>D?Object.fromEntries(Object.entries(D?.($.value)??{}).map(([_,I])=>I.length?[_,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(k=>[k,ke(I,k)])),...Object.fromEntries(["$errors","$silentErrors"].map(k=>[k,He(I,k)]))}]:[])):{}),w={};return K(),{$dirty:i,$anyDirty:c,$invalid:g,$valid:b,$error:f,$pending:p,$errors:V,$silentErrors:F,$ready:W,$name:B,$shortcuts:w,$groups:oe}});}function M(){R?.(),G?.(),d?.(),C.forEach(i=>i.stop()),C=[],$.value&&Object.entries($.value).forEach(([i,c])=>{c.$unwatch();});}function m(){Object.entries($.value).forEach(([i,c])=>{c.$clearExternalErrors();});}function O(){M(),ce(t,E??{}),u(!1),N(),P();}function X(i=!0){let c=Object.entries($.value).map(([g,b])=>[g,b.$extractDirtyFields(i)]);return i&&(c=c.filter(([g,b])=>q(b)?!J(b):Array.isArray(b)?b.length:!!b)),Object.fromEntries(c)}let{$shortcuts:H,...Y}=y;return vue.reactive({...Y,...H,$fields:$,$value:t,$resetAll:O,$reset:N,$touch:j,$validate:x,$unwatch:M,$watch:P,$clearExternalErrors:m,$extractDirtyFields:X})}function ye({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:s,index:v,initialState:D,shortcuts:E,onUnwatch:T,fieldName:S}){return Xe(t,e)?nt({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,index:v,externalErrors:s,initialState:D,fieldName:S,shortcuts:E}):Qe(e,t)&&ze(e)?Fe({scopeRules:t,state:e,customMessages:r,path:n,storage:a,options:l,index:v,initialState:D,shortcuts:E,fieldName:S,externalErrors:s}):Ze(t)?be({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,index:v,externalErrors:s,onUnwatch:T,shortcuts:E,initialState:D,fieldName:S}):null}function je({initialState:e,options:t,scopeRules:r,state:n,customRules:a,shortcuts:l}){let s=we();return vue.reactive(Fe({rootRules:r,scopeRules:r,state:n,customMessages:a?.(),storage:s,options:t,externalErrors:t.externalErrors,validationGroups:t.validationGroups,initialState:e,shortcuts:l,fieldName:"root"}))}function Ve(e,t,r){let n={autoDirty:t?.autoDirty??!0,lazy:t?.lazy??!1,rewardEarly:t?.rewardEarly??!1,clearExternalErrorsOnChange:t?.clearExternalErrorsOnChange??!0};function a(l,s,v){let D=vue.isRef(s)?s:vue.computed(typeof s=="function"?s:()=>s),E={...n,...v},T=vue.isRef(l)?l:vue.ref(l),S=te(vue.toRaw(T.value));return {r$:je({scopeRules:D,state:T,options:E,initialState:S,customRules:e,shortcuts:r})}}return a}var ut=Ve();function _e(){function e(t,r){return r}return e}var Ge=_e();function it({rules:e,modifiers:t,shortcuts:r}){let n=Ve(e,t,r),a=_e();return {useRegle:n,inferRules:a}}
2
- exports.InternalRuleType=De;exports.createRule=Ce;exports.defineRegleConfig=it;exports.inferRules=Ge;exports.unwrapRuleParameters=L;exports.useRegle=ut;
1
+ 'use strict';var vue=require('vue');var xe=(t=>(t.Inline="__inline",t.Async="__async",t))(xe||{});function ke(e,r){return e.some(t=>t[r])}function qe(e,r){return e.reduce((t,a)=>{let n=a[r]||[];return t.concat(n)},[])}function k(e){return e.map(r=>r instanceof Function?r():vue.unref(r))}function ze(e){return e.map(r=>r instanceof Function||vue.isRef(r)?r:vue.toRef(()=>r))}function Je(e){let a=e.toString().replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").match(/^(?:async\s*)?(?:function\b.*?\(|\((.*?)\)|(\w+))\s*=>|\((.*?)\)\s*=>|function.*?\((.*?)\)|\((.*?)\)/);return a?(a[0]||a[1]||a[2]||a[3]||a[4]||"").split(",").map(d=>d.trim()).filter(d=>d.length>0).length:0}function De(e,...r){let{validator:t,type:a}=e,n=a==="__async"||t.constructor.name==="AsyncFunction";return {...{validator(v,...c){return e.validator(v,...k(c.length?c:r))},message(v,c){return typeof e.message=="function"?e.message(v,{...c,$params:k(c.$params?.length?c.$params:r)}):e.message},active(v,c){return typeof e.active=="function"?e.active(v,{...c,$params:k(c.$params?.length?c.$params:r)}):e.active??!0},tooltip(v,c){return typeof e.tooltip=="function"?e.tooltip(v,{...c,$params:k(c.$params?.length?c.$params:r)}):e.tooltip??[]},exec(v){let c=e.validator(v,...k(r)),g;return c instanceof Promise?c.then(w=>(g=w,typeof g=="object"&&"$valid"in g?g.$valid:typeof g=="boolean"?g:!1)):(g=c,typeof g=="object"&&"$valid"in g?g.$valid:typeof g=="boolean"?g:!1)}},_validator:e.validator,_message:e.message,_active:e.active,_tooltip:e.tooltip,_type:e.type,_patched:!1,_async:n,_params:ze(r)}}function Ce(e){if(typeof e.validator=="function"){let t=De(e,...[]),a=e.validator.constructor.name==="AsyncFunction";if(Je(e.validator)>1){let n=function(...s){return De(e,...s)};return n.validator=t.validator,n.message=t.message,n.active=t.active,n.tooltip=t.tooltip,n.type=t.type,n.exec=t.exec,n._validator=t.validator,n._message=t.message,n._active=t.active,n._tooltip=t.tooltip,n._type=e.type,n._patched=!1,n._async=a,n}else return t}throw new Error("Validator must be a function")}function q(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ye(e){return q(e.value)}function ee(e){let r=e,t={}.toString.call(e).slice(8,-1);if(t=="Set"&&(r=new Set([...e].map(a=>ee(a)))),t=="Map"&&(r=new Map([...e].map(a=>[ee(a[0]),ee(a[1])]))),t=="Date"&&(r=new Date(e.getTime())),t=="RegExp"&&(r=RegExp(e.source,ht(e))),t=="Array"||t=="Object"){r=Array.isArray(e)?[]:{};for(let a in e)r[a]=ee(e[a]);}return r}function ht(e){if(typeof e.source.flags=="string")return e.source.flags;{let r=[];return e.global&&r.push("g"),e.ignoreCase&&r.push("i"),e.multiline&&r.push("m"),e.sticky&&r.push("y"),e.unicode&&r.push("u"),r.join("")}}function Ie(e,r,t){return e instanceof Function?e(r,t??0):e}function Qe(e,r){vue.isRef(e)?e.value=r:e=r;}function Xe(e,r){vue.isRef(e)?e.value=[]:e=[],r.forEach((t,a)=>{let n=vue.isRef(e)?e.value[a]:e[a];n={},ie(n,r[a]);});}function ie(e,r){Object.entries({...vue.unref(e),...r}).forEach(([t,a])=>{let n=vue.isRef(e)?e.value:e,s=vue.isRef(r[t])?r[t]._value:r[t],d=vue.isRef(n[t])?n[t].value:n[t];Array.isArray(n[t])?(n[t]=[],Array.isArray(s)&&s.forEach((v,c)=>{n[t][c]={},ie(n[t][c],s[c]);})):q(s)?ie(d,s):vue.isRef(n[t])?n[t].value=s:n[t]=s;});}function ge(e,r,t){let a,n=(...s)=>new Promise(d=>{clearTimeout(a),a=setTimeout(()=>{a=void 0,Promise.resolve(e.apply(this,[...s])).then(d);},r);});return n.cancel=()=>{clearTimeout(a),a=void 0;},n}function Tt(e,r){let t=String(e).split("."),a=String(r).split(".");for(let n=0;n<Math.min(t.length,a.length);n++){let s=Number(t[n]),d=Number(a[n]);if(s>d)return 1;if(d>s)return -1;if(!isNaN(s)&&isNaN(d))return 1;if(isNaN(s)&&!isNaN(d))return -1}return 0}var $e=Tt(vue.version,"3.5.0")!==-1;function Et(){return Math.floor(Math.random()*Date.now()).toString()}function Se(){return typeof window>"u"?Et():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(10)}function Pe(){let e=vue.shallowRef(new Map),r=vue.shallowRef(new Map),t=vue.shallowRef(new Map),a=vue.shallowRef(new Map),n=vue.shallowRef(new Map),s=vue.shallowRef(new Map);function d(u){let i=r.value.get(u);if(i)return i;{let f=vue.ref({});return r.value.set(u,f),f}}function v(u){let i=t.value.get(u);if(i)return i;{let f=vue.ref([]);return t.value.set(u,f),f}}function c(u,i,f){s.value.set(`${u}-${i}`,f);}function g(u,i){return s.value.get(`${u}-${i}`)}function w(u,i){u&&i!=null&&s.value.delete(`${u}-${i}`);}function G(u,i){a.value.set(u,i);}function C(u){return a.value.get(u)??!1}function R(u,i){e.value.set(u,i);}function x(u,i){let f=e.value.get(u);return f?p(i,f)?{valid:!0}:{valid:!1}:void 0}function p(u,i){let f=Object.keys(i),j=Object.keys(u);return j.length!==f.length||!j.every(O=>f.includes(O))?!1:j.every(O=>{let b=u[O],A=i[O];return !A||!b||typeof b=="function"||typeof A=="function"||typeof b=="number"||typeof b=="boolean"?!1:b._params?b._params?.every((I,L)=>{if(typeof A=="number"||typeof A=="boolean")return !0;{let y=k(A._params),P=k(b._params);return y?.[L]===P?.[L]}}):!0})}function F(u){let i=n.value.get(u);if(i)return i;{let f=vue.ref(!1),j=vue.ref(!0),V=vue.ref({}),O=vue.ref(!1);return n.value.set(u,{$pending:f,$valid:j,$metadata:V,$validating:O}),{$pending:f,$valid:j,$metadata:V,$validating:O}}}return vue.onScopeDispose(()=>{e.value.clear(),r.value.clear(),t.value.clear(),a.value.clear(),n.value.clear(),s.value.clear();}),{addRuleDeclEntry:R,setDirtyEntry:G,checkRuleDeclEntry:x,getDirtyState:C,trySetRuleStatusRef:F,getFieldsEntry:d,getCollectionsEntry:v,getArrayStatus:g,addArrayStatus:c,deleteArrayStatus:w,arrayStatusStorage:s}}function Y(e){return e==null?!0:e instanceof Date?isNaN(e.getTime()):Array.isArray(e)?!1:typeof e=="object"&&e!=null?Object.keys(e).length===0:!String(e).length}function Ze(e,r){return q(e.value)&&q(r.value)&&!Object.entries(r.value).some(t=>ce(t))}function Ke(e,r){return !!e.value&&"$each"in e.value||Array.isArray(r.value)}function et(e){return !!e.value&&q(e.value)}function ce(e){return q(e)&&"_validator"in e}function fe(e){return typeof e.value!="function"}function tt(e){return q(e)&&"$fields"in e}function Oe({field:e,silent:r=!1}){return Object.entries(e.$rules??{}).map(([t,a])=>r||!a.$valid&&e.$dirty&&!a.$validating?a.$message:null).filter(t=>!!t).reduce((t,a)=>typeof a=="string"?t?.concat([a]):t?.concat(a),[]).concat(e.$dirty?e.$externalErrors??[]:[])}function rt({field:e}){return Object.entries(e.$rules??{}).map(([r,t])=>t.$tooltip).filter(r=>!!r).reduce((r,t)=>typeof t=="string"?r?.concat([t]):r?.concat(t),[])}function at({$dirty:e,customMessages:r,rule:t,ruleKey:a,state:n,path:s,storage:d,$debounce:v}){let c=vue.effectScope(),g,w,G=vue.ref(!1),{$pending:C,$valid:R,$metadata:x,$validating:p}=d.trySetRuleStatusRef(`${s}.${a}`);function F(){g=c.run(()=>{let b=vue.computed(()=>({$invalid:!R.value,$params:D.value,...x.value})),A=vue.computed(()=>fe(t)?typeof t.value.active=="function"?t.value.active(n.value,b.value):!!t.value.active:!0);function I(o){let m="",l=r?r[a]?.[o]:void 0;return l&&(typeof l=="function"?m=l(n.value,b.value):m=l),fe(t)&&(l&&!t.value._patched||(typeof t.value[o]=="function"?m=t.value[o](n.value,b.value):m=t.value[o]??"")),m}let L=vue.computed(()=>{let o=I("message");return Y(o)&&(o="Error",console.warn(`No error message defined for ${s}.${a}`)),o}),y=vue.computed(()=>I("tooltip")),P=vue.computed(()=>fe(t)&&t.value.type?t.value.type:a),T=vue.computed(()=>fe(t)?t.value.validator:t.value),D=vue.computed(()=>typeof t.value=="function"?[]:k(t.value._params??[])),_=vue.computed(()=>`${s}.${P.value}`);return {$active:A,$message:L,$type:P,$validator:T,$params:D,$path:_,$tooltip:y}}),w=vue.watch(g.$params,j,{deep:!0});}F();function u(){R.value=!0,e.value&&(C.value=!0);}async function i(){let b=g.$validator.value,A=b(n.value,...g.$params.value),I=!1,L=n.value;try{u();let y;if(A instanceof Promise?y=await A:y=A,n.value!==L)return !0;if(typeof y=="boolean")I=y;else {let{$valid:P,...T}=y;I=P,x.value=T;}}catch{I=!1;}finally{C.value=!1;}return I}let f=ge(i,v??200);async function j(){try{p.value=!0;let b=!1;if(ce(t.value)&&t.value._async)b=await f();else {let A=g.$validator.value,I=A(n.value,...g.$params.value);if(I 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(I!=null)if(typeof I=="boolean")b=I;else {let{$valid:L,...y}=I;b=L,x.value=y;}}return R.value=b,b}catch{return !1}finally{p.value=!1;}}function V(){R.value=!0,x.value={},C.value=!1,p.value=!1,F();}function O(){w(),c.stop(),c=vue.effectScope();}return vue.reactive({...g,$pending:C,$valid:R,$metadata:x,$haveAsync:G,$validating:p,$validate:j,$unwatch:O,$watch:F,$reset:V})}function be({state:e,rulesDef:r,customMessages:t,path:a,fieldName:n,storage:s,options:d,externalErrors:v,onUnwatch:c,$isArray:g,initialState:w,shortcuts:G}){let C=vue.effectScope(),R,x=[],p=vue.ref(!1),F=vue.ref(!1),u,i,f,j,V=()=>{};function O(){let $=r.value,W=s.checkRuleDeclEntry(a,$);P.value=Object.fromEntries(Object.entries($).filter(([H])=>H.startsWith("$"))),y.value=Object.fromEntries(Object.entries(r.value).filter(([H])=>!H.startsWith("$")).map(([H,U])=>{if(U){let M=vue.toRef(()=>U);return [H,at({$dirty:p,customMessages:t,rule:M,ruleKey:H,state:e,path:a,storage:s,$debounce:P.value.$debounce})]}return []}).filter(H=>!!H.length)),I(),b(),W?.valid!=null&&(p.value=s.getDirtyState(a),p.value&&V()),s.addRuleDeclEntry(a,$);}function b(){V=R.$debounce.value?ge(L,R.$debounce.value??R.$haveAnyAsyncRule?100:0):L;}function A(){y.value&&Object.entries(y.value).forEach(([$,W])=>{W.$unwatch();}),f(),p.value&&s.setDirtyEntry(a,p.value),u?.(),i?.(),C.stop(),C=vue.effectScope(),x.forEach($=>$.stop()),x=[],c?.(),j?.();}function I(){y.value&&Object.entries(y.value).forEach(([$,W])=>{W.$watch();}),R=C.run(()=>{let $=vue.computed(()=>p.value),W=vue.computed(()=>P.value.$debounce),H=vue.computed(()=>P.value.$lazy!=null?P.value.$lazy:vue.unref(d.lazy)),U=vue.computed(()=>E.value===!0?!1:P.value.$rewardEarly!=null?P.value.$rewardEarly:vue.unref(d.rewardEarly)),M=vue.computed(()=>P.value.$clearExternalErrorsOnChange!=null?P.value.$clearExternalErrorsOnChange:vue.unref(d.clearExternalErrorsOnChange)),E=vue.computed(()=>P.value.$autoDirty!=null?P.value.$autoDirty:vue.unref(d.autoDirty)),h=vue.computed(()=>Object.entries(y.value).some(([X,K])=>K.$validating)),Z=vue.computed(()=>ve.value&&!ye.value&&p.value),se=vue.computed(()=>Z.value?Oe({field:{$dirty:p.value,$externalErrors:v?.value,$rules:y.value}}):[]),ue=vue.computed(()=>Z.value?rt({field:{$rules:y.value}}):[]),Ne=vue.computed(()=>Oe({field:{$dirty:p.value,$externalErrors:v?.value,$rules:y.value},silent:!0})),We=vue.computed(()=>!(ve.value||ye.value)),ye=vue.computed(()=>F.value||!U.value?Object.entries(y.value).some(([X,K])=>K.$pending):!1),ve=vue.computed(()=>v?.value?.length?!0:Y(y.value)?!1:!U.value||U.value&&F.value?Object.entries(y.value).some(([X,K])=>!K.$valid):!1),Ue=vue.computed(()=>n),Ee=vue.computed(()=>v?.value?.length||Y(y.value)?!1:p.value&&!Y(e.value)&&!h.value?Object.values(y.value).every(X=>X.$valid&&X.$active):!1),mt=vue.computed(()=>Object.entries(y.value).some(([X,K])=>K.$haveAsync));function yt(){G?.fields&&Object.entries(G.fields).forEach(([X,K])=>{let He=vue.effectScope();Be[X]=He.run(()=>{let Le=vue.ref();return vue.watchEffect(()=>{Le.value=K(vue.reactive({$dirty:p,$externalErrors:v?.value??[],$value:e,$rules:y,$error:Z,$pending:ye,$invalid:ve,$valid:Ee,$errors:se,$ready:We,$silentErrors:Ne,$anyDirty:$,$tooltips:ue,$name:Ue}));}),Le}),x.push(He);});}let Be={};return yt(),vue.watch(Ee,X=>{X&&(F.value=!1);}),{$error:Z,$pending:ye,$invalid:ve,$valid:Ee,$debounce:W,$lazy:H,$errors:se,$ready:We,$silentErrors:Ne,$rewardEarly:U,$autoDirty:E,$clearExternalErrorsOnChange:M,$anyDirty:$,$name:Ue,$haveAnyAsyncRule:mt,$shortcuts:Be,$validating:h,$tooltips:ue}}),u=vue.watch(e,()=>{R.$autoDirty.value&&(p.value||(p.value=!0)),r.value instanceof Function&&O(),(R.$autoDirty.value||R.$rewardEarly.value&&R.$error.value)&&V(),R.$rewardEarly.value!==!0&&R.$clearExternalErrorsOnChange.value&&l();},{deep:g?!0:$e?1:!0}),f=vue.watch(p,()=>{s.setDirtyEntry(a,p.value);}),i=vue.watch(R.$valid,$=>{R.$rewardEarly.value&&$&&(F.value=!1);}),j=vue.watch(R.$haveAnyAsyncRule,b);}function L(){Object.values(y.value).forEach($=>{$.$validate();});}let y=vue.ref(),P=vue.ref();O();function T(){l(),p.value=!1,Object.entries(y.value).forEach(([$,W])=>{W.$reset();}),!R.$lazy.value&&R.$autoDirty.value&&Object.values(y.value).forEach($=>$.$validate());}function D($=!0,W=!1){p.value||(p.value=!0),W&&$?(R.$autoDirty.value||R.$rewardEarly.value&&R.$error.value)&&V():$&&V();}async function _(){try{let $=e.value;if(F.value=!0,!p.value)p.value=!0;else if(R.$autoDirty.value&&p.value&&!R.$pending.value)return {result:!R.$error.value,data:$};return Y(y.value)?{result:!0,data:$}:{result:(await Promise.allSettled(Object.entries(y.value).map(([U,M])=>M.$validate()))).every(U=>U.status==="fulfilled"?U.value===!0:!1),data:$}}catch{return {result:!1,data:e.value}}}function o(){A(),e.value=Qe(e,w),T();}function m($=!0){return p.value?e.value:null}function l(){v?.value?.length&&(v.value=[]);}!R.$lazy.value&&!p.value&&R.$autoDirty.value&&V();let{$shortcuts:S,$validating:N,...J}=R;return vue.reactive({$dirty:p,...J,$externalErrors:v,$value:e,$rules:y,...S,$reset:T,$touch:D,$validate:_,$unwatch:A,$watch:I,$resetAll:o,$extractDirtyFields:m,$clearExternalErrors:l})}function Ae({$id:e,path:r,index:t,options:a,storage:n,stateValue:s,customMessages:d,rules:v,externalErrors:c,initialState:g,shortcuts:w,fieldName:G}){let C=v.$key?v.$key:Se(),R=`${r}.${String(C)}`;typeof s.value=="object"&&s.value!=null&&(s.value.$id?R=`${r}.${s.value.$id}`:Object.defineProperties(s.value,{$id:{value:C,enumerable:!1,configurable:!1,writable:!1}}));let x=de({state:s,rulesDef:vue.toRef(()=>v),customMessages:d,path:R,storage:n,options:a,externalErrors:vue.toRef(c?.value??[],t),initialState:g?.[t],shortcuts:w,fieldName:G});if(x){let p=s.value?.$id;x.$id=p??String(C),n.addArrayStatus(e,x.$id,x);}return x}function ut({state:e,rulesDef:r,customMessages:t,path:a,storage:n,options:s,externalErrors:d,initialState:v,shortcuts:c,fieldName:g}){let w=vue.effectScope(),G,C=vue.effectScope(),R,x=[];if(!Array.isArray(e.value)&&!r.value.$each)return null;let p=vue.ref(),F=vue.ref(e.value),u,i=vue.ref({}),f=n.getCollectionsEntry(a);R=C.run(()=>({isPrimitiveArray:vue.computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(m=>typeof m!="object"):r.value.$each&&!(r.value.$each instanceof Function)?Object.values(r.value.$each).every(m=>ce(m)):!1)})),j(),O();function j(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(p.value=Se(),Object.defineProperties(e.value,{$id:{value:p.value,enumerable:!1,configurable:!1,writable:!1}})):e.value?.$id&&(p.value=e.value.$id)),!R.isPrimitiveArray.value&&(F.value=i.value.$value,Array.isArray(e.value)?f.value=e.value.map((o,m)=>{let l=Ie(r.value.$each,vue.toRef(()=>o),m),S=Ae({$id:p.value,path:a,customMessages:t,rules:l??{},stateValue:vue.toRef(()=>o),index:m,options:s,storage:n,externalErrors:vue.toRef(d?.value??{},"$each"),initialState:v?.[m],shortcuts:c,fieldName:g});return S||null}).filter(o=>!!o):f.value=[],i.value=be({state:e,rulesDef:r,customMessages:t,path:a,storage:n,options:s,externalErrors:vue.toRef(d?.value??{},"$self"),$isArray:!0,initialState:v,shortcuts:c,fieldName:g}));}function V(){if(Array.isArray(e.value)){let o=ee(f.value);f.value=e.value.map((m,l)=>{let S=vue.toRef(()=>m);if(m.$id&&f.value.find(N=>N.$id===m.$id)){let N=n.getArrayStatus(p.value,m.$id);return N?(N.$value=S,N):null}else {let N=Ie(r.value.$each,S,l);if(N){let J=Ae({$id:p.value,path:a,customMessages:t,rules:N,stateValue:S,index:l,options:s,storage:n,externalErrors:vue.toRef(d?.value??{},"$each"),initialState:v?.[l],shortcuts:c,fieldName:g});return J||null}}}).filter(m=>!!m),o.filter(m=>!e.value.find(l=>m.$id===l.$id)).forEach((m,l)=>{n.deleteArrayStatus(p.value,l.toString());});}else f.value=[];}function O(){u=vue.watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")?j():V();},{deep:$e?1:!0,flush:"pre"}),G=w.run(()=>{let o=vue.computed(()=>i.value.$dirty&&f.value.every(h=>h.$dirty)),m=vue.computed(()=>i.value.$anyDirty||f.value.some(h=>h.$dirty)),l=vue.computed(()=>i.value.$invalid||f.value.some(h=>h.$invalid)),S=vue.computed(()=>(Y(i.value.$rules)?!0:i.value.$valid)&&f.value.every(h=>h.$valid)),N=vue.computed(()=>i.value.$error||f.value.some(h=>h.$error)),J=vue.computed(()=>!(l.value||$.value)),$=vue.computed(()=>i.value.$pending||f.value.some(h=>h.$pending)),W=vue.computed(()=>({$self:i.value.$errors,$each:f.value.map(h=>h.$errors)})),H=vue.computed(()=>({$self:i.value.$silentErrors,$each:f.value.map(h=>h.$silentErrors)})),U=vue.computed(()=>g);function M(){c?.collections&&Object.entries(c?.collections).forEach(([h,Z])=>{let se=vue.effectScope();E[h]=se.run(()=>{let ue=vue.ref();return vue.watchEffect(()=>{ue.value=Z(vue.reactive({$dirty:o,$error:N,$pending:$,$invalid:l,$valid:S,$errors:W,$ready:J,$silentErrors:H,$anyDirty:m,$name:U,$each:f,$field:i,$value:e}));}),ue}),x.push(se);});}let E={};return M(),{$dirty:o,$anyDirty:m,$invalid:l,$valid:S,$error:N,$pending:$,$errors:W,$silentErrors:H,$ready:J,$name:U,$shortcuts:E}}),R.isPrimitiveArray.value&&(console.warn(`${a} is a Array of primitives. Tracking can be lost when reassigning the Array. We advise to use an Array of objects instead`),u());}function b(){u&&u(),i.value&&i.value.$unwatch(),f.value&&f.value.forEach(o=>{"$dirty"in o&&o.$unwatch();}),w.stop(),w=vue.effectScope(),C.stop(),C=vue.effectScope(!0),x.forEach(o=>o.stop()),x=[];}function A(o=!0,m=!1){i.value.$touch(o,m),f.value.forEach(l=>{l.$touch(o,m);});}function I(){i.value.$reset(),f.value.forEach(o=>{o.$reset();});}async function L(){let o=e.value;try{return {result:(await Promise.allSettled([i.value.$validate(),...f.value.map(S=>S.$validate())])).every(S=>S.status==="fulfilled"?S.value.result===!0:!1),data:o}}catch{return {result:!1,data:o}}}function y(){i.value.$clearExternalErrors(),f.value.forEach(o=>{o.$clearExternalErrors();});}function P(o=!0){let m=f.value.map(l=>{if(tt(l))return l.$extractDirtyFields(o)});return o&&(m=m.filter(l=>q(l)?!Y(l):!!l)),m}function T(){b(),Xe(e,v),I();}let{$shortcuts:D,..._}=G;return vue.reactive({$field:i,..._,...D,$each:f,$value:e,$validate:L,$unwatch:b,$watch:O,$touch:A,$reset:I,$resetAll:T,$extractDirtyFields:P,$clearExternalErrors:y})}function Fe({rulesDef:e,state:r,path:t="",rootRules:a,externalErrors:n,validationGroups:s,initialState:d,fieldName:v,...c}){let g=vue.effectScope(),w,G=[],C=null,R=null,x=null;async function F(T=!0){let D=Object.entries(e.value),_=Object.fromEntries(D.filter(([l,S])=>!!S).map(([l,S])=>{if(S){let N=vue.toRef(r.value,l),J=vue.toRef(()=>S),$=vue.toRef(n?.value??{},l);return [l,de({state:N,rulesDef:J,path:t?`${t}.${l}`:l,externalErrors:$,initialState:d?.[l],fieldName:l,...c})]}return []})),o=Object.fromEntries(Object.entries(vue.unref(n)??{}).filter(([l,S])=>!(l in e.value)&&!!S).map(([l])=>{let S=vue.toRef(r.value,l);return [l,de({state:S,rulesDef:vue.computed(()=>({})),path:t?`${t}.${l}`:l,externalErrors:vue.toRef(n?.value??{},l),initialState:d?.[l],fieldName:l,...c})]})),m=Object.fromEntries(Object.entries(r.value).filter(([l])=>!(l in e.value)&&!(l in(o.value??{}))).map(([l])=>{let S=vue.toRef(r.value,l);return [l,de({state:S,rulesDef:vue.computed(()=>({})),path:t?`${t}.${l}`:l,externalErrors:vue.toRef(n?.value??{},l),initialState:d?.[l],fieldName:l,...c})]}));u.value={..._,...o,...m},T&&V();}let u=c.storage.getFieldsEntry(t);F();function i(){R?.(),Object.values(u.value).forEach(T=>{T.$reset();}),j();}function f(T=!0,D=!1){Object.values(u.value).forEach(_=>{_.$touch(T,D);});}function j(){n?.value&&(R=vue.watch(n,()=>{O(),F();},{deep:!0}));}function V(){a&&(C=vue.watch(a,()=>{O(),F();},{deep:!0,flush:"post"}),j()),x=vue.watch(r,()=>{O(),F(),f(!0,!0);},{flush:"sync"}),w=g.run(()=>{let T=vue.computed(()=>!!Object.entries(u.value).length&&Object.entries(u.value).every(([M,E])=>E?.$dirty)),D=vue.computed(()=>Object.entries(u.value).some(([M,E])=>E?.$dirty)),_=vue.computed(()=>Object.entries(u.value).some(([M,E])=>E?.$invalid)),o=vue.computed(()=>Object.entries(u.value).every(([M,E])=>E?.$valid)),m=vue.computed(()=>D.value&&!S.value&&_.value),l=vue.computed(()=>vue.unref(c.options.autoDirty)?D.value&&!(_.value||S.value):!(_.value||S.value)),S=vue.computed(()=>Object.entries(u.value).some(([M,E])=>E?.$pending)),N=vue.computed(()=>Object.fromEntries(Object.entries(u.value).map(([M,E])=>[M,E?.$errors]))),J=vue.computed(()=>Object.fromEntries(Object.entries(u.value).map(([M,E])=>[M,E?.$silentErrors]))),$=vue.computed(()=>v);function W(){c.shortcuts?.nested&&Object.entries(c.shortcuts.nested).forEach(([M,E])=>{let h=vue.effectScope();U[M]=h.run(()=>{let Z=vue.ref();return vue.watchEffect(()=>{Z.value=E(vue.reactive({$dirty:T,$value:r,$error:m,$pending:S,$invalid:_,$valid:o,$ready:l,$anyDirty:D,$name:$,$silentErrors:J,$errors:N,$fields:u}));}),Z}),G.push(h);});}let H=vue.computed(()=>s?Object.fromEntries(Object.entries(s?.(u.value)??{}).map(([M,E])=>E.length?[M,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(h=>[h,ke(E,h)])),...Object.fromEntries(["$errors","$silentErrors"].map(h=>[h,qe(E,h)]))}]:[])):{}),U={};return W(),{$dirty:T,$anyDirty:D,$invalid:_,$valid:o,$error:m,$pending:S,$errors:N,$silentErrors:J,$ready:l,$name:$,$shortcuts:U,$groups:H}});}function O(){C?.(),R?.(),x?.(),G.forEach(T=>T.stop()),G=[],u.value&&Object.entries(u.value).forEach(([T,D])=>{D.$unwatch();});}function b(){Object.entries(u.value).forEach(([T,D])=>{D.$clearExternalErrors();});}function A(){O(),ie(r,d??{}),F(!1),i(),V();}function I(T=!0){let D=Object.entries(u.value).map(([_,o])=>[_,o.$extractDirtyFields(T)]);return T&&(D=D.filter(([_,o])=>q(o)?!Y(o):Array.isArray(o)?o.length:!!o)),Object.fromEntries(D)}async function L(){try{let T=r.value;return {result:(await Promise.allSettled(Object.values(u.value).map(o=>o.$validate()))).every(o=>o.status==="fulfilled"?o.value.result===!0:!1),data:T}}catch{return {result:!1,data:r.value}}}let{$shortcuts:y,...P}=w;return vue.reactive({...P,...y,$fields:u,$value:r,$resetAll:A,$reset:i,$touch:f,$validate:L,$unwatch:O,$watch:V,$clearExternalErrors:b,$extractDirtyFields:I})}function de({rulesDef:e,externalErrors:r,...t}){return Ke(e,t.state)?ut({rulesDef:e,externalErrors:r,...t}):Ze(t.state,e)&&Ye(t.state)?Fe({rulesDef:e,externalErrors:r,...t}):et(e)?be({rulesDef:e,externalErrors:r,...t}):null}function je({initialState:e,options:r,scopeRules:t,state:a,customRules:n,shortcuts:s}){let d=Pe();return vue.reactive(Fe({rootRules:t,rulesDef:t,state:a,customMessages:n?.(),storage:d,options:r,externalErrors:r.externalErrors,validationGroups:r.validationGroups,initialState:e,shortcuts:s,fieldName:"root",path:""}))}function Ve(e,r,t){let a={autoDirty:r?.autoDirty??!0,lazy:r?.lazy??!1,rewardEarly:r?.rewardEarly??!1,clearExternalErrorsOnChange:r?.clearExternalErrorsOnChange??!0};function n(s,d,v){let c=vue.isRef(d)?d:vue.computed(typeof d=="function"?d:()=>d),g={...a,...v},w=vue.isRef(s)?s:vue.ref(s),G=ee(vue.toRaw(w.value));return {r$:je({scopeRules:c,state:w,options:g,initialState:G,customRules:e,shortcuts:t})}}return n}var pt=Ve();function _e(){function e(r,t){return t}return e}var Ge=_e();function dt({rules:e,modifiers:r,shortcuts:t}){let a=Ve(e,r,t),n=_e();return {useRegle:a,inferRules:n}}
2
+ exports.InternalRuleType=xe;exports.createRule=Ce;exports.defineRegleConfig=dt;exports.inferRules=Ge;exports.unwrapRuleParameters=k;exports.useRegle=pt;
package/dist/index.d.cts CHANGED
@@ -7,6 +7,7 @@ type Maybe<T = any> = T | null | undefined;
7
7
  type MaybeGetter<T, V = any, TAdd extends Record<string, any> = {}> = T | ((value: Ref<V>, index: number) => T & TAdd);
8
8
  type Unwrap<T extends MaybeRef<Record<string, any>>> = T extends Ref ? UnwrapRef<T> : UnwrapNestedRefs<T>;
9
9
  type ExtractFromGetter<T extends MaybeGetter<any, any, any>> = T extends ((value: Ref<any>, index: number) => infer U extends Record<string, any>) ? U : T;
10
+ type ExtendOnlyRealRecord<T extends unknown> = NonNullable<T> extends File | Date ? false : NonNullable<T> extends Record<string, any> ? true : false;
10
11
  type OmitByType<T extends Record<string, any>, U> = {
11
12
  [K in keyof T as T[K] extends U ? never : K]: T[K];
12
13
  };
@@ -310,14 +311,22 @@ type CheckDeepExact<T, U> = [U] extends [never] ? false : T extends RegleCollect
310
311
  type DeepReactiveState<T extends Record<string, any>> = {
311
312
  [K in keyof T]: MaybeRef<T[K]>;
312
313
  };
313
- type DeepSafeFormState<TState extends Record<string, any>, TRules extends ReglePartialRuleTree<TState, CustomRulesDeclarationTree>> = [unknown] extends [TState] ? {} : {
314
- [K in keyof TState as [SafeProperty<TState[K], TRules[K]>] extends [never] ? K : never]?: [
315
- SafeProperty<TState[K], TRules[K]>
316
- ] extends [never] ? TState[K] : SafeProperty<TState[K], TRules[K]>;
314
+ type DeepSafeFormState<TState extends Record<string, any>, TRules extends ReglePartialRuleTree<TState, CustomRulesDeclarationTree>> = [unknown] extends [TState] ? {} : Prettify<{
315
+ [K in keyof TState as IsPropertyOutputRequired<TState[K], TRules[K]> extends false ? K : never]?: SafeProperty<TState[K], TRules[K]>;
317
316
  } & {
318
- [K in keyof TState as [SafeProperty<TState[K], TRules[K]>] extends [never] ? never : K]-?: SafeProperty<TState[K], TRules[K]>;
319
- };
320
- 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;
317
+ [K in keyof TState as IsPropertyOutputRequired<TState[K], TRules[K]> extends false ? never : K]-?: NonNullable<SafeProperty<TState[K], TRules[K]>>;
318
+ }>;
319
+ type FieldHaveRequiredRule<TRule extends RegleRuleDecl> = unknown extends TRule['required'] ? false : TRule['required'] extends undefined ? false : TRule['required'] extends RegleRuleDefinition<any, infer Params, any, any, any> ? Params extends never[] ? true : false : false;
320
+ type ObjectHaveAtLeastOneRequiredField<TState, TRule extends ReglePartialRuleTree<any, any>> = TState extends Maybe<TState> ? {
321
+ [K in keyof TRule]: TRule[K] extends RegleRuleDecl ? FieldHaveRequiredRule<TRule[K]> : false;
322
+ }[keyof TRule] : true;
323
+ type ArrayHaveAtLeastOneRequiredField<TState, TRule extends RegleCollectionRuleDefinition<any, any>> = TState extends Maybe<TState> ? {
324
+ [K in keyof ExtractFromGetter<TRule['$each']>]: ExtractFromGetter<TRule['$each']>[K] extends RegleRuleDecl ? FieldHaveRequiredRule<ExtractFromGetter<TRule['$each']>[K]> : false;
325
+ }[keyof ExtractFromGetter<TRule['$each']>] : true;
326
+ type SafeProperty<TState, TRule extends RegleFormPropertyType<any, any> | undefined> = [unknown] extends [TState] ? unknown : TRule extends RegleCollectionRuleDefinition<any, any> ? TState extends Array<infer U extends Record<string, any>> ? DeepSafeFormState<U, ExtractFromGetter<TRule['$each']>>[] : TState : TRule extends ReglePartialRuleTree<any, any> ? ExtendOnlyRealRecord<TState> extends true ? DeepSafeFormState<NonNullable<TState> extends Record<string, any> ? NonNullable<TState> : {}, TRule> : TRule extends RegleRuleDecl<any, any> ? FieldHaveRequiredRule<TRule> extends true ? TState : Maybe<TState> : TState : TState;
327
+ type IsPropertyOutputRequired<TState, TRule extends RegleFormPropertyType<any, any> | undefined> = [
328
+ unknown
329
+ ] extends [TState] ? unknown : TRule extends RegleCollectionRuleDefinition<any, any> ? TState extends Array<any> ? ArrayHaveAtLeastOneRequiredField<TState, TRule> extends true ? true : false : false : TRule extends ReglePartialRuleTree<any, any> ? ExtendOnlyRealRecord<TState> extends true ? ObjectHaveAtLeastOneRequiredField<TState, TRule> extends true ? true : false : TRule extends RegleRuleDecl<any, any> ? FieldHaveRequiredRule<TRule> extends true ? true : false : false : false;
321
330
  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>;
322
331
 
323
332
  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>;
@@ -349,10 +358,7 @@ type CreateFn<T extends any[]> = (...args: T) => any;
349
358
  type RegleUniversalParams<T extends any[] = [], F = CreateFn<T>> = [T] extends [[]] ? [] : Parameters<F extends (...args: infer Args) => any ? (...args: {
350
359
  [K in keyof Args]: ParamDecl<Args[K]>;
351
360
  }) => any : never>;
352
- type UnwrapRegleUniversalParams<T extends ParamDecl[] = [], F = CreateFn<T>> = [T] extends [
353
- [
354
- ]
355
- ] ? [] : Parameters<F extends (...args: infer Args) => any ? (...args: {
361
+ type UnwrapRegleUniversalParams<T extends ParamDecl[] = [], F = CreateFn<T>> = [T] extends [[]] ? [] : Parameters<F extends (...args: infer Args) => any ? (...args: {
356
362
  [K in keyof Args]: Args[K] extends ParamDecl<infer U> ? U : Args[K];
357
363
  }) => any : never>;
358
364
 
@@ -363,6 +369,7 @@ interface RegleInternalRuleDefs<TValue extends any = any, TParams extends any[]
363
369
  _validator: (value: Maybe<TValue>, ...args: TParams) => TAsync extends false ? TMetadata : Promise<TMetadata>;
364
370
  _message: string | string[] | ((value: Maybe<TValue>, metadata: PossibleRegleRuleMetadataConsumer) => string | string[]);
365
371
  _active?: boolean | ((value: Maybe<TValue>, metadata: PossibleRegleRuleMetadataConsumer) => boolean);
372
+ _tooltip?: string | string[] | ((value: Maybe<TValue>, metadata: PossibleRegleRuleMetadataConsumer) => string | string[]);
366
373
  _type?: string;
367
374
  _patched: boolean;
368
375
  _params?: RegleUniversalParams<TParams>;
@@ -378,8 +385,9 @@ declare enum InternalRuleType {
378
385
  * */
379
386
  interface RegleRuleDefinition<TValue extends any = any, TParams extends any[] = [], TAsync extends boolean = boolean, TMetaData extends RegleRuleMetadataDefinition = RegleRuleMetadataDefinition, TFilteredValue extends any = TValue extends Date & File & infer M ? M : TValue> extends RegleInternalRuleDefs<TFilteredValue, TParams, TAsync, TMetaData> {
380
387
  validator: RegleRuleDefinitionProcessor<TFilteredValue, TParams, TAsync extends false ? TMetaData : Promise<TMetaData>>;
381
- message: RegleRuleDefinitionWithMetadataProcessor<TFilteredValue, PossibleRegleRuleMetadataConsumer, string | string[]>;
382
- active: RegleRuleDefinitionWithMetadataProcessor<TFilteredValue, PossibleRegleRuleMetadataConsumer, boolean>;
388
+ message: (value: Maybe<TFilteredValue>, metadata: PossibleRegleRuleMetadataConsumer) => string | string[];
389
+ active: (value: Maybe<TFilteredValue>, metadata: PossibleRegleRuleMetadataConsumer) => boolean;
390
+ tooltip: (value: Maybe<TFilteredValue>, metadata: PossibleRegleRuleMetadataConsumer) => string | string[];
383
391
  type?: string;
384
392
  exec: (value: Maybe<TFilteredValue>) => TAsync extends false ? TMetaData : Promise<TMetaData>;
385
393
  }
@@ -434,15 +442,17 @@ type RegleCollectionRuleDefinition<TValue = any[], TCustomRules extends Partial<
434
442
  $each: MaybeGetter<RegleFormPropertyType<ArrayElement<NonNullable<TValue>>, TCustomRules>, ArrayElement<TValue>>;
435
443
  } & FieldRegleBehaviourOptions);
436
444
 
445
+ type RegleInitPropertyGetter<TValue, TReturn, TParams extends [...any[]], TMetadata extends RegleRuleMetadataDefinition> = TReturn | ((value: Maybe<TValue>, metadata: RegleRuleMetadataConsumer<TParams, TMetadata>) => TReturn);
437
446
  /**
438
447
  * @argument
439
448
  * createRule arguments options
440
449
  */
441
450
  interface RegleRuleInit<TValue extends any, TParams extends [...any[]] = [], TReturn extends RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition> = boolean, TMetadata extends RegleRuleMetadataDefinition = RegleRuleMetadataDefinition, TAsync extends boolean = TReturn extends Promise<any> ? true : false> {
442
- type?: string;
443
451
  validator: (value: Maybe<TValue>, ...args: TParams) => TReturn;
444
- message: string | string[] | ((value: Maybe<TValue>, metadata: RegleRuleMetadataConsumer<TParams, TMetadata>) => string | string[]);
445
- active?: boolean | ((value: Maybe<TValue>, metadata: RegleRuleMetadataConsumer<TParams, TMetadata>) => boolean);
452
+ message: RegleInitPropertyGetter<TValue, string | string[], TParams, TMetadata>;
453
+ active?: RegleInitPropertyGetter<TValue, boolean, TParams, TMetadata>;
454
+ tooltip?: RegleInitPropertyGetter<TValue, string | string[], TParams, TMetadata>;
455
+ type?: string;
446
456
  }
447
457
  /**
448
458
  * @argument
@@ -450,8 +460,9 @@ interface RegleRuleInit<TValue extends any, TParams extends [...any[]] = [], TRe
450
460
  */
451
461
  interface RegleRuleCore<TValue extends any, TParams extends any[] = [], TAsync extends boolean = false, TMetadata extends RegleRuleMetadataDefinition = boolean> {
452
462
  validator: (value: Maybe<TValue>, ...args: TParams) => TAsync extends false ? TMetadata : Promise<TMetadata>;
453
- message: string | ((value: Maybe<TValue>, metadata: RegleRuleMetadataConsumer<TParams, TMetadata>) => string | string[]);
454
- active?: boolean | ((value: Maybe<TValue>, metadata: RegleRuleMetadataConsumer<TParams, TMetadata>) => boolean);
463
+ message: RegleInitPropertyGetter<TValue, string | string[], TParams, TMetadata>;
464
+ active?: RegleInitPropertyGetter<TValue, string | string[], TParams, TMetadata>;
465
+ tooltip?: RegleInitPropertyGetter<TValue, string | string[], TParams, TMetadata>;
455
466
  type?: string;
456
467
  }
457
468
 
@@ -491,24 +502,15 @@ type DefaultValidators = {
491
502
  ], false, boolean>;
492
503
  integer: RegleRuleDefinition<string | number, [], false, boolean, string | number>;
493
504
  ipAddress: RegleRuleDefinition<string, [], false, boolean, string>;
494
- macAddress: RegleRuleWithParamsDefinition<string, [
495
- separator?: string | undefined
496
- ], false, boolean>;
497
- maxLength: RegleRuleWithParamsDefinition<string | any[] | Record<PropertyKey, any>, [
498
- count: number
499
- ], false, boolean>;
505
+ macAddress: RegleRuleWithParamsDefinition<string, [separator?: string | undefined], false, boolean>;
506
+ maxLength: RegleRuleWithParamsDefinition<string | any[] | Record<PropertyKey, any>, [count: number], false, boolean>;
500
507
  maxValue: RegleRuleWithParamsDefinition<number, [count: number], false, boolean>;
501
- minLength: RegleRuleWithParamsDefinition<string | any[] | Record<PropertyKey, any>, [
502
- count: number
503
- ], false, boolean>;
508
+ minLength: RegleRuleWithParamsDefinition<string | any[] | Record<PropertyKey, any>, [count: number], false, boolean>;
504
509
  minValue: RegleRuleWithParamsDefinition<number, [count: number], false, boolean>;
505
510
  numeric: RegleRuleDefinition<string | number, [], false, boolean, string | number>;
506
511
  regex: RegleRuleWithParamsDefinition<string, [regexp: RegExp], false, boolean>;
507
512
  required: RegleRuleDefinition<unknown, []>;
508
- sameAs: RegleRuleWithParamsDefinition<unknown, [
509
- target: unknown,
510
- otherName?: string
511
- ], false, boolean>;
513
+ sameAs: RegleRuleWithParamsDefinition<unknown, [target: unknown, otherName?: string], false, boolean>;
512
514
  startsWith: RegleRuleWithParamsDefinition<string, [part: Maybe<string>], false, boolean>;
513
515
  url: RegleRuleDefinition<string, [], false, boolean, string>;
514
516
  };
@@ -581,15 +583,20 @@ type RegleExternalErrorTree<TState = Record<string, any> | any[]> = PartialDeep<
581
583
  }>;
582
584
  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[];
583
585
  type RegleCollectionErrors<TState extends Record<string, any>> = {
584
- readonly $errors: string[];
586
+ readonly $self: string[];
585
587
  readonly $each: RegleValidationErrors<TState>[];
586
588
  };
589
+ type PartialFormState<TState extends Record<string, any>> = [unknown] extends [TState] ? {} : Prettify<{
590
+ [K in keyof TState as ExtendOnlyRealRecord<TState[K]> extends true ? never : TState[K] extends Array<any> ? never : K]?: Maybe<TState[K]>;
591
+ } & {
592
+ [K in keyof TState as ExtendOnlyRealRecord<TState[K]> extends true ? K : TState[K] extends Array<any> ? K : never]: NonNullable<TState[K]> extends Array<infer U extends Record<string, any>> ? PartialFormState<U>[] : PartialFormState<TState[K]>;
593
+ }>;
587
594
  type RegleResult<Data extends Record<string, any> | any[] | unknown, TRules extends ReglePartialRuleTree<any>> = {
588
595
  result: false;
589
- data: Data;
596
+ data: NonNullable<Data> extends Date | File ? Maybe<Data> : NonNullable<Data> extends Array<infer U extends Record<string, any>> ? PartialFormState<U>[] : NonNullable<Data> extends Record<string, any> ? PartialFormState<NonNullable<Data>> : Maybe<Data>;
590
597
  } | {
591
598
  result: true;
592
- data: Data extends Array<infer U extends Record<string, any>> ? DeepSafeFormState<U, TRules>[] : Data extends Date | File ? SafeFieldProperty<Data, TRules> : Data extends Record<string, any> ? Prettify<DeepSafeFormState<Data, TRules>> : Data;
599
+ data: Data extends Array<infer U extends Record<string, any>> ? DeepSafeFormState<U, TRules>[] : Data extends Date | File ? SafeFieldProperty<Data, TRules> : Data extends Record<string, any> ? DeepSafeFormState<Data, TRules> : SafeFieldProperty<Data, TRules>;
593
600
  };
594
601
 
595
602
  /**
@@ -628,6 +635,7 @@ type RegleFieldStatus<TState extends any = any, TRules extends RegleFormProperty
628
635
  readonly $errors: string[];
629
636
  readonly $silentErrors: string[];
630
637
  readonly $externalErrors: string[];
638
+ readonly $tooltips: string[];
631
639
  $extractDirtyFields: (filterNullishValues?: boolean) => Maybe<TState>;
632
640
  $validate: () => Promise<RegleResult<TState, TRules>>;
633
641
  readonly $rules: {
@@ -650,7 +658,7 @@ interface RegleCommonStatus<TValue = any> {
650
658
  readonly $name: string;
651
659
  $id?: string;
652
660
  $value: UnwrapNestedRefs<TValue>;
653
- $touch(runCommit?: boolean): void;
661
+ $touch(runCommit?: boolean, withConditions?: boolean): void;
654
662
  $reset(): void;
655
663
  $resetAll: () => void;
656
664
  $unwatch(): void;
@@ -663,6 +671,7 @@ interface RegleCommonStatus<TValue = any> {
663
671
  type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata extends RegleRuleMetadataDefinition = any> = {
664
672
  readonly $type: string;
665
673
  readonly $message: string | string[];
674
+ readonly $tooltip: string | string[];
666
675
  readonly $active: boolean;
667
676
  readonly $valid: boolean;
668
677
  readonly $pending: boolean;
@@ -679,7 +688,7 @@ type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata exte
679
688
  /**
680
689
  * @public
681
690
  */
682
- 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'> & {
691
+ type RegleCollectionStatus<TState extends any[] = any[], TRules extends ReglePartialRuleTree<ArrayElement<TState>> = Record<string, any>, TFieldRule extends RegleCollectionRuleDecl<any, any> = never, TShortcuts extends RegleShortcutDefinition = {}> = Omit<RegleCommonStatus<TState>, '$value'> & {
683
692
  $value: Maybe<TState>;
684
693
  readonly $each: Array<InferRegleStatusType<NonNullable<TRules>, NonNullable<TState>, number, TShortcuts>>;
685
694
  readonly $field: RegleFieldStatus<TState, TFieldRule, TShortcuts>;
package/dist/index.d.ts CHANGED
@@ -7,6 +7,7 @@ type Maybe<T = any> = T | null | undefined;
7
7
  type MaybeGetter<T, V = any, TAdd extends Record<string, any> = {}> = T | ((value: Ref<V>, index: number) => T & TAdd);
8
8
  type Unwrap<T extends MaybeRef<Record<string, any>>> = T extends Ref ? UnwrapRef<T> : UnwrapNestedRefs<T>;
9
9
  type ExtractFromGetter<T extends MaybeGetter<any, any, any>> = T extends ((value: Ref<any>, index: number) => infer U extends Record<string, any>) ? U : T;
10
+ type ExtendOnlyRealRecord<T extends unknown> = NonNullable<T> extends File | Date ? false : NonNullable<T> extends Record<string, any> ? true : false;
10
11
  type OmitByType<T extends Record<string, any>, U> = {
11
12
  [K in keyof T as T[K] extends U ? never : K]: T[K];
12
13
  };
@@ -310,14 +311,22 @@ type CheckDeepExact<T, U> = [U] extends [never] ? false : T extends RegleCollect
310
311
  type DeepReactiveState<T extends Record<string, any>> = {
311
312
  [K in keyof T]: MaybeRef<T[K]>;
312
313
  };
313
- type DeepSafeFormState<TState extends Record<string, any>, TRules extends ReglePartialRuleTree<TState, CustomRulesDeclarationTree>> = [unknown] extends [TState] ? {} : {
314
- [K in keyof TState as [SafeProperty<TState[K], TRules[K]>] extends [never] ? K : never]?: [
315
- SafeProperty<TState[K], TRules[K]>
316
- ] extends [never] ? TState[K] : SafeProperty<TState[K], TRules[K]>;
314
+ type DeepSafeFormState<TState extends Record<string, any>, TRules extends ReglePartialRuleTree<TState, CustomRulesDeclarationTree>> = [unknown] extends [TState] ? {} : Prettify<{
315
+ [K in keyof TState as IsPropertyOutputRequired<TState[K], TRules[K]> extends false ? K : never]?: SafeProperty<TState[K], TRules[K]>;
317
316
  } & {
318
- [K in keyof TState as [SafeProperty<TState[K], TRules[K]>] extends [never] ? never : K]-?: SafeProperty<TState[K], TRules[K]>;
319
- };
320
- 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;
317
+ [K in keyof TState as IsPropertyOutputRequired<TState[K], TRules[K]> extends false ? never : K]-?: NonNullable<SafeProperty<TState[K], TRules[K]>>;
318
+ }>;
319
+ type FieldHaveRequiredRule<TRule extends RegleRuleDecl> = unknown extends TRule['required'] ? false : TRule['required'] extends undefined ? false : TRule['required'] extends RegleRuleDefinition<any, infer Params, any, any, any> ? Params extends never[] ? true : false : false;
320
+ type ObjectHaveAtLeastOneRequiredField<TState, TRule extends ReglePartialRuleTree<any, any>> = TState extends Maybe<TState> ? {
321
+ [K in keyof TRule]: TRule[K] extends RegleRuleDecl ? FieldHaveRequiredRule<TRule[K]> : false;
322
+ }[keyof TRule] : true;
323
+ type ArrayHaveAtLeastOneRequiredField<TState, TRule extends RegleCollectionRuleDefinition<any, any>> = TState extends Maybe<TState> ? {
324
+ [K in keyof ExtractFromGetter<TRule['$each']>]: ExtractFromGetter<TRule['$each']>[K] extends RegleRuleDecl ? FieldHaveRequiredRule<ExtractFromGetter<TRule['$each']>[K]> : false;
325
+ }[keyof ExtractFromGetter<TRule['$each']>] : true;
326
+ type SafeProperty<TState, TRule extends RegleFormPropertyType<any, any> | undefined> = [unknown] extends [TState] ? unknown : TRule extends RegleCollectionRuleDefinition<any, any> ? TState extends Array<infer U extends Record<string, any>> ? DeepSafeFormState<U, ExtractFromGetter<TRule['$each']>>[] : TState : TRule extends ReglePartialRuleTree<any, any> ? ExtendOnlyRealRecord<TState> extends true ? DeepSafeFormState<NonNullable<TState> extends Record<string, any> ? NonNullable<TState> : {}, TRule> : TRule extends RegleRuleDecl<any, any> ? FieldHaveRequiredRule<TRule> extends true ? TState : Maybe<TState> : TState : TState;
327
+ type IsPropertyOutputRequired<TState, TRule extends RegleFormPropertyType<any, any> | undefined> = [
328
+ unknown
329
+ ] extends [TState] ? unknown : TRule extends RegleCollectionRuleDefinition<any, any> ? TState extends Array<any> ? ArrayHaveAtLeastOneRequiredField<TState, TRule> extends true ? true : false : false : TRule extends ReglePartialRuleTree<any, any> ? ExtendOnlyRealRecord<TState> extends true ? ObjectHaveAtLeastOneRequiredField<TState, TRule> extends true ? true : false : TRule extends RegleRuleDecl<any, any> ? FieldHaveRequiredRule<TRule> extends true ? true : false : false : false;
321
330
  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>;
322
331
 
323
332
  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>;
@@ -349,10 +358,7 @@ type CreateFn<T extends any[]> = (...args: T) => any;
349
358
  type RegleUniversalParams<T extends any[] = [], F = CreateFn<T>> = [T] extends [[]] ? [] : Parameters<F extends (...args: infer Args) => any ? (...args: {
350
359
  [K in keyof Args]: ParamDecl<Args[K]>;
351
360
  }) => any : never>;
352
- type UnwrapRegleUniversalParams<T extends ParamDecl[] = [], F = CreateFn<T>> = [T] extends [
353
- [
354
- ]
355
- ] ? [] : Parameters<F extends (...args: infer Args) => any ? (...args: {
361
+ type UnwrapRegleUniversalParams<T extends ParamDecl[] = [], F = CreateFn<T>> = [T] extends [[]] ? [] : Parameters<F extends (...args: infer Args) => any ? (...args: {
356
362
  [K in keyof Args]: Args[K] extends ParamDecl<infer U> ? U : Args[K];
357
363
  }) => any : never>;
358
364
 
@@ -363,6 +369,7 @@ interface RegleInternalRuleDefs<TValue extends any = any, TParams extends any[]
363
369
  _validator: (value: Maybe<TValue>, ...args: TParams) => TAsync extends false ? TMetadata : Promise<TMetadata>;
364
370
  _message: string | string[] | ((value: Maybe<TValue>, metadata: PossibleRegleRuleMetadataConsumer) => string | string[]);
365
371
  _active?: boolean | ((value: Maybe<TValue>, metadata: PossibleRegleRuleMetadataConsumer) => boolean);
372
+ _tooltip?: string | string[] | ((value: Maybe<TValue>, metadata: PossibleRegleRuleMetadataConsumer) => string | string[]);
366
373
  _type?: string;
367
374
  _patched: boolean;
368
375
  _params?: RegleUniversalParams<TParams>;
@@ -378,8 +385,9 @@ declare enum InternalRuleType {
378
385
  * */
379
386
  interface RegleRuleDefinition<TValue extends any = any, TParams extends any[] = [], TAsync extends boolean = boolean, TMetaData extends RegleRuleMetadataDefinition = RegleRuleMetadataDefinition, TFilteredValue extends any = TValue extends Date & File & infer M ? M : TValue> extends RegleInternalRuleDefs<TFilteredValue, TParams, TAsync, TMetaData> {
380
387
  validator: RegleRuleDefinitionProcessor<TFilteredValue, TParams, TAsync extends false ? TMetaData : Promise<TMetaData>>;
381
- message: RegleRuleDefinitionWithMetadataProcessor<TFilteredValue, PossibleRegleRuleMetadataConsumer, string | string[]>;
382
- active: RegleRuleDefinitionWithMetadataProcessor<TFilteredValue, PossibleRegleRuleMetadataConsumer, boolean>;
388
+ message: (value: Maybe<TFilteredValue>, metadata: PossibleRegleRuleMetadataConsumer) => string | string[];
389
+ active: (value: Maybe<TFilteredValue>, metadata: PossibleRegleRuleMetadataConsumer) => boolean;
390
+ tooltip: (value: Maybe<TFilteredValue>, metadata: PossibleRegleRuleMetadataConsumer) => string | string[];
383
391
  type?: string;
384
392
  exec: (value: Maybe<TFilteredValue>) => TAsync extends false ? TMetaData : Promise<TMetaData>;
385
393
  }
@@ -434,15 +442,17 @@ type RegleCollectionRuleDefinition<TValue = any[], TCustomRules extends Partial<
434
442
  $each: MaybeGetter<RegleFormPropertyType<ArrayElement<NonNullable<TValue>>, TCustomRules>, ArrayElement<TValue>>;
435
443
  } & FieldRegleBehaviourOptions);
436
444
 
445
+ type RegleInitPropertyGetter<TValue, TReturn, TParams extends [...any[]], TMetadata extends RegleRuleMetadataDefinition> = TReturn | ((value: Maybe<TValue>, metadata: RegleRuleMetadataConsumer<TParams, TMetadata>) => TReturn);
437
446
  /**
438
447
  * @argument
439
448
  * createRule arguments options
440
449
  */
441
450
  interface RegleRuleInit<TValue extends any, TParams extends [...any[]] = [], TReturn extends RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition> = boolean, TMetadata extends RegleRuleMetadataDefinition = RegleRuleMetadataDefinition, TAsync extends boolean = TReturn extends Promise<any> ? true : false> {
442
- type?: string;
443
451
  validator: (value: Maybe<TValue>, ...args: TParams) => TReturn;
444
- message: string | string[] | ((value: Maybe<TValue>, metadata: RegleRuleMetadataConsumer<TParams, TMetadata>) => string | string[]);
445
- active?: boolean | ((value: Maybe<TValue>, metadata: RegleRuleMetadataConsumer<TParams, TMetadata>) => boolean);
452
+ message: RegleInitPropertyGetter<TValue, string | string[], TParams, TMetadata>;
453
+ active?: RegleInitPropertyGetter<TValue, boolean, TParams, TMetadata>;
454
+ tooltip?: RegleInitPropertyGetter<TValue, string | string[], TParams, TMetadata>;
455
+ type?: string;
446
456
  }
447
457
  /**
448
458
  * @argument
@@ -450,8 +460,9 @@ interface RegleRuleInit<TValue extends any, TParams extends [...any[]] = [], TRe
450
460
  */
451
461
  interface RegleRuleCore<TValue extends any, TParams extends any[] = [], TAsync extends boolean = false, TMetadata extends RegleRuleMetadataDefinition = boolean> {
452
462
  validator: (value: Maybe<TValue>, ...args: TParams) => TAsync extends false ? TMetadata : Promise<TMetadata>;
453
- message: string | ((value: Maybe<TValue>, metadata: RegleRuleMetadataConsumer<TParams, TMetadata>) => string | string[]);
454
- active?: boolean | ((value: Maybe<TValue>, metadata: RegleRuleMetadataConsumer<TParams, TMetadata>) => boolean);
463
+ message: RegleInitPropertyGetter<TValue, string | string[], TParams, TMetadata>;
464
+ active?: RegleInitPropertyGetter<TValue, string | string[], TParams, TMetadata>;
465
+ tooltip?: RegleInitPropertyGetter<TValue, string | string[], TParams, TMetadata>;
455
466
  type?: string;
456
467
  }
457
468
 
@@ -491,24 +502,15 @@ type DefaultValidators = {
491
502
  ], false, boolean>;
492
503
  integer: RegleRuleDefinition<string | number, [], false, boolean, string | number>;
493
504
  ipAddress: RegleRuleDefinition<string, [], false, boolean, string>;
494
- macAddress: RegleRuleWithParamsDefinition<string, [
495
- separator?: string | undefined
496
- ], false, boolean>;
497
- maxLength: RegleRuleWithParamsDefinition<string | any[] | Record<PropertyKey, any>, [
498
- count: number
499
- ], false, boolean>;
505
+ macAddress: RegleRuleWithParamsDefinition<string, [separator?: string | undefined], false, boolean>;
506
+ maxLength: RegleRuleWithParamsDefinition<string | any[] | Record<PropertyKey, any>, [count: number], false, boolean>;
500
507
  maxValue: RegleRuleWithParamsDefinition<number, [count: number], false, boolean>;
501
- minLength: RegleRuleWithParamsDefinition<string | any[] | Record<PropertyKey, any>, [
502
- count: number
503
- ], false, boolean>;
508
+ minLength: RegleRuleWithParamsDefinition<string | any[] | Record<PropertyKey, any>, [count: number], false, boolean>;
504
509
  minValue: RegleRuleWithParamsDefinition<number, [count: number], false, boolean>;
505
510
  numeric: RegleRuleDefinition<string | number, [], false, boolean, string | number>;
506
511
  regex: RegleRuleWithParamsDefinition<string, [regexp: RegExp], false, boolean>;
507
512
  required: RegleRuleDefinition<unknown, []>;
508
- sameAs: RegleRuleWithParamsDefinition<unknown, [
509
- target: unknown,
510
- otherName?: string
511
- ], false, boolean>;
513
+ sameAs: RegleRuleWithParamsDefinition<unknown, [target: unknown, otherName?: string], false, boolean>;
512
514
  startsWith: RegleRuleWithParamsDefinition<string, [part: Maybe<string>], false, boolean>;
513
515
  url: RegleRuleDefinition<string, [], false, boolean, string>;
514
516
  };
@@ -581,15 +583,20 @@ type RegleExternalErrorTree<TState = Record<string, any> | any[]> = PartialDeep<
581
583
  }>;
582
584
  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[];
583
585
  type RegleCollectionErrors<TState extends Record<string, any>> = {
584
- readonly $errors: string[];
586
+ readonly $self: string[];
585
587
  readonly $each: RegleValidationErrors<TState>[];
586
588
  };
589
+ type PartialFormState<TState extends Record<string, any>> = [unknown] extends [TState] ? {} : Prettify<{
590
+ [K in keyof TState as ExtendOnlyRealRecord<TState[K]> extends true ? never : TState[K] extends Array<any> ? never : K]?: Maybe<TState[K]>;
591
+ } & {
592
+ [K in keyof TState as ExtendOnlyRealRecord<TState[K]> extends true ? K : TState[K] extends Array<any> ? K : never]: NonNullable<TState[K]> extends Array<infer U extends Record<string, any>> ? PartialFormState<U>[] : PartialFormState<TState[K]>;
593
+ }>;
587
594
  type RegleResult<Data extends Record<string, any> | any[] | unknown, TRules extends ReglePartialRuleTree<any>> = {
588
595
  result: false;
589
- data: Data;
596
+ data: NonNullable<Data> extends Date | File ? Maybe<Data> : NonNullable<Data> extends Array<infer U extends Record<string, any>> ? PartialFormState<U>[] : NonNullable<Data> extends Record<string, any> ? PartialFormState<NonNullable<Data>> : Maybe<Data>;
590
597
  } | {
591
598
  result: true;
592
- data: Data extends Array<infer U extends Record<string, any>> ? DeepSafeFormState<U, TRules>[] : Data extends Date | File ? SafeFieldProperty<Data, TRules> : Data extends Record<string, any> ? Prettify<DeepSafeFormState<Data, TRules>> : Data;
599
+ data: Data extends Array<infer U extends Record<string, any>> ? DeepSafeFormState<U, TRules>[] : Data extends Date | File ? SafeFieldProperty<Data, TRules> : Data extends Record<string, any> ? DeepSafeFormState<Data, TRules> : SafeFieldProperty<Data, TRules>;
593
600
  };
594
601
 
595
602
  /**
@@ -628,6 +635,7 @@ type RegleFieldStatus<TState extends any = any, TRules extends RegleFormProperty
628
635
  readonly $errors: string[];
629
636
  readonly $silentErrors: string[];
630
637
  readonly $externalErrors: string[];
638
+ readonly $tooltips: string[];
631
639
  $extractDirtyFields: (filterNullishValues?: boolean) => Maybe<TState>;
632
640
  $validate: () => Promise<RegleResult<TState, TRules>>;
633
641
  readonly $rules: {
@@ -650,7 +658,7 @@ interface RegleCommonStatus<TValue = any> {
650
658
  readonly $name: string;
651
659
  $id?: string;
652
660
  $value: UnwrapNestedRefs<TValue>;
653
- $touch(runCommit?: boolean): void;
661
+ $touch(runCommit?: boolean, withConditions?: boolean): void;
654
662
  $reset(): void;
655
663
  $resetAll: () => void;
656
664
  $unwatch(): void;
@@ -663,6 +671,7 @@ interface RegleCommonStatus<TValue = any> {
663
671
  type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata extends RegleRuleMetadataDefinition = any> = {
664
672
  readonly $type: string;
665
673
  readonly $message: string | string[];
674
+ readonly $tooltip: string | string[];
666
675
  readonly $active: boolean;
667
676
  readonly $valid: boolean;
668
677
  readonly $pending: boolean;
@@ -679,7 +688,7 @@ type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata exte
679
688
  /**
680
689
  * @public
681
690
  */
682
- 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'> & {
691
+ type RegleCollectionStatus<TState extends any[] = any[], TRules extends ReglePartialRuleTree<ArrayElement<TState>> = Record<string, any>, TFieldRule extends RegleCollectionRuleDecl<any, any> = never, TShortcuts extends RegleShortcutDefinition = {}> = Omit<RegleCommonStatus<TState>, '$value'> & {
683
692
  $value: Maybe<TState>;
684
693
  readonly $each: Array<InferRegleStatusType<NonNullable<TRules>, NonNullable<TState>, number, TShortcuts>>;
685
694
  readonly $field: RegleFieldStatus<TState, TFieldRule, TShortcuts>;
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import {unref,version,isRef,toRef,computed,ref,toRaw,reactive,shallowRef,onScopeDispose,effectScope,triggerRef,watch,watchEffect}from'vue';var De=(r=>(r.Inline="__inline",r.Async="__async",r))(De||{});function ke(e,t){return e.some(r=>r[t])}function He(e,t){return e.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 Le(e){return e.map(t=>t instanceof Function||isRef(t)?t:toRef(()=>t))}function qe(e){let n=e.toString().replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").match(/^(?:async\s*)?(?:function\b.*?\(|\((.*?)\)|(\w+))\s*=>|\((.*?)\)\s*=>|function.*?\((.*?)\)|\((.*?)\)/);return n?(n[0]||n[1]||n[2]||n[3]||n[4]||"").split(",").map(s=>s.trim()).filter(s=>s.length>0).length:0}function xe(e,...t){let{message:r,validator:n,active:a,type:l,...s}=e,v=l==="__async"||n.constructor.name==="AsyncFunction";return {...{validator(T,...S){return e.validator(T,...L(S.length?S:t))},message(T,S){return typeof e.message=="function"?e.message(T,{...S,$params:L(S.$params?.length?S.$params:t)}):e.message},active(T,S){return typeof e.active=="function"?e.active(T,{...S,$params:L(S.$params?.length?S.$params:t)}):e.active??!0},exec(T){let S=e.validator(T,...L(t)),h;return S instanceof Promise?S.then(y=>(h=y,typeof h=="object"&&"$valid"in h?h.$valid:typeof h=="boolean"?h:!1)):(h=S,typeof h=="object"&&"$valid"in h?h.$valid:typeof h=="boolean"?h:!1)}},...s,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:v,_params:Le(t)}}function Ce(e){if(typeof e.validator=="function"){let r=xe(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(qe(e.validator)>1){let a=function(...l){return xe(e,...l)};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 q(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ze(e){return q(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,vt(e))),r=="Array"||r=="Object"){t=Array.isArray(e)?[]:{};for(let n in e)t[n]=te(e[n]);}return t}function vt(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 Ie(e,t,r){return e instanceof Function?e(t,r??0):e}function Je(e,t){isRef(e)?e.value=t:e=t;}function Ye(e,t){isRef(e)?e.value=[]:e=[],t.forEach((r,n)=>{let a=isRef(e)?e.value[n]:e[n];a={},ce(a,t[n]);});}function ce(e,t){Object.entries({...unref(e),...t}).forEach(([r,n])=>{let a=isRef(e)?e.value:e,l=isRef(t[r])?t[r]._value:t[r],s=isRef(a[r])?a[r].value:a[r];Array.isArray(a[r])?(a[r]=[],Array.isArray(l)&&l.forEach((v,D)=>{a[r][D]={},ce(a[r][D],l[D]);})):q(l)?ce(s,l):isRef(a[r])?a[r].value=l:a[r]=l;});}function J(e){return e==null?!0:e===!1?!1:e instanceof Date?isNaN(e.getTime()):Array.isArray(e)?!1: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=(...l)=>new Promise(s=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(s);},t);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...l)=>new Promise(s=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(s);},0);}),a}function mt(e,t){let r=String(e).split("."),n=String(t).split(".");for(let a=0;a<Math.min(r.length,n.length);a++){let l=Number(r[a]),s=Number(n[a]);if(l>s)return 1;if(s>l)return -1;if(!isNaN(l)&&isNaN(s))return 1;if(isNaN(l)&&!isNaN(s))return -1}return 0}var Se=mt(version,"3.5.0")!==-1;function gt(){return Math.floor(Math.random()*Date.now()).toString()}function Pe(){return typeof window>"u"?gt():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(10)}function we(){let e=shallowRef(new Map),t=shallowRef(new Map),r=shallowRef(new Map),n=shallowRef(new Map),a=shallowRef(new Map),l=shallowRef(new Map);function s(d){let o=t.value.get(d);if(o)return o;{let u=ref({});return t.value.set(d,u),u}}function v(d){let o=r.value.get(d);if(o)return o;{let u=ref([]);return r.value.set(d,u),u}}function D(d,o,u){l.value.set(`${d}-${o}`,u);}function E(d,o){return l.value.get(`${d}-${o}`)}function T(d,o){d&&o!=null&&l.value.delete(`${d}-${o}`);}function S(d,o){n.value.set(d,o);}function h(d){return n.value.get(d)??!1}function y(d,o){e.value.set(d,o);}function C(d,o){let u=e.value.get(d);return u?R(o,u)?{valid:!0}:{valid:!1}:void 0}function R(d,o){let u=Object.keys(o),$=Object.keys(d);return $.length!==u.length||!$.every(j=>u.includes(j))?!1:$.every(j=>{let x=d[j],A=o[j];return !A||!x||typeof x=="function"||typeof A=="function"||typeof x=="number"||typeof x=="boolean"?!1:x._params?x._params?.every((P,M)=>{if(typeof A=="number"||typeof A=="boolean")return !0;{let m=L(A._params),O=L(x._params);return m?.[M]===O?.[M]}}):!0})}function G(d){let o=a.value.get(d);if(o)return o;{let u=ref(!1),$=ref(!0),N=ref({}),j=ref(!1);return a.value.set(d,{$pending:u,$valid:$,$metadata:N,$validating:j}),{$pending:u,$valid:$,$metadata:N,$validating:j}}}return onScopeDispose(()=>{e.value.clear(),t.value.clear(),r.value.clear(),n.value.clear(),a.value.clear(),l.value.clear();}),{addRuleDeclEntry:y,setDirtyEntry:S,checkRuleDeclEntry:C,getDirtyState:h,trySetRuleStatusRef:G,getFieldsEntry:s,getCollectionsEntry:v,getArrayStatus:E,addArrayStatus:D,deleteArrayStatus:T,arrayStatusStorage:l}}function Qe(e,t){return q(e.value)&&q(t.value)&&!Object.entries(t.value).some(r=>fe(r))}function Xe(e,t){return !!e.value&&"$each"in e.value||Array.isArray(t.value)}function Ze(e){return !!e.value&&q(e.value)}function fe(e){return q(e)&&"_validator"in e}function Re(e){return typeof e.value!="function"}function Ke(e){return q(e)&&"$fields"in e}function Oe({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 tt({$dirty:e,customMessages:t,rule:r,ruleKey:n,state:a,path:l,storage:s,$debounce:v}){let D=effectScope(),E,T,S=ref(!1),{$pending:h,$valid:y,$metadata:C,$validating:R}=s.trySetRuleStatusRef(`${l}.${n}`);function G(){E=D.run(()=>{let x=computed(()=>({$invalid:!y.value,$params:O.value,...C.value})),A=computed(()=>Re(r)?typeof r.value.active=="function"?r.value.active(a.value,x.value):!!r.value.active:!0),P=computed(()=>{let H="",Y=t?t[n]?.message:void 0;return Y&&(typeof Y=="function"?H=Y(a.value,x.value):H=Y),Re(r)&&(Y&&!r.value._patched||(typeof r.value.message=="function"?H=r.value.message(a.value,x.value):H=r.value.message)),J(H)&&(H="Error",console.warn(`No error message defined for ${l}.${n}`)),H}),M=computed(()=>Re(r)&&r.value.type?r.value.type:n),m=computed(()=>Re(r)?r.value.validator:r.value),O=computed(()=>typeof r.value=="function"?[]:L(r.value._params??[])),X=computed(()=>`${l}.${M.value}`);return {$active:A,$message:P,$type:M,$validator:m,$params:O,$path:X}}),T=watch(E.$params,$,{deep:!0});}G();function d(){y.value=!0,e.value&&(h.value=!0);}async function o(){let x=E.$validator.value,A=x(a.value,...E.$params.value),P=!1,M=a.value;try{d();let m;if(A instanceof Promise?m=await A:m=A,a.value!==M)return !0;if(typeof m=="boolean")P=m;else {let{$valid:O,...X}=m;P=O,C.value=X;}}catch{P=!1;}finally{h.value=!1;}return P}let u=$e(o,v??200);async function $(){try{R.value=!0;let x=!1;if(fe(r.value)&&r.value._async)x=await u();else {let A=E.$validator.value,P=A(a.value,...E.$params.value);if(P 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(P!=null)if(typeof P=="boolean")x=P;else {let{$valid:M,...m}=P;x=M,C.value=m;}}return y.value=x,x}catch{return !1}finally{R.value=!1;}}function N(){y.value=!0,C.value={},h.value=!1,R.value=!1,G();}function j(){T(),D.stop(),D=effectScope();}return reactive({...E,$pending:h,$valid:y,$metadata:C,_haveAsync:S,$validating:R,$validate:$,$unwatch:j,$watch:G,$reset:N})}function be({state:e,rulesDef:t,customMessages:r,path:n,fieldName:a,storage:l,options:s,externalErrors:v,onUnwatch:D,$isArray:E,initialState:T,shortcuts:S}){let h=effectScope(),y,C=[],R=ref(!1),G=ref(!1),d,o,u,$,N=()=>{};function j(){let p=t.value,V=l.checkRuleDeclEntry(n,p);O.value=Object.fromEntries(Object.entries(p).filter(([F])=>F.startsWith("$"))),m.value=Object.fromEntries(Object.entries(t.value).filter(([F])=>!F.startsWith("$")).map(([F,B])=>{if(B){let K=toRef(()=>B);return [F,tt({$dirty:R,customMessages:r,rule:K,ruleKey:F,state:e,path:n,storage:l,$debounce:O.value.$debounce})]}return []}).filter(F=>!!F.length)),P(),x(),V?.valid!=null&&(R.value=l.getDirtyState(n),R.value&&N()),l.addRuleDeclEntry(n,p);}function x(){N=y.$debounce.value?$e(M,y.$debounce.value??y.haveAnyAsyncRule?100:0):M;}function A(){m.value&&Object.entries(m.value).forEach(([p,V])=>{V.$unwatch();}),u(),R.value&&l.setDirtyEntry(n,R.value),d?.(),o?.(),h.stop(),h=effectScope(),C.forEach(p=>p.stop()),C=[],D?.(),$?.();}function P(){m.value&&Object.entries(m.value).forEach(([p,V])=>{V.$watch();}),y=h.run(()=>{let p=computed(()=>R.value),V=computed(()=>O.value.$debounce),F=computed(()=>O.value.$lazy!=null?O.value.$lazy:unref(s.lazy)),B=computed(()=>O.value.$rewardEarly!=null?O.value.$rewardEarly:unref(s.rewardEarly)),K=computed(()=>O.value.$clearExternalErrorsOnChange!=null?O.value.$clearExternalErrorsOnChange:unref(s.clearExternalErrorsOnChange)),oe=computed(()=>O.value.$autoDirty!=null?O.value.$autoDirty:unref(s.autoDirty)),w=computed(()=>Object.entries(m.value).some(([Z,ee])=>ee.$validating)),_=computed(()=>ge.value&&!me.value&&R.value),I=computed(()=>_.value?Oe({field:{$dirty:R.value,$externalErrors:v?.value,$rules:m.value}}):[]),k=computed(()=>Oe({field:{$dirty:R.value,$externalErrors:v?.value,$rules:m.value},silent:!0})),se=computed(()=>!(ge.value||me.value)),me=computed(()=>G.value||!B.value?Object.entries(m.value).some(([Z,ee])=>ee.$pending):!1),ge=computed(()=>v?.value?.length?!0:J(m.value)?!1:!B.value||B.value&&G.value?Object.entries(m.value).some(([Z,ee])=>!ee.$valid):!1),Ne=computed(()=>a),Ee=computed(()=>v?.value?.length||J(m.value)?!1:R.value&&!J(e.value)&&!w.value?Object.values(m.value).every(Z=>Z.$valid&&Z.$active):!1),st=computed(()=>Object.entries(m.value).some(([Z,ee])=>ee._haveAsync));function ct(){S?.fields&&Object.entries(S.fields).forEach(([Z,ee])=>{let We=effectScope();Be[Z]=We.run(()=>{let Ue=ref();return watchEffect(()=>{Ue.value=ee({$dirty:R.value,$externalErrors:v?.value??[],$value:e,$rules:m.value,$error:_.value,$pending:me.value,$invalid:ge.value,$valid:Ee.value,$errors:I.value,$ready:se.value,$silentErrors:k.value,$anyDirty:p.value,$name:Ne.value});}),Ue}),C.push(We);});}let Be={};return ct(),watch(Ee,Z=>{Z&&(G.value=!1);}),{$error:_,$pending:me,$invalid:ge,$valid:Ee,$debounce:V,$lazy:F,$errors:I,$ready:se,$silentErrors:k,$rewardEarly:B,$autoDirty:oe,$clearExternalErrorsOnChange:K,$anyDirty:p,$name:Ne,haveAnyAsyncRule:st,$shortcuts:Be,$validating:w}}),d=watch(e,()=>{y.$autoDirty.value&&(R.value||(R.value=!0)),t.value instanceof Function&&j(),N(),y.$rewardEarly.value!==!0&&y.$clearExternalErrorsOnChange.value&&g();},{deep:E?!0:Se?1:!0}),u=watch(R,()=>{l.setDirtyEntry(n,R.value);}),o=watch(y.$valid,p=>{y.$rewardEarly.value&&p&&(G.value=!1);}),$=watch(y.haveAnyAsyncRule,x);}function M(){Object.values(m.value).forEach(p=>{p.$validate();});}let m=ref(),O=ref();j();function X(){g(),R.value=!1,Object.entries(m.value).forEach(([p,V])=>{V.$reset();}),!y.$lazy.value&&y.$autoDirty.value&&Object.values(m.value).forEach(p=>p.$validate());}function H(p=!0){R.value||(R.value=!0,p&&N());}async function Y(){try{let p=e.value;if(G.value=!0,!R.value)R.value=!0;else if(y.$autoDirty.value&&R.value&&!y.$pending.value)return {result:!y.$error.value,data:p};return J(m.value)?{result:!0,data:p}:{result:(await Promise.allSettled(Object.entries(m.value).map(([B,K])=>K.$validate()))).every(B=>B.status==="fulfilled"?B.value===!0:!1),data:p}}catch{return {result:!1,data:e.value}}}function i(){A(),e.value=Je(e,T),X();}function c(p=!0){return R.value?e.value:null}function g(){v?.value?.length&&(v.value=[]);}!y.$lazy.value&&!R.value&&y.$autoDirty.value&&N();let{$shortcuts:b,$validating:f,...W}=y;return reactive({$dirty:R,...W,$externalErrors:v,$value:e,$rules:m,...b,$reset:X,$touch:H,$validate:Y,$unwatch:A,$watch:P,$resetAll:i,$extractDirtyFields:c,$clearExternalErrors:g})}function rt({$id:e,path:t,index:r,options:n,storage:a,stateValue:l,customMessages:s,rules:v,externalErrors:D,initialState:E,shortcuts:T,fieldName:S}){let h=v.$key?v.$key:Pe(),y=`${t}.${String(h)}`;typeof l.value=="object"&&l.value!=null&&(l.value.$id?y=`${t}.${l.value.$id}`:Object.defineProperties(l.value,{$id:{value:h,enumerable:!1,configurable:!1,writable:!1}}));let C=ye({state:l,rulesDef:toRef(()=>v),customMessages:s,path:y,storage:a,options:n,externalErrors:toRef(D?.value??[],r),initialState:E?.[r],shortcuts:T,fieldName:S});if(C){let R=l.value?.$id;C.$id=R??String(h),a.addArrayStatus(e,C.$id,C);}return C}function nt({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:s,initialState:v,shortcuts:D,fieldName:E}){let T=effectScope(),S,h=effectScope(),y,C=[];if(!Array.isArray(e.value)&&!t.value.$each)return null;let R=ref(),G=ref(e.value),d,o=ref({}),u=a.getCollectionsEntry(n);y=h.run(()=>({isPrimitiveArray:computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(c=>typeof c!="object"):t.value.$each&&!(t.value.$each instanceof Function)?Object.values(t.value.$each).every(c=>fe(c)):!1)})),$(),j();function $(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(R.value=Pe(),Object.defineProperties(e.value,{$id:{value:R.value,enumerable:!1,configurable:!1,writable:!1}})):e.value?.$id&&(R.value=e.value.$id)),!y.isPrimitiveArray.value&&(G.value=o.value.$value,Array.isArray(e.value)?u.value=e.value.map((i,c)=>{let g=Ie(t.value.$each,toRef(()=>i),c),b=rt({$id:R.value,path:n,rules:g??{},stateValue:toRef(()=>i),index:c,options:l,storage:a,externalErrors:toRef(s?.value??{},"$each"),initialState:v?.[c],shortcuts:D,fieldName:E});return b||null}).filter(i=>!!i):u.value=[],o.value=be({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:toRef(s?.value??{},"$errors"),$isArray:!0,initialState:v,shortcuts:D,fieldName:E}));}function N(){if(Array.isArray(e.value)){let i=te(u.value);u.value=e.value.map((c,g)=>{let b=toRef(()=>c);if(c.$id&&u.value.find(f=>f.$id===c.$id)){let f=a.getArrayStatus(R.value,c.$id);return f?(f.$value=b,f):null}else {let f=Ie(t.value.$each,b,g);if(f){let W=rt({$id:R.value,path:n,rules:f,stateValue:b,index:g,options:l,storage:a,externalErrors:toRef(s?.value??{},"$each"),initialState:v?.[g],shortcuts:D,fieldName:E});return W||null}}}).filter(c=>!!c),i.filter(c=>!e.value.find(g=>c.$id===g.$id)).forEach((c,g)=>{a.deleteArrayStatus(R.value,g.toString());});}else u.value=[];}function j(){d=watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")?$():N();},{deep:Se?1:!0,flush:"pre"}),S=T.run(()=>{let i=computed(()=>o.value.$dirty&&u.value.every(w=>w.$dirty)),c=computed(()=>o.value.$anyDirty||u.value.some(w=>w.$dirty)),g=computed(()=>o.value.$invalid||u.value.some(w=>w.$invalid)),b=computed(()=>(J(o.value.$rules)?!0:o.value.$valid)&&u.value.every(w=>w.$valid)),f=computed(()=>o.value.$error||u.value.some(w=>w.$error)),W=computed(()=>!(g.value||p.value)),p=computed(()=>o.value.$pending||u.value.some(w=>w.$pending)),V=computed(()=>({$errors:o.value.$errors,$each:u.value.map(w=>w.$errors)})),F=computed(()=>({$errors:o.value.$silentErrors,$each:u.value.map(w=>w.$silentErrors)})),B=computed(()=>E);function K(){D?.collections&&Object.entries(D?.collections).forEach(([w,_])=>{let I=effectScope();oe[w]=I.run(()=>{let k=ref();return watchEffect(()=>{k.value=_({$dirty:i.value,$error:f.value,$pending:p.value,$invalid:g.value,$valid:b.value,$errors:V.value,$ready:W.value,$silentErrors:F.value,$anyDirty:c.value,$name:B.value,$each:u.value,$field:o.value,$value:e});}),k}),C.push(I);});}let oe={};return K(),{$dirty:i,$anyDirty:c,$invalid:g,$valid:b,$error:f,$pending:p,$errors:V,$silentErrors:F,$ready:W,$name:B,$shortcuts:oe}}),y.isPrimitiveArray.value&&(console.warn(`${n} is a Array of primitives. Tracking can be lost when reassigning the Array. We advise to use an Array of objects instead`),d());}function x(){d&&d(),o.value&&o.value.$unwatch(),u.value&&u.value.forEach(i=>{"$dirty"in i&&i.$unwatch();}),T.stop(),T=effectScope(),h.stop(),h=effectScope(!0),C.forEach(i=>i.stop()),C=[];}function A(i=!0){o.value.$touch(i),u.value.forEach(c=>{c.$touch(i);});}function P(){o.value.$reset(),u.value.forEach(i=>{i.$reset();});}async function M(){let i=e.value;try{return {result:(await Promise.allSettled([o.value.$validate(),...u.value.map(b=>b.$validate())])).every(b=>b.status==="fulfilled"?b.value.result===!0:!1),data:i}}catch{return {result:!1,data:i}}}function m(){o.value.$clearExternalErrors(),u.value.forEach(i=>{i.$clearExternalErrors();});}function O(i=!0){let c=u.value.map(g=>{if(Ke(g))return g.$extractDirtyFields(i)});return i&&(c=c.filter(g=>q(g)?!J(g):!!g)),c}function X(){x(),Ye(e,v),P();}let{$shortcuts:H,...Y}=S;return reactive({$field:o,...Y,...H,$each:u,$value:e,$validate:M,$unwatch:x,$watch:j,$touch:A,$reset:P,$resetAll:X,$extractDirtyFields:O,$clearExternalErrors:m})}function Fe({scopeRules:e,state:t,customMessages:r,path:n="",rootRules:a,storage:l,options:s,externalErrors:v,validationGroups:D,initialState:E,shortcuts:T,fieldName:S}){let h=effectScope(),y,C=[],R=null,G=null,d=null;async function u(i=!0){let c=Object.fromEntries(Object.entries(e.value).map(([f,W])=>{if(W){let p=toRef(t.value,f);triggerRef(p);let V=toRef(()=>W),F=toRef(v?.value,f);return [f,ye({state:p,rulesDef:V,customMessages:r,path:n?`${n}.${f}`:f,storage:l,options:s,externalErrors:F,initialState:E?.[f],shortcuts:T,fieldName:f})]}return []}).filter(f=>!!f.length&&f[1]!=null)),g=Object.fromEntries(Object.entries(unref(v)??{}).filter(([f])=>!(f in e.value)).map(([f,W])=>{if(W){let p=toRef(t.value,f);return [f,ye({state:p,rulesDef:computed(()=>({})),customMessages:r,path:n?`${n}.${f}`:f,storage:l,options:s,externalErrors:toRef(v?.value??{},f),initialState:E?.[f],shortcuts:T,fieldName:f})]}return []})),b=Object.fromEntries(Object.entries(t.value).filter(([f])=>!(f in e.value)&&!(f in(g.value??{}))).map(([f,W])=>{let p=toRef(t.value,f);return [f,ye({state:p,rulesDef:computed(()=>({})),customMessages:r,path:n?`${n}.${f}`:f,storage:l,options:s,externalErrors:toRef(v?.value??{},f),initialState:E?.[f],shortcuts:T,fieldName:f})]}));$.value={...c,...g,...b},i&&P();}let $=l.getFieldsEntry(n);u();function N(){G?.(),Object.values($.value).forEach(i=>{i.$reset();}),A();}function j(i=!0){Object.values($.value).forEach(c=>{c.$touch(i);});}async function x(){try{let i=t.value;return {result:(await Promise.allSettled(Object.values($.value).map(b=>b.$validate()))).every(b=>b.status==="fulfilled"?b.value.result===!0:!1),data:i}}catch{return {result:!1,data:t.value}}}function A(){v?.value&&(G=watch(v,()=>{M(),u();},{deep:!0}));}function P(){a&&(R=watch(a,()=>{M(),u();},{deep:!0,flush:"post"}),A()),d=watch(t,()=>{M(),u(),j();},{flush:"sync"}),y=h.run(()=>{let i=computed(()=>!!Object.entries($.value).length&&Object.entries($.value).every(([_,I])=>I?.$dirty)),c=computed(()=>Object.entries($.value).some(([_,I])=>I?.$dirty)),g=computed(()=>Object.entries($.value).some(([_,I])=>I?.$invalid)),b=computed(()=>Object.entries($.value).every(([_,I])=>I?.$valid)),f=computed(()=>i.value&&!p.value&&g.value),W=computed(()=>unref(s.autoDirty)?c.value&&!(g.value||p.value):!(g.value||p.value)),p=computed(()=>Object.entries($.value).some(([_,I])=>I?.$pending)),V=computed(()=>Object.fromEntries(Object.entries($.value).map(([_,I])=>[_,I?.$errors]))),F=computed(()=>Object.fromEntries(Object.entries($.value).map(([_,I])=>[_,I?.$silentErrors]))),B=computed(()=>S);function K(){T?.nested&&Object.entries(T.nested).forEach(([_,I])=>{let k=effectScope();w[_]=k.run(()=>{let se=ref();return watchEffect(()=>{se.value=I({$dirty:i.value,$value:t,$error:f.value,$pending:p.value,$invalid:g.value,$valid:b.value,$ready:W.value,$anyDirty:c.value,$name:B.value,$silentErrors:F.value,$errors:V.value,$fields:$.value});}),se}),C.push(k);});}let oe=computed(()=>D?Object.fromEntries(Object.entries(D?.($.value)??{}).map(([_,I])=>I.length?[_,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(k=>[k,ke(I,k)])),...Object.fromEntries(["$errors","$silentErrors"].map(k=>[k,He(I,k)]))}]:[])):{}),w={};return K(),{$dirty:i,$anyDirty:c,$invalid:g,$valid:b,$error:f,$pending:p,$errors:V,$silentErrors:F,$ready:W,$name:B,$shortcuts:w,$groups:oe}});}function M(){R?.(),G?.(),d?.(),C.forEach(i=>i.stop()),C=[],$.value&&Object.entries($.value).forEach(([i,c])=>{c.$unwatch();});}function m(){Object.entries($.value).forEach(([i,c])=>{c.$clearExternalErrors();});}function O(){M(),ce(t,E??{}),u(!1),N(),P();}function X(i=!0){let c=Object.entries($.value).map(([g,b])=>[g,b.$extractDirtyFields(i)]);return i&&(c=c.filter(([g,b])=>q(b)?!J(b):Array.isArray(b)?b.length:!!b)),Object.fromEntries(c)}let{$shortcuts:H,...Y}=y;return reactive({...Y,...H,$fields:$,$value:t,$resetAll:O,$reset:N,$touch:j,$validate:x,$unwatch:M,$watch:P,$clearExternalErrors:m,$extractDirtyFields:X})}function ye({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:s,index:v,initialState:D,shortcuts:E,onUnwatch:T,fieldName:S}){return Xe(t,e)?nt({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,index:v,externalErrors:s,initialState:D,fieldName:S,shortcuts:E}):Qe(e,t)&&ze(e)?Fe({scopeRules:t,state:e,customMessages:r,path:n,storage:a,options:l,index:v,initialState:D,shortcuts:E,fieldName:S,externalErrors:s}):Ze(t)?be({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,index:v,externalErrors:s,onUnwatch:T,shortcuts:E,initialState:D,fieldName:S}):null}function je({initialState:e,options:t,scopeRules:r,state:n,customRules:a,shortcuts:l}){let s=we();return reactive(Fe({rootRules:r,scopeRules:r,state:n,customMessages:a?.(),storage:s,options:t,externalErrors:t.externalErrors,validationGroups:t.validationGroups,initialState:e,shortcuts:l,fieldName:"root"}))}function Ve(e,t,r){let n={autoDirty:t?.autoDirty??!0,lazy:t?.lazy??!1,rewardEarly:t?.rewardEarly??!1,clearExternalErrorsOnChange:t?.clearExternalErrorsOnChange??!0};function a(l,s,v){let D=isRef(s)?s:computed(typeof s=="function"?s:()=>s),E={...n,...v},T=isRef(l)?l:ref(l),S=te(toRaw(T.value));return {r$:je({scopeRules:D,state:T,options:E,initialState:S,customRules:e,shortcuts:r})}}return a}var ut=Ve();function _e(){function e(t,r){return r}return e}var Ge=_e();function it({rules:e,modifiers:t,shortcuts:r}){let n=Ve(e,t,r),a=_e();return {useRegle:n,inferRules:a}}
2
- export{De as InternalRuleType,Ce as createRule,it as defineRegleConfig,Ge as inferRules,L as unwrapRuleParameters,ut as useRegle};
1
+ import {unref,version,isRef,toRef,computed,ref,toRaw,reactive,shallowRef,onScopeDispose,effectScope,watch,watchEffect}from'vue';var xe=(t=>(t.Inline="__inline",t.Async="__async",t))(xe||{});function ke(e,r){return e.some(t=>t[r])}function qe(e,r){return e.reduce((t,a)=>{let n=a[r]||[];return t.concat(n)},[])}function k(e){return e.map(r=>r instanceof Function?r():unref(r))}function ze(e){return e.map(r=>r instanceof Function||isRef(r)?r:toRef(()=>r))}function Je(e){let a=e.toString().replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").match(/^(?:async\s*)?(?:function\b.*?\(|\((.*?)\)|(\w+))\s*=>|\((.*?)\)\s*=>|function.*?\((.*?)\)|\((.*?)\)/);return a?(a[0]||a[1]||a[2]||a[3]||a[4]||"").split(",").map(d=>d.trim()).filter(d=>d.length>0).length:0}function De(e,...r){let{validator:t,type:a}=e,n=a==="__async"||t.constructor.name==="AsyncFunction";return {...{validator(v,...c){return e.validator(v,...k(c.length?c:r))},message(v,c){return typeof e.message=="function"?e.message(v,{...c,$params:k(c.$params?.length?c.$params:r)}):e.message},active(v,c){return typeof e.active=="function"?e.active(v,{...c,$params:k(c.$params?.length?c.$params:r)}):e.active??!0},tooltip(v,c){return typeof e.tooltip=="function"?e.tooltip(v,{...c,$params:k(c.$params?.length?c.$params:r)}):e.tooltip??[]},exec(v){let c=e.validator(v,...k(r)),g;return c instanceof Promise?c.then(w=>(g=w,typeof g=="object"&&"$valid"in g?g.$valid:typeof g=="boolean"?g:!1)):(g=c,typeof g=="object"&&"$valid"in g?g.$valid:typeof g=="boolean"?g:!1)}},_validator:e.validator,_message:e.message,_active:e.active,_tooltip:e.tooltip,_type:e.type,_patched:!1,_async:n,_params:ze(r)}}function Ce(e){if(typeof e.validator=="function"){let t=De(e,...[]),a=e.validator.constructor.name==="AsyncFunction";if(Je(e.validator)>1){let n=function(...s){return De(e,...s)};return n.validator=t.validator,n.message=t.message,n.active=t.active,n.tooltip=t.tooltip,n.type=t.type,n.exec=t.exec,n._validator=t.validator,n._message=t.message,n._active=t.active,n._tooltip=t.tooltip,n._type=e.type,n._patched=!1,n._async=a,n}else return t}throw new Error("Validator must be a function")}function q(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ye(e){return q(e.value)}function ee(e){let r=e,t={}.toString.call(e).slice(8,-1);if(t=="Set"&&(r=new Set([...e].map(a=>ee(a)))),t=="Map"&&(r=new Map([...e].map(a=>[ee(a[0]),ee(a[1])]))),t=="Date"&&(r=new Date(e.getTime())),t=="RegExp"&&(r=RegExp(e.source,ht(e))),t=="Array"||t=="Object"){r=Array.isArray(e)?[]:{};for(let a in e)r[a]=ee(e[a]);}return r}function ht(e){if(typeof e.source.flags=="string")return e.source.flags;{let r=[];return e.global&&r.push("g"),e.ignoreCase&&r.push("i"),e.multiline&&r.push("m"),e.sticky&&r.push("y"),e.unicode&&r.push("u"),r.join("")}}function Ie(e,r,t){return e instanceof Function?e(r,t??0):e}function Qe(e,r){isRef(e)?e.value=r:e=r;}function Xe(e,r){isRef(e)?e.value=[]:e=[],r.forEach((t,a)=>{let n=isRef(e)?e.value[a]:e[a];n={},ie(n,r[a]);});}function ie(e,r){Object.entries({...unref(e),...r}).forEach(([t,a])=>{let n=isRef(e)?e.value:e,s=isRef(r[t])?r[t]._value:r[t],d=isRef(n[t])?n[t].value:n[t];Array.isArray(n[t])?(n[t]=[],Array.isArray(s)&&s.forEach((v,c)=>{n[t][c]={},ie(n[t][c],s[c]);})):q(s)?ie(d,s):isRef(n[t])?n[t].value=s:n[t]=s;});}function ge(e,r,t){let a,n=(...s)=>new Promise(d=>{clearTimeout(a),a=setTimeout(()=>{a=void 0,Promise.resolve(e.apply(this,[...s])).then(d);},r);});return n.cancel=()=>{clearTimeout(a),a=void 0;},n}function Tt(e,r){let t=String(e).split("."),a=String(r).split(".");for(let n=0;n<Math.min(t.length,a.length);n++){let s=Number(t[n]),d=Number(a[n]);if(s>d)return 1;if(d>s)return -1;if(!isNaN(s)&&isNaN(d))return 1;if(isNaN(s)&&!isNaN(d))return -1}return 0}var $e=Tt(version,"3.5.0")!==-1;function Et(){return Math.floor(Math.random()*Date.now()).toString()}function Se(){return typeof window>"u"?Et():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(10)}function Pe(){let e=shallowRef(new Map),r=shallowRef(new Map),t=shallowRef(new Map),a=shallowRef(new Map),n=shallowRef(new Map),s=shallowRef(new Map);function d(u){let i=r.value.get(u);if(i)return i;{let f=ref({});return r.value.set(u,f),f}}function v(u){let i=t.value.get(u);if(i)return i;{let f=ref([]);return t.value.set(u,f),f}}function c(u,i,f){s.value.set(`${u}-${i}`,f);}function g(u,i){return s.value.get(`${u}-${i}`)}function w(u,i){u&&i!=null&&s.value.delete(`${u}-${i}`);}function G(u,i){a.value.set(u,i);}function C(u){return a.value.get(u)??!1}function R(u,i){e.value.set(u,i);}function x(u,i){let f=e.value.get(u);return f?p(i,f)?{valid:!0}:{valid:!1}:void 0}function p(u,i){let f=Object.keys(i),j=Object.keys(u);return j.length!==f.length||!j.every(O=>f.includes(O))?!1:j.every(O=>{let b=u[O],A=i[O];return !A||!b||typeof b=="function"||typeof A=="function"||typeof b=="number"||typeof b=="boolean"?!1:b._params?b._params?.every((I,L)=>{if(typeof A=="number"||typeof A=="boolean")return !0;{let y=k(A._params),P=k(b._params);return y?.[L]===P?.[L]}}):!0})}function F(u){let i=n.value.get(u);if(i)return i;{let f=ref(!1),j=ref(!0),V=ref({}),O=ref(!1);return n.value.set(u,{$pending:f,$valid:j,$metadata:V,$validating:O}),{$pending:f,$valid:j,$metadata:V,$validating:O}}}return onScopeDispose(()=>{e.value.clear(),r.value.clear(),t.value.clear(),a.value.clear(),n.value.clear(),s.value.clear();}),{addRuleDeclEntry:R,setDirtyEntry:G,checkRuleDeclEntry:x,getDirtyState:C,trySetRuleStatusRef:F,getFieldsEntry:d,getCollectionsEntry:v,getArrayStatus:g,addArrayStatus:c,deleteArrayStatus:w,arrayStatusStorage:s}}function Y(e){return e==null?!0:e instanceof Date?isNaN(e.getTime()):Array.isArray(e)?!1:typeof e=="object"&&e!=null?Object.keys(e).length===0:!String(e).length}function Ze(e,r){return q(e.value)&&q(r.value)&&!Object.entries(r.value).some(t=>ce(t))}function Ke(e,r){return !!e.value&&"$each"in e.value||Array.isArray(r.value)}function et(e){return !!e.value&&q(e.value)}function ce(e){return q(e)&&"_validator"in e}function fe(e){return typeof e.value!="function"}function tt(e){return q(e)&&"$fields"in e}function Oe({field:e,silent:r=!1}){return Object.entries(e.$rules??{}).map(([t,a])=>r||!a.$valid&&e.$dirty&&!a.$validating?a.$message:null).filter(t=>!!t).reduce((t,a)=>typeof a=="string"?t?.concat([a]):t?.concat(a),[]).concat(e.$dirty?e.$externalErrors??[]:[])}function rt({field:e}){return Object.entries(e.$rules??{}).map(([r,t])=>t.$tooltip).filter(r=>!!r).reduce((r,t)=>typeof t=="string"?r?.concat([t]):r?.concat(t),[])}function at({$dirty:e,customMessages:r,rule:t,ruleKey:a,state:n,path:s,storage:d,$debounce:v}){let c=effectScope(),g,w,G=ref(!1),{$pending:C,$valid:R,$metadata:x,$validating:p}=d.trySetRuleStatusRef(`${s}.${a}`);function F(){g=c.run(()=>{let b=computed(()=>({$invalid:!R.value,$params:D.value,...x.value})),A=computed(()=>fe(t)?typeof t.value.active=="function"?t.value.active(n.value,b.value):!!t.value.active:!0);function I(o){let m="",l=r?r[a]?.[o]:void 0;return l&&(typeof l=="function"?m=l(n.value,b.value):m=l),fe(t)&&(l&&!t.value._patched||(typeof t.value[o]=="function"?m=t.value[o](n.value,b.value):m=t.value[o]??"")),m}let L=computed(()=>{let o=I("message");return Y(o)&&(o="Error",console.warn(`No error message defined for ${s}.${a}`)),o}),y=computed(()=>I("tooltip")),P=computed(()=>fe(t)&&t.value.type?t.value.type:a),T=computed(()=>fe(t)?t.value.validator:t.value),D=computed(()=>typeof t.value=="function"?[]:k(t.value._params??[])),_=computed(()=>`${s}.${P.value}`);return {$active:A,$message:L,$type:P,$validator:T,$params:D,$path:_,$tooltip:y}}),w=watch(g.$params,j,{deep:!0});}F();function u(){R.value=!0,e.value&&(C.value=!0);}async function i(){let b=g.$validator.value,A=b(n.value,...g.$params.value),I=!1,L=n.value;try{u();let y;if(A instanceof Promise?y=await A:y=A,n.value!==L)return !0;if(typeof y=="boolean")I=y;else {let{$valid:P,...T}=y;I=P,x.value=T;}}catch{I=!1;}finally{C.value=!1;}return I}let f=ge(i,v??200);async function j(){try{p.value=!0;let b=!1;if(ce(t.value)&&t.value._async)b=await f();else {let A=g.$validator.value,I=A(n.value,...g.$params.value);if(I 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(I!=null)if(typeof I=="boolean")b=I;else {let{$valid:L,...y}=I;b=L,x.value=y;}}return R.value=b,b}catch{return !1}finally{p.value=!1;}}function V(){R.value=!0,x.value={},C.value=!1,p.value=!1,F();}function O(){w(),c.stop(),c=effectScope();}return reactive({...g,$pending:C,$valid:R,$metadata:x,$haveAsync:G,$validating:p,$validate:j,$unwatch:O,$watch:F,$reset:V})}function be({state:e,rulesDef:r,customMessages:t,path:a,fieldName:n,storage:s,options:d,externalErrors:v,onUnwatch:c,$isArray:g,initialState:w,shortcuts:G}){let C=effectScope(),R,x=[],p=ref(!1),F=ref(!1),u,i,f,j,V=()=>{};function O(){let $=r.value,W=s.checkRuleDeclEntry(a,$);P.value=Object.fromEntries(Object.entries($).filter(([H])=>H.startsWith("$"))),y.value=Object.fromEntries(Object.entries(r.value).filter(([H])=>!H.startsWith("$")).map(([H,U])=>{if(U){let M=toRef(()=>U);return [H,at({$dirty:p,customMessages:t,rule:M,ruleKey:H,state:e,path:a,storage:s,$debounce:P.value.$debounce})]}return []}).filter(H=>!!H.length)),I(),b(),W?.valid!=null&&(p.value=s.getDirtyState(a),p.value&&V()),s.addRuleDeclEntry(a,$);}function b(){V=R.$debounce.value?ge(L,R.$debounce.value??R.$haveAnyAsyncRule?100:0):L;}function A(){y.value&&Object.entries(y.value).forEach(([$,W])=>{W.$unwatch();}),f(),p.value&&s.setDirtyEntry(a,p.value),u?.(),i?.(),C.stop(),C=effectScope(),x.forEach($=>$.stop()),x=[],c?.(),j?.();}function I(){y.value&&Object.entries(y.value).forEach(([$,W])=>{W.$watch();}),R=C.run(()=>{let $=computed(()=>p.value),W=computed(()=>P.value.$debounce),H=computed(()=>P.value.$lazy!=null?P.value.$lazy:unref(d.lazy)),U=computed(()=>E.value===!0?!1:P.value.$rewardEarly!=null?P.value.$rewardEarly:unref(d.rewardEarly)),M=computed(()=>P.value.$clearExternalErrorsOnChange!=null?P.value.$clearExternalErrorsOnChange:unref(d.clearExternalErrorsOnChange)),E=computed(()=>P.value.$autoDirty!=null?P.value.$autoDirty:unref(d.autoDirty)),h=computed(()=>Object.entries(y.value).some(([X,K])=>K.$validating)),Z=computed(()=>ve.value&&!ye.value&&p.value),se=computed(()=>Z.value?Oe({field:{$dirty:p.value,$externalErrors:v?.value,$rules:y.value}}):[]),ue=computed(()=>Z.value?rt({field:{$rules:y.value}}):[]),Ne=computed(()=>Oe({field:{$dirty:p.value,$externalErrors:v?.value,$rules:y.value},silent:!0})),We=computed(()=>!(ve.value||ye.value)),ye=computed(()=>F.value||!U.value?Object.entries(y.value).some(([X,K])=>K.$pending):!1),ve=computed(()=>v?.value?.length?!0:Y(y.value)?!1:!U.value||U.value&&F.value?Object.entries(y.value).some(([X,K])=>!K.$valid):!1),Ue=computed(()=>n),Ee=computed(()=>v?.value?.length||Y(y.value)?!1:p.value&&!Y(e.value)&&!h.value?Object.values(y.value).every(X=>X.$valid&&X.$active):!1),mt=computed(()=>Object.entries(y.value).some(([X,K])=>K.$haveAsync));function yt(){G?.fields&&Object.entries(G.fields).forEach(([X,K])=>{let He=effectScope();Be[X]=He.run(()=>{let Le=ref();return watchEffect(()=>{Le.value=K(reactive({$dirty:p,$externalErrors:v?.value??[],$value:e,$rules:y,$error:Z,$pending:ye,$invalid:ve,$valid:Ee,$errors:se,$ready:We,$silentErrors:Ne,$anyDirty:$,$tooltips:ue,$name:Ue}));}),Le}),x.push(He);});}let Be={};return yt(),watch(Ee,X=>{X&&(F.value=!1);}),{$error:Z,$pending:ye,$invalid:ve,$valid:Ee,$debounce:W,$lazy:H,$errors:se,$ready:We,$silentErrors:Ne,$rewardEarly:U,$autoDirty:E,$clearExternalErrorsOnChange:M,$anyDirty:$,$name:Ue,$haveAnyAsyncRule:mt,$shortcuts:Be,$validating:h,$tooltips:ue}}),u=watch(e,()=>{R.$autoDirty.value&&(p.value||(p.value=!0)),r.value instanceof Function&&O(),(R.$autoDirty.value||R.$rewardEarly.value&&R.$error.value)&&V(),R.$rewardEarly.value!==!0&&R.$clearExternalErrorsOnChange.value&&l();},{deep:g?!0:$e?1:!0}),f=watch(p,()=>{s.setDirtyEntry(a,p.value);}),i=watch(R.$valid,$=>{R.$rewardEarly.value&&$&&(F.value=!1);}),j=watch(R.$haveAnyAsyncRule,b);}function L(){Object.values(y.value).forEach($=>{$.$validate();});}let y=ref(),P=ref();O();function T(){l(),p.value=!1,Object.entries(y.value).forEach(([$,W])=>{W.$reset();}),!R.$lazy.value&&R.$autoDirty.value&&Object.values(y.value).forEach($=>$.$validate());}function D($=!0,W=!1){p.value||(p.value=!0),W&&$?(R.$autoDirty.value||R.$rewardEarly.value&&R.$error.value)&&V():$&&V();}async function _(){try{let $=e.value;if(F.value=!0,!p.value)p.value=!0;else if(R.$autoDirty.value&&p.value&&!R.$pending.value)return {result:!R.$error.value,data:$};return Y(y.value)?{result:!0,data:$}:{result:(await Promise.allSettled(Object.entries(y.value).map(([U,M])=>M.$validate()))).every(U=>U.status==="fulfilled"?U.value===!0:!1),data:$}}catch{return {result:!1,data:e.value}}}function o(){A(),e.value=Qe(e,w),T();}function m($=!0){return p.value?e.value:null}function l(){v?.value?.length&&(v.value=[]);}!R.$lazy.value&&!p.value&&R.$autoDirty.value&&V();let{$shortcuts:S,$validating:N,...J}=R;return reactive({$dirty:p,...J,$externalErrors:v,$value:e,$rules:y,...S,$reset:T,$touch:D,$validate:_,$unwatch:A,$watch:I,$resetAll:o,$extractDirtyFields:m,$clearExternalErrors:l})}function Ae({$id:e,path:r,index:t,options:a,storage:n,stateValue:s,customMessages:d,rules:v,externalErrors:c,initialState:g,shortcuts:w,fieldName:G}){let C=v.$key?v.$key:Se(),R=`${r}.${String(C)}`;typeof s.value=="object"&&s.value!=null&&(s.value.$id?R=`${r}.${s.value.$id}`:Object.defineProperties(s.value,{$id:{value:C,enumerable:!1,configurable:!1,writable:!1}}));let x=de({state:s,rulesDef:toRef(()=>v),customMessages:d,path:R,storage:n,options:a,externalErrors:toRef(c?.value??[],t),initialState:g?.[t],shortcuts:w,fieldName:G});if(x){let p=s.value?.$id;x.$id=p??String(C),n.addArrayStatus(e,x.$id,x);}return x}function ut({state:e,rulesDef:r,customMessages:t,path:a,storage:n,options:s,externalErrors:d,initialState:v,shortcuts:c,fieldName:g}){let w=effectScope(),G,C=effectScope(),R,x=[];if(!Array.isArray(e.value)&&!r.value.$each)return null;let p=ref(),F=ref(e.value),u,i=ref({}),f=n.getCollectionsEntry(a);R=C.run(()=>({isPrimitiveArray:computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(m=>typeof m!="object"):r.value.$each&&!(r.value.$each instanceof Function)?Object.values(r.value.$each).every(m=>ce(m)):!1)})),j(),O();function j(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(p.value=Se(),Object.defineProperties(e.value,{$id:{value:p.value,enumerable:!1,configurable:!1,writable:!1}})):e.value?.$id&&(p.value=e.value.$id)),!R.isPrimitiveArray.value&&(F.value=i.value.$value,Array.isArray(e.value)?f.value=e.value.map((o,m)=>{let l=Ie(r.value.$each,toRef(()=>o),m),S=Ae({$id:p.value,path:a,customMessages:t,rules:l??{},stateValue:toRef(()=>o),index:m,options:s,storage:n,externalErrors:toRef(d?.value??{},"$each"),initialState:v?.[m],shortcuts:c,fieldName:g});return S||null}).filter(o=>!!o):f.value=[],i.value=be({state:e,rulesDef:r,customMessages:t,path:a,storage:n,options:s,externalErrors:toRef(d?.value??{},"$self"),$isArray:!0,initialState:v,shortcuts:c,fieldName:g}));}function V(){if(Array.isArray(e.value)){let o=ee(f.value);f.value=e.value.map((m,l)=>{let S=toRef(()=>m);if(m.$id&&f.value.find(N=>N.$id===m.$id)){let N=n.getArrayStatus(p.value,m.$id);return N?(N.$value=S,N):null}else {let N=Ie(r.value.$each,S,l);if(N){let J=Ae({$id:p.value,path:a,customMessages:t,rules:N,stateValue:S,index:l,options:s,storage:n,externalErrors:toRef(d?.value??{},"$each"),initialState:v?.[l],shortcuts:c,fieldName:g});return J||null}}}).filter(m=>!!m),o.filter(m=>!e.value.find(l=>m.$id===l.$id)).forEach((m,l)=>{n.deleteArrayStatus(p.value,l.toString());});}else f.value=[];}function O(){u=watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")?j():V();},{deep:$e?1:!0,flush:"pre"}),G=w.run(()=>{let o=computed(()=>i.value.$dirty&&f.value.every(h=>h.$dirty)),m=computed(()=>i.value.$anyDirty||f.value.some(h=>h.$dirty)),l=computed(()=>i.value.$invalid||f.value.some(h=>h.$invalid)),S=computed(()=>(Y(i.value.$rules)?!0:i.value.$valid)&&f.value.every(h=>h.$valid)),N=computed(()=>i.value.$error||f.value.some(h=>h.$error)),J=computed(()=>!(l.value||$.value)),$=computed(()=>i.value.$pending||f.value.some(h=>h.$pending)),W=computed(()=>({$self:i.value.$errors,$each:f.value.map(h=>h.$errors)})),H=computed(()=>({$self:i.value.$silentErrors,$each:f.value.map(h=>h.$silentErrors)})),U=computed(()=>g);function M(){c?.collections&&Object.entries(c?.collections).forEach(([h,Z])=>{let se=effectScope();E[h]=se.run(()=>{let ue=ref();return watchEffect(()=>{ue.value=Z(reactive({$dirty:o,$error:N,$pending:$,$invalid:l,$valid:S,$errors:W,$ready:J,$silentErrors:H,$anyDirty:m,$name:U,$each:f,$field:i,$value:e}));}),ue}),x.push(se);});}let E={};return M(),{$dirty:o,$anyDirty:m,$invalid:l,$valid:S,$error:N,$pending:$,$errors:W,$silentErrors:H,$ready:J,$name:U,$shortcuts:E}}),R.isPrimitiveArray.value&&(console.warn(`${a} is a Array of primitives. Tracking can be lost when reassigning the Array. We advise to use an Array of objects instead`),u());}function b(){u&&u(),i.value&&i.value.$unwatch(),f.value&&f.value.forEach(o=>{"$dirty"in o&&o.$unwatch();}),w.stop(),w=effectScope(),C.stop(),C=effectScope(!0),x.forEach(o=>o.stop()),x=[];}function A(o=!0,m=!1){i.value.$touch(o,m),f.value.forEach(l=>{l.$touch(o,m);});}function I(){i.value.$reset(),f.value.forEach(o=>{o.$reset();});}async function L(){let o=e.value;try{return {result:(await Promise.allSettled([i.value.$validate(),...f.value.map(S=>S.$validate())])).every(S=>S.status==="fulfilled"?S.value.result===!0:!1),data:o}}catch{return {result:!1,data:o}}}function y(){i.value.$clearExternalErrors(),f.value.forEach(o=>{o.$clearExternalErrors();});}function P(o=!0){let m=f.value.map(l=>{if(tt(l))return l.$extractDirtyFields(o)});return o&&(m=m.filter(l=>q(l)?!Y(l):!!l)),m}function T(){b(),Xe(e,v),I();}let{$shortcuts:D,..._}=G;return reactive({$field:i,..._,...D,$each:f,$value:e,$validate:L,$unwatch:b,$watch:O,$touch:A,$reset:I,$resetAll:T,$extractDirtyFields:P,$clearExternalErrors:y})}function Fe({rulesDef:e,state:r,path:t="",rootRules:a,externalErrors:n,validationGroups:s,initialState:d,fieldName:v,...c}){let g=effectScope(),w,G=[],C=null,R=null,x=null;async function F(T=!0){let D=Object.entries(e.value),_=Object.fromEntries(D.filter(([l,S])=>!!S).map(([l,S])=>{if(S){let N=toRef(r.value,l),J=toRef(()=>S),$=toRef(n?.value??{},l);return [l,de({state:N,rulesDef:J,path:t?`${t}.${l}`:l,externalErrors:$,initialState:d?.[l],fieldName:l,...c})]}return []})),o=Object.fromEntries(Object.entries(unref(n)??{}).filter(([l,S])=>!(l in e.value)&&!!S).map(([l])=>{let S=toRef(r.value,l);return [l,de({state:S,rulesDef:computed(()=>({})),path:t?`${t}.${l}`:l,externalErrors:toRef(n?.value??{},l),initialState:d?.[l],fieldName:l,...c})]})),m=Object.fromEntries(Object.entries(r.value).filter(([l])=>!(l in e.value)&&!(l in(o.value??{}))).map(([l])=>{let S=toRef(r.value,l);return [l,de({state:S,rulesDef:computed(()=>({})),path:t?`${t}.${l}`:l,externalErrors:toRef(n?.value??{},l),initialState:d?.[l],fieldName:l,...c})]}));u.value={..._,...o,...m},T&&V();}let u=c.storage.getFieldsEntry(t);F();function i(){R?.(),Object.values(u.value).forEach(T=>{T.$reset();}),j();}function f(T=!0,D=!1){Object.values(u.value).forEach(_=>{_.$touch(T,D);});}function j(){n?.value&&(R=watch(n,()=>{O(),F();},{deep:!0}));}function V(){a&&(C=watch(a,()=>{O(),F();},{deep:!0,flush:"post"}),j()),x=watch(r,()=>{O(),F(),f(!0,!0);},{flush:"sync"}),w=g.run(()=>{let T=computed(()=>!!Object.entries(u.value).length&&Object.entries(u.value).every(([M,E])=>E?.$dirty)),D=computed(()=>Object.entries(u.value).some(([M,E])=>E?.$dirty)),_=computed(()=>Object.entries(u.value).some(([M,E])=>E?.$invalid)),o=computed(()=>Object.entries(u.value).every(([M,E])=>E?.$valid)),m=computed(()=>D.value&&!S.value&&_.value),l=computed(()=>unref(c.options.autoDirty)?D.value&&!(_.value||S.value):!(_.value||S.value)),S=computed(()=>Object.entries(u.value).some(([M,E])=>E?.$pending)),N=computed(()=>Object.fromEntries(Object.entries(u.value).map(([M,E])=>[M,E?.$errors]))),J=computed(()=>Object.fromEntries(Object.entries(u.value).map(([M,E])=>[M,E?.$silentErrors]))),$=computed(()=>v);function W(){c.shortcuts?.nested&&Object.entries(c.shortcuts.nested).forEach(([M,E])=>{let h=effectScope();U[M]=h.run(()=>{let Z=ref();return watchEffect(()=>{Z.value=E(reactive({$dirty:T,$value:r,$error:m,$pending:S,$invalid:_,$valid:o,$ready:l,$anyDirty:D,$name:$,$silentErrors:J,$errors:N,$fields:u}));}),Z}),G.push(h);});}let H=computed(()=>s?Object.fromEntries(Object.entries(s?.(u.value)??{}).map(([M,E])=>E.length?[M,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(h=>[h,ke(E,h)])),...Object.fromEntries(["$errors","$silentErrors"].map(h=>[h,qe(E,h)]))}]:[])):{}),U={};return W(),{$dirty:T,$anyDirty:D,$invalid:_,$valid:o,$error:m,$pending:S,$errors:N,$silentErrors:J,$ready:l,$name:$,$shortcuts:U,$groups:H}});}function O(){C?.(),R?.(),x?.(),G.forEach(T=>T.stop()),G=[],u.value&&Object.entries(u.value).forEach(([T,D])=>{D.$unwatch();});}function b(){Object.entries(u.value).forEach(([T,D])=>{D.$clearExternalErrors();});}function A(){O(),ie(r,d??{}),F(!1),i(),V();}function I(T=!0){let D=Object.entries(u.value).map(([_,o])=>[_,o.$extractDirtyFields(T)]);return T&&(D=D.filter(([_,o])=>q(o)?!Y(o):Array.isArray(o)?o.length:!!o)),Object.fromEntries(D)}async function L(){try{let T=r.value;return {result:(await Promise.allSettled(Object.values(u.value).map(o=>o.$validate()))).every(o=>o.status==="fulfilled"?o.value.result===!0:!1),data:T}}catch{return {result:!1,data:r.value}}}let{$shortcuts:y,...P}=w;return reactive({...P,...y,$fields:u,$value:r,$resetAll:A,$reset:i,$touch:f,$validate:L,$unwatch:O,$watch:V,$clearExternalErrors:b,$extractDirtyFields:I})}function de({rulesDef:e,externalErrors:r,...t}){return Ke(e,t.state)?ut({rulesDef:e,externalErrors:r,...t}):Ze(t.state,e)&&Ye(t.state)?Fe({rulesDef:e,externalErrors:r,...t}):et(e)?be({rulesDef:e,externalErrors:r,...t}):null}function je({initialState:e,options:r,scopeRules:t,state:a,customRules:n,shortcuts:s}){let d=Pe();return reactive(Fe({rootRules:t,rulesDef:t,state:a,customMessages:n?.(),storage:d,options:r,externalErrors:r.externalErrors,validationGroups:r.validationGroups,initialState:e,shortcuts:s,fieldName:"root",path:""}))}function Ve(e,r,t){let a={autoDirty:r?.autoDirty??!0,lazy:r?.lazy??!1,rewardEarly:r?.rewardEarly??!1,clearExternalErrorsOnChange:r?.clearExternalErrorsOnChange??!0};function n(s,d,v){let c=isRef(d)?d:computed(typeof d=="function"?d:()=>d),g={...a,...v},w=isRef(s)?s:ref(s),G=ee(toRaw(w.value));return {r$:je({scopeRules:c,state:w,options:g,initialState:G,customRules:e,shortcuts:t})}}return n}var pt=Ve();function _e(){function e(r,t){return t}return e}var Ge=_e();function dt({rules:e,modifiers:r,shortcuts:t}){let a=Ve(e,r,t),n=_e();return {useRegle:a,inferRules:n}}
2
+ export{xe as InternalRuleType,Ce as createRule,dt as defineRegleConfig,Ge as inferRules,k as unwrapRuleParameters,pt as useRegle};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@regle/core",
3
- "version": "0.2.13",
3
+ "version": "0.3.1-beta.4",
4
4
  "description": "Typescript-first model-based form validation library for Vue 3",
5
5
  "peerDependencies": {
6
6
  "vue": "^3.1.0"
@@ -8,21 +8,21 @@
8
8
  "devDependencies": {
9
9
  "@total-typescript/ts-reset": "0.6.1",
10
10
  "@types/node": "22.9.3",
11
- "@typescript-eslint/eslint-plugin": "8.15.0",
12
- "@typescript-eslint/parser": "8.15.0",
11
+ "@typescript-eslint/eslint-plugin": "8.18.0",
12
+ "@typescript-eslint/parser": "8.18.0",
13
13
  "@vue/test-utils": "2.4.6",
14
- "bumpp": "9.8.1",
14
+ "bumpp": "9.9.0",
15
15
  "changelogithub": "0.13.11",
16
16
  "cross-env": "7.0.3",
17
- "type-fest": "4.28.0",
18
- "vitest": "2.1.5",
19
17
  "eslint": "9.15.0",
20
18
  "eslint-config-prettier": "9.1.0",
21
19
  "eslint-plugin-vue": "9.31.0",
22
20
  "prettier": "3.3.3",
23
21
  "tsup": "8.3.5",
22
+ "type-fest": "4.30.0",
24
23
  "typescript": "5.6.3",
25
- "vue": "3.5.11",
24
+ "vitest": "2.1.8",
25
+ "vue": "3.5.13",
26
26
  "vue-eslint-parser": "9.4.3",
27
27
  "vue-tsc": "2.1.10"
28
28
  },
@@ -55,7 +55,6 @@
55
55
  "scripts": {
56
56
  "lint": "eslint --ext .ts --ext .vue .",
57
57
  "typecheck": "tsc --noEmit",
58
- "release": "pnpm publish --report-summary",
59
58
  "build": "tsup --minify",
60
59
  "build:sourcemaps": "tsup --clean false --sourcemap inline",
61
60
  "dev": "tsup --config=tsup.dev.ts --watch",