UNPKG

vue-files-preview-inno

Version:

A tool for previewing files such as doc, excel, pdf, image, markdown, txt, audio, and video and so on.

1 lines 15.4 kB
{"version":3,"file":"utils.mjs","sources":["../../../../../packages/preview/utils/utils.ts"],"sourcesContent":["import type {FileRenderType, PreviewType} from '../preview.interface'\nimport {\n arrayBufferPreviewTypeList,\n getPreviewTypeByFileType,\n imagePreviewTypeList,\n pdfPreviewTypeList,\n textFilePreviewTypeList,\n videoPreviewTypeList,\n} from '../preview.const'\n\nconst videoMimeTypes: Record<string, string> = {\n mp4: 'video/mp4',\n webm: 'video/webm',\n ogg: 'video/ogg',\n mkv: 'video/x-matroska',\n avi: 'video/x-msvideo',\n mpeg: 'video/mpeg',\n flv: 'video/x-flv',\n mov: 'video/quicktime',\n wmv: 'video/x-ms-wmv',\n}\n\n// MIME Type to File Extension Mapping for Blob Type Inference\nconst mimeToExtMap: Record<string, string> = {\n 'image/svg+xml': 'svg',\n 'image/png': 'png',\n 'image/jpeg': 'jpg',\n 'image/gif': 'gif',\n 'image/webp': 'webp',\n 'image/bmp': 'bmp',\n 'image/x-icon': 'ico',\n 'image/vnd.microsoft.icon': 'ico',\n 'application/pdf': 'pdf',\n 'text/plain': 'txt',\n 'text/markdown': 'md',\n 'text/html': 'html',\n 'text/css': 'css',\n 'text/javascript': 'js',\n 'application/javascript': 'js',\n 'application/json': 'json',\n 'application/xml': 'xml',\n 'text/xml': 'xml',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'xlsx',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'pptx',\n 'application/msword': 'doc',\n 'application/vnd.ms-excel': 'xls',\n 'application/vnd.ms-powerpoint': 'ppt',\n 'application/epub+zip': 'epub',\n 'video/mp4': 'mp4',\n 'video/webm': 'webm',\n 'video/ogg': 'ogg',\n 'video/quicktime': 'mov',\n 'audio/mpeg': 'mp3',\n 'audio/wav': 'wav',\n 'audio/ogg': 'ogg',\n 'audio/flac': 'flac',\n 'application/vnd.ms-outlook': 'msg',\n}\n\n/**\n * Inferring File Extensions from MIME Types\n * @param mimeType\n */\nexport function getExtFromMimeType(mimeType: string): string {\n if (!mimeType) return ''\n // Exact Match\n if (mimeToExtMap[mimeType]) return mimeToExtMap[mimeType]\n // Attempting to extract from the MIME subtype, e.g., image/png -> png\n const parts = mimeType.split('/')\n if (parts.length === 2) {\n const subtype = parts[1].replace(/^x-/, '')\n return subtype\n }\n return ''\n}\n\n/**\n * Get File Type\n * Supports File and Blob objects. For Blobs, the name is extracted first; failing that, it is inferred from the MIME type.\n * @param file File or Blob object\n * @param name Optional filename, used to infer the type from the Blob.\n */\nexport function getFileType(file: File | Blob, name?: string): string {\n // First extraction from File.name.\n if ('name' in file && file.name) {\n const idx = file.name.lastIndexOf('.')\n if (idx !== -1) return file.name.substring(idx + 1)\n }\n // Secondly, extraction of the name from an external source.\n if (name) {\n const idx = name.lastIndexOf('.')\n if (idx !== -1) return name.substring(idx + 1)\n }\n // Finally, infer from the MIME type.\n return getExtFromMimeType(file.type)\n}\n\n/**\n * Get Filename\n * Supports File and Blob\n * @param file File or Blob object\n * @param name Optional filename\n */\nexport function getFileName(file: File | Blob, name?: string): string {\n // First extraction from File.name.\n if ('name' in file && file.name) {\n const idx = file.name.lastIndexOf('.')\n return idx === -1 ? file.name : file.name.substring(0, idx)\n }\n // Secondly, extraction of the 'name' from an external source.\n if (name) {\n const idx = name.lastIndexOf('.')\n return idx === -1 ? name : name.substring(0, idx)\n }\n return ''\n}\n\n/**\n * Safely decodes a URI component; returns the original string if decoding fails.\n * @param str\n */\nfunction safeDecodeURIComponent(str: string): string {\n try {\n return decodeURIComponent(str)\n } catch {\n return str\n }\n}\n\n/**\n * Get File Extension from URL.\n * Supports inference based on a three-tier hierarchy: URL path, name parameter, and Content-Type header.\n * @param url\n * @param name Optional filename, used for fallback inference.\n */\nexport function getFileTypeFromUrl(url: string, name?: string): string {\n // First extraction from the URL path.\n try {\n const urlObj = new URL(url, window.location.origin)\n const pathname = safeDecodeURIComponent(urlObj.pathname)\n const idx = pathname.lastIndexOf('.')\n if (idx !== -1) {\n const ext = pathname.substring(idx + 1).toLowerCase()\n // Remove potential residual query parameters.\n const cleaned = ext.split('?')[0].split('#')[0]\n if (cleaned) return cleaned\n }\n } catch {\n const decoded = safeDecodeURIComponent(url)\n const idx = decoded.lastIndexOf('.')\n if (idx !== -1) {\n const ext = decoded.substring(idx + 1).toLowerCase()\n const cleaned = ext.split('?')[0].split('#')[0]\n if (cleaned) return cleaned\n }\n }\n // Secondly, extract from the name parameter.\n if (name) {\n const idx = name.lastIndexOf('.')\n if (idx !== -1) return name.substring(idx + 1).toLowerCase()\n }\n return ''\n}\n\n/**\n * Extract filename (without extension) from URL\n * @param url\n * @param name Optional filename for fallback\n */\nexport function getFileNameFromUrl(url: string, name?: string): string {\n try {\n const urlObj = new URL(url, window.location.origin)\n const pathname = safeDecodeURIComponent(urlObj.pathname)\n const lastSlash = pathname.lastIndexOf('/')\n const filename = pathname.substring(lastSlash + 1)\n const dotIdx = filename.lastIndexOf('.')\n const result = dotIdx === -1 ? filename : filename.substring(0, dotIdx)\n if (result) return result\n } catch {\n const lastSlash = url.lastIndexOf('/')\n const filename = safeDecodeURIComponent(url.substring(lastSlash + 1).split('?')[0].split('#')[0])\n const dotIdx = filename.lastIndexOf('.')\n const result = dotIdx === -1 ? filename : filename.substring(0, dotIdx)\n if (result) return result\n }\n // Fall back to the name parameter.\n if (name) {\n const idx = name.lastIndexOf('.')\n return idx === -1 ? name : name.substring(0, idx)\n }\n return ''\n}\n\n/**\n * Retrieve fileRender via URL\n * @param url File Location\n * @param fileType Optional file type; if not provided, it will be parsed from the URL.\n */\nexport async function getFileRenderByUrl(url: string, fileType?: string): Promise<ArrayBuffer | string> {\n const ext = fileType || getFileTypeFromUrl(url)\n\n const previewType = getPreviewTypeByFileType(ext)\n const renderType = getFileRenderType(previewType)\n\n // For images, videos, and PDFs, return the URL directly (which can be loaded directly by the browser).\n if (renderType === 'image' || renderType === 'video' || renderType === 'pdf') {\n return url\n }\n\n // Other types require fetching content.\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(`Failed to fetch file: ${response.status} ${response.statusText}`)\n }\n\n if (renderType === 'text') {\n return await response.text()\n }\n\n if (renderType === 'arrayBuffer') {\n return await response.arrayBuffer()\n }\n\n // Default Return URL\n return url\n}\n\n/**\n * Retrieve fileRender based on file type.\n * Supports File and Blob objects.\n * @param file File or Blob object\n * @param name Optional filename, used for Blob type inference.\n */\nexport function getFileRenderByFile(file: File | Blob, name?: string): Promise<ArrayBuffer | string> {\n const previewType = getPreviewTypeByFileType(getFileType(file, name))\n const renderType = getFileRenderType(previewType)\n return new Promise((resolve) => {\n const raw = file\n const fileReader = new FileReader()\n switch (renderType) {\n case 'text':\n fileReader.readAsText(raw)\n fileReader.onload = () => {\n resolve(fileReader.result)\n }\n break\n case 'arrayBuffer':\n fileReader.readAsArrayBuffer(raw)\n fileReader.onload = () => {\n resolve(fileReader.result)\n }\n break\n case 'image':\n resolve(window.URL.createObjectURL(raw))\n break\n case 'pdf': {\n const pdfBloBlob = new Blob([raw], {type: 'application/pdf'})\n const pdfBlobUrl = URL.createObjectURL(pdfBloBlob)\n resolve(pdfBlobUrl)\n break\n }\n case 'video': {\n const ext = getFileType(file, name)\n const mimeType = videoMimeTypes[ext] || file.type || 'video/mp4'\n const videoBlobUrl = URL.createObjectURL(new Blob([raw], {type: mimeType}))\n resolve(videoBlobUrl)\n break\n }\n default:\n resolve(window.URL.createObjectURL(raw))\n break\n }\n })\n}\n\n/**\n * Get File Rendering Data Type\n * @param previewType\n */\nexport function getFileRenderType(previewType: PreviewType): FileRenderType {\n const types: Record<FileRenderType, boolean> = {\n text: textFilePreviewTypeList.includes(previewType),\n arrayBuffer: arrayBufferPreviewTypeList.includes(previewType),\n image: imagePreviewTypeList.includes(previewType),\n pdf: pdfPreviewTypeList.includes(previewType),\n video: videoPreviewTypeList.includes(previewType),\n }\n return Object.keys(types)!.find(key => types[key]) as FileRenderType\n}\n"],"names":["videoMimeTypes","mimeToExtMap","getExtFromMimeType","mimeType","parts","getFileType","file","name","idx","getFileName","safeDecodeURIComponent","str","getFileTypeFromUrl","url","urlObj","pathname","cleaned","decoded","getFileNameFromUrl","lastSlash","filename","dotIdx","result","getFileRenderByUrl","fileType","ext","previewType","getPreviewTypeByFileType","renderType","getFileRenderType","response","getFileRenderByFile","resolve","raw","fileReader","pdfBloBlob","pdfBlobUrl","videoBlobUrl","types","textFilePreviewTypeList","arrayBufferPreviewTypeList","imagePreviewTypeList","pdfPreviewTypeList","videoPreviewTypeList","key"],"mappings":"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"}