@regle/core 0.2.2 → 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');var ce=(r=>(r.Inline="__inline",r.Async="__async",r))(ce||{});function Ae(e,t){return vue.computed(()=>e.value.some(r=>r[t]))}function Me(e,t){return vue.computed(()=>e.value.reduce((r,n)=>{let a=n[t]||[];return r.concat(a)},[]))}function j(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 Ve(e){let t=e.toString();return (t.includes("=>")?t.split("=>")[0]:t).slice(t.indexOf("(")+1,t.indexOf(")")).split(",").map(o=>o.trim()).filter(o=>o.includes("=")).length+e.length}function fe(e,...t){let{message:r,validator:n,active:a,type:o,...m}=e,T=o==="__async"||n.constructor.name==="AsyncFunction";return {...{validator($,...s){return e.validator($,...j(s.length?s:t))},message($,s){return typeof e.message=="function"?e.message($,{...s,$params:j(s.$params?.length?s.$params:t)}):e.message},active($,s){return typeof e.active=="function"?e.active($,{...s,$params:j(s.$params?.length?s.$params:t)}):e.active??!0},exec($){let s=e.validator($,...j(t)),i;return s instanceof Promise?s.then(h=>(i=h,typeof i=="object"&&"$valid"in i?i.$valid:typeof i=="boolean"?i:!1)):(i=s,typeof i=="object"&&"$valid"in i?i.$valid:typeof i=="boolean"?i:!1)}},...m,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:T,_params:Fe(t)}}function Re(e){if(typeof e.validator=="function"){let r=fe(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(Ve(e.validator)>1){let a=function(...o){return fe(e,...o)};return a.validator=r.validator,a.message=r.message,a.active=r.active,a.type=r.type,a.exec=r.exec,a._validator=r.validator,a._message=r.message,a._active=r.active,a._type=e.type,a._patched=!1,a._async=n,a}else return r}throw new Error("Validator must be a function")}function B(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function je(e){return B(e.value)}function U(e){let t=e,r={}.toString.call(e).slice(8,-1);if(r=="Set"&&(t=new Set([...e].map(n=>U(n)))),r=="Map"&&(t=new Map([...e].map(n=>[U(n[0]),U(n[1])]))),r=="Date"&&(t=new Date(e.getTime())),r=="RegExp"&&(t=RegExp(e.source,lt(e))),r=="Array"||r=="Object"){t=Array.isArray(e)?[]:{};for(let n in e)t[n]=U(e[n]);}return t}function lt(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 pe(e,t,r){return e instanceof Function?e(t,r??0):e}function ae(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 K(e,t,r){let n,a=(...o)=>new Promise(m=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...o])).then(m);},t);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...o)=>new Promise(m=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...o])).then(m);},0);}),a}function st(e,t){let r=String(e).split("."),n=String(t).split(".");for(let a=0;a<Math.min(r.length,n.length);a++){let o=Number(r[a]),m=Number(n[a]);if(o>m)return 1;if(m>o)return -1;if(!isNaN(o)&&isNaN(m))return 1;if(isNaN(o)&&!isNaN(m))return -1}return 0}var J=st(vue.version,"3.5.0")!==-1;function it(){return Math.floor(Math.random()*Date.now()).toString()}function de(){return typeof window>"u"?it():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(10)}function me(){let e=vue.shallowRef(new Map),t=vue.shallowRef(new Map),r=vue.shallowRef(new Map),n=vue.shallowRef(new Map),a=vue.shallowRef(new Map),o=vue.shallowRef(new Map);function m(p){let c=t.value.get(p);if(c)return c;{let x=vue.ref({});return t.value.set(p,x),x}}function T(p){let c=r.value.get(p);if(c)return c;{let x=vue.ref([]);return r.value.set(p,x),x}}function P(p,c,x){o.value.set(`${p}-${c}`,x);}function S(p,c){return o.value.get(`${p}-${c}`)}function $(p,c){p&&c!=null&&o.value.delete(`${p}-${c}`);}function s(p,c){n.value.set(p,c);}function i(p){return n.value.get(p)??!1}function h(p,c){e.value.set(p,c);}function y(p,c){let x=e.value.get(p);return x?u(c,x)?{valid:!0}:{valid:!1}:void 0}function u(p,c){let x=Object.keys(c),E=Object.keys(p);return E.length!==x.length||!E.every(v=>x.includes(v))?!1:E.every(v=>{let d=p[v],f=c[v];return !f||!d||typeof d=="function"||typeof f=="function"||typeof d=="number"||typeof d=="boolean"?!1:d._params?d._params?.every((R,b)=>{if(typeof f=="number"||typeof f=="boolean")return !0;{let l=j(f._params),g=j(d._params);return l?.[b]===g?.[b]}}):!0})}function O(p){let c=a.value.get(p);if(c)return c;{let x=vue.ref(!1),E=vue.ref(!0),A=vue.ref({}),v=vue.ref(!1);return a.value.set(p,{$pending:x,$valid:E,$metadata:A,$validating:v}),{$pending:x,$valid:E,$metadata:A,$validating:v}}}return vue.onScopeDispose(()=>{e.value.clear(),t.value.clear(),r.value.clear(),n.value.clear(),a.value.clear(),o.value.clear();}),{addRuleDeclEntry:h,setDirtyEntry:s,checkRuleDeclEntry:y,getDirtyState:i,trySetRuleStatusRef:O,getFieldsEntry:m,getCollectionsEntry:T,getArrayStatus:S,addArrayStatus:P,deleteArrayStatus:$,arrayStatusStorage:o}}function _e(e,t){return B(e.value)&&B(t.value)&&!Object.entries(t.value).some(r=>ee(r))}function Ge(e){return !!e.value&&"$each"in e.value}function ke(e){return !!e.value&&B(e.value)}function ee(e){return B(e)&&"_validator"in e}function te(e){return typeof e.value!="function"}function ye(e){return B(e)&&"$fields"in e}function ge(e){return !!e&&"$each"in e}function ve(e){return !!e&&"$rules"in e}function $e(e){return "$each"in e||"$errors"in e}function H({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(e,t=!1){return ye(e)?Se(e.$fields):ge(e)?{$errors:e.$field.$rules?H({field:e.$field,silent:t}):[],$each:e.$each.map(r=>Be(r,t))}:ve(e)?e.$error?H({field:e,silent:t}):e.$externalErrors??[]:[]}function ft(e,t=!1){return e.map(r=>Be(r,t))}function Se(e,t=!1){return Object.fromEntries(Object.entries(e).map(([r,n])=>ye(n)?[r,Se(n.$fields,t)]:ge(n)?[r,{$errors:H({field:n.$field,silent:t}),$each:ft(n.$each,t)}]:ve(n)?n.$error?[r,H({field:n,silent:t})]:[r,n.$externalErrors??[]]:[r,[]]))}function Ne(e){return vue.computed(()=>Se(e.$fields))}function We({$dirty:e,customMessages:t,rule:r,ruleKey:n,state:a,path:o,storage:m,$debounce:T}){let P=vue.effectScope(),S,$,s=vue.ref(!1),{$pending:i,$valid:h,$metadata:y,$validating:u}=m.trySetRuleStatusRef(`${o}.${n}`);function O(){S=P.run(()=>{let d=vue.computed(()=>({$invalid:!h.value,$params:g.value,...y.value})),f=vue.computed(()=>te(r)?typeof r.value.active=="function"?r.value.active(a.value,d.value):r.value.active:!0),R=vue.computed(()=>{let C="",D=t?t[n]?.message:void 0;return D&&(typeof D=="function"?C=D(a.value,d.value):C=D),te(r)&&(D&&!r.value._patched||(typeof r.value.message=="function"?C=r.value.message(a.value,d.value):C=r.value.message)),ae(C)&&(C="Error",console.warn(`No error message defined for ${o}.${n}`)),C}),b=vue.computed(()=>te(r)&&r.value.type?r.value.type:n),l=vue.computed(()=>te(r)?r.value.validator:r.value),g=vue.computed(()=>typeof r.value=="function"?[]:j(r.value._params??[])),I=vue.computed(()=>`${o}.${b.value}`);return {$active:f,$message:R,$type:b,$validator:l,$params:g,$path:I}}),$=vue.watch(S.$params,E,{deep:!0});}O();function p(){h.value=!0,e.value&&(i.value=!0);}async function c(){let d=S.$validator.value,f=d(a.value,...S.$params.value),R=!1,b=a.value;try{p();let l;if(f instanceof Promise?l=await f:l=f,a.value!==b)return !0;if(typeof l=="boolean")R=l;else {let{$valid:g,...I}=l;R=g,y.value=I;}}catch{R=!1;}finally{i.value=!1;}return R}let x=K(c,T??200);async function E(){u.value=!0;let d=!1;if(ee(r.value)&&r.value._async)d=await x();else {let f=S.$validator.value,R=f(a.value,...S.$params.value);if(R 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(R!=null)if(typeof R=="boolean")d=R;else {let{$valid:b,...l}=R;d=b,y.value=l;}}return h.value=d,u.value=!1,d}function A(){h.value=!0,y.value={},i.value=!1,u.value=!1,O();}function v(){$(),P.stop(),P=vue.effectScope();}return vue.reactive({...S,$pending:i,$valid:h,$metadata:y,_haveAsync:s,$validating:u,$validate:E,$unwatch:v,$watch:O,$reset:A})}function le({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:m,index:T,onUnwatch:P,$isArray:S}){let $=vue.effectScope(),s,i=vue.ref(!1),h=vue.ref(!1),y=vue.ref([]),u,O,p,c,x,E=()=>{};function A(){y.value=m.value??[];}A();function v(){let M=t.value,F=a.checkRuleDeclEntry(n,M);g.value=Object.fromEntries(Object.entries(M).filter(([V])=>V.startsWith("$"))),l.value=Object.fromEntries(Object.entries(t.value).filter(([V])=>!V.startsWith("$")).map(([V,k])=>{if(k){let ie=vue.toRef(()=>k);return [V,We({$dirty:i,customMessages:r,rule:ie,ruleKey:V,state:e,path:n,storage:a,$debounce:g.value.$debounce})]}return []}).filter(V=>!!V.length)),R(),d(),F?.valid!=null&&(i.value=a.getDirtyState(n),i.value&&E()),a.addRuleDeclEntry(n,M);}function d(){E=s.$debounce.value?K(b,s.$debounce.value??s.haveAnyAsyncRule?100:0):b;}function f(){l.value&&Object.entries(l.value).forEach(([M,F])=>{F.$unwatch();}),c(),i.value&&a.setDirtyEntry(n,i.value),u(),O(),p(),$.stop(),$=vue.effectScope(),P?.(),x?.();}function R(){l.value&&Object.entries(l.value).forEach(([M,F])=>{F.$watch();}),s=$.run(()=>{let M=vue.computed(()=>i.value),F=vue.computed(()=>g.value.$debounce),V=vue.computed(()=>g.value.$lazy!=null?g.value.$lazy:vue.unref(o.lazy)),k=vue.computed(()=>g.value.$rewardEarly!=null?g.value.$rewardEarly:vue.unref(o.rewardEarly)),ie=vue.computed(()=>g.value.$autoDirty!=null?g.value.$autoDirty:vue.unref(o.autoDirty)),Ze=vue.computed(()=>Object.entries(l.value).some(([z,N])=>N.$validating)),Ie=vue.computed(()=>ue.value&&!Pe.value&&i.value),Ke=vue.computed(()=>Ie.value?H({field:{$dirty:i.value,$externalErrors:y.value,$rules:l.value}}):[]),et=vue.computed(()=>H({field:{$dirty:i.value,$externalErrors:y.value,$rules:l.value},silent:!0})),Pe=vue.computed(()=>h.value||!k.value?Object.entries(l.value).some(([z,N])=>N.$pending):!1),ue=vue.computed(()=>y.value?.length?!0:!k.value||k.value&&h.value?Object.entries(l.value).some(([z,N])=>!N.$valid):!1),we=vue.computed(()=>i.value&&!ae(e.value)&&!Ze.value?y.value?.length?!1:k.value?Object.entries(l.value).every(([z,N])=>N.$valid):!ue.value:!1),tt=vue.computed(()=>Object.entries(l.value).some(([z,N])=>N._haveAsync));return vue.watch(we,z=>{z&&(h.value=!1);}),{$error:Ie,$pending:Pe,$invalid:ue,$valid:we,$debounce:F,$lazy:V,$errors:Ke,$silentErrors:et,$rewardEarly:k,$autoDirty:ie,$anyDirty:M,haveAnyAsyncRule:tt}}),p=vue.watch(m,A),u=vue.watch(e,()=>{s.$autoDirty.value&&(i.value||(i.value=!0)),t.value instanceof Function&&v(),E(),s.$rewardEarly.value;},{deep:S?!0:J?1:!0}),c=vue.watch(i,()=>{a.setDirtyEntry(n,i.value);}),O=vue.watch(s.$valid,M=>{s.$rewardEarly.value&&M&&(h.value=!1);}),x=vue.watch(s.haveAnyAsyncRule,d);}function b(){Object.entries(l.value).forEach(([M,F])=>{F.$validate();});}let l=vue.ref(),g=vue.ref();v();function I(){i.value=!1,y.value=[],Object.entries(l.value).forEach(([M,F])=>{F.$reset();}),s.$lazy.value||Object.entries(l.value).map(([M,F])=>F.$validate());}function C(){i.value||(i.value=!0,s.$rewardEarly.value,E());}let D=s.$debounce.value?K(w,s.$debounce.value??0):w;async function w(){try{if(h.value=!0,s.$autoDirty.value&&i.value&&!s.$pending.value)return !s.$error.value;{let M=Object.entries(l.value).map(([V,k])=>k.$validate());return (await Promise.allSettled(M)).every(V=>V.status==="fulfilled"?V.value:!1)}}catch{return !1}}function Xe(){y.value=[];}return s.$lazy.value||w(),vue.reactive({$dirty:i,...s,$externalErrors:y,$value:e,$rules:l,$reset:I,$touch:C,$validate:D,$unwatch:f,$watch:R,$clearExternalErrors:Xe})}function qe({$id:e,path:t,index:r,options:n,storage:a,stateValue:o,customMessages:m,rules:T,externalErrors:P}){let S=T.$key?T.$key:de(),$=`${t}.${String(S)}`;typeof o.value=="object"&&o.value!=null&&(o.value.$id?$=`${t}.${o.value.$id}`:Object.defineProperties(o.value,{$id:{value:S,enumerable:!1,configurable:!1,writable:!1}}));let s=vue.toRef(()=>P.value?.[r]),i=se({state:o,rulesDef:vue.toRef(()=>T),customMessages:m,path:$,storage:a,options:n,externalErrors:s});if(i){let h=o.value?.$id;i.$id=h??String(S),a.addArrayStatus(e,i.$id,i);}return i}function Le({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:m}){let T=vue.effectScope(),P,S=vue.effectScope(),$;if(Array.isArray(e.value)&&!t.value.$each)return null;let s=vue.ref(),i=vue.ref(e.value),h,y=vue.ref({}),u=a.getCollectionsEntry(n);$=S.run(()=>{let f=vue.computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(l=>typeof l!="object"):t.value.$each&&!(t.value.$each instanceof Function)?Object.values(t.value.$each).every(l=>ee(l)):!1),R=vue.computed(()=>m.value?$e(m.value)?m.value.$errors??[]:[]:[]),b=vue.computed(()=>m.value?$e(m.value)?m.value.$each??[]:[]:[]);return {isPrimitiveArray:f,$externalErrorsField:R,$externalErrorsEach:b}}),O(),c();function O(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(s.value=de(),Object.defineProperties(e.value,{$id:{value:s.value,enumerable:!1,configurable:!1,writable:!1}})):e.value?.$id&&(s.value=e.value.$id)),!$.isPrimitiveArray.value&&(i.value=y.value.$value,Array.isArray(e.value)&&t.value.$each?u.value=e.value.map((f,R)=>{let b=pe(t.value.$each,vue.toRef(()=>f),R);if(b){let l=qe({$id:s.value,path:n,rules:b,stateValue:vue.toRef(()=>f),index:R,options:o,storage:a,externalErrors:$.$externalErrorsEach});return l||null}}).filter(f=>!!f):u.value=[],y.value=le({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:$.$externalErrorsField,$isArray:!0}));}function p(){if(Array.isArray(e.value)){let f=U(u.value);u.value=e.value.map((R,b)=>{let l=vue.toRef(()=>R);if(R.$id&&u.value.find(g=>g.$id===R.$id)){let g=a.getArrayStatus(s.value,R.$id);return g?(g.$value=l,g):null}else {let g=pe(t.value.$each,l,b);if(g){let I=qe({$id:s.value,path:n,rules:g,stateValue:l,index:b,options:o,storage:a,externalErrors:$.$externalErrorsEach});return I||null}}}).filter(R=>!!R),f.filter(R=>!e.value.find(b=>R.$id===b.$id)).forEach((R,b)=>{a.deleteArrayStatus(s.value,b.toString());});}else u.value=[];}function c(){h=vue.watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")?O():p();},{deep:J?1:!0,flush:"pre"}),P=T.run(()=>{let f=vue.computed(()=>y.value.$dirty&&u.value.every(w=>w.$dirty)),R=vue.computed(()=>y.value.$anyDirty||u.value.some(w=>w.$dirty)),b=vue.computed(()=>y.value.$invalid||u.value.some(w=>w.$invalid)),l=vue.computed(()=>y.value.$valid&&u.value.every(w=>w.$valid)),g=vue.computed(()=>y.value.$error||u.value.some(w=>w.$error)),I=vue.computed(()=>y.value.$pending||u.value.some(w=>w.$pending)),C=vue.computed(()=>({$errors:y.value.$errors,$each:u.value.map(w=>w.$errors)})),D=vue.computed(()=>({$errors:y.value.$silentErrors,$each:u.value.map(w=>w.$silentErrors)}));return {$dirty:f,$anyDirty:R,$invalid:b,$valid:l,$error:g,$pending:I,$errors:C,$silentErrors:D}}),$.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 x(){h&&h(),y.value&&y.value.$unwatch(),u.value&&u.value.forEach(f=>{"$dirty"in f&&f.$unwatch();}),T.stop(),T=vue.effectScope(),S.stop(),S=vue.effectScope(!0);}function E(){y.value.$touch(),u.value.forEach(f=>{f.$touch();});}function A(){y.value.$reset(),u.value.forEach(f=>{f.$reset();});}async function v(){try{return (await Promise.all([y.value.$validate(),...u.value.map(R=>R.$validate())])).every(R=>!!R)}catch{return !1}}function d(){}return vue.reactive({$field:y,...P,$each:u,$value:e,$validate:v,$unwatch:x,$watch:c,$touch:E,$reset:A,$clearExternalErrors:d})}function he({scopeRules:e,state:t,customMessages:r,path:n="",rootRules:a,storage:o,options:m,externalErrors:T,validationGroups:P}){let S,$,s=null;function y(v=!0,d=!1){u.value=null,vue.triggerRef(u);let f=Object.fromEntries(Object.entries(e.value).map(([l,g])=>{if(g){let I=vue.toRef(t.value,l),C=vue.toRef(()=>g),D=vue.toRef(()=>T.value?.[l]);return [l,se({state:I,rulesDef:C,customMessages:r,path:n?`${n}.${l}`:l,storage:o,options:m,externalErrors:D})]}return []}).filter(l=>!!l.length&&l[1]!=null)),R=Object.fromEntries(Object.entries(vue.unref(T)??{}).filter(([l])=>!(l in e.value)).map(([l,g])=>{if(g){let I=vue.toRef(()=>({})),C=vue.toRef(()=>g);return [l,se({state:vue.ref(void 0),rulesDef:I,customMessages:r,path:n?`${n}.${l}`:l,storage:o,options:m,externalErrors:C})]}return []})),b=Object.fromEntries(Object.entries(P?.(f)??{}).map(([l,g])=>g.length?[l,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(I=>[I,Ae(vue.toRef(()=>g),I)])),...Object.fromEntries(["$errors","$silentErrors"].map(I=>[I,Me(vue.toRef(()=>g),I)]))}]:[]));u.value={...f,...R,...b},v&&x();}let u=o.getFieldsEntry(n);y();function O(){y(!1),Object.entries(u.value).forEach(([v,d])=>{d.$reset();}),x();}function p(){Object.entries(u.value).forEach(([v,d])=>{d.$touch();});}async function c(){try{return (await Promise.allSettled(Object.entries(u.value).map(([d,f])=>f.$validate()))).every(d=>d.status==="fulfilled"?d.value:!1)}catch{return !1}}function x(){a&&(s=vue.watch(a,()=>{E(),y();},{deep:J?1:!0,flush:"post"})),S=vue.effectScope(),$=S.run(()=>{let v=vue.computed(()=>!!Object.entries(u.value).length&&Object.entries(u.value).every(([C,D])=>D.$dirty)),d=vue.computed(()=>Object.entries(u.value).some(([C,D])=>D.$dirty)),f=vue.computed(()=>Object.entries(u.value).some(([C,D])=>D.$invalid)),R=vue.computed(()=>Object.entries(u.value).every(([C,D])=>D.$valid)),b=vue.computed(()=>v.value&&!l.value&&f.value),l=vue.computed(()=>Object.entries(u.value).some(([C,D])=>D.$pending)),g=vue.computed(()=>Object.fromEntries(Object.entries(u.value).map(([C,D])=>[C,D.$errors]))),I=vue.computed(()=>Object.fromEntries(Object.entries(u.value).map(([C,D])=>[C,D.$silentErrors])));return {$dirty:v,$anyDirty:d,$invalid:f,$valid:R,$error:b,$pending:l,$errors:g,$silentErrors:I}});}function E(){u.value&&Object.entries(u.value).forEach(([v,d])=>{d.$unwatch();}),s?.(),S.stop(),S=vue.effectScope();}function A(){Object.entries(u.value).forEach(([v,d])=>{d.$clearExternalErrors();});}return vue.reactive({...$,$fields:u,$value:t,$reset:O,$touch:p,$validate:c,$unwatch:E,$watch:x,$clearExternalErrors:A})}function se({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:m,index:T,onUnwatch:P}){return Ge(t)?Le({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,index:T,externalErrors:m}):_e(e,t)&&je(e)?he({scopeRules:t,state:e,customMessages:r,path:n,storage:a,options:o,index:T,externalErrors:m}):ke(t)?le({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,index:T,externalErrors:m,onUnwatch:P}):null}function xe(e,t,r,n){let a=me(),o=vue.computed(()=>vue.unref(r.externalErrors)),m=vue.reactive(he({rootRules:e,scopeRules:e,state:t,customMessages:n?.(),storage:a,options:r,externalErrors:o,validationGroups:r.validationGroups})),T=Ne(m);return {regle:m,errors:T}}function Te(e,t){let r={autoDirty:t?.autoDirty??!0,lazy:t?.lazy??!1,rewardEarly:t?.rewardEarly??!1};function n(a,o,m){let T=vue.isRef(o)?o:vue.computed(typeof o=="function"?o:()=>o),P={...r,...m},S=vue.isRef(a)?a:vue.ref(a),$=U(vue.toRaw(S.value)),{regle:s}=xe(T,S,P,e);function i(){s.$unwatch(),h(a,$),s.$reset();}function h(O,p){Object.entries(p).forEach(([c,x])=>{let E=vue.isRef(O)?O.value:O,A=vue.isRef(E[c])?E[c].value:E[c],v=vue.isRef(p[c])?p[c]._value:p[c];Array.isArray(v)&&Array.isArray(A)?(E[c]=[],v.forEach((d,f)=>{E[c][f]={},h(E[c][f],v[f]);})):B(v)?h(A,v):vue.isRef(E[c])?E[c].value=v:E[c]=v;});}let y=vue.computed(()=>!(s.$invalid||s.$pending));async function u(){return s.$touch(),await s.$validate()?S.value:!1}return {r$:s,resetAll:i,validateState:u,ready:y,state:S}}return n}var Ye=Te();function De(){function e(t,r){return r}return e}var Ce=De();function Qe({rules:e,modifiers:t}){let r=Te(e,t),n=De();return {useRegle:r,inferRules:n}}exports.InternalRuleType=ce;exports.createRule=Re;exports.defineRegleConfig=Qe;exports.inferRules=Ce;exports.unwrapRuleParameters=j;exports.useRegle=Ye;
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, MaybeRefOrGetter, 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];
@@ -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
@@ -157,21 +293,8 @@ type AddDollarToOptions<T extends Record<string, any>> = {
157
293
  [K in keyof T as `$${string & K}`]: T[K];
158
294
  };
