@sendbird/uikit-utils 3.0.3 → 3.0.4-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -54,9 +54,9 @@ const EXTENSION_MIME_MAP = {
54
54
  };
55
55
  const imageExtRegex = /jpeg|jpg|png|webp|gif/i;
56
56
  exports.imageExtRegex = imageExtRegex;
57
- const audioExtRegex = /3gp|aac|aax|act|aiff|flac|gsm|m4a|m4b|m4p|tta|wma|mp3|webm|wav/i;
57
+ const audioExtRegex = /3gp|aac|aax|act|aiff|flac|gsm|m4a|m4b|m4p|tta|wma|mp3|webm|wav|ogg/i;
58
58
  exports.audioExtRegex = audioExtRegex;
59
- const videoExtRegex = /mov|vod|mp4|avi/i;
59
+ const videoExtRegex = /mov|vod|mp4|avi|mpeg|ogv/i;
60
60
  exports.videoExtRegex = videoExtRegex;
61
61
  const getFileType = extensionOrType => {
62
62
  const lowerCased = extensionOrType.toLowerCase();
@@ -176,7 +176,9 @@ function getFileExtensionFromMime(mimeType) {
176
176
  acc[value] = key;
177
177
  return acc;
178
178
  }, {});
179
- return MIME_EXTENSION_MAP[mimeType.toLowerCase()] || '';
179
+ const extension = MIME_EXTENSION_MAP[mimeType.toLowerCase()];
180
+ if (extension) return '.' + extension;
181
+ return '';
180
182
  }
181
183
 
182
184
  /**
@@ -187,7 +189,9 @@ function getFileExtensionFromMime(mimeType) {
187
189
  */
188
190
  function getMimeFromFileExtension(ext) {
189
191
  if (!ext) return '';
190
- return EXTENSION_MIME_MAP[ext.toLowerCase()] || '';
192
+ const sliceIdx = ext.lastIndexOf('.');
193
+ const extWithoutDot = sliceIdx === -1 ? ext : ext.slice(sliceIdx + 1);
194
+ return EXTENSION_MIME_MAP[extWithoutDot.toLowerCase()] || '';
191
195
  }
192
196
 
