import type { FileSystemHandle } from 'browser-fs-access'; import { fileOpen as _fileOpen, fileSave as _fileSave, supported as nativeFileSystemSupported, } from 'browser-fs-access'; import { MIME_TYPES } from '../constants'; type FILE_EXTENSION = Exclude; export const fileOpen = (opts: { extensions?: FILE_EXTENSION[]; description: string; multiple?: M; }): Promise => { // an unsafe TS hack, alas not much we can do AFAIK type RetType = M extends false | undefined ? File : File[]; const mimeTypes = opts.extensions?.reduce((mimeTypes, type) => { mimeTypes.push(MIME_TYPES[type]); return mimeTypes; }, [] as string[]); const extensions = opts.extensions?.reduce((acc, ext) => { if (ext === 'jpg') { return acc.concat('.jpg', '.jpeg'); } return acc.concat(`.${ext}`); }, [] as string[]); return _fileOpen({ description: opts.description, extensions, mimeTypes, multiple: opts.multiple ?? false, }) as Promise; }; export const fileSave = ( blob: Blob | Promise, opts: { /** supply without the extension */ name: string; /** file extension */ extension: FILE_EXTENSION; description: string; /** existing FileSystemHandle */ fileHandle?: FileSystemHandle | null; } ) => { return _fileSave( blob, { fileName: `${opts.name}.${opts.extension}`, description: opts.description, extensions: [`.${opts.extension}`], }, opts.fileHandle as any ); }; export type { FileSystemHandle }; export { nativeFileSystemSupported };