@regle/core 0.1.1 → 0.1.2

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/README.md CHANGED
@@ -0,0 +1,17 @@
1
+ <p align="center">
2
+ <img src="https://raw.githubusercontent.com/victorgarciaesgi/regle/master/.github/images/regle-github-banner.png" alt="regle cover">
3
+ </p>
4
+
5
+ # Regle
6
+
7
+
8
+ Regle \ʁɛɡl\ (French word for 'rule' ) is a Typescript-first model-based validation library for Vue 3.
9
+ It's heavily inspired by Vuelidate.
10
+
11
+ > ⚠️ Project is still in development, do not use it in production
12
+ > API or function names can still change
13
+
14
+
15
+ # 📚 Documentation
16
+
17
+ [![Documentation](https://raw.githubusercontent.com/victorgarciaesgi/regle/refs/heads/main/.github/images/redirectDoc.svg)](https://regle.vercel.app/)
package/dist/index.d.ts CHANGED
@@ -74,7 +74,7 @@ interface LocalRegleBehaviourOptions<TState extends Record<string, any>, TRules
74
74
  externalErrors?: MaybeRef<TExternal>;
75
75
  validationGroups?: (fields: RegleStatus<TState, TRules>['$fields']) => TValidationGroups;
76
76
  }
77
- type RegleValidationGroupEntry = RegleFieldStatus<any, any, any> | RegleCollectionStatus<any, any>;
77
+ type RegleValidationGroupEntry = RegleFieldStatus<any, any, any>;
78
78
  interface RegleValidationGroupOutput {
79
79
  $invalid: boolean;
80
80
  $error: boolean;
@@ -97,7 +97,7 @@ interface Regle<TState extends Record<string, any> = EmptyObject, TRules extends
97
97
  * It allow you to skip scouting the `regle` object
98
98
  */
99
99
  errors: RegleErrorTree<TRules, TExternal>;
100
- invalid: ComputedRef<boolean>;
100
+ ready: ComputedRef<boolean>;
101
101
  resetAll: () => void;
102
102
  validateState: () => Promise<false | DeepSafeFormState<TState, TRules>>;
103
103
  state: Ref<TState>;
@@ -289,11 +289,17 @@ type RegleFormPropertyType<TValue = any, TCustomRules extends Partial<AllRulesDe
289
289
  type RegleRuleDecl<TValue extends any = any, TCustomRules extends Partial<AllRulesDeclarations> = Partial<AllRulesDeclarations>> = FieldRegleBehaviourOptions & {
290
290
  [TKey in keyof TCustomRules]?: NonNullable<TCustomRules[TKey]> extends RegleRuleWithParamsDefinition<any, infer TParams> ? RegleRuleDefinition<TValue, TParams, boolean> : NonNullable<TCustomRules[TKey]> extends RegleRuleDefinition<any, any, any, any> ? FormRuleDeclaration<TValue, any> : FormRuleDeclaration<TValue, any> | FieldRegleBehaviourOptions[keyof FieldRegleBehaviourOptions];
291
291
  };
292
+ /**
293
+ * @public
294
+ */
295
+ type RegleCollectionRuleDeclKeyProperty = {
296
+ $key?: PropertyKey;
297
+ };
292
298
  /**
293
299
  * @public
294
300
  */
295
301
  type RegleCollectionRuleDecl<TValue = any[], TCustomRules extends Partial<AllRulesDeclarations> = Partial<AllRulesDeclarations>> = (RegleRuleDecl<NonNullable<TValue>, TCustomRules> & {
296
- $each?: MaybeGetter<RegleFormPropertyType<ArrayElement<NonNullable<TValue>>, TCustomRules>, ArrayElement<TValue>>;
302
+ $each?: MaybeGetter<RegleFormPropertyType<ArrayElement<NonNullable<TValue>>, TCustomRules> & RegleCollectionRuleDeclKeyProperty, ArrayElement<TValue>>;
297
303
  }) | {
298
304
  $each?: MaybeGetter<RegleFormPropertyType<ArrayElement<NonNullable<TValue>>, TCustomRules>, ArrayElement<TValue>>;
299
305
  };
@@ -336,6 +342,8 @@ type RegleStatus<TState extends Record<string, any> = Record<string, any>, TRule
336
342
  readonly $fields: {
337
343
  readonly [TKey in keyof TRules]: InferRegleStatusType<NonNullable<TRules[TKey]>, TState, TKey>;
338
344
  };
345
+ readonly $errors: RegleErrorTree<TRules>;
346
+ readonly $silentErrors: RegleErrorTree<TRules>;
339
347
  } & ([TValidationGroups] extends [never] ? object : {
340
348
  $groups: {
341
349
  readonly [TKey in keyof TValidationGroups]: RegleValidationGroupOutput;
@@ -344,17 +352,17 @@ type RegleStatus<TState extends Record<string, any> = Record<string, any>, TRule
344
352
  /**
345
353
  * @public
346
354
  */
347
- type InferRegleStatusType<TRule extends RegleCollectionRuleDecl | RegleRuleDecl | ReglePartialValidationTree<any>, TState extends Record<PropertyKey, any> = any, TKey extends PropertyKey = string> = TRule extends RegleCollectionRuleDefinition<any, any> ? NonNullable<TState[TKey]> extends Array<Record<string, any> | any> ? ExtractFromGetter<TRule['$each']> extends RegleRuleDecl | ReglePartialValidationTree<any> ? RegleCollectionStatus<ExtractFromGetter<TRule['$each']>, TState[TKey]> : never : RegleFieldStatus<TRule, TState, TKey> : TRule extends ReglePartialValidationTree<any> ? NonNullable<TState[TKey]> extends Array<any> ? RegleCommonStatus<TState[TKey]> : NonNullable<TState[TKey]> extends Record<PropertyKey, any> ? RegleStatus<TState[TKey], TRule> : RegleFieldStatus<TRule, TState, TKey> : RegleFieldStatus<TRule, TState, TKey>;
355
+ type InferRegleStatusType<TRule extends RegleCollectionRuleDecl | RegleRuleDecl | ReglePartialValidationTree<any>, TState extends Record<PropertyKey, any> = any, TKey extends PropertyKey = string> = TRule extends RegleCollectionRuleDefinition<any, any> ? NonNullable<TState[TKey]> extends Array<Record<string, any> | any> ? ExtractFromGetter<TRule['$each']> extends RegleRuleDecl | ReglePartialValidationTree<any> ? RegleCollectionStatus<ExtractFromGetter<TRule['$each']>, TState[TKey], TRule> : never : RegleFieldStatus<TRule, TState, TKey> : TRule extends ReglePartialValidationTree<any> ? NonNullable<TState[TKey]> extends Array<any> ? RegleCommonStatus<TState[TKey]> : NonNullable<TState[TKey]> extends Record<PropertyKey, any> ? RegleStatus<TState[TKey], TRule> : RegleFieldStatus<TRule, TState, TKey> : RegleFieldStatus<TRule, TState, TKey>;
348
356
  /**
349
357
  * @public
350
358
  */
351
359
  interface RegleFieldStatus<TRules extends RegleFormPropertyType<any, Partial<AllRulesDeclarations>> = Record<string, any>, TState extends Record<PropertyKey, any> = any, TKey extends PropertyKey = string> extends RegleCommonStatus<TState> {
352
360
  $value: UnwrapNestedRefs<TState[TKey]>;
353
- readonly $externalErrors?: string[];
354
361
  readonly $errors: string[];
355
362
  readonly $silentErrors: string[];
363
+ readonly $externalErrors?: string[];
356
364
  readonly $rules: {
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>;
365
+ readonly [TRuleKey in keyof Omit<TRules, '$each' | keyof FieldRegleBehaviourOptions>]: 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>;
358
366
  };
359
367
  }
360
368
  /**
@@ -396,8 +404,11 @@ type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata exte
396
404
  /**
397
405
  * @public
398
406
  */
399
- interface RegleCollectionStatus<TRules extends RegleRuleDecl | ReglePartialValidationTree<any>, TState extends any[]> extends RegleFieldStatus<TRules, TState> {
400
- readonly $each: Array<InferRegleStatusType<NonNullable<TRules>, TState, number>>;
407
+ interface RegleCollectionStatus<TRules extends RegleRuleDecl | ReglePartialValidationTree<any>, TState extends any[], TFieldRule extends RegleCollectionRuleDecl<any, any> = never> extends Omit<RegleFieldStatus<TRules, TState>, '$errors' | '$silentErrors'> {
408
+ readonly $each: Array<InferRegleStatusType<NonNullable<TRules>, NonNullable<TState>, number>>;
409
+ readonly $field: RegleFieldStatus<TFieldRule, TState>;
410
+ readonly $errors: RegleErrorTree<TRules>;
411
+ readonly $silentErrors: RegleErrorTree<TRules>;
401
412
  }
402
413
 
403
414
  /**
@@ -446,16 +457,9 @@ declare function unwrapRuleParameters<TParams extends any[]>(params: ParamDecl[]
446
457
 
447
458
  declare const useRegle: <TState extends Record<string, any>, TRules extends ReglePartialValidationTree<TState, Partial<AllRulesDeclarations>>, TExternal extends RegleExternalErrorTree<TState>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]>, TValid = keyof TRules extends keyof TState ? true : false>(state: MaybeRef<TState> | DeepReactiveState<TState>, rulesFactory: TValid extends true ? TRules | ComputedRef<TRules> | (() => TRules) : never, options?: (Partial<DeepMaybeRef<RegleBehaviourOptions>> & LocalRegleBehaviourOptions<TState, TRules, TExternal, TValidationGroups>) | undefined) => Regle<TState, TRules, TExternal, TValidationGroups>;
448
459
 
449
- /**
450
- * Root function that allows you to define project-wise all your custom rules or overwrite default ones
451
- *
452
- * It will return utility functions that let you build type-safe forms
453
- *
454
- * @param customRules
455
- */
456
- declare function defineRegleConfig<TCustomRules extends Partial<AllRulesDeclarations>>({ rules, options, }: {
460
+ declare function defineRegleConfig<TCustomRules extends Partial<AllRulesDeclarations>>({ rules, modifiers, }: {
457
461
  rules?: () => TCustomRules;
458
- options?: RegleBehaviourOptions;
462
+ modifiers?: RegleBehaviourOptions;
459
463
  }): <TState extends Record<string, any>, TRules extends ReglePartialValidationTree<TState, Partial<AllRulesDeclarations> & TCustomRules>, TExternal extends RegleExternalErrorTree<TState>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]>, TValid = keyof TRules extends keyof TState ? true : false>(state: vue.MaybeRef<TState> | DeepReactiveState<TState>, rulesFactory: TValid extends true ? TRules | vue.ComputedRef<TRules> | (() => TRules) : never, options?: (Partial<DeepMaybeRef<RegleBehaviourOptions>> & LocalRegleBehaviourOptions<TState, TRules, TExternal, TValidationGroups>) | undefined) => Regle<TState, TRules, TExternal, TValidationGroups>;
460
464
 
461
465
  export { type DeepMaybeRef, type FormRuleDeclaration, type InlineRuleDeclaration, InternalRuleType, type LocalRegleBehaviourOptions, type Maybe, type ParamDecl, type Regle, type RegleBehaviourOptions, type RegleCollectionErrors, type RegleCollectionRuleDecl, type RegleCollectionStatus, type RegleCommonStatus, type RegleComputedRules, type RegleErrorTree, type RegleExternalCollectionErrors, type RegleExternalErrorTree, type RegleExternalValidationErrors, type RegleFieldStatus, type RegleFormPropertyType, type ReglePartialValidationTree, type RegleRuleCore, type RegleRuleDecl, type RegleRuleDefinition, type RegleRuleDefinitionProcessor, type RegleRuleDefinitionWithMetadataProcessor, type RegleRuleInit, type RegleRuleMetadataConsumer, type RegleRuleMetadataDefinition, type RegleRuleRaw, type RegleRuleStatus, type RegleRuleWithParamsDefinition, type RegleStatus, type RegleValidationTree, type UnwrapRegleUniversalParams, createRule, defineRegleConfig, defineType, unwrapRuleParameters, useRegle };
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 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};
1
+ import {unref,isRef,toRef,computed,ref,toRaw,reactive,shallowRef,onScopeDispose,triggerRef,watch,effectScope,toRefs}from'vue';function M(e){return e.map(t=>t instanceof Function?t():unref(t))}function Ce(e){return e.map(t=>t instanceof Function||isRef(t)?t:toRef(()=>t))}function De(e){let t=e.toString();return (t.includes("=>")?t.split("=>")[0]:t).slice(t.indexOf("(")+1,t.indexOf(")")).split(",").map(s=>s.trim()).filter(s=>s.includes("=")).length+e.length}function ie(e,...t){let{message:r,validator:n,active:a,...s}=e,$=n.constructor.name==="AsyncFunction";return {...{validator(v,...l){return e.validator(v,...M(l.length?l:t))},message(v,l){return typeof e.message=="function"?e.message(v,{...l,$params:M(l.$params?.length?l.$params:t)}):e.message},active(v,l){return typeof e.active=="function"?e.active(v,{...l,$params:M(l.$params?.length?l.$params:t)}):e.active??!0},exec(v){let l=e.validator(v,...M(t)),o;return l instanceof Promise?l.then(C=>(o=C,typeof o=="object"&&"$valid"in o?o.$valid:typeof o=="boolean"?o:!1)):(o=l,typeof o=="object"&&"$valid"in o?o.$valid:typeof o=="boolean"?o:!1)}},...s,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:$,_params:Ce(t)}}function ue(e){if(typeof e.validator=="function"){let r=ie(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(De(e.validator)>1){let a=function(...s){return ie(e,...s)};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 ce(e){return e}function k(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Pe(e){return k(e.value)}function B(e){let t=e,r={}.toString.call(e).slice(8,-1);if(r=="Set"&&(t=new Set([...e].map(n=>B(n)))),r=="Map"&&(t=new Map([...e].map(n=>[B(n[0]),B(n[1])]))),r=="Date"&&(t=new Date(e.getTime())),r=="RegExp"&&(t=RegExp(e.source,Ke(e))),r=="Array"||r=="Object"){t=Array.isArray(e)?[]:{};for(let n in e)t[n]=B(e[n]);}return t}function Ke(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 fe(e,t,r){return e instanceof Function?e(t,r??0):e}function ee(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 Re(e,t,r){let n,a=(...s)=>new Promise($=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...s])).then($);},t);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...s)=>new Promise($=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...s])).then($);},0);}),a}function pe(){let e=shallowRef(new Map),t=shallowRef(new Map),r=shallowRef(new Map),n=shallowRef(new Map),a=shallowRef(new Map),s=shallowRef(new Map);function $(p){let R=t.value.get(p);if(R)return R;{let c=ref({});return t.value.set(p,c),c}}function T(p){let R=r.value.get(p);if(R)return R;{let c=ref([]);return r.value.set(p,c),c}}function D(p,R,c){s.value.set(`${p}-${R}`,c);}function v(p,R){return s.value.get(`${p}-${R}`)}function l(p,R){p&&R!=null&&s.value.delete(`${p}-${R}`);}function o(p,R){n.value.set(p,R);}function C(p){return n.value.get(p)??!1}function E(p,R){e.value.set(p,R);}function g(p,R){let c=e.value.get(p);return c?u(R,c)?{valid:!0}:{valid:!1}:void 0}function u(p,R){let c=Object.keys(R),I=Object.keys(p);return I.length!==c.length||!I.every(y=>c.includes(y))?!1:I.every(y=>{let d=p[y],i=R[y];return !i||!d||typeof d=="function"||typeof i=="function"||typeof d=="number"||typeof d=="boolean"?!1:d._params?d._params?.every((f,h)=>{if(typeof i=="number"||typeof i=="boolean")return !0;{let m=M(i._params),P=M(d._params);return m?.[h]===P?.[h]}}):!0})}function A(p){let R=a.value.get(p);if(R)return R;{let c=ref(!1),I=ref(!0),S=ref({}),y=ref(!1);return a.value.set(p,{$pending:c,$valid:I,$metadata:S,$validating:y}),{$pending:c,$valid:I,$metadata:S,$validating:y}}}return onScopeDispose(()=>{e.value.clear(),t.value.clear(),r.value.clear(),n.value.clear(),a.value.clear(),s.value.clear();}),{addRuleDeclEntry:E,setDirtyEntry:o,checkRuleDeclEntry:g,getDirtyState:C,trySetRuleStatusRef:A,getFieldsEntry:$,getCollectionsEntry:T,getArrayStatus:v,addArrayStatus:D,deleteArrayStatus:l,arrayStatusStorage:s}}function we(e,t){return k(e.value)&&k(t.value)&&!Object.entries(t.value).some(r=>de(r))}function Oe(e){return !!e.value&&"$each"in e.value}function Ae(e){return !!e.value&&k(e.value)}function de(e){return k(e)&&"_validator"in e}function X(e){return typeof e.value!="function"}function me(e){return k(e)&&"$fields"in e}function ge(e){return !!e&&"$each"in e}function $e(e){return !!e&&"$rules"in e}function ve(e){return "$each"in e||"$errors"in e}function G({field:e,silent:t=!1}){return Object.entries(e.$rules??{}).map(([r,n])=>t||!n.$valid&&e.$dirty?n.$message:null).filter(r=>!!r).reduce((r,n)=>typeof n=="string"?r?.concat([n]):r?.concat(n),[]).concat(e.$externalErrors??[])}function Me(e,t=!1){return me(e)?q(e.$fields):ge(e)?{$errors:e.$field.$rules?G({field:e.$field,silent:t}):[],$each:e.$each.map(r=>Me(r,t))}:$e(e)?e.$error?G({field:e,silent:t}):e.$externalErrors??[]:[]}function te(e,t=!1){return e.map(r=>Me(r,t))}function q(e,t=!1){return Object.fromEntries(Object.entries(e).map(([r,n])=>me(n)?[r,q(n.$fields,t)]:ge(n)?[r,{$errors:G({field:n.$field,silent:t}),$each:te(n.$each,t)}]:$e(n)?n.$error?[r,G({field:n,silent:t})]:[r,n.$externalErrors??[]]:[r,[]]))}function Fe(e){return computed(()=>q(e.$fields))}var re=(r=>(r.Inline="__inline",r.Async="__async",r))(re||{});function Ve(e,t){return computed(()=>e.value.some(r=>r[t]))}function _e(e,t){return computed(()=>e.value.reduce((r,n)=>{let a=n[t]||[];return r.concat(a)},[]))}function rt(){return Math.floor(Math.random()*Date.now()).toString()}function ye(){return typeof window>"u"?rt():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(10)}function Ge({$dirty:e,customMessages:t,rule:r,ruleKey:n,state:a,path:s,storage:$}){let T=effectScope(),D,v,{$pending:l,$valid:o,$metadata:C,$validating:E}=$.trySetRuleStatusRef(`${s}.${n}`);function g(){D=T.run(()=>{let R=computed(()=>({$invalid:!o.value,$params:d.value,...C.value})),c=computed(()=>X(r)?typeof r.value.active=="function"?r.value.active(a.value,R.value):r.value.active:!0),I=computed(()=>{let f="",h=t?t[n]?.message:void 0;return h&&(typeof h=="function"?f=h(a.value,R.value):f=h),X(r)&&(h&&!r.value._patched||(typeof r.value.message=="function"?f=r.value.message(a.value,R.value):f=r.value.message)),ee(f)&&(f="Error",console.warn(`No error message defined for ${s}.${n}`)),f}),S=computed(()=>X(r)&&r.value.type?Object.values(re).includes(r.value.type)?n:r.value.type:n),y=computed(()=>X(r)?r.value.validator:r.value),d=computed(()=>typeof r.value=="function"?[]:M(r.value._params??[])),i=computed(()=>`${s}.${S.value}`);return {$active:c,$message:I,$type:S,$validator:y,$params:d,$path:i}}),v=watch(D.$params,u,{deep:!0});}g();async function u(){E.value=!0;let R=D.$validator.value,c=!1,I=R(a.value,...D.$params.value);if(I instanceof Promise){if(!l.value)try{o.value=!0,e.value&&(l.value=!0);let S=await I;if(typeof S=="boolean")c=S;else {let{$valid:y,...d}=S;c=y,C.value=d;}}catch{c=!1;}finally{l.value=!1;}}else if(I!=null)if(typeof I=="boolean")c=I;else {let{$valid:S,...y}=I;c=S,C.value=y;}return o.value=c,E.value=!1,c}function A(){o.value=!0,C.value={},l.value=!1,E.value=!1,g();}function p(){v(),T.stop(),T=effectScope();}return reactive({...D,$pending:l,$valid:o,$metadata:C,$validate:u,$unwatch:p,$watch:g,$reset:A})}function ne({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:s,externalErrors:$,index:T,onUnwatch:D}){let v=effectScope(),l,o=ref(!1),C=ref(!1),E=ref([]),g,u,A,p,R=()=>{};function c(){E.value=$.value??[];}c();function I(){let b=t.value,x=a.checkRuleDeclEntry(n,b);f.value=Object.fromEntries(Object.entries(b).filter(([O])=>O.startsWith("$"))),i.value=Object.fromEntries(Object.entries(t.value).filter(([O])=>!O.startsWith("$")).map(([O,_])=>{if(_){let oe=toRef(()=>_);return [O,Ge({$dirty:o,customMessages:r,rule:oe,ruleKey:O,state:e,path:n,storage:a})]}return []}).filter(O=>!!O.length)),y(),R=l.$debounce.value?Re(d,l.$debounce.value??0):d,x?.valid!=null&&(o.value=a.getDirtyState(n),o.value&&R()),a.addRuleDeclEntry(n,b);}function S(){i.value&&Object.entries(i.value).forEach(([b,x])=>{x.$unwatch();}),p(),o.value&&a.setDirtyEntry(n,o.value),g(),u(),A(),v.stop(),v=effectScope(),D?.();}function y(){i.value&&Object.entries(i.value).forEach(([b,x])=>{x.$watch();}),l=v.run(()=>{let b=computed(()=>o.value),x=computed(()=>f.value.$debounce),O=computed(()=>f.value.$lazy!=null?f.value.$lazy:unref(s.lazy)),_=computed(()=>f.value.$rewardEarly!=null?f.value.$rewardEarly:unref(s.rewardEarly)),oe=computed(()=>f.value.$autoDirty!=null?f.value.$autoDirty:unref(s.autoDirty)),Le=computed(()=>se.value&&!xe.value&&o.value),Je=computed(()=>G({field:{$dirty:o.value,$externalErrors:E.value,$rules:i.value}})),Qe=computed(()=>G({field:{$dirty:o.value,$externalErrors:E.value,$rules:i.value},silent:!0})),xe=computed(()=>C.value||!_.value?Object.entries(i.value).some(([K,Q])=>Q.$pending):!1),se=computed(()=>E.value?.length?!0:!_.value||_.value&&C.value?Object.entries(i.value).some(([K,Q])=>!Q.$valid):!1),Ie=computed(()=>o.value&&!ee(e.value)?E.value?.length?!1:_.value?Object.entries(i.value).every(([K,Q])=>Q.$valid):!se.value:!1);return watch(Ie,K=>{K&&(C.value=!1);}),{$error:Le,$pending:xe,$invalid:se,$valid:Ie,$debounce:x,$lazy:O,$errors:Je,$silentErrors:Qe,$rewardEarly:_,$autoDirty:oe,$anyDirty:b}}),A=watch($,c),g=watch(e,()=>{l.$autoDirty.value&&(o.value||(o.value=!0)),t.value instanceof Function&&I(),R(),l.$rewardEarly.value;},{deep:!0}),p=watch(o,()=>{a.setDirtyEntry(n,o.value),P();}),u=watch(l.$valid,b=>{l.$rewardEarly.value&&b&&(C.value=!1);});}function d(){Object.entries(i.value).forEach(([b,x])=>{x.$validate();});}let i=ref(),f=ref();I();function h(){o.value=!1,E.value=[],Object.entries(i.value).forEach(([b,x])=>{x.$reset();}),l.$lazy.value||Object.entries(i.value).map(([b,x])=>x.$validate());}function m(){o.value=!0,l.$rewardEarly.value;}let P=l.$debounce.value?Re(w,l.$debounce.value??0):w;async function w(){try{if(C.value=!0,l.$anyDirty.value&&!l.$pending)return !l.$error.value;{let b=Object.entries(i.value).map(([O,_])=>_.$validate());return (await Promise.allSettled(b)).every(O=>O.status==="fulfilled"?O.value:!1)}}catch{return !1}}function F(){E.value=[];}return l.$lazy.value||w(),reactive({$dirty:o,$anyDirty:l.$anyDirty,$invalid:l.$invalid,$error:l.$error,$pending:l.$pending,$valid:l.$valid,$errors:l.$errors,$silentErrors:l.$silentErrors,$externalErrors:E,$value:e,$rules:i,$reset:h,$touch:m,$validate:P,$unwatch:S,$watch:y,$clearExternalErrors:F})}function We({$id:e,path:t,index:r,options:n,storage:a,value:s,customMessages:$,rules:T,externalErrors:D}){let v=T.$key?T.$key:ye(),l=`${t}.${String(v)}`;typeof s[r]=="object"&&s[r]!=null&&(s[r].$id?l=`${t}.${s[r].$id}`:Object.defineProperties(s[r],{$id:{value:v,enumerable:!1,configurable:!1,writable:!1}}));let o=toRefs(s),C=toRef(()=>D.value?.[r]),E=le({state:o[r],rulesDef:toRef(()=>T),customMessages:$,path:l,storage:a,options:n,externalErrors:C});if(E){let g=s[r]?.$id;E.$id=g??String(v),a.addArrayStatus(e,E.$id,E);}return E}function Ne({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:s,externalErrors:$}){let T=effectScope(),D,v=effectScope(),l;if(Array.isArray(e.value)&&!t.value.$each)return null;let o=ref(),C=ref(e.value),E=null,g=ref({}),u=a.getCollectionsEntry(n);l=v.run(()=>{let i=computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(m=>typeof m!="object"):t.value.$each&&!(t.value.$each instanceof Function)?Object.values(t.value.$each).every(m=>de(m)):!1),f=computed(()=>$.value?ve($.value)?$.value.$errors??[]:[]:[]),h=computed(()=>$.value?ve($.value)?$.value.$each??[]:[]:[]);return {isPrimitiveArray:i,$externalErrorsField:f,$externalErrorsEach:h}}),A(),R();function A(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(o.value=ye(),Object.defineProperties(e.value,{$id:{value:o.value,enumerable:!1,configurable:!1,writable:!1}})):e.value?.$id&&(o.value=e.value.$id)),!l.isPrimitiveArray.value&&(C.value=g.value.$value,Array.isArray(e.value)&&t.value.$each?u.value=e.value.map((i,f)=>{let h=fe(t.value.$each,toRef(()=>e.value[f]),f);if(h){let m=We({$id:o.value,path:n,rules:h,value:e.value,index:f,options:s,storage:a,externalErrors:l.$externalErrorsEach});return m||null}}).filter(i=>!!i):u.value=[],g.value=ne({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:s,externalErrors:l.$externalErrorsField}));}function p(){if(Array.isArray(e.value)){let i=B(u.value);u.value=e.value.map((f,h)=>{if(f.$id&&u.value.find(m=>m.$id===f.$id)){let m=a.getArrayStatus(o.value,f.$id);return m?(m.$value=toRef(()=>f),m):null}else {let m=fe(t.value.$each,toRef(()=>toRef(()=>f)),h);if(m){let P=We({$id:o.value,path:n,rules:m,value:e.value,index:h,options:s,storage:a,externalErrors:l.$externalErrorsEach});return P||null}}}).filter(f=>!!f),i.filter(f=>!e.value.find(h=>f.$id===h.$id)).forEach((f,h)=>{a.deleteArrayStatus(o.value,h.toString());});}else u.value=[];}function R(){E=watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")?A():p();},{deep:!0,flush:"pre"}),D=T.run(()=>{let i=computed(()=>g.value.$dirty&&u.value.every(x=>x.$dirty)),f=computed(()=>g.value.$anyDirty||u.value.some(x=>x.$dirty)),h=computed(()=>g.value.$invalid||u.value.some(x=>x.$invalid)),m=computed(()=>g.value.$valid||u.value.some(x=>x.$valid)),P=computed(()=>g.value.$error||u.value.some(x=>x.$error)),w=computed(()=>g.value.$pending||u.value.some(x=>x.$pending)),F=computed(()=>({$errors:G({field:g.value,silent:!1}),$each:te(u.value)})),b=computed(()=>({$errors:G({field:g.value,silent:!0}),$each:te(u.value,!0)}));return {$dirty:i,$anyDirty:f,$invalid:h,$valid:m,$error:P,$pending:w,$errors:F,$silentErrors:b}}),l.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`),E());}function c(){E&&E(),g.value&&g.value.$unwatch(),u.value&&u.value.forEach(i=>{"$dirty"in i&&i.$unwatch();}),T.stop(),T=effectScope(),v.stop(),v=effectScope(!0);}function I(){g.value.$touch(),u.value.forEach(i=>{i.$touch();});}function S(){g.value.$reset(),u.value.forEach(i=>{i.$reset();});}async function y(){try{return (await Promise.all([g.value.$validate(),...u.value.map(f=>f.$validate())])).every(f=>!!f)}catch{return !1}}function d(){}return reactive({$field:g,...D,$each:u,$value:e,$validate:y,$unwatch:c,$watch:R,$touch:I,$reset:S,$clearExternalErrors:d})}function be({scopeRules:e,state:t,customMessages:r,path:n="",rootRules:a,storage:s,options:$,externalErrors:T,validationGroups:D}){let v,l,o;function g(y=!0,d=!1){u.value=null,triggerRef(u);let i=Object.fromEntries(Object.entries(e.value).map(([m,P])=>{if(P){let w=toRef(t.value,m),F=toRef(()=>P),b=toRef(()=>T.value?.[m]);return [m,le({state:w,rulesDef:F,customMessages:r,path:n?`${n}.${m}`:m,storage:s,options:$,externalErrors:b})]}return []}).filter(m=>!!m.length&&m[1]!=null)),f=Object.fromEntries(Object.entries(unref(T)??{}).filter(([m])=>!(m in e.value)).map(([m,P])=>{if(P){let w=toRef(()=>({})),F=toRef(()=>P);return [m,le({state:ref(void 0),rulesDef:w,customMessages:r,path:n?`${n}.${m}`:m,storage:s,options:$,externalErrors:F})]}return []})),h=Object.fromEntries(Object.entries(D?.(i)??{}).map(([m,P])=>P.length?[m,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(w=>[w,Ve(toRef(()=>P),w)])),...Object.fromEntries(["$errors","$silentErrors"].map(w=>[w,_e(toRef(()=>P),w)]))}]:[]));u.value={...i,...f,...h},y&&c();}let u=s.getFieldsEntry(n);g();function A(){g(!1),Object.entries(u.value).forEach(([y,d])=>{d.$reset();}),c();}function p(){Object.entries(u.value).forEach(([y,d])=>{d.$touch();});}async function R(){try{return (await Promise.allSettled(Object.entries(u.value).map(([d,i])=>i.$validate()))).every(d=>d.status==="fulfilled"?d.value:!1)}catch{return !1}}function c(){a&&(o=watch(a,()=>{I(),g();},{deep:!0,flush:"post"})),v=effectScope(),l=v.run(()=>{let y=computed(()=>!!Object.entries(u.value).length&&Object.entries(u.value).every(([F,b])=>b.$dirty)),d=computed(()=>Object.entries(u.value).some(([F,b])=>b.$dirty)),i=computed(()=>Object.entries(u.value).some(([F,b])=>b.$invalid)),f=computed(()=>!i.value),h=computed(()=>Object.entries(u.value).some(([F,b])=>b.$error)),m=computed(()=>Object.entries(u.value).some(([F,b])=>b.$pending)),P=computed(()=>q(u.value)),w=computed(()=>q(u.value,!0));return {$dirty:y,$anyDirty:d,$invalid:i,$valid:f,$error:h,$pending:m,$errors:P,$silentErrors:w}});}function I(){u.value&&Object.entries(u.value).forEach(([y,d])=>{d.$unwatch();}),o?.(),v.stop(),v=effectScope();}function S(){Object.entries(u.value).forEach(([y,d])=>{d.$clearExternalErrors();});}return reactive({...l,$fields:u,$value:t,$reset:A,$touch:p,$validate:R,$unwatch:I,$watch:c,$clearExternalErrors:S})}function le({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:s,externalErrors:$,index:T,onUnwatch:D}){return Oe(t)?Ne({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:s,index:T,externalErrors:$}):we(e,t)&&Pe(e)?be({scopeRules:t,state:e,customMessages:r,path:n,storage:a,options:s,index:T,externalErrors:$}):Ae(t)?ne({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:s,index:T,externalErrors:$,onUnwatch:D}):null}function he(e,t,r,n){let a=pe(),s=computed(()=>unref(r.externalErrors)),$=reactive(be({rootRules:e,scopeRules:e,state:t,customMessages:n?.(),storage:a,options:r,externalErrors:s,validationGroups:r.validationGroups})),T=Fe($);return {regle:$,errors:T}}function Te(e,t){let r={autoDirty:t?.autoDirty??!0,lazy:t?.lazy??!1,rewardEarly:t?.rewardEarly??!1};function n(a,s,$){let T=isRef(s)?s:computed(typeof s=="function"?s:()=>s),D={...r,...$},v=isRef(a)?a:ref(a),l=B(toRaw(v.value)),{regle:o,errors:C}=he(T,v,D,e);function E(){o.$unwatch(),g(a,l),o.$reset();}function g(p,R){Object.entries(R).forEach(([c,I])=>{let S=isRef(p)?p.value:p,y=isRef(S[c])?S[c].value:S[c],d=isRef(R[c])?R[c]._value:R[c];Array.isArray(d)&&Array.isArray(y)?(S[c]=[],d.forEach((i,f)=>{S[c][f]={},g(S[c][f],d[f]);})):k(d)?g(y,d):isRef(S[c])?S[c].value=d:S[c]=d;});}let u=computed(()=>!(o.$invalid||o.$pending));async function A(){return o.$touch(),await o.$validate()?v.value:!1}return {regle:o,errors:C,resetAll:E,validateState:A,ready:u,state:v}}return n}var ze=Te();function qe({rules:e,modifiers:t}){return Te(e,t)}export{re as InternalRuleType,ue as createRule,qe as defineRegleConfig,ce as defineType,M as unwrapRuleParameters,ze as useRegle};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@regle/core",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Typescript-first model-based validation library for Vue 3",
5
5
  "peerDependencies": {
6
6
  "vue": "^3.1.0"