193
197
  /**
@@ -203,8 +207,9 @@ function getFileExtension(filePath) {
203
207
  const result = pathWithoutParams.slice(idx - pathWithoutParams.length).toLowerCase();
204
208
  if (result === '.') return '';else return result;
205
209
  }
206
- function getFileExtensionFromUri(uri) {
207
- return fetch(uri).then(response => response.headers.get('content-type'));
210
+ async function getFileExtensionFromUri(uri) {
211
+ const type = await fetch(uri).then(response => response.headers.get('content-type'));
212
+ return getFileExtensionFromMime(type);
208
213
  }
209
214
  function isImage(filePath, mimeType) {
210
215
  const type = getFileType(mimeType || getFileExtension(filePath));
@@ -1 +1 @@
1
- {"version":3,"names":["EXTENSION_MIME_MAP","imageExtRegex","exports","audioExtRegex","videoExtRegex","getFileType","extensionOrType","lowerCased","toLowerCase","indexOf","type","split","match","startsWith","getDownscaleSize","origin","resizing","ratio","maxWidth","width","maxHeight","height","Math","min","normalizeFileName","fileName","extension","_extension","_filename","hasExtension","lastIndexOf","length","parseMimeType","mimeType","fullType","parts","subtype","parameters","part","name","value","trim","getFileExtensionFromMime","MIME_EXTENSION_MAP","Object","entries","reduce","acc","_ref","key","getMimeFromFileExtension","ext","getFileExtension","filePath","pathWithoutParams","idx","result","slice","getFileExtensionFromUri","uri","fetch","then","response","headers","get","isImage","shouldCompressImage","mime","compressionEnabled","arguments","undefined","Boolean"],"sources":["file.ts"],"sourcesContent":["const EXTENSION_MIME_MAP = {\n // Image\n 'jpeg': 'image/jpeg',\n 'jpg': 'image/jpeg',\n 'png': 'image/png',\n 'gif': 'image/gif',\n 'webp': 'image/webp',\n 'svg': 'image/svg+xml',\n\n // Video\n '3gp': 'video/3gpp',\n 'mp4': 'video/mp4',\n 'mpeg': 'video/mpeg',\n 'ogv': 'video/ogg',\n 'video/quicktime': 'mov',\n 'webm': 'video/webm',\n 'avi': 'video/x-msvideo',\n\n // Audio\n 'aac': 'audio/aac',\n 'mid': 'audio/midi',\n 'mp3': 'audio/mpeg',\n 'ogg': 'audio/ogg',\n 'wav': 'audio/wav',\n 'weba': 'audio/webm',\n\n // Files\n 'txt': 'text/plain',\n 'pdf': 'application/pdf',\n 'doc': 'application/msword',\n 'docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'xls': 'application/vnd.ms-excel',\n 'xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'ppt': 'application/vnd.ms-powerpoint',\n 'pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'zip': 'application/zip',\n 'json': 'application/json',\n 'gzip': 'application/x-gzip',\n} as Record<string, string>;\n\nexport const imageExtRegex = /jpeg|jpg|png|webp|gif/i;\nexport const audioExtRegex = /3gp|aac|aax|act|aiff|flac|gsm|m4a|m4b|m4p|tta|wma|mp3|webm|wav/i;\nexport const videoExtRegex = /mov|vod|mp4|avi/i;\nexport const getFileType = (extensionOrType: string) => {\n const lowerCased = extensionOrType.toLowerCase();\n\n // mime type\n if (lowerCased.indexOf('/') > -1) {\n const type = lowerCased.split('/')[0];\n if (type === 'video') return 'video';\n if (type === 'audio') return 'audio';\n if (type === 'image') return 'image';\n return 'file';\n }\n\n // extensions\n if (lowerCased.match(imageExtRegex)) return 'image';\n if (lowerCased.match(audioExtRegex)) return 'audio';\n if (lowerCased.match(videoExtRegex)) return 'video';\n\n // others\n if (lowerCased.startsWith('image')) return 'image';\n if (lowerCased.startsWith('audio')) return 'audio';\n if (lowerCased.startsWith('video')) return 'video';\n\n return 'file';\n};\n\n/**\n * Calculates the downscaled size of an image while preserving its aspect ratio.\n *\n * @param {Object} origin - The original size object with `width` and `height` properties.\n * @param {Object} resizing - The resizing object with optional `width` and `height` properties.\n * @returns {Object} - A new size object with the downscaled `width` and `height` properties.\n * @example\n * ```ts\n * getDownscaleSize({ width: 1200, height: 800 }, { width: 600 }); // returns { width: 600, height: 400 }\n * ```\n */\ntype Size = { width: number; height: number };\nexport function getDownscaleSize(origin: Size, resizing: Partial<Size>) {\n let ratio: number;\n\n const maxWidth = resizing.width || origin.width,\n maxHeight = resizing.height || origin.height;\n\n if (origin.width <= maxWidth && origin.height <= maxHeight) {\n ratio = 1;\n } else if (origin.width > maxWidth && origin.height <= maxHeight) {\n ratio = maxWidth / origin.width;\n } else if (origin.width <= maxWidth && origin.height > maxHeight) {\n ratio = maxHeight / origin.height;\n } else {\n ratio = Math.min(maxWidth / origin.width, maxHeight / origin.height);\n }\n\n return { width: origin.width * ratio, height: origin.height * ratio };\n}\n\n/**\n * Normalize a file name by ensuring it has the given extension, if it doesn't already.\n *\n * @param {string} fileName - The file name to normalize.\n * @param {string} extension - The desired extension, without a leading period.\n * @returns {string} - The normalized file name, with the extension.\n */\nexport function normalizeFileName(fileName: string, extension: string) {\n if (!extension) return fileName;\n\n // .extension\n let _extension = extension.toLowerCase();\n if (_extension.indexOf('.') !== 0) {\n _extension = '.' + _extension;\n }\n\n // filename.extension | filename\n const _filename = fileName.toLowerCase();\n const hasExtension = _filename.lastIndexOf(_extension) === _filename.length - _extension.length;\n if (!hasExtension) {\n // filename.extension\n return fileName + _extension;\n } else {\n // filename.extension\n return fileName;\n }\n}\n\n/**\n * Parses a MIME type string into its components.\n *\n * @param mimeType - The MIME type string to parse.\n * @returns An object containing the type, subtype, and parameters of the MIME type.\n */\ntype MimeType = { type: string; subtype: string; parameters: Record<string, string> };\nexport function parseMimeType(mimeType: string): MimeType {\n const [fullType, ...parts] = mimeType.split(';');\n const [type, subtype] = fullType.split('/');\n const parameters: MimeType['parameters'] = {};\n\n for (const part of parts) {\n const [name, value] = part.trim().split('=');\n parameters[name] = value;\n }\n\n return { type, subtype, parameters };\n}\n\n/**\n * Returns the file extension based on the MIME type.\n *\n * @param {string | null | undefined} mimeType - The MIME type to look up.\n * @returns {string} - The file extension for the given MIME type, or an empty string if no matching file extension was found.\n */\nexport function getFileExtensionFromMime(mimeType?: string | null): string {\n if (!mimeType) return '';\n const MIME_EXTENSION_MAP = Object.entries(EXTENSION_MIME_MAP).reduce((acc, [key, value]) => {\n acc[value] = key;\n return acc;\n }, {} as Record<string, string>);\n return MIME_EXTENSION_MAP[mimeType.toLowerCase()] || '';\n}\n\n/**\n * Returns the MIME type based on the file extension.\n *\n * @param {string | null | undefined} ext - The file extension to look up.\n * @returns {string} - The MIME type for the given file extension, or an empty string if no matching MIME type was found.\n */\nexport function getMimeFromFileExtension(ext?: string | null) {\n if (!ext) return '';\n return EXTENSION_MIME_MAP[ext.toLowerCase()] || '';\n}\n\n/**\n * Returns the file extension of a file path.\n *\n * @param {string} filePath - The file path to extract the extension from.\n * @returns {string} - The file extension, or an empty string if the file path does not have an extension.\n */\nexport function getFileExtension(filePath: string) {\n const pathWithoutParams = filePath.split('?')[0];\n\n const idx = pathWithoutParams.lastIndexOf('.');\n if (idx === -1) return '';\n\n const result = pathWithoutParams.slice(idx - pathWithoutParams.length).toLowerCase();\n if (result === '.') return '';\n else return result;\n}\n\nexport function getFileExtensionFromUri(uri: string) {\n return fetch(uri).then((response) => response.headers.get('content-type'));\n}\n\nexport function isImage(filePath: string, mimeType?: string) {\n const type = getFileType(mimeType || getFileExtension(filePath));\n return type === 'image';\n}\n\nexport function shouldCompressImage(mime: string, compressionEnabled = true) {\n const extension = getFileExtensionFromMime(mime);\n return Boolean(extension.match(/jpg|jpeg|png/i) && compressionEnabled);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA,MAAMA,kBAAkB,GAAG;EACzB;EACA,MAAM,EAAE,YAAY;EACpB,KAAK,EAAE,YAAY;EACnB,KAAK,EAAE,WAAW;EAClB,KAAK,EAAE,WAAW;EAClB,MAAM,EAAE,YAAY;EACpB,KAAK,EAAE,eAAe;EAEtB;EACA,KAAK,EAAE,YAAY;EACnB,KAAK,EAAE,WAAW;EAClB,MAAM,EAAE,YAAY;EACpB,KAAK,EAAE,WAAW;EAClB,iBAAiB,EAAE,KAAK;EACxB,MAAM,EAAE,YAAY;EACpB,KAAK,EAAE,iBAAiB;EAExB;EACA,KAAK,EAAE,WAAW;EAClB,KAAK,EAAE,YAAY;EACnB,KAAK,EAAE,YAAY;EACnB,KAAK,EAAE,WAAW;EAClB,KAAK,EAAE,WAAW;EAClB,MAAM,EAAE,YAAY;EAEpB;EACA,KAAK,EAAE,YAAY;EACnB,KAAK,EAAE,iBAAiB;EACxB,KAAK,EAAE,oBAAoB;EAC3B,MAAM,EAAE,yEAAyE;EACjF,KAAK,EAAE,0BAA0B;EACjC,MAAM,EAAE,mEAAmE;EAC3E,KAAK,EAAE,+BAA+B;EACtC,MAAM,EAAE,2EAA2E;EACnF,KAAK,EAAE,iBAAiB;EACxB,MAAM,EAAE,kBAAkB;EAC1B,MAAM,EAAE;AACV,CAA2B;AAEpB,MAAMC,aAAa,GAAG,wBAAwB;AAACC,OAAA,CAAAD,aAAA,GAAAA,aAAA;AAC/C,MAAME,aAAa,GAAG,iEAAiE;AAACD,OAAA,CAAAC,aAAA,GAAAA,aAAA;AACxF,MAAMC,aAAa,GAAG,kBAAkB;AAACF,OAAA,CAAAE,aAAA,GAAAA,aAAA;AACzC,MAAMC,WAAW,GAAIC,eAAuB,IAAK;EACtD,MAAMC,UAAU,GAAGD,eAAe,CAACE,WAAW,EAAE;;EAEhD;EACA,IAAID,UAAU,CAACE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE;IAChC,MAAMC,IAAI,GAAGH,UAAU,CAACI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrC,IAAID,IAAI,KAAK,OAAO,EAAE,OAAO,OAAO;IACpC,IAAIA,IAAI,KAAK,OAAO,EAAE,OAAO,OAAO;IACpC,IAAIA,IAAI,KAAK,OAAO,EAAE,OAAO,OAAO;IACpC,OAAO,MAAM;EACf;;EAEA;EACA,IAAIH,UAAU,CAACK,KAAK,CAACX,aAAa,CAAC,EAAE,OAAO,OAAO;EACnD,IAAIM,UAAU,CAACK,KAAK,CAACT,aAAa,CAAC,EAAE,OAAO,OAAO;EACnD,IAAII,UAAU,CAACK,KAAK,CAACR,aAAa,CAAC,EAAE,OAAO,OAAO;;EAEnD;EACA,IAAIG,UAAU,CAACM,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,OAAO;EAClD,IAAIN,UAAU,CAACM,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,OAAO;EAClD,IAAIN,UAAU,CAACM,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,OAAO;EAElD,OAAO,MAAM;AACf,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAVAX,OAAA,CAAAG,WAAA,GAAAA,WAAA;AAYO,SAASS,gBAAgBA,CAACC,MAAY,EAAEC,QAAuB,EAAE;EACtE,IAAIC,KAAa;EAEjB,MAAMC,QAAQ,GAAGF,QAAQ,CAACG,KAAK,IAAIJ,MAAM,CAACI,KAAK;IAC7CC,SAAS,GAAGJ,QAAQ,CAACK,MAAM,IAAIN,MAAM,CAACM,MAAM;EAE9C,IAAIN,MAAM,CAACI,KAAK,IAAID,QAAQ,IAAIH,MAAM,CAACM,MAAM,IAAID,SAAS,EAAE;IAC1DH,KAAK,GAAG,CAAC;EACX,CAAC,MAAM,IAAIF,MAAM,CAACI,KAAK,GAAGD,QAAQ,IAAIH,MAAM,CAACM,MAAM,IAAID,SAAS,EAAE;IAChEH,KAAK,GAAGC,QAAQ,GAAGH,MAAM,CAACI,KAAK;EACjC,CAAC,MAAM,IAAIJ,MAAM,CAACI,KAAK,IAAID,QAAQ,IAAIH,MAAM,CAACM,MAAM,GAAGD,SAAS,EAAE;IAChEH,KAAK,GAAGG,SAAS,GAAGL,MAAM,CAACM,MAAM;EACnC,CAAC,MAAM;IACLJ,KAAK,GAAGK,IAAI,CAACC,GAAG,CAACL,QAAQ,GAAGH,MAAM,CAACI,KAAK,EAAEC,SAAS,GAAGL,MAAM,CAACM,MAAM,CAAC;EACtE;EAEA,OAAO;IAAEF,KAAK,EAAEJ,MAAM,CAACI,KAAK,GAAGF,KAAK;IAAEI,MAAM,EAAEN,MAAM,CAACM,MAAM,GAAGJ;EAAM,CAAC;AACvE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASO,iBAAiBA,CAACC,QAAgB,EAAEC,SAAiB,EAAE;EACrE,IAAI,CAACA,SAAS,EAAE,OAAOD,QAAQ;;EAE/B;EACA,IAAIE,UAAU,GAAGD,SAAS,CAAClB,WAAW,EAAE;EACxC,IAAImB,UAAU,CAAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;IACjCkB,UAAU,GAAG,GAAG,GAAGA,UAAU;EAC/B;;EAEA;EACA,MAAMC,SAAS,GAAGH,QAAQ,CAACjB,WAAW,EAAE;EACxC,MAAMqB,YAAY,GAAGD,SAAS,CAACE,WAAW,CAACH,UAAU,CAAC,KAAKC,SAAS,CAACG,MAAM,GAAGJ,UAAU,CAACI,MAAM;EAC/F,IAAI,CAACF,YAAY,EAAE;IACjB;IACA,OAAOJ,QAAQ,GAAGE,UAAU;EAC9B,CAAC,MAAM;IACL;IACA,OAAOF,QAAQ;EACjB;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEO,SAASO,aAAaA,CAACC,QAAgB,EAAY;EACxD,MAAM,CAACC,QAAQ,EAAE,GAAGC,KAAK,CAAC,GAAGF,QAAQ,CAACtB,KAAK,CAAC,GAAG,CAAC;EAChD,MAAM,CAACD,IAAI,EAAE0B,OAAO,CAAC,GAAGF,QAAQ,CAACvB,KAAK,CAAC,GAAG,CAAC;EAC3C,MAAM0B,UAAkC,GAAG,CAAC,CAAC;EAE7C,KAAK,MAAMC,IAAI,IAAIH,KAAK,EAAE;IACxB,MAAM,CAACI,IAAI,EAAEC,KAAK,CAAC,GAAGF,IAAI,CAACG,IAAI,EAAE,CAAC9B,KAAK,CAAC,GAAG,CAAC;IAC5C0B,UAAU,CAACE,IAAI,CAAC,GAAGC,KAAK;EAC1B;EAEA,OAAO;IAAE9B,IAAI;IAAE0B,OAAO;IAAEC;EAAW,CAAC;AACtC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAASK,wBAAwBA,CAACT,QAAwB,EAAU;EACzE,IAAI,CAACA,QAAQ,EAAE,OAAO,EAAE;EACxB,MAAMU,kBAAkB,GAAGC,MAAM,CAACC,OAAO,CAAC7C,kBAAkB,CAAC,CAAC8C,MAAM,CAAC,CAACC,GAAG,EAAAC,IAAA,KAAmB;IAAA,IAAjB,CAACC,GAAG,EAAET,KAAK,CAAC,GAAAQ,IAAA;IACrFD,GAAG,CAACP,KAAK,CAAC,GAAGS,GAAG;IAChB,OAAOF,GAAG;EACZ,CAAC,EAAE,CAAC,CAAC,CAA2B;EAChC,OAAOJ,kBAAkB,CAACV,QAAQ,CAACzB,WAAW,EAAE,CAAC,IAAI,EAAE;AACzD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS0C,wBAAwBA,CAACC,GAAmB,EAAE;EAC5D,IAAI,CAACA,GAAG,EAAE,OAAO,EAAE;EACnB,OAAOnD,kBAAkB,CAACmD,GAAG,CAAC3C,WAAW,EAAE,CAAC,IAAI,EAAE;AACpD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS4C,gBAAgBA,CAACC,QAAgB,EAAE;EACjD,MAAMC,iBAAiB,GAAGD,QAAQ,CAAC1C,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;EAEhD,MAAM4C,GAAG,GAAGD,iBAAiB,CAACxB,WAAW,CAAC,GAAG,CAAC;EAC9C,IAAIyB,GAAG,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE;EAEzB,MAAMC,MAAM,GAAGF,iBAAiB,CAACG,KAAK,CAACF,GAAG,GAAGD,iBAAiB,CAACvB,MAAM,CAAC,CAACvB,WAAW,EAAE;EACpF,IAAIgD,MAAM,KAAK,GAAG,EAAE,OAAO,EAAE,CAAC,KACzB,OAAOA,MAAM;AACpB;AAEO,SAASE,uBAAuBA,CAACC,GAAW,EAAE;EACnD,OAAOC,KAAK,CAACD,GAAG,CAAC,CAACE,IAAI,CAAEC,QAAQ,IAAKA,QAAQ,CAACC,OAAO,CAACC,GAAG,CAAC,cAAc,CAAC,CAAC;AAC5E;AAEO,SAASC,OAAOA,CAACZ,QAAgB,EAAEpB,QAAiB,EAAE;EAC3D,MAAMvB,IAAI,GAAGL,WAAW,CAAC4B,QAAQ,IAAImB,gBAAgB,CAACC,QAAQ,CAAC,CAAC;EAChE,OAAO3C,IAAI,KAAK,OAAO;AACzB;AAEO,SAASwD,mBAAmBA,CAACC,IAAY,EAA6B;EAAA,IAA3BC,kBAAkB,GAAAC,SAAA,CAAAtC,MAAA,QAAAsC,SAAA,QAAAC,SAAA,GAAAD,SAAA,MAAG,IAAI;EACzE,MAAM3C,SAAS,GAAGgB,wBAAwB,CAACyB,IAAI,CAAC;EAChD,OAAOI,OAAO,CAAC7C,SAAS,CAACd,KAAK,CAAC,eAAe,CAAC,IAAIwD,kBAAkB,CAAC;AACxE"}
1
+ {"version":3,"names":["EXTENSION_MIME_MAP","imageExtRegex","exports","audioExtRegex","videoExtRegex","getFileType","extensionOrType","lowerCased","toLowerCase","indexOf","type","split","match","startsWith","getDownscaleSize","origin","resizing","ratio","maxWidth","width","maxHeight","height","Math","min","normalizeFileName","fileName","extension","_extension","_filename","hasExtension","lastIndexOf","length","parseMimeType","mimeType","fullType","parts","subtype","parameters","part","name","value","trim","getFileExtensionFromMime","MIME_EXTENSION_MAP","Object","entries","reduce","acc","_ref","key","getMimeFromFileExtension","ext","sliceIdx","extWithoutDot","slice","getFileExtension","filePath","pathWithoutParams","idx","result","getFileExtensionFromUri","uri","fetch","then","response","headers","get","isImage","shouldCompressImage","mime","compressionEnabled","arguments","undefined","Boolean"],"sources":["file.ts"],"sourcesContent":["const EXTENSION_MIME_MAP = {\n // Image\n 'jpeg': 'image/jpeg',\n 'jpg': 'image/jpeg',\n 'png': 'image/png',\n 'gif': 'image/gif',\n 'webp': 'image/webp',\n 'svg': 'image/svg+xml',\n\n // Video\n '3gp': 'video/3gpp',\n 'mp4': 'video/mp4',\n 'mpeg': 'video/mpeg',\n 'ogv': 'video/ogg',\n 'video/quicktime': 'mov',\n 'webm': 'video/webm',\n 'avi': 'video/x-msvideo',\n\n // Audio\n 'aac': 'audio/aac',\n 'mid': 'audio/midi',\n 'mp3': 'audio/mpeg',\n 'ogg': 'audio/ogg',\n 'wav': 'audio/wav',\n 'weba': 'audio/webm',\n\n // Files\n 'txt': 'text/plain',\n 'pdf': 'application/pdf',\n 'doc': 'application/msword',\n 'docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'xls': 'application/vnd.ms-excel',\n 'xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'ppt': 'application/vnd.ms-powerpoint',\n 'pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'zip': 'application/zip',\n 'json': 'application/json',\n 'gzip': 'application/x-gzip',\n} as Record<string, string>;\n\nexport const imageExtRegex = /jpeg|jpg|png|webp|gif/i;\nexport const audioExtRegex = /3gp|aac|aax|act|aiff|flac|gsm|m4a|m4b|m4p|tta|wma|mp3|webm|wav|ogg/i;\nexport const videoExtRegex = /mov|vod|mp4|avi|mpeg|ogv/i;\nexport const getFileType = (extensionOrType: string) => {\n const lowerCased = extensionOrType.toLowerCase();\n\n // mime type\n if (lowerCased.indexOf('/') > -1) {\n const type = lowerCased.split('/')[0];\n if (type === 'video') return 'video';\n if (type === 'audio') return 'audio';\n if (type === 'image') return 'image';\n return 'file';\n }\n\n // extensions\n if (lowerCased.match(imageExtRegex)) return 'image';\n if (lowerCased.match(audioExtRegex)) return 'audio';\n if (lowerCased.match(videoExtRegex)) return 'video';\n\n // others\n if (lowerCased.startsWith('image')) return 'image';\n if (lowerCased.startsWith('audio')) return 'audio';\n if (lowerCased.startsWith('video')) return 'video';\n\n return 'file';\n};\n\n/**\n * Calculates the downscaled size of an image while preserving its aspect ratio.\n *\n * @param {Object} origin - The original size object with `width` and `height` properties.\n * @param {Object} resizing - The resizing object with optional `width` and `height` properties.\n * @returns {Object} - A new size object with the downscaled `width` and `height` properties.\n * @example\n * ```ts\n * getDownscaleSize({ width: 1200, height: 800 }, { width: 600 }); // returns { width: 600, height: 400 }\n * ```\n */\ntype Size = { width: number; height: number };\nexport function getDownscaleSize(origin: Size, resizing: Partial<Size>) {\n let ratio: number;\n\n const maxWidth = resizing.width || origin.width,\n maxHeight = resizing.height || origin.height;\n\n if (origin.width <= maxWidth && origin.height <= maxHeight) {\n ratio = 1;\n } else if (origin.width > maxWidth && origin.height <= maxHeight) {\n ratio = maxWidth / origin.width;\n } else if (origin.width <= maxWidth && origin.height > maxHeight) {\n ratio = maxHeight / origin.height;\n } else {\n ratio = Math.min(maxWidth / origin.width, maxHeight / origin.height);\n }\n\n return { width: origin.width * ratio, height: origin.height * ratio };\n}\n\n/**\n * Normalize a file name by ensuring it has the given extension, if it doesn't already.\n *\n * @param {string} fileName - The file name to normalize.\n * @param {string} extension - The desired extension, without a leading period.\n * @returns {string} - The normalized file name, with the extension.\n */\nexport function normalizeFileName(fileName: string, extension: string) {\n if (!extension) return fileName;\n\n // .extension\n let _extension = extension.toLowerCase();\n if (_extension.indexOf('.') !== 0) {\n _extension = '.' + _extension;\n }\n\n // filename.extension | filename\n const _filename = fileName.toLowerCase();\n const hasExtension = _filename.lastIndexOf(_extension) === _filename.length - _extension.length;\n if (!hasExtension) {\n // filename.extension\n return fileName + _extension;\n } else {\n // filename.extension\n return fileName;\n }\n}\n\n/**\n * Parses a MIME type string into its components.\n *\n * @param mimeType - The MIME type string to parse.\n * @returns An object containing the type, subtype, and parameters of the MIME type.\n */\ntype MimeType = { type: string; subtype: string; parameters: Record<string, string> };\nexport function parseMimeType(mimeType: string): MimeType {\n const [fullType, ...parts] = mimeType.split(';');\n const [type, subtype] = fullType.split('/');\n const parameters: MimeType['parameters'] = {};\n\n for (const part of parts) {\n const [name, value] = part.trim().split('=');\n parameters[name] = value;\n }\n\n return { type, subtype, parameters };\n}\n\n/**\n * Returns the file extension based on the MIME type.\n *\n * @param {string | null | undefined} mimeType - The MIME type to look up.\n * @returns {string} - The file extension for the given MIME type, or an empty string if no matching file extension was found.\n */\nexport function getFileExtensionFromMime(mimeType?: string | null): string {\n if (!mimeType) return '';\n const MIME_EXTENSION_MAP = Object.entries(EXTENSION_MIME_MAP).reduce((acc, [key, value]) => {\n acc[value] = key;\n return acc;\n }, {} as Record<string, string>);\n\n const extension = MIME_EXTENSION_MAP[mimeType.toLowerCase()];\n if (extension) return '.' + extension;\n return '';\n}\n\n/**\n * Returns the MIME type based on the file extension.\n *\n * @param {string | null | undefined} ext - The file extension to look up.\n * @returns {string} - The MIME type for the given file extension, or an empty string if no matching MIME type was found.\n */\nexport function getMimeFromFileExtension(ext?: string | null) {\n if (!ext) return '';\n\n const sliceIdx = ext.lastIndexOf('.');\n const extWithoutDot = sliceIdx === -1 ? ext : ext.slice(sliceIdx + 1);\n\n return EXTENSION_MIME_MAP[extWithoutDot.toLowerCase()] || '';\n}\n\n/**\n * Returns the file extension of a file path.\n *\n * @param {string} filePath - The file path to extract the extension from.\n * @returns {string} - The file extension, or an empty string if the file path does not have an extension.\n */\nexport function getFileExtension(filePath: string) {\n const pathWithoutParams = filePath.split('?')[0];\n\n const idx = pathWithoutParams.lastIndexOf('.');\n if (idx === -1) return '';\n\n const result = pathWithoutParams.slice(idx - pathWithoutParams.length).toLowerCase();\n if (result === '.') return '';\n else return result;\n}\n\nexport async function getFileExtensionFromUri(uri: string) {\n const type = await fetch(uri).then((response) => response.headers.get('content-type'));\n return getFileExtensionFromMime(type);\n}\n\nexport function isImage(filePath: string, mimeType?: string) {\n const type = getFileType(mimeType || getFileExtension(filePath));\n return type === 'image';\n}\n\nexport function shouldCompressImage(mime: string, compressionEnabled = true) {\n const extension = getFileExtensionFromMime(mime);\n return Boolean(extension.match(/jpg|jpeg|png/i) && compressionEnabled);\n}\n"],"mappings":"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"}
@@ -35,8 +35,8 @@ const EXTENSION_MIME_MAP = {
35
35
  'gzip': 'application/x-gzip'
36
36
  };
37
37
  export const imageExtRegex = /jpeg|jpg|png|webp|gif/i;
38
- export const audioExtRegex = /3gp|aac|aax|act|aiff|flac|gsm|m4a|m4b|m4p|tta|wma|mp3|webm|wav/i;
39
- export const videoExtRegex = /mov|vod|mp4|avi/i;
38
+ export const audioExtRegex = /3gp|aac|aax|act|aiff|flac|gsm|m4a|m4b|m4p|tta|wma|mp3|webm|wav|ogg/i;
39
+ export const videoExtRegex = /mov|vod|mp4|avi|mpeg|ogv/i;
40
40
  export const getFileType = extensionOrType => {
41
41
  const lowerCased = extensionOrType.toLowerCase();
42
42
 
@@ -155,7 +155,9 @@ export function getFileExtensionFromMime(mimeType) {
155
155
  acc[value] = key;
156
156
  return acc;
157
157
  }, {});
158
- return MIME_EXTENSION_MAP[mimeType.toLowerCase()] || '';
158
+ const extension = MIME_EXTENSION_MAP[mimeType.toLowerCase()];
159
+ if (extension) return '.' + extension;
160
+ return '';
159
161
  }
