@regle/core 0.2.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +163 -29
- package/dist/index.d.ts +163 -29
- package/dist/index.js +1 -1
- package/package.json +1 -1
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 de=(r=>(r.Inline="__inline",r.Async="__async",r))(de||{});function Fe(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 _(e){return e.map(t=>t instanceof Function?t():vue.unref(t))}function Ve(e){return e.map(t=>t instanceof Function||vue.isRef(t)?t:vue.toRef(()=>t))}function je(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 ye(e,...t){let{message:r,validator:n,active:a,type:l,...p}=e,b=l==="__async"||n.constructor.name==="AsyncFunction";return {...{validator(v,...c){return e.validator(v,..._(c.length?c:t))},message(v,c){return typeof e.message=="function"?e.message(v,{...c,$params:_(c.$params?.length?c.$params:t)}):e.message},active(v,c){return typeof e.active=="function"?e.active(v,{...c,$params:_(c.$params?.length?c.$params:t)}):e.active??!0},exec(v){let c=e.validator(v,..._(t)),o;return c instanceof Promise?c.then(I=>(o=I,typeof o=="object"&&"$valid"in o?o.$valid:typeof o=="boolean"?o:!1)):(o=c,typeof o=="object"&&"$valid"in o?o.$valid:typeof o=="boolean"?o:!1)}},...p,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:b,_params:Ve(t)}}function me(e){if(typeof e.validator=="function"){let r=ye(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(je(e.validator)>1){let a=function(...l){return ye(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 k(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function _e(e){return k(e.value)}function L(e){let t=e,r={}.toString.call(e).slice(8,-1);if(r=="Set"&&(t=new Set([...e].map(n=>L(n)))),r=="Map"&&(t=new Map([...e].map(n=>[L(n[0]),L(n[1])]))),r=="Date"&&(t=new Date(e.getTime())),r=="RegExp"&&(t=RegExp(e.source,st(e))),r=="Array"||r=="Object"){t=Array.isArray(e)?[]:{};for(let n in e)t[n]=L(e[n]);}return t}function st(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 ge(e,t,r){return e instanceof Function?e(t,r??0):e}function ke(e,t){vue.isRef(e)?e.value=t:e=t;}function Ge(e,t){vue.isRef(e)?e.value=[]:e=[],t.forEach((r,n)=>{let a=vue.isRef(e)?e.value[n]:e[n];a={},re(a,t[n]);});}function re(e,t){Object.entries({...vue.unref(e),...t}).forEach(([r,n])=>{let a=vue.isRef(e)?e.value:e,l=vue.isRef(t[r])?t[r]._value:t[r],p=vue.isRef(a[r])?a[r].value:a[r];Array.isArray(a[r])?(a[r]=[],Array.isArray(l)&&l.forEach((b,D)=>{a[r][D]={},re(a[r][D],l[D]);})):k(l)?re(p,l):vue.isRef(a[r])?a[r].value=l:a[r]=l;});}function z(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 ne(e,t,r){let n,a=(...l)=>new Promise(p=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(p);},t);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...l)=>new Promise(p=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(p);},0);}),a}function ut(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]),p=Number(n[a]);if(l>p)return 1;if(p>l)return -1;if(!isNaN(l)&&isNaN(p))return 1;if(isNaN(l)&&!isNaN(p))return -1}return 0}var Z=ut(vue.version,"3.5.0")!==-1;function ct(){return Math.floor(Math.random()*Date.now()).toString()}function ve(){return typeof window>"u"?ct():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(10)}function $e(){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 p(d){let y=t.value.get(d);if(y)return y;{let h=vue.ref({});return t.value.set(d,h),h}}function b(d){let y=r.value.get(d);if(y)return y;{let h=vue.ref([]);return r.value.set(d,h),h}}function D(d,y,h){l.value.set(`${d}-${y}`,h);}function C(d,y){return l.value.get(`${d}-${y}`)}function v(d,y){d&&y!=null&&l.value.delete(`${d}-${y}`);}function c(d,y){n.value.set(d,y);}function o(d){return n.value.get(d)??!1}function I(d,y){e.value.set(d,y);}function P(d,y){let h=e.value.get(d);return h?$(y,h)?{valid:!0}:{valid:!1}:void 0}function $(d,y){let h=Object.keys(y),w=Object.keys(d);return w.length!==h.length||!w.every(F=>h.includes(F))?!1:w.every(F=>{let T=d[F],O=y[F];return !O||!T||typeof T=="function"||typeof O=="function"||typeof T=="number"||typeof T=="boolean"?!1:T._params?T._params?.every((A,E)=>{if(typeof O=="number"||typeof O=="boolean")return !0;{let s=_(O._params),i=_(T._params);return s?.[E]===i?.[E]}}):!0})}function f(d){let y=a.value.get(d);if(y)return y;{let h=vue.ref(!1),w=vue.ref(!0),M=vue.ref({}),F=vue.ref(!1);return a.value.set(d,{$pending:h,$valid:w,$metadata:M,$validating:F}),{$pending:h,$valid:w,$metadata:M,$validating:F}}}return vue.onScopeDispose(()=>{e.value.clear(),t.value.clear(),r.value.clear(),n.value.clear(),a.value.clear(),l.value.clear();}),{addRuleDeclEntry:I,setDirtyEntry:c,checkRuleDeclEntry:P,getDirtyState:o,trySetRuleStatusRef:f,getFieldsEntry:p,getCollectionsEntry:b,getArrayStatus:C,addArrayStatus:D,deleteArrayStatus:v,arrayStatusStorage:l}}function Be(e,t){return k(e.value)&&k(t.value)&&!Object.entries(t.value).some(r=>ae(r))}function Ne(e){return !!e.value&&"$each"in e.value}function Ue(e){return !!e.value&&k(e.value)}function ae(e){return k(e)&&"_validator"in e}function le(e){return typeof e.value!="function"}function Se(e){return k(e)&&"$fields"in e}function Ee(e){return "$each"in e||"$errors"in e}function be({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 He({$dirty:e,customMessages:t,rule:r,ruleKey:n,state:a,path:l,storage:p,$debounce:b}){let D=vue.effectScope(),C,v,c=vue.ref(!1),{$pending:o,$valid:I,$metadata:P,$validating:$}=p.trySetRuleStatusRef(`${l}.${n}`);function f(){C=D.run(()=>{let T=vue.computed(()=>({$invalid:!I.value,$params:i.value,...P.value})),O=vue.computed(()=>le(r)?typeof r.value.active=="function"?r.value.active(a.value,T.value):r.value.active:!0),A=vue.computed(()=>{let u="",m=t?t[n]?.message:void 0;return m&&(typeof m=="function"?u=m(a.value,T.value):u=m),le(r)&&(m&&!r.value._patched||(typeof r.value.message=="function"?u=r.value.message(a.value,T.value):u=r.value.message)),z(u)&&(u="Error",console.warn(`No error message defined for ${l}.${n}`)),u}),E=vue.computed(()=>le(r)&&r.value.type?r.value.type:n),s=vue.computed(()=>le(r)?r.value.validator:r.value),i=vue.computed(()=>typeof r.value=="function"?[]:_(r.value._params??[])),R=vue.computed(()=>`${l}.${E.value}`);return {$active:O,$message:A,$type:E,$validator:s,$params:i,$path:R}}),v=vue.watch(C.$params,w,{deep:!0});}f();function d(){I.value=!0,e.value&&(o.value=!0);}async function y(){let T=C.$validator.value,O=T(a.value,...C.$params.value),A=!1,E=a.value;try{d();let s;if(O instanceof Promise?s=await O:s=O,a.value!==E)return !0;if(typeof s=="boolean")A=s;else {let{$valid:i,...R}=s;A=i,P.value=R;}}catch{A=!1;}finally{o.value=!1;}return A}let h=ne(y,b??200);async function w(){$.value=!0;let T=!1;if(ae(r.value)&&r.value._async)T=await h();else {let O=C.$validator.value,A=O(a.value,...C.$params.value);if(A instanceof Promise)console.warn('You used a async validator function on a non-async rule, please use "async await" or the "withAsync" helper');else if(A!=null)if(typeof A=="boolean")T=A;else {let{$valid:E,...s}=A;T=E,P.value=s;}}return I.value=T,$.value=!1,T}function M(){I.value=!0,P.value={},o.value=!1,$.value=!1,f();}function F(){v(),D.stop(),D=vue.effectScope();}return vue.reactive({...C,$pending:o,$valid:I,$metadata:P,_haveAsync:c,$validating:$,$validate:w,$unwatch:F,$watch:f,$reset:M})}function ue({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:p,onUnwatch:b,$isArray:D,initialState:C}){let v=vue.effectScope(),c,o=vue.ref(!1),I=vue.ref(!1),P=vue.ref([]),$,f,d,y,h,w=()=>{};function M(){P.value=p.value??[];}M();function F(){let g=t.value,S=a.checkRuleDeclEntry(n,g);i.value=Object.fromEntries(Object.entries(g).filter(([V])=>V.startsWith("$"))),s.value=Object.fromEntries(Object.entries(t.value).filter(([V])=>!V.startsWith("$")).map(([V,U])=>{if(U){let Re=vue.toRef(()=>U);return [V,He({$dirty:o,customMessages:r,rule:Re,ruleKey:V,state:e,path:n,storage:a,$debounce:i.value.$debounce})]}return []}).filter(V=>!!V.length)),A(),T(),S?.valid!=null&&(o.value=a.getDirtyState(n),o.value&&w()),a.addRuleDeclEntry(n,g);}function T(){w=c.$debounce.value?ne(E,c.$debounce.value??c.haveAnyAsyncRule?100:0):E;}function O(){s.value&&Object.entries(s.value).forEach(([g,S])=>{S.$unwatch();}),y(),o.value&&a.setDirtyEntry(n,o.value),$(),f(),d(),v.stop(),v=vue.effectScope(),b?.(),h?.();}function A(){s.value&&Object.entries(s.value).forEach(([g,S])=>{S.$watch();}),c=v.run(()=>{let g=vue.computed(()=>o.value),S=vue.computed(()=>i.value.$debounce),V=vue.computed(()=>i.value.$lazy!=null?i.value.$lazy:vue.unref(l.lazy)),U=vue.computed(()=>i.value.$rewardEarly!=null?i.value.$rewardEarly:vue.unref(l.rewardEarly)),Re=vue.computed(()=>i.value.$autoDirty!=null?i.value.$autoDirty:vue.unref(l.autoDirty)),Ze=vue.computed(()=>Object.entries(s.value).some(([X,W])=>W.$validating)),we=vue.computed(()=>ie.value&&!pe.value&&o.value),Ke=vue.computed(()=>we.value?be({field:{$dirty:o.value,$externalErrors:P.value,$rules:s.value}}):[]),et=vue.computed(()=>be({field:{$dirty:o.value,$externalErrors:P.value,$rules:s.value},silent:!0})),tt=vue.computed(()=>!(ie.value||pe.value)),pe=vue.computed(()=>I.value||!U.value?Object.entries(s.value).some(([X,W])=>W.$pending):!1),ie=vue.computed(()=>P.value?.length?!0:!U.value||U.value&&I.value?Object.entries(s.value).some(([X,W])=>!W.$valid):!1),Oe=vue.computed(()=>o.value&&!z(e.value)&&!Ze.value?P.value?.length?!1:U.value?Object.entries(s.value).every(([X,W])=>W.$valid):!ie.value:!1),rt=vue.computed(()=>Object.entries(s.value).some(([X,W])=>W._haveAsync));return vue.watch(Oe,X=>{X&&(I.value=!1);}),{$error:we,$pending:pe,$invalid:ie,$valid:Oe,$debounce:S,$lazy:V,$errors:Ke,$ready:tt,$silentErrors:et,$rewardEarly:U,$autoDirty:Re,$anyDirty:g,haveAnyAsyncRule:rt}}),d=vue.watch(p,M),$=vue.watch(e,()=>{c.$autoDirty.value&&(o.value||(o.value=!0)),t.value instanceof Function&&F(),w(),c.$rewardEarly.value;},{deep:D?!0:Z?1:!0}),y=vue.watch(o,()=>{a.setDirtyEntry(n,o.value);}),f=vue.watch(c.$valid,g=>{c.$rewardEarly.value&&g&&(I.value=!1);}),h=vue.watch(c.haveAnyAsyncRule,T);}function E(){Object.entries(s.value).forEach(([g,S])=>{S.$validate();});}let s=vue.ref(),i=vue.ref();F();function R(){o.value=!1,P.value=[],Object.entries(s.value).forEach(([g,S])=>{S.$reset();}),c.$lazy.value||Object.entries(s.value).map(([g,S])=>S.$validate());}function u(){o.value||(o.value=!0,c.$rewardEarly.value,w());}let m=c.$debounce.value?ne(x,c.$debounce.value??0):x;async function x(){try{if(I.value=!0,c.$autoDirty.value&&o.value&&!c.$pending.value)return !c.$error.value;{let g=Object.entries(s.value).map(([V,U])=>U.$validate());return (await Promise.allSettled(g)).every(V=>V.status==="fulfilled"?V.value:!1)}}catch{return !1}}function G(){O(),e.value=ke(e,C),R();}function q(g=!0){return o.value?e.value:null}function B(){P.value=[];}return c.$lazy.value||x(),vue.reactive({$dirty:o,...c,$externalErrors:P,$value:e,$rules:s,$reset:R,$touch:u,$validate:m,$unwatch:O,$watch:A,$resetAll:G,$extractDirtyFields:q,$clearExternalErrors:B})}function Le({$id:e,path:t,index:r,options:n,storage:a,stateValue:l,customMessages:p,rules:b,externalErrors:D,initialState:C}){let v=b.$key?b.$key:ve(),c=`${t}.${String(v)}`;typeof l.value=="object"&&l.value!=null&&(l.value.$id?c=`${t}.${l.value.$id}`:Object.defineProperties(l.value,{$id:{value:v,enumerable:!1,configurable:!1,writable:!1}}));let o=vue.toRef(()=>D.value?.[r]),I=fe({state:l,rulesDef:vue.toRef(()=>b),customMessages:p,path:c,storage:a,options:n,externalErrors:o,initialState:C?.[r]});if(I){let P=l.value?.$id;I.$id=P??String(v),a.addArrayStatus(e,I.$id,I);}return I}function ze({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:p,initialState:b}){let D=vue.effectScope(),C,v=vue.effectScope(),c;if(Array.isArray(e.value)&&!t.value.$each)return null;let o=vue.ref(),I=vue.ref(e.value),P,$=vue.ref({}),f=a.getCollectionsEntry(n);c=v.run(()=>{let i=vue.computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(m=>typeof m!="object"):t.value.$each&&!(t.value.$each instanceof Function)?Object.values(t.value.$each).every(m=>ae(m)):!1),R=vue.computed(()=>p.value?Ee(p.value)?p.value.$errors??[]:[]:[]),u=vue.computed(()=>p.value?Ee(p.value)?p.value.$each??[]:[]:[]);return {isPrimitiveArray:i,$externalErrorsField:R,$externalErrorsEach:u}}),d(),h();function d(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(o.value=ve(),Object.defineProperties(e.value,{$id:{value:o.value,enumerable:!1,configurable:!1,writable:!1}})):e.value?.$id&&(o.value=e.value.$id)),!c.isPrimitiveArray.value&&(I.value=$.value.$value,Array.isArray(e.value)&&t.value.$each?f.value=e.value.map((i,R)=>{let u=ge(t.value.$each,vue.toRef(()=>i),R);if(u){let m=Le({$id:o.value,path:n,rules:u,stateValue:vue.toRef(()=>i),index:R,options:l,storage:a,externalErrors:c.$externalErrorsEach,initialState:b[R]});return m||null}}).filter(i=>!!i):f.value=[],$.value=ue({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:c.$externalErrorsField,$isArray:!0,initialState:b}));}function y(){if(Array.isArray(e.value)){let i=L(f.value);f.value=e.value.map((R,u)=>{let m=vue.toRef(()=>R);if(R.$id&&f.value.find(x=>x.$id===R.$id)){let x=a.getArrayStatus(o.value,R.$id);return x?(x.$value=m,x):null}else {let x=ge(t.value.$each,m,u);if(x){let G=Le({$id:o.value,path:n,rules:x,stateValue:m,index:u,options:l,storage:a,externalErrors:c.$externalErrorsEach,initialState:b[u]});return G||null}}}).filter(R=>!!R),i.filter(R=>!e.value.find(u=>R.$id===u.$id)).forEach((R,u)=>{a.deleteArrayStatus(o.value,u.toString());});}else f.value=[];}function h(){P=vue.watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")?d():y();},{deep:Z?1:!0,flush:"pre"}),C=D.run(()=>{let i=vue.computed(()=>$.value.$dirty&&f.value.every(S=>S.$dirty)),R=vue.computed(()=>$.value.$anyDirty||f.value.some(S=>S.$dirty)),u=vue.computed(()=>$.value.$invalid||f.value.some(S=>S.$invalid)),m=vue.computed(()=>$.value.$valid&&f.value.every(S=>S.$valid)),x=vue.computed(()=>$.value.$error||f.value.some(S=>S.$error)),G=vue.computed(()=>!(u.value||q.value)),q=vue.computed(()=>$.value.$pending||f.value.some(S=>S.$pending)),B=vue.computed(()=>({$errors:$.value.$errors,$each:f.value.map(S=>S.$errors)})),g=vue.computed(()=>({$errors:$.value.$silentErrors,$each:f.value.map(S=>S.$silentErrors)}));return {$dirty:i,$anyDirty:R,$invalid:u,$valid:m,$error:x,$pending:q,$errors:B,$silentErrors:g,$ready:G}}),c.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`),P());}function w(){P&&P(),$.value&&$.value.$unwatch(),f.value&&f.value.forEach(i=>{"$dirty"in i&&i.$unwatch();}),D.stop(),D=vue.effectScope(),v.stop(),v=vue.effectScope(!0);}function M(){$.value.$touch(),f.value.forEach(i=>{i.$touch();});}function F(){$.value.$reset(),f.value.forEach(i=>{i.$reset();});}async function T(){try{return (await Promise.all([$.value.$validate(),...f.value.map(R=>R.$validate())])).every(R=>!!R)}catch{return !1}}function O(){$.value.$clearExternalErrors(),f.value.forEach(i=>{i.$clearExternalErrors();});}function A(i=!0){let R=f.value.map(u=>{if(Se(u))return u.$extractDirtyFields(i)});return i&&(R=R.filter(u=>k(u)?!z(u):!!u)),R}function E(){console.log(b),w(),Ge(e,b),F();}async function s(){return M(),await T()?e.value:!1}return vue.reactive({$field:$,...C,$each:f,$value:e,$validate:T,$unwatch:w,$watch:h,$touch:M,$reset:F,$resetAll:E,$extractDirtyFields:A,$parse:s,$clearExternalErrors:O})}function Te({scopeRules:e,state:t,customMessages:r,path:n="",rootRules:a,storage:l,options:p,externalErrors:b,validationGroups:D,initialState:C}){let v,c,o=null;function $(E=!0){f.value=null,vue.triggerRef(f);let s=Object.fromEntries(Object.entries(e.value).map(([u,m])=>{if(m){let x=vue.toRef(t.value,u),G=vue.toRef(()=>m),q=vue.toRef(()=>b.value?.[u]);return [u,fe({state:x,rulesDef:G,customMessages:r,path:n?`${n}.${u}`:u,storage:l,options:p,externalErrors:q,initialState:C?.[u]})]}return []}).filter(u=>!!u.length&&u[1]!=null)),i=Object.fromEntries(Object.entries(vue.unref(b)??{}).filter(([u])=>!(u in e.value)).map(([u,m])=>{if(m){let x=vue.toRef(()=>({})),G=vue.toRef(()=>m);return [u,fe({state:vue.ref(void 0),rulesDef:x,customMessages:r,path:n?`${n}.${u}`:u,storage:l,options:p,externalErrors:G,initialState:C?.[u]})]}return []})),R=Object.fromEntries(Object.entries(D?.(s)??{}).map(([u,m])=>m.length?[u,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(x=>[x,Fe(vue.toRef(()=>m),x)])),...Object.fromEntries(["$errors","$silentErrors"].map(x=>[x,Me(vue.toRef(()=>m),x)]))}]:[]));f.value={...s,...i,...R},E&&w();}let f=l.getFieldsEntry(n);$();function d(){$(!1),Object.entries(f.value).forEach(([E,s])=>{s.$reset();}),w();}function y(){Object.entries(f.value).forEach(([E,s])=>{s.$touch();});}async function h(){try{return (await Promise.allSettled(Object.entries(f.value).map(([s,i])=>i.$validate()))).every(s=>s.status==="fulfilled"?s.value:!1)}catch{return !1}}function w(){a&&(o=vue.watch(a,()=>{M(),$();},{deep:Z?1:!0,flush:"post"})),v=vue.effectScope(),c=v.run(()=>{let E=vue.computed(()=>!!Object.entries(f.value).length&&Object.entries(f.value).every(([B,g])=>g.$dirty)),s=vue.computed(()=>Object.entries(f.value).some(([B,g])=>g.$dirty)),i=vue.computed(()=>Object.entries(f.value).some(([B,g])=>g.$invalid)),R=vue.computed(()=>Object.entries(f.value).every(([B,g])=>g.$valid)),u=vue.computed(()=>E.value&&!x.value&&i.value),m=vue.computed(()=>!(i.value||x.value)),x=vue.computed(()=>Object.entries(f.value).some(([B,g])=>g.$pending)),G=vue.computed(()=>Object.fromEntries(Object.entries(f.value).map(([B,g])=>[B,g.$errors]))),q=vue.computed(()=>Object.fromEntries(Object.entries(f.value).map(([B,g])=>[B,g.$silentErrors])));return {$dirty:E,$anyDirty:s,$invalid:i,$valid:R,$error:u,$pending:x,$errors:G,$silentErrors:q,$ready:m}});}function M(){f.value&&Object.entries(f.value).forEach(([E,s])=>{s.$unwatch();}),o?.(),v.stop(),v=vue.effectScope();}function F(){Object.entries(f.value).forEach(([E,s])=>{s.$clearExternalErrors();});}function T(){M(),re(t,C??{}),d();}function O(E=!0){let s=Object.entries(f.value).map(([i,R])=>[i,R.$extractDirtyFields(E)]);return E&&(s=s.filter(([i,R])=>k(R)?!z(R):Array.isArray(R)?R.length:!!R)),Object.fromEntries(s)}async function A(){return y(),await h()?t.value:!1}return vue.reactive({...c,$fields:f,$value:t,$resetAll:T,$reset:d,$touch:y,$validate:h,$unwatch:M,$watch:w,$clearExternalErrors:F,$extractDirtyFields:O,$parse:A})}function fe({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:p,index:b,initialState:D,onUnwatch:C}){return Ne(t)?ze({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,index:b,externalErrors:p,initialState:D}):Be(e,t)&&_e(e)?Te({scopeRules:t,state:e,customMessages:r,path:n,storage:a,options:l,index:b,initialState:D,externalErrors:p}):Ue(t)?ue({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,index:b,externalErrors:p,onUnwatch:C,initialState:D}):null}function De({initialState:e,options:t,scopeRules:r,state:n,customRules:a}){let l=$e(),p=vue.computed(()=>vue.unref(t.externalErrors));return vue.reactive(Te({rootRules:r,scopeRules:r,state:n,customMessages:a?.(),storage:l,options:t,externalErrors:p,validationGroups:t.validationGroups,initialState:e}))}function Ce(e,t){let r={autoDirty:t?.autoDirty??!0,lazy:t?.lazy??!1,rewardEarly:t?.rewardEarly??!1};function n(a,l,p){let b=vue.isRef(l)?l:vue.computed(typeof l=="function"?l:()=>l),D={...r,...p},C=vue.isRef(a)?a:vue.ref(a),v=L(vue.toRaw(C.value));return {r$:De({scopeRules:b,state:C,options:D,initialState:v,customRules:e})}}return n}var Qe=Ce();function Ie(){function e(t,r){return r}return e}var Pe=Ie();function Xe({rules:e,modifiers:t}){let r=Ce(e,t),n=Ie();return {useRegle:r,inferRules:n}}exports.InternalRuleType=de;exports.createRule=me;exports.defineRegleConfig=Xe;exports.inferRules=Pe;exports.unwrapRuleParameters=_;exports.useRegle=Qe;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MaybeRef, Ref, UnwrapRef, UnwrapNestedRefs, MaybeRefOrGetter
|
|
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 `
|
|
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 `
|
|
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$:
|
|
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,23 @@ type RegleExternalValidationErrorsReport<TExternalError extends RegleExternalVal
|
|
|
452
575
|
/**
|
|
453
576
|
* @public
|
|
454
577
|
*/
|
|
455
|
-
type
|
|
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> & {} & ([TValidationGroups] extends [never] ? {} : {
|
|
579
|
+
$groups: {
|
|
580
|
+
readonly [TKey in keyof TValidationGroups]: RegleValidationGroupOutput;
|
|
581
|
+
};
|
|
582
|
+
});
|
|
583
|
+
/**
|
|
584
|
+
* @public
|
|
585
|
+
*/
|
|
586
|
+
type RegleStatus<TState extends Record<string, any> = Record<string, any>, TRules extends ReglePartialValidationTree<TState> = Record<string, any>, TExternal extends RegleExternalErrorTree<TState> = never> = RegleCommonStatus<TState> & {
|
|
456
587
|
readonly $fields: {
|
|
457
588
|
readonly [TKey in keyof TRules]: InferRegleStatusType<NonNullable<TRules[TKey]>, TState, TKey>;
|
|
458
589
|
};
|
|
459
590
|
readonly $errors: RegleErrorTree<TRules, TExternal>;
|
|
460
591
|
readonly $silentErrors: RegleErrorTree<TRules, TExternal>;
|
|
461
|
-
|
|
462
|
-
$
|
|
463
|
-
|
|
464
|
-
};
|
|
465
|
-
});
|
|
592
|
+
$extractDirtyFields: (filterNullishValues?: boolean) => PartialDeep<TState>;
|
|
593
|
+
$parse: () => Promise<false | Prettify<DeepSafeFormState<TState, TRules>>>;
|
|
594
|
+
};
|
|
466
595
|
/**
|
|
467
596
|
* @public
|
|
468
597
|
*/
|
|
@@ -470,13 +599,14 @@ type InferRegleStatusType<TRule extends RegleCollectionRuleDecl | RegleRuleDecl
|
|
|
470
599
|
/**
|
|
471
600
|
* @public
|
|
472
601
|
*/
|
|
473
|
-
interface RegleFieldStatus<TState extends any = any, TRules extends RegleFormPropertyType<any, Partial<AllRulesDeclarations>> = Record<string, any>> extends RegleCommonStatus<TState> {
|
|
474
|
-
$value: UnwrapNestedRefs<TState
|
|
602
|
+
interface RegleFieldStatus<TState extends any = any, TRules extends RegleFormPropertyType<any, Partial<AllRulesDeclarations>> = Record<string, any>> extends Omit<RegleCommonStatus<TState>, '$value'> {
|
|
603
|
+
$value: Maybe<UnwrapNestedRefs<TState>>;
|
|
475
604
|
readonly $errors: string[];
|
|
476
605
|
readonly $silentErrors: string[];
|
|
477
606
|
readonly $externalErrors?: string[];
|
|
607
|
+
$extractDirtyFields: (filterNullishValues?: boolean) => Maybe<TState>;
|
|
478
608
|
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 :
|
|
609
|
+
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
610
|
};
|
|
481
611
|
}
|
|
482
612
|
/**
|
|
@@ -489,10 +619,12 @@ interface RegleCommonStatus<TValue = any> {
|
|
|
489
619
|
readonly $anyDirty: boolean;
|
|
490
620
|
readonly $pending: boolean;
|
|
491
621
|
readonly $error: boolean;
|
|
622
|
+
readonly $ready: boolean;
|
|
492
623
|
$id?: string;
|
|
493
624
|
$value: UnwrapNestedRefs<TValue>;
|
|
494
625
|
$touch(): void;
|
|
495
626
|
$reset(): void;
|
|
627
|
+
$resetAll: () => void;
|
|
496
628
|
$validate(): Promise<boolean>;
|
|
497
629
|
$unwatch(): void;
|
|
498
630
|
$watch(): void;
|
|
@@ -509,7 +641,7 @@ type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata exte
|
|
|
509
641
|
readonly $pending: boolean;
|
|
510
642
|
readonly $path: string;
|
|
511
643
|
readonly $metadata: TMetadata;
|
|
512
|
-
$validator: (value: Maybe<TValue>, ...args: TParams) => RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition
|
|
644
|
+
$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
645
|
$validate(): Promise<boolean>;
|
|
514
646
|
$reset(): void;
|
|
515
647
|
} & ([TParams] extends [never[]] ? {} : [unknown[]] extends [TParams] ? {
|
|
@@ -520,11 +652,13 @@ type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata exte
|
|
|
520
652
|
/**
|
|
521
653
|
* @public
|
|
522
654
|
*/
|
|
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'> {
|
|
655
|
+
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
656
|
readonly $each: Array<InferRegleStatusType<NonNullable<TRules>, NonNullable<TState>, number>>;
|
|
525
657
|
readonly $field: RegleFieldStatus<TState, TFieldRule>;
|
|
526
658
|
readonly $errors: RegleErrorTree<TRules>;
|
|
527
659
|
readonly $silentErrors: RegleErrorTree<TRules>;
|
|
660
|
+
$extractDirtyFields: (filterNullishValues?: boolean) => PartialDeep<TState>;
|
|
661
|
+
$parse: () => Promise<false | SafeProperty<TState, TRules>>;
|
|
528
662
|
}
|
|
529
663
|
|
|
530
664
|
/**
|
|
@@ -574,4 +708,4 @@ declare function defineRegleConfig<TCustomRules extends Partial<AllRulesDeclarat
|
|
|
574
708
|
inferRules: inferRulesFn<TCustomRules>;
|
|
575
709
|
};
|
|
576
710
|
|
|
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 };
|
|
711
|
+
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
|
|
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 `
|
|
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 `
|
|
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$:
|
|
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,23 @@ type RegleExternalValidationErrorsReport<TExternalError extends RegleExternalVal
|
|
|
452
575
|
/**
|
|
453
576
|
* @public
|
|
454
577
|
*/
|
|
455
|
-
type
|
|
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> & {} & ([TValidationGroups] extends [never] ? {} : {
|
|
579
|
+
$groups: {
|
|
580
|
+
readonly [TKey in keyof TValidationGroups]: RegleValidationGroupOutput;
|
|
581
|
+
};
|
|
582
|
+
});
|
|
583
|
+
/**
|
|
584
|
+
* @public
|
|
585
|
+
*/
|
|
586
|
+
type RegleStatus<TState extends Record<string, any> = Record<string, any>, TRules extends ReglePartialValidationTree<TState> = Record<string, any>, TExternal extends RegleExternalErrorTree<TState> = never> = RegleCommonStatus<TState> & {
|
|
456
587
|
readonly $fields: {
|
|
457
588
|
readonly [TKey in keyof TRules]: InferRegleStatusType<NonNullable<TRules[TKey]>, TState, TKey>;
|
|
458
589
|
};
|
|
459
590
|
readonly $errors: RegleErrorTree<TRules, TExternal>;
|
|
460
591
|
readonly $silentErrors: RegleErrorTree<TRules, TExternal>;
|
|
461
|
-
|
|
462
|
-
$
|
|
463
|
-
|
|
464
|
-
};
|
|
465
|
-
});
|
|
592
|
+
$extractDirtyFields: (filterNullishValues?: boolean) => PartialDeep<TState>;
|
|
593
|
+
$parse: () => Promise<false | Prettify<DeepSafeFormState<TState, TRules>>>;
|
|
594
|
+
};
|
|
466
595
|
/**
|
|
467
596
|
* @public
|
|
468
597
|
*/
|
|
@@ -470,13 +599,14 @@ type InferRegleStatusType<TRule extends RegleCollectionRuleDecl | RegleRuleDecl
|
|
|
470
599
|
/**
|
|
471
600
|
* @public
|
|
472
601
|
*/
|
|
473
|
-
interface RegleFieldStatus<TState extends any = any, TRules extends RegleFormPropertyType<any, Partial<AllRulesDeclarations>> = Record<string, any>> extends RegleCommonStatus<TState> {
|
|
474
|
-
$value: UnwrapNestedRefs<TState
|
|
602
|
+
interface RegleFieldStatus<TState extends any = any, TRules extends RegleFormPropertyType<any, Partial<AllRulesDeclarations>> = Record<string, any>> extends Omit<RegleCommonStatus<TState>, '$value'> {
|
|
603
|
+
$value: Maybe<UnwrapNestedRefs<TState>>;
|
|
475
604
|
readonly $errors: string[];
|
|
476
605
|
readonly $silentErrors: string[];
|
|
477
606
|
readonly $externalErrors?: string[];
|
|
607
|
+
$extractDirtyFields: (filterNullishValues?: boolean) => Maybe<TState>;
|
|
478
608
|
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 :
|
|
609
|
+
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
610
|
};
|
|
481
611
|
}
|
|
482
612
|
/**
|
|
@@ -489,10 +619,12 @@ interface RegleCommonStatus<TValue = any> {
|
|
|
489
619
|
readonly $anyDirty: boolean;
|
|
490
620
|
readonly $pending: boolean;
|
|
491
621
|
readonly $error: boolean;
|
|
622
|
+
readonly $ready: boolean;
|
|
492
623
|
$id?: string;
|
|
493
624
|
$value: UnwrapNestedRefs<TValue>;
|
|
494
625
|
$touch(): void;
|
|
495
626
|
$reset(): void;
|
|
627
|
+
$resetAll: () => void;
|
|
496
628
|
$validate(): Promise<boolean>;
|
|
497
629
|
$unwatch(): void;
|
|
498
630
|
$watch(): void;
|
|
@@ -509,7 +641,7 @@ type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata exte
|
|
|
509
641
|
readonly $pending: boolean;
|
|
510
642
|
readonly $path: string;
|
|
511
643
|
readonly $metadata: TMetadata;
|
|
512
|
-
$validator: (value: Maybe<TValue>, ...args: TParams) => RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition
|
|
644
|
+
$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
645
|
$validate(): Promise<boolean>;
|
|
514
646
|
$reset(): void;
|
|
515
647
|
} & ([TParams] extends [never[]] ? {} : [unknown[]] extends [TParams] ? {
|
|
@@ -520,11 +652,13 @@ type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata exte
|
|
|
520
652
|
/**
|
|
521
653
|
* @public
|
|
522
654
|
*/
|
|
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'> {
|
|
655
|
+
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
656
|
readonly $each: Array<InferRegleStatusType<NonNullable<TRules>, NonNullable<TState>, number>>;
|
|
525
657
|
readonly $field: RegleFieldStatus<TState, TFieldRule>;
|
|
526
658
|
readonly $errors: RegleErrorTree<TRules>;
|
|
527
659
|
readonly $silentErrors: RegleErrorTree<TRules>;
|
|
660
|
+
$extractDirtyFields: (filterNullishValues?: boolean) => PartialDeep<TState>;
|
|
661
|
+
$parse: () => Promise<false | SafeProperty<TState, TRules>>;
|
|
528
662
|
}
|
|
529
663
|
|
|
530
664
|
/**
|
|
@@ -574,4 +708,4 @@ declare function defineRegleConfig<TCustomRules extends Partial<AllRulesDeclarat
|
|
|
574
708
|
inferRules: inferRulesFn<TCustomRules>;
|
|
575
709
|
};
|
|
576
710
|
|
|
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 };
|
|
711
|
+
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 de=(r=>(r.Inline="__inline",r.Async="__async",r))(de||{});function Fe(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 _(e){return e.map(t=>t instanceof Function?t():unref(t))}function Ve(e){return e.map(t=>t instanceof Function||isRef(t)?t:toRef(()=>t))}function je(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 ye(e,...t){let{message:r,validator:n,active:a,type:l,...p}=e,b=l==="__async"||n.constructor.name==="AsyncFunction";return {...{validator(v,...c){return e.validator(v,..._(c.length?c:t))},message(v,c){return typeof e.message=="function"?e.message(v,{...c,$params:_(c.$params?.length?c.$params:t)}):e.message},active(v,c){return typeof e.active=="function"?e.active(v,{...c,$params:_(c.$params?.length?c.$params:t)}):e.active??!0},exec(v){let c=e.validator(v,..._(t)),o;return c instanceof Promise?c.then(I=>(o=I,typeof o=="object"&&"$valid"in o?o.$valid:typeof o=="boolean"?o:!1)):(o=c,typeof o=="object"&&"$valid"in o?o.$valid:typeof o=="boolean"?o:!1)}},...p,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:b,_params:Ve(t)}}function me(e){if(typeof e.validator=="function"){let r=ye(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(je(e.validator)>1){let a=function(...l){return ye(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 k(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function _e(e){return k(e.value)}function L(e){let t=e,r={}.toString.call(e).slice(8,-1);if(r=="Set"&&(t=new Set([...e].map(n=>L(n)))),r=="Map"&&(t=new Map([...e].map(n=>[L(n[0]),L(n[1])]))),r=="Date"&&(t=new Date(e.getTime())),r=="RegExp"&&(t=RegExp(e.source,st(e))),r=="Array"||r=="Object"){t=Array.isArray(e)?[]:{};for(let n in e)t[n]=L(e[n]);}return t}function st(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 ge(e,t,r){return e instanceof Function?e(t,r??0):e}function ke(e,t){isRef(e)?e.value=t:e=t;}function Ge(e,t){isRef(e)?e.value=[]:e=[],t.forEach((r,n)=>{let a=isRef(e)?e.value[n]:e[n];a={},re(a,t[n]);});}function re(e,t){Object.entries({...unref(e),...t}).forEach(([r,n])=>{let a=isRef(e)?e.value:e,l=isRef(t[r])?t[r]._value:t[r],p=isRef(a[r])?a[r].value:a[r];Array.isArray(a[r])?(a[r]=[],Array.isArray(l)&&l.forEach((b,D)=>{a[r][D]={},re(a[r][D],l[D]);})):k(l)?re(p,l):isRef(a[r])?a[r].value=l:a[r]=l;});}function z(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 ne(e,t,r){let n,a=(...l)=>new Promise(p=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(p);},t);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...l)=>new Promise(p=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(p);},0);}),a}function ut(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]),p=Number(n[a]);if(l>p)return 1;if(p>l)return -1;if(!isNaN(l)&&isNaN(p))return 1;if(isNaN(l)&&!isNaN(p))return -1}return 0}var Z=ut(version,"3.5.0")!==-1;function ct(){return Math.floor(Math.random()*Date.now()).toString()}function ve(){return typeof window>"u"?ct():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(10)}function $e(){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 p(d){let y=t.value.get(d);if(y)return y;{let h=ref({});return t.value.set(d,h),h}}function b(d){let y=r.value.get(d);if(y)return y;{let h=ref([]);return r.value.set(d,h),h}}function D(d,y,h){l.value.set(`${d}-${y}`,h);}function C(d,y){return l.value.get(`${d}-${y}`)}function v(d,y){d&&y!=null&&l.value.delete(`${d}-${y}`);}function c(d,y){n.value.set(d,y);}function o(d){return n.value.get(d)??!1}function I(d,y){e.value.set(d,y);}function P(d,y){let h=e.value.get(d);return h?$(y,h)?{valid:!0}:{valid:!1}:void 0}function $(d,y){let h=Object.keys(y),w=Object.keys(d);return w.length!==h.length||!w.every(F=>h.includes(F))?!1:w.every(F=>{let T=d[F],O=y[F];return !O||!T||typeof T=="function"||typeof O=="function"||typeof T=="number"||typeof T=="boolean"?!1:T._params?T._params?.every((A,E)=>{if(typeof O=="number"||typeof O=="boolean")return !0;{let s=_(O._params),i=_(T._params);return s?.[E]===i?.[E]}}):!0})}function f(d){let y=a.value.get(d);if(y)return y;{let h=ref(!1),w=ref(!0),M=ref({}),F=ref(!1);return a.value.set(d,{$pending:h,$valid:w,$metadata:M,$validating:F}),{$pending:h,$valid:w,$metadata:M,$validating:F}}}return onScopeDispose(()=>{e.value.clear(),t.value.clear(),r.value.clear(),n.value.clear(),a.value.clear(),l.value.clear();}),{addRuleDeclEntry:I,setDirtyEntry:c,checkRuleDeclEntry:P,getDirtyState:o,trySetRuleStatusRef:f,getFieldsEntry:p,getCollectionsEntry:b,getArrayStatus:C,addArrayStatus:D,deleteArrayStatus:v,arrayStatusStorage:l}}function Be(e,t){return k(e.value)&&k(t.value)&&!Object.entries(t.value).some(r=>ae(r))}function Ne(e){return !!e.value&&"$each"in e.value}function Ue(e){return !!e.value&&k(e.value)}function ae(e){return k(e)&&"_validator"in e}function le(e){return typeof e.value!="function"}function Se(e){return k(e)&&"$fields"in e}function Ee(e){return "$each"in e||"$errors"in e}function be({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 He({$dirty:e,customMessages:t,rule:r,ruleKey:n,state:a,path:l,storage:p,$debounce:b}){let D=effectScope(),C,v,c=ref(!1),{$pending:o,$valid:I,$metadata:P,$validating:$}=p.trySetRuleStatusRef(`${l}.${n}`);function f(){C=D.run(()=>{let T=computed(()=>({$invalid:!I.value,$params:i.value,...P.value})),O=computed(()=>le(r)?typeof r.value.active=="function"?r.value.active(a.value,T.value):r.value.active:!0),A=computed(()=>{let u="",m=t?t[n]?.message:void 0;return m&&(typeof m=="function"?u=m(a.value,T.value):u=m),le(r)&&(m&&!r.value._patched||(typeof r.value.message=="function"?u=r.value.message(a.value,T.value):u=r.value.message)),z(u)&&(u="Error",console.warn(`No error message defined for ${l}.${n}`)),u}),E=computed(()=>le(r)&&r.value.type?r.value.type:n),s=computed(()=>le(r)?r.value.validator:r.value),i=computed(()=>typeof r.value=="function"?[]:_(r.value._params??[])),R=computed(()=>`${l}.${E.value}`);return {$active:O,$message:A,$type:E,$validator:s,$params:i,$path:R}}),v=watch(C.$params,w,{deep:!0});}f();function d(){I.value=!0,e.value&&(o.value=!0);}async function y(){let T=C.$validator.value,O=T(a.value,...C.$params.value),A=!1,E=a.value;try{d();let s;if(O instanceof Promise?s=await O:s=O,a.value!==E)return !0;if(typeof s=="boolean")A=s;else {let{$valid:i,...R}=s;A=i,P.value=R;}}catch{A=!1;}finally{o.value=!1;}return A}let h=ne(y,b??200);async function w(){$.value=!0;let T=!1;if(ae(r.value)&&r.value._async)T=await h();else {let O=C.$validator.value,A=O(a.value,...C.$params.value);if(A instanceof Promise)console.warn('You used a async validator function on a non-async rule, please use "async await" or the "withAsync" helper');else if(A!=null)if(typeof A=="boolean")T=A;else {let{$valid:E,...s}=A;T=E,P.value=s;}}return I.value=T,$.value=!1,T}function M(){I.value=!0,P.value={},o.value=!1,$.value=!1,f();}function F(){v(),D.stop(),D=effectScope();}return reactive({...C,$pending:o,$valid:I,$metadata:P,_haveAsync:c,$validating:$,$validate:w,$unwatch:F,$watch:f,$reset:M})}function ue({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:p,onUnwatch:b,$isArray:D,initialState:C}){let v=effectScope(),c,o=ref(!1),I=ref(!1),P=ref([]),$,f,d,y,h,w=()=>{};function M(){P.value=p.value??[];}M();function F(){let g=t.value,S=a.checkRuleDeclEntry(n,g);i.value=Object.fromEntries(Object.entries(g).filter(([V])=>V.startsWith("$"))),s.value=Object.fromEntries(Object.entries(t.value).filter(([V])=>!V.startsWith("$")).map(([V,U])=>{if(U){let Re=toRef(()=>U);return [V,He({$dirty:o,customMessages:r,rule:Re,ruleKey:V,state:e,path:n,storage:a,$debounce:i.value.$debounce})]}return []}).filter(V=>!!V.length)),A(),T(),S?.valid!=null&&(o.value=a.getDirtyState(n),o.value&&w()),a.addRuleDeclEntry(n,g);}function T(){w=c.$debounce.value?ne(E,c.$debounce.value??c.haveAnyAsyncRule?100:0):E;}function O(){s.value&&Object.entries(s.value).forEach(([g,S])=>{S.$unwatch();}),y(),o.value&&a.setDirtyEntry(n,o.value),$(),f(),d(),v.stop(),v=effectScope(),b?.(),h?.();}function A(){s.value&&Object.entries(s.value).forEach(([g,S])=>{S.$watch();}),c=v.run(()=>{let g=computed(()=>o.value),S=computed(()=>i.value.$debounce),V=computed(()=>i.value.$lazy!=null?i.value.$lazy:unref(l.lazy)),U=computed(()=>i.value.$rewardEarly!=null?i.value.$rewardEarly:unref(l.rewardEarly)),Re=computed(()=>i.value.$autoDirty!=null?i.value.$autoDirty:unref(l.autoDirty)),Ze=computed(()=>Object.entries(s.value).some(([X,W])=>W.$validating)),we=computed(()=>ie.value&&!pe.value&&o.value),Ke=computed(()=>we.value?be({field:{$dirty:o.value,$externalErrors:P.value,$rules:s.value}}):[]),et=computed(()=>be({field:{$dirty:o.value,$externalErrors:P.value,$rules:s.value},silent:!0})),tt=computed(()=>!(ie.value||pe.value)),pe=computed(()=>I.value||!U.value?Object.entries(s.value).some(([X,W])=>W.$pending):!1),ie=computed(()=>P.value?.length?!0:!U.value||U.value&&I.value?Object.entries(s.value).some(([X,W])=>!W.$valid):!1),Oe=computed(()=>o.value&&!z(e.value)&&!Ze.value?P.value?.length?!1:U.value?Object.entries(s.value).every(([X,W])=>W.$valid):!ie.value:!1),rt=computed(()=>Object.entries(s.value).some(([X,W])=>W._haveAsync));return watch(Oe,X=>{X&&(I.value=!1);}),{$error:we,$pending:pe,$invalid:ie,$valid:Oe,$debounce:S,$lazy:V,$errors:Ke,$ready:tt,$silentErrors:et,$rewardEarly:U,$autoDirty:Re,$anyDirty:g,haveAnyAsyncRule:rt}}),d=watch(p,M),$=watch(e,()=>{c.$autoDirty.value&&(o.value||(o.value=!0)),t.value instanceof Function&&F(),w(),c.$rewardEarly.value;},{deep:D?!0:Z?1:!0}),y=watch(o,()=>{a.setDirtyEntry(n,o.value);}),f=watch(c.$valid,g=>{c.$rewardEarly.value&&g&&(I.value=!1);}),h=watch(c.haveAnyAsyncRule,T);}function E(){Object.entries(s.value).forEach(([g,S])=>{S.$validate();});}let s=ref(),i=ref();F();function R(){o.value=!1,P.value=[],Object.entries(s.value).forEach(([g,S])=>{S.$reset();}),c.$lazy.value||Object.entries(s.value).map(([g,S])=>S.$validate());}function u(){o.value||(o.value=!0,c.$rewardEarly.value,w());}let m=c.$debounce.value?ne(x,c.$debounce.value??0):x;async function x(){try{if(I.value=!0,c.$autoDirty.value&&o.value&&!c.$pending.value)return !c.$error.value;{let g=Object.entries(s.value).map(([V,U])=>U.$validate());return (await Promise.allSettled(g)).every(V=>V.status==="fulfilled"?V.value:!1)}}catch{return !1}}function G(){O(),e.value=ke(e,C),R();}function q(g=!0){return o.value?e.value:null}function B(){P.value=[];}return c.$lazy.value||x(),reactive({$dirty:o,...c,$externalErrors:P,$value:e,$rules:s,$reset:R,$touch:u,$validate:m,$unwatch:O,$watch:A,$resetAll:G,$extractDirtyFields:q,$clearExternalErrors:B})}function Le({$id:e,path:t,index:r,options:n,storage:a,stateValue:l,customMessages:p,rules:b,externalErrors:D,initialState:C}){let v=b.$key?b.$key:ve(),c=`${t}.${String(v)}`;typeof l.value=="object"&&l.value!=null&&(l.value.$id?c=`${t}.${l.value.$id}`:Object.defineProperties(l.value,{$id:{value:v,enumerable:!1,configurable:!1,writable:!1}}));let o=toRef(()=>D.value?.[r]),I=fe({state:l,rulesDef:toRef(()=>b),customMessages:p,path:c,storage:a,options:n,externalErrors:o,initialState:C?.[r]});if(I){let P=l.value?.$id;I.$id=P??String(v),a.addArrayStatus(e,I.$id,I);}return I}function ze({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:p,initialState:b}){let D=effectScope(),C,v=effectScope(),c;if(Array.isArray(e.value)&&!t.value.$each)return null;let o=ref(),I=ref(e.value),P,$=ref({}),f=a.getCollectionsEntry(n);c=v.run(()=>{let i=computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(m=>typeof m!="object"):t.value.$each&&!(t.value.$each instanceof Function)?Object.values(t.value.$each).every(m=>ae(m)):!1),R=computed(()=>p.value?Ee(p.value)?p.value.$errors??[]:[]:[]),u=computed(()=>p.value?Ee(p.value)?p.value.$each??[]:[]:[]);return {isPrimitiveArray:i,$externalErrorsField:R,$externalErrorsEach:u}}),d(),h();function d(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(o.value=ve(),Object.defineProperties(e.value,{$id:{value:o.value,enumerable:!1,configurable:!1,writable:!1}})):e.value?.$id&&(o.value=e.value.$id)),!c.isPrimitiveArray.value&&(I.value=$.value.$value,Array.isArray(e.value)&&t.value.$each?f.value=e.value.map((i,R)=>{let u=ge(t.value.$each,toRef(()=>i),R);if(u){let m=Le({$id:o.value,path:n,rules:u,stateValue:toRef(()=>i),index:R,options:l,storage:a,externalErrors:c.$externalErrorsEach,initialState:b[R]});return m||null}}).filter(i=>!!i):f.value=[],$.value=ue({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:c.$externalErrorsField,$isArray:!0,initialState:b}));}function y(){if(Array.isArray(e.value)){let i=L(f.value);f.value=e.value.map((R,u)=>{let m=toRef(()=>R);if(R.$id&&f.value.find(x=>x.$id===R.$id)){let x=a.getArrayStatus(o.value,R.$id);return x?(x.$value=m,x):null}else {let x=ge(t.value.$each,m,u);if(x){let G=Le({$id:o.value,path:n,rules:x,stateValue:m,index:u,options:l,storage:a,externalErrors:c.$externalErrorsEach,initialState:b[u]});return G||null}}}).filter(R=>!!R),i.filter(R=>!e.value.find(u=>R.$id===u.$id)).forEach((R,u)=>{a.deleteArrayStatus(o.value,u.toString());});}else f.value=[];}function h(){P=watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")?d():y();},{deep:Z?1:!0,flush:"pre"}),C=D.run(()=>{let i=computed(()=>$.value.$dirty&&f.value.every(S=>S.$dirty)),R=computed(()=>$.value.$anyDirty||f.value.some(S=>S.$dirty)),u=computed(()=>$.value.$invalid||f.value.some(S=>S.$invalid)),m=computed(()=>$.value.$valid&&f.value.every(S=>S.$valid)),x=computed(()=>$.value.$error||f.value.some(S=>S.$error)),G=computed(()=>!(u.value||q.value)),q=computed(()=>$.value.$pending||f.value.some(S=>S.$pending)),B=computed(()=>({$errors:$.value.$errors,$each:f.value.map(S=>S.$errors)})),g=computed(()=>({$errors:$.value.$silentErrors,$each:f.value.map(S=>S.$silentErrors)}));return {$dirty:i,$anyDirty:R,$invalid:u,$valid:m,$error:x,$pending:q,$errors:B,$silentErrors:g,$ready:G}}),c.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`),P());}function w(){P&&P(),$.value&&$.value.$unwatch(),f.value&&f.value.forEach(i=>{"$dirty"in i&&i.$unwatch();}),D.stop(),D=effectScope(),v.stop(),v=effectScope(!0);}function M(){$.value.$touch(),f.value.forEach(i=>{i.$touch();});}function F(){$.value.$reset(),f.value.forEach(i=>{i.$reset();});}async function T(){try{return (await Promise.all([$.value.$validate(),...f.value.map(R=>R.$validate())])).every(R=>!!R)}catch{return !1}}function O(){$.value.$clearExternalErrors(),f.value.forEach(i=>{i.$clearExternalErrors();});}function A(i=!0){let R=f.value.map(u=>{if(Se(u))return u.$extractDirtyFields(i)});return i&&(R=R.filter(u=>k(u)?!z(u):!!u)),R}function E(){console.log(b),w(),Ge(e,b),F();}async function s(){return M(),await T()?e.value:!1}return reactive({$field:$,...C,$each:f,$value:e,$validate:T,$unwatch:w,$watch:h,$touch:M,$reset:F,$resetAll:E,$extractDirtyFields:A,$parse:s,$clearExternalErrors:O})}function Te({scopeRules:e,state:t,customMessages:r,path:n="",rootRules:a,storage:l,options:p,externalErrors:b,validationGroups:D,initialState:C}){let v,c,o=null;function $(E=!0){f.value=null,triggerRef(f);let s=Object.fromEntries(Object.entries(e.value).map(([u,m])=>{if(m){let x=toRef(t.value,u),G=toRef(()=>m),q=toRef(()=>b.value?.[u]);return [u,fe({state:x,rulesDef:G,customMessages:r,path:n?`${n}.${u}`:u,storage:l,options:p,externalErrors:q,initialState:C?.[u]})]}return []}).filter(u=>!!u.length&&u[1]!=null)),i=Object.fromEntries(Object.entries(unref(b)??{}).filter(([u])=>!(u in e.value)).map(([u,m])=>{if(m){let x=toRef(()=>({})),G=toRef(()=>m);return [u,fe({state:ref(void 0),rulesDef:x,customMessages:r,path:n?`${n}.${u}`:u,storage:l,options:p,externalErrors:G,initialState:C?.[u]})]}return []})),R=Object.fromEntries(Object.entries(D?.(s)??{}).map(([u,m])=>m.length?[u,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(x=>[x,Fe(toRef(()=>m),x)])),...Object.fromEntries(["$errors","$silentErrors"].map(x=>[x,Me(toRef(()=>m),x)]))}]:[]));f.value={...s,...i,...R},E&&w();}let f=l.getFieldsEntry(n);$();function d(){$(!1),Object.entries(f.value).forEach(([E,s])=>{s.$reset();}),w();}function y(){Object.entries(f.value).forEach(([E,s])=>{s.$touch();});}async function h(){try{return (await Promise.allSettled(Object.entries(f.value).map(([s,i])=>i.$validate()))).every(s=>s.status==="fulfilled"?s.value:!1)}catch{return !1}}function w(){a&&(o=watch(a,()=>{M(),$();},{deep:Z?1:!0,flush:"post"})),v=effectScope(),c=v.run(()=>{let E=computed(()=>!!Object.entries(f.value).length&&Object.entries(f.value).every(([B,g])=>g.$dirty)),s=computed(()=>Object.entries(f.value).some(([B,g])=>g.$dirty)),i=computed(()=>Object.entries(f.value).some(([B,g])=>g.$invalid)),R=computed(()=>Object.entries(f.value).every(([B,g])=>g.$valid)),u=computed(()=>E.value&&!x.value&&i.value),m=computed(()=>!(i.value||x.value)),x=computed(()=>Object.entries(f.value).some(([B,g])=>g.$pending)),G=computed(()=>Object.fromEntries(Object.entries(f.value).map(([B,g])=>[B,g.$errors]))),q=computed(()=>Object.fromEntries(Object.entries(f.value).map(([B,g])=>[B,g.$silentErrors])));return {$dirty:E,$anyDirty:s,$invalid:i,$valid:R,$error:u,$pending:x,$errors:G,$silentErrors:q,$ready:m}});}function M(){f.value&&Object.entries(f.value).forEach(([E,s])=>{s.$unwatch();}),o?.(),v.stop(),v=effectScope();}function F(){Object.entries(f.value).forEach(([E,s])=>{s.$clearExternalErrors();});}function T(){M(),re(t,C??{}),d();}function O(E=!0){let s=Object.entries(f.value).map(([i,R])=>[i,R.$extractDirtyFields(E)]);return E&&(s=s.filter(([i,R])=>k(R)?!z(R):Array.isArray(R)?R.length:!!R)),Object.fromEntries(s)}async function A(){return y(),await h()?t.value:!1}return reactive({...c,$fields:f,$value:t,$resetAll:T,$reset:d,$touch:y,$validate:h,$unwatch:M,$watch:w,$clearExternalErrors:F,$extractDirtyFields:O,$parse:A})}function fe({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,externalErrors:p,index:b,initialState:D,onUnwatch:C}){return Ne(t)?ze({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,index:b,externalErrors:p,initialState:D}):Be(e,t)&&_e(e)?Te({scopeRules:t,state:e,customMessages:r,path:n,storage:a,options:l,index:b,initialState:D,externalErrors:p}):Ue(t)?ue({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:l,index:b,externalErrors:p,onUnwatch:C,initialState:D}):null}function De({initialState:e,options:t,scopeRules:r,state:n,customRules:a}){let l=$e(),p=computed(()=>unref(t.externalErrors));return reactive(Te({rootRules:r,scopeRules:r,state:n,customMessages:a?.(),storage:l,options:t,externalErrors:p,validationGroups:t.validationGroups,initialState:e}))}function Ce(e,t){let r={autoDirty:t?.autoDirty??!0,lazy:t?.lazy??!1,rewardEarly:t?.rewardEarly??!1};function n(a,l,p){let b=isRef(l)?l:computed(typeof l=="function"?l:()=>l),D={...r,...p},C=isRef(a)?a:ref(a),v=L(toRaw(C.value));return {r$:De({scopeRules:b,state:C,options:D,initialState:v,customRules:e})}}return n}var Qe=Ce();function Ie(){function e(t,r){return r}return e}var Pe=Ie();function Xe({rules:e,modifiers:t}){let r=Ce(e,t),n=Ie();return {useRegle:r,inferRules:n}}export{de as InternalRuleType,me as createRule,Xe as defineRegleConfig,Pe as inferRules,_ as unwrapRuleParameters,Qe as useRegle};
|