@regle/core 0.1.0 → 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 +21 -17
- 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>> = {
|
|
@@ -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
|
/**
|
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';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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@regle/core",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "Typescript
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Typescript-first model-based validation library for Vue 3",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"vue": "^3.1.0"
|
|
7
7
|
},
|