160
162
 
161
163
  /**
@@ -166,7 +168,9 @@ export function getFileExtensionFromMime(mimeType) {
166
168
  */
167
169
  export function getMimeFromFileExtension(ext) {
168
170
  if (!ext) return '';
169
- return EXTENSION_MIME_MAP[ext.toLowerCase()] || '';
171
+ const sliceIdx = ext.lastIndexOf('.');
172
+ const extWithoutDot = sliceIdx === -1 ? ext : ext.slice(sliceIdx + 1);
173
+ return EXTENSION_MIME_MAP[extWithoutDot.toLowerCase()] || '';
170
174
  }
171
175
 
172
176
  /**
@@ -182,8 +186,9 @@ export function getFileExtension(filePath) {
182
186
  const result = pathWithoutParams.slice(idx - pathWithoutParams.length).toLowerCase();
183
187
  if (result === '.') return '';else return result;
184
188
  }
185
- export function getFileExtensionFromUri(uri) {
186
- return fetch(uri).then(response => response.headers.get('content-type'));
189
+ export async function getFileExtensionFromUri(uri) {
190
+ const type = await fetch(uri).then(response => response.headers.get('content-type'));
191
+ return getFileExtensionFromMime(type);
187
192
  }
188
193
  export function isImage(filePath, mimeType) {
189
194
  const type = getFileType(mimeType || getFileExtension(filePath));
@@ -1 +1 @@
1
- {"version":3,"names":["EXTENSION_MIME_MAP","imageExtRegex","audioExtRegex","videoExtRegex","getFileType","extensionOrType","lowerCased","toLowerCase","indexOf","type","split","match","startsWith","getDownscaleSize","origin","resizing","ratio","maxWidth","width","maxHeight","height","Math","min","normalizeFileName","fileName","extension","_extension","_filename","hasExtension","lastIndexOf","length","parseMimeType","mimeType","fullType","parts","subtype","parameters","part","name","value","trim","getFileExtensionFromMime","MIME_EXTENSION_MAP","Object","entries","reduce","acc","_ref","key","getMimeFromFileExtension","ext","getFileExtension","filePath","pathWithoutParams","idx","result","slice","getFileExtensionFromUri","uri","fetch","then","response","headers","get","isImage","shouldCompressImage","mime","compressionEnabled","arguments","undefined","Boolean"],"sources":["file.ts"],"sourcesContent":["const EXTENSION_MIME_MAP = {\n // Image\n 'jpeg': 'image/jpeg',\n 'jpg': 'image/jpeg',\n 'png': 'image/png',\n 'gif': 'image/gif',\n 'webp': 'image/webp',\n 'svg': 'image/svg+xml',\n\n // Video\n '3gp': 'video/3gpp',\n 'mp4': 'video/mp4',\n 'mpeg': 'video/mpeg',\n 'ogv': 'video/ogg',\n 'video/quicktime': 'mov',\n 'webm': 'video/webm',\n 'avi': 'video/x-msvideo',\n\n // Audio\n 'aac': 'audio/aac',\n 'mid': 'audio/midi',\n 'mp3': 'audio/mpeg',\n 'ogg': 'audio/ogg',\n 'wav': 'audio/wav',\n 'weba': 'audio/webm',\n\n // Files\n 'txt': 'text/plain',\n 'pdf': 'application/pdf',\n 'doc': 'application/msword',\n 'docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'xls': 'application/vnd.ms-excel',\n 'xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'ppt': 'application/vnd.ms-powerpoint',\n 'pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'zip': 'application/zip',\n 'json': 'application/json',\n 'gzip': 'application/x-gzip',\n} as Record<string, string>;\n\nexport const imageExtRegex = /jpeg|jpg|png|webp|gif/i;\nexport const audioExtRegex = /3gp|aac|aax|act|aiff|flac|gsm|m4a|m4b|m4p|tta|wma|mp3|webm|wav/i;\nexport const videoExtRegex = /mov|vod|mp4|avi/i;\nexport const getFileType = (extensionOrType: string) => {\n const lowerCased = extensionOrType.toLowerCase();\n\n // mime type\n if (lowerCased.indexOf('/') > -1) {\n const type = lowerCased.split('/')[0];\n if (type === 'video') return 'video';\n if (type === 'audio') return 'audio';\n if (type === 'image') return 'image';\n return 'file';\n }\n\n // extensions\n if (lowerCased.match(imageExtRegex)) return 'image';\n if (lowerCased.match(audioExtRegex)) return 'audio';\n if (lowerCased.match(videoExtRegex)) return 'video';\n\n // others\n if (lowerCased.startsWith('image')) return 'image';\n if (lowerCased.startsWith('audio')) return 'audio';\n if (lowerCased.startsWith('video')) return 'video';\n\n return 'file';\n};\n\n/**\n * Calculates the downscaled size of an image while preserving its aspect ratio.\n *\n * @param {Object} origin - The original size object with `width` and `height` properties.\n * @param {Object} resizing - The resizing object with optional `width` and `height` properties.\n * @returns {Object} - A new size object with the downscaled `width` and `height` properties.\n * @example\n * ```ts\n * getDownscaleSize({ width: 1200, height: 800 }, { width: 600 }); // returns { width: 600, height: 400 }\n * ```\n */\ntype Size = { width: number; height: number };\nexport function getDownscaleSize(origin: Size, resizing: Partial<Size>) {\n let ratio: number;\n\n const maxWidth = resizing.width || origin.width,\n maxHeight = resizing.height || origin.height;\n\n if (origin.width <= maxWidth && origin.height <= maxHeight) {\n ratio = 1;\n } else if (origin.width > maxWidth && origin.height <= maxHeight) {\n ratio = maxWidth / origin.width;\n } else if (origin.width <= maxWidth && origin.height > maxHeight) {\n ratio = maxHeight / origin.height;\n } else {\n ratio = Math.min(maxWidth / origin.width, maxHeight / origin.height);\n }\n\n return { width: origin.width * ratio, height: origin.height * ratio };\n}\n\n/**\n * Normalize a file name by ensuring it has the given extension, if it doesn't already.\n *\n * @param {string} fileName - The file name to normalize.\n * @param {string} extension - The desired extension, without a leading period.\n * @returns {string} - The normalized file name, with the extension.\n */\nexport function normalizeFileName(fileName: string, extension: string) {\n if (!extension) return fileName;\n\n // .extension\n let _extension = extension.toLowerCase();\n if (_extension.indexOf('.') !== 0) {\n _extension = '.' + _extension;\n }\n\n // filename.extension | filename\n const _filename = fileName.toLowerCase();\n const hasExtension = _filename.lastIndexOf(_extension) === _filename.length - _extension.length;\n if (!hasExtension) {\n // filename.extension\n return fileName + _extension;\n } else {\n // filename.extension\n return fileName;\n }\n}\n\n/**\n * Parses a MIME type string into its components.\n *\n * @param mimeType - The MIME type string to parse.\n * @returns An object containing the type, subtype, and parameters of the MIME type.\n */\ntype MimeType = { type: string; subtype: string; parameters: Record<string, string> };\nexport function parseMimeType(mimeType: string): MimeType {\n const [fullType, ...parts] = mimeType.split(';');\n const [type, subtype] = fullType.split('/');\n const parameters: MimeType['parameters'] = {};\n\n for (const part of parts) {\n const [name, value] = part.trim().split('=');\n parameters[name] = value;\n }\n\n return { type, subtype, parameters };\n}\n\n/**\n * Returns the file extension based on the MIME type.\n *\n * @param {string | null | undefined} mimeType - The MIME type to look up.\n * @returns {string} - The file extension for the given MIME type, or an empty string if no matching file extension was found.\n */\nexport function getFileExtensionFromMime(mimeType?: string | null): string {\n if (!mimeType) return '';\n const MIME_EXTENSION_MAP = Object.entries(EXTENSION_MIME_MAP).reduce((acc, [key, value]) => {\n acc[value] = key;\n return acc;\n }, {} as Record<string, string>);\n return MIME_EXTENSION_MAP[mimeType.toLowerCase()] || '';\n}\n\n/**\n * Returns the MIME type based on the file extension.\n *\n * @param {string | null | undefined} ext - The file extension to look up.\n * @returns {string} - The MIME type for the given file extension, or an empty string if no matching MIME type was found.\n */\nexport function getMimeFromFileExtension(ext?: string | null) {\n if (!ext) return '';\n return EXTENSION_MIME_MAP[ext.toLowerCase()] || '';\n}\n\n/**\n * Returns the file extension of a file path.\n *\n * @param {string} filePath - The file path to extract the extension from.\n * @returns {string} - The file extension, or an empty string if the file path does not have an extension.\n */\nexport function getFileExtension(filePath: string) {\n const pathWithoutParams = filePath.split('?')[0];\n\n const idx = pathWithoutParams.lastIndexOf('.');\n if (idx === -1) return '';\n\n const result = pathWithoutParams.slice(idx - pathWithoutParams.length).toLowerCase();\n if (result === '.') return '';\n else return result;\n}\n\nexport function getFileExtensionFromUri(uri: string) {\n return fetch(uri).then((response) => response.headers.get('content-type'));\n}\n\nexport function isImage(filePath: string, mimeType?: string) {\n const type = getFileType(mimeType || getFileExtension(filePath));\n return type === 'image';\n}\n\nexport function shouldCompressImage(mime: string, compressionEnabled = true) {\n const extension = getFileExtensionFromMime(mime);\n return Boolean(extension.match(/jpg|jpeg|png/i) && compressionEnabled);\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["EXTENSION_MIME_MAP","imageExtRegex","audioExtRegex","videoExtRegex","getFileType","extensionOrType","lowerCased","toLowerCase","indexOf","type","split","match","startsWith","getDownscaleSize","origin","resizing","ratio","maxWidth","width","maxHeight","height","Math","min","normalizeFileName","fileName","extension","_extension","_filename","hasExtension","lastIndexOf","length","parseMimeType","mimeType","fullType","parts","subtype","parameters","part","name","value","trim","getFileExtensionFromMime","MIME_EXTENSION_MAP","Object","entries","reduce","acc","_ref","key","getMimeFromFileExtension","ext","sliceIdx","extWithoutDot","slice","getFileExtension","filePath","pathWithoutParams","idx","result","getFileExtensionFromUri","uri","fetch","then","response","headers","get","isImage","shouldCompressImage","mime","compressionEnabled","arguments","undefined","Boolean"],"sources":["file.ts"],"sourcesContent":["const EXTENSION_MIME_MAP = {\n // Image\n 'jpeg': 'image/jpeg',\n 'jpg': 'image/jpeg',\n 'png': 'image/png',\n 'gif': 'image/gif',\n 'webp': 'image/webp',\n 'svg': 'image/svg+xml',\n\n // Video\n '3gp': 'video/3gpp',\n 'mp4': 'video/mp4',\n 'mpeg': 'video/mpeg',\n 'ogv': 'video/ogg',\n 'video/quicktime': 'mov',\n 'webm': 'video/webm',\n 'avi': 'video/x-msvideo',\n\n // Audio\n 'aac': 'audio/aac',\n 'mid': 'audio/midi',\n 'mp3': 'audio/mpeg',\n 'ogg': 'audio/ogg',\n 'wav': 'audio/wav',\n 'weba': 'audio/webm',\n\n // Files\n 'txt': 'text/plain',\n 'pdf': 'application/pdf',\n 'doc': 'application/msword',\n 'docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'xls': 'application/vnd.ms-excel',\n 'xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'ppt': 'application/vnd.ms-powerpoint',\n 'pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'zip': 'application/zip',\n 'json': 'application/json',\n 'gzip': 'application/x-gzip',\n} as Record<string, string>;\n\nexport const imageExtRegex = /jpeg|jpg|png|webp|gif/i;\nexport const audioExtRegex = /3gp|aac|aax|act|aiff|flac|gsm|m4a|m4b|m4p|tta|wma|mp3|webm|wav|ogg/i;\nexport const videoExtRegex = /mov|vod|mp4|avi|mpeg|ogv/i;\nexport const getFileType = (extensionOrType: string) => {\n const lowerCased = extensionOrType.toLowerCase();\n\n // mime type\n if (lowerCased.indexOf('/') > -1) {\n const type = lowerCased.split('/')[0];\n if (type === 'video') return 'video';\n if (type === 'audio') return 'audio';\n if (type === 'image') return 'image';\n return 'file';\n }\n\n // extensions\n if (lowerCased.match(imageExtRegex)) return 'image';\n if (lowerCased.match(audioExtRegex)) return 'audio';\n if (lowerCased.match(videoExtRegex)) return 'video';\n\n // others\n if (lowerCased.startsWith('image')) return 'image';\n if (lowerCased.startsWith('audio')) return 'audio';\n if (lowerCased.startsWith('video')) return 'video';\n\n return 'file';\n};\n\n/**\n * Calculates the downscaled size of an image while preserving its aspect ratio.\n *\n * @param {Object} origin - The original size object with `width` and `height` properties.\n * @param {Object} resizing - The resizing object with optional `width` and `height` properties.\n * @returns {Object} - A new size object with the downscaled `width` and `height` properties.\n * @example\n * ```ts\n * getDownscaleSize({ width: 1200, height: 800 }, { width: 600 }); // returns { width: 600, height: 400 }\n * ```\n */\ntype Size = { width: number; height: number };\nexport function getDownscaleSize(origin: Size, resizing: Partial<Size>) {\n let ratio: number;\n\n const maxWidth = resizing.width || origin.width,\n maxHeight = resizing.height || origin.height;\n\n if (origin.width <= maxWidth && origin.height <= maxHeight) {\n ratio = 1;\n } else if (origin.width > maxWidth && origin.height <= maxHeight) {\n ratio = maxWidth / origin.width;\n } else if (origin.width <= maxWidth && origin.height > maxHeight) {\n ratio = maxHeight / origin.height;\n } else {\n ratio = Math.min(maxWidth / origin.width, maxHeight / origin.height);\n }\n\n return { width: origin.width * ratio, height: origin.height * ratio };\n}\n\n/**\n * Normalize a file name by ensuring it has the given extension, if it doesn't already.\n *\n * @param {string} fileName - The file name to normalize.\n * @param {string} extension - The desired extension, without a leading period.\n * @returns {string} - The normalized file name, with the extension.\n */\nexport function normalizeFileName(fileName: string, extension: string) {\n if (!extension) return fileName;\n\n // .extension\n let _extension = extension.toLowerCase();\n if (_extension.indexOf('.') !== 0) {\n _extension = '.' + _extension;\n }\n\n // filename.extension | filename\n const _filename = fileName.toLowerCase();\n const hasExtension = _filename.lastIndexOf(_extension) === _filename.length - _extension.length;\n if (!hasExtension) {\n // filename.extension\n return fileName + _extension;\n } else {\n // filename.extension\n return fileName;\n }\n}\n\n/**\n * Parses a MIME type string into its components.\n *\n * @param mimeType - The MIME type string to parse.\n * @returns An object containing the type, subtype, and parameters of the MIME type.\n */\ntype MimeType = { type: string; subtype: string; parameters: Record<string, string> };\nexport function parseMimeType(mimeType: string): MimeType {\n const [fullType, ...parts] = mimeType.split(';');\n const [type, subtype] = fullType.split('/');\n const parameters: MimeType['parameters'] = {};\n\n for (const part of parts) {\n const [name, value] = part.trim().split('=');\n parameters[name] = value;\n }\n\n return { type, subtype, parameters };\n}\n\n/**\n * Returns the file extension based on the MIME type.\n *\n * @param {string | null | undefined} mimeType - The MIME type to look up.\n * @returns {string} - The file extension for the given MIME type, or an empty string if no matching file extension was found.\n */\nexport function getFileExtensionFromMime(mimeType?: string | null): string {\n if (!mimeType) return '';\n const MIME_EXTENSION_MAP = Object.entries(EXTENSION_MIME_MAP).reduce((acc, [key, value]) => {\n acc[value] = key;\n return acc;\n }, {} as Record<string, string>);\n\n const extension = MIME_EXTENSION_MAP[mimeType.toLowerCase()];\n if (extension) return '.' + extension;\n return '';\n}\n\n/**\n * Returns the MIME type based on the file extension.\n *\n * @param {string | null | undefined} ext - The file extension to look up.\n * @returns {string} - The MIME type for the given file extension, or an empty string if no matching MIME type was found.\n */\nexport function getMimeFromFileExtension(ext?: string | null) {\n if (!ext) return '';\n\n const sliceIdx = ext.lastIndexOf('.');\n const extWithoutDot = sliceIdx === -1 ? ext : ext.slice(sliceIdx + 1);\n\n return EXTENSION_MIME_MAP[extWithoutDot.toLowerCase()] || '';\n}\n\n/**\n * Returns the file extension of a file path.\n *\n * @param {string} filePath - The file path to extract the extension from.\n * @returns {string} - The file extension, or an empty string if the file path does not have an extension.\n */\nexport function getFileExtension(filePath: string) {\n const pathWithoutParams = filePath.split('?')[0];\n\n const idx = pathWithoutParams.lastIndexOf('.');\n if (idx === -1) return '';\n\n const result = pathWithoutParams.slice(idx - pathWithoutParams.length).toLowerCase();\n if (result === '.') return '';\n else return result;\n}\n\nexport async function getFileExtensionFromUri(uri: string) {\n const type = await fetch(uri).then((response) => response.headers.get('content-type'));\n return getFileExtensionFromMime(type);\n}\n\nexport function isImage(filePath: string, mimeType?: string) {\n const type = getFileType(mimeType || getFileExtension(filePath));\n return type === 'image';\n}\n\nexport function shouldCompressImage(mime: string, compressionEnabled = true) {\n const extension = getFileExtensionFromMime(mime);\n return Boolean(extension.match(/jpg|jpeg|png/i) && compressionEnabled);\n}\n"],"mappings":"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"}
@@ -62,7 +62,7 @@ export declare function getMimeFromFileExtension(ext?: string | null): string;
62
62
  * @returns {string} - The file extension, or an empty string if the file path does not have an extension.
63
63
  */
64
64
  export declare function getFileExtension(filePath: string): string;
65
- export declare function getFileExtensionFromUri(uri: string): Promise<string | null>;
65
+ export declare function getFileExtensionFromUri(uri: string): Promise<string>;
66
66
  export declare function isImage(filePath: string, mimeType?: string): boolean;
67
67
  export declare function shouldCompressImage(mime: string, compressionEnabled?: boolean): boolean;
68
68
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sendbird/uikit-utils",
3
- "version": "3.0.3",
3
+ "version": "3.0.4-rc.0",
4
4
  "description": "A collection of utility functions and constants for building chat UI components with Sendbird UIKit.",
5
5
  "keywords": [
6
6
  "sendbird",
@@ -85,6 +85,5 @@
85
85
  "entryPoint": "./src/index.ts",
86
86
  "readmeFile": "./README.md",
87
87
  "displayName": "@sendbird/uikit-utils"
88
- },
89
- "gitHead": "f674e3c8280d268f4a74eb6c9cd76ea80bd57ddc"
88
+ }
90
89
  }
