{"version":3,"file":"gadgets.umd.cjs","sources":["../../utils/typeof.ts","../../utils/statement.ts","../../utils/uid.ts","../../utils/full-screen.ts","../../utils/format.ts","../../utils/regexp.ts","../../utils/object.ts","../../utils/array.ts","../../utils/clone.ts","../../utils/download.ts","../../utils/helper.ts","../../utils/classnames.ts","../../hooks/useNamespace.ts","../../hooks/useFragmentLoad.ts","../../hooks/index.ts"],"sourcesContent":["/**\n * @description 数据转为string类型\n */\nexport function toTypeString(value: any): string {\n  return Object.prototype.toString.call(value)\n}\n\n/**\n * @description 数据转为string类型\n */\nexport function typeOf(value: any): string {\n  return toTypeString(value).match(/\\s+(\\w+)/)![1]\n}\n\n/**\n * @description 判断数据是否为Map类型\n */\nexport function isMap(value: any): boolean {\n  return toTypeString(value) === '[object Map]'\n}\n\n/**\n * @description 判断数据是否为WeakMap类型\n */\nexport function isWeakMap(value: any): boolean {\n  return toTypeString(value) === '[object WeakMap]'\n}\n\n/**\n * @description 判断数据是否为Set类型\n */\nexport function isSet(value: any): boolean {\n  return toTypeString(value) === '[object Set]'\n}\n/**\n * @description 判断数据是否为WeakSet类型\n */\nexport function isWeakSet(value: any): boolean {\n  return toTypeString(value) === '[object WeakSet]'\n}\n\n/**\n * @description 判断数据是否为Date类型\n */\nexport function isDate(value: any): boolean {\n  return toTypeString(value) === '[object Date]'\n}\n\n/**\n * @description 判断数据是否为数值，或者是否能转换为数值\n */\nexport function isNumber(value: any): boolean {\n  return !isNaN(parseFloat(value)) && isFinite(value)\n}\n\n/**\n * @description 判断数据是否为布尔值类型\n */\nexport function isBoolean(value: any): boolean {\n  return typeof value === 'boolean'\n}\n\n/**\n * @description 判断数据是否为字符串类型\n */\nexport function isString(value: any): boolean {\n  return typeof value === 'string'\n}\n\n/**\n * @description 判断数据是否为函数\n */\nexport function isFunction(value: any): boolean {\n  return typeof value === 'function'\n}\n\n/**\n * @description 判断数据是否为异步函数\n */\nexport function isAsyncFunction(value: any): boolean {\n  return toTypeString(value) === '[object AsyncFunction]'\n}\n\n/**\n * @description 判断数据是否为Symbol类型\n */\nexport function isSymbol(value: any): boolean {\n  return typeof value === 'symbol'\n}\n\n/**\n * @description 判断数据是否为数组\n */\nexport function isArray(value: any): boolean {\n  return Array.isArray(value)\n}\n\n/**\n * @description 判断数据是否为对象，包括Object、Array、Map、Set、Date、RegExp等对象\n */\nexport function isObject(value: any): boolean {\n  return value !== null && typeof value === 'object'\n}\n\n/**\n * @description 判断数据是否为一个\"纯粹\"对象\n */\nexport function isPlainObject(value: any): boolean {\n  return toTypeString(value) === '[object Object]'\n}\n\n/**\n * @description 判断数据是否为Promise对象\n */\nexport function isPromise(value: any): boolean {\n  return isObject(value) && isFunction(value.then) && isFunction(value.catch)\n}\n\n/**\n * @description 判断数据是否空\n */\nexport function isEmpty(value: any): boolean {\n  return (\n    (!value && value !== 0) ||\n    (isArray(value) && value.length === 0) ||\n    (isObject(value) && !Object.keys(value).length)\n  )\n}\n\n/**\n * @description 判断是否可以作为object的键值，理论上null于undefined可以，但不推荐，判定为无效键值\n */\nexport function isKey(key: any): boolean {\n  const type = typeof key\n  return type === 'string' || type === 'boolean' || type === 'symbol' || type === 'number'\n}\n\n/**\n * @description 判断是否为ArrayBuffer类型\n */\nexport function isBuffer(value: any): boolean {\n  return toTypeString(value) === '[object ArrayBuffer]'\n}\n","import { isBoolean, isString } from './typeof'\nimport type { IObjectAny } from '../typings'\n\n/**\n * @description 字符串判断语句执行结果，如：hidden, disabled, required 等\n * @description 非安全方法，慎用\n */\nexport function execStatement({\n  statement,\n  rootData,\n  context\n}: {\n  statement: string | boolean | undefined\n  rootData: IObjectAny\n  context: IObjectAny\n}): boolean {\n  if (isBoolean(statement)) {\n    return statement as unknown as boolean\n  }\n\n  if (statement && isString(statement)) {\n    try {\n      const fn = new Function('$', '$ctx', `return ${statement}`)\n      return !!fn(rootData, context)\n    } catch (e) {\n      console.warn(e)\n    }\n  }\n\n  return false\n}\n","/**\n * @description 用于生成通用唯一标识符（UUID）的一种方法\n * @description UUIDv4是UUID的一个版本，它基于随机数，保证了全球的唯一性。\n * @description 由32个十六进制数字组成的字符串，通常表现为8-4-4-4-12的形式，例如：550e8400-e29b-41d4-a716-446655440000\n */\nexport function uuidv4() {\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n    const r = (Math.random() * 16) | 0,\n      v = c === 'x' ? r : (r & 0x3) | 0x8\n    return v.toString(16)\n  })\n}\n","import { isString } from './typeof'\n\nexport type IFullScreenElement = HTMLElement & {\n  mozRequestFullScreen: () => Promise<void>\n  webkitRequestFullscreen: () => Promise<void>\n  msRequestFullscreen: () => Promise<void>\n}\n\n/**\n * @description 开启全屏功能\n * @param {String | HTMLElement} id 或 element\n */\nexport function requestFullScreen(el: string | HTMLElement) {\n  const element = (isString(el) ? document.getElementById(el as string) : el) as IFullScreenElement\n  if (!element) return\n  element.style.backgroundColor = '#ffffff'\n  if (element.requestFullscreen) {\n    return element.requestFullscreen()\n  }\n  if (element.webkitRequestFullscreen) {\n    return element.webkitRequestFullscreen()\n  }\n  if (element.mozRequestFullScreen) {\n    return element.mozRequestFullScreen()\n  }\n  if (element.msRequestFullscreen) {\n    // IE11\n    return element.msRequestFullscreen()\n  } else {\n    console.warn('浏览器不支持全屏功能')\n  }\n}\n\nexport type IDocumentElement = Document & {\n  mozCancelFullScreen: () => Promise<void>\n  webkitExitFullscreen: () => Promise<void>\n  msExitFullscreen: () => Promise<void>\n}\n\n// 退出全屏功能\nexport function exitFullScreen() {\n  const element = document as IDocumentElement\n  if (element.exitFullscreen) {\n    return element.exitFullscreen()\n  }\n  if (element.webkitExitFullscreen) {\n    return element.webkitExitFullscreen()\n  }\n  if (element.mozCancelFullScreen) {\n    return element.mozCancelFullScreen()\n  }\n  if (element.msExitFullscreen) {\n    return element.msExitFullscreen()\n  }\n}\n","import { isNumber } from './typeof'\n\n/**\n * @description 金额数字千分位格式化\n */\nexport function thousandSeparatedFormat(value: any): string {\n  if (isNumber(value) && Math.abs(parseFloat(value)) >= 1000) {\n    const splits = value.toString().split('.')\n    const integerPart = splits[0].replace(/(\\d)(?=(?:\\d{3})+(?!\\S))/g, '$1,')\n    if (splits.length > 1) {\n      return `${integerPart}.${splits[1]}`\n    }\n    return integerPart\n  }\n  return value\n}\n\n/**\n * @description limit-size 转为 limitSize 格式\n */\nexport function snakeToCamel(str: string) {\n  const strList = str.split('-')\n  return strList\n    .map((word, index) => {\n      if (index > 0) {\n        return word.toUpperCase()\n      }\n      return word\n    })\n    .join('')\n}\n\n/**\n * @description 对向内 limit-size格式属性 转为 limitSize 格式\n */\nexport function propsToCamel(obj: object) {\n  Object.keys(obj).forEach((key) => {\n    if (/-/.test(key)) {\n      obj[snakeToCamel(key)] = obj[key]\n    }\n    Reflect.deleteProperty(obj, key)\n  })\n}\n","/**\n * @description 是否只由中文组成的字符串\n */\nexport function isChinese(value: string): boolean {\n  return /^[\\u4e00-\\u9fa5]+$/.test(value)\n  // return /[\\u4e00-\\u9fa5]/.test(value)\n}\n\n/**\n * @description 是否由字母数字组成的字符串\n */\nexport function isAlphanumeric(value: string): boolean {\n  return /^[a-zA-Z0-9]+$/i.test(value)\n}\n\n/**\n * @description 是否为手机号码\n */\nexport function isMobile(value: string): boolean {\n  return /^1[3-9]\\d{9}$/.test(value)\n}\n\n/**\n * @description 是否为深度读取的属性 user.name 或 user['name']\n */\nexport function isDeepProp(value: string): boolean {\n  return /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/.test(value)\n}\n\n/**\n * @description 是否为邮箱地址\n */\nexport function isEmail(value: string): boolean {\n  return /^[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?$/.test(\n    value\n  )\n}\n\nexport const regexps = {\n  Phone: /^1(3[0-9]|4[57]|5[0-35-9]|7[0135678]|8[0-9]|9[8-9])\\d{8}$/, // 电话号码(移动/联通/电信)\n\n  ImageUrl: /^http[s]*:\\/\\/|\\.jpg$|\\.png$|\\.jpeg$|\\.gif$|\\.bmp$|\\.webp$|^data:image/, // 图片链接\n\n  IDCard: /^(\\d{15}$|^\\d{18}$|^\\d{17}(\\d|X|x))$/, // 身份证\n\n  Score: /^(\\d(\\.\\d{1,2})?|10(\\.0{1,2})?)$/, // 0-10保留两位小数\n\n  Money: /^(([1-9]\\d*)|0)(\\.\\d{1,2})?$/, // 金额数,小数点后保留2位\n\n  MoneyTenThousand: /^(([1-9]\\d*)|0)(\\.\\d{1,6})?$/, // 金额数以万为单位,小数点后保留6位\n\n  Split: /(?=(?!\\b)(\\d{3})+$)/, // 每三位以逗号分割 str.replace(re,',')\n\n  Email:\n    /^[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?$/,\n\n  Integer: /^-?[1-9]\\d*$/, // 整数\n\n  PositiveInteger: /^[1-9]\\d*$/, // 正整数\n\n  NegativeInteger: /^-[1-9]\\d*$/, // 负整数\n\n  NonPositiveInteger: /^-[1-9]\\d*|0$/, // 非正整数\n\n  NonNegativeInteger: /^[1-9]\\d*|0$/ // 非负整数\n}\n","import { isArray, isPlainObject, isString, isKey, isEmpty } from './typeof'\nimport { isDeepProp } from './regexp'\n\n/**\n * @description 获取对象可枚举属性及symbol属性\n */\nexport function getAllKeys(object: any): (string | symbol)[] {\n  return ([] as (string | symbol)[]).concat(\n    Object.keys(object),\n    Object.getOwnPropertySymbols(object)\n  )\n}\n\n/**\n * @description 将给定的值转换成一个路径数组\n */\nexport function castPath(value: string | string[]): string[] {\n  if (isArray(value)) {\n    return value as string[]\n  }\n  if (isKey(value)) {\n    if (isString(value) && isDeepProp(value as string)) {\n      const result: string[] = []\n      ;(value as string).replace(\n        /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g,\n        function (match, number, offset, subString) {\n          result.push(offset ? subString.replace(/\\\\(\\\\)?/g, '$1') : number || match)\n        } as (match: string, number: string, offset: number, subString: string) => string\n      )\n    }\n    return [value.toString()]\n  }\n  return []\n}\n\n/**\n * @description 剔除object内不想要的属性值\n */\n// TODO ====> 完善深度匹配 如.data.list这种结构\nexport function omit(object: any, paths: string[]) {\n  const result: Record<string, any> = {}\n  if (!isPlainObject(object) || isEmpty(object)) {\n    return result\n  }\n  // const _paths = castPath(paths)\n\n  Object.keys(object).forEach(function (key) {\n    if (!paths.includes(key)) {\n      result[key] = object[key]\n    }\n  })\n  return result\n}\n\n/**\n * @description 提取object内想要的属性值\n */\n// TODO ====> 完善深度匹配\nexport function pick(object: any, paths: string[]) {\n  const result: Record<string, any> = {}\n  if (!isPlainObject(object)) {\n    return result\n  }\n  // const _paths = castPath(paths)\n\n  Object.keys(object).forEach(function (key) {\n    if (paths.includes(key)) {\n      result[key] = object[key]\n    }\n  })\n  return result\n}\n","/**\n * @description 生成一个数字数组\n * @param {number} length 数组长度\n * @param {number} start 数组起始数字\n */\nexport function genNumberArray(length: number, start = 0) {\n  return Array.from({ length: length }, (_, i) => start + i)\n}\n","import {\n  isArray,\n  isDate,\n  isMap,\n  isSet,\n  isObject,\n  isBuffer,\n  isPlainObject,\n  isWeakSet,\n  isWeakMap,\n  isSymbol\n} from './typeof'\nimport { getAllKeys } from './object'\n\n/**\n * @description 拷贝函数\n * 如果函数依赖于闭包或特定于环境的状态（例如模拟私有变量），直接拷贝可能不会保留这些状态，因此需要特别注意。\n */\nexport function deepCloneFunction(fn: any, hash = new WeakMap()) {\n  // 创建一个绑定的新函数\n  const newFn = fn.bind({})\n  for (const prop in fn) {\n    if (fn.hasOwnProperty(prop)) {\n      newFn[prop] = typeof fn[prop] === 'function' ? deepCloneFunction(fn[prop], hash) : fn[prop]\n    }\n  }\n  return newFn\n}\n\n/**\n * @description 简单拷贝\n * 1、不支持特殊对象：日期、正则表达式、Symbol、函数等复杂类型的拷贝\n * 2、无法正确处理循环引用，导致无限递归\n */\nexport function plainClone(object: Record<string, any>) {\n  return JSON.parse(JSON.stringify(object))\n}\n\n// TODO ====> 完善深度拷贝\nfunction baseClone(value: any, hash = new WeakMap()): any {\n  // console.log('clone value====>', value, isSymbol(value))\n\n  if (isObject(value)) {\n    if (hash && hash.get(value as WeakKey)) {\n      return hash.get(value as WeakKey)\n    }\n\n    if (isArray(value)) {\n      const copyArray = (value as any[]).map((item) => baseClone(item, hash))\n      hash.set(value as WeakKey, copyArray)\n      return copyArray\n    }\n\n    if (isPlainObject(value)) {\n      const copyObject: Record<string | symbol, any> = {}\n      getAllKeys(value).map((key) => {\n        copyObject[key] = baseClone(value[key], hash)\n      })\n      hash.set(value as WeakKey, copyObject)\n      return copyObject\n    }\n\n    if (isDate(value)) {\n      return new Date(value)\n    }\n\n    if (isBuffer(value)) {\n      return value.slice()\n    }\n\n    if (isSet(value) || isWeakSet(value)) {\n      const copySet = new Set<any>()\n      ;(value as Set<any>).forEach((item) => {\n        copySet.add(baseClone(item, hash))\n      })\n      return copySet\n    }\n\n    if (isMap(value) || isWeakMap(value)) {\n      const copyMap = new Map<any, any>()\n      ;(value as Map<any, any>).forEach((item: any, key: any) => {\n        copyMap.set(key, baseClone(item, hash))\n      })\n      return copyMap\n    }\n  }\n\n  if (isSymbol(value)) {\n    return Symbol(value.description)\n  }\n\n  return value\n}\n\n/**\n * @description 深度拷贝\n * 1、支持特殊对象：日期、正则表达式、函数等\n * 2、正确处理循环引用，不会导致无限递归\n */\nexport function deepClone<T>(value: T): T {\n  return baseClone(value)\n}\n","/**\n * @description 提取链接中的文件名\n */\nexport function extraFileName(url: string): string {\n  const match = decodeURIComponent(url).match(/[^/]*$/)\n  if (match) {\n    return (match[0] || '').split('?')[0]\n  }\n  return ''\n}\n\n/**\n * @description 下载blob文件\n */\nexport function baseDownload(blob: Blob, name: string) {\n  const url = window.URL.createObjectURL(blob)\n  const link = document.createElement('a')\n  link.href = url\n  link.download = name\n  link.click()\n  window.URL.revokeObjectURL(url) // 释放内存\n}\n\n/**\n * @description 根据图片链接生成canvas下载图片\n */\nexport function downloadImage(url: string, fileName?: string) {\n  if (!url) {\n    throw URIError('链接不能为空')\n  }\n  const canvas = document.createElement('canvas')\n  const img = document.createElement('img')\n  // 解决跨域 Canvas 污染问题\n  img.setAttribute('crossOrigin', 'Anonymous')\n  // 将资源链接赋值过去，才能触发img.onload事件\n  img.src = url\n  img.onload = function () {\n    canvas.width = img.width\n    canvas.height = img.height\n    const context = canvas.getContext('2d')\n    if (!context || !canvas) return\n    // 绘制图片\n    context.drawImage(img, 0, 0, img.width, img.height)\n    canvas.getContext('2d')?.drawImage(img, 0, 0, img.width, img.height)\n    // 将canvas转blob，然后创建一个a连接自动下载图片\n    canvas.toBlob((blob) => {\n      if (blob) {\n        const file_name = fileName || extraFileName(url) || 'download.png'\n        baseDownload(blob, file_name)\n      }\n    })\n  }\n}\n\n/**\n * @description 根据文件对象对象下载文件\n */\nexport function fileDownload(file: File, options?: BlobPropertyBag) {\n  baseDownload(new Blob([file], options), file.name || '下载')\n}\n\n/**\n * @description 根据文件｜图片链接下载文件｜图片\n */\nexport function downloadFile(fileUrl: string, fileName?: string) {\n  if (!fileUrl) {\n    throw URIError('链接不能为空')\n  }\n  const file_name = fileName || extraFileName(fileUrl) || 'download.png'\n  if (typeof fetch === 'function') {\n    fetch(fileUrl)\n      .then((response) => response.blob())\n      .then((blob) => {\n        baseDownload(blob, file_name)\n      })\n      .catch((error) => console.error('Error downloading file:', error))\n  } else if (XMLHttpRequest) {\n    const xhr = new XMLHttpRequest()\n    xhr.open('GET', fileUrl, true)\n    xhr.responseType = 'blob'\n\n    xhr.onload = function () {\n      if (this.status === 200) {\n        baseDownload(this.response, file_name)\n      } else {\n        console.error('Error fetching resource')\n      }\n    }\n\n    xhr.send()\n  } else {\n    window.open(fileUrl, '_blank')\n  }\n}\n","/**\n * @description 开启休眠\n * @param {number} time 休眠时间（毫秒）\n */\nexport function sleep(time = 1000) {\n  return new Promise((resolve) => {\n    setTimeout(resolve, time)\n  })\n}\n","import { isString, isArray, isPlainObject } from './typeof'\ntype IClassName = string | Record<string, boolean | undefined | null> | IClassName[]\n\n/**\n * @description 拼接class\n */\nfunction classnames(...args: IClassName[]): string {\n  const classes: string[] = []\n  args.forEach((arg) => {\n    if (arg) {\n      classes.push(parseValue(arg))\n    }\n  })\n  return classes.filter((item) => item).join(' ')\n}\n\nfunction parseValue(arg: IClassName): string {\n  if (isString(arg)) {\n    return arg as string\n  }\n  if (isArray(arg)) {\n    return classnames(...(arg as IClassName[]))\n  }\n  if (isPlainObject(arg)) {\n    const classes: string[] = []\n    Object.keys(arg).forEach((key) => {\n      if (key && (arg as Record<string, boolean>)[key]) {\n        classes.push(key)\n      }\n    })\n    return classes.join(' ')\n  }\n  return ''\n}\n\nexport default classnames\n","import { isFunction } from '../utils/typeof'\n\n// useGetDerivedNamespace\nlet defaultNamespace = ''\nlet defaultCssNamespace = 'root'\nconst statePrefix = 'is-'\n\nconst _bem = (\n  namespace: string,\n  block: string,\n  blockSuffix: string,\n  element: string,\n  modifier: string\n) => {\n  let cls = `${namespace ? `${namespace}-` : ''}${block}`\n  if (blockSuffix) {\n    cls += `-${blockSuffix}`\n  }\n  if (element) {\n    cls += `__${element}`\n  }\n  if (modifier) {\n    cls += `--${modifier}`\n  }\n  return cls\n}\n/**\n * @description 格式化命名class\n * @param {String} block - 模块\n * @param {String} namespaceOverrides - 命名空间\n * @returns {Object} - 包含 b: 模块， e: 元素， m: 修饰 等的对象\n */\nexport function useNamespace(block: string, namespaceOverrides?: string) {\n  const namespace = namespaceOverrides || defaultNamespace\n  const cssNamespace = namespaceOverrides || defaultCssNamespace\n  // const namespace = useGetDerivedNamespace(namespaceOverrides)\n\n  const set = (namespaceOverrides: string) => {\n    defaultNamespace = namespaceOverrides\n    defaultCssNamespace = namespaceOverrides\n  }\n\n  const get = () => {\n    return {\n      defaultNamespace,\n      defaultCssNamespace\n    }\n  }\n  const b = (blockSuffix = '') => _bem(namespace, block, blockSuffix, '', '')\n  const e = (element?: string) => (element ? _bem(namespace, block, '', element, '') : '')\n  const m = (modifier?: string) => (modifier ? _bem(namespace, block, '', '', modifier) : '')\n\n  const be = (blockSuffix?: string, element?: string) =>\n    blockSuffix && element ? _bem(namespace, block, blockSuffix, element, '') : ''\n  const em = (element?: string, modifier?: string) =>\n    element && modifier ? _bem(namespace, block, '', element, modifier) : ''\n  const bm = (blockSuffix?: string, modifier?: string) => {\n    return blockSuffix && modifier ? _bem(namespace, block, blockSuffix, '', modifier) : ''\n  }\n  const bem = (blockSuffix?: string, element?: string, modifier?: string) =>\n    blockSuffix && element && modifier ? _bem(namespace, block, blockSuffix, element, modifier) : ''\n\n  const is = (name: string, state: boolean | undefined | (() => boolean)) => {\n    if (!name || !state) return ''\n    let isState = true\n    if (isFunction(state)) {\n      isState = (state as () => boolean)()\n    }\n    return isState ? `${statePrefix}${name}` : ''\n  }\n\n  // for css var\n  // --el-xxx: value;\n  const cssVar = (object: Record<string, string>) => {\n    const styles: Record<string, string> = {}\n    for (const key in object) {\n      if (object[key]) {\n        styles[`--${cssNamespace}-${key}`] = object[key]\n      }\n    }\n    return styles\n  }\n  // with block\n  const cssVarBlock = (object: Record<string, string>) => {\n    const styles: Record<string, string> = {}\n    for (const key in object) {\n      if (object[key]) {\n        styles[`--${cssNamespace}-${block}-${key}`] = object[key]\n      }\n    }\n    return styles\n  }\n\n  const cssVarName = (name: string) => `--${cssNamespace}-${name}`\n  const cssVarBlockName = (name: string) => `--${cssNamespace}-${block}-${name}`\n\n  return {\n    set,\n    get,\n    b,\n    e,\n    m,\n    be,\n    em,\n    bm,\n    bem,\n    is,\n    cssVar,\n    cssVarBlock,\n    cssVarName,\n    cssVarBlockName\n  }\n}\n\nexport default useNamespace\n","interface IFragmentLoader {\n  /* 列表总数据 */\n  dataList: any[]\n  /* 分段大小，每次多少条数据 */\n  fragmentSize?: number\n}\n\ntype IRequestFn = (fragmentData: any) => Promise<any>\n\ninterface IOnProgressOpts {\n  // 批次\n  batch: number\n  // 当前排序\n  current: number\n  // 请求完成计数\n  count: number\n  // 共计\n  total: number\n  // 百分比\n  percent: number\n}\n\ntype IOnProgressFn = (opts: IOnProgressOpts) => void\n\ntype IOnDone = (resData: any[]) => void\n\ntype IOnFail = (err: Error) => void\n\n/**\n * 分片/分段数据加载器\n */\nclass FragmentLoader {\n  /* 列表总数据 */\n  private _dataList: any[]\n\n  /* 分段大小，每次多少条数据 */\n  private _fragmentSize: number\n\n  /* 发送多少批次 */\n  private _batchSize: number\n\n  /* 请求函数 */\n  private _requestFn?: IRequestFn\n\n  /* 加载进度回调函数 */\n  private _onProgressFn?: IOnProgressFn\n\n  /* 加载完成的回调函数 */\n  private _onDone?: IOnDone\n\n  /* 加载失败的回调函数 */\n  private _onFail?: IOnFail\n\n  /* 是否中断请求 */\n  private _aborted = false\n\n  /* 响应的数据 */\n  private _responseData: any[] = []\n\n  constructor({ dataList, fragmentSize }: IFragmentLoader) {\n    this._dataList = [...dataList]\n    // 默认分段大小为 3 个数据\n    this._fragmentSize = fragmentSize || 3\n    // 总共发送多少批次，一个批次发送 _fragmentSize 个数据\n    this._batchSize = Math.ceil(this._dataList.length / this._fragmentSize)\n  }\n\n  /**\n   * 依批次请求数据，每批次请求 3 个\n   */\n  async startup() {\n    if (!this._requestFn) {\n      throw new Error('缺少 request 函数')\n      return\n    }\n\n    if (this._dataList.length === 0) {\n      this._onDone?.([])\n      return\n    }\n    let count = 0\n    // 分批次请求\n    for (let i = 0; i < this._batchSize; i++) {\n      if (this._aborted) {\n        return\n      }\n\n      // 每批的基数\n      const baseIndex = i * this._fragmentSize\n\n      // 分批请求集合\n      const fnPromises: Promise<any>[] = []\n\n      // 最后次请求数 = 长度 - 已上传完成数量\n      const requestCount =\n        i + 1 === this._batchSize\n          ? this._dataList.length - i * this._fragmentSize\n          : this._fragmentSize\n\n      // 创建分段数据，发送请求\n      for (let j = 0; j < requestCount; j++) {\n        const currentIndex = baseIndex + j\n        const fragmentItem = this._dataList[currentIndex]\n        if (fragmentItem) {\n          const promise = this._requestFn(fragmentItem).finally(() => {\n            count++\n            this._onProgressFn?.({\n              batch: i + 1, // 批次\n              current: currentIndex, // 整体索引index\n              count, // 上传完成计数\n              total: this._dataList.length, // 数据长度\n              percent: Math.floor((count / this._dataList.length) * 100) // 进度百分比\n            })\n          })\n          fnPromises.push(promise)\n        }\n      }\n      try {\n        const res = await Promise.allSettled(fnPromises)\n\n        if (!this._aborted) {\n          ;(res || []).forEach((item) => {\n            this._responseData.push(item)\n          })\n        }\n      } catch (error) {\n        this._onFail?.(error instanceof Error ? error : Error(String(error)))\n      }\n    }\n    this._onDone?.(this._responseData)\n  }\n\n  /**\n   * 发送请求的函数\n   */\n  request(fn: IRequestFn) {\n    this._requestFn = fn\n  }\n\n  /**\n   * 进度变更事件\n   */\n  onProgress(fn: IOnProgressFn) {\n    this._onProgressFn = fn\n  }\n\n  /**\n   * 加载完成的回调函数\n   */\n  onDone(fn: IOnDone) {\n    this._onDone = fn\n  }\n\n  /**\n   * 加载失败的回调函数\n   */\n  onFail(fn: IOnFail) {\n    this._onFail = fn\n  }\n\n  /**\n   * 中断请求\n   */\n  abort() {\n    this._aborted = true\n    // 数据垃圾回收\n    this._dataList = null as any\n    this._responseData = null as any\n  }\n}\n\nexport interface IFragmentLoadParams extends IFragmentLoader {\n  request: IRequestFn\n  onProgress: IOnProgressFn\n  onDone?: IOnDone\n  onFail?: IOnFail\n}\n\nexport interface IFragmentLoadListResult {\n  abort: () => void\n  startup: () => Promise<any[]>\n}\n\n/**\n * 分片/分段数据加载简易调用函数\n */\nconst useFragmentLoad = ({\n  dataList,\n  fragmentSize,\n  request,\n  onProgress,\n  onDone,\n  onFail\n}: IFragmentLoadParams): IFragmentLoadListResult => {\n  const loader = new FragmentLoader({ dataList, fragmentSize })\n\n  loader.request(request)\n  loader.onProgress(onProgress)\n\n  return {\n    abort: () => loader.abort(),\n    startup: () =>\n      new Promise<any[]>((resolve, reject) => {\n        if (onDone) {\n          loader.onDone(onDone)\n        } else {\n          loader.onDone((resData) => resolve(resData))\n        }\n\n        if (onFail) {\n          loader.onFail(onFail)\n        } else {\n          loader.onFail((err) => reject(err))\n        }\n\n        loader.startup()\n      })\n  }\n}\n\nexport default useFragmentLoad\n","import useNamespace from './useNamespace'\nimport useFragmentLoad from './useFragmentLoad'\nexport * from './useFragmentLoad'\nexport * from './useNamespace'\n\nexport default { useNamespace, useFragmentLoad }\n"],"names":["toTypeString","value","typeOf","isMap","isWeakMap","isSet","isWeakSet","isDate","isNumber","isBoolean","isString","isFunction","isAsyncFunction","isSymbol","isArray","isObject","isPlainObject","isPromise","isEmpty","isKey","key","type","isBuffer","execStatement","statement","rootData","context","e","uuidv4","c","r","requestFullScreen","el","element","exitFullScreen","thousandSeparatedFormat","splits","integerPart","snakeToCamel","str","word","index","propsToCamel","obj","isChinese","isAlphanumeric","isMobile","isDeepProp","isEmail","regexps","getAllKeys","object","castPath","result","match","number","offset","subString","omit","paths","pick","genNumberArray","length","start","_","i","deepCloneFunction","fn","hash","newFn","prop","plainClone","baseClone","copyArray","item","copyObject","copySet","copyMap","deepClone","extraFileName","url","baseDownload","blob","name","link","downloadImage","fileName","canvas","img","_a","file_name","fileDownload","file","options","downloadFile","fileUrl","response","error","xhr","sleep","time","resolve","classnames","args","classes","arg","parseValue","defaultNamespace","defaultCssNamespace","statePrefix","_bem","namespace","block","blockSuffix","modifier","cls","useNamespace","namespaceOverrides","cssNamespace","state","isState","styles","FragmentLoader","dataList","fragmentSize","count","baseIndex","fnPromises","requestCount","j","currentIndex","fragmentItem","promise","res","_b","_c","request","onProgress","onDone","onFail","loader","reject","resData","err"],"mappings":"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"}