@regle/core 0.0.16 → 0.1.1
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 +25 -21
- package/dist/index.js +1 -1
- package/package.json +2 -2
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,7 +71,7 @@ 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
77
|
type RegleValidationGroupEntry = RegleFieldStatus<any, any, any> | RegleCollectionStatus<any, any>;
|
|
@@ -98,8 +98,8 @@ interface Regle<TState extends Record<string, any> = EmptyObject, TRules extends
|
|
|
98
98
|
*/
|
|
99
99
|
errors: RegleErrorTree<TRules, TExternal>;
|
|
100
100
|
invalid: ComputedRef<boolean>;
|
|
101
|
-
|
|
102
|
-
|
|
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>> = {
|
|
@@ -176,7 +176,7 @@ type DefaultMetadataProperties = Pick<ExcludeByType<RegleCommonStatus, Function>
|
|
|
176
176
|
/**
|
|
177
177
|
* Will be used to consumme metadata on related helpers and rule status
|
|
178
178
|
*/
|
|
179
|
-
type RegleRuleMetadataConsumer<TParams extends any[] =
|
|
179
|
+
type RegleRuleMetadataConsumer<TParams extends any[] = never, TMetadata extends RegleRuleMetadataDefinition = boolean> = DefaultMetadataProperties & (TParams extends never ? {} : {
|
|
180
180
|
$params: TParams;
|
|
181
181
|
}) & (Exclude<TMetadata, boolean> extends RegleRuleMetadataExtended ? TMetadata extends boolean ? Partial<Omit<Exclude<TMetadata, boolean>, '$valid'>> : Omit<Exclude<TMetadata, boolean>, '$valid'> : {});
|
|
182
182
|
/**
|
|
@@ -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 = {
|
|
@@ -296,12 +300,12 @@ type RegleCollectionRuleDecl<TValue = any[], TCustomRules extends Partial<AllRul
|
|
|
296
300
|
/**
|
|
297
301
|
* @public
|
|
298
302
|
*/
|
|
299
|
-
type InlineRuleDeclaration<TValue extends any = any, TReturn extends RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition> = RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition>> = (value: Maybe<TValue>, ...args:
|
|
303
|
+
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
304
|
/**
|
|
301
305
|
* @public
|
|
302
306
|
* Regroup inline and registered rules
|
|
303
307
|
* */
|
|
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>;
|
|
308
|
+
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
309
|
|
|
306
310
|
type RegleErrorTree<TRules extends ReglePartialValidationTree<any, any>, TExternal extends RegleExternalErrorTree<Record<string, unknown>> = never> = {
|
|
307
311
|
readonly [K in keyof TRules]: RegleValidationErrors<TRules[K], K extends keyof TExternal ? TExternal[K] : never>;
|
|
@@ -350,7 +354,7 @@ interface RegleFieldStatus<TRules extends RegleFormPropertyType<any, Partial<All
|
|
|
350
354
|
readonly $errors: string[];
|
|
351
355
|
readonly $silentErrors: string[];
|
|
352
356
|
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>;
|
|
357
|
+
readonly [TRuleKey in keyof TRules]: RegleRuleStatus<TState[TKey], TRules[TRuleKey] extends RegleRuleDefinition<any, infer TParams, any> ? TParams : [], TRules[TRuleKey] extends RegleRuleDefinition<any, any, any, infer TMetadata> ? TMetadata : TRules[TRuleKey] extends InlineRuleDeclaration<any, any[], infer TMetadata> ? TMetadata extends Promise<infer P> ? P : TMetadata : never>;
|
|
354
358
|
};
|
|
355
359
|
}
|
|
356
360
|
/**
|
|
@@ -398,7 +402,7 @@ interface RegleCollectionStatus<TRules extends RegleRuleDecl | ReglePartialValid
|
|
|
398
402
|
|
|
399
403
|
/**
|
|
400
404
|
* @description
|
|
401
|
-
* Create a typed custom rule that can be used like default
|
|
405
|
+
* Create a typed custom rule that can be used like default rules.
|
|
402
406
|
* It can also be declared in the global options
|
|
403
407
|
*
|
|
404
408
|
* It will automatically detect if the rule is async
|
|
@@ -414,7 +418,7 @@ interface RegleCollectionStatus<TRules extends RegleRuleDecl | ReglePartialValid
|
|
|
414
418
|
*
|
|
415
419
|
* ```ts
|
|
416
420
|
* // Create a simple rule with no params
|
|
417
|
-
* import {ruleHelpers} from '@regle/
|
|
421
|
+
* import {ruleHelpers} from '@regle/rules';
|
|
418
422
|
*
|
|
419
423
|
* export const isFoo = createRule({
|
|
420
424
|
* type: defineType<string>('foo'),
|
|
@@ -443,7 +447,7 @@ declare function unwrapRuleParameters<TParams extends any[]>(params: ParamDecl[]
|
|
|
443
447
|
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
448
|
|
|
445
449
|
/**
|
|
446
|
-
* Root function that allows you to define project-wise all your custom
|
|
450
|
+
* Root function that allows you to define project-wise all your custom rules or overwrite default ones
|
|
447
451
|
*
|
|
448
452
|
* It will return utility functions that let you build type-safe forms
|
|
449
453
|
*
|
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 De(e){return e.map(r=>r instanceof Function||isRef(r)?r:toRef(()=>r))}function Ie(e){let r=e.toString();return (r.includes("=>")?r.split("=>")[0]:r).slice(r.indexOf("(")+1,r.indexOf(")")).split(",").map(l=>l.trim()).filter(l=>l.includes("=")).length+e.length}function ue(e,...r){let{message:t,validator:n,active:a,...l}=e,g=n.constructor.name==="AsyncFunction";return {...{validator(d,...o){return e.validator(d,...j(o.length?o:r))},message(d,o){return typeof e.message=="function"?e.message(d,{...o,$params:j(o.$params?.length?o.$params:r)}):e.message},active(d,o){return typeof e.active=="function"?e.active(d,{...o,$params:j(o.$params?.length?o.$params:r)}):e.active??!0},exec(d){let o=e.validator(d,...j(r)),s;return o instanceof Promise?o.then(y=>(s=y,typeof s=="object"&&"$valid"in s?s.$valid:typeof s=="boolean"?s:!1)):(s=o,typeof s=="object"&&"$valid"in s?s.$valid:typeof s=="boolean"?s:!1)}},...l,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:g,_params:De(r)}}function ce(e){if(typeof e.validator=="function"){let t=ue(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(Ie(e.validator)>1){let a=function(...l){return ue(e,...l)};return a.validator=t.validator,a.message=t.message,a.active=t.active,a.type=t.type,a.exec=t.exec,a._validator=t.validator,a._message=t.message,a._active=t.active,a._type=e.type,a._patched=!1,a._async=n,a}else return t}throw new Error("Validator must be a function")}function fe(e){return e}function V(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ce(e){return V(e.value)}function U(e){let r=e,t={}.toString.call(e).slice(8,-1);if(t=="Set")return new Set([...e].map(n=>U(n)));if(t=="Map")return new Map([...e].map(n=>[U(n[0]),U(n[1])]));if(t=="Date")return new Date(e.getTime());if(t=="RegExp")return RegExp(e.source,et(e));if(t=="Array"||t=="Object"){r=Array.isArray(e)?[]:{};for(let n in e)r[n]=U(e[n]);}return r}function et(e){if(typeof e.source.flags=="string")return e.source.flags;{let r=[];return e.global&&r.push("g"),e.ignoreCase&&r.push("i"),e.multiline&&r.push("m"),e.sticky&&r.push("y"),e.unicode&&r.push("u"),r.join("")}}function G(e,r,t){return e instanceof Function?e(r,t??0):e}function Pe(e){return e==null?!0:e===!1?!1:e instanceof Date?isNaN(e.getTime()):Array.isArray(e)?e.length===0:typeof e=="object"&&e!=null?Object.keys(e).length===0:typeof e=="number"?isNaN(e):!String(e).trim().length}function Re(e,r,t){let n,a=(...l)=>new Promise(g=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(g);},r);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...l)=>new Promise(g=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(g);},0);}),a}function pe(){let e=shallowRef(new Map),r=shallowRef(new Map),t=shallowRef(new Map),n=shallowRef(new Map),a=shallowRef(new Map),l=shallowRef(new Map);function g(m){let f=r.value.get(m);if(f)return f;{let i=ref({});return r.value.set(m,i),i}}function h(m){let f=t.value.get(m);if(f)return f;{let i=ref([]);return t.value.set(m,i),i}}function C(m,f,i){l.value.set(`${m}-${f}`,i);}function d(m,f){return l.value.get(`${m}-${f}`)}function o(m,f){m&&f!=null&&l.value.delete(`${m}-${f}`);}function s(m,f){n.value.set(m,f);}function y(m){return n.value.get(m)??!1}function u(m,f){e.value.set(m,f);}function w(m,f){let i=e.value.get(m);return i?T(f,i)?{valid:!0}:{valid:!1}:void 0}function T(m,f){let i=Object.keys(f),R=Object.keys(m);return R.length!==i.length||!R.every(b=>i.includes(b))?!1:R.every(b=>{let c=m[b],$=f[b];return !$||!c||typeof c=="function"||typeof $=="function"||typeof c=="number"||typeof c=="boolean"?!1:c._params?c._params?.every((E,A)=>{if(typeof $=="number"||typeof $=="boolean")return !0;{let p=j($._params),x=j(c._params);return p?.[A]===x?.[A]}}):!0})}function F(m){let f=a.value.get(m);if(f)return f;{let i=ref(!1),R=ref(!0),S=ref({}),b=ref(!1);return a.value.set(m,{$pending:i,$valid:R,$metadata:S,$validating:b}),{$pending:i,$valid:R,$metadata:S,$validating:b}}}return onScopeDispose(()=>{e.value.clear(),r.value.clear(),t.value.clear(),n.value.clear(),a.value.clear(),l.value.clear();}),{addRuleDeclEntry:u,setDirtyEntry:s,checkRuleDeclEntry:w,getDirtyState:y,trySetRuleStatusRef:F,getFieldsEntry:g,getCollectionsEntry:h,getArrayStatus:d,addArrayStatus:C,deleteArrayStatus:o,arrayStatusStorage:l}}function we(e,r){let t=G(r.value,e.value);return V(e.value)&&V(t)&&!Object.entries(t).some(n=>de(n))}function Oe(e,r){let t=G(e.value,r.value);return !!t&&"$each"in t}function Me(e){return !!e&&V(e.value)}function de(e){return V(e)&&"_validator"in e}function Z(e){return typeof e.value!="function"}function K(e){return V(e)&&"$fields"in e}function ee(e){return !!e&&"$each"in e}function te(e){return !!e&&"$rules"in e}function me(e){return "$each"in e||"$errors"in e}function B({field:e,silent:r=!1}){return Object.entries(e.$rules??{}).map(([t,n])=>r||!n.$valid&&e.$dirty?n.$message:null).filter(t=>!!t).reduce((t,n)=>typeof n=="string"?t?.concat([n]):t?.concat(n),[]).concat(e.$externalErrors??[])}function Ae(e){return K(e)?ye(e.$fields):ee(e)?{$errors:e.$rules?B({field:e}):[],$each:e.$each.map(Ae)}:te(e)?e.$error?B({field:e}):e.$externalErrors??[]:[]}function nt(e){return e.$each.map(Ae)}function ye(e){return Object.fromEntries(Object.entries(e).map(([r,t])=>K(t)?[r,ye(t.$fields)]:ee(t)?[r,{...t.$rules&&{$errors:B({field:t})},$each:nt(t)}]:te(t)?t.$error?[r,B({field:t})]:[r,t.$externalErrors??[]]:[r,[]]))}function Fe(e){return computed(()=>ye(e.$fields))}var oe=(t=>(t.Inline="__inline",t.Async="__async",t))(oe||{});function Ve(e,r){return computed(()=>e.value.some(t=>t[r]))}function _e(e,r){return computed(()=>e.value.reduce((t,n)=>{let a=n[r]||[];return t.concat(a)},[]))}function at(){return Math.floor(Math.random()*Date.now()).toString()}function ge(){return typeof window>"u"?at():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(8)}function Be({$dirty:e,customMessages:r,rule:t,ruleKey:n,state:a,path:l,storage:g}){let h=effectScope(),C,d,{$pending:o,$valid:s,$metadata:y,$validating:u}=g.trySetRuleStatusRef(`${l}.${n}`);function w(){C=h.run(()=>{let f=computed(()=>({$invalid:!s.value,$params:c.value,...y.value})),i=computed(()=>Z(t)?typeof t.value.active=="function"?t.value.active(a.value,f.value):t.value.active:!0),R=computed(()=>{let E="",A=r?r[n]?.message:void 0;return A&&(typeof A=="function"?E=A(a.value,f.value):E=A),Z(t)&&(A&&!t.value._patched||(typeof t.value.message=="function"?E=t.value.message(a.value,f.value):E=t.value.message)),Pe(E)&&(E="Error",console.warn(`No error message defined for ${l}.${n}`)),E}),S=computed(()=>Z(t)&&t.value.type?Object.values(oe).includes(t.value.type)?n:t.value.type:n),b=computed(()=>Z(t)?t.value.validator:t.value),c=computed(()=>typeof t.value=="function"?[]:j(t.value._params??[])),$=computed(()=>`${l}.${S.value}`);return {$active:i,$message:R,$type:S,$validator:b,$params:c,$path:$}}),d=watch(C.$params,T,{deep:!0});}w();async function T(){u.value=!0;let f=C.$validator.value,i=!1,R=f(a.value,...C.$params.value);if(R instanceof Promise){if(!o.value)try{s.value=!0,e.value&&(o.value=!0);let S=await R;if(typeof S=="boolean")i=S;else {let{$valid:b,...c}=S;i=b,y.value=c;}}catch{i=!1;}finally{o.value=!1;}}else if(R!=null)if(typeof R=="boolean")i=R;else {let{$valid:S,...b}=R;i=S,y.value=b;}return s.value=i,u.value=!1,i}function F(){s.value=!0,y.value={},o.value=!1,u.value=!1,w();}function m(){d(),h.stop(),h=effectScope();}return reactive({...C,$pending:o,$valid:s,$metadata:y,$validate:T,$unwatch:m,$watch:w,$reset:F})}function se({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:l,externalErrors:g,index:h,onUnwatch:C}){let d=effectScope(),o,s=ref(!1),y=ref(!1),u=ref([]),w,T,F,m,f=()=>{};function i(){u.value=g.value??[];}i();function R(){let v=r.value,O=a.checkRuleDeclEntry(n,v);E.value=Object.fromEntries(Object.entries(v).filter(([P])=>P.startsWith("$")));let I=G(r.value,e.value,h);$.value=Object.fromEntries(Object.entries(I).filter(([P])=>!P.startsWith("$")).map(([P,X])=>{if(X){let H=toRef(()=>X);return [P,Be({$dirty:s,customMessages:t,rule:H,ruleKey:P,state:e,path:n,storage:a,options:l})]}return []}).filter(P=>!!P.length)),b(),f=o.$debounce.value?Re(c,o.$debounce.value??0):c,O?.valid!=null&&(s.value=a.getDirtyState(n),s.value&&f()),a.addRuleDeclEntry(n,v);}function S(){$.value&&Object.entries($.value).forEach(([v,O])=>{O.$unwatch();}),m(),s.value&&a.setDirtyEntry(n,s.value),w(),T(),F(),d.stop(),d=effectScope(),C?.();}function b(){$.value&&Object.entries($.value).forEach(([v,O])=>{O.$watch();}),o=d.run(()=>{let v=computed(()=>s.value),O=computed(()=>E.value.$debounce),I=computed(()=>E.value.$lazy?E.value.$lazy:unref(l.lazy)),P=computed(()=>E.value.$rewardEarly?E.value.$rewardEarly:unref(l.rewardEarly)),X=computed(()=>E.value.$autoDirty?E.value.$autoDirty:unref(l.autoDirty)),H=computed(()=>ie.value&&!xe.value&&s.value),Qe=computed(()=>B({field:{$dirty:s.value,$externalErrors:u.value,$rules:$.value}})),Xe=computed(()=>B({field:{$dirty:s.value,$externalErrors:u.value,$rules:$.value},silent:!0})),xe=computed(()=>y.value||!P.value?Object.entries($.value).some(([le,Y])=>Y.$pending):!1),ie=computed(()=>u.value?.length?!0:!P.value||P.value&&y.value?Object.entries($.value).some(([le,Y])=>!Y.$valid):!1),he=computed(()=>u.value?.length?!1:P.value?Object.entries($.value).every(([le,Y])=>Y.$valid):!ie.value);return watch(he,le=>{le&&(y.value=!1);}),{$error:H,$pending:xe,$invalid:ie,$valid:he,$debounce:O,$lazy:I,$errors:Qe,$silentErrors:Xe,$rewardEarly:P,$autoDirty:X,$anyDirty:v}}),F=watch(g,i),w=watch(e,()=>{o.$autoDirty.value&&(s.value||(s.value=!0)),r.value instanceof Function&&R(),o.$lazy.value||(f(),o.$rewardEarly.value);}),m=watch(s,()=>{a.setDirtyEntry(n,s.value),x();}),T=watch(o.$valid,v=>{o.$rewardEarly.value&&v&&(y.value=!1);});}function c(){Object.entries($.value).forEach(([v,O])=>{O.$validate();});}let $=ref(),E=ref();R();function A(){s.value=!1,u.value=[],Object.entries($.value).forEach(([v,O])=>{O.$reset();});}function p(){s.value=!0,o.$lazy.value||o.$rewardEarly.value;}let x=o.$debounce.value?Re(D,o.$debounce.value??0):D;async function D(){try{if(y.value=!0,!o.$lazy.value&&o.$anyDirty.value&&!o.$pending)return !o.$error.value;{let v=Object.entries($.value).map(([I,P])=>P.$validate());return (await Promise.allSettled(v)).every(I=>I.status==="fulfilled"?I.value:!1)}}catch{return !1}}function M(){u.value=[];}return reactive({$dirty:s,$anyDirty:o.$anyDirty,$invalid:o.$invalid,$error:o.$error,$pending:o.$pending,$valid:o.$valid,$errors:o.$errors,$silentErrors:o.$silentErrors,$externalErrors:u,$value:e,$rules:$,$reset:A,$touch:p,$validate:x,$unwatch:S,$watch:b,$clearExternalErrors:M})}function Se({$id:e,path:r,index:t,options:n,storage:a,value:l,customMessages:g,rules:h,externalErrors:C}){let d=ge(),o=`${r}.${d}`;typeof l[t]=="object"&&l[t]!=null&&(l[t].$id?o=`${r}.${l[t].$id}`:Object.defineProperties(l[t],{$id:{value:d,enumerable:!1,configurable:!1,writable:!1}}));let s=toRefs(l),y=toRef(()=>C.value?.[t]),u=ae({state:s[t],rulesDef:toRef(()=>h),customMessages:g,path:o,storage:a,options:n,externalErrors:y});if(u){let w=l[t]?.$id;u.$id=w??d,a.addArrayStatus(e,t.toString(),u);}return u}function pt({path:e,index:r,options:t,storage:n,value:a,customMessages:l,rules:g,externalErrors:h}){let C=toRefs(a),d=toRef(()=>h.value?.[r]);return ae({state:C[r],rulesDef:toRef(()=>g),customMessages:l,path:e,storage:n,options:t,externalErrors:d})}function He({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:l,externalErrors:g}){let h=effectScope(),C;if(Array.isArray(e.value)&&!r.value.$each)return null;let d=ref(),o=ref(e.value),s=null,y=ref({}),u=a.getCollectionsEntry(n);F(),w();function w(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(d.value=ge(),Object.defineProperties(e.value,{$id:{value:d.value,enumerable:!1,configurable:!1,writable:!1}})):d.value=e.value?.$id);let{$each:R,$debounce:S,$autoDirty:b,$lazy:c,$rewardEarly:$,...E}=r.value,A=toRef(()=>{if(g.value&&me(g.value))return g.value.$errors}),p=toRef(()=>{if(g.value&&me(g.value))return g.value.$each});if(Array.isArray(e.value)){let x={};["pop","shift","unshift","splice"].forEach(M=>{x[M]=function(...v){pauseTracking(),u.value.forEach(I=>{I.$unwatch(),a.deleteArrayStatus(d.value,I.$id);}),u.value[M](...v);let O=Object.assign([],this)[M].apply(this,v);return u.value=u.value.map((I,P)=>V(I)&&(te(I)||ee(I)||K(I))&&I.$id!=null?pt({$id:d.value,path:`${n}.${I.$id}`,rules:R,value:e.value,index:P,options:l,storage:a,externalErrors:p}):Se({$id:d.value,path:n,rules:R,value:e.value,index:P,options:l,storage:a,externalErrors:p})).filter(I=>!!I),resetTracking(),O};});let D=new Proxy(toRaw(e.value),{get(M,v,O){let I=Reflect.get(M,v,O);return typeof v=="symbol"?I:Array.isArray(M)&&Object.hasOwn(x,v)?Reflect.get(x,v,O):I},deleteProperty(M,v){let O=Reflect.deleteProperty(M,v);return typeof v=="symbol"?!0:(isNaN(parseInt(v))||(u.value.splice(parseInt(v),1),a.deleteArrayStatus(d.value,v)),O)},set(M,v,O){let I=Reflect.set(M,v,O);if(typeof v=="symbol")return !0;if(!isNaN(parseInt(v))){let P=parseInt(v);if(!u.value[P]&&r.value.$each){let H=Se({$id:d.value,value:e.value,rules:r.value.$each,customMessages:t,path:n,storage:a,options:l,index:P,externalErrors:p});H&&(u.value[P]=H);}}return I}});pauseTracking(),e.value=D,resetTracking();}if(y.value=se({state:e,rulesDef:toRef(()=>E),customMessages:t,path:n,storage:a,options:l,externalErrors:A}),o.value=y.value.$value,Array.isArray(e.value)&&R)for(let[x,D]of e.value.entries()){let M=Se({$id:d.value,path:n,rules:R,value:e.value,index:x,options:l,storage:a,externalErrors:p});M&&(u.value[x]=M);}else u.value=[];}function T(){s&&s(),y.value&&y.value.$unwatch(),u.value&&u.value.forEach(R=>{"$dirty"in R&&R.$unwatch();});}function F(){s=watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")&&w();}),C=h.run(()=>{let R=computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(p=>typeof p!="object"):r.value.$each?Object.values(r.value.$each).every(p=>de(p)):!1),S=computed(()=>y.value.$dirty&&u.value.every(p=>p.$dirty)),b=computed(()=>y.value.$anyDirty||u.value.some(p=>p.$dirty)),c=computed(()=>y.value.$invalid||u.value.some(p=>p.$invalid)),$=computed(()=>!c.value),E=computed(()=>y.value.$error||u.value.some(p=>p.$error)),A=computed(()=>y.value.$pending||u.value.some(p=>p.$pending));return {isPrimitiveArray:R,$dirty:S,$anyDirty:b,$invalid:c,$valid:$,$error:E,$pending:A}});}function m(){y.value.$touch(),u.value.forEach(R=>{"$dirty"in R&&R.$touch();});}function f(){y.value.$reset(),u.value.forEach(R=>{"$dirty"in R&&R.$reset();}),y.value.$watch();}async function i(){try{return (await Promise.all([y.value.$validate(),...u.value.map(S=>{if("$dirty"in S)return S.$validate()})])).every(S=>!!S)}catch{return !1}}return reactive({...y.value,$value:o,...C,$each:u,$validate:i,$unwatch:T,$watch:F,$touch:m,$reset:f})}function be({scopeRules:e,state:r,customMessages:t,path:n="",rootRules:a,storage:l,options:g,externalErrors:h,validationGroups:C}){let d,o,s,y;function w(b=!0){T.value=null,triggerRef(T);let c=G(e.value,r.value),$=Object.fromEntries(Object.entries(c).map(([p,x])=>{if(x){let D=toRef(r.value,p),M=toRef(()=>x),v=toRef(()=>h.value?.[p]);return [p,ae({state:D,rulesDef:M,customMessages:t,path:n?`${n}.${p}`:p,storage:l,options:g,externalErrors:v})]}return []}).filter(p=>!!p.length&&p[1]!=null)),E=Object.fromEntries(Object.entries(unref(h)??{}).filter(([p])=>!(p in c)).map(([p,x])=>{if(x){let D=toRef(()=>({})),M=toRef(()=>x);return [p,ae({state:ref(void 0),rulesDef:D,customMessages:t,path:n?`${n}.${p}`:p,storage:l,options:g,externalErrors:M})]}return []})),A=Object.fromEntries(Object.entries(C?.($)??{}).map(([p,x])=>x.length?[p,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(D=>[D,Ve(toRef(()=>x),D)])),...Object.fromEntries(["$errors","$silentErrors"].map(D=>[D,_e(toRef(()=>x),D)]))}]:[]));T.value={...$,...E,...A},b&&i();}let T=l.getFieldsEntry(n);w();function F(){w(!1),Object.entries(T.value).forEach(([b,c])=>{c.$reset();}),i();}function m(){Object.entries(T.value).forEach(([b,c])=>{c.$touch();});}async function f(){try{return (await Promise.allSettled(Object.entries(T.value).map(([c,$])=>$.$validate()))).every(c=>c.status==="fulfilled"?c.value:!1)}catch{return !1}}function i(){a&&(s=watch(a,()=>{R(),w();},{deep:!0,flush:"post"})),e.value instanceof Function&&(y=watch(r,()=>{R(),w();},{deep:!0,flush:"post"})),d=effectScope(),o=d.run(()=>{let b=computed(()=>Object.entries(T.value).every(([x,D])=>D.$dirty)),c=computed(()=>Object.entries(T.value).some(([x,D])=>D.$dirty)),$=computed(()=>Object.entries(T.value).some(([x,D])=>D.$invalid)),E=computed(()=>!$.value),A=computed(()=>Object.entries(T.value).some(([x,D])=>D.$error)),p=computed(()=>Object.entries(T.value).some(([x,D])=>D.$pending));return {$dirty:b,$anyDirty:c,$invalid:$,$valid:E,$error:A,$pending:p}});}function R(){T.value&&Object.entries(T.value).forEach(([b,c])=>{c.$unwatch();}),s?.(),y?.();}function S(){Object.entries(T.value).forEach(([b,c])=>{c.$clearExternalErrors();});}return reactive({...o,$fields:T,$value:r,$reset:F,$touch:m,$validate:f,$unwatch:R,$watch:i,$clearExternalErrors:S})}function ae({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:l,externalErrors:g,index:h,onUnwatch:C}){return Oe(r,e)?He({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:l,index:h,externalErrors:g}):we(e,r)&&Ce(e)?be({scopeRules:r,state:e,customMessages:t,path:n,storage:a,options:l,index:h,externalErrors:g}):Me(r)?se({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:l,index:h,externalErrors:g,onUnwatch:C}):null}function Ee(e,r,t,n){let a=pe(),l=computed(()=>unref(t.$externalErrors)),g=reactive(be({rootRules:e,scopeRules:e,state:r,customMessages:n?.(),storage:a,options:t,externalErrors:l,validationGroups:t.validationGroups})),h=Fe(g);return {regle:g,errors:h}}function Te(e,r){let t={autoDirty:r?.autoDirty??!0,lazy:r?.lazy??!1,rewardEarly:r?.rewardEarly??!1};function n(a,l,g){let h=isRef(l)?l:computed(typeof l=="function"?l:()=>l),C={...t,...g},d=isRef(a)?a:ref(a),o=U(toRaw(d.value)),{regle:s,errors:y}=Ee(h,d,C,e);function u(){s.$unwatch(),w(a,o),s.$reset(),s.$validate();}function w(m,f){Object.entries(f).forEach(([i,R])=>{let S=isRef(m)?m.value:m,b=isRef(S[i])?S[i].value:S[i],c=isRef(f[i])?f[i]._value:f[i];Array.isArray(c)&&Array.isArray(b)?c.forEach(($,E)=>{w(b[E],c[E]);}):V(c)?w(b,c):isRef(S[i])?S[i].value=c:S[i]=c;});}let T=computed(()=>s.$invalid||s.$pending);async function F(){return s.$touch(),await s.$validate()?d.value:!1}return s.$validate(),{regle:s,errors:y,resetForm:u,validateForm:F,invalid:T,state:d}}return n}var Le=Te();function Je({rules:e,options:r}){return Te(e,r)}export{oe as InternalRuleType,ce as createRule,Je as defineRegleConfig,fe as defineType,j as unwrapRuleParameters,Le as useRegle};
|
|
1
|
+
import {unref,isRef,toRef,computed,ref,toRaw,reactive,shallowRef,onScopeDispose,triggerRef,watch,effectScope,toRefs}from'vue';import {pauseTracking,resetTracking}from'@vue/reactivity';function j(e){return e.map(r=>r instanceof Function?r():unref(r))}function Ie(e){return e.map(r=>r instanceof Function||isRef(r)?r:toRef(()=>r))}function Ce(e){let r=e.toString();return (r.includes("=>")?r.split("=>")[0]:r).slice(r.indexOf("(")+1,r.indexOf(")")).split(",").map(l=>l.trim()).filter(l=>l.includes("=")).length+e.length}function ce(e,...r){let{message:t,validator:n,active:a,...l}=e,y=n.constructor.name==="AsyncFunction";return {...{validator(d,...o){return e.validator(d,...j(o.length?o:r))},message(d,o){return typeof e.message=="function"?e.message(d,{...o,$params:j(o.$params?.length?o.$params:r)}):e.message},active(d,o){return typeof e.active=="function"?e.active(d,{...o,$params:j(o.$params?.length?o.$params:r)}):e.active??!0},exec(d){let o=e.validator(d,...j(r)),s;return o instanceof Promise?o.then(v=>(s=v,typeof s=="object"&&"$valid"in s?s.$valid:typeof s=="boolean"?s:!1)):(s=o,typeof s=="object"&&"$valid"in s?s.$valid:typeof s=="boolean"?s:!1)}},...l,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:y,_params:Ie(r)}}function fe(e){if(typeof e.validator=="function"){let t=ce(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(Ce(e.validator)>1){let a=function(...l){return ce(e,...l)};return a.validator=t.validator,a.message=t.message,a.active=t.active,a.type=t.type,a.exec=t.exec,a._validator=t.validator,a._message=t.message,a._active=t.active,a._type=e.type,a._patched=!1,a._async=n,a}else return t}throw new Error("Validator must be a function")}function Re(e){return e}function V(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function we(e){return V(e.value)}function H(e){let r=e,t={}.toString.call(e).slice(8,-1);if(t=="Set")return new Set([...e].map(n=>H(n)));if(t=="Map")return new Map([...e].map(n=>[H(n[0]),H(n[1])]));if(t=="Date")return new Date(e.getTime());if(t=="RegExp")return RegExp(e.source,Ke(e));if(t=="Array"||t=="Object"){r=Array.isArray(e)?[]:{};for(let n in e)r[n]=H(e[n]);}return r}function Ke(e){if(typeof e.source.flags=="string")return e.source.flags;{let r=[];return e.global&&r.push("g"),e.ignoreCase&&r.push("i"),e.multiline&&r.push("m"),e.sticky&&r.push("y"),e.unicode&&r.push("u"),r.join("")}}function oe(e,r,t){return e instanceof Function?e(r,t??0):e}function Pe(e){return e==null?!0:e===!1?!1:e instanceof Date?isNaN(e.getTime()):Array.isArray(e)?e.length===0:typeof e=="object"&&e!=null?Object.keys(e).length===0:typeof e=="number"?isNaN(e):!String(e).trim().length}function pe(e,r,t){let n,a=(...l)=>new Promise(y=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(y);},r);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...l)=>new Promise(y=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...l])).then(y);},0);}),a}function de(){let e=shallowRef(new Map),r=shallowRef(new Map),t=shallowRef(new Map),n=shallowRef(new Map),a=shallowRef(new Map),l=shallowRef(new Map);function y(m){let c=r.value.get(m);if(c)return c;{let i=ref({});return r.value.set(m,i),i}}function I(m){let c=t.value.get(m);if(c)return c;{let i=ref([]);return t.value.set(m,i),i}}function C(m,c,i){l.value.set(`${m}-${c}`,i);}function d(m,c){return l.value.get(`${m}-${c}`)}function o(m,c){m&&c!=null&&l.value.delete(`${m}-${c}`);}function s(m,c){n.value.set(m,c);}function v(m){return n.value.get(m)??!1}function u(m,c){e.value.set(m,c);}function w(m,c){let i=e.value.get(m);return i?x(c,i)?{valid:!0}:{valid:!1}:void 0}function x(m,c){let i=Object.keys(c),R=Object.keys(m);return R.length!==i.length||!R.every(b=>i.includes(b))?!1:R.every(b=>{let f=m[b],$=c[b];return !$||!f||typeof f=="function"||typeof $=="function"||typeof f=="number"||typeof f=="boolean"?!1:f._params?f._params?.every((T,M)=>{if(typeof $=="number"||typeof $=="boolean")return !0;{let p=j($._params),h=j(f._params);return p?.[M]===h?.[M]}}):!0})}function F(m){let c=a.value.get(m);if(c)return c;{let i=ref(!1),R=ref(!0),S=ref({}),b=ref(!1);return a.value.set(m,{$pending:i,$valid:R,$metadata:S,$validating:b}),{$pending:i,$valid:R,$metadata:S,$validating:b}}}return onScopeDispose(()=>{e.value.clear(),r.value.clear(),t.value.clear(),n.value.clear(),a.value.clear(),l.value.clear();}),{addRuleDeclEntry:u,setDirtyEntry:s,checkRuleDeclEntry:w,getDirtyState:v,trySetRuleStatusRef:F,getFieldsEntry:y,getCollectionsEntry:I,getArrayStatus:d,addArrayStatus:C,deleteArrayStatus:o,arrayStatusStorage:l}}function Oe(e,r){return V(e.value)&&V(r.value)&&!Object.entries(r.value).some(t=>me(t))}function Me(e){return !!e.value&&"$each"in e.value}function Ae(e){return !!e.value&&V(e.value)}function me(e){return V(e)&&"_validator"in e}function X(e){return typeof e.value!="function"}function Y(e){return V(e)&&"$fields"in e}function Z(e){return !!e&&"$each"in e}function K(e){return !!e&&"$rules"in e}function ge(e){return "$each"in e||"$errors"in e}function B({field:e,silent:r=!1}){return Object.entries(e.$rules??{}).map(([t,n])=>r||!n.$valid&&e.$dirty?n.$message:null).filter(t=>!!t).reduce((t,n)=>typeof n=="string"?t?.concat([n]):t?.concat(n),[]).concat(e.$externalErrors??[])}function Fe(e){return Y(e)?ye(e.$fields):Z(e)?{$errors:e.$rules?B({field:e}):[],$each:e.$each.map(Fe)}:K(e)?e.$error?B({field:e}):e.$externalErrors??[]:[]}function rt(e){return e.$each.map(Fe)}function ye(e){return Object.fromEntries(Object.entries(e).map(([r,t])=>Y(t)?[r,ye(t.$fields)]:Z(t)?[r,{...t.$rules&&{$errors:B({field:t})},$each:rt(t)}]:K(t)?t.$error?[r,B({field:t})]:[r,t.$externalErrors??[]]:[r,[]]))}function je(e){return computed(()=>ye(e.$fields))}var se=(t=>(t.Inline="__inline",t.Async="__async",t))(se||{});function _e(e,r){return computed(()=>e.value.some(t=>t[r]))}function Ge(e,r){return computed(()=>e.value.reduce((t,n)=>{let a=n[r]||[];return t.concat(a)},[]))}function nt(){return Math.floor(Math.random()*Date.now()).toString()}function ve(){return typeof window>"u"?nt():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(8)}function Be({$dirty:e,customMessages:r,rule:t,ruleKey:n,state:a,path:l,storage:y}){let I=effectScope(),C,d,{$pending:o,$valid:s,$metadata:v,$validating:u}=y.trySetRuleStatusRef(`${l}.${n}`);function w(){C=I.run(()=>{let c=computed(()=>({$invalid:!s.value,$params:f.value,...v.value})),i=computed(()=>X(t)?typeof t.value.active=="function"?t.value.active(a.value,c.value):t.value.active:!0),R=computed(()=>{let T="",M=r?r[n]?.message:void 0;return M&&(typeof M=="function"?T=M(a.value,c.value):T=M),X(t)&&(M&&!t.value._patched||(typeof t.value.message=="function"?T=t.value.message(a.value,c.value):T=t.value.message)),Pe(T)&&(T="Error",console.warn(`No error message defined for ${l}.${n}`)),T}),S=computed(()=>X(t)&&t.value.type?Object.values(se).includes(t.value.type)?n:t.value.type:n),b=computed(()=>X(t)?t.value.validator:t.value),f=computed(()=>typeof t.value=="function"?[]:j(t.value._params??[])),$=computed(()=>`${l}.${S.value}`);return {$active:i,$message:R,$type:S,$validator:b,$params:f,$path:$}}),d=watch(C.$params,x,{deep:!0});}w();async function x(){u.value=!0;let c=C.$validator.value,i=!1,R=c(a.value,...C.$params.value);if(R instanceof Promise){if(!o.value)try{s.value=!0,e.value&&(o.value=!0);let S=await R;if(typeof S=="boolean")i=S;else {let{$valid:b,...f}=S;i=b,v.value=f;}}catch{i=!1;}finally{o.value=!1;}}else if(R!=null)if(typeof R=="boolean")i=R;else {let{$valid:S,...b}=R;i=S,v.value=b;}return s.value=i,u.value=!1,i}function F(){s.value=!0,v.value={},o.value=!1,u.value=!1,w();}function m(){d(),I.stop(),I=effectScope();}return reactive({...C,$pending:o,$valid:s,$metadata:v,$validate:x,$unwatch:m,$watch:w,$reset:F})}function ie({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:l,externalErrors:y,index:I,onUnwatch:C}){let d=effectScope(),o,s=ref(!1),v=ref(!1),u=ref([]),w,x,F,m,c=()=>{};function i(){u.value=y.value??[];}i();function R(){let g=r.value,P=a.checkRuleDeclEntry(n,g);T.value=Object.fromEntries(Object.entries(g).filter(([E])=>E.startsWith("$"))),$.value=Object.fromEntries(Object.entries(r.value).filter(([E])=>!E.startsWith("$")).map(([E,O])=>{if(O){let k=toRef(()=>O);return [E,Be({$dirty:s,customMessages:t,rule:k,ruleKey:E,state:e,path:n,storage:a})]}return []}).filter(E=>!!E.length)),b(),c=o.$debounce.value?pe(f,o.$debounce.value??0):f,P?.valid!=null&&(s.value=a.getDirtyState(n),s.value&&c()),a.addRuleDeclEntry(n,g);}function S(){$.value&&Object.entries($.value).forEach(([g,P])=>{P.$unwatch();}),m(),s.value&&a.setDirtyEntry(n,s.value),w(),x(),F(),d.stop(),d=effectScope(),C?.();}function b(){$.value&&Object.entries($.value).forEach(([g,P])=>{P.$watch();}),o=d.run(()=>{let g=computed(()=>s.value),P=computed(()=>T.value.$debounce),E=computed(()=>T.value.$lazy!=null?T.value.$lazy:unref(l.lazy)),O=computed(()=>T.value.$rewardEarly?T.value.$rewardEarly:unref(l.rewardEarly)),k=computed(()=>T.value.$autoDirty?T.value.$autoDirty:unref(l.autoDirty)),ne=computed(()=>ue.value&&!xe.value&&s.value),ae=computed(()=>B({field:{$dirty:s.value,$externalErrors:u.value,$rules:$.value}})),Qe=computed(()=>B({field:{$dirty:s.value,$externalErrors:u.value,$rules:$.value},silent:!0})),xe=computed(()=>v.value||!O.value?Object.entries($.value).some(([le,Q])=>Q.$pending):!1),ue=computed(()=>u.value?.length?!0:!O.value||O.value&&v.value?Object.entries($.value).some(([le,Q])=>!Q.$valid):!1),De=computed(()=>u.value?.length?!1:O.value?Object.entries($.value).every(([le,Q])=>Q.$valid):!ue.value);return watch(De,le=>{le&&(v.value=!1);}),{$error:ne,$pending:xe,$invalid:ue,$valid:De,$debounce:P,$lazy:E,$errors:ae,$silentErrors:Qe,$rewardEarly:O,$autoDirty:k,$anyDirty:g}}),F=watch(y,i),w=watch(e,()=>{o.$autoDirty.value&&(s.value||(s.value=!0)),r.value instanceof Function&&R(),c(),o.$rewardEarly.value;}),m=watch(s,()=>{a.setDirtyEntry(n,s.value),h();}),x=watch(o.$valid,g=>{o.$rewardEarly.value&&g&&(v.value=!1);});}function f(){Object.entries($.value).forEach(([g,P])=>{P.$validate();});}let $=ref(),T=ref();R();function M(){s.value=!1,u.value=[],Object.entries($.value).forEach(([g,P])=>{P.$reset();});}function p(){s.value=!0,o.$lazy.value||o.$rewardEarly.value;}let h=o.$debounce.value?pe(D,o.$debounce.value??0):D;async function D(){try{if(v.value=!0,!o.$lazy.value&&o.$anyDirty.value&&!o.$pending)return !o.$error.value;{let g=Object.entries($.value).map(([E,O])=>O.$validate());return (await Promise.allSettled(g)).every(E=>E.status==="fulfilled"?E.value:!1)}}catch{return !1}}function A(){u.value=[];}return o.$lazy.value||D(),reactive({$dirty:s,$anyDirty:o.$anyDirty,$invalid:o.$invalid,$error:o.$error,$pending:o.$pending,$valid:o.$valid,$errors:o.$errors,$silentErrors:o.$silentErrors,$externalErrors:u,$value:e,$rules:$,$reset:M,$touch:p,$validate:h,$unwatch:S,$watch:b,$clearExternalErrors:A})}function be({$id:e,path:r,index:t,options:n,storage:a,value:l,customMessages:y,rules:I,externalErrors:C}){let d=ve(),o=`${r}.${d}`;typeof l[t]=="object"&&l[t]!=null&&(l[t].$id?o=`${r}.${l[t].$id}`:Object.defineProperties(l[t],{$id:{value:d,enumerable:!1,configurable:!1,writable:!1}}));let s=toRefs(l),v=toRef(()=>C.value?.[t]),u=re({state:s[t],rulesDef:toRef(()=>I),customMessages:y,path:o,storage:a,options:n,externalErrors:v});if(u){let w=l[t]?.$id;u.$id=w??d,a.addArrayStatus(e,t.toString(),u);}return u}function Rt({path:e,index:r,options:t,storage:n,value:a,customMessages:l,rules:y,externalErrors:I}){let C=toRefs(a),d=toRef(()=>I.value?.[r]);return re({state:C[r],rulesDef:toRef(()=>y),customMessages:l,path:e,storage:n,options:t,externalErrors:d})}function Ue({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:l,externalErrors:y}){let I=effectScope(),C;if(Array.isArray(e.value)&&!r.value.$each)return null;let d=ref(),o=ref(e.value),s=null,v=ref({}),u=a.getCollectionsEntry(n);F(),w();function w(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(d.value=ve(),Object.defineProperties(e.value,{$id:{value:d.value,enumerable:!1,configurable:!1,writable:!1}})):d.value=e.value?.$id);let{$each:R,$debounce:S,$autoDirty:b,$lazy:f,$rewardEarly:$,...T}=r.value,M=toRef(()=>{if(y.value&&ge(y.value))return y.value.$errors}),p=toRef(()=>{if(y.value&&ge(y.value))return y.value.$each});if(Array.isArray(e.value)){let h={};["pop","shift","unshift","splice"].forEach(A=>{h[A]=function(...g){pauseTracking(),u.value.forEach(E=>{E.$unwatch(),a.deleteArrayStatus(d.value,E.$id);}),u.value[A](...g);let P=Object.assign([],this)[A].apply(this,g);return u.value=u.value.map((E,O)=>{let k=oe(R,toRef(()=>e.value[O]),O);return V(E)&&(K(E)||Z(E)||Y(E))&&E.$id!=null?Rt({$id:d.value,path:`${n}.${E.$id}`,rules:k,value:e.value,index:O,options:l,storage:a,externalErrors:p}):be({$id:d.value,path:n,rules:k,value:e.value,index:O,options:l,storage:a,externalErrors:p})}).filter(E=>!!E),resetTracking(),P};});let D=new Proxy(toRaw(e.value),{get(A,g,P){let E=Reflect.get(A,g,P);return typeof g=="symbol"?E:Array.isArray(A)&&Object.hasOwn(h,g)?Reflect.get(h,g,P):E},deleteProperty(A,g){let P=Reflect.deleteProperty(A,g);return typeof g=="symbol"?!0:(isNaN(parseInt(g))||(u.value.splice(parseInt(g),1),a.deleteArrayStatus(d.value,g)),P)},set(A,g,P){let E=Reflect.set(A,g,P);if(typeof g=="symbol")return !0;if(!isNaN(parseInt(g))){let O=parseInt(g),k=u.value[O],ne=oe(R,toRef(()=>e.value[O]),O);if(!k&&ne){let ae=be({$id:d.value,value:e.value,rules:ne,customMessages:t,path:n,storage:a,options:l,index:O,externalErrors:p});ae&&(u.value[O]=ae);}}return E}});pauseTracking(),e.value=D,resetTracking();}if(v.value=ie({state:e,rulesDef:toRef(()=>T),customMessages:t,path:n,storage:a,options:l,externalErrors:M}),o.value=v.value.$value,Array.isArray(e.value)&&R)for(let[h,D]of e.value.entries()){let A=oe(R,toRef(()=>e.value[h]),h),g=be({$id:d.value,path:n,rules:A,value:e.value,index:h,options:l,storage:a,externalErrors:p});g&&(u.value[h]=g);}else u.value=[];}function x(){s&&s(),v.value&&v.value.$unwatch(),u.value&&u.value.forEach(R=>{"$dirty"in R&&R.$unwatch();});}function F(){s=watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")&&w();}),C=I.run(()=>{let R=computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(p=>typeof p!="object"):r.value.$each&&!(r.value.$each instanceof Function)?Object.values(r.value.$each).every(p=>me(p)):!1),S=computed(()=>v.value.$dirty&&u.value.every(p=>p.$dirty)),b=computed(()=>v.value.$anyDirty||u.value.some(p=>p.$dirty)),f=computed(()=>v.value.$invalid||u.value.some(p=>p.$invalid)),$=computed(()=>!f.value),T=computed(()=>v.value.$error||u.value.some(p=>p.$error)),M=computed(()=>v.value.$pending||u.value.some(p=>p.$pending));return {isPrimitiveArray:R,$dirty:S,$anyDirty:b,$invalid:f,$valid:$,$error:T,$pending:M}}),C.isPrimitiveArray.value&&console.warn(`${n} is a Array of primitives. Tracking can be lost when reassigning the Array. Only mutation properties like .splice, .push ...etc will work. We advise to use an Array of objects instead`);}function m(){v.value.$touch(),u.value.forEach(R=>{"$dirty"in R&&R.$touch();});}function c(){v.value.$reset(),u.value.forEach(R=>{"$dirty"in R&&R.$reset();}),v.value.$watch();}async function i(){try{return (await Promise.all([v.value.$validate(),...u.value.map(S=>{if("$dirty"in S)return S.$validate()})])).every(S=>!!S)}catch{return !1}}return reactive({...v.value,$value:o,...C,$each:u,$validate:i,$unwatch:x,$watch:F,$touch:m,$reset:c})}function Ee({scopeRules:e,state:r,customMessages:t,path:n="",rootRules:a,storage:l,options:y,externalErrors:I,validationGroups:C}){let d,o,s;function w(b=!0,f=!1){x.value=null,triggerRef(x);let $=Object.fromEntries(Object.entries(e.value).map(([p,h])=>{if(h){let D=toRef(r.value,p),A=toRef(()=>h),g=toRef(()=>I.value?.[p]);return [p,re({state:D,rulesDef:A,customMessages:t,path:n?`${n}.${p}`:p,storage:l,options:y,externalErrors:g})]}return []}).filter(p=>!!p.length&&p[1]!=null)),T=Object.fromEntries(Object.entries(unref(I)??{}).filter(([p])=>!(p in e.value)).map(([p,h])=>{if(h){let D=toRef(()=>({})),A=toRef(()=>h);return [p,re({state:ref(void 0),rulesDef:D,customMessages:t,path:n?`${n}.${p}`:p,storage:l,options:y,externalErrors:A})]}return []})),M=Object.fromEntries(Object.entries(C?.($)??{}).map(([p,h])=>h.length?[p,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(D=>[D,_e(toRef(()=>h),D)])),...Object.fromEntries(["$errors","$silentErrors"].map(D=>[D,Ge(toRef(()=>h),D)]))}]:[]));x.value={...$,...T,...M},b&&i();}let x=l.getFieldsEntry(n);w();function F(){w(!1),Object.entries(x.value).forEach(([b,f])=>{f.$reset();}),i();}function m(){Object.entries(x.value).forEach(([b,f])=>{f.$touch();});}async function c(){try{return (await Promise.allSettled(Object.entries(x.value).map(([f,$])=>$.$validate()))).every(f=>f.status==="fulfilled"?f.value:!1)}catch{return !1}}function i(){a&&(s=watch(a,()=>{R(),w();},{deep:!0,flush:"post"})),d=effectScope(),o=d.run(()=>{let b=computed(()=>Object.entries(x.value).every(([h,D])=>D.$dirty)),f=computed(()=>Object.entries(x.value).some(([h,D])=>D.$dirty)),$=computed(()=>Object.entries(x.value).some(([h,D])=>D.$invalid)),T=computed(()=>!$.value),M=computed(()=>Object.entries(x.value).some(([h,D])=>D.$error)),p=computed(()=>Object.entries(x.value).some(([h,D])=>D.$pending));return {$dirty:b,$anyDirty:f,$invalid:$,$valid:T,$error:M,$pending:p}});}function R(){x.value&&Object.entries(x.value).forEach(([b,f])=>{f.$unwatch();}),s?.();}function S(){Object.entries(x.value).forEach(([b,f])=>{f.$clearExternalErrors();});}return reactive({...o,$fields:x,$value:r,$reset:F,$touch:m,$validate:c,$unwatch:R,$watch:i,$clearExternalErrors:S})}function re({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:l,externalErrors:y,index:I,onUnwatch:C}){return Me(r)?Ue({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:l,index:I,externalErrors:y}):Oe(e,r)&&we(e)?Ee({scopeRules:r,state:e,customMessages:t,path:n,storage:a,options:l,index:I,externalErrors:y}):Ae(r)?ie({state:e,rulesDef:r,customMessages:t,path:n,storage:a,options:l,index:I,externalErrors:y,onUnwatch:C}):null}function Te(e,r,t,n){let a=de(),l=computed(()=>unref(t.externalErrors)),y=reactive(Ee({rootRules:e,scopeRules:e,state:r,customMessages:n?.(),storage:a,options:t,externalErrors:l,validationGroups:t.validationGroups})),I=je(y);return {regle:y,errors:I}}function he(e,r){let t={autoDirty:r?.autoDirty??!0,lazy:r?.lazy??!1,rewardEarly:r?.rewardEarly??!1};function n(a,l,y){let I=isRef(l)?l:computed(typeof l=="function"?l:()=>l),C={...t,...y},d=isRef(a)?a:ref(a),o=H(toRaw(d.value)),{regle:s,errors:v}=Te(I,d,C,e);function u(){s.$unwatch(),w(a,o),s.$reset(),s.$validate();}function w(m,c){Object.entries(c).forEach(([i,R])=>{let S=isRef(m)?m.value:m,b=isRef(S[i])?S[i].value:S[i],f=isRef(c[i])?c[i]._value:c[i];Array.isArray(f)&&Array.isArray(b)?f.forEach(($,T)=>{w(b[T],f[T]);}):V(f)?w(b,f):isRef(S[i])?S[i].value=f:S[i]=f;});}let x=computed(()=>s.$invalid||s.$pending);async function F(){return s.$touch(),await s.$validate()?d.value:!1}return {regle:s,errors:v,resetAll:u,validateState:F,invalid:x,state:d}}return n}var Le=he();function Je({rules:e,options:r}){return he(e,r)}export{se as InternalRuleType,fe as createRule,Je as defineRegleConfig,Re as defineType,j as unwrapRuleParameters,Le as useRegle};
|
package/package.json
CHANGED