@regle/core 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -0,0 +1,17 @@
1
+ <p align="center">
2
+ <img src="https://raw.githubusercontent.com/victorgarciaesgi/regle/master/.github/images/regle-github-banner.png" alt="regle cover">
3
+ </p>
4
+
5
+ # Regle
6
+
7
+
8
+ Regle \ʁɛɡl\ (French word for 'rule' ) is a Typescript-first model-based validation library for Vue 3.
9
+ It's heavily inspired by Vuelidate.
10
+
11
+ > ⚠️ Project is still in development, do not use it in production
12
+ > API or function names can still change
13
+
14
+
15
+ # 📚 Documentation
16
+
17
+ [![Documentation](https://raw.githubusercontent.com/victorgarciaesgi/regle/refs/heads/main/.github/images/redirectDoc.svg)](https://regle.vercel.app/)
package/dist/index.d.ts CHANGED
@@ -11,6 +11,7 @@ type ExcludeByType<T, U> = {
11
11
  [K in keyof T as T[K] extends U ? never : K]: T[K] extends U ? never : T[K];
12
12
  };
13
13
  type NonPresentKeys<TSource extends Record<string, any>, Target extends Record<string, any>> = Omit<Target, keyof TSource>;
14
+ type NoInferLegacy<A extends any> = [A][A extends any ? 0 : never];
14
15
 
15
16
  type ArrayElement<T> = T extends Array<infer U> ? U : never;
16
17
 
@@ -74,7 +75,7 @@ interface LocalRegleBehaviourOptions<TState extends Record<string, any>, TRules
74
75
  externalErrors?: MaybeRef<TExternal>;
75
76
  validationGroups?: (fields: RegleStatus<TState, TRules>['$fields']) => TValidationGroups;
76
77
  }
77
- type RegleValidationGroupEntry = RegleFieldStatus<any, any, any> | RegleCollectionStatus<any, any>;
78
+ type RegleValidationGroupEntry = RegleFieldStatus<any, any, any>;
78
79
  interface RegleValidationGroupOutput {
79
80
  $invalid: boolean;
80
81
  $error: boolean;
@@ -97,7 +98,7 @@ interface Regle<TState extends Record<string, any> = EmptyObject, TRules extends
97
98
  * It allow you to skip scouting the `regle` object
98
99
  */
99
100
  errors: RegleErrorTree<TRules, TExternal>;
100
- invalid: ComputedRef<boolean>;
101
+ ready: ComputedRef<boolean>;
101
102
  resetAll: () => void;
102
103
  validateState: () => Promise<false | DeepSafeFormState<TState, TRules>>;
103
104
  state: Ref<TState>;
@@ -207,14 +208,11 @@ type RegleCollectionRuleDefinition<TValue = any[], TCustomRules extends Partial<
207
208
  * @argument
208
209
  * createRule arguments options
209
210
  */
210
- interface RegleRuleInit<TValue extends any, TParams extends any[], TReturn extends RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition>, TMetadata extends RegleRuleMetadataDefinition, TAsync extends boolean = TReturn extends Promise<any> ? true : false> {
211
- type: {
212
- value: TValue;
213
- params: TParams;
214
- };
211
+ interface RegleRuleInit<TValue extends any, TParams extends [...any[]], TReturn extends RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition>, TMetadata extends RegleRuleMetadataDefinition, TAsync extends boolean = TReturn extends Promise<any> ? true : false> {
212
+ type?: string;
215
213
  validator: (value: Maybe<TValue>, ...args: TParams) => TReturn;
216
- message: string | string[] | ((value: Maybe<TValue>, metadata: RegleRuleMetadataConsumer<TParams, TMetadata>) => string | string[]);
217
- active?: boolean | ((value: Maybe<TValue>, metadata: RegleRuleMetadataConsumer<TParams, TMetadata>) => boolean);
214
+ message: string | string[] | ((value: Maybe<TValue>, metadata: RegleRuleMetadataConsumer<NoInferLegacy<TParams>, TMetadata>) => string | string[]);
215
+ active?: boolean | ((value: Maybe<TValue>, metadata: RegleRuleMetadataConsumer<NoInferLegacy<TParams>, TMetadata>) => boolean);
218
216
  }
219
217
  /**
220
218
  * @argument
@@ -289,11 +287,17 @@ type RegleFormPropertyType<TValue = any, TCustomRules extends Partial<AllRulesDe
289
287
  type RegleRuleDecl<TValue extends any = any, TCustomRules extends Partial<AllRulesDeclarations> = Partial<AllRulesDeclarations>> = FieldRegleBehaviourOptions & {
290
288
  [TKey in keyof TCustomRules]?: NonNullable<TCustomRules[TKey]> extends RegleRuleWithParamsDefinition<any, infer TParams> ? RegleRuleDefinition<TValue, TParams, boolean> : NonNullable<TCustomRules[TKey]> extends RegleRuleDefinition<any, any, any, any> ? FormRuleDeclaration<TValue, any> : FormRuleDeclaration<TValue, any> | FieldRegleBehaviourOptions[keyof FieldRegleBehaviourOptions];
291
289
  };
290
+ /**
291
+ * @public
292
+ */
293
+ type RegleCollectionRuleDeclKeyProperty = {
294
+ $key?: PropertyKey;
295
+ };
292
296
  /**
293
297
  * @public
294
298
  */
295
299
  type RegleCollectionRuleDecl<TValue = any[], TCustomRules extends Partial<AllRulesDeclarations> = Partial<AllRulesDeclarations>> = (RegleRuleDecl<NonNullable<TValue>, TCustomRules> & {
296
- $each?: MaybeGetter<RegleFormPropertyType<ArrayElement<NonNullable<TValue>>, TCustomRules>, ArrayElement<TValue>>;
300
+ $each?: MaybeGetter<RegleFormPropertyType<ArrayElement<NonNullable<TValue>>, TCustomRules> & RegleCollectionRuleDeclKeyProperty, ArrayElement<TValue>>;
297
301
  }) | {
298
302
  $each?: MaybeGetter<RegleFormPropertyType<ArrayElement<NonNullable<TValue>>, TCustomRules>, ArrayElement<TValue>>;
299
303
  };
@@ -336,6 +340,8 @@ type RegleStatus<TState extends Record<string, any> = Record<string, any>, TRule
336
340
  readonly $fields: {
337
341
  readonly [TKey in keyof TRules]: InferRegleStatusType<NonNullable<TRules[TKey]>, TState, TKey>;
338
342
  };
343
+ readonly $errors: RegleErrorTree<TRules>;
344
+ readonly $silentErrors: RegleErrorTree<TRules>;
339
345
  } & ([TValidationGroups] extends [never] ? object : {
340
346
  $groups: {
341
347
  readonly [TKey in keyof TValidationGroups]: RegleValidationGroupOutput;
@@ -344,17 +350,17 @@ type RegleStatus<TState extends Record<string, any> = Record<string, any>, TRule
344
350
  /**
345
351
  * @public
346
352
  */
347
- type InferRegleStatusType<TRule extends RegleCollectionRuleDecl | RegleRuleDecl | ReglePartialValidationTree<any>, TState extends Record<PropertyKey, any> = any, TKey extends PropertyKey = string> = TRule extends RegleCollectionRuleDefinition<any, any> ? NonNullable<TState[TKey]> extends Array<Record<string, any> | any> ? ExtractFromGetter<TRule['$each']> extends RegleRuleDecl | ReglePartialValidationTree<any> ? RegleCollectionStatus<ExtractFromGetter<TRule['$each']>, TState[TKey]> : never : RegleFieldStatus<TRule, TState, TKey> : TRule extends ReglePartialValidationTree<any> ? NonNullable<TState[TKey]> extends Array<any> ? RegleCommonStatus<TState[TKey]> : NonNullable<TState[TKey]> extends Record<PropertyKey, any> ? RegleStatus<TState[TKey], TRule> : RegleFieldStatus<TRule, TState, TKey> : RegleFieldStatus<TRule, TState, TKey>;
353
+ type InferRegleStatusType<TRule extends RegleCollectionRuleDecl | RegleRuleDecl | ReglePartialValidationTree<any>, TState extends Record<PropertyKey, any> = any, TKey extends PropertyKey = string> = TRule extends RegleCollectionRuleDefinition<any, any> ? NonNullable<TState[TKey]> extends Array<Record<string, any> | any> ? ExtractFromGetter<TRule['$each']> extends RegleRuleDecl | ReglePartialValidationTree<any> ? RegleCollectionStatus<ExtractFromGetter<TRule['$each']>, TState[TKey], TRule> : never : RegleFieldStatus<TRule, TState, TKey> : TRule extends ReglePartialValidationTree<any> ? NonNullable<TState[TKey]> extends Array<any> ? RegleCommonStatus<TState[TKey]> : NonNullable<TState[TKey]> extends Record<PropertyKey, any> ? RegleStatus<TState[TKey], TRule> : RegleFieldStatus<TRule, TState, TKey> : RegleFieldStatus<TRule, TState, TKey>;
348
354
  /**
349
355
  * @public
350
356
  */
351
357
  interface RegleFieldStatus<TRules extends RegleFormPropertyType<any, Partial<AllRulesDeclarations>> = Record<string, any>, TState extends Record<PropertyKey, any> = any, TKey extends PropertyKey = string> extends RegleCommonStatus<TState> {
352
358
  $value: UnwrapNestedRefs<TState[TKey]>;
353
- readonly $externalErrors?: string[];
354
359
  readonly $errors: string[];
355
360
  readonly $silentErrors: string[];
361
+ readonly $externalErrors?: string[];
356
362
  readonly $rules: {
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>;
363
+ readonly [TRuleKey in keyof Omit<TRules, '$each' | keyof FieldRegleBehaviourOptions>]: RegleRuleStatus<TState[TKey], TRules[TRuleKey] extends RegleRuleDefinition<any, infer TParams, any> ? TParams : [], TRules[TRuleKey] extends RegleRuleDefinition<any, any, any, infer TMetadata> ? TMetadata : TRules[TRuleKey] extends InlineRuleDeclaration<any, any[], infer TMetadata> ? TMetadata extends Promise<infer P> ? P : TMetadata : never>;
358
364
  };
359
365
  }
360
366
  /**
@@ -396,8 +402,11 @@ type RegleRuleStatus<TValue = any, TParams extends any[] = any[], TMetadata exte
396
402
  /**
397
403
  * @public
398
404
  */
399
- interface RegleCollectionStatus<TRules extends RegleRuleDecl | ReglePartialValidationTree<any>, TState extends any[]> extends RegleFieldStatus<TRules, TState> {
400
- readonly $each: Array<InferRegleStatusType<NonNullable<TRules>, TState, number>>;
405
+ interface RegleCollectionStatus<TRules extends RegleRuleDecl | ReglePartialValidationTree<any>, TState extends any[], TFieldRule extends RegleCollectionRuleDecl<any, any> = never> extends Omit<RegleFieldStatus<TRules, TState>, '$errors' | '$silentErrors'> {
406
+ readonly $each: Array<InferRegleStatusType<NonNullable<TRules>, NonNullable<TState>, number>>;
407
+ readonly $field: RegleFieldStatus<TFieldRule, TState>;
408
+ readonly $errors: RegleErrorTree<TRules>;
409
+ readonly $silentErrors: RegleErrorTree<TRules>;
401
410
  }
402
411
 
403
412
  /**
@@ -421,8 +430,7 @@ interface RegleCollectionStatus<TRules extends RegleRuleDecl | ReglePartialValid
421
430
  * import {ruleHelpers} from '@regle/rules';
422
431
  *
423
432
  * export const isFoo = createRule({
424
- * type: defineType<string>('foo'),
425
- * validator(value) {
433
+ * validator(value: string) {
426
434
  * if (ruleHelpers.isFilled(value)) {
427
435
  * return value === 'foo';
428
436
  * }
@@ -433,10 +441,6 @@ interface RegleCollectionStatus<TRules extends RegleRuleDecl | ReglePartialValid
433
441
  * ```
434
442
  */
435
443
  declare function createRule<TValue extends any, TParams extends any[], TReturn extends RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition>, TMetadata extends RegleRuleMetadataDefinition = TReturn extends Promise<infer M> ? M : TReturn, TAsync extends boolean = TReturn extends Promise<any> ? true : false>(definition: RegleRuleInit<TValue, TParams, TReturn, TMetadata, TAsync>): InferRegleRule<TValue, TParams, TAsync, TMetadata>;
436
- declare function defineType<TValue extends any = unknown, TParams extends any[] = []>(ruleName: string): {
437
- value: TValue;
438
- params: TParams;
439
- };
440
444
 
441
445
  /**
442
446
  * Returns a clean list of parameters
@@ -446,16 +450,9 @@ declare function unwrapRuleParameters<TParams extends any[]>(params: ParamDecl[]
446
450
 
447
451
  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>;
448
452
 
449
- /**
450
- * Root function that allows you to define project-wise all your custom rules or overwrite default ones
451
- *
452
- * It will return utility functions that let you build type-safe forms
453
- *
454
- * @param customRules
455
- */
456
- declare function defineRegleConfig<TCustomRules extends Partial<AllRulesDeclarations>>({ rules, options, }: {
453
+ declare function defineRegleConfig<TCustomRules extends Partial<AllRulesDeclarations>>({ rules, modifiers, }: {
457
454
  rules?: () => TCustomRules;
458
- options?: RegleBehaviourOptions;
455
+ modifiers?: RegleBehaviourOptions;
459
456
  }): <TState extends Record<string, any>, TRules extends ReglePartialValidationTree<TState, Partial<AllRulesDeclarations> & TCustomRules>, TExternal extends RegleExternalErrorTree<TState>, TValidationGroups extends Record<string, RegleValidationGroupEntry[]>, TValid = keyof TRules extends keyof TState ? true : false>(state: vue.MaybeRef<TState> | DeepReactiveState<TState>, rulesFactory: TValid extends true ? TRules | vue.ComputedRef<TRules> | (() => TRules) : never, options?: (Partial<DeepMaybeRef<RegleBehaviourOptions>> & LocalRegleBehaviourOptions<TState, TRules, TExternal, TValidationGroups>) | undefined) => Regle<TState, TRules, TExternal, TValidationGroups>;
460
457
 
461
- export { type DeepMaybeRef, type FormRuleDeclaration, type InlineRuleDeclaration, InternalRuleType, type LocalRegleBehaviourOptions, type Maybe, type ParamDecl, type Regle, type RegleBehaviourOptions, type RegleCollectionErrors, type RegleCollectionRuleDecl, type RegleCollectionStatus, type RegleCommonStatus, type RegleComputedRules, type RegleErrorTree, type RegleExternalCollectionErrors, type RegleExternalErrorTree, type RegleExternalValidationErrors, type RegleFieldStatus, type RegleFormPropertyType, type ReglePartialValidationTree, type RegleRuleCore, type RegleRuleDecl, type RegleRuleDefinition, type RegleRuleDefinitionProcessor, type RegleRuleDefinitionWithMetadataProcessor, type RegleRuleInit, type RegleRuleMetadataConsumer, type RegleRuleMetadataDefinition, type RegleRuleRaw, type RegleRuleStatus, type RegleRuleWithParamsDefinition, type RegleStatus, type RegleValidationTree, type UnwrapRegleUniversalParams, createRule, defineRegleConfig, defineType, unwrapRuleParameters, useRegle };
458
+ export { type DeepMaybeRef, type FormRuleDeclaration, type InlineRuleDeclaration, InternalRuleType, type LocalRegleBehaviourOptions, type Maybe, type ParamDecl, type Regle, type RegleBehaviourOptions, type RegleCollectionErrors, type RegleCollectionRuleDecl, type RegleCollectionRuleDefinition, type RegleCollectionStatus, type RegleCommonStatus, type RegleComputedRules, type RegleErrorTree, type RegleExternalCollectionErrors, type RegleExternalErrorTree, type RegleExternalValidationErrors, type RegleExternalValidationErrorsReport, type RegleFieldStatus, type RegleFormPropertyType, type RegleInternalRuleDefs, type ReglePartialValidationTree, type RegleRuleCore, type RegleRuleDecl, type RegleRuleDefinition, type RegleRuleDefinitionProcessor, type RegleRuleDefinitionWithMetadataProcessor, type RegleRuleInit, type RegleRuleMetadataConsumer, type RegleRuleMetadataDefinition, type RegleRuleRaw, type RegleRuleStatus, type RegleRuleWithParamsDefinition, type RegleStatus, type RegleUniversalParams, type RegleValidationErrors, type RegleValidationGroupEntry, type RegleValidationGroupOutput, type RegleValidationTree, type UnwrapRegleUniversalParams, createRule, defineRegleConfig, unwrapRuleParameters, useRegle };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import {unref,isRef,toRef,computed,ref,toRaw,reactive,shallowRef,onScopeDispose,triggerRef,watch,effectScope,toRefs}from'vue';import {pauseTracking,resetTracking}from'@vue/reactivity';function j(e){return e.map(r=>r instanceof Function?r():unref(r))}function Ie(e){return e.map(r=>r instanceof Function||isRef(r)?r:toRef(()=>r))}function 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};
1
+ import {unref,isRef,toRef,computed,ref,toRaw,reactive,shallowRef,onScopeDispose,triggerRef,watch,effectScope,toRefs}from'vue';function F(e){return e.map(t=>t instanceof Function?t():unref(t))}function Ie(e){return e.map(t=>t instanceof Function||isRef(t)?t:toRef(()=>t))}function Ce(e){let t=e.toString();return (t.includes("=>")?t.split("=>")[0]:t).slice(t.indexOf("(")+1,t.indexOf(")")).split(",").map(i=>i.trim()).filter(i=>i.includes("=")).length+e.length}function se(e,...t){let{message:r,validator:n,active:a,...i}=e,$=n.constructor.name==="AsyncFunction";return {...{validator(v,...l){return e.validator(v,...F(l.length?l:t))},message(v,l){return typeof e.message=="function"?e.message(v,{...l,$params:F(l.$params?.length?l.$params:t)}):e.message},active(v,l){return typeof e.active=="function"?e.active(v,{...l,$params:F(l.$params?.length?l.$params:t)}):e.active??!0},exec(v){let l=e.validator(v,...F(t)),o;return l instanceof Promise?l.then(C=>(o=C,typeof o=="object"&&"$valid"in o?o.$valid:typeof o=="boolean"?o:!1)):(o=l,typeof o=="object"&&"$valid"in o?o.$valid:typeof o=="boolean"?o:!1)}},...i,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:$,_params:Ie(t)}}function ue(e){if(typeof e.validator=="function"){let r=se(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(Ce(e.validator)>1){let a=function(...i){return se(e,...i)};return a.validator=r.validator,a.message=r.message,a.active=r.active,a.type=r.type,a.exec=r.exec,a._validator=r.validator,a._message=r.message,a._active=r.active,a._type=e.type,a._patched=!1,a._async=n,a}else return r}throw new Error("Validator must be a function")}function k(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function De(e){return k(e.value)}function B(e){let t=e,r={}.toString.call(e).slice(8,-1);if(r=="Set"&&(t=new Set([...e].map(n=>B(n)))),r=="Map"&&(t=new Map([...e].map(n=>[B(n[0]),B(n[1])]))),r=="Date"&&(t=new Date(e.getTime())),r=="RegExp"&&(t=RegExp(e.source,Ze(e))),r=="Array"||r=="Object"){t=Array.isArray(e)?[]:{};for(let n in e)t[n]=B(e[n]);}return t}function Ze(e){if(typeof e.source.flags=="string")return e.source.flags;{let t=[];return e.global&&t.push("g"),e.ignoreCase&&t.push("i"),e.multiline&&t.push("m"),e.sticky&&t.push("y"),e.unicode&&t.push("u"),t.join("")}}function ce(e,t,r){return e instanceof Function?e(t,r??0):e}function ee(e){return e==null?!0:e===!1?!1:e instanceof Date?isNaN(e.getTime()):Array.isArray(e)?e.length===0:typeof e=="object"&&e!=null?Object.keys(e).length===0:typeof e=="string"?!String(e.trim()).length:!1}function fe(e,t,r){let n,a=(...i)=>new Promise($=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...i])).then($);},t);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...i)=>new Promise($=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...i])).then($);},0);}),a}function Re(){let e=shallowRef(new Map),t=shallowRef(new Map),r=shallowRef(new Map),n=shallowRef(new Map),a=shallowRef(new Map),i=shallowRef(new Map);function $(p){let R=t.value.get(p);if(R)return R;{let u=ref({});return t.value.set(p,u),u}}function x(p){let R=r.value.get(p);if(R)return R;{let u=ref([]);return r.value.set(p,u),u}}function D(p,R,u){i.value.set(`${p}-${R}`,u);}function v(p,R){return i.value.get(`${p}-${R}`)}function l(p,R){p&&R!=null&&i.value.delete(`${p}-${R}`);}function o(p,R){n.value.set(p,R);}function C(p){return n.value.get(p)??!1}function b(p,R){e.value.set(p,R);}function g(p,R){let u=e.value.get(p);return u?s(R,u)?{valid:!0}:{valid:!1}:void 0}function s(p,R){let u=Object.keys(R),I=Object.keys(p);return I.length!==u.length||!I.every(y=>u.includes(y))?!1:I.every(y=>{let d=p[y],c=R[y];return !c||!d||typeof d=="function"||typeof c=="function"||typeof d=="number"||typeof d=="boolean"?!1:d._params?d._params?.every((f,h)=>{if(typeof c=="number"||typeof c=="boolean")return !0;{let m=F(c._params),P=F(d._params);return m?.[h]===P?.[h]}}):!0})}function A(p){let R=a.value.get(p);if(R)return R;{let u=ref(!1),I=ref(!0),E=ref({}),y=ref(!1);return a.value.set(p,{$pending:u,$valid:I,$metadata:E,$validating:y}),{$pending:u,$valid:I,$metadata:E,$validating:y}}}return onScopeDispose(()=>{e.value.clear(),t.value.clear(),r.value.clear(),n.value.clear(),a.value.clear(),i.value.clear();}),{addRuleDeclEntry:b,setDirtyEntry:o,checkRuleDeclEntry:g,getDirtyState:C,trySetRuleStatusRef:A,getFieldsEntry:$,getCollectionsEntry:x,getArrayStatus:v,addArrayStatus:D,deleteArrayStatus:l,arrayStatusStorage:i}}function Pe(e,t){return k(e.value)&&k(t.value)&&!Object.entries(t.value).some(r=>pe(r))}function we(e){return !!e.value&&"$each"in e.value}function Oe(e){return !!e.value&&k(e.value)}function pe(e){return k(e)&&"_validator"in e}function X(e){return typeof e.value!="function"}function de(e){return k(e)&&"$fields"in e}function me(e){return !!e&&"$each"in e}function ge(e){return !!e&&"$rules"in e}function $e(e){return "$each"in e||"$errors"in e}function G({field:e,silent:t=!1}){return Object.entries(e.$rules??{}).map(([r,n])=>t||!n.$valid&&e.$dirty?n.$message:null).filter(r=>!!r).reduce((r,n)=>typeof n=="string"?r?.concat([n]):r?.concat(n),[]).concat(e.$externalErrors??[])}function Ae(e,t=!1){return de(e)?q(e.$fields):me(e)?{$errors:e.$field.$rules?G({field:e.$field,silent:t}):[],$each:e.$each.map(r=>Ae(r,t))}:ge(e)?e.$error?G({field:e,silent:t}):e.$externalErrors??[]:[]}function te(e,t=!1){return e.map(r=>Ae(r,t))}function q(e,t=!1){return Object.fromEntries(Object.entries(e).map(([r,n])=>de(n)?[r,q(n.$fields,t)]:me(n)?[r,{$errors:G({field:n.$field,silent:t}),$each:te(n.$each,t)}]:ge(n)?n.$error?[r,G({field:n,silent:t})]:[r,n.$externalErrors??[]]:[r,[]]))}function Me(e){return computed(()=>q(e.$fields))}var re=(r=>(r.Inline="__inline",r.Async="__async",r))(re||{});function je(e,t){return computed(()=>e.value.some(r=>r[t]))}function Ve(e,t){return computed(()=>e.value.reduce((r,n)=>{let a=n[t]||[];return r.concat(a)},[]))}function tt(){return Math.floor(Math.random()*Date.now()).toString()}function ve(){return typeof window>"u"?tt():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(10)}function ke({$dirty:e,customMessages:t,rule:r,ruleKey:n,state:a,path:i,storage:$}){let x=effectScope(),D,v,{$pending:l,$valid:o,$metadata:C,$validating:b}=$.trySetRuleStatusRef(`${i}.${n}`);function g(){D=x.run(()=>{let R=computed(()=>({$invalid:!o.value,$params:d.value,...C.value})),u=computed(()=>X(r)?typeof r.value.active=="function"?r.value.active(a.value,R.value):r.value.active:!0),I=computed(()=>{let f="",h=t?t[n]?.message:void 0;return h&&(typeof h=="function"?f=h(a.value,R.value):f=h),X(r)&&(h&&!r.value._patched||(typeof r.value.message=="function"?f=r.value.message(a.value,R.value):f=r.value.message)),ee(f)&&(f="Error",console.warn(`No error message defined for ${i}.${n}`)),f}),E=computed(()=>X(r)&&r.value.type?Object.values(re).includes(r.value.type)?n:r.value.type:n),y=computed(()=>X(r)?r.value.validator:r.value),d=computed(()=>typeof r.value=="function"?[]:F(r.value._params??[])),c=computed(()=>`${i}.${E.value}`);return {$active:u,$message:I,$type:E,$validator:y,$params:d,$path:c}}),v=watch(D.$params,s,{deep:!0});}g();async function s(){b.value=!0;let R=D.$validator.value,u=!1,I=R(a.value,...D.$params.value);if(I instanceof Promise)try{o.value=!0,e.value&&(l.value=!0);let E=await I;if(typeof E=="boolean")u=E;else {let{$valid:y,...d}=E;u=y,C.value=d;}}catch{u=!1;}finally{l.value=!1;}else if(I!=null)if(typeof I=="boolean")u=I;else {let{$valid:E,...y}=I;u=E,C.value=y;}return o.value=u,b.value=!1,console.log(n,u),u}function A(){o.value=!0,C.value={},l.value=!1,b.value=!1,g();}function p(){v(),x.stop(),x=effectScope();}return reactive({...D,$pending:l,$valid:o,$metadata:C,$validate:s,$unwatch:p,$watch:g,$reset:A})}function ne({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:i,externalErrors:$,index:x,onUnwatch:D}){let v=effectScope(),l,o=ref(!1),C=ref(!1),b=ref([]),g,s,A,p,R=()=>{};function u(){b.value=$.value??[];}u();function I(){let S=t.value,T=a.checkRuleDeclEntry(n,S);f.value=Object.fromEntries(Object.entries(S).filter(([O])=>O.startsWith("$"))),c.value=Object.fromEntries(Object.entries(t.value).filter(([O])=>!O.startsWith("$")).map(([O,_])=>{if(_){let oe=toRef(()=>_);return [O,ke({$dirty:o,customMessages:r,rule:oe,ruleKey:O,state:e,path:n,storage:a})]}return []}).filter(O=>!!O.length)),y(),R=l.$debounce.value?fe(d,l.$debounce.value??0):d,T?.valid!=null&&(o.value=a.getDirtyState(n),o.value&&R()),a.addRuleDeclEntry(n,S);}function E(){c.value&&Object.entries(c.value).forEach(([S,T])=>{T.$unwatch();}),p(),o.value&&a.setDirtyEntry(n,o.value),g(),s(),A(),v.stop(),v=effectScope(),D?.();}function y(){c.value&&Object.entries(c.value).forEach(([S,T])=>{T.$watch();}),l=v.run(()=>{let S=computed(()=>o.value),T=computed(()=>f.value.$debounce),O=computed(()=>f.value.$lazy!=null?f.value.$lazy:unref(i.lazy)),_=computed(()=>f.value.$rewardEarly!=null?f.value.$rewardEarly:unref(i.rewardEarly)),oe=computed(()=>f.value.$autoDirty!=null?f.value.$autoDirty:unref(i.autoDirty)),qe=computed(()=>ie.value&&!xe.value&&o.value),Le=computed(()=>G({field:{$dirty:o.value,$externalErrors:b.value,$rules:c.value}})),Je=computed(()=>G({field:{$dirty:o.value,$externalErrors:b.value,$rules:c.value},silent:!0})),xe=computed(()=>C.value||!_.value?Object.entries(c.value).some(([K,Q])=>Q.$pending):!1),ie=computed(()=>b.value?.length?!0:!_.value||_.value&&C.value?Object.entries(c.value).some(([K,Q])=>!Q.$valid):!1),Te=computed(()=>o.value&&!ee(e.value)?b.value?.length?!1:_.value?Object.entries(c.value).every(([K,Q])=>Q.$valid):!ie.value:!1);return watch(Te,K=>{K&&(C.value=!1);}),{$error:qe,$pending:xe,$invalid:ie,$valid:Te,$debounce:T,$lazy:O,$errors:Le,$silentErrors:Je,$rewardEarly:_,$autoDirty:oe,$anyDirty:S}}),A=watch($,u),g=watch(e,()=>{l.$autoDirty.value&&(o.value||(o.value=!0)),t.value instanceof Function&&I(),R(),l.$rewardEarly.value;},{deep:!0}),p=watch(o,()=>{a.setDirtyEntry(n,o.value);}),s=watch(l.$valid,S=>{l.$rewardEarly.value&&S&&(C.value=!1);});}function d(){Object.entries(c.value).forEach(([S,T])=>{T.$validate();});}let c=ref(),f=ref();I();function h(){o.value=!1,b.value=[],Object.entries(c.value).forEach(([S,T])=>{T.$reset();}),l.$lazy.value||Object.entries(c.value).map(([S,T])=>T.$validate());}function m(){o.value=!0,l.$rewardEarly.value,R();}let P=l.$debounce.value?fe(w,l.$debounce.value??0):w;async function w(){try{if(C.value=!0,l.$anyDirty.value&&!l.$pending)return !l.$error.value;{let S=Object.entries(c.value).map(([O,_])=>_.$validate());return (await Promise.allSettled(S)).every(O=>O.status==="fulfilled"?O.value:!1)}}catch{return !1}}function M(){b.value=[];}return l.$lazy.value||w(),reactive({$dirty:o,$anyDirty:l.$anyDirty,$invalid:l.$invalid,$error:l.$error,$pending:l.$pending,$valid:l.$valid,$errors:l.$errors,$silentErrors:l.$silentErrors,$externalErrors:b,$value:e,$rules:c,$reset:h,$touch:m,$validate:P,$unwatch:E,$watch:y,$clearExternalErrors:M})}function Be({$id:e,path:t,index:r,options:n,storage:a,value:i,customMessages:$,rules:x,externalErrors:D}){let v=x.$key?x.$key:ve(),l=`${t}.${String(v)}`;typeof i[r]=="object"&&i[r]!=null&&(i[r].$id?l=`${t}.${i[r].$id}`:Object.defineProperties(i[r],{$id:{value:v,enumerable:!1,configurable:!1,writable:!1}}));let o=toRefs(i),C=toRef(()=>D.value?.[r]),b=le({state:o[r],rulesDef:toRef(()=>x),customMessages:$,path:l,storage:a,options:n,externalErrors:C});if(b){let g=i[r]?.$id;b.$id=g??String(v),a.addArrayStatus(e,b.$id,b);}return b}function We({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:i,externalErrors:$}){let x=effectScope(),D,v=effectScope(),l;if(Array.isArray(e.value)&&!t.value.$each)return null;let o=ref(),C=ref(e.value),b=null,g=ref({}),s=a.getCollectionsEntry(n);l=v.run(()=>{let c=computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(m=>typeof m!="object"):t.value.$each&&!(t.value.$each instanceof Function)?Object.values(t.value.$each).every(m=>pe(m)):!1),f=computed(()=>$.value?$e($.value)?$.value.$errors??[]:[]:[]),h=computed(()=>$.value?$e($.value)?$.value.$each??[]:[]:[]);return {isPrimitiveArray:c,$externalErrorsField:f,$externalErrorsEach:h}}),A(),R();function A(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(o.value=ve(),Object.defineProperties(e.value,{$id:{value:o.value,enumerable:!1,configurable:!1,writable:!1}})):e.value?.$id&&(o.value=e.value.$id)),!l.isPrimitiveArray.value&&(C.value=g.value.$value,Array.isArray(e.value)&&t.value.$each?s.value=e.value.map((c,f)=>{let h=ce(t.value.$each,toRef(()=>e.value[f]),f);if(h){let m=Be({$id:o.value,path:n,rules:h,value:e.value,index:f,options:i,storage:a,externalErrors:l.$externalErrorsEach});return m||null}}).filter(c=>!!c):s.value=[],g.value=ne({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:i,externalErrors:l.$externalErrorsField}));}function p(){if(Array.isArray(e.value)){let c=B(s.value);s.value=e.value.map((f,h)=>{if(f.$id&&s.value.find(m=>m.$id===f.$id)){let m=a.getArrayStatus(o.value,f.$id);return m?(m.$value=toRef(()=>f),m):null}else {let m=ce(t.value.$each,toRef(()=>toRef(()=>f)),h);if(m){let P=Be({$id:o.value,path:n,rules:m,value:e.value,index:h,options:i,storage:a,externalErrors:l.$externalErrorsEach});return P||null}}}).filter(f=>!!f),c.filter(f=>!e.value.find(h=>f.$id===h.$id)).forEach((f,h)=>{a.deleteArrayStatus(o.value,h.toString());});}else s.value=[];}function R(){b=watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")?A():p();},{deep:!0,flush:"pre"}),D=x.run(()=>{let c=computed(()=>g.value.$dirty&&s.value.every(T=>T.$dirty)),f=computed(()=>g.value.$anyDirty||s.value.some(T=>T.$dirty)),h=computed(()=>g.value.$invalid||s.value.some(T=>T.$invalid)),m=computed(()=>g.value.$valid&&s.value.every(T=>T.$valid)),P=computed(()=>g.value.$error||s.value.some(T=>T.$error)),w=computed(()=>g.value.$pending||s.value.some(T=>T.$pending)),M=computed(()=>({$errors:G({field:g.value,silent:!1}),$each:te(s.value)})),S=computed(()=>({$errors:G({field:g.value,silent:!0}),$each:te(s.value,!0)}));return {$dirty:c,$anyDirty:f,$invalid:h,$valid:m,$error:P,$pending:w,$errors:M,$silentErrors:S}}),l.isPrimitiveArray.value&&(console.warn(`${n} is a Array of primitives. Tracking can be lost when reassigning the Array. We advise to use an Array of objects instead`),b());}function u(){b&&b(),g.value&&g.value.$unwatch(),s.value&&s.value.forEach(c=>{"$dirty"in c&&c.$unwatch();}),x.stop(),x=effectScope(),v.stop(),v=effectScope(!0);}function I(){g.value.$touch(),s.value.forEach(c=>{c.$touch();});}function E(){g.value.$reset(),s.value.forEach(c=>{c.$reset();});}async function y(){try{return (await Promise.all([g.value.$validate(),...s.value.map(f=>f.$validate())])).every(f=>!!f)}catch{return !1}}function d(){}return reactive({$field:g,...D,$each:s,$value:e,$validate:y,$unwatch:u,$watch:R,$touch:I,$reset:E,$clearExternalErrors:d})}function Ee({scopeRules:e,state:t,customMessages:r,path:n="",rootRules:a,storage:i,options:$,externalErrors:x,validationGroups:D}){let v,l,o;function g(y=!0,d=!1){s.value=null,triggerRef(s);let c=Object.fromEntries(Object.entries(e.value).map(([m,P])=>{if(P){let w=toRef(t.value,m),M=toRef(()=>P),S=toRef(()=>x.value?.[m]);return [m,le({state:w,rulesDef:M,customMessages:r,path:n?`${n}.${m}`:m,storage:i,options:$,externalErrors:S})]}return []}).filter(m=>!!m.length&&m[1]!=null)),f=Object.fromEntries(Object.entries(unref(x)??{}).filter(([m])=>!(m in e.value)).map(([m,P])=>{if(P){let w=toRef(()=>({})),M=toRef(()=>P);return [m,le({state:ref(void 0),rulesDef:w,customMessages:r,path:n?`${n}.${m}`:m,storage:i,options:$,externalErrors:M})]}return []})),h=Object.fromEntries(Object.entries(D?.(c)??{}).map(([m,P])=>P.length?[m,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(w=>[w,je(toRef(()=>P),w)])),...Object.fromEntries(["$errors","$silentErrors"].map(w=>[w,Ve(toRef(()=>P),w)]))}]:[]));s.value={...c,...f,...h},y&&u();}let s=i.getFieldsEntry(n);g();function A(){g(!1),Object.entries(s.value).forEach(([y,d])=>{d.$reset();}),u();}function p(){Object.entries(s.value).forEach(([y,d])=>{d.$touch();});}async function R(){try{return (await Promise.allSettled(Object.entries(s.value).map(([d,c])=>c.$validate()))).every(d=>d.status==="fulfilled"?d.value:!1)}catch{return !1}}function u(){a&&(o=watch(a,()=>{I(),g();},{deep:!0,flush:"post"})),v=effectScope(),l=v.run(()=>{let y=computed(()=>!!Object.entries(s.value).length&&Object.entries(s.value).every(([M,S])=>S.$dirty)),d=computed(()=>Object.entries(s.value).some(([M,S])=>S.$dirty)),c=computed(()=>Object.entries(s.value).some(([M,S])=>S.$invalid)),f=computed(()=>Object.entries(s.value).every(([M,S])=>S.$valid)),h=computed(()=>Object.entries(s.value).some(([M,S])=>S.$error)),m=computed(()=>Object.entries(s.value).some(([M,S])=>S.$pending)),P=computed(()=>q(s.value)),w=computed(()=>q(s.value,!0));return {$dirty:y,$anyDirty:d,$invalid:c,$valid:f,$error:h,$pending:m,$errors:P,$silentErrors:w}});}function I(){s.value&&Object.entries(s.value).forEach(([y,d])=>{d.$unwatch();}),o?.(),v.stop(),v=effectScope();}function E(){Object.entries(s.value).forEach(([y,d])=>{d.$clearExternalErrors();});}return reactive({...l,$fields:s,$value:t,$reset:A,$touch:p,$validate:R,$unwatch:I,$watch:u,$clearExternalErrors:E})}function le({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:i,externalErrors:$,index:x,onUnwatch:D}){return we(t)?We({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:i,index:x,externalErrors:$}):Pe(e,t)&&De(e)?Ee({scopeRules:t,state:e,customMessages:r,path:n,storage:a,options:i,index:x,externalErrors:$}):Oe(t)?ne({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:i,index:x,externalErrors:$,onUnwatch:D}):null}function be(e,t,r,n){let a=Re(),i=computed(()=>unref(r.externalErrors)),$=reactive(Ee({rootRules:e,scopeRules:e,state:t,customMessages:n?.(),storage:a,options:r,externalErrors:i,validationGroups:r.validationGroups})),x=Me($);return {regle:$,errors:x}}function he(e,t){let r={autoDirty:t?.autoDirty??!0,lazy:t?.lazy??!1,rewardEarly:t?.rewardEarly??!1};function n(a,i,$){let x=isRef(i)?i:computed(typeof i=="function"?i:()=>i),D={...r,...$},v=isRef(a)?a:ref(a),l=B(toRaw(v.value)),{regle:o,errors:C}=be(x,v,D,e);function b(){o.$unwatch(),g(a,l),o.$reset();}function g(p,R){Object.entries(R).forEach(([u,I])=>{let E=isRef(p)?p.value:p,y=isRef(E[u])?E[u].value:E[u],d=isRef(R[u])?R[u]._value:R[u];Array.isArray(d)&&Array.isArray(y)?(E[u]=[],d.forEach((c,f)=>{E[u][f]={},g(E[u][f],d[f]);})):k(d)?g(y,d):isRef(E[u])?E[u].value=d:E[u]=d;});}let s=computed(()=>!(o.$invalid||o.$pending));async function A(){return o.$touch(),await o.$validate()?v.value:!1}return {regle:o,errors:C,resetAll:b,validateState:A,ready:s,state:v}}return n}var He=he();function ze({rules:e,modifiers:t}){return he(e,t)}export{re as InternalRuleType,ue as createRule,ze as defineRegleConfig,F as unwrapRuleParameters,He as useRegle};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@regle/core",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Typescript-first model-based validation library for Vue 3",
5
5
  "peerDependencies": {
6
6
  "vue": "^3.1.0"