@regle/core 0.0.15 → 0.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ import * as vue from 'vue';
2
2
  import { MaybeRef, ComputedRef, Ref, UnwrapNestedRefs } from 'vue';
3
3
 
4
4
  type Maybe<T = any> = T | null | undefined;
5
- type MaybeGetter<T, V = any> = T | ((value: V) => T);
5
+ type MaybeGetter<T, V = any> = T | ((value: 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]>;
@@ -14,6 +14,106 @@ type NonPresentKeys<TSource extends Record<string, any>, Target extends Record<s
14
14
 
15
15
  type ArrayElement<T> = T extends Array<infer U> ? U : never;
16
16
 
17
+ declare global {
18
+ // eslint-disable-next-line @typescript-eslint/consistent-type-definitions -- It has to be an `interface` so that it can be merged.
19
+ interface SymbolConstructor {
20
+ readonly observable: symbol;
21
+ }
22
+ }
23
+
24
+ declare const emptyObjectSymbol: unique symbol;
25
+
26
+ /**
27
+ Represents a strictly empty plain object, the `{}` value.
28
+
29
+ When you annotate something as the type `{}`, it can be anything except `null` and `undefined`. This means that you cannot use `{}` to represent an empty plain object ([read more](https://stackoverflow.com/questions/47339869/typescript-empty-object-and-any-difference/52193484#52193484)).
30
+
31
+ @example
32
+ ```
33
+ import type {EmptyObject} from 'type-fest';
34
+
35
+ // The following illustrates the problem with `{}`.
36
+ const foo1: {} = {}; // Pass
37
+ const foo2: {} = []; // Pass
38
+ const foo3: {} = 42; // Pass
39
+ const foo4: {} = {a: 1}; // Pass
40
+
41
+ // With `EmptyObject` only the first case is valid.
42
+ const bar1: EmptyObject = {}; // Pass
43
+ const bar2: EmptyObject = 42; // Fail
44
+ const bar3: EmptyObject = []; // Fail
45
+ const bar4: EmptyObject = {a: 1}; // Fail
46
+ ```
47
+
48
+ Unfortunately, `Record<string, never>`, `Record<keyof any, never>` and `Record<never, never>` do not work. See {@link https://github.com/sindresorhus/type-fest/issues/395 #395}.
49
+
50
+ @category Object
51
+ */
52
+ type EmptyObject = {[emptyObjectSymbol]?: never};
53
+
54
+ interface RegleBehaviourOptions {
55
+ /**
56
+ * Only display error when calling `validateForm()`
57
+ * @default false
58
+ */
59
+ lazy?: boolean;
60
+ /**
61
+ * Automaticaly set the dirty set without the need of `$value` or `$touch`
62
+ * @default true
63
+ */
64
+ autoDirty?: boolean;
65
+ /**
66
+ * The fields will turn valid when they are, but not invalid unless calling `validateForm()`
67
+ * @default false
68
+ *
69
+ * @experimental report any bug
70
+ */
71
+ rewardEarly?: boolean;
72
+ }
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>;
75
+ validationGroups?: (fields: RegleStatus<TState, TRules>['$fields']) => TValidationGroups;
76
+ }
77
+ type RegleValidationGroupEntry = RegleFieldStatus<any, any, any> | RegleCollectionStatus<any, any>;
78
+ interface RegleValidationGroupOutput {
79
+ $invalid: boolean;
80
+ $error: boolean;
81
+ $pending: boolean;
82
+ $dirty: boolean;
83
+ $valid: boolean;
84
+ $errors: string[];
85
+ $silentErrors: string[];
86
+ }
87
+ type FieldRegleBehaviourOptions = AddDollarToOptions<RegleBehaviourOptions> & {
88
+ $debounce?: number;
89
+ };
90
+ type AddDollarToOptions<T extends Record<string, any>> = {
91
+ [K in keyof T as `$${string & K}`]: T[K];
92
+ };
93
+
94
+ interface Regle<TState extends Record<string, any> = EmptyObject, TRules extends ReglePartialValidationTree<TState, CustomRulesDeclarationTree> = EmptyObject, TExternal extends RegleExternalErrorTree<TState> = never, TValidationGroups extends Record<string, RegleValidationGroupEntry[]> = never> {
95
+ regle: RegleStatus<TState, TRules, TValidationGroups>;
96
+ /** Show active errors based on your behaviour options (lazy, autoDirty)
97
+ * It allow you to skip scouting the `regle` object
98
+ */
99
+ errors: RegleErrorTree<TRules, TExternal>;
100
+ invalid: ComputedRef<boolean>;
101
+ resetForm: () => void;
102
+ validateForm: () => Promise<false | DeepSafeFormState<TState, TRules>>;
103
+ state: Ref<TState>;
104
+ }
105
+ type DeepReactiveState<T extends Record<string, any>> = {
106
+ [K in keyof T]: MaybeRef<T[K]>;
107
+ };
108
+ type DeepSafeFormState<TState extends Record<string, any>, TRules extends ReglePartialValidationTree<TState, CustomRulesDeclarationTree>> = [unknown] extends [TState] ? object : {
109
+ [K in keyof TState as [SafeProperty<TState[K], TRules[K]>] extends [never] ? K : never]?: [
110
+ SafeProperty<TState[K], TRules[K]>
111
+ ] extends [never] ? TState[K] : SafeProperty<TState[K], TRules[K]>;
112
+ } & {
113
+ [K in keyof TState as [SafeProperty<TState[K], TRules[K]>] extends [never] ? never : K]-?: SafeProperty<TState[K], TRules[K]>;
114
+ };
115
+ type SafeProperty<TState, TRule extends RegleFormPropertyType<any, any> | undefined = never> = TRule extends RegleCollectionRuleDefinition ? TState extends Array<any> ? SafeProperty<TState[number], ExtractFromGetter<TRule['$each']>>[] : never : TRule extends ReglePartialValidationTree<any, any> ? TState extends Record<string, any> ? DeepSafeFormState<TState, TRule> : never : TRule extends RegleRuleDecl<any, any> ? unknown extends TRule['required'] ? never : TRule['required'] extends undefined ? never : TRule['required'] extends RegleRuleDefinition<any, infer Params> ? Params extends never[] ? TState : never : never : never;
116
+
17
117
  type ParamDecl<T = any> = MaybeRef<Maybe<T>> | (() => Maybe<T>);
