@sendbird/uikit-utils 3.0.0-rc.1 → 3.0.1

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.
@@ -58,17 +58,27 @@ const audioExtRegex = /3gp|aac|aax|act|aiff|flac|gsm|m4a|m4b|m4p|tta|wma|mp3|web
58
58
  exports.audioExtRegex = audioExtRegex;
59
59
  const videoExtRegex = /mov|vod|mp4|avi/i;
60
60
  exports.videoExtRegex = videoExtRegex;
61
- const getFileType = extOrType => {
62
- if (extOrType.indexOf('/') > -1) {
63
- const type = extOrType.split('/')[0];
61
+ const getFileType = extensionOrType => {
62
+ const lowerCased = extensionOrType.toLowerCase();
63
+
64
+ // mime type
65
+ if (lowerCased.indexOf('/') > -1) {
66
+ const type = lowerCased.split('/')[0];
64
67
  if (type === 'video') return 'video';
65
68
  if (type === 'audio') return 'audio';
66
69
  if (type === 'image') return 'image';
67
70
  return 'file';
68
71
  }
69
- if (extOrType.match(imageExtRegex)) return 'image';
70
- if (extOrType.match(audioExtRegex)) return 'audio';
71
- if (extOrType.match(videoExtRegex)) return 'video';
72
+
73
+ // extensions
74
+ if (lowerCased.match(imageExtRegex)) return 'image';
75
+ if (lowerCased.match(audioExtRegex)) return 'audio';
76
+ if (lowerCased.match(videoExtRegex)) return 'video';
77
+
78
+ // others
79
+ if (lowerCased.startsWith('image')) return 'image';
80
+ if (lowerCased.startsWith('audio')) return 'audio';
81
+ if (lowerCased.startsWith('video')) return 'video';
72
82
  return 'file';
73
83
  };
74
84
 
@@ -1 +1 @@
1
- {"version":3,"names":["EXTENSION_MIME_MAP","imageExtRegex","exports","audioExtRegex","videoExtRegex","getFileType","extOrType","indexOf","type","split","match","getDownscaleSize","origin","resizing","ratio","maxWidth","width","maxHeight","height","Math","min","normalizeFileName","fileName","extension","_extension","toLowerCase","_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 = (extOrType: string) => {\n if (extOrType.indexOf('/') > -1) {\n const type = extOrType.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 if (extOrType.match(imageExtRegex)) return 'image';\n if (extOrType.match(audioExtRegex)) return 'audio';\n if (extOrType.match(videoExtRegex)) return 'video';\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","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":"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"}
@@ -37,17 +37,27 @@ const EXTENSION_MIME_MAP = {
37
37
  export const imageExtRegex = /jpeg|jpg|png|webp|gif/i;
38
38
  export const audioExtRegex = /3gp|aac|aax|act|aiff|flac|gsm|m4a|m4b|m4p|tta|wma|mp3|webm|wav/i;
39
39
  export const videoExtRegex = /mov|vod|mp4|avi/i;
40
- export const getFileType = extOrType => {
41
- if (extOrType.indexOf('/') > -1) {
42
- const type = extOrType.split('/')[0];
40
+ export const getFileType = extensionOrType => {
41
+ const lowerCased = extensionOrType.toLowerCase();
42
+
43
+ // mime type
44
+ if (lowerCased.indexOf('/') > -1) {
45
+ const type = lowerCased.split('/')[0];
43
46
  if (type === 'video') return 'video';
44
47
  if (type === 'audio') return 'audio';
45
48
  if (type === 'image') return 'image';
46
49
  return 'file';
47
50
  }
48
- if (extOrType.match(imageExtRegex)) return 'image';
49
- if (extOrType.match(audioExtRegex)) return 'audio';
50
- if (extOrType.match(videoExtRegex)) return 'video';
51
+
52
+ // extensions
53
+ if (lowerCased.match(imageExtRegex)) return 'image';
54
+ if (lowerCased.match(audioExtRegex)) return 'audio';
55
+ if (lowerCased.match(videoExtRegex)) return 'video';
56
+
57
+ // others
58
+ if (lowerCased.startsWith('image')) return 'image';
59
+ if (lowerCased.startsWith('audio')) return 'audio';
60
+ if (lowerCased.startsWith('video')) return 'video';
51
61
  return 'file';
52
62
  };
53
63
 
@@ -1 +1 @@
1
- {"version":3,"names":["EXTENSION_MIME_MAP","imageExtRegex","audioExtRegex","videoExtRegex","getFileType","extOrType","indexOf","type","split","match","getDownscaleSize","origin","resizing","ratio","maxWidth","width","maxHeight","height","Math","min","normalizeFileName","fileName","extension","_extension","toLowerCase","_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 = (extOrType: string) => {\n if (extOrType.indexOf('/') > -1) {\n const type = extOrType.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 if (extOrType.match(imageExtRegex)) return 'image';\n if (extOrType.match(audioExtRegex)) return 'audio';\n if (extOrType.match(videoExtRegex)) return 'video';\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","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,7 +1,7 @@
1
1
  export declare const imageExtRegex: RegExp;
2
2
  export declare const audioExtRegex: RegExp;
3
3
  export declare const videoExtRegex: RegExp;
4
- export declare const getFileType: (extOrType: string) => "video" | "audio" | "image" | "file";
4
+ export declare const getFileType: (extensionOrType: string) => "video" | "audio" | "image" | "file";
5
5
  /**
6
6
  * Calculates the downscaled size of an image while preserving its aspect ratio.
7
7
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sendbird/uikit-utils",
3
- "version": "3.0.0-rc.1",
3
+ "version": "3.0.1",
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,5 +85,6 @@
85
85
  "entryPoint": "./src/index.ts",
86
86
  "readmeFile": "./README.md",
87
87
  "displayName": "@sendbird/uikit-utils"
88
- }
88
+ },
89
+ "gitHead": "6dbea50a7b0fd5690ed34faec2c7456c73677912"
89
90
  }
@@ -41,18 +41,28 @@ const EXTENSION_MIME_MAP = {
41
41
  export const imageExtRegex = /jpeg|jpg|png|webp|gif/i;
42
42
  export const audioExtRegex = /3gp|aac|aax|act|aiff|flac|gsm|m4a|m4b|m4p|tta|wma|mp3|webm|wav/i;
43
43
  export const videoExtRegex = /mov|vod|mp4|avi/i;
44
- export const getFileType = (extOrType: string) => {
45
- if (extOrType.indexOf('/') > -1) {
46
- const type = extOrType.split('/')[0];
44
+ export const getFileType = (extensionOrType: string) => {
45
+ const lowerCased = extensionOrType.toLowerCase();
46
+
47
+ // mime type
48
+ if (lowerCased.indexOf('/') > -1) {
49
+ const type = lowerCased.split('/')[0];
47
50
  if (type === 'video') return 'video';
48
51
  if (type === 'audio') return 'audio';
49
52
  if (type === 'image') return 'image';
50
53
  return 'file';
51
54
  }
52
55
 
53
- if (extOrType.match(imageExtRegex)) return 'image';
54
- if (extOrType.match(audioExtRegex)) return 'audio';
55
- if (extOrType.match(videoExtRegex)) return 'video';
56
+ // extensions
57
+ if (lowerCased.match(imageExtRegex)) return 'image';
58
+ if (lowerCased.match(audioExtRegex)) return 'audio';
59
+ if (lowerCased.match(videoExtRegex)) return 'video';
60
+
61
+ // others
62
+ if (lowerCased.startsWith('image')) return 'image';
63
+ if (lowerCased.startsWith('audio')) return 'audio';
64
+ if (lowerCased.startsWith('video')) return 'video';
65
+
56
66
  return 'file';
57
67
  };
58
68