@regle/core 0.1.0 → 0.1.1

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.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import * as vue from 'vue';
2
- import { MaybeRef, ComputedRef, Ref, UnwrapNestedRefs } from 'vue';
2
+ import { MaybeRef, Ref, ComputedRef, UnwrapNestedRefs } from 'vue';
3
3
 
4
4
  type Maybe<T = any> = T | null | undefined;
5
- type MaybeGetter<T, V = any> = T | ((value: V, index: number) => T);
5
+ type MaybeGetter<T, V = any> = T | ((value: Ref<V>, index: number) => T);
6
6
  type ExtractFromGetter<T extends MaybeGetter<any, any>> = T extends MaybeGetter<infer U, any> ? U : never;
7
7
  type DeepMaybeRef<T extends Record<string, any>> = {
8
8
  [K in keyof T]: MaybeRef<T[K]>;
@@ -53,7 +53,7 @@ type EmptyObject = {[emptyObjectSymbol]?: never};
53
53
 
54
54
  interface RegleBehaviourOptions {
55
55
  /**
56
- * Only display error when calling `validateForm()`
56
+ * Only display error when calling `validateState()`
57
57
  * @default false
58
58
  */
59
59
  lazy?: boolean;
@@ -63,7 +63,7 @@ interface RegleBehaviourOptions {
63
63
  */
64
64
  autoDirty?: boolean;
65
65
  /**
66
- * The fields will turn valid when they are, but not invalid unless calling `validateForm()`
66
+ * The fields will turn valid when they are, but not invalid unless calling `validateState()`
67
67
  * @default false
68
68
  *
69
69
  * @experimental report any bug
@@ -71,7 +71,7 @@ interface RegleBehaviourOptions {
71
71
  rewardEarly?: boolean;
72
72
  }
73
73
  interface LocalRegleBehaviourOptions<TState extends Record<string, any>, TRules extends ReglePartialValidationTree<TState, CustomRulesDeclarationTree>, TExternal extends RegleExternalErrorTree<TState>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]>> {
74
- $externalErrors?: MaybeRef<TExternal>;
74
+ externalErrors?: MaybeRef<TExternal>;
75
75
  validationGroups?: (fields: RegleStatus<TState, TRules>['$fields']) => TValidationGroups;
76
76
  }
77
77
  type RegleValidationGroupEntry = RegleFieldStatus<any, any, any> | RegleCollectionStatus<any, any>;
@@ -98,8 +98,8 @@ interface Regle<TState extends Record<string, any> = EmptyObject, TRules extends
98
98
  */
99
99
  errors: RegleErrorTree<TRules, TExternal>;
100
100
  invalid: ComputedRef<boolean>;
101
- resetForm: () => void;
102
- validateForm: () => Promise<false | DeepSafeFormState<TState, TRules>>;
101
+ resetAll: () => void;
102
+ validateState: () => Promise<false | DeepSafeFormState<TState, TRules>>;
103
103
  state: Ref<TState>;
104
104
  }
105
105
  type DeepReactiveState<T extends Record<string, any>> = {
@@ -228,27 +228,31 @@ interface RegleRuleCore<TValue extends any, TParams extends any[] = [], TAsync e
228
228
  }
229
229
 
230
230
  type DefaultValidators = {
231
- maxLength: RegleRuleWithParamsDefinition<string, [count: number]>;
232
- required: RegleRuleDefinition<unknown, []>;
233
231
  alpha: RegleRuleDefinition<string>;
234
232
  alphaNum: RegleRuleDefinition<string | number>;
235
233
  between: RegleRuleWithParamsDefinition<number, [min: number, max: number]>;
234
+ checked: RegleRuleDefinition<boolean, [], false, boolean, boolean>;
235
+ dateAfter: RegleRuleWithParamsDefinition<Date, [after: Date]>;
236
+ dateBefore: RegleRuleWithParamsDefinition<Date, [before: Date]>;
237
+ dateBetween: RegleRuleWithParamsDefinition<Date, [before: Date, after: Date]>;
236
238
  decimal: RegleRuleDefinition<number | string>;
237
239
  email: RegleRuleDefinition<string>;
240
+ exactLength: RegleRuleWithParamsDefinition<string | any[] | Record<PropertyKey, any>, [
241
+ count: number
242
+ ], false, boolean>;
238
243
  integer: RegleRuleDefinition<number | string>;
244
+ ipAddress: RegleRuleDefinition<string, [], false>;
245
+ macAddress: RegleRuleWithParamsDefinition<string, [separator?: string | undefined], false>;
246
+ maxLength: RegleRuleWithParamsDefinition<string, [count: number]>;
239
247
  maxValue: RegleRuleWithParamsDefinition<number, [count: number]>;
240
248
  minLength: RegleRuleWithParamsDefinition<string | Record<PropertyKey, any> | any[], [
241
249
  count: number
242
250
  ]>;
243
251
  minValue: RegleRuleWithParamsDefinition<number, [count: number]>;
244
252
  numeric: RegleRuleDefinition<number | string>;
253
+ required: RegleRuleDefinition<unknown, []>;
245
254
  sameAs: RegleRuleWithParamsDefinition<unknown, [target: unknown]>;
246
255
  url: RegleRuleDefinition<string>;
247
- dateAfter: RegleRuleWithParamsDefinition<Date, [after: Date]>;
248
- dateBefore: RegleRuleWithParamsDefinition<Date, [before: Date]>;
249
- dateBetween: RegleRuleWithParamsDefinition<Date, [before: Date, after: Date]>;
250
- ipAddress: RegleRuleDefinition<string, [], false>;
251
- macAddress: RegleRuleWithParamsDefinition<string, [separator?: string | undefined], false>;
252
256
  };
253
257
 
254
258
  type CustomRulesDeclarationTree = {
@@ -296,12 +300,12 @@ type RegleCollectionRuleDecl<TValue = any[], TCustomRules extends Partial<AllRul
296
300
  /**
297
301
  * @public
298
302
  */
299
- type InlineRuleDeclaration<TValue extends any = any, TReturn extends RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition> = RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition>> = (value: Maybe<TValue>, ...args: any[]) => TReturn;
303
+ type InlineRuleDeclaration<TValue extends any = any, TParams extends any[] = any[], TReturn extends RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition> = RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition>> = (value: Maybe<TValue>, ...args: UnwrapRegleUniversalParams<TParams>) => TReturn;
300
304
  /**
301
305
  * @public
302
306
  * Regroup inline and registered rules
303
307
  * */
304
- type FormRuleDeclaration<TValue extends any, TParams extends any[], TReturn extends RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition> = RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition>, TMetadata extends RegleRuleMetadataDefinition = TReturn extends Promise<infer M> ? M : TReturn, TAsync extends boolean = boolean> = InlineRuleDeclaration<TValue, TReturn> | RegleRuleDefinition<TValue, TParams, TAsync, TMetadata>;
308
+ type FormRuleDeclaration<TValue extends any, TParams extends any[], TReturn extends RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition> = RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition>, TMetadata extends RegleRuleMetadataDefinition = TReturn extends Promise<infer M> ? M : TReturn, TAsync extends boolean = boolean> = InlineRuleDeclaration<TValue, TParams, TReturn> | RegleRuleDefinition<TValue, TParams, TAsync, TMetadata>;
305
309
 
306
310
  type RegleErrorTree<TRules extends ReglePartialValidationTree<any, any>, TExternal extends RegleExternalErrorTree<Record<string, unknown>> = never> = {
307
311
  readonly [K in keyof TRules]: RegleValidationErrors<TRules[K], K extends keyof TExternal ? TExternal[K] : never>;
@@ -350,7 +354,7 @@ interface RegleFieldStatus<TRules extends RegleFormPropertyType<any, Partial<All
350
354
  readonly $errors: string[];
351
355
  readonly $silentErrors: string[];
352
356
  readonly $rules: {
353
- readonly [TRuleKey in keyof TRules]: RegleRuleStatus<TState[TKey], TRules[TRuleKey] extends RegleRuleDefinition<any, infer TParams, any> ? TParams : [], TRules[TRuleKey] extends RegleRuleDefinition<any, any, any, infer TMetadata> ? TMetadata : TRules[TRuleKey] extends InlineRuleDeclaration<any, infer TMetadata> ? TMetadata extends Promise<infer P> ? P : TMetadata : never>;
357
+ readonly [TRuleKey in keyof TRules]: RegleRuleStatus<TState[TKey], TRules[TRuleKey] extends RegleRuleDefinition<any, infer TParams, any> ? TParams : [], TRules[TRuleKey] extends RegleRuleDefinition<any, any, any, infer TMetadata> ? TMetadata : TRules[TRuleKey] extends InlineRuleDeclaration<any, any[], infer TMetadata> ? TMetadata extends Promise<infer P> ? P : TMetadata : never>;
354
358
  };
355
359
  }
356
360
  /**
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import {unref,isRef,toRef,computed,ref,toRaw,reactive,shallowRef,onScopeDispose,triggerRef,watch,effectScope,toRefs}from'vue';import {pauseTracking,resetTracking}from'@vue/reactivity';function j(e){return e.map(r=>r instanceof Function?r():unref(r))}function Ie(e){return e.map(r=>r instanceof Function||isRef(r)?r:toRef(()=>r))}function ue(e){let r=e.toString();return (r.includes("=>")?r.split("=>")[0]:r).slice(r.indexOf("(")+1,r.indexOf(")")).split(",").map(l=>l.trim()).filter(l=>l.includes("=")).length+e.length}function ce(e,...r){let{message:t,validator:n,active:a,...l}=e,g=n.constructor.name==="AsyncFunction";return {...{validator(d,...o){return e.validator(d,...j(o.length?o:r))},message(d,o){return typeof e.message=="function"?e.message(d,{...o,$params:j(o.$params?.length?o.$params:r)}):e.message},active(d,o){return typeof e.active=="function"?e.active(d,{...o,$params:j(o.$params?.length?o.$params:r)}):e.active??!0},exec(d){let o=e.validator(d,...j(r)),s;return o instanceof Promise?o.then(y=>(s=y,typeof s=="object"&&"$valid"in s?s.$valid:typeof s=="boolean"?s:!1)):(s=o,typeof s=="object"&&"$valid"in s?s.$valid:typeof s=="boolean"?s:!1)}},...l,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:g,_params:Ie(r)}}function fe(e){if(typeof e.validator=="function"){let t=ce(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(console.log(e.validator,ue(e.validator)),ue(e.validator)>1){let a=function(...l){return ce(e,...l)};return a.validator=t.validator,a.message=t.message,a.active=t.active,a.type=t.type,a.exec=t.exec,a._validator=t.validator,a._message=t.message,a._active=t.active,a._type=e.type,a._patched=!1,a._async=n,a}else return t}throw new Error("Validator must be a function")}function Re(e){return e}function V(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ce(e){return V(e.value)}function U(e){let r=e,t={}.toString.call(e).slice(8,-1);if(t=="Set")return new Set([...e].map(n=>U(n)));if(t=="Map")return new Map([...e].map(n=>[U(n[0]),U(n[1])]));if(t=="Date")return new Date(e.getTime());if(t=="RegExp")return RegExp(e.source,et(e));if(t=="Array"||t=="Object"){r=Array.isArray(e)?[]:{};for(let n in e)r[n]=U(e[n]);}return r}function et(e){if(typeof e.source.flags=="string")return e.source.flags;{let r=[];return e.global&&r.push("g"),e.ignoreCase&&r.push("i"),e.multiline&&r.push("m"),e.sticky&&r.push("y"),e.unicode&&r.push("u"),r.join("")}}function G(e,r,t){return e instanceof Function?e(r,t??0):e}function Pe(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=="number"?isNaN(e):!String(e).trim().length}function pe(e,r,t){let n,a=(...l)=>new Promise(g=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(g);},r);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...l)=>new Promise(g=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(g);},0);}),a}function de(){let e=shallowRef(new Map),r=shallowRef(new Map),t=shallowRef(new Map),n=shallowRef(new Map),a=shallowRef(new Map),l=shallowRef(new Map);function g(m){let f=r.value.get(m);if(f)return f;{let i=ref({});return r.value.set(m,i),i}}function h(m){let f=t.value.get(m);if(f)return f;{let i=ref([]);return t.value.set(m,i),i}}function C(m,f,i){l.value.set(`${m}-${f}`,i);}function d(m,f){return l.value.get(`${m}-${f}`)}function o(m,f){m&&f!=null&&l.value.delete(`${m}-${f}`);}function s(m,f){n.value.set(m,f);}function y(m){return n.value.get(m)??!1}function u(m,f){e.value.set(m,f);}function w(m,f){let i=e.value.get(m);return i?T(f,i)?{valid:!0}:{valid:!1}:void 0}function T(m,f){let i=Object.keys(f),R=Object.keys(m);return R.length!==i.length||!R.every(b=>i.includes(b))?!1:R.every(b=>{let c=m[b],$=f[b];return !$||!c||typeof c=="function"||typeof $=="function"||typeof c=="number"||typeof c=="boolean"?!1:c._params?c._params?.every((E,A)=>{if(typeof $=="number"||typeof $=="boolean")return !0;{let p=j($._params),x=j(c._params);return p?.[A]===x?.[A]}}):!0})}function F(m){let f=a.value.get(m);if(f)return f;{let i=ref(!1),R=ref(!0),S=ref({}),b=ref(!1);return a.value.set(m,{$pending:i,$valid:R,$metadata:S,$validating:b}),{$pending:i,$valid:R,$metadata:S,$validating:b}}}return onScopeDispose(()=>{e.value.clear(),r.value.clear(),t.value.clear(),n.value.clear(),a.value.clear(),l.value.clear();}),{addRuleDeclEntry:u,setDirtyEntry:s,checkRuleDeclEntry:w,getDirtyState:y,trySetRuleStatusRef:F,getFieldsEntry:g,getCollectionsEntry:h,getArrayStatus:d,addArrayStatus:C,deleteArrayStatus:o,arrayStatusStorage:l}}function we(e,r){let t=G(r.value,e.value);return V(e.value)&&V(t)&&!Object.entries(t).some(n=>me(n))}function Oe(e,r){let t=G(e.value,r.value);return !!t&&"$each"in t}function Me(e){return !!e&&V(e.value)}function me(e){return V(e)&&"_validator"in e}function Z(e){return typeof e.value!="function"}function K(e){return V(e)&&"$fields"in e}function ee(e){return !!e&&"$each"in e}function te(e){return !!e&&"$rules"in e}function ye(e){return "$each"in e||"$errors"in e}function B({field:e,silent:r=!1}){return Object.entries(e.$rules??{}).map(([t,n])=>r||!n.$valid&&e.$dirty?n.$message:null).filter(t=>!!t).reduce((t,n)=>typeof n=="string"?t?.concat([n]):t?.concat(n),[]).concat(e.$externalErrors??[])}function Ae(e){return K(e)?ge(e.$fields):ee(e)?{$errors:e.$rules?B({field:e}):[],$each:e.$each.map(Ae)}:te(e)?e.$error?B({field:e}):e.$externalErrors??[]:[]}function nt(e){return e.$each.map(Ae)}function ge(e){return Object.fromEntries(Object.entries(e).map(([r,t])=>K(t)?[r,ge(t.$fields)]:ee(t)?[r,{...t.$rules&&{$errors:B({field:t})},$each:nt(t)}]:te(t)?t.$error?[r,B({field:t})]:[r,t.$externalErrors??[]]:[r,[]]))}function Fe(e){return computed(()=>ge(e.$fields))}var oe=(t=>(t.Inline="__inline",t.Async="__async",t))(oe||{});function Ve(e,r){return computed(()=>e.value.some(t=>t[r]))}function _e(e,r){return computed(()=>e.value.reduce((t,n)=>{let a=n[r]||[];return t.concat(a)},[]))}function at(){return Math.floor(Math.random()*Date.now()).toString()}function ve(){return typeof window>"u"?at():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(8)}function Be({$dirty:e,customMessages:r,rule:t,ruleKey:n,state:a,path:l,storage:g}){let h=effectScope(),C,d,{$pending:o,$valid:s,$metadata:y,$validating:u}=g.trySetRuleStatusRef(`${l}.${n}`);function w(){C=h.run(()=>{let f=computed(()=>({$invalid:!s.value,$params:c.value,...y.value})),i=computed(()=>Z(t)?typeof t.value.active=="function"?t.value.active(a.value,f.value):t.value.active:!0),R=computed(()=>{let E="",A=r?r[n]?.message:void 0;return A&&(typeof A=="function"?E=A(a.value,f.value):E=A),Z(t)&&(A&&!t.value._patched||(typeof t.value.message=="function"?E=t.value.message(a.value,f.value):E=t.value.message)),Pe(E)&&(E="Error",console.warn(`No error message defined for ${l}.${n}`)),E}),S=computed(()=>Z(t)&&t.value.type?Object.values(oe).includes(t.value.type)?n:t.value.type:n),b=computed(()=>Z(t)?t.value.validator:t.value),c=computed(()=>typeof t.value=="function"?[]:j(t.value._params??[])),$=computed(()=>`${l}.${S.value}`);return {$active:i,$message:R,$type:S,$validator:b,$params:c,$path:$}}),d=watch(C.$params,T,{deep:!0});}w();async function T(){u.value=!0;let f=C.$validator.value,i=!1,R=f(a.value,...C.$params.value);if(R instanceof Promise){if(!o.value)try{s.value=!0,e.value&&(o.value=!0);let S=await R;if(typeof S=="boolean")i=S;else {let{$valid:b,...c}=S;i=b,y.value=c;}}catch{i=!1;}finally{o.value=!1;}}else if(R!=null)if(typeof R=="boolean")i=R;else {let{$valid:S,...b}=R;i=S,y.value=b;}return s.value=i,u.value=!1,i}function F(){s.value=!0,y.value={},o.value=!1,u.value=!1,w();}function m(){d(),h.stop(),h=effectScope();}return reactive({...C,$pending:o,$valid:s,$metadata:y,$validate:T,$unwatch:m,$watch:w,$reset:F})}function se({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:l,externalErrors:g,index:h,onUnwatch:C}){let d=effectScope(),o,s=ref(!1),y=ref(!1),u=ref([]),w,T,F,m,f=()=>{};function i(){u.value=g.value??[];}i();function R(){let v=r.value,O=a.checkRuleDeclEntry(n,v);E.value=Object.fromEntries(Object.entries(v).filter(([P])=>P.startsWith("$")));let I=G(r.value,e.value,h);$.value=Object.fromEntries(Object.entries(I).filter(([P])=>!P.startsWith("$")).map(([P,X])=>{if(X){let H=toRef(()=>X);return [P,Be({$dirty:s,customMessages:t,rule:H,ruleKey:P,state:e,path:n,storage:a,options:l})]}return []}).filter(P=>!!P.length)),b(),f=o.$debounce.value?pe(c,o.$debounce.value??0):c,O?.valid!=null&&(s.value=a.getDirtyState(n),s.value&&f()),a.addRuleDeclEntry(n,v);}function S(){$.value&&Object.entries($.value).forEach(([v,O])=>{O.$unwatch();}),m(),s.value&&a.setDirtyEntry(n,s.value),w(),T(),F(),d.stop(),d=effectScope(),C?.();}function b(){$.value&&Object.entries($.value).forEach(([v,O])=>{O.$watch();}),o=d.run(()=>{let v=computed(()=>s.value),O=computed(()=>E.value.$debounce),I=computed(()=>E.value.$lazy?E.value.$lazy:unref(l.lazy)),P=computed(()=>E.value.$rewardEarly?E.value.$rewardEarly:unref(l.rewardEarly)),X=computed(()=>E.value.$autoDirty?E.value.$autoDirty:unref(l.autoDirty)),H=computed(()=>ie.value&&!he.value&&s.value),Qe=computed(()=>B({field:{$dirty:s.value,$externalErrors:u.value,$rules:$.value}})),Xe=computed(()=>B({field:{$dirty:s.value,$externalErrors:u.value,$rules:$.value},silent:!0})),he=computed(()=>y.value||!P.value?Object.entries($.value).some(([le,Y])=>Y.$pending):!1),ie=computed(()=>u.value?.length?!0:!P.value||P.value&&y.value?Object.entries($.value).some(([le,Y])=>!Y.$valid):!1),De=computed(()=>u.value?.length?!1:P.value?Object.entries($.value).every(([le,Y])=>Y.$valid):!ie.value);return watch(De,le=>{le&&(y.value=!1);}),{$error:H,$pending:he,$invalid:ie,$valid:De,$debounce:O,$lazy:I,$errors:Qe,$silentErrors:Xe,$rewardEarly:P,$autoDirty:X,$anyDirty:v}}),F=watch(g,i),w=watch(e,()=>{o.$autoDirty.value&&(s.value||(s.value=!0)),r.value instanceof Function&&R(),o.$lazy.value||(f(),o.$rewardEarly.value);}),m=watch(s,()=>{a.setDirtyEntry(n,s.value),x();}),T=watch(o.$valid,v=>{o.$rewardEarly.value&&v&&(y.value=!1);});}function c(){Object.entries($.value).forEach(([v,O])=>{O.$validate();});}let $=ref(),E=ref();R();function A(){s.value=!1,u.value=[],Object.entries($.value).forEach(([v,O])=>{O.$reset();});}function p(){s.value=!0,o.$lazy.value||o.$rewardEarly.value;}let x=o.$debounce.value?pe(D,o.$debounce.value??0):D;async function D(){try{if(y.value=!0,!o.$lazy.value&&o.$anyDirty.value&&!o.$pending)return !o.$error.value;{let v=Object.entries($.value).map(([I,P])=>P.$validate());return (await Promise.allSettled(v)).every(I=>I.status==="fulfilled"?I.value:!1)}}catch{return !1}}function M(){u.value=[];}return reactive({$dirty:s,$anyDirty:o.$anyDirty,$invalid:o.$invalid,$error:o.$error,$pending:o.$pending,$valid:o.$valid,$errors:o.$errors,$silentErrors:o.$silentErrors,$externalErrors:u,$value:e,$rules:$,$reset:A,$touch:p,$validate:x,$unwatch:S,$watch:b,$clearExternalErrors:M})}function be({$id:e,path:r,index:t,options:n,storage:a,value:l,customMessages:g,rules:h,externalErrors:C}){let d=ve(),o=`${r}.${d}`;typeof l[t]=="object"&&l[t]!=null&&(l[t].$id?o=`${r}.${l[t].$id}`:Object.defineProperties(l[t],{$id:{value:d,enumerable:!1,configurable:!1,writable:!1}}));let s=toRefs(l),y=toRef(()=>C.value?.[t]),u=ae({state:s[t],rulesDef:toRef(()=>h),customMessages:g,path:o,storage:a,options:n,externalErrors:y});if(u){let w=l[t]?.$id;u.$id=w??d,a.addArrayStatus(e,t.toString(),u);}return u}function pt({path:e,index:r,options:t,storage:n,value:a,customMessages:l,rules:g,externalErrors:h}){let C=toRefs(a),d=toRef(()=>h.value?.[r]);return ae({state:C[r],rulesDef:toRef(()=>g),customMessages:l,path:e,storage:n,options:t,externalErrors:d})}function He({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:l,externalErrors:g}){let h=effectScope(),C;if(Array.isArray(e.value)&&!r.value.$each)return null;let d=ref(),o=ref(e.value),s=null,y=ref({}),u=a.getCollectionsEntry(n);F(),w();function w(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(d.value=ve(),Object.defineProperties(e.value,{$id:{value:d.value,enumerable:!1,configurable:!1,writable:!1}})):d.value=e.value?.$id);let{$each:R,$debounce:S,$autoDirty:b,$lazy:c,$rewardEarly:$,...E}=r.value,A=toRef(()=>{if(g.value&&ye(g.value))return g.value.$errors}),p=toRef(()=>{if(g.value&&ye(g.value))return g.value.$each});if(Array.isArray(e.value)){let x={};["pop","shift","unshift","splice"].forEach(M=>{x[M]=function(...v){pauseTracking(),u.value.forEach(I=>{I.$unwatch(),a.deleteArrayStatus(d.value,I.$id);}),u.value[M](...v);let O=Object.assign([],this)[M].apply(this,v);return u.value=u.value.map((I,P)=>V(I)&&(te(I)||ee(I)||K(I))&&I.$id!=null?pt({$id:d.value,path:`${n}.${I.$id}`,rules:R,value:e.value,index:P,options:l,storage:a,externalErrors:p}):be({$id:d.value,path:n,rules:R,value:e.value,index:P,options:l,storage:a,externalErrors:p})).filter(I=>!!I),resetTracking(),O};});let D=new Proxy(toRaw(e.value),{get(M,v,O){let I=Reflect.get(M,v,O);return typeof v=="symbol"?I:Array.isArray(M)&&Object.hasOwn(x,v)?Reflect.get(x,v,O):I},deleteProperty(M,v){let O=Reflect.deleteProperty(M,v);return typeof v=="symbol"?!0:(isNaN(parseInt(v))||(u.value.splice(parseInt(v),1),a.deleteArrayStatus(d.value,v)),O)},set(M,v,O){let I=Reflect.set(M,v,O);if(typeof v=="symbol")return !0;if(!isNaN(parseInt(v))){let P=parseInt(v);if(!u.value[P]&&r.value.$each){let H=be({$id:d.value,value:e.value,rules:r.value.$each,customMessages:t,path:n,storage:a,options:l,index:P,externalErrors:p});H&&(u.value[P]=H);}}return I}});pauseTracking(),e.value=D,resetTracking();}if(y.value=se({state:e,rulesDef:toRef(()=>E),customMessages:t,path:n,storage:a,options:l,externalErrors:A}),o.value=y.value.$value,Array.isArray(e.value)&&R)for(let[x,D]of e.value.entries()){let M=be({$id:d.value,path:n,rules:R,value:e.value,index:x,options:l,storage:a,externalErrors:p});M&&(u.value[x]=M);}else u.value=[];}function T(){s&&s(),y.value&&y.value.$unwatch(),u.value&&u.value.forEach(R=>{"$dirty"in R&&R.$unwatch();});}function F(){s=watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")&&w();}),C=h.run(()=>{let R=computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(p=>typeof p!="object"):r.value.$each?Object.values(r.value.$each).every(p=>me(p)):!1),S=computed(()=>y.value.$dirty&&u.value.every(p=>p.$dirty)),b=computed(()=>y.value.$anyDirty||u.value.some(p=>p.$dirty)),c=computed(()=>y.value.$invalid||u.value.some(p=>p.$invalid)),$=computed(()=>!c.value),E=computed(()=>y.value.$error||u.value.some(p=>p.$error)),A=computed(()=>y.value.$pending||u.value.some(p=>p.$pending));return {isPrimitiveArray:R,$dirty:S,$anyDirty:b,$invalid:c,$valid:$,$error:E,$pending:A}});}function m(){y.value.$touch(),u.value.forEach(R=>{"$dirty"in R&&R.$touch();});}function f(){y.value.$reset(),u.value.forEach(R=>{"$dirty"in R&&R.$reset();}),y.value.$watch();}async function i(){try{return (await Promise.all([y.value.$validate(),...u.value.map(S=>{if("$dirty"in S)return S.$validate()})])).every(S=>!!S)}catch{return !1}}return reactive({...y.value,$value:o,...C,$each:u,$validate:i,$unwatch:T,$watch:F,$touch:m,$reset:f})}function Ee({scopeRules:e,state:r,customMessages:t,path:n="",rootRules:a,storage:l,options:g,externalErrors:h,validationGroups:C}){let d,o,s,y;function w(b=!0){T.value=null,triggerRef(T);let c=G(e.value,r.value),$=Object.fromEntries(Object.entries(c).map(([p,x])=>{if(x){let D=toRef(r.value,p),M=toRef(()=>x),v=toRef(()=>h.value?.[p]);return [p,ae({state:D,rulesDef:M,customMessages:t,path:n?`${n}.${p}`:p,storage:l,options:g,externalErrors:v})]}return []}).filter(p=>!!p.length&&p[1]!=null)),E=Object.fromEntries(Object.entries(unref(h)??{}).filter(([p])=>!(p in c)).map(([p,x])=>{if(x){let D=toRef(()=>({})),M=toRef(()=>x);return [p,ae({state:ref(void 0),rulesDef:D,customMessages:t,path:n?`${n}.${p}`:p,storage:l,options:g,externalErrors:M})]}return []})),A=Object.fromEntries(Object.entries(C?.($)??{}).map(([p,x])=>x.length?[p,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(D=>[D,Ve(toRef(()=>x),D)])),...Object.fromEntries(["$errors","$silentErrors"].map(D=>[D,_e(toRef(()=>x),D)]))}]:[]));T.value={...$,...E,...A},b&&i();}let T=l.getFieldsEntry(n);w();function F(){w(!1),Object.entries(T.value).forEach(([b,c])=>{c.$reset();}),i();}function m(){Object.entries(T.value).forEach(([b,c])=>{c.$touch();});}async function f(){try{return (await Promise.allSettled(Object.entries(T.value).map(([c,$])=>$.$validate()))).every(c=>c.status==="fulfilled"?c.value:!1)}catch{return !1}}function i(){a&&(s=watch(a,()=>{R(),w();},{deep:!0,flush:"post"})),e.value instanceof Function&&(y=watch(r,()=>{R(),w();},{deep:!0,flush:"post"})),d=effectScope(),o=d.run(()=>{let b=computed(()=>Object.entries(T.value).every(([x,D])=>D.$dirty)),c=computed(()=>Object.entries(T.value).some(([x,D])=>D.$dirty)),$=computed(()=>Object.entries(T.value).some(([x,D])=>D.$invalid)),E=computed(()=>!$.value),A=computed(()=>Object.entries(T.value).some(([x,D])=>D.$error)),p=computed(()=>Object.entries(T.value).some(([x,D])=>D.$pending));return {$dirty:b,$anyDirty:c,$invalid:$,$valid:E,$error:A,$pending:p}});}function R(){T.value&&Object.entries(T.value).forEach(([b,c])=>{c.$unwatch();}),s?.(),y?.();}function S(){Object.entries(T.value).forEach(([b,c])=>{c.$clearExternalErrors();});}return reactive({...o,$fields:T,$value:r,$reset:F,$touch:m,$validate:f,$unwatch:R,$watch:i,$clearExternalErrors:S})}function ae({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:l,externalErrors:g,index:h,onUnwatch:C}){return Oe(r,e)?He({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:l,index:h,externalErrors:g}):we(e,r)&&Ce(e)?Ee({scopeRules:r,state:e,customMessages:t,path:n,storage:a,options:l,index:h,externalErrors:g}):Me(r)?se({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:l,index:h,externalErrors:g,onUnwatch:C}):null}function Te(e,r,t,n){let a=de(),l=computed(()=>unref(t.$externalErrors)),g=reactive(Ee({rootRules:e,scopeRules:e,state:r,customMessages:n?.(),storage:a,options:t,externalErrors:l,validationGroups:t.validationGroups})),h=Fe(g);return {regle:g,errors:h}}function xe(e,r){let t={autoDirty:r?.autoDirty??!0,lazy:r?.lazy??!1,rewardEarly:r?.rewardEarly??!1};function n(a,l,g){let h=isRef(l)?l:computed(typeof l=="function"?l:()=>l),C={...t,...g},d=isRef(a)?a:ref(a),o=U(toRaw(d.value)),{regle:s,errors:y}=Te(h,d,C,e);function u(){s.$unwatch(),w(a,o),s.$reset(),s.$validate();}function w(m,f){Object.entries(f).forEach(([i,R])=>{let S=isRef(m)?m.value:m,b=isRef(S[i])?S[i].value:S[i],c=isRef(f[i])?f[i]._value:f[i];Array.isArray(c)&&Array.isArray(b)?c.forEach(($,E)=>{w(b[E],c[E]);}):V(c)?w(b,c):isRef(S[i])?S[i].value=c:S[i]=c;});}let T=computed(()=>s.$invalid||s.$pending);async function F(){return s.$touch(),await s.$validate()?d.value:!1}return s.$validate(),{regle:s,errors:y,resetForm:u,validateForm:F,invalid:T,state:d}}return n}var Le=xe();function Je({rules:e,options:r}){return xe(e,r)}export{oe as InternalRuleType,fe as createRule,Je as defineRegleConfig,Re as defineType,j as unwrapRuleParameters,Le as useRegle};
1
+ import {unref,isRef,toRef,computed,ref,toRaw,reactive,shallowRef,onScopeDispose,triggerRef,watch,effectScope,toRefs}from'vue';import {pauseTracking,resetTracking}from'@vue/reactivity';function j(e){return e.map(r=>r instanceof Function?r():unref(r))}function Ie(e){return e.map(r=>r instanceof Function||isRef(r)?r:toRef(()=>r))}function Ce(e){let r=e.toString();return (r.includes("=>")?r.split("=>")[0]:r).slice(r.indexOf("(")+1,r.indexOf(")")).split(",").map(l=>l.trim()).filter(l=>l.includes("=")).length+e.length}function ce(e,...r){let{message:t,validator:n,active:a,...l}=e,y=n.constructor.name==="AsyncFunction";return {...{validator(d,...o){return e.validator(d,...j(o.length?o:r))},message(d,o){return typeof e.message=="function"?e.message(d,{...o,$params:j(o.$params?.length?o.$params:r)}):e.message},active(d,o){return typeof e.active=="function"?e.active(d,{...o,$params:j(o.$params?.length?o.$params:r)}):e.active??!0},exec(d){let o=e.validator(d,...j(r)),s;return o instanceof Promise?o.then(v=>(s=v,typeof s=="object"&&"$valid"in s?s.$valid:typeof s=="boolean"?s:!1)):(s=o,typeof s=="object"&&"$valid"in s?s.$valid:typeof s=="boolean"?s:!1)}},...l,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:y,_params:Ie(r)}}function fe(e){if(typeof e.validator=="function"){let t=ce(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(Ce(e.validator)>1){let a=function(...l){return ce(e,...l)};return a.validator=t.validator,a.message=t.message,a.active=t.active,a.type=t.type,a.exec=t.exec,a._validator=t.validator,a._message=t.message,a._active=t.active,a._type=e.type,a._patched=!1,a._async=n,a}else return t}throw new Error("Validator must be a function")}function Re(e){return e}function V(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function we(e){return V(e.value)}function H(e){let r=e,t={}.toString.call(e).slice(8,-1);if(t=="Set")return new Set([...e].map(n=>H(n)));if(t=="Map")return new Map([...e].map(n=>[H(n[0]),H(n[1])]));if(t=="Date")return new Date(e.getTime());if(t=="RegExp")return RegExp(e.source,Ke(e));if(t=="Array"||t=="Object"){r=Array.isArray(e)?[]:{};for(let n in e)r[n]=H(e[n]);}return r}function Ke(e){if(typeof e.source.flags=="string")return e.source.flags;{let r=[];return e.global&&r.push("g"),e.ignoreCase&&r.push("i"),e.multiline&&r.push("m"),e.sticky&&r.push("y"),e.unicode&&r.push("u"),r.join("")}}function oe(e,r,t){return e instanceof Function?e(r,t??0):e}function Pe(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=="number"?isNaN(e):!String(e).trim().length}function pe(e,r,t){let n,a=(...l)=>new Promise(y=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(y);},r);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...l)=>new Promise(y=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(y);},0);}),a}function de(){let e=shallowRef(new Map),r=shallowRef(new Map),t=shallowRef(new Map),n=shallowRef(new Map),a=shallowRef(new Map),l=shallowRef(new Map);function y(m){let c=r.value.get(m);if(c)return c;{let i=ref({});return r.value.set(m,i),i}}function I(m){let c=t.value.get(m);if(c)return c;{let i=ref([]);return t.value.set(m,i),i}}function C(m,c,i){l.value.set(`${m}-${c}`,i);}function d(m,c){return l.value.get(`${m}-${c}`)}function o(m,c){m&&c!=null&&l.value.delete(`${m}-${c}`);}function s(m,c){n.value.set(m,c);}function v(m){return n.value.get(m)??!1}function u(m,c){e.value.set(m,c);}function w(m,c){let i=e.value.get(m);return i?x(c,i)?{valid:!0}:{valid:!1}:void 0}function x(m,c){let i=Object.keys(c),R=Object.keys(m);return R.length!==i.length||!R.every(b=>i.includes(b))?!1:R.every(b=>{let f=m[b],$=c[b];return !$||!f||typeof f=="function"||typeof $=="function"||typeof f=="number"||typeof f=="boolean"?!1:f._params?f._params?.every((T,M)=>{if(typeof $=="number"||typeof $=="boolean")return !0;{let p=j($._params),h=j(f._params);return p?.[M]===h?.[M]}}):!0})}function F(m){let c=a.value.get(m);if(c)return c;{let i=ref(!1),R=ref(!0),S=ref({}),b=ref(!1);return a.value.set(m,{$pending:i,$valid:R,$metadata:S,$validating:b}),{$pending:i,$valid:R,$metadata:S,$validating:b}}}return onScopeDispose(()=>{e.value.clear(),r.value.clear(),t.value.clear(),n.value.clear(),a.value.clear(),l.value.clear();}),{addRuleDeclEntry:u,setDirtyEntry:s,checkRuleDeclEntry:w,getDirtyState:v,trySetRuleStatusRef:F,getFieldsEntry:y,getCollectionsEntry:I,getArrayStatus:d,addArrayStatus:C,deleteArrayStatus:o,arrayStatusStorage:l}}function Oe(e,r){return V(e.value)&&V(r.value)&&!Object.entries(r.value).some(t=>me(t))}function Me(e){return !!e.value&&"$each"in e.value}function Ae(e){return !!e.value&&V(e.value)}function me(e){return V(e)&&"_validator"in e}function X(e){return typeof e.value!="function"}function Y(e){return V(e)&&"$fields"in e}function Z(e){return !!e&&"$each"in e}function K(e){return !!e&&"$rules"in e}function ge(e){return "$each"in e||"$errors"in e}function B({field:e,silent:r=!1}){return Object.entries(e.$rules??{}).map(([t,n])=>r||!n.$valid&&e.$dirty?n.$message:null).filter(t=>!!t).reduce((t,n)=>typeof n=="string"?t?.concat([n]):t?.concat(n),[]).concat(e.$externalErrors??[])}function Fe(e){return Y(e)?ye(e.$fields):Z(e)?{$errors:e.$rules?B({field:e}):[],$each:e.$each.map(Fe)}:K(e)?e.$error?B({field:e}):e.$externalErrors??[]:[]}function rt(e){return e.$each.map(Fe)}function ye(e){return Object.fromEntries(Object.entries(e).map(([r,t])=>Y(t)?[r,ye(t.$fields)]:Z(t)?[r,{...t.$rules&&{$errors:B({field:t})},$each:rt(t)}]:K(t)?t.$error?[r,B({field:t})]:[r,t.$externalErrors??[]]:[r,[]]))}function je(e){return computed(()=>ye(e.$fields))}var se=(t=>(t.Inline="__inline",t.Async="__async",t))(se||{});function _e(e,r){return computed(()=>e.value.some(t=>t[r]))}function Ge(e,r){return computed(()=>e.value.reduce((t,n)=>{let a=n[r]||[];return t.concat(a)},[]))}function nt(){return Math.floor(Math.random()*Date.now()).toString()}function ve(){return typeof window>"u"?nt():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(8)}function Be({$dirty:e,customMessages:r,rule:t,ruleKey:n,state:a,path:l,storage:y}){let I=effectScope(),C,d,{$pending:o,$valid:s,$metadata:v,$validating:u}=y.trySetRuleStatusRef(`${l}.${n}`);function w(){C=I.run(()=>{let c=computed(()=>({$invalid:!s.value,$params:f.value,...v.value})),i=computed(()=>X(t)?typeof t.value.active=="function"?t.value.active(a.value,c.value):t.value.active:!0),R=computed(()=>{let T="",M=r?r[n]?.message:void 0;return M&&(typeof M=="function"?T=M(a.value,c.value):T=M),X(t)&&(M&&!t.value._patched||(typeof t.value.message=="function"?T=t.value.message(a.value,c.value):T=t.value.message)),Pe(T)&&(T="Error",console.warn(`No error message defined for ${l}.${n}`)),T}),S=computed(()=>X(t)&&t.value.type?Object.values(se).includes(t.value.type)?n:t.value.type:n),b=computed(()=>X(t)?t.value.validator:t.value),f=computed(()=>typeof t.value=="function"?[]:j(t.value._params??[])),$=computed(()=>`${l}.${S.value}`);return {$active:i,$message:R,$type:S,$validator:b,$params:f,$path:$}}),d=watch(C.$params,x,{deep:!0});}w();async function x(){u.value=!0;let c=C.$validator.value,i=!1,R=c(a.value,...C.$params.value);if(R instanceof Promise){if(!o.value)try{s.value=!0,e.value&&(o.value=!0);let S=await R;if(typeof S=="boolean")i=S;else {let{$valid:b,...f}=S;i=b,v.value=f;}}catch{i=!1;}finally{o.value=!1;}}else if(R!=null)if(typeof R=="boolean")i=R;else {let{$valid:S,...b}=R;i=S,v.value=b;}return s.value=i,u.value=!1,i}function F(){s.value=!0,v.value={},o.value=!1,u.value=!1,w();}function m(){d(),I.stop(),I=effectScope();}return reactive({...C,$pending:o,$valid:s,$metadata:v,$validate:x,$unwatch:m,$watch:w,$reset:F})}function ie({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:l,externalErrors:y,index:I,onUnwatch:C}){let d=effectScope(),o,s=ref(!1),v=ref(!1),u=ref([]),w,x,F,m,c=()=>{};function i(){u.value=y.value??[];}i();function R(){let g=r.value,P=a.checkRuleDeclEntry(n,g);T.value=Object.fromEntries(Object.entries(g).filter(([E])=>E.startsWith("$"))),$.value=Object.fromEntries(Object.entries(r.value).filter(([E])=>!E.startsWith("$")).map(([E,O])=>{if(O){let k=toRef(()=>O);return [E,Be({$dirty:s,customMessages:t,rule:k,ruleKey:E,state:e,path:n,storage:a})]}return []}).filter(E=>!!E.length)),b(),c=o.$debounce.value?pe(f,o.$debounce.value??0):f,P?.valid!=null&&(s.value=a.getDirtyState(n),s.value&&c()),a.addRuleDeclEntry(n,g);}function S(){$.value&&Object.entries($.value).forEach(([g,P])=>{P.$unwatch();}),m(),s.value&&a.setDirtyEntry(n,s.value),w(),x(),F(),d.stop(),d=effectScope(),C?.();}function b(){$.value&&Object.entries($.value).forEach(([g,P])=>{P.$watch();}),o=d.run(()=>{let g=computed(()=>s.value),P=computed(()=>T.value.$debounce),E=computed(()=>T.value.$lazy!=null?T.value.$lazy:unref(l.lazy)),O=computed(()=>T.value.$rewardEarly?T.value.$rewardEarly:unref(l.rewardEarly)),k=computed(()=>T.value.$autoDirty?T.value.$autoDirty:unref(l.autoDirty)),ne=computed(()=>ue.value&&!xe.value&&s.value),ae=computed(()=>B({field:{$dirty:s.value,$externalErrors:u.value,$rules:$.value}})),Qe=computed(()=>B({field:{$dirty:s.value,$externalErrors:u.value,$rules:$.value},silent:!0})),xe=computed(()=>v.value||!O.value?Object.entries($.value).some(([le,Q])=>Q.$pending):!1),ue=computed(()=>u.value?.length?!0:!O.value||O.value&&v.value?Object.entries($.value).some(([le,Q])=>!Q.$valid):!1),De=computed(()=>u.value?.length?!1:O.value?Object.entries($.value).every(([le,Q])=>Q.$valid):!ue.value);return watch(De,le=>{le&&(v.value=!1);}),{$error:ne,$pending:xe,$invalid:ue,$valid:De,$debounce:P,$lazy:E,$errors:ae,$silentErrors:Qe,$rewardEarly:O,$autoDirty:k,$anyDirty:g}}),F=watch(y,i),w=watch(e,()=>{o.$autoDirty.value&&(s.value||(s.value=!0)),r.value instanceof Function&&R(),c(),o.$rewardEarly.value;}),m=watch(s,()=>{a.setDirtyEntry(n,s.value),h();}),x=watch(o.$valid,g=>{o.$rewardEarly.value&&g&&(v.value=!1);});}function f(){Object.entries($.value).forEach(([g,P])=>{P.$validate();});}let $=ref(),T=ref();R();function M(){s.value=!1,u.value=[],Object.entries($.value).forEach(([g,P])=>{P.$reset();});}function p(){s.value=!0,o.$lazy.value||o.$rewardEarly.value;}let h=o.$debounce.value?pe(D,o.$debounce.value??0):D;async function D(){try{if(v.value=!0,!o.$lazy.value&&o.$anyDirty.value&&!o.$pending)return !o.$error.value;{let g=Object.entries($.value).map(([E,O])=>O.$validate());return (await Promise.allSettled(g)).every(E=>E.status==="fulfilled"?E.value:!1)}}catch{return !1}}function A(){u.value=[];}return o.$lazy.value||D(),reactive({$dirty:s,$anyDirty:o.$anyDirty,$invalid:o.$invalid,$error:o.$error,$pending:o.$pending,$valid:o.$valid,$errors:o.$errors,$silentErrors:o.$silentErrors,$externalErrors:u,$value:e,$rules:$,$reset:M,$touch:p,$validate:h,$unwatch:S,$watch:b,$clearExternalErrors:A})}function be({$id:e,path:r,index:t,options:n,storage:a,value:l,customMessages:y,rules:I,externalErrors:C}){let d=ve(),o=`${r}.${d}`;typeof l[t]=="object"&&l[t]!=null&&(l[t].$id?o=`${r}.${l[t].$id}`:Object.defineProperties(l[t],{$id:{value:d,enumerable:!1,configurable:!1,writable:!1}}));let s=toRefs(l),v=toRef(()=>C.value?.[t]),u=re({state:s[t],rulesDef:toRef(()=>I),customMessages:y,path:o,storage:a,options:n,externalErrors:v});if(u){let w=l[t]?.$id;u.$id=w??d,a.addArrayStatus(e,t.toString(),u);}return u}function Rt({path:e,index:r,options:t,storage:n,value:a,customMessages:l,rules:y,externalErrors:I}){let C=toRefs(a),d=toRef(()=>I.value?.[r]);return re({state:C[r],rulesDef:toRef(()=>y),customMessages:l,path:e,storage:n,options:t,externalErrors:d})}function Ue({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:l,externalErrors:y}){let I=effectScope(),C;if(Array.isArray(e.value)&&!r.value.$each)return null;let d=ref(),o=ref(e.value),s=null,v=ref({}),u=a.getCollectionsEntry(n);F(),w();function w(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(d.value=ve(),Object.defineProperties(e.value,{$id:{value:d.value,enumerable:!1,configurable:!1,writable:!1}})):d.value=e.value?.$id);let{$each:R,$debounce:S,$autoDirty:b,$lazy:f,$rewardEarly:$,...T}=r.value,M=toRef(()=>{if(y.value&&ge(y.value))return y.value.$errors}),p=toRef(()=>{if(y.value&&ge(y.value))return y.value.$each});if(Array.isArray(e.value)){let h={};["pop","shift","unshift","splice"].forEach(A=>{h[A]=function(...g){pauseTracking(),u.value.forEach(E=>{E.$unwatch(),a.deleteArrayStatus(d.value,E.$id);}),u.value[A](...g);let P=Object.assign([],this)[A].apply(this,g);return u.value=u.value.map((E,O)=>{let k=oe(R,toRef(()=>e.value[O]),O);return V(E)&&(K(E)||Z(E)||Y(E))&&E.$id!=null?Rt({$id:d.value,path:`${n}.${E.$id}`,rules:k,value:e.value,index:O,options:l,storage:a,externalErrors:p}):be({$id:d.value,path:n,rules:k,value:e.value,index:O,options:l,storage:a,externalErrors:p})}).filter(E=>!!E),resetTracking(),P};});let D=new Proxy(toRaw(e.value),{get(A,g,P){let E=Reflect.get(A,g,P);return typeof g=="symbol"?E:Array.isArray(A)&&Object.hasOwn(h,g)?Reflect.get(h,g,P):E},deleteProperty(A,g){let P=Reflect.deleteProperty(A,g);return typeof g=="symbol"?!0:(isNaN(parseInt(g))||(u.value.splice(parseInt(g),1),a.deleteArrayStatus(d.value,g)),P)},set(A,g,P){let E=Reflect.set(A,g,P);if(typeof g=="symbol")return !0;if(!isNaN(parseInt(g))){let O=parseInt(g),k=u.value[O],ne=oe(R,toRef(()=>e.value[O]),O);if(!k&&ne){let ae=be({$id:d.value,value:e.value,rules:ne,customMessages:t,path:n,storage:a,options:l,index:O,externalErrors:p});ae&&(u.value[O]=ae);}}return E}});pauseTracking(),e.value=D,resetTracking();}if(v.value=ie({state:e,rulesDef:toRef(()=>T),customMessages:t,path:n,storage:a,options:l,externalErrors:M}),o.value=v.value.$value,Array.isArray(e.value)&&R)for(let[h,D]of e.value.entries()){let A=oe(R,toRef(()=>e.value[h]),h),g=be({$id:d.value,path:n,rules:A,value:e.value,index:h,options:l,storage:a,externalErrors:p});g&&(u.value[h]=g);}else u.value=[];}function x(){s&&s(),v.value&&v.value.$unwatch(),u.value&&u.value.forEach(R=>{"$dirty"in R&&R.$unwatch();});}function F(){s=watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")&&w();}),C=I.run(()=>{let R=computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(p=>typeof p!="object"):r.value.$each&&!(r.value.$each instanceof Function)?Object.values(r.value.$each).every(p=>me(p)):!1),S=computed(()=>v.value.$dirty&&u.value.every(p=>p.$dirty)),b=computed(()=>v.value.$anyDirty||u.value.some(p=>p.$dirty)),f=computed(()=>v.value.$invalid||u.value.some(p=>p.$invalid)),$=computed(()=>!f.value),T=computed(()=>v.value.$error||u.value.some(p=>p.$error)),M=computed(()=>v.value.$pending||u.value.some(p=>p.$pending));return {isPrimitiveArray:R,$dirty:S,$anyDirty:b,$invalid:f,$valid:$,$error:T,$pending:M}}),C.isPrimitiveArray.value&&console.warn(`${n} is a Array of primitives. Tracking can be lost when reassigning the Array. Only mutation properties like .splice, .push ...etc will work. We advise to use an Array of objects instead`);}function m(){v.value.$touch(),u.value.forEach(R=>{"$dirty"in R&&R.$touch();});}function c(){v.value.$reset(),u.value.forEach(R=>{"$dirty"in R&&R.$reset();}),v.value.$watch();}async function i(){try{return (await Promise.all([v.value.$validate(),...u.value.map(S=>{if("$dirty"in S)return S.$validate()})])).every(S=>!!S)}catch{return !1}}return reactive({...v.value,$value:o,...C,$each:u,$validate:i,$unwatch:x,$watch:F,$touch:m,$reset:c})}function Ee({scopeRules:e,state:r,customMessages:t,path:n="",rootRules:a,storage:l,options:y,externalErrors:I,validationGroups:C}){let d,o,s;function w(b=!0,f=!1){x.value=null,triggerRef(x);let $=Object.fromEntries(Object.entries(e.value).map(([p,h])=>{if(h){let D=toRef(r.value,p),A=toRef(()=>h),g=toRef(()=>I.value?.[p]);return [p,re({state:D,rulesDef:A,customMessages:t,path:n?`${n}.${p}`:p,storage:l,options:y,externalErrors:g})]}return []}).filter(p=>!!p.length&&p[1]!=null)),T=Object.fromEntries(Object.entries(unref(I)??{}).filter(([p])=>!(p in e.value)).map(([p,h])=>{if(h){let D=toRef(()=>({})),A=toRef(()=>h);return [p,re({state:ref(void 0),rulesDef:D,customMessages:t,path:n?`${n}.${p}`:p,storage:l,options:y,externalErrors:A})]}return []})),M=Object.fromEntries(Object.entries(C?.($)??{}).map(([p,h])=>h.length?[p,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(D=>[D,_e(toRef(()=>h),D)])),...Object.fromEntries(["$errors","$silentErrors"].map(D=>[D,Ge(toRef(()=>h),D)]))}]:[]));x.value={...$,...T,...M},b&&i();}let x=l.getFieldsEntry(n);w();function F(){w(!1),Object.entries(x.value).forEach(([b,f])=>{f.$reset();}),i();}function m(){Object.entries(x.value).forEach(([b,f])=>{f.$touch();});}async function c(){try{return (await Promise.allSettled(Object.entries(x.value).map(([f,$])=>$.$validate()))).every(f=>f.status==="fulfilled"?f.value:!1)}catch{return !1}}function i(){a&&(s=watch(a,()=>{R(),w();},{deep:!0,flush:"post"})),d=effectScope(),o=d.run(()=>{let b=computed(()=>Object.entries(x.value).every(([h,D])=>D.$dirty)),f=computed(()=>Object.entries(x.value).some(([h,D])=>D.$dirty)),$=computed(()=>Object.entries(x.value).some(([h,D])=>D.$invalid)),T=computed(()=>!$.value),M=computed(()=>Object.entries(x.value).some(([h,D])=>D.$error)),p=computed(()=>Object.entries(x.value).some(([h,D])=>D.$pending));return {$dirty:b,$anyDirty:f,$invalid:$,$valid:T,$error:M,$pending:p}});}function R(){x.value&&Object.entries(x.value).forEach(([b,f])=>{f.$unwatch();}),s?.();}function S(){Object.entries(x.value).forEach(([b,f])=>{f.$clearExternalErrors();});}return reactive({...o,$fields:x,$value:r,$reset:F,$touch:m,$validate:c,$unwatch:R,$watch:i,$clearExternalErrors:S})}function re({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:l,externalErrors:y,index:I,onUnwatch:C}){return Me(r)?Ue({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:l,index:I,externalErrors:y}):Oe(e,r)&&we(e)?Ee({scopeRules:r,state:e,customMessages:t,path:n,storage:a,options:l,index:I,externalErrors:y}):Ae(r)?ie({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:l,index:I,externalErrors:y,onUnwatch:C}):null}function Te(e,r,t,n){let a=de(),l=computed(()=>unref(t.externalErrors)),y=reactive(Ee({rootRules:e,scopeRules:e,state:r,customMessages:n?.(),storage:a,options:t,externalErrors:l,validationGroups:t.validationGroups})),I=je(y);return {regle:y,errors:I}}function he(e,r){let t={autoDirty:r?.autoDirty??!0,lazy:r?.lazy??!1,rewardEarly:r?.rewardEarly??!1};function n(a,l,y){let I=isRef(l)?l:computed(typeof l=="function"?l:()=>l),C={...t,...y},d=isRef(a)?a:ref(a),o=H(toRaw(d.value)),{regle:s,errors:v}=Te(I,d,C,e);function u(){s.$unwatch(),w(a,o),s.$reset(),s.$validate();}function w(m,c){Object.entries(c).forEach(([i,R])=>{let S=isRef(m)?m.value:m,b=isRef(S[i])?S[i].value:S[i],f=isRef(c[i])?c[i]._value:c[i];Array.isArray(f)&&Array.isArray(b)?f.forEach(($,T)=>{w(b[T],f[T]);}):V(f)?w(b,f):isRef(S[i])?S[i].value=f:S[i]=f;});}let x=computed(()=>s.$invalid||s.$pending);async function F(){return s.$touch(),await s.$validate()?d.value:!1}return {regle:s,errors:v,resetAll:u,validateState:F,invalid:x,state:d}}return n}var Le=he();function Je({rules:e,options:r}){return he(e,r)}export{se as InternalRuleType,fe as createRule,Je as defineRegleConfig,Re as defineType,j as unwrapRuleParameters,Le as useRegle};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@regle/core",
3
- "version": "0.1.0",
4
- "description": "Typescript first model-based validation library for Vue 3",
3
+ "version": "0.1.1",
4
+ "description": "Typescript-first model-based validation library for Vue 3",
5
5
  "peerDependencies": {
6
6
  "vue": "^3.1.0"
7
7
  },