import {DEFAULT_MIME_TYPES} from './mime-default'; export function toFileWithPath(file: File, path?: string, h?: FileSystemHandle): FileWithPath { const f = file as FileWithPath; const {webkitRelativePath} = file; const p = typeof path === 'string' ? path : // If is set, // the File will have a {webkitRelativePath} property // https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/webkitdirectory typeof webkitRelativePath === 'string' && webkitRelativePath.length > 0 ? webkitRelativePath : `./${file.name}`; if (typeof f.path !== 'string') { // on electron, path is already set to the absolute path setObjProp(f, 'path', p); } if (h !== undefined) { Object.defineProperty(f, 'handle', { value: h, writable: false, configurable: false, enumerable: true }); } // Always populate a relative path so that even electron apps have access to a relativePath value setObjProp(f, 'relativePath', p); return f; } export interface FileWithPath extends File { readonly path: string; readonly relativePath: string; readonly handle?: FileSystemFileHandle; } /** * Sets a File's `type` from its extension using the provided `mimeTypes` lookup, * but only when the browser didn't already set a type. Returns the same File. */ export function withMimeType(file: File, mimeTypes: Map = DEFAULT_MIME_TYPES): FileWithPath { const {name} = file; const hasExtension = name && name.lastIndexOf('.') !== -1; if (hasExtension && !file.type) { const ext = name.split('.').pop()!.toLowerCase(); const type = mimeTypes.get(ext); if (type) { Object.defineProperty(file, 'type', { value: type, writable: false, configurable: false, enumerable: true }); } } return file as FileWithPath; } function setObjProp(f: FileWithPath, key: string, value: string) { Object.defineProperty(f, key, { value, writable: false, configurable: false, enumerable: true }); }