18
118
  type CreateFn<T extends any[]> = (...args: T) => any;
19
119
  /**
@@ -156,95 +256,6 @@ type CustomRulesDeclarationTree = {
156
256
  };
157
257
  type AllRulesDeclarations = CustomRulesDeclarationTree & DefaultValidators;
158
258
 
159
- declare global {
160
- // eslint-disable-next-line @typescript-eslint/consistent-type-definitions -- It has to be an `interface` so that it can be merged.
161
- interface SymbolConstructor {
162
- readonly observable: symbol;
163
- }
164
- }
165
-
166
- declare const emptyObjectSymbol: unique symbol;
167
-
168
- /**
169
- Represents a strictly empty plain object, the `{}` value.
170
-
171
- When you annotate something as the type `{}`, it can be anything except `null` and `undefined`. This means that you cannot use `{}` to represent an empty plain object ([read more](https://stackoverflow.com/questions/47339869/typescript-empty-object-and-any-difference/52193484#52193484)).
172
-
173
- @example
174
- ```
175
- import type {EmptyObject} from 'type-fest';
176
-
177
- // The following illustrates the problem with `{}`.
178
- const foo1: {} = {}; // Pass
179
- const foo2: {} = []; // Pass
180
- const foo3: {} = 42; // Pass
181
- const foo4: {} = {a: 1}; // Pass
182
-
183
- // With `EmptyObject` only the first case is valid.
184
- const bar1: EmptyObject = {}; // Pass
185
- const bar2: EmptyObject = 42; // Fail
186
- const bar3: EmptyObject = []; // Fail
187
- const bar4: EmptyObject = {a: 1}; // Fail
188
- ```
189
-
190
- Unfortunately, `Record<string, never>`, `Record<keyof any, never>` and `Record<never, never>` do not work. See {@link https://github.com/sindresorhus/type-fest/issues/395 #395}.
191
-
192
- @category Object
193
- */
194
- type EmptyObject = {[emptyObjectSymbol]?: never};
195
-
196
- interface Regle<TState extends Record<string, any> = EmptyObject, TRules extends ReglePartialValidationTree<TState, CustomRulesDeclarationTree> = EmptyObject, TExternal extends RegleExternalErrorTree<TState> = never> {
197
- regle: RegleStatus<TState, TRules>;
198
- /** Show active errors based on your behaviour options (lazy, autoDirty)
199
- * It allow you to skip scouting the `regle` object
200
- */
201
- errors: RegleErrorTree<TRules, TExternal>;
202
- invalid: ComputedRef<boolean>;
203
- resetForm: () => void;
204
- validateForm: () => Promise<false | DeepSafeFormState<TState, TRules>>;
205
- state: Ref<TState>;
206
- }
207
- type DeepReactiveState<T extends Record<string, any>> = {
208
- [K in keyof T]: MaybeRef<T[K]>;
209
- };
210
- type DeepSafeFormState<TState extends Record<string, any>, TRules extends ReglePartialValidationTree<TState, CustomRulesDeclarationTree>> = [unknown] extends [TState] ? {} : {
211
- [K in keyof TState as [SafeProperty<TState[K], TRules[K]>] extends [never] ? K : never]?: [
212
- SafeProperty<TState[K], TRules[K]>
213
- ] extends [never] ? TState[K] : SafeProperty<TState[K], TRules[K]>;
214
- } & {
215
- [K in keyof TState as [SafeProperty<TState[K], TRules[K]>] extends [never] ? never : K]-?: SafeProperty<TState[K], TRules[K]>;
216
- };
217
- type SafeProperty<TState, TRule extends RegleFormPropertyType<any, any> | undefined = never> = TRule extends RegleCollectionRuleDefinition ? TState extends Array<any> ? SafeProperty<TState[number], ExtractFromGetter<TRule['$each']>>[] : never : TRule extends ReglePartialValidationTree<any, any> ? TState extends Record<string, any> ? DeepSafeFormState<TState, TRule> : never : TRule extends RegleRuleDecl<any, any> ? unknown extends TRule['required'] ? never : TRule['required'] extends undefined ? never : TRule['required'] extends RegleRuleDefinition<any, infer Params> ? Params extends never[] ? TState : never : never : never;
218
-
219
- interface RegleBehaviourOptions {
220
- /**
221
- * Only display error when calling `validateForm()`
222
- * @default false
223
- */
224
- lazy?: boolean;
225
- /**
226
- * Automaticaly set the dirty set without the need of `$value` or `$touch`
227
- * @default true
228
- */
229
- autoDirty?: boolean;
230
- /**
231
- * The fields will turn valid when they are, but not invalid unless calling `validateForm()`
232
- * @default false
233
- *
234
- * @experimental report any bug
235
- */
236
- rewardEarly?: boolean;
237
- }
238
- interface LocalRegleBehaviourOptions<TState extends Record<string, any>, TExternal extends RegleExternalErrorTree<TState>> {
239
- $externalErrors?: MaybeRef<TExternal>;
240
- }
241
- type FieldRegleBehaviourOptions = AddDollarToOptions<RegleBehaviourOptions> & {
242
- $debounce?: number;
243
- };
244
- type AddDollarToOptions<T extends Record<string, any>> = {
245
- [K in keyof T as `$${string & K}`]: T[K];
246
- };
247
-
248
259
  /**
249
260
  * @public
250
261
  */
