@base-web-kits/base-tools-web 1.0.2 → 1.1.0-alpha.2

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/web/index.ts","../src/web/clipboard/index.ts","../src/web/cookie/index.ts","../src/web/device/index.ts","../src/web/dom/index.ts","../src/web/load/index.ts","../src/web/storage/index.ts","../src/web/url/index.ts"],"sourcesContent":["/**\r\n * 内部统一导出, 外部快捷引入: import {xx} from 'base-tools/web'\r\n */\r\nexport * from './clipboard';\r\nexport * from './cookie';\r\nexport * from './device';\r\nexport * from './dom';\r\nexport * from './load';\r\nexport * from './storage';\r\nexport * from './url';\r\n","/**\r\n * 复制文本到剪贴板(兼容移动端和PC)\r\n * @returns Promise<void> 复制成功时 resolve,失败时 reject。\r\n * @example\r\n * await copyText('hello');\r\n * toast('复制成功');\r\n */\r\nexport async function copyText(text: string): Promise<void> {\r\n if (typeof text !== 'string') text = String(text ?? '');\r\n\r\n // 现代 API\r\n if (navigator.clipboard && typeof navigator.clipboard.writeText === 'function') {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n return;\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n } catch (e) {\r\n // 继续尝试回退方案\r\n }\r\n }\r\n\r\n // 回退方案:使用隐藏 textarea + execCommand('copy')\r\n return new Promise<void>((resolve, reject) => {\r\n try {\r\n const textarea = document.createElement('textarea');\r\n textarea.value = text;\r\n\r\n // 避免视觉影响与页面布局影响\r\n textarea.setAttribute('readonly', '');\r\n textarea.style.position = 'fixed';\r\n textarea.style.top = '0';\r\n textarea.style.right = '-9999px';\r\n textarea.style.opacity = '0';\r\n textarea.style.pointerEvents = 'none';\r\n\r\n document.body.appendChild(textarea);\r\n\r\n // 选中文本(移动端兼容)\r\n textarea.focus();\r\n textarea.select();\r\n\r\n // iOS 兼容:明确选区\r\n textarea.setSelectionRange(0, textarea.value.length);\r\n\r\n const ok = document.execCommand('copy');\r\n document.body.removeChild(textarea);\r\n\r\n if (ok) {\r\n resolve();\r\n } else {\r\n reject(new Error('Copy failed: clipboard unavailable'));\r\n }\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * 复制富文本 HTML 到剪贴板(移动端与 PC)\r\n * 使用场景:图文混排文章、带样式段落,保留格式粘贴。\r\n * @param html HTML字符串\r\n * @example\r\n * await copyHtml('<p><b>加粗</b> 与 <i>斜体</i></p>');\r\n */\r\nexport async function copyHtml(html: string): Promise<void> {\r\n const s = String(html ?? '');\r\n if (canWriteClipboard()) {\r\n const plain = htmlToText(s);\r\n await writeClipboard({\r\n 'text/html': new Blob([s], { type: 'text/html' }),\r\n 'text/plain': new Blob([plain], { type: 'text/plain' }),\r\n });\r\n return;\r\n }\r\n return execCopyFromHtml(s);\r\n}\r\n\r\n/**\r\n * 复制 DOM 节点到剪贴板(移动端与 PC)\r\n * 使用场景:页面已有区域的可视化复制;元素使用 `outerHTML`,非元素使用其文本内容。\r\n * @param node DOM 节点(元素或文本节点)\r\n * @example\r\n * const el = document.querySelector('#article')!;\r\n * await copyNode(el);\r\n */\r\nexport async function copyNode(node: Node): Promise<void> {\r\n if (canWriteClipboard()) {\r\n const { html, text } = nodeToHtmlText(node);\r\n await writeClipboard({\r\n 'text/html': new Blob([html], { type: 'text/html' }),\r\n 'text/plain': new Blob([text], { type: 'text/plain' }),\r\n });\r\n return;\r\n }\r\n const { html } = nodeToHtmlText(node);\r\n return execCopyFromHtml(html);\r\n}\r\n\r\n/**\r\n * 复制单张图片到剪贴板(移动端与 PC,需浏览器支持 `ClipboardItem`)\r\n * 使用场景:把本地 `canvas` 或 `Blob` 生成的图片直接粘贴到聊天/文档。\r\n * @param image 图片源(Blob/Canvas/ImageBitmap)\r\n * @example\r\n * const canvas = document.querySelector('canvas')!;\r\n * await copyImage(canvas);\r\n */\r\nexport async function copyImage(image: Blob | HTMLCanvasElement | ImageBitmap): Promise<void> {\r\n const blob = await toImageBlob(image);\r\n if (!blob) throw new Error('Unsupported image source');\r\n if (canWriteClipboard()) {\r\n const type = blob.type || 'image/png';\r\n await writeClipboard({ [type]: blob });\r\n return;\r\n }\r\n throw new Error('Clipboard image write not supported');\r\n}\r\n\r\n/**\r\n * 复制 URL 到剪贴板(移动端与 PC)\r\n * 写入 `text/uri-list` 与 `text/plain`,在支持 URI 列表的应用中可识别为链接。\r\n * @param url 完整的 URL 字符串\r\n * @example\r\n * await copyUrl('https://example.com/page');\r\n */\r\nexport async function copyUrl(url: string): Promise<void> {\r\n const s = String(url ?? '');\r\n if (canWriteClipboard()) {\r\n await writeClipboard({\r\n 'text/uri-list': new Blob([s], { type: 'text/uri-list' }),\r\n 'text/plain': new Blob([s], { type: 'text/plain' }),\r\n });\r\n return;\r\n }\r\n await copyText(s);\r\n}\r\n\r\n/**\r\n * 复制任意 Blob 到剪贴板(移动端与 PC,需 `ClipboardItem`)\r\n * 使用场景:原生格式粘贴(如 `image/svg+xml`、`application/pdf` 等)。\r\n * @param blob 任意 Blob 数据\r\n * @example\r\n * const svg = new Blob(['<svg></svg>'], { type: 'image/svg+xml' });\r\n * await copyBlob(svg);\r\n */\r\nexport async function copyBlob(blob: Blob): Promise<void> {\r\n if (canWriteClipboard()) {\r\n const type = blob.type || 'application/octet-stream';\r\n await writeClipboard({ [type]: blob });\r\n return;\r\n }\r\n throw new Error('Clipboard blob write not supported');\r\n}\r\n\r\n/**\r\n * 复制 RTF 富文本到剪贴板(移动端与 PC)\r\n * 同时写入 `text/plain`,增强与 Office/富文本编辑器的兼容性。\r\n * @param rtf RTF 字符串(如:`{\\\\rtf1\\\\ansi ...}`)\r\n * @example\r\n * await copyRtf('{\\\\rtf1\\\\ansi Hello \\\\b World}');\r\n */\r\nexport async function copyRtf(rtf: string): Promise<void> {\r\n const s = String(rtf ?? '');\r\n if (canWriteClipboard()) {\r\n const plain = s\r\n .replace(/\\\\par[\\s]?/g, '\\n')\r\n .replace(/\\{[^}]*\\}/g, '')\r\n .replace(/\\\\[a-zA-Z]+[0-9'-]*/g, '')\r\n .replace(/\\r?\\n/g, '\\n')\r\n .trim();\r\n await writeClipboard({\r\n 'text/rtf': new Blob([s], { type: 'text/rtf' }),\r\n 'text/plain': new Blob([plain], { type: 'text/plain' }),\r\n });\r\n return;\r\n }\r\n await copyText(s);\r\n}\r\n\r\n/**\r\n * 复制表格到剪贴板(移动端与 PC)\r\n * 同时写入多种 MIME:`text/html`(表格)、`text/tab-separated-values`(TSV)、`text/csv`、`text/plain`(TSV)。\r\n * 使用场景:优化粘贴到 Excel/Google Sheets/Docs 的体验\r\n * @param rows 二维数组,每行一个数组(字符串/数字)\r\n * @example\r\n * await copyTable([\r\n * ['姓名', '分数'],\r\n * ['张三', 95],\r\n * ['李四', 88],\r\n * ]);\r\n */\r\nexport async function copyTable(rows: Array<Array<string | number>>): Promise<void> {\r\n const data = Array.isArray(rows) ? rows : [];\r\n const escapeHtml = (t: string) =>\r\n t\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&#39;');\r\n const html = (() => {\r\n const trs = data\r\n .map((r) => `<tr>${r.map((c) => `<td>${escapeHtml(String(c))}</td>`).join('')}</tr>`)\r\n .join('');\r\n return `<table>${trs}</table>`;\r\n })();\r\n const tsv = data.map((r) => r.map((c) => String(c)).join('\\t')).join('\\n');\r\n const csv = data\r\n .map((r) =>\r\n r\r\n .map((c) => {\r\n const s = String(c);\r\n const needQuote = /[\",\\n]/.test(s);\r\n const escaped = s.replace(/\"/g, '\"\"');\r\n return needQuote ? `\"${escaped}\"` : escaped;\r\n })\r\n .join(','),\r\n )\r\n .join('\\n');\r\n if (canWriteClipboard()) {\r\n await writeClipboard({\r\n 'text/html': new Blob([html], { type: 'text/html' }),\r\n 'text/tab-separated-values': new Blob([tsv], { type: 'text/tab-separated-values' }),\r\n 'text/csv': new Blob([csv], { type: 'text/csv' }),\r\n 'text/plain': new Blob([tsv], { type: 'text/plain' }),\r\n });\r\n return;\r\n }\r\n await copyText(tsv);\r\n}\r\n\r\nasync function toImageBlob(image: Blob | HTMLCanvasElement | ImageBitmap) {\r\n if (image instanceof Blob) return image;\r\n if (image instanceof HTMLCanvasElement)\r\n return await new Promise<Blob>((resolve, reject) => {\r\n image.toBlob(\r\n (b) => (b ? resolve(b) : reject(new Error('Canvas toBlob failed'))),\r\n 'image/png',\r\n );\r\n });\r\n const isBitmap = typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap;\r\n if (isBitmap) {\r\n const cnv = document.createElement('canvas');\r\n cnv.width = (image as ImageBitmap).width;\r\n cnv.height = (image as ImageBitmap).height;\r\n const ctx = cnv.getContext('2d');\r\n ctx?.drawImage(image as ImageBitmap, 0, 0);\r\n return await new Promise<Blob>((resolve, reject) => {\r\n cnv.toBlob((b) => (b ? resolve(b) : reject(new Error('Canvas toBlob failed'))), 'image/png');\r\n });\r\n }\r\n return null;\r\n}\r\n\r\nfunction canWriteClipboard() {\r\n return !!(\r\n navigator.clipboard &&\r\n typeof navigator.clipboard.write === 'function' &&\r\n typeof ClipboardItem !== 'undefined'\r\n );\r\n}\r\n\r\nasync function writeClipboard(items: Record<string, Blob>) {\r\n await navigator.clipboard!.write([new ClipboardItem(items)]);\r\n}\r\n\r\nfunction htmlToText(html: string) {\r\n const div = document.createElement('div');\r\n div.innerHTML = html;\r\n return div.textContent || '';\r\n}\r\n\r\nfunction nodeToHtmlText(node: Node) {\r\n const container = document.createElement('div');\r\n container.appendChild(node.cloneNode(true));\r\n const html =\r\n node instanceof Element ? (node.outerHTML ?? container.innerHTML) : container.innerHTML;\r\n const text = container.textContent || '';\r\n return { html, text };\r\n}\r\n\r\nfunction execCopyFromHtml(html: string) {\r\n return new Promise<void>((resolve, reject) => {\r\n try {\r\n const div = document.createElement('div');\r\n div.contentEditable = 'true';\r\n div.style.position = 'fixed';\r\n div.style.top = '0';\r\n div.style.right = '-9999px';\r\n div.style.opacity = '0';\r\n div.style.pointerEvents = 'none';\r\n div.innerHTML = html;\r\n document.body.appendChild(div);\r\n const selection = window.getSelection();\r\n const range = document.createRange();\r\n range.selectNodeContents(div);\r\n selection?.removeAllRanges();\r\n selection?.addRange(range);\r\n const ok = document.execCommand('copy');\r\n document.body.removeChild(div);\r\n selection?.removeAllRanges();\r\n if (ok) {\r\n resolve();\r\n } else {\r\n reject(new Error('Copy failed: clipboard unavailable'));\r\n }\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n}\r\n","/**\r\n * 设置 Cookie(路径默认为 `/`)\r\n * @param name Cookie 名称\r\n * @param value Cookie 值(内部已使用 `encodeURIComponent` 编码)\r\n * @param days 过期天数(从当前时间起算)\r\n * @example\r\n * setCookie('token', 'abc', 7);\r\n */\r\nexport function setCookie(name: string, value: string, days: number) {\r\n const date = new Date();\r\n date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);\r\n const expires = `expires=${date.toUTCString()}; path=/`;\r\n document.cookie = `${name}=${encodeURIComponent(value)}; ${expires}`;\r\n}\r\n\r\n/**\r\n * 获取 Cookie\r\n * @param name Cookie 名称\r\n * @returns 若存在返回解码后的值,否则 `null`\r\n * @example\r\n * const token = getCookie('token');\r\n */\r\nexport function getCookie(name: string): string | null {\r\n const value = `; ${document.cookie}`;\r\n const parts = value.split(`; ${name}=`);\r\n if (parts.length === 2) {\r\n const v = parts.pop()?.split(';').shift();\r\n return v ? decodeURIComponent(v) : null;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 移除 Cookie(通过设置过期时间为过去)\r\n * 路径固定为 `/`,确保与默认写入路径一致。\r\n * @param name Cookie 名称\r\n * @example\r\n * removeCookie('token');\r\n */\r\nexport function removeCookie(name: string) {\r\n document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/`;\r\n}\r\n","/**\r\n * 获取用户代理字符串(UA)\r\n * @returns navigator.userAgent.toLowerCase();\r\n */\r\nexport function getUA(): string {\r\n if (typeof navigator === 'undefined') return ''; // SSR无 navigator\r\n return (navigator.userAgent || '').toLowerCase();\r\n}\r\n\r\n/**\r\n * 是否为移动端设备(含平板)\r\n */\r\nexport function isMobile(): boolean {\r\n const ua = getUA();\r\n return /android|webos|iphone|ipod|blackberry|iemobile|opera mini|mobile/i.test(ua);\r\n}\r\n\r\n/**\r\n * 是否为平板设备\r\n */\r\nexport function isTablet(): boolean {\r\n const ua = getUA();\r\n return /ipad|android(?!.*mobile)|tablet/i.test(ua) && !/mobile/i.test(ua);\r\n}\r\n\r\n/**\r\n * 是否为 PC 设备\r\n */\r\nexport function isPC(): boolean {\r\n return !isMobile() && !isTablet();\r\n}\r\n\r\n/**\r\n * 是否为 iOS 系统\r\n */\r\nexport function isIOS(): boolean {\r\n const ua = getUA();\r\n return /iphone|ipad|ipod/i.test(ua);\r\n}\r\n\r\n/**\r\n * 是否为 Android 系统\r\n */\r\nexport function isAndroid(): boolean {\r\n const ua = getUA();\r\n return /android/i.test(ua);\r\n}\r\n\r\n/**\r\n * 是否微信内置浏览器\r\n */\r\nexport function isWeChat(): boolean {\r\n const ua = getUA();\r\n return /micromessenger/i.test(ua);\r\n}\r\n\r\n/**\r\n * 是否为 Chrome 浏览器\r\n * 已排除 Edge、Opera 等基于 Chromium 的浏览器\r\n */\r\nexport function isChrome(): boolean {\r\n const ua = getUA();\r\n return /chrome\\//i.test(ua) && !/edg\\//i.test(ua) && !/opr\\//i.test(ua) && !/whale\\//i.test(ua);\r\n}\r\n\r\n/**\r\n * 检测是否支持触摸事件\r\n */\r\nexport function isTouchSupported(): boolean {\r\n if (typeof window === 'undefined') return false;\r\n return 'ontouchstart' in window || navigator.maxTouchPoints > 0;\r\n}\r\n\r\n/**\r\n * 获取设备像素比\r\n */\r\nexport function getDevicePixelRatio(): number {\r\n if (typeof window === 'undefined') return 1;\r\n return window.devicePixelRatio || 1;\r\n}\r\n\r\n/**\r\n * 获取浏览器名字\r\n */\r\nexport function getBrowserName(): string | null {\r\n const ua = getUA();\r\n\r\n if (/chrome\\//i.test(ua)) return 'chrome';\r\n if (/safari\\//i.test(ua)) return 'safari';\r\n if (/firefox\\//i.test(ua)) return 'firefox';\r\n if (/opr\\//i.test(ua)) return 'opera';\r\n if (/edg\\//i.test(ua)) return 'edge';\r\n if (/msie|trident/i.test(ua)) return 'ie';\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * 获取浏览器版本号\r\n */\r\nexport function getBrowserVersion(): string | null {\r\n const ua = getUA();\r\n\r\n const versionPatterns = [\r\n /(?:edg|edge)\\/([0-9.]+)/i,\r\n /(?:opr|opera)\\/([0-9.]+)/i,\r\n /chrome\\/([0-9.]+)/i,\r\n /firefox\\/([0-9.]+)/i,\r\n /version\\/([0-9.]+).*safari/i,\r\n /(?:msie |rv:)([0-9.]+)/i,\r\n ];\r\n\r\n for (const pattern of versionPatterns) {\r\n const matches = ua.match(pattern);\r\n if (matches && matches[1]) {\r\n return matches[1];\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * 获取操作系统信息\r\n */\r\nexport function getOS(): string {\r\n const ua = getUA();\r\n\r\n if (/windows/i.test(ua)) return 'windows';\r\n if (/mac os/i.test(ua)) return 'macos';\r\n if (/linux/i.test(ua)) return 'linux';\r\n if (/iphone|ipad|ipod/i.test(ua)) return 'ios';\r\n if (/android/i.test(ua)) return 'android';\r\n\r\n return 'unknown';\r\n}\r\n","/**\r\n * 获取窗口宽度(不含滚动条)\r\n * @returns 窗口宽度\r\n */\r\nexport function getWindowWidth() {\r\n return window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;\r\n}\r\n\r\n/**\r\n * 获取窗口高度(不含滚动条)\r\n * @returns 窗口高度\r\n */\r\nexport function getWindowHeight() {\r\n return window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;\r\n}\r\n\r\n/**\r\n * 获取文档垂直滚动位置\r\n * @example\r\n * const top = getWindowScrollTop();\r\n */\r\nexport function getWindowScrollTop() {\r\n const doc = document.documentElement;\r\n const body = document.body;\r\n return window.pageYOffset || doc.scrollTop || body.scrollTop || 0;\r\n}\r\n\r\n/**\r\n * 获取文档水平滚动位置\r\n * @example\r\n * const left = getWindowScrollLeft();\r\n */\r\nexport function getWindowScrollLeft() {\r\n const doc = document.documentElement;\r\n const body = document.body;\r\n return window.pageXOffset || doc.scrollLeft || body.scrollLeft || 0;\r\n}\r\n\r\n/**\r\n * 平滑滚动到指定位置\r\n * @param top 目标纵向滚动位置\r\n * @param behavior 滚动行为,默认 'smooth'\r\n * @example\r\n * windowScrollTo(0);\r\n */\r\nexport function windowScrollTo(top: number, behavior: ScrollBehavior = 'smooth') {\r\n if ('scrollBehavior' in document.documentElement.style) {\r\n window.scrollTo({ top, behavior });\r\n } else {\r\n window.scrollTo(0, top);\r\n }\r\n}\r\n\r\n/**\r\n * 元素是否在视口内(可设置阈值)\r\n * @param el 目标元素\r\n * @param offset 额外判定偏移(像素,正数放宽,负数收紧)\r\n * @returns 是否在视口内\r\n */\r\nexport function isInViewport(el: Element, offset = 0) {\r\n const rect = el.getBoundingClientRect();\r\n const width = getWindowWidth();\r\n const height = getWindowHeight();\r\n return (\r\n rect.bottom >= -offset &&\r\n rect.right >= -offset &&\r\n rect.top <= height + offset &&\r\n rect.left <= width + offset\r\n );\r\n}\r\n\r\n/**\r\n * 锁定页面滚动(移动端/PC)\r\n * 使用 `body{ position: fixed }` 技术消除滚动条抖动,记录并恢复滚动位置。\r\n * @example\r\n * lockBodyScroll();\r\n */\r\nexport function lockBodyScroll() {\r\n const body = document.body;\r\n if (body.dataset.scrollLock === 'true') return;\r\n const y = Math.round(window.scrollY || window.pageYOffset || 0);\r\n body.dataset.scrollLock = 'true';\r\n body.dataset.scrollLockY = String(y);\r\n body.style.position = 'fixed';\r\n body.style.top = `-${y}px`;\r\n body.style.left = '0';\r\n body.style.right = '0';\r\n body.style.width = '100%';\r\n}\r\n\r\n/**\r\n * 解除页面滚动锁定,恢复原始滚动位置\r\n * @example\r\n * unlockBodyScroll();\r\n */\r\nexport function unlockBodyScroll() {\r\n const body = document.body;\r\n if (body.dataset.scrollLock !== 'true') return;\r\n const y = Number(body.dataset.scrollLockY || 0);\r\n body.style.position = '';\r\n body.style.top = '';\r\n body.style.left = '';\r\n body.style.right = '';\r\n body.style.width = '';\r\n delete body.dataset.scrollLock;\r\n delete body.dataset.scrollLockY;\r\n window.scrollTo(0, y);\r\n}\r\n","import type { AxiosResponse } from 'axios';\r\n\r\n/**\r\n * 下载文件\r\n * @param url 完整的下载地址 | base64字符串 | Blob对象\r\n * @param fileName 自定义文件名(需含后缀)\r\n * @example\r\n * download('https://xx/xx.pdf');\r\n * download('https://xx/xx.pdf', 'xx.pdf');\r\n * download(blob, '图片.jpg');\r\n */\r\nexport async function download(url: string | Blob, fileName = '') {\r\n if (!url) return;\r\n\r\n let blobUrl = '';\r\n let needRevoke = false; // createObjectURL必须revoke,否则内存泄露,刷新页面都不释放\r\n try {\r\n if (url instanceof Blob) {\r\n // Blob对象\r\n blobUrl = URL.createObjectURL(url);\r\n needRevoke = true;\r\n } else if (url.includes(';base64,')) {\r\n // base64字符串\r\n blobUrl = url;\r\n } else {\r\n if (fileName) {\r\n // 自定义文件名:跨域的url无法自定义文件名,此处统一转为blob\r\n const res = await fetch(url);\r\n if (!res.ok) throw new Error(`fetch error ${res.status}:${url}`); // 拦截错误页(404/500 等 HTML)\r\n const blob = await res.blob();\r\n blobUrl = URL.createObjectURL(blob);\r\n needRevoke = true;\r\n } else {\r\n // 非自定义文件名的普通链接\r\n blobUrl = url;\r\n }\r\n }\r\n\r\n // window.location.href = fileUrl // 可能会关闭当前页面\r\n // window.open(fileUrl, '_blank') // 不支持下载图片\r\n // 通过a标签模拟点击下载\r\n const a = document.createElement('a');\r\n a.href = blobUrl;\r\n a.download = fileName; // 若为空字符串,则会自动取url的文件名(跨域url无法自定义文件名,需转为blob)\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n } finally {\r\n if (needRevoke) {\r\n setTimeout(() => URL.revokeObjectURL(blobUrl), 100); // Safari 需要延迟 revoke\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 解析Axios返回的Blob数据\r\n * @param res Axios响应对象 (responseType='blob')\r\n * @returns 包含blob数据和文件名的对象 { blob, fileName }\r\n * @example\r\n * const res = await axios.get(url, { responseType: 'blob' });\r\n * const { blob, fileName } = await parseAxiosBlob(res);\r\n * download(blob, fileName);\r\n */\r\nexport async function parseAxiosBlob(res: AxiosResponse<Blob>) {\r\n const { data, headers, status, statusText, config } = res;\r\n\r\n if (status < 200 || status >= 300) throw new Error(`${status},${statusText}:${config.url}`);\r\n\r\n // 抛出json错误\r\n if (data.type.includes('application/json')) {\r\n const txt = await data.text();\r\n throw JSON.parse(txt);\r\n }\r\n\r\n // 解析文件名\r\n const fileName = getDispositionFileName(headers['content-disposition']);\r\n return { blob: data, fileName };\r\n}\r\n\r\n/**\r\n * 获取文件名\r\n * @param disposition content-disposition头值\r\n * @returns content-disposition中的filename\r\n * @example\r\n * const fileName = getDispositionFileName(headers['content-disposition']);\r\n */\r\nexport function getDispositionFileName(disposition?: string) {\r\n if (!disposition) return '';\r\n\r\n // 1. RFC5987 filename* 优先\r\n const rfc5987 = /filename\\*\\s*=\\s*([^']*)''([^;]*)/i.exec(disposition);\r\n if (rfc5987?.[2]) {\r\n try {\r\n return decodeURIComponent(rfc5987[2].trim()).replace(/[\\r\\n]+/g, '');\r\n } catch {\r\n return rfc5987[2].trim().replace(/[\\r\\n]+/g, '');\r\n }\r\n }\r\n\r\n // 2. 旧式 filename=\r\n const old = /filename\\s*=\\s*(?:\"([^\"]*)\"|([^\";]*))(?=;|$)/i.exec(disposition);\r\n if (old) return (old[1] ?? old[2]).trim().replace(/[\\r\\n]+/g, '');\r\n\r\n return '';\r\n}\r\n\r\n/**\r\n * 动态加载 JS(重复执行不会重复加载,内部已排重)\r\n * @param src js 文件路径\r\n * @param attrs 可选的脚本属性,如 async、defer、crossOrigin\r\n * @example\r\n * await loadJs('https://xx/xx.js');\r\n * await loadJs('/a.js', { defer: true });\r\n */\r\nexport async function loadJs(\r\n src: string,\r\n attrs?: Pick<HTMLScriptElement, 'async' | 'defer' | 'crossOrigin'>,\r\n) {\r\n return new Promise<void>((resolve, reject) => {\r\n if (hasJs(src)) return resolve();\r\n\r\n const script = document.createElement('script');\r\n script.type = 'text/javascript';\r\n script.src = src;\r\n\r\n if (attrs) {\r\n const keys = Object.keys(attrs) as Array<keyof typeof attrs>;\r\n keys.forEach((key) => {\r\n const v = attrs[key];\r\n if (v === null || v === undefined || v === false) return;\r\n script.setAttribute(key, typeof v === 'boolean' ? '' : v);\r\n });\r\n }\r\n\r\n script.onload = () => resolve();\r\n script.onerror = (e) => reject(e);\r\n\r\n document.head.appendChild(script);\r\n });\r\n}\r\n\r\n/**\r\n * 判断某个 JS 地址是否已在页面中加载过\r\n * @param src 相对、绝对路径的 JS 地址\r\n * @returns 是否已加载过\r\n * @example\r\n * hasJs('https://xx/xx.js'); // boolean\r\n * hasJs('/xx.js'); // boolean\r\n * hasJs('xx.js'); // boolean\r\n */\r\nexport function hasJs(src: string) {\r\n const target = new URL(src, document.baseURI).href;\r\n const jsList = Array.from(document.querySelectorAll('script[src]'));\r\n return jsList.some((e) => {\r\n const src = e.getAttribute('src');\r\n return src && new URL(src, document.baseURI).href === target;\r\n });\r\n}\r\n\r\n/**\r\n * 动态加载 CSS(重复执行不会重复加载,内部已排重)\r\n * @param href css 文件地址\r\n * @param attrs 可选属性,如 crossOrigin、media\r\n * @example\r\n * await loadCss('https://xx/xx.css');\r\n * await loadCss('/a.css', { media: 'print' });\r\n */\r\nexport async function loadCss(\r\n href: string,\r\n attrs?: Pick<HTMLLinkElement, 'crossOrigin' | 'media'>,\r\n) {\r\n return new Promise<void>((resolve, reject) => {\r\n if (hasCss(href)) return resolve();\r\n\r\n const link = document.createElement('link');\r\n link.rel = 'stylesheet';\r\n link.href = href;\r\n\r\n if (attrs) {\r\n const keys = Object.keys(attrs) as Array<keyof typeof attrs>;\r\n keys.forEach((key) => {\r\n const v = attrs[key];\r\n if (v === null || v === undefined) return;\r\n link.setAttribute(key, String(v));\r\n });\r\n }\r\n\r\n link.onload = () => resolve();\r\n link.onerror = (e) => reject(e);\r\n\r\n document.head.appendChild(link);\r\n });\r\n}\r\n\r\n/**\r\n * 判断某个 CSS 地址是否已在页面中加载过\r\n * @param href 相对、绝对路径的 CSS 地址\r\n * @returns 是否已加载过\r\n * @example\r\n * hasCss('https://xx/xx.css'); // boolean\r\n */\r\nexport function hasCss(href: string) {\r\n const target = new URL(href, document.baseURI).href;\r\n const list = Array.from(document.querySelectorAll('link[rel=\"stylesheet\"][href]'));\r\n return list.some((e) => {\r\n const h = e.getAttribute('href');\r\n return h && new URL(h, document.baseURI).href === target;\r\n });\r\n}\r\n\r\n/**\r\n * 预加载图片\r\n * @param src 图片地址\r\n * @returns Promise<HTMLImageElement>\r\n * @example\r\n * await preloadImage('/a.png');\r\n */\r\nexport function preloadImage(src: string) {\r\n return new Promise<HTMLImageElement>((resolve, reject) => {\r\n const img = new Image();\r\n img.onload = () => resolve(img);\r\n img.onerror = (e) => reject(e);\r\n img.src = src;\r\n });\r\n}\r\n","const WK = {\r\n val: '__l_val',\r\n exp: '__l_exp',\r\n wrap: '__l_wrap',\r\n} as const;\r\n\r\n/**\r\n * 写入 localStorage(自动 JSON 序列化)\r\n * 当 `value` 为 `null` 或 `undefined` 时,会移除该键。\r\n * 支持保存:对象、数组、字符串、数字、布尔值。\r\n * @param key 键名\r\n * @param value 任意可序列化的值\r\n * @param days 过期天数(从当前时间起算)\r\n * @example\r\n * setLocalStorage('user', { id: 1, name: 'Alice' }); // 对象\r\n * setLocalStorage('age', 18); // 数字\r\n * setLocalStorage('vip', true); // 布尔值\r\n * setLocalStorage('token', 'abc123', 7); // 7 天后过期\r\n */\r\nexport function setLocalStorage(key: string, value: unknown, days?: number) {\r\n if (value === undefined || value === null) {\r\n removeLocalStorage(key);\r\n return;\r\n }\r\n\r\n let toStore: unknown = value;\r\n if (typeof days === 'number' && days > 0) {\r\n const ms = days * 24 * 60 * 60 * 1000;\r\n toStore = {\r\n [WK.wrap]: true,\r\n [WK.val]: value,\r\n [WK.exp]: Date.now() + ms,\r\n };\r\n }\r\n\r\n localStorage.setItem(key, JSON.stringify(toStore));\r\n}\r\n\r\n/**\r\n * 读取 localStorage(自动 JSON 反序列化)\r\n * 若值为合法 JSON,则返回反序列化后的数据;\r\n * 若值非 JSON(如外部写入的纯字符串),则原样返回字符串。\r\n * 不存在时返回 `null`。\r\n * @param key 键名\r\n * @returns 解析后的值或 `null`\r\n * @example\r\n * const user = getLocalStorage<{ id: number; name: string }>('user');\r\n * const age = getLocalStorage<number>('age');\r\n * const vip = getLocalStorage<boolean>('vip');\r\n */\r\nexport function getLocalStorage<T = unknown>(key: string): T | null {\r\n const raw = localStorage.getItem(key);\r\n if (raw === null) return null;\r\n try {\r\n const parsed = JSON.parse(raw);\r\n\r\n if (parsed && typeof parsed === 'object' && WK.wrap in parsed && WK.exp in parsed) {\r\n if (Date.now() > parsed[WK.exp]) {\r\n removeLocalStorage(key);\r\n return null;\r\n }\r\n return parsed[WK.val] as T;\r\n }\r\n return parsed as T;\r\n } catch {\r\n return raw as T;\r\n }\r\n}\r\n\r\n/**\r\n * 移除 localStorage 指定键\r\n * @param key 键名\r\n * @example\r\n * removeLocalStorage('token');\r\n */\r\nexport function removeLocalStorage(key: string) {\r\n localStorage.removeItem(key);\r\n}\r\n","/**\r\n * 获取url的查询参数值\r\n * @param key 参数名\r\n * @param url 完整 URL 或仅查询串(如 \"a=1&b=2\")\r\n * @returns 解码后的参数值 (若不存在|\"null\"|\"undefined\",则返回 null)\r\n * @example\r\n * const q = getUrlParam('q'); // 默认当前地址\r\n * const q = getUrlParam('q', 'https://a.com/?q=%E6%B5%8B%E8%AF%95'); // \"测试\"\r\n * const a = getUrlParam('a', 'a=1'); // \"1\"\r\n * const list = getUrlParam('list', 'list=[1,2]'); // \"[1,2]\"\r\n * const list = getUrlParam('list', 'list=null'); // null\r\n * const list = getUrlParam('list', 'list=undefined'); // null\r\n */\r\nexport function getUrlParam(key: string, url = window.location.href) {\r\n const searchParams = new URL(url.includes('?') ? url : `?${url}`, 'http://localhost')\r\n .searchParams;\r\n const value = searchParams.get(key);\r\n return value === 'null' || value === 'undefined' ? null : value;\r\n}\r\n\r\n/**\r\n * 获取url的查询参数值,并转为number类型\r\n * @param key 参数名\r\n * @param url 完整 URL 或仅查询串(如 \"a=1&b=2\")\r\n * @returns 解码后的参数值 (若不存在|\"非数字字符串\",则返回 null)\r\n * @example\r\n * const a = getUrlNumber('a'); // 默认当前地址\r\n * const a = getUrlNumber('a', 'https://a.com/?a=1'); // 1\r\n * const a = getUrlNumber('a', 'a=1'); // 1\r\n * const a = getUrlNumber('a', 'a=1.2'); // 1.2\r\n * const a = getUrlNumber('a', 'a=abc'); // null\r\n */\r\nexport function getUrlNumber(key: string, url = window.location.href) {\r\n const str = getUrlParam(key, url);\r\n if (!str) return null;\r\n\r\n const num = Number(str);\r\n return isNaN(num) ? null : num;\r\n}\r\n\r\n/**\r\n * 获取url的所有查询参数值\r\n * @param url 完整 URL 或仅查询串(如 \"a=1&b=2\")\r\n * @returns 解码后的键值对象(无参数返回空对象; \"null\"|\"undefined\"的参数会被忽略)\r\n * @example\r\n * const params = getUrlParams(); // 默认当前地址\r\n * const params = getUrlParams('a=1&b=2'); // { a: \"1\", b: \"2\" }\r\n * const params = getUrlParams('https://a.com/?a=1&b=2'); // { a: \"1\", b: \"2\" }\r\n * const params = getUrlParams('a=1&b=null'); // { a: \"1\" }\r\n * const params = getUrlParams('a=1&b=undefined'); // { a: \"1\" }\r\n */\r\nexport function getUrlParams(url = window.location.href) {\r\n const searchParams = new URL(url.includes('?') ? url : `?${url}`, 'http://localhost')\r\n .searchParams;\r\n const result: Record<string, string> = {};\r\n\r\n for (const [key, value] of searchParams.entries()) {\r\n if (value !== 'null' && value !== 'undefined') {\r\n result[key] = value;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n"],"mappings":"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","names":["html","src"]}
1
+ {"version":3,"sources":["../../node_modules/.pnpm/dayjs@1.11.19/node_modules/dayjs/dayjs.min.js","../../node_modules/.pnpm/dayjs@1.11.19/node_modules/dayjs/plugin/customParseFormat.js","../../node_modules/.pnpm/dayjs@1.11.19/node_modules/dayjs/plugin/utc.js","../../node_modules/.pnpm/dayjs@1.11.19/node_modules/dayjs/plugin/timezone.js","../../node_modules/.pnpm/dayjs@1.11.19/node_modules/dayjs/plugin/relativeTime.js","../../node_modules/.pnpm/dayjs@1.11.19/node_modules/dayjs/plugin/advancedFormat.js","../../node_modules/.pnpm/dayjs@1.11.19/node_modules/dayjs/locale/zh-cn.js","../src/web/index.ts","../src/web/clipboard/index.ts","../src/web/config/index.ts","../src/web/cookie/index.ts","../src/web/device/index.ts","../src/web/dom/index.ts","../src/web/network/load.ts","../src/ts/day/index.ts","../../node_modules/.pnpm/es-toolkit@1.42.0/node_modules/es-toolkit/dist/predicate/isPrimitive.mjs","../../node_modules/.pnpm/es-toolkit@1.42.0/node_modules/es-toolkit/dist/predicate/isTypedArray.mjs","../../node_modules/.pnpm/es-toolkit@1.42.0/node_modules/es-toolkit/dist/compat/_internal/getSymbols.mjs","../../node_modules/.pnpm/es-toolkit@1.42.0/node_modules/es-toolkit/dist/compat/_internal/getTag.mjs","../../node_modules/.pnpm/es-toolkit@1.42.0/node_modules/es-toolkit/dist/compat/_internal/tags.mjs","../../node_modules/.pnpm/es-toolkit@1.42.0/node_modules/es-toolkit/dist/object/cloneDeepWith.mjs","../../node_modules/.pnpm/es-toolkit@1.42.0/node_modules/es-toolkit/dist/object/cloneDeep.mjs","../../node_modules/.pnpm/es-toolkit@1.42.0/node_modules/es-toolkit/dist/predicate/isPlainObject.mjs","../../node_modules/.pnpm/es-toolkit@1.42.0/node_modules/es-toolkit/dist/_internal/isUnsafeProperty.mjs","../../node_modules/.pnpm/es-toolkit@1.42.0/node_modules/es-toolkit/dist/object/pickBy.mjs","../../node_modules/.pnpm/es-toolkit@1.42.0/node_modules/es-toolkit/dist/compat/_internal/isDeepKey.mjs","../../node_modules/.pnpm/es-toolkit@1.42.0/node_modules/es-toolkit/dist/compat/_internal/toKey.mjs","../../node_modules/.pnpm/es-toolkit@1.42.0/node_modules/es-toolkit/dist/compat/util/toString.mjs","../../node_modules/.pnpm/es-toolkit@1.42.0/node_modules/es-toolkit/dist/compat/util/toPath.mjs","../../node_modules/.pnpm/es-toolkit@1.42.0/node_modules/es-toolkit/dist/compat/object/get.mjs","../src/ts/object/index.ts","../src/ts/url/param/index.ts","../src/web/network/request.ts","../src/web/storage/index.ts","../src/web/url/index.ts"],"sourcesContent":["!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",c=\"month\",f=\"quarter\",h=\"year\",d=\"date\",l=\"Invalid Date\",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(t){var e=[\"th\",\"st\",\"nd\",\"rd\"],n=t%100;return\"[\"+t+(e[(n-20)%10]||e[n]||e[0])+\"]\"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},g=\"en\",D={};D[g]=M;var p=\"$isDayjsObject\",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if(\"string\"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split(\"-\");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate(\"s\"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+\"Hours\",0);case u:return $(v+\"Minutes\",1);case s:return $(v+\"Seconds\",2);case i:return $(v+\"Milliseconds\",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f=\"set\"+(this.$u?\"UTC\":\"\"),l=(n={},n[a]=f+\"Date\",n[d]=f+\"Date\",n[c]=f+\"Month\",n[h]=f+\"FullYear\",n[u]=f+\"Hours\",n[s]=f+\"Minutes\",n[i]=f+\"Seconds\",n[r]=f+\"Milliseconds\",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||\"YYYY-MM-DDTHH:mm:ssZ\",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,\"0\")},$=f||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case\"YY\":return String(e.$y).slice(-2);case\"YYYY\":return b.s(e.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return b.s(a+1,2,\"0\");case\"MMM\":return h(n.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return e.$D;case\"DD\":return b.s(e.$D,2,\"0\");case\"d\":return String(e.$W);case\"dd\":return h(n.weekdaysMin,e.$W,o,2);case\"ddd\":return h(n.weekdaysShort,e.$W,o,3);case\"dddd\":return o[e.$W];case\"H\":return String(s);case\"HH\":return b.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return $(s,u,!0);case\"A\":return $(s,u,!1);case\"m\":return String(u);case\"mm\":return b.s(u,2,\"0\");case\"s\":return String(e.$s);case\"ss\":return b.s(e.$s,2,\"0\");case\"SSS\":return b.s(e.$ms,3,\"0\");case\"Z\":return i}return null}(t)||i.replace(\":\",\"\")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),k=_.prototype;return O.prototype=k,[[\"$ms\",r],[\"$s\",i],[\"$m\",s],[\"$H\",u],[\"$W\",a],[\"$M\",c],[\"$y\",h],[\"$D\",d]].forEach((function(t){k[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_customParseFormat=t()}(this,(function(){\"use strict\";var e={LTS:\"h:mm:ss A\",LT:\"h:mm A\",L:\"MM/DD/YYYY\",LL:\"MMMM D, YYYY\",LLL:\"MMMM D, YYYY h:mm A\",LLLL:\"dddd, MMMM D, YYYY h:mm A\"},t=/(\\[[^[]*\\])|([-_:/.,()\\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,n=/\\d/,r=/\\d\\d/,i=/\\d\\d?/,o=/\\d*[^-_:/,()\\s\\d]+/,s={},a=function(e){return(e=+e)+(e>68?1900:2e3)};var f=function(e){return function(t){this[e]=+t}},h=[/[+-]\\d\\d:?(\\d\\d)?|Z/,function(e){(this.zone||(this.zone={})).offset=function(e){if(!e)return 0;if(\"Z\"===e)return 0;var t=e.match(/([+-]|\\d\\d)/g),n=60*t[1]+(+t[2]||0);return 0===n?0:\"+\"===t[0]?-n:n}(e)}],u=function(e){var t=s[e];return t&&(t.indexOf?t:t.s.concat(t.f))},d=function(e,t){var n,r=s.meridiem;if(r){for(var i=1;i<=24;i+=1)if(e.indexOf(r(i,0,t))>-1){n=i>12;break}}else n=e===(t?\"pm\":\"PM\");return n},c={A:[o,function(e){this.afternoon=d(e,!1)}],a:[o,function(e){this.afternoon=d(e,!0)}],Q:[n,function(e){this.month=3*(e-1)+1}],S:[n,function(e){this.milliseconds=100*+e}],SS:[r,function(e){this.milliseconds=10*+e}],SSS:[/\\d{3}/,function(e){this.milliseconds=+e}],s:[i,f(\"seconds\")],ss:[i,f(\"seconds\")],m:[i,f(\"minutes\")],mm:[i,f(\"minutes\")],H:[i,f(\"hours\")],h:[i,f(\"hours\")],HH:[i,f(\"hours\")],hh:[i,f(\"hours\")],D:[i,f(\"day\")],DD:[r,f(\"day\")],Do:[o,function(e){var t=s.ordinal,n=e.match(/\\d+/);if(this.day=n[0],t)for(var r=1;r<=31;r+=1)t(r).replace(/\\[|\\]/g,\"\")===e&&(this.day=r)}],w:[i,f(\"week\")],ww:[r,f(\"week\")],M:[i,f(\"month\")],MM:[r,f(\"month\")],MMM:[o,function(e){var t=u(\"months\"),n=(u(\"monthsShort\")||t.map((function(e){return e.slice(0,3)}))).indexOf(e)+1;if(n<1)throw new Error;this.month=n%12||n}],MMMM:[o,function(e){var t=u(\"months\").indexOf(e)+1;if(t<1)throw new Error;this.month=t%12||t}],Y:[/[+-]?\\d+/,f(\"year\")],YY:[r,function(e){this.year=a(e)}],YYYY:[/\\d{4}/,f(\"year\")],Z:h,ZZ:h};function l(n){var r,i;r=n,i=s&&s.formats;for(var o=(n=r.replace(/(\\[[^\\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(t,n,r){var o=r&&r.toUpperCase();return n||i[r]||e[r]||i[o].replace(/(\\[[^\\]]+])|(MMMM|MM|DD|dddd)/g,(function(e,t,n){return t||n.slice(1)}))}))).match(t),a=o.length,f=0;f<a;f+=1){var h=o[f],u=c[h],d=u&&u[0],l=u&&u[1];o[f]=l?{regex:d,parser:l}:h.replace(/^\\[|\\]$/g,\"\")}return function(e){for(var t={},n=0,r=0;n<a;n+=1){var i=o[n];if(\"string\"==typeof i)r+=i.length;else{var s=i.regex,f=i.parser,h=e.slice(r),u=s.exec(h)[0];f.call(t,u),e=e.replace(u,\"\")}}return function(e){var t=e.afternoon;if(void 0!==t){var n=e.hours;t?n<12&&(e.hours+=12):12===n&&(e.hours=0),delete e.afternoon}}(t),t}}return function(e,t,n){n.p.customParseFormat=!0,e&&e.parseTwoDigitYear&&(a=e.parseTwoDigitYear);var r=t.prototype,i=r.parse;r.parse=function(e){var t=e.date,r=e.utc,o=e.args;this.$u=r;var a=o[1];if(\"string\"==typeof a){var f=!0===o[2],h=!0===o[3],u=f||h,d=o[2];h&&(d=o[2]),s=this.$locale(),!f&&d&&(s=n.Ls[d]),this.$d=function(e,t,n,r){try{if([\"x\",\"X\"].indexOf(t)>-1)return new Date((\"X\"===t?1e3:1)*e);var i=l(t)(e),o=i.year,s=i.month,a=i.day,f=i.hours,h=i.minutes,u=i.seconds,d=i.milliseconds,c=i.zone,m=i.week,M=new Date,Y=a||(o||s?1:M.getDate()),p=o||M.getFullYear(),v=0;o&&!s||(v=s>0?s-1:M.getMonth());var D,w=f||0,g=h||0,y=u||0,L=d||0;return c?new Date(Date.UTC(p,v,Y,w,g,y,L+60*c.offset*1e3)):n?new Date(Date.UTC(p,v,Y,w,g,y,L)):(D=new Date(p,v,Y,w,g,y,L),m&&(D=r(D).week(m).toDate()),D)}catch(e){return new Date(\"\")}}(t,a,r,n),this.init(),d&&!0!==d&&(this.$L=this.locale(d).$L),u&&t!=this.format(a)&&(this.$d=new Date(\"\")),s={}}else if(a instanceof Array)for(var c=a.length,m=1;m<=c;m+=1){o[1]=a[m-1];var M=n.apply(this,o);if(M.isValid()){this.$d=M.$d,this.$L=M.$L,this.init();break}m===c&&(this.$d=new Date(\"\"))}else i.call(this,e)}}}));","!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs_plugin_utc=i()}(this,(function(){\"use strict\";var t=\"minute\",i=/[+-]\\d\\d(?::?\\d\\d)?/g,e=/([+-]|\\d\\d)/g;return function(s,f,n){var u=f.prototype;n.utc=function(t){var i={date:t,utc:!0,args:arguments};return new f(i)},u.utc=function(i){var e=n(this.toDate(),{locale:this.$L,utc:!0});return i?e.add(this.utcOffset(),t):e},u.local=function(){return n(this.toDate(),{locale:this.$L,utc:!1})};var r=u.parse;u.parse=function(t){t.utc&&(this.$u=!0),this.$utils().u(t.$offset)||(this.$offset=t.$offset),r.call(this,t)};var o=u.init;u.init=function(){if(this.$u){var t=this.$d;this.$y=t.getUTCFullYear(),this.$M=t.getUTCMonth(),this.$D=t.getUTCDate(),this.$W=t.getUTCDay(),this.$H=t.getUTCHours(),this.$m=t.getUTCMinutes(),this.$s=t.getUTCSeconds(),this.$ms=t.getUTCMilliseconds()}else o.call(this)};var a=u.utcOffset;u.utcOffset=function(s,f){var n=this.$utils().u;if(n(s))return this.$u?0:n(this.$offset)?a.call(this):this.$offset;if(\"string\"==typeof s&&(s=function(t){void 0===t&&(t=\"\");var s=t.match(i);if(!s)return null;var f=(\"\"+s[0]).match(e)||[\"-\",0,0],n=f[0],u=60*+f[1]+ +f[2];return 0===u?0:\"+\"===n?u:-u}(s),null===s))return this;var u=Math.abs(s)<=16?60*s:s;if(0===u)return this.utc(f);var r=this.clone();if(f)return r.$offset=u,r.$u=!1,r;var o=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();return(r=this.local().add(u+o,t)).$offset=u,r.$x.$localOffset=o,r};var h=u.format;u.format=function(t){var i=t||(this.$u?\"YYYY-MM-DDTHH:mm:ss[Z]\":\"\");return h.call(this,i)},u.valueOf=function(){var t=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*t},u.isUTC=function(){return!!this.$u},u.toISOString=function(){return this.toDate().toISOString()},u.toString=function(){return this.toDate().toUTCString()};var l=u.toDate;u.toDate=function(t){return\"s\"===t&&this.$offset?n(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\")).toDate():l.call(this)};var c=u.diff;u.diff=function(t,i,e){if(t&&this.$u===t.$u)return c.call(this,t,i,e);var s=this.local(),f=n(t).local();return c.call(s,f,i,e)}}}));","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs_plugin_timezone=e()}(this,(function(){\"use strict\";var t={year:0,month:1,day:2,hour:3,minute:4,second:5},e={};return function(n,i,o){var r,a=function(t,n,i){void 0===i&&(i={});var o=new Date(t),r=function(t,n){void 0===n&&(n={});var i=n.timeZoneName||\"short\",o=t+\"|\"+i,r=e[o];return r||(r=new Intl.DateTimeFormat(\"en-US\",{hour12:!1,timeZone:t,year:\"numeric\",month:\"2-digit\",day:\"2-digit\",hour:\"2-digit\",minute:\"2-digit\",second:\"2-digit\",timeZoneName:i}),e[o]=r),r}(n,i);return r.formatToParts(o)},u=function(e,n){for(var i=a(e,n),r=[],u=0;u<i.length;u+=1){var f=i[u],s=f.type,m=f.value,c=t[s];c>=0&&(r[c]=parseInt(m,10))}var d=r[3],l=24===d?0:d,h=r[0]+\"-\"+r[1]+\"-\"+r[2]+\" \"+l+\":\"+r[4]+\":\"+r[5]+\":000\",v=+e;return(o.utc(h).valueOf()-(v-=v%1e3))/6e4},f=i.prototype;f.tz=function(t,e){void 0===t&&(t=r);var n,i=this.utcOffset(),a=this.toDate(),u=a.toLocaleString(\"en-US\",{timeZone:t}),f=Math.round((a-new Date(u))/1e3/60),s=15*-Math.round(a.getTimezoneOffset()/15)-f;if(!Number(s))n=this.utcOffset(0,e);else if(n=o(u,{locale:this.$L}).$set(\"millisecond\",this.$ms).utcOffset(s,!0),e){var m=n.utcOffset();n=n.add(i-m,\"minute\")}return n.$x.$timezone=t,n},f.offsetName=function(t){var e=this.$x.$timezone||o.tz.guess(),n=a(this.valueOf(),e,{timeZoneName:t}).find((function(t){return\"timezonename\"===t.type.toLowerCase()}));return n&&n.value};var s=f.startOf;f.startOf=function(t,e){if(!this.$x||!this.$x.$timezone)return s.call(this,t,e);var n=o(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\"),{locale:this.$L});return s.call(n,t,e).tz(this.$x.$timezone,!0)},o.tz=function(t,e,n){var i=n&&e,a=n||e||r,f=u(+o(),a);if(\"string\"!=typeof t)return o(t).tz(a);var s=function(t,e,n){var i=t-60*e*1e3,o=u(i,n);if(e===o)return[i,e];var r=u(i-=60*(o-e)*1e3,n);return o===r?[i,o]:[t-60*Math.min(o,r)*1e3,Math.max(o,r)]}(o.utc(t,i).valueOf(),f,a),m=s[0],c=s[1],d=o(m).utcOffset(c);return d.$x.$timezone=a,d},o.tz.guess=function(){return Intl.DateTimeFormat().resolvedOptions().timeZone},o.tz.setDefault=function(t){r=t}}}));","!function(r,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(r=\"undefined\"!=typeof globalThis?globalThis:r||self).dayjs_plugin_relativeTime=e()}(this,(function(){\"use strict\";return function(r,e,t){r=r||{};var n=e.prototype,o={future:\"in %s\",past:\"%s ago\",s:\"a few seconds\",m:\"a minute\",mm:\"%d minutes\",h:\"an hour\",hh:\"%d hours\",d:\"a day\",dd:\"%d days\",M:\"a month\",MM:\"%d months\",y:\"a year\",yy:\"%d years\"};function i(r,e,t,o){return n.fromToBase(r,e,t,o)}t.en.relativeTime=o,n.fromToBase=function(e,n,i,d,u){for(var f,a,s,l=i.$locale().relativeTime||o,h=r.thresholds||[{l:\"s\",r:44,d:\"second\"},{l:\"m\",r:89},{l:\"mm\",r:44,d:\"minute\"},{l:\"h\",r:89},{l:\"hh\",r:21,d:\"hour\"},{l:\"d\",r:35},{l:\"dd\",r:25,d:\"day\"},{l:\"M\",r:45},{l:\"MM\",r:10,d:\"month\"},{l:\"y\",r:17},{l:\"yy\",d:\"year\"}],m=h.length,c=0;c<m;c+=1){var y=h[c];y.d&&(f=d?t(e).diff(i,y.d,!0):i.diff(e,y.d,!0));var p=(r.rounding||Math.round)(Math.abs(f));if(s=f>0,p<=y.r||!y.r){p<=1&&c>0&&(y=h[c-1]);var v=l[y.l];u&&(p=u(\"\"+p)),a=\"string\"==typeof v?v.replace(\"%d\",p):v(p,n,y.l,s);break}}if(n)return a;var M=s?l.future:l.past;return\"function\"==typeof M?M(a):M.replace(\"%s\",a)},n.to=function(r,e){return i(r,e,this,!0)},n.from=function(r,e){return i(r,e,this)};var d=function(r){return r.$u?t.utc():t()};n.toNow=function(r){return this.to(d(this),r)},n.fromNow=function(r){return this.from(d(this),r)}}}));","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_advancedFormat=t()}(this,(function(){\"use strict\";return function(e,t){var r=t.prototype,n=r.format;r.format=function(e){var t=this,r=this.$locale();if(!this.isValid())return n.bind(this)(e);var s=this.$utils(),a=(e||\"YYYY-MM-DDTHH:mm:ssZ\").replace(/\\[([^\\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,(function(e){switch(e){case\"Q\":return Math.ceil((t.$M+1)/3);case\"Do\":return r.ordinal(t.$D);case\"gggg\":return t.weekYear();case\"GGGG\":return t.isoWeekYear();case\"wo\":return r.ordinal(t.week(),\"W\");case\"w\":case\"ww\":return s.s(t.week(),\"w\"===e?1:2,\"0\");case\"W\":case\"WW\":return s.s(t.isoWeek(),\"W\"===e?1:2,\"0\");case\"k\":case\"kk\":return s.s(String(0===t.$H?24:t.$H),\"k\"===e?1:2,\"0\");case\"X\":return Math.floor(t.$d.getTime()/1e3);case\"x\":return t.$d.getTime();case\"z\":return\"[\"+t.offsetName()+\"]\";case\"zzz\":return\"[\"+t.offsetName(\"long\")+\"]\";default:return e}}));return n.bind(this)(a)}}}));","!function(e,_){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=_(require(\"dayjs\")):\"function\"==typeof define&&define.amd?define([\"dayjs\"],_):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_locale_zh_cn=_(e.dayjs)}(this,(function(e){\"use strict\";function _(e){return e&&\"object\"==typeof e&&\"default\"in e?e:{default:e}}var t=_(e),d={name:\"zh-cn\",weekdays:\"星期日_星期一_星期二_星期三_星期四_星期五_星期六\".split(\"_\"),weekdaysShort:\"周日_周一_周二_周三_周四_周五_周六\".split(\"_\"),weekdaysMin:\"日_一_二_三_四_五_六\".split(\"_\"),months:\"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月\".split(\"_\"),monthsShort:\"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月\".split(\"_\"),ordinal:function(e,_){return\"W\"===_?e+\"周\":e+\"日\"},weekStart:1,yearStart:4,formats:{LT:\"HH:mm\",LTS:\"HH:mm:ss\",L:\"YYYY/MM/DD\",LL:\"YYYY年M月D日\",LLL:\"YYYY年M月D日Ah点mm分\",LLLL:\"YYYY年M月D日ddddAh点mm分\",l:\"YYYY/M/D\",ll:\"YYYY年M月D日\",lll:\"YYYY年M月D日 HH:mm\",llll:\"YYYY年M月D日dddd HH:mm\"},relativeTime:{future:\"%s内\",past:\"%s前\",s:\"几秒\",m:\"1 分钟\",mm:\"%d 分钟\",h:\"1 小时\",hh:\"%d 小时\",d:\"1 天\",dd:\"%d 天\",M:\"1 个月\",MM:\"%d 个月\",y:\"1 年\",yy:\"%d 年\"},meridiem:function(e,_){var t=100*e+_;return t<600?\"凌晨\":t<900?\"早上\":t<1100?\"上午\":t<1300?\"中午\":t<1800?\"下午\":\"晚上\"}};return t.default.locale(d,null,!0),d}));","/**\r\n * 内部统一导出, 外部快捷引入: import {xx} from 'base-tools/web'\r\n */\r\nexport * from './clipboard';\r\nexport * from './config';\r\nexport * from './cookie';\r\nexport * from './device';\r\nexport * from './dom';\r\nexport * from './network';\r\nexport * from './storage';\r\nexport * from './url';\r\n","/**\r\n * 复制文本到剪贴板(兼容移动端和PC)\r\n * @returns Promise<void> 复制成功时 resolve,失败时 reject。\r\n * @example\r\n * await copyText('hello');\r\n * toast('复制成功');\r\n */\r\nexport async function copyText(text: string): Promise<void> {\r\n if (typeof text !== 'string') text = String(text ?? '');\r\n\r\n // 现代 API\r\n if (navigator.clipboard && typeof navigator.clipboard.writeText === 'function') {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n return;\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n } catch (e) {\r\n // 继续尝试回退方案\r\n }\r\n }\r\n\r\n // 回退方案:使用隐藏 textarea + execCommand('copy')\r\n return new Promise<void>((resolve, reject) => {\r\n try {\r\n const textarea = document.createElement('textarea');\r\n textarea.value = text;\r\n\r\n // 避免视觉影响与页面布局影响\r\n textarea.setAttribute('readonly', '');\r\n textarea.style.position = 'fixed';\r\n textarea.style.top = '0';\r\n textarea.style.right = '-9999px';\r\n textarea.style.opacity = '0';\r\n textarea.style.pointerEvents = 'none';\r\n\r\n document.body.appendChild(textarea);\r\n\r\n // 选中文本(移动端兼容)\r\n textarea.focus();\r\n textarea.select();\r\n\r\n // iOS 兼容:明确选区\r\n textarea.setSelectionRange(0, textarea.value.length);\r\n\r\n const ok = document.execCommand('copy');\r\n document.body.removeChild(textarea);\r\n\r\n if (ok) {\r\n resolve();\r\n } else {\r\n reject(new Error('Copy failed: clipboard unavailable'));\r\n }\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * 复制富文本 HTML 到剪贴板(移动端与 PC)\r\n * 使用场景:图文混排文章、带样式段落,保留格式粘贴。\r\n * @param html HTML字符串\r\n * @example\r\n * await copyHtml('<p><b>加粗</b> 与 <i>斜体</i></p>');\r\n */\r\nexport async function copyHtml(html: string): Promise<void> {\r\n const s = String(html ?? '');\r\n if (canWriteClipboard()) {\r\n const plain = htmlToText(s);\r\n await writeClipboard({\r\n 'text/html': new Blob([s], { type: 'text/html' }),\r\n 'text/plain': new Blob([plain], { type: 'text/plain' }),\r\n });\r\n return;\r\n }\r\n return execCopyFromHtml(s);\r\n}\r\n\r\n/**\r\n * 复制 DOM 节点到剪贴板(移动端与 PC)\r\n * 使用场景:页面已有区域的可视化复制;元素使用 `outerHTML`,非元素使用其文本内容。\r\n * @param node DOM 节点(元素或文本节点)\r\n * @example\r\n * const el = document.querySelector('#article')!;\r\n * await copyNode(el);\r\n */\r\nexport async function copyNode(node: Node): Promise<void> {\r\n if (canWriteClipboard()) {\r\n const { html, text } = nodeToHtmlText(node);\r\n await writeClipboard({\r\n 'text/html': new Blob([html], { type: 'text/html' }),\r\n 'text/plain': new Blob([text], { type: 'text/plain' }),\r\n });\r\n return;\r\n }\r\n const { html } = nodeToHtmlText(node);\r\n return execCopyFromHtml(html);\r\n}\r\n\r\n/**\r\n * 复制单张图片到剪贴板(移动端与 PC,需浏览器支持 `ClipboardItem`)\r\n * 使用场景:把本地 `canvas` 或 `Blob` 生成的图片直接粘贴到聊天/文档。\r\n * @param image 图片源(Blob/Canvas/ImageBitmap)\r\n * @example\r\n * const canvas = document.querySelector('canvas')!;\r\n * await copyImage(canvas);\r\n */\r\nexport async function copyImage(image: Blob | HTMLCanvasElement | ImageBitmap): Promise<void> {\r\n const blob = await toImageBlob(image);\r\n if (!blob) throw new Error('Unsupported image source');\r\n if (canWriteClipboard()) {\r\n const type = blob.type || 'image/png';\r\n await writeClipboard({ [type]: blob });\r\n return;\r\n }\r\n throw new Error('Clipboard image write not supported');\r\n}\r\n\r\n/**\r\n * 复制 URL 到剪贴板(移动端与 PC)\r\n * 写入 `text/uri-list` 与 `text/plain`,在支持 URI 列表的应用中可识别为链接。\r\n * @param url 完整的 URL 字符串\r\n * @example\r\n * await copyUrl('https://example.com/page');\r\n */\r\nexport async function copyUrl(url: string): Promise<void> {\r\n const s = String(url ?? '');\r\n if (canWriteClipboard()) {\r\n await writeClipboard({\r\n 'text/uri-list': new Blob([s], { type: 'text/uri-list' }),\r\n 'text/plain': new Blob([s], { type: 'text/plain' }),\r\n });\r\n return;\r\n }\r\n await copyText(s);\r\n}\r\n\r\n/**\r\n * 复制任意 Blob 到剪贴板(移动端与 PC,需 `ClipboardItem`)\r\n * 使用场景:原生格式粘贴(如 `image/svg+xml`、`application/pdf` 等)。\r\n * @param blob 任意 Blob 数据\r\n * @example\r\n * const svg = new Blob(['<svg></svg>'], { type: 'image/svg+xml' });\r\n * await copyBlob(svg);\r\n */\r\nexport async function copyBlob(blob: Blob): Promise<void> {\r\n if (canWriteClipboard()) {\r\n const type = blob.type || 'application/octet-stream';\r\n await writeClipboard({ [type]: blob });\r\n return;\r\n }\r\n throw new Error('Clipboard blob write not supported');\r\n}\r\n\r\n/**\r\n * 复制 RTF 富文本到剪贴板(移动端与 PC)\r\n * 同时写入 `text/plain`,增强与 Office/富文本编辑器的兼容性。\r\n * @param rtf RTF 字符串(如:`{\\\\rtf1\\\\ansi ...}`)\r\n * @example\r\n * await copyRtf('{\\\\rtf1\\\\ansi Hello \\\\b World}');\r\n */\r\nexport async function copyRtf(rtf: string): Promise<void> {\r\n const s = String(rtf ?? '');\r\n if (canWriteClipboard()) {\r\n const plain = s\r\n .replace(/\\\\par[\\s]?/g, '\\n')\r\n .replace(/\\{[^}]*\\}/g, '')\r\n .replace(/\\\\[a-zA-Z]+[0-9'-]*/g, '')\r\n .replace(/\\r?\\n/g, '\\n')\r\n .trim();\r\n await writeClipboard({\r\n 'text/rtf': new Blob([s], { type: 'text/rtf' }),\r\n 'text/plain': new Blob([plain], { type: 'text/plain' }),\r\n });\r\n return;\r\n }\r\n await copyText(s);\r\n}\r\n\r\n/**\r\n * 复制表格到剪贴板(移动端与 PC)\r\n * 同时写入多种 MIME:`text/html`(表格)、`text/tab-separated-values`(TSV)、`text/csv`、`text/plain`(TSV)。\r\n * 使用场景:优化粘贴到 Excel/Google Sheets/Docs 的体验\r\n * @param rows 二维数组,每行一个数组(字符串/数字)\r\n * @example\r\n * await copyTable([\r\n * ['姓名', '分数'],\r\n * ['张三', 95],\r\n * ['李四', 88],\r\n * ]);\r\n */\r\nexport async function copyTable(rows: Array<Array<string | number>>): Promise<void> {\r\n const data = Array.isArray(rows) ? rows : [];\r\n const escapeHtml = (t: string) =>\r\n t\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&#39;');\r\n const html = (() => {\r\n const trs = data\r\n .map((r) => `<tr>${r.map((c) => `<td>${escapeHtml(String(c))}</td>`).join('')}</tr>`)\r\n .join('');\r\n return `<table>${trs}</table>`;\r\n })();\r\n const tsv = data.map((r) => r.map((c) => String(c)).join('\\t')).join('\\n');\r\n const csv = data\r\n .map((r) =>\r\n r\r\n .map((c) => {\r\n const s = String(c);\r\n const needQuote = /[\",\\n]/.test(s);\r\n const escaped = s.replace(/\"/g, '\"\"');\r\n return needQuote ? `\"${escaped}\"` : escaped;\r\n })\r\n .join(','),\r\n )\r\n .join('\\n');\r\n if (canWriteClipboard()) {\r\n await writeClipboard({\r\n 'text/html': new Blob([html], { type: 'text/html' }),\r\n 'text/tab-separated-values': new Blob([tsv], { type: 'text/tab-separated-values' }),\r\n 'text/csv': new Blob([csv], { type: 'text/csv' }),\r\n 'text/plain': new Blob([tsv], { type: 'text/plain' }),\r\n });\r\n return;\r\n }\r\n await copyText(tsv);\r\n}\r\n\r\nasync function toImageBlob(image: Blob | HTMLCanvasElement | ImageBitmap) {\r\n if (image instanceof Blob) return image;\r\n if (image instanceof HTMLCanvasElement)\r\n return await new Promise<Blob>((resolve, reject) => {\r\n image.toBlob(\r\n (b) => (b ? resolve(b) : reject(new Error('Canvas toBlob failed'))),\r\n 'image/png',\r\n );\r\n });\r\n const isBitmap = typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap;\r\n if (isBitmap) {\r\n const cnv = document.createElement('canvas');\r\n cnv.width = (image as ImageBitmap).width;\r\n cnv.height = (image as ImageBitmap).height;\r\n const ctx = cnv.getContext('2d');\r\n ctx?.drawImage(image as ImageBitmap, 0, 0);\r\n return await new Promise<Blob>((resolve, reject) => {\r\n cnv.toBlob((b) => (b ? resolve(b) : reject(new Error('Canvas toBlob failed'))), 'image/png');\r\n });\r\n }\r\n return null;\r\n}\r\n\r\nfunction canWriteClipboard() {\r\n return !!(\r\n navigator.clipboard &&\r\n typeof navigator.clipboard.write === 'function' &&\r\n typeof ClipboardItem !== 'undefined'\r\n );\r\n}\r\n\r\nasync function writeClipboard(items: Record<string, Blob>) {\r\n await navigator.clipboard!.write([new ClipboardItem(items)]);\r\n}\r\n\r\nfunction htmlToText(html: string) {\r\n const div = document.createElement('div');\r\n div.innerHTML = html;\r\n return div.textContent || '';\r\n}\r\n\r\nfunction nodeToHtmlText(node: Node) {\r\n const container = document.createElement('div');\r\n container.appendChild(node.cloneNode(true));\r\n const html =\r\n node instanceof Element ? (node.outerHTML ?? container.innerHTML) : container.innerHTML;\r\n const text = container.textContent || '';\r\n return { html, text };\r\n}\r\n\r\nfunction execCopyFromHtml(html: string) {\r\n return new Promise<void>((resolve, reject) => {\r\n try {\r\n const div = document.createElement('div');\r\n div.contentEditable = 'true';\r\n div.style.position = 'fixed';\r\n div.style.top = '0';\r\n div.style.right = '-9999px';\r\n div.style.opacity = '0';\r\n div.style.pointerEvents = 'none';\r\n div.innerHTML = html;\r\n document.body.appendChild(div);\r\n const selection = window.getSelection();\r\n const range = document.createRange();\r\n range.selectNodeContents(div);\r\n selection?.removeAllRanges();\r\n selection?.addRange(range);\r\n const ok = document.execCommand('copy');\r\n document.body.removeChild(div);\r\n selection?.removeAllRanges();\r\n if (ok) {\r\n resolve();\r\n } else {\r\n reject(new Error('Copy failed: clipboard unavailable'));\r\n }\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n}\r\n","export type AppConfig = {\r\n /** 全局 Toast 提示 */\r\n toast?: (option: { msg: string; status: 'success' | 'fail' }) => void;\r\n /** 显示全局 Loading */\r\n showLoading?: () => void;\r\n /** 隐藏全局 Loading */\r\n hideLoading?: () => void;\r\n /** 跳转登录页的方法 */\r\n toLogin?: () => void;\r\n /** 日志记录函数 */\r\n log?: (level: 'info' | 'error' | 'warn' | 'debug', data: AppLogInfo) => void;\r\n};\r\n\r\nexport type AppLogInfo = {\r\n /** 调用函数的名称 */\r\n name: string;\r\n\r\n /** 函数的调用状态 */\r\n status?: 'success' | 'fail';\r\n\r\n /** 函数的调用参数 */\r\n option?: unknown;\r\n\r\n /** 函数的调用结果 */\r\n res?: unknown;\r\n\r\n /** 函数的调用错误 */\r\n e?: unknown;\r\n\r\n /** 日志描述 */\r\n desc?: string;\r\n\r\n // 其他自定义属性\r\n [key: string]: unknown;\r\n};\r\n\r\nconst appConfig: AppConfig = {};\r\n\r\n/**\r\n * 获取应用配置\r\n */\r\nexport function getBaseToolsConfig() {\r\n return appConfig;\r\n}\r\n\r\n/**\r\n * 初始化应用配置 (在入口文件设置)\r\n * @example\r\n * setBaseToolsConfig({\r\n * toast: ({ msg, status }) => (status === 'fail' ? message.error(msg) : message.success(msg)),\r\n * showLoading: () => message.loading('加载中...'),\r\n * hideLoading: () => message.destroy(),\r\n * toLogin: () => reLogin(),\r\n * log(level, data) {\r\n * if (data.name === 'request') {\r\n * sendLog('request', data); // 请求日志\r\n * } else if (level === 'error') {\r\n * sendLog('error', data); // 错误日志\r\n * } else {\r\n * sendLog('action', data); // 操作日志\r\n * }\r\n * },\r\n * });\r\n */\r\nexport function setBaseToolsConfig(newConfig: AppConfig) {\r\n Object.assign(appConfig, newConfig);\r\n}\r\n","/**\r\n * 设置 Cookie(路径默认为 `/`)\r\n * @param name Cookie 名称\r\n * @param value Cookie 值(内部已使用 `encodeURIComponent` 编码)\r\n * @param days 过期天数(从当前时间起算)\r\n * @example\r\n * setCookie('token', 'abc', 7);\r\n */\r\nexport function setCookie(name: string, value: string, days: number) {\r\n const date = new Date();\r\n date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);\r\n const expires = `expires=${date.toUTCString()}; path=/`;\r\n document.cookie = `${name}=${encodeURIComponent(value)}; ${expires}`;\r\n}\r\n\r\n/**\r\n * 获取 Cookie\r\n * @param name Cookie 名称\r\n * @returns 若存在返回解码后的值,否则 `null`\r\n * @example\r\n * const token = getCookie('token');\r\n */\r\nexport function getCookie(name: string): string | null {\r\n const value = `; ${document.cookie}`;\r\n const parts = value.split(`; ${name}=`);\r\n if (parts.length === 2) {\r\n const v = parts.pop()?.split(';').shift();\r\n return v ? decodeURIComponent(v) : null;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 移除 Cookie(通过设置过期时间为过去)\r\n * 路径固定为 `/`,确保与默认写入路径一致。\r\n * @param name Cookie 名称\r\n * @example\r\n * removeCookie('token');\r\n */\r\nexport function removeCookie(name: string) {\r\n document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/`;\r\n}\r\n","/**\r\n * 获取用户代理字符串(UA)\r\n * @returns navigator.userAgent.toLowerCase();\r\n */\r\nexport function getUA(): string {\r\n if (typeof navigator === 'undefined') return ''; // SSR无 navigator\r\n return (navigator.userAgent || '').toLowerCase();\r\n}\r\n\r\n/**\r\n * 是否为移动端设备(含平板)\r\n */\r\nexport function isMobile(): boolean {\r\n const ua = getUA();\r\n return /android|webos|iphone|ipod|blackberry|iemobile|opera mini|mobile/i.test(ua);\r\n}\r\n\r\n/**\r\n * 是否为平板设备\r\n */\r\nexport function isTablet(): boolean {\r\n const ua = getUA();\r\n return /ipad|android(?!.*mobile)|tablet/i.test(ua) && !/mobile/i.test(ua);\r\n}\r\n\r\n/**\r\n * 是否为 PC 设备\r\n */\r\nexport function isPC(): boolean {\r\n return !isMobile() && !isTablet();\r\n}\r\n\r\n/**\r\n * 是否为 iOS 系统\r\n */\r\nexport function isIOS(): boolean {\r\n const ua = getUA();\r\n return /iphone|ipad|ipod/i.test(ua);\r\n}\r\n\r\n/**\r\n * 是否为 Android 系统\r\n */\r\nexport function isAndroid(): boolean {\r\n const ua = getUA();\r\n return /android/i.test(ua);\r\n}\r\n\r\n/**\r\n * 是否微信内置浏览器\r\n */\r\nexport function isWeChat(): boolean {\r\n const ua = getUA();\r\n return /micromessenger/i.test(ua);\r\n}\r\n\r\n/**\r\n * 是否为 Chrome 浏览器\r\n * 已排除 Edge、Opera 等基于 Chromium 的浏览器\r\n */\r\nexport function isChrome(): boolean {\r\n const ua = getUA();\r\n return /chrome\\//i.test(ua) && !/edg\\//i.test(ua) && !/opr\\//i.test(ua) && !/whale\\//i.test(ua);\r\n}\r\n\r\n/**\r\n * 检测是否支持触摸事件\r\n */\r\nexport function isTouchSupported(): boolean {\r\n if (typeof window === 'undefined') return false;\r\n return 'ontouchstart' in window || navigator.maxTouchPoints > 0;\r\n}\r\n\r\n/**\r\n * 获取设备像素比\r\n */\r\nexport function getDevicePixelRatio(): number {\r\n if (typeof window === 'undefined') return 1;\r\n return window.devicePixelRatio || 1;\r\n}\r\n\r\n/**\r\n * 获取浏览器名字\r\n */\r\nexport function getBrowserName(): string | null {\r\n const ua = getUA();\r\n\r\n if (/chrome\\//i.test(ua)) return 'chrome';\r\n if (/safari\\//i.test(ua)) return 'safari';\r\n if (/firefox\\//i.test(ua)) return 'firefox';\r\n if (/opr\\//i.test(ua)) return 'opera';\r\n if (/edg\\//i.test(ua)) return 'edge';\r\n if (/msie|trident/i.test(ua)) return 'ie';\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * 获取浏览器版本号\r\n */\r\nexport function getBrowserVersion(): string | null {\r\n const ua = getUA();\r\n\r\n const versionPatterns = [\r\n /(?:edg|edge)\\/([0-9.]+)/i,\r\n /(?:opr|opera)\\/([0-9.]+)/i,\r\n /chrome\\/([0-9.]+)/i,\r\n /firefox\\/([0-9.]+)/i,\r\n /version\\/([0-9.]+).*safari/i,\r\n /(?:msie |rv:)([0-9.]+)/i,\r\n ];\r\n\r\n for (const pattern of versionPatterns) {\r\n const matches = ua.match(pattern);\r\n if (matches && matches[1]) {\r\n return matches[1];\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * 获取操作系统信息\r\n */\r\nexport function getOS(): string {\r\n const ua = getUA();\r\n\r\n if (/windows/i.test(ua)) return 'windows';\r\n if (/mac os/i.test(ua)) return 'macos';\r\n if (/linux/i.test(ua)) return 'linux';\r\n if (/iphone|ipad|ipod/i.test(ua)) return 'ios';\r\n if (/android/i.test(ua)) return 'android';\r\n\r\n return 'unknown';\r\n}\r\n","/**\r\n * 获取窗口宽度(不含滚动条)\r\n * @returns 窗口宽度\r\n */\r\nexport function getWindowWidth() {\r\n return window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;\r\n}\r\n\r\n/**\r\n * 获取窗口高度(不含滚动条)\r\n * @returns 窗口高度\r\n */\r\nexport function getWindowHeight() {\r\n return window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;\r\n}\r\n\r\n/**\r\n * 获取文档垂直滚动位置\r\n * @example\r\n * const top = getWindowScrollTop();\r\n */\r\nexport function getWindowScrollTop() {\r\n const doc = document.documentElement;\r\n const body = document.body;\r\n return window.pageYOffset || doc.scrollTop || body.scrollTop || 0;\r\n}\r\n\r\n/**\r\n * 获取文档水平滚动位置\r\n * @example\r\n * const left = getWindowScrollLeft();\r\n */\r\nexport function getWindowScrollLeft() {\r\n const doc = document.documentElement;\r\n const body = document.body;\r\n return window.pageXOffset || doc.scrollLeft || body.scrollLeft || 0;\r\n}\r\n\r\n/**\r\n * 平滑滚动到指定位置\r\n * @param top 目标纵向滚动位置\r\n * @param behavior 滚动行为,默认 'smooth'\r\n * @example\r\n * windowScrollTo(0);\r\n */\r\nexport function windowScrollTo(top: number, behavior: ScrollBehavior = 'smooth') {\r\n if ('scrollBehavior' in document.documentElement.style) {\r\n window.scrollTo({ top, behavior });\r\n } else {\r\n window.scrollTo(0, top);\r\n }\r\n}\r\n\r\n/**\r\n * 元素是否在视口内(可设置阈值)\r\n * @param el 目标元素\r\n * @param offset 额外判定偏移(像素,正数放宽,负数收紧)\r\n * @returns 是否在视口内\r\n */\r\nexport function isInViewport(el: Element, offset = 0) {\r\n const rect = el.getBoundingClientRect();\r\n const width = getWindowWidth();\r\n const height = getWindowHeight();\r\n return (\r\n rect.bottom >= -offset &&\r\n rect.right >= -offset &&\r\n rect.top <= height + offset &&\r\n rect.left <= width + offset\r\n );\r\n}\r\n\r\n/**\r\n * 锁定页面滚动(移动端/PC)\r\n * 使用 `body{ position: fixed }` 技术消除滚动条抖动,记录并恢复滚动位置。\r\n * @example\r\n * lockBodyScroll();\r\n */\r\nexport function lockBodyScroll() {\r\n const body = document.body;\r\n if (body.dataset.scrollLock === 'true') return;\r\n const y = Math.round(window.scrollY || window.pageYOffset || 0);\r\n body.dataset.scrollLock = 'true';\r\n body.dataset.scrollLockY = String(y);\r\n body.style.position = 'fixed';\r\n body.style.top = `-${y}px`;\r\n body.style.left = '0';\r\n body.style.right = '0';\r\n body.style.width = '100%';\r\n}\r\n\r\n/**\r\n * 解除页面滚动锁定,恢复原始滚动位置\r\n * @example\r\n * unlockBodyScroll();\r\n */\r\nexport function unlockBodyScroll() {\r\n const body = document.body;\r\n if (body.dataset.scrollLock !== 'true') return;\r\n const y = Number(body.dataset.scrollLockY || 0);\r\n body.style.position = '';\r\n body.style.top = '';\r\n body.style.left = '';\r\n body.style.right = '';\r\n body.style.width = '';\r\n delete body.dataset.scrollLock;\r\n delete body.dataset.scrollLockY;\r\n window.scrollTo(0, y);\r\n}\r\n","import type { AxiosResponse } from 'axios';\r\n\r\n/**\r\n * 下载文件\r\n * @param url 完整的下载地址 | base64字符串 | Blob对象\r\n * @param fileName 自定义文件名(需含后缀)\r\n * @example\r\n * download('https://xx/xx.pdf');\r\n * download('https://xx/xx.pdf', 'xx.pdf');\r\n * download(blob, '图片.jpg');\r\n */\r\nexport async function download(url: string | Blob, fileName = '') {\r\n if (!url) return;\r\n\r\n let blobUrl = '';\r\n let needRevoke = false; // createObjectURL必须revoke,否则内存泄露,刷新页面都不释放\r\n try {\r\n if (url instanceof Blob) {\r\n // Blob对象\r\n blobUrl = URL.createObjectURL(url);\r\n needRevoke = true;\r\n } else if (url.includes(';base64,')) {\r\n // base64字符串\r\n blobUrl = url;\r\n } else {\r\n if (fileName) {\r\n // 自定义文件名:跨域的url无法自定义文件名,此处统一转为blob\r\n const res = await fetch(url);\r\n if (!res.ok) throw new Error(`fetch error ${res.status}:${url}`); // 拦截错误页(404/500 等 HTML)\r\n const blob = await res.blob();\r\n blobUrl = URL.createObjectURL(blob);\r\n needRevoke = true;\r\n } else {\r\n // 非自定义文件名的普通链接\r\n blobUrl = url;\r\n }\r\n }\r\n\r\n // window.location.href = fileUrl // 可能会关闭当前页面\r\n // window.open(fileUrl, '_blank') // 不支持下载图片\r\n // 通过a标签模拟点击下载\r\n const a = document.createElement('a');\r\n a.href = blobUrl;\r\n a.download = fileName; // 若为空字符串,则会自动取url的文件名(跨域url无法自定义文件名,需转为blob)\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n } finally {\r\n if (needRevoke) {\r\n setTimeout(() => URL.revokeObjectURL(blobUrl), 100); // Safari 需要延迟 revoke\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 解析Axios返回的Blob数据\r\n * @param res Axios响应对象 (responseType='blob')\r\n * @returns 包含blob数据和文件名的对象 { blob, fileName }\r\n * @example\r\n * const res = await axios.get(url, { responseType: 'blob' });\r\n * const { blob, fileName } = await parseAxiosBlob(res);\r\n * download(blob, fileName);\r\n */\r\nexport async function parseAxiosBlob(res: AxiosResponse<Blob>) {\r\n const { data, headers, status, statusText, config } = res;\r\n\r\n if (status < 200 || status >= 300) throw new Error(`${status},${statusText}:${config.url}`);\r\n\r\n // 抛出json错误\r\n if (data.type.includes('application/json')) {\r\n const txt = await data.text();\r\n throw JSON.parse(txt);\r\n }\r\n\r\n // 解析文件名\r\n const fileName = getDispositionFileName(headers['content-disposition']);\r\n return { blob: data, fileName };\r\n}\r\n\r\n/**\r\n * 获取文件名\r\n * @param disposition content-disposition头值\r\n * @returns content-disposition中的filename\r\n * @example\r\n * const fileName = getDispositionFileName(headers['content-disposition']);\r\n */\r\nexport function getDispositionFileName(disposition?: string) {\r\n if (!disposition) return '';\r\n\r\n // 1. RFC5987 filename* 优先\r\n const rfc5987 = /filename\\*\\s*=\\s*([^']*)''([^;]*)/i.exec(disposition);\r\n if (rfc5987?.[2]) {\r\n try {\r\n return decodeURIComponent(rfc5987[2].trim()).replace(/[\\r\\n]+/g, '');\r\n } catch {\r\n return rfc5987[2].trim().replace(/[\\r\\n]+/g, '');\r\n }\r\n }\r\n\r\n // 2. 旧式 filename=\r\n const old = /filename\\s*=\\s*(?:\"([^\"]*)\"|([^\";]*))(?=;|$)/i.exec(disposition);\r\n if (old) return (old[1] ?? old[2]).trim().replace(/[\\r\\n]+/g, '');\r\n\r\n return '';\r\n}\r\n\r\n/**\r\n * 动态加载 JS(重复执行不会重复加载,内部已排重)\r\n * @param src js 文件路径\r\n * @param attrs 可选的脚本属性,如 async、defer、crossOrigin\r\n * @example\r\n * await loadJs('https://xx/xx.js');\r\n * await loadJs('/a.js', { defer: true });\r\n */\r\nexport async function loadJs(\r\n src: string,\r\n attrs?: Pick<HTMLScriptElement, 'async' | 'defer' | 'crossOrigin'>,\r\n) {\r\n return new Promise<void>((resolve, reject) => {\r\n if (hasJs(src)) return resolve();\r\n\r\n const script = document.createElement('script');\r\n script.type = 'text/javascript';\r\n script.src = src;\r\n\r\n if (attrs) {\r\n const keys = Object.keys(attrs) as Array<keyof typeof attrs>;\r\n keys.forEach((key) => {\r\n const v = attrs[key];\r\n if (v === null || v === undefined || v === false) return;\r\n script.setAttribute(key, typeof v === 'boolean' ? '' : v);\r\n });\r\n }\r\n\r\n script.onload = () => resolve();\r\n script.onerror = (e) => reject(e);\r\n\r\n document.head.appendChild(script);\r\n });\r\n}\r\n\r\n/**\r\n * 判断某个 JS 地址是否已在页面中加载过\r\n * @param src 相对、绝对路径的 JS 地址\r\n * @returns 是否已加载过\r\n * @example\r\n * hasJs('https://xx/xx.js'); // boolean\r\n * hasJs('/xx.js'); // boolean\r\n * hasJs('xx.js'); // boolean\r\n */\r\nexport function hasJs(src: string) {\r\n const target = new URL(src, document.baseURI).href;\r\n const jsList = Array.from(document.querySelectorAll('script[src]'));\r\n return jsList.some((e) => {\r\n const src = e.getAttribute('src');\r\n return src && new URL(src, document.baseURI).href === target;\r\n });\r\n}\r\n\r\n/**\r\n * 动态加载 CSS(重复执行不会重复加载,内部已排重)\r\n * @param href css 文件地址\r\n * @param attrs 可选属性,如 crossOrigin、media\r\n * @example\r\n * await loadCss('https://xx/xx.css');\r\n * await loadCss('/a.css', { media: 'print' });\r\n */\r\nexport async function loadCss(\r\n href: string,\r\n attrs?: Pick<HTMLLinkElement, 'crossOrigin' | 'media'>,\r\n) {\r\n return new Promise<void>((resolve, reject) => {\r\n if (hasCss(href)) return resolve();\r\n\r\n const link = document.createElement('link');\r\n link.rel = 'stylesheet';\r\n link.href = href;\r\n\r\n if (attrs) {\r\n const keys = Object.keys(attrs) as Array<keyof typeof attrs>;\r\n keys.forEach((key) => {\r\n const v = attrs[key];\r\n if (v === null || v === undefined) return;\r\n link.setAttribute(key, String(v));\r\n });\r\n }\r\n\r\n link.onload = () => resolve();\r\n link.onerror = (e) => reject(e);\r\n\r\n document.head.appendChild(link);\r\n });\r\n}\r\n\r\n/**\r\n * 判断某个 CSS 地址是否已在页面中加载过\r\n * @param href 相对、绝对路径的 CSS 地址\r\n * @returns 是否已加载过\r\n * @example\r\n * hasCss('https://xx/xx.css'); // boolean\r\n */\r\nexport function hasCss(href: string) {\r\n const target = new URL(href, document.baseURI).href;\r\n const list = Array.from(document.querySelectorAll('link[rel=\"stylesheet\"][href]'));\r\n return list.some((e) => {\r\n const h = e.getAttribute('href');\r\n return h && new URL(h, document.baseURI).href === target;\r\n });\r\n}\r\n\r\n/**\r\n * 预加载图片\r\n * @param src 图片地址\r\n * @returns Promise<HTMLImageElement>\r\n * @example\r\n * await preloadImage('/a.png');\r\n */\r\nexport function preloadImage(src: string) {\r\n return new Promise<HTMLImageElement>((resolve, reject) => {\r\n const img = new Image();\r\n img.onload = () => resolve(img);\r\n img.onerror = (e) => reject(e);\r\n img.src = src;\r\n });\r\n}\r\n","import dayjs from 'dayjs';\r\nimport customParseFormat from 'dayjs/plugin/customParseFormat';\r\nimport utc from 'dayjs/plugin/utc';\r\nimport timezone from 'dayjs/plugin/timezone';\r\nimport relativeTime from 'dayjs/plugin/relativeTime';\r\nimport advancedFormat from 'dayjs/plugin/advancedFormat';\r\nimport 'dayjs/locale/zh-cn';\r\nimport { zeroPad } from '../number';\r\n\r\ndayjs.extend(customParseFormat);\r\ndayjs.extend(utc);\r\ndayjs.extend(timezone);\r\ndayjs.extend(relativeTime);\r\ndayjs.extend(advancedFormat);\r\ndayjs.locale('zh-cn');\r\n\r\ntype BaseTime = number | string | Date | dayjs.Dayjs | null | undefined;\r\n\r\n/**\r\n * 创建 dayjs 实例\r\n * 文档: https://day.js.org/zh-CN/\r\n * @param t 各种规范或不规范的时间\r\n * @returns dayjs 实例\r\n * @example\r\n * const d = toDayjs('2021-01-01'); // dayjs 实例 (无参,则默认当前时间)\r\n * d.format('YYYY-MM-DD HH:mm:ss'); // \"2025-12-10 11:33:16\"\r\n * d.valueOf(); // 毫秒时间戳,如 1765337596913\r\n * d.unix(); // 秒时间戳,如 1765337596\r\n * d.millisecond(); // 毫秒 913\r\n * d.second(); // 秒 16\r\n * d.minute(); // 分 33\r\n * d.hour(); // 时 11\r\n * d.date(); // 日 10\r\n * d.day(); // 星期几 5(周日=0)\r\n * d.month() + 1; // 月 12\r\n * d.year(); // 年 2025\r\n * d.startOf('day').valueOf(); // 当日零点\r\n * d.startOf('month').format('YYYY-MM-DD HH:mm:ss'); // 月初 \"2025-12-01 00:00:00\"\r\n * d.endOf('month').format('YYYY-MM-DD HH:mm:ss'); // 月末 \"2025-12-31 23:59:59\"\r\n * d.fromNow(); // “刚刚”、“x分钟前/后”、“x小时前/后”、“x天前/后”、“x月前/后”、“x年前/后”\r\n * d.isSame(t, 'day'); // 是否与t在同一天\r\n * d.diff(); // 与当前时间相差的毫秒数\r\n * d.diff(t); // 与t相差的毫秒数\r\n * d.diff(t, 'second'); // 与t相差的秒数\r\n * d.diff(t, 'minute'); // 与t相差的分钟数\r\n * d.diff(t, 'hour'); // 与t相差的小时数\r\n * d.diff(t, 'day'); // 与t相差的天数\r\n * d.diff(t, 'week'); // 与t相差的周数\r\n * d.diff(t, 'month'); // 与t相差的月数\r\n * d.diff(t, 'quarter'); // 与t相差的季度数\r\n * d.diff(t, 'year'); // 与t相差的年数\r\n */\r\nexport function toDayjs(t?: BaseTime, fmt?: dayjs.OptionType) {\r\n if (t === null || t === undefined) return dayjs();\r\n if (typeof t === 'number') {\r\n const s = String(Math.trunc(t));\r\n return dayjs(s.length === 10 ? t * 1000 : t, fmt);\r\n }\r\n if (typeof t === 'string') {\r\n const s = t.trim();\r\n if (/^\\d{10}$/.test(s)) return dayjs(Number(s) * 1000, fmt);\r\n if (/^\\d{13}$/.test(s)) return dayjs(Number(s), fmt);\r\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(s)) return dayjs(s, fmt || 'YYYY-MM-DD');\r\n if (/^\\d{4}\\/\\d{2}\\/\\d{2}$/.test(s)) return dayjs(s, fmt || 'YYYY/MM/DD');\r\n if (/^\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2}$/.test(s))\r\n return dayjs(s, fmt || 'YYYY-MM-DD HH:mm:ss');\r\n if (/^\\d{4}\\/\\d{2}\\/\\d{2}\\s+\\d{2}:\\d{2}:\\d{2}$/.test(s))\r\n return dayjs(s, fmt || 'YYYY/MM/DD HH:mm:ss');\r\n return dayjs(s, fmt);\r\n }\r\n return dayjs(t, fmt);\r\n}\r\n\r\n/**\r\n * 获取“前几天”的日期范围\r\n * @param offset 正整数天数\r\n * @param fmt 日期格式,默认 `YYYY-MM-DD`\r\n * @returns `[start, end]` 日期字符串数组\r\n * @example\r\n * 若今天为 2025-11-19:\r\n * getDateRangeBefore(1) // ['2025-11-18', '2025-11-19']\r\n * getDateRangeBefore(1, 'YYYY-MM-DD HH:mm:ss') // ['2025-11-18 00:00:00', '2025-11-19 23:59:59']\r\n */\r\nexport function getDateRangeBefore(offset: number, fmt = 'YYYY-MM-DD') {\r\n const now = toDayjs(Date.now());\r\n const n = Math.max(0, Math.trunc(offset));\r\n const hasTime = /H|h|m|s|S|A|a|x|X/.test(fmt);\r\n const startDay = now.add(-n, 'day');\r\n const endDay = now;\r\n const start = (hasTime ? startDay.startOf('day') : startDay).format(fmt);\r\n const end = (hasTime ? endDay.endOf('day') : endDay).format(fmt);\r\n return [start, end];\r\n}\r\n\r\n/**\r\n * 获取“后几天”的日期范围\r\n * - 起点:今天;终点:`offset` 天后\r\n * - 若 `fmt` 含时间令牌(如 `HH:mm:ss`),则返回整日范围:起点为当日零点,终点为当日末尾\r\n * @param offset 正整数天数\r\n * @param fmt 日期格式,默认 `YYYY-MM-DD`\r\n * @returns `[start, end]` 日期字符串数组\r\n * @example\r\n * 若今天为 2025-11-19:\r\n * getDateRangeAfter(1) // ['2025-11-19', '2025-11-20']\r\n * getDateRangeAfter(1, 'YYYY-MM-DD HH:mm:ss') // ['2025-11-19 00:00:00', '2025-11-20 23:59:59']\r\n */\r\nexport function getDateRangeAfter(offset: number, fmt = 'YYYY-MM-DD') {\r\n const now = toDayjs(Date.now());\r\n const n = Math.max(0, Math.trunc(offset));\r\n const hasTime = /H|h|m|s|S|A|a|x|X/.test(fmt);\r\n const startDay = now;\r\n const endDay = now.add(n, 'day');\r\n const start = (hasTime ? startDay.startOf('day') : startDay).format(fmt);\r\n const end = (hasTime ? endDay.endOf('day') : endDay).format(fmt);\r\n return [start, end];\r\n}\r\n\r\n/**\r\n * 获取倒计时的时间分解(零填充字符串)\r\n * @param diff 毫秒差值(正数表示剩余时间,负数/0表示已到期)\r\n * @returns 包含天、时、分、秒、毫秒的零填充对象\r\n * @example\r\n * const diff = toDayjs(t).diff(); // 毫秒差值\r\n * const parts = getCountdownParts(diff); // { d: '00', h: '00', m: '00', s: '00', ms: '000' }\r\n */\r\nexport function getCountdownParts(diff: number) {\r\n if (diff <= 0) return { d: '00', h: '00', m: '00', s: '00', ms: '000' };\r\n\r\n const d = Math.floor(diff / (1000 * 60 * 60 * 24));\r\n const h = Math.floor((diff / (1000 * 60 * 60)) % 24);\r\n const m = Math.floor((diff / (1000 * 60)) % 60);\r\n const s = Math.floor((diff / 1000) % 60);\r\n const ms = diff % 1000;\r\n\r\n return {\r\n d: zeroPad(d),\r\n h: zeroPad(h),\r\n m: zeroPad(m),\r\n s: zeroPad(s),\r\n ms: zeroPad(ms, 3),\r\n };\r\n}\r\n\r\n/**\r\n * 通过出生日期计算年龄\r\n * @param birthdate 生日日期,支持多种格式(会被自动解析)\r\n * @returns 年龄对象,包含 `age`(年龄数值)和 `type`(年龄单位,'year' 表示年,'month' 表示月)\r\n * @example\r\n * // 假设当前日期为 2025-11-19\r\n * getAgeByBirthdate('2025-05-10'); // { age: 6, type: 'month' }\r\n * getAgeByBirthdate('2020-11-19'); // { age: 5, type: 'year' }\r\n * getAgeByBirthdate('2020-12-01'); // { age: 4, type: 'year' }(生日还没到, 所以年龄是4岁)\r\n */\r\nexport function getAgeByBirthdate(birthdate: string) {\r\n const birth = toDayjs(birthdate, 'YYYY-MM-DD');\r\n const now = toDayjs(Date.now());\r\n\r\n // 精确的月份计算\r\n const totalMonths = (now.year() - birth.year()) * 12 + (now.month() - birth.month());\r\n\r\n // 如果当前日期小于出生日期,月份减1\r\n const adjustedMonths = now.date() < birth.date() ? totalMonths - 1 : totalMonths;\r\n\r\n if (adjustedMonths >= 12) {\r\n let age = Math.floor(adjustedMonths / 12);\r\n // 检查生日是否已过\r\n const birthdayThisYear = birth.add(age, 'year');\r\n if (now.isBefore(birthdayThisYear)) {\r\n age--;\r\n }\r\n return { age, type: 'year' };\r\n }\r\n\r\n return { age: adjustedMonths, type: 'month' };\r\n}\r\n\r\n/**\r\n * 对外抛出 dayjs 以便全局配置\r\n * @example\r\n * 切换语言\r\n * dayjs.locale('en'); // 切换为英文\r\n * dayjs.locale('zh-cn'); // 切换为中文 (默认)\r\n */\r\nexport { dayjs };\r\n","function isPrimitive(value) {\n return value == null || (typeof value !== 'object' && typeof value !== 'function');\n}\n\nexport { isPrimitive };\n","function isTypedArray(x) {\n return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n\nexport { isTypedArray };\n","function getSymbols(object) {\n return Object.getOwnPropertySymbols(object).filter(symbol => Object.prototype.propertyIsEnumerable.call(object, symbol));\n}\n\nexport { getSymbols };\n","function getTag(value) {\n if (value == null) {\n return value === undefined ? '[object Undefined]' : '[object Null]';\n }\n return Object.prototype.toString.call(value);\n}\n\nexport { getTag };\n","const regexpTag = '[object RegExp]';\nconst stringTag = '[object String]';\nconst numberTag = '[object Number]';\nconst booleanTag = '[object Boolean]';\nconst argumentsTag = '[object Arguments]';\nconst symbolTag = '[object Symbol]';\nconst dateTag = '[object Date]';\nconst mapTag = '[object Map]';\nconst setTag = '[object Set]';\nconst arrayTag = '[object Array]';\nconst functionTag = '[object Function]';\nconst arrayBufferTag = '[object ArrayBuffer]';\nconst objectTag = '[object Object]';\nconst errorTag = '[object Error]';\nconst dataViewTag = '[object DataView]';\nconst uint8ArrayTag = '[object Uint8Array]';\nconst uint8ClampedArrayTag = '[object Uint8ClampedArray]';\nconst uint16ArrayTag = '[object Uint16Array]';\nconst uint32ArrayTag = '[object Uint32Array]';\nconst bigUint64ArrayTag = '[object BigUint64Array]';\nconst int8ArrayTag = '[object Int8Array]';\nconst int16ArrayTag = '[object Int16Array]';\nconst int32ArrayTag = '[object Int32Array]';\nconst bigInt64ArrayTag = '[object BigInt64Array]';\nconst float32ArrayTag = '[object Float32Array]';\nconst float64ArrayTag = '[object Float64Array]';\n\nexport { argumentsTag, arrayBufferTag, arrayTag, bigInt64ArrayTag, bigUint64ArrayTag, booleanTag, dataViewTag, dateTag, errorTag, float32ArrayTag, float64ArrayTag, functionTag, int16ArrayTag, int32ArrayTag, int8ArrayTag, mapTag, numberTag, objectTag, regexpTag, setTag, stringTag, symbolTag, uint16ArrayTag, uint32ArrayTag, uint8ArrayTag, uint8ClampedArrayTag };\n","import { getSymbols } from '../compat/_internal/getSymbols.mjs';\nimport { getTag } from '../compat/_internal/getTag.mjs';\nimport { uint32ArrayTag, uint16ArrayTag, uint8ClampedArrayTag, uint8ArrayTag, symbolTag, stringTag, setTag, regexpTag, objectTag, numberTag, mapTag, int32ArrayTag, int16ArrayTag, int8ArrayTag, float64ArrayTag, float32ArrayTag, dateTag, booleanTag, dataViewTag, arrayBufferTag, arrayTag, argumentsTag } from '../compat/_internal/tags.mjs';\nimport { isPrimitive } from '../predicate/isPrimitive.mjs';\nimport { isTypedArray } from '../predicate/isTypedArray.mjs';\n\nfunction cloneDeepWith(obj, cloneValue) {\n return cloneDeepWithImpl(obj, undefined, obj, new Map(), cloneValue);\n}\nfunction cloneDeepWithImpl(valueToClone, keyToClone, objectToClone, stack = new Map(), cloneValue = undefined) {\n const cloned = cloneValue?.(valueToClone, keyToClone, objectToClone, stack);\n if (cloned !== undefined) {\n return cloned;\n }\n if (isPrimitive(valueToClone)) {\n return valueToClone;\n }\n if (stack.has(valueToClone)) {\n return stack.get(valueToClone);\n }\n if (Array.isArray(valueToClone)) {\n const result = new Array(valueToClone.length);\n stack.set(valueToClone, result);\n for (let i = 0; i < valueToClone.length; i++) {\n result[i] = cloneDeepWithImpl(valueToClone[i], i, objectToClone, stack, cloneValue);\n }\n if (Object.hasOwn(valueToClone, 'index')) {\n result.index = valueToClone.index;\n }\n if (Object.hasOwn(valueToClone, 'input')) {\n result.input = valueToClone.input;\n }\n return result;\n }\n if (valueToClone instanceof Date) {\n return new Date(valueToClone.getTime());\n }\n if (valueToClone instanceof RegExp) {\n const result = new RegExp(valueToClone.source, valueToClone.flags);\n result.lastIndex = valueToClone.lastIndex;\n return result;\n }\n if (valueToClone instanceof Map) {\n const result = new Map();\n stack.set(valueToClone, result);\n for (const [key, value] of valueToClone) {\n result.set(key, cloneDeepWithImpl(value, key, objectToClone, stack, cloneValue));\n }\n return result;\n }\n if (valueToClone instanceof Set) {\n const result = new Set();\n stack.set(valueToClone, result);\n for (const value of valueToClone) {\n result.add(cloneDeepWithImpl(value, undefined, objectToClone, stack, cloneValue));\n }\n return result;\n }\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(valueToClone)) {\n return valueToClone.subarray();\n }\n if (isTypedArray(valueToClone)) {\n const result = new (Object.getPrototypeOf(valueToClone).constructor)(valueToClone.length);\n stack.set(valueToClone, result);\n for (let i = 0; i < valueToClone.length; i++) {\n result[i] = cloneDeepWithImpl(valueToClone[i], i, objectToClone, stack, cloneValue);\n }\n return result;\n }\n if (valueToClone instanceof ArrayBuffer ||\n (typeof SharedArrayBuffer !== 'undefined' && valueToClone instanceof SharedArrayBuffer)) {\n return valueToClone.slice(0);\n }\n if (valueToClone instanceof DataView) {\n const result = new DataView(valueToClone.buffer.slice(0), valueToClone.byteOffset, valueToClone.byteLength);\n stack.set(valueToClone, result);\n copyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n return result;\n }\n if (typeof File !== 'undefined' && valueToClone instanceof File) {\n const result = new File([valueToClone], valueToClone.name, {\n type: valueToClone.type,\n });\n stack.set(valueToClone, result);\n copyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n return result;\n }\n if (typeof Blob !== 'undefined' && valueToClone instanceof Blob) {\n const result = new Blob([valueToClone], { type: valueToClone.type });\n stack.set(valueToClone, result);\n copyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n return result;\n }\n if (valueToClone instanceof Error) {\n const result = new valueToClone.constructor();\n stack.set(valueToClone, result);\n result.message = valueToClone.message;\n result.name = valueToClone.name;\n result.stack = valueToClone.stack;\n result.cause = valueToClone.cause;\n copyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n return result;\n }\n if (valueToClone instanceof Boolean) {\n const result = new Boolean(valueToClone.valueOf());\n stack.set(valueToClone, result);\n copyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n return result;\n }\n if (valueToClone instanceof Number) {\n const result = new Number(valueToClone.valueOf());\n stack.set(valueToClone, result);\n copyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n return result;\n }\n if (valueToClone instanceof String) {\n const result = new String(valueToClone.valueOf());\n stack.set(valueToClone, result);\n copyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n return result;\n }\n if (typeof valueToClone === 'object' && isCloneableObject(valueToClone)) {\n const result = Object.create(Object.getPrototypeOf(valueToClone));\n stack.set(valueToClone, result);\n copyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n return result;\n }\n return valueToClone;\n}\nfunction copyProperties(target, source, objectToClone = target, stack, cloneValue) {\n const keys = [...Object.keys(source), ...getSymbols(source)];\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const descriptor = Object.getOwnPropertyDescriptor(target, key);\n if (descriptor == null || descriptor.writable) {\n target[key] = cloneDeepWithImpl(source[key], key, objectToClone, stack, cloneValue);\n }\n }\n}\nfunction isCloneableObject(object) {\n switch (getTag(object)) {\n case argumentsTag:\n case arrayTag:\n case arrayBufferTag:\n case dataViewTag:\n case booleanTag:\n case dateTag:\n case float32ArrayTag:\n case float64ArrayTag:\n case int8ArrayTag:\n case int16ArrayTag:\n case int32ArrayTag:\n case mapTag:\n case numberTag:\n case objectTag:\n case regexpTag:\n case setTag:\n case stringTag:\n case symbolTag:\n case uint8ArrayTag:\n case uint8ClampedArrayTag:\n case uint16ArrayTag:\n case uint32ArrayTag: {\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nexport { cloneDeepWith, cloneDeepWithImpl, copyProperties };\n","import { cloneDeepWithImpl } from './cloneDeepWith.mjs';\n\nfunction cloneDeep(obj) {\n return cloneDeepWithImpl(obj, undefined, obj, new Map(), undefined);\n}\n\nexport { cloneDeep };\n","function isPlainObject(value) {\n if (!value || typeof value !== 'object') {\n return false;\n }\n const proto = Object.getPrototypeOf(value);\n const hasObjectPrototype = proto === null ||\n proto === Object.prototype ||\n Object.getPrototypeOf(proto) === null;\n if (!hasObjectPrototype) {\n return false;\n }\n return Object.prototype.toString.call(value) === '[object Object]';\n}\n\nexport { isPlainObject };\n","function isUnsafeProperty(key) {\n return key === '__proto__';\n}\n\nexport { isUnsafeProperty };\n","function pickBy(obj, shouldPick) {\n const result = {};\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const value = obj[key];\n if (shouldPick(value, key)) {\n result[key] = value;\n }\n }\n return result;\n}\n\nexport { pickBy };\n","function isDeepKey(key) {\n switch (typeof key) {\n case 'number':\n case 'symbol': {\n return false;\n }\n case 'string': {\n return key.includes('.') || key.includes('[') || key.includes(']');\n }\n }\n}\n\nexport { isDeepKey };\n","function toKey(value) {\n if (typeof value === 'string' || typeof value === 'symbol') {\n return value;\n }\n if (Object.is(value?.valueOf?.(), -0)) {\n return '-0';\n }\n return String(value);\n}\n\nexport { toKey };\n","function toString(value) {\n if (value == null) {\n return '';\n }\n if (typeof value === 'string') {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(toString).join(',');\n }\n const result = String(value);\n if (result === '0' && Object.is(Number(value), -0)) {\n return '-0';\n }\n return result;\n}\n\nexport { toString };\n","import { toString } from './toString.mjs';\nimport { toKey } from '../_internal/toKey.mjs';\n\nfunction toPath(deepKey) {\n if (Array.isArray(deepKey)) {\n return deepKey.map(toKey);\n }\n if (typeof deepKey === 'symbol') {\n return [deepKey];\n }\n deepKey = toString(deepKey);\n const result = [];\n const length = deepKey.length;\n if (length === 0) {\n return result;\n }\n let index = 0;\n let key = '';\n let quoteChar = '';\n let bracket = false;\n if (deepKey.charCodeAt(0) === 46) {\n result.push('');\n index++;\n }\n while (index < length) {\n const char = deepKey[index];\n if (quoteChar) {\n if (char === '\\\\' && index + 1 < length) {\n index++;\n key += deepKey[index];\n }\n else if (char === quoteChar) {\n quoteChar = '';\n }\n else {\n key += char;\n }\n }\n else if (bracket) {\n if (char === '\"' || char === \"'\") {\n quoteChar = char;\n }\n else if (char === ']') {\n bracket = false;\n result.push(key);\n key = '';\n }\n else {\n key += char;\n }\n }\n else {\n if (char === '[') {\n bracket = true;\n if (key) {\n result.push(key);\n key = '';\n }\n }\n else if (char === '.') {\n if (key) {\n result.push(key);\n key = '';\n }\n }\n else {\n key += char;\n }\n }\n index++;\n }\n if (key) {\n result.push(key);\n }\n return result;\n}\n\nexport { toPath };\n","import { isUnsafeProperty } from '../../_internal/isUnsafeProperty.mjs';\nimport { isDeepKey } from '../_internal/isDeepKey.mjs';\nimport { toKey } from '../_internal/toKey.mjs';\nimport { toPath } from '../util/toPath.mjs';\n\nfunction get(object, path, defaultValue) {\n if (object == null) {\n return defaultValue;\n }\n switch (typeof path) {\n case 'string': {\n if (isUnsafeProperty(path)) {\n return defaultValue;\n }\n const result = object[path];\n if (result === undefined) {\n if (isDeepKey(path)) {\n return get(object, toPath(path), defaultValue);\n }\n else {\n return defaultValue;\n }\n }\n return result;\n }\n case 'number':\n case 'symbol': {\n if (typeof path === 'number') {\n path = toKey(path);\n }\n const result = object[path];\n if (result === undefined) {\n return defaultValue;\n }\n return result;\n }\n default: {\n if (Array.isArray(path)) {\n return getWithPath(object, path, defaultValue);\n }\n if (Object.is(path?.valueOf(), -0)) {\n path = '-0';\n }\n else {\n path = String(path);\n }\n if (isUnsafeProperty(path)) {\n return defaultValue;\n }\n const result = object[path];\n if (result === undefined) {\n return defaultValue;\n }\n return result;\n }\n }\n}\nfunction getWithPath(object, path, defaultValue) {\n if (path.length === 0) {\n return defaultValue;\n }\n let current = object;\n for (let index = 0; index < path.length; index++) {\n if (current == null) {\n return defaultValue;\n }\n if (isUnsafeProperty(path[index])) {\n return defaultValue;\n }\n current = current[path[index]];\n }\n if (current === undefined) {\n return defaultValue;\n }\n return current;\n}\n\nexport { get };\n","import { get, set } from 'es-toolkit/compat';\r\n\r\n/**\r\n * 获取对象键名数组(类型安全)。\r\n * 注:内置 `Object.keys` 与 `es-toolkit` 的 `keys` 在 TS 中通常返回 `string[]`,无法精确到 `keyof T`。\r\n * @param obj 目标对象\r\n * @returns 类型精确的 `Array<keyof T>`\r\n * @example\r\n * const o = { a: 1, b: 'x' };\r\n * const keys = getObjectKeys(o); // type: ('a' | 'b')[], value: ['a','b']\r\n */\r\nexport function getObjectKeys<T extends object>(obj: T): Array<keyof T> {\r\n return Object.keys(obj) as (keyof T)[];\r\n}\r\n\r\n/**\r\n * 获取对象值。\r\n * @param obj 目标对象\r\n * @param path 路径。(点路径:'a.b'、'a[0].b';数组路径:['a',0,'b'])\r\n * @returns 值\r\n * @example\r\n * const o = { b: { c: 'x' }, users: [{ name: 'john' }, { name: 'jane' }] };\r\n * const c = getObjectValue(o, 'b.c'); // 点路径: 'x'\r\n * const name0 = getObjectValue(o, 'users[0].name'); // 数组字符: 'john'\r\n * const name1 = getObjectValue(o, ['users', 1, 'name']); // 数组路径: 'jane'\r\n */\r\nexport const getObjectValue = get;\r\n\r\n/**\r\n * 设置对象值。\r\n * @param obj 目标对象\r\n * @param path 路径。(点路径:'a.b'、'a[0].b';数组路径:['a',0,'b'])\r\n * @param value 值\r\n * @example\r\n * const o = { b: { c: 'x' }, users: [{ name: 'john' }, { name: 'jane' }] };\r\n * setObjectValue(o, 'b.c', 'y'); // 点路径\r\n * setObjectValue(o, ['users', 1, 'name'], 'jane-doe'); // 数组路径\r\n */\r\nexport const setObjectValue = set;\r\n","/**\r\n * 将对象参数拼接到 URL\r\n * - 采用纯JS拼接,因为小程序不支持URLSearchParams\r\n * @param url 基础地址\r\n * @param param 将要追加的参数对象;`null/undefined` 值会被忽略,Object 会使用 `JSON.stringify`\r\n * @returns 拼接后的完整 URL(保留原有哈希片段)\r\n * @example\r\n * const url = appendUrlParam('https://a.com', { q: '测试', list: [1, 2], a: null, b: undefined }); // 'https://a.com/?q=%E6%B5%8B%E8%AF%95&list=[1,2]'\r\n */\r\nexport function appendUrlParam(url: string, param: Record<string, unknown>) {\r\n if (!param || typeof param !== 'object') return url;\r\n\r\n const hashIndex = url.indexOf('#');\r\n const baseWithoutHash = hashIndex >= 0 ? url.slice(0, hashIndex) : url;\r\n const hash = hashIndex >= 0 ? url.slice(hashIndex) : '';\r\n\r\n const [base, existingQs] = baseWithoutHash.split('?');\r\n const parts: string[] = [];\r\n if (existingQs) parts.push(existingQs);\r\n for (const key in param) {\r\n const rawVal = param[key];\r\n if (rawVal === null || rawVal === undefined) continue;\r\n const val = typeof rawVal === 'object' ? JSON.stringify(rawVal) : String(rawVal);\r\n parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(val)}`);\r\n }\r\n const qs = parts.filter(Boolean).join('&');\r\n return base + (qs ? `?${qs}` : '') + hash;\r\n}\r\n","import {\r\n appendUrlParam,\r\n cloneDeep,\r\n getObjectValue,\r\n isPlainObject,\r\n pickBy,\r\n toDayjs,\r\n} from '../../ts';\r\nimport { getBaseToolsConfig } from '../config';\r\nimport type { AppLogInfo } from '../config';\r\n\r\n/** 请求方法类型 */\r\nexport type RequestMethod =\r\n | 'GET'\r\n | 'POST'\r\n | 'PUT'\r\n | 'DELETE'\r\n | 'CONNECT'\r\n | 'HEAD'\r\n | 'OPTIONS'\r\n | 'TRACE'\r\n | 'PATCH';\r\n\r\n/**\r\n * 请求参数类型\r\n * 包含 fetch 原生支持的 BodyInit 类型,以及支持自动 JSON 序列化的对象和数组\r\n */\r\nexport type RequestData =\r\n | string\r\n | ArrayBuffer\r\n | ArrayBufferView\r\n | Blob\r\n | FormData\r\n | URLSearchParams\r\n | ReadableStream<Uint8Array>\r\n | Record<string, unknown>\r\n | unknown[]\r\n | null;\r\n\r\n/**\r\n * 响应数据类型\r\n */\r\nexport type ResponseData = string | ArrayBuffer | Blob | Record<string, unknown> | unknown[] | null;\r\n\r\n/**\r\n * 发起请求的配置 (对外,参数可选)\r\n */\r\nexport type RequestConfig<D extends RequestData = RequestData> = Partial<RequestConfigBase<D>>;\r\n\r\n/**\r\n * 自定义请求的配置 (接口字段参数必填)\r\n */\r\nexport type RequestConfigBase<D extends RequestData = RequestData> = {\r\n /** 接口地址 */\r\n url: string;\r\n /** 请求方法 */\r\n method?: RequestMethod;\r\n /** 请求头 */\r\n header?: Record<string, string>;\r\n /** 请求参数 */\r\n data?: D;\r\n /** 超时时间 (毫秒), 默认 60000 */\r\n timeout?: number;\r\n\r\n /** 接口返回响应数据的字段, 支持\"a[0].b.c\"的格式, 当配置false时返回完整的响应数据 */\r\n resKey: string | false;\r\n\r\n /** 接口返回响应消息的字段, 支持\"a[0].b.c\"的格式 */\r\n msgKey: string;\r\n\r\n /** 接口返回响应状态码的字段, 支持\"a[0].b.c\"的格式 */\r\n codeKey: string;\r\n\r\n /** 接口返回成功状态码的字段, 支持\"a[0].b.c\"的格式 (默认取 codeKey) */\r\n successKey?: string;\r\n\r\n /** 成功状态码 */\r\n successCode: (number | string)[];\r\n\r\n /** 登录过期状态码 */\r\n reloginCode: (number | string)[];\r\n\r\n /** 是否显示进度条 (默认true) */\r\n showLoading?: boolean;\r\n\r\n /** 是否提示接口异常 (默认true) */\r\n toastError?: boolean;\r\n\r\n /** 是否输出日志 (默认true) */\r\n isLog?: boolean;\r\n\r\n /** 额外输出的日志数据 */\r\n extraLog?: Record<string, unknown>;\r\n\r\n /** 响应数据的缓存时间, 单位毫秒。仅在成功时缓存;仅缓存在内存,应用退出,缓存消失。(默认0,不开启缓存) */\r\n cacheTime?: number;\r\n\r\n /** 是否开启流式传输 (如 SSE) */\r\n enableChunked?: boolean;\r\n\r\n /** 响应类型 (默认 json, enableChunked为true时忽略) */\r\n responseType?: 'text' | 'arraybuffer' | 'json';\r\n\r\n /** 响应拦截 */\r\n responseInterceptor?: (data: ResponseData) => ResponseData;\r\n};\r\n\r\n/**\r\n * 请求任务对象 (用于取消请求或监听流式数据)\r\n */\r\nexport interface RequestTask {\r\n /** 取消请求 */\r\n abort: () => void;\r\n\r\n /** 监听流式数据块接收事件 */\r\n onProgressUpdate: (callback: ChunkCallback) => void;\r\n\r\n /** 取消监听流式数据块接收事件 */\r\n offChunkReceived: () => void;\r\n}\r\n\r\n/**\r\n * 流式数据块接收事件回调\r\n */\r\nexport type ChunkCallback = (response: { data: ArrayBuffer }) => void;\r\n\r\n/** 请求缓存 */\r\nconst requestCache = new Map<string, { res: unknown; expire: number }>();\r\n\r\n/**\r\n * 基础请求 (返回 Promise 和 Task 对象)\r\n * 基于 fetch API 封装,支持流式请求\r\n * @param config 请求配置\r\n * @returns Promise<T> & { task?: RequestTask }\r\n * @example\r\n * // 在入口文件完成配置 (确保请求失败有toast提示,登录过期能够触发重新登录,log有日志输出)\r\n * setBaseToolsConfig({\r\n * toast: ({ msg, status }) => (status === 'fail' ? message.error(msg) : message.success(msg)),\r\n * showLoading: () => message.loading('加载中...'),\r\n * hideLoading: () => message.destroy(),\r\n * toLogin: () => reLogin(),\r\n * log(level, data) {\r\n * if (data.name === 'request') {\r\n * sendLog('request', data); // 请求日志\r\n * } else if (level === 'error') {\r\n * sendLog('error', data); // 错误日志\r\n * } else {\r\n * sendLog('action', data); // 操作日志\r\n * }\r\n * },\r\n * });\r\n *\r\n * // 封装项目的基础请求\r\n * export function requestApi<T>(config: RequestConfig) {\r\n * return request<T>({\r\n * header: { token: 'xx', version: 'xx', tid: 'xx' }, // 会自动过滤空值\r\n * // responseInterceptor: (res) => res, // 响应拦截,可预处理响应数据,如解密 (可选)\r\n * resKey: 'data',\r\n * msgKey: 'message',\r\n * codeKey: 'status',\r\n * successCode: [1],\r\n * reloginCode: [-10],\r\n * ...config,\r\n * });\r\n * }\r\n *\r\n * // 1. 基于上面 requestApi 的普通接口\r\n * export function apiGoodList(data: { page: number, size: number }) {\r\n * return requestApi<GoodItem[]>({ url: '/goods/list', data, resKey: 'data.list' });\r\n * }\r\n *\r\n * const goodList = await apiGoodList({ page:1, size:10 });\r\n *\r\n * // 2. 参数泛型的写法\r\n * export function apiGoodList(config: RequestConfig<{ page: number, size: number }>) {\r\n * return requestApi<GoodItem[]>({ url: '/goods/list', resKey: 'data.list', ...config });\r\n * }\r\n *\r\n * const goodList = await apiGoodList({ data: { page:1, size:10 }, showLoading: false });\r\n *\r\n * // 3. 基于上面 requestApi 的流式接口\r\n * export function apiChatStream(data: { question: string }) {\r\n * return requestApi<T>({\r\n * url: '/sse/chatStream',\r\n * data,\r\n * resKey: false,\r\n * showLoading: false,\r\n * responseType: 'arraybuffer',\r\n * enableChunked: true,\r\n * });\r\n * }\r\n *\r\n * const { task } = apiChatStream({question: '你好'}); // 发起流式请求\r\n *\r\n * task.onProgressUpdate((res) => {\r\n * console.log('ArrayBuffer', res.data); // 接收流式数据\r\n * });\r\n *\r\n * task.offChunkReceived(); // 取消监听,中断流式接收 (调用时机:流式结束,组件销毁,页面关闭)\r\n * task.abort(); // 取消请求 (若流式传输中,会中断流并抛出异常)\r\n */\r\nexport function request<T, D extends RequestData = RequestData>(config: RequestConfigBase<D>) {\r\n // 1. 初始化控制对象\r\n const controller = new AbortController();\r\n const signal = controller.signal;\r\n let chunkCallback: ChunkCallback | null = null;\r\n\r\n // 构造 Task 对象\r\n const task: RequestTask = {\r\n abort: () => controller.abort(),\r\n onProgressUpdate: (cb) => {\r\n chunkCallback = cb;\r\n },\r\n offChunkReceived: () => {\r\n chunkCallback = null;\r\n },\r\n };\r\n\r\n // 2. 创建 Promise\r\n const promise = new Promise<T>((resolve, reject) => {\r\n const execute = async () => {\r\n const {\r\n url,\r\n data,\r\n header,\r\n method = 'GET',\r\n resKey,\r\n msgKey,\r\n codeKey,\r\n successKey,\r\n successCode,\r\n reloginCode,\r\n showLoading = true,\r\n toastError = true,\r\n enableChunked = false,\r\n cacheTime,\r\n responseInterceptor,\r\n responseType = 'json',\r\n timeout = 60000,\r\n } = config;\r\n\r\n const isGet = method === 'GET';\r\n const isObjectData = isPlainObject(data);\r\n const isArrayData = !isObjectData && Array.isArray(data);\r\n\r\n // 2.1 参数处理\r\n // 参数: 过滤undefined, 避免接口处理异常 (不可过滤 null 、 \"\" 、 false 、 0 这些有效值)\r\n const fillData = isObjectData ? pickBy(data, (val) => val !== undefined) : data;\r\n\r\n // 请求头: 过滤空值 (undefined 、null 、\"\" 、false 、0), 因为服务器端接收到的都是字符串\r\n const fillHeader = (header ? pickBy(header, (val) => !!val) : {}) as Record<string, string>;\r\n\r\n // 获取 Content-Type (忽略大小写)\r\n const contentTypeKey = Object.keys(fillHeader).find(\r\n (k) => k.toLowerCase() === 'content-type',\r\n );\r\n const contentType = contentTypeKey ? fillHeader[contentTypeKey].toLowerCase() : '';\r\n\r\n if (!isGet && fillData && (isObjectData || isArrayData) && !contentType) {\r\n fillHeader['Content-Type'] = 'application/json';\r\n }\r\n\r\n // 2.2 处理 URL 和 Body\r\n const fillUrl =\r\n isGet && isObjectData ? appendUrlParam(url, fillData as Record<string, unknown>) : url;\r\n\r\n let fillBody: BodyInit | null | undefined;\r\n\r\n if (!isGet && fillData) {\r\n if (isObjectData && contentType.includes('application/x-www-form-urlencoded')) {\r\n // application/x-www-form-urlencoded: 转换为 URLSearchParams\r\n fillBody = toSearchParams(fillData as Record<string, unknown>);\r\n } else if (isObjectData && contentType.includes('multipart/form-data')) {\r\n // multipart/form-data: 转换为 FormData\r\n fillBody = toFormData(fillData as Record<string, unknown>);\r\n // 删除 Content-Type, 让 fetch 自动生成 boundary\r\n if (contentTypeKey) delete fillHeader[contentTypeKey];\r\n } else if (isObjectData || isArrayData) {\r\n fillBody = JSON.stringify(fillData);\r\n } else {\r\n fillBody = fillData as BodyInit;\r\n }\r\n }\r\n\r\n // 2.3 日志与缓存配置\r\n const logConfig = { ...config, data: fillData, header: fillHeader, url: fillUrl };\r\n const startTime = Date.now();\r\n\r\n // 2.4 检查缓存\r\n const isCache = cacheTime && cacheTime > 0;\r\n const cacheKey = isCache ? JSON.stringify({ url: fillUrl, data: fillData }) : '';\r\n\r\n if (isCache) {\r\n const res = checkCache(cacheKey);\r\n if (res) {\r\n logRequestInfo({\r\n status: 'success',\r\n config: logConfig,\r\n fromCache: true,\r\n startTime,\r\n res,\r\n });\r\n resolve(getResult(res, resKey) as T);\r\n return;\r\n }\r\n }\r\n\r\n // 2.5 UI 反馈\r\n const appConfig = getBaseToolsConfig();\r\n if (showLoading) appConfig.showLoading?.();\r\n\r\n // 2.6 设置超时\r\n let isTimeout = false;\r\n const timeoutId = setTimeout(() => {\r\n isTimeout = true;\r\n controller.abort();\r\n }, timeout);\r\n\r\n try {\r\n // 2.7 发起请求\r\n const response = await fetch(fillUrl, {\r\n method,\r\n headers: fillHeader,\r\n body: fillBody,\r\n signal,\r\n });\r\n\r\n if (!response.ok) {\r\n if (showLoading) appConfig.hideLoading?.();\r\n throw new Error(`HTTP Error ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n // 2.8 处理流式响应\r\n if (enableChunked) {\r\n if (showLoading) appConfig.hideLoading?.();\r\n\r\n const res = await handleStreamResponse(response, chunkCallback);\r\n\r\n logRequestInfo({ status: 'success', config: logConfig, startTime, res });\r\n\r\n resolve(res as T);\r\n return;\r\n }\r\n\r\n // 2.9 处理普通响应\r\n const resData = await parseResponse(response, responseType);\r\n\r\n // 隐藏 Loading\r\n if (showLoading) appConfig.hideLoading?.();\r\n\r\n // 响应拦截\r\n const res = responseInterceptor ? responseInterceptor(resData) : resData;\r\n\r\n // 2.10 业务状态码解析\r\n const code = getObjectValue(res, codeKey);\r\n const scode = successKey ? getObjectValue(res, successKey) : code;\r\n const msg = getObjectValue(res, msgKey);\r\n const isSuccess = successCode.includes(scode);\r\n const isRelogin = reloginCode.includes(code);\r\n\r\n logRequestInfo({ status: 'success', config: logConfig, startTime, res });\r\n\r\n // 2.11 结果处理\r\n if (isSuccess) {\r\n // 业务正常\r\n if (isCache) requestCache.set(cacheKey, { res, expire: Date.now() + cacheTime });\r\n resolve(getResult(res, resKey) as T);\r\n } else if (isRelogin) {\r\n // 登录失效\r\n reject(res);\r\n appConfig.toLogin?.(); // 放在后面,确保reject执行后再跳转登录\r\n } else {\r\n // 业务错误\r\n if (toastError && msg) appConfig.toast?.({ status: 'fail', msg });\r\n reject(res);\r\n }\r\n } catch (e) {\r\n const status = 'fail';\r\n const isAbortError = e instanceof DOMException && e.name === 'AbortError'; // 取消请求不视为错误\r\n\r\n if (isAbortError && isTimeout) {\r\n if (toastError) appConfig.toast?.({ status, msg: '请求超时' });\r\n const timeoutError = new Error('Request Timeout');\r\n logRequestInfo({ status, config: logConfig, startTime, e: timeoutError });\r\n reject(timeoutError);\r\n return;\r\n }\r\n\r\n if (!isAbortError && toastError) appConfig.toast?.({ status, msg: '网络请求失败' });\r\n logRequestInfo({ status, config: logConfig, startTime, e });\r\n reject(e);\r\n } finally {\r\n if (timeoutId) clearTimeout(timeoutId);\r\n }\r\n };\r\n\r\n execute();\r\n }) as Promise<T> & { task?: RequestTask };\r\n\r\n // 3. 挂载 Task\r\n promise.task = task;\r\n\r\n return promise;\r\n}\r\n\r\n/**\r\n * 日志输出\r\n */\r\nfunction logRequestInfo(options: {\r\n config: RequestConfigBase<RequestData> & { url?: string };\r\n fromCache?: boolean;\r\n startTime: number;\r\n status: 'success' | 'fail';\r\n res?: unknown;\r\n e?: unknown;\r\n}) {\r\n const { log } = getBaseToolsConfig();\r\n const { isLog = true } = options.config;\r\n\r\n if (!log || !isLog) return;\r\n\r\n const { config, res, fromCache = false, startTime, status, e } = options;\r\n const { url, data, header, method, extraLog } = config;\r\n const endTime = Date.now();\r\n const fmt = 'YYYY-MM-DD HH:mm:ss.SSS';\r\n\r\n const info: AppLogInfo = {\r\n name: 'request',\r\n status,\r\n url,\r\n data,\r\n method,\r\n header,\r\n fromCache,\r\n startTime: toDayjs(startTime).format(fmt),\r\n endTime: toDayjs(endTime).format(fmt),\r\n duration: endTime - startTime,\r\n ...extraLog,\r\n };\r\n\r\n if (status === 'success') {\r\n info.res = cloneDeep(res); // 深拷贝,避免外部修改对象,造成输出不一致\r\n log('info', info);\r\n } else {\r\n info.e = e;\r\n log('error', info);\r\n }\r\n}\r\n\r\n/**\r\n * 获取 resKey 对应的数据\r\n */\r\nfunction getResult(res: unknown, resKey?: RequestConfigBase['resKey']) {\r\n if (!res || !resKey || typeof res !== 'object') return res;\r\n return getObjectValue(res, resKey);\r\n}\r\n\r\n/**\r\n * 检查缓存\r\n */\r\nfunction checkCache(cacheKey: string) {\r\n const cached = requestCache.get(cacheKey);\r\n if (!cached) return null;\r\n if (cached.expire <= Date.now()) {\r\n requestCache.delete(cacheKey);\r\n return null;\r\n }\r\n return cached.res;\r\n}\r\n\r\n/**\r\n * 处理流式响应\r\n */\r\nasync function handleStreamResponse(response: Response, chunkCallback: ChunkCallback | null) {\r\n if (!response.body) throw new Error('Response body is null');\r\n\r\n const reader = response.body.getReader();\r\n\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n if (chunkCallback && value) {\r\n chunkCallback({ data: value.buffer });\r\n }\r\n }\r\n\r\n return 'Stream Finished';\r\n}\r\n\r\n/**\r\n * 解析响应数据\r\n */\r\nasync function parseResponse(response: Response, responseType: string) {\r\n let resData: ResponseData;\r\n if (responseType === 'arraybuffer') {\r\n resData = await response.arrayBuffer();\r\n } else if (responseType === 'text') {\r\n resData = await response.text();\r\n } else {\r\n const text = await response.text();\r\n try {\r\n resData = JSON.parse(text);\r\n } catch {\r\n resData = text;\r\n }\r\n }\r\n return resData;\r\n}\r\n\r\n/**\r\n * 转换为 URLSearchParams\r\n */\r\nfunction toSearchParams(data: Record<string, unknown>) {\r\n const params = new URLSearchParams();\r\n for (const key in data) {\r\n const val = data[key];\r\n // undefined 已在 fillData 阶段过滤,此处仅需判断 null\r\n // null 在 Form 中会被转为字符串 \"null\",通常不符合预期,故过滤\r\n if (val === null) continue;\r\n if (Array.isArray(val)) {\r\n val.forEach((v) => params.append(key, typeof v === 'object' ? JSON.stringify(v) : String(v)));\r\n } else {\r\n params.append(key, typeof val === 'object' ? JSON.stringify(val) : String(val));\r\n }\r\n }\r\n return params;\r\n}\r\n\r\n/**\r\n * 转换为 FormData\r\n */\r\nfunction toFormData(data: Record<string, unknown>) {\r\n const formData = new FormData();\r\n for (const key in data) {\r\n const val = data[key];\r\n // undefined 已在 fillData 阶段过滤,此处仅需判断 null\r\n // null 在 Form 中会被转为字符串 \"null\",通常不符合预期,故过滤\r\n if (val === null) continue;\r\n if (Array.isArray(val)) {\r\n val.forEach((v) =>\r\n formData.append(\r\n key,\r\n v instanceof Blob ? v : typeof v === 'object' ? JSON.stringify(v) : String(v),\r\n ),\r\n );\r\n } else {\r\n formData.append(\r\n key,\r\n val instanceof Blob ? val : typeof val === 'object' ? JSON.stringify(val) : String(val),\r\n );\r\n }\r\n }\r\n return formData;\r\n}\r\n","const WK = {\r\n val: '__l_val',\r\n exp: '__l_exp',\r\n wrap: '__l_wrap',\r\n} as const;\r\n\r\n/**\r\n * 写入 localStorage(自动 JSON 序列化)\r\n * 当 `value` 为 `null` 或 `undefined` 时,会移除该键。\r\n * 支持保存:对象、数组、字符串、数字、布尔值。\r\n * @param key 键名\r\n * @param value 任意可序列化的值\r\n * @param days 过期天数(从当前时间起算)\r\n * @example\r\n * setLocalStorage('user', { id: 1, name: 'Alice' }); // 对象\r\n * setLocalStorage('age', 18); // 数字\r\n * setLocalStorage('vip', true); // 布尔值\r\n * setLocalStorage('token', 'abc123', 7); // 7 天后过期\r\n */\r\nexport function setLocalStorage(key: string, value: unknown, days?: number) {\r\n if (value === undefined || value === null) {\r\n removeLocalStorage(key);\r\n return;\r\n }\r\n\r\n let toStore: unknown = value;\r\n if (typeof days === 'number' && days > 0) {\r\n const ms = days * 24 * 60 * 60 * 1000;\r\n toStore = {\r\n [WK.wrap]: true,\r\n [WK.val]: value,\r\n [WK.exp]: Date.now() + ms,\r\n };\r\n }\r\n\r\n localStorage.setItem(key, JSON.stringify(toStore));\r\n}\r\n\r\n/**\r\n * 读取 localStorage(自动 JSON 反序列化)\r\n * 若值为合法 JSON,则返回反序列化后的数据;\r\n * 若值非 JSON(如外部写入的纯字符串),则原样返回字符串。\r\n * 不存在时返回 `null`。\r\n * @param key 键名\r\n * @returns 解析后的值或 `null`\r\n * @example\r\n * const user = getLocalStorage<{ id: number; name: string }>('user');\r\n * const age = getLocalStorage<number>('age');\r\n * const vip = getLocalStorage<boolean>('vip');\r\n */\r\nexport function getLocalStorage<T = unknown>(key: string): T | null {\r\n const raw = localStorage.getItem(key);\r\n if (raw === null) return null;\r\n try {\r\n const parsed = JSON.parse(raw);\r\n\r\n if (parsed && typeof parsed === 'object' && WK.wrap in parsed && WK.exp in parsed) {\r\n if (Date.now() > parsed[WK.exp]) {\r\n removeLocalStorage(key);\r\n return null;\r\n }\r\n return parsed[WK.val] as T;\r\n }\r\n return parsed as T;\r\n } catch {\r\n return raw as T;\r\n }\r\n}\r\n\r\n/**\r\n * 移除 localStorage 指定键\r\n * @param key 键名\r\n * @example\r\n * removeLocalStorage('token');\r\n */\r\nexport function removeLocalStorage(key: string) {\r\n localStorage.removeItem(key);\r\n}\r\n","/**\r\n * 获取url的查询参数值\r\n * @param key 参数名\r\n * @param url 完整 URL 或仅查询串(如 \"a=1&b=2\")\r\n * @returns 解码后的参数值 (若不存在|\"null\"|\"undefined\",则返回 null)\r\n * @example\r\n * const q = getUrlParam('q'); // 默认当前地址\r\n * const q = getUrlParam('q', 'https://a.com/?q=%E6%B5%8B%E8%AF%95'); // \"测试\"\r\n * const a = getUrlParam('a', 'a=1'); // \"1\"\r\n * const list = getUrlParam('list', 'list=[1,2]'); // \"[1,2]\"\r\n * const list = getUrlParam('list', 'list=null'); // null\r\n * const list = getUrlParam('list', 'list=undefined'); // null\r\n */\r\nexport function getUrlParam(key: string, url = window.location.href) {\r\n const searchParams = new URL(url.includes('?') ? url : `?${url}`, 'http://localhost')\r\n .searchParams;\r\n const value = searchParams.get(key);\r\n return value === 'null' || value === 'undefined' ? null : value;\r\n}\r\n\r\n/**\r\n * 获取url的查询参数值,并转为number类型\r\n * @param key 参数名\r\n * @param url 完整 URL 或仅查询串(如 \"a=1&b=2\")\r\n * @returns 解码后的参数值 (若不存在|\"非数字字符串\",则返回 null)\r\n * @example\r\n * const a = getUrlNumber('a'); // 默认当前地址\r\n * const a = getUrlNumber('a', 'https://a.com/?a=1'); // 1\r\n * const a = getUrlNumber('a', 'a=1'); // 1\r\n * const a = getUrlNumber('a', 'a=1.2'); // 1.2\r\n * const a = getUrlNumber('a', 'a=abc'); // null\r\n */\r\nexport function getUrlNumber(key: string, url = window.location.href) {\r\n const str = getUrlParam(key, url);\r\n if (!str) return null;\r\n\r\n const num = Number(str);\r\n return isNaN(num) ? null : num;\r\n}\r\n\r\n/**\r\n * 获取url的所有查询参数值\r\n * @param url 完整 URL 或仅查询串(如 \"a=1&b=2\")\r\n * @returns 解码后的键值对象(无参数返回空对象; \"null\"|\"undefined\"的参数会被忽略)\r\n * @example\r\n * const params = getUrlParams(); // 默认当前地址\r\n * const params = getUrlParams('a=1&b=2'); // { a: \"1\", b: \"2\" }\r\n * const params = getUrlParams('https://a.com/?a=1&b=2'); // { a: \"1\", b: \"2\" }\r\n * const params = getUrlParams('a=1&b=null'); // { a: \"1\" }\r\n * const params = getUrlParams('a=1&b=undefined'); // { a: \"1\" }\r\n */\r\nexport function getUrlParams(url = window.location.href) {\r\n const searchParams = new URL(url.includes('?') ? url : `?${url}`, 'http://localhost')\r\n .searchParams;\r\n const result: Record<string, string> = {};\r\n\r\n for (const [key, value] of searchParams.entries()) {\r\n if (value !== 'null' && value !== 'undefined') {\r\n result[key] = value;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n"],"mappings":"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","names":["t","e","n","r","i","s","u","a","M","m","f","l","$","y","v","g","D","o","d","c","h","e","t","n","r","i","o","a","f","h","u","d","l","s","c","m","M","t","i","e","s","f","n","u","r","o","t","n","i","o","r","e","u","f","s","a","r","e","t","o","n","i","d","e","t","r","e","_","t","html","src","dayjs","customParseFormat","utc","timezone","relativeTime","advancedFormat","appConfig","res"]}
@@ -0,0 +1,55 @@
1
+ export type AppConfig = {
2
+ /** 全局 Toast 提示 */
3
+ toast?: (option: {
4
+ msg: string;
5
+ status: 'success' | 'fail';
6
+ }) => void;
7
+ /** 显示全局 Loading */
8
+ showLoading?: () => void;
9
+ /** 隐藏全局 Loading */
10
+ hideLoading?: () => void;
11
+ /** 跳转登录页的方法 */
12
+ toLogin?: () => void;
13
+ /** 日志记录函数 */
14
+ log?: (level: 'info' | 'error' | 'warn' | 'debug', data: AppLogInfo) => void;
15
+ };
16
+ export type AppLogInfo = {
17
+ /** 调用函数的名称 */
18
+ name: string;
19
+ /** 函数的调用状态 */
20
+ status?: 'success' | 'fail';
21
+ /** 函数的调用参数 */
22
+ option?: unknown;
23
+ /** 函数的调用结果 */
24
+ res?: unknown;
25
+ /** 函数的调用错误 */
26
+ e?: unknown;
27
+ /** 日志描述 */
28
+ desc?: string;
29
+ [key: string]: unknown;
30
+ };
31
+ /**
32
+ * 获取应用配置
33
+ */
34
+ export declare function getBaseToolsConfig(): AppConfig;
35
+ /**
36
+ * 初始化应用配置 (在入口文件设置)
37
+ * @example
38
+ * setBaseToolsConfig({
39
+ * toast: ({ msg, status }) => (status === 'fail' ? message.error(msg) : message.success(msg)),
40
+ * showLoading: () => message.loading('加载中...'),
41
+ * hideLoading: () => message.destroy(),
42
+ * toLogin: () => reLogin(),
43
+ * log(level, data) {
44
+ * if (data.name === 'request') {
45
+ * sendLog('request', data); // 请求日志
46
+ * } else if (level === 'error') {
47
+ * sendLog('error', data); // 错误日志
48
+ * } else {
49
+ * sendLog('action', data); // 操作日志
50
+ * }
51
+ * },
52
+ * });
53
+ */
54
+ export declare function setBaseToolsConfig(newConfig: AppConfig): void;
55
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/web/config/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG;IACtB,kBAAkB;IAClB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACtE,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,eAAe;IACf,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,aAAa;IACb,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;CAC9E,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,cAAc;IACd,IAAI,EAAE,MAAM,CAAC;IAEb,cAAc;IACd,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAE5B,cAAc;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,cAAc;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IAEd,cAAc;IACd,CAAC,CAAC,EAAE,OAAO,CAAC;IAEZ,WAAW;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IAGd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAIF;;GAEG;AACH,wBAAgB,kBAAkB,cAEjC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,SAAS,QAEtD"}