@@ -19,27 +19,30 @@ const FILES_TO_IGNORE = [
19
19
* @param evt
20
20
*/
21
21
export async function fromEvent ( evt : Event | any ) : Promise < ( FileWithPath | DataTransferItem ) [ ] > {
22
- if ( isDragEvt ( evt ) && evt . dataTransfer ) {
22
+ if ( isObject < DragEvent > ( evt ) && isDataTransfer ( evt ) ) {
23
23
return getDataTransferFiles ( evt . dataTransfer , evt . type ) ;
24
- } else if ( evt instanceof Event ) {
24
+ } else if ( isChangeEvt ( evt ) ) {
25
25
return getInputFiles ( evt ) ;
26
26
} else if ( Array . isArray ( evt ) && evt . every ( item => 'getFile' in item && typeof item . getFile === 'function' ) ) {
27
27
return getFsHandleFiles ( evt )
28
28
}
29
29
return [ ] ;
30
30
}
31
31
32
- function isDragEvt ( value : any ) : value is DragEvent {
33
- return ! ! value . dataTransfer ;
32
+ function isDataTransfer ( value : any ) : value is DataTransfer {
33
+ return isObject ( value . dataTransfer ) ;
34
+ }
35
+
36
+ function isChangeEvt ( value : any ) : value is Event {
37
+ return isObject < Event > ( value ) && isObject ( value . target ) ;
38
+ }
39
+
40
+ function isObject < T > ( v : any ) : v is T {
41
+ return typeof v === 'object' && v !== null
34
42
}
35
43
36
44
function getInputFiles ( evt : Event ) {
37
- const files = isInput ( evt . target )
38
- ? evt . target . files
39
- ? fromList < FileWithPath > ( evt . target . files )
40
- : [ ]
41
- : [ ] ;
42
- return files . map ( file => toFileWithPath ( file ) ) ;
45
+ return fromList < FileWithPath > ( ( evt . target as HTMLInputElement ) . files ) . map ( file => toFileWithPath ( file ) ) ;
43
46
}
44
47
45
48
// Ee expect each handle to be https://developer.mozilla.org/en-US/docs/Web/API/FileSystemFileHandle
@@ -48,11 +51,12 @@ async function getFsHandleFiles(handles: any[]) {
48
51
return files . map ( file => toFileWithPath ( file ) ) ;
49
52
}
50
53
51
- function isInput ( value : EventTarget | null ) : value is HTMLInputElement {
52
- return value !== null ;
53
- }
54
54
55
- async function getDataTransferFiles ( dt : DataTransfer , type : string ) {
55
+ async function getDataTransferFiles ( dt : DataTransfer | null , type : string ) {
56
+ if ( dt === null ) {
57
+ return [ ] ;
58
+ }
59
+
56
60
// IE11 does not support dataTransfer.items
57
61
// See https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/items#Browser_compatibility
58
62
if ( dt . items ) {
@@ -79,7 +83,11 @@ function noIgnoredFiles(files: FileWithPath[]) {
79
83
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from#Browser_compatibility
80
84
// https://developer.mozilla.org/en-US/docs/Web/API/FileList
81
85
// https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItemList
82
- function fromList < T > ( items : DataTransferItemList | FileList ) : T [ ] {
86
+ function fromList < T > ( items : DataTransferItemList | FileList | null ) : T [ ] {
87
+ if ( items === null ) {
88
+ return [ ] ;
89
+ }
90
+
83
91
const files = [ ] ;
84
92
85
93
// tslint:disable: prefer-for-of
0 commit comments