@@ -317,11 +328,15 @@ type RegleExternalValidationErrorsReport<TExternalError extends RegleExternalVal
317
328
  /**
318
329
  * @public
319
330
  */
320
- interface RegleStatus<TState extends Record<string, any> = Record<string, any>, TRules extends ReglePartialValidationTree<TState> = Record<string, any>> extends RegleCommonStatus<TState> {
331
+ type RegleStatus<TState extends Record<string, any> = Record<string, any>, TRules extends ReglePartialValidationTree<TState> = Record<string, any>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]> = never> = RegleCommonStatus<TState> & {
321
332
  readonly $fields: {
322
333
  readonly [TKey in keyof TRules]: InferRegleStatusType<NonNullable<TRules[TKey]>, TState, TKey>;
323
334
  };
324
- }
335
+ } & ([TValidationGroups] extends [never] ? object : {
336
+ $groups: {
337
+ readonly [TKey in keyof TValidationGroups]: RegleValidationGroupOutput;
338
+ };
339
+ });
325
340
  /**
326
341
  * @public
327
342
  */
@@ -332,8 +347,10 @@ type InferRegleStatusType<TRule extends RegleCollectionRuleDecl | RegleRuleDecl
332
347
  interface RegleFieldStatus<TRules extends RegleFormPropertyType<any, Partial<AllRulesDeclarations>> = Record<string, any>, TState extends Record<PropertyKey, any> = any, TKey extends PropertyKey = string> extends RegleCommonStatus<TState> {
333
348
  $value: UnwrapNestedRefs<TState[TKey]>;
334
349
  readonly $externalErrors?: string[];
350
+ readonly $errors: string[];
351
+ readonly $silentErrors: string[];
335
352
  readonly $rules: {
336
- readonly [TRuleKey in keyof TRules]: RegleRuleStatus<TState[TKey], TRules[TRuleKey] extends RegleRuleDefinition<any, infer TParams> ? TParams : []>;
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>;
337
354
  };
338
355
  }
339
356
  /**
@@ -346,7 +363,7 @@ interface RegleCommonStatus<TValue = any> {
346
363
  readonly $anyDirty: boolean;
347
364
  readonly $pending: boolean;
348
365
  readonly $error: boolean;
349
- $id?: number;
366
+ $id?: string;
350
367
  $value: UnwrapNestedRefs<TValue>;
351
368
  $touch(): void;
352
369
  $reset(): void;
@@ -358,17 +375,18 @@ interface RegleCommonStatus<TValue = any> {
358
375
  /**
359
376
  * @public
360
377
  */
361
- type RegleRuleStatus<TValue = any, TParams extends any[] = any[]> = {
378
+ type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata extends RegleRuleMetadataDefinition = never> = {
362
379
  readonly $type: string;
363
380
  readonly $message: string | string[];
364
381
  readonly $active: boolean;
365
382
  readonly $valid: boolean;
366
383
  readonly $pending: boolean;
367
384
  readonly $path: string;
385
+ readonly $metadata: TMetadata;
368
386
  $validator: (value: TValue, ...args: TParams) => boolean | Promise<boolean>;
369
387
  $validate(): Promise<boolean>;
370
388
  $reset(): void;
371
- } & ([TParams] extends [[]] ? {} : {
389
+ } & ([TParams] extends [[]] ? object : {
372
390
  readonly $params: TParams;
373
391
  });
374
392
  /**
@@ -422,7 +440,7 @@ declare function defineType<TValue extends any = unknown, TParams extends any[]
422
440
  */
423
441
  declare function unwrapRuleParameters<TParams extends any[]>(params: ParamDecl[]): TParams;
424
442
 
425
- declare const useRegle: <TState extends Record<string, any>, TRules extends ReglePartialValidationTree<TState, Partial<AllRulesDeclarations>>, TExternal extends RegleExternalErrorTree<TState>, 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, TExternal>) | undefined) => Regle<TState, TRules, TExternal>;
443
+ 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>;
426
444
 
