228 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			228 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
| import type { VueNode } from '../_util/type';
 | |
| 
 | |
| export type FormLabelAlign = 'left' | 'right';
 | |
| 
 | |
| export type InternalNamePath = (string | number)[];
 | |
| export type NamePath = string | number | InternalNamePath;
 | |
| 
 | |
| export type StoreValue = any;
 | |
| export interface Store {
 | |
|   [name: string]: StoreValue;
 | |
| }
 | |
| 
 | |
| export interface Meta {
 | |
|   touched: boolean;
 | |
|   validating: boolean;
 | |
|   errors: string[];
 | |
|   name: InternalNamePath;
 | |
| }
 | |
| 
 | |
| export interface InternalFieldData extends Meta {
 | |
|   value: StoreValue;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Used by `setFields` config
 | |
|  */
 | |
| export interface FieldData extends Partial<Omit<InternalFieldData, 'name'>> {
 | |
|   name: NamePath;
 | |
| }
 | |
| 
 | |
| export type RuleType =
 | |
|   | 'string'
 | |
|   | 'number'
 | |
|   | 'boolean'
 | |
|   | 'method'
 | |
|   | 'regexp'
 | |
|   | 'integer'
 | |
|   | 'float'
 | |
|   | 'object'
 | |
|   | 'enum'
 | |
|   | 'date'
 | |
|   | 'url'
 | |
|   | 'hex'
 | |
|   | 'email';
 | |
| 
 | |
| type Validator = (
 | |
|   rule: RuleObject,
 | |
|   value: StoreValue,
 | |
|   callback: (error?: string) => void,
 | |
| ) => Promise<void> | void;
 | |
| 
 | |
| export interface ValidatorRule {
 | |
|   warningOnly?: boolean;
 | |
|   message?: string | VueNode;
 | |
|   /** custom validate function (Note: callback must be called) */
 | |
|   validator: Validator;
 | |
| }
 | |
| 
 | |
| interface BaseRule {
 | |
|   warningOnly?: boolean;
 | |
|   /** validate the value from a list of possible values */
 | |
|   enum?: StoreValue[];
 | |
|   /** validate the exact length of a field */
 | |
|   len?: number;
 | |
|   /** validate the max length of a field */
 | |
|   max?: number;
 | |
|   /** validation error message */
 | |
|   message?: string | VueNode;
 | |
|   /** validate the min length of a field */
 | |
|   min?: number;
 | |
|   /** validate from a regular expression */
 | |
|   pattern?: RegExp;
 | |
|   /** indicates whether field is required */
 | |
|   required?: boolean;
 | |
|   /** transform a value before validation */
 | |
|   transform?: (value: StoreValue) => StoreValue;
 | |
|   /** built-in validation type, available options: https://github.com/yiminghe/async-validator#type */
 | |
|   type?: RuleType;
 | |
|   /** treat required fields that only contain whitespace as errors */
 | |
|   whitespace?: boolean;
 | |
|   /** Customize rule level `validateTrigger`. Must be subset of Field `validateTrigger` */
 | |
|   validateTrigger?: string | string[];
 | |
|   /** Check trigger timing */
 | |
|   trigger?: 'blur' | 'change' | Array<'change' | 'blur'>;
 | |
| }
 | |
| 
 | |
| type AggregationRule = BaseRule & Partial<ValidatorRule>;
 | |
| 
 | |
| interface ArrayRule extends Omit<AggregationRule, 'type'> {
 | |
|   type: 'array';
 | |
|   defaultField?: RuleObject;
 | |
| }
 | |
| 
 | |
| export type RuleObject = AggregationRule | ArrayRule;
 | |
| 
 | |
| export type Rule = RuleObject;
 | |
| 
 | |
| export interface ValidateErrorEntity<Values = any> {
 | |
|   values: Values;
 | |
|   errorFields: { name: InternalNamePath; errors: string[] }[];
 | |
|   outOfDate: boolean;
 | |
| }
 | |
| 
 | |
| export interface FieldError {
 | |
|   name: InternalNamePath | string;
 | |
|   errors: string[];
 | |
| }
 | |
| 
 | |
| export interface RuleError {
 | |
|   errors: string[];
 | |
|   rule: RuleObject;
 | |
| }
 | |
| 
 | |
| export interface ValidateOptions {
 | |
|   triggerName?: string;
 | |
|   validateMessages?: ValidateMessages;
 | |
| }
 | |
| 
 | |
| export type InternalValidateFields = (
 | |
|   nameList?: NamePath[],
 | |
|   options?: ValidateOptions,
 | |
| ) => Promise<Store>;
 | |
| export type ValidateFields = (nameList?: NamePath[]) => Promise<Store>;
 | |
| 
 | |
| // >>>>>> Info
 | |
| interface ValueUpdateInfo {
 | |
|   type: 'valueUpdate';
 | |
|   source: 'internal' | 'external';
 | |
| }
 | |
| 
 | |
| interface ValidateFinishInfo {
 | |
|   type: 'validateFinish';
 | |
| }
 | |
| 
 | |
| interface ResetInfo {
 | |
|   type: 'reset';
 | |
| }
 | |
| 
 | |
| interface SetFieldInfo {
 | |
|   type: 'setField';
 | |
|   data: FieldData;
 | |
| }
 | |
| 
 | |
| interface DependenciesUpdateInfo {
 | |
|   type: 'dependenciesUpdate';
 | |
|   /**
 | |
|    * Contains all the related `InternalNamePath[]`.
 | |
|    * a <- b <- c : change `a`
 | |
|    * relatedFields=[a, b, c]
 | |
|    */
 | |
|   relatedFields: InternalNamePath[];
 | |
| }
 | |
| 
 | |
| export type NotifyInfo =
 | |
|   | ValueUpdateInfo
 | |
|   | ValidateFinishInfo
 | |
|   | ResetInfo
 | |
|   | SetFieldInfo
 | |
|   | DependenciesUpdateInfo;
 | |
| 
 | |
| export type ValuedNotifyInfo = NotifyInfo & {
 | |
|   store: Store;
 | |
| };
 | |
| 
 | |
| export interface Callbacks<Values = any> {
 | |
|   onValuesChange?: (changedValues: any, values: Values) => void;
 | |
|   onFieldsChange?: (changedFields: FieldData[], allFields: FieldData[]) => void;
 | |
|   onFinish?: (values: Values) => void;
 | |
|   onFinishFailed?: (errorInfo: ValidateErrorEntity<Values>) => void;
 | |
|   onValidate?: (
 | |
|     name: string | number | string[] | number[],
 | |
|     status: boolean,
 | |
|     errors: string[] | null,
 | |
|   ) => void;
 | |
| }
 | |
| 
 | |
| // eslint-disable-next-line @typescript-eslint/no-explicit-any
 | |
| export type EventArgs = any[];
 | |
| 
 | |
| type ValidateMessage = string | (() => string);
 | |
| export interface ValidateMessages {
 | |
|   default?: ValidateMessage;
 | |
|   required?: ValidateMessage;
 | |
|   enum?: ValidateMessage;
 | |
|   whitespace?: ValidateMessage;
 | |
|   date?: {
 | |
|     format?: ValidateMessage;
 | |
|     parse?: ValidateMessage;
 | |
|     invalid?: ValidateMessage;
 | |
|   };
 | |
|   types?: {
 | |
|     string?: ValidateMessage;
 | |
|     method?: ValidateMessage;
 | |
|     array?: ValidateMessage;
 | |
|     object?: ValidateMessage;
 | |
|     number?: ValidateMessage;
 | |
|     date?: ValidateMessage;
 | |
|     boolean?: ValidateMessage;
 | |
|     integer?: ValidateMessage;
 | |
|     float?: ValidateMessage;
 | |
|     regexp?: ValidateMessage;
 | |
|     email?: ValidateMessage;
 | |
|     url?: ValidateMessage;
 | |
|     hex?: ValidateMessage;
 | |
|   };
 | |
|   string?: {
 | |
|     len?: ValidateMessage;
 | |
|     min?: ValidateMessage;
 | |
|     max?: ValidateMessage;
 | |
|     range?: ValidateMessage;
 | |
|   };
 | |
|   number?: {
 | |
|     len?: ValidateMessage;
 | |
|     min?: ValidateMessage;
 | |
|     max?: ValidateMessage;
 | |
|     range?: ValidateMessage;
 | |
|   };
 | |
|   array?: {
 | |
|     len?: ValidateMessage;
 | |
|     min?: ValidateMessage;
 | |
|     max?: ValidateMessage;
 | |
|     range?: ValidateMessage;
 | |
|   };
 | |
|   pattern?: {
 | |
|     mismatch?: ValidateMessage;
 | |
|   };
 | |
| }
 |