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