{"version":3,"file":"index.mjs","sources":["../src/common.ts","../src/clipboard.ts","../src/color.ts","../src/counter.ts","../src/data.ts","../src/number.ts","../src/date.ts","../src/deep-clone.ts","../src/destroy-object.ts","../src/dom-event.ts","../src/dom.ts","../src/escape-html.ts","../src/event-emitter.ts","../src/log.ts","../src/performance.ts","../src/support.ts","../src/transform.ts","../src/word-case.ts"],"sourcesContent":["/** 当前环境是否为客户端 */\nexport const isClient = typeof window !== 'undefined'\n/** 当前环境是否为 IOS */\nexport const isIOS =\n  /* #__PURE__ */ isClient &&\n  window?.navigator?.userAgent &&\n  /iP(ad|hone|od)/.test(window.navigator.userAgent)\n\nconst toString = Object.prototype.toString\nconst hasOwnProperty = Object.prototype.hasOwnProperty\n\n/**\n * 判断一个值是否为指定的类型\n *\n * @param value 需判断的值\n * @param type 指定的类型，注意大小写\n *\n * @returns 类型是否匹配\n */\nexport function is(value: unknown, type: string) {\n  return toString.call(value) === `[object ${type}]`\n}\n\n/**\n * 判断一个对象是否包含指定的键值\n *\n * @param value 需判断的对象\n * @param key 指定的键值\n *\n * @returns 是否包含键值\n */\nexport function has(value: Record<string, any>, key: string | symbol): key is keyof typeof value {\n  return hasOwnProperty.call(value, key)\n}\n\n/**\n * 判断一个值是否已定义\n *\n * @param value 需判断的值\n *\n * @returns 是否已定义\n */\nexport function isDefined<T = unknown>(\n  value: T | undefined | null,\n): value is Exclude<T, undefined | null> {\n  return value !== undefined && value !== null\n}\n\n/**\n * 判断一个值是否未被定义\n *\n * @param value 需判断的值\n *\n * @returns 是否未定义\n */\nexport function isNull(value: unknown): value is null | undefined {\n  return value === undefined || value === null\n}\n\n/**\n * 判断一个值是否为数字\n *\n * @param value 需判断的值\n *\n * @returns 是否为数字\n */\nexport function isNumber(value: unknown): value is number {\n  return typeof value === 'number'\n}\n\n/**\n * 判断一个值是否为 `NaN`\n *\n * @param value 需判断的值\n *\n * @returns 是否为 `NaN`\n */\nexport function isNaN(value: unknown): value is number {\n  return Number.isNaN(value)\n}\n\n/**\n * 判断一个值是否为字符串\n *\n * @param value 需判断的值\n *\n * @returns 是否为字符串\n */\nexport function isString(value: unknown): value is string {\n  return typeof value === 'string'\n}\n\n/**\n * 判断一个值是否为布尔值\n *\n * @param value 需判断的值\n *\n * @returns 是否为布尔值\n */\nexport function isBoolean(value: unknown): value is boolean {\n  return typeof value === 'boolean'\n}\n\n/**\n * 判断一个值是否为 `true`\n *\n * @param value 需判断的值\n *\n * @returns 是否为 `true`\n */\nexport function isTrue(value: unknown): value is true {\n  return value === true\n}\n\n/**\n * 判断一个值是否为 `false`\n *\n * @param value 需判断的值\n *\n * @returns 是否为 `false`\n */\nexport function isFalse(value: unknown): value is false {\n  return value === false\n}\n\n/**\n * 判断一个值是否为 `Symbol`\n *\n * @param value 需判断的值\n *\n * @returns 是否为 `Symbol`\n */\nexport function isSymbol(value: unknown): value is symbol {\n  return typeof value === 'symbol'\n}\n\n/**\n * 判断一个值是否为 `BigInt`\n *\n * @param value 需判断的值\n *\n * @returns 是否为 `BigInt`\n */\nexport function isBigInt(value: unknown): value is bigint {\n  return typeof value === 'bigint'\n}\n\n/**\n * 判断一个值是否为数组\n *\n * @param value 需判断的值\n *\n * @returns 是否为数组\n */\nexport function isArray<T = any>(value: unknown): value is T[] {\n  return Array.isArray(value)\n}\n\n/**\n * 判断一个值是否为对象\n *\n * 注意，`null` 与原生的特殊对象不被包含\n *\n * @param value 需判断的值\n *\n * @returns 是否为对象\n */\nexport function isObject<T extends Record<any, any> = Record<any, any>>(\n  value: unknown,\n): value is T {\n  return is(value, 'Object')\n}\n\n/**\n * 判断一个值是否为 `Promise`\n *\n * 如果一个对象包含 `then` 和 `catch` 方法，则被认为是一个 `Promise`\n *\n * @param value 需判断的值\n *\n * @returns 是否为 `Promise`\n */\nexport function isPromise<T = any>(value: unknown): value is Promise<T> {\n  return (\n    !!value &&\n    typeof (value as any).then === 'function' &&\n    typeof (value as any).catch === 'function'\n  )\n}\n\n/**\n * 判断一个值是否为函数\n *\n * @param value 需判断的值\n *\n * @returns 是否为函数\n */\nexport function isFunction(value: unknown): value is (...any: any[]) => any {\n  return typeof value === 'function'\n}\n\n/**\n * 判断一个值是否为 `Set`\n *\n * @param value 需判断的值\n *\n * @returns 是否为 `Set`\n */\nexport function isSet<T = any>(value: unknown): value is Set<T> {\n  return is(value, 'Set')\n}\n\n/**\n * 判断一个值是否为 `Map`\n *\n * @param value 需判断的值\n *\n * @returns 是否为 `Map`\n */\nexport function isMap<K = any, V = any>(value: unknown): value is Map<K, V> {\n  return is(value, 'Map')\n}\n\n/**\n * 判断一个值是否为 `Date`\n *\n * @param value 需判断的值\n *\n * @returns 是否为 `Date`\n */\nexport function isDate(value: unknown): value is Date {\n  return is(value, 'Date')\n}\n\n/**\n * 判断一个值是否为正则\n *\n * @param value 需判断的值\n *\n * @returns 是否为正则\n */\nexport function isRegExp(value: unknown): value is RegExp {\n  return is(value, 'RegExp')\n}\n\n/**\n * 判断一个值是否为空\n *\n * - 如果这是一个数组或字符串，则 `length` 为 `0` 时为空\n * - 如果这是一个 `Set` 或 `Map`，则 `size` 为 `0` 时为空\n * - 如果这是一个对象，则无任何键值时为空\n * - 如果这是一个数字，则为 `NaN` 时为空\n * - 其余情况下，未定义时为空\n *\n * @param value 需判断的值\n *\n * @returns 是否为空\n */\nexport function isEmpty(value: unknown) {\n  if (Array.isArray(value) || typeof value === 'string') {\n    return value.length === 0\n  }\n\n  if (value instanceof Map || value instanceof Set) {\n    return value.size === 0\n  }\n\n  if (isObject(value)) {\n    return Object.keys(value).length === 0\n  }\n\n  if (typeof value === 'number') {\n    return isNaN(value)\n  }\n\n  return isNull(value)\n}\n\n/**\n * 判断一个值是否为 `Element`\n *\n * @param value 需判断的值\n * @param ssr 是否考虑服务端渲染\n *\n * @returns 是否为 `Element`\n */\nexport function isElement<T extends Element = Element>(value: unknown, ssr = false): value is T {\n  if (!ssr && !isClient) return false\n\n  return !!(value && 'nodeType' in (value as any))\n}\n\n/**\n * 判断一个值能否被迭代\n *\n * @param value 需判断的值\n *\n * @returns 能否被迭代\n */\nexport function isIterable(value: unknown) {\n  return isDefined(value) && typeof (value as any)[Symbol.iterator] === 'function'\n}\n\n/**\n * 一个空的占位函数\n */\nexport function noop(...args: any[]): any\nexport function noop() {}\n\n/**\n * 一个返回 `true` 的占位函数\n *\n * @returns `true`\n */\nexport function toTrue(...args: any[]): true\nexport function toTrue() {\n  return true\n}\n\n/**\n * 一个返回 `false` 的占位函数\n *\n * @returns `false`\n */\nexport function toFalse(...args: any[]): false\nexport function toFalse() {\n  return false\n}\n\n/**\n * 生成一个值递进的数组\n *\n * @param size 大小\n * @param start 开始的数值，默认为 1\n * @param step 跨度，默认为 1\n *\n * @returns 生成的数组\n */\nexport function range(size: number, start = 1, step = 1) {\n  const array: number[] = []\n\n  for (let i = 0; i < size; ++i) {\n    array.push(start + i * step)\n  }\n\n  return array\n}\n\n/**\n * 获取变量的类型\n *\n * @param value 任意变量\n *\n * @returns 变量的类型\n */\nexport function getType(value: unknown) {\n  return Object.prototype.toString.call(value).slice(8, -1)\n}\n\n/**\n * 根据长度生成一串随机的字符串\n *\n * @param length 字符串的长度\n *\n * @returns 生成的字符串\n */\nexport function randomString(length = 16) {\n  const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'\n  const maxPos = chars.length\n\n  let string = ''\n\n  while (length--) {\n    string += chars.charAt(Math.floor(Math.random() * maxPos))\n  }\n\n  return string\n}\n\n/**\n * 根据一系列判断条件，执行第一个为 `true` 的条件所对应的回调函数\n *\n * @param conditions 判断条件及回调函数\n * @param options 额外的选项\n *\n * @returns 是否匹配了任一条件\n */\nexport async function decide(\n  conditions: [boolean | (() => boolean), () => void | Promise<void>][],\n  options: {\n    /**\n     * 当匹配任意一个条件时，会在该条件对应的回调函数执行前执行\n     */\n    beforeMatchAny?: () => void | Promise<void>,\n    /**\n     * 当匹配任意一个条件时，会在该条件对应的回调函数执行完后执行\n     */\n    afterMatchAny?: () => void | Promise<void>\n  } = {},\n) {\n  if (conditions.length) {\n    for (const [condition, callback] of conditions) {\n      if (typeof condition === 'function' ? condition() : condition) {\n        if (typeof options.beforeMatchAny === 'function') {\n          await options.beforeMatchAny()\n        }\n\n        await callback()\n\n        if (typeof options.afterMatchAny === 'function') {\n          await options.afterMatchAny()\n        }\n\n        return true\n      }\n    }\n  }\n\n  return false\n}\n","import { isClient } from './common'\n\n/**\n * 将指定的文本写入粘贴板\n *\n * @param text 需要写入的文本\n *\n * @returns 是否写入成功\n */\nexport async function writeClipboard(text: string) {\n  if (!isClient) return false\n\n  try {\n    await navigator.clipboard.writeText(text)\n\n    return true\n  } catch {\n    let isSuccess = false\n\n    const textarea = document.createElement('textarea')\n    const prevFocused = document.activeElement\n\n    textarea.value = text\n\n    // Prevent keyboard from showing on mobile\n    textarea.setAttribute('readonly', '')\n\n    textarea.style.contain = 'strict'\n    textarea.style.position = 'absolute'\n    textarea.style.height = '0'\n    textarea.style.fontSize = '12pt' // Prevent zooming on iOS\n\n    const selection = document.getSelection()\n    const originalRange = selection ? selection.rangeCount > 0 && selection.getRangeAt(0) : null\n\n    document.body.appendChild(textarea)\n    textarea.select()\n\n    // Explicit selection workaround for iOS\n    textarea.selectionStart = 0\n    textarea.selectionEnd = text.length\n\n    isSuccess = document.execCommand('copy')\n    document.body.removeChild(textarea)\n\n    if (originalRange) {\n      selection!.removeAllRanges() // originalRange can't be truthy when selection is falsy\n      selection!.addRange(originalRange)\n    }\n\n    // Get the focus back on the previously focused element, if any\n    if (prevFocused) {\n      ;(prevFocused as HTMLElement).focus()\n    }\n\n    return isSuccess\n  }\n}\n","import { isDefined } from './common'\n\ninterface RGB extends Record<any, any> {\n  r: number,\n  g: number,\n  b: number,\n  a?: number\n}\n\nexport interface RGBColor extends RGB {\n  a?: 1,\n  format?: 'name' | 'rgb'\n}\n\nexport interface RGBAColor extends RGB {\n  a: number,\n  format?: 'name' | 'rgba'\n}\n\nexport interface HEX3Color extends RGB {\n  a?: 1,\n  format?: 'name' | 'hex3'\n}\nexport interface HEX4Color extends RGB {\n  a: number,\n  format?: 'name' | 'hex4'\n}\nexport interface HEX6Color extends RGB {\n  a?: 1,\n  format?: 'name' | 'hex6'\n}\nexport interface HEX8Color extends RGB {\n  a: number,\n  format?: 'name' | 'hex8'\n}\n\ninterface HSL extends Record<any, any> {\n  h: number,\n  s: number,\n  l: number,\n  a?: number\n}\n\nexport interface HSLColor extends HSL {\n  a?: 1,\n  format?: 'name' | 'hsl'\n}\n\nexport interface HSLAColor extends HSL {\n  a: number,\n  format?: 'name' | 'hsla'\n}\n\ninterface HSV extends Record<any, any> {\n  h: number,\n  s: number,\n  v: number,\n  a?: number\n}\n\nexport interface HSVColor extends HSV {\n  a?: 1,\n  format?: 'name' | 'hsv'\n}\n\nexport interface HSVAColor extends HSV {\n  a: number,\n  format?: 'name' | 'hsva'\n}\n\nexport type Color =\n  | string\n  | RGBColor\n  | RGBAColor\n  | HSLColor\n  | HSLAColor\n  | HSVColor\n  | HSVAColor\n  | HEX3Color\n  | HEX4Color\n  | HEX6Color\n  | HEX8Color\n\nexport type ObjectColor = Exclude<Color, string>\n\nexport interface ColorMeta {\n  rgb: RGBColor,\n  hsl: HSLColor,\n  hsv: HSVColor,\n  hex: string,\n  alpha: number,\n  rgba: RGBAColor,\n  hsla: HSLAColor,\n  hsva: HSVAColor,\n  hex8: string,\n  gray: number,\n  origin: Color\n}\n\nexport type ColorType = 'hex' | 'rgb' | 'hsv' | 'hsl'\n\nconst INTEGER_REG = '[-\\\\+]?\\\\d+%?'\nconst NUMBER_REG = '[-\\\\+]?\\\\d*\\\\.\\\\d+%?'\n\nconst NUMBER_UNIT = `(?:${NUMBER_REG})|(?:${INTEGER_REG})`\n\nconst COLOR_REG_3 = `[\\\\s|\\\\(]+(${NUMBER_UNIT})[,|\\\\s]+(${NUMBER_UNIT})[,|\\\\s]+(${NUMBER_UNIT})\\\\s*\\\\)?`\nconst COLOR_REG_4 = `[\\\\s|\\\\(]+(${NUMBER_UNIT})[,|\\\\s]+(${NUMBER_UNIT})[,|\\\\s]+(${NUMBER_UNIT})[,|\\\\s]+(${NUMBER_UNIT})\\\\s*\\\\)?`\n\n// const UNIT_REG = new RegExp(NUMBER_UNIT)\n\n// const FORMAT_REG = /^((((?:rgb)|(?:hsl)|(?:hsv))a?)|hex[3468]?|name)$/\n\nexport const RGB_REG = new RegExp(`rgb${COLOR_REG_3}`)\nexport const RGBA_REG = new RegExp(`rgba${COLOR_REG_4}`)\nexport const HSL_REG = new RegExp(`hsl${COLOR_REG_4}`)\nexport const HSLA_REG = new RegExp(`hsla${COLOR_REG_4}`)\nexport const HSV_REG = new RegExp(`hsv${COLOR_REG_4}`)\nexport const HSVA_REG = new RegExp(`hsva${COLOR_REG_4}`)\n\nexport const HEX_REG_3 = /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/\nexport const HEX_REG_4 = /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/\nexport const HEX_REG_6 = /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/\nexport const HEX_REG_8 = /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/\n\nexport const NAMED_COLORS = Object.freeze({\n  aliceblue: 'f0f8ff',\n  antiquewhite: 'faebd7',\n  aqua: '0ff',\n  aquamarine: '7fffd4',\n  azure: 'f0ffff',\n  beige: 'f5f5dc',\n  bisque: 'ffe4c4',\n  black: '000',\n  blanchedalmond: 'ffebcd',\n  blue: '00f',\n  blueviolet: '8a2be2',\n  brown: 'a52a2a',\n  burlywood: 'deb887',\n  burntsienna: 'ea7e5d',\n  cadetblue: '5f9ea0',\n  chartreuse: '7fff00',\n  chocolate: 'd2691e',\n  coral: 'ff7f50',\n  cornflowerblue: '6495ed',\n  cornsilk: 'fff8dc',\n  crimson: 'dc143c',\n  cyan: '0ff',\n  darkblue: '00008b',\n  darkcyan: '008b8b',\n  darkgoldenrod: 'b8860b',\n  darkgray: 'a9a9a9',\n  darkgreen: '006400',\n  darkgrey: 'a9a9a9',\n  darkkhaki: 'bdb76b',\n  darkmagenta: '8b008b',\n  darkolivegreen: '556b2f',\n  darkorange: 'ff8c00',\n  darkorchid: '9932cc',\n  darkred: '8b0000',\n  darksalmon: 'e9967a',\n  darkseagreen: '8fbc8f',\n  darkslateblue: '483d8b',\n  darkslategray: '2f4f4f',\n  darkslategrey: '2f4f4f',\n  darkturquoise: '00ced1',\n  darkviolet: '9400d3',\n  deeppink: 'ff1493',\n  deepskyblue: '00bfff',\n  dimgray: '696969',\n  dimgrey: '696969',\n  dodgerblue: '1e90ff',\n  firebrick: 'b22222',\n  floralwhite: 'fffaf0',\n  forestgreen: '228b22',\n  fuchsia: 'f0f',\n  gainsboro: 'dcdcdc',\n  ghostwhite: 'f8f8ff',\n  gold: 'ffd700',\n  goldenrod: 'daa520',\n  gray: '808080',\n  green: '008000',\n  greenyellow: 'adff2f',\n  grey: '808080',\n  honeydew: 'f0fff0',\n  hotpink: 'ff69b4',\n  indianred: 'cd5c5c',\n  indigo: '4b0082',\n  ivory: 'fffff0',\n  khaki: 'f0e68c',\n  lavender: 'e6e6fa',\n  lavenderblush: 'fff0f5',\n  lawngreen: '7cfc00',\n  lemonchiffon: 'fffacd',\n  lightblue: 'add8e6',\n  lightcoral: 'f08080',\n  lightcyan: 'e0ffff',\n  lightgoldenrodyellow: 'fafad2',\n  lightgray: 'd3d3d3',\n  lightgreen: '90ee90',\n  lightgrey: 'd3d3d3',\n  lightpink: 'ffb6c1',\n  lightsalmon: 'ffa07a',\n  lightseagreen: '20b2aa',\n  lightskyblue: '87cefa',\n  lightslategray: '789',\n  lightslategrey: '789',\n  lightsteelblue: 'b0c4de',\n  lightyellow: 'ffffe0',\n  lime: '0f0',\n  limegreen: '32cd32',\n  linen: 'faf0e6',\n  magenta: 'f0f',\n  maroon: '800000',\n  mediumaquamarine: '66cdaa',\n  mediumblue: '0000cd',\n  mediumorchid: 'ba55d3',\n  mediumpurple: '9370db',\n  mediumseagreen: '3cb371',\n  mediumslateblue: '7b68ee',\n  mediumspringgreen: '00fa9a',\n  mediumturquoise: '48d1cc',\n  mediumvioletred: 'c71585',\n  midnightblue: '191970',\n  mintcream: 'f5fffa',\n  mistyrose: 'ffe4e1',\n  moccasin: 'ffe4b5',\n  navajowhite: 'ffdead',\n  navy: '000080',\n  oldlace: 'fdf5e6',\n  olive: '808000',\n  olivedrab: '6b8e23',\n  orange: 'ffa500',\n  orangered: 'ff4500',\n  orchid: 'da70d6',\n  palegoldenrod: 'eee8aa',\n  palegreen: '98fb98',\n  paleturquoise: 'afeeee',\n  palevioletred: 'db7093',\n  papayawhip: 'ffefd5',\n  peachpuff: 'ffdab9',\n  peru: 'cd853f',\n  pink: 'ffc0cb',\n  plum: 'dda0dd',\n  powderblue: 'b0e0e6',\n  purple: '800080',\n  rebeccapurple: '663399',\n  red: 'f00',\n  rosybrown: 'bc8f8f',\n  royalblue: '4169e1',\n  saddlebrown: '8b4513',\n  salmon: 'fa8072',\n  sandybrown: 'f4a460',\n  seagreen: '2e8b57',\n  seashell: 'fff5ee',\n  sienna: 'a0522d',\n  silver: 'c0c0c0',\n  skyblue: '87ceeb',\n  slateblue: '6a5acd',\n  slategray: '708090',\n  slategrey: '708090',\n  snow: 'fffafa',\n  springgreen: '00ff7f',\n  steelblue: '4682b4',\n  tan: 'd2b48c',\n  teal: '008080',\n  thistle: 'd8bfd8',\n  tomato: 'ff6347',\n  turquoise: '40e0d0',\n  violet: 'ee82ee',\n  wheat: 'f5deb3',\n  white: 'fff',\n  whitesmoke: 'f5f5f5',\n  yellow: 'ff0',\n  yellowgreen: '9acd32',\n})\n\nexport type ColorName = keyof typeof NAMED_COLORS\n\nexport const COLOR_NAMES = Object.freeze(new Set(Object.keys(NAMED_COLORS))) as Readonly<\n  Set<ColorName>\n>\n\n/**\n * 判断给定的字符串是否为一个合法颜色值\n *\n * @param value 原始字符串\n *\n * @returns 是否为合法颜色\n */\nexport function isColor(value: string): boolean {\n  value = String(value).trim().toLowerCase()\n\n  if (!value) {\n    return false\n  }\n\n  if (value === 'transparent' || NAMED_COLORS[value as ColorName]) {\n    return true\n  }\n\n  return (\n    value === 'transparent' ||\n    COLOR_NAMES.has(value as ColorName) ||\n    RGB_REG.test(value) ||\n    RGBA_REG.test(value) ||\n    HSL_REG.test(value) ||\n    HSLA_REG.test(value) ||\n    HSV_REG.test(value) ||\n    HSVA_REG.test(value) ||\n    HEX_REG_3.test(value) ||\n    HEX_REG_4.test(value) ||\n    HEX_REG_6.test(value) ||\n    HEX_REG_8.test(value)\n  )\n}\n\n/**\n * 将给定的字符串转化为 {@link ObjectColor}，无法转换时返回 null\n *\n * @param color 原始颜色字符串\n *\n * @returns 解析后的颜色对象\n */\nexport function parseStringColor(color: string): ObjectColor | null {\n  color = color.toString().trim().toLowerCase()\n\n  if (color === 'transparent') {\n    return { r: 0, g: 0, b: 0, a: 0, format: 'name', toString: toRgbString }\n  }\n\n  let named = false\n\n  if (NAMED_COLORS[color as ColorName]) {\n    color = NAMED_COLORS[color as ColorName]\n    named = true\n  }\n\n  let match\n\n  if ((match = RGB_REG.exec(color))) {\n    const { r, g, b } = normalizeRgb(match[1], match[2], match[3])\n\n    return {\n      r: r * 255,\n      g: g * 255,\n      b: b * 255,\n      format: 'rgb',\n      toString: toRgbString,\n    }\n  }\n\n  if ((match = RGBA_REG.exec(color))) {\n    const { r, g, b } = normalizeRgb(match[1], match[2], match[3])\n\n    return {\n      r: r * 255,\n      g: g * 255,\n      b: b * 255,\n      a: normalizeAlpha(match[4]),\n      format: 'rgba',\n      toString: toRgbString,\n    }\n  }\n\n  if ((match = HSL_REG.exec(color))) {\n    const { h, s, l } = normalizeHsl(match[0], match[1], match[3])\n\n    return { h: h * 360, s, l, format: 'hsl', toString: toHslString }\n  }\n\n  if ((match = HSLA_REG.exec(color))) {\n    const { h, s, l } = normalizeHsl(match[0], match[1], match[3])\n\n    return {\n      h: h * 360,\n      s,\n      l,\n      a: normalizeAlpha(match[4]),\n      format: 'hsla',\n      toString: toHslString,\n    }\n  }\n\n  if ((match = HSV_REG.exec(color))) {\n    const { h, s, v } = normalizeHsv(match[0], match[1], match[3])\n\n    return { h: h * 360, s, v, format: 'hsv', toString: toHsvString }\n  }\n\n  if ((match = HSVA_REG.exec(color))) {\n    const { h, s, v } = normalizeHsv(match[0], match[1], match[3])\n\n    return {\n      h: h * 360,\n      s,\n      v,\n      a: normalizeAlpha(match[4]),\n      format: 'hsva',\n      toString: toHsvString,\n    }\n  }\n\n  if ((match = HEX_REG_3.exec(color))) {\n    return {\n      r: parseInt(`${match[1]}${match[1]}`, 16),\n      g: parseInt(`${match[2]}${match[2]}`, 16),\n      b: parseInt(`${match[3]}${match[3]}`, 16),\n      format: named ? 'name' : 'hex3',\n      toString: toRgbString,\n    }\n  }\n\n  if ((match = HEX_REG_4.exec(color))) {\n    return {\n      r: parseInt(`${match[1]}${match[1]}`, 16),\n      g: parseInt(`${match[2]}${match[2]}`, 16),\n      b: parseInt(`${match[3]}${match[3]}`, 16),\n      a: convertHexToDecimal(`${match[4]}${match[4]}`),\n      format: named ? 'name' : 'hex4',\n      toString: toRgbString,\n    }\n  }\n\n  if ((match = HEX_REG_6.exec(color))) {\n    return {\n      r: parseInt(match[1], 16),\n      g: parseInt(match[2], 16),\n      b: parseInt(match[3], 16),\n      format: named ? 'name' : 'hex6',\n      toString: toRgbString,\n    }\n  }\n\n  if ((match = HEX_REG_8.exec(color))) {\n    return {\n      r: parseInt(match[1], 16),\n      g: parseInt(match[2], 16),\n      b: parseInt(match[3], 16),\n      a: convertHexToDecimal(match[4]),\n      format: named ? 'name' : 'hex8',\n      toString: toRgbString,\n    }\n  }\n\n  return null\n}\n\n/**\n * 将给定的 {@link Color} 解析为 {@link ColorMeta}\n *\n * @param color 原始颜色值\n *\n * @returns 解析后的颜色元数据\n */\nexport function parseColor(color: Color): ColorMeta {\n  const { a, ...rgb } = parseColorToRgba(color)\n\n  delete rgb.format\n\n  const hsl = rgbToHsl(rgb.r, rgb.g, rgb.b)\n  const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b)\n  const hex = rgbToHex(rgb.r, rgb.g, rgb.b)\n\n  const hex8 = rgbaToHex(rgb.r, rgb.g, rgb.b, a)\n\n  return {\n    rgb: rgb as RGBColor,\n    hsl,\n    hsv,\n    hex,\n    alpha: a,\n    rgba: { ...rgb, a, format: 'rgba' },\n    hsla: { ...hsl, a, format: 'hsla' },\n    hsva: { ...hsv, a, format: 'hsva' },\n    hex8,\n    gray: rgbToGrayScale(rgb),\n    origin: color,\n  }\n}\n\n/**\n * 将给定的 {@link Color} 解析为 {@link RGBAColor}\n *\n * @param originColor 原始颜色值\n *\n * @returns 解析后的 RGB 颜色对象\n */\nexport function parseColorToRgba(originColor: Color): RGBAColor {\n  let rgb: RGBColor = { r: 0, g: 0, b: 0 }\n  let a = 1\n  let color: Color | null\n\n  if (typeof originColor === 'string') {\n    color = parseStringColor(originColor)\n  } else {\n    color = originColor\n  }\n\n  if (color !== null && typeof color === 'object') {\n    if ('l' in color) {\n      rgb = hslToRgb(color.h, color.s, color.l)\n    } else if ('v' in color) {\n      rgb = hsvToRgb(color.h, color.s, color.v)\n    }\n\n    if ('a' in color) {\n      a = normalizeAlpha(color.a ?? 1)\n\n      if (Number.isNaN(a)) {\n        a = 1\n      }\n    }\n\n    rgb = color as RGBColor\n  }\n\n  return { ...rgb, a, format: 'rgba', toString: toRgbString }\n}\n\n/**\n * 将原始的 h、s、l 值标准化为 0 ~ 1 的值\n *\n * @param h 0 ~ 360\n * @param s 0 ~ 1，0% ~ 100%\n * @param l 0 ~ 1，0% ~ 100%\n *\n * @returns 标准化后的 HSL 对象\n */\nexport function normalizeHsl(h: number | string, s: number | string, l: number | string) {\n  return {\n    h: boundRange(h, 0, 360) / 360,\n    s: boundRange(isPercentage(s) ? parsePercentage(s) : s, 0, 1),\n    l: boundRange(isPercentage(l) ? parsePercentage(l) : l, 0, 1),\n  }\n}\n\n/**\n * 将原始的 r、g、b 值标准化为 0 ~ 1 的值\n *\n * @param r 0 ~ 255\n * @param g 0 ~ 255\n * @param b 0 ~ 255\n *\n * @returns 标准化后 RGB 对象\n */\nexport function normalizeRgb(r: number | string, g: number | string, b: number | string) {\n  return {\n    r: boundRange(r, 0, 255) / 255,\n    g: boundRange(g, 0, 255) / 255,\n    b: boundRange(b, 0, 255) / 255,\n  }\n}\n\n/**\n * 将原始的 h、s、v 值标准化为 0 ~ 1 的值\n *\n * @param h 0 ~ 360\n * @param s 0 ~ 1，0% ~ 100%\n * @param v 0 ~ 1，0% ~ 100%\n *\n * @returns 标准化的 HSV 对象\n */\nexport function normalizeHsv(h: number | string, s: number | string, v: number | string) {\n  return {\n    h: boundRange(h, 0, 360) / 360,\n    s: boundRange(isPercentage(s) ? parsePercentage(s) : s, 0, 1),\n    v: boundRange(isPercentage(v) ? parsePercentage(v) : v, 0, 1),\n  }\n}\n\n/**\n * 将原始透明度值标准化为 0 ~ 1 的值\n *\n * @param a 0 ~ 1，0% ~ 100%\n *\n * @returns 标准化后的透明度\n */\nexport function normalizeAlpha(a: number | string) {\n  return boundRange(isPercentage(a) ? parsePercentage(a) : a, 0, 1)\n}\n\n/**\n * 将 HSL 颜色转换为 RGB 颜色\n *\n * @param h 0 ~ 360\n * @param s 0 ~ 1，0% ~ 100%\n * @param l 0 ~ 1，0% ~ 100%\n *\n * @returns 转换后的 RGB 颜色\n */\nexport function hslToRgb(h: number | string, s: number | string, l: number | string): RGBColor {\n  let r, g, b\n  ;({ h, s, l } = normalizeHsl(h, s, l))\n\n  if (s === 0) {\n    r = g = b = l\n  } else {\n    const q = l < 0.5 ? 1 * (1 + s) : l + s - l * s\n    const p = 2 * l - q\n\n    r = hueToRgb(p, q, h + 1 / 3)\n    g = hueToRgb(p, q, h)\n    b = hueToRgb(p, q, h - 1 / 3)\n  }\n\n  r *= 255\n  g *= 255\n  b *= 255\n\n  return { r, g, b, toString: toRgbString }\n}\n\n/**\n * 将 RGB 颜色转换为 HSL 颜色\n *\n * @param r 0 ~ 255\n * @param g 0 ~ 255\n * @param b 0 ~ 255\n *\n * @returns 转换后的 HSL 颜色\n */\nexport function rgbToHsl(r: number | string, g: number | string, b: number | string): HSLColor {\n  ;({ r, g, b } = normalizeRgb(r, g, b))\n\n  const max = Math.max(r, g, b)\n  const min = Math.min(r, g, b)\n  let h, s\n\n  const l = (max + min) / 2\n\n  if (max === min) {\n    h = s = 0\n  } else {\n    const d = max - min\n\n    s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n\n    switch (max) {\n      case r: {\n        h = (g - b) / d + (g < b ? 6 : 0)\n        break\n      }\n      case g: {\n        h = (b - r) / d + 2\n        break\n      }\n      case b: {\n        h = (r - g) / d + 4\n        break\n      }\n      default: {\n        h = 0\n      }\n    }\n\n    h *= 60\n  }\n\n  return { h, s, l, toString: toHslString }\n}\n\n/**\n * 将 HSL 颜色转换为 HSV 颜色\n *\n * @param h 0 ~ 360\n * @param s 0 ~ 1，0% ~ 100%\n * @param l 0 ~ 1，0% ~ 100%\n *\n * @returns 转换后的 HSV 颜色\n */\nexport function hslToHsv(h: number | string, s: number | string, l: number | string): HSVColor {\n  ;({ h, s, l } = normalizeHsl(h, s, l))\n\n  const v = 0.5 * (2 * l + s * (1 - Math.abs(2 * l - 1)))\n\n  s = (2 * (v - l)) / v\n\n  return { h: h * 360, s, v, toString: toHsvString }\n}\n\n/**\n * 将 HSV 颜色转换为 HSL 颜色\n *\n * @param h 0 ~ 360\n * @param s 0 ~ 1，0% ~ 100%\n * @param v 0 ~ 1，0% ~ 100%\n *\n * @returns 转换后的 HSL 颜色\n */\nexport function hsvToHsl(h: number | string, s: number | string, v: number | string): HSLColor {\n  ;({ h, s, v } = normalizeHsv(h, s, v))\n\n  const l = 0.5 * v * (2 - s)\n\n  s = (v * s) / (1 - Math.abs(2 * l - 1))\n\n  return { h: h * 360, s, l, toString: toHslString }\n}\n\n/**\n * 将 HSV 颜色转换为 RGB 颜色\n *\n * @param h 0 ~ 360\n * @param s 0 ~ 1，0% ~ 100%\n * @param v 0 ~ 1，0% ~ 100%\n *\n * @returns 转换后的 RGB 颜色\n */\nexport function hsvToRgb(h: number | string, s: number | string, v: number | string): RGBColor {\n  ;({ h, s, v } = normalizeHsv(h, s, v))\n\n  h *= 6\n\n  const i = Math.floor(h)\n  const f = h - i\n  const p = v * (1 - s)\n  const q = v * (1 - f * s)\n  const t = v * (1 - (1 - f) * s)\n  const mod = i % 6\n\n  let r = [v, q, p, p, t, v][mod]\n  let g = [t, v, v, q, p, p][mod]\n  let b = [p, p, t, v, v, q][mod]\n\n  r *= 255\n  g *= 255\n  b *= 255\n\n  return { r, g, b, toString: toRgbString }\n}\n\n/**\n * 将 RGB 颜色转换为 HSV 颜色\n *\n * @param r 0 ~ 255\n * @param g 0 ~ 255\n * @param b 0 ~ 255\n *\n * @returns 转换后的 HSV 颜色\n */\nexport function rgbToHsv(r: number | string, g: number | string, b: number | string): HSVColor {\n  ;({ r, g, b } = normalizeRgb(r, g, b))\n\n  const max = Math.max(r, g, b)\n  const min = Math.min(r, g, b)\n\n  let h\n\n  const v = max\n  const d = max - min\n  const s = max === 0 ? 0 : d / max\n\n  if (max === min) {\n    h = 0\n  } else {\n    switch (max) {\n      case r: {\n        h = (g - b) / d + (g < b ? 6 : 0)\n        break\n      }\n      case g: {\n        h = (b - r) / d + 2\n        break\n      }\n      case b: {\n        h = (r - g) / d + 4\n        break\n      }\n      default: {\n        h = 0\n      }\n    }\n\n    h *= 60\n  }\n\n  return { h, s, v, toString: toHsvString }\n}\n\n/**\n * 将 RGB 颜色转换为 HEX 颜色\n *\n * @param r 0 ~ 255\n * @param g 0 ~ 255\n * @param b 0 ~ 255\n * @param allow3Char 是否允许 3 位的 HEX 值\n *\n * @returns 转换后的 HEX 颜色\n */\nexport function rgbToHex(\n  r: number | string,\n  g: number | string,\n  b: number | string,\n  allow3Char = false,\n) {\n  ;({ r, g, b } = normalizeRgb(r, g, b))\n\n  const hex = [\n    repairDigits(Math.round(r * 255).toString(16)),\n    repairDigits(Math.round(g * 255).toString(16)),\n    repairDigits(Math.round(b * 255).toString(16)),\n  ]\n\n  if (allow3Char && isRepetitive(hex[0]) && isRepetitive(hex[1]) && isRepetitive(hex[2])) {\n    return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0)\n  }\n\n  return '#' + hex.join('')\n}\n\n/**\n * 将 RGBA 颜色转换为 HEX 颜色\n *\n * @param r 0 ~ 255\n * @param g 0 ~ 255\n * @param b 0 ~ 255\n * @param a 0 ~ 1，0% ~ 100%\n * @param allow4Char 是否允许 4 位的 HEX 值\n *\n * @returns 转换后的 HEX 颜色\n */\nexport function rgbaToHex(\n  r: number | string,\n  g: number | string,\n  b: number | string,\n  a: number | string,\n  allow4Char = false,\n) {\n  ;({ r, g, b } = normalizeRgb(r, g, b))\n\n  const hex = [\n    repairDigits(Math.round(r * 255).toString(16)),\n    repairDigits(Math.round(g * 255).toString(16)),\n    repairDigits(Math.round(b * 255).toString(16)),\n    repairDigits(convertDecimalToHex(normalizeAlpha(a))),\n  ]\n\n  if (\n    allow4Char &&\n    isRepetitive(hex[0]) &&\n    isRepetitive(hex[1]) &&\n    isRepetitive(hex[2]) &&\n    isRepetitive(hex[3])\n  ) {\n    return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0)\n  }\n\n  return '#' + hex.join('')\n}\n\n/**\n * 将两种颜色按照一定的比例混合\n *\n * @param color1 第一种颜色\n * @param color2 第二种颜色\n * @param weight 混合比例 0 ~ 1，越小则第一种颜色越少\n *\n * @returns 混合后的颜色\n */\nexport function mixColor(color1: Color, color2: Color, weight = 0.5): RGBAColor {\n  if (!color1 && !color2) return { r: 0, g: 0, b: 0, a: 1 }\n  if (!color1) return parseColorToRgba(color2)\n  if (!color2) return parseColorToRgba(color1)\n\n  const rgba1 = parseColorToRgba(color1)\n  const rgba2 = parseColorToRgba(color2)\n\n  const originalWeight = boundRange(weight, 0, 1)\n  const normalizedWeight = originalWeight * 2 - 1\n\n  const alphaDistance = rgba1.a - rgba2.a\n  const mixWeight =\n    normalizedWeight * alphaDistance === -1\n      ? normalizedWeight\n      : (normalizedWeight + alphaDistance) / (1 + normalizedWeight * alphaDistance)\n  const weight1 = (mixWeight + 1) / 2\n  const weight2 = 1 - weight1\n\n  return {\n    r: Math.round(rgba1.r * weight1 + rgba2.r * weight2),\n    g: Math.round(rgba1.g * weight1 + rgba2.g * weight2),\n    b: Math.round(rgba1.b * weight1 + rgba2.b * weight2),\n    a: Math.round(rgba1.a * originalWeight + rgba2.a * (1 - originalWeight)),\n    format: 'rgba',\n    toString: toRgbString,\n  }\n}\n\n/**\n * 调整给定颜色值的透明度\n *\n * @param color 需要调整的颜色\n * @param alpha 调整后的透明度 0 ~ 1，0% ~ 100%\n *\n * @returns 调整后的颜色\n */\nexport function adjustAlpha(color: Color, alpha: number | string) {\n  const rgba = parseColorToRgba(color)\n\n  rgba.a = normalizeAlpha(alpha)\n\n  return rgba\n}\n\n/**\n * 随机生成一个颜色值\n *\n * @param withAlpha 是否具有透明度\n * @param type 颜色的类型\n *\n * @returns 生成的颜色字面值\n */\nexport function randomColor(withAlpha = false, type: ColorType = 'hex') {\n  const r = Math.round(Math.random() * 255)\n  const g = Math.round(Math.random() * 255)\n  const b = Math.round(Math.random() * 255)\n\n  if (type === 'hex') {\n    return withAlpha ? rgbaToHex(r, g, b, Math.random()) : rgbToHex(r, g, b)\n  }\n\n  let color: ObjectColor\n\n  if (type === 'hsl') {\n    color = rgbToHsl(r, g, b)\n  } else if (type === 'hsv') {\n    color = rgbToHsv(r, g, b)\n  } else {\n    color = Object.create({ r, g, b, toString: toRgbString })\n  }\n\n  if (withAlpha) {\n    ;(color as RGBAColor).a = Math.random()\n  }\n\n  return color.toString()\n}\n\n/**\n * 随机生成一个特定色调（冷暖色）的颜色值\n *\n * @param prefer 色调\n * @param withAlpha 是否具有透明度\n * @param type 颜色的类型\n *\n * @returns 生成的颜色字面值\n */\nexport function randomPreferColor(\n  prefer: 'hard' | 'soft',\n  withAlpha = false,\n  type: ColorType = 'hex',\n) {\n  const h = Math.round(Math.random() * 360)\n  const s = Math.round(prefer === 'hard' ? 80 + Math.random() * 20 : 20 + Math.random() * 70) / 100\n  const l = Math.round(prefer === 'hard' ? 40 + Math.random() * 20 : 80 + Math.random() * 15) / 100\n\n  if (type === 'hsl') {\n    return toHslString.bind({ h, s, l })()\n  }\n\n  let color!: ObjectColor\n\n  if (type === 'hex' || type === 'rgb') {\n    color = hslToRgb(h, s, l)\n\n    if (type === 'hex') {\n      const { r, g, b } = color\n\n      return withAlpha ? rgbaToHex(r, g, b, Math.random()) : rgbToHex(r, g, b)\n    }\n  } else if (type === 'hsv') {\n    color = hslToHsv(h, s, l)\n  }\n\n  if (withAlpha) {\n    ;(color as RGBAColor).a = Math.random()\n  }\n\n  return color.toString()\n}\n\n/**\n * 随机生成一个冷色调的颜色值\n *\n * @param withAlpha 是否具有透明度\n * @param type 颜色的类型\n *\n * @returns 生成的颜色字面值\n */\nexport function randomHardColor(withAlpha = false, type: ColorType = 'hex') {\n  return randomPreferColor('hard', withAlpha, type)\n}\n\n/**\n * 随机生成一个暖色调的颜色值\n *\n * @param withAlpha 是否具有透明度\n * @param type 颜色的类型\n *\n * @returns 生成的颜色字面值\n */\nexport function randomSoftColor(withAlpha = false, type: ColorType = 'hex') {\n  return randomPreferColor('soft', withAlpha, type)\n}\n\n/**\n * 获取给定颜色的灰度\n *\n * @param color 颜色字面值\n *\n * @returns 颜色的灰度\n */\nexport function toGrayScale(color: string) {\n  return rgbToGrayScale(parseColorToRgba(color))\n}\n\nfunction repairDigits(str: string) {\n  return str.length === 1 ? `0${str}` : str.toString()\n}\n\nfunction isRepetitive(string: string): boolean {\n  return string.charAt(0) === string.charAt(1)\n}\n\n// function testUnit(color: number | string): boolean {\n//   return UNIT_REG.test(color as string)\n// }\n\nfunction convertDecimalToHex(number: number | string): string {\n  return Math.round(parseFloat(number as string) * 255).toString(16)\n}\n\nfunction convertHexToDecimal(hex: string): number {\n  return parseInt(hex, 16) / 255\n}\n\nfunction boundRange(number: number | string, min: number, max: number): number {\n  return Math.max(min, Math.min(max, parseFloat(number as string)))\n}\n\nfunction hueToRgb(p: number, q: number, t: number): number {\n  if (t < 0) t += 1\n  if (t > 1) t -= 1\n  if (t < 1 / 6) return p + (q - p) * 6 * t\n  if (t < 1 / 2) return q\n  if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6\n\n  return p\n}\n\nfunction isPercentage(percent: number | string): boolean {\n  return String(percent).trim().includes('%')\n}\n\nfunction parsePercentage(percent: number | string): number {\n  const number = parseFloat(percent as string) / 100\n\n  return Number.isNaN(number) ? 0 : number\n}\n\nfunction toRgbString(this: RGB) {\n  if (isDefined(this.a) && this.a >= 0 && this.a < 1) {\n    return `rgba(${this.r}, ${this.g}, ${this.b}, ${this.a})`\n  }\n\n  return `rgb(${this.r}, ${this.g}, ${this.b})`\n}\n\nfunction toHslString(this: HSL) {\n  const s = `${this.s * 100}%`\n  const l = `${this.l * 100}%`\n\n  if (isDefined(this.a) && this.a >= 0 && this.a < 1) {\n    return `hsla(${this.h}, ${s}, ${l}, ${this.a})`\n  }\n\n  return `hsl(${this.h}, ${s}, ${l})`\n}\n\nfunction toHsvString(this: HSV) {\n  const s = `${this.s * 100}%`\n  const v = `${this.v * 100}%`\n\n  if (isDefined(this.a) && this.a >= 0 && this.a < 1) {\n    return `hsva(${this.h}, ${s}, ${v}, ${this.a})`\n  }\n\n  return `hsv(${this.h}, ${s}, ${v})`\n}\n\nfunction rgbToGrayScale(rgb: RGB) {\n  return (rgb.r * 0.2126 + rgb.g * 0.7152 + rgb.b * 0.0722) / 255\n}\n","let globalCount = 0\n\nexport function getGlobalCount() {\n  return globalCount++\n}\n\nexport function setGlobalCount(count: number) {\n  globalCount = Math.round(count)\n}\n\nexport function createCounter(count = 0) {\n  return {\n    getCount: () => count++,\n    setCount: (newCount: number) => {\n      count = newCount\n    },\n  }\n}\n","export interface BITree {\n  tree: number[],\n  /**\n   * 为第 index 个元素增减值\n   *\n   * @param index 索引值\n   * @param num 增减的值\n   */\n  add(index: number, num: number): void,\n  /**\n   * 求前 index 个元素的和\n   *\n   * @param index 索引值\n   *\n   * @returns 前 index 个元素的和\n   */\n  sum(index?: number): number,\n  /**\n   * 获取第 index 个元素的值\n   *\n   * @param index 索引值\n   *\n   * @returns 第 index 个元素的值\n   */\n  get(index: number): number,\n  /**\n   * 根据目标值寻找一个最接近的元素的索引值\n   *\n   * @param target 目标值\n   *\n   * @returns 最接近的元素的索引值\n   */\n  boundIndex(target: number): number\n}\n\nfunction lowBit(num: number) {\n  return num & -num\n}\n\n/**\n * 创建一个二叉索引树（Fenwick 树）对象\n *\n * 为了节省初始化性能开销，需确保元素最小值已知，其初始值为：元素最小值 * 元素总数\n *\n * @param length 树的大小，即元素的总数\n * @param min 规定元素的最小值\n *\n * @returns 二叉索引树对象\n */\nexport function createBITree(length: number, min = 0): BITree {\n  const tree: number[] = new Array(length + 1).fill(0)\n\n  function add(index: number, delta: number) {\n    if (!delta || index >= length) return\n\n    index += 1\n\n    while (index <= length) {\n      tree[index] += delta\n      index += lowBit(index)\n    }\n  }\n\n  function sum(index = length) {\n    if (index <= 0) return 0\n    if (index > length) index = length\n\n    let sum = index * min\n\n    while (index > 0) {\n      sum += tree[index]\n      index -= lowBit(index)\n    }\n\n    return sum\n  }\n\n  function get(index: number) {\n    return sum(index + 1) - sum(index)\n  }\n\n  function boundIndex(target: number) {\n    let left = 0\n    let right = length\n\n    while (right > left) {\n      const middle = Math.floor((left + right) / 2)\n      const total = sum(middle)\n\n      if (total > target) {\n        right = middle\n        continue\n      } else if (total < target) {\n        if (left === middle) {\n          return sum(left + 1) <= target ? left + 1 : left\n        }\n\n        left = middle\n      } else {\n        return middle\n      }\n    }\n\n    return left\n  }\n\n  return { tree, add, sum, get, boundIndex }\n}\n","import type { AnyCase } from './word-case'\n\nexport const numberRE = /^\\s*[+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?\\s*$/\n\n/**\n * 检测给定的值是否可以通过 parseFlat 或 Number 方法转为数字\n *\n * 开启严格模式则通过正则以更严格的方法判断\n *\n * @param value 需要检测的值\n * @param strict 是否为严格模式\n *\n * @returns 值是否可以转为数字\n */\nexport function isValidNumber(value: unknown, strict = false) {\n  if (typeof value === 'number') {\n    return !Number.isNaN(value)\n  }\n\n  if (strict) {\n    return numberRE.test(String(value))\n  }\n\n  return !Number.isNaN(parseFloat(value as string)) || !Number.isNaN(Number(value))\n}\n\n/**\n * 将给定的值转成数字，NaN 的情况将会处理成 0\n *\n * @param value 需要转换的值\n *\n * @returns 转换后的数字\n */\nexport function toNumber(value: unknown) {\n  let number = parseFloat(value as string)\n\n  if (Number.isNaN(number)) {\n    number = Number(value)\n  }\n\n  return Number.isNaN(number) ? 0 : number\n}\n\n/**\n * 为给定的整数开头填充 0，直至满足指定的长度\n *\n * @param number 需要处理的整数\n * @param length 填充至的长度\n *\n * @returns 填充后的字面值\n */\nexport function padStartZeros(number: number, length: number) {\n  if (length <= 0) {\n    return number.toString()\n  }\n\n  return `${number < 0 ? '-' : ''}${String(Math.abs(Math.round(number))).padStart(length, '0')}`\n}\n\n/**\n * 将小于 10 整数 N 变成 `0N` 的字符串，方法不会对入参校验\n *\n * @param number 需要处理的整数\n *\n * @returns 填充后的字面值\n */\nexport function doubleDigits(number: number) {\n  return padStartZeros(number, 2)\n}\n\n/**\n * 返回数字的小数位数\n *\n * @param number 指定的数字\n *\n * @returns 数字的小数位数\n */\nexport function decimalLength(number: number | string) {\n  // Get digit length of e\n  const eSplit = number.toString().split(/[eE]/)\n  const len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0)\n\n  return len > 0 ? len : 0\n}\n\n/**\n * Return decimal length of a number\n *\n * @param number The input number\n * @deprecated Using `decimalLength` to replace it\n */\nexport function digitLength(number: number | string) {\n  return decimalLength(number)\n}\n\n/**\n * 将给定的数字格式化为指定的位阶\n *\n * @param number 需要格式化的数字\n * @param segment 分隔的位数，默认为 3\n * @param separator 分隔的符号，默认为 ','\n *\n * @returns 格式化后的字面值\n */\nexport function segmentNumber(number: number | string, segment = 3, separator = ',') {\n  if (typeof number !== 'number') {\n    number = parseFloat(number)\n  }\n\n  if (Number.isNaN(number)) return '0'\n\n  let [integer, decimal] = String(number).split('.')\n\n  const formatRegExp = new RegExp(`(\\\\d+)(\\\\d{${segment}})`)\n\n  while (formatRegExp.test(integer)) {\n    integer = integer.replace(formatRegExp, `$1${separator}$2`)\n  }\n\n  decimal = decimal ? `.${decimal}` : ''\n\n  return `${integer}${decimal}`\n}\n\n/**\n * 将给定的实数保留一定的小数\n *\n * @param number 需要处理的实数\n * @param decimal 需要保留的小数\n *\n * @returns 保留小数后的值\n */\nexport function toFixed(number: number, decimal: number) {\n  decimal = Math.max(Math.round(decimal), 0)\n\n  let snum = number.toFixed(decimalLength(number))\n\n  const pointPos = snum.indexOf('.')\n\n  if (pointPos === -1) return number\n\n  const nums = snum.replace('.', '').split('')\n  const targetPos = pointPos + decimal\n  const datum = nums[targetPos]\n\n  if (!datum) return number\n\n  if (snum.charAt(targetPos + 1) === '5') {\n    snum = snum.substring(0, targetPos + 1) + '6'\n  } else {\n    snum = snum.substring(0, targetPos + 2)\n  }\n\n  return parseFloat(Number(snum).toFixed(decimal))\n}\n\n/**\n * 将给定的实数扩大一定的倍数并保留一定的小数\n *\n * @param number 要处理的实数\n * @param multiple 要扩大的倍数\n * @param decimal 要保留的小数\n *\n * @returns 扩大并保留小数后的值\n */\nexport function multipleFixed(number: number, multiple: number, decimal: number) {\n  return toFixed(number * multiple, decimal)\n}\n\n/**\n * 根据临界值对给定的数字进行舍入\n *\n * @param number 需要舍入的数\n * @param criticalValue 舍入的临界值 (0 ~ 1)，达到临界值进位反之舍弃\n *\n * @returns 舍入后的值\n */\nexport function round(number: number, criticalValue: number) {\n  if (criticalValue < 0 || criticalValue > 1) {\n    return Math.round(number)\n  }\n\n  const ceilValue = Math.ceil(number)\n\n  if (number + 1 - criticalValue >= ceilValue) {\n    return ceilValue\n  } else {\n    return Math.floor(number)\n  }\n}\n\n/**\n * 将给定的数字限定在指定的范围内\n *\n * @param number 需要限定范围的数\n * @param min 边界最小值，包含该值\n * @param max 边界最大值，包含该值\n *\n * @returns 限定在范围内的值\n */\nexport function boundRange(number: number | string, min: number, max: number) {\n  return Math.max(min, Math.min(max, parseFloat(number as string)))\n}\n\n/**\n * 将给定的被除数和除数，不断的取余直至达到次数限制或余数小于除数，返回系列余数\n *\n * @param number 被除数，需大于 0\n * @param divideBy 除数，需大于 1\n * @param limit 次数限制，默认为 0，小于 1 则不作限制\n *\n * @returns 相除过程的系列余数\n */\nexport function leaveNumber(number: number, divideBy: number, limit = 0) {\n  if (number <= 0 || divideBy <= 1) return [number]\n\n  if (limit < 1) {\n    limit = Infinity\n  }\n\n  const remainders: number[] = []\n  let count = 0\n\n  while (number >= divideBy && count < limit) {\n    remainders.push(number % divideBy)\n    number = Math.floor(number / divideBy)\n    ++count\n  }\n\n  remainders.push(number)\n\n  return remainders.reverse()\n}\n\nconst ordinalSuffixes = ['th', 'st', 'nd', 'rd']\n\n/**\n * 将给定的数字转换为序数词\n *\n * @param value 需要转换的数字\n *\n * @returns 转换后的序数词\n */\nexport function ordinalNumber(value: number) {\n  value = Math.round(value)\n\n  if (value <= 0) return `${value}th`\n\n  const suffix =\n    value % 100 > 10 && value % 100 < 14\n      ? ordinalSuffixes[0]\n      : ordinalSuffixes[value % 10] || ordinalSuffixes[0]\n\n  return `${value}${suffix}`\n}\n\nexport type SizeUnitWithAuto = AnyCase<'B' | 'KB' | 'MB' | 'GB' | 'TB' | 'AUTO'>\nexport type SizeUnit = Exclude<SizeUnitWithAuto, AnyCase<'AUTO'>>\n\nconst SIZE_UNIT_WITH_AUTO = Object.freeze([\n  'B',\n  'KB',\n  'MB',\n  'GB',\n  'TB',\n  'AUTO',\n] as Uppercase<SizeUnitWithAuto>[])\n\n/**\n * 根据给定的 Byte 数值，将其格式化成指定单位的大小\n *\n * @param byte 需要计算的 Byte 数值\n * @param unit 格式化的单位\n * @param precision 结果的精度\n * @param joinUtil 是否加入单位\n *\n * @returns 格式化后的值\n */\nexport function formatByteSize(byte: number, unit?: SizeUnitWithAuto): number\nexport function formatByteSize(byte: number, unit?: SizeUnitWithAuto, precision?: number): number\nexport function formatByteSize(byte: number, unit?: SizeUnitWithAuto, joinUtil?: true): number\nexport function formatByteSize(\n  byte: number,\n  unit?: SizeUnitWithAuto,\n  joinUtil?: true,\n  precision?: number\n): number\nexport function formatByteSize(\n  byte: number,\n  unit: SizeUnitWithAuto = 'AUTO',\n  joinUtil: number | boolean = false,\n  precision?: number,\n) {\n  if (typeof precision === 'undefined') {\n    if (typeof joinUtil === 'number') {\n      precision = joinUtil\n      joinUtil = false\n    } else {\n      precision = 2\n    }\n  }\n\n  let upperUnit = unit.toUpperCase() as Uppercase<SizeUnitWithAuto>\n  upperUnit = SIZE_UNIT_WITH_AUTO.includes(upperUnit) ? upperUnit : 'AUTO'\n\n  let power\n  switch (upperUnit) {\n    case 'AUTO':\n      power = 0\n      break\n    case 'KB':\n      power = 1\n      break\n    case 'MB':\n      power = 2\n      break\n    case 'GB':\n      power = 3\n      break\n    case 'TB':\n      power = 4\n      break\n    default:\n      return byte\n  }\n\n  let targetSize\n\n  if (!power) {\n    for (targetSize = byte; targetSize > 1024; ++power) {\n      if (power > 4) break\n      targetSize = targetSize / 1024\n    }\n  } else {\n    targetSize = byte / 1024 ** power\n  }\n\n  targetSize = toFixed(targetSize, precision)\n\n  return joinUtil\n    ? `${targetSize}${upperUnit === 'AUTO' ? SIZE_UNIT_WITH_AUTO[Math.min(power, 4)] : upperUnit}`\n    : targetSize\n}\n\n/**\n * 在给定的范围内随机一个数\n *\n * @param max 最大值\n * @param min 最小值，默认为 0\n *\n * @returns 生成的随机数\n */\nexport function random(max: number, min = 0) {\n  if (min === max) return min\n\n  if (min > max) {\n    ;[min, max] = [max, min]\n  }\n\n  return Math.random() * (max - min) + min\n}\n\n/**\n * 将数字处理为的指定的有效位数\n *\n * @param number 需要处理的数字\n * @param precision 数字的有效位数\n *\n * @returns 处理后的数字\n *\n * @example\n * ```ts\n * toPrecision(0.09999999999999998) === 0.1 // true\n * ```\n */\nexport function toPrecision(number: number | string, precision = 15) {\n  return +parseFloat(Number(number).toPrecision(precision))\n}\n\nfunction multipleInt(number: number | string) {\n  const snum = String(number)\n\n  if (!snum.includes('e')) {\n    return Number(snum.replace('.', ''))\n  }\n\n  const dLength = decimalLength(number)\n\n  return dLength > 0 ? toPrecision(Number(number) * 10 ** dLength) : Number(number)\n}\n\n/**\n * Create an operation to support rest params.\n *\n * @param operation The original operation\n */\nfunction createOperation(operation: (n1: number | string, n2: number | string) => number) {\n  return (...numbers: (number | string)[]) => {\n    let result = numbers[0] as number\n\n    for (let i = 1, len = numbers.length; i < len; ++i) {\n      result = operation(result, numbers[i])\n    }\n\n    return result\n  }\n}\n\n/**\n * 精确的乘法\n *\n * @param numbers 需要依次相乘的数字\n *\n * @returns 乘积\n */\nexport const times = createOperation((number1, number2) => {\n  const int1 = multipleInt(number1)\n  const int2 = multipleInt(number2)\n  const base = decimalLength(number1) + decimalLength(number2)\n  const int = int1 * int2\n\n  return int / 10 ** base\n})\n\n/**\n * 精确的加法\n *\n * @param numbers 需要依次相加的数字\n *\n * @returns 和\n */\nexport const plus = createOperation((number1, number2) => {\n  const base = 10 ** Math.max(decimalLength(number1), decimalLength(number2))\n\n  return (times(number1, base) + times(number2, base)) / base\n})\n\n/**\n * 精确的减法\n *\n * @param numbers 需要依次相减的数字\n *\n * @returns 差值\n */\nexport const minus = createOperation((number1, number2) => {\n  const base = 10 ** Math.max(decimalLength(number1), decimalLength(number2))\n\n  return (times(number1, base) - times(number2, base)) / base\n})\n\n/**\n * 精确的除法\n *\n * @param numbers 需要依次相除的数字\n *\n * @returns 商\n */\nexport const divide = createOperation((number1, number2) => {\n  const int1 = multipleInt(number1)\n  const int2 = multipleInt(number2)\n\n  return times(int1 / int2, toPrecision(10 ** (decimalLength(number2) - decimalLength(number1))))\n})\n","import { doubleDigits } from './number'\n\nexport type Dateable = number | string | Date\n\n/** @deprecated renames to `SECOND_ON_MILLISECONDS` */\nexport const SECOND_ON_MILLS = 1000\nexport const SECOND_ON_MILLISECONDS = 1000\n\nexport const MINUTE_ON_SECONDS = 60\n/** @deprecated renames to `MINUTE_ON_MILLISECONDS` */\nexport const MINUTE_ON_MILLS = MINUTE_ON_SECONDS * SECOND_ON_MILLISECONDS\nexport const MINUTE_ON_MILLISECONDS = MINUTE_ON_SECONDS * SECOND_ON_MILLISECONDS\n\nexport const HOUR_ON_MINUTES = 60\nexport const HOUR_ON_SECONDS = HOUR_ON_MINUTES * MINUTE_ON_SECONDS\n/** @deprecated renames to `HOUR_ON_MILLISECONDS` */\nexport const HOUR_ON_MILLS = HOUR_ON_SECONDS * SECOND_ON_MILLISECONDS\nexport const HOUR_ON_MILLISECONDS = HOUR_ON_SECONDS * SECOND_ON_MILLISECONDS\n\nexport const DAY_ON_HOURS = 24\nexport const DAY_ON_MINUTES = DAY_ON_HOURS * HOUR_ON_MINUTES\nexport const DAY_ON_SECONDS = DAY_ON_MINUTES * MINUTE_ON_SECONDS\n/** @deprecated renames to `DAY_ON_MILLISECONDS` */\nexport const DAY_ON_MILLS = DAY_ON_SECONDS * SECOND_ON_MILLISECONDS\nexport const DAY_ON_MILLISECONDS = DAY_ON_SECONDS * SECOND_ON_MILLISECONDS\n\nexport const WEEK_ON_DAYS = 7\nexport const WEEK_ON_HOURS = WEEK_ON_DAYS * DAY_ON_HOURS\nexport const WEEK_ON_MINUTES = WEEK_ON_HOURS * HOUR_ON_MINUTES\nexport const WEEK_ON_SECONDS = WEEK_ON_MINUTES * MINUTE_ON_SECONDS\n/** @deprecated renames to `WEEK_ON_MILLISECONDS` */\nexport const WEEK_ON_MILLS = WEEK_ON_SECONDS * SECOND_ON_MILLISECONDS\nexport const WEEK_ON_MILLISECONDS = WEEK_ON_SECONDS * SECOND_ON_MILLISECONDS\n\nexport const QUARTER_ON_MONTHS = 3\n\nexport const YEAR_ON_QUARTERS = 4\nexport const YEAR_ON_MONTHS = YEAR_ON_QUARTERS * QUARTER_ON_MONTHS\n\ntype Formatter = (date: Date, match: string) => string | number\n\ninterface Formatters {\n  [prop: string]: Formatter\n}\n\nconst formatters: Formatters = {\n  y(date, match) {\n    const year = date.getFullYear()\n\n    return match.length === 4 ? year : (year % 1000) % 100\n  },\n  M(date, match) {\n    const month = date.getMonth() + 1\n\n    return match.length === 2 ? doubleDigits(month) : month\n  },\n  d(date, match) {\n    const day = date.getDate()\n\n    return match.length === 2 ? doubleDigits(day) : day\n  },\n  H(date, match) {\n    const hour = date.getHours()\n\n    return match.length === 2 ? doubleDigits(hour) : hour\n  },\n  m(date, match) {\n    const minute = date.getMinutes()\n\n    return match.length === 2 ? doubleDigits(minute) : minute\n  },\n  s(date, match) {\n    const second = date.getSeconds()\n\n    return match.length === 2 ? doubleDigits(second) : second\n  },\n  q(date, match) {\n    const quarter = Math.ceil((date.getMonth() + 1) / 3)\n\n    return match.length === 2 ? doubleDigits(quarter) : quarter\n  },\n}\n\nconst formatRegExp = /[yMdHmsq](\\w)*|./g\nconst quotationRegExp = /'(.+?)'/g\n\n/**\n * 将任意可转为 `Date` 对象的变量转为一个新日期\n *\n * @param any 任意可转换的值\n * @param strict 是否在传入非法值时抛错\n *\n * @returns 转换后的 `Date` 对象\n */\nexport function toDate(any: Dateable, strict = false) {\n  const date = new Date(any)\n\n  if (strict && Number.isNaN(+date)) {\n    throw new RangeError('Invalid date value')\n  }\n\n  if (typeof any === 'string' && !any.includes(':')) {\n    date.setHours(0)\n    date.setMinutes(0)\n    date.setSeconds(0)\n  }\n\n  return date\n}\n\n/**\n * 将日期格式化成指定格式\n *\n * @param date 需要格式化的Date对象\n * @param pattern 格式化结构 年-y 月-M 日-d 时-H 分-m 秒-s 季度-q\n *\n * @returns 格式化后的字面值\n *\n * @example\n * ```ts\n * format(new Date(), 'yyyy-MM-dd')\n * ```\n *\n * @example\n * ```ts\n * format(Date.now(), 'yyyy-MM-dd\\'T\\'HH:mm:ss\\'Z\\'')\n * ```\n */\nexport function format(date: Dateable, pattern = 'yyyy-MM-dd HH:mm:ss') {\n  date = toDate(date)\n\n  const matches = pattern.match(formatRegExp)\n  const length = matches?.length\n\n  if (!length) {\n    return pattern\n  }\n\n  let i = 0\n  let result = ''\n\n  while (i < length) {\n    const substring = (matches as RegExpMatchArray)[i]\n    const firstCharacter = substring[0]\n    const formatter = formatters[firstCharacter]\n\n    if (formatter) {\n      result += formatter(date, substring)\n    } else {\n      result += substring\n    }\n\n    ++i\n  }\n\n  return result.replace(quotationRegExp, '$1')\n}\n\n/**\n * 获取日期的时间部分\n *\n * @param date 给定的日期\n *\n * @returns 日期的时间部分\n */\nexport function getTime(date: Dateable) {\n  date = toDate(date)\n\n  return `${doubleDigits(date.getHours())}:${doubleDigits(date.getMinutes())}:${doubleDigits(\n    date.getSeconds(),\n  )}`\n}\n\n/**\n * 获取日期所在的季度\n *\n * @param date 给定的日期\n *\n * @returns 日期所在的季度\n */\nexport function getQuarter(date: Dateable) {\n  date = toDate(date)\n\n  return Math.floor(date.getMonth() / 3) + 1\n}\n\nconst weeksForChinese = ['日', '一', '二', '三', '四', '五', '六']\n\n/**\n * 获取中文星期\n *\n * @param date 给定的日期\n *\n * @returns 中文星期\n */\nexport function getChineseWeek(date: Date) {\n  return weeksForChinese[date.getDay()]\n}\n\n/**\n * 为日期增减给定的毫秒\n *\n * @param date 原始日期\n * @param amount 增减的毫秒\n *\n * @returns 修改后的日期\n */\nexport function addMilliseconds(date: Dateable, amount: number) {\n  date = toDate(date)\n  date.setTime(date.getTime() + amount)\n\n  return date\n}\n\n/**\n * 为日期增减给定的秒\n *\n * @param date 原始日期\n * @param amount 增减的秒\n *\n * @returns 修改后的日期\n */\nexport function addSeconds(date: Dateable, amount: number) {\n  amount *= SECOND_ON_MILLISECONDS\n\n  return addMilliseconds(date, amount)\n}\n\n/**\n * 为日期增减给定的分钟\n *\n * @param date 原始日期\n * @param amount 增减的分钟\n *\n * @returns 修改后的日期\n */\nexport function addMinutes(date: Dateable, amount: number) {\n  amount *= MINUTE_ON_SECONDS\n\n  return addSeconds(date, amount)\n}\n\n/**\n * 为日期增减给定的小时\n *\n * @param date 原始日期\n * @param amount 增减的小时\n *\n * @returns 修改后的日期\n */\nexport function addHours(date: Dateable, amount: number) {\n  amount *= HOUR_ON_MINUTES\n\n  return addMinutes(date, amount)\n}\n\n/**\n * 为日期增减给定的半天数（12小时）\n *\n * @param date 原始日期\n * @param amount 增减的半天数\n *\n * @returns 修改后的日期\n */\nexport function addHalfDays(date: Dateable, amount: number) {\n  amount *= 12\n\n  return addHours(date, amount)\n}\n\n/**\n * 为日期增减给定的天数\n *\n * @param date 原始日期\n * @param amount 增减的天数\n *\n * @returns 修改后的日期\n */\nexport function addDays(date: Dateable, amount: number) {\n  date = toDate(date)\n  amount = ~~amount\n\n  date.setDate(date.getDate() + amount)\n\n  return date\n}\n\n/**\n * 为日期增减给定的周数\n *\n * @param date 原始日期\n * @param amount 增减的周数\n *\n * @returns 修改后的日期\n */\nexport function addWeeks(date: Dateable, amount: number) {\n  amount *= WEEK_ON_DAYS\n\n  return addDays(date, amount)\n}\n\n/**\n * 为日期增减给定的月数\n *\n * @param date 原始日期\n * @param amount 增减的月数\n *\n * @returns 修改后的日期\n */\nexport function addMonths(date: Dateable, amount: number) {\n  date = toDate(date)\n  amount = ~~amount\n\n  date.setMonth(date.getMonth() + amount)\n\n  return date\n}\n\n/**\n * 为日期增减给定的季度（3个月）\n *\n * @param date 原始日期\n * @param amount 增减的季度\n *\n * @returns 修改后的日期\n */\nexport function addQuarters(date: Dateable, amount: number) {\n  amount *= QUARTER_ON_MONTHS\n\n  return addMonths(date, amount)\n}\n\n/**\n * 为日期增减给定的年份\n *\n * @param date 原始日期\n * @param amount 增减的年份\n *\n * @returns 修改后的日期\n */\nexport function addYears(date: Dateable, amount: number) {\n  amount *= YEAR_ON_MONTHS\n\n  return addMonths(date, amount)\n}\n\n/**\n * 生成一个天数递进的日期数组\n *\n * @param start 开始日期\n * @param size range 的大小, 默认 42 (一般电子日历为 6 行 7 列)\n * @param step range 的跨幅\n *\n * @returns 生成的日期数组\n */\nexport function rangeDate(start: Dateable, size = 42, step = 1) {\n  start = toDate(start)\n\n  const dateRange: Date[] = []\n\n  for (let i = 0; i < size; ++i) {\n    dateRange.push(addDays(start, i * step))\n  }\n\n  return dateRange\n}\n\n/**\n * 生成一个月份递进的日期数组\n *\n * @param start 开始日期\n * @param size range 的大小, 默认 12 (一年)\n * @param step range 的跨幅\n *\n * @returns 生成的日期数组\n */\nexport function rangeMonth(start: Dateable, size = 12, step = 1) {\n  start = toDate(start)\n\n  const dateRange: Date[] = []\n\n  for (let i = 0; i < size; ++i) {\n    dateRange.push(addMonths(start, i * step))\n  }\n\n  return dateRange\n}\n\n/**\n * 根据给定的日期获取上一个周日\n *\n * @param date 原始日期\n *\n * @returns 上一个周日\n */\nexport function getLastSunday(date: Date) {\n  const day = date.getDay() ?? 7\n\n  return addDays(date, -day)\n}\n\n/**\n * 获取给定的日期所在秒的开始日期（毫秒归零）\n *\n * @param date 原始日期\n *\n * @returns 新的开始日期\n */\nexport function startOfSecond(date: Dateable) {\n  date = toDate(date)\n  date.setMilliseconds(0)\n\n  return date\n}\n\n/**\n * 获取给定的日期所在分钟的开始日期 (秒归零)\n *\n * @param date 原始日期\n *\n * @returns 新的开始日期\n */\nexport function startOfMinute(date: Dateable) {\n  date = toDate(date)\n  date.setSeconds(0, 0)\n\n  return date\n}\n\n/**\n * 获取给定的日期所在小时的开始日期 (分钟归零)\n *\n * @param date 原始日期\n *\n * @returns 新的开始日期\n */\nexport function startOfHour(date: Dateable) {\n  date = toDate(date)\n  date.setMinutes(0, 0, 0)\n\n  return date\n}\n\n/**\n * 获取给定的日期所在天的开始日期\n *\n * @param date 原始日期\n *\n * @returns 新的开始日期\n */\nexport function startOfDay(date: Dateable) {\n  date = toDate(date)\n  date.setHours(0, 0, 0, 0)\n\n  return date\n}\n\n/**\n * 获取给定日期所在天的结束日期\n *\n * @param date 原始日期\n *\n * @returns 新的开始日期\n */\nexport function endOfDay(date: Dateable) {\n  date = toDate(date)\n  date.setHours(23, 59, 59, 999)\n\n  return date\n}\n\n/**\n * 获取给定的日期所在周的第一天的开始日期\n *\n * @param date 需要解析的时间\n * @param startOn 设定周的第一天，默认为周日\n *\n * @returns 新的开始日期\n */\nexport function startOfWeek(date: Dateable, startOn = 0) {\n  startOn = startOn % 7\n\n  if (startOn < 0) {\n    startOn += 7\n  }\n\n  date = toDate(date)\n\n  const day = date.getDay()\n  const difference = (day < startOn ? 7 : 0) + day - startOn\n\n  date.setDate(date.getDate() - difference)\n  date.setHours(0, 0, 0, 0)\n\n  return date\n}\n\n/**\n * 判断给定的年份是否为闰年\n *\n * @param year 原始年份\n *\n * @returns 是否为闰年\n */\nexport function isLeapYear(year: number) {\n  return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0\n}\n\n/**\n * 获取给定年份和月份的最后一天\n *\n * @param year 原始年份\n * @param month 原始月份\n *\n * @returns 最后一天\n */\nexport function getLastDayOfMonth(year: number, month: number) {\n  let lastDay: number\n\n  if (month < 7) {\n    if (month !== 2) {\n      lastDay = 30 + (month % 2)\n    } else {\n      if (isLeapYear(year)) {\n        lastDay = 29\n      } else {\n        lastDay = 28\n      }\n    }\n  } else {\n    lastDay = 31 - (month % 2)\n  }\n\n  return lastDay\n}\n\n/**\n * 获取给定的日期所在月份的第一天的开始日期\n *\n * @param date 原始日期\n * @param startOn 设定一个月的第一天，默认为 1 号\n *\n * @returns 新的开始日期\n */\nexport function startOfMonth(date: Dateable, startOn = 1) {\n  date = toDate(date)\n\n  const year = date.getFullYear()\n  const month = date.getMonth() + 1\n  const day = date.getDate()\n\n  const lastDay = getLastDayOfMonth(year, month)\n\n  startOn = startOn % lastDay\n\n  if (startOn < 0) {\n    startOn += lastDay\n  }\n\n  if (day < startOn) {\n    date.setMonth(month - 1)\n  }\n\n  date.setDate(startOn)\n  date.setHours(0, 0, 0, 0)\n\n  return date\n}\n\n/**\n * 获取给定日期所在季度的第一天的开始日期\n *\n * @param date 原始日期\n *\n * @returns 新的开始日期\n */\nexport function startOfQuarter(date: Dateable) {\n  date = toDate(date)\n\n  const quarter = getQuarter(date)\n\n  date.setDate(1)\n  date.setHours(0, 0, 0, 0)\n  date.setMonth((quarter - 1) * 3)\n\n  return date\n}\n\n/**\n * 获取给定日期所在年份的第一天的开始日期\n *\n * @param date 原始日期\n * @param startOn 设定年的开始月份，默认为一月\n *\n * @returns 新的开始日期\n */\nexport function startOfYear(date: Dateable, startOn = 0) {\n  startOn = startOn % 11\n\n  if (startOn < 0) {\n    startOn += 11\n  }\n\n  date = toDate(date)\n\n  const month = date.getMonth()\n  const difference = (month < startOn ? 11 : 0) + month - startOn\n\n  date.setMonth(date.getMonth() - difference)\n  date.setDate(1)\n  date.setHours(0, 0, 0, 0)\n\n  return date\n}\n\n/**\n * 比较两个日期相差的毫秒\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的毫秒数\n */\nexport function differenceMilliseconds(left: Dateable, right: Dateable) {\n  left = toDate(left)\n  right = toDate(right)\n\n  return right.getTime() - left.getTime()\n}\n\n/**\n * 比较两个日期相差的秒\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的秒数\n */\nexport function differenceSeconds(left: Dateable, right: Dateable) {\n  const diff = differenceMilliseconds(left, right) / SECOND_ON_MILLS\n\n  return diff > 0 ? Math.floor(diff) : Math.ceil(diff)\n}\n\n/**\n * 比较两个日期相差的分钟\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的分钟数\n */\nexport function differenceMinutes(left: Dateable, right: Dateable) {\n  const diff = differenceMilliseconds(left, right) / MINUTE_ON_MILLS\n\n  return diff > 0 ? Math.floor(diff) : Math.ceil(diff)\n}\n\n/**\n * 比较两个日期相差的小时\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的小时数\n */\nexport function differenceHours(left: Dateable, right: Dateable) {\n  const diff = differenceMilliseconds(left, right) / HOUR_ON_MILLS\n\n  return diff > 0 ? Math.floor(diff) : Math.ceil(diff)\n}\n\n/**\n * 比较两个日期相差的天数\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的天数\n */\nexport function differenceDays(left: Dateable, right: Dateable) {\n  left = startOfDay(left)\n  right = startOfDay(right)\n\n  return (right.getTime() - left.getTime()) / DAY_ON_MILLS\n}\n\n/**\n * 比较两个日期相差的周\n *\n * @param left 原始日期\n * @param right 原始日期\n * @param weekStartOn 设定周的第一天，默认为周日\n *\n * @returns 相差的周数\n */\nexport function differenceWeeks(left: Dateable, right: Dateable, weekStartOn = 0) {\n  left = startOfWeek(left, weekStartOn)\n  right = startOfWeek(right, weekStartOn)\n\n  return (right.getTime() - left.getTime()) / WEEK_ON_MILLS\n}\n\n/**\n * 比较两个日期相差的月\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的月份\n */\nexport function differenceMonths(left: Dateable, right: Dateable) {\n  left = toDate(left)\n  right = toDate(right)\n\n  const yearDiff = right.getFullYear() - left.getFullYear()\n  const monthDiff = right.getMonth() - left.getMonth()\n\n  return yearDiff * 12 + monthDiff\n}\n\n/**\n * 比较两个日期相差的季度\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的季度\n */\nexport function differenceQuarters(left: Dateable, right: Dateable) {\n  left = toDate(left)\n  right = toDate(right)\n\n  const yearDiff = right.getFullYear() - left.getFullYear()\n  const quarterDiff = getQuarter(right) - getQuarter(left)\n\n  return yearDiff * 4 + quarterDiff\n}\n\n/**\n * 比较两个日期相差的年份\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的年份\n */\nexport function differenceYears(left: Dateable, right: Dateable) {\n  left = toDate(left)\n  right = toDate(right)\n\n  return right.getFullYear() - left.getFullYear()\n}\n\n/**\n * 升序比较两个日期大小，用于给数组的 sort 方法使用\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 比较后的结果，`-1` 则左侧小，`1` 则右侧小，`0` 则相等\n */\nexport function compareAsc(left: Dateable, right: Dateable) {\n  left = toDate(left)\n  right = toDate(right)\n\n  const diff = left.getTime() - right.getTime()\n\n  return diff < 0 ? -1 : diff > 0 ? 1 : diff\n}\n\n/**\n * 降序比较两个日期大小，用于给数组的 sort 方法使用\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 比较后的结果，`1` 则左侧小，`-1` 则右侧小，`0` 则相等\n */\nexport function compareDesc(left: Dateable, right: Dateable) {\n  return -compareAsc(left, right)\n}\n\n/**\n * 比较两个日期相差的完整秒\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的完整秒数\n */\nexport function differenceFullSeconds(left: Dateable, right: Dateable) {\n  left = startOfSecond(left)\n  right = startOfSecond(right)\n\n  return differenceSeconds(left, right)\n}\n\n/**\n * 比较两个日期相差的完整分钟\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的完整分钟数\n */\nexport function differenceFullMinutes(left: Dateable, right: Dateable) {\n  left = startOfMinute(left)\n  right = startOfMinute(right)\n\n  return differenceMinutes(left, right)\n}\n\n/**\n * 比较两个日期相差的完整小时\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的完整小时数\n */\nexport function differenceFullHours(left: Dateable, right: Dateable) {\n  left = startOfHour(left)\n  right = startOfHour(right)\n\n  return differenceHours(left, right)\n}\n\n/**\n * 比较两个日期相差的完整天\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的完整天数\n */\nexport function differenceFullDays(left: Dateable, right: Dateable) {\n  const sign = compareDesc(left, right)\n  const difference = Math.abs(differenceDays(left, right))\n\n  left = toDate(left)\n  left.setDate(left.getDate() + sign * difference)\n\n  const isLastNotFull = compareDesc(left, right) === -sign\n\n  return sign * (difference - (isLastNotFull ? 1 : 0))\n}\n\n/**\n * 比较两个日期相差的完整周\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的完整周数\n */\nexport function differenceFullWeeks(left: Dateable, right: Dateable) {\n  const diff = differenceFullDays(left, right) / WEEK_ON_DAYS\n\n  return diff > 0 ? Math.floor(diff) : Math.ceil(diff)\n}\n\n/**\n * 比较两个日期相差的完整月\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的完整月份\n */\nexport function differenceFullMonths(left: Dateable, right: Dateable) {\n  const sign = compareDesc(left, right)\n  const difference = Math.abs(differenceMonths(left, right))\n\n  left = toDate(left)\n  left.setMonth(left.getMonth() + sign * difference)\n\n  const isLastNotFull = compareDesc(left, right) === -sign\n\n  return sign * (difference - (isLastNotFull ? 1 : 0))\n}\n\n/**\n * 比较两个日期相差的完整季度\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的完整季度\n */\nexport function differenceFullQuarters(left: Dateable, right: Dateable) {\n  const diff = differenceFullMonths(left, right) / 3\n\n  return diff > 0 ? Math.floor(diff) : Math.ceil(diff)\n}\n\n/**\n * 比较两个日期相差的完整年份\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的完整年份\n */\nexport function differenceFullYears(left: Dateable, right: Dateable) {\n  const sign = compareDesc(left, right)\n  const difference = Math.abs(differenceYears(left, right))\n\n  left = toDate(left)\n  left.setFullYear(left.getFullYear() + sign * difference)\n\n  const isLastNotFull = compareDesc(left, right) === -sign\n\n  return sign * (difference - (isLastNotFull ? 1 : 0))\n}\n","import { getType, noop } from './common'\n\nexport interface DeepCloneOptions {\n  /**\n   * 一个自定义的克隆对象方法，用于处理方法内置以外的对象克隆，如 Class 的实例\n   *\n   * @param type 对象的类型，注意格式为大驼峰\n   * @param obj 原始对象\n   *\n   * @returns 克隆后对象\n   */\n  cloneObject?: (type: string, obj: unknown) => any\n}\n\n/**\n * 深度拷贝对象或数组\n *\n * @param obj 需要拷贝的对象或数组\n *\n * @returns 克隆后的对象\n */\nexport function deepClone<T>(obj: T, options: DeepCloneOptions = {}): T {\n  if (obj == null || typeof obj !== 'object') {\n    return obj\n  }\n\n  const { cloneObject = noop } = options\n  const temp = Object.create(null) as any\n\n  // 循环数组栈\n  const loopList: Array<{\n    parent: any,\n    prop: any,\n    data: any\n  }> = [\n    {\n      parent: temp,\n      prop: 'root',\n      data: obj,\n    },\n  ]\n\n  const referenceMap = new WeakMap<any, any>()\n  const setProps: Array<{ parent: any, prop: any }> = []\n  const mapProps: Array<{ parent: any, prop: any }> = []\n\n  while (loopList.length) {\n    // 先入后出，深度优先\n    const { parent, prop, data } = loopList.pop()!\n\n    if (!parent) continue\n\n    const type = getType(data)\n\n    if (type === 'Date') {\n      parent[prop] = new Date(data as Date)\n      continue\n    }\n\n    if (type !== 'Array') {\n      const result = cloneObject(type, data)\n\n      if (result != null) {\n        parent[prop] = result\n        continue\n      }\n    }\n\n    // 初始化克隆对象\n    const cloned: any = (parent[prop] =\n      type === 'Array' || type === 'Set' || type === 'Map' ? [] : Object.create(null))\n\n    if (type === 'Set' || type === 'Map') {\n      let i = 0\n\n      if (type === 'Set') {\n        for (const item of data) {\n          if (referenceMap.has(item)) {\n            cloned[i] = referenceMap.get(item)!\n          } else if (item !== null && typeof item === 'object') {\n            loopList.push({\n              parent: cloned,\n              prop: i,\n              data: item,\n            })\n          } else {\n            cloned[i] = item\n          }\n\n          ++i\n        }\n\n        setProps.push({ parent, prop })\n      } else {\n        for (const entry of data) {\n          const clonedEntry = []\n          i = 0\n\n          for (const item of entry) {\n            if (referenceMap.has(item)) {\n              clonedEntry[i] = referenceMap.get(item)!\n            } else if (item !== null && typeof item === 'object') {\n              loopList.push({\n                parent: clonedEntry,\n                prop: i,\n                data: item,\n              })\n            } else {\n              clonedEntry[i] = item\n            }\n\n            ++i\n          }\n\n          cloned.push(clonedEntry)\n        }\n\n        mapProps.push({ parent, prop })\n      }\n    } else {\n      for (const key of Object.keys(data)) {\n        const item = data[key]\n\n        // 处理循环引用\n        if (referenceMap.has(item)) {\n          cloned[key] = referenceMap.get(item)!\n        } else if (item !== null && typeof item === 'object') {\n          loopList.push({\n            parent: cloned,\n            prop: key,\n            data: item,\n          })\n        } else {\n          cloned[key] = item\n        }\n      }\n    }\n\n    referenceMap.set(data, cloned)\n  }\n\n  for (const { parent, prop } of setProps) {\n    parent[prop] = new Set(parent[prop])\n  }\n\n  for (const { parent, prop } of mapProps) {\n    parent[prop] = new Map(parent[prop])\n  }\n\n  return temp.root\n}\n","const defaultMessage = 'This object was destroyed, do not use it anywhere'\nconst returnTrue = () => true\n\n/**\n * 将一个对象销毁，销毁后的对象所有方法不可用，属性值均为 `null`\n *\n * @param object 要销毁的对象\n * @param message 销毁后，调用方法时的错误信息\n */\nexport function destroyObject(object: any, message = defaultMessage) {\n  const throwDestroyed = () => {\n    throw new Error(message)\n  }\n\n  Object.keys(object).forEach(name => {\n    if (typeof object[name] === 'function') {\n      object[name] = throwDestroyed.bind(object)\n    } else {\n      object[name] = null\n    }\n  })\n\n  Object.getOwnPropertyNames(object.constructor.prototype).forEach(name => {\n    if (name !== 'constructor' && typeof object[name] === 'function') {\n      object[name] = throwDestroyed.bind(object)\n    }\n  })\n\n  object.isDestroyed = returnTrue\n}\n","import { isClient, isDefined } from './common'\n\n/**\n * 专用的类型，用于适配 Vexip UI 中 `transfer` 属性的处理\n */\nexport interface TransferNode extends Element {\n  __transferElement?: Element | null\n}\n\nexport interface EventPayload extends EventInit {\n  /**\n   * 事件的类型\n   */\n  type: string,\n  [prop: string]: any\n}\n\n/**\n * 当前是否可以使用触摸交互\n */\nexport const USE_TOUCH = isClient && ('ontouchstart' in window || getMaxTouchPoints() > 0)\n/**\n * 当前点击的类型，可以使用触摸交互时为 `pointerdown`，否则为 `click`\n */\nexport const CLICK_TYPE = USE_TOUCH ? 'pointerdown' : 'click'\n\nfunction getMaxTouchPoints() {\n  return typeof navigator !== 'undefined'\n    ? navigator.maxTouchPoints || ((navigator as any).msMaxTouchPoints as number) || 0\n    : 0\n}\n\n/**\n * 为指定的元素派发事件\n *\n * @param el 指定的元素\n * @param payload 事件的属性\n * @param Event 事件类\n *\n * @returns 事件是否派发成功\n */\nexport function dispatchEvent(el: Element, payload: EventPayload, Event = window.Event) {\n  const { type, bubbles = false, cancelable = false, ...data } = payload\n\n  if (!isDefined(type) || type === '') return false\n\n  let event\n\n  if (isDefined(Event)) {\n    event = new Event(type, { bubbles, cancelable })\n  } else {\n    event = document.createEvent('HTMLEvents')\n    event.initEvent(type, bubbles, cancelable)\n  }\n\n  Object.assign(event, data)\n\n  return el.dispatchEvent(event)\n}\n","import { isClient, isDefined } from './common'\nimport { isValidNumber, toNumber } from './number'\n\nimport type { TransferNode } from './dom-event'\n\nconst TABABLE_SELECTOR = [\n  'button',\n  '[href]:not(.disabled)',\n  'input',\n  'select',\n  'textarea',\n  '[tabindex]',\n  '[contenteditable]',\n]\n  .map(s => `${s}:not(:disabled):not([disabled])`)\n  .join(', ')\n\nfunction isElement(el?: Element | null): el is HTMLElement {\n  return !!el && el.nodeType === 1\n}\n\nfunction ensureElement(el?: Element | null) {\n  return isElement(el) ? el : document.body\n}\n\n/**\n * 检索匹配指定选择器的所有元素\n *\n * @param selector 选择器\n * @param root 根元素，不指定时为 `document.body`\n *\n * @returns 匹配的所有元素\n */\nexport function queryAll(selector: string, root?: Element | null) {\n  if (!isClient || !selector) return []\n\n  return Array.from(ensureElement(root).querySelectorAll(selector)) as HTMLElement[]\n}\n\n/**\n * 判断指定的元素是否聚焦或包含聚焦的元素\n *\n * @param el 需判断的元素\n *\n * @returns 是否聚焦或包含聚焦的元素\n */\nexport function isFocusIn(el?: Element | null) {\n  if (!isClient) return false\n\n  const activeEl = document.activeElement as HTMLElement\n\n  if (!isElement(el) || !activeEl) return false\n\n  return el === activeEl || contains(activeEl, el)\n}\n\n/**\n * 判断一个元素是否包含另一个元素\n *\n * @param el 被包含的元素（子元素）\n * @param parent 包含的元素（父元素）\n *\n * @returns 元素是否包含另一个元素\n */\nexport function contains(el?: Element | null, parent?: HTMLElement | null) {\n  if (!el || !parent) return false\n\n  const tel = (parent as TransferNode).__transferElement\n\n  return parent.contains(el) || (!!tel && (tel === el || tel.contains(el)))\n}\n\n/**\n * 判断指定的元素是否隐藏\n *\n * @param el 需判断的元素\n *\n * @returns 元素是否隐藏\n */\nexport function isHidden(el?: Element | null) {\n  if (!isClient || !isElement(el) || !el.parentNode || !contains(el, document.body)) {\n    return true\n  }\n\n  if (el.style.display === 'none') {\n    return true\n  }\n\n  const rect = el.getBoundingClientRect()\n\n  return !(rect && rect.width > 0 && rect.height > 0)\n}\n\n/**\n * 判断指定的元素是否可见\n *\n * @param el 需判断的元素\n *\n * @returns 元素是否可见\n */\nexport function isVisible(el?: Element | null) {\n  return !isHidden(el)\n}\n\n/**\n * 判断指定的元素是否被禁用\n *\n * @param el 需判断的元素\n *\n * @returns 元素是否被禁用\n */\nexport function isDisabled(el?: Element | null) {\n  return (\n    !isElement(el) ||\n    (el.hasAttribute('disabled') && el.getAttribute('disabled') !== 'false') ||\n    (el as HTMLInputElement).disabled\n  )\n}\n\n/**\n * 检索可以被切换焦点（Tab）的元素\n *\n * @param root 根元素，不指定时为 `document.body`\n * @param includeDisabled 是否包含被禁用的元素\n *\n * @returns 可以被切换焦点的元素\n */\nexport function queryTabables(root?: HTMLElement, includeDisabled = false) {\n  const isDis = includeDisabled ? () => false : isDisabled\n\n  return queryAll(TABABLE_SELECTOR, root).filter(\n    el => isVisible(el) && el.tabIndex > -1 && !isDis(el),\n  )\n}\n\n/**\n * 获取元素横向的内边距像素值\n *\n * @param el 指定的元素\n *\n * @returns 元素横向的内边距像素值\n */\nexport function getXPadding(el: HTMLElement | null) {\n  if (!isClient || !el) return 0\n\n  const computedStyle = getComputedStyle(el)\n  const padding = parseFloat(computedStyle.paddingLeft) + parseFloat(computedStyle.paddingRight)\n\n  return padding || 0\n}\n\n/**\n * 获取元素纵向的内边距像素值\n *\n * @param el 指定的元素\n *\n * @returns 元素纵向的内边距像素值\n */\nexport function getYPadding(el: HTMLElement | null) {\n  if (!isClient || !el) return 0\n\n  const computedStyle = getComputedStyle(el)\n  const padding = parseFloat(computedStyle.paddingTop) + parseFloat(computedStyle.paddingBottom)\n\n  return padding || 0\n}\n\n/**\n * 获取元素横向的外边距像素值\n *\n * @param el 指定的元素\n *\n * @returns 元素横向的外边距像素值\n */\nexport function getXMargin(el: HTMLElement | null) {\n  if (!isClient || !el) return 0\n\n  const computedStyle = getComputedStyle(el)\n  const margin = parseFloat(computedStyle.marginLeft) + parseFloat(computedStyle.marginRight)\n\n  return margin || 0\n}\n\n/**\n * 获取元素纵向的外边距像素值\n *\n * @param el 指定的元素\n *\n * @returns 元素纵向的外边距像素值\n */\nexport function getYMargin(el: HTMLElement | null) {\n  if (!isClient || !el) return 0\n\n  const computedStyle = getComputedStyle(el)\n  const margin = parseFloat(computedStyle.marginTop) + parseFloat(computedStyle.marginBottom)\n\n  return margin || 0\n}\n\n/**\n * 获取元素横向的边框像素值\n *\n * @param el 指定的元素\n *\n * @returns 元素横向的边框像素值\n */\nexport function getXBorder(el: HTMLElement | null) {\n  if (!isClient || !el) return 0\n\n  const computedStyle = getComputedStyle(el)\n  const width =\n    parseFloat(computedStyle.borderLeftWidth) + parseFloat(computedStyle.borderRightWidth)\n\n  return width || 0\n}\n\n/**\n * 获取元素纵向的边框像素值\n *\n * @param el 指定的元素\n *\n * @returns 元素纵向的边框像素值\n */\nexport function getYBorder(el: HTMLElement | null) {\n  if (!isClient || !el) return 0\n\n  const computedStyle = getComputedStyle(el)\n  const width =\n    parseFloat(computedStyle.borderTopWidth) + parseFloat(computedStyle.borderBottomWidth)\n\n  return width || 0\n}\n\n/**\n * 获取元素的选中宽度\n *\n * @param el 指定的元素\n *\n * @returns 元素的选中宽度\n */\nexport function getRangeWidth(el: HTMLElement | null) {\n  if (!isClient || !el) return 0\n\n  const range = document.createRange()\n\n  range.setStart(el, 0)\n  range.setEnd(el, el.childNodes.length)\n\n  const rangeWidth = range.getBoundingClientRect().width\n  const xPadding = getXPadding(el)\n\n  return rangeWidth + xPadding\n}\n\n/**\n * 给定的值如果为合法数字，则将转换为像素值\n *\n * @param value 需要判断的值\n *\n * @returns 转换后的像素值\n */\nexport function toCssSize(value: number | string) {\n  return isValidNumber(value, true) ? `${toNumber(value)}px` : String(value).trim()\n}\n\n/**\n * 将指定的值转换为 HTML 属性值\n *\n * @param value 需要转换的值\n *\n * @returns 转换后的 HTML 属性值\n */\nexport function toAttrValue(value?: boolean | null): 'true' | undefined\nexport function toAttrValue(value?: string | number | null): string | undefined\nexport function toAttrValue(value?: string | number | boolean | null) {\n  return isDefined(value) && value !== false ? String(value) : undefined\n}\n","const escapeRE = /[\"'&<>]/\n\n/**\n * 将 html 内容的敏感字符进行转换\n *\n * @param string html 内容\n *\n * @returns 转换后的 html 内容\n */\nexport function escapeHtml(string: unknown) {\n  const str = '' + string\n  const match = escapeRE.exec(str)\n\n  if (!match) {\n    return str\n  }\n\n  let html = ''\n  let escaped: string\n  let index: number\n  let lastIndex = 0\n\n  for (index = match.index; index < str.length; index++) {\n    switch (str.charCodeAt(index)) {\n      case 34: // \"\n        escaped = '&quot;'\n        break\n      case 38: // &\n        escaped = '&amp;'\n        break\n      case 39: // '\n        escaped = '&#39;'\n        break\n      case 60: // <\n        escaped = '&lt;'\n        break\n      case 62: // >\n        escaped = '&gt;'\n        break\n      default:\n        continue\n    }\n\n    if (lastIndex !== index) {\n      html += str.substring(lastIndex, index)\n    }\n\n    lastIndex = index + 1\n    html += escaped\n  }\n\n  return lastIndex !== index ? html + str.substring(lastIndex, index) : html\n}\n","export type EventType = number | string | symbol\nexport type EventHandler = (...payload: any[]) => void\nexport type EventHandlerSet = Set<EventHandler>\nexport type EventHandlerMap = Map<EventType, EventHandlerSet>\n\nexport interface EventEmitter {\n  /**\n   * 为指定的事件添加回调方法\n   *\n   * @param type 事件类型\n   * @param handler 回调方法\n   */\n  on: (type: EventType, handler: EventHandler) => void,\n  /**\n   * 为指定的事件移除回调方法\n   *\n   * @param type 事件类型\n   * @param handler 回调方法\n   */\n  off: (type: EventType, handler: EventHandler) => void,\n  /**\n   * 为指定的事件清除所有回调方法\n   *\n   * @param type 事件类型\n   */\n  clear: (type: EventType) => void,\n  /**\n   * 清除所有事件的所有回调方法\n   */\n  clearAll: () => void,\n  /**\n   * 派发特定的事件\n   *\n   * @param type 事件类型\n   * @param payload 传入事件回调方法的参数\n   */\n  emit: (type: EventType, ...payload: any[]) => void\n}\n\n/**\n * 创建一个自定义的事件发射器\n *\n * @returns 事件发射器\n */\nexport function createEventEmitter() {\n  const handlerMap: EventHandlerMap = new Map()\n\n  return {\n    on(type, handler) {\n      const handlers = handlerMap.get(type)\n      const added = handlers?.add(handler)\n\n      if (!added) {\n        handlerMap.set(type, new Set([handler]))\n      }\n    },\n    off(type, handler) {\n      const handlers = handlerMap.get(type)\n\n      if (handlers) {\n        handlers.delete(handler)\n      }\n    },\n    clear(type) {\n      const handlers = handlerMap.get(type)\n\n      if (handlers) {\n        handlers.clear()\n      }\n    },\n    clearAll() {\n      handlerMap.clear()\n    },\n    emit(type, ...payload) {\n      const handlers = handlerMap.get(type)\n\n      if (handlers) {\n        handlers.forEach(handler => {\n          handler(...payload)\n        })\n      }\n    },\n  } as EventEmitter\n}\n","function logOnce(message: string, cache: Set<string>, logFn: (...data: any[]) => void) {\n  if (message && !cache.has(message)) {\n    logFn(message)\n    cache.add(message)\n  }\n}\n\nconst infoCache = new Set<string>()\n\n/**\n * 仅发出一次的提示消息\n *\n * @param message 消息内容\n * @param logFn 输出函数\n */\nexport function infoOnce(message: string, logFn = console.info) {\n  logOnce(message, infoCache, logFn)\n}\n\nconst warnCache = new Set<string>()\n\n/**\n * 仅发出一次的警告消息\n *\n * @param message 消息内容\n * @param logFn 输出函数\n */\nexport function warnOnce(message: string, logFn = console.warn) {\n  logOnce(message, warnCache, logFn)\n}\n\nconst errorCache = new Set<string>()\n\n/**\n * 仅发出一次的错误消息\n *\n * @param message 消息内容\n * @param logFn 输出函数\n */\nexport function errorOnce(message: string, logFn = console.warn) {\n  logOnce(message, errorCache, logFn)\n}\n","import { isClient, noop } from './common'\n\nexport const raf = isClient\n  ? requestAnimationFrame\n  : (cb: FrameRequestCallback) => {\n      setTimeout(cb, 16)\n    }\n\n/**\n * 将一个方法进行节流\n *\n * @param method 需要节流的方法，需自行绑定 this\n * @param interval 节流后的触发间隔，默认 16 ms (1 帧)\n *\n * @returns 节流后的方法\n */\nexport function throttle<T extends (...args: any[]) => any>(\n  method: T,\n  interval = 16,\n): (...args: Parameters<T>) => void {\n  if (typeof method !== 'function') {\n    return noop\n  }\n\n  const invoke = (...args: Parameters<T>) => {\n    method(...args)\n  }\n\n  if (interval <= 0) {\n    return debounceMinor(invoke)\n  }\n\n  let lastCall = 0\n  let timer: ReturnType<typeof setTimeout>\n\n  return function (...args: Parameters<T>) {\n    const current = Date.now()\n    const elapsed = current - lastCall\n\n    clearTimeout(timer)\n\n    if (elapsed >= interval) {\n      lastCall = current\n      invoke(...args)\n    } else {\n      timer = setTimeout(\n        () => {\n          lastCall = Date.now()\n          invoke(...args)\n        },\n        Math.max(0, interval - elapsed),\n      )\n    }\n  }\n}\n\n/**\n * 将一个方法进行防抖\n *\n * @param method 需要防抖的方法，需自行绑定 this\n * @param delay 防抖的限制时间，默认 100ms\n *\n * @returns 防抖后的方法\n */\nexport function debounce<T extends (...args: any[]) => any>(\n  method: T,\n  delay = 100,\n): (...args: Parameters<T>) => void {\n  if (typeof method !== 'function') {\n    return noop\n  }\n\n  const invoke = (...args: Parameters<T>) => {\n    method(...args)\n  }\n\n  if (delay <= 0) {\n    return debounceMinor(invoke)\n  }\n\n  let timer: ReturnType<typeof setTimeout>\n\n  return function (...args: Parameters<T>) {\n    clearTimeout(timer)\n\n    timer = setTimeout(() => {\n      invoke(...args)\n    }, delay)\n  }\n}\n\n/**\n * 对给定的方法进行微任务级别的防抖\n *\n * @param method 需要防抖的方法，需自行绑定 this\n *\n * @returns 防抖后的方法\n */\nexport function debounceMinor<T extends (...args: any[]) => any>(method: T) {\n  if (typeof method !== 'function') {\n    return method\n  }\n\n  let called = false\n  let lastArgs: Parameters<T>\n  let promise: Promise<Awaited<ReturnType<T>>>\n\n  return function (...args: Parameters<T>) {\n    lastArgs = args\n\n    if (!called) {\n      called = true\n      promise = Promise.resolve().then(() => {\n        called = false\n        promise = undefined!\n\n        return method(...lastArgs)\n      })\n    }\n\n    return promise\n  }\n}\n\n/**\n * 对给定的方法进行渲染帧级别的防抖\n *\n * @param method 需要防抖的方法，需自行绑定 this\n *\n * @returns 防抖后的方法\n */\nexport function debounceFrame<T extends (...args: any[]) => any>(method: T) {\n  if (typeof method !== 'function') {\n    return method\n  }\n\n  let called = false\n  let lastArgs: Parameters<T>\n  let promise: Promise<Awaited<ReturnType<T>>>\n\n  return function (...args: Parameters<T>) {\n    lastArgs = args\n\n    if (!called) {\n      called = true\n      promise = new Promise(resolve =>\n        raf(() => {\n          called = false\n          promise = undefined!\n\n          resolve(method(...lastArgs))\n        }),\n      )\n    }\n\n    return promise\n  }\n}\n\nconst tickCallbacks = new Set<(...args: any[]) => any>()\nconst tickArgsMap = new WeakMap<any, any[]>()\n\nfunction flushTickCallbacks() {\n  tickCallbacks.forEach(fn => {\n    fn(...tickArgsMap.get(fn)!)\n  })\n  tickCallbacks.clear()\n}\n\n/**\n * 在下一微任务，仅执行一次传入的方法\n *\n * @param method 需要执行的方法\n * @param args 方法的额外参数，在方法调用前多次传入将会覆盖之前的参数\n */\nexport function nextTickOnce<T extends (...args: any[]) => any>(method: T, ...args: any[]) {\n  if (typeof method !== 'function') {\n    return method\n  }\n\n  tickArgsMap.set(method, args)\n\n  if (tickCallbacks.has(method)) {\n    return\n  }\n\n  tickCallbacks.add(method)\n\n  if (tickCallbacks.size === 1) {\n    Promise.resolve().then(flushTickCallbacks)\n  }\n}\n\nconst frameCallbacks = new Set<(...args: any[]) => any>()\nconst frameArgsMap = new WeakMap<any, any[]>()\n\nfunction flushFrameCallbacks() {\n  frameCallbacks.forEach(fn => {\n    fn(...frameArgsMap.get(fn)!)\n  })\n  frameCallbacks.clear()\n}\n\n/**\n * 在下一渲染帧，仅执行一次传入的方法\n *\n * @param method 需要执行的方法\n * @param args 方法的额外参数，在方法调用前多次传入将会覆盖之前的参数\n */\nexport function nextFrameOnce<T extends (...args: any[]) => any>(method: T, ...args: any[]) {\n  if (typeof method !== 'function') {\n    return method\n  }\n\n  frameArgsMap.set(method, args)\n\n  if (frameCallbacks.has(method)) {\n    return\n  }\n\n  frameCallbacks.add(method)\n\n  if (frameCallbacks.size === 1) {\n    raf(flushFrameCallbacks)\n  }\n}\n\n/**\n * 按指定的并发数，并行地为系列源数据执行操作\n *\n * @param maxConcurrency 最大的并发数\n * @param source 源数据\n * @param iteratorFn 处理操作的异步函数\n *\n * @returns 等待所有任务执行完的 Promise 对象\n */\nexport async function runParallel<T>(\n  maxConcurrency: number,\n  source: T[],\n  iteratorFn: (item: T, source: T[]) => Promise<any>,\n) {\n  const ret: Array<Promise<any>> = []\n  const executing: Array<Promise<any>> = []\n\n  for (const item of source) {\n    const p = Promise.resolve().then(() => iteratorFn(item, source))\n\n    ret.push(p)\n\n    if (maxConcurrency <= source.length) {\n      const e: Promise<any> = p.then(() => executing.splice(executing.indexOf(e), 1))\n\n      executing.push(e)\n\n      if (executing.length >= maxConcurrency) {\n        await Promise.race(executing)\n      }\n    }\n  }\n\n  return Promise.all(ret)\n}\n","import { isClient } from './common'\n\nlet flexGapSupported: boolean | null = null\n\n/**\n * 判断当前的环境是否支持 CSS 样式：`gap`、`row-gap` 和 `column-gap`\n *\n * @returns 是否支持\n */\nexport function supportFlexGap() {\n  if (!isClient) {\n    return true\n  }\n\n  if (flexGapSupported === null) {\n    const flex = document.createElement('div')\n\n    flex.style.display = 'flex'\n    flex.style.flexDirection = 'column'\n    flex.style.rowGap = '1px'\n\n    flex.appendChild(document.createElement('div'))\n    flex.appendChild(document.createElement('div'))\n    document.body.appendChild(flex)\n\n    flexGapSupported = flex.scrollHeight === 1\n\n    document.body.removeChild(flex)\n  }\n\n  return flexGapSupported\n}\n\nlet imgLoadingSupported: boolean | null = null\n\n/**\n * 判断当前环境是否支持 `<img>` 标签的 `loading` 属性\n *\n * @returns 是否支持\n */\nexport function supportImgLoading() {\n  if (!isClient) {\n    return false\n  }\n\n  if (imgLoadingSupported === null) {\n    imgLoadingSupported = 'loading' in document.createElement('img')\n  }\n\n  return imgLoadingSupported\n}\n","import { isDefined, isFunction, isIterable, isObject, toTrue } from './common'\nimport { deepClone } from './deep-clone'\nimport { raf } from './performance'\n\n/**\n * 如果一个值不为数组，则将其转换为数组\n *\n * @param value 指定的值\n *\n * @returns 原始数组或转换后的数组\n */\nexport function ensureArray<T>(value: T | T[]) {\n  return Array.isArray(value) ? value : [value]\n}\n\n/**\n * 如果一个值为函数，则执行它并返回结果，否则返回其本身\n *\n * @param value 指定的值\n * @param args 若为函数时，传入的参数\n *\n * @returns 原始值或函数执行结果\n */\nexport function callIfFunc<T, P extends any[] = any[]>(value: T | ((...args: P) => T), ...args: P) {\n  return isFunction(value) ? value(...args) : value\n}\n\n/**\n * 将路径中的 `\\` 替换为 `/`\n *\n * @param path 指定的路径\n *\n * @returns 替换后的路径\n */\nexport function normalizePath(path: string) {\n  return path.replace(/[\\\\/]+/g, '/')\n}\n\n/**\n * 获取字符串的最后一个字符\n *\n * @param value 指定的字符串\n *\n * @returns 最后一个字符\n */\nexport function getLast(value: string): string | undefined\n/**\n * 获取数组的最后一个元素\n *\n * @param value 指定的数组\n *\n * @returns 最后一个元素\n */\nexport function getLast<T>(value: T[]): T | undefined\nexport function getLast(value: string | any[]) {\n  return value[value.length - 1]\n}\n\ntype RecordKey = string | number | symbol\n\nconst defaultAccessor = (v: unknown) => v\n\nexport function listToMap<T = any, K extends keyof T = keyof T>(\n  list: T[],\n  prop: K,\n  useMap?: false\n): Record<T[K] extends RecordKey ? T[K] : RecordKey, T>\nexport function listToMap<T = any, O = T, K extends keyof T = keyof T>(\n  list: T[],\n  prop: K,\n  accessor?: (item: T) => O,\n  useMap?: false\n): Record<T[K] extends RecordKey ? T[K] : RecordKey, O>\nexport function listToMap<T = any, K = RecordKey>(\n  list: T[],\n  prop: (item: T) => K,\n  useMap?: false\n): Record<K extends RecordKey ? K : RecordKey, T>\nexport function listToMap<T = any, O = T, K = RecordKey>(\n  list: T[],\n  prop: (item: T) => K,\n  accessor?: (item: T) => O,\n  useMap?: false\n): Record<K extends RecordKey ? K : RecordKey, O>\nexport function listToMap<T = any, K extends keyof T = keyof T>(\n  list: T[],\n  prop: K,\n  useMap?: true\n): Map<T[K], T>\nexport function listToMap<T = any, O = T, K extends keyof T = keyof T>(\n  list: T[],\n  prop: K,\n  accessor?: (item: T) => O,\n  useMap?: true\n): Map<T[K], O>\nexport function listToMap<T = any, K = any>(\n  list: T[],\n  prop: (item: T) => K,\n  useMap?: true\n): Map<K, T>\nexport function listToMap<T = any, O = T, K = any>(\n  list: T[],\n  prop: (item: T) => K,\n  accessor?: (item: T) => O,\n  useMap?: true\n): Map<K, O>\n/**\n * 根据数组元素中某个或多个属性的值转换为映射对象\n *\n * @param list 需要被转换的数组\n * @param prop 需要被转换的属性或提供一个读取方法\n * @param accessor 映射的值的读取方法，默认返回元素本身\n * @param useMap 是否使用 Map 对象储存结果\n *\n * @returns 转换后的映射对象\n */\nexport function listToMap<T = any, O = T>(\n  list: T[],\n  prop: keyof T | ((item: T) => any),\n  accessor?: boolean | ((item: T) => O),\n  useMap?: boolean,\n) {\n  let normalizeAccessor: (item: T) => O\n\n  if (typeof accessor !== 'function' && useMap === undefined) {\n    useMap = !!accessor\n    normalizeAccessor = defaultAccessor as any\n  } else {\n    normalizeAccessor = typeof accessor === 'function' ? accessor : (defaultAccessor as any)\n  }\n\n  const map = (useMap ? new Map<string, any>() : {}) as any\n\n  if (!isDefined(prop)) return map\n\n  const set = useMap\n    ? (key: any, value: O) => map.set(key, value)\n    : (key: any, value: O) => (map[key] = value)\n  const propAccessor = isFunction(prop) ? prop : (item: T) => item[prop]\n\n  list.forEach(item => {\n    if (!isDefined(item)) return\n\n    const key = propAccessor(item)\n\n    if (isDefined(key)) {\n      set(key, normalizeAccessor(item))\n    }\n  })\n\n  return map\n}\n\nexport {\n  /** @deprecated please use listToMap to replace it */\n  listToMap as transformListToMap,\n}\n\n/**\n * 移除数组中的某个元素\n *\n * @param array 需要被移除元素的数组\n * @param item 需要被移除的元素, 或一个查找方法，如果元素为函数时则需要做一层简单包装\n * @param isFn 标记数组的元素是否为函数\n *\n * @returns 被移除的元素\n */\nexport function removeArrayItem<T = any>(\n  array: T[],\n  item: T | ((item: T) => boolean),\n  isFn = false,\n): T | null {\n  let index = -1\n\n  if (isFn || typeof item !== 'function') {\n    index = array.findIndex(current => current === item)\n  } else {\n    index = array.findIndex(item as (item: T) => boolean)\n  }\n\n  if (~index) {\n    return array.splice(index, 1)[0]\n  }\n\n  return null\n}\n\n/**\n * 按照一定顺序的属性对数据进行分组\n *\n * @param list 需要分数的数据\n * @param props 需要按顺序分组的属性\n *\n * @returns 分组后的对象\n */\nexport function groupByProps<T = any>(\n  list: T[],\n  props: Array<string | ((item: T) => any)> | string | ((item: T) => any) = [],\n): Record<string, T[]> {\n  if (typeof props === 'string' || typeof props === 'function') {\n    props = [props]\n  }\n\n  const propCount = props.length\n  const zipData: Record<string, any> = {}\n\n  for (const item of list) {\n    let data\n\n    for (let i = 0; i < propCount; ++i) {\n      const isLast = i === propCount - 1\n      const prop = props[i]\n      const value = typeof prop === 'function' ? prop(item) : item[prop as keyof T]\n\n      if (!data) {\n        if (!zipData[value]) {\n          zipData[value] = isLast ? [] : {}\n        }\n\n        data = zipData[value]\n      } else {\n        if (!data[value]) {\n          data[value] = isLast ? [] : {}\n        }\n\n        data = data[value]\n      }\n    }\n\n    data.push(item)\n  }\n\n  return zipData\n}\n\nexport interface TreeOptions<T = string> {\n  keyField?: T,\n  childField?: T,\n  parentField?: T,\n  /** 若指定，`parent` 值等于 `rootId` 的节点被认为是顶级节点 */\n  rootId?: any\n}\n\n/**\n * 将一个展平的列表转换为树\n *\n * @param list 要转换的列表\n * @param options 转换的配置项\n *\n * @returns 转换后的树\n */\nexport function transformTree<T = any>(list: T[], options: TreeOptions<keyof T> = {}) {\n  const {\n    keyField = 'id' as keyof T,\n    childField = 'children' as keyof T,\n    parentField = 'parent' as keyof T,\n    rootId = null,\n  } = options\n\n  const hasRootId = isDefined(rootId) && rootId !== ''\n  const tree: T[] = []\n  const record = new Map<T[keyof T], T[]>()\n\n  for (let i = 0, len = list.length; i < len; ++i) {\n    const item = list[i]\n    const id = item[keyField]\n\n    if (hasRootId ? id === rootId : !isDefined(id)) {\n      continue\n    }\n\n    if (record.has(id)) {\n      ;(item as any)[childField] = record.get(id)!\n    } else {\n      ;(item as any)[childField] = []\n      record.set(id, (item as any)[childField])\n    }\n\n    if (item[parentField] && (!hasRootId || item[parentField] !== rootId)) {\n      const parentId = item[parentField]\n\n      if (!record.has(parentId)) {\n        record.set(parentId, [])\n      }\n\n      record.get(parentId)!.push(item)\n    } else {\n      tree.push(item)\n    }\n  }\n\n  return tree\n}\n\nexport { transformTree as buildTree }\n\n/**\n * 将一个树展平成列表\n *\n * @param tree 要展平的树\n * @param options 转换的配置项\n *\n * @returns 展平后的列表\n */\nexport function flatTree<T = any>(\n  tree: T[],\n  options: TreeOptions<keyof T> & {\n    /** 是否为深度优先遍历 */\n    depthFirst?: boolean,\n    /**\n     * 是否为无 ID 的节点插入 ID 值\n     *\n     * @default true\n     */\n    injectId?: boolean,\n    /** 构建节点的 ID 的方法 */\n    buildId?: (index: number) => any,\n    /** 过滤节点的方法 */\n    filter?: (item: T) => boolean,\n    /** 过滤的结果是否会影响其子级 */\n    cascaded?: boolean,\n    /** 是否强制为节点插入 ID 值 */\n    forceInject?: boolean\n  } = {},\n) {\n  const {\n    keyField = 'id' as keyof T,\n    childField = 'children' as keyof T,\n    parentField = 'parent' as keyof T,\n    rootId = null,\n    depthFirst = false,\n    injectId = true,\n    buildId = i => i,\n    filter = toTrue,\n    cascaded = false,\n    forceInject = false,\n  } = options\n\n  let idCount = 1\n\n  const hasRootId = isDefined(rootId) && rootId !== ''\n  const list: T[] = []\n  const loop = [...tree]\n\n  while (loop.length) {\n    const item = loop.shift()!\n\n    const childrenValue = item[childField]\n    const children: T[] = Array.isArray(childrenValue) && childrenValue.length ? childrenValue : []\n\n    if (injectId && (forceInject || !item[keyField])) {\n      item[keyField] = buildId(idCount++)\n    }\n\n    const id = item[keyField]\n\n    if (\n      injectId &&\n      parentField &&\n      (hasRootId ? item[parentField] === rootId : !item[parentField])\n    ) {\n      ;(item as any)[parentField] = rootId\n    }\n\n    const filterResult = filter(item)\n\n    if (filterResult) list.push(item)\n\n    if (filterResult || !cascaded) {\n      for (let i = 0, len = children.length; i < len; ++i) {\n        const child = children[i]\n\n        if (injectId && parentField) {\n          child[parentField] = id\n        }\n\n        !depthFirst && loop.push(child)\n      }\n\n      if (depthFirst) {\n        loop.unshift(...children)\n      }\n    }\n  }\n\n  return list\n}\n\n/**\n * 遍历树并为每个节点执行回调方法\n *\n * @param tree 要遍历的树\n * @param cb 回调函数\n * @param options 遍历的配置项\n */\nexport function walkTree<T = any>(\n  tree: T[],\n  cb: (item: T, depth: number, parent: T | null) => void,\n  options: {\n    /** 是否为深度优先遍历 */\n    depthFirst?: boolean,\n    childField?: keyof T\n  } = {},\n) {\n  const { childField = 'children' as keyof T, depthFirst = false } = options\n  const loop = [...tree.map(item => ({ item, depth: 0, parent: null as T | null }))]\n\n  while (loop.length) {\n    const { item, depth, parent } = loop.shift()!\n    const children = item[childField] as T[]\n\n    cb(item, depth, parent)\n\n    if (isIterable(children)) {\n      loop[depthFirst ? 'unshift' : 'push'](\n        ...Array.from(children).map(child => ({ item: child, depth: depth + 1, parent: item })),\n      )\n    }\n  }\n}\n\n/**\n * 遍历树并为每个节点执行回调方法，并用其返回值构建一颗新的树\n *\n * @param tree 要遍历的树\n * @param cb 回调函数\n * @param options 遍历的配置项\n *\n * @returns 构建后新的树\n */\nexport function mapTree<T = any, R = any>(\n  tree: T[],\n  cb: (item: T, depth: number, parent: T | null) => R,\n  options: {\n    /** 是否为深度优先遍历 */\n    depthFirst?: boolean,\n    childField?: keyof T,\n    /** 是否强制重置 `children` 字段 */\n    clearChildren?: boolean\n  } = {},\n) {\n  const { childField = 'children' as keyof T, depthFirst = false, clearChildren = true } = options\n  const result: R[] = []\n  const loop = [...tree.map(item => ({ item, depth: 0, parent: null as T | null, result }))]\n\n  while (loop.length) {\n    const { item, depth, parent, result } = loop.shift()!\n    const children = item[childField] as T[]\n    const newItem = cb(item, depth, parent) ?? ({} as any)\n\n    if (clearChildren) {\n      newItem[childField] = []\n    }\n\n    result.push(newItem)\n\n    if (isIterable(children)) {\n      const items = Array.from(children)\n\n      if (items.length) {\n        newItem[childField] = []\n        loop[depthFirst ? 'unshift' : 'push'](\n          ...Array.from(children).map(child => ({\n            item: child,\n            depth: depth + 1,\n            parent: item,\n            result: newItem[childField],\n          })),\n        )\n      }\n    }\n  }\n\n  return result\n}\n\n/**\n * 遍历树并为每个节点执行过滤方法，并用符合条件的节点构建一棵新的树\n *\n * @param tree 要遍历的树\n * @param cb 过滤的方法\n * @param options 遍历的配置项\n *\n * @returns 过滤后新的树\n */\nexport function filterTree<T = any>(\n  tree: T[],\n  cb: (item: T, depth: number, parent: T | null) => boolean,\n  options: {\n    /** 判断一个节点是否为叶子节点 */\n    isLeaf?: (item: T) => boolean,\n    /** 是否只对叶子节点进行过滤 */\n    leafOnly?: boolean,\n    childField?: keyof T\n  } = {},\n) {\n  const {\n    childField = 'children' as keyof T,\n    leafOnly = false,\n    isLeaf = item => !isIterable(item[childField]),\n  } = options\n\n  const filter = (data: T[], depth: number, parent: T | null): T[] => {\n    return data\n      .map(item => ({ ...item }))\n      .filter(item => {\n        const children = item[childField] as T[]\n        const leaf = isLeaf(item)\n        const items = isIterable(children) && Array.from(children)\n\n        if (leafOnly && !leaf) {\n          if (items && items.length) {\n            const matched = filter(items, depth + 1, item)\n            item[childField] = matched as any\n\n            return !!matched.length\n          }\n\n          return false\n        }\n\n        const result = cb(item, depth, parent)\n\n        if (leaf) return result\n        if (!leafOnly && result) return true\n\n        if (items && items.length) {\n          const matched = filter(items, depth + 1, item)\n          item[childField] = matched as any\n\n          return !!matched.length\n        }\n\n        return result\n      })\n  }\n\n  return filter(tree, 0, null)\n}\n\nexport interface SortOptions<T = string> {\n  /** 属性名 */\n  key: T,\n  /** 排序方法 */\n  method?: (prev: any, next: any) => number,\n  /** 读取方法 */\n  accessor?: (...args: any[]) => any,\n  /** 升降序 */\n  type?: 'asc' | 'desc',\n  /** 传入读取器的额外参数 */\n  params?: any[]\n}\n\nconst defaultSortMethod = (prev: any, next: any) => {\n  if (Number.isNaN(Number(prev) - Number(next))) {\n    return String(prev).localeCompare(next)\n  }\n\n  return prev - next\n}\n\n/**\n * 根据依赖的属性对数组逐层排序\n *\n * @param list 需要排序的数组\n * @param props 排序依赖的属性\n *\n * @returns 排序后的数组\n */\nexport function sortByProps<T = any>(\n  list: T[],\n  props: keyof T | SortOptions<keyof T> | (keyof T | SortOptions<keyof T>)[],\n) {\n  if (\n    !list.sort ||\n    (isObject<SortOptions>(props) && !props.key) ||\n    !(props as string | SortOptions[]).length\n  ) {\n    return list\n  }\n\n  const sortedList = Array.from(list)\n\n  if (!Array.isArray(props)) {\n    props = [props]\n  }\n\n  const formattedProps = props\n    .map(\n      value =>\n        (typeof value === 'string'\n          ? {\n              key: value,\n              method: defaultSortMethod,\n              type: 'asc',\n            }\n          : value) as SortOptions<keyof T>,\n    )\n    .map(value => {\n      if (typeof value.accessor !== 'function') {\n        value.accessor = (data: T) => data[value.key]\n      }\n\n      if (typeof value.method !== 'function') {\n        value.method = defaultSortMethod\n      }\n\n      value.params = Array.isArray(value.params) ? value.params : []\n\n      return value as Required<SortOptions>\n    })\n\n  sortedList.sort((prev, next) => {\n    let lastResult = 0\n\n    for (const prop of formattedProps) {\n      const { method, type, accessor, params } = prop\n      const desc = type === 'desc'\n      const result = method(accessor(prev, ...params), accessor(next, ...params))\n\n      lastResult = desc ? -result : result\n      // 若不为0则无需进行下一层排序\n      if (lastResult) break\n    }\n\n    return lastResult\n  })\n\n  return sortedList\n}\n\n/**\n * 将两个对象进行深度的动态合并\n *\n * @param sourceObj 用于接收合并的源对象\n * @param targetObj 被合并的对象，当属性名相同但值类型不同的情况，此对象的权重更高\n * @param isNewObj 标记合并至一个全新的对象（深度的）\n *\n * @returns 合并后的对象\n */\nexport function mergeObjects<T extends Record<string, any>, U extends Record<string, any>>(\n  sourceObj: T,\n  targetObj: U,\n  isNewObj = true,\n) {\n  sourceObj = isNewObj ? deepClone(sourceObj) : sourceObj\n\n  const loop: Array<{\n    source: Record<string, any>,\n    target: Record<string, any>\n  }> = [\n    {\n      source: sourceObj,\n      target: targetObj,\n    },\n  ]\n\n  while (loop.length) {\n    const { source, target } = loop.pop()!\n\n    Object.keys(target).forEach(key => {\n      if (isObject(target[key])) {\n        if (!isObject(source[key])) {\n          source[key] = Object.create(null)\n        }\n\n        loop.push({\n          source: source[key],\n          target: target[key],\n        })\n      } else if (Array.isArray(target[key])) {\n        if (!Array.isArray(source[key])) {\n          source[key] = []\n        }\n\n        loop.push({\n          source: source[key],\n          target: target[key],\n        })\n      } else {\n        source[key] = target[key]\n      }\n    })\n  }\n\n  return sourceObj as T & U\n}\n\n/**\n * 将一个任务队列按每帧一次依次指定，返回一个触发取消的方法\n *\n * @param queue 任务队列\n *\n * @returns 终止队列执行的方法\n */\nexport function runQueueFrame(queue: Array<() => void>) {\n  queue = Array.from(queue)\n\n  let cancelled = false\n\n  const run = () => {\n    if (cancelled) return\n\n    queue.shift()?.()\n    queue.length && raf(run)\n  }\n\n  run()\n\n  return () => (cancelled = true)\n}\n","/**\n * 将给定的常量字符串类型拓展为不区分大小写的任意组合\n */\nexport type AnyCase<S> = string extends S\n  ? string\n  : S extends `${infer F1}${infer F2}${infer R}`\n    ? `${Uppercase<F1> | Lowercase<F1>}${Uppercase<F2> | Lowercase<F2>}${AnyCase<R>}`\n    : S extends `${infer F}${infer R}`\n      ? `${Uppercase<F> | Lowercase<F>}${AnyCase<R>}`\n      : ''\n\nfunction allCapital(value: string) {\n  const matched = value.match(/[A-Z]+/)\n\n  return matched && matched[0] === value\n}\n\n// const kebabRE = /\\B([A-Z])/g\nconst kebabRE = /\\B([A-Z])(?=[^A-Z_-])/g\n\n/**\n * 将字面值转换为短横线连接\n *\n * @param value 需要转换的字面值\n *\n * @returns 转换后的短横线连接字面值\n *\n * @example\n * ```ts\n * toKebabCase('AaBbCc') // aa-bb-cc\n * toKebabCase('AABb') // aa-bb\n * toKebabCase('AAA') // aaa\n * toKebabCase('AaBb CcDd') // aa-bb cc-dd\n * ```\n */\nexport function toKebabCase(value: string) {\n  // if (allCapital(value)) {\n  //   return value.toLocaleLowerCase()\n  // }\n\n  return value.replace(kebabRE, '-$1').toLowerCase()\n}\n\n/**\n * 将给定的常量字符串类型拓展为大驼峰\n */\nexport type CapitalCase<T extends string> = T extends `${infer First} ${infer Rest}`\n  ? CapitalCase<`${First}-${Rest}`>\n  : T extends `${infer First}-${infer Rest}`\n    ? `${Capitalize<First>}${CapitalCase<Rest>}`\n    : Capitalize<T>\n\n/**\n * 将字面值转换为大驼峰\n *\n * @param value 需要转换的字面值\n *\n * @returns 转换后的大驼峰字面值\n */\nexport function toCapitalCase<T extends string>(value: T) {\n  value = value.trim().replace(/\\s+/g, '-') as T\n  value = value.replace(/-+(\\w)/g, (_, char) => (char ? char.toUpperCase() : '')) as T\n\n  return (value.charAt(0).toLocaleUpperCase() + value.slice(1)).replace(\n    /[^\\w]/g,\n    '',\n  ) as CapitalCase<T>\n}\n\n/**\n *  将字面值转换为小驼峰\n *\n * @param value 需要转换的字面值\n *\n * @returns 转换后的小驼峰字面值\n */\nexport function toCamelCase(value: string) {\n  const capitalName = toCapitalCase(value)\n\n  if (allCapital(capitalName)) {\n    return capitalName.toLocaleLowerCase()\n  }\n\n  return capitalName.charAt(0).toLowerCase() + capitalName.slice(1)\n}\n"],"names":["isClient","_a","isIOS","toString","hasOwnProperty","is","value","type","has","key","isDefined","isNull","isNumber","isNaN","isString","isBoolean","isTrue","isFalse","isSymbol","isBigInt","isArray","isObject","isPromise","isFunction","isSet","isMap","isDate","isRegExp","isEmpty","isElement","ssr","isIterable","noop","toTrue","toFalse","range","size","start","step","array","i","getType","randomString","length","chars","maxPos","string","decide","conditions","options","condition","callback","writeClipboard","text","isSuccess","textarea","prevFocused","selection","originalRange","INTEGER_REG","NUMBER_REG","NUMBER_UNIT","COLOR_REG_3","COLOR_REG_4","RGB_REG","RGBA_REG","HSL_REG","HSLA_REG","HSV_REG","HSVA_REG","HEX_REG_3","HEX_REG_4","HEX_REG_6","HEX_REG_8","NAMED_COLORS","COLOR_NAMES","isColor","parseStringColor","color","toRgbString","named","match","g","b","normalizeRgb","normalizeAlpha","h","s","l","normalizeHsl","toHslString","v","normalizeHsv","toHsvString","convertHexToDecimal","parseColor","a","rgb","parseColorToRgba","hsl","rgbToHsl","hsv","rgbToHsv","hex","rgbToHex","hex8","rgbaToHex","rgbToGrayScale","originColor","hslToRgb","hsvToRgb","boundRange","isPercentage","parsePercentage","r","q","p","hueToRgb","max","min","d","hslToHsv","hsvToHsl","f","t","mod","allow3Char","repairDigits","isRepetitive","allow4Char","convertDecimalToHex","mixColor","color1","color2","weight","rgba1","rgba2","originalWeight","normalizedWeight","alphaDistance","weight1","weight2","adjustAlpha","alpha","rgba","randomColor","withAlpha","randomPreferColor","prefer","randomHardColor","randomSoftColor","toGrayScale","str","number","percent","globalCount","getGlobalCount","setGlobalCount","count","createCounter","newCount","lowBit","num","createBITree","tree","add","index","delta","sum","get","boundIndex","target","left","right","middle","total","numberRE","isValidNumber","strict","toNumber","padStartZeros","doubleDigits","decimalLength","eSplit","len","digitLength","segmentNumber","segment","separator","integer","decimal","formatRegExp","toFixed","snum","pointPos","nums","targetPos","multipleFixed","multiple","round","criticalValue","ceilValue","leaveNumber","divideBy","limit","remainders","ordinalSuffixes","ordinalNumber","suffix","SIZE_UNIT_WITH_AUTO","formatByteSize","byte","unit","joinUtil","precision","upperUnit","power","targetSize","random","toPrecision","multipleInt","dLength","createOperation","operation","numbers","result","times","number1","number2","int1","int2","base","plus","minus","divide","SECOND_ON_MILLS","SECOND_ON_MILLISECONDS","MINUTE_ON_SECONDS","MINUTE_ON_MILLS","MINUTE_ON_MILLISECONDS","HOUR_ON_MINUTES","HOUR_ON_SECONDS","HOUR_ON_MILLS","HOUR_ON_MILLISECONDS","DAY_ON_HOURS","DAY_ON_MINUTES","DAY_ON_SECONDS","DAY_ON_MILLS","DAY_ON_MILLISECONDS","WEEK_ON_DAYS","WEEK_ON_HOURS","WEEK_ON_MINUTES","WEEK_ON_SECONDS","WEEK_ON_MILLS","WEEK_ON_MILLISECONDS","QUARTER_ON_MONTHS","YEAR_ON_QUARTERS","YEAR_ON_MONTHS","formatters","date","year","month","day","hour","minute","second","quarter","quotationRegExp","toDate","any","format","pattern","matches","substring","firstCharacter","formatter","getTime","getQuarter","weeksForChinese","getChineseWeek","addMilliseconds","amount","addSeconds","addMinutes","addHours","addHalfDays","addDays","addWeeks","addMonths","addQuarters","addYears","rangeDate","dateRange","rangeMonth","getLastSunday","startOfSecond","startOfMinute","startOfHour","startOfDay","endOfDay","startOfWeek","startOn","difference","isLeapYear","getLastDayOfMonth","lastDay","startOfMonth","startOfQuarter","startOfYear","differenceMilliseconds","differenceSeconds","diff","differenceMinutes","differenceHours","differenceDays","differenceWeeks","weekStartOn","differenceMonths","yearDiff","monthDiff","differenceQuarters","quarterDiff","differenceYears","compareAsc","compareDesc","differenceFullSeconds","differenceFullMinutes","differenceFullHours","differenceFullDays","sign","isLastNotFull","differenceFullWeeks","differenceFullMonths","differenceFullQuarters","differenceFullYears","deepClone","obj","cloneObject","temp","loopList","referenceMap","setProps","mapProps","parent","prop","data","cloned","item","entry","clonedEntry","defaultMessage","returnTrue","destroyObject","object","message","throwDestroyed","name","USE_TOUCH","getMaxTouchPoints","CLICK_TYPE","dispatchEvent","el","payload","Event","bubbles","cancelable","event","TABABLE_SELECTOR","ensureElement","queryAll","selector","root","isFocusIn","activeEl","contains","tel","isHidden","rect","isVisible","isDisabled","queryTabables","includeDisabled","isDis","getXPadding","computedStyle","getYPadding","getXMargin","getYMargin","getXBorder","getYBorder","getRangeWidth","rangeWidth","xPadding","toCssSize","toAttrValue","escapeRE","escapeHtml","html","escaped","lastIndex","createEventEmitter","handlerMap","handler","handlers","logOnce","cache","logFn","infoCache","infoOnce","warnCache","warnOnce","errorCache","errorOnce","raf","cb","throttle","method","interval","invoke","args","debounceMinor","lastCall","timer","current","elapsed","debounce","delay","called","lastArgs","promise","debounceFrame","resolve","tickCallbacks","tickArgsMap","flushTickCallbacks","fn","nextTickOnce","frameCallbacks","frameArgsMap","flushFrameCallbacks","nextFrameOnce","runParallel","maxConcurrency","source","iteratorFn","ret","executing","e","flexGapSupported","supportFlexGap","flex","imgLoadingSupported","supportImgLoading","ensureArray","callIfFunc","normalizePath","path","getLast","defaultAccessor","listToMap","list","accessor","useMap","normalizeAccessor","map","set","propAccessor","removeArrayItem","isFn","groupByProps","props","propCount","zipData","isLast","transformTree","keyField","childField","parentField","rootId","hasRootId","record","id","parentId","flatTree","depthFirst","injectId","buildId","filter","cascaded","forceInject","idCount","loop","childrenValue","children","filterResult","child","walkTree","depth","mapTree","clearChildren","newItem","filterTree","leafOnly","isLeaf","leaf","items","matched","defaultSortMethod","prev","next","sortByProps","sortedList","formattedProps","lastResult","params","desc","mergeObjects","sourceObj","targetObj","isNewObj","runQueueFrame","queue","cancelled","run","allCapital","kebabRE","toKebabCase","toCapitalCase","_","char","toCamelCase","capitalName"],"mappings":"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"}