@regle/core 0.0.15 → 0.1.0
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 +120 -102
- package/dist/index.js +1 -1
- package/package.json +16 -16
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
|
/**
|
|
@@ -76,7 +176,7 @@ type DefaultMetadataProperties = Pick<ExcludeByType<RegleCommonStatus, Function>
|
|
|
76
176
|
/**
|
|
77
177
|
* Will be used to consumme metadata on related helpers and rule status
|
|
78
178
|
*/
|
|
79
|
-
type RegleRuleMetadataConsumer<TParams extends any[] =
|
|
179
|
+
type RegleRuleMetadataConsumer<TParams extends any[] = never, TMetadata extends RegleRuleMetadataDefinition = boolean> = DefaultMetadataProperties & (TParams extends never ? {} : {
|
|
80
180
|
$params: TParams;
|
|
81
181
|
}) & (Exclude<TMetadata, boolean> extends RegleRuleMetadataExtended ? TMetadata extends boolean ? Partial<Omit<Exclude<TMetadata, boolean>, '$valid'>> : Omit<Exclude<TMetadata, boolean>, '$valid'> : {});
|
|
82
182
|
/**
|
|
@@ -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
|
-
|
|
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?:
|
|
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
|
/**
|
|
@@ -380,7 +398,7 @@ interface RegleCollectionStatus<TRules extends RegleRuleDecl | ReglePartialValid
|
|
|
380
398
|
|
|
381
399
|
/**
|
|
382
400
|
* @description
|
|
383
|
-
* Create a typed custom rule that can be used like default
|
|
401
|
+
* Create a typed custom rule that can be used like default rules.
|
|
384
402
|
* It can also be declared in the global options
|
|
385
403
|
*
|
|
386
404
|
* It will automatically detect if the rule is async
|
|
@@ -396,7 +414,7 @@ interface RegleCollectionStatus<TRules extends RegleRuleDecl | ReglePartialValid
|
|
|
396
414
|
*
|
|
397
415
|
* ```ts
|
|
398
416
|
* // Create a simple rule with no params
|
|
399
|
-
* import {ruleHelpers} from '@regle/
|
|
417
|
+
* import {ruleHelpers} from '@regle/rules';
|
|
400
418
|
*
|
|
401
419
|
* export const isFoo = createRule({
|
|
402
420
|
* type: defineType<string>('foo'),
|
|
@@ -422,10 +440,10 @@ 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
|
-
* Root function that allows you to define project-wise all your custom
|
|
446
|
+
* Root function that allows you to define project-wise all your custom rules or overwrite default ones
|
|
429
447
|
*
|
|
430
448
|
* It will return utility functions that let you build type-safe forms
|
|
431
449
|
*
|
|
@@ -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 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};
|
package/package.json
CHANGED
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@regle/core",
|
|
3
|
-
"version": "0.0
|
|
4
|
-
"description": "Vue
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Typescript first model-based validation library for Vue 3",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"vue": "^3.1.0"
|
|
7
7
|
},
|
|
8
8
|
"devDependencies": {
|
|
9
|
-
"@microsoft/api-extractor": "7.47.
|
|
9
|
+
"@microsoft/api-extractor": "7.47.11",
|
|
10
10
|
"@total-typescript/ts-reset": "0.6.1",
|
|
11
|
-
"@types/node": "22.
|
|
11
|
+
"@types/node": "22.9.0",
|
|
12
12
|
"@types/prettier": "3.0.0",
|
|
13
|
-
"@typescript-eslint/eslint-plugin": "8.
|
|
14
|
-
"@typescript-eslint/parser": "8.
|
|
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.
|
|
17
|
-
"changelogithub": "0.13.
|
|
16
|
+
"bumpp": "9.8.1",
|
|
17
|
+
"changelogithub": "0.13.11",
|
|
18
18
|
"cross-env": "7.0.3",
|
|
19
|
-
"eslint": "9.
|
|
19
|
+
"eslint": "9.14.0",
|
|
20
20
|
"eslint-config-prettier": "9.1.0",
|
|
21
|
-
"eslint-plugin-vue": "9.
|
|
21
|
+
"eslint-plugin-vue": "9.30.0",
|
|
22
22
|
"prettier": "3.3.3",
|
|
23
|
-
"tsup": "8.
|
|
24
|
-
"type-fest": "4.26.
|
|
25
|
-
"typescript": "5.
|
|
26
|
-
"vitest": "2.
|
|
27
|
-
"vue": "3.5.
|
|
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.
|
|
29
|
+
"vue-tsc": "2.1.10"
|
|
30
30
|
},
|
|
31
31
|
"type": "module",
|
|
32
32
|
"exports": {
|