util-helpers 4.15.2 → 4.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/README.md +6 -5
  2. package/dist/util-helpers.js +887 -479
  3. package/dist/util-helpers.js.map +1 -1
  4. package/dist/util-helpers.min.js +1 -1
  5. package/dist/util-helpers.min.js.map +1 -1
  6. package/esm/ajax.js +149 -0
  7. package/esm/blobToDataURL.js +8 -12
  8. package/esm/dataURLToBlob.js +6 -5
  9. package/esm/download.js +156 -0
  10. package/esm/fileReader.js +67 -0
  11. package/esm/filterTree.js +1 -1
  12. package/esm/findTreeNode.js +1 -1
  13. package/esm/findTreeNodes.js +1 -1
  14. package/esm/findTreeSelect.js +1 -1
  15. package/esm/index.js +15 -5
  16. package/esm/interface.doc.js +124 -0
  17. package/esm/{transformFieldNames.type.js → interface.type.js} +2 -4
  18. package/esm/listToTree.js +1 -1
  19. package/esm/numberToChinese.js +3 -2
  20. package/esm/parseIdCard.js +1 -1
  21. package/esm/replaceChar.js +11 -7
  22. package/esm/safeDate.js +26 -9
  23. package/esm/transformFieldNames.js +2 -3
  24. package/esm/treeToList.js +1 -1
  25. package/esm/utils/config.js +1 -1
  26. package/esm/utils/type/index.js +3 -1
  27. package/esm/utils/type/isArrayBuffer.js +25 -0
  28. package/esm/utils/type/isBlob.js +27 -0
  29. package/lib/ajax.js +156 -0
  30. package/lib/blobToDataURL.js +8 -12
  31. package/lib/dataURLToBlob.js +6 -5
  32. package/lib/download.js +161 -0
  33. package/lib/fileReader.js +74 -0
  34. package/lib/filterTree.js +1 -1
  35. package/lib/findTreeNode.js +1 -1
  36. package/lib/findTreeNodes.js +1 -1
  37. package/lib/findTreeSelect.js +1 -1
  38. package/lib/index.js +26 -5
  39. package/lib/interface.doc.js +126 -0
  40. package/lib/listToTree.js +1 -1
  41. package/lib/numberToChinese.js +3 -2
  42. package/lib/parseIdCard.js +1 -1
  43. package/lib/replaceChar.js +11 -7
  44. package/lib/safeDate.js +27 -10
  45. package/lib/transformFieldNames.js +1 -1
  46. package/lib/treeToList.js +1 -1
  47. package/lib/utils/config.js +1 -1
  48. package/lib/utils/type/index.js +14 -0
  49. package/lib/utils/type/isArrayBuffer.js +32 -0
  50. package/lib/utils/type/isBlob.js +34 -0
  51. package/package.json +2 -2
  52. package/types/ajax.d.ts +121 -0
  53. package/types/blobToDataURL.d.ts +5 -1
  54. package/types/download.d.ts +77 -0
  55. package/types/fileReader.d.ts +3 -0
  56. package/types/filterTree.d.ts +1 -1
  57. package/types/findTreeNode.d.ts +1 -1
  58. package/types/findTreeNodes.d.ts +1 -1
  59. package/types/findTreeSelect.d.ts +1 -1
  60. package/types/index.d.ts +8 -5
  61. package/types/{transformFieldNames.type.d.ts → interface.type.d.ts} +1 -1
  62. package/types/listToTree.d.ts +1 -1
  63. package/types/numberToChinese.d.ts +3 -2
  64. package/types/parseIdCard.d.ts +2 -2
  65. package/types/replaceChar.d.ts +11 -7
  66. package/types/safeDate.d.ts +3 -23
  67. package/types/transformFieldNames.d.ts +2 -2
  68. package/types/treeToList.d.ts +1 -1
  69. package/types/utils/type/index.d.ts +21 -19
  70. package/types/utils/type/isArrayBuffer.d.ts +21 -0
  71. package/types/utils/type/isBlob.d.ts +23 -0
  72. package/esm/transformFieldNames.doc.js +0 -35
  73. package/lib/transformFieldNames.doc.js +0 -42
  74. /package/lib/{transformFieldNames.type.js → interface.type.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"util-helpers.min.js","sources":["../src/utils/type/isNil.js","../src/utils/type/isUndefined.js","../src/utils/type/isNull.js","../src/utils/type/isType.js","../src/utils/type/isString.js","../src/normalizeString.js","../src/utils/convertToString.js","../src/isMobile.js","../src/isTelephone.js","../src/isPostcode.js","../src/isIdCard.js","../src/isEmail.js","../src/isQQ.js","../src/isWX.js","../src/isVehicle.js","../src/isBankCard.js","../src/isSocialCreditCode.js","../src/utils/config.js","../src/utils/devWarn.js","../src/validatePassword.js","../src/isPassport.js","../src/isChinese.js","../src/isIPv4.js","../src/isIPv6.js","../src/isUrl.js","../src/isBusinessLicense.js","../src/isHMCard.js","../src/isTWCard.js","../src/isSwiftCode.js","../src/utils/constants.js","../src/utils/type/isObject.js","../src/utils/type/isNaN.js","../src/utils/math.util.js","../src/utils/type/isSymbol.js","../src/utils/type/isNumber.js","../src/formatMoney.js","../src/numberToChinese.js","../src/parseIdCard.js","../src/listToTree.js","../src/times.js","../src/divide.js","../src/randomString.js","../src/findTreeSelect.js","../src/blobToDataURL.js","../src/bytesToSize.js","../src/calculateCursorPosition.js","../src/dataURLToBlob.js","../src/filterTree.js","../src/findTreeNode.js","../src/findTreeNodes.js","../src/formatBankCard.js","../src/formatMobile.js","../src/isPassword.js","../src/isPromiseLike.js","../src/minus.js","../src/padZero.js","../src/plus.js","../src/replaceChar.js","../src/round.js","../src/safeDate.js","../src/setDataURLPrefix.js","../src/strlen.js","../src/transformFieldNames.js","../src/treeToList.js","../src/waitTime.js"],"sourcesContent":["import isUndefined from './isUndefined';\nimport isNull from './isNull';\n\n/**\n * 检查值是否为 undefined 或 null\n *\n * @static\n * @alias module:Type.isNaN\n * @since 4.3.0\n * @param {*} value 检查值\n * @returns {boolean} 是否为 undefined 或 null\n */\nfunction isNil(value) {\n return isUndefined(value) || isNull(value);\n}\n\nexport default isNil;\n","/**\n * 检查值是否为Undefined\n *\n * @static\n * @alias module:Type.isUndefined\n * @since 1.1.0\n * @param {*} value 检查值\n * @returns {boolean} 是否为Undefined\n * @example\n *\n * isUndefined(undefined)\n * // => true\n *\n * isUndefined(void 0)\n * // => true\n *\n * isUndefined(null)\n * // => false\n */\nfunction isUndefined(value) {\n return value === void 0;\n}\n\nexport default isUndefined;\n","/**\n * 检查值是否为Null\n *\n * @static\n * @alias module:Type.isNull\n * @since 1.1.0\n * @param {*} value 检查值\n * @returns {boolean} 是否为Null\n * @example\n *\n * isNull(null)\n * // => true\n *\n * isNull(void 0)\n * // => false\n */\nfunction isNull(value) {\n return value === null;\n}\n\nexport default isNull;\n","const toString = Object.prototype.toString;\n\n/**\n * 检测值的 `toString` 类型\n *\n * @private\n * @since 1.1.0\n * @param {*} value 检查值\n * @param {string} typename 类型名称\n * @returns {boolean} 返回值的 `toString` 类型是否匹配\n */\nfunction isType(value, typename) {\n return toString.call(value) === `[object ${typename}]`;\n}\n\nexport default isType;\n","import isType from './isType';\n\n/**\n * 检查值是否为String\n *\n * @static\n * @alias module:Type.isString\n * @since 1.1.0\n * @param {*} value 检查值\n * @returns {boolean} 是否为String\n * @example\n *\n * isString('abc')\n * // => true\n *\n * isString(1)\n * // => false\n */\nfunction isString(value) {\n return isType(value, 'String');\n}\n\nexport default isString;\n","import isNil from './utils/type/isNil';\nimport convertToString from './utils/convertToString';\n\n/**\n * 规整化字符串。如果值为 undefined 或 null 将转为空字符串,如果值不是字符串类型将转为字符串。\n *\n * @static\n * @alias module:Processor.normalizeString\n * @see 参考 {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String#string_instances|String}\n * @since 4.3.0\n * @param {*} value 待处理的值\n * @returns {string} 规整化的值\n * @example\n * \n * normalizeString(); // ''\n * normalizeString(undefined); // ''\n * normalizeString(void 0); // ''\n * normalizeString(null); // ''\n *\n * normalizeString(true); // 'true'\n * normalizeString(NaN); // 'NaN'\n * normalizeString(1); // '1'\n * normalizeString('a'); // 'a'\n * \n */\nfunction normalizeString(value) {\n if (isNil(value)) {\n return '';\n }\n return convertToString(value);\n}\n\nexport default normalizeString;\n","import isString from './type/isString';\n\n/**\n * 转换为字符串\n *\n * @param {*} value 值\n * @returns {string} 字符串\n */\nfunction convertToString(value) {\n return isString(value) ? value : String(value);\n}\n\nexport default convertToString;\n","import normalizeString from './normalizeString';\n\n// 手机号码 11位数字,以1开头,第二位是3456789其中一个,后面再加9个数字\nconst reg = /^1[3456789]\\d{9}$/;\n\n/**\n * 检测值是否为手机号码\n *\n * @static\n * @alias module:Validator.isMobile\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为手机号码\n * @example\n *\n * isMobile('13000000000'); // true\n * isMobile('13000'); // false\n *\n */\nfunction isMobile(value) {\n const valueStr = normalizeString(value);\n return reg.test(valueStr);\n}\n\nexport default isMobile;\n","import normalizeString from './normalizeString';\n\n// 固定电话 支持区号和分机号 3~4位区号,以0开头;7~8位直播号,以2~9开头;1~6位分机号\nconst reg = /^(0\\d{2,3}\\-)?([2-9]\\d{6,7})(\\-\\d{1,6})?$/;\n\n/**\n * 检测值是否为固定电话\n *\n * @static\n * @alias module:Validator.isTelephone\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为固定电话\n * @example\n *\n * isTelephone('22033212'); // true\n * isTelephone('13000000000'); // false\n * \n * // 含区号\n * isTelephone('021-22033212'); // true\n *\n * // 含区号和分机号\n * isTelephone('021-22033212-123'); // true\n *\n */\nfunction isTelephone(value) {\n const valueStr = normalizeString(value);\n return reg.test(valueStr);\n}\n\nexport default isTelephone;\n","import normalizeString from './normalizeString';\n\n// 邮政编码\nconst reg = /^\\d{6}$/;\n\n/**\n * 检测值是否为邮政编码,6位数字\n *\n * @static\n * @alias module:Validator.isPostcode\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为邮政编码\n * @example\n *\n * isPostcode('101111'); // true\n * isPostcode('123'); // false\n *\n */\nfunction isPostcode(value) {\n const valueStr = normalizeString(value);\n return reg.test(valueStr);\n}\n\nexport default isPostcode;\n","import normalizeString from './normalizeString';\n\n// 身份证号正则\nconst regIdCard = /^[1-9]\\d{5}(19|20)?\\d{2}((0[1-9])|(1[012]))(([0-2][1-9])|10|20|30|31)\\d{3}(\\d|X)?$/i;\n\n/**\n * 校验码计算\n *\n * @private\n * @param {string} id 身份证号码\n * @returns {boolean} 校验码是否正确\n */\nfunction check(id) {\n let index, sum, num;\n for (sum = index = 0; index < 17; index++) {\n sum += (Math.pow(2, 17 - index) % 11) * Number(id[index]);\n }\n num = (12 - (sum % 11)) % 11;\n if (num < 10) {\n return num === Number(id[17]);\n } else {\n return id[17].toUpperCase() === 'X';\n }\n}\n\n/**\n * 检测值是否为18位身份证号码。<br/>宽松模式下,支持15位身份证号码\n *\n * @static\n * @alias module:Validator.isIdCard\n * @since 1.1.0\n * @see 参考 {@link https://zh.wikipedia.org/wiki/中华人民共和国公民身份号码|中华人民共和国公民身份号码}\n * @see 参考 {@link https://baike.baidu.com/item/居民身份证号码|居民身份证号码}\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.loose=false] 宽松模式,支持15位身份证号码\n * @param {boolean} [options.checkCode=true] 是否校验最后一位校验码,仅支持18位身份证号码\n * @returns {boolean} 值是否为身份证号\n * @example\n *\n * isIdCard('130701199310302288'); // true\n * isIdCard('13070119931030228X'); // false\n *\n * // 不校验校验码\n * isIdCard('13070119931030228X', { checkCode: false }); // true\n *\n * // 默认不支持15位身份证号码\n * isIdCard('320311770706001'); // false\n * \n * // 宽松模式,支持15位身份证号\n * isIdCard('320311770706001', { loose: true }); // true\n *\n */\nfunction isIdCard(value, options = {}) {\n const { loose = false, checkCode = true } = options;\n\n const valueStr = normalizeString(value);\n if (valueStr.length === 15 && loose) {\n return regIdCard.test(valueStr);\n }\n\n if (valueStr.length === 18 && regIdCard.test(valueStr)) {\n if (checkCode) {\n return check(valueStr);\n }\n return true;\n }\n\n return false;\n}\n\nexport default isIdCard;\n","import normalizeString from './normalizeString';\n\n// 邮箱\nconst reg = /^[\\da-z]+([\\-\\.\\_]?[\\da-z]+)*@[\\da-z]+([\\-\\.]?[\\da-z]+)*(\\.[a-z]{2,})+$/i;\n\n/**\n * 检测值是否为Email\n *\n * @static\n * @alias module:Validator.isEmail\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为Email\n * @example\n *\n * isEmail('1232@qq.com'); // true\n * isEmail('123@'); // false\n *\n */\nfunction isEmail(value) {\n const valueStr = normalizeString(value);\n return reg.test(valueStr);\n}\n\nexport default isEmail;\n","import normalizeString from './normalizeString';\n\n// QQ号正则\nconst reg = /^[1-9]\\d{4,10}$/;\n\n/**\n * 检测值是否为QQ号,非0开头,5至11位数字\n *\n * @static\n * @alias module:Validator.isQQ\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为QQ号\n * @example\n *\n * isQQ('12345'); // true\n * isQQ('123'); // false\n *\n */\nfunction isQQ(value) {\n const valueStr = normalizeString(value);\n return reg.test(valueStr);\n}\n\nexport default isQQ;\n","import normalizeString from './normalizeString';\n\n// 微信号 6至20位,以字母开头,字母,数字,减号(连接符),下划线\nconst reg = /^[a-z]([-_a-z0-9]{5,19})+$/i;\n\n/**\n * 检测值是否为微信号\n *\n * @static\n * @alias module:Validator.isWX\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为微信号\n * @example\n *\n * isWX('a12345'); // true\n * isWX('123'); // false\n *\n */\nfunction isWX(value) {\n const valueStr = normalizeString(value);\n return reg.test(valueStr);\n}\n\nexport default isWX;\n","import normalizeString from './normalizeString';\n\n// 车牌号正则\nconst reg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([A-Z0-9]{4}[A-Z0-9挂学警港澳]{1})|([A-Z0-9]{5}[DF])|([DF][A-Z0-9]{5}))$/;\n\n/**\n * 检测值是否为车牌号,支持新能源和非新能源车牌\n *\n * @static\n * @alias module:Validator.isVehicle\n * @see 参考 {@link https://baike.baidu.com/item/车牌号|车牌号}\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为车牌号\n * @example\n *\n * isVehicle('京L12345'); // true\n * isVehicle('京L1234学'); // true\n * isVehicle('BL1234警'); // true\n * \n * // 新能源车牌\n * isVehicle('粤BD12345'); // true\n * isVehicle('粤BF12345'); // true\n * isVehicle('粤B12345D'); // true\n * isVehicle('粤B12345F'); // true\n *\n */\nfunction isVehicle(value) {\n const valueStr = normalizeString(value);\n return reg.test(valueStr);\n}\n\nexport default isVehicle;\n","import normalizeString from './normalizeString';\n\n// 非0开头,10~21位数字\nconst reg = /^[1-9]\\d{9,20}$/;\n\n// 8~30位数字\nconst regLoose = /^\\d{8,30}$/;\n\n/**\n * luhn 计算校验位\n * @private\n * @param {string} numStr 银行卡前面数字\n * @returns {number}\n */\nfunction sumCheckCode(numStr) {\n const numArr = (numStr + '').replace(/\\D/g, '').split('').reverse();\n\n let sum = 0;\n for (let i = 0; i < numArr.length; i++) {\n const currNum = parseInt(numArr[i]);\n sum += i % 2 === 0 ? currNum * 2 - (currNum > 4 ? 9 : 0) : currNum;\n }\n const mod = sum % 10;\n return mod !== 0 ? 10 - mod : 0;\n}\n\n/**\n * 检测值是否为银行卡号。正常模式(非0开头,10~21位数字)宽松模式(8~30位数字)\n *\n * @static\n * @alias module:Validator.isBankCard\n * @see 参考 {@link https://kf.qq.com/faq/170112ABnm6b170112FvquAn.html|常用银行账号位数参考}\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.loose=false] 宽松模式,8~30位数字\n * @param {boolean} [options.luhn=false] 使用 Luhn 算法校验校验码\n * @returns {boolean} 值是否为银行卡号\n * @example\n *\n * isBankCard('6228480402564890018'); // true\n * isBankCard('6228480402564890'); // true\n * isBankCard('123456789'); // false\n * \n * // 宽松模式\n * isBankCard('123456789', { loose: true }); // true\n *\n */\nfunction isBankCard(value, options = {}) {\n const { loose = false, luhn = false } = options;\n\n const valueStr = normalizeString(value);\n const validateResult = loose ? regLoose.test(valueStr) : reg.test(valueStr);\n\n if (validateResult && luhn) {\n const precode = valueStr.substring(0, valueStr.length - 1);\n const checkCode = valueStr[valueStr.length - 1];\n return checkCode === String(sumCheckCode(precode));\n }\n return validateResult;\n}\n\nexport default isBankCard;\n","import normalizeString from './normalizeString';\n\n// 基础规则,由18位数字和大写字母组成,不使用I、O、Z、S、V。\nconst baseReg = /^[\\dA-HJ-NPQRTUWXY]{2}\\d{6}[\\dA-HJ-NPQRTUWXY]{10}$/;\n\n// 基础字符组成\nconst baseCodeArr = '0123456789ABCDEFGHJKLMNPQRTUWXY'.split('');\n\n/**\n * 计算校验码\n *\n * @private\n * @since 1.1.0\n * @param {string} preCode 统一代码前17位\n * @returns {string} 校验码\n */\nfunction sumCheckCode(preCode) {\n let total = 0;\n\n // 计算字符位置对应序号和加权因子的乘积,总和\n for (let i = 0; i < 17; i++) {\n // 字符位置对应的基础编码序号\n const index = baseCodeArr.findIndex((item) => item === preCode[i]);\n // 加权因子\n const wf = Math.pow(3, i) % 31;\n // 计算序号和加权因子的乘积,并计算级数之和\n total += index * wf;\n }\n\n // 计算整数求余函数MOD\n const remainder = total % 31;\n // 校验码字符值序号\n const checkCodeIndex = remainder !== 0 ? 31 - remainder : 0;\n\n return baseCodeArr[checkCodeIndex];\n}\n\n/**\n * 检测值是否为统一社会信用代码,也叫三证合一组织代码。由18位数字和大写字母组成,不使用I、O、Z、S、V。\n *\n * @static\n * @alias module:Validator.isSocialCreditCode\n * @see 参考 {@link https://zh.wikisource.org/zh-hans/GB_32100-2015_法人和其他组织统一社会信用代码编码规则|GB 32100-2015 法人和其他组织统一社会信用代码编码规则}\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.checkCode=true] 是否校验最后一位校验码,如果为false,不校验校验位。\n * @returns {boolean} 值是否为统一社会信用代码\n * @example\n *\n * isSocialCreditCode('91350100M000100Y43'); // true\n * isSocialCreditCode('91350100M000100Y4A'); // false\n *\n * // 不校验校验位,长度和类型还是有校验的\n * isSocialCreditCode('91350100M000100Y4A', { checkCode: false }); // true\n * isSocialCreditCode('91350100M000100YIO', { checkCode: false }); // false\n * isSocialCreditCode('91350100M000100Y', { checkCode: false }); // false\n *\n */\nfunction isSocialCreditCode(value, options = {}) {\n const valueStr = normalizeString(value);\n // @ts-ignore\n // TODO 下个版本废弃 loose\n const { loose = false, checkCode: cc = true } = options;\n const needCheckCode = !loose && cc;\n\n const passBaseRule = baseReg.test(valueStr);\n\n // 宽松模式 或 基础规则不通过直接返回\n if (!needCheckCode || !passBaseRule) {\n return passBaseRule;\n }\n\n // 前17位\n const preCode = valueStr.substring(0, 17);\n // 校验码\n const lastCode = valueStr.substring(valueStr.length - 1);\n // 计算校验码\n const checkCode = sumCheckCode(preCode);\n\n return lastCode === checkCode;\n}\n\nexport default isSocialCreditCode;\n","const config = {\n // 禁用warning提示\n disableWarning: true\n};\n\n/**\n * 设置禁止warning提示\n * @static\n * @alias module:Debug.formatBankCard\n * @since 3.6.1\n * @param {boolean} bool 是否禁止warning提示\n */\nfunction setDisableWarning(bool) {\n config.disableWarning = !!bool;\n}\n\n// eslint-disable-next-line no-undef\nconst version = BUILD_VERSION;\n\nexport { config, setDisableWarning, version };\n","import { config } from './config';\n\n/**\n * 打印警告信息\n *\n * @param {any[]} args 打印的信息\n */\nfunction devWarn(...args) {\n if (!config.disableWarning) {\n console.warn(...args);\n }\n}\n\nexport default devWarn;\n","import devWarn from './utils/devWarn';\n\nconst regNumber = /[\\d]/;\nconst regLowerCaseLetter = /[a-z]/;\nconst regUpperCaseLetter = /[A-Z]/;\nconst regAllNumberAndLetter = /[\\d|a-z]/gi;\n\n/**\n * 是否包含数字\n *\n * @private\n * @param {string} val 检查的值\n * @returns {boolean} 是否包含数字\n */\nfunction hasNumber(val) {\n return regNumber.test(val);\n}\n\n/**\n * 是否包含小写字母\n *\n * @private\n * @param {string} val 检测的值\n * @returns {boolean} 是否包含小写字母\n */\nfunction hasLowerCaseLetter(val) {\n return regLowerCaseLetter.test(val);\n}\n\n/**\n * 是否包含大写字母\n *\n * @private\n * @param {string} val 检测的值\n * @returns {boolean} 是否包含大写字母\n */\nfunction hasUpperCaseLetter(val) {\n return regUpperCaseLetter.test(val);\n}\n\n/**\n * 是否为十六进制\n *\n * @private\n * @param {string} val 检测的值\n * @returns {boolean} 是否为十六进制\n */\nfunction hasHex(val) {\n return val.indexOf('\\\\x') > -1 || val.indexOf('\\\\u') > -1;\n}\n\n/**\n * 是否包含特殊字符\n *\n * @private\n * @param {string} val 检测的值\n * @param {string} chars 特殊字符\n * @returns {boolean} 是否包含特殊字符\n */\nfunction hasSpecialCharacter(val, chars) {\n if (!chars || !val) {\n return false;\n }\n\n const specialChars = val.replace(regAllNumberAndLetter, '');\n\n if (!specialChars) {\n return false;\n }\n\n const regChars = hasHex(chars) ? new RegExp(`[${chars}]`) : null;\n\n if (regChars) {\n return regChars.test(specialChars);\n }\n\n let ret = false;\n specialChars.split('').some((charItem) => {\n if (chars.indexOf(charItem) > -1) {\n ret = true;\n }\n return ret;\n });\n return ret;\n}\n\n/**\n * 是否包含非法字符\n *\n * @private\n * @param {string} val 检测的值\n * @param {string} chars 特殊字符\n * @returns {boolean} 是否包含非法字符\n */\nfunction hasUnallowableCharacter(val, chars) {\n if (!val) {\n return false;\n }\n\n const specialChars = val.replace(regAllNumberAndLetter, '');\n\n if (!specialChars) {\n return false;\n } else if (!chars) {\n return true;\n }\n\n const regChars = hasHex(chars) ? new RegExp(`[^${chars}]`) : null;\n if (regChars) {\n return regChars.test(specialChars);\n }\n let ret = false;\n specialChars.split('').some((charItem) => {\n if (chars.indexOf(charItem) === -1) {\n ret = true;\n }\n return ret;\n });\n return ret;\n}\n\n/**\n * @typedef {Object} PasswordContaines - 验证密码的包含内容\n * @property {boolean} number - 包含数字\n * @property {boolean} lowerCaseLetter - 包含小写字母\n * @property {boolean} upperCaseLetter - 包含大写字母\n * @property {boolean} specialCharacter - 包含特殊字符\n * @property {boolean} unallowableCharacter - 包含非法字符\n */\n\n/**\n * @typedef {Object} ValidatePasswordReturn - 验证结果\n * @property {boolean} validated - 验证结果,根据密码强度、是否包含非法字符得出\n * @property {number} level - 强度级别,包含数字/大小写字母/特殊字符\n * @property {PasswordContaines} containes - 包含内容\n */\n\n/**\n * 验证密码(数字、大小写字母、特殊字符、非法字符)\n *\n * @see 参考 {@link https://baike.baidu.com/item/ASCII#3|ASCII}\n * @static\n * @alias module:Validator.validatePassword\n * @since 3.7.0\n * @param {string} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {number} [options.level=2] 密码强度 1-包含一种字符 2-包含两种字符 3-包含三种字符。(大写字母、小写字母、数字、特殊字符)\n * @param {boolean} [options.ignoreCase=false] 是否忽略大小写,为 ture 时,大小写字母视为一种字符\n * @param {string} [options.special=\"!@#$%^&*()-=_+[]\\|{},./?<>~\"] 支持的特殊字符\n * @returns {ValidatePasswordReturn} 验证结果\n * @example\n *\n * validatePassword('a12345678');\n * // =>\n * {\n * validated: true, // 验证结果,根据密码强度、是否包含非法字符得出\n * level: 2, // 强度级别\n * containes: {\n * number: true, // 包含数字\n * lowerCaseLetter: true, // 包含小写字母\n * upperCaseLetter: false, // 包含大写字母\n * specialCharacter: false, // 包含特殊字符\n * unallowableCharacter: false // 包含非法字符\n * }\n * }\n *\n * validatePassword('a12345678', { level: 3 });\n * // =>\n * {\n * validated: false,\n * level: 2,\n * containes: {\n * number: true,\n * lowerCaseLetter: true,\n * upperCaseLetter: false,\n * specialCharacter: false,\n * unallowableCharacter: false\n * }\n * }\n *\n * validatePassword('_Aa一二三45678', { level: 3, ignoreCase: true });\n * // =>\n * {\n * validated: false,\n * level: 3,\n * containes: {\n * number: true,\n * lowerCaseLetter: true,\n * upperCaseLetter: true,\n * specialCharacter: true,\n * unallowableCharacter: true\n * }\n * }\n *\n * // 自定义特殊字符\n * validatePassword('_Aa一二三45678', { level: 3, ignoreCase: true, special: '_一二三' });\n * // =>\n * {\n * validated: true,\n * level: 3,\n * containes: {\n * number: true,\n * lowerCaseLetter: true,\n * upperCaseLetter: true,\n * specialCharacter: true,\n * unallowableCharacter: false\n * }\n * }\n */\nfunction validatePassword(value, options = {}) {\n const { level = 2, ignoreCase = false, special = '\\\\x21-\\\\x2F\\\\x3A-\\\\x40\\\\x5B-\\\\x60\\\\x7B-\\\\x7E' } = options;\n\n let valStr = value;\n\n if (typeof value !== 'string') {\n devWarn(`[validatePassword] value must be a string.`);\n valStr = '';\n }\n\n let currentLevel = 0;\n\n // 包含数字\n const containesNumber = hasNumber(valStr);\n // 包含小写字母\n const containesLowerCaseLetter = hasLowerCaseLetter(valStr);\n // 包含大写字母\n const containesUpperCaseLetter = hasUpperCaseLetter(valStr);\n // 包含特殊字符\n const containesSpecialCharacter = hasSpecialCharacter(valStr, special);\n // 包含非法字符,即含有非数字字母特殊字符以外的其他字符\n const containesUnallowableCharacter = hasUnallowableCharacter(valStr, special);\n\n if (containesNumber) {\n currentLevel += 1;\n }\n\n // 不区分大小写\n if (ignoreCase) {\n if (containesLowerCaseLetter || containesUpperCaseLetter) {\n currentLevel += 1;\n }\n } else {\n // 区分大小写\n if (containesLowerCaseLetter) {\n currentLevel += 1;\n }\n if (containesUpperCaseLetter) {\n currentLevel += 1;\n }\n }\n\n if (containesSpecialCharacter) {\n currentLevel += 1;\n }\n\n // 验证结果\n const validated = currentLevel >= level && !containesUnallowableCharacter;\n\n return {\n validated,\n level: currentLevel,\n containes: {\n number: containesNumber,\n lowerCaseLetter: containesLowerCaseLetter,\n upperCaseLetter: containesUpperCaseLetter,\n specialCharacter: containesSpecialCharacter,\n unallowableCharacter: containesUnallowableCharacter\n }\n };\n}\n\nexport default validatePassword;\n","import normalizeString from './normalizeString';\n\n// 护照号 9位,包括首字母和数字;支持 普通护照(E*)、外交护照(DE)、公务护照(SE)、公务普通护照(PE)、香港特区护照(K/KJ/H*)、澳门特区护照(MA/MB/M*)\nconst reg = /^((e[\\da-z])|(de)|(se)|(pe)|([khm][\\da-z]))[\\da-z]{7}$/i;\n\n/**\n * 检测值是否为护照号\n * 支持普通护照(E*)、外交护照(DE)、公务护照(SE)、公务普通护照(PE)、香港特区护照(K/KJ/H*)、澳门特区护照(MA/MB/M*),注意不区分大小写\n *\n * @static\n * @alias module:Validator.isPassport\n * @see 参考 {@link https://zh.wikipedia.org/wiki/中华人民共和国护照#个人资料页|中华人民共和国护照#个人资料页}\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为护照号\n * @example\n *\n * isPassport('E12345678'); // true\n * isPassport('abc'); // false\n *\n */\nfunction isPassport(value) {\n const valueStr = normalizeString(value);\n return reg.test(valueStr);\n}\n\nexport default isPassport;\n","import normalizeString from './normalizeString';\n\nconst chineseDictionary = {\n // 基本汉字\n chineseBasic: '[\\u4e00-\\u9fa5]',\n\n // 基本汉字补充\n chineseExtend: '[\\u9ea6-\\u9fef]',\n\n // 汉字扩展A\n chineseExtendA: '[\\u3400-\\u4DB5]',\n\n // 汉字扩展B\n chineseExtendB: '[\\u{20000}-\\u{2A6D6}]',\n\n // 汉字扩展C\n chineseExtendC: '[\\u{2A700}-\\u{2B734}]',\n\n // 汉字扩展D\n chineseExtendD: '[\\u{2B740}-\\u{2B81D}]',\n\n // 汉字扩展E\n chineseExtendE: '[\\u{2B820}-\\u{2CEA1}]',\n\n // 汉字扩展F\n chineseExtendF: '[\\u{2CEB0}-\\u{2EBE0}]'\n};\n\nconst looseChineseRegExp = chineseDictionary.chineseBasic + '+';\nconst chineseRegExp = '^' + chineseDictionary.chineseBasic + '+$';\n\nconst chineseWithExtend = '(?:' + chineseDictionary.chineseBasic + '|' + chineseDictionary.chineseExtend + '|' + chineseDictionary.chineseExtendA + '|' + chineseDictionary.chineseExtendB + '|' + chineseDictionary.chineseExtendC + '|' + chineseDictionary.chineseExtendD + '|' + chineseDictionary.chineseExtendE + '|' + chineseDictionary.chineseExtendF + ')';\nconst looseChineseExtendRegExp = chineseWithExtend + '+';\nconst chineseExtendRegExp = '^' + chineseWithExtend + '+$';\n\n// eslint-disable-next-line no-prototype-builtins\nconst supportRegExpUnicode = RegExp.prototype.hasOwnProperty('unicode');\n\n/**\n * 检测值是否为中文\n *\n * @static\n * @alias module:Validator.isChinese\n * @since 1.1.0\n * @see 参考 {@link http://www.unicode.org/reports/tr38/#BlockListing|4.4 Listing of Characters Covered by the Unihan Database}\n * @see 参考 {@link https://zh.wikipedia.org/wiki/Unicode字符平面映射|Unicode字符平面映射}\n * @see 参考 {@link https://zh.wikipedia.org/wiki/Unicode區段|Unicode区段}\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.loose=false] 宽松模式。如果为true,只要包含中文即为true\n * @param {boolean} [options.useExtend=false] 使用统一表意文字扩展A-F。注意:如果不支持 `RegExp.prototype.unicode`,扩展字符集将自动不生效,如IE浏览器。\n * @returns {boolean} 值是否为中文\n * @example\n *\n * isChinese('林某某'); // true\n * isChinese('林A'); // false\n *\n * // 宽松模式,只要包含中文即为true\n * isChinese('林A', { loose: true }); // true\n * isChinese('A林A', { loose: true }); // true\n *\n * // 扩展字符集的字符\n * isChinese('𠮷'); // false\n * \n * // 使用中文扩展字符集,需要浏览器支持 RegExp.prototype.unicode 才生效。\n * isChinese('𠮷', { useExtend: true }); // true\n * isChinese('𠮷aa', { useExtend: true, loose: true }); // true\n * \n */\nfunction isChinese(value, options = {}) {\n const { loose = false, useExtend = false } = options;\n\n const valueStr = normalizeString(value);\n const basicRegExp = loose ? looseChineseRegExp : chineseRegExp;\n const extendRegExp = loose ? looseChineseExtendRegExp : chineseExtendRegExp;\n\n const hasExtend = useExtend && supportRegExpUnicode;\n const resultRegExp = hasExtend ? extendRegExp : basicRegExp;\n const flag = hasExtend ? 'u' : undefined;\n const reg = new RegExp(resultRegExp, flag);\n return reg.test(valueStr);\n}\n\nexport default isChinese;\n","import normalizeString from './normalizeString';\n\n// ipv4正则\nconst reg = /^((\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])$/;\n\n/**\n * 检测值是否为ipv4\n *\n * @static\n * @alias module:Validator.isIPv4\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为ipv4\n * @example\n *\n * isIPv4('192.168.1.1'); // true\n * isIPv4('255.255.255.255'); // true\n * isIPv4('256.256.256.256'); // false\n * isIPv4('0.0'); // false\n *\n */\nfunction isIPv4(value) {\n const valueStr = normalizeString(value);\n return reg.test(valueStr);\n}\n\nexport default isIPv4;\n","import normalizeString from './normalizeString';\n\n// ipv6正则\nconst reg = /^((([0-9A-F]{1,4}:){7}([0-9A-F]{1,4}|:))|(([0-9A-F]{1,4}:){6}(:[0-9A-F]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3})|:))|(([0-9A-F]{1,4}:){5}(((:[0-9A-F]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3})|:))|(([0-9A-F]{1,4}:){4}(((:[0-9A-F]{1,4}){1,3})|((:[0-9A-F]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3}))|:))|(([0-9A-F]{1,4}:){3}(((:[0-9A-F]{1,4}){1,4})|((:[0-9A-F]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3}))|:))|(([0-9A-F]{1,4}:){2}(((:[0-9A-F]{1,4}){1,5})|((:[0-9A-F]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3}))|:))|(([0-9A-F]{1,4}:){1}(((:[0-9A-F]{1,4}){1,6})|((:[0-9A-F]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3}))|:))|(:(((:[0-9A-F]{1,4}){1,7})|((:[0-9A-F]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3}))|:)))(%.+)?$/i;\n\n/**\n * 检测值是否为ipv6\n *\n * @static\n * @alias module:Validator.isIPv6\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为ipv6\n * @example\n *\n * // 冒分十六进制表示法\n * isIPv6('2001:0DB8:0000:0023:0008:0800:200C:417A'); // true\n *\n * // 前导0省略\n * isIPv6('2001:DB8:0:23:8:800:200C:417A'); // true\n * isIPv6('FF01:0:0:0:0:0:0:1101'); // true\n *\n * // 0位压缩表示法\n * isIPv6('FF01::1101'); // true\n * isIPv6('::1'); // true\n * isIPv6('::'); // true\n * isIPv6('0:0:0:0:0:0:0:1'); // true\n * isIPv6('0:0:0:0:0:0:0:0'); // true\n *\n * // 内嵌IPv4地址表示法\n * isIPv6('::192.168.1.1'); // true\n * isIPv6('::FFFF:192.168.1.1'); // true\n * isIPv6('192.168.1.1'); // false\n *\n */\nfunction isIPv6(value) {\n const valueStr = normalizeString(value);\n return reg.test(valueStr);\n}\n\nexport default isIPv6;\n","import normalizeString from './normalizeString';\n\n// 标准格式如下:\n// [协议类型]://[服务器地址]:[端口号]/[资源层级UNIX文件路径][文件名]?[查询]#[片段ID]\n\n// 完整格式如下:\n// [协议类型]://[访问资源需要的凭证信息]@[服务器地址]:[端口号]/[资源层级UNIX文件路径][文件名]?[查询]#[片段ID]\n// \n// 其中[访问凭证信息]、[端口号]、[查询]、[片段ID]都属于选填项。\n\nconst protocalReg = '[\\\\w-.]+:\\\\/\\\\/';\nconst credentialsReg = '[-;:&=\\\\+\\\\$,\\\\w]+@';\nconst serverReg = 'localhost|(([^\\\\s:\\\\/]+?\\\\.)+?[^\\\\s:\\\\/]+)';\nconst portReg = ':\\\\d+';\nconst pathReg = '\\\\/.*';\nconst searchReg = '\\\\?.*';\nconst hashReg = '#.*';\n\nconst regWithProtocal = new RegExp(`^${protocalReg}(?:${credentialsReg})?(?:${serverReg})(?:${portReg})?(?:${pathReg})*(?:${searchReg})?(?:${hashReg})?$`);\nconst regNonProtocal = new RegExp(`^(?:${serverReg})(?:${portReg})?(?:${pathReg})*(?:${searchReg})?(?:${hashReg})?$`);\n\n/**\n * 检测值是否为url\n *\n * @static\n * @alias module:Validator.isUrl\n * @since 3.4.0\n * @see 参考 {@link https://zh.wikipedia.org/wiki/统一资源定位符|统一资源定位符}\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为url\n * @example\n *\n * isUrl(''); // false\n * isUrl('/foo/bar'); // false\n * \n * isUrl('8.8.8.8'); // true\n * isUrl('example.com'); // true\n * isUrl('http://example.com'); // true\n * isUrl('https://example.com:8080'); // true\n * isUrl('https://www.example.com/test/123'); // true\n * isUrl('https://www.example.com/test/123?foo=bar'); // true\n * isUrl('https://www.example.com/test/123?foo=中文#id'); // true\n * isUrl('https://www.example.com/test/123?foo=中文#测试'); // true\n * isUrl('ftp://127.0.0.1:8080/测试.tar'); // true\n * isUrl('a.b'); // true\n * isUrl('a.b:8080'); // true\n * isUrl('p://a.b'); // true\n * isUrl('p://a.b:8888'); // true\n * isUrl('中文域名.中文后缀'); // true\n * isUrl('中文域名.cn'); // true\n * \n */\nfunction isUrl(value) {\n const valueStr = normalizeString(value);\n return regWithProtocal.test(valueStr) || regNonProtocal.test(valueStr);\n}\n\nexport default isUrl;\n","import normalizeString from './normalizeString';\n\n// 基础规则,由14位数字本体码和1位数字校验码组成,其中本体码从左至右依次为:6位首次登记机关码、8位顺序码。\nconst baseReg = /^\\d{15}$/;\n\n/**\n * 计算校验码\n *\n * @private\n * @since 3.5.0\n * @param {string} preCode 营业执照前14位\n * @returns {number} 校验码\n */\nfunction sumCheckCode(preCode) {\n let retNum; // 校验位数字\n\n let pj = 10; // Pj+1 11,初始为10\n\n for (let j = 0; j < 14; j++) {\n const sj = pj + Number(preCode[j]);\n let sj10 = sj % 10;\n sj10 = sj10 === 0 ? 10 : sj10;\n const pj1 = sj10 * 2;\n pj = pj1 % 11;\n }\n\n // 反模10计算\n if (pj === 1) {\n retNum = 0;\n } else {\n retNum = 11 - pj;\n }\n\n return retNum;\n}\n\n/**\n * 检测值是否为营业执照号,也叫工商注册号。由14位数字本体码和1位数字校验码组成,其中本体码从左至右依次为:6位首次登记机关码、8位顺序码。\n *\n * @static\n * @alias module:Validator.isBusinessLicense\n * @see 参考 {@link https://wenku.baidu.com/view/19873704cc1755270722087c.html|GS15—2006 工商行政管理市场主体注册号编制规则}\n * @since 3.5.0\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.checkCode=true] 是否校验最后一位校验码,如果为false,不校验校验位。\n * @returns {boolean} 值是否为营业执照号\n * @example\n *\n * isBusinessLicense('310115600985533'); // true\n * isBusinessLicense('310115600985535'); // false\n *\n * // 不校验验证码,长度和类型还是有校验\n * isBusinessLicense('310115600985535', { checkCode: false }); // true\n * isBusinessLicense('ac115600985535', { checkCode: false }); // false\n * isBusinessLicense('31011560098', { checkCode: false }); // false\n * \n */\nfunction isBusinessLicense(value, options = {}) {\n const valueStr = normalizeString(value);\n // @ts-ignore\n // TODO 下个版本废弃 loose\n const { loose = false, checkCode: cc = true } = options;\n const needCheckCode = !loose && cc;\n\n const passBaseRule = baseReg.test(valueStr);\n\n // 宽松模式 或 基础规则不通过直接返回\n if (!needCheckCode || !passBaseRule) {\n return passBaseRule;\n }\n\n // 前14位\n const preCode = valueStr.substring(0, 14);\n // 校验码\n const lastCode = valueStr.substring(valueStr.length - 1);\n // 计算校验码\n const checkCode = sumCheckCode(preCode);\n\n return lastCode === String(checkCode);\n}\n\nexport default isBusinessLicense;\n","import normalizeString from './normalizeString';\n\n// 港澳居民来往内地通行证正则\nconst regHMCard = /^[hm]{1}([0-9]{10}|[0-9]{8})$/i;\n\n/**\n * 检测值是否为港澳居民来往内地通行证,俗称回乡证或回乡卡。\n *\n * @static\n * @alias module:Validator.isHMCard\n * @since 4.0.0\n * @see 参考 {@link https://zh.wikipedia.org/wiki/港澳居民来往内地通行证|港澳居民来往内地通行证}\n * @param {*} value 要检测的值\n * @returns {boolean} 是否为港澳居民来往内地通行证\n * @example\n * // 第一代 11 位\n * isHMCard('h3203117707'); // true\n * isHMCard('H3203117707'); // true\n * isHMCard('m3203117707'); // true\n * isHMCard('M3203117707'); // true\n *\n * // 第二代 9 位\n * isHMCard('h32031177'); // true\n * isHMCard('H32031177'); // true\n * isHMCard('m32031177'); // true\n * isHMCard('M32031177'); // true\n */\nfunction isHMCard(value) {\n const valueStr = normalizeString(value);\n return regHMCard.test(valueStr);\n}\n\nexport default isHMCard;\n","import normalizeString from './normalizeString';\n\n// 台湾居民来往大陆通行证正则\nconst regTWCard = /^\\d{8}$/i;\n\n// 一次性短期台胞证\nconst singleRegTWCard = /^[\\da-z]{10,12}$/i;\n\n/**\n * 检测值是否为台湾居民来往大陆通行证,俗称台胞证。\n *\n * @static\n * @alias module:Validator.isTWCard\n * @since 4.0.0\n * @see 参考 {@link https://zh.wikipedia.org/wiki/台湾居民来往大陆通行证|台湾居民来往大陆通行证}\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.loose=false] 宽松模式。如果为true,表示支持一次性短期通行证\n * @returns {boolean} 是否为台湾居民来往大陆通行证\n * @example\n * \n * isTWCard('12345678'); // true\n * isTWCard('07257456'); // true\n *\n * // 一次性短期\n * isTWCard('F290299977'); // false\n * \n * // 宽松模式,支持一次性短期通行证\n * isTWCard('F290299977', { loose: true }); // true\n */\nfunction isTWCard(value, options = {}) {\n const { loose = false } = options;\n\n const valueStr = normalizeString(value);\n if (regTWCard.test(valueStr)) {\n return true;\n }\n return loose ? singleRegTWCard.test(valueStr) : false;\n}\n\nexport default isTWCard;\n","import normalizeString from './normalizeString';\n\nconst reg = /^[A-Z]{6}[A-Z\\d]{2}(?:[A-Z\\d]{3})?$/;\n\n/**\n * 检测值是否为 Swift Code。8位或11位,前6位为大写字母,7-8位为大写字母或数字,9-11位为可选的大写字母或数字。\n *\n * @static\n * @alias module:Validator.isSwiftCode\n * @see 参考 {@link https://zh.wikipedia.org/wiki/ISO_9362|ISO 9362}\n * @since 4.9.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为 Swift Code\n * @example\n *\n * isSwiftCode('DEUTDEFF'); // true\n * isSwiftCode('deutdeff'); // false\n *\n * isSwiftCode('BKTWTWTP010'); // true\n * isSwiftCode('010BKTWTWTP'); // false\n *\n * isSwiftCode('ICBKCNBJBJM'); // true\n *\n */\nfunction isSwiftCode(value) {\n const valueStr = normalizeString(value);\n return reg.test(valueStr);\n}\n\nexport default isSwiftCode;\n","// 最大安全数字\nexport const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\n// 最小安全数字\nexport const MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;\n","/**\n * 检查值是否为Object\n *\n * @static\n * @alias module:Type.isObject\n * @since 1.1.0\n * @param {*} value 检查值\n * @returns {boolean} 是否为Object\n * @example\n *\n * isObject({})\n * // => true\n *\n * isObject([1,2,3])\n * // => true\n *\n * isObject(null)\n * // => false\n */\nfunction isObject(value) {\n const type = typeof value;\n return value != null && (type === 'object' || type === 'function');\n}\n\nexport default isObject;\n","import isType from './isType';\n\n/**\n * 检查值是否为NaN\n *\n * @static\n * @alias module:Type.isNaN\n * @since 1.1.0\n * @param {*} value 检查值\n * @returns {boolean} 是否为NaN\n * @example\n *\n * isNaN(NaN)\n * // => true\n *\n * isNaN(1)\n * // => false\n */\nfunction _isNaN(value) {\n return isType(value, 'Number') && isNaN(value);\n}\n\nexport default _isNaN;\n","/**\n * 参考: https://github.com/nefe/number-precision/blob/master/src/index.ts\n *\n * 解决浮动运算问题,避免小数点后产生多位数和计算精度损失。\n * 问题示例:2.3 + 2.4 = 4.699999999999999,1.0 - 0.9 = 0.09999999999999998\n */\n\nimport { MAX_SAFE_INTEGER, MIN_SAFE_INTEGER } from './constants';\nimport devWarn from './devWarn';\nimport { isNumber, isString, isSymbol } from './type';\n\n/**\n * 将值转换为有效数值\n * \n * @param {*} value 要转换的值\n * @returns {number|string} 有效数值\n */\nexport function transformEffectiveNumber(value) {\n /** @type {string|number|undefined} */\n let ret;\n if (isString(value)) {\n ret = value.trim(); // ' 15' ' 15 ' 兼容 Number(string) 处理\n\n if (ret === '') {\n ret = Number(ret);\n } else if (Number.isNaN(Number(ret))) { // string如果可以转换为number,默认不转换为number类型\n ret = Number.NaN;\n }\n } else if (isSymbol(value)) {\n // 例如 Symbol 包装器对象将会报错\n // symObj = Object(Symbol());\n // Number(symObj); // TypeError: Cannot convert a Symbol value to a number\n ret = Number.NaN;\n } else if (!isNumber(value)) {\n // 其余非数字类型通过 Number 转换\n ret = Number(value);\n } else {\n ret = value;\n }\n\n if (Number.isNaN(ret)) {\n return Number.NaN;\n }\n\n // @ts-ignore\n return ret;\n}\n\n/**\n * 是否为科学计数法数字\n *\n * @param {string} num 检查值\n * @returns {boolean}\n */\nexport function isScientificNumber(num) {\n return /\\d+\\.?\\d*e[\\+\\-]*\\d+/i.test(num);\n}\n\n/**\n * 把错误的数据转正\n *\n * @param {number} num 输入数\n * @param {number} [precision=12] 小数点的精度\n * @returns {number}\n * @example\n *\n * strip(0.09999999999999998)=0.1\n */\nexport function strip(num, precision = 12) {\n return +parseFloat(num.toPrecision(precision));\n}\n\n/**\n * 计算数字的小数点长度,支持科学记数法\n *\n * @param {number|string} num 输入数\n * @returns {number} 小数点长度\n */\nexport function digitLength(num) {\n // Get digit length of e\n const eSplit = num.toString().split(/e/i);\n const len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0);\n return len > 0 ? len : 0;\n}\n\n/**\n * 把小数转成整数,支持科学计数法。如果是小数则放大成整数\n *\n * @param {number|string} num 输入数\n * @returns {number}\n */\nexport function float2Fixed(num) {\n const strNum = String(num);\n if (!isScientificNumber(strNum)) {\n return Number(strNum.replace('.', ''));\n }\n const dLen = digitLength(num);\n return dLen > 0 ? strip(+num * Math.pow(10, dLen)) : +num;\n}\n\n/**\n * 检测数字是否越界,如果越界给出提示\n * @param {number} num 输入数\n * @returns\n */\nexport function checkBoundary(num) {\n if (+num > MAX_SAFE_INTEGER || +num < MIN_SAFE_INTEGER) {\n devWarn(`${num} is beyond boundary when transfer to integer, the results may not be accurate`);\n }\n}\n\n/**\n * 去掉左边数字0\n *\n * @param {string} num 数字字符串\n * @returns {string}\n */\nexport function trimLeftZero(num) {\n const reg = /^([+-])?(0+)([0-9\\.]+)$/;\n const result = reg.exec(num);\n\n let sign;\n\n if (result) {\n sign = result[1] || '';\n return sign + (result[3][0] === '.' ? '0' + result[3] : result[3]);\n }\n\n return num;\n}\n\n/**\n * 科学计数法转换成普通数字\n *\n * JavaScript在以下情景会自动将数值转换为科学计数法:\n * 1.小数点前的数字个数大于等于22位\n * 2.小数点前边是0,小数点后十分位(包含十分位)之后连续零的个数大于等于6个\n *\n * @param {string | number} num 科学计数法数字\n * @returns {string | number} 转换后的数字字符串\n */\nexport function scientificToNumber(num) {\n const strNum = String(num);\n\n if (!isScientificNumber(strNum)) {\n return num;\n }\n\n /** @type string */\n let ret;\n\n const zero = '0';\n const parts = strNum.toLowerCase().split('e');\n const e = parts.pop(); // 存储指数\n // @ts-ignore\n const l = Math.abs(e); // 取绝对值,l-1就是0的个数\n // @ts-ignore\n const sign = e / l; //判断正负\n const coeff_array = parts[0].split('.'); // 将系数按照小数点拆分\n\n // 如果是小数\n if (sign === -1) {\n // 整数部分\n const intVal = trimLeftZero(coeff_array[0]);\n\n // 整数部分大于科学计数后面部分\n // 如: 10e-1, 10.2e-1\n if (intVal.length > l) {\n const thanLen = intVal.length - l;\n const dec = coeff_array[1] || '';\n\n ret = intVal.slice(0, thanLen);\n\n // 处理 10e-1, 100e-1\n if (intVal.slice(thanLen) !== '0' || dec) {\n ret += '.' + intVal.slice(thanLen) + dec;\n }\n } else {\n // 整数部分小于等于科学计数后面部分\n // 如: 1e-1, 0.2e-1, 1.2e-2, 1.2e-1\n ret = zero + '.' + new Array(l - intVal.length + 1).join(zero) + coeff_array.join('');\n }\n } else {\n // 小数部分\n const dec = coeff_array[1] || '';\n\n // 如果是整数,将整数除第一位之外的非零数字计入位数,相应的减少0的个数\n if (l - dec.length < 0) {\n ret = trimLeftZero(coeff_array[0] + dec.substring(0, l)) + '.' + dec.substring(l);\n } else {\n // 拼接字符串,如果是整数,不需要拼接小数点\n ret = coeff_array.join('') + new Array(l - dec.length + 1).join(zero);\n }\n }\n\n return trimLeftZero(ret);\n}\n\n","import isType from './isType';\n\n/**\n * 检查值是否为Symbol\n *\n * @static\n * @alias module:Type.isSymbol\n * @since 1.1.0\n * @param {*} value 检查值\n * @returns {boolean} 是否为Symbol\n * @example\n *\n * isSymbol(Symbol.iterator)\n * // => true\n *\n * isSymbol(\"abc\")\n * // => false\n */\nfunction isSymbol(value) {\n return isType(value, 'Symbol');\n}\n\nexport default isSymbol;\n","import isType from './isType';\n\n/**\n * 检查值是否为Number\n *\n * @static\n * @alias module:Type.isNumber\n * @since 1.1.0\n * @param {*} value 检查值\n * @returns {boolean} 是否为Number\n * @example\n *\n * isNumber(1)\n * // => true\n *\n * isNumber(Number.MIN_VALUE)\n * // => true\n *\n * isNumber(Infinity)\n * // => true\n *\n * isNumber(NaN)\n * // => true\n *\n * isNumber('1')\n * // => false\n */\nfunction isNumber(value) {\n return isType(value, 'Number');\n}\n\nexport default isNumber;\n","import { checkBoundary, scientificToNumber, isScientificNumber } from './utils/math.util';\nimport isNaN from './utils/type/isNaN';\nimport { trimLeftZero } from './utils/math.util';\nimport devWarn from './utils/devWarn';\n\nconst reg = /^[+-]?\\d*\\.?\\d*$/;\n\n/**\n * 检查数字或数字字符串\n *\n * @private\n * @param {string} num\n * @returns 是否为数字\n */\nfunction checkNumber(num) {\n if (!(reg.test(num) || isScientificNumber(num)) || isNaN(num) || (typeof num !== 'number' && typeof num !== 'string') || num === '') {\n devWarn(`${num} invalid parameter.`);\n\n return false;\n }\n\n // 数字超限如果不是是字符串,可能有异常\n // 如 1111111111111111111111 // => 1.1111111111111111e+21\n if (typeof num === 'number') {\n checkBoundary(num);\n }\n\n return true;\n}\n\n/**\n * 格式化整数部分\n *\n * @private\n * @param {string} intStr 数字字符串\n * @param {string} thousand 千分位符号\n * @returns 格式化后的值\n */\nfunction formatInt(intStr, thousand) {\n let txt = '';\n intStr = trimLeftZero(intStr);\n intStr = intStr[0] === '+' ? intStr.substring(1) : intStr; // 去掉+符号\n const negativeSymbol = Number(intStr) < 0 ? '-' : '';\n const reArr = negativeSymbol ? intStr.substring(1).split('').reverse() : intStr.split('').reverse();\n\n for (let i = 0; i < reArr.length; i++) {\n txt += reArr[i] + ((i + 1) % 3 === 0 && i + 1 !== reArr.length ? thousand : '');\n }\n\n return negativeSymbol + txt.split('').reverse().join('');\n}\n\n/**\n * 格式化小数部分,如果使用 toFixed,超大额数字会自动被截断\n *\n * @private\n * @param {string} decStr 小数点部分的字符串\n * @param {number} precision 保留位数\n * @param {string} decimal 小数点符号\n * @returns 格式化后的值\n */\nfunction formatDec(decStr, precision, decimal) {\n if (precision === 0) {\n return '';\n }\n\n const zero = 0;\n let ret = '';\n\n if (decStr && Number(decStr) > 0) {\n let tmpNum = parseFloat('0.' + decStr);\n ret = tmpNum.toFixed(precision).substring(2);\n } else {\n ret = zero.toFixed(precision).substring(2);\n }\n\n return decimal + ret;\n}\n\n/**\n * 格式化金额\n *\n * @static\n * @alias module:Processor.formatMoney\n * @since 1.1.0\n * @param {string | number} num 需转换金额 (最大:9007199254740991 最小: -9007199254740991)\n * @param {Object} [options] 金额格式化配置\n * @param {number} [options.precision=2] 保留位数 (最高:10位)\n * @param {string} [options.symbol] 货币符号\n * @param {string} [options.thousand=\",\"] 千分位符号\n * @param {string} [options.decimal=\".\"] 小数位符号\n * @returns {string} 格式化的金额\n * @example\n *\n * // 整数\n * formatMoney(1000); // 1,000.00\n *\n * // 小数(默认保留2位小数)\n * formatMoney(3000.03); // 3,000.03\n *\n * // 保留4位小数\n * formatMoney(3000.03, { precision: 4 }); // 3,000.0300\n *\n * // 保留10位小数\n * formatMoney(1500.2, { precision: 10 }); // 1,500.2000000000\n *\n * // 自定义单位符号\n * formatMoney(1000.00, { symbol: '$' }); // $1,000.00\n *\n * // 自定义千位分割符(默认',')\n * formatMoney(1000.00, { thousand: '|' }); // 1|000.00\n *\n * // 自定义小数位分割符(默认'.')\n * formatMoney(1000.00, { decimal: '&' }); // 1,000&00\n * \n * // 字符串数字\n * formatMoney('3000.03', { precision: 4 }); // 3,000.0300\n */\nconst formatMoney = (num, options = {}) => {\n let { precision = 2, symbol, thousand = ',', decimal = '.' } = options;\n\n // 数字参数不正确,返回空字符串\n // @ts-ignore\n if (!checkNumber(num)) {\n return '';\n }\n\n // 参数规整化\n if (typeof precision !== 'number' || isNaN(precision) || precision < 0) {\n precision = 2;\n } else if (precision > 10) {\n precision = 10;\n }\n symbol = typeof symbol === 'string' ? symbol : '';\n thousand = typeof thousand === 'string' ? thousand : ',';\n decimal = typeof decimal === 'string' ? decimal : '.';\n\n // 转换数字字符串,支持科学记数法\n const strNum = scientificToNumber(num) + '';\n // 整数和小数部分\n const [intStr, decStr] = strNum.split('.');\n\n return symbol + formatInt(intStr, thousand) + formatDec(decStr, precision, decimal);\n};\n\nexport default formatMoney;\n","import { checkBoundary } from './utils/math.util';\nimport devWarn from './utils/devWarn';\n\n// 简体\nconst chnNumberChar = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];\nconst chnUnitChar = ['', '十', '百', '千'];\n\n// 繁体\nconst big5NumberChar = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];\nconst big5UnitChar = ['', '拾', '佰', '仟'];\n\n// 数字字符、计数单位\n\n/**\n * @type {string[]}\n * @private\n */\nlet numberChar;\n\n/**\n * @type {string[]}\n * @private\n */\nlet unitChar;\n\n/**\n * @type {string[]}\n * @private\n */\nlet unitSection;\n\n/**\n * 每个小节的内部进行转化\n *\n * @private\n * @param {number} section 数字\n * @returns {string} 转化的数字\n */\nfunction sectionToChinese(section) {\n let str = '';\n let chnstr = '';\n let zero = false; //zero为是否进行补零, 第一次进行取余由于为个位数,默认不补零\n let unitPos = 0;\n\n while (section > 0) {\n // 对数字取余10,得到的数即为个位数\n let v = section % 10;\n\n //如果数字为零,则对字符串进行补零\n if (v == 0) {\n if (zero) {\n //如果遇到连续多次取余都是0,那么只需补一个零即可\n zero = false;\n chnstr = numberChar[v] + chnstr;\n }\n } else {\n //第一次取余之后,如果再次取余为零,则需要补零\n zero = true;\n str = numberChar[v];\n str += unitChar[unitPos];\n chnstr = str + chnstr;\n }\n unitPos++;\n section = Math.floor(section / 10);\n }\n return chnstr;\n}\n\n/**\n * 转换整数\n *\n * @private\n * @param {number} num 要转换的数字\n * @returns {string} 中文数字\n */\nfunction convertInteger(num) {\n let numInt = Math.floor(num);\n\n let unitPos = 0;\n let strIns = '';\n let chnStr = '';\n let needZero = false;\n\n if (numInt === 0) {\n return numberChar[0];\n }\n while (numInt > 0) {\n var section = numInt % 10000;\n if (needZero) {\n chnStr = numberChar[0] + chnStr;\n }\n strIns = sectionToChinese(section);\n strIns += section !== 0 ? unitSection[unitPos] : unitSection[0];\n chnStr = strIns + chnStr;\n needZero = section < 1000 && section > 0;\n numInt = Math.floor(numInt / 10000);\n unitPos++;\n }\n return chnStr;\n}\n\n/**\n * 转换小数\n *\n * @private\n * @param {number} num 要转换的数字\n */\nfunction convertDecimal(num) {\n const strNum = num + '';\n const index = strNum.indexOf('.');\n\n let ret = '';\n\n if (index > -1) {\n let decimalStr = strNum.slice(index + 1);\n ret = mapNumberChar(parseInt(decimalStr));\n }\n\n return ret;\n}\n\n/**\n * 映射为中文数字\n *\n * @private\n * @param {number} num 要处理的数字\n * @returns {string} 返回中文数字的映射\n */\nfunction mapNumberChar(num) {\n const strNum = num + '';\n let ret = '';\n\n for (let i = 0, len = strNum.length; i < len; i++) {\n ret += numberChar[parseInt(strNum[i])];\n }\n\n return ret;\n}\n\n/**\n * 数字转中文数字\n * 不在安全数字 -9007199254740991~9007199254740991 内,处理会有异常\n *\n * @static\n * @alias module:Processor.numberToChinese\n * @since 1.2.0\n * @param {number} num 数字\n * @param {Object} [options] 配置项\n * @param {boolean} [options.big5=false] 繁体\n * @param {boolean} [options.unit=true] 计数单位\n * @param {string} [options.decimal=\"点\"] 中文小数点,繁体字为點\n * @param {string} [options.zero=\"零\"] 设置0。常用配置 〇\n * @param {string} [options.negative=\"负\"] 负数前面的字\n * @param {Object} [options.unitConfig] 节点单位配置\n * @param {string} [options.unitConfig.w=\"万\"] 设置计数单位万。常用配置 萬\n * @param {string} [options.unitConfig.y=\"亿\"] 设置计数单位亿。常用配置 億\n * @returns {string} 中文数字\n * @example\n *\n * numberToChinese(100); // 一百\n * numberToChinese(100.3); // 一百点三\n * numberToChinese(1234567890); // 一十二亿三千四百五十六万七千八百九十\n * numberToChinese(1234567890.11); // 一十二亿三千四百五十六万七千八百九十点一一\n *\n * // 繁体\n * numberToChinese(100, {big5: true}); // 壹佰\n * numberToChinese(100.3, {big5: true}); // 壹佰點叁\n * numberToChinese(1234567890.11, {big5: true}); // 壹拾贰亿叁仟肆佰伍拾陆万柒仟捌佰玖拾點壹壹\n *\n * // 不带计数单位\n * numberToChinese(1990, {unit: false}); // 一九九零\n *\n * // 不带计数单位,修改0\n * numberToChinese(1990, {unit: false, zero:'〇'}); // 一九九〇\n *\n */\nfunction numberToChinese(num, options = {}) {\n const { big5 = false, unit = true, zero = '', negative = '负', unitConfig = {} } = options;\n let { decimal = '' } = options;\n\n // 非数字 或 NaN 不处理\n if (typeof num !== 'number' || isNaN(num)) {\n devWarn(`参数错误 ${num},请传入数字`);\n\n return '';\n }\n\n // 超过安全数字提示\n checkBoundary(num);\n\n // 设置数字字符和计数单位\n if (big5) {\n numberChar = big5NumberChar.slice();\n unitChar = big5UnitChar.slice();\n decimal = decimal || '點';\n } else {\n numberChar = chnNumberChar.slice();\n unitChar = chnUnitChar.slice();\n decimal = decimal || '点';\n }\n\n // 设置节点计数单位,万、亿、万亿\n const unitWan = unitConfig?.w || '万';\n const unitYi = unitConfig?.y || '亿';\n const unitWanYi = unitWan + unitYi;\n unitSection = ['', unitWan, unitYi, unitWanYi];\n\n // 设置0\n if (zero) {\n numberChar[0] = zero;\n }\n\n // 前置字符,负数处理\n const preStr = num < 0 ? negative : '';\n\n // 整数和小数\n let chnInteger, chnDecimal;\n const numAbs = Math.abs(num);\n\n // 处理整数\n if (unit) {\n chnInteger = convertInteger(numAbs);\n } else {\n chnInteger = mapNumberChar(Math.floor(numAbs));\n }\n\n // 处理小数\n chnDecimal = convertDecimal(numAbs);\n\n return chnDecimal ? `${preStr}${chnInteger}${decimal}${chnDecimal}` : `${preStr}${chnInteger}`;\n}\n\nexport default numberToChinese;\n","const regIdCard = /^(?<province>\\d{2})(?<city>\\d{2})(?<area>\\d{2})(?<year>(?:\\d{2})?\\d{2})(?<month>\\d{2})(?<day>\\d{2})\\d{2}(?<gender>\\d)(?:\\d|X)?$/i;\n\nconst Provinces = [\n // 华北地区:北京市|110000,天津市|120000,河北省|130000,山西省|140000,内蒙古自治区|150000\n ['11', '北京市'],\n ['12', '天津市'],\n ['13', '河北省'],\n ['14', '山西省'],\n ['15', '内蒙古自治区'],\n\n // 东北地区: 辽宁省|210000,吉林省|220000,黑龙江省|230000\n ['21', '辽宁省'],\n ['22', '吉林省'],\n ['23', '黑龙江省'],\n\n // 华东地区: 上海市|310000,江苏省|320000,浙江省|330000,安徽省|340000,福建省|350000,江西省|360000,山东省|370000\n ['31', '上海市'],\n ['32', '江苏省'],\n ['33', '浙江省'],\n ['34', '安徽省'],\n ['35', '福建省'],\n ['36', '江西省'],\n ['37', '山东省'],\n\n // 华中地区: 河南省|410000,湖北省|420000,湖南省|430000\n ['41', '河南省'],\n ['42', '湖北省'],\n ['43', '湖南省'],\n\n // 华南地区:广东省|440000,广西壮族自治区|450000,海南省|460000\n ['44', '广东省'],\n ['45', '广西壮族自治区'],\n ['46', '海南省'],\n\n // 西南地区:重庆市|500000,四川省|510000,贵州省|520000,云南省|530000,西藏自治区|540000\n ['50', '重庆市'],\n ['51', '四川省'],\n ['52', '贵州省'],\n ['53', '云南省'],\n ['54', '西藏自治区'],\n\n // 西北地区: 陕西省|610000,甘肃省|620000,青海省|630000,宁夏回族自治区|640000,新疆维吾尔自治区|650000\n ['61', '陕西省'],\n ['62', '甘肃省'],\n ['63', '青海省'],\n ['64', '宁夏回族自治区'],\n ['65', '新疆维吾尔自治区'],\n\n // 台湾地区:台湾省|710000\n // 台湾居民公民身份号码地址码为830000,参考 http://www.wanweibaike.com/wiki-中华人民共和国行政区划代码_(7区)、https://zh.wikipedia.org/wiki/港澳台居民居住证\n ['71', '台湾省'],\n ['83', '台湾省'],\n\n // 港澳地区:香港特别行政区|810000,澳门特别行政区|820000\n ['81', '香港特别行政区'],\n ['82', '澳门特别行政区']\n];\n\n// 第一位数字是以前的大区制代码。第二位是大区所在省市编码。全国共分为8个大区:华北(1)、东北(2)、华东(3)、中南(4)、西南(5)、西北(6)、台湾(7)和港澳(8)。\n// const Regions = [\n// ['1', '华北地区'],\n// ['2', '东北地区'],\n// ['3', '华东地区'],\n// ['4', '中南地区'],\n// ['5', '西南地区'],\n// ['6', '西北地区'],\n// ['7', '台湾地区'],\n// ['8', '港澳地区']\n// ];\n\n/**\n * @typedef {Object} IdCardOrigin - 解析身份证原数据\n * @property {string} province - 省份编码\n * @property {string} city - 城市编码\n * @property {string} area - 地区编码\n * @property {string} year - 出生年\n * @property {string} month - 出生月\n * @property {string} day - 出生日\n * @property {string} gender - 性别 能整除2为女,否则为男\n */\n\n/**\n * @typedef {Object} IdCardInfo - 身份证信息\n * @property {string} province - 省份\n * @property {string} birthday - 生日\n * @property {string} gender - 性别\n * @property {IdCardOrigin} origin - 解析身份证原数据\n */\n\n/**\n * 解析身份证号码,支持15、18位身份证号码\n *\n * @static\n * @alias module:Processor.parseIdCard\n * @since 4.0.0\n * @see 参考 {@link https://baike.baidu.com/item/居民身份证号码|居民身份证号码}\n * @param {string} id 身份证号码,支持15位\n * @returns {null|IdCardInfo} null 或 省份、生日、性别,省/市/区/年/月/日/性别编码\n * @example\n * \n * parseIdCard('123456789123456'); // null\n *\n * // 18位身份证号码\n * parseIdCard('130701199310302288'); \n * // =>\n * {\n * birthday: \"1993-10-30\",\n * gender: \"女\",\n * origin: { province: \"13\", city: \"07\", area: \"01\", year: \"1993\", month: \"10\", day: \"30\", gender: \"8\" },\n * province: \"河北省\"\n * }\n *\n * // 15位身份证号码\n * parseIdCard('130701931030228');\n * // =>\n * {\n * birthday: \"93-10-30\",\n * gender: \"女\",\n * origin: { province: \"13\", city: \"07\", area: \"01\", year: \"93\", month: \"10\", day: \"30\", gender: \"8\" },\n * province: \"河北省\"\n * }\n *\n */\nfunction parseIdCard(id) {\n const match = regIdCard.exec(id);\n\n if (!match) {\n return null;\n }\n\n /** @type {{ province: string, city: string, area: string, year: string, month: string, day: string, gender: string }} */\n // @ts-ignore\n const origin = match.groups || {\n province: match[1],\n city: match[2],\n area: match[3],\n year: match[4],\n month: match[5],\n day: match[6],\n gender: match[7]\n };\n\n const province = Provinces.find((item) => item[0] === origin.province);\n\n if (!province) {\n return null;\n }\n\n const birthday = `${origin.year}-${origin.month}-${origin.day}`;\n const gender = Number(origin.gender) % 2 === 0 ? '女' : '男';\n // const region = Regions.find(item => item[0] === origin.province?.substring(0, 1));\n\n return {\n // region,\n province: province[1],\n birthday,\n gender,\n origin\n };\n}\n\nexport default parseIdCard;\n","import { isObject } from \"./utils/type\";\n\n/**\n * 递归处理空子级\n * \n * @private\n * @template {Record<string,any>} [T=Record<string,any>]\n * @param {T[]} arr 列表数据\n * @param {object} [options] 配置项\n * @param {string} [options.childrenField='children'] 子级字段名称\n * @param {'none'|'null'} [options.emptyChildrenValue='none'] 子级为空时的值,none表示删除该子级,null表示为null,array表示为[]。\n */\nfunction processEmptyChildren(arr, options) {\n const { childrenField = 'children', emptyChildrenValue = 'none' } = options || {};\n arr.forEach(item => {\n // if (isObject(item) && Array.isArray(item[childrenField])) {\n if (item[childrenField].length <= 0) {\n if (emptyChildrenValue === 'null') {\n // @ts-ignore\n item[childrenField] = null;\n // } else if (emptyChildrenValue === 'none') { // emptyChildrenValue='array' 不会执行该内部方法 \n } else {\n delete item[childrenField];\n }\n } else {\n processEmptyChildren(item[childrenField], options);\n }\n // }\n });\n}\n\n/**\n * 列表数据转树结构\n * \n * @static\n * @alias module:Processor.listToTree\n * @since 4.14.0\n * @template {Record<string,any>} [T=Record<string,any>]\n * @template {*} [R=T&Record<string,any>]\n * @param {T[]} list 列表数据\n * @param {object} [options] 配置项\n * @param {string} [options.keyField='id'] 当前数据的键值字段名称\n * @param {string} [options.parentField='pid'] 当前数据的父级字段名称\n * @param {string} [options.childrenField='children'] 子级字段名称\n * @param {'none'|'null'|'array'} [options.emptyChildrenValue='none'] 子级为空时的值,none表示删除该子级,null表示为null,array表示为[]。\n * @param {'spread'|'self'} [options.nodeAssign='spread'] 节点赋值方式。spread表示使用展开运算符创建新值,self表示使用自身对象。\n * @returns {R[]} 树结构\n * @example\n * \n * const menus = [\n * { id: '1', name: '首页', code: 'trade', pid: null },\n * { id: '2', name: '交易管理', code: 'trade', pid: null },\n * { id: '3', name: '交易查询', code: 'trade-1', pid: '2' },\n * { id: '4', name: '交易查询-查询操作', code: 'trade-1-1', pid: '3' },\n * { id: '5', name: '权限管理', code: 'authorization', pid: null },\n * { id: '6', name: '角色管理', code: 'authorization-1', pid: '5' },\n * { id: '7', name: '用户管理', code: 'authorization-2', pid: '5' }\n * ];\n * listToTree(menus); \n * // [{\"id\":\"1\",\"name\":\"首页\",\"code\":\"trade\",\"pid\":null},{\"id\":\"2\",\"name\":\"交易管理\",\"code\":\"trade\",\"pid\":null,\"children\":[{\"id\":\"3\",\"name\":\"交易查询\",\"code\":\"trade-1\",\"pid\":\"2\",\"children\":[{\"id\":\"4\",\"name\":\"交易查询-查询操作\",\"code\":\"trade-1-1\",\"pid\":\"3\"}]}]},{\"id\":\"5\",\"name\":\"权限管理\",\"code\":\"authorization\",\"pid\":null,\"children\":[{\"id\":\"6\",\"name\":\"角色管理\",\"code\":\"authorization-1\",\"pid\":\"5\"},{\"id\":\"7\",\"name\":\"用户管理\",\"code\":\"authorization-2\",\"pid\":\"5\"}]}]\n * \n * // 自定义子级字段名\n * listToTree(basicMenus, { childrenField: 'childs' });\n * // [{\"id\":\"1\",\"name\":\"首页\",\"code\":\"trade\",\"pid\":null},{\"id\":\"2\",\"name\":\"交易管理\",\"code\":\"trade\",\"pid\":null,\"childs\":[{\"id\":\"3\",\"name\":\"交易查询\",\"code\":\"trade-1\",\"pid\":\"2\",\"childs\":[{\"id\":\"4\",\"name\":\"交易查询-查询操作\",\"code\":\"trade-1-1\",\"pid\":\"3\"}]}]},{\"id\":\"5\",\"name\":\"权限管理\",\"code\":\"authorization\",\"pid\":null,\"childs\":[{\"id\":\"6\",\"name\":\"角色管理\",\"code\":\"authorization-1\",\"pid\":\"5\"},{\"id\":\"7\",\"name\":\"用户管理\",\"code\":\"authorization-2\",\"pid\":\"5\"}]}]\n * \n */\nfunction listToTree(list, options) {\n const { keyField = 'id', parentField = 'pid', childrenField = 'children', emptyChildrenValue = 'none', nodeAssign = 'spread' } = options || {};\n\n /** @type {R[]} */\n const tree = [];\n\n /** @type {Object.<string, T[]>} */\n const record = {};\n\n if (!Array.isArray(list)) {\n return tree;\n }\n\n list.forEach(item => {\n if (isObject(item)) {\n const newItem = nodeAssign === 'spread' ? { ...item } : item;\n\n /** @type {string} */\n const id = newItem[keyField];\n\n /** @type {string} */\n const pid = newItem[parentField];\n\n if (record[id]) {\n // @ts-ignore\n newItem[childrenField] = record[id];\n } else {\n // @ts-ignore\n newItem[childrenField] = record[id] = [];\n }\n\n if (pid) {\n if (!record[pid]) {\n record[pid] = [newItem];\n } else {\n record[pid].push(newItem);\n }\n } else {\n // @ts-ignore\n tree.push(newItem);\n }\n }\n });\n\n if (emptyChildrenValue !== 'array') {\n // @ts-ignore\n processEmptyChildren(tree, options);\n }\n\n return tree;\n}\n\nexport default listToTree;","import { digitLength, float2Fixed, checkBoundary, transformEffectiveNumber } from './utils/math.util';\n\n/**\n * 精确乘法,支持多个数相乘,乘数默认为 1 。\n *\n * @static\n * @alias module:Math.times\n * @since 3.1.0\n * @param {...number|string} nums 相乘的数\n * @returns {number} 乘积\n * @example\n *\n * times(3, 0.6); // 1.8\n * times(3, 0.6, 2); // 3.6\n * times(3, 0.6, 2, 10); // 36\n * \n */\nfunction times(...nums) {\n let [num1, num2 = 1, ...rest] = nums;\n if (rest.length > 0) {\n return times(times(num1, num2), ...rest);\n }\n\n num1 = transformEffectiveNumber(num1);\n num2 = transformEffectiveNumber(num2);\n\n // 兼容处理,如果参数包含无效数值时,返回 NaN\n // @ts-ignore\n if (isNaN(num1) || isNaN(num2)) {\n return Number.NaN;\n }\n\n const num1Changed = float2Fixed(num1);\n const num2Changed = float2Fixed(num2);\n const baseNum = digitLength(num1) + digitLength(num2);\n const leftValue = num1Changed * num2Changed;\n\n checkBoundary(leftValue);\n\n return leftValue / Math.pow(10, baseNum);\n}\n\nexport default times;\n","import { strip, digitLength, float2Fixed, checkBoundary, transformEffectiveNumber } from './utils/math.util';\nimport times from './times';\n\n/**\n * 精确除法,支持多个数相除,除数默认为 1 。\n *\n * @static\n * @alias module:Math.divide\n * @since 3.1.0\n * @param {...number|string} nums 被除数和除数\n * @returns {number} 商数\n * @example\n *\n * divide(1.21); // 1.21 除数默认为 1 ,即 1.21/1 = 1.21\n * divide(1.21, 1.1); // 1.1\n * divide(1000, 10, 10); // 10\n * divide(1000, 10, 10, 10); // 1\n * \n * divide(); // NaN 如果没有传入参数,被除数默认为 undefined 。 Number(undefined) 转换为 NaN ,NaN/1 = NaN\n * divide(null); // 0 Number(null) 转换为 0 , 0/1 = 0\n * divide('1.5 ', 0.5); // 3 Number('1.5 ') 转换为 1.5 ,1.5/0.5 = 3\n * \n */\nfunction divide(...nums) {\n let [num1, num2 = 1, ...rest] = nums;\n\n if (rest.length > 0) {\n return divide(divide(num1, num2), ...rest);\n }\n\n num1 = transformEffectiveNumber(num1);\n num2 = transformEffectiveNumber(num2);\n\n // 兼容处理,如果参数包含无效数值时,返回 NaN\n // @ts-ignore\n if (isNaN(num1) || isNaN(num2)) {\n return Number.NaN;\n }\n\n const num1Changed = float2Fixed(num1);\n const num2Changed = float2Fixed(num2);\n checkBoundary(num1Changed);\n checkBoundary(num2Changed);\n // fix: 类似 10 ** -4 为 0.00009999999999999999,strip 修正\n return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1))));\n}\n\nexport default divide;\n","const numberChars = '0123456789';\nconst letterChars = 'abcdefghijklmnopqrstuvwxyz';\nconst defaultChars = numberChars + letterChars + letterChars.toUpperCase();\n\n/**\n * @private\n * @param {number} len 长度\n * @param {string} optionalChars 允许的字符,默认为数字和大小写字母\n * @param {string} [prefix=''] 前缀部分,不计入长度\n * @returns {string}\n */\nfunction internalRandomString(len, optionalChars, prefix = '') {\n while (len-- > 0) {\n const r = optionalChars[Math.floor(Math.random() * optionalChars.length)];\n return internalRandomString(len, optionalChars, prefix + r);\n }\n return prefix;\n}\n\n/**\n * 生成随机字符串\n *\n * @static\n * @alias module:Other.randomString\n * @since 4.8.0\n * @param {number} [len=0] 长度\n * @param {string} [optionalChars='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'] 允许的字符,默认为数字和大小写字母\n * @returns {string} 随机字符串\n * @example\n * \n * randomString(5); // slk23\n * randomString(8); // 71mHqo2A\n *\n * // 自定义允许的字符\n * randomString(5, 'abc'); // ccbcb\n * randomString(8, 'abcefg'); // bcgcfabg\n * \n */\nfunction randomString(len = 0, optionalChars) {\n let realLen = typeof len === 'number' ? len : Number(len);\n if (isNaN(realLen)) {\n realLen = 0;\n }\n\n const realChars = typeof optionalChars === 'string' && optionalChars ? optionalChars : defaultChars;\n\n return internalRandomString(len, realChars);\n}\n\nexport default randomString;\n","import { isObject } from \"./utils/type\";\n\n/**\n * 内部实现\n * \n * @private\n * @template {any} T\n * @template {(item: T) => boolean} F\n * @param {T[]} tree 树结构数据\n * @param {F} predicate 遍历每一项执行的函数,参数是当前遍历到的节点数据,如果返回 Truthy 将返回包含该节点的所有父级节点\n * @param {string} [childrenField] 子级字段名\n * @param {T[]} [path=[]] 当前遍历路径\n * @returns {T[]}\n */\nfunction internalFindTreeSelect(tree, predicate, childrenField, path = []) {\n if (!Array.isArray(tree)) {\n return [];\n }\n\n for (const item of tree) {\n path.push(item);\n\n if (predicate(item)) {\n return path;\n }\n\n if (isObject(item)) {\n /** @type {T[]} */\n // @ts-ignore\n const childs = item[childrenField];\n\n if (Array.isArray(childs) && childs.length > 0) {\n const findChildren = internalFindTreeSelect(childs, predicate, childrenField, path);\n if (findChildren.length > 0) {\n return findChildren;\n }\n }\n }\n\n path.pop();\n }\n\n return [];\n}\n\n/**\n * 查找包含当前节点的所有父级节点\n * \n * @static\n * @alias module:Other.findTreeSelect\n * @since 4.14.0\n * @template {any} T\n * @template {(item: T) => boolean} F\n * @param {T[]} tree 树结构数据\n * @param {F} predicate 遍历每一项执行的函数,参数是当前遍历到的节点数据,如果返回 Truthy 将返回包含该节点的所有父级节点\n * @param {string} [childrenField='children'] 子级字段名\n * @returns {T[]}\n * @example\n * const menus = [{ \"id\": \"1\", \"name\": \"首页\", \"code\": \"trade\", \"pid\": null }, { \"id\": \"2\", \"name\": \"交易管理\", \"code\": \"trade\", \"pid\": null, \"children\": [{ \"id\": \"3\", \"name\": \"交易查询\", \"code\": \"trade-1\", \"pid\": \"2\", \"children\": [{ \"id\": \"4\", \"name\": \"交易查询-查询操作\", \"code\": \"trade-1-1\", \"pid\": \"3\" }] }] }, { \"id\": \"5\", \"name\": \"权限管理\", \"code\": \"authorization\", \"pid\": null, \"children\": [{ \"id\": \"6\", \"name\": \"角色管理\", \"code\": \"authorization-1\", \"pid\": \"5\" }, { \"id\": \"7\", \"name\": \"用户管理\", \"code\": \"authorization-2\", \"pid\": \"5\" }] }];\n * \n * findTreeSelect(menus, item => item.id === '2');\n * // [{\"id\":\"2\",\"name\":\"交易管理\",\"code\":\"trade\",\"pid\":null,\"children\":[{\"id\":\"3\",\"name\":\"交易查询\",\"code\":\"trade-1\",\"pid\":\"2\",\"children\":[{\"id\":\"4\",\"name\":\"交易查询-查询操作\",\"code\":\"trade-1-1\",\"pid\":\"3\"}]}]}]\n * \n * findTreeSelect(menus, item => item.id === '7');\n * // [{\"id\":\"5\",\"name\":\"权限管理\",\"code\":\"authorization\",\"pid\":null,\"children\":[{\"id\":\"6\",\"name\":\"角色管理\",\"code\":\"authorization-1\",\"pid\":\"5\"},{\"id\":\"7\",\"name\":\"用户管理\",\"code\":\"authorization-2\",\"pid\":\"5\"}]},{\"id\":\"7\",\"name\":\"用户管理\",\"code\":\"authorization-2\",\"pid\":\"5\"}]\n * \n * findTreeSelect(menus, item => item.id === 'not found');\n * // []\n */\nfunction findTreeSelect(tree, predicate, childrenField = 'children') {\n return internalFindTreeSelect(tree, predicate, childrenField);\n}\n\nexport default findTreeSelect;","// file、blob文件如何预览图片?\n// 方法1:将file或者blob类型文件转成base64数据,再作为src赋值给img标签\n// 方法2:使用 window.URL.createObjectURL(blob) 为blob、file 创建一个指向该参数对象的URL\n\n/**\n * 将 Blob 或 File 对象转成 data:URL 格式的 Base64 字符串。\n *\n * @static\n * @alias module:Processor.blobToDataURL\n * @see 参考 {@link https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader/readAsDataURL|FileReader.readAsDataURL()}\n * @since 4.1.0\n * @param {Blob} blob Blob 或 File 对象\n * @returns {Promise<string>} data:URL 格式的 Base64 字符串。\n * @example\n * const aFileParts = ['<a id=\"a\"><b id=\"b\">hey!</b></a>']; // 一个包含DOMString的数组\n * const htmlBlob = new Blob(aFileParts, { type: 'text/html' }); // 得到 blob\n *\n * blobToDataURL(htmlBlob).then(data=>{\n * console.log(data); // data:text/html;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=\n * });\n *\n * const textBlob = new Blob(aFileParts, { type: 'text/plain' });\n *\n * blobToDataURL(textBlob).then(data=>{\n * console.log(data); // data:text/plain;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=\n * });\n */\nfunction blobToDataURL(blob) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsDataURL(blob);\n // @ts-ignore\n reader.onload = () => resolve(reader.result);\n reader.onerror = (error) => reject(error);\n });\n}\n\nexport default blobToDataURL;\n","/**\n * 字节转换存储单位,保留2位小数点\n *\n * @static\n * @alias module:Processor.bytesToSize\n * @since 3.8.0\n * @param {number} bytes 字节大小\n * @param {Object} [options] 配置项\n * @param {string} [options.spaceMark=' '] 间隔字符\n * @param {number} [options.precision=2] 精度\n * @returns {string} 存储单位值\n * @example\n *\n * bytesToSize(0); // 0 B\n * bytesToSize(1024); // 1 KB\n * bytesToSize(3.213243*1024*1024); // 3.21 MB\n * bytesToSize(1024*1024*1024); // 1 GB\n * \n * // 自定义间隔符号\n * bytesToSize(0, { spaceMark: '' }); // 0B\n * bytesToSize(1024, { spaceMark: '' }); // 1KB\n * \n */\nfunction bytesToSize(bytes, options = {}) {\n const { spaceMark = ' ', precision = 2 } = options;\n\n const numBytes = typeof bytes !== 'number' ? Number(bytes) : bytes;\n if (numBytes === 0 || isNaN(numBytes)) return `0${spaceMark}B`;\n\n const k = 1024;\n // 存储单位\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const i = Math.floor(Math.log(numBytes) / Math.log(k));\n\n return sizes[i] ? `${Number((numBytes / Math.pow(k, i)).toFixed(precision))}${spaceMark}${sizes[i]}` : numBytes + '';\n}\n\nexport default bytesToSize;\n","import normalizeString from './normalizeString';\n\n// ref: https://github.com/ant-design/ant-design-mobile/blob/v2/components/input-item/index.tsx#L240\n\n/**\n * 计算输入框的值格式化后光标位置\n *\n * @static\n * @alias module:Other.calculateCursorPosition\n * @since 4.6.0\n * @see h5示例 {@link https://2950v9.csb.app/|点击查看}\n * @see react示例 {@link https://33ccy9.csb.app/|点击查看}\n * @param {number} prevPos 赋值前的光标位置,onChange/onInput的光标位置 e.target.selectionEnd\n * @param {string} prevCtrlValue 上一个格式化后的值\n * @param {string} rawValue 当前输入原值\n * @param {string} ctrlValue 当前格式化后的值\n * @param {Object} [options] 配置项\n * @param {string[]|string} [options.placeholderChar=' '] 占位符\n * @param {RegExp} [options.maskReg=/\\D/g] 需要遮盖的字符规则。默认去掉非数字,意味着 ctrlValue 需要去掉非数字。\n * @param {'mobile'|'bankCard'} [options.type] 格式化类型,内置手机号码和银行卡号特殊处理\n * @returns {number} 格式化后的光标位置\n */\nfunction calculateCursorPosition(prevPos, prevCtrlValue, rawValue, ctrlValue, options = {}) {\n const { placeholderChar = ' ', maskReg = /\\D/g, type } = options;\n\n const realCtrlValue = normalizeString(prevCtrlValue);\n const realRawValue = normalizeString(rawValue);\n const placeholderChars = Array.isArray(placeholderChar) ? placeholderChar : [placeholderChar];\n\n const editLength = realRawValue.length - realCtrlValue.length;\n const isAddition = editLength > 0;\n\n let pos = prevPos;\n\n if (isAddition) {\n const additionStr = realRawValue.substring(pos - editLength, pos);\n let ctrlCharCount = additionStr.replace(maskReg, '').length;\n pos -= editLength - ctrlCharCount;\n\n let placeholderCharCount = 0;\n while (ctrlCharCount > 0) {\n if (placeholderChars.indexOf(ctrlValue.charAt(pos - ctrlCharCount + placeholderCharCount)) !== -1) {\n placeholderCharCount++;\n } else {\n ctrlCharCount--;\n }\n }\n pos += placeholderCharCount;\n }\n\n if ((type === 'mobile' && (pos === 4 || pos === 9)) || (type === 'bankCard' && pos > 0 && pos % 5 === 0)) {\n pos -= 1;\n }\n\n return pos;\n}\n\nexport default calculateCursorPosition;\n","/**\n * 将 DataURL 转为 Blob 对象\n *\n * @static\n * @alias module:Processor.dataURLToBlob\n * @see 参考 {@link https://developer.mozilla.org/zh-CN/docs/Glossary/Base64|Base64}\n * @since 4.1.0\n * @param {string} dataurl data: 协议的URL\n * @returns {Blob} Blob 对象\n * @example\n * const dataurl = 'data:text/html;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=';\n * dataURLToBlob(dataurl); // Blob {size: 32, type: 'text/html'}\n */\nfunction dataURLToBlob(dataurl) {\n const arr = dataurl.split(',');\n // @ts-ignore\n const mime = arr[0].match(/:(.*?);/)[1];\n const bstr = atob(arr[1]);\n let n = bstr.length;\n const u8arr = new Uint8Array(n);\n\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n return new Blob([u8arr], { type: mime });\n}\n\nexport default dataURLToBlob;\n","import { isObject } from \"./utils/type\";\n\n/**\n * 过滤/筛选树节点。<br/><br/>如果某节点被过滤掉,它的子节点也一并抛弃\n * \n * @static\n * @alias module:Processor.filterTree\n * @since 4.15.0\n * @template {any} T\n * @template {(item: T) => boolean} F\n * @param {T[]} tree 树结构数据\n * @param {F} predicate 遍历每一项执行的函数,参数是当前遍历到的节点数据,如果返回 Truthy ,结果将包含该节点\n * @param {string} [childrenField='children'] 子级字段名\n * @param {'spread'|'self'} [nodeAssign='spread'] 节点赋值方式。spread表示使用展开运算符创建新值,self表示使用自身对象。\n * @returns {T[]}\n * @example\n * const menus = [{ \"id\": \"1\", \"name\": \"首页\", \"code\": \"trade\", \"pid\": null }, { \"id\": \"2\", \"name\": \"交易管理\", \"code\": \"trade\", \"pid\": null, \"children\": [{ \"id\": \"3\", \"name\": \"交易查询\", \"code\": \"trade-1\", \"pid\": \"2\", \"children\": [{ \"id\": \"4\", \"name\": \"交易查询-查询操作\", \"code\": \"trade-1-1\", \"pid\": \"3\" }] }] }, { \"id\": \"5\", \"name\": \"权限管理\", \"code\": \"authorization\", \"pid\": null, \"children\": [{ \"id\": \"6\", \"name\": \"角色管理\", \"code\": \"authorization-1\", \"pid\": \"5\" }, { \"id\": \"7\", \"name\": \"用户管理\", \"code\": \"authorization-2\", \"pid\": \"5\" }] }];\n * \n * filterTree(menus, item=>item.name.indexOf('管理') > -1);\n * // [{\"id\":\"2\",\"name\":\"交易管理\",\"code\":\"trade\",\"pid\":null,\"children\":[]},{\"id\":\"5\",\"name\":\"权限管理\",\"code\":\"authorization\",\"pid\":null,\"children\":[{\"id\":\"6\",\"name\":\"角色管理\",\"code\":\"authorization-1\",\"pid\":\"5\"},{\"id\":\"7\",\"name\":\"用户管理\",\"code\":\"authorization-2\",\"pid\":\"5\"}]}]\n * \n * // 如果某节点被过滤掉,它的子节点也一并抛弃\n * filterTree(menus, item=>item.id === '7');\n * // []\n * \n * filterTree(menus, item=>item.id === 'not found');\n * // []\n */\nfunction filterTree(tree, predicate, childrenField = 'children', nodeAssign = 'spread') {\n /** @type {T[]} */\n const result = [];\n\n if (!Array.isArray(tree)) {\n return result;\n }\n\n tree.forEach(item => {\n let newItem = item;\n\n if (isObject(item)) {\n // @ts-ignore\n newItem = nodeAssign === 'spread' ? { ...item } : item;\n }\n\n if (predicate(newItem)) {\n if (isObject(newItem)) {\n /** @type {T[]|undefined} */\n // @ts-ignore\n const childs = newItem[childrenField];\n\n if (Array.isArray(childs) && childs.length > 0) {\n // @ts-ignore\n newItem[childrenField] = filterTree(childs, predicate, childrenField, nodeAssign);\n }\n }\n\n result.push(newItem);\n }\n });\n\n return result;\n}\n\nexport default filterTree;","import { isObject } from \"./utils/type\";\n\n/**\n * 查找树结构数据节点\n * \n * @static\n * @alias module:Other.findTreeNode\n * @since 4.14.0\n * @template {any} T\n * @template {(item: T) => boolean} F\n * @param {T[]} tree 树结构数据\n * @param {F} predicate 遍历每一项执行的函数,参数是当前遍历到的节点数据,如果返回 Truthy ,将返回该节点\n * @param {string} [childrenField='children'] 子级字段名\n * @returns {T|undefined}\n * @example\n * const menus = [{ \"id\": \"1\", \"name\": \"首页\", \"code\": \"trade\", \"pid\": null }, { \"id\": \"2\", \"name\": \"交易管理\", \"code\": \"trade\", \"pid\": null, \"children\": [{ \"id\": \"3\", \"name\": \"交易查询\", \"code\": \"trade-1\", \"pid\": \"2\", \"children\": [{ \"id\": \"4\", \"name\": \"交易查询-查询操作\", \"code\": \"trade-1-1\", \"pid\": \"3\" }] }] }, { \"id\": \"5\", \"name\": \"权限管理\", \"code\": \"authorization\", \"pid\": null, \"children\": [{ \"id\": \"6\", \"name\": \"角色管理\", \"code\": \"authorization-1\", \"pid\": \"5\" }, { \"id\": \"7\", \"name\": \"用户管理\", \"code\": \"authorization-2\", \"pid\": \"5\" }] }];\n * \n * findTreeNode(menus, item=>item.id === '2');\n * // {\"id\":\"2\",\"name\":\"交易管理\",\"code\":\"trade\",\"pid\":null,\"children\":[{\"id\":\"3\",\"name\":\"交易查询\",\"code\":\"trade-1\",\"pid\":\"2\",\"children\":[{\"id\":\"4\",\"name\":\"交易查询-查询操作\",\"code\":\"trade-1-1\",\"pid\":\"3\"}]}]}\n * \n * findTreeNode(menus, item=>item.id === '7');\n * // {\"id\":\"7\",\"name\":\"用户管理\",\"code\":\"authorization-2\",\"pid\":\"5\"}\n * \n * findTreeNode(menus, item=>item.id === 'not found');\n * // undefined\n */\nfunction findTreeNode(tree, predicate, childrenField = 'children') {\n const stack = [];\n\n /** @type {T|undefined} */\n let node;\n\n if (!Array.isArray(tree)) {\n return node;\n }\n\n for (const item of tree) {\n stack.push(item);\n\n while (stack.length) {\n /** @type {T} */\n // @ts-ignore\n const temp = stack.pop();\n if (predicate(temp)) {\n node = temp;\n break;\n }\n\n if (isObject(temp)) {\n /** @type {T[]} */\n // @ts-ignore\n const childs = temp[childrenField];\n if (Array.isArray(childs) && childs.length > 0) {\n stack.push(...childs);\n }\n }\n }\n\n if (node) {\n break;\n }\n }\n\n return node;\n}\n\nexport default findTreeNode;","import { isObject } from \"./utils/type\";\n\n/**\n * 查找树结构数据多个节点\n * \n * @static\n * @alias module:Other.findTreeNodes\n * @since 4.15.0\n * @template {any} T\n * @template {(item: T) => boolean} F\n * @param {T[]} tree 树结构数据\n * @param {F} predicate 遍历每一项执行的函数,参数是当前遍历到的节点数据,如果返回 Truthy ,返回结果将包含该节点\n * @param {string} [childrenField='children'] 子级字段名\n * @returns {T[]}\n * @example\n * const menus = [{ \"id\": \"1\", \"name\": \"首页\", \"code\": \"trade\", \"pid\": null }, { \"id\": \"2\", \"name\": \"交易管理\", \"code\": \"trade\", \"pid\": null, \"children\": [{ \"id\": \"3\", \"name\": \"交易查询\", \"code\": \"trade-1\", \"pid\": \"2\", \"children\": [{ \"id\": \"4\", \"name\": \"交易查询-查询操作\", \"code\": \"trade-1-1\", \"pid\": \"3\" }] }] }, { \"id\": \"5\", \"name\": \"权限管理\", \"code\": \"authorization\", \"pid\": null, \"children\": [{ \"id\": \"6\", \"name\": \"角色管理\", \"code\": \"authorization-1\", \"pid\": \"5\" }, { \"id\": \"7\", \"name\": \"用户管理\", \"code\": \"authorization-2\", \"pid\": \"5\" }] }];\n * \n * findTreeNodes(menus, item=>item.id === '2');\n * // [{\"id\":\"2\",\"name\":\"交易管理\",\"code\":\"trade\",\"pid\":null,\"children\":[{\"id\":\"3\",\"name\":\"交易查询\",\"code\":\"trade-1\",\"pid\":\"2\",\"children\":[{\"id\":\"4\",\"name\":\"交易查询-查询操作\",\"code\":\"trade-1-1\",\"pid\":\"3\"}]}]}]\n * \n * findTreeNodes(menus, item=>item.name.indexOf('管理') > -1);\n * // [{\"id\":\"2\",\"name\":\"交易管理\",\"code\":\"trade\",\"pid\":null,\"children\":[{\"id\":\"3\",\"name\":\"交易查询\",\"code\":\"trade-1\",\"pid\":\"2\",\"children\":[{\"id\":\"4\",\"name\":\"交易查询-查询操作\",\"code\":\"trade-1-1\",\"pid\":\"3\"}]}]},{\"id\":\"5\",\"name\":\"权限管理\",\"code\":\"authorization\",\"pid\":null,\"children\":[{\"id\":\"6\",\"name\":\"角色管理\",\"code\":\"authorization-1\",\"pid\":\"5\"},{\"id\":\"7\",\"name\":\"用户管理\",\"code\":\"authorization-2\",\"pid\":\"5\"}]},{\"id\":\"7\",\"name\":\"用户管理\",\"code\":\"authorization-2\",\"pid\":\"5\"},{\"id\":\"6\",\"name\":\"角色管理\",\"code\":\"authorization-1\",\"pid\":\"5\"}]\n * \n * findTreeNodes(menus, item=>item.id === '1' || item.id === '7');\n * // [{\"id\":\"1\",\"name\":\"首页\",\"code\":\"trade\",\"pid\":null},{\"id\":\"7\",\"name\":\"用户管理\",\"code\":\"authorization-2\",\"pid\":\"5\"}]\n * \n * findTreeNodes(menus, item=>item.id === 'not found');\n * // []\n */\nfunction findTreeNodes(tree, predicate, childrenField = 'children') {\n const stack = [];\n\n /** @type {T[]} */\n let nodes = [];\n\n if (!Array.isArray(tree)) {\n return nodes;\n }\n\n for (const item of tree) {\n stack.push(item);\n\n while (stack.length) {\n /** @type {T} */\n // @ts-ignore\n const temp = stack.pop();\n if (predicate(temp)) {\n nodes.push(temp);\n }\n\n if (isObject(temp)) {\n /** @type {T[]} */\n // @ts-ignore\n const childs = temp[childrenField];\n if (Array.isArray(childs) && childs.length > 0) {\n stack.push(...childs);\n }\n }\n }\n }\n\n return nodes;\n}\n\nexport default findTreeNodes;","import normalizeString from './normalizeString';\n\n/**\n * 格式化银行卡号\n *\n * @static\n * @alias module:Processor.formatBankCard\n * @since 1.1.0\n * @param {string} bankCardNo 要处理的字符串\n * @param {Object} [options] 配置项\n * @param {string} [options.spaceMark=' '] 间隔字符\n * @param {number} [options.length=4] 间隔长度\n * @returns {string} 格式化的银行卡号\n * @example\n *\n * // 19位银行卡\n * formatBankCard('6228480402564890018'); // 6228 4804 0256 4890 018\n *\n * // 16位银行卡\n * formatBankCard('6228480402564890'); // 6228 4804 0256 4890\n *\n * // 脱敏银行卡\n * formatBankCard('6228********890'); // 6228 **** **** 890\n *\n * // 16位银行卡,\"-\"间隔\n * formatBankCard('6228480402564890', {spaceMark: '-'}); // 6228-4804-0256-4890\n *\n */\nfunction formatBankCard(bankCardNo = '', options = {}) {\n // @ts-ignore\n // TODO 下个版本废弃 char\n const { char = ' ', length = 4 } = options;\n const realSpaceMark = 'spaceMark' in options ? options.spaceMark : char;\n\n const reg = new RegExp(`(.{${length}})`, 'g');\n const regChar = new RegExp(`${realSpaceMark}`, 'g');\n\n const realValue = normalizeString(bankCardNo).replace(regChar, '');\n const str = realValue.replace(reg, `$1${realSpaceMark}`);\n\n return realValue.length % length === 0 ? str.substring(0, str.length - 1) : str;\n}\n\nexport default formatBankCard;\n","import normalizeString from './normalizeString';\n\n/**\n * 格式化手机号码\n *\n * @static\n * @alias module:Processor.formatMobile\n * @since 4.5.0\n * @param {string} mobileNo 手机号码\n * @param {object} [options] 配置项\n * @param {string} [options.spaceMark=' '] 间隔字符\n * @returns {string} 格式化后的手机号码\n * @example\n * \n * formatMobile('13345678900'); // 133 4567 8900\n * formatMobile('13345678900', { spaceMark: '-' }); // 133-4567-8900\n *\n * // 脱敏手机号码\n * formatMobile('133****1234'); // 133 **** 1234\n * formatMobile('133****1234', { spaceMark: '-' }); // 133-****-1234\n *\n * // 手机号码位数不够\n * formatMobile('133'); // 133\n * formatMobile('133456'); // 133 456\n * formatMobile('13345678'); // 133 4567 8\n * \n */\nfunction formatMobile(mobileNo, options = {}) {\n // @ts-ignore\n // TODO 下个版本废弃 char\n const { char = ' ' } = options;\n const realSpaceMark = 'spaceMark' in options ? options.spaceMark : char;\n\n const regChar = new RegExp(realSpaceMark, 'g');\n const realValue = normalizeString(mobileNo).replace(regChar, '').substring(0, 11);\n\n if (realValue.length > 7) {\n return realValue.replace(/^(...)(....)/g, `$1${realSpaceMark}$2${realSpaceMark}`);\n }\n if (realValue.length > 3) {\n return realValue.replace(/^(...)/g, `$1${realSpaceMark}`);\n }\n return realValue;\n}\n\nexport default formatMobile;\n","import validatePassword from './validatePassword';\n\n/**\n * 检测值是否符合密码强度\n * <p><strong>注意:该校验只校验是否存在不同字符(大小写字母、数字、特殊符号),不判断长度。</strong></p>\n * <p><i>如果需要更细致的验证,请使用 <a href=\"#.validatePassword\">validatePassword</a></i></p>\n *\n * @see 参考 {@link https://baike.baidu.com/item/ASCII#3|ASCII}\n * @static\n * @alias module:Validator.isPassword\n * @since 1.1.0\n * @requires module:Validator.validatePassword\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {number} [options.level=2] 密码强度 1-包含一种字符 2-包含两种字符 3-包含三种字符。(大写字母、小写字母、数字、特殊字符)\n * @param {boolean} [options.ignoreCase=false] 是否忽略大小写,为 ture 时,大小写字母视为一种字符\n * @param {string} [options.special=\"!@#$%^&*()-=_+[]\\|{},./?<>~\"] 支持的特殊字符\n * @returns {boolean} 值是否符合密码强度\n * @example\n *\n * isPassword('a12345678'); // true\n * \n * // 3级密码强度\n * isPassword('a12345678', {level: 3}); // false\n * isPassword('Aa12345678', {level: 3}); // true\n * \n * // 3级密码强度,大小写字符仅计算1级强度\n * isPassword('Aa12345678', {level: 3, ignoreCase: true}); // false\n * isPassword('_Aa12345678', {level: 3, ignoreCase: true}); // true\n *\n * // 仅支持 数字、字母、特殊字符,其他非法字符如中文字符是校验不通过的\n * isPassword('_Aa一二三45678', {level: 3, ignoreCase: true}); // false\n * isPassword(' _Aa12345678', {level: 3, ignoreCase: true}); // false\n * \n */\nfunction isPassword(value, options = {}) {\n const { level = 2, ignoreCase = false, special = '\\\\x21-\\\\x2F\\\\x3A-\\\\x40\\\\x5B-\\\\x60\\\\x7B-\\\\x7E' } = options;\n\n return validatePassword(value, { level, ignoreCase, special }).validated;\n}\n\nexport default isPassword;\n","/**\n * 检测值是否类似Promise对象\n *\n * @static\n * @alias module:Validator.isPromiseLike\n * @since 3.8.0\n * @param {*} obj 要检测的值\n * @returns {boolean} 是否类似Promise对象\n * @example\n *\n * isPromiseLike([]); // false\n * isPromiseLike({ then: () => { } }); // true\n * isPromiseLike(Promise.resolve()); // true\n * \n */\nfunction isPromiseLike(obj) {\n return obj !== null && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function';\n}\n\nexport default isPromiseLike;\n","import { digitLength, transformEffectiveNumber } from './utils/math.util';\nimport times from './times';\n\n/**\n * 精确减法,支持多个数相减,减数默认为 0 。\n *\n * @static\n * @alias module:Math.minus\n * @since 3.1.0\n * @param {...number|string} nums 相减的数\n * @returns {number} 差\n * @example\n *\n * minus(1, 0.9); // 0.1\n * minus(1, 0.9, 0.02); // 0.08\n * minus(1, 0.9, 0.02, 0.08); // 0\n * \n */\nfunction minus(...nums) {\n let [num1, num2 = 0, ...rest] = nums;\n\n if (rest.length > 0) {\n return minus(minus(num1, num2), ...rest);\n }\n\n num1 = transformEffectiveNumber(num1);\n num2 = transformEffectiveNumber(num2);\n\n // 兼容处理,如果参数包含无效数值时,返回 NaN\n // @ts-ignore\n if (isNaN(num1) || isNaN(num2)) {\n return Number.NaN;\n }\n\n const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));\n return (times(num1, baseNum) - times(num2, baseNum)) / baseNum;\n}\n\nexport default minus;\n","import normalizeString from './normalizeString';\n\n/**\n * 前置补零\n *\n * @static\n * @alias module:Processor.padZero\n * @since 4.7.0\n * @param {string|number} value 要处理的值\n * @param {number} [size=2] 指定字符串长度\n * @returns {string} 用零填充数字到给定长度的字符串\n * @example\n * padZero(5); // 05\n * padZero('5'); // 05\n *\n * padZero(12); // 12\n * padZero('12'); // 12\n *\n * padZero(688); // 688\n * padZero('688'); // 688\n *\n * padZero(688, 5); // 00688\n * padZero('688', 5); // 00688\n * \n */\nfunction padZero(value, size = 2) {\n const str = normalizeString(value);\n const len = str.length;\n\n if (typeof size !== 'number' || size < 0) {\n size = 0;\n }\n\n if (len < size) {\n return '0'.repeat(size - len) + str;\n }\n return str;\n}\n\nexport default padZero;\n","import { digitLength, transformEffectiveNumber } from './utils/math.util';\nimport times from './times';\n\n/**\n * 精确加法,支持多个数相加,加数默认为 0 。\n *\n * @static\n * @alias module:Math.plus\n * @since 3.1.0\n * @param {...number|string} nums 相加的数\n * @returns {number} 总和\n * @example\n *\n * plus(0.1, 0.2); // 0.3\n * plus(0.1, 0.2, 0.3); // 0.6\n * plus(0.1, 0.2, 0.3, 0.4); // 1\n * \n */\nfunction plus(...nums) {\n let [num1, num2 = 0, ...rest] = nums;\n\n if (rest.length > 0) {\n return plus(plus(num1, num2), ...rest);\n }\n\n num1 = transformEffectiveNumber(num1);\n num2 = transformEffectiveNumber(num2);\n\n // 兼容处理,如果参数包含无效数值时,返回 NaN\n // @ts-ignore\n if (isNaN(num1) || isNaN(num2)) {\n return Number.NaN;\n }\n\n const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));\n return (times(num1, baseNum) + times(num2, baseNum)) / baseNum;\n}\n\nexport default plus;\n","import normalizeString from './normalizeString';\n\n/**\n * 替换字符,应用场景如:脱敏\n *\n * @static\n * @alias module:Processor.replaceChar\n * @since 1.1.0\n * @param {string} str 要处理的字符串\n * @param {Object} [options] 配置项\n * @param {number} [options.start=3] 开始位置\n * @param {number} [options.end=-4] 结束位置\n * @param {string} [options.char=\"*\"] 替换字符\n * @param {number} [options.repeat] 替换字符的重复次数,默认为替换内容长度,可设置为固定值\n * @param {string} [options.exclude] 排除字符,如果指定排除项,repeat设置无效\n * @returns {string} 处理后的字符\n * @example\n *\n * // 手机号\n * replaceChar('13000000000'); // 130****0000\n *\n * // 身份证\n * replaceChar('130701199310302288'); // 130***********2288\n *\n * // 邮箱\n * const email = '12345@qq.com'\n * replaceChar(email, {start: 2, end: email.indexOf('@'), repeat: 4}); // 12****@qq.com\n *\n * // 银行卡号\n * replaceChar('6228480402564890018', {start: 0, end: -4, repeat: 4}); // ****0018\n *\n * // 带格式的银行卡号,忽略空字符串\n * replaceChar('6228 4804 0256 4890 018', {start: 4, end: -4, exclude: ' '}); // 6228 **** **** **** 018\n *\n * // 用户名\n * replaceChar('林某某', {start: 1, end: Infinity, repeat: 2}); // 林**\n * replaceChar('林某', {start: 1, end: Infinity, repeat: 2}); // 林**\n * replaceChar('林某某某', {start: 1, end: Infinity, repeat: 2}); // 林**\n *\n */\nfunction replaceChar(str, options = {}) {\n const { char = '*', exclude } = options;\n let { start = 3, end = -4, repeat } = options;\n\n const realStr = normalizeString(str);\n const strLen = realStr.length;\n\n // 开始位置超过str长度\n if (Math.abs(start) >= strLen) {\n return realStr;\n }\n\n start = start >= 0 ? start : strLen + start;\n end = end >= 0 ? end : strLen + end;\n\n // 开始位置大于结束位置\n if (start >= end) {\n return realStr;\n }\n\n let middleStr = realStr.substring(start, end);\n\n if (exclude) {\n const reg = new RegExp(`[^${exclude}]`, 'g');\n middleStr = middleStr.replace(reg, char);\n } else {\n repeat = typeof repeat === 'number' && repeat >= 0 ? repeat : middleStr.length;\n middleStr = char.repeat(repeat);\n }\n\n return realStr.substring(0, start) + middleStr + realStr.substring(end);\n}\n\nexport default replaceChar;\n","import divide from './divide';\nimport times from './times';\nimport { transformEffectiveNumber } from './utils/math.util';\n\n/**\n * 四舍五入,支持设置精度\n *\n * @static\n * @alias module:Math.round\n * @since 3.1.0\n * @param {number|string} num 要四舍五入的数字\n * @param {number} [precision=0] 四舍五入的精度\n * @returns {number} 四舍五入的数字\n * @example\n *\n * round(4.006); // 4\n * round(4.006, 2); // 4.01\n * round(4060, -2); // 4100\n * \n */\nfunction round(num, precision = 0) {\n num = transformEffectiveNumber(num);\n\n // 兼容处理,如果参数包含无效数值时,返回 NaN\n // @ts-ignore\n if (isNaN(num)) {\n return Number.NaN;\n }\n\n const base = Math.pow(10, precision);\n return divide(Math.round(times(num, base)), base);\n}\n\nexport default round;\n","import isNil from './utils/type/isNil';\n\n// TODO: 函数重载,类型参照 Date\n\n/**\n * 创建一个 Date 实例日期对象,同 new Date() 。<br/>\n * 规避了苹果设备浏览器不支持部分格式(YYYY-MM-DD HH-mm 或 YYYY.MM.DD)。\n *\n * @static\n * @alias module:Processor.safeDate\n * @see 参考 {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date|Date}\n * @since 4.4.0\n * @param {string|number|Date} [value] 日期时间字符串、毫秒数、日期对象\n * @param {...number} args 月/日/时/分/秒/毫秒\n * @returns {Date} Date 实例日期对象\n * @example\n * \n * safeDate('2022-1-1'); // Sat Jan 01 2022 00:00:00 GMT+0800 (中国标准时间)\n * safeDate('2022/1/1'); // Sat Jan 01 2022 00:00:00 GMT+0800 (中国标准时间)\n * safeDate('2022.1.1'); // Sat Jan 01 2022 00:00:00 GMT+0800 (中国标准时间)\n * safeDate('2022.1.1 11:11'); // Sat Jan 01 2022 11:11:00 GMT+0800 (中国标准时间)\n * safeDate(99, 1); // Mon Feb 01 1999 00:00:00 GMT+0800 (中国标准时间)\n * safeDate(1646711233171); // Tue Mar 08 2022 11:47:13 GMT+0800 (中国标准时间)\n * \n *\n */\nfunction safeDate(value, ...args) {\n const safeValue = typeof value === 'string' ? value.replace(/[\\\\.-]/g, '/') : value;\n\n if (args && args.length > 0) {\n // @ts-ignore\n return new Date(safeValue, ...args);\n }\n\n // @ts-ignore\n return isNil(safeValue) ? new Date() : new Date(safeValue);\n}\n\nexport default safeDate;\n","/**\n * 设置 DataURL 前缀、MIME 类型、base64 标识。<br/>\n * 如果你需要获取DataURL 的 MIME 类型和数据本身,推荐使用 <a href=\"https://www.npmjs.com/package/data-urls\">data-urls</a>。\n *\n * @static\n * @alias module:Processor.setDataURLPrefix\n * @see 参考 {@link https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Data_URIs|Data URLs}\n * @see 参考 {@link https://mimesniff.spec.whatwg.org/#understanding-mime-types|MIME types}\n * @since 4.1.0\n * @param {string} data 数据本身\n * @param {string} [mimetype=\"image/png\"] MIME 类型\n * @param {boolean} [base64=true] 添加 base64 标识\n * @returns {string} DataURL 格式的字符串\n * @example\n * \n * const data = 'PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=';\n * setDataURLPrefix(data); // data:image/png;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=\n * setDataURLPrefix(data, 'image/png', false); // data:image/png,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=\n * setDataURLPrefix(data, 'image/jpg'); // data:image/jpg;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=\n * setDataURLPrefix(data, 'text/html'); // data:text/html;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=\n * setDataURLPrefix(data, ''); // data:;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=\n * setDataURLPrefix(data, '', false); // data:,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=\n * \n */\nfunction setDataURLPrefix(data, mimetype = 'image/png', base64 = true) {\n return `data:${mimetype}${base64 ? ';base64' : ''},${data}`;\n}\n\nexport default setDataURLPrefix;\n","import normalizeString from './normalizeString';\n\n/**\n * 获取字符长度。中文汉字占2个字符,英文占1个字符,特殊如emoji占4个字符。\n *\n * @static\n * @alias module:Other.strlen\n * @since 4.10.0\n * @param {string} str 字符串\n * @returns {number} 字符长度\n * @example\n *\n * strlen('你好a'); // 5\n * strlen('你好,世界!'); // 12\n * strlen('严両丞丽'); // 8\n * strlen('abcde'); // 5\n * strlen('𠮷'); // 4\n * strlen('🍎'); // 4\n *\n */\nfunction strlen(str) {\n const realStr = normalizeString(str);\n let len = 0;\n for (let i = 0; i < realStr.length; i++) {\n const c = realStr.charCodeAt(i);\n if ((c >= 0x0001 && c <= 0x007e) || (0xff60 <= c && c <= 0xff9f)) {\n len++;\n } else {\n len += 2;\n }\n }\n return len;\n}\n\nexport default strlen;\n","// 修改类型,请同步到 transformFieldNames.type.js\n// 修改文档,请同步到 transformFieldNames.doc.js\n\nimport { isObject } from './utils/type';\n\n/**\n * 转换字段名,返回一个转换字段后的值,不改变原值。\n * \n * @static\n * @alias module:Processor.transformFieldNames\n * @since 4.14.0\n * @template {*} D\n * @template {Record<string, keyof D>} F\n * @template {string} C\n * @param {D[]} data 对象数组。如果是树结构数据,需要指定第三个参数 childrenField\n * @param {F} fieldNames 字段名映射\n * @param {C} [childrenField] 子级数据字段名\n * @param {'spread'|'self'} [nodeAssign='spread'] 节点赋值方式。spread表示使用展开运算符创建新值,self表示使用自身对象。\n * @returns {import('./transformFieldNames.type.js').TransformFieldNames<D, F, C>}\n * @example\n * \n * const options = [{code: '1', name: 'one'},{code:'2', name:'two'}];\n * const newOptions = transformFieldNames(options, {label: 'name', value: 'code'});\n * // [{value: '1', label: 'one'},{value:'2', label:'two'}]\n * \n * // 嵌套数据,指定子级字段名 children\n * const options2 = [{code: '1', name: 'one'},{code:'2', name:'two', children: [{code:'2-1', name:'two-one', children: [{code: '2-1-1', name:'two-one-one'}]}]}];\n * const newOptions2 = transformFieldNames(options2, {label: 'name', value: 'code'}, 'children');\n * // [{value: '1', label: 'one'},{value:'2', label:'two', children: [{value: '2-1', label:'two-one', children: [{value: '2-1-1', label:'two-one-one'}]}]}]\n * \n * const options3 = [{code: '1', name: 'one'},{code:'2', name:'two', childs: [{code:'2-1', name:'two-one'}]}];\n * const newOptions3 = transformFieldNames(options3, {label: 'name', value: 'code'}, 'childs');\n * // [{value: '1', label: 'one'},{value:'2', label:'two', childs: [{value: '2-1', label:'two-one'}]}]\n * \n * // 嵌套数据,并替换子集字段名\n * const newOptions4 = transformFieldNames(options3, {label: 'name', value: 'code', children: 'childs'}, 'childs');\n * // [{value: '1', label: 'one'},{value:'2', label:'two', children: [{value: '2-1', label:'two-one'}]}]\n */\nfunction transformFieldNames(data, fieldNames, childrenField, nodeAssign = 'spread') {\n if (!Array.isArray(data)) {\n return data;\n }\n\n if (data.length <= 0) {\n // @ts-ignore\n return [];\n }\n\n /**\n * 递归处理字段名\n * \n * @param {Array.<object>} arr 列表数据\n * @returns {*}\n */\n function recusion(arr) {\n return arr.map(item => {\n if (!isObject(item)) {\n return item;\n }\n\n const newItem = nodeAssign === 'spread' ? { ...item } : item;\n /** @type {Array.<string>} */\n const delKeys = [];\n\n // 树形数据子节点\n // @ts-ignore\n if (childrenField && Array.isArray(newItem[childrenField]) && newItem[childrenField].length > 0) {\n // @ts-ignore\n newItem[childrenField] = recusion(newItem[childrenField].slice());\n }\n\n // 替换字段名\n Object.keys(fieldNames).forEach(newKey => {\n const oldKey = fieldNames[newKey];\n if (oldKey in newItem) {\n // @ts-ignore\n newItem[newKey] = newItem[oldKey];\n // @ts-ignore\n delKeys.push(oldKey);\n }\n });\n\n // 删除旧字段\n if (delKeys.length > 0) {\n delKeys.forEach(delKey => {\n // @ts-ignore\n delete newItem[delKey];\n });\n }\n\n return newItem;\n });\n }\n\n // @ts-ignore\n return recusion(data.slice());\n}\n\nexport default transformFieldNames;","import { isObject } from \"./utils/type\";\n\n/**\n * 树结构转列表数据\n * \n * @static\n * @alias module:Processor.treeToList\n * @since 4.14.0\n * @template {Record<string,any>} T\n * @template {keyof T} K\n * @template {Omit<T, K>} R\n * @param {T[]} tree 列表数据\n * @param {K} childrenField 子级字段名称\n * @returns {R[]} 列表数据\n * @example\n * const menus = [{ \"id\": \"1\", \"name\": \"首页\", \"code\": \"trade\", \"pid\": null }, { \"id\": \"2\", \"name\": \"交易管理\", \"code\": \"trade\", \"pid\": null, \"children\": [{ \"id\": \"3\", \"name\": \"交易查询\", \"code\": \"trade-1\", \"pid\": \"2\", \"children\": [{ \"id\": \"4\", \"name\": \"交易查询-查询操作\", \"code\": \"trade-1-1\", \"pid\": \"3\" }] }] }, { \"id\": \"5\", \"name\": \"权限管理\", \"code\": \"authorization\", \"pid\": null, \"children\": [{ \"id\": \"6\", \"name\": \"角色管理\", \"code\": \"authorization-1\", \"pid\": \"5\" }, { \"id\": \"7\", \"name\": \"用户管理\", \"code\": \"authorization-2\", \"pid\": \"5\" }] }];\n * \n * treeToList(menus, 'children'));\n * // [{\"id\":\"1\",\"name\":\"首页\",\"code\":\"trade\",\"pid\":null},{\"id\":\"2\",\"name\":\"交易管理\",\"code\":\"trade\",\"pid\":null},{\"id\":\"3\",\"name\":\"交易查询\",\"code\":\"trade-1\",\"pid\":\"2\"},{\"id\":\"4\",\"name\":\"交易查询-查询操作\",\"code\":\"trade-1-1\",\"pid\":\"3\"},{\"id\":\"5\",\"name\":\"权限管理\",\"code\":\"authorization\",\"pid\":null},{\"id\":\"6\",\"name\":\"角色管理\",\"code\":\"authorization-1\",\"pid\":\"5\"},{\"id\":\"7\",\"name\":\"用户管理\",\"code\":\"authorization-2\",\"pid\":\"5\"}]\n */\nfunction treeToList(tree, childrenField) {\n /** @type {R[]} */\n const list = [];\n\n if (!Array.isArray(tree)) {\n return list;\n }\n\n /**\n * 递归遍历\n * @param {T[]} arr 列表数据\n */\n function recusion(arr) {\n arr.forEach(item => {\n if (isObject(item)) {\n const newItem = { ...item };\n // @ts-ignore\n list.push(newItem);\n\n if (newItem[childrenField]) {\n if (Array.isArray(newItem[childrenField]) && newItem[childrenField].length > 0) {\n recusion(newItem[childrenField]);\n }\n delete newItem[childrenField];\n }\n } else {\n // @ts-ignore\n list.push(item);\n }\n });\n }\n\n recusion(tree);\n return list;\n}\n\n// function treeToList(tree, childrenField) {\n// /** @type {R[]} */\n// const list = [];\n\n// // 深度优先\n// /** @type {T[]} */\n// const stack = [];\n// for (const item of tree) {\n// if (isObject(item)) {\n// stack.push(item);\n\n// while (stack.length) {\n// /** @type {T} */\n// // @ts-ignore\n// const temp = stack.shift();\n\n// // @ts-ignore\n// list.push(temp);\n\n// if (temp[childrenField]) {\n// if (Array.isArray(temp[childrenField]) && temp[childrenField].length > 0) {\n// stack.push(...temp[childrenField]);\n// }\n// delete temp[childrenField];\n// }\n// }\n// } else {\n// // @ts-ignore\n// list.push(item);\n// }\n// }\n// return list;\n// }\n\nexport default treeToList;","/**\n * 等待时间返回 Promise 。常用于异步方法中延时。\n *\n * @static\n * @alias module:Other.waitTime\n * @since 4.2.0\n * @param {number} [time=1000] 延时时间,单位毫秒\n * @returns {Promise<void>}\n * @example\n * \n * const test = async ()=>{\n * await waitTime();\n * // do something\n * }\n *\n * waitTime(500).then(()=>{\n * // do something\n * });\n * \n */\nfunction waitTime(time = 1000) {\n return new Promise((resolve) => {\n setTimeout(resolve, time);\n });\n}\n\nexport default waitTime;\n"],"names":["isNil","value","isUndefined","isNull","toString","Object","prototype","isType","typename","call","concat","isString","normalizeString","String","convertToString","reg","regIdCard","check","id","index","sum","num","Math","pow","Number","toUpperCase","regLoose","sumCheckCode","numStr","numArr","replace","split","reverse","i","length","currNum","parseInt","mod","baseReg","baseCodeArr","preCode","total","_loop","findIndex","item","wf","remainder","config","disableWarning","devWarn","_console","console","warn","apply","arguments","regNumber","regLowerCaseLetter","regUpperCaseLetter","regAllNumberAndLetter","hasNumber","val","test","hasLowerCaseLetter","hasUpperCaseLetter","hasHex","indexOf","hasSpecialCharacter","chars","specialChars","regChars","RegExp","ret","some","charItem","hasUnallowableCharacter","validatePassword","options","undefined","level","_options$level","_options$ignoreCase","ignoreCase","_options$special","special","valStr","currentLevel","containesNumber","containesLowerCaseLetter","containesUpperCaseLetter","containesSpecialCharacter","containesUnallowableCharacter","validated","containes","number","lowerCaseLetter","upperCaseLetter","specialCharacter","unallowableCharacter","chineseDictionary","looseChineseRegExp","chineseRegExp","chineseWithExtend","looseChineseExtendRegExp","chineseExtendRegExp","supportRegExpUnicode","hasOwnProperty","serverReg","portReg","pathReg","searchReg","regWithProtocal","protocalReg","regNonProtocal","pj","j","sj10","regHMCard","regTWCard","singleRegTWCard","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","isObject","type","_isNaN","isNaN","transformEffectiveNumber","trim","NaN","isSymbol","isNumber","isScientificNumber","strip","precision","parseFloat","toPrecision","digitLength","eSplit","len","float2Fixed","strNum","dLen","checkBoundary","trimLeftZero","result","exec","scientificToNumber","parts","toLowerCase","e","pop","l","abs","sign","coeff_array","intVal","thanLen","dec","slice","zero","Array","join","substring","checkNumber","formatInt","intStr","thousand","txt","negativeSymbol","reArr","formatDec","decStr","decimal","toFixed","formatMoney$1","_options$precision","symbol","_options$thousand","_options$decimal","_strNum$split","_strNum$split2","_slicedToArray","numberChar","unitChar","unitSection","chnNumberChar","chnUnitChar","big5NumberChar","big5UnitChar","sectionToChinese","section","str","chnstr","unitPos","v","floor","convertInteger","numInt","strIns","chnStr","needZero","convertDecimal","decimalStr","mapNumberChar","province","city","area","year","month","day","gender","Provinces","processEmptyChildren","arr","_ref$childrenField","_ref","childrenField","_ref$emptyChildrenVal","emptyChildrenValue","forEach","times","_len","nums","_key","num1","_nums$","num2","rest","num1Changed","num2Changed","baseNum","leftValue","divide","letterChars","defaultChars","internalRandomString","optionalChars","prefix","r","random","internalFindTreeSelect","tree","predicate","path","isArray","_step","_iterator","_createForOfIteratorHelper","s","n","done","push","childs","findChildren","err","f","blob","Promise","resolve","reject","reader","FileReader","readAsDataURL","onload","onerror","error","bytes","spaceMark","_options$spaceMark","numBytes","k","sizes","log","prevPos","prevCtrlValue","rawValue","ctrlValue","placeholderChar","_options$placeholderC","_options$maskReg","maskReg","realCtrlValue","realRawValue","placeholderChars","editLength","isAddition","pos","additionStr","ctrlCharCount","placeholderCharCount","charAt","dataurl","mime","match","bstr","atob","u8arr","Uint8Array","charCodeAt","Blob","filterTree","nodeAssign","newItem","node","stack","temp","_toConsumableArray","nodes","bankCardNo","_options$char","char","_options$length","realSpaceMark","regChar","realValue","mobileNo","loose","_options$loose","_options$luhn","luhn","valueStr","validateResult","precode","checkCode","_options$checkCode","cc","needCheckCode","passBaseRule","lastCode","_options$useExtend","useExtend","basicRegExp","extendRegExp","hasExtend","resultRegExp","flag","obj","_typeof","then","list","_ref2$keyField","_ref2","keyField","_ref2$parentField","parentField","_ref2$childrenField","_ref2$emptyChildrenVa","_ref2$nodeAssign","record","pid","minus","max","big5","_options$big","_options$unit","unit","_options$zero","_options$negative","negative","_options$unitConfig","unitConfig","unitWan","w","unitYi","y","unitWanYi","chnInteger","chnDecimal","preStr","numAbs","size","repeat","origin","groups","find","birthday","plus","realChars","exclude","start","_options$start","_options$end","end","realStr","strLen","middleStr","base","round","safeValue","args","_construct","Date","data","mimetype","base64","bool","c","fieldNames","recusion","map","delKeys","keys","newKey","oldKey","delKey","time","setTimeout"],"mappings":"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"}
