1
- import { ref , computed , reactive , watch , isRef } from 'vue' ;
1
+ import { computed , reactive } from 'vue' ;
2
+ import { TEST_FUNCTION , ERROR_MESSAGE , RESULT , hasOwn , isObject } from './helpers'
3
+ import { Data , Rules , Rule , Dirt , Entry , UnknownObject , Result , InitializeArgs , EntryData , EntryItem , Error } from './types'
2
4
3
- const TEST_FUNCTION = ( ) => true ;
5
+ const useValidate = ( data : Data , rules : Rules ) => {
6
+ const dirt = reactive < Dirt > ( { } ) ;
7
+ const rawData = reactive < UnknownObject > ( { } ) ;
8
+ const entry = reactive < Entry > ( { } ) ;
9
+ const result = computed < Result > ( ( ) => getResult ( entry , dirt ) ) ;
4
10
5
- const ERROR_MESSAGE = '' ;
11
+ const getResult = ( entry : Entry , dirt : Dirt ) : Result => {
12
+ const result : Result = { ...RESULT , $dirty : false } ;
13
+ const keys : Array < string > = Object . keys ( entry ) ;
6
14
7
- const RESULT = { $invalid : false , $errors : [ ] , $messages : [ ] } ;
15
+ let testFns : Array < Function > = [ ] ;
16
+ let resetFns : Array < Function > = [ ] ;
8
17
9
- const hasOwn = ( obj , key ) => typeof obj [ key ] !== 'undefined' ;
10
-
11
- const isObject = obj => Object . prototype . toString . call ( obj ) === '[object Object]' ;
12
-
13
- const useValidate = ( data , rules ) => {
14
- const dirt = reactive ( { } ) ;
15
-
16
- const rawData = reactive ( { } ) ;
17
-
18
- const entry = reactive ( { } ) ;
19
-
20
- const result = computed ( ( ) => getResult ( entry , dirt ) ) ;
21
-
22
- const getResult = ( entry , dirt ) => {
23
- const result = {
24
- ...RESULT ,
25
- $dirty : false ,
26
- } ;
27
-
28
- const keys = Object . keys ( entry ) ;
29
-
30
- let testFns = [ ] ;
31
- let resetFns = [ ] ;
32
-
33
- const setOverallResult = ( result , childResult ) => {
18
+ const setOverallResult = ( result : Result , childResult : Result ) : void => {
34
19
if ( ! result . $dirty && childResult . $dirty ) result . $dirty = true ;
35
20
if ( ! result . $invalid && childResult . $invalid ) result . $invalid = true ;
36
21
@@ -43,7 +28,7 @@ const useValidate = (data, rules) => {
43
28
44
29
keys . forEach ( key => {
45
30
if ( isObject ( entry [ key ] ) && ! hasOwn ( entry [ key ] , '$invalid' ) ) {
46
- const childResult = getResult ( entry [ key ] , dirt [ key ] ) ;
31
+ const childResult = getResult ( entry [ key ] as Entry , dirt [ key ] as Dirt ) ;
47
32
result [ key ] = { ...childResult } ;
48
33
49
34
setOverallResult ( result , childResult ) ;
@@ -66,24 +51,24 @@ const useValidate = (data, rules) => {
66
51
return result ;
67
52
} ;
68
53
69
- const initialize = ( data , rules , dirt , rawData , entry ) => {
70
- const keys = Object . keys ( data ) ;
54
+ const initialize = ( data : Data , rules : Rules , dirt : Dirt , rawData : UnknownObject , entry : Entry ) : void => {
55
+ const keys : Array < string > = Object . keys ( data ) ;
71
56
72
- keys . forEach ( key => {
57
+ keys . forEach ( ( key ) => {
73
58
if ( isObject ( data [ key ] ) ) {
74
59
rawData [ key ] = { } ;
75
60
dirt [ key ] = reactive ( { } ) ;
76
61
entry [ key ] = reactive ( { } ) ;
77
62
78
- const args = [ data [ key ] , rules [ key ] , dirt [ key ] , rawData [ key ] , entry [ key ] ] ;
63
+ const args : InitializeArgs = [ data [ key ] , rules [ key ] as Rules , dirt [ key ] as Dirt , rawData [ key ] , entry [ key ] as Entry ] ;
79
64
80
65
return initialize ( ...args ) ;
81
66
}
82
67
83
68
dirt [ key ] = false ;
84
69
rawData [ key ] = data [ key ] ;
85
70
86
- const entryData = { data, rules, dirt, rawData, entry } ;
71
+ const entryData : EntryData = { data, rules, dirt, rawData, entry } ;
87
72
88
73
entry [ key ] = {
89
74
...RESULT ,
@@ -93,34 +78,36 @@ const useValidate = (data, rules) => {
93
78
} ) ;
94
79
} ;
95
80
96
- const test = ( entryData , key ) => {
81
+ const test = ( entryData : EntryData , key : string ) : void => {
97
82
const { data, rules, dirt, rawData, entry } = entryData ;
98
83
99
84
dirt [ key ] = dirt [ key ] || data [ key ] !== rawData [ key ] ;
100
85
101
- let $errors = [ ] ;
102
- let $messages = [ ] ;
86
+ let $errors : Array < Error > = [ ] ;
87
+ let $messages : Array < string > = [ ] ;
88
+
89
+ const ruleItem = rules [ key ] as Array < Rule >
103
90
104
- rules [ key ] . forEach ( ( rule , index ) => {
105
- const { $test = DEFAULT_TEST_FUNCTION , $message = DEFAULT_ERROR_MESSAGE } = rule ;
91
+ ruleItem . forEach ( ( rule , index ) => {
92
+ const { $test = TEST_FUNCTION , $message = ERROR_MESSAGE } = rule ;
106
93
const testValue = $test ( data [ key ] ) ;
107
94
108
95
if ( ! testValue ) {
109
- const testMessage = typeof $message === 'function' ? $message ( data ) : $message ;
96
+ const testMessage = typeof $message === 'function' ? $message ( data [ key ] ) : $message ;
110
97
$messages = [ ...$messages , testMessage ] ;
111
98
$errors = [ ...$errors , { name : $test . name , index } ] ;
112
99
}
113
100
} ) ;
114
101
115
- entry [ key ] = { ...entry [ key ] , $errors, $messages, $invalid : Boolean ( $errors . length ) } ;
102
+ entry [ key ] = { ...entry [ key ] , $errors, $messages, $invalid : Boolean ( $errors . length ) } as EntryItem ;
116
103
} ;
117
104
118
- const reset = ( entryData , key ) => {
105
+ const reset = ( entryData : EntryData , key : string ) : void => {
119
106
const { dirt } = entryData ;
120
107
dirt [ key ] = false ;
121
108
} ;
122
109
123
- initialize ( isRef ( data ) ? data . value : data , rules , dirt , rawData , entry ) ;
110
+ initialize ( data , rules , dirt , rawData , entry ) ;
124
111
125
112
return { result, test : result . value . $test , reset : result . value . $reset } ;
126
113
} ;
0 commit comments