@regle/core 0.1.0 → 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
@@ -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,10 +71,10 @@ 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
- 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,9 +97,9 @@ 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>;
101
- resetForm: () => void;
102
- validateForm: () => Promise<false | DeepSafeFormState<TState, TRules>>;
100
+ ready: ComputedRef<boolean>;
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 = {
@@ -285,23 +289,29 @@ type RegleFormPropertyType<TValue = any, TCustomRules extends Partial<AllRulesDe
285
289
  type RegleRuleDecl<TValue extends any = any, TCustomRules extends Partial<AllRulesDeclarations> = Partial<AllRulesDeclarations>> = FieldRegleBehaviourOptions & {
286
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];
287
291
  };
292
+ /**
293
+ * @public
294
+ */
295
+ type RegleCollectionRuleDeclKeyProperty = {
296
+ $key?: PropertyKey;
297
+ };
288
298
  /**
289
299
  * @public
290
300
  */
291
301
  type RegleCollectionRuleDecl<TValue = any[], TCustomRules extends Partial<AllRulesDeclarations> = Partial<AllRulesDeclarations>> = (RegleRuleDecl<NonNullable<TValue>, TCustomRules> & {
292
- $each?: MaybeGetter<RegleFormPropertyType<ArrayElement<NonNullable<TValue>>, TCustomRules>, ArrayElement<TValue>>;
302
+ $each?: MaybeGetter<RegleFormPropertyType<ArrayElement<NonNullable<TValue>>, TCustomRules> & RegleCollectionRuleDeclKeyProperty, ArrayElement<TValue>>;
293
303
  }) | {
294
304
  $each?: MaybeGetter<RegleFormPropertyType<ArrayElement<NonNullable<TValue>>, TCustomRules>, ArrayElement<TValue>>;
295
305
  };
296
306
  /**
297
307
  * @public
298
308
  */
299
- type InlineRuleDeclaration<TValue extends any = any, TReturn extends RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition> = RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition>> = (value: Maybe<TValue>, ...args: any[]) => TReturn;
309
+ 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
310
  /**
301
311
  * @public
302
312
  * Regroup inline and registered rules
303
313
  * */
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>;
314
+ 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
315
 
306
316
  type RegleErrorTree<TRules extends ReglePartialValidationTree<any, any>, TExternal extends RegleExternalErrorTree<Record<string, unknown>> = never> = {
307
317
  readonly [K in keyof TRules]: RegleValidationErrors<TRules[K], K extends keyof TExternal ? TExternal[K] : never>;
@@ -332,6 +342,8 @@ type RegleStatus<TState extends Record<string, any> = Record<string, any>, TRule
332
342
  readonly $fields: {
333
343
  readonly [TKey in keyof TRules]: InferRegleStatusType<NonNullable<TRules[TKey]>, TState, TKey>;
334
344
  };
345
+ readonly $errors: RegleErrorTree<TRules>;
346
+ readonly $silentErrors: RegleErrorTree<TRules>;
335
347
  } & ([TValidationGroups] extends [never] ? object : {
336
348
  $groups: {
337
349
  readonly [TKey in keyof TValidationGroups]: RegleValidationGroupOutput;
@@ -340,17 +352,17 @@ type RegleStatus<TState extends Record<string, any> = Record<string, any>, TRule
340
352
  /**
341
353
  * @public
342
354
  */
343
- 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>;
344
356
  /**
345
357
  * @public
346
358
  */
347
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> {
348
360
  $value: UnwrapNestedRefs<TState[TKey]>;
349
- readonly $externalErrors?: string[];
350
361
  readonly $errors: string[];
351
362
  readonly $silentErrors: string[];
363
+ readonly $externalErrors?: string[];
352
364
  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>;
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>;
354
366
  };
355
367
  }
356
368
  /**
@@ -392,8 +404,11 @@ type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata exte
392
404
  /**
393
405
  * @public
394
406
  */
395
- interface RegleCollectionStatus<TRules extends RegleRuleDecl | ReglePartialValidationTree<any>, TState extends any[]> extends RegleFieldStatus<TRules, TState> {
396
- 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>;
397
412
  }
398
413
 
399
414
  /**
@@ -442,16 +457,9 @@ declare function unwrapRuleParameters<TParams extends any[]>(params: ParamDecl[]
442
457
 
443
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>;
444
459
 
445
- /**
446
- * Root function that allows you to define project-wise all your custom rules or overwrite default ones
447
- *
448
- * It will return utility functions that let you build type-safe forms
449
- *
450
- * @param customRules
451
- */
452
- declare function defineRegleConfig<TCustomRules extends Partial<AllRulesDeclarations>>({ rules, options, }: {
460
+ declare function defineRegleConfig<TCustomRules extends Partial<AllRulesDeclarations>>({ rules, modifiers, }: {
453
461
  rules?: () => TCustomRules;
454
- options?: RegleBehaviourOptions;
462
+ modifiers?: RegleBehaviourOptions;
455
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>;
456
464
 
457
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 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';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,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.2",
4
+ "description": "Typescript-first model-based validation library for Vue 3",
5
5
  "peerDependencies": {
6
6
  "vue": "^3.1.0"
7
7
  },