@@ -39,8 +39,8 @@ const EXTENSION_MIME_MAP = {
39
39
  } as Record<string, string>;
40
40
 
41
41
  export const imageExtRegex = /jpeg|jpg|png|webp|gif/i;
42
- export const audioExtRegex = /3gp|aac|aax|act|aiff|flac|gsm|m4a|m4b|m4p|tta|wma|mp3|webm|wav/i;
43
- export const videoExtRegex = /mov|vod|mp4|avi/i;
42
+ export const audioExtRegex = /3gp|aac|aax|act|aiff|flac|gsm|m4a|m4b|m4p|tta|wma|mp3|webm|wav|ogg/i;
43
+ export const videoExtRegex = /mov|vod|mp4|avi|mpeg|ogv/i;
44
44
  export const getFileType = (extensionOrType: string) => {
45
45
  const lowerCased = extensionOrType.toLowerCase();
46
46
 
@@ -157,7 +157,10 @@ export function getFileExtensionFromMime(mimeType?: string | null): string {
157
157
  acc[value] = key;
158
158
  return acc;
159
159
  }, {} as Record<string, string>);
160
- return MIME_EXTENSION_MAP[mimeType.toLowerCase()] || '';
160
+
161
+ const extension = MIME_EXTENSION_MAP[mimeType.toLowerCase()];
162
+ if (extension) return '.' + extension;
163
+ return '';
161
164
  }
162
165
 
163
166
  /**
@@ -168,7 +171,11 @@ export function getFileExtensionFromMime(mimeType?: string | null): string {
168
171
  */
169
172
  export function getMimeFromFileExtension(ext?: string | null) {
170
173
  if (!ext) return '';
171
- return EXTENSION_MIME_MAP[ext.toLowerCase()] || '';
174
+
175
+ const sliceIdx = ext.lastIndexOf('.');
176
+ const extWithoutDot = sliceIdx === -1 ? ext : ext.slice(sliceIdx + 1);
177
+
178
+ return EXTENSION_MIME_MAP[extWithoutDot.toLowerCase()] || '';
172
179
  }
173
180
 
174
181
  /**
@@ -188,8 +195,9 @@ export function getFileExtension(filePath: string) {
188
195
  else return result;
189
196
  }
190
197
 
191
- export function getFileExtensionFromUri(uri: string) {
192
- return fetch(uri).then((response) => response.headers.get('content-type'));
198
+ export async function getFileExtensionFromUri(uri: string) {
199
+ const type = await fetch(uri).then((response) => response.headers.get('content-type'));
200
+ return getFileExtensionFromMime(type);
193
201
  }
194
202
 
195
203
  export function isImage(filePath: string, mimeType?: string) {