@regle/core 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -0
- package/dist/index.d.ts +41 -33
- package/dist/index.js +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="https://raw.githubusercontent.com/victorgarciaesgi/regle/master/.github/images/regle-github-banner.png" alt="regle cover">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
# Regle
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
Regle \ʁɛɡl\ (French word for 'rule' ) is a Typescript-first model-based validation library for Vue 3.
|
|
9
|
+
It's heavily inspired by Vuelidate.
|
|
10
|
+
|
|
11
|
+
> ⚠️ Project is still in development, do not use it in production
|
|
12
|
+
> API or function names can still change
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# 📚 Documentation
|
|
16
|
+
|
|
17
|
+
[](https://regle.vercel.app/)
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as vue from 'vue';
|
|
2
|
-
import { MaybeRef,
|
|
2
|
+
import { MaybeRef, Ref, ComputedRef, UnwrapNestedRefs } from 'vue';
|
|
3
3
|
|
|
4
4
|
type Maybe<T = any> = T | null | undefined;
|
|
5
|
-
type MaybeGetter<T, V = any> = T | ((value: V
|
|
5
|
+
type MaybeGetter<T, V = any> = T | ((value: Ref<V>, index: number) => T);
|
|
6
6
|
type ExtractFromGetter<T extends MaybeGetter<any, any>> = T extends MaybeGetter<infer U, any> ? U : never;
|
|
7
7
|
type DeepMaybeRef<T extends Record<string, any>> = {
|
|
8
8
|
[K in keyof T]: MaybeRef<T[K]>;
|
|
@@ -53,7 +53,7 @@ type EmptyObject = {[emptyObjectSymbol]?: never};
|
|
|
53
53
|
|
|
54
54
|
interface RegleBehaviourOptions {
|
|
55
55
|
/**
|
|
56
|
-
* Only display error when calling `
|
|
56
|
+
* Only display error when calling `validateState()`
|
|
57
57
|
* @default false
|
|
58
58
|
*/
|
|
59
59
|
lazy?: boolean;
|
|
@@ -63,7 +63,7 @@ interface RegleBehaviourOptions {
|
|
|
63
63
|
*/
|
|
64
64
|
autoDirty?: boolean;
|
|
65
65
|
/**
|
|
66
|
-
* The fields will turn valid when they are, but not invalid unless calling `
|
|
66
|
+
* The fields will turn valid when they are, but not invalid unless calling `validateState()`
|
|
67
67
|
* @default false
|
|
68
68
|
*
|
|
69
69
|
* @experimental report any bug
|
|
@@ -71,10 +71,10 @@ interface RegleBehaviourOptions {
|
|
|
71
71
|
rewardEarly?: boolean;
|
|
72
72
|
}
|
|
73
73
|
interface LocalRegleBehaviourOptions<TState extends Record<string, any>, TRules extends ReglePartialValidationTree<TState, CustomRulesDeclarationTree>, TExternal extends RegleExternalErrorTree<TState>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]>> {
|
|
74
|
-
|
|
74
|
+
externalErrors?: MaybeRef<TExternal>;
|
|
75
75
|
validationGroups?: (fields: RegleStatus<TState, TRules>['$fields']) => TValidationGroups;
|
|
76
76
|
}
|
|
77
|
-
type RegleValidationGroupEntry = RegleFieldStatus<any, any, any
|
|
77
|
+
type RegleValidationGroupEntry = RegleFieldStatus<any, any, any>;
|
|
78
78
|
interface RegleValidationGroupOutput {
|
|
79
79
|
$invalid: boolean;
|
|
80
80
|
$error: boolean;
|
|
@@ -97,9 +97,9 @@ interface Regle<TState extends Record<string, any> = EmptyObject, TRules extends
|
|
|
97
97
|
* It allow you to skip scouting the `regle` object
|
|
98
98
|
*/
|
|
99
99
|
errors: RegleErrorTree<TRules, TExternal>;
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
100
|
+
ready: ComputedRef<boolean>;
|
|
101
|
+
resetAll: () => void;
|
|
102
|
+
validateState: () => Promise<false | DeepSafeFormState<TState, TRules>>;
|
|
103
103
|
state: Ref<TState>;
|
|
104
104
|
}
|
|
105
105
|
type DeepReactiveState<T extends Record<string, any>> = {
|
|
@@ -228,27 +228,31 @@ interface RegleRuleCore<TValue extends any, TParams extends any[] = [], TAsync e
|
|
|
228
228
|
}
|
|
229
229
|
|
|
230
230
|
type DefaultValidators = {
|
|
231
|
-
maxLength: RegleRuleWithParamsDefinition<string, [count: number]>;
|
|
232
|
-
required: RegleRuleDefinition<unknown, []>;
|
|
233
231
|
alpha: RegleRuleDefinition<string>;
|
|
234
232
|
alphaNum: RegleRuleDefinition<string | number>;
|
|
235
233
|
between: RegleRuleWithParamsDefinition<number, [min: number, max: number]>;
|
|
234
|
+
checked: RegleRuleDefinition<boolean, [], false, boolean, boolean>;
|
|
235
|
+
dateAfter: RegleRuleWithParamsDefinition<Date, [after: Date]>;
|
|
236
|
+
dateBefore: RegleRuleWithParamsDefinition<Date, [before: Date]>;
|
|
237
|
+
dateBetween: RegleRuleWithParamsDefinition<Date, [before: Date, after: Date]>;
|
|
236
238
|
decimal: RegleRuleDefinition<number | string>;
|
|
237
239
|
email: RegleRuleDefinition<string>;
|
|
240
|
+
exactLength: RegleRuleWithParamsDefinition<string | any[] | Record<PropertyKey, any>, [
|
|
241
|
+
count: number
|
|
242
|
+
], false, boolean>;
|
|
238
243
|
integer: RegleRuleDefinition<number | string>;
|
|
244
|
+
ipAddress: RegleRuleDefinition<string, [], false>;
|
|
245
|
+
macAddress: RegleRuleWithParamsDefinition<string, [separator?: string | undefined], false>;
|
|
246
|
+
maxLength: RegleRuleWithParamsDefinition<string, [count: number]>;
|
|
239
247
|
maxValue: RegleRuleWithParamsDefinition<number, [count: number]>;
|
|
240
248
|
minLength: RegleRuleWithParamsDefinition<string | Record<PropertyKey, any> | any[], [
|
|
241
249
|
count: number
|
|
242
250
|
]>;
|
|
243
251
|
minValue: RegleRuleWithParamsDefinition<number, [count: number]>;
|
|
244
252
|
numeric: RegleRuleDefinition<number | string>;
|
|
253
|
+
required: RegleRuleDefinition<unknown, []>;
|
|
245
254
|
sameAs: RegleRuleWithParamsDefinition<unknown, [target: unknown]>;
|
|
246
255
|
url: RegleRuleDefinition<string>;
|
|
247
|
-
dateAfter: RegleRuleWithParamsDefinition<Date, [after: Date]>;
|
|
248
|
-
dateBefore: RegleRuleWithParamsDefinition<Date, [before: Date]>;
|
|
249
|
-
dateBetween: RegleRuleWithParamsDefinition<Date, [before: Date, after: Date]>;
|
|
250
|
-
ipAddress: RegleRuleDefinition<string, [], false>;
|
|
251
|
-
macAddress: RegleRuleWithParamsDefinition<string, [separator?: string | undefined], false>;
|
|
252
256
|
};
|
|
253
257
|
|
|
254
258
|
type CustomRulesDeclarationTree = {
|
|
@@ -285,23 +289,29 @@ type RegleFormPropertyType<TValue = any, TCustomRules extends Partial<AllRulesDe
|
|
|
285
289
|
type RegleRuleDecl<TValue extends any = any, TCustomRules extends Partial<AllRulesDeclarations> = Partial<AllRulesDeclarations>> = FieldRegleBehaviourOptions & {
|
|
286
290
|
[TKey in keyof TCustomRules]?: NonNullable<TCustomRules[TKey]> extends RegleRuleWithParamsDefinition<any, infer TParams> ? RegleRuleDefinition<TValue, TParams, boolean> : NonNullable<TCustomRules[TKey]> extends RegleRuleDefinition<any, any, any, any> ? FormRuleDeclaration<TValue, any> : FormRuleDeclaration<TValue, any> | FieldRegleBehaviourOptions[keyof FieldRegleBehaviourOptions];
|
|
287
291
|
};
|
|
292
|
+
/**
|
|
293
|
+
* @public
|
|
294
|
+
*/
|
|
295
|
+
type RegleCollectionRuleDeclKeyProperty = {
|
|
296
|
+
$key?: PropertyKey;
|
|
297
|
+
};
|
|
288
298
|
/**
|
|
289
299
|
* @public
|
|
290
300
|
*/
|
|
291
301
|
type RegleCollectionRuleDecl<TValue = any[], TCustomRules extends Partial<AllRulesDeclarations> = Partial<AllRulesDeclarations>> = (RegleRuleDecl<NonNullable<TValue>, TCustomRules> & {
|
|
292
|
-
$each?: MaybeGetter<RegleFormPropertyType<ArrayElement<NonNullable<TValue>>, TCustomRules
|
|
302
|
+
$each?: MaybeGetter<RegleFormPropertyType<ArrayElement<NonNullable<TValue>>, TCustomRules> & RegleCollectionRuleDeclKeyProperty, ArrayElement<TValue>>;
|
|
293
303
|
}) | {
|
|
294
304
|
$each?: MaybeGetter<RegleFormPropertyType<ArrayElement<NonNullable<TValue>>, TCustomRules>, ArrayElement<TValue>>;
|
|
295
305
|
};
|
|
296
306
|
/**
|
|
297
307
|
* @public
|
|
298
308
|
*/
|
|
299
|
-
type InlineRuleDeclaration<TValue extends any = any, TReturn extends RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition> = RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition>> = (value: Maybe<TValue>, ...args:
|
|
309
|
+
type InlineRuleDeclaration<TValue extends any = any, TParams extends any[] = any[], TReturn extends RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition> = RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition>> = (value: Maybe<TValue>, ...args: UnwrapRegleUniversalParams<TParams>) => TReturn;
|
|
300
310
|
/**
|
|
301
311
|
* @public
|
|
302
312
|
* Regroup inline and registered rules
|
|
303
313
|
* */
|
|
304
|
-
type FormRuleDeclaration<TValue extends any, TParams extends any[], TReturn extends RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition> = RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition>, TMetadata extends RegleRuleMetadataDefinition = TReturn extends Promise<infer M> ? M : TReturn, TAsync extends boolean = boolean> = InlineRuleDeclaration<TValue, TReturn> | RegleRuleDefinition<TValue, TParams, TAsync, TMetadata>;
|
|
314
|
+
type FormRuleDeclaration<TValue extends any, TParams extends any[], TReturn extends RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition> = RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition>, TMetadata extends RegleRuleMetadataDefinition = TReturn extends Promise<infer M> ? M : TReturn, TAsync extends boolean = boolean> = InlineRuleDeclaration<TValue, TParams, TReturn> | RegleRuleDefinition<TValue, TParams, TAsync, TMetadata>;
|
|
305
315
|
|
|
306
316
|
type RegleErrorTree<TRules extends ReglePartialValidationTree<any, any>, TExternal extends RegleExternalErrorTree<Record<string, unknown>> = never> = {
|
|
307
317
|
readonly [K in keyof TRules]: RegleValidationErrors<TRules[K], K extends keyof TExternal ? TExternal[K] : never>;
|
|
@@ -332,6 +342,8 @@ type RegleStatus<TState extends Record<string, any> = Record<string, any>, TRule
|
|
|
332
342
|
readonly $fields: {
|
|
333
343
|
readonly [TKey in keyof TRules]: InferRegleStatusType<NonNullable<TRules[TKey]>, TState, TKey>;
|
|
334
344
|
};
|
|
345
|
+
readonly $errors: RegleErrorTree<TRules>;
|
|
346
|
+
readonly $silentErrors: RegleErrorTree<TRules>;
|
|
335
347
|
} & ([TValidationGroups] extends [never] ? object : {
|
|
336
348
|
$groups: {
|
|
337
349
|
readonly [TKey in keyof TValidationGroups]: RegleValidationGroupOutput;
|
|
@@ -340,17 +352,17 @@ type RegleStatus<TState extends Record<string, any> = Record<string, any>, TRule
|
|
|
340
352
|
/**
|
|
341
353
|
* @public
|
|
342
354
|
*/
|
|
343
|
-
type InferRegleStatusType<TRule extends RegleCollectionRuleDecl | RegleRuleDecl | ReglePartialValidationTree<any>, TState extends Record<PropertyKey, any> = any, TKey extends PropertyKey = string> = TRule extends RegleCollectionRuleDefinition<any, any> ? NonNullable<TState[TKey]> extends Array<Record<string, any> | any> ? ExtractFromGetter<TRule['$each']> extends RegleRuleDecl | ReglePartialValidationTree<any> ? RegleCollectionStatus<ExtractFromGetter<TRule['$each']>, TState[TKey]> : never : RegleFieldStatus<TRule, TState, TKey> : TRule extends ReglePartialValidationTree<any> ? NonNullable<TState[TKey]> extends Array<any> ? RegleCommonStatus<TState[TKey]> : NonNullable<TState[TKey]> extends Record<PropertyKey, any> ? RegleStatus<TState[TKey], TRule> : RegleFieldStatus<TRule, TState, TKey> : RegleFieldStatus<TRule, TState, TKey>;
|
|
355
|
+
type InferRegleStatusType<TRule extends RegleCollectionRuleDecl | RegleRuleDecl | ReglePartialValidationTree<any>, TState extends Record<PropertyKey, any> = any, TKey extends PropertyKey = string> = TRule extends RegleCollectionRuleDefinition<any, any> ? NonNullable<TState[TKey]> extends Array<Record<string, any> | any> ? ExtractFromGetter<TRule['$each']> extends RegleRuleDecl | ReglePartialValidationTree<any> ? RegleCollectionStatus<ExtractFromGetter<TRule['$each']>, TState[TKey], TRule> : never : RegleFieldStatus<TRule, TState, TKey> : TRule extends ReglePartialValidationTree<any> ? NonNullable<TState[TKey]> extends Array<any> ? RegleCommonStatus<TState[TKey]> : NonNullable<TState[TKey]> extends Record<PropertyKey, any> ? RegleStatus<TState[TKey], TRule> : RegleFieldStatus<TRule, TState, TKey> : RegleFieldStatus<TRule, TState, TKey>;
|
|
344
356
|
/**
|
|
345
357
|
* @public
|
|
346
358
|
*/
|
|
347
359
|
interface RegleFieldStatus<TRules extends RegleFormPropertyType<any, Partial<AllRulesDeclarations>> = Record<string, any>, TState extends Record<PropertyKey, any> = any, TKey extends PropertyKey = string> extends RegleCommonStatus<TState> {
|
|
348
360
|
$value: UnwrapNestedRefs<TState[TKey]>;
|
|
349
|
-
readonly $externalErrors?: string[];
|
|
350
361
|
readonly $errors: string[];
|
|
351
362
|
readonly $silentErrors: string[];
|
|
363
|
+
readonly $externalErrors?: string[];
|
|
352
364
|
readonly $rules: {
|
|
353
|
-
readonly [TRuleKey in keyof TRules]: RegleRuleStatus<TState[TKey], TRules[TRuleKey] extends RegleRuleDefinition<any, infer TParams, any> ? TParams : [], TRules[TRuleKey] extends RegleRuleDefinition<any, any, any, infer TMetadata> ? TMetadata : TRules[TRuleKey] extends InlineRuleDeclaration<any, infer TMetadata> ? TMetadata extends Promise<infer P> ? P : TMetadata : never>;
|
|
365
|
+
readonly [TRuleKey in keyof Omit<TRules, '$each' | keyof FieldRegleBehaviourOptions>]: RegleRuleStatus<TState[TKey], TRules[TRuleKey] extends RegleRuleDefinition<any, infer TParams, any> ? TParams : [], TRules[TRuleKey] extends RegleRuleDefinition<any, any, any, infer TMetadata> ? TMetadata : TRules[TRuleKey] extends InlineRuleDeclaration<any, any[], infer TMetadata> ? TMetadata extends Promise<infer P> ? P : TMetadata : never>;
|
|
354
366
|
};
|
|
355
367
|
}
|
|
356
368
|
/**
|
|
@@ -392,8 +404,11 @@ type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata exte
|
|
|
392
404
|
/**
|
|
393
405
|
* @public
|
|
394
406
|
*/
|
|
395
|
-
interface RegleCollectionStatus<TRules extends RegleRuleDecl | ReglePartialValidationTree<any>, TState extends any[]> extends RegleFieldStatus<TRules, TState> {
|
|
396
|
-
readonly $each: Array<InferRegleStatusType<NonNullable<TRules>, TState
|
|
407
|
+
interface RegleCollectionStatus<TRules extends RegleRuleDecl | ReglePartialValidationTree<any>, TState extends any[], TFieldRule extends RegleCollectionRuleDecl<any, any> = never> extends Omit<RegleFieldStatus<TRules, TState>, '$errors' | '$silentErrors'> {
|
|
408
|
+
readonly $each: Array<InferRegleStatusType<NonNullable<TRules>, NonNullable<TState>, number>>;
|
|
409
|
+
readonly $field: RegleFieldStatus<TFieldRule, TState>;
|
|
410
|
+
readonly $errors: RegleErrorTree<TRules>;
|
|
411
|
+
readonly $silentErrors: RegleErrorTree<TRules>;
|
|
397
412
|
}
|
|
398
413
|
|
|
399
414
|
/**
|
|
@@ -442,16 +457,9 @@ declare function unwrapRuleParameters<TParams extends any[]>(params: ParamDecl[]
|
|
|
442
457
|
|
|
443
458
|
declare const useRegle: <TState extends Record<string, any>, TRules extends ReglePartialValidationTree<TState, Partial<AllRulesDeclarations>>, TExternal extends RegleExternalErrorTree<TState>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]>, TValid = keyof TRules extends keyof TState ? true : false>(state: MaybeRef<TState> | DeepReactiveState<TState>, rulesFactory: TValid extends true ? TRules | ComputedRef<TRules> | (() => TRules) : never, options?: (Partial<DeepMaybeRef<RegleBehaviourOptions>> & LocalRegleBehaviourOptions<TState, TRules, TExternal, TValidationGroups>) | undefined) => Regle<TState, TRules, TExternal, TValidationGroups>;
|
|
444
459
|
|
|
445
|
-
|
|
446
|
-
* Root function that allows you to define project-wise all your custom rules or overwrite default ones
|
|
447
|
-
*
|
|
448
|
-
* It will return utility functions that let you build type-safe forms
|
|
449
|
-
*
|
|
450
|
-
* @param customRules
|
|
451
|
-
*/
|
|
452
|
-
declare function defineRegleConfig<TCustomRules extends Partial<AllRulesDeclarations>>({ rules, options, }: {
|
|
460
|
+
declare function defineRegleConfig<TCustomRules extends Partial<AllRulesDeclarations>>({ rules, modifiers, }: {
|
|
453
461
|
rules?: () => TCustomRules;
|
|
454
|
-
|
|
462
|
+
modifiers?: RegleBehaviourOptions;
|
|
455
463
|
}): <TState extends Record<string, any>, TRules extends ReglePartialValidationTree<TState, Partial<AllRulesDeclarations> & TCustomRules>, TExternal extends RegleExternalErrorTree<TState>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]>, TValid = keyof TRules extends keyof TState ? true : false>(state: vue.MaybeRef<TState> | DeepReactiveState<TState>, rulesFactory: TValid extends true ? TRules | vue.ComputedRef<TRules> | (() => TRules) : never, options?: (Partial<DeepMaybeRef<RegleBehaviourOptions>> & LocalRegleBehaviourOptions<TState, TRules, TExternal, TValidationGroups>) | undefined) => Regle<TState, TRules, TExternal, TValidationGroups>;
|
|
456
464
|
|
|
457
465
|
export { type DeepMaybeRef, type FormRuleDeclaration, type InlineRuleDeclaration, InternalRuleType, type LocalRegleBehaviourOptions, type Maybe, type ParamDecl, type Regle, type RegleBehaviourOptions, type RegleCollectionErrors, type RegleCollectionRuleDecl, type RegleCollectionStatus, type RegleCommonStatus, type RegleComputedRules, type RegleErrorTree, type RegleExternalCollectionErrors, type RegleExternalErrorTree, type RegleExternalValidationErrors, type RegleFieldStatus, type RegleFormPropertyType, type ReglePartialValidationTree, type RegleRuleCore, type RegleRuleDecl, type RegleRuleDefinition, type RegleRuleDefinitionProcessor, type RegleRuleDefinitionWithMetadataProcessor, type RegleRuleInit, type RegleRuleMetadataConsumer, type RegleRuleMetadataDefinition, type RegleRuleRaw, type RegleRuleStatus, type RegleRuleWithParamsDefinition, type RegleStatus, type RegleValidationTree, type UnwrapRegleUniversalParams, createRule, defineRegleConfig, defineType, unwrapRuleParameters, useRegle };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import {unref,isRef,toRef,computed,ref,toRaw,reactive,shallowRef,onScopeDispose,triggerRef,watch,effectScope,toRefs}from'vue';import {pauseTracking,resetTracking}from'@vue/reactivity';function j(e){return e.map(r=>r instanceof Function?r():unref(r))}function Ie(e){return e.map(r=>r instanceof Function||isRef(r)?r:toRef(()=>r))}function ue(e){let r=e.toString();return (r.includes("=>")?r.split("=>")[0]:r).slice(r.indexOf("(")+1,r.indexOf(")")).split(",").map(l=>l.trim()).filter(l=>l.includes("=")).length+e.length}function ce(e,...r){let{message:t,validator:n,active:a,...l}=e,g=n.constructor.name==="AsyncFunction";return {...{validator(d,...o){return e.validator(d,...j(o.length?o:r))},message(d,o){return typeof e.message=="function"?e.message(d,{...o,$params:j(o.$params?.length?o.$params:r)}):e.message},active(d,o){return typeof e.active=="function"?e.active(d,{...o,$params:j(o.$params?.length?o.$params:r)}):e.active??!0},exec(d){let o=e.validator(d,...j(r)),s;return o instanceof Promise?o.then(y=>(s=y,typeof s=="object"&&"$valid"in s?s.$valid:typeof s=="boolean"?s:!1)):(s=o,typeof s=="object"&&"$valid"in s?s.$valid:typeof s=="boolean"?s:!1)}},...l,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:g,_params:Ie(r)}}function fe(e){if(typeof e.validator=="function"){let t=ce(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(console.log(e.validator,ue(e.validator)),ue(e.validator)>1){let a=function(...l){return ce(e,...l)};return a.validator=t.validator,a.message=t.message,a.active=t.active,a.type=t.type,a.exec=t.exec,a._validator=t.validator,a._message=t.message,a._active=t.active,a._type=e.type,a._patched=!1,a._async=n,a}else return t}throw new Error("Validator must be a function")}function Re(e){return e}function V(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ce(e){return V(e.value)}function U(e){let r=e,t={}.toString.call(e).slice(8,-1);if(t=="Set")return new Set([...e].map(n=>U(n)));if(t=="Map")return new Map([...e].map(n=>[U(n[0]),U(n[1])]));if(t=="Date")return new Date(e.getTime());if(t=="RegExp")return RegExp(e.source,et(e));if(t=="Array"||t=="Object"){r=Array.isArray(e)?[]:{};for(let n in e)r[n]=U(e[n]);}return r}function et(e){if(typeof e.source.flags=="string")return e.source.flags;{let r=[];return e.global&&r.push("g"),e.ignoreCase&&r.push("i"),e.multiline&&r.push("m"),e.sticky&&r.push("y"),e.unicode&&r.push("u"),r.join("")}}function G(e,r,t){return e instanceof Function?e(r,t??0):e}function Pe(e){return e==null?!0:e===!1?!1:e instanceof Date?isNaN(e.getTime()):Array.isArray(e)?e.length===0:typeof e=="object"&&e!=null?Object.keys(e).length===0:typeof e=="number"?isNaN(e):!String(e).trim().length}function pe(e,r,t){let n,a=(...l)=>new Promise(g=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(g);},r);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...l)=>new Promise(g=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(g);},0);}),a}function de(){let e=shallowRef(new Map),r=shallowRef(new Map),t=shallowRef(new Map),n=shallowRef(new Map),a=shallowRef(new Map),l=shallowRef(new Map);function g(m){let f=r.value.get(m);if(f)return f;{let i=ref({});return r.value.set(m,i),i}}function h(m){let f=t.value.get(m);if(f)return f;{let i=ref([]);return t.value.set(m,i),i}}function C(m,f,i){l.value.set(`${m}-${f}`,i);}function d(m,f){return l.value.get(`${m}-${f}`)}function o(m,f){m&&f!=null&&l.value.delete(`${m}-${f}`);}function s(m,f){n.value.set(m,f);}function y(m){return n.value.get(m)??!1}function u(m,f){e.value.set(m,f);}function w(m,f){let i=e.value.get(m);return i?T(f,i)?{valid:!0}:{valid:!1}:void 0}function T(m,f){let i=Object.keys(f),R=Object.keys(m);return R.length!==i.length||!R.every(b=>i.includes(b))?!1:R.every(b=>{let c=m[b],$=f[b];return !$||!c||typeof c=="function"||typeof $=="function"||typeof c=="number"||typeof c=="boolean"?!1:c._params?c._params?.every((E,A)=>{if(typeof $=="number"||typeof $=="boolean")return !0;{let p=j($._params),x=j(c._params);return p?.[A]===x?.[A]}}):!0})}function F(m){let f=a.value.get(m);if(f)return f;{let i=ref(!1),R=ref(!0),S=ref({}),b=ref(!1);return a.value.set(m,{$pending:i,$valid:R,$metadata:S,$validating:b}),{$pending:i,$valid:R,$metadata:S,$validating:b}}}return onScopeDispose(()=>{e.value.clear(),r.value.clear(),t.value.clear(),n.value.clear(),a.value.clear(),l.value.clear();}),{addRuleDeclEntry:u,setDirtyEntry:s,checkRuleDeclEntry:w,getDirtyState:y,trySetRuleStatusRef:F,getFieldsEntry:g,getCollectionsEntry:h,getArrayStatus:d,addArrayStatus:C,deleteArrayStatus:o,arrayStatusStorage:l}}function we(e,r){let t=G(r.value,e.value);return V(e.value)&&V(t)&&!Object.entries(t).some(n=>me(n))}function Oe(e,r){let t=G(e.value,r.value);return !!t&&"$each"in t}function Me(e){return !!e&&V(e.value)}function me(e){return V(e)&&"_validator"in e}function Z(e){return typeof e.value!="function"}function K(e){return V(e)&&"$fields"in e}function ee(e){return !!e&&"$each"in e}function te(e){return !!e&&"$rules"in e}function ye(e){return "$each"in e||"$errors"in e}function B({field:e,silent:r=!1}){return Object.entries(e.$rules??{}).map(([t,n])=>r||!n.$valid&&e.$dirty?n.$message:null).filter(t=>!!t).reduce((t,n)=>typeof n=="string"?t?.concat([n]):t?.concat(n),[]).concat(e.$externalErrors??[])}function Ae(e){return K(e)?ge(e.$fields):ee(e)?{$errors:e.$rules?B({field:e}):[],$each:e.$each.map(Ae)}:te(e)?e.$error?B({field:e}):e.$externalErrors??[]:[]}function nt(e){return e.$each.map(Ae)}function ge(e){return Object.fromEntries(Object.entries(e).map(([r,t])=>K(t)?[r,ge(t.$fields)]:ee(t)?[r,{...t.$rules&&{$errors:B({field:t})},$each:nt(t)}]:te(t)?t.$error?[r,B({field:t})]:[r,t.$externalErrors??[]]:[r,[]]))}function Fe(e){return computed(()=>ge(e.$fields))}var oe=(t=>(t.Inline="__inline",t.Async="__async",t))(oe||{});function Ve(e,r){return computed(()=>e.value.some(t=>t[r]))}function _e(e,r){return computed(()=>e.value.reduce((t,n)=>{let a=n[r]||[];return t.concat(a)},[]))}function at(){return Math.floor(Math.random()*Date.now()).toString()}function ve(){return typeof window>"u"?at():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(8)}function Be({$dirty:e,customMessages:r,rule:t,ruleKey:n,state:a,path:l,storage:g}){let h=effectScope(),C,d,{$pending:o,$valid:s,$metadata:y,$validating:u}=g.trySetRuleStatusRef(`${l}.${n}`);function w(){C=h.run(()=>{let f=computed(()=>({$invalid:!s.value,$params:c.value,...y.value})),i=computed(()=>Z(t)?typeof t.value.active=="function"?t.value.active(a.value,f.value):t.value.active:!0),R=computed(()=>{let E="",A=r?r[n]?.message:void 0;return A&&(typeof A=="function"?E=A(a.value,f.value):E=A),Z(t)&&(A&&!t.value._patched||(typeof t.value.message=="function"?E=t.value.message(a.value,f.value):E=t.value.message)),Pe(E)&&(E="Error",console.warn(`No error message defined for ${l}.${n}`)),E}),S=computed(()=>Z(t)&&t.value.type?Object.values(oe).includes(t.value.type)?n:t.value.type:n),b=computed(()=>Z(t)?t.value.validator:t.value),c=computed(()=>typeof t.value=="function"?[]:j(t.value._params??[])),$=computed(()=>`${l}.${S.value}`);return {$active:i,$message:R,$type:S,$validator:b,$params:c,$path:$}}),d=watch(C.$params,T,{deep:!0});}w();async function T(){u.value=!0;let f=C.$validator.value,i=!1,R=f(a.value,...C.$params.value);if(R instanceof Promise){if(!o.value)try{s.value=!0,e.value&&(o.value=!0);let S=await R;if(typeof S=="boolean")i=S;else {let{$valid:b,...c}=S;i=b,y.value=c;}}catch{i=!1;}finally{o.value=!1;}}else if(R!=null)if(typeof R=="boolean")i=R;else {let{$valid:S,...b}=R;i=S,y.value=b;}return s.value=i,u.value=!1,i}function F(){s.value=!0,y.value={},o.value=!1,u.value=!1,w();}function m(){d(),h.stop(),h=effectScope();}return reactive({...C,$pending:o,$valid:s,$metadata:y,$validate:T,$unwatch:m,$watch:w,$reset:F})}function se({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:l,externalErrors:g,index:h,onUnwatch:C}){let d=effectScope(),o,s=ref(!1),y=ref(!1),u=ref([]),w,T,F,m,f=()=>{};function i(){u.value=g.value??[];}i();function R(){let v=r.value,O=a.checkRuleDeclEntry(n,v);E.value=Object.fromEntries(Object.entries(v).filter(([P])=>P.startsWith("$")));let I=G(r.value,e.value,h);$.value=Object.fromEntries(Object.entries(I).filter(([P])=>!P.startsWith("$")).map(([P,X])=>{if(X){let H=toRef(()=>X);return [P,Be({$dirty:s,customMessages:t,rule:H,ruleKey:P,state:e,path:n,storage:a,options:l})]}return []}).filter(P=>!!P.length)),b(),f=o.$debounce.value?pe(c,o.$debounce.value??0):c,O?.valid!=null&&(s.value=a.getDirtyState(n),s.value&&f()),a.addRuleDeclEntry(n,v);}function S(){$.value&&Object.entries($.value).forEach(([v,O])=>{O.$unwatch();}),m(),s.value&&a.setDirtyEntry(n,s.value),w(),T(),F(),d.stop(),d=effectScope(),C?.();}function b(){$.value&&Object.entries($.value).forEach(([v,O])=>{O.$watch();}),o=d.run(()=>{let v=computed(()=>s.value),O=computed(()=>E.value.$debounce),I=computed(()=>E.value.$lazy?E.value.$lazy:unref(l.lazy)),P=computed(()=>E.value.$rewardEarly?E.value.$rewardEarly:unref(l.rewardEarly)),X=computed(()=>E.value.$autoDirty?E.value.$autoDirty:unref(l.autoDirty)),H=computed(()=>ie.value&&!he.value&&s.value),Qe=computed(()=>B({field:{$dirty:s.value,$externalErrors:u.value,$rules:$.value}})),Xe=computed(()=>B({field:{$dirty:s.value,$externalErrors:u.value,$rules:$.value},silent:!0})),he=computed(()=>y.value||!P.value?Object.entries($.value).some(([le,Y])=>Y.$pending):!1),ie=computed(()=>u.value?.length?!0:!P.value||P.value&&y.value?Object.entries($.value).some(([le,Y])=>!Y.$valid):!1),De=computed(()=>u.value?.length?!1:P.value?Object.entries($.value).every(([le,Y])=>Y.$valid):!ie.value);return watch(De,le=>{le&&(y.value=!1);}),{$error:H,$pending:he,$invalid:ie,$valid:De,$debounce:O,$lazy:I,$errors:Qe,$silentErrors:Xe,$rewardEarly:P,$autoDirty:X,$anyDirty:v}}),F=watch(g,i),w=watch(e,()=>{o.$autoDirty.value&&(s.value||(s.value=!0)),r.value instanceof Function&&R(),o.$lazy.value||(f(),o.$rewardEarly.value);}),m=watch(s,()=>{a.setDirtyEntry(n,s.value),x();}),T=watch(o.$valid,v=>{o.$rewardEarly.value&&v&&(y.value=!1);});}function c(){Object.entries($.value).forEach(([v,O])=>{O.$validate();});}let $=ref(),E=ref();R();function A(){s.value=!1,u.value=[],Object.entries($.value).forEach(([v,O])=>{O.$reset();});}function p(){s.value=!0,o.$lazy.value||o.$rewardEarly.value;}let x=o.$debounce.value?pe(D,o.$debounce.value??0):D;async function D(){try{if(y.value=!0,!o.$lazy.value&&o.$anyDirty.value&&!o.$pending)return !o.$error.value;{let v=Object.entries($.value).map(([I,P])=>P.$validate());return (await Promise.allSettled(v)).every(I=>I.status==="fulfilled"?I.value:!1)}}catch{return !1}}function M(){u.value=[];}return reactive({$dirty:s,$anyDirty:o.$anyDirty,$invalid:o.$invalid,$error:o.$error,$pending:o.$pending,$valid:o.$valid,$errors:o.$errors,$silentErrors:o.$silentErrors,$externalErrors:u,$value:e,$rules:$,$reset:A,$touch:p,$validate:x,$unwatch:S,$watch:b,$clearExternalErrors:M})}function be({$id:e,path:r,index:t,options:n,storage:a,value:l,customMessages:g,rules:h,externalErrors:C}){let d=ve(),o=`${r}.${d}`;typeof l[t]=="object"&&l[t]!=null&&(l[t].$id?o=`${r}.${l[t].$id}`:Object.defineProperties(l[t],{$id:{value:d,enumerable:!1,configurable:!1,writable:!1}}));let s=toRefs(l),y=toRef(()=>C.value?.[t]),u=ae({state:s[t],rulesDef:toRef(()=>h),customMessages:g,path:o,storage:a,options:n,externalErrors:y});if(u){let w=l[t]?.$id;u.$id=w??d,a.addArrayStatus(e,t.toString(),u);}return u}function pt({path:e,index:r,options:t,storage:n,value:a,customMessages:l,rules:g,externalErrors:h}){let C=toRefs(a),d=toRef(()=>h.value?.[r]);return ae({state:C[r],rulesDef:toRef(()=>g),customMessages:l,path:e,storage:n,options:t,externalErrors:d})}function He({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:l,externalErrors:g}){let h=effectScope(),C;if(Array.isArray(e.value)&&!r.value.$each)return null;let d=ref(),o=ref(e.value),s=null,y=ref({}),u=a.getCollectionsEntry(n);F(),w();function w(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(d.value=ve(),Object.defineProperties(e.value,{$id:{value:d.value,enumerable:!1,configurable:!1,writable:!1}})):d.value=e.value?.$id);let{$each:R,$debounce:S,$autoDirty:b,$lazy:c,$rewardEarly:$,...E}=r.value,A=toRef(()=>{if(g.value&&ye(g.value))return g.value.$errors}),p=toRef(()=>{if(g.value&&ye(g.value))return g.value.$each});if(Array.isArray(e.value)){let x={};["pop","shift","unshift","splice"].forEach(M=>{x[M]=function(...v){pauseTracking(),u.value.forEach(I=>{I.$unwatch(),a.deleteArrayStatus(d.value,I.$id);}),u.value[M](...v);let O=Object.assign([],this)[M].apply(this,v);return u.value=u.value.map((I,P)=>V(I)&&(te(I)||ee(I)||K(I))&&I.$id!=null?pt({$id:d.value,path:`${n}.${I.$id}`,rules:R,value:e.value,index:P,options:l,storage:a,externalErrors:p}):be({$id:d.value,path:n,rules:R,value:e.value,index:P,options:l,storage:a,externalErrors:p})).filter(I=>!!I),resetTracking(),O};});let D=new Proxy(toRaw(e.value),{get(M,v,O){let I=Reflect.get(M,v,O);return typeof v=="symbol"?I:Array.isArray(M)&&Object.hasOwn(x,v)?Reflect.get(x,v,O):I},deleteProperty(M,v){let O=Reflect.deleteProperty(M,v);return typeof v=="symbol"?!0:(isNaN(parseInt(v))||(u.value.splice(parseInt(v),1),a.deleteArrayStatus(d.value,v)),O)},set(M,v,O){let I=Reflect.set(M,v,O);if(typeof v=="symbol")return !0;if(!isNaN(parseInt(v))){let P=parseInt(v);if(!u.value[P]&&r.value.$each){let H=be({$id:d.value,value:e.value,rules:r.value.$each,customMessages:t,path:n,storage:a,options:l,index:P,externalErrors:p});H&&(u.value[P]=H);}}return I}});pauseTracking(),e.value=D,resetTracking();}if(y.value=se({state:e,rulesDef:toRef(()=>E),customMessages:t,path:n,storage:a,options:l,externalErrors:A}),o.value=y.value.$value,Array.isArray(e.value)&&R)for(let[x,D]of e.value.entries()){let M=be({$id:d.value,path:n,rules:R,value:e.value,index:x,options:l,storage:a,externalErrors:p});M&&(u.value[x]=M);}else u.value=[];}function T(){s&&s(),y.value&&y.value.$unwatch(),u.value&&u.value.forEach(R=>{"$dirty"in R&&R.$unwatch();});}function F(){s=watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")&&w();}),C=h.run(()=>{let R=computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(p=>typeof p!="object"):r.value.$each?Object.values(r.value.$each).every(p=>me(p)):!1),S=computed(()=>y.value.$dirty&&u.value.every(p=>p.$dirty)),b=computed(()=>y.value.$anyDirty||u.value.some(p=>p.$dirty)),c=computed(()=>y.value.$invalid||u.value.some(p=>p.$invalid)),$=computed(()=>!c.value),E=computed(()=>y.value.$error||u.value.some(p=>p.$error)),A=computed(()=>y.value.$pending||u.value.some(p=>p.$pending));return {isPrimitiveArray:R,$dirty:S,$anyDirty:b,$invalid:c,$valid:$,$error:E,$pending:A}});}function m(){y.value.$touch(),u.value.forEach(R=>{"$dirty"in R&&R.$touch();});}function f(){y.value.$reset(),u.value.forEach(R=>{"$dirty"in R&&R.$reset();}),y.value.$watch();}async function i(){try{return (await Promise.all([y.value.$validate(),...u.value.map(S=>{if("$dirty"in S)return S.$validate()})])).every(S=>!!S)}catch{return !1}}return reactive({...y.value,$value:o,...C,$each:u,$validate:i,$unwatch:T,$watch:F,$touch:m,$reset:f})}function Ee({scopeRules:e,state:r,customMessages:t,path:n="",rootRules:a,storage:l,options:g,externalErrors:h,validationGroups:C}){let d,o,s,y;function w(b=!0){T.value=null,triggerRef(T);let c=G(e.value,r.value),$=Object.fromEntries(Object.entries(c).map(([p,x])=>{if(x){let D=toRef(r.value,p),M=toRef(()=>x),v=toRef(()=>h.value?.[p]);return [p,ae({state:D,rulesDef:M,customMessages:t,path:n?`${n}.${p}`:p,storage:l,options:g,externalErrors:v})]}return []}).filter(p=>!!p.length&&p[1]!=null)),E=Object.fromEntries(Object.entries(unref(h)??{}).filter(([p])=>!(p in c)).map(([p,x])=>{if(x){let D=toRef(()=>({})),M=toRef(()=>x);return [p,ae({state:ref(void 0),rulesDef:D,customMessages:t,path:n?`${n}.${p}`:p,storage:l,options:g,externalErrors:M})]}return []})),A=Object.fromEntries(Object.entries(C?.($)??{}).map(([p,x])=>x.length?[p,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(D=>[D,Ve(toRef(()=>x),D)])),...Object.fromEntries(["$errors","$silentErrors"].map(D=>[D,_e(toRef(()=>x),D)]))}]:[]));T.value={...$,...E,...A},b&&i();}let T=l.getFieldsEntry(n);w();function F(){w(!1),Object.entries(T.value).forEach(([b,c])=>{c.$reset();}),i();}function m(){Object.entries(T.value).forEach(([b,c])=>{c.$touch();});}async function f(){try{return (await Promise.allSettled(Object.entries(T.value).map(([c,$])=>$.$validate()))).every(c=>c.status==="fulfilled"?c.value:!1)}catch{return !1}}function i(){a&&(s=watch(a,()=>{R(),w();},{deep:!0,flush:"post"})),e.value instanceof Function&&(y=watch(r,()=>{R(),w();},{deep:!0,flush:"post"})),d=effectScope(),o=d.run(()=>{let b=computed(()=>Object.entries(T.value).every(([x,D])=>D.$dirty)),c=computed(()=>Object.entries(T.value).some(([x,D])=>D.$dirty)),$=computed(()=>Object.entries(T.value).some(([x,D])=>D.$invalid)),E=computed(()=>!$.value),A=computed(()=>Object.entries(T.value).some(([x,D])=>D.$error)),p=computed(()=>Object.entries(T.value).some(([x,D])=>D.$pending));return {$dirty:b,$anyDirty:c,$invalid:$,$valid:E,$error:A,$pending:p}});}function R(){T.value&&Object.entries(T.value).forEach(([b,c])=>{c.$unwatch();}),s?.(),y?.();}function S(){Object.entries(T.value).forEach(([b,c])=>{c.$clearExternalErrors();});}return reactive({...o,$fields:T,$value:r,$reset:F,$touch:m,$validate:f,$unwatch:R,$watch:i,$clearExternalErrors:S})}function ae({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:l,externalErrors:g,index:h,onUnwatch:C}){return Oe(r,e)?He({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:l,index:h,externalErrors:g}):we(e,r)&&Ce(e)?Ee({scopeRules:r,state:e,customMessages:t,path:n,storage:a,options:l,index:h,externalErrors:g}):Me(r)?se({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:l,index:h,externalErrors:g,onUnwatch:C}):null}function Te(e,r,t,n){let a=de(),l=computed(()=>unref(t.$externalErrors)),g=reactive(Ee({rootRules:e,scopeRules:e,state:r,customMessages:n?.(),storage:a,options:t,externalErrors:l,validationGroups:t.validationGroups})),h=Fe(g);return {regle:g,errors:h}}function xe(e,r){let t={autoDirty:r?.autoDirty??!0,lazy:r?.lazy??!1,rewardEarly:r?.rewardEarly??!1};function n(a,l,g){let h=isRef(l)?l:computed(typeof l=="function"?l:()=>l),C={...t,...g},d=isRef(a)?a:ref(a),o=U(toRaw(d.value)),{regle:s,errors:y}=Te(h,d,C,e);function u(){s.$unwatch(),w(a,o),s.$reset(),s.$validate();}function w(m,f){Object.entries(f).forEach(([i,R])=>{let S=isRef(m)?m.value:m,b=isRef(S[i])?S[i].value:S[i],c=isRef(f[i])?f[i]._value:f[i];Array.isArray(c)&&Array.isArray(b)?c.forEach(($,E)=>{w(b[E],c[E]);}):V(c)?w(b,c):isRef(S[i])?S[i].value=c:S[i]=c;});}let T=computed(()=>s.$invalid||s.$pending);async function F(){return s.$touch(),await s.$validate()?d.value:!1}return s.$validate(),{regle:s,errors:y,resetForm:u,validateForm:F,invalid:T,state:d}}return n}var Le=xe();function Je({rules:e,options:r}){return xe(e,r)}export{oe as InternalRuleType,fe as createRule,Je as defineRegleConfig,Re as defineType,j as unwrapRuleParameters,Le as useRegle};
|
|
1
|
+
import {unref,isRef,toRef,computed,ref,toRaw,reactive,shallowRef,onScopeDispose,triggerRef,watch,effectScope,toRefs}from'vue';function M(e){return e.map(t=>t instanceof Function?t():unref(t))}function Ce(e){return e.map(t=>t instanceof Function||isRef(t)?t:toRef(()=>t))}function De(e){let t=e.toString();return (t.includes("=>")?t.split("=>")[0]:t).slice(t.indexOf("(")+1,t.indexOf(")")).split(",").map(s=>s.trim()).filter(s=>s.includes("=")).length+e.length}function ie(e,...t){let{message:r,validator:n,active:a,...s}=e,$=n.constructor.name==="AsyncFunction";return {...{validator(v,...l){return e.validator(v,...M(l.length?l:t))},message(v,l){return typeof e.message=="function"?e.message(v,{...l,$params:M(l.$params?.length?l.$params:t)}):e.message},active(v,l){return typeof e.active=="function"?e.active(v,{...l,$params:M(l.$params?.length?l.$params:t)}):e.active??!0},exec(v){let l=e.validator(v,...M(t)),o;return l instanceof Promise?l.then(C=>(o=C,typeof o=="object"&&"$valid"in o?o.$valid:typeof o=="boolean"?o:!1)):(o=l,typeof o=="object"&&"$valid"in o?o.$valid:typeof o=="boolean"?o:!1)}},...s,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:$,_params:Ce(t)}}function ue(e){if(typeof e.validator=="function"){let r=ie(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(De(e.validator)>1){let a=function(...s){return ie(e,...s)};return a.validator=r.validator,a.message=r.message,a.active=r.active,a.type=r.type,a.exec=r.exec,a._validator=r.validator,a._message=r.message,a._active=r.active,a._type=e.type,a._patched=!1,a._async=n,a}else return r}throw new Error("Validator must be a function")}function ce(e){return e}function k(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Pe(e){return k(e.value)}function B(e){let t=e,r={}.toString.call(e).slice(8,-1);if(r=="Set"&&(t=new Set([...e].map(n=>B(n)))),r=="Map"&&(t=new Map([...e].map(n=>[B(n[0]),B(n[1])]))),r=="Date"&&(t=new Date(e.getTime())),r=="RegExp"&&(t=RegExp(e.source,Ke(e))),r=="Array"||r=="Object"){t=Array.isArray(e)?[]:{};for(let n in e)t[n]=B(e[n]);}return t}function Ke(e){if(typeof e.source.flags=="string")return e.source.flags;{let t=[];return e.global&&t.push("g"),e.ignoreCase&&t.push("i"),e.multiline&&t.push("m"),e.sticky&&t.push("y"),e.unicode&&t.push("u"),t.join("")}}function fe(e,t,r){return e instanceof Function?e(t,r??0):e}function ee(e){return e==null?!0:e===!1?!1:e instanceof Date?isNaN(e.getTime()):Array.isArray(e)?e.length===0:typeof e=="object"&&e!=null?Object.keys(e).length===0:typeof e=="string"?!String(e.trim()).length:!1}function Re(e,t,r){let n,a=(...s)=>new Promise($=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...s])).then($);},t);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...s)=>new Promise($=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...s])).then($);},0);}),a}function pe(){let e=shallowRef(new Map),t=shallowRef(new Map),r=shallowRef(new Map),n=shallowRef(new Map),a=shallowRef(new Map),s=shallowRef(new Map);function $(p){let R=t.value.get(p);if(R)return R;{let c=ref({});return t.value.set(p,c),c}}function T(p){let R=r.value.get(p);if(R)return R;{let c=ref([]);return r.value.set(p,c),c}}function D(p,R,c){s.value.set(`${p}-${R}`,c);}function v(p,R){return s.value.get(`${p}-${R}`)}function l(p,R){p&&R!=null&&s.value.delete(`${p}-${R}`);}function o(p,R){n.value.set(p,R);}function C(p){return n.value.get(p)??!1}function E(p,R){e.value.set(p,R);}function g(p,R){let c=e.value.get(p);return c?u(R,c)?{valid:!0}:{valid:!1}:void 0}function u(p,R){let c=Object.keys(R),I=Object.keys(p);return I.length!==c.length||!I.every(y=>c.includes(y))?!1:I.every(y=>{let d=p[y],i=R[y];return !i||!d||typeof d=="function"||typeof i=="function"||typeof d=="number"||typeof d=="boolean"?!1:d._params?d._params?.every((f,h)=>{if(typeof i=="number"||typeof i=="boolean")return !0;{let m=M(i._params),P=M(d._params);return m?.[h]===P?.[h]}}):!0})}function A(p){let R=a.value.get(p);if(R)return R;{let c=ref(!1),I=ref(!0),S=ref({}),y=ref(!1);return a.value.set(p,{$pending:c,$valid:I,$metadata:S,$validating:y}),{$pending:c,$valid:I,$metadata:S,$validating:y}}}return onScopeDispose(()=>{e.value.clear(),t.value.clear(),r.value.clear(),n.value.clear(),a.value.clear(),s.value.clear();}),{addRuleDeclEntry:E,setDirtyEntry:o,checkRuleDeclEntry:g,getDirtyState:C,trySetRuleStatusRef:A,getFieldsEntry:$,getCollectionsEntry:T,getArrayStatus:v,addArrayStatus:D,deleteArrayStatus:l,arrayStatusStorage:s}}function we(e,t){return k(e.value)&&k(t.value)&&!Object.entries(t.value).some(r=>de(r))}function Oe(e){return !!e.value&&"$each"in e.value}function Ae(e){return !!e.value&&k(e.value)}function de(e){return k(e)&&"_validator"in e}function X(e){return typeof e.value!="function"}function me(e){return k(e)&&"$fields"in e}function ge(e){return !!e&&"$each"in e}function $e(e){return !!e&&"$rules"in e}function ve(e){return "$each"in e||"$errors"in e}function G({field:e,silent:t=!1}){return Object.entries(e.$rules??{}).map(([r,n])=>t||!n.$valid&&e.$dirty?n.$message:null).filter(r=>!!r).reduce((r,n)=>typeof n=="string"?r?.concat([n]):r?.concat(n),[]).concat(e.$externalErrors??[])}function Me(e,t=!1){return me(e)?q(e.$fields):ge(e)?{$errors:e.$field.$rules?G({field:e.$field,silent:t}):[],$each:e.$each.map(r=>Me(r,t))}:$e(e)?e.$error?G({field:e,silent:t}):e.$externalErrors??[]:[]}function te(e,t=!1){return e.map(r=>Me(r,t))}function q(e,t=!1){return Object.fromEntries(Object.entries(e).map(([r,n])=>me(n)?[r,q(n.$fields,t)]:ge(n)?[r,{$errors:G({field:n.$field,silent:t}),$each:te(n.$each,t)}]:$e(n)?n.$error?[r,G({field:n,silent:t})]:[r,n.$externalErrors??[]]:[r,[]]))}function Fe(e){return computed(()=>q(e.$fields))}var re=(r=>(r.Inline="__inline",r.Async="__async",r))(re||{});function Ve(e,t){return computed(()=>e.value.some(r=>r[t]))}function _e(e,t){return computed(()=>e.value.reduce((r,n)=>{let a=n[t]||[];return r.concat(a)},[]))}function rt(){return Math.floor(Math.random()*Date.now()).toString()}function ye(){return typeof window>"u"?rt():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(10)}function Ge({$dirty:e,customMessages:t,rule:r,ruleKey:n,state:a,path:s,storage:$}){let T=effectScope(),D,v,{$pending:l,$valid:o,$metadata:C,$validating:E}=$.trySetRuleStatusRef(`${s}.${n}`);function g(){D=T.run(()=>{let R=computed(()=>({$invalid:!o.value,$params:d.value,...C.value})),c=computed(()=>X(r)?typeof r.value.active=="function"?r.value.active(a.value,R.value):r.value.active:!0),I=computed(()=>{let f="",h=t?t[n]?.message:void 0;return h&&(typeof h=="function"?f=h(a.value,R.value):f=h),X(r)&&(h&&!r.value._patched||(typeof r.value.message=="function"?f=r.value.message(a.value,R.value):f=r.value.message)),ee(f)&&(f="Error",console.warn(`No error message defined for ${s}.${n}`)),f}),S=computed(()=>X(r)&&r.value.type?Object.values(re).includes(r.value.type)?n:r.value.type:n),y=computed(()=>X(r)?r.value.validator:r.value),d=computed(()=>typeof r.value=="function"?[]:M(r.value._params??[])),i=computed(()=>`${s}.${S.value}`);return {$active:c,$message:I,$type:S,$validator:y,$params:d,$path:i}}),v=watch(D.$params,u,{deep:!0});}g();async function u(){E.value=!0;let R=D.$validator.value,c=!1,I=R(a.value,...D.$params.value);if(I instanceof Promise){if(!l.value)try{o.value=!0,e.value&&(l.value=!0);let S=await I;if(typeof S=="boolean")c=S;else {let{$valid:y,...d}=S;c=y,C.value=d;}}catch{c=!1;}finally{l.value=!1;}}else if(I!=null)if(typeof I=="boolean")c=I;else {let{$valid:S,...y}=I;c=S,C.value=y;}return o.value=c,E.value=!1,c}function A(){o.value=!0,C.value={},l.value=!1,E.value=!1,g();}function p(){v(),T.stop(),T=effectScope();}return reactive({...D,$pending:l,$valid:o,$metadata:C,$validate:u,$unwatch:p,$watch:g,$reset:A})}function ne({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:s,externalErrors:$,index:T,onUnwatch:D}){let v=effectScope(),l,o=ref(!1),C=ref(!1),E=ref([]),g,u,A,p,R=()=>{};function c(){E.value=$.value??[];}c();function I(){let b=t.value,x=a.checkRuleDeclEntry(n,b);f.value=Object.fromEntries(Object.entries(b).filter(([O])=>O.startsWith("$"))),i.value=Object.fromEntries(Object.entries(t.value).filter(([O])=>!O.startsWith("$")).map(([O,_])=>{if(_){let oe=toRef(()=>_);return [O,Ge({$dirty:o,customMessages:r,rule:oe,ruleKey:O,state:e,path:n,storage:a})]}return []}).filter(O=>!!O.length)),y(),R=l.$debounce.value?Re(d,l.$debounce.value??0):d,x?.valid!=null&&(o.value=a.getDirtyState(n),o.value&&R()),a.addRuleDeclEntry(n,b);}function S(){i.value&&Object.entries(i.value).forEach(([b,x])=>{x.$unwatch();}),p(),o.value&&a.setDirtyEntry(n,o.value),g(),u(),A(),v.stop(),v=effectScope(),D?.();}function y(){i.value&&Object.entries(i.value).forEach(([b,x])=>{x.$watch();}),l=v.run(()=>{let b=computed(()=>o.value),x=computed(()=>f.value.$debounce),O=computed(()=>f.value.$lazy!=null?f.value.$lazy:unref(s.lazy)),_=computed(()=>f.value.$rewardEarly!=null?f.value.$rewardEarly:unref(s.rewardEarly)),oe=computed(()=>f.value.$autoDirty!=null?f.value.$autoDirty:unref(s.autoDirty)),Le=computed(()=>se.value&&!xe.value&&o.value),Je=computed(()=>G({field:{$dirty:o.value,$externalErrors:E.value,$rules:i.value}})),Qe=computed(()=>G({field:{$dirty:o.value,$externalErrors:E.value,$rules:i.value},silent:!0})),xe=computed(()=>C.value||!_.value?Object.entries(i.value).some(([K,Q])=>Q.$pending):!1),se=computed(()=>E.value?.length?!0:!_.value||_.value&&C.value?Object.entries(i.value).some(([K,Q])=>!Q.$valid):!1),Ie=computed(()=>o.value&&!ee(e.value)?E.value?.length?!1:_.value?Object.entries(i.value).every(([K,Q])=>Q.$valid):!se.value:!1);return watch(Ie,K=>{K&&(C.value=!1);}),{$error:Le,$pending:xe,$invalid:se,$valid:Ie,$debounce:x,$lazy:O,$errors:Je,$silentErrors:Qe,$rewardEarly:_,$autoDirty:oe,$anyDirty:b}}),A=watch($,c),g=watch(e,()=>{l.$autoDirty.value&&(o.value||(o.value=!0)),t.value instanceof Function&&I(),R(),l.$rewardEarly.value;},{deep:!0}),p=watch(o,()=>{a.setDirtyEntry(n,o.value),P();}),u=watch(l.$valid,b=>{l.$rewardEarly.value&&b&&(C.value=!1);});}function d(){Object.entries(i.value).forEach(([b,x])=>{x.$validate();});}let i=ref(),f=ref();I();function h(){o.value=!1,E.value=[],Object.entries(i.value).forEach(([b,x])=>{x.$reset();}),l.$lazy.value||Object.entries(i.value).map(([b,x])=>x.$validate());}function m(){o.value=!0,l.$rewardEarly.value;}let P=l.$debounce.value?Re(w,l.$debounce.value??0):w;async function w(){try{if(C.value=!0,l.$anyDirty.value&&!l.$pending)return !l.$error.value;{let b=Object.entries(i.value).map(([O,_])=>_.$validate());return (await Promise.allSettled(b)).every(O=>O.status==="fulfilled"?O.value:!1)}}catch{return !1}}function F(){E.value=[];}return l.$lazy.value||w(),reactive({$dirty:o,$anyDirty:l.$anyDirty,$invalid:l.$invalid,$error:l.$error,$pending:l.$pending,$valid:l.$valid,$errors:l.$errors,$silentErrors:l.$silentErrors,$externalErrors:E,$value:e,$rules:i,$reset:h,$touch:m,$validate:P,$unwatch:S,$watch:y,$clearExternalErrors:F})}function We({$id:e,path:t,index:r,options:n,storage:a,value:s,customMessages:$,rules:T,externalErrors:D}){let v=T.$key?T.$key:ye(),l=`${t}.${String(v)}`;typeof s[r]=="object"&&s[r]!=null&&(s[r].$id?l=`${t}.${s[r].$id}`:Object.defineProperties(s[r],{$id:{value:v,enumerable:!1,configurable:!1,writable:!1}}));let o=toRefs(s),C=toRef(()=>D.value?.[r]),E=le({state:o[r],rulesDef:toRef(()=>T),customMessages:$,path:l,storage:a,options:n,externalErrors:C});if(E){let g=s[r]?.$id;E.$id=g??String(v),a.addArrayStatus(e,E.$id,E);}return E}function Ne({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:s,externalErrors:$}){let T=effectScope(),D,v=effectScope(),l;if(Array.isArray(e.value)&&!t.value.$each)return null;let o=ref(),C=ref(e.value),E=null,g=ref({}),u=a.getCollectionsEntry(n);l=v.run(()=>{let i=computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(m=>typeof m!="object"):t.value.$each&&!(t.value.$each instanceof Function)?Object.values(t.value.$each).every(m=>de(m)):!1),f=computed(()=>$.value?ve($.value)?$.value.$errors??[]:[]:[]),h=computed(()=>$.value?ve($.value)?$.value.$each??[]:[]:[]);return {isPrimitiveArray:i,$externalErrorsField:f,$externalErrorsEach:h}}),A(),R();function A(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(o.value=ye(),Object.defineProperties(e.value,{$id:{value:o.value,enumerable:!1,configurable:!1,writable:!1}})):e.value?.$id&&(o.value=e.value.$id)),!l.isPrimitiveArray.value&&(C.value=g.value.$value,Array.isArray(e.value)&&t.value.$each?u.value=e.value.map((i,f)=>{let h=fe(t.value.$each,toRef(()=>e.value[f]),f);if(h){let m=We({$id:o.value,path:n,rules:h,value:e.value,index:f,options:s,storage:a,externalErrors:l.$externalErrorsEach});return m||null}}).filter(i=>!!i):u.value=[],g.value=ne({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:s,externalErrors:l.$externalErrorsField}));}function p(){if(Array.isArray(e.value)){let i=B(u.value);u.value=e.value.map((f,h)=>{if(f.$id&&u.value.find(m=>m.$id===f.$id)){let m=a.getArrayStatus(o.value,f.$id);return m?(m.$value=toRef(()=>f),m):null}else {let m=fe(t.value.$each,toRef(()=>toRef(()=>f)),h);if(m){let P=We({$id:o.value,path:n,rules:m,value:e.value,index:h,options:s,storage:a,externalErrors:l.$externalErrorsEach});return P||null}}}).filter(f=>!!f),i.filter(f=>!e.value.find(h=>f.$id===h.$id)).forEach((f,h)=>{a.deleteArrayStatus(o.value,h.toString());});}else u.value=[];}function R(){E=watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")?A():p();},{deep:!0,flush:"pre"}),D=T.run(()=>{let i=computed(()=>g.value.$dirty&&u.value.every(x=>x.$dirty)),f=computed(()=>g.value.$anyDirty||u.value.some(x=>x.$dirty)),h=computed(()=>g.value.$invalid||u.value.some(x=>x.$invalid)),m=computed(()=>g.value.$valid||u.value.some(x=>x.$valid)),P=computed(()=>g.value.$error||u.value.some(x=>x.$error)),w=computed(()=>g.value.$pending||u.value.some(x=>x.$pending)),F=computed(()=>({$errors:G({field:g.value,silent:!1}),$each:te(u.value)})),b=computed(()=>({$errors:G({field:g.value,silent:!0}),$each:te(u.value,!0)}));return {$dirty:i,$anyDirty:f,$invalid:h,$valid:m,$error:P,$pending:w,$errors:F,$silentErrors:b}}),l.isPrimitiveArray.value&&(console.warn(`${n} is a Array of primitives. Tracking can be lost when reassigning the Array. We advise to use an Array of objects instead`),E());}function c(){E&&E(),g.value&&g.value.$unwatch(),u.value&&u.value.forEach(i=>{"$dirty"in i&&i.$unwatch();}),T.stop(),T=effectScope(),v.stop(),v=effectScope(!0);}function I(){g.value.$touch(),u.value.forEach(i=>{i.$touch();});}function S(){g.value.$reset(),u.value.forEach(i=>{i.$reset();});}async function y(){try{return (await Promise.all([g.value.$validate(),...u.value.map(f=>f.$validate())])).every(f=>!!f)}catch{return !1}}function d(){}return reactive({$field:g,...D,$each:u,$value:e,$validate:y,$unwatch:c,$watch:R,$touch:I,$reset:S,$clearExternalErrors:d})}function be({scopeRules:e,state:t,customMessages:r,path:n="",rootRules:a,storage:s,options:$,externalErrors:T,validationGroups:D}){let v,l,o;function g(y=!0,d=!1){u.value=null,triggerRef(u);let i=Object.fromEntries(Object.entries(e.value).map(([m,P])=>{if(P){let w=toRef(t.value,m),F=toRef(()=>P),b=toRef(()=>T.value?.[m]);return [m,le({state:w,rulesDef:F,customMessages:r,path:n?`${n}.${m}`:m,storage:s,options:$,externalErrors:b})]}return []}).filter(m=>!!m.length&&m[1]!=null)),f=Object.fromEntries(Object.entries(unref(T)??{}).filter(([m])=>!(m in e.value)).map(([m,P])=>{if(P){let w=toRef(()=>({})),F=toRef(()=>P);return [m,le({state:ref(void 0),rulesDef:w,customMessages:r,path:n?`${n}.${m}`:m,storage:s,options:$,externalErrors:F})]}return []})),h=Object.fromEntries(Object.entries(D?.(i)??{}).map(([m,P])=>P.length?[m,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(w=>[w,Ve(toRef(()=>P),w)])),...Object.fromEntries(["$errors","$silentErrors"].map(w=>[w,_e(toRef(()=>P),w)]))}]:[]));u.value={...i,...f,...h},y&&c();}let u=s.getFieldsEntry(n);g();function A(){g(!1),Object.entries(u.value).forEach(([y,d])=>{d.$reset();}),c();}function p(){Object.entries(u.value).forEach(([y,d])=>{d.$touch();});}async function R(){try{return (await Promise.allSettled(Object.entries(u.value).map(([d,i])=>i.$validate()))).every(d=>d.status==="fulfilled"?d.value:!1)}catch{return !1}}function c(){a&&(o=watch(a,()=>{I(),g();},{deep:!0,flush:"post"})),v=effectScope(),l=v.run(()=>{let y=computed(()=>!!Object.entries(u.value).length&&Object.entries(u.value).every(([F,b])=>b.$dirty)),d=computed(()=>Object.entries(u.value).some(([F,b])=>b.$dirty)),i=computed(()=>Object.entries(u.value).some(([F,b])=>b.$invalid)),f=computed(()=>!i.value),h=computed(()=>Object.entries(u.value).some(([F,b])=>b.$error)),m=computed(()=>Object.entries(u.value).some(([F,b])=>b.$pending)),P=computed(()=>q(u.value)),w=computed(()=>q(u.value,!0));return {$dirty:y,$anyDirty:d,$invalid:i,$valid:f,$error:h,$pending:m,$errors:P,$silentErrors:w}});}function I(){u.value&&Object.entries(u.value).forEach(([y,d])=>{d.$unwatch();}),o?.(),v.stop(),v=effectScope();}function S(){Object.entries(u.value).forEach(([y,d])=>{d.$clearExternalErrors();});}return reactive({...l,$fields:u,$value:t,$reset:A,$touch:p,$validate:R,$unwatch:I,$watch:c,$clearExternalErrors:S})}function le({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:s,externalErrors:$,index:T,onUnwatch:D}){return Oe(t)?Ne({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:s,index:T,externalErrors:$}):we(e,t)&&Pe(e)?be({scopeRules:t,state:e,customMessages:r,path:n,storage:a,options:s,index:T,externalErrors:$}):Ae(t)?ne({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:s,index:T,externalErrors:$,onUnwatch:D}):null}function he(e,t,r,n){let a=pe(),s=computed(()=>unref(r.externalErrors)),$=reactive(be({rootRules:e,scopeRules:e,state:t,customMessages:n?.(),storage:a,options:r,externalErrors:s,validationGroups:r.validationGroups})),T=Fe($);return {regle:$,errors:T}}function Te(e,t){let r={autoDirty:t?.autoDirty??!0,lazy:t?.lazy??!1,rewardEarly:t?.rewardEarly??!1};function n(a,s,$){let T=isRef(s)?s:computed(typeof s=="function"?s:()=>s),D={...r,...$},v=isRef(a)?a:ref(a),l=B(toRaw(v.value)),{regle:o,errors:C}=he(T,v,D,e);function E(){o.$unwatch(),g(a,l),o.$reset();}function g(p,R){Object.entries(R).forEach(([c,I])=>{let S=isRef(p)?p.value:p,y=isRef(S[c])?S[c].value:S[c],d=isRef(R[c])?R[c]._value:R[c];Array.isArray(d)&&Array.isArray(y)?(S[c]=[],d.forEach((i,f)=>{S[c][f]={},g(S[c][f],d[f]);})):k(d)?g(y,d):isRef(S[c])?S[c].value=d:S[c]=d;});}let u=computed(()=>!(o.$invalid||o.$pending));async function A(){return o.$touch(),await o.$validate()?v.value:!1}return {regle:o,errors:C,resetAll:E,validateState:A,ready:u,state:v}}return n}var ze=Te();function qe({rules:e,modifiers:t}){return Te(e,t)}export{re as InternalRuleType,ue as createRule,qe as defineRegleConfig,ce as defineType,M as unwrapRuleParameters,ze as useRegle};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@regle/core",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "Typescript
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "Typescript-first model-based validation library for Vue 3",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"vue": "^3.1.0"
|
|
7
7
|
},
|