1
+ {"version":3,"file":"util-helpers.min.js","sources":["../src/utils/type/isType.js","../src/utils/type/isString.js","../src/normalizeString.js","../src/utils/type/isNil.js","../src/utils/type/isUndefined.js","../src/utils/type/isNull.js","../src/utils/convertToString.js","../src/isMobile.js","../src/isTelephone.js","../src/isPostcode.js","../src/isIdCard.js","../src/isEmail.js","../src/isQQ.js","../src/isWX.js","../src/isVehicle.js","../src/isBankCard.js","../src/isSocialCreditCode.js","../src/utils/config.js","../src/utils/devWarn.js","../src/validatePassword.js","../src/isPassport.js","../src/isChinese.js","../src/isIPv4.js","../src/isIPv6.js","../src/isUrl.js","../src/isBusinessLicense.js","../src/isHMCard.js","../src/isTWCard.js","../src/isSwiftCode.js","../src/utils/constants.js","../src/utils/type/isBlob.js","../src/utils/type/isObject.js","../src/utils/type/isNaN.js","../src/utils/math.util.js","../src/utils/type/isSymbol.js","../src/utils/type/isNumber.js","../src/formatMoney.js","../src/numberToChinese.js","../src/parseIdCard.js","../src/fileReader.js","../src/dataURLToBlob.js","../src/times.js","../src/divide.js","../src/ajax.js","../src/download.js","../src/randomString.js","../src/listToTree.js","../src/findTreeSelect.js","../src/blobToDataURL.js","../src/bytesToSize.js","../src/calculateCursorPosition.js","../src/filterTree.js","../src/findTreeNode.js","../src/findTreeNodes.js","../src/formatBankCard.js","../src/formatMobile.js","../src/isPassword.js","../src/isPromiseLike.js","../src/minus.js","../src/padZero.js","../src/plus.js","../src/replaceChar.js","../src/round.js","../src/safeDate.js","../src/setDataURLPrefix.js","../src/strlen.js","../src/transformFieldNames.js","../src/treeToList.js","../src/waitTime.js"],"sourcesContent":["const toString = Object.prototype.toString;\n\n/**\n * 检测值的 `toString` 类型\n *\n * @private\n * @since 1.1.0\n * @param {*} value 检查值\n * @param {string} typename 类型名称\n * @returns {boolean} 返回值的 `toString` 类型是否匹配\n */\nfunction isType(value, typename) {\n return toString.call(value) === `[object ${typename}]`;\n}\n\nexport default isType;\n","import isType from './isType';\n\n/**\n * 检查值是否为String\n *\n * @static\n * @alias module:Type.isString\n * @since 1.1.0\n * @param {*} value 检查值\n * @returns {boolean} 是否为String\n * @example\n *\n * isString('abc')\n * // => true\n *\n * isString(1)\n * // => false\n */\nfunction isString(value) {\n return isType(value, 'String');\n}\n\nexport default isString;\n","import isNil from './utils/type/isNil';\nimport convertToString from './utils/convertToString';\n\n/**\n * 规整化字符串。如果值为 undefined 或 null 将转为空字符串,如果值不是字符串类型将转为字符串。\n *\n * @static\n * @alias module:Processor.normalizeString\n * @see 参考 {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String#string_instances|String}\n * @since 4.3.0\n * @param {*} value 待处理的值\n * @returns {string} 规整化的值\n * @example\n * \n * normalizeString(); // ''\n * normalizeString(undefined); // ''\n * normalizeString(void 0); // ''\n * normalizeString(null); // ''\n *\n * normalizeString(true); // 'true'\n * normalizeString(NaN); // 'NaN'\n * normalizeString(1); // '1'\n * normalizeString('a'); // 'a'\n * \n */\nfunction normalizeString(value) {\n if (isNil(value)) {\n return '';\n }\n return convertToString(value);\n}\n\nexport default normalizeString;\n","import isUndefined from './isUndefined';\nimport isNull from './isNull';\n\n/**\n * 检查值是否为 undefined 或 null\n *\n * @static\n * @alias module:Type.isNaN\n * @since 4.3.0\n * @param {*} value 检查值\n * @returns {boolean} 是否为 undefined 或 null\n */\nfunction isNil(value) {\n return isUndefined(value) || isNull(value);\n}\n\nexport default isNil;\n","/**\n * 检查值是否为Undefined\n *\n * @static\n * @alias module:Type.isUndefined\n * @since 1.1.0\n * @param {*} value 检查值\n * @returns {boolean} 是否为Undefined\n * @example\n *\n * isUndefined(undefined)\n * // => true\n *\n * isUndefined(void 0)\n * // => true\n *\n * isUndefined(null)\n * // => false\n */\nfunction isUndefined(value) {\n return value === void 0;\n}\n\nexport default isUndefined;\n","/**\n * 检查值是否为Null\n *\n * @static\n * @alias module:Type.isNull\n * @since 1.1.0\n * @param {*} value 检查值\n * @returns {boolean} 是否为Null\n * @example\n *\n * isNull(null)\n * // => true\n *\n * isNull(void 0)\n * // => false\n */\nfunction isNull(value) {\n return value === null;\n}\n\nexport default isNull;\n","import isString from './type/isString';\n\n/**\n * 转换为字符串\n *\n * @param {*} value 值\n * @returns {string} 字符串\n */\nfunction convertToString(value) {\n return isString(value) ? value : String(value);\n}\n\nexport default convertToString;\n","import normalizeString from './normalizeString';\n\n// 手机号码 11位数字,以1开头,第二位是3456789其中一个,后面再加9个数字\nconst reg = /^1[3456789]\\d{9}$/;\n\n/**\n * 检测值是否为手机号码\n *\n * @static\n * @alias module:Validator.isMobile\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为手机号码\n * @example\n *\n * isMobile('13000000000'); // true\n * isMobile('13000'); // false\n *\n */\nfunction isMobile(value) {\n const valueStr = normalizeString(value);\n return reg.test(valueStr);\n}\n\nexport default isMobile;\n","import normalizeString from './normalizeString';\n\n// 固定电话 支持区号和分机号 3~4位区号,以0开头;7~8位直播号,以2~9开头;1~6位分机号\nconst reg = /^(0\\d{2,3}\\-)?([2-9]\\d{6,7})(\\-\\d{1,6})?$/;\n\n/**\n * 检测值是否为固定电话\n *\n * @static\n * @alias module:Validator.isTelephone\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为固定电话\n * @example\n *\n * isTelephone('22033212'); // true\n * isTelephone('13000000000'); // false\n * \n * // 含区号\n * isTelephone('021-22033212'); // true\n *\n * // 含区号和分机号\n * isTelephone('021-22033212-123'); // true\n *\n */\nfunction isTelephone(value) {\n const valueStr = normalizeString(value);\n return reg.test(valueStr);\n}\n\nexport default isTelephone;\n","import normalizeString from './normalizeString';\n\n// 邮政编码\nconst reg = /^\\d{6}$/;\n\n/**\n * 检测值是否为邮政编码,6位数字\n *\n * @static\n * @alias module:Validator.isPostcode\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为邮政编码\n * @example\n *\n * isPostcode('101111'); // true\n * isPostcode('123'); // false\n *\n */\nfunction isPostcode(value) {\n const valueStr = normalizeString(value);\n return reg.test(valueStr);\n}\n\nexport default isPostcode;\n","import normalizeString from './normalizeString';\n\n// 身份证号正则\nconst regIdCard = /^[1-9]\\d{5}(19|20)?\\d{2}((0[1-9])|(1[012]))(([0-2][1-9])|10|20|30|31)\\d{3}(\\d|X)?$/i;\n\n/**\n * 校验码计算\n *\n * @private\n * @param {string} id 身份证号码\n * @returns {boolean} 校验码是否正确\n */\nfunction check(id) {\n let index, sum, num;\n for (sum = index = 0; index < 17; index++) {\n sum += (Math.pow(2, 17 - index) % 11) * Number(id[index]);\n }\n num = (12 - (sum % 11)) % 11;\n if (num < 10) {\n return num === Number(id[17]);\n } else {\n return id[17].toUpperCase() === 'X';\n }\n}\n\n/**\n * 检测值是否为18位身份证号码。<br/>宽松模式下,支持15位身份证号码\n *\n * @static\n * @alias module:Validator.isIdCard\n * @since 1.1.0\n * @see 参考 {@link https://zh.wikipedia.org/wiki/中华人民共和国公民身份号码|中华人民共和国公民身份号码}\n * @see 参考 {@link https://baike.baidu.com/item/居民身份证号码|居民身份证号码}\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.loose=false] 宽松模式,支持15位身份证号码\n * @param {boolean} [options.checkCode=true] 是否校验最后一位校验码,仅支持18位身份证号码\n * @returns {boolean} 值是否为身份证号\n * @example\n *\n * isIdCard('130701199310302288'); // true\n * isIdCard('13070119931030228X'); // false\n *\n * // 不校验校验码\n * isIdCard('13070119931030228X', { checkCode: false }); // true\n *\n * // 默认不支持15位身份证号码\n * isIdCard('320311770706001'); // false\n * \n * // 宽松模式,支持15位身份证号\n * isIdCard('320311770706001', { loose: true }); // true\n *\n */\nfunction isIdCard(value, options = {}) {\n const { loose = false, checkCode = true } = options;\n\n const valueStr = normalizeString(value);\n if (valueStr.length === 15 && loose) {\n return regIdCard.test(valueStr);\n }\n\n if (valueStr.length === 18 && regIdCard.test(valueStr)) {\n if (checkCode) {\n return check(valueStr);\n }\n return true;\n }\n\n return false;\n}\n\nexport default isIdCard;\n","import normalizeString from './normalizeString';\n\n// 邮箱\nconst reg = /^[\\da-z]+([\\-\\.\\_]?[\\da-z]+)*@[\\da-z]+([\\-\\.]?[\\da-z]+)*(\\.[a-z]{2,})+$/i;\n\n/**\n * 检测值是否为Email\n *\n * @static\n * @alias module:Validator.isEmail\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为Email\n * @example\n *\n * isEmail('1232@qq.com'); // true\n * isEmail('123@'); // false\n *\n */\nfunction isEmail(value) {\n const valueStr = normalizeString(value);\n return reg.test(valueStr);\n}\n\nexport default isEmail;\n","import normalizeString from './normalizeString';\n\n// QQ号正则\nconst reg = /^[1-9]\\d{4,10}$/;\n\n/**\n * 检测值是否为QQ号,非0开头,5至11位数字\n *\n * @static\n * @alias module:Validator.isQQ\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为QQ号\n * @example\n *\n * isQQ('12345'); // true\n * isQQ('123'); // false\n *\n */\nfunction isQQ(value) {\n const valueStr = normalizeString(value);\n return reg.test(valueStr);\n}\n\nexport default isQQ;\n","import normalizeString from './normalizeString';\n\n// 微信号 6至20位,以字母开头,字母,数字,减号(连接符),下划线\nconst reg = /^[a-z]([-_a-z0-9]{5,19})+$/i;\n\n/**\n * 检测值是否为微信号\n *\n * @static\n * @alias module:Validator.isWX\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为微信号\n * @example\n *\n * isWX('a12345'); // true\n * isWX('123'); // false\n *\n */\nfunction isWX(value) {\n const valueStr = normalizeString(value);\n return reg.test(valueStr);\n}\n\nexport default isWX;\n","import normalizeString from './normalizeString';\n\n// 车牌号正则\nconst reg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([A-Z0-9]{4}[A-Z0-9挂学警港澳]{1})|([A-Z0-9]{5}[DF])|([DF][A-Z0-9]{5}))$/;\n\n/**\n * 检测值是否为车牌号,支持新能源和非新能源车牌\n *\n * @static\n * @alias module:Validator.isVehicle\n * @see 参考 {@link https://baike.baidu.com/item/车牌号|车牌号}\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为车牌号\n * @example\n *\n * isVehicle('京L12345'); // true\n * isVehicle('京L1234学'); // true\n * isVehicle('BL1234警'); // true\n * \n * // 新能源车牌\n * isVehicle('粤BD12345'); // true\n * isVehicle('粤BF12345'); // true\n * isVehicle('粤B12345D'); // true\n * isVehicle('粤B12345F'); // true\n *\n */\nfunction isVehicle(value) {\n const valueStr = normalizeString(value);\n return reg.test(valueStr);\n}\n\nexport default isVehicle;\n","import normalizeString from './normalizeString';\n\n// 非0开头,10~21位数字\nconst reg = /^[1-9]\\d{9,20}$/;\n\n// 8~30位数字\nconst regLoose = /^\\d{8,30}$/;\n\n/**\n * luhn 计算校验位\n * @private\n * @param {string} numStr 银行卡前面数字\n * @returns {number}\n */\nfunction sumCheckCode(numStr) {\n const numArr = (numStr + '').replace(/\\D/g, '').split('').reverse();\n\n let sum = 0;\n for (let i = 0; i < numArr.length; i++) {\n const currNum = parseInt(numArr[i]);\n sum += i % 2 === 0 ? currNum * 2 - (currNum > 4 ? 9 : 0) : currNum;\n }\n const mod = sum % 10;\n return mod !== 0 ? 10 - mod : 0;\n}\n\n/**\n * 检测值是否为银行卡号。正常模式(非0开头,10~21位数字)宽松模式(8~30位数字)\n *\n * @static\n * @alias module:Validator.isBankCard\n * @see 参考 {@link https://kf.qq.com/faq/170112ABnm6b170112FvquAn.html|常用银行账号位数参考}\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.loose=false] 宽松模式,8~30位数字\n * @param {boolean} [options.luhn=false] 使用 Luhn 算法校验校验码\n * @returns {boolean} 值是否为银行卡号\n * @example\n *\n * isBankCard('6228480402564890018'); // true\n * isBankCard('6228480402564890'); // true\n * isBankCard('123456789'); // false\n * \n * // 宽松模式\n * isBankCard('123456789', { loose: true }); // true\n *\n */\nfunction isBankCard(value, options = {}) {\n const { loose = false, luhn = false } = options;\n\n const valueStr = normalizeString(value);\n const validateResult = loose ? regLoose.test(valueStr) : reg.test(valueStr);\n\n if (validateResult && luhn) {\n const precode = valueStr.substring(0, valueStr.length - 1);\n const checkCode = valueStr[valueStr.length - 1];\n return checkCode === String(sumCheckCode(precode));\n }\n return validateResult;\n}\n\nexport default isBankCard;\n","import normalizeString from './normalizeString';\n\n// 基础规则,由18位数字和大写字母组成,不使用I、O、Z、S、V。\nconst baseReg = /^[\\dA-HJ-NPQRTUWXY]{2}\\d{6}[\\dA-HJ-NPQRTUWXY]{10}$/;\n\n// 基础字符组成\nconst baseCodeArr = '0123456789ABCDEFGHJKLMNPQRTUWXY'.split('');\n\n/**\n * 计算校验码\n *\n * @private\n * @since 1.1.0\n * @param {string} preCode 统一代码前17位\n * @returns {string} 校验码\n */\nfunction sumCheckCode(preCode) {\n let total = 0;\n\n // 计算字符位置对应序号和加权因子的乘积,总和\n for (let i = 0; i < 17; i++) {\n // 字符位置对应的基础编码序号\n const index = baseCodeArr.findIndex((item) => item === preCode[i]);\n // 加权因子\n const wf = Math.pow(3, i) % 31;\n // 计算序号和加权因子的乘积,并计算级数之和\n total += index * wf;\n }\n\n // 计算整数求余函数MOD\n const remainder = total % 31;\n // 校验码字符值序号\n const checkCodeIndex = remainder !== 0 ? 31 - remainder : 0;\n\n return baseCodeArr[checkCodeIndex];\n}\n\n/**\n * 检测值是否为统一社会信用代码,也叫三证合一组织代码。由18位数字和大写字母组成,不使用I、O、Z、S、V。\n *\n * @static\n * @alias module:Validator.isSocialCreditCode\n * @see 参考 {@link https://zh.wikisource.org/zh-hans/GB_32100-2015_法人和其他组织统一社会信用代码编码规则|GB 32100-2015 法人和其他组织统一社会信用代码编码规则}\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.checkCode=true] 是否校验最后一位校验码,如果为false,不校验校验位。\n * @returns {boolean} 值是否为统一社会信用代码\n * @example\n *\n * isSocialCreditCode('91350100M000100Y43'); // true\n * isSocialCreditCode('91350100M000100Y4A'); // false\n *\n * // 不校验校验位,长度和类型还是有校验的\n * isSocialCreditCode('91350100M000100Y4A', { checkCode: false }); // true\n * isSocialCreditCode('91350100M000100YIO', { checkCode: false }); // false\n * isSocialCreditCode('91350100M000100Y', { checkCode: false }); // false\n *\n */\nfunction isSocialCreditCode(value, options = {}) {\n const valueStr = normalizeString(value);\n // @ts-ignore\n // TODO 下个版本废弃 loose\n const { loose = false, checkCode: cc = true } = options;\n const needCheckCode = !loose && cc;\n\n const passBaseRule = baseReg.test(valueStr);\n\n // 宽松模式 或 基础规则不通过直接返回\n if (!needCheckCode || !passBaseRule) {\n return passBaseRule;\n }\n\n // 前17位\n const preCode = valueStr.substring(0, 17);\n // 校验码\n const lastCode = valueStr.substring(valueStr.length - 1);\n // 计算校验码\n const checkCode = sumCheckCode(preCode);\n\n return lastCode === checkCode;\n}\n\nexport default isSocialCreditCode;\n","const config = {\n // 禁用warning提示\n disableWarning: true\n};\n\n/**\n * 设置禁止warning提示\n * @static\n * @alias module:Debug.formatBankCard\n * @since 3.6.1\n * @param {boolean} bool 是否禁止warning提示\n */\nfunction setDisableWarning(bool) {\n config.disableWarning = !!bool;\n}\n\n// eslint-disable-next-line no-undef\nconst version = BUILD_VERSION;\n\nexport { config, setDisableWarning, version };\n","import { config } from './config';\n\n/**\n * 打印警告信息\n *\n * @param {any[]} args 打印的信息\n */\nfunction devWarn(...args) {\n if (!config.disableWarning) {\n console.warn(...args);\n }\n}\n\nexport default devWarn;\n","import devWarn from './utils/devWarn';\n\nconst regNumber = /[\\d]/;\nconst regLowerCaseLetter = /[a-z]/;\nconst regUpperCaseLetter = /[A-Z]/;\nconst regAllNumberAndLetter = /[\\d|a-z]/gi;\n\n/**\n * 是否包含数字\n *\n * @private\n * @param {string} val 检查的值\n * @returns {boolean} 是否包含数字\n */\nfunction hasNumber(val) {\n return regNumber.test(val);\n}\n\n/**\n * 是否包含小写字母\n *\n * @private\n * @param {string} val 检测的值\n * @returns {boolean} 是否包含小写字母\n */\nfunction hasLowerCaseLetter(val) {\n return regLowerCaseLetter.test(val);\n}\n\n/**\n * 是否包含大写字母\n *\n * @private\n * @param {string} val 检测的值\n * @returns {boolean} 是否包含大写字母\n */\nfunction hasUpperCaseLetter(val) {\n return regUpperCaseLetter.test(val);\n}\n\n/**\n * 是否为十六进制\n *\n * @private\n * @param {string} val 检测的值\n * @returns {boolean} 是否为十六进制\n */\nfunction hasHex(val) {\n return val.indexOf('\\\\x') > -1 || val.indexOf('\\\\u') > -1;\n}\n\n/**\n * 是否包含特殊字符\n *\n * @private\n * @param {string} val 检测的值\n * @param {string} chars 特殊字符\n * @returns {boolean} 是否包含特殊字符\n */\nfunction hasSpecialCharacter(val, chars) {\n if (!chars || !val) {\n return false;\n }\n\n const specialChars = val.replace(regAllNumberAndLetter, '');\n\n if (!specialChars) {\n return false;\n }\n\n const regChars = hasHex(chars) ? new RegExp(`[${chars}]`) : null;\n\n if (regChars) {\n return regChars.test(specialChars);\n }\n\n let ret = false;\n specialChars.split('').some((charItem) => {\n if (chars.indexOf(charItem) > -1) {\n ret = true;\n }\n return ret;\n });\n return ret;\n}\n\n/**\n * 是否包含非法字符\n *\n * @private\n * @param {string} val 检测的值\n * @param {string} chars 特殊字符\n * @returns {boolean} 是否包含非法字符\n */\nfunction hasUnallowableCharacter(val, chars) {\n if (!val) {\n return false;\n }\n\n const specialChars = val.replace(regAllNumberAndLetter, '');\n\n if (!specialChars) {\n return false;\n } else if (!chars) {\n return true;\n }\n\n const regChars = hasHex(chars) ? new RegExp(`[^${chars}]`) : null;\n if (regChars) {\n return regChars.test(specialChars);\n }\n let ret = false;\n specialChars.split('').some((charItem) => {\n if (chars.indexOf(charItem) === -1) {\n ret = true;\n }\n return ret;\n });\n return ret;\n}\n\n/**\n * @typedef {Object} PasswordContaines - 验证密码的包含内容\n * @property {boolean} number - 包含数字\n * @property {boolean} lowerCaseLetter - 包含小写字母\n * @property {boolean} upperCaseLetter - 包含大写字母\n * @property {boolean} specialCharacter - 包含特殊字符\n * @property {boolean} unallowableCharacter - 包含非法字符\n */\n\n/**\n * @typedef {Object} ValidatePasswordReturn - 验证结果\n * @property {boolean} validated - 验证结果,根据密码强度、是否包含非法字符得出\n * @property {number} level - 强度级别,包含数字/大小写字母/特殊字符\n * @property {PasswordContaines} containes - 包含内容\n */\n\n/**\n * 验证密码(数字、大小写字母、特殊字符、非法字符)\n *\n * @see 参考 {@link https://baike.baidu.com/item/ASCII#3|ASCII}\n * @static\n * @alias module:Validator.validatePassword\n * @since 3.7.0\n * @param {string} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {number} [options.level=2] 密码强度 1-包含一种字符 2-包含两种字符 3-包含三种字符。(大写字母、小写字母、数字、特殊字符)\n * @param {boolean} [options.ignoreCase=false] 是否忽略大小写,为 ture 时,大小写字母视为一种字符\n * @param {string} [options.special=\"!@#$%^&*()-=_+[]\\|{},./?<>~\"] 支持的特殊字符\n * @returns {ValidatePasswordReturn} 验证结果\n * @example\n *\n * validatePassword('a12345678');\n * // =>\n * {\n * validated: true, // 验证结果,根据密码强度、是否包含非法字符得出\n * level: 2, // 强度级别\n * containes: {\n * number: true, // 包含数字\n * lowerCaseLetter: true, // 包含小写字母\n * upperCaseLetter: false, // 包含大写字母\n * specialCharacter: false, // 包含特殊字符\n * unallowableCharacter: false // 包含非法字符\n * }\n * }\n *\n * validatePassword('a12345678', { level: 3 });\n * // =>\n * {\n * validated: false,\n * level: 2,\n * containes: {\n * number: true,\n * lowerCaseLetter: true,\n * upperCaseLetter: false,\n * specialCharacter: false,\n * unallowableCharacter: false\n * }\n * }\n *\n * validatePassword('_Aa一二三45678', { level: 3, ignoreCase: true });\n * // =>\n * {\n * validated: false,\n * level: 3,\n * containes: {\n * number: true,\n * lowerCaseLetter: true,\n * upperCaseLetter: true,\n * specialCharacter: true,\n * unallowableCharacter: true\n * }\n * }\n *\n * // 自定义特殊字符\n * validatePassword('_Aa一二三45678', { level: 3, ignoreCase: true, special: '_一二三' });\n * // =>\n * {\n * validated: true,\n * level: 3,\n * containes: {\n * number: true,\n * lowerCaseLetter: true,\n * upperCaseLetter: true,\n * specialCharacter: true,\n * unallowableCharacter: false\n * }\n * }\n */\nfunction validatePassword(value, options = {}) {\n const { level = 2, ignoreCase = false, special = '\\\\x21-\\\\x2F\\\\x3A-\\\\x40\\\\x5B-\\\\x60\\\\x7B-\\\\x7E' } = options;\n\n let valStr = value;\n\n if (typeof value !== 'string') {\n devWarn(`[validatePassword] value must be a string.`);\n valStr = '';\n }\n\n let currentLevel = 0;\n\n // 包含数字\n const containesNumber = hasNumber(valStr);\n // 包含小写字母\n const containesLowerCaseLetter = hasLowerCaseLetter(valStr);\n // 包含大写字母\n const containesUpperCaseLetter = hasUpperCaseLetter(valStr);\n // 包含特殊字符\n const containesSpecialCharacter = hasSpecialCharacter(valStr, special);\n // 包含非法字符,即含有非数字字母特殊字符以外的其他字符\n const containesUnallowableCharacter = hasUnallowableCharacter(valStr, special);\n\n if (containesNumber) {\n currentLevel += 1;\n }\n\n // 不区分大小写\n if (ignoreCase) {\n if (containesLowerCaseLetter || containesUpperCaseLetter) {\n currentLevel += 1;\n }\n } else {\n // 区分大小写\n if (containesLowerCaseLetter) {\n currentLevel += 1;\n }\n if (containesUpperCaseLetter) {\n currentLevel += 1;\n }\n }\n\n if (containesSpecialCharacter) {\n currentLevel += 1;\n }\n\n // 验证结果\n const validated = currentLevel >= level && !containesUnallowableCharacter;\n\n return {\n validated,\n level: currentLevel,\n containes: {\n number: containesNumber,\n lowerCaseLetter: containesLowerCaseLetter,\n upperCaseLetter: containesUpperCaseLetter,\n specialCharacter: containesSpecialCharacter,\n unallowableCharacter: containesUnallowableCharacter\n }\n };\n}\n\nexport default validatePassword;\n","import normalizeString from './normalizeString';\n\n// 护照号 9位,包括首字母和数字;支持 普通护照(E*)、外交护照(DE)、公务护照(SE)、公务普通护照(PE)、香港特区护照(K/KJ/H*)、澳门特区护照(MA/MB/M*)\nconst reg = /^((e[\\da-z])|(de)|(se)|(pe)|([khm][\\da-z]))[\\da-z]{7}$/i;\n\n/**\n * 检测值是否为护照号\n * 支持普通护照(E*)、外交护照(DE)、公务护照(SE)、公务普通护照(PE)、香港特区护照(K/KJ/H*)、澳门特区护照(MA/MB/M*),注意不区分大小写\n *\n * @static\n * @alias module:Validator.isPassport\n * @see 参考 {@link https://zh.wikipedia.org/wiki/中华人民共和国护照#个人资料页|中华人民共和国护照#个人资料页}\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为护照号\n * @example\n *\n * isPassport('E12345678'); // true\n * isPassport('abc'); // false\n *\n */\nfunction isPassport(value) {\n const valueStr = normalizeString(value);\n return reg.test(valueStr);\n}\n\nexport default isPassport;\n","import normalizeString from './normalizeString';\n\nconst chineseDictionary = {\n // 基本汉字\n chineseBasic: '[\\u4e00-\\u9fa5]',\n\n // 基本汉字补充\n chineseExtend: '[\\u9ea6-\\u9fef]',\n\n // 汉字扩展A\n chineseExtendA: '[\\u3400-\\u4DB5]',\n\n // 汉字扩展B\n chineseExtendB: '[\\u{20000}-\\u{2A6D6}]',\n\n // 汉字扩展C\n chineseExtendC: '[\\u{2A700}-\\u{2B734}]',\n\n // 汉字扩展D\n chineseExtendD: '[\\u{2B740}-\\u{2B81D}]',\n\n // 汉字扩展E\n chineseExtendE: '[\\u{2B820}-\\u{2CEA1}]',\n\n // 汉字扩展F\n chineseExtendF: '[\\u{2CEB0}-\\u{2EBE0}]'\n};\n\nconst looseChineseRegExp = chineseDictionary.chineseBasic + '+';\nconst chineseRegExp = '^' + chineseDictionary.chineseBasic + '+$';\n\nconst chineseWithExtend = '(?:' + chineseDictionary.chineseBasic + '|' + chineseDictionary.chineseExtend + '|' + chineseDictionary.chineseExtendA + '|' + chineseDictionary.chineseExtendB + '|' + chineseDictionary.chineseExtendC + '|' + chineseDictionary.chineseExtendD + '|' + chineseDictionary.chineseExtendE + '|' + chineseDictionary.chineseExtendF + ')';\nconst looseChineseExtendRegExp = chineseWithExtend + '+';\nconst chineseExtendRegExp = '^' + chineseWithExtend + '+$';\n\n// eslint-disable-next-line no-prototype-builtins\nconst supportRegExpUnicode = RegExp.prototype.hasOwnProperty('unicode');\n\n/**\n * 检测值是否为中文\n *\n * @static\n * @alias module:Validator.isChinese\n * @since 1.1.0\n * @see 参考 {@link http://www.unicode.org/reports/tr38/#BlockListing|4.4 Listing of Characters Covered by the Unihan Database}\n * @see 参考 {@link https://zh.wikipedia.org/wiki/Unicode字符平面映射|Unicode字符平面映射}\n * @see 参考 {@link https://zh.wikipedia.org/wiki/Unicode區段|Unicode区段}\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.loose=false] 宽松模式。如果为true,只要包含中文即为true\n * @param {boolean} [options.useExtend=false] 使用统一表意文字扩展A-F。注意:如果不支持 `RegExp.prototype.unicode`,扩展字符集将自动不生效,如IE浏览器。\n * @returns {boolean} 值是否为中文\n * @example\n *\n * isChinese('林某某'); // true\n * isChinese('林A'); // false\n *\n * // 宽松模式,只要包含中文即为true\n * isChinese('林A', { loose: true }); // true\n * isChinese('A林A', { loose: true }); // true\n *\n * // 扩展字符集的字符\n * isChinese('𠮷'); // false\n * \n * // 使用中文扩展字符集,需要浏览器支持 RegExp.prototype.unicode 才生效。\n * isChinese('𠮷', { useExtend: true }); // true\n * isChinese('𠮷aa', { useExtend: true, loose: true }); // true\n * \n */\nfunction isChinese(value, options = {}) {\n const { loose = false, useExtend = false } = options;\n\n const valueStr = normalizeString(value);\n const basicRegExp = loose ? looseChineseRegExp : chineseRegExp;\n const extendRegExp = loose ? looseChineseExtendRegExp : chineseExtendRegExp;\n\n const hasExtend = useExtend && supportRegExpUnicode;\n const resultRegExp = hasExtend ? extendRegExp : basicRegExp;\n const flag = hasExtend ? 'u' : undefined;\n const reg = new RegExp(resultRegExp, flag);\n return reg.test(valueStr);\n}\n\nexport default isChinese;\n","import normalizeString from './normalizeString';\n\n// ipv4正则\nconst reg = /^((\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])$/;\n\n/**\n * 检测值是否为ipv4\n *\n * @static\n * @alias module:Validator.isIPv4\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为ipv4\n * @example\n *\n * isIPv4('192.168.1.1'); // true\n * isIPv4('255.255.255.255'); // true\n * isIPv4('256.256.256.256'); // false\n * isIPv4('0.0'); // false\n *\n */\nfunction isIPv4(value) {\n const valueStr = normalizeString(value);\n return reg.test(valueStr);\n}\n\nexport default isIPv4;\n","import normalizeString from './normalizeString';\n\n// ipv6正则\nconst reg = /^((([0-9A-F]{1,4}:){7}([0-9A-F]{1,4}|:))|(([0-9A-F]{1,4}:){6}(:[0-9A-F]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3})|:))|(([0-9A-F]{1,4}:){5}(((:[0-9A-F]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3})|:))|(([0-9A-F]{1,4}:){4}(((:[0-9A-F]{1,4}){1,3})|((:[0-9A-F]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3}))|:))|(([0-9A-F]{1,4}:){3}(((:[0-9A-F]{1,4}){1,4})|((:[0-9A-F]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3}))|:))|(([0-9A-F]{1,4}:){2}(((:[0-9A-F]{1,4}){1,5})|((:[0-9A-F]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3}))|:))|(([0-9A-F]{1,4}:){1}(((:[0-9A-F]{1,4}){1,6})|((:[0-9A-F]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3}))|:))|(:(((:[0-9A-F]{1,4}){1,7})|((:[0-9A-F]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3}))|:)))(%.+)?$/i;\n\n/**\n * 检测值是否为ipv6\n *\n * @static\n * @alias module:Validator.isIPv6\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为ipv6\n * @example\n *\n * // 冒分十六进制表示法\n * isIPv6('2001:0DB8:0000:0023:0008:0800:200C:417A'); // true\n *\n * // 前导0省略\n * isIPv6('2001:DB8:0:23:8:800:200C:417A'); // true\n * isIPv6('FF01:0:0:0:0:0:0:1101'); // true\n *\n * // 0位压缩表示法\n * isIPv6('FF01::1101'); // true\n * isIPv6('::1'); // true\n * isIPv6('::'); // true\n * isIPv6('0:0:0:0:0:0:0:1'); // true\n * isIPv6('0:0:0:0:0:0:0:0'); // true\n *\n * // 内嵌IPv4地址表示法\n * isIPv6('::192.168.1.1'); // true\n * isIPv6('::FFFF:192.168.1.1'); // true\n * isIPv6('192.168.1.1'); // false\n *\n */\nfunction isIPv6(value) {\n const valueStr = normalizeString(value);\n return reg.test(valueStr);\n}\n\nexport default isIPv6;\n","import normalizeString from './normalizeString';\n\n// 标准格式如下:\n// [协议类型]://[服务器地址]:[端口号]/[资源层级UNIX文件路径][文件名]?[查询]#[片段ID]\n\n// 完整格式如下:\n// [协议类型]://[访问资源需要的凭证信息]@[服务器地址]:[端口号]/[资源层级UNIX文件路径][文件名]?[查询]#[片段ID]\n// \n// 其中[访问凭证信息]、[端口号]、[查询]、[片段ID]都属于选填项。\n\nconst protocalReg = '[\\\\w-.]+:\\\\/\\\\/';\nconst credentialsReg = '[-;:&=\\\\+\\\\$,\\\\w]+@';\nconst serverReg = 'localhost|(([^\\\\s:\\\\/]+?\\\\.)+?[^\\\\s:\\\\/]+)';\nconst portReg = ':\\\\d+';\nconst pathReg = '\\\\/.*';\nconst searchReg = '\\\\?.*';\nconst hashReg = '#.*';\n\nconst regWithProtocal = new RegExp(`^${protocalReg}(?:${credentialsReg})?(?:${serverReg})(?:${portReg})?(?:${pathReg})*(?:${searchReg})?(?:${hashReg})?$`);\nconst regNonProtocal = new RegExp(`^(?:${serverReg})(?:${portReg})?(?:${pathReg})*(?:${searchReg})?(?:${hashReg})?$`);\n\n/**\n * 检测值是否为url\n *\n * @static\n * @alias module:Validator.isUrl\n * @since 3.4.0\n * @see 参考 {@link https://zh.wikipedia.org/wiki/统一资源定位符|统一资源定位符}\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为url\n * @example\n *\n * isUrl(''); // false\n * isUrl('/foo/bar'); // false\n * \n * isUrl('8.8.8.8'); // true\n * isUrl('example.com'); // true\n * isUrl('http://example.com'); // true\n * isUrl('https://example.com:8080'); // true\n * isUrl('https://www.example.com/test/123'); // true\n * isUrl('https://www.example.com/test/123?foo=bar'); // true\n * isUrl('https://www.example.com/test/123?foo=中文#id'); // true\n * isUrl('https://www.example.com/test/123?foo=中文#测试'); // true\n * isUrl('ftp://127.0.0.1:8080/测试.tar'); // true\n * isUrl('a.b'); // true\n * isUrl('a.b:8080'); // true\n * isUrl('p://a.b'); // true\n * isUrl('p://a.b:8888'); // true\n * isUrl('中文域名.中文后缀'); // true\n * isUrl('中文域名.cn'); // true\n * \n */\nfunction isUrl(value) {\n const valueStr = normalizeString(value);\n return regWithProtocal.test(valueStr) || regNonProtocal.test(valueStr);\n}\n\nexport default isUrl;\n","import normalizeString from './normalizeString';\n\n// 基础规则,由14位数字本体码和1位数字校验码组成,其中本体码从左至右依次为:6位首次登记机关码、8位顺序码。\nconst baseReg = /^\\d{15}$/;\n\n/**\n * 计算校验码\n *\n * @private\n * @since 3.5.0\n * @param {string} preCode 营业执照前14位\n * @returns {number} 校验码\n */\nfunction sumCheckCode(preCode) {\n let retNum; // 校验位数字\n\n let pj = 10; // Pj+1 11,初始为10\n\n for (let j = 0; j < 14; j++) {\n const sj = pj + Number(preCode[j]);\n let sj10 = sj % 10;\n sj10 = sj10 === 0 ? 10 : sj10;\n const pj1 = sj10 * 2;\n pj = pj1 % 11;\n }\n\n // 反模10计算\n if (pj === 1) {\n retNum = 0;\n } else {\n retNum = 11 - pj;\n }\n\n return retNum;\n}\n\n/**\n * 检测值是否为营业执照号,也叫工商注册号。由14位数字本体码和1位数字校验码组成,其中本体码从左至右依次为:6位首次登记机关码、8位顺序码。\n *\n * @static\n * @alias module:Validator.isBusinessLicense\n * @see 参考 {@link https://wenku.baidu.com/view/19873704cc1755270722087c.html|GS15—2006 工商行政管理市场主体注册号编制规则}\n * @since 3.5.0\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.checkCode=true] 是否校验最后一位校验码,如果为false,不校验校验位。\n * @returns {boolean} 值是否为营业执照号\n * @example\n *\n * isBusinessLicense('310115600985533'); // true\n * isBusinessLicense('310115600985535'); // false\n *\n * // 不校验验证码,长度和类型还是有校验\n * isBusinessLicense('310115600985535', { checkCode: false }); // true\n * isBusinessLicense('ac115600985535', { checkCode: false }); // false\n * isBusinessLicense('31011560098', { checkCode: false }); // false\n * \n */\nfunction isBusinessLicense(value, options = {}) {\n const valueStr = normalizeString(value);\n // @ts-ignore\n // TODO 下个版本废弃 loose\n const { loose = false, checkCode: cc = true } = options;\n const needCheckCode = !loose && cc;\n\n const passBaseRule = baseReg.test(valueStr);\n\n // 宽松模式 或 基础规则不通过直接返回\n if (!needCheckCode || !passBaseRule) {\n return passBaseRule;\n }\n\n // 前14位\n const preCode = valueStr.substring(0, 14);\n // 校验码\n const lastCode = valueStr.substring(valueStr.length - 1);\n // 计算校验码\n const checkCode = sumCheckCode(preCode);\n\n return lastCode === String(checkCode);\n}\n\nexport default isBusinessLicense;\n","import normalizeString from './normalizeString';\n\n// 港澳居民来往内地通行证正则\nconst regHMCard = /^[hm]{1}([0-9]{10}|[0-9]{8})$/i;\n\n/**\n * 检测值是否为港澳居民来往内地通行证,俗称回乡证或回乡卡。\n *\n * @static\n * @alias module:Validator.isHMCard\n * @since 4.0.0\n * @see 参考 {@link https://zh.wikipedia.org/wiki/港澳居民来往内地通行证|港澳居民来往内地通行证}\n * @param {*} value 要检测的值\n * @returns {boolean} 是否为港澳居民来往内地通行证\n * @example\n * // 第一代 11 位\n * isHMCard('h3203117707'); // true\n * isHMCard('H3203117707'); // true\n * isHMCard('m3203117707'); // true\n * isHMCard('M3203117707'); // true\n *\n * // 第二代 9 位\n * isHMCard('h32031177'); // true\n * isHMCard('H32031177'); // true\n * isHMCard('m32031177'); // true\n * isHMCard('M32031177'); // true\n */\nfunction isHMCard(value) {\n const valueStr = normalizeString(value);\n return regHMCard.test(valueStr);\n}\n\nexport default isHMCard;\n","import normalizeString from './normalizeString';\n\n// 台湾居民来往大陆通行证正则\nconst regTWCard = /^\\d{8}$/i;\n\n// 一次性短期台胞证\nconst singleRegTWCard = /^[\\da-z]{10,12}$/i;\n\n/**\n * 检测值是否为台湾居民来往大陆通行证,俗称台胞证。\n *\n * @static\n * @alias module:Validator.isTWCard\n * @since 4.0.0\n * @see 参考 {@link https://zh.wikipedia.org/wiki/台湾居民来往大陆通行证|台湾居民来往大陆通行证}\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.loose=false] 宽松模式。如果为true,表示支持一次性短期通行证\n * @returns {boolean} 是否为台湾居民来往大陆通行证\n * @example\n * \n * isTWCard('12345678'); // true\n * isTWCard('07257456'); // true\n *\n * // 一次性短期\n * isTWCard('F290299977'); // false\n * \n * // 宽松模式,支持一次性短期通行证\n * isTWCard('F290299977', { loose: true }); // true\n */\nfunction isTWCard(value, options = {}) {\n const { loose = false } = options;\n\n const valueStr = normalizeString(value);\n if (regTWCard.test(valueStr)) {\n return true;\n }\n return loose ? singleRegTWCard.test(valueStr) : false;\n}\n\nexport default isTWCard;\n","import normalizeString from './normalizeString';\n\nconst reg = /^[A-Z]{6}[A-Z\\d]{2}(?:[A-Z\\d]{3})?$/;\n\n/**\n * 检测值是否为 Swift Code。8位或11位,前6位为大写字母,7-8位为大写字母或数字,9-11位为可选的大写字母或数字。\n *\n * @static\n * @alias module:Validator.isSwiftCode\n * @see 参考 {@link https://zh.wikipedia.org/wiki/ISO_9362|ISO 9362}\n * @since 4.9.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为 Swift Code\n * @example\n *\n * isSwiftCode('DEUTDEFF'); // true\n * isSwiftCode('deutdeff'); // false\n *\n * isSwiftCode('BKTWTWTP010'); // true\n * isSwiftCode('010BKTWTWTP'); // false\n *\n * isSwiftCode('ICBKCNBJBJM'); // true\n *\n */\nfunction isSwiftCode(value) {\n const valueStr = normalizeString(value);\n return reg.test(valueStr);\n}\n\nexport default isSwiftCode;\n","// 最大安全数字\nexport const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\n// 最小安全数字\nexport const MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;\n","import isType from './isType';\n\n/**\n * 检查值是否为Blob对象<br/><br/>\n * \n * <em style=\"font-weight: bold;\">注意:该方法仅适用于浏览器端。</em>\n *\n * @static\n * @alias module:Type.isBlob\n * @since 4.16.0\n * @param {*} value 检查值\n * @returns {boolean} 是否为Blob对象\n * @example\n *\n * isBlob(new Blob(['a']))\n * // => true\n *\n * isBlob({})\n * // => false\n *\n * isBlob('2012')\n * // => false\n */\nfunction isBlob(value) {\n return isType(value, 'Blob');\n}\n\nexport default isBlob;\n","/**\n * 检查值是否为Object\n *\n * @static\n * @alias module:Type.isObject\n * @since 1.1.0\n * @param {*} value 检查值\n * @returns {boolean} 是否为Object\n * @example\n *\n * isObject({})\n * // => true\n *\n * isObject([1,2,3])\n * // => true\n *\n * isObject(null)\n * // => false\n */\nfunction isObject(value) {\n const type = typeof value;\n return value != null && (type === 'object' || type === 'function');\n}\n\nexport default isObject;\n","import isType from './isType';\n\n/**\n * 检查值是否为NaN\n *\n * @static\n * @alias module:Type.isNaN\n * @since 1.1.0\n * @param {*} value 检查值\n * @returns {boolean} 是否为NaN\n * @example\n *\n * isNaN(NaN)\n * // => true\n *\n * isNaN(1)\n * // => false\n */\nfunction _isNaN(value) {\n return isType(value, 'Number') && isNaN(value);\n}\n\nexport default _isNaN;\n","/**\n * 参考: https://github.com/nefe/number-precision/blob/master/src/index.ts\n *\n * 解决浮动运算问题,避免小数点后产生多位数和计算精度损失。\n * 问题示例:2.3 + 2.4 = 4.699999999999999,1.0 - 0.9 = 0.09999999999999998\n */\n\nimport { MAX_SAFE_INTEGER, MIN_SAFE_INTEGER } from './constants';\nimport devWarn from './devWarn';\nimport { isNumber, isString, isSymbol } from './type';\n\n/**\n * 将值转换为有效数值\n * \n * @param {*} value 要转换的值\n * @returns {number|string} 有效数值\n */\nexport function transformEffectiveNumber(value) {\n /** @type {string|number|undefined} */\n let ret;\n if (isString(value)) {\n ret = value.trim(); // ' 15' ' 15 ' 兼容 Number(string) 处理\n\n if (ret === '') {\n ret = Number(ret);\n } else if (Number.isNaN(Number(ret))) { // string如果可以转换为number,默认不转换为number类型\n ret = Number.NaN;\n }\n } else if (isSymbol(value)) {\n // 例如 Symbol 包装器对象将会报错\n // symObj = Object(Symbol());\n // Number(symObj); // TypeError: Cannot convert a Symbol value to a number\n ret = Number.NaN;\n } else if (!isNumber(value)) {\n // 其余非数字类型通过 Number 转换\n ret = Number(value);\n } else {\n ret = value;\n }\n\n if (Number.isNaN(ret)) {\n return Number.NaN;\n }\n\n // @ts-ignore\n return ret;\n}\n\n/**\n * 是否为科学计数法数字\n *\n * @param {string} num 检查值\n * @returns {boolean}\n */\nexport function isScientificNumber(num) {\n return /\\d+\\.?\\d*e[\\+\\-]*\\d+/i.test(num);\n}\n\n/**\n * 把错误的数据转正\n *\n * @param {number} num 输入数\n * @param {number} [precision=12] 小数点的精度\n * @returns {number}\n * @example\n *\n * strip(0.09999999999999998)=0.1\n */\nexport function strip(num, precision = 12) {\n return +parseFloat(num.toPrecision(precision));\n}\n\n/**\n * 计算数字的小数点长度,支持科学记数法\n *\n * @param {number|string} num 输入数\n * @returns {number} 小数点长度\n */\nexport function digitLength(num) {\n // Get digit length of e\n const eSplit = num.toString().split(/e/i);\n const len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0);\n return len > 0 ? len : 0;\n}\n\n/**\n * 把小数转成整数,支持科学计数法。如果是小数则放大成整数\n *\n * @param {number|string} num 输入数\n * @returns {number}\n */\nexport function float2Fixed(num) {\n const strNum = String(num);\n if (!isScientificNumber(strNum)) {\n return Number(strNum.replace('.', ''));\n }\n const dLen = digitLength(num);\n return dLen > 0 ? strip(+num * Math.pow(10, dLen)) : +num;\n}\n\n/**\n * 检测数字是否越界,如果越界给出提示\n * @param {number} num 输入数\n * @returns\n */\nexport function checkBoundary(num) {\n if (+num > MAX_SAFE_INTEGER || +num < MIN_SAFE_INTEGER) {\n devWarn(`${num} is beyond boundary when transfer to integer, the results may not be accurate`);\n }\n}\n\n/**\n * 去掉左边数字0\n *\n * @param {string} num 数字字符串\n * @returns {string}\n */\nexport function trimLeftZero(num) {\n const reg = /^([+-])?(0+)([0-9\\.]+)$/;\n const result = reg.exec(num);\n\n let sign;\n\n if (result) {\n sign = result[1] || '';\n return sign + (result[3][0] === '.' ? '0' + result[3] : result[3]);\n }\n\n return num;\n}\n\n/**\n * 科学计数法转换成普通数字\n *\n * JavaScript在以下情景会自动将数值转换为科学计数法:\n * 1.小数点前的数字个数大于等于22位\n * 2.小数点前边是0,小数点后十分位(包含十分位)之后连续零的个数大于等于6个\n *\n * @param {string | number} num 科学计数法数字\n * @returns {string | number} 转换后的数字字符串\n */\nexport function scientificToNumber(num) {\n const strNum = String(num);\n\n if (!isScientificNumber(strNum)) {\n return num;\n }\n\n /** @type string */\n let ret;\n\n const zero = '0';\n const parts = strNum.toLowerCase().split('e');\n const e = parts.pop(); // 存储指数\n // @ts-ignore\n const l = Math.abs(e); // 取绝对值,l-1就是0的个数\n // @ts-ignore\n const sign = e / l; //判断正负\n const coeff_array = parts[0].split('.'); // 将系数按照小数点拆分\n\n // 如果是小数\n if (sign === -1) {\n // 整数部分\n const intVal = trimLeftZero(coeff_array[0]);\n\n // 整数部分大于科学计数后面部分\n // 如: 10e-1, 10.2e-1\n if (intVal.length > l) {\n const thanLen = intVal.length - l;\n const dec = coeff_array[1] || '';\n\n ret = intVal.slice(0, thanLen);\n\n // 处理 10e-1, 100e-1\n if (intVal.slice(thanLen) !== '0' || dec) {\n ret += '.' + intVal.slice(thanLen) + dec;\n }\n } else {\n // 整数部分小于等于科学计数后面部分\n // 如: 1e-1, 0.2e-1, 1.2e-2, 1.2e-1\n ret = zero + '.' + new Array(l - intVal.length + 1).join(zero) + coeff_array.join('');\n }\n } else {\n // 小数部分\n const dec = coeff_array[1] || '';\n\n // 如果是整数,将整数除第一位之外的非零数字计入位数,相应的减少0的个数\n if (l - dec.length < 0) {\n ret = trimLeftZero(coeff_array[0] + dec.substring(0, l)) + '.' + dec.substring(l);\n } else {\n // 拼接字符串,如果是整数,不需要拼接小数点\n ret = coeff_array.join('') + new Array(l - dec.length + 1).join(zero);\n }\n }\n\n return trimLeftZero(ret);\n}\n\n","import isType from './isType';\n\n/**\n * 检查值是否为Symbol\n *\n * @static\n * @alias module:Type.isSymbol\n * @since 1.1.0\n * @param {*} value 检查值\n * @returns {boolean} 是否为Symbol\n * @example\n *\n * isSymbol(Symbol.iterator)\n * // => true\n *\n * isSymbol(\"abc\")\n * // => false\n */\nfunction isSymbol(value) {\n return isType(value, 'Symbol');\n}\n\nexport default isSymbol;\n","import isType from './isType';\n\n/**\n * 检查值是否为Number\n *\n * @static\n * @alias module:Type.isNumber\n * @since 1.1.0\n * @param {*} value 检查值\n * @returns {boolean} 是否为Number\n * @example\n *\n * isNumber(1)\n * // => true\n *\n * isNumber(Number.MIN_VALUE)\n * // => true\n *\n * isNumber(Infinity)\n * // => true\n *\n * isNumber(NaN)\n * // => true\n *\n * isNumber('1')\n * // => false\n */\nfunction isNumber(value) {\n return isType(value, 'Number');\n}\n\nexport default isNumber;\n","import { checkBoundary, scientificToNumber, isScientificNumber } from './utils/math.util';\nimport isNaN from './utils/type/isNaN';\nimport { trimLeftZero } from './utils/math.util';\nimport devWarn from './utils/devWarn';\n\nconst reg = /^[+-]?\\d*\\.?\\d*$/;\n\n/**\n * 检查数字或数字字符串\n *\n * @private\n * @param {string} num\n * @returns 是否为数字\n */\nfunction checkNumber(num) {\n if (!(reg.test(num) || isScientificNumber(num)) || isNaN(num) || (typeof num !== 'number' && typeof num !== 'string') || num === '') {\n devWarn(`${num} invalid parameter.`);\n\n return false;\n }\n\n // 数字超限如果不是是字符串,可能有异常\n // 如 1111111111111111111111 // => 1.1111111111111111e+21\n if (typeof num === 'number') {\n checkBoundary(num);\n }\n\n return true;\n}\n\n/**\n * 格式化整数部分\n *\n * @private\n * @param {string} intStr 数字字符串\n * @param {string} thousand 千分位符号\n * @returns 格式化后的值\n */\nfunction formatInt(intStr, thousand) {\n let txt = '';\n intStr = trimLeftZero(intStr);\n intStr = intStr[0] === '+' ? intStr.substring(1) : intStr; // 去掉+符号\n const negativeSymbol = Number(intStr) < 0 ? '-' : '';\n const reArr = negativeSymbol ? intStr.substring(1).split('').reverse() : intStr.split('').reverse();\n\n for (let i = 0; i < reArr.length; i++) {\n txt += reArr[i] + ((i + 1) % 3 === 0 && i + 1 !== reArr.length ? thousand : '');\n }\n\n return negativeSymbol + txt.split('').reverse().join('');\n}\n\n/**\n * 格式化小数部分,如果使用 toFixed,超大额数字会自动被截断\n *\n * @private\n * @param {string} decStr 小数点部分的字符串\n * @param {number} precision 保留位数\n * @param {string} decimal 小数点符号\n * @returns 格式化后的值\n */\nfunction formatDec(decStr, precision, decimal) {\n if (precision === 0) {\n return '';\n }\n\n const zero = 0;\n let ret = '';\n\n if (decStr && Number(decStr) > 0) {\n let tmpNum = parseFloat('0.' + decStr);\n ret = tmpNum.toFixed(precision).substring(2);\n } else {\n ret = zero.toFixed(precision).substring(2);\n }\n\n return decimal + ret;\n}\n\n/**\n * 格式化金额\n *\n * @static\n * @alias module:Processor.formatMoney\n * @since 1.1.0\n * @param {string | number} num 需转换金额 (最大:9007199254740991 最小: -9007199254740991)\n * @param {Object} [options] 金额格式化配置\n * @param {number} [options.precision=2] 保留位数 (最高:10位)\n * @param {string} [options.symbol] 货币符号\n * @param {string} [options.thousand=\",\"] 千分位符号\n * @param {string} [options.decimal=\".\"] 小数位符号\n * @returns {string} 格式化的金额\n * @example\n *\n * // 整数\n * formatMoney(1000); // 1,000.00\n *\n * // 小数(默认保留2位小数)\n * formatMoney(3000.03); // 3,000.03\n *\n * // 保留4位小数\n * formatMoney(3000.03, { precision: 4 }); // 3,000.0300\n *\n * // 保留10位小数\n * formatMoney(1500.2, { precision: 10 }); // 1,500.2000000000\n *\n * // 自定义单位符号\n * formatMoney(1000.00, { symbol: '$' }); // $1,000.00\n *\n * // 自定义千位分割符(默认',')\n * formatMoney(1000.00, { thousand: '|' }); // 1|000.00\n *\n * // 自定义小数位分割符(默认'.')\n * formatMoney(1000.00, { decimal: '&' }); // 1,000&00\n * \n * // 字符串数字\n * formatMoney('3000.03', { precision: 4 }); // 3,000.0300\n */\nconst formatMoney = (num, options = {}) => {\n let { precision = 2, symbol, thousand = ',', decimal = '.' } = options;\n\n // 数字参数不正确,返回空字符串\n // @ts-ignore\n if (!checkNumber(num)) {\n return '';\n }\n\n // 参数规整化\n if (typeof precision !== 'number' || isNaN(precision) || precision < 0) {\n precision = 2;\n } else if (precision > 10) {\n precision = 10;\n }\n symbol = typeof symbol === 'string' ? symbol : '';\n thousand = typeof thousand === 'string' ? thousand : ',';\n decimal = typeof decimal === 'string' ? decimal : '.';\n\n // 转换数字字符串,支持科学记数法\n const strNum = scientificToNumber(num) + '';\n // 整数和小数部分\n const [intStr, decStr] = strNum.split('.');\n\n return symbol + formatInt(intStr, thousand) + formatDec(decStr, precision, decimal);\n};\n\nexport default formatMoney;\n","import { checkBoundary } from './utils/math.util';\nimport devWarn from './utils/devWarn';\n\n// 简体\nconst chnNumberChar = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];\nconst chnUnitChar = ['', '十', '百', '千'];\n\n// 繁体\nconst big5NumberChar = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];\nconst big5UnitChar = ['', '拾', '佰', '仟'];\n\n// 数字字符、计数单位\n\n/**\n * @type {string[]}\n * @private\n */\nlet numberChar;\n\n/**\n * @type {string[]}\n * @private\n */\nlet unitChar;\n\n/**\n * @type {string[]}\n * @private\n */\nlet unitSection;\n\n/**\n * 每个小节的内部进行转化\n *\n * @private\n * @param {number} section 数字\n * @returns {string} 转化的数字\n */\nfunction sectionToChinese(section) {\n let str = '';\n let chnstr = '';\n let zero = false; //zero为是否进行补零, 第一次进行取余由于为个位数,默认不补零\n let unitPos = 0;\n\n while (section > 0) {\n // 对数字取余10,得到的数即为个位数\n let v = section % 10;\n\n //如果数字为零,则对字符串进行补零\n if (v == 0) {\n if (zero) {\n //如果遇到连续多次取余都是0,那么只需补一个零即可\n zero = false;\n chnstr = numberChar[v] + chnstr;\n }\n } else {\n //第一次取余之后,如果再次取余为零,则需要补零\n zero = true;\n str = numberChar[v];\n str += unitChar[unitPos];\n chnstr = str + chnstr;\n }\n unitPos++;\n section = Math.floor(section / 10);\n }\n return chnstr;\n}\n\n/**\n * 转换整数\n *\n * @private\n * @param {number} num 要转换的数字\n * @returns {string} 中文数字\n */\nfunction convertInteger(num) {\n let numInt = Math.floor(num);\n\n let unitPos = 0;\n let strIns = '';\n let chnStr = '';\n let needZero = false;\n\n if (numInt === 0) {\n return numberChar[0];\n }\n while (numInt > 0) {\n var section = numInt % 10000;\n if (needZero) {\n chnStr = numberChar[0] + chnStr;\n }\n strIns = sectionToChinese(section);\n strIns += section !== 0 ? unitSection[unitPos] : unitSection[0];\n chnStr = strIns + chnStr;\n needZero = section < 1000 && section > 0;\n numInt = Math.floor(numInt / 10000);\n unitPos++;\n }\n return chnStr;\n}\n\n/**\n * 转换小数\n *\n * @private\n * @param {number} num 要转换的数字\n */\nfunction convertDecimal(num) {\n const strNum = num + '';\n const index = strNum.indexOf('.');\n\n let ret = '';\n\n if (index > -1) {\n let decimalStr = strNum.slice(index + 1);\n ret = mapNumberChar(parseInt(decimalStr));\n }\n\n return ret;\n}\n\n/**\n * 映射为中文数字\n *\n * @private\n * @param {number} num 要处理的数字\n * @returns {string} 返回中文数字的映射\n */\nfunction mapNumberChar(num) {\n const strNum = num + '';\n let ret = '';\n\n for (let i = 0, len = strNum.length; i < len; i++) {\n ret += numberChar[parseInt(strNum[i])];\n }\n\n return ret;\n}\n\n/**\n * 数字转中文数字<br/><br/>\n * \n * 如果数字不在安全数字 -9007199254740991~9007199254740991 范围内,处理会有异常。\n *\n * @static\n * @alias module:Processor.numberToChinese\n * @since 1.2.0\n * @param {number} num 数字\n * @param {Object} [options] 配置项\n * @param {boolean} [options.big5=false] 繁体\n * @param {boolean} [options.unit=true] 计数单位\n * @param {string} [options.decimal=\"点\"] 中文小数点,繁体字为點\n * @param {string} [options.zero=\"零\"] 设置0。常用配置 〇\n * @param {string} [options.negative=\"负\"] 负数前面的字\n * @param {Object} [options.unitConfig] 节点单位配置\n * @param {string} [options.unitConfig.w=\"万\"] 设置计数单位万。常用配置 萬\n * @param {string} [options.unitConfig.y=\"亿\"] 设置计数单位亿。常用配置 億\n * @returns {string} 中文数字\n * @example\n *\n * numberToChinese(100); // 一百\n * numberToChinese(100.3); // 一百点三\n * numberToChinese(1234567890); // 一十二亿三千四百五十六万七千八百九十\n * numberToChinese(1234567890.11); // 一十二亿三千四百五十六万七千八百九十点一一\n *\n * // 繁体\n * numberToChinese(100, {big5: true}); // 壹佰\n * numberToChinese(100.3, {big5: true}); // 壹佰點叁\n * numberToChinese(1234567890.11, {big5: true}); // 壹拾贰亿叁仟肆佰伍拾陆万柒仟捌佰玖拾點壹壹\n *\n * // 不带计数单位\n * numberToChinese(1990, {unit: false}); // 一九九零\n *\n * // 不带计数单位,修改0\n * numberToChinese(1990, {unit: false, zero:'〇'}); // 一九九〇\n *\n */\nfunction numberToChinese(num, options = {}) {\n const { big5 = false, unit = true, zero = '', negative = '负', unitConfig = {} } = options;\n let { decimal = '' } = options;\n\n // 非数字 或 NaN 不处理\n if (typeof num !== 'number' || isNaN(num)) {\n devWarn(`参数错误 ${num},请传入数字`);\n\n return '';\n }\n\n // 超过安全数字提示\n checkBoundary(num);\n\n // 设置数字字符和计数单位\n if (big5) {\n numberChar = big5NumberChar.slice();\n unitChar = big5UnitChar.slice();\n decimal = decimal || '點';\n } else {\n numberChar = chnNumberChar.slice();\n unitChar = chnUnitChar.slice();\n decimal = decimal || '点';\n }\n\n // 设置节点计数单位,万、亿、万亿\n const unitWan = unitConfig?.w || '万';\n const unitYi = unitConfig?.y || '亿';\n const unitWanYi = unitWan + unitYi;\n unitSection = ['', unitWan, unitYi, unitWanYi];\n\n // 设置0\n if (zero) {\n numberChar[0] = zero;\n }\n\n // 前置字符,负数处理\n const preStr = num < 0 ? negative : '';\n\n // 整数和小数\n let chnInteger, chnDecimal;\n const numAbs = Math.abs(num);\n\n // 处理整数\n if (unit) {\n chnInteger = convertInteger(numAbs);\n } else {\n chnInteger = mapNumberChar(Math.floor(numAbs));\n }\n\n // 处理小数\n chnDecimal = convertDecimal(numAbs);\n\n return chnDecimal ? `${preStr}${chnInteger}${decimal}${chnDecimal}` : `${preStr}${chnInteger}`;\n}\n\nexport default numberToChinese;\n","const regIdCard = /^(?<province>\\d{2})(?<city>\\d{2})(?<area>\\d{2})(?<year>(?:\\d{2})?\\d{2})(?<month>\\d{2})(?<day>\\d{2})\\d{2}(?<gender>\\d)(?:\\d|X)?$/i;\n\nconst Provinces = [\n // 华北地区:北京市|110000,天津市|120000,河北省|130000,山西省|140000,内蒙古自治区|150000\n ['11', '北京市'],\n ['12', '天津市'],\n ['13', '河北省'],\n ['14', '山西省'],\n ['15', '内蒙古自治区'],\n\n // 东北地区: 辽宁省|210000,吉林省|220000,黑龙江省|230000\n ['21', '辽宁省'],\n ['22', '吉林省'],\n ['23', '黑龙江省'],\n\n // 华东地区: 上海市|310000,江苏省|320000,浙江省|330000,安徽省|340000,福建省|350000,江西省|360000,山东省|370000\n ['31', '上海市'],\n ['32', '江苏省'],\n ['33', '浙江省'],\n ['34', '安徽省'],\n ['35', '福建省'],\n ['36', '江西省'],\n ['37', '山东省'],\n\n // 华中地区: 河南省|410000,湖北省|420000,湖南省|430000\n ['41', '河南省'],\n ['42', '湖北省'],\n ['43', '湖南省'],\n\n // 华南地区:广东省|440000,广西壮族自治区|450000,海南省|460000\n ['44', '广东省'],\n ['45', '广西壮族自治区'],\n ['46', '海南省'],\n\n // 西南地区:重庆市|500000,四川省|510000,贵州省|520000,云南省|530000,西藏自治区|540000\n ['50', '重庆市'],\n ['51', '四川省'],\n ['52', '贵州省'],\n ['53', '云南省'],\n ['54', '西藏自治区'],\n\n // 西北地区: 陕西省|610000,甘肃省|620000,青海省|630000,宁夏回族自治区|640000,新疆维吾尔自治区|650000\n ['61', '陕西省'],\n ['62', '甘肃省'],\n ['63', '青海省'],\n ['64', '宁夏回族自治区'],\n ['65', '新疆维吾尔自治区'],\n\n // 台湾地区:台湾省|710000\n // 台湾居民公民身份号码地址码为830000,参考 http://www.wanweibaike.com/wiki-中华人民共和国行政区划代码_(7区)、https://zh.wikipedia.org/wiki/港澳台居民居住证\n ['71', '台湾省'],\n ['83', '台湾省'],\n\n // 港澳地区:香港特别行政区|810000,澳门特别行政区|820000\n ['81', '香港特别行政区'],\n ['82', '澳门特别行政区']\n];\n\n// 第一位数字是以前的大区制代码。第二位是大区所在省市编码。全国共分为8个大区:华北(1)、东北(2)、华东(3)、中南(4)、西南(5)、西北(6)、台湾(7)和港澳(8)。\n// const Regions = [\n// ['1', '华北地区'],\n// ['2', '东北地区'],\n// ['3', '华东地区'],\n// ['4', '中南地区'],\n// ['5', '西南地区'],\n// ['6', '西北地区'],\n// ['7', '台湾地区'],\n// ['8', '港澳地区']\n// ];\n\n/**\n * @typedef {Object} IdCardOrigin - 解析身份证原数据\n * @property {string} province - 省份编码\n * @property {string} city - 城市编码\n * @property {string} area - 地区编码\n * @property {string} year - 出生年\n * @property {string} month - 出生月\n * @property {string} day - 出生日\n * @property {string} gender - 性别 能整除2为女,否则为男\n */\n\n/**\n * @typedef {Object} IdCardInfo - 身份证信息\n * @property {string} province - 省份\n * @property {string} birthday - 生日\n * @property {string} gender - 性别\n * @property {IdCardOrigin} origin - 解析身份证原数据\n */\n\n/**\n * 解析身份证号码,支持15、18位身份证号码\n *\n * @static\n * @alias module:Processor.parseIdCard\n * @since 4.0.0\n * @see 参考 {@link https://baike.baidu.com/item/居民身份证号码|居民身份证号码}\n * @param {string} id 身份证号码,支持15位\n * @returns {IdCardInfo | null} 省份、生日、性别,省/市/区/年/月/日/性别编码。如果解析失败将返回 null 。\n * @example\n * \n * parseIdCard('123456789123456'); // null\n *\n * // 18位身份证号码\n * parseIdCard('130701199310302288'); \n * // =>\n * {\n * birthday: \"1993-10-30\",\n * gender: \"女\",\n * origin: { province: \"13\", city: \"07\", area: \"01\", year: \"1993\", month: \"10\", day: \"30\", gender: \"8\" },\n * province: \"河北省\"\n * }\n *\n * // 15位身份证号码\n * parseIdCard('130701931030228');\n * // =>\n * {\n * birthday: \"93-10-30\",\n * gender: \"女\",\n * origin: { province: \"13\", city: \"07\", area: \"01\", year: \"93\", month: \"10\", day: \"30\", gender: \"8\" },\n * province: \"河北省\"\n * }\n *\n */\nfunction parseIdCard(id) {\n const match = regIdCard.exec(id);\n\n if (!match) {\n return null;\n }\n\n /** @type {{ province: string, city: string, area: string, year: string, month: string, day: string, gender: string }} */\n // @ts-ignore\n const origin = match.groups || {\n province: match[1],\n city: match[2],\n area: match[3],\n year: match[4],\n month: match[5],\n day: match[6],\n gender: match[7]\n };\n\n const province = Provinces.find((item) => item[0] === origin.province);\n\n if (!province) {\n return null;\n }\n\n const birthday = `${origin.year}-${origin.month}-${origin.day}`;\n const gender = Number(origin.gender) % 2 === 0 ? '女' : '男';\n // const region = Regions.find(item => item[0] === origin.province?.substring(0, 1));\n\n return {\n // region,\n province: province[1],\n birthday,\n gender,\n origin\n };\n}\n\nexport default parseIdCard;\n","const FileReaderMethodMap = {\n arrayBuffer: 'readAsArrayBuffer',\n binaryString: 'readAsBinaryString',\n dataURL: 'readAsDataURL',\n text: 'readAsText'\n}\n\n/**\n * @overload\n * @param {Blob} blob\n * @param {'arrayBuffer'} type\n * @returns {Promise<ArrayBuffer>}\n */\n\n/**\n * @overload\n * @param {Blob} blob\n * @param {'binaryString'|'binaryString'|'dataURL'|'text'} [type='dataURL']\n * @returns {Promise<string>}\n */\n\n/**\n * 读取 Blob 或 File 对象<br/><br/>\n * \n * <em style=\"font-weight: bold;\">注意:该方法仅适用于浏览器端。</em>\n *\n * @static\n * @alias module:Processor.fileReader\n * @see 参考 {@link https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader|FileReader}\n * @since 4.16.0\n * @param {Blob} blob Blob 或 File 对象\n * @param {'arrayBuffer'|'binaryString'|'dataURL'|'text'} [type='dataURL'] Blob 或 File 对象\n * @returns {Promise<string|ArrayBuffer>} 文件的内容\n * @example\n * const aFileParts = ['<a id=\"a\"><b id=\"b\">hey!</b></a>']; // 一个包含DOMString的数组\n * const htmlBlob = new Blob(aFileParts, { type: 'text/html' }); // 得到 blob\n *\n * fileReader(htmlBlob).then(data=>{\n * console.log(data); // data:text/html;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=\n * });\n *\n * const textBlob = new Blob(aFileParts, { type: 'text/plain' });\n *\n * fileReader(textBlob, 'text').then(data=>{\n * console.log(data); // <a id=\"a\"><b id=\"b\">hey!</b></a>\n * });\n */\nfunction fileReader(blob, type = 'dataURL') {\n let method = FileReaderMethodMap[type];\n if (!method) {\n method = FileReaderMethodMap.dataURL;\n }\n\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n // @ts-ignore\n reader[method](blob);\n // @ts-ignore\n reader.onload = () => resolve(reader.result);\n reader.onerror = (error) => reject(error);\n });\n}\n\nexport default fileReader;\n","/**\n * 将 DataURL 转为 Blob 对象\n *\n * @static\n * @alias module:Processor.dataURLToBlob\n * @see 参考 {@link https://developer.mozilla.org/zh-CN/docs/Glossary/Base64|Base64}\n * @since 4.1.0\n * @param {string} dataurl data: 协议的URL\n * @returns {Blob} Blob 对象\n * @example\n * const dataurl = 'data:text/html;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=';\n * dataURLToBlob(dataurl); // Blob {size: 32, type: 'text/html'}\n */\nfunction dataURLToBlob(dataurl) {\n const parts = dataurl.split(',');\n const meta = parts[0].substring(5).split(';');\n const type = meta[0];\n const decoder = meta.indexOf('base64') !== -1 ? atob : decodeURIComponent;\n const bstr = decoder(parts[1]);\n let n = bstr.length;\n const u8arr = new Uint8Array(n);\n\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n return new Blob([u8arr], { type });\n}\n\nexport default dataURLToBlob;\n","import { digitLength, float2Fixed, checkBoundary, transformEffectiveNumber } from './utils/math.util';\n\n/**\n * 精确乘法,支持多个数相乘,乘数默认为 1 。\n *\n * @static\n * @alias module:Math.times\n * @since 3.1.0\n * @param {...number|string} nums 相乘的数\n * @returns {number} 乘积\n * @example\n *\n * times(3, 0.6); // 1.8\n * times(3, 0.6, 2); // 3.6\n * times(3, 0.6, 2, 10); // 36\n * \n */\nfunction times(...nums) {\n let [num1, num2 = 1, ...rest] = nums;\n if (rest.length > 0) {\n return times(times(num1, num2), ...rest);\n }\n\n num1 = transformEffectiveNumber(num1);\n num2 = transformEffectiveNumber(num2);\n\n // 兼容处理,如果参数包含无效数值时,返回 NaN\n // @ts-ignore\n if (isNaN(num1) || isNaN(num2)) {\n return Number.NaN;\n }\n\n const num1Changed = float2Fixed(num1);\n const num2Changed = float2Fixed(num2);\n const baseNum = digitLength(num1) + digitLength(num2);\n const leftValue = num1Changed * num2Changed;\n\n checkBoundary(leftValue);\n\n return leftValue / Math.pow(10, baseNum);\n}\n\nexport default times;\n","import { strip, digitLength, float2Fixed, checkBoundary, transformEffectiveNumber } from './utils/math.util';\nimport times from './times';\n\n/**\n * 精确除法,支持多个数相除,除数默认为 1 。\n *\n * @static\n * @alias module:Math.divide\n * @since 3.1.0\n * @param {...number|string} nums 被除数和除数\n * @returns {number} 商数\n * @example\n *\n * divide(1.21); // 1.21 除数默认为 1 ,即 1.21/1 = 1.21\n * divide(1.21, 1.1); // 1.1\n * divide(1000, 10, 10); // 10\n * divide(1000, 10, 10, 10); // 1\n * \n * divide(); // NaN 如果没有传入参数,被除数默认为 undefined 。 Number(undefined) 转换为 NaN ,NaN/1 = NaN\n * divide(null); // 0 Number(null) 转换为 0 , 0/1 = 0\n * divide('1.5 ', 0.5); // 3 Number('1.5 ') 转换为 1.5 ,1.5/0.5 = 3\n * \n */\nfunction divide(...nums) {\n let [num1, num2 = 1, ...rest] = nums;\n\n if (rest.length > 0) {\n return divide(divide(num1, num2), ...rest);\n }\n\n num1 = transformEffectiveNumber(num1);\n num2 = transformEffectiveNumber(num2);\n\n // 兼容处理,如果参数包含无效数值时,返回 NaN\n // @ts-ignore\n if (isNaN(num1) || isNaN(num2)) {\n return Number.NaN;\n }\n\n const num1Changed = float2Fixed(num1);\n const num2Changed = float2Fixed(num2);\n checkBoundary(num1Changed);\n checkBoundary(num2Changed);\n // fix: 类似 10 ** -4 为 0.00009999999999999999,strip 修正\n return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1))));\n}\n\nexport default divide;\n","/**\n * @typedef {XMLHttpRequest['onloadstart']} XMLHttpRequestEvent XMLHttpRequest 事件对象\n */\n\n/**\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest|XMLHttpRequest}\n * @typedef {Object} AjaxOptions ajax配置项\n * @property {string} [method=\"get\"] 创建请求时使用的方法\n * @property {Document | XMLHttpRequestBodyInit | null} [data=null] 请求体被发送的数据\n * @property {Object.<string, string>} [headers] 自定义请求头\n * @property {XMLHttpRequestResponseType} [responseType] 响应类型\n * @property {number} [timeout] 请求超时的毫秒数\n * @property {boolean} [withCredentials=false] 跨域请求时是否需要使用凭证\n * @property {boolean} [async=true] 是否异步执行操作\n * @property {string|null} [user=null] 用户名,用于认证用途\n * @property {string|null} [password=null] 密码,用于认证用途\n * @property {XMLHttpRequestEvent} [onLoadStart] 接收到响应数据时触发\n * @property {XMLHttpRequestEvent} [onProgress] 请求接收到更多数据时,周期性地触发\n * @property {XMLHttpRequestEvent} [onAbort] 当 request 被停止时触发,例如当程序调用 XMLHttpRequest.abort() 时\n * @property {XMLHttpRequestEvent} [onTimeout] 在预设时间内没有接收到响应时触发\n * @property {XMLHttpRequestEvent} [onError] 当 request 遭遇错误时触发\n * @property {XMLHttpRequestEvent} [onLoad] 请求成功完成时触发\n * @property {XMLHttpRequestEvent} [onLoadEnd] 请求结束时触发,无论请求成功 (load) 还是失败 (abort 或 error)\n */\n\n/**\n * 请求<br/><br/>\n * \n * <em style=\"font-weight: bold;\">注意:该方法仅适用于浏览器端。</em>\n * \n * @static\n * @alias module:Other.ajax\n * @since 4.16.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest|XMLHttpRequest}\n * @param {string} url 地址\n * @param {AjaxOptions} [options] 配置项\n * @returns {Promise<ProgressEvent<EventTarget>>}\n * @example\n * ajax('/somefile').then(res=>{\n * // do something\n * });\n * \n * ajax('/api', { method: 'post' }).then(res=>{\n * // do something\n * });\n */\nfunction ajax(url, options) {\n const {\n method = 'get',\n data = null,\n timeout,\n headers,\n withCredentials = false,\n async = true,\n user = null,\n password = null,\n responseType,\n onAbort,\n onError,\n onLoad,\n onLoadEnd,\n onLoadStart,\n onProgress,\n onTimeout\n } = options || {};\n\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open(method.toLowerCase(), url, async, user, password);\n\n // 设置请求超时\n if (typeof timeout === 'number' && timeout > 0) {\n xhr.timeout = timeout;\n }\n\n // 跨域请求时是否需要使用凭证\n xhr.withCredentials = withCredentials;\n\n // 设置响应类型\n if (responseType) {\n xhr.responseType = responseType;\n }\n\n // 设置请求头\n if (typeof headers === 'object') {\n Object.keys(headers).map(item => {\n xhr.setRequestHeader(item, headers[item]);\n });\n }\n\n /**\n * 请求成功异步调用\n * @param {XMLHttpRequestEvent} [cb] 回调方法\n */\n const wrapSuccess = (cb) => {\n /**\n * 内部方法\n * @param {ProgressEvent<EventTarget>} e 事件对象\n */\n return (e) => {\n resolve(e);\n cb?.call(xhr, e);\n }\n }\n\n /**\n * 请求失败(中断/超时/失败)处理\n * @param {XMLHttpRequestEvent} [cb] 回调方法\n */\n const wrapError = (cb) => {\n /**\n * 内部方法\n * @param {ProgressEvent<EventTarget>} e 事件对象\n */\n return (e) => {\n reject(e);\n cb?.call(xhr, e);\n }\n }\n\n // 事件处理\n /**@type {Object.<keyof XMLHttpRequestEventTargetEventMap, XMLHttpRequestEvent | undefined>} */\n const events = {\n loadstart: onLoadStart,\n progress: onProgress,\n abort: wrapError(onAbort),\n timeout: wrapError(onTimeout),\n error: wrapError(onError),\n load: wrapSuccess(onLoad),\n loadend: onLoadEnd\n }\n /**@type {(keyof XMLHttpRequestEventTargetEventMap)[]} */\n // @ts-ignore\n const eventNames = Object.keys(events);\n\n eventNames.map(item => {\n const func = events[item];\n if (func) {\n xhr.addEventListener(item, func);\n }\n });\n\n xhr.send(data);\n });\n}\n\nexport default ajax;","// 如果修改文档,请同步修改 interface.doc.js\n\nimport dataURLToBlob from \"./dataURLToBlob\";\nimport isUrl from \"./isUrl\";\nimport ajax from \"./ajax\";\nimport { isBlob } from \"./utils/type\";\n\n/**\n * 下载文件\n * \n * @param {string} blobUrl blob 地址\n * @param {string} [fileName] 文件名称\n */\nfunction saver(blobUrl, fileName) {\n const anchor = document.createElement('a');\n // anchor.href = decodeURIComponent(blobUrl);\n anchor.href = blobUrl;\n anchor.style.display = 'none';\n anchor.setAttribute('download', fileName || '');\n\n /**\n * 处理点击事件,防止事件冒泡到 body/html 的点击事件。\n * \n * @param {MouseEvent} e 鼠标事件对象\n */\n function handleClick(e) {\n e.stopPropagation();\n anchor.removeEventListener('click', handleClick);\n }\n anchor.addEventListener('click', handleClick);\n\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n}\n\n/**\n * @typedef {import('./ajax.js').AjaxOptions} AjaxOptions ajax 配置项\n */\n\n/**\n * @callback TransformRequest\n * @param {AjaxOptions} options ajax 配置项\n * @returns {AjaxOptions}\n */\n\n/**\n * @callback TransformResponse\n * @param {Blob} res 响应的Blob对象。如果你通过 transformRequest 修改了 responseType ,该参数将是该类型响应值。\n * @returns {Blob}\n */\n\n/**\n * @typedef {Object} DownloadOptions 下载配置项\n * @property {string} [options.fileName] 文件名称\n * @property {string} [options.type] MIME 类型\n * @property {'url'|'text'} [options.dataType] 手动设置数据类型,默认会根据传入的数据判断类型,主要是为了区分 url 和 text 。<br/>如果你要下载的文本是 url ,请设置 'text' ;如果你要下载的 url 是绝对/相对路径,请设置 'url' 。\n * @property {TransformRequest} [options.transformRequest] 请求前触发,XHR 对象或配置调整\n * @property {TransformResponse} [options.transformResponse] 请求成功后触发,在传递给 then/catch 前,允许修改响应数据\n */\n\n/**\n * 下载<br/><br/>\n * \n * <em style=\"font-weight: bold;\">注意:该方法仅适用于浏览器端,兼容 IE10+ 和现代浏览器。</em>\n * \n * @static\n * @alias module:Other.download\n * @since 4.16.0\n * @see {@link https://zh.wikipedia.org/wiki/多用途互聯網郵件擴展|多用途互联网邮件扩展}\n * @param {string|Blob|ArrayBuffer|Int8Array|Uint8Array|Uint8ClampedArray|Int16Array|Uint16Array|Int32Array|Uint32Array|Float32Array|Float64Array|BigInt64Array|BigUint64Array} data 字符串、blob数据或url地址\n * @param {string|DownloadOptions} [options] 文件名称 或 配置项\n * @returns {Promise<void>}\n * @example\n * // 文本\n * download('hello world', 'text.txt');\n * \n * // 远程文件\n * download('/xxx.jpg', { dataType: 'url' });\n * \n * // blob文件\n * download(new Blob(['hello world']), 'text.txt');\n * \n */\nfunction download(data, options) {\n const config = typeof options === 'object' ? options : {};\n if (typeof options === 'string') {\n config.fileName = options;\n }\n const { fileName, type, dataType, transformRequest, transformResponse } = config;\n\n /** @type {Blob|undefined} */\n let payload;\n\n // dataURLs、blob url、url、string\n if (typeof data === 'string') {\n if (!dataType && /^blob:.*?\\/.*/.test(data)) {\n // blob url\n saver(data, fileName);\n return Promise.resolve();\n } else if (!dataType && /^data:([\\w+-]+\\/[\\w+.-]+)?[,;]/.test(data)) {\n // dataURLs\n payload = dataURLToBlob(data);\n } else if (dataType === 'url' || (!dataType && isUrl(data))) {\n // url\n /** @type {AjaxOptions} */\n const defaultAjaxOptions = { responseType: 'blob' };\n // 请求前配置调整\n const ajaxOptions = typeof transformRequest === 'function' ? transformRequest(defaultAjaxOptions) : defaultAjaxOptions;\n\n return ajax(data, ajaxOptions).then(e => {\n /** @type {Blob} */\n // @ts-ignore\n // 响应结果调整\n const res = typeof transformResponse === 'function' ? transformResponse(e.target.response) : e.target.response;\n const currentFileName = fileName || data.split(\"?\")[0].split(\"#\")[0].split(\"/\").pop();\n return download(res, { fileName: currentFileName, type: type || (isBlob(res) ? res.type : undefined) });\n });\n } else {\n // string\n payload = new Blob([data], { type: type || 'text/plain' });\n }\n } else if (isBlob(data)) {\n // @ts-ignore\n payload = data;\n }\n\n // html、TypedArray\n if (!(payload instanceof Blob)) {\n payload = new Blob([data], { type });\n }\n\n // @ts-ignore\n if (navigator.msSaveBlob) {\n // @ts-ignore\n navigator.msSaveBlob(payload, fileName || 'download');\n } else {\n const url = URL.createObjectURL(payload);\n saver(url, fileName);\n URL.revokeObjectURL(url);\n }\n\n return Promise.resolve();\n}\n\nexport default download;","const numberChars = '0123456789';\nconst letterChars = 'abcdefghijklmnopqrstuvwxyz';\nconst defaultChars = numberChars + letterChars + letterChars.toUpperCase();\n\n/**\n * @private\n * @param {number} len 长度\n * @param {string} optionalChars 允许的字符,默认为数字和大小写字母\n * @param {string} [prefix=''] 前缀部分,不计入长度\n * @returns {string}\n */\nfunction internalRandomString(len, optionalChars, prefix = '') {\n while (len-- > 0) {\n const r = optionalChars[Math.floor(Math.random() * optionalChars.length)];\n return internalRandomString(len, optionalChars, prefix + r);\n }\n return prefix;\n}\n\n/**\n * 生成随机字符串\n *\n * @static\n * @alias module:Other.randomString\n * @since 4.8.0\n * @param {number} [len=0] 长度\n * @param {string} [optionalChars='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'] 允许的字符,默认为数字和大小写字母\n * @returns {string} 随机字符串\n * @example\n * \n * randomString(5); // slk23\n * randomString(8); // 71mHqo2A\n *\n * // 自定义允许的字符\n * randomString(5, 'abc'); // ccbcb\n * randomString(8, 'abcefg'); // bcgcfabg\n * \n */\nfunction randomString(len = 0, optionalChars) {\n let realLen = typeof len === 'number' ? len : Number(len);\n if (isNaN(realLen)) {\n realLen = 0;\n }\n\n const realChars = typeof optionalChars === 'string' && optionalChars ? optionalChars : defaultChars;\n\n return internalRandomString(len, realChars);\n}\n\nexport default randomString;\n","import { isObject } from \"./utils/type\";\n\n/**\n * 递归处理空子级\n * \n * @private\n * @template {Record<string,any>} [T=Record<string,any>]\n * @param {T[]} arr 列表数据\n * @param {object} [options] 配置项\n * @param {string} [options.childrenField='children'] 子级字段名称\n * @param {'none'|'null'} [options.emptyChildrenValue='none'] 子级为空时的值,none表示删除该子级,null表示为null,array表示为[]。\n */\nfunction processEmptyChildren(arr, options) {\n const { childrenField = 'children', emptyChildrenValue = 'none' } = options || {};\n arr.forEach(item => {\n // if (isObject(item) && Array.isArray(item[childrenField])) {\n if (item[childrenField].length <= 0) {\n if (emptyChildrenValue === 'null') {\n // @ts-ignore\n item[childrenField] = null;\n // } else if (emptyChildrenValue === 'none') { // emptyChildrenValue='array' 不会执行该内部方法 \n } else {\n delete item[childrenField];\n }\n } else {\n processEmptyChildren(item[childrenField], options);\n }\n // }\n });\n}\n\n/**\n * 列表数据转树结构\n * \n * @static\n * @alias module:Tree.listToTree\n * @since 4.14.0\n * @template {Record<string,any>} [T=Record<string,any>]\n * @template {*} [R=T&Record<string,any>]\n * @param {T[]} list 列表数据\n * @param {object} [options] 配置项\n * @param {string} [options.keyField='id'] 当前数据的键值字段名称\n * @param {string} [options.parentField='pid'] 当前数据的父级字段名称\n * @param {string} [options.childrenField='children'] 子级字段名称\n * @param {'none'|'null'|'array'} [options.emptyChildrenValue='none'] 子级为空时的值,none表示删除该子级,null表示为null,array表示为[]。\n * @param {'spread'|'self'} [options.nodeAssign='spread'] 节点赋值方式。spread表示使用展开运算符创建新值,self表示使用自身对象。\n * @returns {R[]} 树结构\n * @example\n * \n * const menus = [\n * { id: '1', name: '首页', code: 'trade', pid: null },\n * { id: '2', name: '交易管理', code: 'trade', pid: null },\n * { id: '3', name: '交易查询', code: 'trade-1', pid: '2' },\n * { id: '4', name: '交易查询-查询操作', code: 'trade-1-1', pid: '3' },\n * { id: '5', name: '权限管理', code: 'authorization', pid: null },\n * { id: '6', name: '角色管理', code: 'authorization-1', pid: '5' },\n * { id: '7', name: '用户管理', code: 'authorization-2', pid: '5' }\n * ];\n * listToTree(menus); \n * // [{\"id\":\"1\",\"name\":\"首页\",\"code\":\"trade\",\"pid\":null},{\"id\":\"2\",\"name\":\"交易管理\",\"code\":\"trade\",\"pid\":null,\"children\":[{\"id\":\"3\",\"name\":\"交易查询\",\"code\":\"trade-1\",\"pid\":\"2\",\"children\":[{\"id\":\"4\",\"name\":\"交易查询-查询操作\",\"code\":\"trade-1-1\",\"pid\":\"3\"}]}]},{\"id\":\"5\",\"name\":\"权限管理\",\"code\":\"authorization\",\"pid\":null,\"children\":[{\"id\":\"6\",\"name\":\"角色管理\",\"code\":\"authorization-1\",\"pid\":\"5\"},{\"id\":\"7\",\"name\":\"用户管理\",\"code\":\"authorization-2\",\"pid\":\"5\"}]}]\n * \n * // 自定义子级字段名\n * listToTree(basicMenus, { childrenField: 'childs' });\n * // [{\"id\":\"1\",\"name\":\"首页\",\"code\":\"trade\",\"pid\":null},{\"id\":\"2\",\"name\":\"交易管理\",\"code\":\"trade\",\"pid\":null,\"childs\":[{\"id\":\"3\",\"name\":\"交易查询\",\"code\":\"trade-1\",\"pid\":\"2\",\"childs\":[{\"id\":\"4\",\"name\":\"交易查询-查询操作\",\"code\":\"trade-1-1\",\"pid\":\"3\"}]}]},{\"id\":\"5\",\"name\":\"权限管理\",\"code\":\"authorization\",\"pid\":null,\"childs\":[{\"id\":\"6\",\"name\":\"角色管理\",\"code\":\"authorization-1\",\"pid\":\"5\"},{\"id\":\"7\",\"name\":\"用户管理\",\"code\":\"authorization-2\",\"pid\":\"5\"}]}]\n * \n */\nfunction listToTree(list, options) {\n const { keyField = 'id', parentField = 'pid', childrenField = 'children', emptyChildrenValue = 'none', nodeAssign = 'spread' } = options || {};\n\n /** @type {R[]} */\n const tree = [];\n\n /** @type {Object.<string, T[]>} */\n const record = {};\n\n if (!Array.isArray(list)) {\n return tree;\n }\n\n list.forEach(item => {\n if (isObject(item)) {\n const newItem = nodeAssign === 'spread' ? { ...item } : item;\n\n /** @type {string} */\n const id = newItem[keyField];\n\n /** @type {string} */\n const pid = newItem[parentField];\n\n if (record[id]) {\n // @ts-ignore\n newItem[childrenField] = record[id];\n } else {\n // @ts-ignore\n newItem[childrenField] = record[id] = [];\n }\n\n if (pid) {\n if (!record[pid]) {\n record[pid] = [newItem];\n } else {\n record[pid].push(newItem);\n }\n } else {\n // @ts-ignore\n tree.push(newItem);\n }\n }\n });\n\n if (emptyChildrenValue !== 'array') {\n // @ts-ignore\n processEmptyChildren(tree, options);\n }\n\n return tree;\n}\n\nexport default listToTree;","import { isObject } from \"./utils/type\";\n\n/**\n * 内部实现\n * \n * @private\n * @template {any} T\n * @template {(item: T) => boolean} F\n * @param {T[]} tree 树结构数据\n * @param {F} predicate 遍历每一项执行的函数,参数是当前遍历到的节点数据,如果返回 Truthy 将返回包含该节点的所有父级节点\n * @param {string} [childrenField] 子级字段名\n * @param {T[]} [path=[]] 当前遍历路径\n * @returns {T[]}\n */\nfunction internalFindTreeSelect(tree, predicate, childrenField, path = []) {\n if (!Array.isArray(tree)) {\n return [];\n }\n\n for (const item of tree) {\n path.push(item);\n\n if (predicate(item)) {\n return path;\n }\n\n if (isObject(item)) {\n /** @type {T[]} */\n // @ts-ignore\n const childs = item[childrenField];\n\n if (Array.isArray(childs) && childs.length > 0) {\n const findChildren = internalFindTreeSelect(childs, predicate, childrenField, path);\n if (findChildren.length > 0) {\n return findChildren;\n }\n }\n }\n\n path.pop();\n }\n\n return [];\n}\n\n/**\n * 查找包含当前节点的所有父级节点\n * \n * @static\n * @alias module:Tree.findTreeSelect\n * @since 4.14.0\n * @template {any} T\n * @template {(item: T) => boolean} F\n * @param {T[]} tree 树结构数据\n * @param {F} predicate 遍历每一项执行的函数,参数是当前遍历到的节点数据,如果返回 Truthy 将返回包含该节点的所有父级节点\n * @param {string} [childrenField='children'] 子级字段名\n * @returns {T[]}\n * @example\n * const menus = [{ \"id\": \"1\", \"name\": \"首页\", \"code\": \"trade\", \"pid\": null }, { \"id\": \"2\", \"name\": \"交易管理\", \"code\": \"trade\", \"pid\": null, \"children\": [{ \"id\": \"3\", \"name\": \"交易查询\", \"code\": \"trade-1\", \"pid\": \"2\", \"children\": [{ \"id\": \"4\", \"name\": \"交易查询-查询操作\", \"code\": \"trade-1-1\", \"pid\": \"3\" }] }] }, { \"id\": \"5\", \"name\": \"权限管理\", \"code\": \"authorization\", \"pid\": null, \"children\": [{ \"id\": \"6\", \"name\": \"角色管理\", \"code\": \"authorization-1\", \"pid\": \"5\" }, { \"id\": \"7\", \"name\": \"用户管理\", \"code\": \"authorization-2\", \"pid\": \"5\" }] }];\n * \n * findTreeSelect(menus, item => item.id === '2');\n * // [{\"id\":\"2\",\"name\":\"交易管理\",\"code\":\"trade\",\"pid\":null,\"children\":[{\"id\":\"3\",\"name\":\"交易查询\",\"code\":\"trade-1\",\"pid\":\"2\",\"children\":[{\"id\":\"4\",\"name\":\"交易查询-查询操作\",\"code\":\"trade-1-1\",\"pid\":\"3\"}]}]}]\n * \n * findTreeSelect(menus, item => item.id === '7');\n * // [{\"id\":\"5\",\"name\":\"权限管理\",\"code\":\"authorization\",\"pid\":null,\"children\":[{\"id\":\"6\",\"name\":\"角色管理\",\"code\":\"authorization-1\",\"pid\":\"5\"},{\"id\":\"7\",\"name\":\"用户管理\",\"code\":\"authorization-2\",\"pid\":\"5\"}]},{\"id\":\"7\",\"name\":\"用户管理\",\"code\":\"authorization-2\",\"pid\":\"5\"}]\n * \n * findTreeSelect(menus, item => item.id === 'not found');\n * // []\n */\nfunction findTreeSelect(tree, predicate, childrenField = 'children') {\n return internalFindTreeSelect(tree, predicate, childrenField);\n}\n\nexport default findTreeSelect;","// file、blob文件如何预览图片?\n// 方法1:将file或者blob类型文件转成base64数据,再作为src赋值给img标签\n// 方法2:使用 window.URL.createObjectURL(blob) 为blob、file 创建一个指向该参数对象的URL\n\nimport fileReader from \"./fileReader\";\n\n/**\n * 将 Blob 或 File 对象转成 data:URL 格式的 Base64 字符串<br/><br/>\n * \n * <em style=\"font-weight: bold;\">注意:该方法仅适用于浏览器端。</em>\n *\n * @static\n * @alias module:Processor.blobToDataURL\n * @see 参考 {@link https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader/readAsDataURL|FileReader.readAsDataURL()}\n * @since 4.1.0\n * @ignore\n * @deprecated 请使用 `fileReader` 方法\n * @param {Blob} blob Blob 或 File 对象\n * @returns {Promise<string>} data:URL 格式的 Base64 字符串。\n * @example\n * const aFileParts = ['<a id=\"a\"><b id=\"b\">hey!</b></a>']; // 一个包含DOMString的数组\n * const htmlBlob = new Blob(aFileParts, { type: 'text/html' }); // 得到 blob\n *\n * blobToDataURL(htmlBlob).then(data=>{\n * console.log(data); // data:text/html;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=\n * });\n *\n * const textBlob = new Blob(aFileParts, { type: 'text/plain' });\n *\n * blobToDataURL(textBlob).then(data=>{\n * console.log(data); // data:text/plain;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=\n * });\n */\nfunction blobToDataURL(blob) {\n return fileReader(blob);\n}\n\nexport default blobToDataURL;\n","/**\n * 字节转换存储单位,保留2位小数点\n *\n * @static\n * @alias module:Processor.bytesToSize\n * @since 3.8.0\n * @param {number} bytes 字节大小\n * @param {Object} [options] 配置项\n * @param {string} [options.spaceMark=' '] 间隔字符\n * @param {number} [options.precision=2] 精度\n * @returns {string} 存储单位值\n * @example\n *\n * bytesToSize(0); // 0 B\n * bytesToSize(1024); // 1 KB\n * bytesToSize(3.213243*1024*1024); // 3.21 MB\n * bytesToSize(1024*1024*1024); // 1 GB\n * \n * // 自定义间隔符号\n * bytesToSize(0, { spaceMark: '' }); // 0B\n * bytesToSize(1024, { spaceMark: '' }); // 1KB\n * \n */\nfunction bytesToSize(bytes, options = {}) {\n const { spaceMark = ' ', precision = 2 } = options;\n\n const numBytes = typeof bytes !== 'number' ? Number(bytes) : bytes;\n if (numBytes === 0 || isNaN(numBytes)) return `0${spaceMark}B`;\n\n const k = 1024;\n // 存储单位\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const i = Math.floor(Math.log(numBytes) / Math.log(k));\n\n return sizes[i] ? `${Number((numBytes / Math.pow(k, i)).toFixed(precision))}${spaceMark}${sizes[i]}` : numBytes + '';\n}\n\nexport default bytesToSize;\n","import normalizeString from './normalizeString';\n\n// ref: https://github.com/ant-design/ant-design-mobile/blob/v2/components/input-item/index.tsx#L240\n\n/**\n * 计算输入框的值格式化后光标位置\n *\n * @static\n * @alias module:Other.calculateCursorPosition\n * @since 4.6.0\n * @see h5示例 {@link https://2950v9.csb.app/|点击查看}\n * @see react示例 {@link https://33ccy9.csb.app/|点击查看}\n * @param {number} prevPos 赋值前的光标位置,onChange/onInput的光标位置 e.target.selectionEnd\n * @param {string} prevCtrlValue 上一个格式化后的值\n * @param {string} rawValue 当前输入原值\n * @param {string} ctrlValue 当前格式化后的值\n * @param {Object} [options] 配置项\n * @param {string[]|string} [options.placeholderChar=' '] 占位符\n * @param {RegExp} [options.maskReg=/\\D/g] 需要遮盖的字符规则。默认去掉非数字,意味着 ctrlValue 需要去掉非数字。\n * @param {'mobile'|'bankCard'} [options.type] 格式化类型,内置手机号码和银行卡号特殊处理\n * @returns {number} 格式化后的光标位置\n */\nfunction calculateCursorPosition(prevPos, prevCtrlValue, rawValue, ctrlValue, options = {}) {\n const { placeholderChar = ' ', maskReg = /\\D/g, type } = options;\n\n const realCtrlValue = normalizeString(prevCtrlValue);\n const realRawValue = normalizeString(rawValue);\n const placeholderChars = Array.isArray(placeholderChar) ? placeholderChar : [placeholderChar];\n\n const editLength = realRawValue.length - realCtrlValue.length;\n const isAddition = editLength > 0;\n\n let pos = prevPos;\n\n if (isAddition) {\n const additionStr = realRawValue.substring(pos - editLength, pos);\n let ctrlCharCount = additionStr.replace(maskReg, '').length;\n pos -= editLength - ctrlCharCount;\n\n let placeholderCharCount = 0;\n while (ctrlCharCount > 0) {\n if (placeholderChars.indexOf(ctrlValue.charAt(pos - ctrlCharCount + placeholderCharCount)) !== -1) {\n placeholderCharCount++;\n } else {\n ctrlCharCount--;\n }\n }\n pos += placeholderCharCount;\n }\n\n if ((type === 'mobile' && (pos === 4 || pos === 9)) || (type === 'bankCard' && pos > 0 && pos % 5 === 0)) {\n pos -= 1;\n }\n\n return pos;\n}\n\nexport default calculateCursorPosition;\n","import { isObject } from \"./utils/type\";\n\n/**\n * 过滤/筛选树节点。<br/><br/>如果某节点被过滤掉,它的子节点也一并抛弃\n * \n * @static\n * @alias module:Tree.filterTree\n * @since 4.15.0\n * @template {any} T\n * @template {(item: T) => boolean} F\n * @param {T[]} tree 树结构数据\n * @param {F} predicate 遍历每一项执行的函数,参数是当前遍历到的节点数据,如果返回 Truthy ,结果将包含该节点\n * @param {string} [childrenField='children'] 子级字段名\n * @param {'spread'|'self'} [nodeAssign='spread'] 节点赋值方式。spread表示使用展开运算符创建新值,self表示使用自身对象。\n * @returns {T[]}\n * @example\n * const menus = [{ \"id\": \"1\", \"name\": \"首页\", \"code\": \"trade\", \"pid\": null }, { \"id\": \"2\", \"name\": \"交易管理\", \"code\": \"trade\", \"pid\": null, \"children\": [{ \"id\": \"3\", \"name\": \"交易查询\", \"code\": \"trade-1\", \"pid\": \"2\", \"children\": [{ \"id\": \"4\", \"name\": \"交易查询-查询操作\", \"code\": \"trade-1-1\", \"pid\": \"3\" }] }] }, { \"id\": \"5\", \"name\": \"权限管理\", \"code\": \"authorization\", \"pid\": null, \"children\": [{ \"id\": \"6\", \"name\": \"角色管理\", \"code\": \"authorization-1\", \"pid\": \"5\" }, { \"id\": \"7\", \"name\": \"用户管理\", \"code\": \"authorization-2\", \"pid\": \"5\" }] }];\n * \n * filterTree(menus, item=>item.name.indexOf('管理') > -1);\n * // [{\"id\":\"2\",\"name\":\"交易管理\",\"code\":\"trade\",\"pid\":null,\"children\":[]},{\"id\":\"5\",\"name\":\"权限管理\",\"code\":\"authorization\",\"pid\":null,\"children\":[{\"id\":\"6\",\"name\":\"角色管理\",\"code\":\"authorization-1\",\"pid\":\"5\"},{\"id\":\"7\",\"name\":\"用户管理\",\"code\":\"authorization-2\",\"pid\":\"5\"}]}]\n * \n * // 如果某节点被过滤掉,它的子节点也一并抛弃\n * filterTree(menus, item=>item.id === '7');\n * // []\n * \n * filterTree(menus, item=>item.id === 'not found');\n * // []\n */\nfunction filterTree(tree, predicate, childrenField = 'children', nodeAssign = 'spread') {\n /** @type {T[]} */\n const result = [];\n\n if (!Array.isArray(tree)) {\n return result;\n }\n\n tree.forEach(item => {\n let newItem = item;\n\n if (isObject(item)) {\n // @ts-ignore\n newItem = nodeAssign === 'spread' ? { ...item } : item;\n }\n\n if (predicate(newItem)) {\n if (isObject(newItem)) {\n /** @type {T[]|undefined} */\n // @ts-ignore\n const childs = newItem[childrenField];\n\n if (Array.isArray(childs) && childs.length > 0) {\n // @ts-ignore\n newItem[childrenField] = filterTree(childs, predicate, childrenField, nodeAssign);\n }\n }\n\n result.push(newItem);\n }\n });\n\n return result;\n}\n\nexport default filterTree;","import { isObject } from \"./utils/type\";\n\n/**\n * 查找树结构数据节点\n * \n * @static\n * @alias module:Tree.findTreeNode\n * @since 4.14.0\n * @template {any} T\n * @template {(item: T) => boolean} F\n * @param {T[]} tree 树结构数据\n * @param {F} predicate 遍历每一项执行的函数,参数是当前遍历到的节点数据,如果返回 Truthy ,将返回该节点\n * @param {string} [childrenField='children'] 子级字段名\n * @returns {T|undefined}\n * @example\n * const menus = [{ \"id\": \"1\", \"name\": \"首页\", \"code\": \"trade\", \"pid\": null }, { \"id\": \"2\", \"name\": \"交易管理\", \"code\": \"trade\", \"pid\": null, \"children\": [{ \"id\": \"3\", \"name\": \"交易查询\", \"code\": \"trade-1\", \"pid\": \"2\", \"children\": [{ \"id\": \"4\", \"name\": \"交易查询-查询操作\", \"code\": \"trade-1-1\", \"pid\": \"3\" }] }] }, { \"id\": \"5\", \"name\": \"权限管理\", \"code\": \"authorization\", \"pid\": null, \"children\": [{ \"id\": \"6\", \"name\": \"角色管理\", \"code\": \"authorization-1\", \"pid\": \"5\" }, { \"id\": \"7\", \"name\": \"用户管理\", \"code\": \"authorization-2\", \"pid\": \"5\" }] }];\n * \n * findTreeNode(menus, item=>item.id === '2');\n * // {\"id\":\"2\",\"name\":\"交易管理\",\"code\":\"trade\",\"pid\":null,\"children\":[{\"id\":\"3\",\"name\":\"交易查询\",\"code\":\"trade-1\",\"pid\":\"2\",\"children\":[{\"id\":\"4\",\"name\":\"交易查询-查询操作\",\"code\":\"trade-1-1\",\"pid\":\"3\"}]}]}\n * \n * findTreeNode(menus, item=>item.id === '7');\n * // {\"id\":\"7\",\"name\":\"用户管理\",\"code\":\"authorization-2\",\"pid\":\"5\"}\n * \n * findTreeNode(menus, item=>item.id === 'not found');\n * // undefined\n */\nfunction findTreeNode(tree, predicate, childrenField = 'children') {\n const stack = [];\n\n /** @type {T|undefined} */\n let node;\n\n if (!Array.isArray(tree)) {\n return node;\n }\n\n for (const item of tree) {\n stack.push(item);\n\n while (stack.length) {\n /** @type {T} */\n // @ts-ignore\n const temp = stack.pop();\n if (predicate(temp)) {\n node = temp;\n break;\n }\n\n if (isObject(temp)) {\n /** @type {T[]} */\n // @ts-ignore\n const childs = temp[childrenField];\n if (Array.isArray(childs) && childs.length > 0) {\n stack.push(...childs);\n }\n }\n }\n\n if (node) {\n break;\n }\n }\n\n return node;\n}\n\nexport default findTreeNode;","import { isObject } from \"./utils/type\";\n\n/**\n * 查找树结构数据多个节点\n * \n * @static\n * @alias module:Tree.findTreeNodes\n * @since 4.15.0\n * @template {any} T\n * @template {(item: T) => boolean} F\n * @param {T[]} tree 树结构数据\n * @param {F} predicate 遍历每一项执行的函数,参数是当前遍历到的节点数据,如果返回 Truthy ,返回结果将包含该节点\n * @param {string} [childrenField='children'] 子级字段名\n * @returns {T[]}\n * @example\n * const menus = [{ \"id\": \"1\", \"name\": \"首页\", \"code\": \"trade\", \"pid\": null }, { \"id\": \"2\", \"name\": \"交易管理\", \"code\": \"trade\", \"pid\": null, \"children\": [{ \"id\": \"3\", \"name\": \"交易查询\", \"code\": \"trade-1\", \"pid\": \"2\", \"children\": [{ \"id\": \"4\", \"name\": \"交易查询-查询操作\", \"code\": \"trade-1-1\", \"pid\": \"3\" }] }] }, { \"id\": \"5\", \"name\": \"权限管理\", \"code\": \"authorization\", \"pid\": null, \"children\": [{ \"id\": \"6\", \"name\": \"角色管理\", \"code\": \"authorization-1\", \"pid\": \"5\" }, { \"id\": \"7\", \"name\": \"用户管理\", \"code\": \"authorization-2\", \"pid\": \"5\" }] }];\n * \n * findTreeNodes(menus, item=>item.id === '2');\n * // [{\"id\":\"2\",\"name\":\"交易管理\",\"code\":\"trade\",\"pid\":null,\"children\":[{\"id\":\"3\",\"name\":\"交易查询\",\"code\":\"trade-1\",\"pid\":\"2\",\"children\":[{\"id\":\"4\",\"name\":\"交易查询-查询操作\",\"code\":\"trade-1-1\",\"pid\":\"3\"}]}]}]\n * \n * findTreeNodes(menus, item=>item.name.indexOf('管理') > -1);\n * // [{\"id\":\"2\",\"name\":\"交易管理\",\"code\":\"trade\",\"pid\":null,\"children\":[{\"id\":\"3\",\"name\":\"交易查询\",\"code\":\"trade-1\",\"pid\":\"2\",\"children\":[{\"id\":\"4\",\"name\":\"交易查询-查询操作\",\"code\":\"trade-1-1\",\"pid\":\"3\"}]}]},{\"id\":\"5\",\"name\":\"权限管理\",\"code\":\"authorization\",\"pid\":null,\"children\":[{\"id\":\"6\",\"name\":\"角色管理\",\"code\":\"authorization-1\",\"pid\":\"5\"},{\"id\":\"7\",\"name\":\"用户管理\",\"code\":\"authorization-2\",\"pid\":\"5\"}]},{\"id\":\"7\",\"name\":\"用户管理\",\"code\":\"authorization-2\",\"pid\":\"5\"},{\"id\":\"6\",\"name\":\"角色管理\",\"code\":\"authorization-1\",\"pid\":\"5\"}]\n * \n * findTreeNodes(menus, item=>item.id === '1' || item.id === '7');\n * // [{\"id\":\"1\",\"name\":\"首页\",\"code\":\"trade\",\"pid\":null},{\"id\":\"7\",\"name\":\"用户管理\",\"code\":\"authorization-2\",\"pid\":\"5\"}]\n * \n * findTreeNodes(menus, item=>item.id === 'not found');\n * // []\n */\nfunction findTreeNodes(tree, predicate, childrenField = 'children') {\n const stack = [];\n\n /** @type {T[]} */\n let nodes = [];\n\n if (!Array.isArray(tree)) {\n return nodes;\n }\n\n for (const item of tree) {\n stack.push(item);\n\n while (stack.length) {\n /** @type {T} */\n // @ts-ignore\n const temp = stack.pop();\n if (predicate(temp)) {\n nodes.push(temp);\n }\n\n if (isObject(temp)) {\n /** @type {T[]} */\n // @ts-ignore\n const childs = temp[childrenField];\n if (Array.isArray(childs) && childs.length > 0) {\n stack.push(...childs);\n }\n }\n }\n }\n\n return nodes;\n}\n\nexport default findTreeNodes;","import normalizeString from './normalizeString';\n\n/**\n * 格式化银行卡号\n *\n * @static\n * @alias module:Processor.formatBankCard\n * @since 1.1.0\n * @param {string} bankCardNo 要处理的字符串\n * @param {Object} [options] 配置项\n * @param {string} [options.spaceMark=' '] 间隔字符\n * @param {number} [options.length=4] 间隔长度\n * @returns {string} 格式化的银行卡号\n * @example\n *\n * // 19位银行卡\n * formatBankCard('6228480402564890018'); // 6228 4804 0256 4890 018\n *\n * // 16位银行卡\n * formatBankCard('6228480402564890'); // 6228 4804 0256 4890\n *\n * // 脱敏银行卡\n * formatBankCard('6228********890'); // 6228 **** **** 890\n *\n * // 16位银行卡,\"-\"间隔\n * formatBankCard('6228480402564890', {spaceMark: '-'}); // 6228-4804-0256-4890\n *\n */\nfunction formatBankCard(bankCardNo = '', options = {}) {\n // @ts-ignore\n // TODO 下个版本废弃 char\n const { char = ' ', length = 4 } = options;\n const realSpaceMark = 'spaceMark' in options ? options.spaceMark : char;\n\n const reg = new RegExp(`(.{${length}})`, 'g');\n const regChar = new RegExp(`${realSpaceMark}`, 'g');\n\n const realValue = normalizeString(bankCardNo).replace(regChar, '');\n const str = realValue.replace(reg, `$1${realSpaceMark}`);\n\n return realValue.length % length === 0 ? str.substring(0, str.length - 1) : str;\n}\n\nexport default formatBankCard;\n","import normalizeString from './normalizeString';\n\n/**\n * 格式化手机号码\n *\n * @static\n * @alias module:Processor.formatMobile\n * @since 4.5.0\n * @param {string} mobileNo 手机号码\n * @param {object} [options] 配置项\n * @param {string} [options.spaceMark=' '] 间隔字符\n * @returns {string} 格式化后的手机号码\n * @example\n * \n * formatMobile('13345678900'); // 133 4567 8900\n * formatMobile('13345678900', { spaceMark: '-' }); // 133-4567-8900\n *\n * // 脱敏手机号码\n * formatMobile('133****1234'); // 133 **** 1234\n * formatMobile('133****1234', { spaceMark: '-' }); // 133-****-1234\n *\n * // 手机号码位数不够\n * formatMobile('133'); // 133\n * formatMobile('133456'); // 133 456\n * formatMobile('13345678'); // 133 4567 8\n * \n */\nfunction formatMobile(mobileNo, options = {}) {\n // @ts-ignore\n // TODO 下个版本废弃 char\n const { char = ' ' } = options;\n const realSpaceMark = 'spaceMark' in options ? options.spaceMark : char;\n\n const regChar = new RegExp(realSpaceMark, 'g');\n const realValue = normalizeString(mobileNo).replace(regChar, '').substring(0, 11);\n\n if (realValue.length > 7) {\n return realValue.replace(/^(...)(....)/g, `$1${realSpaceMark}$2${realSpaceMark}`);\n }\n if (realValue.length > 3) {\n return realValue.replace(/^(...)/g, `$1${realSpaceMark}`);\n }\n return realValue;\n}\n\nexport default formatMobile;\n","import validatePassword from './validatePassword';\n\n/**\n * 检测值是否符合密码强度\n * <p><strong>注意:该校验只校验是否存在不同字符(大小写字母、数字、特殊符号),不判断长度。</strong></p>\n * <p><i>如果需要更细致的验证,请使用 <a href=\"#.validatePassword\">validatePassword</a></i></p>\n *\n * @see 参考 {@link https://baike.baidu.com/item/ASCII#3|ASCII}\n * @static\n * @alias module:Validator.isPassword\n * @since 1.1.0\n * @requires module:Validator.validatePassword\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {number} [options.level=2] 密码强度 1-包含一种字符 2-包含两种字符 3-包含三种字符。(大写字母、小写字母、数字、特殊字符)\n * @param {boolean} [options.ignoreCase=false] 是否忽略大小写,为 ture 时,大小写字母视为一种字符\n * @param {string} [options.special=\"!@#$%^&*()-=_+[]\\|{},./?<>~\"] 支持的特殊字符\n * @returns {boolean} 值是否符合密码强度\n * @example\n *\n * isPassword('a12345678'); // true\n * \n * // 3级密码强度\n * isPassword('a12345678', {level: 3}); // false\n * isPassword('Aa12345678', {level: 3}); // true\n * \n * // 3级密码强度,大小写字符仅计算1级强度\n * isPassword('Aa12345678', {level: 3, ignoreCase: true}); // false\n * isPassword('_Aa12345678', {level: 3, ignoreCase: true}); // true\n *\n * // 仅支持 数字、字母、特殊字符,其他非法字符如中文字符是校验不通过的\n * isPassword('_Aa一二三45678', {level: 3, ignoreCase: true}); // false\n * isPassword(' _Aa12345678', {level: 3, ignoreCase: true}); // false\n * \n */\nfunction isPassword(value, options = {}) {\n const { level = 2, ignoreCase = false, special = '\\\\x21-\\\\x2F\\\\x3A-\\\\x40\\\\x5B-\\\\x60\\\\x7B-\\\\x7E' } = options;\n\n return validatePassword(value, { level, ignoreCase, special }).validated;\n}\n\nexport default isPassword;\n","/**\n * 检测值是否类似Promise对象\n *\n * @static\n * @alias module:Validator.isPromiseLike\n * @since 3.8.0\n * @param {*} obj 要检测的值\n * @returns {boolean} 是否类似Promise对象\n * @example\n *\n * isPromiseLike([]); // false\n * isPromiseLike({ then: () => { } }); // true\n * isPromiseLike(Promise.resolve()); // true\n * \n */\nfunction isPromiseLike(obj) {\n return obj !== null && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function';\n}\n\nexport default isPromiseLike;\n","import { digitLength, transformEffectiveNumber } from './utils/math.util';\nimport times from './times';\n\n/**\n * 精确减法,支持多个数相减,减数默认为 0 。\n *\n * @static\n * @alias module:Math.minus\n * @since 3.1.0\n * @param {...number|string} nums 相减的数\n * @returns {number} 差\n * @example\n *\n * minus(1, 0.9); // 0.1\n * minus(1, 0.9, 0.02); // 0.08\n * minus(1, 0.9, 0.02, 0.08); // 0\n * \n */\nfunction minus(...nums) {\n let [num1, num2 = 0, ...rest] = nums;\n\n if (rest.length > 0) {\n return minus(minus(num1, num2), ...rest);\n }\n\n num1 = transformEffectiveNumber(num1);\n num2 = transformEffectiveNumber(num2);\n\n // 兼容处理,如果参数包含无效数值时,返回 NaN\n // @ts-ignore\n if (isNaN(num1) || isNaN(num2)) {\n return Number.NaN;\n }\n\n const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));\n return (times(num1, baseNum) - times(num2, baseNum)) / baseNum;\n}\n\nexport default minus;\n","import normalizeString from './normalizeString';\n\n/**\n * 前置补零\n *\n * @static\n * @alias module:Processor.padZero\n * @since 4.7.0\n * @param {string|number} value 要处理的值\n * @param {number} [size=2] 指定字符串长度\n * @returns {string} 用零填充数字到给定长度的字符串\n * @example\n * padZero(5); // 05\n * padZero('5'); // 05\n *\n * padZero(12); // 12\n * padZero('12'); // 12\n *\n * padZero(688); // 688\n * padZero('688'); // 688\n *\n * padZero(688, 5); // 00688\n * padZero('688', 5); // 00688\n * \n */\nfunction padZero(value, size = 2) {\n const str = normalizeString(value);\n const len = str.length;\n\n if (typeof size !== 'number' || size < 0) {\n size = 0;\n }\n\n if (len < size) {\n return '0'.repeat(size - len) + str;\n }\n return str;\n}\n\nexport default padZero;\n","import { digitLength, transformEffectiveNumber } from './utils/math.util';\nimport times from './times';\n\n/**\n * 精确加法,支持多个数相加,加数默认为 0 。\n *\n * @static\n * @alias module:Math.plus\n * @since 3.1.0\n * @param {...number|string} nums 相加的数\n * @returns {number} 总和\n * @example\n *\n * plus(0.1, 0.2); // 0.3\n * plus(0.1, 0.2, 0.3); // 0.6\n * plus(0.1, 0.2, 0.3, 0.4); // 1\n * \n */\nfunction plus(...nums) {\n let [num1, num2 = 0, ...rest] = nums;\n\n if (rest.length > 0) {\n return plus(plus(num1, num2), ...rest);\n }\n\n num1 = transformEffectiveNumber(num1);\n num2 = transformEffectiveNumber(num2);\n\n // 兼容处理,如果参数包含无效数值时,返回 NaN\n // @ts-ignore\n if (isNaN(num1) || isNaN(num2)) {\n return Number.NaN;\n }\n\n const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));\n return (times(num1, baseNum) + times(num2, baseNum)) / baseNum;\n}\n\nexport default plus;\n","import normalizeString from './normalizeString';\n\n/**\n * 替换字符,应用场景如:脱敏\n *\n * @static\n * @alias module:Processor.replaceChar\n * @since 1.1.0\n * @param {string} str 要处理的字符串\n * @param {Object} [options] 配置项\n * @param {number} [options.start=3] 开始位置\n * @param {number} [options.end=-4] 结束位置\n * @param {string} [options.char=\"*\"] 替换字符\n * @param {number} [options.repeat] 替换字符的重复次数,默认为替换内容长度,可设置为固定值\n * @param {string} [options.exclude] 排除字符,如果指定排除项,repeat设置无效\n * @returns {string} 处理后的字符\n * @example\n *\n * // 手机号 前3后4\n * replaceChar('13000000000'); // 130****0000\n *\n * // 身份证 前6后4\n * replaceChar('130701199310302288', { start: 6, end: -4 }); // 130701********2288\n *\n * // 邮箱 @前两位\n * const email = '12345@qq.com'\n * const emailAtIndex = email.indexOf('@');\n * replaceChar(email, { start: emailAtIndex - 2, end: emailAtIndex }); // 123**@qq.com\n * // 邮箱 前2和@后面内容,固定替换字符4位\n * replaceChar(email, {start: 2, end: email.indexOf('@'), repeat: 4}); // 12****@qq.com\n *\n * // 银行卡号 只展示后4位,固定替换字符4位\n * replaceChar('6228480402564890018', {start: 0, end: -4, repeat: 4}); // ****0018\n * // 银行卡号 前6后4\n * replaceChar('6228480402564890018', { start: 6, end: -4 }); // 622848*********0018\n * // 银行卡号 前4后3 忽略格式的空格\n * replaceChar('6228 4804 0256 4890 018', {start: 4, end: -4, exclude: ' '}); // 6228 **** **** **** 018\n *\n * // 用户名\n * replaceChar('林某某', {start: 1, end: Infinity, repeat: 2}); // 林**\n * replaceChar('林某', {start: 1, end: Infinity, repeat: 2}); // 林**\n * replaceChar('林某某某', {start: 1, end: Infinity, repeat: 2}); // 林**\n *\n */\nfunction replaceChar(str, options = {}) {\n const { char = '*', exclude } = options;\n let { start = 3, end = -4, repeat } = options;\n\n const realStr = normalizeString(str);\n const strLen = realStr.length;\n\n // 开始位置超过str长度\n if (Math.abs(start) >= strLen) {\n return realStr;\n }\n\n start = start >= 0 ? start : strLen + start;\n end = end >= 0 ? end : strLen + end;\n\n // 开始位置大于结束位置\n if (start >= end) {\n return realStr;\n }\n\n let middleStr = realStr.substring(start, end);\n\n if (exclude) {\n const reg = new RegExp(`[^${exclude}]`, 'g');\n middleStr = middleStr.replace(reg, char);\n } else {\n repeat = typeof repeat === 'number' && repeat >= 0 ? repeat : middleStr.length;\n middleStr = char.repeat(repeat);\n }\n\n return realStr.substring(0, start) + middleStr + realStr.substring(end);\n}\n\nexport default replaceChar;\n","import divide from './divide';\nimport times from './times';\nimport { transformEffectiveNumber } from './utils/math.util';\n\n/**\n * 四舍五入,支持设置精度\n *\n * @static\n * @alias module:Math.round\n * @since 3.1.0\n * @param {number|string} num 要四舍五入的数字\n * @param {number} [precision=0] 四舍五入的精度\n * @returns {number} 四舍五入的数字\n * @example\n *\n * round(4.006); // 4\n * round(4.006, 2); // 4.01\n * round(4060, -2); // 4100\n * \n */\nfunction round(num, precision = 0) {\n num = transformEffectiveNumber(num);\n\n // 兼容处理,如果参数包含无效数值时,返回 NaN\n // @ts-ignore\n if (isNaN(num)) {\n return Number.NaN;\n }\n\n const base = Math.pow(10, precision);\n return divide(Math.round(times(num, base)), base);\n}\n\nexport default round;\n","/**\n * @overload\n * @return {Date}\n */\n\n/**\n * @overload\n * @param {number | string | Date} value Unix时间戳、时间戳字符串 dateString 、Date 日期对象\n * @return {Date}\n */\n\n/**\n * @overload\n * @param {number} year 表示年份的整数值。0 到 99 会被映射至 1900 年至 1999 年,其他值代表实际年份。\n * @param {number} monthIndex 表示月份的整数值,从 0(1 月)到 11(12 月)。\n * @param {number} [date] 表示一个月中的第几天的整数值,从 1 开始。默认值为 1。\n * @param {number} [hours] 表示一天中的小时数的整数值 (24 小时制)。默认值为 0(午夜)。\n * @param {number} [minutes] 表示一个完整时间(如 01:10:00)中的分钟部分的整数值。默认值为 0。\n * @param {number} [seconds] 表示一个完整时间(如 01:10:00)中的秒部分的整数值。默认值为 0。\n * @param {number} [ms] 表示一个完整时间的毫秒部分的整数值。默认值为 0。\n * @return {Date}\n */\n\n/**\n * 创建一个 Date 实例日期对象,同 <a href=\"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date#%E5%8F%82%E6%95%B0\">new Date()</a> <br/><br/>\n * \n * 规避了苹果设备浏览器不支持部分格式(例如,YYYY-MM-DD HH-mm 或 YYYY.MM.DD)。<br/>\n * 如果参数为 undefined 正常返回 Date 。\n *\n * @static\n * @alias module:Processor.safeDate\n * @see 参考 {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date|Date}\n * @since 4.4.0\n * @param {string|number|Date} [value] 日期时间字符串、毫秒数、日期对象\n * @param {...number} args 月/日/时/分/秒/毫秒\n * @returns {Date} Date 实例日期对象\n * @example\n * \n * safeDate('2022-1-1'); // Sat Jan 01 2022 00:00:00 GMT+0800 (中国标准时间)\n * safeDate('2022/1/1'); // Sat Jan 01 2022 00:00:00 GMT+0800 (中国标准时间)\n * safeDate('2022.1.1'); // Sat Jan 01 2022 00:00:00 GMT+0800 (中国标准时间)\n * safeDate('2022.1.1 11:11'); // Sat Jan 01 2022 11:11:00 GMT+0800 (中国标准时间)\n * safeDate(99, 1); // Mon Feb 01 1999 00:00:00 GMT+0800 (中国标准时间)\n * safeDate(1646711233171); // Tue Mar 08 2022 11:47:13 GMT+0800 (中国标准时间)\n */\nfunction safeDate(value, ...args) {\n const safeValue = typeof value === 'string' ? value.replace(/[\\\\.-]/g, '/') : value;\n\n if (args && args.length > 0) {\n // @ts-ignore\n return new Date(safeValue, ...args);\n }\n\n return typeof safeValue === 'undefined' ? new Date() : new Date(safeValue);\n}\n\nexport default safeDate;\n","/**\n * 设置 DataURL 前缀、MIME 类型、base64 标识。<br/>\n * 如果你需要获取DataURL 的 MIME 类型和数据本身,推荐使用 <a href=\"https://www.npmjs.com/package/data-urls\">data-urls</a>。\n *\n * @static\n * @alias module:Processor.setDataURLPrefix\n * @see 参考 {@link https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Data_URIs|Data URLs}\n * @see 参考 {@link https://mimesniff.spec.whatwg.org/#understanding-mime-types|MIME types}\n * @since 4.1.0\n * @param {string} data 数据本身\n * @param {string} [mimetype=\"image/png\"] MIME 类型\n * @param {boolean} [base64=true] 添加 base64 标识\n * @returns {string} DataURL 格式的字符串\n * @example\n * \n * const data = 'PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=';\n * setDataURLPrefix(data); // data:image/png;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=\n * setDataURLPrefix(data, 'image/png', false); // data:image/png,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=\n * setDataURLPrefix(data, 'image/jpg'); // data:image/jpg;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=\n * setDataURLPrefix(data, 'text/html'); // data:text/html;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=\n * setDataURLPrefix(data, ''); // data:;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=\n * setDataURLPrefix(data, '', false); // data:,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=\n * \n */\nfunction setDataURLPrefix(data, mimetype = 'image/png', base64 = true) {\n return `data:${mimetype}${base64 ? ';base64' : ''},${data}`;\n}\n\nexport default setDataURLPrefix;\n","import normalizeString from './normalizeString';\n\n/**\n * 获取字符长度。中文汉字占2个字符,英文占1个字符,特殊如emoji占4个字符。\n *\n * @static\n * @alias module:Other.strlen\n * @since 4.10.0\n * @param {string} str 字符串\n * @returns {number} 字符长度\n * @example\n *\n * strlen('你好a'); // 5\n * strlen('你好,世界!'); // 12\n * strlen('严両丞丽'); // 8\n * strlen('abcde'); // 5\n * strlen('𠮷'); // 4\n * strlen('🍎'); // 4\n *\n */\nfunction strlen(str) {\n const realStr = normalizeString(str);\n let len = 0;\n for (let i = 0; i < realStr.length; i++) {\n const c = realStr.charCodeAt(i);\n if ((c >= 0x0001 && c <= 0x007e) || (0xff60 <= c && c <= 0xff9f)) {\n len++;\n } else {\n len += 2;\n }\n }\n return len;\n}\n\nexport default strlen;\n","// 如果修改文档,请同步修改 interface.doc.js\n\nimport { isObject } from './utils/type';\n\n/**\n * 转换字段名,返回一个转换字段后的值,不改变原值。\n * \n * @static\n * @alias module:Processor.transformFieldNames\n * @since 4.14.0\n * @template {*} D\n * @template {Record<string, keyof D>} F\n * @template {string} C\n * @param {D[]} data 对象数组。如果是树结构数据,需要指定第三个参数 childrenField\n * @param {F} fieldNames 字段名映射\n * @param {C} [childrenField] 子级数据字段名\n * @param {'spread'|'self'} [nodeAssign='spread'] 节点赋值方式。spread表示使用展开运算符创建新值,self表示使用自身对象。\n * @returns {import('./interface.type.js').TransformFieldNames<D, F, C>}\n * @example\n * \n * const options = [{code: '1', name: 'one'},{code:'2', name:'two'}];\n * const newOptions = transformFieldNames(options, {label: 'name', value: 'code'});\n * // [{value: '1', label: 'one'},{value:'2', label:'two'}]\n * \n * // 嵌套数据,指定子级字段名 children\n * const options2 = [{code: '1', name: 'one'},{code:'2', name:'two', children: [{code:'2-1', name:'two-one', children: [{code: '2-1-1', name:'two-one-one'}]}]}];\n * const newOptions2 = transformFieldNames(options2, {label: 'name', value: 'code'}, 'children');\n * // [{value: '1', label: 'one'},{value:'2', label:'two', children: [{value: '2-1', label:'two-one', children: [{value: '2-1-1', label:'two-one-one'}]}]}]\n * \n * const options3 = [{code: '1', name: 'one'},{code:'2', name:'two', childs: [{code:'2-1', name:'two-one'}]}];\n * const newOptions3 = transformFieldNames(options3, {label: 'name', value: 'code'}, 'childs');\n * // [{value: '1', label: 'one'},{value:'2', label:'two', childs: [{value: '2-1', label:'two-one'}]}]\n * \n * // 嵌套数据,并替换子集字段名\n * const newOptions4 = transformFieldNames(options3, {label: 'name', value: 'code', children: 'childs'}, 'childs');\n * // [{value: '1', label: 'one'},{value:'2', label:'two', children: [{value: '2-1', label:'two-one'}]}]\n */\nfunction transformFieldNames(data, fieldNames, childrenField, nodeAssign = 'spread') {\n if (!Array.isArray(data)) {\n return data;\n }\n\n if (data.length <= 0) {\n // @ts-ignore\n return [];\n }\n\n /**\n * 递归处理字段名\n * \n * @param {Array.<object>} arr 列表数据\n * @returns {*}\n */\n function recusion(arr) {\n return arr.map(item => {\n if (!isObject(item)) {\n return item;\n }\n\n const newItem = nodeAssign === 'spread' ? { ...item } : item;\n /** @type {Array.<string>} */\n const delKeys = [];\n\n // 树形数据子节点\n // @ts-ignore\n if (childrenField && Array.isArray(newItem[childrenField]) && newItem[childrenField].length > 0) {\n // @ts-ignore\n newItem[childrenField] = recusion(newItem[childrenField].slice());\n }\n\n // 替换字段名\n Object.keys(fieldNames).forEach(newKey => {\n const oldKey = fieldNames[newKey];\n if (oldKey in newItem) {\n // @ts-ignore\n newItem[newKey] = newItem[oldKey];\n // @ts-ignore\n delKeys.push(oldKey);\n }\n });\n\n // 删除旧字段\n if (delKeys.length > 0) {\n delKeys.forEach(delKey => {\n // @ts-ignore\n delete newItem[delKey];\n });\n }\n\n return newItem;\n });\n }\n\n // @ts-ignore\n return recusion(data.slice());\n}\n\nexport default transformFieldNames;","import { isObject } from \"./utils/type\";\n\n/**\n * 树结构转列表数据\n * \n * @static\n * @alias module:Tree.treeToList\n * @since 4.14.0\n * @template {Record<string,any>} T\n * @template {keyof T} K\n * @template {Omit<T, K>} R\n * @param {T[]} tree 列表数据\n * @param {K} childrenField 子级字段名称\n * @returns {R[]} 列表数据\n * @example\n * const menus = [{ \"id\": \"1\", \"name\": \"首页\", \"code\": \"trade\", \"pid\": null }, { \"id\": \"2\", \"name\": \"交易管理\", \"code\": \"trade\", \"pid\": null, \"children\": [{ \"id\": \"3\", \"name\": \"交易查询\", \"code\": \"trade-1\", \"pid\": \"2\", \"children\": [{ \"id\": \"4\", \"name\": \"交易查询-查询操作\", \"code\": \"trade-1-1\", \"pid\": \"3\" }] }] }, { \"id\": \"5\", \"name\": \"权限管理\", \"code\": \"authorization\", \"pid\": null, \"children\": [{ \"id\": \"6\", \"name\": \"角色管理\", \"code\": \"authorization-1\", \"pid\": \"5\" }, { \"id\": \"7\", \"name\": \"用户管理\", \"code\": \"authorization-2\", \"pid\": \"5\" }] }];\n * \n * treeToList(menus, 'children'));\n * // [{\"id\":\"1\",\"name\":\"首页\",\"code\":\"trade\",\"pid\":null},{\"id\":\"2\",\"name\":\"交易管理\",\"code\":\"trade\",\"pid\":null},{\"id\":\"3\",\"name\":\"交易查询\",\"code\":\"trade-1\",\"pid\":\"2\"},{\"id\":\"4\",\"name\":\"交易查询-查询操作\",\"code\":\"trade-1-1\",\"pid\":\"3\"},{\"id\":\"5\",\"name\":\"权限管理\",\"code\":\"authorization\",\"pid\":null},{\"id\":\"6\",\"name\":\"角色管理\",\"code\":\"authorization-1\",\"pid\":\"5\"},{\"id\":\"7\",\"name\":\"用户管理\",\"code\":\"authorization-2\",\"pid\":\"5\"}]\n */\nfunction treeToList(tree, childrenField) {\n /** @type {R[]} */\n const list = [];\n\n if (!Array.isArray(tree)) {\n return list;\n }\n\n /**\n * 递归遍历\n * @param {T[]} arr 列表数据\n */\n function recusion(arr) {\n arr.forEach(item => {\n if (isObject(item)) {\n const newItem = { ...item };\n // @ts-ignore\n list.push(newItem);\n\n if (newItem[childrenField]) {\n if (Array.isArray(newItem[childrenField]) && newItem[childrenField].length > 0) {\n recusion(newItem[childrenField]);\n }\n delete newItem[childrenField];\n }\n } else {\n // @ts-ignore\n list.push(item);\n }\n });\n }\n\n recusion(tree);\n return list;\n}\n\n// function treeToList(tree, childrenField) {\n// /** @type {R[]} */\n// const list = [];\n\n// // 深度优先\n// /** @type {T[]} */\n// const stack = [];\n// for (const item of tree) {\n// if (isObject(item)) {\n// stack.push(item);\n\n// while (stack.length) {\n// /** @type {T} */\n// // @ts-ignore\n// const temp = stack.shift();\n\n// // @ts-ignore\n// list.push(temp);\n\n// if (temp[childrenField]) {\n// if (Array.isArray(temp[childrenField]) && temp[childrenField].length > 0) {\n// stack.push(...temp[childrenField]);\n// }\n// delete temp[childrenField];\n// }\n// }\n// } else {\n// // @ts-ignore\n// list.push(item);\n// }\n// }\n// return list;\n// }\n\nexport default treeToList;","/**\n * 等待时间返回 Promise 。常用于异步方法中延时。\n *\n * @static\n * @alias module:Other.waitTime\n * @since 4.2.0\n * @param {number} [time=1000] 延时时间,单位毫秒\n * @returns {Promise<void>}\n * @example\n * \n * const test = async ()=>{\n * await waitTime();\n * // do something\n * }\n *\n * waitTime(500).then(()=>{\n * // do something\n * });\n * \n */\nfunction waitTime(time = 1000) {\n return new Promise((resolve) => {\n setTimeout(resolve, time);\n });\n}\n\nexport default waitTime;\n"],"names":["toString","Object","prototype","isType","value","typename","call","concat","isString","normalizeString","isUndefined","isNull","isNil","String","convertToString","reg","regIdCard","check","id","index","sum","num","Math","pow","Number","toUpperCase","regLoose","sumCheckCode","numStr","numArr","replace","split","reverse","i","length","currNum","parseInt","mod","baseReg","baseCodeArr","preCode","total","_loop","findIndex","item","wf","remainder","config","disableWarning","devWarn","_console","console","warn","apply","arguments","regNumber","regLowerCaseLetter","regUpperCaseLetter","regAllNumberAndLetter","hasNumber","val","test","hasLowerCaseLetter","hasUpperCaseLetter","hasHex","indexOf","hasSpecialCharacter","chars","specialChars","regChars","RegExp","ret","some","charItem","hasUnallowableCharacter","validatePassword","options","undefined","level","_options$level","_options$ignoreCase","ignoreCase","_options$special","special","valStr","currentLevel","containesNumber","containesLowerCaseLetter","containesUpperCaseLetter","containesSpecialCharacter","containesUnallowableCharacter","validated","containes","number","lowerCaseLetter","upperCaseLetter","specialCharacter","unallowableCharacter","chineseDictionary","looseChineseRegExp","chineseRegExp","chineseWithExtend","looseChineseExtendRegExp","chineseExtendRegExp","supportRegExpUnicode","hasOwnProperty","serverReg","portReg","pathReg","searchReg","regWithProtocal","protocalReg","regNonProtocal","isUrl","valueStr","pj","j","sj10","regHMCard","regTWCard","singleRegTWCard","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","isBlob","isObject","type","_isNaN","isNaN","transformEffectiveNumber","trim","NaN","isSymbol","isNumber","isScientificNumber","strip","precision","parseFloat","toPrecision","digitLength","eSplit","len","float2Fixed","strNum","dLen","checkBoundary","trimLeftZero","result","exec","scientificToNumber","parts","toLowerCase","e","pop","l","abs","sign","coeff_array","intVal","thanLen","dec","slice","zero","Array","join","substring","checkNumber","formatInt","intStr","thousand","txt","negativeSymbol","reArr","formatDec","decStr","decimal","toFixed","formatMoney$1","_options$precision","symbol","_options$thousand","_options$decimal","_strNum$split","_strNum$split2","_slicedToArray","numberChar","unitChar","unitSection","chnNumberChar","chnUnitChar","big5NumberChar","big5UnitChar","sectionToChinese","section","str","chnstr","unitPos","v","floor","convertInteger","numInt","strIns","chnStr","needZero","convertDecimal","decimalStr","mapNumberChar","province","city","area","year","month","day","gender","Provinces","FileReaderMethodMap","arrayBuffer","binaryString","dataURL","text","fileReader","blob","method","Promise","resolve","reject","reader","FileReader","onload","onerror","error","dataURLToBlob","dataurl","meta","bstr","atob","decodeURIComponent","n","u8arr","Uint8Array","charCodeAt","Blob","times","_len","nums","_key","num1","_nums$","num2","rest","num1Changed","num2Changed","baseNum","leftValue","divide","ajax","url","_ref$method","_ref","_ref$data","data","timeout","headers","_ref$withCredentials","withCredentials","_ref$async","async","_ref$user","user","_ref$password","password","responseType","onAbort","onError","onLoad","onLoadEnd","onLoadStart","onProgress","onTimeout","xhr","XMLHttpRequest","open","_typeof","keys","map","setRequestHeader","cb","wrapError","events","loadstart","progress","abort","load","loadend","func","addEventListener","send","saver","blobUrl","fileName","anchor","document","createElement","href","style","display","setAttribute","handleClick","stopPropagation","removeEventListener","body","appendChild","click","removeChild","letterChars","defaultChars","internalRandomString","optionalChars","prefix","r","random","processEmptyChildren","arr","_ref$childrenField","childrenField","_ref$emptyChildrenVal","emptyChildrenValue","forEach","internalFindTreeSelect","tree","predicate","path","isArray","_step","_iterator","_createForOfIteratorHelper","s","done","push","childs","findChildren","err","f","bytes","spaceMark","_options$spaceMark","numBytes","k","sizes","log","prevPos","prevCtrlValue","rawValue","ctrlValue","placeholderChar","_options$placeholderC","_options$maskReg","maskReg","realCtrlValue","realRawValue","placeholderChars","editLength","isAddition","pos","additionStr","ctrlCharCount","placeholderCharCount","charAt","download","payload","dataType","transformRequest","transformResponse","defaultAjaxOptions","ajaxOptions","then","res","target","response","navigator","msSaveBlob","URL","createObjectURL","revokeObjectURL","filterTree","nodeAssign","newItem","node","stack","temp","_toConsumableArray","nodes","bankCardNo","_options$char","char","_options$length","realSpaceMark","regChar","realValue","mobileNo","loose","_options$loose","_options$luhn","luhn","validateResult","precode","checkCode","_options$checkCode","cc","needCheckCode","passBaseRule","lastCode","_options$useExtend","useExtend","basicRegExp","extendRegExp","hasExtend","resultRegExp","flag","obj","list","_ref2$keyField","_ref2","keyField","_ref2$parentField","parentField","_ref2$childrenField","_ref2$emptyChildrenVa","_ref2$nodeAssign","record","pid","minus","max","big5","_options$big","_options$unit","unit","_options$zero","_options$negative","negative","_options$unitConfig","unitConfig","unitWan","w","unitYi","y","unitWanYi","chnInteger","chnDecimal","preStr","numAbs","size","repeat","match","origin","groups","find","birthday","plus","realChars","exclude","start","_options$start","_options$end","end","realStr","strLen","middleStr","base","round","safeValue","args","_construct","Date","mimetype","base64","bool","c","fieldNames","recusion","delKeys","newKey","oldKey","delKey","time","setTimeout"],"mappings":"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"}