@@ -12,57 +12,55 @@ declare global {
12
12
}
13
13
}
14
14
15
+ function restoreProperty < T extends object > (
16
+ obj : T ,
17
+ prop : keyof T ,
18
+ descriptor ?: PropertyDescriptor ,
19
+ ) {
20
+ if ( descriptor ) {
21
+ Object . defineProperty ( obj , prop , descriptor )
22
+ } else {
23
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
24
+ delete obj [ prop ]
25
+ }
26
+ }
27
+
15
28
export function setFiles (
16
29
el : HTMLInputElement & { type : 'file' } ,
17
30
files : FileList ,
18
31
) {
19
32
el [ fakeFiles ] ?. restore ( )
20
33
21
- const objectDescriptors = Object . getOwnPropertyDescriptors ( el )
22
- const prototypeDescriptors = Object . getOwnPropertyDescriptors (
23
- Object . getPrototypeOf ( el ) ,
24
- )
34
+ const typeDescr = Object . getOwnPropertyDescriptor ( el , 'type' )
35
+ const valueDescr = Object . getOwnPropertyDescriptor ( el , 'value' )
36
+ const filesDescr = Object . getOwnPropertyDescriptor ( el , 'files' )
25
37
26
38
function restore ( ) {
27
- Object . defineProperties ( el , {
28
- files : {
29
- ...prototypeDescriptors . files ,
30
- ...objectDescriptors . files ,
31
- } ,
32
- value : {
33
- ...prototypeDescriptors . value ,
34
- ...objectDescriptors . value ,
35
- } ,
36
- type : {
37
- ...prototypeDescriptors . type ,
38
- ...objectDescriptors . type ,
39
- } ,
40
- } )
39
+ restoreProperty ( el , 'type' , typeDescr )
40
+ restoreProperty ( el , 'value' , valueDescr )
41
+ restoreProperty ( el , 'files' , filesDescr )
41
42
}
42
43
el [ fakeFiles ] = { restore}
43
44
44
45
Object . defineProperties ( el , {
45
46
files : {
46
- ...prototypeDescriptors . files ,
47
- ...objectDescriptors . files ,
47
+ configurable : true ,
48
48
get : ( ) => files ,
49
49
} ,
50
50
value : {
51
- ...prototypeDescriptors . value ,
52
- ...objectDescriptors . value ,
51
+ configurable : true ,
53
52
get : ( ) => ( files . length ? `C:\\fakepath\\${ files [ 0 ] . name } ` : '' ) ,
54
53
set ( v : string ) {
55
54
if ( v === '' ) {
56
55
restore ( )
57
56
} else {
58
- objectDescriptors . value . set ?. call ( el , v )
57
+ valueDescr ? .set ?. call ( el , v )
59
58
}
60
59
} ,
61
60
} ,
62
- // eslint-disable-next-line accessor-pairs
63
61
type : {
64
- ... prototypeDescriptors . type ,
65
- ... objectDescriptors . type ,
62
+ configurable : true ,
63
+ get : ( ) => 'file' ,
66
64
set ( v : string ) {
67
65
if ( v !== 'file' ) {
68
66
restore ( )
0 commit comments