427
445
  /**
428
446
  * Root function that allows you to define project-wise all your custom validators or overwrite default ones
@@ -434,6 +452,6 @@ declare const useRegle: <TState extends Record<string, any>, TRules extends Regl
434
452
  declare function defineRegleConfig<TCustomRules extends Partial<AllRulesDeclarations>>({ rules, options, }: {
435
453
  rules?: () => TCustomRules;
436
454
  options?: RegleBehaviourOptions;
437
- }): <TState extends Record<string, any>, TRules extends ReglePartialValidationTree<TState, Partial<AllRulesDeclarations> & TCustomRules>, TExternal extends RegleExternalErrorTree<TState>, TValid = keyof TRules extends keyof TState ? true : false>(state: vue.MaybeRef<TState> | DeepReactiveState<TState>, rulesFactory: TValid extends true ? TRules | ComputedRef<TRules> | (() => TRules) : never, options?: (Partial<DeepMaybeRef<RegleBehaviourOptions>> & LocalRegleBehaviourOptions<TState, TExternal>) | undefined) => Regle<TState, TRules, TExternal>;
455
+ }): <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>;
438
456
 
439
457
  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{isRef as He,toRef as qe,unref as Le}from"vue";function F(e){return e.map(r=>r instanceof Function?r():Le(r))}function Ee(e){return e.map(r=>r instanceof Function||He(r)?r:qe(()=>r))}function De(e){let r=e.toString();return(r.includes("=>")?r.split("=>")[0]:r).slice(r.indexOf("(")+1,r.indexOf(")")).split(",").map(o=>o.trim()).filter(o=>o.includes("=")).length+e.length}function ie(e,...r){let{message:t,validator:n,active:a,...o}=e,$=n.constructor.name==="AsyncFunction";return{...{validator(l,...c){return e.validator(l,...F(c.length?c:r))},message(l,c){return typeof e.message=="function"?e.message(l,{...c,$params:F(c.$params?.length?c.$params:r)}):e.message},active(l,c){return typeof e.active=="function"?e.active(l,{...c,$params:F(c.$params?.length?c.$params:r)}):e.active??!0},exec(l){let c=e.validator(l,...F(r)),f;return c instanceof Promise?c.then(m=>(f=m,typeof f=="object"&&"$valid"in f?f.$valid:typeof f=="boolean"?f:!1)):(f=c,typeof f=="object"&&"$valid"in f?f.$valid:typeof f=="boolean"?f:!1)}},...o,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:$,_params:Ee(r)}}function ce(e){if(typeof e.validator=="function"){let t=ie(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(De(e.validator)>1){let a=function(...o){return ie(e,...o)};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 fe(e){return e}import{computed as We,isRef as H,ref as yt,toRaw as vt}from"vue";function A(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ie(e){return A(e.value)}function G(e){let r=e;var t={}.toString.call(e).slice(8,-1);if(t=="Set")return new Set([...e].map(a=>G(a)));if(t=="Map")return new Map([...e].map(a=>[G(a[0]),G(a[1])]));if(t=="Date")return new Date(e.getTime());if(t=="RegExp")return RegExp(e.source,Je(e));if(t=="Array"||t=="Object"){r=Array.isArray(e)?[]:{};for(var n in e)r[n]=G(e[n])}return r}function Je(e){if(typeof e.source.flags=="string")return e.source.flags;var 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 V(e,r){return e instanceof Function?e(r):e}function Ce(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}import{effectScope as Ot,getCurrentScope as Mt,onScopeDispose as Ft}from"vue";function Re(e,r,t){let n,a=(...o)=>new Promise($=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,t||Promise.resolve(e.apply(this,[...o])).then($)},r),t&&!n&&Promise.resolve(e.apply(this,[...o])).then($)});return a.cancel=()=>{clearTimeout(n),n=void 0},a.doImmediately=(...o)=>new Promise($=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...o])).then($)},0)}),a}import{computed as pt,reactive as dt,unref as mt}from"vue";import{onScopeDispose as Qe,ref as W,shallowRef as z}from"vue";function pe(){let e=z(new Map),r=z(new Map),t=z(new Map),n=z(new Map),a=z(new Map),o=z(new Map);function $(R){let y=r.value.get(R);if(y)return y;{let g=W({});return r.value.set(R,g),g}}function D(R){let y=t.value.get(R);if(y)return y;{let g=W([]);return t.value.set(R,g),g}}function E(R,y,g){o.value.set(`${R}-${y}`,g)}function l(R,y){return o.value.get(`${R}-${y}`)}function c(R,y){R&&y!=null&&o.value.delete(`${R}-${y}`)}function f(R,y){n.value.set(R,y)}function m(R){return n.value.get(R)??!1}function s(R,y){e.value.set(R,y)}function I(R,y){let g=e.value.get(R);return g?P(y,g)?{valid:!0}:{valid:!1}:void 0}function P(R,y){let g=Object.keys(y),u=Object.keys(R);return u.length!==g.length||!u.every(S=>g.includes(S))?!1:u.every(S=>{let d=R[S],v=y[S];return!v||!d||typeof d=="function"||typeof v=="function"||typeof d=="number"||typeof d=="boolean"?!1:d._params?d._params?.every((C,x)=>{if(typeof v=="number"||typeof v=="boolean")return!0;{let p=F(v._params),M=F(d._params);return p?.[x]===M?.[x]}}):!0})}function O(R){let y=a.value.get(R);if(y)return y;{let g=W(!1),u=W(!0),i=W({}),S=W(!1);return a.value.set(R,{$pending:g,$valid:u,$metadata:i,$validating:S}),{$pending:g,$valid:u,$metadata:i,$validating:S}}}return Qe(()=>{e.value.clear(),r.value.clear(),t.value.clear(),n.value.clear(),a.value.clear(),o.value.clear()}),{addRuleDeclEntry:s,setDirtyEntry:f,checkRuleDeclEntry:I,getDirtyState:m,trySetRuleStatusRef:O,getFieldsEntry:$,getCollectionsEntry:D,getArrayStatus:l,addArrayStatus:E,deleteArrayStatus:c,arrayStatusStorage:o}}import{computed as Xe}from"vue";function we(e,r){let t=V(r.value,e.value);return A(e.value)&&A(t)&&!Object.entries(t).some(n=>de(n))}function Pe(e,r){let t=V(e.value,r.value);return!!t&&"$each"in t}function Oe(e){return!!e&&A(e.value)}function de(e){return A(e)&&"_validator"in e}function J(e){return typeof e.value!="function"}function Q(e){return A(e)&&"$fields"in e}function X(e){return!!e&&"$each"in e}function Y(e){return!!e&&"$rules"in e}function me(e){return"$each"in e||"$errors"in e}function le(e,r){return Object.entries(e).map(([t,n])=>n.$valid?null:n.$message).filter(t=>!!t).reduce((t,n)=>typeof n=="string"?t?.concat([n]):t?.concat(n),[]).concat(r??[])}function Me(e){return Q(e)?ye(e.$fields):X(e)?{$errors:e.$rules?le(e.$rules):[],$each:e.$each.map(Me)}:Y(e)?e.$error?le(e.$rules,e.$externalErrors):e.$externalErrors??[]:[]}function Ye(e){return e.$each.map(Me)}function ye(e){return Object.fromEntries(Object.entries(e).map(([r,t])=>Q(t)?[r,ye(t.$fields)]:X(t)?[r,{...t.$rules&&{$errors:le(t.$rules)},$each:Ye(t)}]:Y(t)?t.$error?[r,le(t.$rules,t.$externalErrors)]:[r,t.$externalErrors??[]]:[r,[]]))}function Fe(e){return Xe(()=>ye(e.$fields))}import{effectScope as ut,reactive as it,toRef as te,triggerRef as ct,watch as Ge,computed as U,unref as ft,ref as Rt}from"vue";import{pauseTracking as Ve,resetTracking as Be}from"@vue/reactivity";import{computed as k,effectScope as nt,reactive as at,ref as $e,toRaw as lt,toRef as N,toRefs as ke,watch as ot}from"vue";function Ze(){return Math.floor(Math.random()*Date.now()).toString()}function ve(){return typeof window>"u"?Ze():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(8)}import{computed as _,effectScope as _e,reactive as tt,ref as Z,toRef as rt,unref as ge,watch as K}from"vue";import{computed as B,effectScope as Ae,reactive as Ke,watch as et}from"vue";var oe=(t=>(t.Inline="__inline",t.Async="__async",t))(oe||{});function je({$dirty:e,customMessages:r,rule:t,ruleKey:n,state:a,path:o,storage:$,options:D}){let E=Ae(),l,c,{$pending:f,$valid:m,$metadata:s,$validating:I}=$.trySetRuleStatusRef(`${o}.${n}`);function P(){l=E.run(()=>{let g=B(()=>({$invalid:!m.value,$params:v.value,...s.value})),u=B(()=>J(t)?typeof t.value.active=="function"?t.value.active(a.value,g.value):t.value.active:!0),i=B(()=>{let x="";if(e.value&&!I.value){let p=r?r[n]?.message:void 0;p&&(typeof p=="function"?x=p(a.value,g.value):x=p),J(t)&&(p&&!t.value._patched||(typeof t.value.message=="function"?x=t.value.message(a.value,g.value):x=t.value.message)),Ce(x)&&(x="Error",console.warn(`No error message defined for ${o}.${n}`))}return x}),S=B(()=>J(t)&&t.value.type?Object.values(oe).includes(t.value.type)?n:t.value.type:n),d=B(()=>J(t)?t.value.validator:t.value),v=B(()=>typeof t.value=="function"?[]:F(t.value._params??[])),C=B(()=>`${o}.${S.value}`);return{$active:u,$message:i,$type:S,$validator:d,$params:v,$path:C}}),c=et(l.$params,O,{deep:!0})}P();async function O(){I.value=!0;let g=l.$validator.value,u=!1,i=g(a.value,...l.$params.value);if(i instanceof Promise){if(!f.value)try{m.value=!0,e.value&&(f.value=!0);let S=await i;if(typeof S=="boolean")u=S;else{let{$valid:d,...v}=S;u=d,s.value=v}}catch{u=!1}finally{f.value=!1}}else if(i!=null)if(typeof i=="boolean")u=i;else{let{$valid:S,...d}=i;u=S,s.value=d}return m.value=u,D.$externalErrors,I.value=!1,u}function R(){m.value=!0,s.value={},f.value=!1,I.value=!1,P()}function y(){c(),E.stop(),E=Ae()}return Ke({...l,$pending:f,$valid:m,$validate:O,$unwatch:y,$watch:P,$reset:R})}function se({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:o,externalErrors:$,onUnwatch:D}){let E=_e(),l,c=Z(!1),f=Z(!1),m=Z([]),s,I,P,O,R=()=>{};function y(){m.value=$.value??[]}y();function g(){let h=r.value,T=a.checkRuleDeclEntry(n,h);v.value=Object.fromEntries(Object.entries(h).filter(([b])=>b.startsWith("$")));let w=V(r.value,e.value);d.value=Object.fromEntries(Object.entries(w).filter(([b])=>!b.startsWith("$")).map(([b,j])=>{if(j){let ne=rt(()=>j);return[b,je({$dirty:c,customMessages:t,rule:ne,ruleKey:b,state:e,path:n,storage:a,options:o})]}return[]}).filter(b=>!!b.length)),i(),R=l.$debounce.value?Re(S,l.$debounce.value??0):S,T?.valid!=null&&(c.value=a.getDirtyState(n),c.value&&R()),a.addRuleDeclEntry(n,h)}function u(){d.value&&Object.entries(d.value).forEach(([h,T])=>{T.$unwatch()}),O(),c.value&&a.setDirtyEntry(n,c.value),s(),I(),P(),E.stop(),E=_e(),D?.()}function i(){d.value&&Object.entries(d.value).forEach(([h,T])=>{T.$watch()}),l=E.run(()=>{let h=_(()=>c.value),T=_(()=>v.value.$debounce),w=_(()=>v.value.$lazy?v.value.$lazy:ge(o.lazy)),b=_(()=>v.value.$rewardEarly?v.value.$rewardEarly:ge(o.rewardEarly)),j=_(()=>v.value.$autoDirty?v.value.$autoDirty:ge(o.autoDirty)),ne=_(()=>ue.value&&!q.value&&c.value),q=_(()=>f.value||!b.value?Object.entries(d.value).some(([ae,L])=>L.$pending):!1),ue=_(()=>m.value?.length?!0:!b.value||b.value&&f.value?Object.entries(d.value).some(([ae,L])=>!L.$valid):!1),xe=_(()=>m.value?.length?!1:b.value?Object.entries(d.value).every(([ae,L])=>L.$valid):!ue.value);return K(xe,ae=>{ae&&(f.value=!1)}),{$error:ne,$pending:q,$invalid:ue,$valid:xe,$debounce:T,$lazy:w,$rewardEarly:b,$autoDirty:j,$anyDirty:h}}),P=K($,y),s=K(e,()=>{l.$autoDirty.value&&(c.value||(c.value=!0)),r.value instanceof Function&&g(),l.$lazy.value||(R(),l.$rewardEarly.value)}),O=K(c,()=>{a.setDirtyEntry(n,c.value),p()}),I=K(l.$valid,h=>{l.$rewardEarly.value&&h&&(f.value=!1)})}function S(){Object.entries(d.value).forEach(([h,T])=>{T.$validate()})}let d=Z(),v=Z();g();function C(){c.value=!1,m.value=[],Object.entries(d.value).forEach(([h,T])=>{T.$reset()})}function x(){c.value=!0,l.$lazy.value||l.$rewardEarly.value}let p=l.$debounce.value?Re(M,l.$debounce.value??0):M;async function M(){try{if(f.value=!0,!l.$lazy.value&&l.$anyDirty.value&&!l.$pending)return!l.$error.value;{let h=Object.entries(d.value).map(([w,b])=>b.$validate());return(await Promise.allSettled(h)).every(w=>w.status==="fulfilled"?w.value:!1)}}catch{return!1}}function re(){m.value=[]}return tt({$dirty:c,$anyDirty:l.$anyDirty,$invalid:l.$invalid,$error:l.$error,$pending:l.$pending,$valid:l.$valid,$externalErrors:m,$value:e,$rules:d,$reset:C,$touch:x,$validate:p,$unwatch:u,$watch:i,$clearExternalErrors:re})}function Se({$id:e,path:r,index:t,options:n,storage:a,value:o,customMessages:$,rules:D,externalErrors:E}){let l=ve(),c=`${r}.${l}`;typeof o[t]=="object"&&o[t]!=null&&(o[t].$id||Object.defineProperties(o[t],{$id:{value:l,enumerable:!1,configurable:!1,writable:!1}}));let f=ke(o),m=N(()=>E.value?.[t]),s=ee({state:f[t],rulesDef:N(()=>D),customMessages:$,path:c,storage:a,options:n,externalErrors:m});if(s){let I=o[t]?.$id;s.$id=I??l,a.addArrayStatus(e,t,s)}return s}function st({path:e,index:r,options:t,storage:n,value:a,customMessages:o,rules:$,externalErrors:D}){let E=ke(a),l=N(()=>D.value?.[r]);return ee({state:E[r],rulesDef:N(()=>$),customMessages:o,path:e,storage:n,options:t,externalErrors:l})}function Ne({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:o,externalErrors:$}){let D=nt(),E;if(Array.isArray(e.value)&&!r.value.$each)return null;let l=$e(),c=$e(e.value),f=null,m=$e({}),s=a.getCollectionsEntry(n);O(),I();function I(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(l.value=ve(),Object.defineProperties(e.value,{$id:{value:l.value,enumerable:!1,configurable:!1,writable:!1}})):l.value=e.value?.$id);let{$each:u,$debounce:i,$autoDirty:S,$lazy:d,$rewardEarly:v,...C}=r.value,x=N(()=>{if($.value&&me($.value))return $.value.$errors}),p=N(()=>{if($.value&&me($.value))return $.value.$each});if(Array.isArray(e.value)){let M={};["pop","shift","unshift","splice"].forEach(h=>{M[h]=function(...T){Ve(),s.value.forEach(b=>{b.$unwatch(),a.deleteArrayStatus(l.value,b.$id)}),s.value[h](...T);let w=Object.assign([],this)[h].apply(this,T);return s.value=s.value.map((b,j)=>A(b)&&(Y(b)||X(b)||Q(b))&&b.$id!=null?st({$id:l.value,path:`${n}.${b.$id}`,rules:u,value:e.value,index:j,options:o,storage:a,externalErrors:p}):Se({$id:l.value,path:n,rules:u,value:e.value,index:j,options:o,storage:a,externalErrors:p})).filter(b=>!!b),Be(),w}});let re=new Proxy(lt(e.value),{get(h,T,w){let b=Reflect.get(h,T,w);return typeof T=="symbol"?b:Array.isArray(h)&&Object.hasOwn(M,T)?Reflect.get(M,T,w):b},deleteProperty(h,T){let w=Reflect.deleteProperty(h,T);return typeof T=="symbol"?!0:(isNaN(parseInt(T))||(s.value.splice(parseInt(T),1),a.deleteArrayStatus(l.value,parseInt(T))),w)},set(h,T,w){let b=Reflect.set(h,T,w);if(typeof T=="symbol")return!0;if(!isNaN(parseInt(T))){let j=parseInt(T);if(!s.value[j]&&r.value.$each){let q=Se({$id:l.value,value:e.value,rules:r.value.$each,customMessages:t,path:n,storage:a,options:o,index:j,externalErrors:p});q&&(s.value[j]=q)}}return b}});Ve(),e.value=re,Be()}if(m.value=se({state:e,rulesDef:N(()=>C),customMessages:t,path:n,storage:a,options:o,externalErrors:x}),c.value=m.value.$value,Array.isArray(e.value)&&u)for(let[M,re]of e.value.entries()){let h=Se({$id:l.value,path:n,rules:u,value:e.value,index:M,options:o,storage:a,externalErrors:p});h&&(s.value[M]=h)}else s.value=[]}function P(){f&&f(),m.value&&m.value.$unwatch(),s.value&&s.value.forEach(u=>{"$dirty"in u&&u.$unwatch()})}function O(){f=ot(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")&&I()}),E=D.run(()=>{let u=k(()=>Array.isArray(e.value)&&e.value.length?e.value.some(p=>typeof p!="object"):r.value.$each?Object.values(r.value.$each).every(p=>de(p)):!1),i=k(()=>m.value.$dirty&&s.value.every(p=>p.$dirty)),S=k(()=>m.value.$anyDirty||s.value.some(p=>p.$dirty)),d=k(()=>m.value.$invalid||s.value.some(p=>p.$invalid)),v=k(()=>!d.value),C=k(()=>m.value.$error||s.value.some(p=>p.$error)),x=k(()=>m.value.$pending||s.value.some(p=>p.$pending));return{isPrimitiveArray:u,$dirty:i,$anyDirty:S,$invalid:d,$valid:v,$error:C,$pending:x}})}function R(){m.value.$touch(),s.value.forEach(u=>{"$dirty"in u&&u.$touch()})}function y(){m.value.$reset(),s.value.forEach(u=>{"$dirty"in u&&u.$reset()}),m.value.$watch()}async function g(){try{return(await Promise.all([m.value.$validate(),...s.value.map(i=>{if("$dirty"in i)return i.$validate()})])).every(i=>!!i)}catch{return!1}}return at({...m.value,$value:c,...E,$each:s,$validate:g,$unwatch:P,$watch:O,$touch:R,$reset:y})}function be({scopeRules:e,state:r,customMessages:t,path:n="",rootRules:a,storage:o,options:$,externalErrors:D}){let E,l,c,f;function m(u=!0){s.value=null,ct(s);let i=V(e.value,r.value),S=Object.fromEntries(Object.entries(i).map(([v,C])=>{if(C){let x=te(r.value,v),p=te(()=>C),M=te(()=>D.value?.[v]);return[v,ee({state:x,rulesDef:p,customMessages:t,path:n?`${n}.${v}`:v,storage:o,options:$,externalErrors:M})]}return[]}).filter(v=>!!v.length&&v[1]!=null)),d=Object.fromEntries(Object.entries(ft(D)??{}).filter(([v])=>!(v in i)).map(([v,C])=>{if(C){let x=te(()=>({})),p=te(()=>C);return[v,ee({state:Rt(void 0),rulesDef:x,customMessages:t,path:n?`${n}.${v}`:v,storage:o,options:$,externalErrors:p})]}return[]}));s.value={...S,...d},u&&R()}let s=o.getFieldsEntry(n);m();function I(){m(!1),Object.entries(s.value).forEach(([u,i])=>{i.$reset()}),R()}function P(){Object.entries(s.value).forEach(([u,i])=>{i.$touch()})}async function O(){try{return(await Promise.allSettled(Object.entries(s.value).map(([i,S])=>S.$validate()))).every(i=>i.status==="fulfilled"?i.value:!1)}catch{return!1}}function R(){a&&(c=Ge(a,()=>{y(),m()},{deep:!0,flush:"post"})),e.value instanceof Function&&(f=Ge(r,()=>{y(),m()},{deep:!0,flush:"post"})),E=ut(),l=E.run(()=>{let u=U(()=>Object.entries(s.value).every(([x,p])=>p.$dirty)),i=U(()=>Object.entries(s.value).some(([x,p])=>p.$dirty)),S=U(()=>Object.entries(s.value).some(([x,p])=>p.$invalid)),d=U(()=>!S.value),v=U(()=>Object.entries(s.value).some(([x,p])=>p.$error)),C=U(()=>Object.entries(s.value).some(([x,p])=>p.$pending));return{$dirty:u,$anyDirty:i,$invalid:S,$valid:d,$error:v,$pending:C}})}function y(){s.value&&Object.entries(s.value).forEach(([u,i])=>{i.$unwatch()}),c?.(),f?.()}function g(){Object.entries(s.value).forEach(([u,i])=>{i.$clearExternalErrors()})}return it({...l,$fields:s,$value:r,$reset:I,$touch:P,$validate:O,$unwatch:y,$watch:R,$clearExternalErrors:g})}function ee({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:o,externalErrors:$,onUnwatch:D}){return Pe(r,e)?Ne({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:o,externalErrors:$}):we(e,r)&&Ie(e)?be({scopeRules:r,state:e,customMessages:t,path:n,storage:a,options:o,externalErrors:$}):Oe(r)?se({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:o,externalErrors:$,onUnwatch:D}):null}function Te(e,r,t,n){let a=pe(),o=pt(()=>mt(t.$externalErrors)),$=dt(be({rootRules:e,scopeRules:e,state:r,customMessages:n?.(),storage:a,options:t,externalErrors:o})),D=Fe($);return{regle:$,errors:D}}function he(e,r){let t={autoDirty:r?.autoDirty??!0,lazy:r?.lazy??!1,rewardEarly:r?.rewardEarly??!1};function n(a,o,$){let D=H(o)?o:We(typeof o=="function"?o:()=>o),E={...t,...$},l=H(a)?a:yt(a),c=G(vt(l.value)),{regle:f,errors:m}=Te(D,l,E,e);function s(){f.$unwatch(),I(a,c),f.$reset(),f.$validate()}function I(R,y){Object.entries(y).forEach(([g,u])=>{let i=H(R)?R.value:R,S=H(i[g])?i[g].value:i[g],d=H(y[g])?y[g]._value:y[g];Array.isArray(d)&&Array.isArray(S)?d.forEach((v,C)=>{I(S[C],d[C])}):A(d)?I(S,d):H(i[g])?i[g].value=d:i[g]=d})}let P=We(()=>f.$invalid||f.$pending);async function O(){return f.$touch(),await f.$validate()?l.value:!1}return f.$validate(),{regle:f,errors:m,resetForm:s,validateForm:O,invalid:P,state:l}}return n}var ze=he();function Ue({rules:e,options:r}){return he(e,r)}export{oe as InternalRuleType,ce as createRule,Ue as defineRegleConfig,fe as defineType,F as unwrapRuleParameters,ze as useRegle};
1
+ import {unref,isRef,toRef,computed,ref,toRaw,reactive,shallowRef,onScopeDispose,triggerRef,watch,effectScope,toRefs}from'vue';import {pauseTracking,resetTracking}from'@vue/reactivity';function j(e){return e.map(r=>r instanceof Function?r():unref(r))}function De(e){return e.map(r=>r instanceof Function||isRef(r)?r:toRef(()=>r))}function Ie(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 ue(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:De(r)}}function ce(e){if(typeof e.validator=="function"){let t=ue(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(Ie(e.validator)>1){let a=function(...l){return ue(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 fe(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 Re(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 pe(){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=>de(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 de(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 me(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)?ye(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 ye(e){return Object.fromEntries(Object.entries(e).map(([r,t])=>K(t)?[r,ye(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(()=>ye(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 ge(){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?Re(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&&!xe.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})),xe=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),he=computed(()=>u.value?.length?!1:P.value?Object.entries($.value).every(([le,Y])=>Y.$valid):!ie.value);return watch(he,le=>{le&&(y.value=!1);}),{$error:H,$pending:xe,$invalid:ie,$valid:he,$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?Re(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 Se({$id:e,path:r,index:t,options:n,storage:a,value:l,customMessages:g,rules:h,externalErrors:C}){let d=ge(),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=ge(),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&&me(g.value))return g.value.$errors}),p=toRef(()=>{if(g.value&&me(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}):Se({$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=Se({$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=Se({$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=>de(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 be({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)?be({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 Ee(e,r,t,n){let a=pe(),l=computed(()=>unref(t.$externalErrors)),g=reactive(be({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 Te(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}=Ee(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=Te();function Je({rules:e,options:r}){return Te(e,r)}export{oe as InternalRuleType,ce as createRule,Je as defineRegleConfig,fe as defineType,j as unwrapRuleParameters,Le as useRegle};
package/package.json CHANGED
@@ -1,32 +1,32 @@
1
1
  {
2
2
  "name": "@regle/core",
3
- "version": "0.0.15",
3
+ "version": "0.0.16",
4
4
  "description": "Vue form validator",
5
5
  "peerDependencies": {
6
6
  "vue": "^3.1.0"
7
7
  },
8
8
  "devDependencies": {
9
- "@microsoft/api-extractor": "7.47.7",
9
+ "@microsoft/api-extractor": "7.47.11",
10
10
  "@total-typescript/ts-reset": "0.6.1",
11
- "@types/node": "22.5.3",
11
+ "@types/node": "22.9.0",
12
12
  "@types/prettier": "3.0.0",
13
- "@typescript-eslint/eslint-plugin": "8.4.0",
14
- "@typescript-eslint/parser": "8.4.0",
13
+ "@typescript-eslint/eslint-plugin": "8.14.0",
14
+ "@typescript-eslint/parser": "8.14.0",
15
15
  "@vue/test-utils": "2.4.6",
16
- "bumpp": "9.5.2",
17
- "changelogithub": "0.13.10",
16
+ "bumpp": "9.8.1",
17
+ "changelogithub": "0.13.11",
18
18
  "cross-env": "7.0.3",
19
- "eslint": "9.9.1",
19
+ "eslint": "9.14.0",
20
20
  "eslint-config-prettier": "9.1.0",
21
- "eslint-plugin-vue": "9.28.0",
21
+ "eslint-plugin-vue": "9.30.0",
22
22
  "prettier": "3.3.3",
23
- "tsup": "8.2.4",
24
- "type-fest": "4.26.0",
25
- "typescript": "5.5.4",
26
- "vitest": "2.0.5",
27
- "vue": "3.5.0",
23
+ "tsup": "8.3.5",
24
+ "type-fest": "4.26.1",
25
+ "typescript": "5.6.3",
26
+ "vitest": "2.1.4",
27
+ "vue": "3.5.12",
28
28
  "vue-eslint-parser": "9.4.3",
29
- "vue-tsc": "2.1.4"
29
+ "vue-tsc": "2.1.10"
30
30
  },
31
31
  "type": "module",
32
32
  "exports": {