@@ -19,27 +19,30 @@ const FILES_TO_IGNORE = [
1919 * @param evt
2020 */
2121export async function fromEvent ( evt : Event | any ) : Promise < ( FileWithPath | DataTransferItem ) [ ] > {
22- if ( isDragEvt ( evt ) && evt . dataTransfer ) {
22+ if ( isObject < DragEvent > ( evt ) && isDataTransfer ( evt ) ) {
2323 return getDataTransferFiles ( evt . dataTransfer , evt . type ) ;
24- } else if ( evt instanceof Event ) {
24+ } else if ( isChangeEvt ( evt ) ) {
2525 return getInputFiles ( evt ) ;
2626 } else if ( Array . isArray ( evt ) && evt . every ( item => 'getFile' in item && typeof item . getFile === 'function' ) ) {
2727 return getFsHandleFiles ( evt )
2828 }
2929 return [ ] ;
3030}
3131
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
3442}
3543
3644function 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 ) ) ;
4346}
4447
4548// 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[]) {
4851 return files . map ( file => toFileWithPath ( file ) ) ;
4952}
5053
51- function isInput ( value : EventTarget | null ) : value is HTMLInputElement {
52- return value !== null ;
53- }
5454
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+
5660 // IE11 does not support dataTransfer.items
5761 // See https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/items#Browser_compatibility
5862 if ( dt . items ) {
@@ -79,7 +83,11 @@ function noIgnoredFiles(files: FileWithPath[]) {
7983// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from#Browser_compatibility
8084// https://developer.mozilla.org/en-US/docs/Web/API/FileList
8185// 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+
8391 const files = [ ] ;
8492
8593 // tslint:disable: prefer-for-of
0 commit comments