@regle/core 0.1.10 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- 'use strict';var vue=require('vue');function V(e){return e.map(t=>t instanceof Function?t():vue.unref(t))}function Ie(e){return e.map(t=>t instanceof Function||vue.isRef(t)?t:vue.toRef(()=>t))}function Pe(e){let t=e.toString();return (t.includes("=>")?t.split("=>")[0]:t).slice(t.indexOf("(")+1,t.indexOf(")")).split(",").map(l=>l.trim()).filter(l=>l.includes("=")).length+e.length}function ie(e,...t){let{message:r,validator:n,active:a,...l}=e,d=n.constructor.name==="AsyncFunction";return {...{validator(S,...v){return e.validator(S,...V(v.length?v:t))},message(S,v){return typeof e.message=="function"?e.message(S,{...v,$params:V(v.$params?.length?v.$params:t)}):e.message},active(S,v){return typeof e.active=="function"?e.active(S,{...v,$params:V(v.$params?.length?v.$params:t)}):e.active??!0},exec(S){let v=e.validator(S,...V(t)),o;return v instanceof Promise?v.then(R=>(o=R,typeof o=="object"&&"$valid"in o?o.$valid:typeof o=="boolean"?o:!1)):(o=v,typeof o=="object"&&"$valid"in o?o.$valid:typeof o=="boolean"?o:!1)}},...l,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:d,_params:Ie(t)}}function ue(e){if(typeof e.validator=="function"){let r=ie(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(Pe(e.validator)>1){let a=function(...l){return ie(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 G(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function we(e){return G(e.value)}function B(e){let t=e,r={}.toString.call(e).slice(8,-1);if(r=="Set"&&(t=new Set([...e].map(n=>B(n)))),r=="Map"&&(t=new Map([...e].map(n=>[B(n[0]),B(n[1])]))),r=="Date"&&(t=new Date(e.getTime())),r=="RegExp"&&(t=RegExp(e.source,tt(e))),r=="Array"||r=="Object"){t=Array.isArray(e)?[]:{};for(let n in e)t[n]=B(e[n]);}return t}function tt(e){if(typeof e.source.flags=="string")return e.source.flags;{let t=[];return e.global&&t.push("g"),e.ignoreCase&&t.push("i"),e.multiline&&t.push("m"),e.sticky&&t.push("y"),e.unicode&&t.push("u"),t.join("")}}function ce(e,t,r){return e instanceof Function?e(t,r??0):e}function re(e){return e==null?!0:e===!1?!1:e instanceof Date?isNaN(e.getTime()):Array.isArray(e)?e.length===0:typeof e=="object"&&e!=null?Object.keys(e).length===0:typeof e=="string"?!String(e.trim()).length:!1}function X(e,t,r){let n,a=(...l)=>new Promise(d=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(d);},t);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...l)=>new Promise(d=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(d);},0);}),a}function nt(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]),d=Number(n[a]);if(l>d)return 1;if(d>l)return -1;if(!isNaN(l)&&isNaN(d))return 1;if(isNaN(l)&&!isNaN(d))return -1}return 0}var q=nt(vue.version,"3.5.0")!==-1;function at(){return Math.floor(Math.random()*Date.now()).toString()}function fe(){return typeof window>"u"?at():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(10)}function Re(){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 d(p){let g=t.value.get(p);if(g)return g;{let f=vue.ref({});return t.value.set(p,f),f}}function h(p){let g=r.value.get(p);if(g)return g;{let f=vue.ref([]);return r.value.set(p,f),f}}function P(p,g,f){l.value.set(`${p}-${g}`,f);}function S(p,g){return l.value.get(`${p}-${g}`)}function v(p,g){p&&g!=null&&l.value.delete(`${p}-${g}`);}function o(p,g){n.value.set(p,g);}function R(p){return n.value.get(p)??!1}function D(p,g){e.value.set(p,g);}function m(p,g){let f=e.value.get(p);return f?u(g,f)?{valid:!0}:{valid:!1}:void 0}function u(p,g){let f=Object.keys(g),O=Object.keys(p);return O.length!==f.length||!O.every(E=>f.includes(E))?!1:O.every(E=>{let c=p[E],i=g[E];return !i||!c||typeof c=="function"||typeof i=="function"||typeof c=="number"||typeof c=="boolean"?!1:c._params?c._params?.every((s,$)=>{if(typeof i=="number"||typeof i=="boolean")return !0;{let y=V(i._params),x=V(c._params);return y?.[$]===x?.[$]}}):!0})}function F(p){let g=a.value.get(p);if(g)return g;{let f=vue.ref(!1),O=vue.ref(!0),I=vue.ref({}),E=vue.ref(!1);return a.value.set(p,{$pending:f,$valid:O,$metadata:I,$validating:E}),{$pending:f,$valid:O,$metadata:I,$validating:E}}}return vue.onScopeDispose(()=>{e.value.clear(),t.value.clear(),r.value.clear(),n.value.clear(),a.value.clear(),l.value.clear();}),{addRuleDeclEntry:D,setDirtyEntry:o,checkRuleDeclEntry:m,getDirtyState:R,trySetRuleStatusRef:F,getFieldsEntry:d,getCollectionsEntry:h,getArrayStatus:S,addArrayStatus:P,deleteArrayStatus:v,arrayStatusStorage:l}}function Oe(e,t){return G(e.value)&&G(t.value)&&!Object.entries(t.value).some(r=>pe(r))}function Ae(e){return !!e.value&&"$each"in e.value}function Me(e){return !!e.value&&G(e.value)}function pe(e){return G(e)&&"_validator"in e}function Y(e){return typeof e.value!="function"}function de(e){return G(e)&&"$fields"in e}function me(e){return !!e&&"$each"in e}function ge(e){return !!e&&"$rules"in e}function ye(e){return "$each"in e||"$errors"in e}function U({field:e,silent:t=!1}){return Object.entries(e.$rules??{}).map(([r,n])=>t||!n.$valid&&e.$dirty?n.$message:null).filter(r=>!!r).reduce((r,n)=>typeof n=="string"?r?.concat([n]):r?.concat(n),[]).concat(e.$externalErrors??[])}function Fe(e,t=!1){return de(e)?ve(e.$fields):me(e)?{$errors:e.$field.$rules?U({field:e.$field,silent:t}):[],$each:e.$each.map(r=>Fe(r,t))}:ge(e)?e.$error?U({field:e,silent:t}):e.$externalErrors??[]:[]}function st(e,t=!1){return e.map(r=>Fe(r,t))}function ve(e,t=!1){return Object.fromEntries(Object.entries(e).map(([r,n])=>de(n)?[r,ve(n.$fields,t)]:me(n)?[r,{$errors:U({field:n.$field,silent:t}),$each:st(n.$each,t)}]:ge(n)?n.$error?[r,U({field:n,silent:t})]:[r,n.$externalErrors??[]]:[r,[]]))}function Ve(e){return vue.computed(()=>ve(e.$fields))}var je=(r=>(r.Inline="__inline",r.Async="__async",r))(je||{});function ke(e,t){return vue.computed(()=>e.value.some(r=>r[t]))}function Ge(e,t){return vue.computed(()=>e.value.reduce((r,n)=>{let a=n[t]||[];return r.concat(a)},[]))}function Ne({$dirty:e,customMessages:t,rule:r,ruleKey:n,state:a,path:l,storage:d,$debounce:h}){let P=vue.effectScope(),S,v,{$pending:o,$valid:R,$metadata:D,$validating:m}=d.trySetRuleStatusRef(`${l}.${n}`);function u(){S=P.run(()=>{let E=vue.computed(()=>({$invalid:!R.value,$params:y.value,...D.value})),c=vue.computed(()=>Y(r)?typeof r.value.active=="function"?r.value.active(a.value,E.value):r.value.active:!0),i=vue.computed(()=>{let T="",C=t?t[n]?.message:void 0;return C&&(typeof C=="function"?T=C(a.value,E.value):T=C),Y(r)&&(C&&!r.value._patched||(typeof r.value.message=="function"?T=r.value.message(a.value,E.value):T=r.value.message)),re(T)&&(T="Error",console.warn(`No error message defined for ${l}.${n}`)),T}),s=vue.computed(()=>Y(r)&&r.value.type?r.value.type:n),$=vue.computed(()=>Y(r)?r.value.validator:r.value),y=vue.computed(()=>typeof r.value=="function"?[]:V(r.value._params??[])),x=vue.computed(()=>`${l}.${s.value}`);return {$active:c,$message:i,$type:s,$validator:$,$params:y,$path:x}}),v=vue.watch(S.$params,f,{deep:!0});}u();function F(){R.value=!0,e.value&&(o.value=!0);}async function p(E){let c=!1;try{F();let i=await E;if(typeof i=="boolean")c=i;else {let{$valid:s,...$}=i;c=s,D.value=$;}}catch{c=!1;}finally{o.value=!1;}return c}let g=X(p,h??100);async function f(){m.value=!0;let E=S.$validator.value,c=!1,i=E(a.value,...S.$params.value);if(i instanceof Promise)c=await g(i);else if(i!=null)if(typeof i=="boolean")c=i;else {let{$valid:s,...$}=i;c=s,D.value=$;}return R.value=c,m.value=!1,c}function O(){R.value=!0,D.value={},o.value=!1,m.value=!1,u();}function I(){v(),P.stop(),P=vue.effectScope();}return vue.reactive({...S,$pending:o,$valid:R,$metadata:D,$validate:f,$unwatch:I,$watch:u,$reset:O})}function ne({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:d,index:h,onUnwatch:P,$isArray:S}){let v=vue.effectScope(),o,R=vue.ref(!1),D=vue.ref(!1),m=vue.ref([]),u,F,p,g,f=()=>{};function O(){m.value=d.value??[];}O();function I(){let b=t.value,A=a.checkRuleDeclEntry(n,b);$.value=Object.fromEntries(Object.entries(b).filter(([M])=>M.startsWith("$"))),s.value=Object.fromEntries(Object.entries(t.value).filter(([M])=>!M.startsWith("$")).map(([M,k])=>{if(k){let oe=vue.toRef(()=>k);return [M,Ne({$dirty:R,customMessages:r,rule:oe,ruleKey:M,state:e,path:n,storage:a,$debounce:$.value.$debounce})]}return []}).filter(M=>!!M.length)),c(),f=o.$debounce.value?X(i,o.$debounce.value??0):i,A?.valid!=null&&(R.value=a.getDirtyState(n),R.value&&f()),a.addRuleDeclEntry(n,b);}function E(){s.value&&Object.entries(s.value).forEach(([b,A])=>{A.$unwatch();}),g(),R.value&&a.setDirtyEntry(n,R.value),u(),F(),p(),v.stop(),v=vue.effectScope(),P?.();}function c(){s.value&&Object.entries(s.value).forEach(([b,A])=>{A.$watch();}),o=v.run(()=>{let b=vue.computed(()=>R.value),A=vue.computed(()=>$.value.$debounce),M=vue.computed(()=>$.value.$lazy!=null?$.value.$lazy:vue.unref(l.lazy)),k=vue.computed(()=>$.value.$rewardEarly!=null?$.value.$rewardEarly:vue.unref(l.rewardEarly)),oe=vue.computed(()=>$.value.$autoDirty!=null?$.value.$autoDirty:vue.unref(l.autoDirty)),Qe=vue.computed(()=>se.value&&!De.value&&R.value),Xe=vue.computed(()=>U({field:{$dirty:R.value,$externalErrors:m.value,$rules:s.value}})),Ye=vue.computed(()=>U({field:{$dirty:R.value,$externalErrors:m.value,$rules:s.value},silent:!0})),De=vue.computed(()=>D.value||!k.value?Object.entries(s.value).some(([te,Q])=>Q.$pending):!1),se=vue.computed(()=>m.value?.length?!0:!k.value||k.value&&D.value?Object.entries(s.value).some(([te,Q])=>!Q.$valid):!1),Ce=vue.computed(()=>R.value&&!re(e.value)?m.value?.length?!1:k.value?Object.entries(s.value).every(([te,Q])=>Q.$valid):!se.value:!1);return vue.watch(Ce,te=>{te&&(D.value=!1);}),{$error:Qe,$pending:De,$invalid:se,$valid:Ce,$debounce:A,$lazy:M,$errors:Xe,$silentErrors:Ye,$rewardEarly:k,$autoDirty:oe,$anyDirty:b}}),p=vue.watch(d,O),u=vue.watch(e,()=>{o.$autoDirty.value&&(R.value||(R.value=!0)),t.value instanceof Function&&I(),f(),o.$rewardEarly.value;},{deep:S?!0:q?1:!0}),g=vue.watch(R,()=>{a.setDirtyEntry(n,R.value);}),F=vue.watch(o.$valid,b=>{o.$rewardEarly.value&&b&&(D.value=!1);});}function i(){Object.entries(s.value).forEach(([b,A])=>{A.$validate();});}let s=vue.ref(),$=vue.ref();I();function y(){R.value=!1,m.value=[],Object.entries(s.value).forEach(([b,A])=>{A.$reset();}),o.$lazy.value||Object.entries(s.value).map(([b,A])=>A.$validate());}function x(){R.value||(R.value=!0,o.$rewardEarly.value,f());}let T=o.$debounce.value?X(C,o.$debounce.value??0):C;async function C(){try{if(D.value=!0,o.$autoDirty.value&&R.value&&!o.$pending.value)return !o.$error.value;{let b=Object.entries(s.value).map(([M,k])=>k.$validate());return (await Promise.allSettled(b)).every(M=>M.status==="fulfilled"?M.value:!1)}}catch{return !1}}function w(){m.value=[];}return o.$lazy.value||C(),vue.reactive({$dirty:R,...o,$externalErrors:m,$value:e,$rules:s,$reset:y,$touch:x,$validate:T,$unwatch:E,$watch:c,$clearExternalErrors:w})}function We({$id:e,path:t,index:r,options:n,storage:a,stateValue:l,customMessages:d,rules:h,externalErrors:P}){let S=h.$key?h.$key:fe(),v=`${t}.${String(S)}`;typeof l.value=="object"&&l.value!=null&&(l.value.$id?v=`${t}.${l.value.$id}`:Object.defineProperties(l.value,{$id:{value:S,enumerable:!1,configurable:!1,writable:!1}}));let o=vue.toRef(()=>P.value?.[r]),R=le({state:l,rulesDef:vue.toRef(()=>h),customMessages:d,path:v,storage:a,options:n,externalErrors:o});if(R){let D=l.value?.$id;R.$id=D??String(S),a.addArrayStatus(e,R.$id,R);}return R}function He({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:d}){let h=vue.effectScope(),P,S=vue.effectScope(),v;if(Array.isArray(e.value)&&!t.value.$each)return null;let o=vue.ref(),R=vue.ref(e.value),D,m=vue.ref({}),u=a.getCollectionsEntry(n);v=S.run(()=>{let i=vue.computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(y=>typeof y!="object"):t.value.$each&&!(t.value.$each instanceof Function)?Object.values(t.value.$each).every(y=>pe(y)):!1),s=vue.computed(()=>d.value?ye(d.value)?d.value.$errors??[]:[]:[]),$=vue.computed(()=>d.value?ye(d.value)?d.value.$each??[]:[]:[]);return {isPrimitiveArray:i,$externalErrorsField:s,$externalErrorsEach:$}}),F(),g();function F(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(o.value=fe(),Object.defineProperties(e.value,{$id:{value:o.value,enumerable:!1,configurable:!1,writable:!1}})):e.value?.$id&&(o.value=e.value.$id)),!v.isPrimitiveArray.value&&(R.value=m.value.$value,Array.isArray(e.value)&&t.value.$each?u.value=e.value.map((i,s)=>{let $=ce(t.value.$each,vue.toRef(()=>i),s);if($){let y=We({$id:o.value,path:n,rules:$,stateValue:vue.toRef(()=>i),index:s,options:l,storage:a,externalErrors:v.$externalErrorsEach});return y||null}}).filter(i=>!!i):u.value=[],m.value=ne({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:v.$externalErrorsField,$isArray:!0}));}function p(){if(Array.isArray(e.value)){let i=B(u.value);u.value=e.value.map((s,$)=>{let y=vue.toRef(()=>s);if(s.$id&&u.value.find(x=>x.$id===s.$id)){let x=a.getArrayStatus(o.value,s.$id);return x?(x.$value=y,x):null}else {let x=ce(t.value.$each,y,$);if(x){let T=We({$id:o.value,path:n,rules:x,stateValue:y,index:$,options:l,storage:a,externalErrors:v.$externalErrorsEach});return T||null}}}).filter(s=>!!s),i.filter(s=>!e.value.find($=>s.$id===$.$id)).forEach((s,$)=>{a.deleteArrayStatus(o.value,$.toString());});}else u.value=[];}function g(){D=vue.watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")?F():p();},{deep:q?1:!0,flush:"pre"}),P=h.run(()=>{let i=vue.computed(()=>m.value.$dirty&&u.value.every(b=>b.$dirty)),s=vue.computed(()=>m.value.$anyDirty||u.value.some(b=>b.$dirty)),$=vue.computed(()=>m.value.$invalid||u.value.some(b=>b.$invalid)),y=vue.computed(()=>m.value.$valid&&u.value.every(b=>b.$valid)),x=vue.computed(()=>m.value.$error||u.value.some(b=>b.$error)),T=vue.computed(()=>m.value.$pending||u.value.some(b=>b.$pending)),C=vue.computed(()=>({$errors:m.value.$errors,$each:u.value.map(b=>b.$errors)})),w=vue.computed(()=>({$errors:m.value.$silentErrors,$each:u.value.map(b=>b.$silentErrors)}));return {$dirty:i,$anyDirty:s,$invalid:$,$valid:y,$error:x,$pending:T,$errors:C,$silentErrors:w}}),v.isPrimitiveArray.value&&(console.warn(`${n} is a Array of primitives. Tracking can be lost when reassigning the Array. We advise to use an Array of objects instead`),D());}function f(){D&&D(),m.value&&m.value.$unwatch(),u.value&&u.value.forEach(i=>{"$dirty"in i&&i.$unwatch();}),h.stop(),h=vue.effectScope(),S.stop(),S=vue.effectScope(!0);}function O(){m.value.$touch(),u.value.forEach(i=>{i.$touch();});}function I(){m.value.$reset(),u.value.forEach(i=>{i.$reset();});}async function E(){try{return (await Promise.all([m.value.$validate(),...u.value.map(s=>s.$validate())])).every(s=>!!s)}catch{return !1}}function c(){}return vue.reactive({$field:m,...P,$each:u,$value:e,$validate:E,$unwatch:f,$watch:g,$touch:O,$reset:I,$clearExternalErrors:c})}function Ee({scopeRules:e,state:t,customMessages:r,path:n="",rootRules:a,storage:l,options:d,externalErrors:h,validationGroups:P}){let S,v,o;function m(E=!0,c=!1){u.value=null,vue.triggerRef(u);let i=Object.fromEntries(Object.entries(e.value).map(([y,x])=>{if(x){let T=vue.toRef(t.value,y),C=vue.toRef(()=>x),w=vue.toRef(()=>h.value?.[y]);return [y,le({state:T,rulesDef:C,customMessages:r,path:n?`${n}.${y}`:y,storage:l,options:d,externalErrors:w})]}return []}).filter(y=>!!y.length&&y[1]!=null)),s=Object.fromEntries(Object.entries(vue.unref(h)??{}).filter(([y])=>!(y in e.value)).map(([y,x])=>{if(x){let T=vue.toRef(()=>({})),C=vue.toRef(()=>x);return [y,le({state:vue.ref(void 0),rulesDef:T,customMessages:r,path:n?`${n}.${y}`:y,storage:l,options:d,externalErrors:C})]}return []})),$=Object.fromEntries(Object.entries(P?.(i)??{}).map(([y,x])=>x.length?[y,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(T=>[T,ke(vue.toRef(()=>x),T)])),...Object.fromEntries(["$errors","$silentErrors"].map(T=>[T,Ge(vue.toRef(()=>x),T)]))}]:[]));u.value={...i,...s,...$},E&&f();}let u=l.getFieldsEntry(n);m();function F(){m(!1),Object.entries(u.value).forEach(([E,c])=>{c.$reset();}),f();}function p(){Object.entries(u.value).forEach(([E,c])=>{c.$touch();});}async function g(){try{return (await Promise.allSettled(Object.entries(u.value).map(([c,i])=>i.$validate()))).every(c=>c.status==="fulfilled"?c.value:!1)}catch{return !1}}function f(){a&&(o=vue.watch(a,()=>{O(),m();},{deep:q?1:!0,flush:"post"})),S=vue.effectScope(),v=S.run(()=>{let E=vue.computed(()=>!!Object.entries(u.value).length&&Object.entries(u.value).every(([C,w])=>w.$dirty)),c=vue.computed(()=>Object.entries(u.value).some(([C,w])=>w.$dirty)),i=vue.computed(()=>Object.entries(u.value).some(([C,w])=>w.$invalid)),s=vue.computed(()=>Object.entries(u.value).every(([C,w])=>w.$valid)),$=vue.computed(()=>E.value&&!y.value&&i.value),y=vue.computed(()=>Object.entries(u.value).some(([C,w])=>w.$pending)),x=vue.computed(()=>Object.fromEntries(Object.entries(u.value).map(([C,w])=>[C,w.$errors]))),T=vue.computed(()=>Object.fromEntries(Object.entries(u.value).map(([C,w])=>[C,w.$silentErrors])));return {$dirty:E,$anyDirty:c,$invalid:i,$valid:s,$error:$,$pending:y,$errors:x,$silentErrors:T}});}function O(){u.value&&Object.entries(u.value).forEach(([E,c])=>{c.$unwatch();}),o?.(),S.stop(),S=vue.effectScope();}function I(){Object.entries(u.value).forEach(([E,c])=>{c.$clearExternalErrors();});}return vue.reactive({...v,$fields:u,$value:t,$reset:F,$touch:p,$validate:g,$unwatch:O,$watch:f,$clearExternalErrors:I})}function le({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:d,index:h,onUnwatch:P}){return Ae(t)?He({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,index:h,externalErrors:d}):Oe(e,t)&&we(e)?Ee({scopeRules:t,state:e,customMessages:r,path:n,storage:a,options:l,index:h,externalErrors:d}):Me(t)?ne({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,index:h,externalErrors:d,onUnwatch:P}):null}function be(e,t,r,n){let a=Re(),l=vue.computed(()=>vue.unref(r.externalErrors)),d=vue.reactive(Ee({rootRules:e,scopeRules:e,state:t,customMessages:n?.(),storage:a,options:r,externalErrors:l,validationGroups:r.validationGroups})),h=Ve(d);return {regle:d,errors:h}}function xe(e,t){let r={autoDirty:t?.autoDirty??!0,lazy:t?.lazy??!1,rewardEarly:t?.rewardEarly??!1};function n(a,l,d){let h=vue.isRef(l)?l:vue.computed(typeof l=="function"?l:()=>l),P={...r,...d},S=vue.isRef(a)?a:vue.ref(a),v=B(vue.toRaw(S.value)),{regle:o,errors:R}=be(h,S,P,e);function D(){o.$unwatch(),m(a,v),o.$reset();}function m(p,g){Object.entries(g).forEach(([f,O])=>{let I=vue.isRef(p)?p.value:p,E=vue.isRef(I[f])?I[f].value:I[f],c=vue.isRef(g[f])?g[f]._value:g[f];Array.isArray(c)&&Array.isArray(E)?(I[f]=[],c.forEach((i,s)=>{I[f][s]={},m(I[f][s],c[s]);})):G(c)?m(E,c):vue.isRef(I[f])?I[f].value=c:I[f]=c;});}let u=vue.computed(()=>!(o.$invalid||o.$pending));async function F(){return o.$touch(),await o.$validate()?S.value:!1}return {regle:o,r$:o,errors:R,resetAll:D,validateState:F,ready:u,state:S}}return n}var ze=xe();function Te(){function e(t,r){return r}return e}var he=Te();function Je({rules:e,modifiers:t}){let r=xe(e,t),n=Te();return {useRegle:r,inferRules:n}}exports.InternalRuleType=je;exports.createRule=ue;exports.defineRegleConfig=Je;exports.inferRules=he;exports.unwrapRuleParameters=V;exports.useRegle=ze;
1
+ 'use strict';var vue=require('vue');var Re=(r=>(r.Inline="__inline",r.Async="__async",r))(Re||{});function Oe(e,t){return vue.computed(()=>e.value.some(r=>r[t]))}function Ae(e,t){return vue.computed(()=>e.value.reduce((r,n)=>{let a=n[t]||[];return r.concat(a)},[]))}function B(e){return e.map(t=>t instanceof Function?t():vue.unref(t))}function Fe(e){return e.map(t=>t instanceof Function||vue.isRef(t)?t:vue.toRef(()=>t))}function Me(e){let t=e.toString();return (t.includes("=>")?t.split("=>")[0]:t).slice(t.indexOf("(")+1,t.indexOf(")")).split(",").map(l=>l.trim()).filter(l=>l.includes("=")).length+e.length}function pe(e,...t){let{message:r,validator:n,active:a,type:l,...m}=e,x=l==="__async"||n.constructor.name==="AsyncFunction";return {...{validator($,...i){return e.validator($,...B(i.length?i:t))},message($,i){return typeof e.message=="function"?e.message($,{...i,$params:B(i.$params?.length?i.$params:t)}):e.message},active($,i){return typeof e.active=="function"?e.active($,{...i,$params:B(i.$params?.length?i.$params:t)}):e.active??!0},exec($){let i=e.validator($,...B(t)),c;return i instanceof Promise?i.then(h=>(c=h,typeof c=="object"&&"$valid"in c?c.$valid:typeof c=="boolean"?c:!1)):(c=i,typeof c=="object"&&"$valid"in c?c.$valid:typeof c=="boolean"?c:!1)}},...m,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:x,_params:Fe(t)}}function de(e){if(typeof e.validator=="function"){let r=pe(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(Me(e.validator)>1){let a=function(...l){return pe(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 N(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ve(e){return N(e.value)}function q(e){let t=e,r={}.toString.call(e).slice(8,-1);if(r=="Set"&&(t=new Set([...e].map(n=>q(n)))),r=="Map"&&(t=new Map([...e].map(n=>[q(n[0]),q(n[1])]))),r=="Date"&&(t=new Date(e.getTime())),r=="RegExp"&&(t=RegExp(e.source,rt(e))),r=="Array"||r=="Object"){t=Array.isArray(e)?[]:{};for(let n in e)t[n]=q(e[n]);}return t}function rt(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 me(e,t,r){return e instanceof Function?e(t,r??0):e}function L(e){return e==null?!0:e===!1?!1:e instanceof Date?isNaN(e.getTime()):Array.isArray(e)?e.length===0:typeof e=="object"&&e!=null?Object.keys(e).length===0:typeof e=="string"?!String(e.trim()).length:!1}function ee(e,t,r){let n,a=(...l)=>new Promise(m=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(m);},t);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...l)=>new Promise(m=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(m);},0);}),a}function at(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]),m=Number(n[a]);if(l>m)return 1;if(m>l)return -1;if(!isNaN(l)&&isNaN(m))return 1;if(isNaN(l)&&!isNaN(m))return -1}return 0}var Q=at(vue.version,"3.5.0")!==-1;function lt(){return Math.floor(Math.random()*Date.now()).toString()}function ye(){return typeof window>"u"?lt():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(10)}function ge(){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 m(u){let g=t.value.get(u);if(g)return g;{let E=vue.ref({});return t.value.set(u,E),E}}function x(u){let g=r.value.get(u);if(g)return g;{let E=vue.ref([]);return r.value.set(u,E),E}}function F(u,g,E){l.value.set(`${u}-${g}`,E);}function S(u,g){return l.value.get(`${u}-${g}`)}function $(u,g){u&&g!=null&&l.value.delete(`${u}-${g}`);}function i(u,g){n.value.set(u,g);}function c(u){return n.value.get(u)??!1}function h(u,g){e.value.set(u,g);}function y(u,g){let E=e.value.get(u);return E?v(g,E)?{valid:!0}:{valid:!1}:void 0}function v(u,g){let E=Object.keys(g),A=Object.keys(u);return A.length!==E.length||!A.every(V=>E.includes(V))?!1:A.every(V=>{let b=u[V],j=g[V];return !j||!b||typeof b=="function"||typeof j=="function"||typeof b=="number"||typeof b=="boolean"?!1:b._params?b._params?.every((O,d)=>{if(typeof j=="number"||typeof j=="boolean")return !0;{let o=B(j._params),s=B(b._params);return o?.[d]===s?.[d]}}):!0})}function _(u){let g=a.value.get(u);if(g)return g;{let E=vue.ref(!1),A=vue.ref(!0),k=vue.ref({}),V=vue.ref(!1);return a.value.set(u,{$pending:E,$valid:A,$metadata:k,$validating:V}),{$pending:E,$valid:A,$metadata:k,$validating:V}}}return vue.onScopeDispose(()=>{e.value.clear(),t.value.clear(),r.value.clear(),n.value.clear(),a.value.clear(),l.value.clear();}),{addRuleDeclEntry:h,setDirtyEntry:i,checkRuleDeclEntry:y,getDirtyState:c,trySetRuleStatusRef:_,getFieldsEntry:m,getCollectionsEntry:x,getArrayStatus:S,addArrayStatus:F,deleteArrayStatus:$,arrayStatusStorage:l}}function je(e,t){return N(e.value)&&N(t.value)&&!Object.entries(t.value).some(r=>te(r))}function _e(e){return !!e.value&&"$each"in e.value}function ke(e){return !!e.value&&N(e.value)}function te(e){return N(e)&&"_validator"in e}function re(e){return typeof e.value!="function"}function ve(e){return N(e)&&"$fields"in e}function $e(e){return "$each"in e||"$errors"in e}function Se({field:e,silent:t=!1}){return Object.entries(e.$rules??{}).map(([r,n])=>t||!n.$valid&&e.$dirty&&!n.$validating?n.$message:null).filter(r=>!!r).reduce((r,n)=>typeof n=="string"?r?.concat([n]):r?.concat(n),[]).concat(e.$externalErrors??[])}function Be({$dirty:e,customMessages:t,rule:r,ruleKey:n,state:a,path:l,storage:m,$debounce:x}){let F=vue.effectScope(),S,$,i=vue.ref(!1),{$pending:c,$valid:h,$metadata:y,$validating:v}=m.trySetRuleStatusRef(`${l}.${n}`);function _(){S=F.run(()=>{let b=vue.computed(()=>({$invalid:!h.value,$params:s.value,...y.value})),j=vue.computed(()=>re(r)?typeof r.value.active=="function"?r.value.active(a.value,b.value):r.value.active:!0),O=vue.computed(()=>{let f="",T=t?t[n]?.message:void 0;return T&&(typeof T=="function"?f=T(a.value,b.value):f=T),re(r)&&(T&&!r.value._patched||(typeof r.value.message=="function"?f=r.value.message(a.value,b.value):f=r.value.message)),L(f)&&(f="Error",console.warn(`No error message defined for ${l}.${n}`)),f}),d=vue.computed(()=>re(r)&&r.value.type?r.value.type:n),o=vue.computed(()=>re(r)?r.value.validator:r.value),s=vue.computed(()=>typeof r.value=="function"?[]:B(r.value._params??[])),p=vue.computed(()=>`${l}.${d.value}`);return {$active:j,$message:O,$type:d,$validator:o,$params:s,$path:p}}),$=vue.watch(S.$params,A,{deep:!0});}_();function u(){h.value=!0,e.value&&(c.value=!0);}async function g(){let b=S.$validator.value,j=b(a.value,...S.$params.value),O=!1,d=a.value;try{u();let o;if(j instanceof Promise?o=await j:o=j,a.value!==d)return !0;if(typeof o=="boolean")O=o;else {let{$valid:s,...p}=o;O=s,y.value=p;}}catch{O=!1;}finally{c.value=!1;}return O}let E=ee(g,x??200);async function A(){v.value=!0;let b=!1;if(te(r.value)&&r.value._async)b=await E();else {let j=S.$validator.value,O=j(a.value,...S.$params.value);if(O instanceof Promise)console.warn('You used a async validator function on a non-async rule, please use "async await" or the "withAsync" helper');else if(O!=null)if(typeof O=="boolean")b=O;else {let{$valid:d,...o}=O;b=d,y.value=o;}}return h.value=b,v.value=!1,b}function k(){h.value=!0,y.value={},c.value=!1,v.value=!1,_();}function V(){$(),F.stop(),F=vue.effectScope();}return vue.reactive({...S,$pending:c,$valid:h,$metadata:y,_haveAsync:i,$validating:v,$validate:A,$unwatch:V,$watch:_,$reset:k})}function oe({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:m,index:x,onUnwatch:F,$isArray:S}){let $=vue.effectScope(),i,c=vue.ref(!1),h=vue.ref(!1),y=vue.ref([]),v,_,u,g,E,A=()=>{};function k(){y.value=m.value??[];}k();function V(){let R=t.value,P=a.checkRuleDeclEntry(n,R);s.value=Object.fromEntries(Object.entries(R).filter(([I])=>I.startsWith("$"))),o.value=Object.fromEntries(Object.entries(t.value).filter(([I])=>!I.startsWith("$")).map(([I,w])=>{if(w){let ce=vue.toRef(()=>w);return [I,Be({$dirty:c,customMessages:r,rule:ce,ruleKey:I,state:e,path:n,storage:a,$debounce:s.value.$debounce})]}return []}).filter(I=>!!I.length)),O(),b(),P?.valid!=null&&(c.value=a.getDirtyState(n),c.value&&A()),a.addRuleDeclEntry(n,R);}function b(){A=i.$debounce.value?ee(d,i.$debounce.value??i.haveAnyAsyncRule?100:0):d;}function j(){o.value&&Object.entries(o.value).forEach(([R,P])=>{P.$unwatch();}),g(),c.value&&a.setDirtyEntry(n,c.value),v(),_(),u(),$.stop(),$=vue.effectScope(),F?.(),E?.();}function O(){o.value&&Object.entries(o.value).forEach(([R,P])=>{P.$watch();}),i=$.run(()=>{let R=vue.computed(()=>c.value),P=vue.computed(()=>s.value.$debounce),I=vue.computed(()=>s.value.$lazy!=null?s.value.$lazy:vue.unref(l.lazy)),w=vue.computed(()=>s.value.$rewardEarly!=null?s.value.$rewardEarly:vue.unref(l.rewardEarly)),ce=vue.computed(()=>s.value.$autoDirty!=null?s.value.$autoDirty:vue.unref(l.autoDirty)),Je=vue.computed(()=>Object.entries(o.value).some(([Y,W])=>W.$validating)),Ie=vue.computed(()=>le.value&&!fe.value&&c.value),Ye=vue.computed(()=>Ie.value?Se({field:{$dirty:c.value,$externalErrors:y.value,$rules:o.value}}):[]),Qe=vue.computed(()=>Se({field:{$dirty:c.value,$externalErrors:y.value,$rules:o.value},silent:!0})),Xe=vue.computed(()=>!le.value&&!fe.value),fe=vue.computed(()=>h.value||!w.value?Object.entries(o.value).some(([Y,W])=>W.$pending):!1),le=vue.computed(()=>y.value?.length?!0:!w.value||w.value&&h.value?Object.entries(o.value).some(([Y,W])=>!W.$valid):!1),Pe=vue.computed(()=>c.value&&!L(e.value)&&!Je.value?y.value?.length?!1:w.value?Object.entries(o.value).every(([Y,W])=>W.$valid):!le.value:!1),Ze=vue.computed(()=>Object.entries(o.value).some(([Y,W])=>W._haveAsync));return vue.watch(Pe,Y=>{Y&&(h.value=!1);}),{$error:Ie,$pending:fe,$invalid:le,$valid:Pe,$debounce:P,$lazy:I,$errors:Ye,$ready:Xe,$silentErrors:Qe,$rewardEarly:w,$autoDirty:ce,$anyDirty:R,haveAnyAsyncRule:Ze}}),u=vue.watch(m,k),v=vue.watch(e,()=>{i.$autoDirty.value&&(c.value||(c.value=!0)),t.value instanceof Function&&V(),A(),i.$rewardEarly.value;},{deep:S?!0:Q?1:!0}),g=vue.watch(c,()=>{a.setDirtyEntry(n,c.value);}),_=vue.watch(i.$valid,R=>{i.$rewardEarly.value&&R&&(h.value=!1);}),E=vue.watch(i.haveAnyAsyncRule,b);}function d(){Object.entries(o.value).forEach(([R,P])=>{P.$validate();});}let o=vue.ref(),s=vue.ref();V();function p(){c.value=!1,y.value=[],Object.entries(o.value).forEach(([R,P])=>{P.$reset();}),i.$lazy.value||Object.entries(o.value).map(([R,P])=>P.$validate());}function f(){c.value||(c.value=!0,i.$rewardEarly.value,A());}let T=i.$debounce.value?ee(M,i.$debounce.value??0):M;async function M(){try{if(h.value=!0,i.$autoDirty.value&&c.value&&!i.$pending.value)return !i.$error.value;{let R=Object.entries(o.value).map(([I,w])=>w.$validate());return (await Promise.allSettled(R)).every(I=>I.status==="fulfilled"?I.value:!1)}}catch{return !1}}function D(R=!0){return c.value?e.value:null}function C(){y.value=[];}return i.$lazy.value||M(),vue.reactive({$dirty:c,...i,$externalErrors:y,$value:e,$rules:o,$reset:p,$touch:f,$validate:T,$unwatch:j,$watch:O,$extractDirtyFields:D,$clearExternalErrors:C})}function Ue({$id:e,path:t,index:r,options:n,storage:a,stateValue:l,customMessages:m,rules:x,externalErrors:F}){let S=x.$key?x.$key:ye(),$=`${t}.${String(S)}`;typeof l.value=="object"&&l.value!=null&&(l.value.$id?$=`${t}.${l.value.$id}`:Object.defineProperties(l.value,{$id:{value:S,enumerable:!1,configurable:!1,writable:!1}}));let i=vue.toRef(()=>F.value?.[r]),c=ie({state:l,rulesDef:vue.toRef(()=>x),customMessages:m,path:$,storage:a,options:n,externalErrors:i});if(c){let h=l.value?.$id;c.$id=h??String(S),a.addArrayStatus(e,c.$id,c);}return c}function We({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:m}){let x=vue.effectScope(),F,S=vue.effectScope(),$;if(Array.isArray(e.value)&&!t.value.$each)return null;let i=vue.ref(),c=vue.ref(e.value),h,y=vue.ref({}),v=a.getCollectionsEntry(n);$=S.run(()=>{let d=vue.computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(p=>typeof p!="object"):t.value.$each&&!(t.value.$each instanceof Function)?Object.values(t.value.$each).every(p=>te(p)):!1),o=vue.computed(()=>m.value?$e(m.value)?m.value.$errors??[]:[]:[]),s=vue.computed(()=>m.value?$e(m.value)?m.value.$each??[]:[]:[]);return {isPrimitiveArray:d,$externalErrorsField:o,$externalErrorsEach:s}}),_(),g();function _(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(i.value=ye(),Object.defineProperties(e.value,{$id:{value:i.value,enumerable:!1,configurable:!1,writable:!1}})):e.value?.$id&&(i.value=e.value.$id)),!$.isPrimitiveArray.value&&(c.value=y.value.$value,Array.isArray(e.value)&&t.value.$each?v.value=e.value.map((d,o)=>{let s=me(t.value.$each,vue.toRef(()=>d),o);if(s){let p=Ue({$id:i.value,path:n,rules:s,stateValue:vue.toRef(()=>d),index:o,options:l,storage:a,externalErrors:$.$externalErrorsEach});return p||null}}).filter(d=>!!d):v.value=[],y.value=oe({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:$.$externalErrorsField,$isArray:!0}));}function u(){if(Array.isArray(e.value)){let d=q(v.value);v.value=e.value.map((o,s)=>{let p=vue.toRef(()=>o);if(o.$id&&v.value.find(f=>f.$id===o.$id)){let f=a.getArrayStatus(i.value,o.$id);return f?(f.$value=p,f):null}else {let f=me(t.value.$each,p,s);if(f){let T=Ue({$id:i.value,path:n,rules:f,stateValue:p,index:s,options:l,storage:a,externalErrors:$.$externalErrorsEach});return T||null}}}).filter(o=>!!o),d.filter(o=>!e.value.find(s=>o.$id===s.$id)).forEach((o,s)=>{a.deleteArrayStatus(i.value,s.toString());});}else v.value=[];}function g(){h=vue.watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")?_():u();},{deep:Q?1:!0,flush:"pre"}),F=x.run(()=>{let d=vue.computed(()=>y.value.$dirty&&v.value.every(R=>R.$dirty)),o=vue.computed(()=>y.value.$anyDirty||v.value.some(R=>R.$dirty)),s=vue.computed(()=>y.value.$invalid||v.value.some(R=>R.$invalid)),p=vue.computed(()=>y.value.$valid&&v.value.every(R=>R.$valid)),f=vue.computed(()=>y.value.$error||v.value.some(R=>R.$error)),T=vue.computed(()=>!s.value&&!M.value),M=vue.computed(()=>y.value.$pending||v.value.some(R=>R.$pending)),D=vue.computed(()=>({$errors:y.value.$errors,$each:v.value.map(R=>R.$errors)})),C=vue.computed(()=>({$errors:y.value.$silentErrors,$each:v.value.map(R=>R.$silentErrors)}));return {$dirty:d,$anyDirty:o,$invalid:s,$valid:p,$error:f,$pending:M,$errors:D,$silentErrors:C,$ready:T}}),$.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`),h());}function E(){h&&h(),y.value&&y.value.$unwatch(),v.value&&v.value.forEach(d=>{"$dirty"in d&&d.$unwatch();}),x.stop(),x=vue.effectScope(),S.stop(),S=vue.effectScope(!0);}function A(){y.value.$touch(),v.value.forEach(d=>{d.$touch();});}function k(){y.value.$reset(),v.value.forEach(d=>{d.$reset();});}async function V(){try{return (await Promise.all([y.value.$validate(),...v.value.map(o=>o.$validate())])).every(o=>!!o)}catch{return !1}}function b(){y.value.$clearExternalErrors(),v.value.forEach(d=>{d.$clearExternalErrors();});}function j(d=!0){let o=v.value.map(s=>{if(ve(s))return s.$extractDirtyFields(d)});return d&&(o=o.filter(s=>N(s)?!L(s):!!s)),o}async function O(){return A(),await V()?e.value:!1}return vue.reactive({$field:y,...F,$each:v,$value:e,$validate:V,$unwatch:E,$watch:g,$touch:A,$reset:k,$extractDirtyFields:j,$parse:O,$clearExternalErrors:b})}function xe({scopeRules:e,state:t,customMessages:r,path:n="",rootRules:a,storage:l,options:m,externalErrors:x,validationGroups:F,initialState:S,processedState:$}){let i,c,h=null;function _(s=!0,p=!1){u.value=null,vue.triggerRef(u);let f=Object.fromEntries(Object.entries(e.value).map(([D,C])=>{if(C){let R=vue.toRef(t.value,D),P=vue.toRef(()=>C),I=vue.toRef(()=>x.value?.[D]);return [D,ie({state:R,rulesDef:P,customMessages:r,path:n?`${n}.${D}`:D,storage:l,options:m,externalErrors:I})]}return []}).filter(D=>!!D.length&&D[1]!=null)),T=Object.fromEntries(Object.entries(vue.unref(x)??{}).filter(([D])=>!(D in e.value)).map(([D,C])=>{if(C){let R=vue.toRef(()=>({})),P=vue.toRef(()=>C);return [D,ie({state:vue.ref(void 0),rulesDef:R,customMessages:r,path:n?`${n}.${D}`:D,storage:l,options:m,externalErrors:P})]}return []})),M=Object.fromEntries(Object.entries(F?.(f)??{}).map(([D,C])=>C.length?[D,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(R=>[R,Oe(vue.toRef(()=>C),R)])),...Object.fromEntries(["$errors","$silentErrors"].map(R=>[R,Ae(vue.toRef(()=>C),R)]))}]:[]));u.value={...f,...T,...M},s&&k();}let u=l.getFieldsEntry(n);_();function g(){_(!1),Object.entries(u.value).forEach(([s,p])=>{p.$reset();}),k();}function E(){Object.entries(u.value).forEach(([s,p])=>{p.$touch();});}async function A(){try{return (await Promise.allSettled(Object.entries(u.value).map(([p,f])=>f.$validate()))).every(p=>p.status==="fulfilled"?p.value:!1)}catch{return !1}}function k(){a&&(h=vue.watch(a,()=>{V(),_();},{deep:Q?1:!0,flush:"post"})),i=vue.effectScope(),c=i.run(()=>{let s=vue.computed(()=>!!Object.entries(u.value).length&&Object.entries(u.value).every(([I,w])=>w.$dirty)),p=vue.computed(()=>Object.entries(u.value).some(([I,w])=>w.$dirty)),f=vue.computed(()=>Object.entries(u.value).some(([I,w])=>w.$invalid)),T=vue.computed(()=>Object.entries(u.value).every(([I,w])=>w.$valid)),M=vue.computed(()=>s.value&&!C.value&&f.value),D=vue.computed(()=>!f.value&&!C.value),C=vue.computed(()=>Object.entries(u.value).some(([I,w])=>w.$pending)),R=vue.computed(()=>Object.fromEntries(Object.entries(u.value).map(([I,w])=>[I,w.$errors]))),P=vue.computed(()=>Object.fromEntries(Object.entries(u.value).map(([I,w])=>[I,w.$silentErrors])));return {$dirty:s,$anyDirty:p,$invalid:f,$valid:T,$error:M,$pending:C,$errors:R,$silentErrors:P,$ready:D}});}function V(){u.value&&Object.entries(u.value).forEach(([s,p])=>{p.$unwatch();}),h?.(),i.stop(),i=vue.effectScope();}function b(){Object.entries(u.value).forEach(([s,p])=>{p.$clearExternalErrors();});}function j(){S&&(V(),O(t,S),g());}function O(s,p){Object.entries(p).forEach(([f,T])=>{let M=vue.isRef(s)?s.value:s,D=vue.isRef(M[f])?M[f].value:M[f],C=vue.isRef(p[f])?p[f]._value:p[f];Array.isArray(C)&&Array.isArray(D)?(M[f]=[],C.forEach((R,P)=>{M[f][P]={},O(M[f][P],C[P]);})):N(C)?O(D,C):vue.isRef(M[f])?M[f].value=C:M[f]=C;});}function d(s=!0){let p=Object.entries(u.value).map(([f,T])=>[f,T.$extractDirtyFields(s)]);return s&&(p=p.filter(([f,T])=>N(T)?!L(T):Array.isArray(T)?T.length:!!T)),Object.fromEntries(p)}async function o(){return E(),await A()?t.value:!1}return vue.reactive({...c,$fields:u,$value:t,...S&&{$resetAll:j},$reset:g,$touch:E,$validate:A,$unwatch:V,$watch:k,$clearExternalErrors:b,$extractDirtyFields:d,$parse:o})}function ie({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:m,index:x,onUnwatch:F}){return _e(t)?We({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,index:x,externalErrors:m}):je(e,t)&&Ve(e)?xe({scopeRules:t,state:e,customMessages:r,path:n,storage:a,options:l,index:x,externalErrors:m}):ke(t)?oe({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,index:x,externalErrors:m,onUnwatch:F}):null}function he(e,t,r,n,a,l){let m=ge(),x=vue.computed(()=>vue.unref(r.externalErrors));return vue.reactive(xe({rootRules:e,scopeRules:e,state:t,customMessages:l?.(),storage:m,options:r,externalErrors:x,validationGroups:r.validationGroups,processedState:n,initialState:a}))}function Te(e,t){let r={autoDirty:t?.autoDirty??!0,lazy:t?.lazy??!1,rewardEarly:t?.rewardEarly??!1};function n(a,l,m){let x=vue.isRef(l)?l:vue.computed(typeof l=="function"?l:()=>l),F={...r,...m},S=vue.isRef(a)?a:vue.ref(a),$=q(vue.toRaw(S.value));return {r$:he(x,S,F,S,$,e)}}return n}var Le=Te();function De(){function e(t,r){return r}return e}var Ce=De();function ze({rules:e,modifiers:t}){let r=Te(e,t),n=De();return {useRegle:r,inferRules:n}}exports.InternalRuleType=Re;exports.createRule=de;exports.defineRegleConfig=ze;exports.inferRules=Ce;exports.unwrapRuleParameters=B;exports.useRegle=Le;
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { MaybeRef, Ref, UnwrapRef, UnwrapNestedRefs, ComputedRef } from 'vue';
1
+ import { MaybeRef, Ref, UnwrapRef, UnwrapNestedRefs, MaybeRefOrGetter } from 'vue';
2
2
 
3
3
  type Prettify<T> = T extends infer R ? {
4
4
  [K in keyof R]: R[K];
@@ -6,7 +6,7 @@ type Prettify<T> = T extends infer R ? {
6
6
  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
- type ExtractFromGetter<T extends MaybeGetter<any, any, any>> = T extends MaybeGetter<infer U, any, any> ? U : never;
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
10
  type DeepMaybeRef<T extends Record<string, any>> = {
11
11
  [K in keyof T]: MaybeRef<T[K]>;
12
12
  };
@@ -18,6 +18,20 @@ type NoInferLegacy<A extends any> = [A][A extends any ? 0 : never];
18
18
 
19
19
  type ArrayElement<T> = T extends Array<infer U> ? U : never;
20
20
 
21
+ /**
22
+ Matches any [primitive value](https://developer.mozilla.org/en-US/docs/Glossary/Primitive).
23
+
24
+ @category Type
25
+ */
26
+ type Primitive =
27
+ | null
28
+ | undefined
29
+ | string
30
+ | number
31
+ | boolean
32
+ | symbol
33
+ | bigint;
34
+
21
35
  declare global {
22
36
  // eslint-disable-next-line @typescript-eslint/consistent-type-definitions -- It has to be an `interface` so that it can be merged.
23
37
  interface SymbolConstructor {
@@ -55,6 +69,119 @@ Unfortunately, `Record<string, never>`, `Record<keyof any, never>` and `Record<n
55
69
  */
56
70
  type EmptyObject = {[emptyObjectSymbol]?: never};
57
71
 
72
+ /**
73
+ Matches any primitive, `void`, `Date`, or `RegExp` value.
74
+ */
75
+ type BuiltIns = Primitive | void | Date | RegExp;
76
+
77
+ /**
78
+ @see PartialDeep
79
+ */
80
+ type PartialDeepOptions = {
81
+ /**
82
+ Whether to affect the individual elements of arrays and tuples.
83
+
84
+ @default false
85
+ */
86
+ readonly recurseIntoArrays?: boolean;
87
+ };
88
+
89
+ /**
90
+ Create a type from another type with all keys and nested keys set to optional.
91
+
92
+ Use-cases:
93
+ - Merging a default settings/config object with another object, the second object would be a deep partial of the default object.
94
+ - Mocking and testing complex entities, where populating an entire object with its keys would be redundant in terms of the mock or test.
95
+
96
+ @example
97
+ ```
98
+ import type {PartialDeep} from 'type-fest';
99
+
100
+ const settings: Settings = {
101
+ textEditor: {
102
+ fontSize: 14;
103
+ fontColor: '#000000';
104
+ fontWeight: 400;
105
+ }
106
+ autocomplete: false;
107
+ autosave: true;
108
+ };
109
+
110
+ const applySavedSettings = (savedSettings: PartialDeep<Settings>) => {
111
+ return {...settings, ...savedSettings};
112
+ }
113
+
114
+ settings = applySavedSettings({textEditor: {fontWeight: 500}});
115
+ ```
116
+
117
+ By default, this does not affect elements in array and tuple types. You can change this by passing `{recurseIntoArrays: true}` as the second type argument:
118
+
119
+ ```
120
+ import type {PartialDeep} from 'type-fest';
121
+
122
+ interface Settings {
123
+ languages: string[];
124
+ }
125
+
126
+ const partialSettings: PartialDeep<Settings, {recurseIntoArrays: true}> = {
127
+ languages: [undefined]
128
+ };
129
+ ```
130
+
131
+ @category Object
132
+ @category Array
133
+ @category Set
134
+ @category Map
135
+ */
136
+ type PartialDeep<T, Options extends PartialDeepOptions = {}> = T extends BuiltIns | (((...arguments_: any[]) => unknown)) | (new (...arguments_: any[]) => unknown)
137
+ ? T
138
+ : T extends Map<infer KeyType, infer ValueType>
139
+ ? PartialMapDeep<KeyType, ValueType, Options>
140
+ : T extends Set<infer ItemType>
141
+ ? PartialSetDeep<ItemType, Options>
142
+ : T extends ReadonlyMap<infer KeyType, infer ValueType>
143
+ ? PartialReadonlyMapDeep<KeyType, ValueType, Options>
144
+ : T extends ReadonlySet<infer ItemType>
145
+ ? PartialReadonlySetDeep<ItemType, Options>
146
+ : T extends object
147
+ ? T extends ReadonlyArray<infer ItemType> // Test for arrays/tuples, per https://github.com/microsoft/TypeScript/issues/35156
148
+ ? Options['recurseIntoArrays'] extends true
149
+ ? ItemType[] extends T // Test for arrays (non-tuples) specifically
150
+ ? readonly ItemType[] extends T // Differentiate readonly and mutable arrays
151
+ ? ReadonlyArray<PartialDeep<ItemType | undefined, Options>>
152
+ : Array<PartialDeep<ItemType | undefined, Options>>
153
+ : PartialObjectDeep<T, Options> // Tuples behave properly
154
+ : T // If they don't opt into array testing, just use the original type
155
+ : PartialObjectDeep<T, Options>
156
+ : unknown;
157
+
158
+ /**
159
+ Same as `PartialDeep`, but accepts only `Map`s and as inputs. Internal helper for `PartialDeep`.
160
+ */
161
+ type PartialMapDeep<KeyType, ValueType, Options extends PartialDeepOptions> = {} & Map<PartialDeep<KeyType, Options>, PartialDeep<ValueType, Options>>;
162
+
163
+ /**
164
+ Same as `PartialDeep`, but accepts only `Set`s as inputs. Internal helper for `PartialDeep`.
165
+ */
166
+ type PartialSetDeep<T, Options extends PartialDeepOptions> = {} & Set<PartialDeep<T, Options>>;
167
+
168
+ /**
169
+ Same as `PartialDeep`, but accepts only `ReadonlyMap`s as inputs. Internal helper for `PartialDeep`.
170
+ */
171
+ type PartialReadonlyMapDeep<KeyType, ValueType, Options extends PartialDeepOptions> = {} & ReadonlyMap<PartialDeep<KeyType, Options>, PartialDeep<ValueType, Options>>;
172
+
173
+ /**
174
+ Same as `PartialDeep`, but accepts only `ReadonlySet`s as inputs. Internal helper for `PartialDeep`.
175
+ */
176
+ type PartialReadonlySetDeep<T, Options extends PartialDeepOptions> = {} & ReadonlySet<PartialDeep<T, Options>>;
177
+
178
+ /**
179
+ Same as `PartialDeep`, but accepts only `object`s as inputs. Internal helper for `PartialDeep`.
180
+ */
181
+ type PartialObjectDeep<ObjectType extends object, Options extends PartialDeepOptions> = {
182
+ [KeyType in keyof ObjectType]?: PartialDeep<ObjectType[KeyType], Options>
183
+ };
184
+
58
185
  /**
59
186
  Convert a union type to an intersection type using [distributive conditional types](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html#distributive-conditional-types).
60
187
 
@@ -117,9 +244,18 @@ type UnionToIntersection<Union> = (
117
244
  ? Intersection & Union
118
245
  : never;
119
246
 
247
+ type useRegleFn<TCustomRules extends Partial<AllRulesDeclarations>> = <TState extends Record<string, any>, TRules extends ReglePartialValidationTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules> & TValid, TExternal extends RegleExternalErrorTree<Unwrap<TState>>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]>, TValid = isDeepExact<NoInferLegacy<TRules>, ReglePartialValidationTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules>> extends true ? {} : never>(state: MaybeRef<TState> | DeepReactiveState<TState>, rulesFactory: MaybeRefOrGetter<TRules>, options?: Partial<DeepMaybeRef<RegleBehaviourOptions>> & LocalRegleBehaviourOptions<Unwrap<TState>, TRules, TExternal, TValidationGroups>) => Regle<Unwrap<TState>, TRules, TExternal, TValidationGroups>;
248
+ declare const useRegle: useRegleFn<Partial<AllRulesDeclarations>>;
249
+
250
+ interface inferRulesFn<TCustomRules extends Partial<AllRulesDeclarations>> {
251
+ <TState extends Record<string, any>, TRules extends ReglePartialValidationTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules> & TValid, TValid = isDeepExact<NoInferLegacy<TRules>, ReglePartialValidationTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules>> extends true ? {} : never>(state: MaybeRef<TState> | DeepReactiveState<TState>, rulesFactory: TRules): typeof rulesFactory;
252
+ <TState extends unknown, TRules extends RegleRuleDecl>(state: MaybeRef<TState>, rulesFactory: TRules): typeof rulesFactory;
253
+ }
254
+ declare const inferRules: inferRulesFn<Partial<AllRulesDeclarations>>;
255
+
120
256
  interface RegleBehaviourOptions {
121
257
  /**
122
- * Only display error when calling `validateState()`
258
+ * Only display error when calling `r$.$parse()`
123
259
  * @default false
124
260
  */
125
261
  lazy?: boolean;
@@ -129,7 +265,7 @@ interface RegleBehaviourOptions {
129
265
  */
130
266
  autoDirty?: boolean;
131
267
  /**
132
- * The fields will turn valid when they are, but not invalid unless calling `validateState()`
268
+ * The fields will turn valid when they are, but not invalid unless calling `r$.$parse()`
133
269
  * @default false
134
270
  *
135
271
  * @experimental report any bug
@@ -158,16 +294,7 @@ type AddDollarToOptions<T extends Record<string, any>> = {
158
294
  };
159
295
 
160
296
  interface Regle<TState extends Record<string, any> = EmptyObject, TRules extends ReglePartialValidationTree<TState, CustomRulesDeclarationTree> = EmptyObject, TExternal extends RegleExternalErrorTree<TState> = never, TValidationGroups extends Record<string, RegleValidationGroupEntry[]> = never> {
161
- regle: RegleStatus<TState, TRules, TValidationGroups>;
162
- r$: RegleStatus<TState, TRules, TValidationGroups>;
163
- /** Show active errors based on your behaviour options (lazy, autoDirty)
164
- * It allow you to skip scouting the `regle` object
165
- */
166
- errors: RegleErrorTree<TRules, TExternal>;
167
- ready: ComputedRef<boolean>;
168
- resetAll: () => void;
169
- validateState: () => Promise<false | Prettify<DeepSafeFormState<TState, TRules>>>;
170
- state: Ref<TState>;
297
+ r$: RegleRoot<TState, TRules, TValidationGroups, TExternal>;
171
298
  }
172
299
  type isDeepExact<T, U> = {
173
300
  [K in keyof T]-?: CheckDeepExact<NonNullable<T[K]>, K extends keyof U ? NonNullable<U[K]> : never>;
@@ -184,6 +311,10 @@ type DeepSafeFormState<TState extends Record<string, any>, TRules extends RegleP
184
311
  [K in keyof TState as [SafeProperty<TState[K], TRules[K]>] extends [never] ? never : K]-?: SafeProperty<TState[K], TRules[K]>;
185
312
  };
186
313
  type SafeProperty<TState, TRule extends RegleFormPropertyType<any, any> | undefined = never> = TRule extends RegleCollectionRuleDefinition<any, any> ? TState extends Array<any> ? SafeProperty<TState[number], ExtractFromGetter<TRule['$each']>>[] : never : TRule extends ReglePartialValidationTree<any, any> ? TState extends Record<string, any> ? DeepSafeFormState<TState, TRule> : TRule extends RegleRuleDecl<any, any> ? unknown extends TRule['required'] ? never : TRule['required'] extends undefined ? never : TRule['required'] extends RegleRuleDefinition<any, infer Params, any, any, any> ? Params extends never[] ? TState : never : never : never : never;
314
+ type InferRegleRules<T extends useRegleFn<any>> = T extends useRegleFn<infer U> ? UnwrapRuleTree<Partial<U> & Partial<DefaultValidators>> : {};
315
+ type RegleRequiredRules<T extends Partial<AllRulesDeclarations> | useRegleFn<any>, TRules extends T extends useRegleFn<any> ? keyof InferRegleRules<T> : keyof T> = Omit<T extends useRegleFn<any> ? InferRegleRules<T> : T extends Partial<AllRulesDeclarations> ? UnwrapRuleTree<T> : {}, TRules> & {
316
+ [K in TRules]-?: T extends useRegleFn<any> ? K extends keyof InferRegleRules<T> ? NonNullable<InferRegleRules<T>[K]> : never : K extends keyof T ? NonNullable<T[K]> : never;
317
+ };
187
318
 
188
319
  type ParamDecl<T = any> = MaybeRef<Maybe<T>> | (() => Maybe<T>);
189
320
  type CreateFn<T extends any[]> = (...args: T) => any;
@@ -239,6 +370,12 @@ type RegleRuleMetadataExtended = {
239
370
  $valid: boolean;
240
371
  [x: string]: any;
241
372
  };
373
+ type UnwrapRuleTree<T extends {
374
+ [x: string]: RegleRuleRaw<any> | undefined;
375
+ }> = {
376
+ [K in keyof T]: UnwrapRuleWithParams<T[K]>;
377
+ };
378
+ type UnwrapRuleWithParams<T extends RegleRuleRaw<any> | undefined> = T extends RegleRuleWithParamsDefinition<infer TValue, infer TParams, infer TAsync, infer TMetadata> ? RegleRuleDefinition<TValue, TParams, TAsync, TMetadata> : T;
242
379
  /**
243
380
  * Define a rule Metadata definition
244
381
  */
@@ -259,7 +396,7 @@ type PossibleRegleRuleMetadataConsumer = DefaultMetadataProperties & {
259
396
  /**
260
397
  * Generic types for a created RegleRule
261
398
  */
262
- type RegleRuleRaw<TValue extends any = any, TParams extends any[] = [], TAsync extends boolean = false, TMetaData extends RegleRuleMetadataDefinition = boolean> = RegleRuleDefinition<TValue, TParams, TAsync, TMetaData> | RegleRuleWithParamsDefinition<TValue, TParams, TAsync, TMetaData>;
399
+ type RegleRuleRaw<TValue extends any = any, TParams extends any[] = [], TAsync extends boolean = boolean, TMetaData extends RegleRuleMetadataDefinition = boolean> = RegleRuleDefinition<TValue, TParams, TAsync, TMetaData> | RegleRuleWithParamsDefinition<TValue, TParams, TAsync, TMetaData>;
263
400
  /**
264
401
  * Process the type of a created rule with `createRule`.
265
402
  * For a rule with params it will return a function
@@ -345,7 +482,10 @@ type DefaultValidators = {
345
482
  numeric: RegleRuleDefinition<string | number, [], false, boolean, string | number>;
346
483
  regex: RegleRuleWithParamsDefinition<string, [regexp: RegExp], false, boolean>;
347
484
  required: RegleRuleDefinition<unknown, []>;
348
- sameAs: RegleRuleWithParamsDefinition<unknown, [target: unknown], false, boolean>;
485
+ sameAs: RegleRuleWithParamsDefinition<unknown, [
486
+ target: unknown,
487
+ otherName?: string
488
+ ], false, boolean>;
349
489
  startsWith: RegleRuleWithParamsDefinition<string, [part: Maybe<string>], false, boolean>;
350
490
  url: RegleRuleDefinition<string, [], false, boolean, string>;
351
491
  };
@@ -353,7 +493,9 @@ type DefaultValidators = {
353
493
  type CustomRulesDeclarationTree = {
354
494
  [x: string]: RegleRuleRaw<any, any, boolean, any> | undefined;
355
495
  };
356
- type AllRulesDeclarations = CustomRulesDeclarationTree & DefaultValidators;
496
+ type AllRulesDeclarations = CustomRulesDeclarationTree & {
497
+ [K in keyof DefaultValidators]: RegleRuleRaw<any, any, boolean, any> | undefined;
498
+ };
357
499
 
358
500
  /**
359
501
  * @public
@@ -433,17 +575,25 @@ type RegleExternalValidationErrorsReport<TExternalError extends RegleExternalVal
433
575
  /**
434
576
  * @public
435
577
  */
436
- type RegleStatus<TState extends Record<string, any> = Record<string, any>, TRules extends ReglePartialValidationTree<TState> = Record<string, any>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]> = never> = RegleCommonStatus<TState> & {
437
- readonly $fields: {
438
- readonly [TKey in keyof TRules]: InferRegleStatusType<NonNullable<TRules[TKey]>, TState, TKey>;
439
- };
440
- readonly $errors: RegleErrorTree<TRules>;
441
- readonly $silentErrors: RegleErrorTree<TRules>;
578
+ type RegleRoot<TState extends Record<string, any> = Record<string, any>, TRules extends ReglePartialValidationTree<TState> = Record<string, any>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]> = never, TExternal extends RegleExternalErrorTree<TState> = never> = RegleStatus<TState, TRules, TExternal> & {
579
+ $resetAll: () => void;
442
580
  } & ([TValidationGroups] extends [never] ? {} : {
443
581
  $groups: {
444
582
  readonly [TKey in keyof TValidationGroups]: RegleValidationGroupOutput;
445
583
  };
446
584
  });
585
+ /**
586
+ * @public
587
+ */
588
+ type RegleStatus<TState extends Record<string, any> = Record<string, any>, TRules extends ReglePartialValidationTree<TState> = Record<string, any>, TExternal extends RegleExternalErrorTree<TState> = never> = RegleCommonStatus<TState> & {
589
+ readonly $fields: {
590
+ readonly [TKey in keyof TRules]: InferRegleStatusType<NonNullable<TRules[TKey]>, TState, TKey>;
591
+ };
592
+ readonly $errors: RegleErrorTree<TRules, TExternal>;
593
+ readonly $silentErrors: RegleErrorTree<TRules, TExternal>;
594
+ $extractDirtyFields: (filterNullishValues?: boolean) => PartialDeep<TState>;
595
+ $parse: () => Promise<false | Prettify<DeepSafeFormState<TState, TRules>>>;
596
+ };
447
597
  /**
448
598
  * @public
449
599
  */
@@ -451,13 +601,14 @@ type InferRegleStatusType<TRule extends RegleCollectionRuleDecl | RegleRuleDecl
451
601
  /**
452
602
  * @public
453
603
  */
454
- interface RegleFieldStatus<TState extends any = unknown, TRules extends RegleFormPropertyType<any, Partial<AllRulesDeclarations>> = Record<string, any>> extends RegleCommonStatus<TState> {
455
- $value: UnwrapNestedRefs<TState>;
604
+ interface RegleFieldStatus<TState extends any = any, TRules extends RegleFormPropertyType<any, Partial<AllRulesDeclarations>> = Record<string, any>> extends Omit<RegleCommonStatus<TState>, '$value'> {
605
+ $value: Maybe<UnwrapNestedRefs<TState>>;
456
606
  readonly $errors: string[];
457
607
  readonly $silentErrors: string[];
458
608
  readonly $externalErrors?: string[];
609
+ $extractDirtyFields: (filterNullishValues?: boolean) => TState | null;
459
610
  readonly $rules: {
460
- readonly [TRuleKey in keyof Omit<TRules, '$each' | keyof FieldRegleBehaviourOptions>]: RegleRuleStatus<TState, TRules[TRuleKey] extends RegleRuleDefinition<any, infer TParams, any> ? TParams : [], TRules[TRuleKey] extends RegleRuleDefinition<any, any, any, infer TMetadata> ? TMetadata : TRules[TRuleKey] extends InlineRuleDeclaration<any, any[], infer TMetadata> ? TMetadata extends Promise<infer P> ? P : TMetadata : never>;
611
+ readonly [TRuleKey in keyof Omit<TRules, '$each' | keyof FieldRegleBehaviourOptions>]: RegleRuleStatus<TState, TRules[TRuleKey] extends RegleRuleDefinition<any, infer TParams, any> ? TParams : [], TRules[TRuleKey] extends RegleRuleDefinition<any, any, any, infer TMetadata> ? TMetadata : TRules[TRuleKey] extends InlineRuleDeclaration<any, any[], infer TMetadata> ? TMetadata extends Promise<infer P> ? P : TMetadata : any>;
461
612
  };
462
613
  }
463
614
  /**
@@ -470,6 +621,7 @@ interface RegleCommonStatus<TValue = any> {
470
621
  readonly $anyDirty: boolean;
471
622
  readonly $pending: boolean;
472
623
  readonly $error: boolean;
624
+ readonly $ready: boolean;
473
625
  $id?: string;
474
626
  $value: UnwrapNestedRefs<TValue>;
475
627
  $touch(): void;
@@ -482,7 +634,7 @@ interface RegleCommonStatus<TValue = any> {
482
634
  /**
483
635
  * @public
484
636
  */
485
- type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata extends RegleRuleMetadataDefinition = never> = {
637
+ type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata extends RegleRuleMetadataDefinition = any> = {
486
638
  readonly $type: string;
487
639
  readonly $message: string | string[];
488
640
  readonly $active: boolean;
@@ -490,20 +642,24 @@ type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata exte
490
642
  readonly $pending: boolean;
491
643
  readonly $path: string;
492
644
  readonly $metadata: TMetadata;
493
- $validator: (value: TValue, ...args: TParams) => boolean | Promise<boolean>;
645
+ $validator: ((value: Maybe<TValue>, ...args: [TParams] extends [never[]] ? [] : [unknown[]] extends [TParams] ? any[] : TParams) => RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition>) & ((value: TValue, ...args: [TParams] extends [never[]] ? [] : [unknown[]] extends [TParams] ? any[] : TParams) => RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition>);
494
646
  $validate(): Promise<boolean>;
495
647
  $reset(): void;
496
- } & ([TParams] extends [[]] ? {} : {
648
+ } & ([TParams] extends [never[]] ? {} : [unknown[]] extends [TParams] ? {
649
+ readonly $params?: any[];
650
+ } : {
497
651
  readonly $params: TParams;
498
652
  });
499
653
  /**
500
654
  * @public
501
655
  */
502
- interface RegleCollectionStatus<TState extends any[] = any[], TRules extends RegleRuleDecl | ReglePartialValidationTree<any> = Record<string, any>, TFieldRule extends RegleCollectionRuleDecl<any, any> = never> extends Omit<RegleFieldStatus<TState, TRules>, '$errors' | '$silentErrors'> {
656
+ interface RegleCollectionStatus<TState extends any[] = any[], TRules extends RegleRuleDecl | ReglePartialValidationTree<any> = Record<string, any>, TFieldRule extends RegleCollectionRuleDecl<any, any> = never> extends Omit<RegleFieldStatus<TState, TRules>, '$errors' | '$silentErrors' | '$extractDirtyFields'> {
503
657
  readonly $each: Array<InferRegleStatusType<NonNullable<TRules>, NonNullable<TState>, number>>;
504
658
  readonly $field: RegleFieldStatus<TState, TFieldRule>;
505
659
  readonly $errors: RegleErrorTree<TRules>;
506
660
  readonly $silentErrors: RegleErrorTree<TRules>;
661
+ $extractDirtyFields: (filterNullishValues?: boolean) => PartialDeep<TState>;
662
+ $parse: () => Promise<false | SafeProperty<TState, TRules>>;
507
663
  }
508
664
 
509
665
  /**
@@ -545,15 +701,6 @@ declare function createRule<TValue extends any, TParams extends any[], TReturn e
545
701
  */
546
702
  declare function unwrapRuleParameters<TParams extends any[]>(params: ParamDecl[]): TParams;
547
703
 
548
- type useRegleFn<TCustomRules extends Partial<AllRulesDeclarations>> = <TState extends Record<string, any>, TRules extends ReglePartialValidationTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules> & TValid, TExternal extends RegleExternalErrorTree<Unwrap<TState>>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]>, TValid = isDeepExact<NoInferLegacy<TRules>, ReglePartialValidationTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules>> extends true ? {} : never>(state: MaybeRef<TState> | DeepReactiveState<TState>, rulesFactory: TRules | (() => TRules) | ComputedRef<TRules>, options?: Partial<DeepMaybeRef<RegleBehaviourOptions>> & LocalRegleBehaviourOptions<Unwrap<TState>, TRules, TExternal, TValidationGroups>) => Regle<Unwrap<TState>, TRules, TExternal, TValidationGroups>;
549
- declare const useRegle: useRegleFn<Partial<AllRulesDeclarations>>;
550
-
551
- interface inferRulesFn<TCustomRules extends Partial<AllRulesDeclarations>> {
552
- <TState extends Record<string, any>, TRules extends ReglePartialValidationTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules> & TValid, TValid = isDeepExact<NoInferLegacy<TRules>, ReglePartialValidationTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules>> extends true ? {} : never>(state: MaybeRef<TState> | DeepReactiveState<TState>, rulesFactory: TRules): typeof rulesFactory;
553
- <TState extends unknown, TRules extends RegleRuleDecl>(state: MaybeRef<TState>, rulesFactory: TRules): typeof rulesFactory;
554
- }
555
- declare const inferRules: inferRulesFn<Partial<AllRulesDeclarations>>;
556
-
557
704
  declare function defineRegleConfig<TCustomRules extends Partial<AllRulesDeclarations>>({ rules, modifiers, }: {
558
705
  rules?: () => TCustomRules;
559
706
  modifiers?: RegleBehaviourOptions;
@@ -562,4 +709,4 @@ declare function defineRegleConfig<TCustomRules extends Partial<AllRulesDeclarat
562
709
  inferRules: inferRulesFn<TCustomRules>;
563
710
  };
564
711
 
565
- export { type DeepMaybeRef, type FormRuleDeclaration, type InlineRuleDeclaration, InternalRuleType, type LocalRegleBehaviourOptions, type Maybe, type ParamDecl, type Regle, type RegleBehaviourOptions, type RegleCollectionErrors, type RegleCollectionRuleDecl, type RegleCollectionRuleDefinition, type RegleCollectionStatus, type RegleCommonStatus, type RegleComputedRules, type RegleErrorTree, type RegleExternalCollectionErrors, type RegleExternalErrorTree, type RegleExternalValidationErrors, type RegleExternalValidationErrorsReport, type RegleFieldStatus, type RegleFormPropertyType, type RegleInternalRuleDefs, type ReglePartialValidationTree, type RegleRuleCore, type RegleRuleDecl, type RegleRuleDefinition, type RegleRuleDefinitionProcessor, type RegleRuleDefinitionWithMetadataProcessor, type RegleRuleInit, type RegleRuleMetadataConsumer, type RegleRuleMetadataDefinition, type RegleRuleRaw, type RegleRuleStatus, type RegleRuleWithParamsDefinition, type RegleStatus, type RegleUniversalParams, type RegleValidationErrors, type RegleValidationGroupEntry, type RegleValidationGroupOutput, type RegleValidationTree, type Unwrap, type UnwrapRegleUniversalParams, createRule, defineRegleConfig, inferRules, unwrapRuleParameters, useRegle };
712
+ export { type AllRulesDeclarations, type DeepMaybeRef, type FormRuleDeclaration, type InferRegleRule, type InferRegleRules, type InlineRuleDeclaration, InternalRuleType, type LocalRegleBehaviourOptions, type Maybe, type ParamDecl, type Regle, type RegleBehaviourOptions, type RegleCollectionErrors, type RegleCollectionRuleDecl, type RegleCollectionRuleDefinition, type RegleCollectionStatus, type RegleCommonStatus, type RegleComputedRules, type RegleErrorTree, type RegleExternalCollectionErrors, type RegleExternalErrorTree, type RegleExternalValidationErrors, type RegleExternalValidationErrorsReport, type RegleFieldStatus, type RegleFormPropertyType, type RegleInternalRuleDefs, type ReglePartialValidationTree, type RegleRequiredRules, type RegleRoot, type RegleRuleCore, type RegleRuleDecl, type RegleRuleDefinition, type RegleRuleDefinitionProcessor, type RegleRuleDefinitionWithMetadataProcessor, type RegleRuleInit, type RegleRuleMetadataConsumer, type RegleRuleMetadataDefinition, type RegleRuleRaw, type RegleRuleStatus, type RegleRuleWithParamsDefinition, type RegleStatus, type RegleUniversalParams, type RegleValidationErrors, type RegleValidationGroupEntry, type RegleValidationGroupOutput, type RegleValidationTree, type Unwrap, type UnwrapRegleUniversalParams, type UnwrapRuleWithParams, createRule, defineRegleConfig, inferRules, unwrapRuleParameters, useRegle };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { MaybeRef, Ref, UnwrapRef, UnwrapNestedRefs, ComputedRef } from 'vue';
1
+ import { MaybeRef, Ref, UnwrapRef, UnwrapNestedRefs, MaybeRefOrGetter } from 'vue';
2
2
 
3
3
  type Prettify<T> = T extends infer R ? {
4
4
  [K in keyof R]: R[K];
@@ -6,7 +6,7 @@ type Prettify<T> = T extends infer R ? {
6
6
  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
- type ExtractFromGetter<T extends MaybeGetter<any, any, any>> = T extends MaybeGetter<infer U, any, any> ? U : never;
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
10
  type DeepMaybeRef<T extends Record<string, any>> = {
11
11
  [K in keyof T]: MaybeRef<T[K]>;
12
12
  };
@@ -18,6 +18,20 @@ type NoInferLegacy<A extends any> = [A][A extends any ? 0 : never];
18
18
 
19
19
  type ArrayElement<T> = T extends Array<infer U> ? U : never;
20
20
 
21
+ /**
22
+ Matches any [primitive value](https://developer.mozilla.org/en-US/docs/Glossary/Primitive).
23
+
24
+ @category Type
25
+ */
26
+ type Primitive =
27
+ | null
28
+ | undefined
29
+ | string
30
+ | number
31
+ | boolean
32
+ | symbol
33
+ | bigint;
34
+
21
35
  declare global {
22
36
  // eslint-disable-next-line @typescript-eslint/consistent-type-definitions -- It has to be an `interface` so that it can be merged.
23
37
  interface SymbolConstructor {
@@ -55,6 +69,119 @@ Unfortunately, `Record<string, never>`, `Record<keyof any, never>` and `Record<n
55
69
  */
56
70
  type EmptyObject = {[emptyObjectSymbol]?: never};
57
71
 
72
+ /**
73
+ Matches any primitive, `void`, `Date`, or `RegExp` value.
74
+ */
75
+ type BuiltIns = Primitive | void | Date | RegExp;
76
+
77
+ /**
78
+ @see PartialDeep
79
+ */
80
+ type PartialDeepOptions = {
81
+ /**
82
+ Whether to affect the individual elements of arrays and tuples.
83
+
84
+ @default false
85
+ */
86
+ readonly recurseIntoArrays?: boolean;
87
+ };
88
+
89
+ /**
90
+ Create a type from another type with all keys and nested keys set to optional.
91
+
92
+ Use-cases:
93
+ - Merging a default settings/config object with another object, the second object would be a deep partial of the default object.
94
+ - Mocking and testing complex entities, where populating an entire object with its keys would be redundant in terms of the mock or test.
95
+
96
+ @example
97
+ ```
98
+ import type {PartialDeep} from 'type-fest';
99
+
100
+ const settings: Settings = {
101
+ textEditor: {
102
+ fontSize: 14;
103
+ fontColor: '#000000';
104
+ fontWeight: 400;
105
+ }
106
+ autocomplete: false;
107
+ autosave: true;
108
+ };
109
+
110
+ const applySavedSettings = (savedSettings: PartialDeep<Settings>) => {
111
+ return {...settings, ...savedSettings};
112
+ }
113
+
114
+ settings = applySavedSettings({textEditor: {fontWeight: 500}});
115
+ ```
116
+
117
+ By default, this does not affect elements in array and tuple types. You can change this by passing `{recurseIntoArrays: true}` as the second type argument:
118
+
119
+ ```
120
+ import type {PartialDeep} from 'type-fest';
121
+
122
+ interface Settings {
123
+ languages: string[];
124
+ }
125
+
126
+ const partialSettings: PartialDeep<Settings, {recurseIntoArrays: true}> = {
127
+ languages: [undefined]
128
+ };
129
+ ```
130
+
131
+ @category Object
132
+ @category Array
133
+ @category Set
134
+ @category Map
135
+ */
136
+ type PartialDeep<T, Options extends PartialDeepOptions = {}> = T extends BuiltIns | (((...arguments_: any[]) => unknown)) | (new (...arguments_: any[]) => unknown)
137
+ ? T
138
+ : T extends Map<infer KeyType, infer ValueType>
139
+ ? PartialMapDeep<KeyType, ValueType, Options>
140
+ : T extends Set<infer ItemType>
141
+ ? PartialSetDeep<ItemType, Options>
142
+ : T extends ReadonlyMap<infer KeyType, infer ValueType>
143
+ ? PartialReadonlyMapDeep<KeyType, ValueType, Options>
144
+ : T extends ReadonlySet<infer ItemType>
145
+ ? PartialReadonlySetDeep<ItemType, Options>
146
+ : T extends object
147
+ ? T extends ReadonlyArray<infer ItemType> // Test for arrays/tuples, per https://github.com/microsoft/TypeScript/issues/35156
148
+ ? Options['recurseIntoArrays'] extends true
149
+ ? ItemType[] extends T // Test for arrays (non-tuples) specifically
150
+ ? readonly ItemType[] extends T // Differentiate readonly and mutable arrays
151
+ ? ReadonlyArray<PartialDeep<ItemType | undefined, Options>>
152
+ : Array<PartialDeep<ItemType | undefined, Options>>
153
+ : PartialObjectDeep<T, Options> // Tuples behave properly
154
+ : T // If they don't opt into array testing, just use the original type
155
+ : PartialObjectDeep<T, Options>
156
+ : unknown;
157
+
158
+ /**
159
+ Same as `PartialDeep`, but accepts only `Map`s and as inputs. Internal helper for `PartialDeep`.
160
+ */
161
+ type PartialMapDeep<KeyType, ValueType, Options extends PartialDeepOptions> = {} & Map<PartialDeep<KeyType, Options>, PartialDeep<ValueType, Options>>;
162
+
163
+ /**
164
+ Same as `PartialDeep`, but accepts only `Set`s as inputs. Internal helper for `PartialDeep`.
165
+ */
166
+ type PartialSetDeep<T, Options extends PartialDeepOptions> = {} & Set<PartialDeep<T, Options>>;
167
+
168
+ /**
169
+ Same as `PartialDeep`, but accepts only `ReadonlyMap`s as inputs. Internal helper for `PartialDeep`.
170
+ */
171
+ type PartialReadonlyMapDeep<KeyType, ValueType, Options extends PartialDeepOptions> = {} & ReadonlyMap<PartialDeep<KeyType, Options>, PartialDeep<ValueType, Options>>;
172
+
173
+ /**
174
+ Same as `PartialDeep`, but accepts only `ReadonlySet`s as inputs. Internal helper for `PartialDeep`.
175
+ */
176
+ type PartialReadonlySetDeep<T, Options extends PartialDeepOptions> = {} & ReadonlySet<PartialDeep<T, Options>>;
177
+
178
+ /**
179
+ Same as `PartialDeep`, but accepts only `object`s as inputs. Internal helper for `PartialDeep`.
180
+ */
181
+ type PartialObjectDeep<ObjectType extends object, Options extends PartialDeepOptions> = {
182
+ [KeyType in keyof ObjectType]?: PartialDeep<ObjectType[KeyType], Options>
183
+ };
184
+
58
185
  /**
59
186
  Convert a union type to an intersection type using [distributive conditional types](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html#distributive-conditional-types).
60
187
 
@@ -117,9 +244,18 @@ type UnionToIntersection<Union> = (
117
244
  ? Intersection & Union
118
245
  : never;
119
246
 
247
+ type useRegleFn<TCustomRules extends Partial<AllRulesDeclarations>> = <TState extends Record<string, any>, TRules extends ReglePartialValidationTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules> & TValid, TExternal extends RegleExternalErrorTree<Unwrap<TState>>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]>, TValid = isDeepExact<NoInferLegacy<TRules>, ReglePartialValidationTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules>> extends true ? {} : never>(state: MaybeRef<TState> | DeepReactiveState<TState>, rulesFactory: MaybeRefOrGetter<TRules>, options?: Partial<DeepMaybeRef<RegleBehaviourOptions>> & LocalRegleBehaviourOptions<Unwrap<TState>, TRules, TExternal, TValidationGroups>) => Regle<Unwrap<TState>, TRules, TExternal, TValidationGroups>;
248
+ declare const useRegle: useRegleFn<Partial<AllRulesDeclarations>>;
249
+
250
+ interface inferRulesFn<TCustomRules extends Partial<AllRulesDeclarations>> {
251
+ <TState extends Record<string, any>, TRules extends ReglePartialValidationTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules> & TValid, TValid = isDeepExact<NoInferLegacy<TRules>, ReglePartialValidationTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules>> extends true ? {} : never>(state: MaybeRef<TState> | DeepReactiveState<TState>, rulesFactory: TRules): typeof rulesFactory;
252
+ <TState extends unknown, TRules extends RegleRuleDecl>(state: MaybeRef<TState>, rulesFactory: TRules): typeof rulesFactory;
253
+ }
254
+ declare const inferRules: inferRulesFn<Partial<AllRulesDeclarations>>;
255
+
120
256
  interface RegleBehaviourOptions {
121
257
  /**
122
- * Only display error when calling `validateState()`
258
+ * Only display error when calling `r$.$parse()`
123
259
  * @default false
124
260
  */
125
261
  lazy?: boolean;
@@ -129,7 +265,7 @@ interface RegleBehaviourOptions {
129
265
  */
130
266
  autoDirty?: boolean;
131
267
  /**
132
- * The fields will turn valid when they are, but not invalid unless calling `validateState()`
268
+ * The fields will turn valid when they are, but not invalid unless calling `r$.$parse()`
133
269
  * @default false
134
270
  *
135
271
  * @experimental report any bug
@@ -158,16 +294,7 @@ type AddDollarToOptions<T extends Record<string, any>> = {
158
294
  };
159
295
 
160
296
  interface Regle<TState extends Record<string, any> = EmptyObject, TRules extends ReglePartialValidationTree<TState, CustomRulesDeclarationTree> = EmptyObject, TExternal extends RegleExternalErrorTree<TState> = never, TValidationGroups extends Record<string, RegleValidationGroupEntry[]> = never> {
161
- regle: RegleStatus<TState, TRules, TValidationGroups>;
162
- r$: RegleStatus<TState, TRules, TValidationGroups>;
163
- /** Show active errors based on your behaviour options (lazy, autoDirty)
164
- * It allow you to skip scouting the `regle` object
165
- */
166
- errors: RegleErrorTree<TRules, TExternal>;
167
- ready: ComputedRef<boolean>;
168
- resetAll: () => void;
169
- validateState: () => Promise<false | Prettify<DeepSafeFormState<TState, TRules>>>;
170
- state: Ref<TState>;
297
+ r$: RegleRoot<TState, TRules, TValidationGroups, TExternal>;
171
298
  }
172
299
  type isDeepExact<T, U> = {
173
300
  [K in keyof T]-?: CheckDeepExact<NonNullable<T[K]>, K extends keyof U ? NonNullable<U[K]> : never>;
@@ -184,6 +311,10 @@ type DeepSafeFormState<TState extends Record<string, any>, TRules extends RegleP
184
311
  [K in keyof TState as [SafeProperty<TState[K], TRules[K]>] extends [never] ? never : K]-?: SafeProperty<TState[K], TRules[K]>;
185
312
  };
186
313
  type SafeProperty<TState, TRule extends RegleFormPropertyType<any, any> | undefined = never> = TRule extends RegleCollectionRuleDefinition<any, any> ? TState extends Array<any> ? SafeProperty<TState[number], ExtractFromGetter<TRule['$each']>>[] : never : TRule extends ReglePartialValidationTree<any, any> ? TState extends Record<string, any> ? DeepSafeFormState<TState, TRule> : TRule extends RegleRuleDecl<any, any> ? unknown extends TRule['required'] ? never : TRule['required'] extends undefined ? never : TRule['required'] extends RegleRuleDefinition<any, infer Params, any, any, any> ? Params extends never[] ? TState : never : never : never : never;
314
+ type InferRegleRules<T extends useRegleFn<any>> = T extends useRegleFn<infer U> ? UnwrapRuleTree<Partial<U> & Partial<DefaultValidators>> : {};
315
+ type RegleRequiredRules<T extends Partial<AllRulesDeclarations> | useRegleFn<any>, TRules extends T extends useRegleFn<any> ? keyof InferRegleRules<T> : keyof T> = Omit<T extends useRegleFn<any> ? InferRegleRules<T> : T extends Partial<AllRulesDeclarations> ? UnwrapRuleTree<T> : {}, TRules> & {
316
+ [K in TRules]-?: T extends useRegleFn<any> ? K extends keyof InferRegleRules<T> ? NonNullable<InferRegleRules<T>[K]> : never : K extends keyof T ? NonNullable<T[K]> : never;
317
+ };
187
318
 
188
319
  type ParamDecl<T = any> = MaybeRef<Maybe<T>> | (() => Maybe<T>);
189
320
  type CreateFn<T extends any[]> = (...args: T) => any;
@@ -239,6 +370,12 @@ type RegleRuleMetadataExtended = {
239
370
  $valid: boolean;
240
371
  [x: string]: any;
241
372
  };
373
+ type UnwrapRuleTree<T extends {
374
+ [x: string]: RegleRuleRaw<any> | undefined;
375
+ }> = {
376
+ [K in keyof T]: UnwrapRuleWithParams<T[K]>;
377
+ };
378
+ type UnwrapRuleWithParams<T extends RegleRuleRaw<any> | undefined> = T extends RegleRuleWithParamsDefinition<infer TValue, infer TParams, infer TAsync, infer TMetadata> ? RegleRuleDefinition<TValue, TParams, TAsync, TMetadata> : T;
242
379
  /**
243
380
  * Define a rule Metadata definition
244
381
  */
@@ -259,7 +396,7 @@ type PossibleRegleRuleMetadataConsumer = DefaultMetadataProperties & {
259
396
  /**
260
397
  * Generic types for a created RegleRule
261
398
  */
262
- type RegleRuleRaw<TValue extends any = any, TParams extends any[] = [], TAsync extends boolean = false, TMetaData extends RegleRuleMetadataDefinition = boolean> = RegleRuleDefinition<TValue, TParams, TAsync, TMetaData> | RegleRuleWithParamsDefinition<TValue, TParams, TAsync, TMetaData>;
399
+ type RegleRuleRaw<TValue extends any = any, TParams extends any[] = [], TAsync extends boolean = boolean, TMetaData extends RegleRuleMetadataDefinition = boolean> = RegleRuleDefinition<TValue, TParams, TAsync, TMetaData> | RegleRuleWithParamsDefinition<TValue, TParams, TAsync, TMetaData>;
263
400
  /**
264
401
  * Process the type of a created rule with `createRule`.
265
402
  * For a rule with params it will return a function
@@ -345,7 +482,10 @@ type DefaultValidators = {
345
482
  numeric: RegleRuleDefinition<string | number, [], false, boolean, string | number>;
346
483
  regex: RegleRuleWithParamsDefinition<string, [regexp: RegExp], false, boolean>;
347
484
  required: RegleRuleDefinition<unknown, []>;
348
- sameAs: RegleRuleWithParamsDefinition<unknown, [target: unknown], false, boolean>;
485
+ sameAs: RegleRuleWithParamsDefinition<unknown, [
486
+ target: unknown,
487
+ otherName?: string
488
+ ], false, boolean>;
349
489
  startsWith: RegleRuleWithParamsDefinition<string, [part: Maybe<string>], false, boolean>;
350
490
  url: RegleRuleDefinition<string, [], false, boolean, string>;
351
491
  };
@@ -353,7 +493,9 @@ type DefaultValidators = {
353
493
  type CustomRulesDeclarationTree = {
354
494
  [x: string]: RegleRuleRaw<any, any, boolean, any> | undefined;
355
495
  };
356
- type AllRulesDeclarations = CustomRulesDeclarationTree & DefaultValidators;
496
+ type AllRulesDeclarations = CustomRulesDeclarationTree & {
497
+ [K in keyof DefaultValidators]: RegleRuleRaw<any, any, boolean, any> | undefined;
498
+ };
357
499
 
358
500
  /**
359
501
  * @public
@@ -433,17 +575,25 @@ type RegleExternalValidationErrorsReport<TExternalError extends RegleExternalVal
433
575
  /**
434
576
  * @public
435
577
  */
436
- type RegleStatus<TState extends Record<string, any> = Record<string, any>, TRules extends ReglePartialValidationTree<TState> = Record<string, any>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]> = never> = RegleCommonStatus<TState> & {
437
- readonly $fields: {
438
- readonly [TKey in keyof TRules]: InferRegleStatusType<NonNullable<TRules[TKey]>, TState, TKey>;
439
- };
440
- readonly $errors: RegleErrorTree<TRules>;
441
- readonly $silentErrors: RegleErrorTree<TRules>;
578
+ type RegleRoot<TState extends Record<string, any> = Record<string, any>, TRules extends ReglePartialValidationTree<TState> = Record<string, any>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]> = never, TExternal extends RegleExternalErrorTree<TState> = never> = RegleStatus<TState, TRules, TExternal> & {
579
+ $resetAll: () => void;
442
580
  } & ([TValidationGroups] extends [never] ? {} : {
443
581
  $groups: {
444
582
  readonly [TKey in keyof TValidationGroups]: RegleValidationGroupOutput;
445
583
  };
446
584
  });
585
+ /**
586
+ * @public
587
+ */
588
+ type RegleStatus<TState extends Record<string, any> = Record<string, any>, TRules extends ReglePartialValidationTree<TState> = Record<string, any>, TExternal extends RegleExternalErrorTree<TState> = never> = RegleCommonStatus<TState> & {
589
+ readonly $fields: {
590
+ readonly [TKey in keyof TRules]: InferRegleStatusType<NonNullable<TRules[TKey]>, TState, TKey>;
591
+ };
592
+ readonly $errors: RegleErrorTree<TRules, TExternal>;
593
+ readonly $silentErrors: RegleErrorTree<TRules, TExternal>;
594
+ $extractDirtyFields: (filterNullishValues?: boolean) => PartialDeep<TState>;
595
+ $parse: () => Promise<false | Prettify<DeepSafeFormState<TState, TRules>>>;
596
+ };
447
597
  /**
448
598
  * @public
449
599
  */
@@ -451,13 +601,14 @@ type InferRegleStatusType<TRule extends RegleCollectionRuleDecl | RegleRuleDecl
451
601
  /**
452
602
  * @public
453
603
  */
454
- interface RegleFieldStatus<TState extends any = unknown, TRules extends RegleFormPropertyType<any, Partial<AllRulesDeclarations>> = Record<string, any>> extends RegleCommonStatus<TState> {
455
- $value: UnwrapNestedRefs<TState>;
604
+ interface RegleFieldStatus<TState extends any = any, TRules extends RegleFormPropertyType<any, Partial<AllRulesDeclarations>> = Record<string, any>> extends Omit<RegleCommonStatus<TState>, '$value'> {
605
+ $value: Maybe<UnwrapNestedRefs<TState>>;
456
606
  readonly $errors: string[];
457
607
  readonly $silentErrors: string[];
458
608
  readonly $externalErrors?: string[];
609
+ $extractDirtyFields: (filterNullishValues?: boolean) => TState | null;
459
610
  readonly $rules: {
460
- readonly [TRuleKey in keyof Omit<TRules, '$each' | keyof FieldRegleBehaviourOptions>]: RegleRuleStatus<TState, TRules[TRuleKey] extends RegleRuleDefinition<any, infer TParams, any> ? TParams : [], TRules[TRuleKey] extends RegleRuleDefinition<any, any, any, infer TMetadata> ? TMetadata : TRules[TRuleKey] extends InlineRuleDeclaration<any, any[], infer TMetadata> ? TMetadata extends Promise<infer P> ? P : TMetadata : never>;
611
+ readonly [TRuleKey in keyof Omit<TRules, '$each' | keyof FieldRegleBehaviourOptions>]: RegleRuleStatus<TState, TRules[TRuleKey] extends RegleRuleDefinition<any, infer TParams, any> ? TParams : [], TRules[TRuleKey] extends RegleRuleDefinition<any, any, any, infer TMetadata> ? TMetadata : TRules[TRuleKey] extends InlineRuleDeclaration<any, any[], infer TMetadata> ? TMetadata extends Promise<infer P> ? P : TMetadata : any>;
461
612
  };
462
613
  }
463
614
  /**
@@ -470,6 +621,7 @@ interface RegleCommonStatus<TValue = any> {
470
621
  readonly $anyDirty: boolean;
471
622
  readonly $pending: boolean;
472
623
  readonly $error: boolean;
624
+ readonly $ready: boolean;
473
625
  $id?: string;
474
626
  $value: UnwrapNestedRefs<TValue>;
475
627
  $touch(): void;
@@ -482,7 +634,7 @@ interface RegleCommonStatus<TValue = any> {
482
634
  /**
483
635
  * @public
484
636
  */
485
- type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata extends RegleRuleMetadataDefinition = never> = {
637
+ type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata extends RegleRuleMetadataDefinition = any> = {
486
638
  readonly $type: string;
487
639
  readonly $message: string | string[];
488
640
  readonly $active: boolean;
@@ -490,20 +642,24 @@ type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata exte
490
642
  readonly $pending: boolean;
491
643
  readonly $path: string;
492
644
  readonly $metadata: TMetadata;
493
- $validator: (value: TValue, ...args: TParams) => boolean | Promise<boolean>;
645
+ $validator: ((value: Maybe<TValue>, ...args: [TParams] extends [never[]] ? [] : [unknown[]] extends [TParams] ? any[] : TParams) => RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition>) & ((value: TValue, ...args: [TParams] extends [never[]] ? [] : [unknown[]] extends [TParams] ? any[] : TParams) => RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition>);
494
646
  $validate(): Promise<boolean>;
495
647
  $reset(): void;
496
- } & ([TParams] extends [[]] ? {} : {
648
+ } & ([TParams] extends [never[]] ? {} : [unknown[]] extends [TParams] ? {
649
+ readonly $params?: any[];
650
+ } : {
497
651
  readonly $params: TParams;
498
652
  });
499
653
  /**
500
654
  * @public
501
655
  */
502
- interface RegleCollectionStatus<TState extends any[] = any[], TRules extends RegleRuleDecl | ReglePartialValidationTree<any> = Record<string, any>, TFieldRule extends RegleCollectionRuleDecl<any, any> = never> extends Omit<RegleFieldStatus<TState, TRules>, '$errors' | '$silentErrors'> {
656
+ interface RegleCollectionStatus<TState extends any[] = any[], TRules extends RegleRuleDecl | ReglePartialValidationTree<any> = Record<string, any>, TFieldRule extends RegleCollectionRuleDecl<any, any> = never> extends Omit<RegleFieldStatus<TState, TRules>, '$errors' | '$silentErrors' | '$extractDirtyFields'> {
503
657
  readonly $each: Array<InferRegleStatusType<NonNullable<TRules>, NonNullable<TState>, number>>;
504
658
  readonly $field: RegleFieldStatus<TState, TFieldRule>;
505
659
  readonly $errors: RegleErrorTree<TRules>;
506
660
  readonly $silentErrors: RegleErrorTree<TRules>;
661
+ $extractDirtyFields: (filterNullishValues?: boolean) => PartialDeep<TState>;
662
+ $parse: () => Promise<false | SafeProperty<TState, TRules>>;
507
663
  }
508
664
 
509
665
  /**
@@ -545,15 +701,6 @@ declare function createRule<TValue extends any, TParams extends any[], TReturn e
545
701
  */
546
702
  declare function unwrapRuleParameters<TParams extends any[]>(params: ParamDecl[]): TParams;
547
703
 
548
- type useRegleFn<TCustomRules extends Partial<AllRulesDeclarations>> = <TState extends Record<string, any>, TRules extends ReglePartialValidationTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules> & TValid, TExternal extends RegleExternalErrorTree<Unwrap<TState>>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]>, TValid = isDeepExact<NoInferLegacy<TRules>, ReglePartialValidationTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules>> extends true ? {} : never>(state: MaybeRef<TState> | DeepReactiveState<TState>, rulesFactory: TRules | (() => TRules) | ComputedRef<TRules>, options?: Partial<DeepMaybeRef<RegleBehaviourOptions>> & LocalRegleBehaviourOptions<Unwrap<TState>, TRules, TExternal, TValidationGroups>) => Regle<Unwrap<TState>, TRules, TExternal, TValidationGroups>;
549
- declare const useRegle: useRegleFn<Partial<AllRulesDeclarations>>;
550
-
551
- interface inferRulesFn<TCustomRules extends Partial<AllRulesDeclarations>> {
552
- <TState extends Record<string, any>, TRules extends ReglePartialValidationTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules> & TValid, TValid = isDeepExact<NoInferLegacy<TRules>, ReglePartialValidationTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules>> extends true ? {} : never>(state: MaybeRef<TState> | DeepReactiveState<TState>, rulesFactory: TRules): typeof rulesFactory;
553
- <TState extends unknown, TRules extends RegleRuleDecl>(state: MaybeRef<TState>, rulesFactory: TRules): typeof rulesFactory;
554
- }
555
- declare const inferRules: inferRulesFn<Partial<AllRulesDeclarations>>;
556
-
557
704
  declare function defineRegleConfig<TCustomRules extends Partial<AllRulesDeclarations>>({ rules, modifiers, }: {
558
705
  rules?: () => TCustomRules;
559
706
  modifiers?: RegleBehaviourOptions;
@@ -562,4 +709,4 @@ declare function defineRegleConfig<TCustomRules extends Partial<AllRulesDeclarat
562
709
  inferRules: inferRulesFn<TCustomRules>;
563
710
  };
564
711
 
565
- export { type DeepMaybeRef, type FormRuleDeclaration, type InlineRuleDeclaration, InternalRuleType, type LocalRegleBehaviourOptions, type Maybe, type ParamDecl, type Regle, type RegleBehaviourOptions, type RegleCollectionErrors, type RegleCollectionRuleDecl, type RegleCollectionRuleDefinition, type RegleCollectionStatus, type RegleCommonStatus, type RegleComputedRules, type RegleErrorTree, type RegleExternalCollectionErrors, type RegleExternalErrorTree, type RegleExternalValidationErrors, type RegleExternalValidationErrorsReport, type RegleFieldStatus, type RegleFormPropertyType, type RegleInternalRuleDefs, type ReglePartialValidationTree, type RegleRuleCore, type RegleRuleDecl, type RegleRuleDefinition, type RegleRuleDefinitionProcessor, type RegleRuleDefinitionWithMetadataProcessor, type RegleRuleInit, type RegleRuleMetadataConsumer, type RegleRuleMetadataDefinition, type RegleRuleRaw, type RegleRuleStatus, type RegleRuleWithParamsDefinition, type RegleStatus, type RegleUniversalParams, type RegleValidationErrors, type RegleValidationGroupEntry, type RegleValidationGroupOutput, type RegleValidationTree, type Unwrap, type UnwrapRegleUniversalParams, createRule, defineRegleConfig, inferRules, unwrapRuleParameters, useRegle };
712
+ export { type AllRulesDeclarations, type DeepMaybeRef, type FormRuleDeclaration, type InferRegleRule, type InferRegleRules, type InlineRuleDeclaration, InternalRuleType, type LocalRegleBehaviourOptions, type Maybe, type ParamDecl, type Regle, type RegleBehaviourOptions, type RegleCollectionErrors, type RegleCollectionRuleDecl, type RegleCollectionRuleDefinition, type RegleCollectionStatus, type RegleCommonStatus, type RegleComputedRules, type RegleErrorTree, type RegleExternalCollectionErrors, type RegleExternalErrorTree, type RegleExternalValidationErrors, type RegleExternalValidationErrorsReport, type RegleFieldStatus, type RegleFormPropertyType, type RegleInternalRuleDefs, type ReglePartialValidationTree, type RegleRequiredRules, type RegleRoot, type RegleRuleCore, type RegleRuleDecl, type RegleRuleDefinition, type RegleRuleDefinitionProcessor, type RegleRuleDefinitionWithMetadataProcessor, type RegleRuleInit, type RegleRuleMetadataConsumer, type RegleRuleMetadataDefinition, type RegleRuleRaw, type RegleRuleStatus, type RegleRuleWithParamsDefinition, type RegleStatus, type RegleUniversalParams, type RegleValidationErrors, type RegleValidationGroupEntry, type RegleValidationGroupOutput, type RegleValidationTree, type Unwrap, type UnwrapRegleUniversalParams, type UnwrapRuleWithParams, createRule, defineRegleConfig, inferRules, unwrapRuleParameters, useRegle };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import {unref,version,isRef,toRef,computed,ref,toRaw,reactive,shallowRef,onScopeDispose,triggerRef,watch,effectScope}from'vue';function V(e){return e.map(t=>t instanceof Function?t():unref(t))}function Ie(e){return e.map(t=>t instanceof Function||isRef(t)?t:toRef(()=>t))}function Pe(e){let t=e.toString();return (t.includes("=>")?t.split("=>")[0]:t).slice(t.indexOf("(")+1,t.indexOf(")")).split(",").map(l=>l.trim()).filter(l=>l.includes("=")).length+e.length}function ie(e,...t){let{message:r,validator:n,active:a,...l}=e,d=n.constructor.name==="AsyncFunction";return {...{validator(S,...v){return e.validator(S,...V(v.length?v:t))},message(S,v){return typeof e.message=="function"?e.message(S,{...v,$params:V(v.$params?.length?v.$params:t)}):e.message},active(S,v){return typeof e.active=="function"?e.active(S,{...v,$params:V(v.$params?.length?v.$params:t)}):e.active??!0},exec(S){let v=e.validator(S,...V(t)),o;return v instanceof Promise?v.then(R=>(o=R,typeof o=="object"&&"$valid"in o?o.$valid:typeof o=="boolean"?o:!1)):(o=v,typeof o=="object"&&"$valid"in o?o.$valid:typeof o=="boolean"?o:!1)}},...l,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:d,_params:Ie(t)}}function ue(e){if(typeof e.validator=="function"){let r=ie(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(Pe(e.validator)>1){let a=function(...l){return ie(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 G(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function we(e){return G(e.value)}function B(e){let t=e,r={}.toString.call(e).slice(8,-1);if(r=="Set"&&(t=new Set([...e].map(n=>B(n)))),r=="Map"&&(t=new Map([...e].map(n=>[B(n[0]),B(n[1])]))),r=="Date"&&(t=new Date(e.getTime())),r=="RegExp"&&(t=RegExp(e.source,tt(e))),r=="Array"||r=="Object"){t=Array.isArray(e)?[]:{};for(let n in e)t[n]=B(e[n]);}return t}function tt(e){if(typeof e.source.flags=="string")return e.source.flags;{let t=[];return e.global&&t.push("g"),e.ignoreCase&&t.push("i"),e.multiline&&t.push("m"),e.sticky&&t.push("y"),e.unicode&&t.push("u"),t.join("")}}function ce(e,t,r){return e instanceof Function?e(t,r??0):e}function re(e){return e==null?!0:e===!1?!1:e instanceof Date?isNaN(e.getTime()):Array.isArray(e)?e.length===0:typeof e=="object"&&e!=null?Object.keys(e).length===0:typeof e=="string"?!String(e.trim()).length:!1}function X(e,t,r){let n,a=(...l)=>new Promise(d=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(d);},t);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...l)=>new Promise(d=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(d);},0);}),a}function nt(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]),d=Number(n[a]);if(l>d)return 1;if(d>l)return -1;if(!isNaN(l)&&isNaN(d))return 1;if(isNaN(l)&&!isNaN(d))return -1}return 0}var q=nt(version,"3.5.0")!==-1;function at(){return Math.floor(Math.random()*Date.now()).toString()}function fe(){return typeof window>"u"?at():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(10)}function Re(){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 d(p){let g=t.value.get(p);if(g)return g;{let f=ref({});return t.value.set(p,f),f}}function h(p){let g=r.value.get(p);if(g)return g;{let f=ref([]);return r.value.set(p,f),f}}function P(p,g,f){l.value.set(`${p}-${g}`,f);}function S(p,g){return l.value.get(`${p}-${g}`)}function v(p,g){p&&g!=null&&l.value.delete(`${p}-${g}`);}function o(p,g){n.value.set(p,g);}function R(p){return n.value.get(p)??!1}function D(p,g){e.value.set(p,g);}function m(p,g){let f=e.value.get(p);return f?u(g,f)?{valid:!0}:{valid:!1}:void 0}function u(p,g){let f=Object.keys(g),O=Object.keys(p);return O.length!==f.length||!O.every(E=>f.includes(E))?!1:O.every(E=>{let c=p[E],i=g[E];return !i||!c||typeof c=="function"||typeof i=="function"||typeof c=="number"||typeof c=="boolean"?!1:c._params?c._params?.every((s,$)=>{if(typeof i=="number"||typeof i=="boolean")return !0;{let y=V(i._params),x=V(c._params);return y?.[$]===x?.[$]}}):!0})}function F(p){let g=a.value.get(p);if(g)return g;{let f=ref(!1),O=ref(!0),I=ref({}),E=ref(!1);return a.value.set(p,{$pending:f,$valid:O,$metadata:I,$validating:E}),{$pending:f,$valid:O,$metadata:I,$validating:E}}}return onScopeDispose(()=>{e.value.clear(),t.value.clear(),r.value.clear(),n.value.clear(),a.value.clear(),l.value.clear();}),{addRuleDeclEntry:D,setDirtyEntry:o,checkRuleDeclEntry:m,getDirtyState:R,trySetRuleStatusRef:F,getFieldsEntry:d,getCollectionsEntry:h,getArrayStatus:S,addArrayStatus:P,deleteArrayStatus:v,arrayStatusStorage:l}}function Oe(e,t){return G(e.value)&&G(t.value)&&!Object.entries(t.value).some(r=>pe(r))}function Ae(e){return !!e.value&&"$each"in e.value}function Me(e){return !!e.value&&G(e.value)}function pe(e){return G(e)&&"_validator"in e}function Y(e){return typeof e.value!="function"}function de(e){return G(e)&&"$fields"in e}function me(e){return !!e&&"$each"in e}function ge(e){return !!e&&"$rules"in e}function ye(e){return "$each"in e||"$errors"in e}function U({field:e,silent:t=!1}){return Object.entries(e.$rules??{}).map(([r,n])=>t||!n.$valid&&e.$dirty?n.$message:null).filter(r=>!!r).reduce((r,n)=>typeof n=="string"?r?.concat([n]):r?.concat(n),[]).concat(e.$externalErrors??[])}function Fe(e,t=!1){return de(e)?ve(e.$fields):me(e)?{$errors:e.$field.$rules?U({field:e.$field,silent:t}):[],$each:e.$each.map(r=>Fe(r,t))}:ge(e)?e.$error?U({field:e,silent:t}):e.$externalErrors??[]:[]}function st(e,t=!1){return e.map(r=>Fe(r,t))}function ve(e,t=!1){return Object.fromEntries(Object.entries(e).map(([r,n])=>de(n)?[r,ve(n.$fields,t)]:me(n)?[r,{$errors:U({field:n.$field,silent:t}),$each:st(n.$each,t)}]:ge(n)?n.$error?[r,U({field:n,silent:t})]:[r,n.$externalErrors??[]]:[r,[]]))}function Ve(e){return computed(()=>ve(e.$fields))}var je=(r=>(r.Inline="__inline",r.Async="__async",r))(je||{});function ke(e,t){return computed(()=>e.value.some(r=>r[t]))}function Ge(e,t){return computed(()=>e.value.reduce((r,n)=>{let a=n[t]||[];return r.concat(a)},[]))}function Ne({$dirty:e,customMessages:t,rule:r,ruleKey:n,state:a,path:l,storage:d,$debounce:h}){let P=effectScope(),S,v,{$pending:o,$valid:R,$metadata:D,$validating:m}=d.trySetRuleStatusRef(`${l}.${n}`);function u(){S=P.run(()=>{let E=computed(()=>({$invalid:!R.value,$params:y.value,...D.value})),c=computed(()=>Y(r)?typeof r.value.active=="function"?r.value.active(a.value,E.value):r.value.active:!0),i=computed(()=>{let T="",C=t?t[n]?.message:void 0;return C&&(typeof C=="function"?T=C(a.value,E.value):T=C),Y(r)&&(C&&!r.value._patched||(typeof r.value.message=="function"?T=r.value.message(a.value,E.value):T=r.value.message)),re(T)&&(T="Error",console.warn(`No error message defined for ${l}.${n}`)),T}),s=computed(()=>Y(r)&&r.value.type?r.value.type:n),$=computed(()=>Y(r)?r.value.validator:r.value),y=computed(()=>typeof r.value=="function"?[]:V(r.value._params??[])),x=computed(()=>`${l}.${s.value}`);return {$active:c,$message:i,$type:s,$validator:$,$params:y,$path:x}}),v=watch(S.$params,f,{deep:!0});}u();function F(){R.value=!0,e.value&&(o.value=!0);}async function p(E){let c=!1;try{F();let i=await E;if(typeof i=="boolean")c=i;else {let{$valid:s,...$}=i;c=s,D.value=$;}}catch{c=!1;}finally{o.value=!1;}return c}let g=X(p,h??100);async function f(){m.value=!0;let E=S.$validator.value,c=!1,i=E(a.value,...S.$params.value);if(i instanceof Promise)c=await g(i);else if(i!=null)if(typeof i=="boolean")c=i;else {let{$valid:s,...$}=i;c=s,D.value=$;}return R.value=c,m.value=!1,c}function O(){R.value=!0,D.value={},o.value=!1,m.value=!1,u();}function I(){v(),P.stop(),P=effectScope();}return reactive({...S,$pending:o,$valid:R,$metadata:D,$validate:f,$unwatch:I,$watch:u,$reset:O})}function ne({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:d,index:h,onUnwatch:P,$isArray:S}){let v=effectScope(),o,R=ref(!1),D=ref(!1),m=ref([]),u,F,p,g,f=()=>{};function O(){m.value=d.value??[];}O();function I(){let b=t.value,A=a.checkRuleDeclEntry(n,b);$.value=Object.fromEntries(Object.entries(b).filter(([M])=>M.startsWith("$"))),s.value=Object.fromEntries(Object.entries(t.value).filter(([M])=>!M.startsWith("$")).map(([M,k])=>{if(k){let oe=toRef(()=>k);return [M,Ne({$dirty:R,customMessages:r,rule:oe,ruleKey:M,state:e,path:n,storage:a,$debounce:$.value.$debounce})]}return []}).filter(M=>!!M.length)),c(),f=o.$debounce.value?X(i,o.$debounce.value??0):i,A?.valid!=null&&(R.value=a.getDirtyState(n),R.value&&f()),a.addRuleDeclEntry(n,b);}function E(){s.value&&Object.entries(s.value).forEach(([b,A])=>{A.$unwatch();}),g(),R.value&&a.setDirtyEntry(n,R.value),u(),F(),p(),v.stop(),v=effectScope(),P?.();}function c(){s.value&&Object.entries(s.value).forEach(([b,A])=>{A.$watch();}),o=v.run(()=>{let b=computed(()=>R.value),A=computed(()=>$.value.$debounce),M=computed(()=>$.value.$lazy!=null?$.value.$lazy:unref(l.lazy)),k=computed(()=>$.value.$rewardEarly!=null?$.value.$rewardEarly:unref(l.rewardEarly)),oe=computed(()=>$.value.$autoDirty!=null?$.value.$autoDirty:unref(l.autoDirty)),Qe=computed(()=>se.value&&!De.value&&R.value),Xe=computed(()=>U({field:{$dirty:R.value,$externalErrors:m.value,$rules:s.value}})),Ye=computed(()=>U({field:{$dirty:R.value,$externalErrors:m.value,$rules:s.value},silent:!0})),De=computed(()=>D.value||!k.value?Object.entries(s.value).some(([te,Q])=>Q.$pending):!1),se=computed(()=>m.value?.length?!0:!k.value||k.value&&D.value?Object.entries(s.value).some(([te,Q])=>!Q.$valid):!1),Ce=computed(()=>R.value&&!re(e.value)?m.value?.length?!1:k.value?Object.entries(s.value).every(([te,Q])=>Q.$valid):!se.value:!1);return watch(Ce,te=>{te&&(D.value=!1);}),{$error:Qe,$pending:De,$invalid:se,$valid:Ce,$debounce:A,$lazy:M,$errors:Xe,$silentErrors:Ye,$rewardEarly:k,$autoDirty:oe,$anyDirty:b}}),p=watch(d,O),u=watch(e,()=>{o.$autoDirty.value&&(R.value||(R.value=!0)),t.value instanceof Function&&I(),f(),o.$rewardEarly.value;},{deep:S?!0:q?1:!0}),g=watch(R,()=>{a.setDirtyEntry(n,R.value);}),F=watch(o.$valid,b=>{o.$rewardEarly.value&&b&&(D.value=!1);});}function i(){Object.entries(s.value).forEach(([b,A])=>{A.$validate();});}let s=ref(),$=ref();I();function y(){R.value=!1,m.value=[],Object.entries(s.value).forEach(([b,A])=>{A.$reset();}),o.$lazy.value||Object.entries(s.value).map(([b,A])=>A.$validate());}function x(){R.value||(R.value=!0,o.$rewardEarly.value,f());}let T=o.$debounce.value?X(C,o.$debounce.value??0):C;async function C(){try{if(D.value=!0,o.$autoDirty.value&&R.value&&!o.$pending.value)return !o.$error.value;{let b=Object.entries(s.value).map(([M,k])=>k.$validate());return (await Promise.allSettled(b)).every(M=>M.status==="fulfilled"?M.value:!1)}}catch{return !1}}function w(){m.value=[];}return o.$lazy.value||C(),reactive({$dirty:R,...o,$externalErrors:m,$value:e,$rules:s,$reset:y,$touch:x,$validate:T,$unwatch:E,$watch:c,$clearExternalErrors:w})}function We({$id:e,path:t,index:r,options:n,storage:a,stateValue:l,customMessages:d,rules:h,externalErrors:P}){let S=h.$key?h.$key:fe(),v=`${t}.${String(S)}`;typeof l.value=="object"&&l.value!=null&&(l.value.$id?v=`${t}.${l.value.$id}`:Object.defineProperties(l.value,{$id:{value:S,enumerable:!1,configurable:!1,writable:!1}}));let o=toRef(()=>P.value?.[r]),R=le({state:l,rulesDef:toRef(()=>h),customMessages:d,path:v,storage:a,options:n,externalErrors:o});if(R){let D=l.value?.$id;R.$id=D??String(S),a.addArrayStatus(e,R.$id,R);}return R}function He({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:d}){let h=effectScope(),P,S=effectScope(),v;if(Array.isArray(e.value)&&!t.value.$each)return null;let o=ref(),R=ref(e.value),D,m=ref({}),u=a.getCollectionsEntry(n);v=S.run(()=>{let i=computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(y=>typeof y!="object"):t.value.$each&&!(t.value.$each instanceof Function)?Object.values(t.value.$each).every(y=>pe(y)):!1),s=computed(()=>d.value?ye(d.value)?d.value.$errors??[]:[]:[]),$=computed(()=>d.value?ye(d.value)?d.value.$each??[]:[]:[]);return {isPrimitiveArray:i,$externalErrorsField:s,$externalErrorsEach:$}}),F(),g();function F(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(o.value=fe(),Object.defineProperties(e.value,{$id:{value:o.value,enumerable:!1,configurable:!1,writable:!1}})):e.value?.$id&&(o.value=e.value.$id)),!v.isPrimitiveArray.value&&(R.value=m.value.$value,Array.isArray(e.value)&&t.value.$each?u.value=e.value.map((i,s)=>{let $=ce(t.value.$each,toRef(()=>i),s);if($){let y=We({$id:o.value,path:n,rules:$,stateValue:toRef(()=>i),index:s,options:l,storage:a,externalErrors:v.$externalErrorsEach});return y||null}}).filter(i=>!!i):u.value=[],m.value=ne({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:v.$externalErrorsField,$isArray:!0}));}function p(){if(Array.isArray(e.value)){let i=B(u.value);u.value=e.value.map((s,$)=>{let y=toRef(()=>s);if(s.$id&&u.value.find(x=>x.$id===s.$id)){let x=a.getArrayStatus(o.value,s.$id);return x?(x.$value=y,x):null}else {let x=ce(t.value.$each,y,$);if(x){let T=We({$id:o.value,path:n,rules:x,stateValue:y,index:$,options:l,storage:a,externalErrors:v.$externalErrorsEach});return T||null}}}).filter(s=>!!s),i.filter(s=>!e.value.find($=>s.$id===$.$id)).forEach((s,$)=>{a.deleteArrayStatus(o.value,$.toString());});}else u.value=[];}function g(){D=watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")?F():p();},{deep:q?1:!0,flush:"pre"}),P=h.run(()=>{let i=computed(()=>m.value.$dirty&&u.value.every(b=>b.$dirty)),s=computed(()=>m.value.$anyDirty||u.value.some(b=>b.$dirty)),$=computed(()=>m.value.$invalid||u.value.some(b=>b.$invalid)),y=computed(()=>m.value.$valid&&u.value.every(b=>b.$valid)),x=computed(()=>m.value.$error||u.value.some(b=>b.$error)),T=computed(()=>m.value.$pending||u.value.some(b=>b.$pending)),C=computed(()=>({$errors:m.value.$errors,$each:u.value.map(b=>b.$errors)})),w=computed(()=>({$errors:m.value.$silentErrors,$each:u.value.map(b=>b.$silentErrors)}));return {$dirty:i,$anyDirty:s,$invalid:$,$valid:y,$error:x,$pending:T,$errors:C,$silentErrors:w}}),v.isPrimitiveArray.value&&(console.warn(`${n} is a Array of primitives. Tracking can be lost when reassigning the Array. We advise to use an Array of objects instead`),D());}function f(){D&&D(),m.value&&m.value.$unwatch(),u.value&&u.value.forEach(i=>{"$dirty"in i&&i.$unwatch();}),h.stop(),h=effectScope(),S.stop(),S=effectScope(!0);}function O(){m.value.$touch(),u.value.forEach(i=>{i.$touch();});}function I(){m.value.$reset(),u.value.forEach(i=>{i.$reset();});}async function E(){try{return (await Promise.all([m.value.$validate(),...u.value.map(s=>s.$validate())])).every(s=>!!s)}catch{return !1}}function c(){}return reactive({$field:m,...P,$each:u,$value:e,$validate:E,$unwatch:f,$watch:g,$touch:O,$reset:I,$clearExternalErrors:c})}function Ee({scopeRules:e,state:t,customMessages:r,path:n="",rootRules:a,storage:l,options:d,externalErrors:h,validationGroups:P}){let S,v,o;function m(E=!0,c=!1){u.value=null,triggerRef(u);let i=Object.fromEntries(Object.entries(e.value).map(([y,x])=>{if(x){let T=toRef(t.value,y),C=toRef(()=>x),w=toRef(()=>h.value?.[y]);return [y,le({state:T,rulesDef:C,customMessages:r,path:n?`${n}.${y}`:y,storage:l,options:d,externalErrors:w})]}return []}).filter(y=>!!y.length&&y[1]!=null)),s=Object.fromEntries(Object.entries(unref(h)??{}).filter(([y])=>!(y in e.value)).map(([y,x])=>{if(x){let T=toRef(()=>({})),C=toRef(()=>x);return [y,le({state:ref(void 0),rulesDef:T,customMessages:r,path:n?`${n}.${y}`:y,storage:l,options:d,externalErrors:C})]}return []})),$=Object.fromEntries(Object.entries(P?.(i)??{}).map(([y,x])=>x.length?[y,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(T=>[T,ke(toRef(()=>x),T)])),...Object.fromEntries(["$errors","$silentErrors"].map(T=>[T,Ge(toRef(()=>x),T)]))}]:[]));u.value={...i,...s,...$},E&&f();}let u=l.getFieldsEntry(n);m();function F(){m(!1),Object.entries(u.value).forEach(([E,c])=>{c.$reset();}),f();}function p(){Object.entries(u.value).forEach(([E,c])=>{c.$touch();});}async function g(){try{return (await Promise.allSettled(Object.entries(u.value).map(([c,i])=>i.$validate()))).every(c=>c.status==="fulfilled"?c.value:!1)}catch{return !1}}function f(){a&&(o=watch(a,()=>{O(),m();},{deep:q?1:!0,flush:"post"})),S=effectScope(),v=S.run(()=>{let E=computed(()=>!!Object.entries(u.value).length&&Object.entries(u.value).every(([C,w])=>w.$dirty)),c=computed(()=>Object.entries(u.value).some(([C,w])=>w.$dirty)),i=computed(()=>Object.entries(u.value).some(([C,w])=>w.$invalid)),s=computed(()=>Object.entries(u.value).every(([C,w])=>w.$valid)),$=computed(()=>E.value&&!y.value&&i.value),y=computed(()=>Object.entries(u.value).some(([C,w])=>w.$pending)),x=computed(()=>Object.fromEntries(Object.entries(u.value).map(([C,w])=>[C,w.$errors]))),T=computed(()=>Object.fromEntries(Object.entries(u.value).map(([C,w])=>[C,w.$silentErrors])));return {$dirty:E,$anyDirty:c,$invalid:i,$valid:s,$error:$,$pending:y,$errors:x,$silentErrors:T}});}function O(){u.value&&Object.entries(u.value).forEach(([E,c])=>{c.$unwatch();}),o?.(),S.stop(),S=effectScope();}function I(){Object.entries(u.value).forEach(([E,c])=>{c.$clearExternalErrors();});}return reactive({...v,$fields:u,$value:t,$reset:F,$touch:p,$validate:g,$unwatch:O,$watch:f,$clearExternalErrors:I})}function le({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:d,index:h,onUnwatch:P}){return Ae(t)?He({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,index:h,externalErrors:d}):Oe(e,t)&&we(e)?Ee({scopeRules:t,state:e,customMessages:r,path:n,storage:a,options:l,index:h,externalErrors:d}):Me(t)?ne({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,index:h,externalErrors:d,onUnwatch:P}):null}function be(e,t,r,n){let a=Re(),l=computed(()=>unref(r.externalErrors)),d=reactive(Ee({rootRules:e,scopeRules:e,state:t,customMessages:n?.(),storage:a,options:r,externalErrors:l,validationGroups:r.validationGroups})),h=Ve(d);return {regle:d,errors:h}}function xe(e,t){let r={autoDirty:t?.autoDirty??!0,lazy:t?.lazy??!1,rewardEarly:t?.rewardEarly??!1};function n(a,l,d){let h=isRef(l)?l:computed(typeof l=="function"?l:()=>l),P={...r,...d},S=isRef(a)?a:ref(a),v=B(toRaw(S.value)),{regle:o,errors:R}=be(h,S,P,e);function D(){o.$unwatch(),m(a,v),o.$reset();}function m(p,g){Object.entries(g).forEach(([f,O])=>{let I=isRef(p)?p.value:p,E=isRef(I[f])?I[f].value:I[f],c=isRef(g[f])?g[f]._value:g[f];Array.isArray(c)&&Array.isArray(E)?(I[f]=[],c.forEach((i,s)=>{I[f][s]={},m(I[f][s],c[s]);})):G(c)?m(E,c):isRef(I[f])?I[f].value=c:I[f]=c;});}let u=computed(()=>!(o.$invalid||o.$pending));async function F(){return o.$touch(),await o.$validate()?S.value:!1}return {regle:o,r$:o,errors:R,resetAll:D,validateState:F,ready:u,state:S}}return n}var ze=xe();function Te(){function e(t,r){return r}return e}var he=Te();function Je({rules:e,modifiers:t}){let r=xe(e,t),n=Te();return {useRegle:r,inferRules:n}}export{je as InternalRuleType,ue as createRule,Je as defineRegleConfig,he as inferRules,V as unwrapRuleParameters,ze as useRegle};
1
+ import {unref,version,isRef,toRef,computed,ref,toRaw,reactive,shallowRef,onScopeDispose,triggerRef,watch,effectScope}from'vue';var Re=(r=>(r.Inline="__inline",r.Async="__async",r))(Re||{});function Oe(e,t){return computed(()=>e.value.some(r=>r[t]))}function Ae(e,t){return computed(()=>e.value.reduce((r,n)=>{let a=n[t]||[];return r.concat(a)},[]))}function B(e){return e.map(t=>t instanceof Function?t():unref(t))}function Fe(e){return e.map(t=>t instanceof Function||isRef(t)?t:toRef(()=>t))}function Me(e){let t=e.toString();return (t.includes("=>")?t.split("=>")[0]:t).slice(t.indexOf("(")+1,t.indexOf(")")).split(",").map(l=>l.trim()).filter(l=>l.includes("=")).length+e.length}function pe(e,...t){let{message:r,validator:n,active:a,type:l,...m}=e,x=l==="__async"||n.constructor.name==="AsyncFunction";return {...{validator($,...i){return e.validator($,...B(i.length?i:t))},message($,i){return typeof e.message=="function"?e.message($,{...i,$params:B(i.$params?.length?i.$params:t)}):e.message},active($,i){return typeof e.active=="function"?e.active($,{...i,$params:B(i.$params?.length?i.$params:t)}):e.active??!0},exec($){let i=e.validator($,...B(t)),c;return i instanceof Promise?i.then(h=>(c=h,typeof c=="object"&&"$valid"in c?c.$valid:typeof c=="boolean"?c:!1)):(c=i,typeof c=="object"&&"$valid"in c?c.$valid:typeof c=="boolean"?c:!1)}},...m,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:x,_params:Fe(t)}}function de(e){if(typeof e.validator=="function"){let r=pe(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(Me(e.validator)>1){let a=function(...l){return pe(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 N(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ve(e){return N(e.value)}function q(e){let t=e,r={}.toString.call(e).slice(8,-1);if(r=="Set"&&(t=new Set([...e].map(n=>q(n)))),r=="Map"&&(t=new Map([...e].map(n=>[q(n[0]),q(n[1])]))),r=="Date"&&(t=new Date(e.getTime())),r=="RegExp"&&(t=RegExp(e.source,rt(e))),r=="Array"||r=="Object"){t=Array.isArray(e)?[]:{};for(let n in e)t[n]=q(e[n]);}return t}function rt(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 me(e,t,r){return e instanceof Function?e(t,r??0):e}function L(e){return e==null?!0:e===!1?!1:e instanceof Date?isNaN(e.getTime()):Array.isArray(e)?e.length===0:typeof e=="object"&&e!=null?Object.keys(e).length===0:typeof e=="string"?!String(e.trim()).length:!1}function ee(e,t,r){let n,a=(...l)=>new Promise(m=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(m);},t);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...l)=>new Promise(m=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(m);},0);}),a}function at(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]),m=Number(n[a]);if(l>m)return 1;if(m>l)return -1;if(!isNaN(l)&&isNaN(m))return 1;if(isNaN(l)&&!isNaN(m))return -1}return 0}var Q=at(version,"3.5.0")!==-1;function lt(){return Math.floor(Math.random()*Date.now()).toString()}function ye(){return typeof window>"u"?lt():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(10)}function ge(){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 m(u){let g=t.value.get(u);if(g)return g;{let E=ref({});return t.value.set(u,E),E}}function x(u){let g=r.value.get(u);if(g)return g;{let E=ref([]);return r.value.set(u,E),E}}function F(u,g,E){l.value.set(`${u}-${g}`,E);}function S(u,g){return l.value.get(`${u}-${g}`)}function $(u,g){u&&g!=null&&l.value.delete(`${u}-${g}`);}function i(u,g){n.value.set(u,g);}function c(u){return n.value.get(u)??!1}function h(u,g){e.value.set(u,g);}function y(u,g){let E=e.value.get(u);return E?v(g,E)?{valid:!0}:{valid:!1}:void 0}function v(u,g){let E=Object.keys(g),A=Object.keys(u);return A.length!==E.length||!A.every(V=>E.includes(V))?!1:A.every(V=>{let b=u[V],j=g[V];return !j||!b||typeof b=="function"||typeof j=="function"||typeof b=="number"||typeof b=="boolean"?!1:b._params?b._params?.every((O,d)=>{if(typeof j=="number"||typeof j=="boolean")return !0;{let o=B(j._params),s=B(b._params);return o?.[d]===s?.[d]}}):!0})}function _(u){let g=a.value.get(u);if(g)return g;{let E=ref(!1),A=ref(!0),k=ref({}),V=ref(!1);return a.value.set(u,{$pending:E,$valid:A,$metadata:k,$validating:V}),{$pending:E,$valid:A,$metadata:k,$validating:V}}}return onScopeDispose(()=>{e.value.clear(),t.value.clear(),r.value.clear(),n.value.clear(),a.value.clear(),l.value.clear();}),{addRuleDeclEntry:h,setDirtyEntry:i,checkRuleDeclEntry:y,getDirtyState:c,trySetRuleStatusRef:_,getFieldsEntry:m,getCollectionsEntry:x,getArrayStatus:S,addArrayStatus:F,deleteArrayStatus:$,arrayStatusStorage:l}}function je(e,t){return N(e.value)&&N(t.value)&&!Object.entries(t.value).some(r=>te(r))}function _e(e){return !!e.value&&"$each"in e.value}function ke(e){return !!e.value&&N(e.value)}function te(e){return N(e)&&"_validator"in e}function re(e){return typeof e.value!="function"}function ve(e){return N(e)&&"$fields"in e}function $e(e){return "$each"in e||"$errors"in e}function Se({field:e,silent:t=!1}){return Object.entries(e.$rules??{}).map(([r,n])=>t||!n.$valid&&e.$dirty&&!n.$validating?n.$message:null).filter(r=>!!r).reduce((r,n)=>typeof n=="string"?r?.concat([n]):r?.concat(n),[]).concat(e.$externalErrors??[])}function Be({$dirty:e,customMessages:t,rule:r,ruleKey:n,state:a,path:l,storage:m,$debounce:x}){let F=effectScope(),S,$,i=ref(!1),{$pending:c,$valid:h,$metadata:y,$validating:v}=m.trySetRuleStatusRef(`${l}.${n}`);function _(){S=F.run(()=>{let b=computed(()=>({$invalid:!h.value,$params:s.value,...y.value})),j=computed(()=>re(r)?typeof r.value.active=="function"?r.value.active(a.value,b.value):r.value.active:!0),O=computed(()=>{let f="",T=t?t[n]?.message:void 0;return T&&(typeof T=="function"?f=T(a.value,b.value):f=T),re(r)&&(T&&!r.value._patched||(typeof r.value.message=="function"?f=r.value.message(a.value,b.value):f=r.value.message)),L(f)&&(f="Error",console.warn(`No error message defined for ${l}.${n}`)),f}),d=computed(()=>re(r)&&r.value.type?r.value.type:n),o=computed(()=>re(r)?r.value.validator:r.value),s=computed(()=>typeof r.value=="function"?[]:B(r.value._params??[])),p=computed(()=>`${l}.${d.value}`);return {$active:j,$message:O,$type:d,$validator:o,$params:s,$path:p}}),$=watch(S.$params,A,{deep:!0});}_();function u(){h.value=!0,e.value&&(c.value=!0);}async function g(){let b=S.$validator.value,j=b(a.value,...S.$params.value),O=!1,d=a.value;try{u();let o;if(j instanceof Promise?o=await j:o=j,a.value!==d)return !0;if(typeof o=="boolean")O=o;else {let{$valid:s,...p}=o;O=s,y.value=p;}}catch{O=!1;}finally{c.value=!1;}return O}let E=ee(g,x??200);async function A(){v.value=!0;let b=!1;if(te(r.value)&&r.value._async)b=await E();else {let j=S.$validator.value,O=j(a.value,...S.$params.value);if(O instanceof Promise)console.warn('You used a async validator function on a non-async rule, please use "async await" or the "withAsync" helper');else if(O!=null)if(typeof O=="boolean")b=O;else {let{$valid:d,...o}=O;b=d,y.value=o;}}return h.value=b,v.value=!1,b}function k(){h.value=!0,y.value={},c.value=!1,v.value=!1,_();}function V(){$(),F.stop(),F=effectScope();}return reactive({...S,$pending:c,$valid:h,$metadata:y,_haveAsync:i,$validating:v,$validate:A,$unwatch:V,$watch:_,$reset:k})}function oe({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:m,index:x,onUnwatch:F,$isArray:S}){let $=effectScope(),i,c=ref(!1),h=ref(!1),y=ref([]),v,_,u,g,E,A=()=>{};function k(){y.value=m.value??[];}k();function V(){let R=t.value,P=a.checkRuleDeclEntry(n,R);s.value=Object.fromEntries(Object.entries(R).filter(([I])=>I.startsWith("$"))),o.value=Object.fromEntries(Object.entries(t.value).filter(([I])=>!I.startsWith("$")).map(([I,w])=>{if(w){let ce=toRef(()=>w);return [I,Be({$dirty:c,customMessages:r,rule:ce,ruleKey:I,state:e,path:n,storage:a,$debounce:s.value.$debounce})]}return []}).filter(I=>!!I.length)),O(),b(),P?.valid!=null&&(c.value=a.getDirtyState(n),c.value&&A()),a.addRuleDeclEntry(n,R);}function b(){A=i.$debounce.value?ee(d,i.$debounce.value??i.haveAnyAsyncRule?100:0):d;}function j(){o.value&&Object.entries(o.value).forEach(([R,P])=>{P.$unwatch();}),g(),c.value&&a.setDirtyEntry(n,c.value),v(),_(),u(),$.stop(),$=effectScope(),F?.(),E?.();}function O(){o.value&&Object.entries(o.value).forEach(([R,P])=>{P.$watch();}),i=$.run(()=>{let R=computed(()=>c.value),P=computed(()=>s.value.$debounce),I=computed(()=>s.value.$lazy!=null?s.value.$lazy:unref(l.lazy)),w=computed(()=>s.value.$rewardEarly!=null?s.value.$rewardEarly:unref(l.rewardEarly)),ce=computed(()=>s.value.$autoDirty!=null?s.value.$autoDirty:unref(l.autoDirty)),Je=computed(()=>Object.entries(o.value).some(([Y,W])=>W.$validating)),Ie=computed(()=>le.value&&!fe.value&&c.value),Ye=computed(()=>Ie.value?Se({field:{$dirty:c.value,$externalErrors:y.value,$rules:o.value}}):[]),Qe=computed(()=>Se({field:{$dirty:c.value,$externalErrors:y.value,$rules:o.value},silent:!0})),Xe=computed(()=>!le.value&&!fe.value),fe=computed(()=>h.value||!w.value?Object.entries(o.value).some(([Y,W])=>W.$pending):!1),le=computed(()=>y.value?.length?!0:!w.value||w.value&&h.value?Object.entries(o.value).some(([Y,W])=>!W.$valid):!1),Pe=computed(()=>c.value&&!L(e.value)&&!Je.value?y.value?.length?!1:w.value?Object.entries(o.value).every(([Y,W])=>W.$valid):!le.value:!1),Ze=computed(()=>Object.entries(o.value).some(([Y,W])=>W._haveAsync));return watch(Pe,Y=>{Y&&(h.value=!1);}),{$error:Ie,$pending:fe,$invalid:le,$valid:Pe,$debounce:P,$lazy:I,$errors:Ye,$ready:Xe,$silentErrors:Qe,$rewardEarly:w,$autoDirty:ce,$anyDirty:R,haveAnyAsyncRule:Ze}}),u=watch(m,k),v=watch(e,()=>{i.$autoDirty.value&&(c.value||(c.value=!0)),t.value instanceof Function&&V(),A(),i.$rewardEarly.value;},{deep:S?!0:Q?1:!0}),g=watch(c,()=>{a.setDirtyEntry(n,c.value);}),_=watch(i.$valid,R=>{i.$rewardEarly.value&&R&&(h.value=!1);}),E=watch(i.haveAnyAsyncRule,b);}function d(){Object.entries(o.value).forEach(([R,P])=>{P.$validate();});}let o=ref(),s=ref();V();function p(){c.value=!1,y.value=[],Object.entries(o.value).forEach(([R,P])=>{P.$reset();}),i.$lazy.value||Object.entries(o.value).map(([R,P])=>P.$validate());}function f(){c.value||(c.value=!0,i.$rewardEarly.value,A());}let T=i.$debounce.value?ee(M,i.$debounce.value??0):M;async function M(){try{if(h.value=!0,i.$autoDirty.value&&c.value&&!i.$pending.value)return !i.$error.value;{let R=Object.entries(o.value).map(([I,w])=>w.$validate());return (await Promise.allSettled(R)).every(I=>I.status==="fulfilled"?I.value:!1)}}catch{return !1}}function D(R=!0){return c.value?e.value:null}function C(){y.value=[];}return i.$lazy.value||M(),reactive({$dirty:c,...i,$externalErrors:y,$value:e,$rules:o,$reset:p,$touch:f,$validate:T,$unwatch:j,$watch:O,$extractDirtyFields:D,$clearExternalErrors:C})}function Ue({$id:e,path:t,index:r,options:n,storage:a,stateValue:l,customMessages:m,rules:x,externalErrors:F}){let S=x.$key?x.$key:ye(),$=`${t}.${String(S)}`;typeof l.value=="object"&&l.value!=null&&(l.value.$id?$=`${t}.${l.value.$id}`:Object.defineProperties(l.value,{$id:{value:S,enumerable:!1,configurable:!1,writable:!1}}));let i=toRef(()=>F.value?.[r]),c=ie({state:l,rulesDef:toRef(()=>x),customMessages:m,path:$,storage:a,options:n,externalErrors:i});if(c){let h=l.value?.$id;c.$id=h??String(S),a.addArrayStatus(e,c.$id,c);}return c}function We({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:m}){let x=effectScope(),F,S=effectScope(),$;if(Array.isArray(e.value)&&!t.value.$each)return null;let i=ref(),c=ref(e.value),h,y=ref({}),v=a.getCollectionsEntry(n);$=S.run(()=>{let d=computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(p=>typeof p!="object"):t.value.$each&&!(t.value.$each instanceof Function)?Object.values(t.value.$each).every(p=>te(p)):!1),o=computed(()=>m.value?$e(m.value)?m.value.$errors??[]:[]:[]),s=computed(()=>m.value?$e(m.value)?m.value.$each??[]:[]:[]);return {isPrimitiveArray:d,$externalErrorsField:o,$externalErrorsEach:s}}),_(),g();function _(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(i.value=ye(),Object.defineProperties(e.value,{$id:{value:i.value,enumerable:!1,configurable:!1,writable:!1}})):e.value?.$id&&(i.value=e.value.$id)),!$.isPrimitiveArray.value&&(c.value=y.value.$value,Array.isArray(e.value)&&t.value.$each?v.value=e.value.map((d,o)=>{let s=me(t.value.$each,toRef(()=>d),o);if(s){let p=Ue({$id:i.value,path:n,rules:s,stateValue:toRef(()=>d),index:o,options:l,storage:a,externalErrors:$.$externalErrorsEach});return p||null}}).filter(d=>!!d):v.value=[],y.value=oe({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:$.$externalErrorsField,$isArray:!0}));}function u(){if(Array.isArray(e.value)){let d=q(v.value);v.value=e.value.map((o,s)=>{let p=toRef(()=>o);if(o.$id&&v.value.find(f=>f.$id===o.$id)){let f=a.getArrayStatus(i.value,o.$id);return f?(f.$value=p,f):null}else {let f=me(t.value.$each,p,s);if(f){let T=Ue({$id:i.value,path:n,rules:f,stateValue:p,index:s,options:l,storage:a,externalErrors:$.$externalErrorsEach});return T||null}}}).filter(o=>!!o),d.filter(o=>!e.value.find(s=>o.$id===s.$id)).forEach((o,s)=>{a.deleteArrayStatus(i.value,s.toString());});}else v.value=[];}function g(){h=watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")?_():u();},{deep:Q?1:!0,flush:"pre"}),F=x.run(()=>{let d=computed(()=>y.value.$dirty&&v.value.every(R=>R.$dirty)),o=computed(()=>y.value.$anyDirty||v.value.some(R=>R.$dirty)),s=computed(()=>y.value.$invalid||v.value.some(R=>R.$invalid)),p=computed(()=>y.value.$valid&&v.value.every(R=>R.$valid)),f=computed(()=>y.value.$error||v.value.some(R=>R.$error)),T=computed(()=>!s.value&&!M.value),M=computed(()=>y.value.$pending||v.value.some(R=>R.$pending)),D=computed(()=>({$errors:y.value.$errors,$each:v.value.map(R=>R.$errors)})),C=computed(()=>({$errors:y.value.$silentErrors,$each:v.value.map(R=>R.$silentErrors)}));return {$dirty:d,$anyDirty:o,$invalid:s,$valid:p,$error:f,$pending:M,$errors:D,$silentErrors:C,$ready:T}}),$.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`),h());}function E(){h&&h(),y.value&&y.value.$unwatch(),v.value&&v.value.forEach(d=>{"$dirty"in d&&d.$unwatch();}),x.stop(),x=effectScope(),S.stop(),S=effectScope(!0);}function A(){y.value.$touch(),v.value.forEach(d=>{d.$touch();});}function k(){y.value.$reset(),v.value.forEach(d=>{d.$reset();});}async function V(){try{return (await Promise.all([y.value.$validate(),...v.value.map(o=>o.$validate())])).every(o=>!!o)}catch{return !1}}function b(){y.value.$clearExternalErrors(),v.value.forEach(d=>{d.$clearExternalErrors();});}function j(d=!0){let o=v.value.map(s=>{if(ve(s))return s.$extractDirtyFields(d)});return d&&(o=o.filter(s=>N(s)?!L(s):!!s)),o}async function O(){return A(),await V()?e.value:!1}return reactive({$field:y,...F,$each:v,$value:e,$validate:V,$unwatch:E,$watch:g,$touch:A,$reset:k,$extractDirtyFields:j,$parse:O,$clearExternalErrors:b})}function xe({scopeRules:e,state:t,customMessages:r,path:n="",rootRules:a,storage:l,options:m,externalErrors:x,validationGroups:F,initialState:S,processedState:$}){let i,c,h=null;function _(s=!0,p=!1){u.value=null,triggerRef(u);let f=Object.fromEntries(Object.entries(e.value).map(([D,C])=>{if(C){let R=toRef(t.value,D),P=toRef(()=>C),I=toRef(()=>x.value?.[D]);return [D,ie({state:R,rulesDef:P,customMessages:r,path:n?`${n}.${D}`:D,storage:l,options:m,externalErrors:I})]}return []}).filter(D=>!!D.length&&D[1]!=null)),T=Object.fromEntries(Object.entries(unref(x)??{}).filter(([D])=>!(D in e.value)).map(([D,C])=>{if(C){let R=toRef(()=>({})),P=toRef(()=>C);return [D,ie({state:ref(void 0),rulesDef:R,customMessages:r,path:n?`${n}.${D}`:D,storage:l,options:m,externalErrors:P})]}return []})),M=Object.fromEntries(Object.entries(F?.(f)??{}).map(([D,C])=>C.length?[D,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(R=>[R,Oe(toRef(()=>C),R)])),...Object.fromEntries(["$errors","$silentErrors"].map(R=>[R,Ae(toRef(()=>C),R)]))}]:[]));u.value={...f,...T,...M},s&&k();}let u=l.getFieldsEntry(n);_();function g(){_(!1),Object.entries(u.value).forEach(([s,p])=>{p.$reset();}),k();}function E(){Object.entries(u.value).forEach(([s,p])=>{p.$touch();});}async function A(){try{return (await Promise.allSettled(Object.entries(u.value).map(([p,f])=>f.$validate()))).every(p=>p.status==="fulfilled"?p.value:!1)}catch{return !1}}function k(){a&&(h=watch(a,()=>{V(),_();},{deep:Q?1:!0,flush:"post"})),i=effectScope(),c=i.run(()=>{let s=computed(()=>!!Object.entries(u.value).length&&Object.entries(u.value).every(([I,w])=>w.$dirty)),p=computed(()=>Object.entries(u.value).some(([I,w])=>w.$dirty)),f=computed(()=>Object.entries(u.value).some(([I,w])=>w.$invalid)),T=computed(()=>Object.entries(u.value).every(([I,w])=>w.$valid)),M=computed(()=>s.value&&!C.value&&f.value),D=computed(()=>!f.value&&!C.value),C=computed(()=>Object.entries(u.value).some(([I,w])=>w.$pending)),R=computed(()=>Object.fromEntries(Object.entries(u.value).map(([I,w])=>[I,w.$errors]))),P=computed(()=>Object.fromEntries(Object.entries(u.value).map(([I,w])=>[I,w.$silentErrors])));return {$dirty:s,$anyDirty:p,$invalid:f,$valid:T,$error:M,$pending:C,$errors:R,$silentErrors:P,$ready:D}});}function V(){u.value&&Object.entries(u.value).forEach(([s,p])=>{p.$unwatch();}),h?.(),i.stop(),i=effectScope();}function b(){Object.entries(u.value).forEach(([s,p])=>{p.$clearExternalErrors();});}function j(){S&&(V(),O(t,S),g());}function O(s,p){Object.entries(p).forEach(([f,T])=>{let M=isRef(s)?s.value:s,D=isRef(M[f])?M[f].value:M[f],C=isRef(p[f])?p[f]._value:p[f];Array.isArray(C)&&Array.isArray(D)?(M[f]=[],C.forEach((R,P)=>{M[f][P]={},O(M[f][P],C[P]);})):N(C)?O(D,C):isRef(M[f])?M[f].value=C:M[f]=C;});}function d(s=!0){let p=Object.entries(u.value).map(([f,T])=>[f,T.$extractDirtyFields(s)]);return s&&(p=p.filter(([f,T])=>N(T)?!L(T):Array.isArray(T)?T.length:!!T)),Object.fromEntries(p)}async function o(){return E(),await A()?t.value:!1}return reactive({...c,$fields:u,$value:t,...S&&{$resetAll:j},$reset:g,$touch:E,$validate:A,$unwatch:V,$watch:k,$clearExternalErrors:b,$extractDirtyFields:d,$parse:o})}function ie({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:m,index:x,onUnwatch:F}){return _e(t)?We({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,index:x,externalErrors:m}):je(e,t)&&Ve(e)?xe({scopeRules:t,state:e,customMessages:r,path:n,storage:a,options:l,index:x,externalErrors:m}):ke(t)?oe({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,index:x,externalErrors:m,onUnwatch:F}):null}function he(e,t,r,n,a,l){let m=ge(),x=computed(()=>unref(r.externalErrors));return reactive(xe({rootRules:e,scopeRules:e,state:t,customMessages:l?.(),storage:m,options:r,externalErrors:x,validationGroups:r.validationGroups,processedState:n,initialState:a}))}function Te(e,t){let r={autoDirty:t?.autoDirty??!0,lazy:t?.lazy??!1,rewardEarly:t?.rewardEarly??!1};function n(a,l,m){let x=isRef(l)?l:computed(typeof l=="function"?l:()=>l),F={...r,...m},S=isRef(a)?a:ref(a),$=q(toRaw(S.value));return {r$:he(x,S,F,S,$,e)}}return n}var Le=Te();function De(){function e(t,r){return r}return e}var Ce=De();function ze({rules:e,modifiers:t}){let r=Te(e,t),n=De();return {useRegle:r,inferRules:n}}export{Re as InternalRuleType,de as createRule,ze as defineRegleConfig,Ce as inferRules,B as unwrapRuleParameters,Le as useRegle};
package/package.json CHANGED
@@ -1,28 +1,28 @@
1
1
  {
2
2
  "name": "@regle/core",
3
- "version": "0.1.10",
3
+ "version": "0.2.3",
4
4
  "description": "Typescript-first model-based form validation library for Vue 3",
5
5
  "peerDependencies": {
6
6
  "vue": "^3.1.0"
7
7
  },
8
8
  "devDependencies": {
9
9
  "@total-typescript/ts-reset": "0.6.1",
10
- "@types/node": "22.9.0",
11
- "@typescript-eslint/eslint-plugin": "8.14.0",
12
- "@typescript-eslint/parser": "8.14.0",
10
+ "@types/node": "22.9.3",
11
+ "@typescript-eslint/eslint-plugin": "8.15.0",
12
+ "@typescript-eslint/parser": "8.15.0",
13
13
  "@vue/test-utils": "2.4.6",
14
14
  "bumpp": "9.8.1",
15
15
  "changelogithub": "0.13.11",
16
16
  "cross-env": "7.0.3",
17
- "eslint": "9.14.0",
17
+ "eslint": "9.15.0",
18
18
  "eslint-config-prettier": "9.1.0",
19
- "eslint-plugin-vue": "9.30.0",
19
+ "eslint-plugin-vue": "9.31.0",
20
20
  "prettier": "3.3.3",
21
21
  "tsup": "8.3.5",
22
- "type-fest": "4.26.1",
22
+ "type-fest": "4.28.0",
23
23
  "typescript": "5.6.3",
24
- "vitest": "2.1.4",
25
- "vue": "3.5.12",
24
+ "vitest": "2.1.5",
25
+ "vue": "3.5.13",
26
26
  "vue-eslint-parser": "9.4.3",
27
27
  "vue-tsc": "2.1.10"
28
28
  },