159
295
 
160
- 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>;
161
- declare const useRegle: useRegleFn<Partial<AllRulesDeclarations>>;
162
-
163
- interface inferRulesFn<TCustomRules extends Partial<AllRulesDeclarations>> {
164
- <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;
165
- <TState extends unknown, TRules extends RegleRuleDecl>(state: MaybeRef<TState>, rulesFactory: TRules): typeof rulesFactory;
166
- }
167
- declare const inferRules: inferRulesFn<Partial<AllRulesDeclarations>>;
168
-
169
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> {
170
- r$: RegleStatus<TState, TRules, TValidationGroups, TExternal>;
171
- ready: ComputedRef<boolean>;
172
- resetAll: () => void;
173
- validateState: () => Promise<false | Prettify<DeepSafeFormState<TState, TRules>>>;
174
- state: Ref<TState>;
297
+ r$: RegleRoot<TState, TRules, TValidationGroups, TExternal>;
175
298
  }
176
299
  type isDeepExact<T, U> = {
177
300
  [K in keyof T]-?: CheckDeepExact<NonNullable<T[K]>, K extends keyof U ? NonNullable<U[K]> : never>;
@@ -452,17 +575,25 @@ type RegleExternalValidationErrorsReport<TExternalError extends RegleExternalVal
452
575
  /**
453
576
  * @public
454
577
  */
455
- type RegleStatus<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> = RegleCommonStatus<TState> & {
456
- readonly $fields: {
457
- readonly [TKey in keyof TRules]: InferRegleStatusType<NonNullable<TRules[TKey]>, TState, TKey>;
458
- };
459
- readonly $errors: RegleErrorTree<TRules, TExternal>;
460
- readonly $silentErrors: RegleErrorTree<TRules, TExternal>;
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;
461
580
  } & ([TValidationGroups] extends [never] ? {} : {
462
581
  $groups: {
463
582
  readonly [TKey in keyof TValidationGroups]: RegleValidationGroupOutput;
464
583
  };
465
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
+ };
466
597
  /**
467
598
  * @public
468
599
  */
@@ -470,13 +601,14 @@ type InferRegleStatusType<TRule extends RegleCollectionRuleDecl | RegleRuleDecl
470
601
  /**
471
602
  * @public
472
603
  */
473
- interface RegleFieldStatus<TState extends any = any, TRules extends RegleFormPropertyType<any, Partial<AllRulesDeclarations>> = Record<string, any>> extends RegleCommonStatus<TState> {
474
- $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>>;
475
606
  readonly $errors: string[];
476
607
  readonly $silentErrors: string[];
477
608
  readonly $externalErrors?: string[];
609
+ $extractDirtyFields: (filterNullishValues?: boolean) => TState | null;
478
610
  readonly $rules: {
479
- 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>;
480
612
  };
481
613
  }
482
614
  /**
@@ -489,6 +621,7 @@ interface RegleCommonStatus<TValue = any> {
489
621
  readonly $anyDirty: boolean;
490
622
  readonly $pending: boolean;
491
623
  readonly $error: boolean;
624
+ readonly $ready: boolean;
492
625
  $id?: string;
493
626
  $value: UnwrapNestedRefs<TValue>;
494
627
  $touch(): void;
@@ -509,7 +642,7 @@ type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata exte
509
642
  readonly $pending: boolean;
510
643
  readonly $path: string;
511
644
  readonly $metadata: TMetadata;
512
- $validator: (value: Maybe<TValue>, ...args: TParams) => RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition>;
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>);
513
646
  $validate(): Promise<boolean>;
514
647
  $reset(): void;
515
648
  } & ([TParams] extends [never[]] ? {} : [unknown[]] extends [TParams] ? {
@@ -520,11 +653,13 @@ type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata exte
520
653
  /**
521
654
  * @public
522
655
  */
523
- 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'> {
524
657
  readonly $each: Array<InferRegleStatusType<NonNullable<TRules>, NonNullable<TState>, number>>;
525
658
  readonly $field: RegleFieldStatus<TState, TFieldRule>;
526
659
  readonly $errors: RegleErrorTree<TRules>;
527
660
  readonly $silentErrors: RegleErrorTree<TRules>;
661
+ $extractDirtyFields: (filterNullishValues?: boolean) => PartialDeep<TState>;
662
+ $parse: () => Promise<false | SafeProperty<TState, TRules>>;
528
663
  }
529
664
 
530
665
  /**
@@ -574,4 +709,4 @@ declare function defineRegleConfig<TCustomRules extends Partial<AllRulesDeclarat
574
709
  inferRules: inferRulesFn<TCustomRules>;
575
710
  };
576
711
 
577
- 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 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 };
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, MaybeRefOrGetter, 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];
@@ -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
@@ -157,21 +293,8 @@ type AddDollarToOptions<T extends Record<string, any>> = {
157
293
  [K in keyof T as `$${string & K}`]: T[K];
158
294
  };
159
295
 
160
- 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>;
161
- declare const useRegle: useRegleFn<Partial<AllRulesDeclarations>>;
162
-
163
- interface inferRulesFn<TCustomRules extends Partial<AllRulesDeclarations>> {
164
- <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;
165
- <TState extends unknown, TRules extends RegleRuleDecl>(state: MaybeRef<TState>, rulesFactory: TRules): typeof rulesFactory;
166
- }
167
- declare const inferRules: inferRulesFn<Partial<AllRulesDeclarations>>;
168
-
169
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> {
170
- r$: RegleStatus<TState, TRules, TValidationGroups, TExternal>;
171
- ready: ComputedRef<boolean>;
172
- resetAll: () => void;
173
- validateState: () => Promise<false | Prettify<DeepSafeFormState<TState, TRules>>>;
174
- state: Ref<TState>;
297
+ r$: RegleRoot<TState, TRules, TValidationGroups, TExternal>;
175
298
  }
176
299
  type isDeepExact<T, U> = {
177
300
  [K in keyof T]-?: CheckDeepExact<NonNullable<T[K]>, K extends keyof U ? NonNullable<U[K]> : never>;
@@ -452,17 +575,25 @@ type RegleExternalValidationErrorsReport<TExternalError extends RegleExternalVal
452
575
  /**
453
576
  * @public
454
577
  */
455
- type RegleStatus<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> = RegleCommonStatus<TState> & {
456
- readonly $fields: {
457
- readonly [TKey in keyof TRules]: InferRegleStatusType<NonNullable<TRules[TKey]>, TState, TKey>;
458
- };
459
- readonly $errors: RegleErrorTree<TRules, TExternal>;
460
- readonly $silentErrors: RegleErrorTree<TRules, TExternal>;
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;
461
580
  } & ([TValidationGroups] extends [never] ? {} : {
462
581
  $groups: {
463
582
  readonly [TKey in keyof TValidationGroups]: RegleValidationGroupOutput;
464
583
  };
465
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
+ };
466
597
  /**
467
598
  * @public
468
599
  */
@@ -470,13 +601,14 @@ type InferRegleStatusType<TRule extends RegleCollectionRuleDecl | RegleRuleDecl
470
601
  /**
471
602
  * @public
472
603
  */
473
- interface RegleFieldStatus<TState extends any = any, TRules extends RegleFormPropertyType<any, Partial<AllRulesDeclarations>> = Record<string, any>> extends RegleCommonStatus<TState> {
474
- $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>>;
475
606
  readonly $errors: string[];
476
607
  readonly $silentErrors: string[];
477
608
  readonly $externalErrors?: string[];
609
+ $extractDirtyFields: (filterNullishValues?: boolean) => TState | null;
478
610
  readonly $rules: {
479
- 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>;
480
612
  };
481
613
  }
482
614
  /**
@@ -489,6 +621,7 @@ interface RegleCommonStatus<TValue = any> {
489
621
  readonly $anyDirty: boolean;
490
622
  readonly $pending: boolean;
491
623
  readonly $error: boolean;
624
+ readonly $ready: boolean;
492
625
  $id?: string;
493
626
  $value: UnwrapNestedRefs<TValue>;
494
627
  $touch(): void;
@@ -509,7 +642,7 @@ type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata exte
509
642
  readonly $pending: boolean;
510
643
  readonly $path: string;
511
644
  readonly $metadata: TMetadata;
512
- $validator: (value: Maybe<TValue>, ...args: TParams) => RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition>;
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>);
513
646
  $validate(): Promise<boolean>;
514
647
  $reset(): void;
515
648
  } & ([TParams] extends [never[]] ? {} : [unknown[]] extends [TParams] ? {
@@ -520,11 +653,13 @@ type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata exte
520
653
  /**
521
654
  * @public
522
655
  */
523
- 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'> {
524
657
  readonly $each: Array<InferRegleStatusType<NonNullable<TRules>, NonNullable<TState>, number>>;
525
658
  readonly $field: RegleFieldStatus<TState, TFieldRule>;
526
659
  readonly $errors: RegleErrorTree<TRules>;
527
660
  readonly $silentErrors: RegleErrorTree<TRules>;
661
+ $extractDirtyFields: (filterNullishValues?: boolean) => PartialDeep<TState>;
662
+ $parse: () => Promise<false | SafeProperty<TState, TRules>>;
528
663
  }
529
664
 
530
665
  /**
@@ -574,4 +709,4 @@ declare function defineRegleConfig<TCustomRules extends Partial<AllRulesDeclarat
574
709
  inferRules: inferRulesFn<TCustomRules>;
575
710
  };
576
711
 
577
- 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 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 };
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';var ce=(r=>(r.Inline="__inline",r.Async="__async",r))(ce||{});function Ae(e,t){return computed(()=>e.value.some(r=>r[t]))}function Me(e,t){return computed(()=>e.value.reduce((r,n)=>{let a=n[t]||[];return r.concat(a)},[]))}function j(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 Ve(e){let t=e.toString();return (t.includes("=>")?t.split("=>")[0]:t).slice(t.indexOf("(")+1,t.indexOf(")")).split(",").map(o=>o.trim()).filter(o=>o.includes("=")).length+e.length}function fe(e,...t){let{message:r,validator:n,active:a,type:o,...m}=e,T=o==="__async"||n.constructor.name==="AsyncFunction";return {...{validator($,...s){return e.validator($,...j(s.length?s:t))},message($,s){return typeof e.message=="function"?e.message($,{...s,$params:j(s.$params?.length?s.$params:t)}):e.message},active($,s){return typeof e.active=="function"?e.active($,{...s,$params:j(s.$params?.length?s.$params:t)}):e.active??!0},exec($){let s=e.validator($,...j(t)),i;return s instanceof Promise?s.then(h=>(i=h,typeof i=="object"&&"$valid"in i?i.$valid:typeof i=="boolean"?i:!1)):(i=s,typeof i=="object"&&"$valid"in i?i.$valid:typeof i=="boolean"?i:!1)}},...m,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:T,_params:Fe(t)}}function Re(e){if(typeof e.validator=="function"){let r=fe(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(Ve(e.validator)>1){let a=function(...o){return fe(e,...o)};return a.validator=r.validator,a.message=r.message,a.active=r.active,a.type=r.type,a.exec=r.exec,a._validator=r.validator,a._message=r.message,a._active=r.active,a._type=e.type,a._patched=!1,a._async=n,a}else return r}throw new Error("Validator must be a function")}function B(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function je(e){return B(e.value)}function U(e){let t=e,r={}.toString.call(e).slice(8,-1);if(r=="Set"&&(t=new Set([...e].map(n=>U(n)))),r=="Map"&&(t=new Map([...e].map(n=>[U(n[0]),U(n[1])]))),r=="Date"&&(t=new Date(e.getTime())),r=="RegExp"&&(t=RegExp(e.source,lt(e))),r=="Array"||r=="Object"){t=Array.isArray(e)?[]:{};for(let n in e)t[n]=U(e[n]);}return t}function lt(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 pe(e,t,r){return e instanceof Function?e(t,r??0):e}function ae(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 K(e,t,r){let n,a=(...o)=>new Promise(m=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...o])).then(m);},t);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...o)=>new Promise(m=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...o])).then(m);},0);}),a}function st(e,t){let r=String(e).split("."),n=String(t).split(".");for(let a=0;a<Math.min(r.length,n.length);a++){let o=Number(r[a]),m=Number(n[a]);if(o>m)return 1;if(m>o)return -1;if(!isNaN(o)&&isNaN(m))return 1;if(isNaN(o)&&!isNaN(m))return -1}return 0}var J=st(version,"3.5.0")!==-1;function it(){return Math.floor(Math.random()*Date.now()).toString()}function de(){return typeof window>"u"?it():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(10)}function me(){let e=shallowRef(new Map),t=shallowRef(new Map),r=shallowRef(new Map),n=shallowRef(new Map),a=shallowRef(new Map),o=shallowRef(new Map);function m(p){let c=t.value.get(p);if(c)return c;{let x=ref({});return t.value.set(p,x),x}}function T(p){let c=r.value.get(p);if(c)return c;{let x=ref([]);return r.value.set(p,x),x}}function P(p,c,x){o.value.set(`${p}-${c}`,x);}function S(p,c){return o.value.get(`${p}-${c}`)}function $(p,c){p&&c!=null&&o.value.delete(`${p}-${c}`);}function s(p,c){n.value.set(p,c);}function i(p){return n.value.get(p)??!1}function h(p,c){e.value.set(p,c);}function y(p,c){let x=e.value.get(p);return x?u(c,x)?{valid:!0}:{valid:!1}:void 0}function u(p,c){let x=Object.keys(c),E=Object.keys(p);return E.length!==x.length||!E.every(v=>x.includes(v))?!1:E.every(v=>{let d=p[v],f=c[v];return !f||!d||typeof d=="function"||typeof f=="function"||typeof d=="number"||typeof d=="boolean"?!1:d._params?d._params?.every((R,b)=>{if(typeof f=="number"||typeof f=="boolean")return !0;{let l=j(f._params),g=j(d._params);return l?.[b]===g?.[b]}}):!0})}function O(p){let c=a.value.get(p);if(c)return c;{let x=ref(!1),E=ref(!0),A=ref({}),v=ref(!1);return a.value.set(p,{$pending:x,$valid:E,$metadata:A,$validating:v}),{$pending:x,$valid:E,$metadata:A,$validating:v}}}return onScopeDispose(()=>{e.value.clear(),t.value.clear(),r.value.clear(),n.value.clear(),a.value.clear(),o.value.clear();}),{addRuleDeclEntry:h,setDirtyEntry:s,checkRuleDeclEntry:y,getDirtyState:i,trySetRuleStatusRef:O,getFieldsEntry:m,getCollectionsEntry:T,getArrayStatus:S,addArrayStatus:P,deleteArrayStatus:$,arrayStatusStorage:o}}function _e(e,t){return B(e.value)&&B(t.value)&&!Object.entries(t.value).some(r=>ee(r))}function Ge(e){return !!e.value&&"$each"in e.value}function ke(e){return !!e.value&&B(e.value)}function ee(e){return B(e)&&"_validator"in e}function te(e){return typeof e.value!="function"}function ye(e){return B(e)&&"$fields"in e}function ge(e){return !!e&&"$each"in e}function ve(e){return !!e&&"$rules"in e}function $e(e){return "$each"in e||"$errors"in e}function H({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(e,t=!1){return ye(e)?Se(e.$fields):ge(e)?{$errors:e.$field.$rules?H({field:e.$field,silent:t}):[],$each:e.$each.map(r=>Be(r,t))}:ve(e)?e.$error?H({field:e,silent:t}):e.$externalErrors??[]:[]}function ft(e,t=!1){return e.map(r=>Be(r,t))}function Se(e,t=!1){return Object.fromEntries(Object.entries(e).map(([r,n])=>ye(n)?[r,Se(n.$fields,t)]:ge(n)?[r,{$errors:H({field:n.$field,silent:t}),$each:ft(n.$each,t)}]:ve(n)?n.$error?[r,H({field:n,silent:t})]:[r,n.$externalErrors??[]]:[r,[]]))}function Ne(e){return computed(()=>Se(e.$fields))}function We({$dirty:e,customMessages:t,rule:r,ruleKey:n,state:a,path:o,storage:m,$debounce:T}){let P=effectScope(),S,$,s=ref(!1),{$pending:i,$valid:h,$metadata:y,$validating:u}=m.trySetRuleStatusRef(`${o}.${n}`);function O(){S=P.run(()=>{let d=computed(()=>({$invalid:!h.value,$params:g.value,...y.value})),f=computed(()=>te(r)?typeof r.value.active=="function"?r.value.active(a.value,d.value):r.value.active:!0),R=computed(()=>{let C="",D=t?t[n]?.message:void 0;return D&&(typeof D=="function"?C=D(a.value,d.value):C=D),te(r)&&(D&&!r.value._patched||(typeof r.value.message=="function"?C=r.value.message(a.value,d.value):C=r.value.message)),ae(C)&&(C="Error",console.warn(`No error message defined for ${o}.${n}`)),C}),b=computed(()=>te(r)&&r.value.type?r.value.type:n),l=computed(()=>te(r)?r.value.validator:r.value),g=computed(()=>typeof r.value=="function"?[]:j(r.value._params??[])),I=computed(()=>`${o}.${b.value}`);return {$active:f,$message:R,$type:b,$validator:l,$params:g,$path:I}}),$=watch(S.$params,E,{deep:!0});}O();function p(){h.value=!0,e.value&&(i.value=!0);}async function c(){let d=S.$validator.value,f=d(a.value,...S.$params.value),R=!1,b=a.value;try{p();let l;if(f instanceof Promise?l=await f:l=f,a.value!==b)return !0;if(typeof l=="boolean")R=l;else {let{$valid:g,...I}=l;R=g,y.value=I;}}catch{R=!1;}finally{i.value=!1;}return R}let x=K(c,T??200);async function E(){u.value=!0;let d=!1;if(ee(r.value)&&r.value._async)d=await x();else {let f=S.$validator.value,R=f(a.value,...S.$params.value);if(R 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(R!=null)if(typeof R=="boolean")d=R;else {let{$valid:b,...l}=R;d=b,y.value=l;}}return h.value=d,u.value=!1,d}function A(){h.value=!0,y.value={},i.value=!1,u.value=!1,O();}function v(){$(),P.stop(),P=effectScope();}return reactive({...S,$pending:i,$valid:h,$metadata:y,_haveAsync:s,$validating:u,$validate:E,$unwatch:v,$watch:O,$reset:A})}function le({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:m,index:T,onUnwatch:P,$isArray:S}){let $=effectScope(),s,i=ref(!1),h=ref(!1),y=ref([]),u,O,p,c,x,E=()=>{};function A(){y.value=m.value??[];}A();function v(){let M=t.value,F=a.checkRuleDeclEntry(n,M);g.value=Object.fromEntries(Object.entries(M).filter(([V])=>V.startsWith("$"))),l.value=Object.fromEntries(Object.entries(t.value).filter(([V])=>!V.startsWith("$")).map(([V,k])=>{if(k){let ie=toRef(()=>k);return [V,We({$dirty:i,customMessages:r,rule:ie,ruleKey:V,state:e,path:n,storage:a,$debounce:g.value.$debounce})]}return []}).filter(V=>!!V.length)),R(),d(),F?.valid!=null&&(i.value=a.getDirtyState(n),i.value&&E()),a.addRuleDeclEntry(n,M);}function d(){E=s.$debounce.value?K(b,s.$debounce.value??s.haveAnyAsyncRule?100:0):b;}function f(){l.value&&Object.entries(l.value).forEach(([M,F])=>{F.$unwatch();}),c(),i.value&&a.setDirtyEntry(n,i.value),u(),O(),p(),$.stop(),$=effectScope(),P?.(),x?.();}function R(){l.value&&Object.entries(l.value).forEach(([M,F])=>{F.$watch();}),s=$.run(()=>{let M=computed(()=>i.value),F=computed(()=>g.value.$debounce),V=computed(()=>g.value.$lazy!=null?g.value.$lazy:unref(o.lazy)),k=computed(()=>g.value.$rewardEarly!=null?g.value.$rewardEarly:unref(o.rewardEarly)),ie=computed(()=>g.value.$autoDirty!=null?g.value.$autoDirty:unref(o.autoDirty)),Ze=computed(()=>Object.entries(l.value).some(([z,N])=>N.$validating)),Ie=computed(()=>ue.value&&!Pe.value&&i.value),Ke=computed(()=>Ie.value?H({field:{$dirty:i.value,$externalErrors:y.value,$rules:l.value}}):[]),et=computed(()=>H({field:{$dirty:i.value,$externalErrors:y.value,$rules:l.value},silent:!0})),Pe=computed(()=>h.value||!k.value?Object.entries(l.value).some(([z,N])=>N.$pending):!1),ue=computed(()=>y.value?.length?!0:!k.value||k.value&&h.value?Object.entries(l.value).some(([z,N])=>!N.$valid):!1),we=computed(()=>i.value&&!ae(e.value)&&!Ze.value?y.value?.length?!1:k.value?Object.entries(l.value).every(([z,N])=>N.$valid):!ue.value:!1),tt=computed(()=>Object.entries(l.value).some(([z,N])=>N._haveAsync));return watch(we,z=>{z&&(h.value=!1);}),{$error:Ie,$pending:Pe,$invalid:ue,$valid:we,$debounce:F,$lazy:V,$errors:Ke,$silentErrors:et,$rewardEarly:k,$autoDirty:ie,$anyDirty:M,haveAnyAsyncRule:tt}}),p=watch(m,A),u=watch(e,()=>{s.$autoDirty.value&&(i.value||(i.value=!0)),t.value instanceof Function&&v(),E(),s.$rewardEarly.value;},{deep:S?!0:J?1:!0}),c=watch(i,()=>{a.setDirtyEntry(n,i.value);}),O=watch(s.$valid,M=>{s.$rewardEarly.value&&M&&(h.value=!1);}),x=watch(s.haveAnyAsyncRule,d);}function b(){Object.entries(l.value).forEach(([M,F])=>{F.$validate();});}let l=ref(),g=ref();v();function I(){i.value=!1,y.value=[],Object.entries(l.value).forEach(([M,F])=>{F.$reset();}),s.$lazy.value||Object.entries(l.value).map(([M,F])=>F.$validate());}function C(){i.value||(i.value=!0,s.$rewardEarly.value,E());}let D=s.$debounce.value?K(w,s.$debounce.value??0):w;async function w(){try{if(h.value=!0,s.$autoDirty.value&&i.value&&!s.$pending.value)return !s.$error.value;{let M=Object.entries(l.value).map(([V,k])=>k.$validate());return (await Promise.allSettled(M)).every(V=>V.status==="fulfilled"?V.value:!1)}}catch{return !1}}function Xe(){y.value=[];}return s.$lazy.value||w(),reactive({$dirty:i,...s,$externalErrors:y,$value:e,$rules:l,$reset:I,$touch:C,$validate:D,$unwatch:f,$watch:R,$clearExternalErrors:Xe})}function qe({$id:e,path:t,index:r,options:n,storage:a,stateValue:o,customMessages:m,rules:T,externalErrors:P}){let S=T.$key?T.$key:de(),$=`${t}.${String(S)}`;typeof o.value=="object"&&o.value!=null&&(o.value.$id?$=`${t}.${o.value.$id}`:Object.defineProperties(o.value,{$id:{value:S,enumerable:!1,configurable:!1,writable:!1}}));let s=toRef(()=>P.value?.[r]),i=se({state:o,rulesDef:toRef(()=>T),customMessages:m,path:$,storage:a,options:n,externalErrors:s});if(i){let h=o.value?.$id;i.$id=h??String(S),a.addArrayStatus(e,i.$id,i);}return i}function Le({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:m}){let T=effectScope(),P,S=effectScope(),$;if(Array.isArray(e.value)&&!t.value.$each)return null;let s=ref(),i=ref(e.value),h,y=ref({}),u=a.getCollectionsEntry(n);$=S.run(()=>{let f=computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(l=>typeof l!="object"):t.value.$each&&!(t.value.$each instanceof Function)?Object.values(t.value.$each).every(l=>ee(l)):!1),R=computed(()=>m.value?$e(m.value)?m.value.$errors??[]:[]:[]),b=computed(()=>m.value?$e(m.value)?m.value.$each??[]:[]:[]);return {isPrimitiveArray:f,$externalErrorsField:R,$externalErrorsEach:b}}),O(),c();function O(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(s.value=de(),Object.defineProperties(e.value,{$id:{value:s.value,enumerable:!1,configurable:!1,writable:!1}})):e.value?.$id&&(s.value=e.value.$id)),!$.isPrimitiveArray.value&&(i.value=y.value.$value,Array.isArray(e.value)&&t.value.$each?u.value=e.value.map((f,R)=>{let b=pe(t.value.$each,toRef(()=>f),R);if(b){let l=qe({$id:s.value,path:n,rules:b,stateValue:toRef(()=>f),index:R,options:o,storage:a,externalErrors:$.$externalErrorsEach});return l||null}}).filter(f=>!!f):u.value=[],y.value=le({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:$.$externalErrorsField,$isArray:!0}));}function p(){if(Array.isArray(e.value)){let f=U(u.value);u.value=e.value.map((R,b)=>{let l=toRef(()=>R);if(R.$id&&u.value.find(g=>g.$id===R.$id)){let g=a.getArrayStatus(s.value,R.$id);return g?(g.$value=l,g):null}else {let g=pe(t.value.$each,l,b);if(g){let I=qe({$id:s.value,path:n,rules:g,stateValue:l,index:b,options:o,storage:a,externalErrors:$.$externalErrorsEach});return I||null}}}).filter(R=>!!R),f.filter(R=>!e.value.find(b=>R.$id===b.$id)).forEach((R,b)=>{a.deleteArrayStatus(s.value,b.toString());});}else u.value=[];}function c(){h=watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")?O():p();},{deep:J?1:!0,flush:"pre"}),P=T.run(()=>{let f=computed(()=>y.value.$dirty&&u.value.every(w=>w.$dirty)),R=computed(()=>y.value.$anyDirty||u.value.some(w=>w.$dirty)),b=computed(()=>y.value.$invalid||u.value.some(w=>w.$invalid)),l=computed(()=>y.value.$valid&&u.value.every(w=>w.$valid)),g=computed(()=>y.value.$error||u.value.some(w=>w.$error)),I=computed(()=>y.value.$pending||u.value.some(w=>w.$pending)),C=computed(()=>({$errors:y.value.$errors,$each:u.value.map(w=>w.$errors)})),D=computed(()=>({$errors:y.value.$silentErrors,$each:u.value.map(w=>w.$silentErrors)}));return {$dirty:f,$anyDirty:R,$invalid:b,$valid:l,$error:g,$pending:I,$errors:C,$silentErrors:D}}),$.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 x(){h&&h(),y.value&&y.value.$unwatch(),u.value&&u.value.forEach(f=>{"$dirty"in f&&f.$unwatch();}),T.stop(),T=effectScope(),S.stop(),S=effectScope(!0);}function E(){y.value.$touch(),u.value.forEach(f=>{f.$touch();});}function A(){y.value.$reset(),u.value.forEach(f=>{f.$reset();});}async function v(){try{return (await Promise.all([y.value.$validate(),...u.value.map(R=>R.$validate())])).every(R=>!!R)}catch{return !1}}function d(){}return reactive({$field:y,...P,$each:u,$value:e,$validate:v,$unwatch:x,$watch:c,$touch:E,$reset:A,$clearExternalErrors:d})}function he({scopeRules:e,state:t,customMessages:r,path:n="",rootRules:a,storage:o,options:m,externalErrors:T,validationGroups:P}){let S,$,s=null;function y(v=!0,d=!1){u.value=null,triggerRef(u);let f=Object.fromEntries(Object.entries(e.value).map(([l,g])=>{if(g){let I=toRef(t.value,l),C=toRef(()=>g),D=toRef(()=>T.value?.[l]);return [l,se({state:I,rulesDef:C,customMessages:r,path:n?`${n}.${l}`:l,storage:o,options:m,externalErrors:D})]}return []}).filter(l=>!!l.length&&l[1]!=null)),R=Object.fromEntries(Object.entries(unref(T)??{}).filter(([l])=>!(l in e.value)).map(([l,g])=>{if(g){let I=toRef(()=>({})),C=toRef(()=>g);return [l,se({state:ref(void 0),rulesDef:I,customMessages:r,path:n?`${n}.${l}`:l,storage:o,options:m,externalErrors:C})]}return []})),b=Object.fromEntries(Object.entries(P?.(f)??{}).map(([l,g])=>g.length?[l,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(I=>[I,Ae(toRef(()=>g),I)])),...Object.fromEntries(["$errors","$silentErrors"].map(I=>[I,Me(toRef(()=>g),I)]))}]:[]));u.value={...f,...R,...b},v&&x();}let u=o.getFieldsEntry(n);y();function O(){y(!1),Object.entries(u.value).forEach(([v,d])=>{d.$reset();}),x();}function p(){Object.entries(u.value).forEach(([v,d])=>{d.$touch();});}async function c(){try{return (await Promise.allSettled(Object.entries(u.value).map(([d,f])=>f.$validate()))).every(d=>d.status==="fulfilled"?d.value:!1)}catch{return !1}}function x(){a&&(s=watch(a,()=>{E(),y();},{deep:J?1:!0,flush:"post"})),S=effectScope(),$=S.run(()=>{let v=computed(()=>!!Object.entries(u.value).length&&Object.entries(u.value).every(([C,D])=>D.$dirty)),d=computed(()=>Object.entries(u.value).some(([C,D])=>D.$dirty)),f=computed(()=>Object.entries(u.value).some(([C,D])=>D.$invalid)),R=computed(()=>Object.entries(u.value).every(([C,D])=>D.$valid)),b=computed(()=>v.value&&!l.value&&f.value),l=computed(()=>Object.entries(u.value).some(([C,D])=>D.$pending)),g=computed(()=>Object.fromEntries(Object.entries(u.value).map(([C,D])=>[C,D.$errors]))),I=computed(()=>Object.fromEntries(Object.entries(u.value).map(([C,D])=>[C,D.$silentErrors])));return {$dirty:v,$anyDirty:d,$invalid:f,$valid:R,$error:b,$pending:l,$errors:g,$silentErrors:I}});}function E(){u.value&&Object.entries(u.value).forEach(([v,d])=>{d.$unwatch();}),s?.(),S.stop(),S=effectScope();}function A(){Object.entries(u.value).forEach(([v,d])=>{d.$clearExternalErrors();});}return reactive({...$,$fields:u,$value:t,$reset:O,$touch:p,$validate:c,$unwatch:E,$watch:x,$clearExternalErrors:A})}function se({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,externalErrors:m,index:T,onUnwatch:P}){return Ge(t)?Le({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,index:T,externalErrors:m}):_e(e,t)&&je(e)?he({scopeRules:t,state:e,customMessages:r,path:n,storage:a,options:o,index:T,externalErrors:m}):ke(t)?le({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:o,index:T,externalErrors:m,onUnwatch:P}):null}function xe(e,t,r,n){let a=me(),o=computed(()=>unref(r.externalErrors)),m=reactive(he({rootRules:e,scopeRules:e,state:t,customMessages:n?.(),storage:a,options:r,externalErrors:o,validationGroups:r.validationGroups})),T=Ne(m);return {regle:m,errors:T}}function Te(e,t){let r={autoDirty:t?.autoDirty??!0,lazy:t?.lazy??!1,rewardEarly:t?.rewardEarly??!1};function n(a,o,m){let T=isRef(o)?o:computed(typeof o=="function"?o:()=>o),P={...r,...m},S=isRef(a)?a:ref(a),$=U(toRaw(S.value)),{regle:s}=xe(T,S,P,e);function i(){s.$unwatch(),h(a,$),s.$reset();}function h(O,p){Object.entries(p).forEach(([c,x])=>{let E=isRef(O)?O.value:O,A=isRef(E[c])?E[c].value:E[c],v=isRef(p[c])?p[c]._value:p[c];Array.isArray(v)&&Array.isArray(A)?(E[c]=[],v.forEach((d,f)=>{E[c][f]={},h(E[c][f],v[f]);})):B(v)?h(A,v):isRef(E[c])?E[c].value=v:E[c]=v;});}let y=computed(()=>!(s.$invalid||s.$pending));async function u(){return s.$touch(),await s.$validate()?S.value:!1}return {r$:s,resetAll:i,validateState:u,ready:y,state:S}}return n}var Ye=Te();function De(){function e(t,r){return r}return e}var Ce=De();function Qe({rules:e,modifiers:t}){let r=Te(e,t),n=De();return {useRegle:r,inferRules:n}}export{ce as InternalRuleType,Re as createRule,Qe as defineRegleConfig,Ce as inferRules,j as unwrapRuleParameters,Ye 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,6 +1,6 @@
1
1
  {
2
2
  "name": "@regle/core",
3
- "version": "0.2.2",
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"