{"version":3,"file":"index.cjs","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","isIOS","_a","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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"}