@hzab/utils 1.1.6 → 1.1.7

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/array.ts","../src/base64Str.ts","../src/blob.ts","../src/color.ts","../src/empty-val.ts","../src/globalConfig.ts","../src/idCardVerify.ts","../src/img-utils.ts","../src/locationUtils.ts","../src/nanoid.ts","../src/options.ts","../src/file/fileName.ts","../src/file/fileType.ts","../src/url.ts","../src/upload/uploadUtils.ts","../src/upload/OssUploadUtil.ts","../src/scan-qr.ts","../src/sizeAdapter.ts","../src/string.ts","../src/file/file.ts"],"names":["p","q","textR","textG","textB","res","dayjs","key"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * 获取数组格式数据\r\n * @param value\r\n * @returns\r\n */\r\nexport function getArr(value) {\r\n return Array.isArray(value) ? value : (value && [value]) || [];\r\n}\r\n","/**\r\n * 是否是 base64 字符串\r\n * @param {*} str\r\n * @returns\r\n */\r\nexport const isBase64Str = function (str) {\r\n if (typeof str !== \"string\") {\r\n return false;\r\n }\r\n return /^data:\\w+\\/\\w+;base64/i.test(str);\r\n};\r\n\r\n/**\r\n * 从 base64 字符串获取文件类型\r\n * @param base64Str\r\n * @returns\r\n */\r\nexport function getFileTypeFromBase64(base64Str) {\r\n if (!isBase64Str(base64Str)) {\r\n return base64Str;\r\n }\r\n // 移除Base64前缀(如果存在)\r\n const base64Data = base64Str.replace(/^data:.*;base64,/, \"\");\r\n\r\n // 键值对调换:Base64前缀作为键,文件类型信息作为值\r\n const prefixMap = {\r\n JVBERi0: { type: \"pdf\", mimeType: \"application/pdf\" },\r\n R0lGODdh: { type: \"gif\", mimeType: \"image/gif\" },\r\n R0lGODlh: { type: \"gif\", mimeType: \"image/gif\" },\r\n iVBORw0KGgo: { type: \"png\", mimeType: \"image/png\" },\r\n \"/9j/\": { type: \"jpeg\", mimeType: \"image/jpeg\" },\r\n SUQzB: { type: \"mp4\", mimeType: \"video/mp4\" },\r\n AAAAGGZ0eXBpc29tAA: { type: \"mpeg\", mimeType: \"audio/mpeg\" },\r\n UklGR: { type: \"webp\", mimeType: \"image/webp\" },\r\n PD94bWwgdmVyc2lvbj0: { type: \"xml\", mimeType: \"text/xml\" },\r\n PHN2ZyB4bWxucz0: { type: \"svg\", mimeType: \"image/svg+xml\" },\r\n dGV4dCB4bWxucz0: { type: \"txt\", mimeType: \"text/plain\" },\r\n };\r\n\r\n // 使用Object.keys遍历所有前缀,一次循环完成检测\r\n for (const prefix of Object.keys(prefixMap)) {\r\n if (base64Data.startsWith(prefix)) {\r\n return prefixMap[prefix];\r\n }\r\n }\r\n\r\n // 未匹配到已知类型\r\n return { type: \"unknown\", mimeType: \"application/octet-stream\" };\r\n}\r\n","/**\r\n * 通过 Blob 的文件签名判断文件类型\r\n * @param {Blob} blob - 待检测的 Blob 对象\r\n * @returns {Promise<string>} - 匹配的 MIME 类型或 'unknown'\r\n */\r\nexport async function getFileTypeFromBlob(blob: Blob): Promise<string> {\r\n // 预设文件签名表(键:十六进制前缀,值:MIME类型)\r\n const fileSignatures = {\r\n \"89504E47\": \"image/png\",\r\n FFD8FF: \"image/jpeg\",\r\n \"47494638\": \"image/gif\",\r\n \"25504446\": \"application/pdf\",\r\n \"504B0304\": \"application/zip\", // ZIP 或 DOCX/XLSX 等基于 ZIP 的格式\r\n \"3C3F786D6C\": \"text/xml\", // XML\r\n \"7B22\": \"application/json\", // JSON(开头可能为 { 或 {\")\r\n \"25215053\": \"application/postscript\", // PS\r\n \"494433\": \"audio/mpeg\", // MP3\r\n \"0000001866747970\": \"video/mp4\", // MP4(部分情况)\r\n };\r\n\r\n // 读取 Blob 的前 8 字节(足够覆盖大部分签名)\r\n const buffer = await blob.slice(0, 8).arrayBuffer();\r\n const uint8Array = new Uint8Array(buffer);\r\n\r\n // 转换为十六进制字符串(大写)\r\n let hex = \"\";\r\n for (let i = 0; i < uint8Array.length; i++) {\r\n const byte = uint8Array[i].toString(16).padStart(2, \"0\");\r\n hex += byte.toUpperCase();\r\n }\r\n\r\n // 对比签名表(优先匹配长前缀)\r\n const signatures = Object.keys(fileSignatures).sort((a, b) => b.length - a.length);\r\n for (const signature of signatures) {\r\n if (hex.startsWith(signature)) {\r\n return fileSignatures[signature];\r\n }\r\n }\r\n\r\n // 未匹配到已知类型\r\n return \"unknown\";\r\n}\r\n","/**\r\n * 计算颜色的亮度\r\n * @param r\r\n * @param g\r\n * @param b\r\n * @returns\r\n */\r\nexport function luminance(r, g, b) {\r\n const a = [r, g, b].map((v) => {\r\n v /= 255;\r\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\r\n });\r\n return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722;\r\n}\r\n\r\n/**\r\n * 计算两个颜色之间的对比度\r\n * @param l1\r\n * @param l2\r\n * @returns\r\n */\r\nexport function contrast(l1, l2) {\r\n const brightest = Math.max(l1, l2);\r\n const darkest = Math.min(l1, l2);\r\n return (brightest + 0.05) / (darkest + 0.05);\r\n}\r\n\r\n/**\r\n * 计算对比度\r\n * @param luminance1\r\n * @param luminance2\r\n * @returns\r\n */\r\nexport function contrastRatio(luminance1, luminance2) {\r\n return (Math.max(luminance1, luminance2) + 0.05) / (Math.min(luminance1, luminance2) + 0.05);\r\n}\r\n\r\n/**\r\n * 十六进制颜色转 RGB\r\n * @param hex\r\n * @returns\r\n */\r\nexport function hexToRGB(hex) {\r\n hex = hex.replace(\"#\", \"\");\r\n if (hex.length === 3) {\r\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\r\n }\r\n const r = parseInt(hex.substring(0, 2), 16);\r\n const g = parseInt(hex.substring(2, 4), 16);\r\n const b = parseInt(hex.substring(4, 6), 16);\r\n return [r, g, b];\r\n}\r\n\r\n/**\r\n * rgb 数值限制\r\n * @param val\r\n * @returns\r\n */\r\nexport function rgbNumLimit(val) {\r\n if (val > 250) {\r\n return 250;\r\n }\r\n if (val < 0) {\r\n return 0;\r\n }\r\n return val;\r\n}\r\n\r\n/**\r\n * RGB 转十六进制颜色\r\n * @param r\r\n * @param g\r\n * @param b\r\n * @returns\r\n */\r\nexport function rgbToHex(r, g, b) {\r\n return (\r\n \"#\" +\r\n [r, g, b]\r\n .map((x) => {\r\n const hex = x.toString(16);\r\n return hex.length === 1 ? \"0\" + hex : hex;\r\n })\r\n .join(\"\")\r\n );\r\n}\r\n\r\n/**\r\n * RGB 转 HSL\r\n * @param r\r\n * @param g\r\n * @param b\r\n * @returns\r\n */\r\nexport function rgbToHsl(r, g, b) {\r\n r /= 255;\r\n g /= 255;\r\n b /= 255;\r\n const max = Math.max(r, g, b);\r\n const min = Math.min(r, g, b);\r\n let h,\r\n s,\r\n l = (max + min) / 2;\r\n\r\n if (max === min) {\r\n h = s = 0;\r\n } else {\r\n const d = max - min;\r\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n switch (max) {\r\n case r:\r\n h = (g - b) / d + (g < b ? 6 : 0);\r\n break;\r\n case g:\r\n h = (b - r) / d + 2;\r\n break;\r\n case b:\r\n h = (r - g) / d + 4;\r\n break;\r\n }\r\n h /= 6;\r\n }\r\n return [h * 360, s * 100, l * 100];\r\n}\r\n\r\n/**\r\n * HSL 转 RGB\r\n * @param h\r\n * @param s\r\n * @param l\r\n * @returns\r\n */\r\nexport function hslToRgb(h, s, l) {\r\n h /= 360;\r\n s /= 100;\r\n l /= 100;\r\n let r, g, b;\r\n\r\n if (s === 0) {\r\n r = g = b = l;\r\n } else {\r\n const hue2rgb = (p, q, t) => {\r\n if (t < 0) t += 1;\r\n if (t > 1) t -= 1;\r\n if (t < 1 / 6) return p + (q - p) * 6 * t;\r\n if (t < 1 / 2) return q;\r\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\r\n return p;\r\n };\r\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\r\n const p = 2 * l - q;\r\n r = hue2rgb(p, q, h + 1 / 3);\r\n g = hue2rgb(p, q, h);\r\n b = hue2rgb(p, q, h - 1 / 3);\r\n }\r\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];\r\n}\r\n\r\n/**\r\n * 判断是否为灰色背景\r\n * @param r\r\n * @param g\r\n * @param b\r\n * @returns\r\n */\r\nexport function isGray(r, g, b, opt = { tolerance: 10 }) {\r\n const {\r\n /**\r\n * 允许的误差范围\r\n */\r\n tolerance = 10,\r\n } = opt || {}; //\r\n return Math.abs(r - g) <= tolerance && Math.abs(g - b) <= tolerance && Math.abs(r - b) <= tolerance;\r\n}\r\n\r\n/**\r\n * 根据背景颜色选择合适的文本颜色(十六进制格式)\r\n * @param backgroundColor\r\n * @returns\r\n */\r\nexport function getTextColor(backgroundColor) {\r\n let [r, g, b] = [0, 0, 0];\r\n if (backgroundColor.startsWith(\"#\")) {\r\n [r, g, b] = hexToRGB(backgroundColor);\r\n } else {\r\n const div = document.createElement(\"div\");\r\n div.style.color = backgroundColor;\r\n document.body.appendChild(div);\r\n const cs = getComputedStyle(div);\r\n const rgb = cs.color.match(/\\d+/g).map(Number);\r\n document.body.removeChild(div);\r\n [r, g, b] = rgb;\r\n }\r\n const bgLuminance = luminance(r, g, b);\r\n const whiteLuminance = luminance(255, 255, 255);\r\n const blackLuminance = luminance(0, 0, 0);\r\n const whiteContrast = contrast(bgLuminance, whiteLuminance);\r\n const blackContrast = contrast(bgLuminance, blackLuminance);\r\n return whiteContrast > blackContrast ? \"#ffffff\" : \"#000000\";\r\n}\r\n\r\n/**\r\n * 根据背景亮度调整文字颜色深浅\r\n * @param bgR\r\n * @param bgG\r\n * @param bgB\r\n * @returns\r\n */\r\nexport function adjustTextColor(hexColor) {\r\n const [bgR, bgG, bgB] = hexToRGB(hexColor);\r\n const bgLuminance = luminance(bgR, bgG, bgB);\r\n let textR, textG, textB;\r\n const targetContrast = 4.5; // WCAG AA 标准\r\n\r\n if (bgR === 0 && bgG === 0 && bgB === 0) {\r\n // 黑色背景\r\n let textR = 255,\r\n textG = 255,\r\n textB = 255;\r\n const textLuminance = luminance(textR, textG, textB);\r\n const ratio = contrastRatio(bgLuminance, textLuminance);\r\n if (ratio < targetContrast) {\r\n textR = 230;\r\n textG = 230;\r\n textB = 230;\r\n }\r\n return rgbToHex(textR, textG, textB);\r\n } else if (bgR === 255 && bgG === 255 && bgB === 255) {\r\n // 白色背景\r\n let textR = 0,\r\n textG = 0,\r\n textB = 0;\r\n const textLuminance = luminance(textR, textG, textB);\r\n const ratio = contrastRatio(bgLuminance, textLuminance);\r\n if (ratio < targetContrast) {\r\n textR = 20;\r\n textG = 20;\r\n textB = 20;\r\n }\r\n return rgbToHex(textR, textG, textB);\r\n } else if (isGray(bgR, bgG, bgB)) {\r\n // 灰色背景\r\n if (bgLuminance < 0.4) {\r\n // 深色灰色背景,使用白色文字\r\n let textR = 255,\r\n textG = 255,\r\n textB = 255;\r\n const textLuminance = luminance(textR, textG, textB);\r\n const ratio = contrastRatio(bgLuminance, textLuminance);\r\n if (ratio < targetContrast) {\r\n textR = 230;\r\n textG = 230;\r\n textB = 230;\r\n }\r\n return rgbToHex(textR, textG, textB);\r\n } else {\r\n // 浅色灰色背景,使用黑色文字\r\n let textR = 0,\r\n textG = 0,\r\n textB = 0;\r\n const textLuminance = luminance(textR, textG, textB);\r\n const ratio = contrastRatio(bgLuminance, textLuminance);\r\n if (ratio < targetContrast) {\r\n textR = 20;\r\n textG = 20;\r\n textB = 20;\r\n }\r\n return rgbToHex(textR, textG, textB);\r\n }\r\n }\r\n\r\n // 非黑白灰背景,使用差值颜色\r\n const adjustNum = 150;\r\n if (bgLuminance > 0.5) {\r\n // 背景较亮,文字颜色调深\r\n textR = Math.max(0, bgR - adjustNum);\r\n textG = Math.max(0, bgG - adjustNum);\r\n textB = Math.max(0, bgB - adjustNum);\r\n } else {\r\n // 背景较暗,文字颜色调亮\r\n textR = Math.min(255, bgR + adjustNum);\r\n textG = Math.min(255, bgG + adjustNum);\r\n textB = Math.min(255, bgB + adjustNum);\r\n }\r\n return rgbToHex(textR, textG, textB);\r\n}\r\n\r\n/**\r\n * 调整颜色深浅\r\n * @param hexColor\r\n * @param amount\r\n * @returns\r\n */\r\nexport function adjustColor(hexColor, amount) {\r\n const [r, g, b] = hexToRGB(hexColor);\r\n\r\n const newR = rgbNumLimit(r + amount);\r\n const newG = rgbNumLimit(g + amount);\r\n const newB = rgbNumLimit(b + amount);\r\n\r\n return rgbToHex(newR, newG, newB);\r\n}\r\n","export interface ICheckEmptyOpt {\r\n /** 【废弃】空值占位符 */\r\n emptyStr?: string;\r\n /** 空值占位符 */\r\n emptySymbol?: string;\r\n checkEmptyArr?: boolean;\r\n}\r\nexport interface IHandleEmptyValOpt extends ICheckEmptyOpt {}\r\n\r\n/**\r\n * 空数据判断\r\n * @param {*} val\r\n * @param {*} opt\r\n * @returns\r\n */\r\nexport function checkEmpty(val, opt: ICheckEmptyOpt = {}) {\r\n const { checkEmptyArr = true } = opt || {};\r\n if (val === \"\" || val === null || val === undefined) {\r\n return true;\r\n }\r\n if (checkEmptyArr && Array.isArray(val) && Array.length === 0) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * 处理空数据显示占位符\r\n * @param val\r\n * @param opt\r\n * @returns\r\n */\r\nexport const handleEmptyVal = (val, opt: IHandleEmptyValOpt = {}) => {\r\n const { emptyStr = \"--\" } = opt || {};\r\n const emptySymbol = opt?.emptySymbol ?? emptyStr;\r\n if (checkEmpty(val, opt)) {\r\n return emptySymbol;\r\n }\r\n return val;\r\n};\r\n","window.utilsGlobalServeConfig = {}\r\n/** 获取全局配置(url、是否显示缩略图地址) */\r\nexport function getGlobalServeConfig() {\r\n return window.utilsGlobalServeConfig || {}\r\n}\r\n/** 设置全局配置(url、是否显示缩略图地址)*/\r\nexport function setGlobalServeConfigs(data) {\r\n Object.assign(window.utilsGlobalServeConfig || {}, data);\r\n return window.utilsGlobalServeConfig || {}\r\n}\r\n/** 设置全局单个配置(url、是否显示缩略图地址)*/\r\nexport function setGlobalServeConfig(key, data) {\r\n window.utilsGlobalServeConfig[key] = data\r\n return window.utilsGlobalServeConfig || {}\r\n}\r\n","/**\r\n * 身份证号码合法性校验\r\n * @param {string} idCard 身份证号码\r\n * @param {Object} opt 校验选项\r\n * @param {boolean} opt.validBirthDate 是否校验出生日期\r\n * @returns {boolean} 是否合法\r\n */\r\nexport function isValidIdCard(idCard, opt?) {\r\n // 空值校验\r\n if (!idCard) return false;\r\n\r\n // 去除空格\r\n idCard = idCard.trim().toUpperCase();\r\n\r\n // 长度校验\r\n const len = idCard.length;\r\n if (len !== 15 && len !== 18) return false;\r\n\r\n // 15位身份证正则(仅数字,出生日期格式为YYMMDD)\r\n const reg15 = /^[1-9]\\d{7}((0[1-9])|(1[0-2]))((0[1-9])|([1-2]\\d)|(3[0-1]))\\d{3}$/;\r\n // 18位身份证正则(前17位数字,最后一位可能是数字或X)\r\n const reg18 = /^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))((0[1-9])|([1-2]\\d)|(3[0-1]))\\d{3}[\\dX]$/;\r\n\r\n // 格式校验\r\n if (len === 15 && !reg15.test(idCard)) return false;\r\n if (len === 18 && !reg18.test(idCard)) return false;\r\n\r\n // 15位转18位后校验校验码\r\n let id18 = idCard;\r\n if (len === 15) {\r\n id18 = convert15to18(idCard);\r\n }\r\n\r\n // 校验地址码(省级+市级)\r\n // if (!isValidAddressCode(id18)) return false;\r\n\r\n // 校验出生日期是否在合理范围内(1900年-当前年份)\r\n if (opt?.validBirthDate && !isValidBirthDate(id18)) return false;\r\n\r\n // 校验最后一位校验码\r\n return verifyCheckCode(id18);\r\n}\r\n\r\n/**\r\n * 校验地址码(前6位)\r\n * 规则校验:省级代码合法 + 市级代码格式合法\r\n */\r\n// export function isValidAddressCode(id18) {\r\n// const addrCode = id18.substring(0, 6);\r\n\r\n// const provinceCode = addrCode.substring(0, 2);\r\n// const cityCode = addrCode.substring(2, 4);\r\n\r\n// // 1. 校验省级代码(第1-2位)\r\n// if (!isValidProvinceCode(provinceCode)) return false;\r\n\r\n// // 2. 校验市级代码(第3-4位)\r\n// if (!isValidCityCode(cityCode)) return false;\r\n\r\n// return true;\r\n// }\r\n\r\n/**\r\n * 校验省级代码(第1-2位)\r\n * 合法范围:11-15, 21-23, 31-37, 41-46, 50-54, 61-65, 71, 81, 82\r\n */\r\nfunction isValidProvinceCode(code) {\r\n const pattern = /^(1[1-5]|2[1-3]|3[1-7]|4[1-3]|4[4-6]|5[0-4]|6[1-5]|71|81|82)$/;\r\n return pattern.test(code);\r\n}\r\n\r\n/**\r\n * 校验市级代码(第3-4位)\r\n * 规则:\r\n * - 01-20:常规地级市、自治州、地区、盟\r\n * - 51-59:地区(历史遗留)\r\n * - 90:省直辖县级市/县\r\n * - 不能是00\r\n */\r\nfunction isValidCityCode(code) {\r\n const pattern = /^(0[1-9]|1[0-9]|20|5[1-9]|90)$/;\r\n return pattern.test(code);\r\n}\r\n\r\n/**\r\n * 校验出生日期是否合法且在一定范围内\r\n * @param {string} id18 18位身份证号码\r\n * @returns {boolean} 出生日期是否合法\r\n */\r\nexport function isValidBirthDate(id18) {\r\n // 提取出生日期信息\r\n const birthYear = parseInt(id18.substring(6, 10));\r\n const birthMonth = parseInt(id18.substring(10, 12));\r\n const birthDay = parseInt(id18.substring(12, 14));\r\n\r\n const currentYear = new Date().getFullYear();\r\n\r\n // 年份范围校验:1900年到当前年份(包含)\r\n if (birthYear < 1900 || birthYear > currentYear) {\r\n return false;\r\n }\r\n\r\n // 月份范围校验\r\n if (birthMonth < 1 || birthMonth > 12) {\r\n return false;\r\n }\r\n\r\n // 日期范围校验(考虑闰年)\r\n const daysInMonth = getDaysInMonth(birthYear, birthMonth);\r\n\r\n if (birthDay < 1 || birthDay > daysInMonth) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * 获取指定月份的天数\r\n * @param {number} year 年份\r\n * @param {number} month 月份(1-12)\r\n * @returns {number} 该月的天数\r\n */\r\nexport function getDaysInMonth(year, month) {\r\n // 闰年判断:能被4整除但不能被100整除,或者能被400整除\r\n const isLeapYear = (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\r\n\r\n const daysInMonth = [31, isLeapYear ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\n return daysInMonth[month - 1];\r\n}\r\n\r\n/**\r\n * 15位身份证转18位\r\n * @param {string} id15 15位身份证号码\r\n * @returns {string} 18位身份证号码\r\n */\r\nexport function convert15to18(id15) {\r\n // 提取15位中的年份(两位)\r\n const yearTwoDigits = parseInt(id15.substring(6, 8));\r\n // 年份范围判断:如果两位年份大于当前年份的后两位,则属于1900年代,否则属于2000年代\r\n const currentYear = new Date().getFullYear();\r\n const currentYearTwoDigits = currentYear % 100;\r\n\r\n let fullYear;\r\n if (yearTwoDigits > currentYearTwoDigits) {\r\n fullYear = 1900 + yearTwoDigits;\r\n } else {\r\n fullYear = 2000 + yearTwoDigits;\r\n }\r\n\r\n // 年份前加完整的四位年份\r\n const id17 = id15.substring(0, 6) + fullYear + id15.substring(8);\r\n // 计算校验码\r\n const checkCode = calculateCheckCode(id17);\r\n return id17 + checkCode;\r\n}\r\n\r\n/**\r\n * 计算18位身份证的校验码\r\n * @param {string} id17 身份证前17位\r\n * @returns {string} 校验码(0-9或X)\r\n */\r\nexport function calculateCheckCode(id17) {\r\n // 加权因子\r\n const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];\r\n // 校验码对应值\r\n const checkCodes = [\"1\", \"0\", \"X\", \"9\", \"8\", \"7\", \"6\", \"5\", \"4\", \"3\", \"2\"];\r\n\r\n let sum = 0;\r\n for (let i = 0; i < 17; i++) {\r\n sum += parseInt(id17[i]) * weights[i];\r\n }\r\n const mod = sum % 11;\r\n return checkCodes[mod];\r\n}\r\n\r\n/**\r\n * 校验18位身份证的校验码\r\n * @param {string} id18 18位身份证号码\r\n * @returns {boolean} 校验码是否正确\r\n */\r\nexport function verifyCheckCode(id18) {\r\n const id17 = id18.substring(0, 17);\r\n const providedCode = id18[17];\r\n const calculatedCode = calculateCheckCode(id17);\r\n return providedCode === calculatedCode;\r\n}\r\n\r\n/**\r\n * 计算年龄\r\n * @param {number} year 出生年份\r\n * @param {number} month 出生月份\r\n * @param {number} day 出生日期\r\n * @returns {number} 年龄\r\n */\r\nexport function calculateAge(year, month, day) {\r\n const today = new Date();\r\n let age = today.getFullYear() - year;\r\n const monthDiff = today.getMonth() + 1 - month;\r\n if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < day)) {\r\n age--;\r\n }\r\n return age;\r\n}\r\n\r\n/**\r\n * 获取身份证详细信息\r\n * @param {string} idCard 身份证号码\r\n * @returns {object|null} 详细信息对象,校验失败返回null\r\n */\r\nexport function getIdCardInfo(idCard) {\r\n if (!isValidIdCard(idCard)) return null;\r\n\r\n let id18 = idCard.trim().toUpperCase();\r\n if (id18.length === 15) {\r\n id18 = convert15to18(id18);\r\n }\r\n\r\n // 解析信息\r\n const provinceCode = id18.substring(0, 2);\r\n const birthYear = parseInt(id18.substring(6, 10));\r\n const birthMonth = parseInt(id18.substring(10, 12));\r\n const birthDay = parseInt(id18.substring(12, 14));\r\n const genderCode = parseInt(id18.substring(16, 17));\r\n\r\n const birthDate = new Date(birthYear, birthMonth - 1, birthDay);\r\n\r\n return {\r\n province: provinceCode,\r\n birthDate: birthDate,\r\n birthYear: birthYear,\r\n birthMonth: birthMonth,\r\n birthDay: birthDay,\r\n age: calculateAge(birthYear, birthMonth, birthDay),\r\n gender: genderCode % 2 === 1 ? \"男\" : \"女\",\r\n isValid: true,\r\n };\r\n}\r\n","export class IMAGE_TYPES {\r\n static JPEG = \"image/jpeg\";\r\n static PNG = \"image/png\";\r\n}\r\n\r\n/**\r\n * 检测空图片\r\n * @param img\r\n * @returns\r\n */\r\nexport function checkEmptyImg(img: HTMLImageElement) {\r\n // 创建一个 Canvas 元素\r\n const canvas = document.createElement(\"canvas\");\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) {\r\n return;\r\n }\r\n\r\n // 设置 Canvas 的宽度和高度与图片一致\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n // 将图片绘制到Canvas上\r\n ctx.drawImage(img, 0, 0);\r\n // 获取Canvas中的像素数据\r\n const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\r\n const data = imageData.data;\r\n\r\n // 判断从左上角到右下角的像素是否都是黑色\r\n let topLeftToBottomRight = true;\r\n\r\n const iUp = 0;\r\n const redUp = data[iUp];\r\n const greenUp = data[iUp + 1];\r\n const blueUp = data[iUp + 2];\r\n const alphaUp = data[iUp + 3];\r\n for (let i = 0; i < data.length; i += 4) {\r\n const red = data[i];\r\n const green = data[i + 1];\r\n const blue = data[i + 2];\r\n const alpha = data[i + 3];\r\n\r\n if (red !== redUp || green !== greenUp || blue !== blueUp || alpha !== alphaUp) {\r\n topLeftToBottomRight = false;\r\n break;\r\n }\r\n }\r\n\r\n // 判断从右上角到左下角的像素是否都是黑色\r\n let topRightToBottomLeft = true;\r\n const jDown = data.length - 4;\r\n const redDown = data[jDown];\r\n const greenDown = data[jDown + 1];\r\n const blueDown = data[jDown + 2];\r\n const alphaDown = data[jDown + 3];\r\n\r\n for (let j = jDown; j >= 0; j -= 4) {\r\n const red = data[j];\r\n const green = data[j + 1];\r\n const blue = data[j + 2];\r\n const alpha = data[j + 3];\r\n\r\n if (red !== redDown || green !== greenDown || blue !== blueDown || alpha !== alphaDown) {\r\n topRightToBottomLeft = false;\r\n break;\r\n }\r\n }\r\n\r\n // 打印结果\r\n if (topLeftToBottomRight && topRightToBottomLeft) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * 获取dom元素宽高\r\n * @param d dom元素\r\n * @returns {{width: number, height: number}}\r\n */\r\nexport function getDomWH(d: HTMLElement | HTMLImageElement | HTMLCanvasElement) {\r\n if (d instanceof Image || d instanceof HTMLCanvasElement) {\r\n return {\r\n width: d.width || d.offsetWidth,\r\n height: d.width || d.offsetHeight,\r\n };\r\n }\r\n return {\r\n width: d.offsetWidth,\r\n height: d.offsetHeight,\r\n };\r\n}\r\n\r\n/**\r\n * 设置dom元素宽高\r\n * @param d dom元素\r\n * @param w 宽\r\n * @param h 高\r\n */\r\nexport function setDomWH(dom: HTMLElement, w: number, h: number) {\r\n dom.setAttribute(\"width\", `${w}`);\r\n dom.setAttribute(\"height\", `${h}`);\r\n}\r\n\r\n/**\r\n * 获取当前 canvas 图片 Blob 对象\r\n * @param canvas\r\n * @returns {Promise<Blob>}\r\n */\r\nexport function getCanvasPic(canvas: HTMLCanvasElement): Blob {\r\n const gl = canvas.getContext(\"2d\", { preserveDrawingBuffer: true });\r\n\r\n return dataURItoBlob(canvas.toDataURL(IMAGE_TYPES.PNG, 1));\r\n}\r\n\r\n/**\r\n * base64 字符串转 blob\r\n * @param base64\r\n * @returns\r\n */\r\nexport function dataURItoBlob(base64: string): Blob {\r\n const arr = base64.split(\",\");\r\n const mime = arr[0]?.match(/:(.*?);/)?.[1];\r\n const bstr = atob(arr[1]);\r\n let n = bstr.length;\r\n const u8arr = new Uint8Array(n);\r\n while (n--) {\r\n u8arr[n] = bstr.charCodeAt(n);\r\n }\r\n return new Blob([u8arr], { type: mime });\r\n}\r\n\r\n/**\r\n * 获取图片元素\r\n * @param imgSrc\r\n * @returns\r\n */\r\nexport function getImgEle(imgSrc: string): Promise<HTMLImageElement> {\r\n return new Promise((resolve) => {\r\n const img = new Image();\r\n img.onload = function () {\r\n resolve(img);\r\n };\r\n img.src = imgSrc;\r\n });\r\n}\r\n\r\n/**\r\n * 获取图片 Base64 字符串\r\n * @param imgSrc\r\n * @returns\r\n */\r\nexport function getImgBase64(imgSrc: string): Promise<string> {\r\n return getImgEle(imgSrc).then((img) => {\r\n const canvas = document.createElement(\"canvas\");\r\n const { width, height } = getDomWH(img);\r\n setDomWH(canvas, width, height);\r\n const ctx = canvas.getContext(\"2d\");\r\n ctx && ctx.drawImage(img, 0, 0, width, height, 0, 0, width, height);\r\n return canvas.toDataURL(IMAGE_TYPES.PNG, 1);\r\n });\r\n}\r\n\r\n/**\r\n * 通过图片地址获取对应 canvas\r\n * @param imgSrc\r\n * @returns\r\n */\r\nexport function getCanvas(imgSrc: string): Promise<HTMLCanvasElement> {\r\n return getImgEle(imgSrc).then((img) => {\r\n const canvas = document.createElement(\"canvas\");\r\n const { width, height } = getDomWH(img);\r\n setDomWH(canvas, width, height);\r\n const ctx = canvas.getContext(\"2d\");\r\n ctx && ctx.drawImage(img, 0, 0, width, height, 0, 0, width, height);\r\n return canvas;\r\n });\r\n}\r\n\r\n/**\r\n * 通过图片地址获取对应 canvas\r\n * @param img\r\n * @returns\r\n */\r\nexport function getCanvasByImg(img: HTMLImageElement): HTMLCanvasElement {\r\n const canvas = document.createElement(\"canvas\");\r\n const { width, height } = getDomWH(img);\r\n setDomWH(canvas, width, height);\r\n const ctx = canvas.getContext(\"2d\");\r\n ctx && ctx.drawImage(img, 0, 0, width, height, 0, 0, width, height);\r\n return canvas;\r\n}\r\n\r\n/**\r\n * 截取图片\r\n * @param img\r\n * @param opt\r\n * @param opt.startX\r\n * @param opt.startY\r\n * @param opt.width\r\n * @param opt.height\r\n * @returns Promise<string>\r\n */\r\nexport function cropImage(\r\n img: HTMLImageElement | HTMLCanvasElement,\r\n opt: { startX: number; startY: number; width: number; height: number },\r\n) {\r\n return cropImageToCanvas(img, opt).toDataURL(IMAGE_TYPES.PNG, 1);\r\n}\r\n\r\n/**\r\n * 截取图片\r\n * @param img\r\n * @param opt\r\n * @param opt.startX\r\n * @param opt.startY\r\n * @param opt.width\r\n * @param opt.height\r\n * @returns Promise<HTMLCanvasElement>\r\n */\r\nexport function cropImageToCanvas(\r\n img: HTMLImageElement | HTMLCanvasElement,\r\n opt: { startX: number; startY: number; width: number; height: number },\r\n) {\r\n const { startX, startY, width, height } = opt;\r\n const canvas = document.createElement(\"canvas\");\r\n const ctx = canvas.getContext(\"2d\");\r\n // 设置 canvas 的宽度和高度为裁剪后的尺寸\r\n canvas.width = width; // 裁剪后的宽度\r\n canvas.height = height; // 裁剪后的高度\r\n // 在 canvas 上绘制裁剪后的图像\r\n ctx?.drawImage(img, startX, startY, width, height, 0, 0, width, height);\r\n // 可以将裁剪后的图像数据获取出来\r\n return canvas;\r\n}\r\n\r\n/**\r\n * 绘制图片\r\n * @param img\r\n * @param opt\r\n * @param opt.startX\r\n * @param opt.startY\r\n * @param opt.width\r\n * @param opt.height\r\n * @returns Promise<string>\r\n */\r\nexport function imgToCanvas(img: HTMLImageElement) {\r\n const canvas = document.createElement(\"canvas\");\r\n const ctx = canvas.getContext(\"2d\");\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n ctx?.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height);\r\n return canvas;\r\n}\r\n\r\n/**\r\n * 缩放图片\r\n * @param img\r\n * @param opt\r\n * @returns base64\r\n */\r\nexport function scaleImage(img: HTMLImageElement | HTMLCanvasElement, opt = { scaleFactor: 1 }) {\r\n return scaleImageToCanvas(img, opt).toDataURL(IMAGE_TYPES.PNG, 1);\r\n}\r\n\r\n/**\r\n * 缩放图片,返回 canvas\r\n * @param img\r\n * @param opt\r\n * @returns canvas\r\n */\r\nexport function scaleImageToCanvas(img: HTMLImageElement | HTMLCanvasElement, opt = { scaleFactor: 1 }) {\r\n const { scaleFactor = 1 } = opt;\r\n const canvas = document.createElement(\"canvas\");\r\n const ctx = canvas.getContext(\"2d\");\r\n canvas.width = img.width * scaleFactor;\r\n canvas.height = img.height * scaleFactor;\r\n ctx?.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height);\r\n return canvas;\r\n}\r\n\r\n/**\r\n * 图片转为 base64\r\n * @param img\r\n * @returns\r\n */\r\nexport async function imgToBase64(img: string | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement) {\r\n if (!img || img instanceof Blob) {\r\n return img;\r\n }\r\n let _img = img;\r\n if (img instanceof Image) {\r\n _img = img.src;\r\n } else if (img instanceof HTMLVideoElement) {\r\n // 从视频中获取图片\r\n const canvas = document.createElement(\"canvas\");\r\n const { width, height } = getDomWH(img);\r\n setDomWH(canvas, width, height);\r\n const ctx = canvas.getContext(\"2d\");\r\n ctx && ctx.drawImage(img, 0, 0, width, height, 0, 0, width, height);\r\n _img = canvas.toDataURL(IMAGE_TYPES.PNG, 1);\r\n } else if (img instanceof HTMLCanvasElement) {\r\n _img = img.toDataURL(IMAGE_TYPES.PNG, 1);\r\n } else if (typeof _img === \"string\" && !_img.startsWith(\"data:image/\")) {\r\n // 加载图片,并获取图片 base64\r\n _img = await getImgBase64(_img);\r\n }\r\n return _img;\r\n}\r\n\r\n/**\r\n * 图片转为 Blob\r\n * @param img\r\n * @returns\r\n */\r\nexport async function imgToBlob(img: string | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement): Promise<Blob> {\r\n if (!img) {\r\n throw new Error(\"请传入图片数据\");\r\n }\r\n if (img instanceof Blob) {\r\n return Promise.resolve(img);\r\n }\r\n const _img = await imgToBase64(img);\r\n if (typeof _img !== \"string\") {\r\n throw new Error(\"传入的图片数据不正确\");\r\n }\r\n return dataURItoBlob(_img);\r\n}\r\n\r\n/**\r\n * 获取图片的 base64、blob 格式\r\n * @param img\r\n */\r\nexport async function getAllTypeImg(img: string | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement) {\r\n const base64 = await imgToBase64(img);\r\n return {\r\n base64,\r\n blob: typeof base64 === \"string\" && dataURItoBlob(base64),\r\n };\r\n}\r\n\r\n\r\n\r\n\r\n/**\r\n * 等比缩放图片尺寸(不裁切、不变形)\r\n * @param {HTMLImageElement} img\r\n * @param {number} scale 缩放比例 0~1\r\n * @returns {Promise<Blob>}\r\n */\r\nexport function drawScaleImage(img, scale) {\r\n return new Promise((resolve) => {\r\n const w = Math.round(img.width * scale);\r\n const h = Math.round(img.height * scale);\r\n\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.width = w;\r\n canvas.height = h;\r\n const ctx = canvas.getContext(\"2d\");\r\n\r\n // 整图等比绘制,无裁切\r\n ctx.drawImage(img, 0, 0, w, h);\r\n\r\n canvas.toBlob((blob) => resolve(blob), \"image/png\");\r\n });\r\n}\r\n\r\n/**\r\n * JPG/WebP 仅动态降画质(不改尺寸)\r\n * @param {Blob} blob\r\n * @param {HTMLImageElement} img\r\n * @returns {Promise<Blob>}\r\n */\r\nexport function compressByQuality(blob, img, maxSize) {\r\n return new Promise((resolve) => {\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n const ctx = canvas.getContext(\"2d\");\r\n ctx.drawImage(img, 0, 0);\r\n\r\n let quality = 0.98;\r\n const minQ = 0.5;\r\n\r\n function loop() {\r\n canvas.toBlob(\r\n (newBlob) => {\r\n if (newBlob.size <= maxSize || quality <= minQ) {\r\n resolve(newBlob);\r\n return;\r\n }\r\n quality -= 0.02;\r\n loop();\r\n },\r\n blob.type,\r\n quality,\r\n );\r\n }\r\n loop();\r\n });\r\n}\r\n\r\n/**\r\n * 智能压缩入口\r\n * 1. 小于10M直接返回原图\r\n * 2. JPG/WebP:只降画质,不改尺寸\r\n * 3. PNG:不转格式、只等比缩分辨率,不裁切\r\n * @param {Blob} blob\r\n * @returns {Promise<Blob>}\r\n */\r\nexport function smartImageCompress(blob, maxSize) {\r\n if (blob.size <= maxSize) {\r\n return Promise.resolve(blob);\r\n }\r\n\r\n return new Promise((resolve) => {\r\n const isPng = blob.type === \"image/png\";\r\n const img = new Image();\r\n\r\n img.src = URL.createObjectURL(blob);\r\n img.onload = async () => {\r\n URL.revokeObjectURL(img.src);\r\n\r\n // 非PNG:只降画质\r\n if (!isPng) {\r\n const resBlob = await compressByQuality(blob, img, maxSize);\r\n return resolve(resBlob);\r\n }\r\n\r\n // PNG:只等比缩分辨率,不转格式、不裁切\r\n let scale = 0.95; // 每次缩小5%\r\n const minScale = 0.5; // 最低缩到原图50%,不再缩\r\n\r\n let currentBlob = blob;\r\n\r\n const loopScale = async () => {\r\n currentBlob = await drawScaleImage(img, scale);\r\n\r\n if (currentBlob.size <= maxSize || scale <= minScale) {\r\n resolve(currentBlob);\r\n return;\r\n }\r\n\r\n scale -= 0.05;\r\n\r\n loopScale();\r\n };\r\n\r\n loopScale();\r\n };\r\n });\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","export const DEFAULT_POSITION = {\r\n lon: 120.168893,\r\n lat: 30.225404,\r\n addr: \"浙江省杭州市上城区南星街道杭州西湖风景名胜区\",\r\n};\r\n\r\n/**\r\n * 获取当前定位\r\n * @param config\r\n * @returns\r\n */\r\nexport function getCurrentPosition(config?: any): Promise<any> {\r\n return new Promise((resolve, reject) => {\r\n navigator?.geolocation?.getCurrentPosition(\r\n (position) => {\r\n resolve(position);\r\n },\r\n reject,\r\n {\r\n enableHighAccuracy: true,\r\n timeout: 5000,\r\n ...config,\r\n },\r\n );\r\n });\r\n}\r\n","import { customAlphabet } from \"nanoid\";\r\n\r\n/**\r\n * 指定 nanoid 字符集合\r\n * 数字和大小写字母\r\n */\r\nexport const numALetters = \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\";\r\n\r\n/** nanoid 数字和大小写字母 */\r\nexport const nanoidNumALetters = customAlphabet(numALetters, 8);\r\n\r\n/**\r\n * 指定 nanoid 字符集合\r\n * 数字和大小写字母\r\n */\r\nexport const numALettersAUrl = \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_~\";\r\n\r\n/** nanoid url 参数规范 */\r\nexport const nanoidUrl = customAlphabet(numALettersAUrl, 20);\r\n","import { cloneDeep } from \"lodash-es\";\n\nimport type { IHandleEmptyValOpt } from \"./empty-val\";\nimport { checkEmpty, handleEmptyVal } from \"./empty-val\";\n\nexport interface IFieldNames {\n value?: string;\n label?: string;\n children?: string;\n}\n\nexport interface IFindOptionOpt extends IHandleEmptyValOpt {\n fieldNames?: IFieldNames;\n // 是否返回完整的路径数组\n isPathList?: boolean;\n pathList?: Array<any>;\n labelList?: Array<string>;\n parent?: any;\n}\n\nexport interface IGetArrayLabels extends IFindOptionOpt {\n split?: string;\n}\n\nexport interface IGetValLabelOpt extends IHandleEmptyValOpt {\n showEmpty?: boolean;\n}\n\nexport type formatOptionsOptT = {\n fieldNames?: IFieldNames;\n sourceFieldNames?: IFieldNames;\n /**\n * 是否清除其他参数\n */\n isClear?: boolean;\n};\n\nexport const DEF_FIELD_NAMES = {\n value: \"value\",\n label: \"label\",\n children: \"children\",\n};\n\n/**\n * 获取无限级数据的选中项\n * @param val\n * @param options\n * @param opt\n * @returns\n */\nexport const findOptionByVal = function (\n val,\n options,\n opt: IFindOptionOpt = {\n // 是否返回完整的路径数组\n isPathList: false,\n pathList: [],\n labelList: [],\n parent: undefined,\n fieldNames: {\n label: \"label\",\n value: \"value\",\n children: \"children\",\n },\n },\n) {\n if (!options) {\n console.warn(\"getDeepData 请传入 options\");\n return;\n }\n const { fieldNames, isPathList, pathList = [], labelList = [] } = opt || {};\n const { label = \"label\", value = \"value\", children = \"children\" } = fieldNames || {};\n const res = options.find((it) => it[value] === val);\n if (res) {\n if (isPathList) {\n pathList.unshift(res);\n labelList.unshift(res[label]);\n return {\n last: res,\n pathList,\n labelList,\n };\n }\n return res;\n }\n const len = options.length;\n for (let i = 0; i < len; i++) {\n const item = options[i];\n const childList = item[children];\n if (Array.isArray(childList) && childList.length > 0) {\n const res = findOptionByVal(val, childList, {\n ...opt,\n parent: item,\n pathList,\n labelList,\n });\n if (res) {\n if (isPathList) {\n pathList.unshift(item);\n labelList.unshift(item[label]);\n return {\n last: res.last,\n labelList,\n pathList,\n };\n }\n return res;\n }\n }\n }\n};\n\n/**\n * 在命中项上写出标准 value / label / children(保留原字段)。\n * 与 `getOptItByVal` 的归一化语义一致;供 `normalizeOption(findOptionByVal(...))` 组合使用。\n * @param item 命中的 option 项\n * @param fieldNames 自定义字段名映射\n */\nexport function normalizeOption<T extends Record<string, any>>(\n item: T,\n fieldNames?: IFieldNames,\n): T & { value: unknown; label: unknown; children: unknown } {\n const { value = \"value\", label = \"label\", children = \"children\" } = fieldNames || {};\n return {\n ...item,\n value: item?.[value],\n label: item?.[label],\n children: item?.[children],\n };\n}\n\n/**\n * 获取 options 中 val 对应的 label\n * @param {*} val\n * @param {Array<Object>} options\n * @param {Object} opt\n * @returns\n */\nexport const getOptionLabel = function (val, options = [], opt: IFindOptionOpt = {}) {\n const { fieldNames = DEF_FIELD_NAMES } = opt || {};\n return findOptionByVal(val, options, opt)?.[fieldNames?.label || DEF_FIELD_NAMES.label];\n};\n\n/**\n * 获取 options 中的指定项 的 label\n * @param {*} val\n * @param {*} options\n * @param {*} opt\n * @returns\n */\nexport function getValLabel(val, options = [], opt: IGetValLabelOpt = {}) {\n const { showEmpty } = opt;\n if (showEmpty && checkEmpty(val, opt)) {\n return handleEmptyVal(val, opt);\n }\n return getOptionLabel(val, options, opt);\n}\n\n/**\n * 获取 options 中的指定项 的 label 数组\n * @param {*} values\n * @param {*} options\n * @param {*} opt\n * @returns\n */\nexport function getArrayLabels(values, options, opt: IGetArrayLabels = {}) {\n if (checkEmpty(values, opt)) {\n return handleEmptyVal(values, opt);\n }\n const { split = \"、\" } = opt || {};\n let _values = values;\n if (!Array.isArray(_values)) {\n _values = [_values];\n }\n return _values\n ?.map((val) => getOptionLabel(val, options, opt) ?? val)\n ?.filter((it) => (it ?? it) || false)\n ?.join(split);\n}\n\n/**\n * 格式化 options 数组\n */\nexport const formatOptions = function (options, opt: formatOptionsOptT = {}) {\n if (!Array.isArray(options)) {\n console.warn(\"formatOptions Error: options not Array\");\n return options;\n }\n\n const {\n fieldNames = DEF_FIELD_NAMES,\n sourceFieldNames = DEF_FIELD_NAMES,\n // 是否清除其他参数\n isClear,\n } = opt || {};\n\n const { label, value, children } = fieldNames;\n const { label: sLabel, value: sValue, children: sChildren } = sourceFieldNames;\n\n const _options = cloneDeep(options);\n const resOptions = [];\n _options.forEach((it) => {\n const _it = isClear ? {} : { ...it };\n _it[value] = it[sValue];\n _it[label] = it[sLabel];\n resOptions.push(_it);\n const childList = it[sChildren];\n if (childList) {\n _it[children] = formatOptions(childList, opt);\n }\n });\n return resOptions;\n};\n\n/**\n * 根据 val 获取对应的 options 项数据,并进行数据归一化处理\n * value, label, children\n * @param {string|number|boolean} val\n * @param {Object} field\n */\nexport const getOptItByVal = function (val, options, opt) {\n const { fieldNames } = opt || {};\n const { value = \"value\", label = \"label\", children = \"children\" } = fieldNames || {};\n for (let i = 0; i < options.length; i++) {\n const it = options[i];\n if (it?.[value] === val) {\n return {\n ...it,\n value: it?.[value],\n label: it?.[label],\n children: it?.[children],\n };\n }\n // 递归处理\n const _children = it?.[children];\n if (Array.isArray(_children) && _children.length > 0) {\n const child = getOptItByVal(val, _children, opt);\n if (child) {\n return {\n ...child,\n value: child?.[value],\n label: child?.[label],\n children: child?.[children],\n };\n }\n }\n }\n};\n","import dayjs from \"dayjs\";\r\nimport { nanoidNumALetters } from \"../nanoid\";\r\n\r\n/**\r\n * 获取文件后缀\r\n * @param fileUrl\r\n * @returns\r\n */\r\nexport function getFileExt(fileUrl) {\r\n if (typeof fileUrl !== \"string\") {\r\n return;\r\n }\r\n const res = fileUrl?.match(/([^\\/]+?)\\.([^\\/\\.]+)$/);\r\n if (res && res.length > 2) {\r\n return res[2];\r\n }\r\n return fileUrl;\r\n}\r\n\r\n/**\r\n * 从 url 获取文件名称,不包含后缀\r\n * @param {string} fileName\r\n * @param {string} str\r\n * @returns\r\n */\r\nexport function getFileName(fileUrl) {\r\n if (typeof fileUrl !== \"string\") {\r\n return;\r\n }\r\n const res = fileUrl?.match(/([^\\/]+?)\\.[^\\/\\.]+$/);\r\n if (res && res.length > 0) {\r\n return res?.[1] || res?.[0];\r\n }\r\n return fileUrl;\r\n}\r\n\r\n/**\r\n * 从 url 获取文件名称,包含后缀\r\n * @param {string} fileName\r\n * @param {string} str\r\n * @returns\r\n */\r\nexport function getFullFileName(fileUrl) {\r\n if (typeof fileUrl !== \"string\") {\r\n return;\r\n }\r\n const res = fileUrl?.match(/[^\\/]+?\\.[^\\/\\.]+$/);\r\n if (res && res.length > 0) {\r\n return res[0];\r\n }\r\n return fileUrl;\r\n}\r\n\r\n/**\r\n * 合并文件名称,自动处理后缀\r\n * @param {string} fileName\r\n * @param {string} str\r\n * @returns\r\n */\r\nexport const mergeFileName = function (fileName, str = \"\") {\r\n if (typeof fileName !== \"string\") {\r\n return \"\";\r\n }\r\n const name = fileName?.match(/([^\\/]+?)\\.[^\\/]+$/)?.[1] || \"\";\r\n const suffix = fileName?.match(/[^\\/]+?\\.([^\\/]+)$/)?.[1] || \"\";\r\n\r\n return `${name}${str ?? \"\"}.${suffix}`;\r\n};\r\n\r\n/**\r\n * 获取唯一的文件名\r\n * @param {string} fileName\r\n * @returns\r\n */\r\nexport const getUFileName = function (fileName) {\r\n return mergeFileName(getFileName(fileName) || \"up\", \"-\" + `~kid-${nanoidNumALetters()}~`);\r\n};\r\n\r\n/**\r\n * 获取文件名的后缀\r\n * @param fileName\r\n * @returns\r\n */\r\nexport const getFileNameExt = function (fileName) {\r\n const regex = /^(.*)\\.([^.]+)$/;\r\n const result = fileName.match(regex);\r\n if (result) {\r\n const [, mainPart, ext] = result;\r\n return {\r\n mainPart,\r\n ext,\r\n };\r\n }\r\n return {\r\n mainPart: fileName,\r\n ext: \"\",\r\n };\r\n};\r\n","export const TYPE_VIDEO = \"video\";\r\nexport const TYPE_IMG = \"image\";\r\nexport const TYPE_AUDIO = \"audio\";\r\n\r\n/**\r\n * 检查 url 是否带有指定后缀\r\n * @param {string} url url 地址\r\n * @param {Array} types 后缀数组\r\n * @returns\r\n */\r\nexport function checkUrlSuffix(url, types = [], caseSensitive = false) {\r\n if (!url) {\r\n return false;\r\n }\r\n const _url = url?.replace(/\\?.+/, \"\");\r\n const reg = new RegExp(`\\.(${types.join(\"|\")})$`, caseSensitive ? undefined : \"i\");\r\n if (reg.test(_url)) {\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * 获取文件类型(文件自身类型,如:video/mp4、image/jpeg)\r\n * @param file\r\n * @returns\r\n */\r\nexport function getFileType(file) {\r\n if (typeof file === \"object\" && file?.type) {\r\n return file?.type;\r\n }\r\n if (typeof file === \"string\") {\r\n let type = null;\r\n if (checkVideoUrl(file)) {\r\n type = \"video/mp4\";\r\n } else if (checkImageUrl(file)) {\r\n type = \"image/jpeg\";\r\n } else if (checkAudioUrl(file)) {\r\n type = \"audio/3gpp\";\r\n } else if (checkUrlSuffix(file, [\"pdf\"])) {\r\n type = \"application/pdf\";\r\n } else if (checkUrlSuffix(file, [\"xlsx\", \"xls\", \"csv\", \"xlsm\", \"xlsb\"])) {\r\n type = \"application/vnd.ms-excel\";\r\n } else if (checkUrlSuffix(file, [\"doc\", \"docx\"])) {\r\n type = \"application/msword\";\r\n } else if (checkUrlSuffix(file, [\"ppt\", \"pptx\"])) {\r\n type = \"application/vnd.ms-powerpoint\";\r\n }\r\n return type;\r\n }\r\n}\r\n\r\n/**\r\n * 判断 url 是否带有指定图片后缀\r\n * @param {string} url\r\n * @returns\r\n */\r\nexport function checkImageUrl(url) {\r\n // base64\r\n if (/^data:image\\/\\w+;base64/i.test(url)) {\r\n return true;\r\n }\r\n const imgTypes = [\r\n \"apng\",\r\n \"avif\",\r\n \"bmp\",\r\n \"gif\",\r\n \"ico\",\r\n \"cur\",\r\n \"jpg\",\r\n \"jpeg\",\r\n \"jfif\",\r\n \"pjpeg\",\r\n \"pjp\",\r\n \"png\",\r\n \"svg\",\r\n \"tif\",\r\n \"tiff\",\r\n \"webp\",\r\n ];\r\n return checkUrlSuffix(url, imgTypes);\r\n}\r\n\r\n/**\r\n * 判断是否是合法的媒体类型\r\n * @param {String} input\r\n * @returns\r\n */\r\nexport function isValidMediaType(input) {\r\n const validPrefixes = [\"image/\", \"video/\", \"audio/\"];\r\n return validPrefixes.some((prefix) => input?.startsWith(prefix));\r\n}\r\n\r\n/**\r\n * 判断 url 是否带有指定视频后缀\r\n * @param {string} url\r\n * @returns\r\n */\r\nexport function checkVideoUrl(url) {\r\n const imgTypes = [\"3gp\", \"mpg\", \"mpeg\", \"mp4\", \"m4v\", \"m4p\", \"ogv\", \"ogg\", \"mov\", \"webm\"];\r\n return checkUrlSuffix(url, imgTypes);\r\n}\r\n\r\n/**\r\n * 判断 url 是否带有指定音频后缀\r\n * @param {string} url\r\n * @returns\r\n */\r\nexport function checkAudioUrl(url) {\r\n const imgTypes = [\"3gp\", \"adts\", \"mpeg\", \"mp3\", \"mp4\", \"ogg\", \"mov\", \"webm\", \"rtp\", \"amr\", \"wav\"];\r\n return checkUrlSuffix(url, imgTypes);\r\n}\r\n\r\n/**\r\n * 获取文件类型(项目内部枚举,如:图片-image、视频-video)\r\n * @param file\r\n * @returns\r\n */\r\nexport function getFileTypeStr(file) {\r\n const { type, url = file?.ossUrl } = file || {};\r\n let fileType = \"\";\r\n // 判断文件类型,获取对应展示的数据\r\n if (url) {\r\n // 图片\r\n if (url.startsWith(\"data:image/\") || checkImageUrl(url)) {\r\n fileType = TYPE_IMG;\r\n } else if (checkVideoUrl(url)) {\r\n // 视频\r\n fileType = TYPE_VIDEO;\r\n } else if (checkAudioUrl(url)) {\r\n // 音频\r\n fileType = TYPE_AUDIO;\r\n }\r\n } else if (type) {\r\n // 图片\r\n if (type?.startsWith(\"image/\")) {\r\n fileType = TYPE_IMG;\r\n }\r\n\r\n // 视频\r\n if (type?.startsWith(\"video/\")) {\r\n fileType = TYPE_VIDEO;\r\n }\r\n\r\n // 音频\r\n if (type?.startsWith(\"audio/\")) {\r\n fileType = TYPE_AUDIO;\r\n }\r\n }\r\n return fileType || type;\r\n}\r\n\r\n/**\r\n * 根据文件的 MIME 类型 (file.type) 获取对应的文件后缀名\r\n * @param {string} mimeType - 文件的 MIME 类型(如 'image/jpeg'、'application/pdf')\r\n * @returns {string} 返回文件后缀名(带点,如 '.jpg'),未知类型返回 '.unknown'\r\n */\r\nexport const getFileTypeExt = function (mimeType) {\r\n // 常见 MIME 类型到文件后缀的映射表(可根据需求扩展)\r\n const mimeToExtMap = {\r\n // 图片类型\r\n \"image/jpeg\": \"jpg\",\r\n \"image/jpg\": \"jpg\",\r\n \"image/png\": \"png\",\r\n \"image/gif\": \"gif\",\r\n \"image/webp\": \"webp\",\r\n \"image/svg+xml\": \"svg\",\r\n \"image/bmp\": \"bmp\",\r\n \"image/tiff\": \"tiff\",\r\n\r\n // 文档类型\r\n \"application/pdf\": \"pdf\",\r\n \"application/msword\": \"doc\",\r\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": \"docx\",\r\n \"application/vnd.ms-excel\": \"xls\",\r\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": \"xlsx\",\r\n \"application/vnd.ms-powerpoint\": \"ppt\",\r\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\": \"pptx\",\r\n \"text/plain\": \"txt\",\r\n \"text/html\": \"html\",\r\n \"application/json\": \"json\",\r\n\r\n // 音频/视频类型\r\n \"audio/mpeg\": \"mp3\",\r\n \"audio/wav\": \"wav\",\r\n \"video/mp4\": \"mp4\",\r\n \"video/avi\": \"avi\",\r\n \"video/mpeg\": \"mpeg\",\r\n\r\n // 压缩包类型\r\n \"application/zip\": \"zip\",\r\n \"application/x-rar-compressed\": \"rar\",\r\n \"application/x-7z-compressed\": \"7z\",\r\n };\r\n\r\n // 处理空值、非字符串的情况\r\n if (!mimeType || typeof mimeType !== \"string\") {\r\n // return \"unknown\";\r\n return \"\";\r\n }\r\n\r\n // 去除首尾空格,统一转小写(避免大小写不一致问题)\r\n const normalizedMimeType = mimeType.trim().toLowerCase();\r\n\r\n // 优先匹配完整 MIME 类型\r\n if (mimeToExtMap[normalizedMimeType]) {\r\n return mimeToExtMap[normalizedMimeType];\r\n }\r\n\r\n // 兼容部分不标准的 MIME 类型(如只取主类型)\r\n const mainType = normalizedMimeType.split(\"/\")[0];\r\n switch (mainType) {\r\n case \"image\":\r\n return \"img\";\r\n case \"audio\":\r\n return \"audio\";\r\n case \"video\":\r\n return \"video\";\r\n default:\r\n //移动端默认获取源文件类型(后缀名)\r\n return mainType?.match(/[^\\/]*\\/([^\\/]+)$/)?.[1] || mimeType;\r\n }\r\n};\r\n","/**\r\n * 替换 search 字符串\r\n * @param url\r\n * @param search\r\n * @returns\r\n */\r\nexport function replaceSearch(url: string, search: string) {\r\n if (!url || typeof url !== \"string\") {\r\n console.warn(\"Warn replaceSearch: 请传入正确的 url 字符串\");\r\n return url;\r\n }\r\n const _url = fixUrlQuery(url);\r\n\r\n const hashIdx = _url.indexOf(\"#\");\r\n const queryIdx = _url.indexOf(\"?\");\r\n let hash = \"\";\r\n let resUrl = _url;\r\n // 无 query 时也要截掉 hash,否则后面再拼 hash 会重复\r\n if (queryIdx >= 0) {\r\n resUrl = _url.slice(0, queryIdx);\r\n } else if (hashIdx >= 0) {\r\n resUrl = _url.slice(0, hashIdx);\r\n }\r\n if (hashIdx >= 0) {\r\n hash = _url.slice(hashIdx);\r\n }\r\n\r\n resUrl += search?.indexOf(\"?\") >= 0 ? \"\" : \"?\";\r\n resUrl += search;\r\n resUrl += hash;\r\n\r\n return resUrl;\r\n}\r\n\r\n/**\r\n * 把对象转为 query 参数\r\n * @param query\r\n */\r\nexport function objToSearch(query, opt) {\r\n if (!query || typeof query !== \"object\") {\r\n console.warn(\"Warn objToSearch: 请传入正确的对象\");\r\n return;\r\n }\r\n // @deprecated 兼容老的入参写法\r\n let hasQuery = opt?.hasQuery;\r\n if (typeof opt === \"boolean\") {\r\n hasQuery = opt;\r\n }\r\n const { isEncode } = opt || {};\r\n let search = hasQuery ? \"?\" : \"\";\r\n Object.keys(query).forEach((key) => {\r\n if (search && search != \"?\") {\r\n search += \"&\";\r\n }\r\n const _key = isEncode ? encodeURIComponent(key) : key;\r\n search += _key;\r\n search += \"=\";\r\n const val = isEncode ? encodeURIComponent(query[key]) : query[key];\r\n search += val;\r\n });\r\n return search;\r\n}\r\n\r\n/**\r\n * 修复 query,解决 query 在 hash 后面的情况\r\n * @param url\r\n * @returns\r\n * 源数据:/#/login?a=1&b=2\r\n * 结果:/?a=1&b=2#/login\r\n */\r\nexport function fixUrlQuery(url) {\r\n if (!url || typeof url !== \"string\") {\r\n console.warn(\"Warn handleUrlQuery: 请传入正确的 url 字符串\");\r\n return url;\r\n }\r\n const hashIdx = url.indexOf(\"#\");\r\n const queryIdx = url.indexOf(\"?\");\r\n\r\n // 双 query 情况\r\n if (queryIdx < hashIdx) {\r\n let hash = url.slice(hashIdx);\r\n const hashQueryIdx = hash.indexOf(\"?\");\r\n if (hashQueryIdx >= 0) {\r\n const _url = url.slice(0, queryIdx);\r\n const urlQuery = url.slice(queryIdx, hashIdx)?.replace(/\\/$/, \"\");\r\n const hashQuery = hash.slice(hashQueryIdx)?.replace(\"?\", \"\")?.replace(/\\/$/, \"\");\r\n hash = hash.slice(0, hashQueryIdx);\r\n return `${_url}${urlQuery}&${hashQuery}${hash}`;\r\n }\r\n return url;\r\n }\r\n\r\n // query 在 hash # 之后\r\n if (queryIdx >= 0 && hashIdx >= 0 && queryIdx > hashIdx) {\r\n const hash = url.slice(hashIdx, queryIdx);\r\n const search = url.slice(queryIdx);\r\n return `${url.slice(0, hashIdx)}${search}${hash}`;\r\n }\r\n return url;\r\n}\r\n\r\n/**\r\n * 获取 url 中的 query 值的对象\r\n * 支持:完整 URL、`?a=1`、`&a=1`、纯 `a=1&b=2`\r\n * @param query\r\n */\r\nexport function searchToObj(url) {\r\n if (!url || typeof url !== \"string\") {\r\n console.warn(\"Warn getSearchParams: 请传入正确的 url 字符串.\");\r\n return;\r\n }\r\n\r\n let queryBody;\r\n if (url.includes(\"?\")) {\r\n const _url = fixUrlQuery(url)\r\n // 解决 query 在 /# 之前导致 query 参数多了 / 的问题\r\n .replace(\"/#\", \"#\");\r\n const queryIdx = _url.indexOf(\"?\");\r\n const hashIdx = _url.indexOf(\"#\");\r\n if (queryIdx < 0) {\r\n return;\r\n }\r\n // 去除 hash 相关数据及 query 的 \"?\"\r\n queryBody = hashIdx >= 0 ? _url.slice(queryIdx + 1, hashIdx) : _url.slice(queryIdx + 1);\r\n } else {\r\n // 纯 query:`a=1&b=2` / `&a=1`(无 ? 且非完整 URL)\r\n const bare = url.replace(/^[?&]+/, \"\").split(\"#\")[0];\r\n if (!bare || !bare.includes(\"=\") || url.includes(\"://\")) {\r\n return;\r\n }\r\n queryBody = bare;\r\n }\r\n if (!queryBody) {\r\n return;\r\n }\r\n\r\n const res = {};\r\n queryBody.split(\"&\")?.forEach((it) => {\r\n if (!it) {\r\n return;\r\n }\r\n const eqIdx = it.indexOf(\"=\");\r\n const rawKey = eqIdx >= 0 ? it.slice(0, eqIdx) : it;\r\n const rawVal = eqIdx >= 0 ? it.slice(eqIdx + 1) : \"\";\r\n try {\r\n res[decodeURIComponent(rawKey)] = decodeURIComponent(rawVal);\r\n } catch {\r\n // 非法转义序列:保留原值,避免整段解析抛错\r\n res[rawKey] = rawVal;\r\n }\r\n });\r\n return res;\r\n}\r\n\r\n/**\r\n * 添加 url 中的 query 的参数\r\n * @param url\r\n * @param params\r\n * @param opt.isEncode 是否对 key/value 做 encodeURIComponent(默认 false,保持 1.x 既有输出)\r\n * @returns url string\r\n */\r\nexport function addQuery(url, params, opt: { isEncode?: boolean } = {}) {\r\n const newObj = { ...searchToObj(url), ...params };\r\n return replaceSearch(url, objToSearch(newObj, { hasQuery: !!params, isEncode: opt?.isEncode }));\r\n}\r\n\r\n/**\r\n * 添加 url 中的 query 参数,返回 search\r\n * @param url\r\n * @param params\r\n * @param opt.isEncode 是否对 key/value 做 encodeURIComponent(默认 false,保持 1.x 既有输出)\r\n * @returns search string\r\n */\r\nexport function addSearch(\r\n url: string,\r\n params: Record<string, unknown>,\r\n opt: { isEncode?: boolean } = {},\r\n) {\r\n const newObj = { ...searchToObj(url), ...params };\r\n return objToSearch(newObj, { hasQuery: !!params, isEncode: opt?.isEncode });\r\n}\r\n","import dayjs from \"dayjs\";\r\n\r\nimport { getArr } from \"../array\";\r\nimport { isBase64Str } from \"../base64Str\";\r\n\r\nimport { mergeFileName, getFileName, getFileNameExt } from \"../file/fileName\";\r\nimport { getFileTypeExt } from \"../file/fileType\";\r\nimport { nanoidNumALetters } from \"../nanoid\";\r\nimport { addQuery, searchToObj } from \"../url\";\r\n\r\n/** 预览配置(旧版 getPreviewUrl) */\r\nexport interface IPreviewConfig {\r\n /** 预览域名或路径前缀 */\r\n url?: string;\r\n /** 额外 query(不含 ?) */\r\n query?: string;\r\n}\r\n\r\n/** getFileNameByFileObj 入参文件对象 */\r\nexport interface IFileNameSource {\r\n name?: string;\r\n type?: string;\r\n url?: string;\r\n createTime?: string | number;\r\n}\r\n\r\n/** getFileNameByFileObj 配置项 */\r\nexport interface IGetFileNameByFileObjOpt {\r\n /** 是否开启 Hash 命名 */\r\n useHashName?: boolean;\r\n params?: {\r\n /** 指定文件名 */\r\n fileName?: string;\r\n [key: string]: any;\r\n };\r\n}\r\n\r\n/** 含 previewUrl / url 的文件类对象 */\r\nexport interface IPreviewFileLike {\r\n previewUrl?: string;\r\n url?: string;\r\n [key: string]: any;\r\n}\r\n\r\n/** mergePreviewConfig 配置项 */\r\nexport interface IMergePreviewConfig {\r\n /** 预览域名或路径前缀(有值才拼接) */\r\n url?: string;\r\n /** url 别名 */\r\n baseUrl?: string;\r\n /** query 对象,优先推荐 */\r\n query?: Record<string, any>;\r\n /** `?` 后的原始字符串(不含 ?),会先解析再与 query 合并;同名键以 query 为准 */\r\n search?: string;\r\n}\r\n\r\n/**\r\n * 格式化 dir 字符串,必须为非 / 开头, / 结尾。如: test/\r\n * @param dir\r\n * @returns\r\n */\r\nexport const formatDirStr = function (dir?: string | null): string | undefined {\r\n return dir?.replace(/^\\/(.*)\\/*$/, \"$1\").replace(/(.?=*)\\/*$/, \"$1/\");\r\n};\r\n\r\n/**\r\n * 合并 dir 字符串\r\n * @param dir1\r\n * @param dir2\r\n */\r\nexport const mergeDirStr = function (dir1?: string | null, dir2?: string | null): string {\r\n return `${formatDirStr(dir1 || \"\")}${formatDirStr(dir2 || \"\")}`;\r\n};\r\n\r\n/**\r\n * 限制文件数量\r\n * @param fileList\r\n * @param maxCount\r\n * @returns\r\n */\r\nexport function handleMaxCount<T>(fileList: T | T[] | null | undefined, maxCount?: number): T[] {\r\n let list = getArr(fileList) as T[];\r\n if (maxCount > 0 && list.length > maxCount) {\r\n list = list.slice(0, maxCount);\r\n }\r\n return list;\r\n}\r\n\r\n/**\r\n * 获取预览 url\r\n * @param uri\r\n * @param previewConfig\r\n * @returns\r\n */\r\nexport function getPreviewUrl(uri: string, previewConfig?: IPreviewConfig): string {\r\n const isUriPattern = /http[s]?:\\/\\/[^\\s]+/.test(uri);\r\n const query = previewConfig?.query ? \"?\" + previewConfig?.query : \"\";\r\n\r\n if (isUriPattern) return `${uri}${query}`?.trim();\r\n\r\n if (previewConfig) return `${previewConfig?.url}/${uri}${query}`?.trim();\r\n\r\n return uri;\r\n}\r\n\r\n/**\r\n * 根据 file 对象获取文件名称,文件名称包含:初始名称、类型\r\n * 数据存储格式 ~k[key]-[data]~ 如: ~ktime-1743649562530~\r\n * key、data 中的 ~ 转为 _\r\n * @param file\r\n * @param opt\r\n */\r\nexport const getFileNameByFileObj = (file: IFileNameSource, opt?: IGetFileNameByFileObjOpt): string => {\r\n const {\r\n useHashName = true,\r\n params: { fileName = \"\" } = {}, // 给 params 加默认空对象\r\n } = opt || {};\r\n\r\n const _fullFileName = file.name || fileName || \"\";\r\n\r\n const { mainPart, ext } = getFileNameExt(_fullFileName);\r\n\r\n console.log(\"getFileTypeExt(file.type)\", file.type, getFileTypeExt(file.type));\r\n\r\n const _fileName = mainPart || _fullFileName || getFileName(file.url) || \"file\";\r\n\r\n const _ext = ext || getFileTypeExt(file.type);\r\n\r\n const hashStr = useHashName ? nanoidNumALetters() : \"\";\r\n const nm = mergeFileName(\r\n _fileName + \".\" + _ext,\r\n _fileName.indexOf(\"~kid-\") < 0 ? `~kid-${hashStr}-${file.createTime || dayjs().valueOf()}-${ext}` : \"\",\r\n );\r\n\r\n return nm;\r\n};\r\n\r\n/**\r\n * 解析文件名中的 ~k[key]-[data]~ 键值对\r\n * @param url\r\n * @returns\r\n */\r\nexport const getFileNameObj = function (url: string): Record<string, string> {\r\n const list = url.match(/~k([^-~]+)-([^~]*)~/g);\r\n const res: Record<string, string> = {};\r\n list?.forEach((it) => {\r\n const arr = it?.match(/~k([^-~]+)-([^~]*)~/);\r\n if (arr?.length >= 3) {\r\n res[arr[1]] = arr[2];\r\n }\r\n });\r\n return res;\r\n};\r\n\r\n/**\r\n * 将对象序列化为 ~k[key]-[data]~ 字符串\r\n * @param obj\r\n * @returns\r\n */\r\nexport function setFileNameObj(obj: Record<string, any>): string {\r\n return Object.keys(obj)\r\n .map((key) => {\r\n return `~k${key?.replace(/~/g, \"_\")}-${obj[key]?.toString()?.replace(/~/g, \"_\")}~`;\r\n })\r\n .join(\"\");\r\n}\r\n\r\n/**\r\n * 通过 key 获取对应的值\r\n * @param url\r\n * @param key\r\n * @returns\r\n */\r\nexport const getValByKey = function (url: string, key: string): string | undefined {\r\n const reg = new RegExp(`~k${key?.replace(/~/g, \"_\")}-\\([^~]*\\)~`);\r\n return url.match(reg)?.[1];\r\n};\r\n\r\n/**\r\n * 是否为无需再拼前缀的绝对/特殊地址\r\n * @param uri\r\n */\r\nfunction isAbsoluteOrSpecialUrl(uri?: string | null): boolean {\r\n if (!uri) {\r\n return false;\r\n }\r\n if (isBase64Str(uri)) {\r\n return true;\r\n }\r\n // http(s)://、协议相对 //、data:、blob:\r\n if (/^(https?:)?\\/\\//i.test(uri) || /^(data|blob):/i.test(uri)) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * 预览 url 添加前缀(仅用于预览展示,不应用于表单提交值)\r\n * @param uri 相对路径、完整 url,或含 previewUrl/url 的文件对象\r\n * @param conf\r\n * - url / baseUrl: 预览域名或路径前缀(有值才拼接)\r\n * - query: query 对象,优先推荐\r\n * - search: `?` 后的原始字符串(不含 ?),会先解析再与 query 合并;同名键以 query 为准\r\n * @returns\r\n */\r\nexport function mergePreviewConfig(\r\n uri: string | IPreviewFileLike | null | undefined,\r\n conf?: IMergePreviewConfig,\r\n): string | undefined {\r\n let _uri: string | undefined = typeof uri === \"string\" ? uri : undefined;\r\n if (typeof uri === \"object\" && uri) {\r\n _uri = uri.previewUrl || uri.url;\r\n }\r\n if (typeof _uri !== \"string\") {\r\n return _uri;\r\n }\r\n _uri = _uri.trim();\r\n if (!_uri) {\r\n return _uri;\r\n }\r\n\r\n const baseUrl = (conf?.url ?? conf?.baseUrl)?.trim?.() || \"\";\r\n const searchStr = conf?.search?.trim() || \"\";\r\n const searchParams = searchStr ? searchToObj(`?${searchStr}`) || {} : {};\r\n const query = conf?.query && typeof conf.query === \"object\" ? conf.query : {};\r\n const queryParams = { ...searchParams, ...query };\r\n const hasQuery = Object.keys(queryParams).length > 0;\r\n\r\n let result = _uri;\r\n // 已是完整/特殊地址:不二次拼前缀,仅按需挂 query\r\n if (!isAbsoluteOrSpecialUrl(_uri) && baseUrl) {\r\n // 仅当配置了有效前缀时才拼接,避免 conf 为空对象时拼出 \"undefined/xxx\"\r\n result = `${baseUrl.replace(/\\/$/, \"\")}/${_uri.replace(/^\\//, \"\")}`.trim();\r\n }\r\n\r\n return hasQuery ? addQuery(result, queryParams) : result;\r\n}\r\n","import dayjs from \"dayjs\";\r\nimport type { Axios, AxiosResponse, AxiosRequestConfig } from \"axios\";\r\n\r\nimport { axios } from \"@hzab/data-model\";\r\nimport { formatDirStr } from \"./uploadUtils\";\r\nimport { getGlobalServeConfig } from \"../globalConfig\";\r\nconst isPublicMap = {\r\n 0: \"&\",\r\n 1: \"?\",\r\n};\r\n/**\r\n * getSignature 配置\r\n */\r\nexport interface IGetSignatureOpt {\r\n /** 获取配置的接口地址 */\r\n serverUrl?: string;\r\n /** axios 实例 */\r\n axios?: Axios;\r\n /** axios 配置参数 */\r\n axiosConf?: AxiosRequestConfig;\r\n /** 获取配置的接口自定义入参 */\r\n params?: {\r\n /** 文件路径 */\r\n dir?: string;\r\n /** 是否是公开库 */\r\n isPublic?: number;\r\n };\r\n}\r\n\r\n/**\r\n * OssUpload props 参数\r\n */\r\nexport interface IOssUploadProps {\r\n /** axios 实例 */\r\n axios?: Axios;\r\n /** axios 配置参数 */\r\n axiosConf?: AxiosRequestConfig;\r\n /** 获取配置的接口地址 */\r\n serverUrl?: string;\r\n /** 获取配置的接口自定义入参 */\r\n signatureParams?: {\r\n /** 文件路径 */\r\n dir?: string;\r\n /** 是否是公开库 */\r\n isPublic?: number;\r\n /** 是否无前缀 */\r\n withoutPrefix?: boolean;\r\n };\r\n}\r\n\r\nexport interface IUploadOpt {\r\n fileName?: string;\r\n /** axios 实例 */\r\n axios?: Axios;\r\n /** axios 配置参数 */\r\n axiosConf?: AxiosRequestConfig;\r\n /** 获取配置的接口地址 */\r\n serverUrl?: string;\r\n /** 获取配置的接口自定义入参 */\r\n params?: {\r\n /** 文件路径 */\r\n dir?: string;\r\n /** 是否是公开库 */\r\n isPublic?: number;\r\n };\r\n /**\r\n * 获取配置接口请求入参\r\n */\r\n signatureParams?: {\r\n /** 公开还是私有 */\r\n isPublic?: number;\r\n };\r\n /** 文件上传的接口自定义入参 */\r\n ossParams?: {};\r\n /** 是否使用 hash 文件名 */\r\n useHashName?: boolean;\r\n /**缩略图参数 */\r\n thumbnailParams?: string;\r\n}\r\n\r\nexport interface ResponseData extends AxiosResponse {\r\n fileUrl: string;\r\n thumbnailUrl?: string;\r\n}\r\n\r\nexport function getSignature(opt: IGetSignatureOpt = {}) {\r\n const { serverUrl = getGlobalServeConfig()?.serverUrl || \"/api/v1/user/oss/getWebOssConfig\" } = opt;\r\n // 减 10 秒,避免发起请求时 刚好过期的情况\r\n if (\r\n window._$ossSignatureRes &&\r\n serverUrl === window._$ossSignatureRes.serverUrl &&\r\n dayjs().valueOf() - window._$ossSignatureRes.__saveTime < window._$ossSignatureRes.expireTimeMilles - 10000\r\n ) {\r\n return Promise.resolve(window._$ossSignatureRes);\r\n }\r\n const { axios: _ax = axios, params = {}, axiosConf } = opt;\r\n // 处理 dir 格式,必须为非 / 开头, / 结尾。如: test/\r\n params.dir = formatDirStr(params.dir);\r\n\r\n return _ax\r\n .get(serverUrl, {\r\n ...axiosConf,\r\n params: {\r\n isPublic: 1,\r\n ...params,\r\n },\r\n })\r\n .then((res) => {\r\n window._$ossSignatureRes = res?.data?.data ?? res?.data ?? res;\r\n if (window._$ossSignatureRes) {\r\n window._$ossSignatureRes.__saveTime = dayjs().valueOf();\r\n window._$ossSignatureRes.serverUrl = serverUrl;\r\n }\r\n return window._$ossSignatureRes;\r\n });\r\n}\r\n\r\n/**\r\n * oss 上传工具类\r\n */\r\nclass OssUploadUtil {\r\n /** axios 实例 */\r\n axios: Axios;\r\n /** axios 配置参数 */\r\n axiosConf: AxiosRequestConfig;\r\n /** 获取配置的接口地址 */\r\n serverUrl: string;\r\n /** 获取配置的接口自定义入参 */\r\n signatureParams?: {\r\n /** 文件路径 */\r\n dir?: string;\r\n /** 是否是公开库 */\r\n isPublic?: number;\r\n /** 是否无前缀 */\r\n withoutPrefix?: boolean;\r\n };\r\n\r\n constructor(props: IOssUploadProps = {}) {\r\n this.axios = props.axios || axios;\r\n this.axiosConf = props.axiosConf || {};\r\n this.serverUrl = props.serverUrl || getGlobalServeConfig()?.serverUrl || \"/api/v1/user/oss/getWebOssConfig\";\r\n this.signatureParams = props.signatureParams || {};\r\n }\r\n\r\n getSignature(serverUrl = this.serverUrl, opt) {\r\n return this._getSignature(serverUrl, opt);\r\n }\r\n\r\n upload(file, opt: IUploadOpt = {}): Promise<{ fileUrl: string }> {\r\n return this._upload(file, { ...opt });\r\n }\r\n\r\n _getSignature(serverUrl = this.serverUrl, opt) {\r\n return getSignature({\r\n ...opt,\r\n serverUrl,\r\n axios: opt?.axios || this.axios,\r\n axiosConf: { ...this.axiosConf, ...opt?.axiosConf },\r\n });\r\n }\r\n\r\n _upload(file, opt: IUploadOpt = {}): Promise<{ fileUrl: string }> {\r\n return new Promise(async (resolve, reject) => {\r\n const ossParams = await this._getSignature(opt.serverUrl || this.serverUrl, {\r\n ...opt,\r\n params: { ...this.signatureParams, ...opt.params },\r\n });\r\n\r\n const { ossParams: propOssParams, fileName } = opt || {};\r\n const formData = new FormData();\r\n // key 表示上传到 Bucket 内的 Object 的完整路径,例如 exampledir/exampleobject.txtObject,完整路径中不能包含 Bucket 名称。\r\n // filename 表示待上传的本地文件名称。\r\n const filename = fileName || file.name;\r\n const key = `${ossParams?.dir}${filename}`;\r\n formData.set(\"key\", key);\r\n formData.set(\"OSSAccessKeyId\", ossParams.accessid);\r\n formData.set(\"policy\", ossParams.policy);\r\n formData.set(\"Signature\", ossParams.signature);\r\n if (ossParams.callback) {\r\n formData.set(\"callback\", ossParams.callback);\r\n }\r\n // @ts-ignore\r\n formData.set(\"success_action_status\", 200);\r\n formData.set(\"file\", file);\r\n\r\n if (propOssParams) {\r\n for (const key in propOssParams) {\r\n if (Object.hasOwnProperty.call(propOssParams, key)) {\r\n formData.set(key, propOssParams[key]);\r\n }\r\n }\r\n }\r\n\r\n const _axios = opt?.axios || this.axios;\r\n\r\n return _axios\r\n .post(ossParams.host, formData, { ...this.axiosConf, ...opt?.axiosConf })\r\n .then((res: ResponseData) => {\r\n if (getGlobalServeConfig()?.showThumbnail) {\r\n res.data.data.thumbnailUrl = `${res?.data?.data?.fileUrl}${\r\n opt?.thumbnailParams ? isPublicMap[opt?.signatureParams?.isPublic] + opt?.thumbnailParams : \"\"\r\n }`;\r\n }\r\n resolve(res);\r\n return res;\r\n })\r\n .catch((err) => {\r\n console.error(\"oss upload err\", err);\r\n reject(err);\r\n return Promise.reject(err);\r\n });\r\n });\r\n }\r\n}\r\n\r\nexport { axios };\r\n\r\nexport default OssUploadUtil;\r\n","import OssUploads from \"./upload/OssUploadUtil\";\r\nimport { nanoidUrl } from './nanoid'\r\n/**\r\n * 将对象序列化为 JSON 字符串,然后转换为 Blob 二进制流\r\n * @param {Object} obj - 需要转换的对象\r\n * @param {string} [charset='utf-8'] - 字符集的 charset\r\n * @returns {Blob} - 转换后的 Blob 对象\r\n */\r\nfunction objToBlob(obj: object, charset = \"utf-8\") {\r\n const jsonStr = JSON.stringify(obj);\r\n const blob = new Blob([jsonStr], {\r\n type: `application/json;charset=${charset}`,\r\n });\r\n return blob;\r\n}\r\n\r\n\r\n// 定义更清晰的类型\r\n\r\ninterface CodeOptProps {\r\n baseUrl?: string;\r\n env: \"test\" | \"prod\";\r\n}\r\n\r\n/**\r\n * 获取二维码信息\r\n * @param id 二维码ID(字符串或数字类型)\r\n * @param opt 配置项\r\n * @returns Promise 对象,便于外部处理异步逻辑\r\n */\r\nconst getCodeInfo = async (\r\n id: string | number,\r\n opt: CodeOptProps\r\n): Promise<unknown> => {\r\n const { env, baseUrl } = opt;\r\n try {\r\n const url = ` ${baseUrl || \"https://open-oss.abt.hzabjt.com\"}/qr-code/${env}/${String(id)}`;\r\n const response = await fetch(url);\r\n const data = await response.json();\r\n\r\n return data;\r\n } catch (error) {\r\n throw error;\r\n }\r\n};\r\n\r\n\r\n\r\n\r\n\r\n/**\r\n * 设置二维码信息\r\n * @param value 二维码信息对象\r\n * @param opt 配置项\r\n * @returns Promise 对象,便于外部处理异步逻辑\r\n */\r\nconst setCodeInfo = async (\r\n value: object,\r\n opt: CodeOptProps\r\n\r\n): Promise<unknown> => {\r\n const { env } = opt;\r\n\r\n try {\r\n const id = nanoidUrl();\r\n const file = objToBlob(value) as File;\r\n const ossUploader = new OssUploads({signatureParams: {withoutPrefix: true}});\r\n const uploadResult = await ossUploader.upload(file, {\r\n fileName: id,\r\n params: {\r\n dir: `/qr-code/${env}`,\r\n },\r\n }) as any;\r\n const fileUrl = uploadResult?.data?.data?.fileUrl;\r\n return {\r\n fileUrl,\r\n id\r\n };\r\n } catch (error) {\r\n throw error;\r\n }\r\n};\r\n\r\n\r\nexport { getCodeInfo, setCodeInfo };\r\n","/**\r\n * 获取视窗宽高\r\n * @returns\r\n */\r\nexport function getClientStyle() {\r\n return {\r\n width: document.documentElement.clientWidth || document.body.clientWidth,\r\n height: document.documentElement.clientHeight || document.body.clientHeight,\r\n };\r\n}\r\n\r\n/**\r\n * 视窗宽高\r\n */\r\nexport const clientStyle = getClientStyle();\r\n\r\nwindow.addEventListener(\"resize\", () => {\r\n const { width, height } = getClientStyle();\r\n clientStyle.width = width;\r\n clientStyle.height = height;\r\n});\r\n\r\n/**\r\n * 获取当前视窗 1vw、1vh 对应的 px\r\n */\r\nexport function getViewportPX() {\r\n const { width, height } = clientStyle;\r\n return {\r\n wPx: width / 100,\r\n hPx: height / 100,\r\n };\r\n}\r\n\r\n// 视觉稿默认的宽高 px\r\n// TODO: 按需修改\r\nexport const DEFAULT_SIZE = {\r\n width: 750,\r\n height: 1334,\r\n};\r\n\r\nexport function setDefaultSize(width, height) {\r\n DEFAULT_SIZE.width = width || 750;\r\n DEFAULT_SIZE.height = height || 1334;\r\n}\r\n\r\n/**\r\n * 获取视窗与视觉稿的比例\r\n * @param current\r\n * @param defaultVal\r\n * @returns\r\n */\r\nexport function getClientRate(current, defaultVal) {\r\n return parseFloat(current) / defaultVal;\r\n}\r\n\r\n/**\r\n * 获取默认宽度对应的 vw 值\r\n */\r\nexport function getVW(pxNum = 0) {\r\n return `${getClientRate(pxNum, DEFAULT_SIZE.width) * 100}vw`;\r\n}\r\n\r\n/**\r\n * 获取默认高度对应的 vh 值\r\n */\r\nexport function getVH(pxNum = 0) {\r\n return `${getClientRate(pxNum, DEFAULT_SIZE.height) * 100}vh`;\r\n}\r\n\r\n/**\r\n * 获取默认宽度对应的 px 值\r\n * 适用于必须传入 px 值的情况,如 ECharts\r\n */\r\nexport function getWpx(pxNum = 0) {\r\n return getClientRate(pxNum, DEFAULT_SIZE.width) * clientStyle.width;\r\n}\r\n\r\n/**\r\n * 获取默认高度对应的 px 值\r\n * 适用于必须传入 px 值的情况,如 ECharts\r\n */\r\nexport function getHpx(pxNum = 0) {\r\n return getClientRate(pxNum, DEFAULT_SIZE.height) * clientStyle.height;\r\n}\r\n\r\n/**\r\n * 通过 vw 获取对应的 px\r\n * @param {number} vw\r\n */\r\nexport function getHPxByVW(vw = 0) {\r\n let _vw = vw;\r\n if (typeof _vw === \"string\") {\r\n _vw = parseFloat(_vw);\r\n }\r\n return clientStyle.width * (_vw / 100);\r\n}\r\n\r\n/**\r\n * 通过 vh 获取对应的 px\r\n * @param {number} vh\r\n */\r\nexport function getWPxByVH(vh = 0) {\r\n let _vh = vh;\r\n if (typeof _vh === \"string\") {\r\n _vh = parseFloat(_vh);\r\n }\r\n return clientStyle.height * (_vh / 100);\r\n}\r\n","/**\r\n * 字符串中划线转为小驼峰\r\n * @param s\r\n * @returns\r\n */\r\nexport const convertToCamelCase = function (s) {\r\n return s.replace(/-(\\w)/g, function (all, letter) {\r\n return letter.toUpperCase();\r\n });\r\n};\r\n\r\n/**\r\n * 对象字符串转为对象\r\n * @param objStr\r\n */\r\nexport const objStrToObj = function (objStr) {\r\n let _objStr = objStr;\r\n if (typeof _objStr === \"object\") {\r\n return _objStr;\r\n }\r\n // 对象字符串 转为 对象\r\n if (typeof _objStr === \"string\") {\r\n _objStr = _objStr.trim();\r\n if (/^\\[.*\\]$|^\\{.*\\}$/.test(_objStr)) {\r\n try {\r\n _objStr = JSON.parse(_objStr);\r\n } catch (error) {}\r\n }\r\n }\r\n return _objStr;\r\n};\r\n","export interface IFile extends File {\r\n file?: IFile;\r\n url?: string;\r\n}\r\n\r\n/**\r\n * 建立一个可以存取该 file 的 url\r\n * @param {Object} file 文件\r\n * @returns {string} url\r\n * blob:http://localhost:8000/c9950644-5118-4231-9be7-8183bde1fdc7\r\n */\r\nexport function getFileURL(file: IFile) {\r\n const _file: IFile = file?.file || file;\r\n if (!(_file instanceof File)) {\r\n return;\r\n }\r\n\r\n const url = _file.url || null;\r\n\r\n try {\r\n // 下面函数执行的效果是一样的,只是需要针对不同的浏览器执行不同的 js 函数而已\r\n const win = window as typeof window & { createObjectURL?: (file: unknown) => string };\r\n if (win.createObjectURL != undefined) {\r\n // basic\r\n return win.createObjectURL(_file);\r\n } else if (window.URL != undefined) {\r\n // mozilla(firefox)\r\n return window.URL.createObjectURL(_file);\r\n } else if (window.webkitURL != undefined) {\r\n // webkit or chrome\r\n return window.webkitURL.createObjectURL(_file);\r\n }\r\n } catch (error) {\r\n console.warn(\"getFileURL Error: \", error);\r\n }\r\n\r\n return url;\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,63 +1,61 @@
1
1
  {
2
2
  "name": "@hzab/utils",
3
- "version": "1.1.6",
3
+ "version": "1.1.7",
4
+ "private": false,
5
+ "src-direct": true,
6
+ "type": "module",
4
7
  "description": "utils",
5
- "main": "src",
6
- "scripts": {
7
- "dev": "webpack serve -c ./config/webpack.config.js --env local",
8
- "build": "webpack -c ./config/webpack.config.js --env production",
9
- "version:alpha": "npm version prerelease --preid=alpha",
10
- "publish:alpha": "npm publish --tag alpha",
11
- "version:beta": "npm version prerelease --preid=beta",
12
- "publish:beta": "npm publish --tag beta",
13
- "version:patch": "npm version patch",
14
- "version:minior": "npm version minor",
15
- "version:major": "npm version major",
16
- "publish:stable": "npm publish --access public",
17
- "prepare": "husky install",
18
- "mac-chmod": "chmod +x .husky && chmod +x .husky/pre-commit",
19
- "docs": "typedoc"
8
+ "license": "ISC",
9
+ "author": "CaiYansong",
10
+ "engines": {
11
+ "node": ">=24"
20
12
  },
13
+ "main": "src",
14
+ "types": "./dist/index.d.ts",
21
15
  "files": [
22
- "CHANGELOG.md",
23
- "src"
16
+ "src",
17
+ "dist",
18
+ "CHANGELOG.md"
24
19
  ],
25
- "keywords": [],
26
- "author": "CaiYansong",
27
- "license": "ISC",
20
+ "sideEffects": [
21
+ "./src/globalConfig.ts"
22
+ ],
23
+ "peerDependencies": {
24
+ "axios": ">=1.6.2",
25
+ "react": ">=16.8.0",
26
+ "react-dom": ">=16.8.0"
27
+ },
28
+ "dependencies": {
29
+ "@hzab/data-model": ">=2.0.3",
30
+ "dayjs": "^1.11.7",
31
+ "lodash": "^4.18.1",
32
+ "lodash-es": "^4.18.1",
33
+ "nanoid": "^3.3.7"
34
+ },
28
35
  "devDependencies": {
29
- "@hzab/data-model": "^1.8.1",
30
- "@hzab/permissions": "^1.0.0",
31
- "@hzab/webpack-config": "^1.1.2",
36
+ "@types/lodash": "^4.17.12",
37
+ "@types/lodash-es": "^4.17.12",
32
38
  "@types/react": "^17.0.62",
33
39
  "@types/react-dom": "^17.0.20",
34
- "antd": "^4.24.16",
35
- "axios": "^1.4.0",
36
- "eslint": "^8.30.0",
37
- "less": "^4.1.3",
40
+ "@vitest/coverage-v8": "4.1.10",
41
+ "axios": "^1.6.2",
42
+ "dayjs": "^1.11.7",
43
+ "happy-dom": "^20.11.1",
38
44
  "lodash-es": "^4.18.1",
39
- "mobx": "^6.7.0",
40
- "mobx-react": "^7.6.0",
41
45
  "nanoid": "^3.3.7",
42
46
  "react": "^17.0.2",
43
47
  "react-dom": "^17.0.2",
44
- "react-router-dom": "^6.14.1",
45
- "typedoc": "^0.24.8",
46
- "typescript": "^4.9.4"
48
+ "tsup": "^8.5.1",
49
+ "typescript": "^5.9.3",
50
+ "vitest": "^4.1.10",
51
+ "@hzab/eslint-config": "^0.0.0",
52
+ "@hzab/vite-config": "^0.0.3-alpha.0",
53
+ "@hzab/typescript-config": "^0.0.0"
47
54
  },
48
- "directories": {
49
- "src": "src"
50
- },
51
- "peerDependencies": {
52
- "@hzab/data-model": ">=1.2.0",
53
- "axios": ">=1.6.2",
54
- "react": ">=16.8.0",
55
- "react-dom": ">=16.8.0"
56
- },
57
- "lint-staged": {
58
- "**.{js,jsx,ts,tsx,css,scss,less,json,html}": [
59
- "prettier --write"
60
- ]
61
- },
62
- "dependencies": {}
63
- }
55
+ "scripts": {
56
+ "build": "tsup",
57
+ "typecheck": "tsc --noEmit -p tsconfig.json",
58
+ "test": "vitest run --passWithNoTests",
59
+ "test:watch": "vitest"
60
+ }
61
+ }
package/src/color.ts CHANGED
@@ -217,8 +217,8 @@ export function adjustTextColor(hexColor) {
217
217
  let textR = 255,
218
218
  textG = 255,
219
219
  textB = 255;
220
- let textLuminance = luminance(textR, textG, textB);
221
- let ratio = contrastRatio(bgLuminance, textLuminance);
220
+ const textLuminance = luminance(textR, textG, textB);
221
+ const ratio = contrastRatio(bgLuminance, textLuminance);
222
222
  if (ratio < targetContrast) {
223
223
  textR = 230;
224
224
  textG = 230;
@@ -230,8 +230,8 @@ export function adjustTextColor(hexColor) {
230
230
  let textR = 0,
231
231
  textG = 0,
232
232
  textB = 0;
233
- let textLuminance = luminance(textR, textG, textB);
234
- let ratio = contrastRatio(bgLuminance, textLuminance);
233
+ const textLuminance = luminance(textR, textG, textB);
234
+ const ratio = contrastRatio(bgLuminance, textLuminance);
235
235
  if (ratio < targetContrast) {
236
236
  textR = 20;
237
237
  textG = 20;
@@ -245,8 +245,8 @@ export function adjustTextColor(hexColor) {
245
245
  let textR = 255,
246
246
  textG = 255,
247
247
  textB = 255;
248
- let textLuminance = luminance(textR, textG, textB);
249
- let ratio = contrastRatio(bgLuminance, textLuminance);
248
+ const textLuminance = luminance(textR, textG, textB);
249
+ const ratio = contrastRatio(bgLuminance, textLuminance);
250
250
  if (ratio < targetContrast) {
251
251
  textR = 230;
252
252
  textG = 230;
@@ -258,8 +258,8 @@ export function adjustTextColor(hexColor) {
258
258
  let textR = 0,
259
259
  textG = 0,
260
260
  textB = 0;
261
- let textLuminance = luminance(textR, textG, textB);
262
- let ratio = contrastRatio(bgLuminance, textLuminance);
261
+ const textLuminance = luminance(textR, textG, textB);
262
+ const ratio = contrastRatio(bgLuminance, textLuminance);
263
263
  if (ratio < targetContrast) {
264
264
  textR = 20;
265
265
  textG = 20;
package/src/file/file.ts CHANGED
@@ -15,13 +15,14 @@ export function getFileURL(file: IFile) {
15
15
  return;
16
16
  }
17
17
 
18
- let url = _file.url || null;
18
+ const url = _file.url || null;
19
19
 
20
20
  try {
21
21
  // 下面函数执行的效果是一样的,只是需要针对不同的浏览器执行不同的 js 函数而已
22
- if (window.createObjectURL != undefined) {
22
+ const win = window as typeof window & { createObjectURL?: (file: unknown) => string };
23
+ if (win.createObjectURL != undefined) {
23
24
  // basic
24
- return window.createObjectURL(_file);
25
+ return win.createObjectURL(_file);
25
26
  } else if (window.URL != undefined) {
26
27
  // mozilla(firefox)
27
28
  return window.URL.createObjectURL(_file);
@@ -12,7 +12,7 @@ export function checkUrlSuffix(url, types = [], caseSensitive = false) {
12
12
  if (!url) {
13
13
  return false;
14
14
  }
15
- let _url = url?.replace(/\?.+/, "");
15
+ const _url = url?.replace(/\?.+/, "");
16
16
  const reg = new RegExp(`\.(${types.join("|")})$`, caseSensitive ? undefined : "i");
17
17
  if (reg.test(_url)) {
18
18
  return true;