util-helpers 5.5.1 → 5.7.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.
@@ -1 +1 @@
1
- {"version":3,"file":"util-helpers.min.js","sources":["../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/internals/native.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/isArray.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/isObjectLike.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/isObject.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/internals/getTag.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/isSymbol.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/toNumber.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/identity.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/isArrayLike.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/isLength.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/isFunction.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/toFinite.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/randomInt.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/allKeys.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/internals/getSymbols.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/forEach.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/internals/createForEach.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/isNumber.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/toString.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/isNil.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/isBlob.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/isPlainObject.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/isFile.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/internals/root.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/isNaN.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/isPromiseLike.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/isString.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/internals/decimalAdjust.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/toInteger.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/isFinite.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/round.js","../node_modules/.pnpm/@rollup+plugin-typescript@11.1.6_rollup@4.28.1_tslib@2.8.1_typescript@5.7.2/node_modules/tslib/tslib.es6.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/tryit.js","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/uniqueId.js","../src/isMobile.ts","../src/isTelephone.ts","../src/isPostcode.ts","../src/isIdCard.ts","../src/isEmail.ts","../src/isQQ.ts","../src/isWX.ts","../src/isVehicle.ts","../src/isBankCard.ts","../src/isSocialCreditCode.ts","../src/utils/config.ts","../src/utils/devWarn.ts","../src/validatePassword.ts","../src/isPassport.ts","../src/utils/setup.ts","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/constant.js","../src/utils/native.ts","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/noop.js","../src/isChinese.ts","../src/isIPv4.ts","../src/isIPv6.ts","../src/isUrl.ts","../src/isBusinessLicense.ts","../src/isHMCard.ts","../src/isTWCard.ts","../src/isSwiftCode.ts","../src/isValidNumber.ts","../src/checkResult.ts","../src/utils/math.util.ts","../src/numberToChinese.ts","../src/bytesToSize.ts","../src/parseIdCard.ts","../src/transformObjectValue.ts","../src/times.ts","../src/divide.ts","../src/gcd.ts","../src/ajax.ts","../src/utils/file.util.ts","../src/getExtname.ts","../node_modules/.pnpm/ut2@1.15.0/node_modules/ut2/es/nth.js","../src/checkFileType.ts","../src/getFileBlob.ts","../src/loadImage.ts","../src/loadImageWithBlob.ts","../src/dataURLToBlob.ts","../src/download.ts","../src/fileReader.ts","../src/getFileType.ts","../src/getMimeType.ts","../src/randomString.ts","../src/listToTree.ts","../src/findTreeSelect.ts","../src/VERSION.ts","../node_modules/.pnpm/emitter-pro@1.2.2/node_modules/emitter-pro/dist/emitter-pro.esm.js","../node_modules/.pnpm/cache2@3.1.2/node_modules/cache2/dist/cache2.esm.js","../src/AsyncMemo.ts","../src/calculateCursorPosition.ts","../src/compressImage.ts","../src/filterTree.ts","../src/findTreeNode.ts","../src/findTreeNodes.ts","../src/formatBankCard.ts","../src/formatMobile.ts","../src/formatMoney.ts","../src/getImageInfo.ts","../src/injectStyle.ts","../src/isPassword.ts","../src/lcm.ts","../src/loadScript.ts","../src/minus.ts","../src/padZero.ts","../src/plus.ts","../src/replaceChar.ts","../src/round.ts","../src/safeDate.ts","../src/setDataURLPrefix.ts","../src/strlen.ts","../src/transformFieldNames.ts","../src/treeToList.ts"],"sourcesContent":["var nativeUndefined = void 0;\nvar stringUndefined = 'undefined';\nvar stringObject = 'object';\nvar objectProto = Object.prototype;\nvar objectProtoToString = objectProto.toString;\nvar objectProtoHasOwnProperty = objectProto.hasOwnProperty;\nvar objectProtoPropertyIsEnumerable = objectProto.propertyIsEnumerable;\nvar objectGetOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar objectGetPrototypeOf = Object.getPrototypeOf;\nvar objectKeys = Object.keys;\nvar functionProto = Function.prototype;\nvar functionProtoToString = functionProto.toString;\nvar symbolExisted = typeof Symbol !== stringUndefined;\nvar symbolProto = symbolExisted ? Symbol.prototype : nativeUndefined;\nvar arrayProto = Array.prototype;\nvar arrayProtoSlice = arrayProto.slice;\nvar mathMin = Math.min;\nvar mathMax = Math.max;\nvar mathRandom = Math.random;\nvar mathFloor = Math.floor;\nvar mathCeil = Math.ceil;\nvar mathAbs = Math.abs;\nvar numberIsFinite = Number.isFinite;\nvar numberIsInteger = Number.isInteger;\nvar numberIsSafeInteger = Number.isSafeInteger;\nvar globalThisExisted = typeof globalThis === stringObject && globalThis;\nvar globalExisted = typeof global === stringObject && global;\nvar selfExisted = typeof self === stringObject && self;\nvar MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\nvar MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;\nvar MAX_ARRAY_LENGTH = 4294967295;\nvar bigIntTag = '[object BigInt]';\nvar numberTag = '[object Number]';\nvar booleanTag = '[object Boolean]';\nvar stringTag = '[object String]';\nvar dateTag = '[object Date]';\nvar regExpTag = '[object RegExp]';\nvar symbolTag = '[object Symbol]';\nvar errorTag = '[object Error]';\nvar arrayBufferTag = '[object ArrayBuffer]';\nvar argumentsTag = '[object Arguments]';\nvar arrayTag = '[object Array]';\nvar functionTags = ['Function', 'AsyncFunction', 'GeneratorFunction', 'Proxy'].map(function (item) { return '[object ' + item + ']'; });\nvar weakSetTag = '[object WeakSet]';\nvar blobTag = '[object Blob]';\nvar fileTag = '[object File]';\nvar domExceptionTag = '[object DOMException]';\nvar objectTag = '[object Object]';\nvar dataViewTag = '[object DataView]';\nvar mapTag = '[object Map]';\nvar promiseTag = '[object Promise]';\nvar setTag = '[object Set]';\nvar weakMapTag = '[object WeakMap]';\nvar windowTag = '[object Window]';\n\nexport { MAX_ARRAY_LENGTH, MAX_SAFE_INTEGER, MIN_SAFE_INTEGER, argumentsTag, arrayBufferTag, arrayProto, arrayProtoSlice, arrayTag, bigIntTag, blobTag, booleanTag, dataViewTag, dateTag, domExceptionTag, errorTag, fileTag, functionProto, functionProtoToString, functionTags, globalExisted, globalThisExisted, mapTag, mathAbs, mathCeil, mathFloor, mathMax, mathMin, mathRandom, nativeUndefined, numberIsFinite, numberIsInteger, numberIsSafeInteger, numberTag, objectGetOwnPropertySymbols, objectGetPrototypeOf, objectKeys, objectProto, objectProtoHasOwnProperty, objectProtoPropertyIsEnumerable, objectProtoToString, objectTag, promiseTag, regExpTag, selfExisted, setTag, stringObject, stringTag, stringUndefined, symbolProto, symbolTag, weakMapTag, weakSetTag, windowTag };\n","function isArray(value) {\n return Array.isArray(value);\n}\n\nexport { isArray as default };\n","function isObjectLike(value) {\n return value !== null && typeof value === 'object';\n}\n\nexport { isObjectLike as default };\n","import isObjectLike from './isObjectLike.js';\n\nfunction isObject(value) {\n return typeof value === 'function' || isObjectLike(value);\n}\n\nexport { isObject as default };\n","import { objectProtoToString } from './native.js';\n\nfunction getTag(value) {\n return objectProtoToString.call(value);\n}\n\nexport { getTag as default };\n","import getTag from './internals/getTag.js';\nimport { symbolTag } from './internals/native.js';\n\nfunction isSymbol(value) {\n return typeof value === 'symbol' || getTag(value) === symbolTag;\n}\n\nexport { isSymbol as default };\n","import isObject from './isObject.js';\nimport isSymbol from './isSymbol.js';\n\nvar reIsBinary = /^0b[01]+$/i;\nvar reIsOctal = /^0o[0-7]+$/i;\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\nfunction toNumber(value) {\n if (typeof value === 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NaN;\n }\n if (isObject(value)) {\n value = Number(value);\n }\n if (typeof value !== 'string') {\n return value === 0 ? value : +value;\n }\n value = value.trim();\n var isBinary = reIsBinary.test(value);\n return isBinary || reIsOctal.test(value) ? parseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NaN : +value;\n}\n\nexport { toNumber as default };\n","function identity(value) {\n return value;\n}\n\nexport { identity as default };\n","import isFunction from './isFunction.js';\nimport isLength from './isLength.js';\n\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nexport { isArrayLike as default };\n","import { MAX_SAFE_INTEGER } from './internals/native.js';\n\nfunction isLength(value) {\n return typeof value === 'number' && value > -1 && value % 1 === 0 && value <= MAX_SAFE_INTEGER;\n}\n\nexport { isLength as default };\n","import getTag from './internals/getTag.js';\nimport { functionTags } from './internals/native.js';\n\nfunction isFunction(value) {\n if (typeof value === 'function') {\n return true;\n }\n var tag = getTag(value);\n return functionTags.some(function (item) { return item === tag; });\n}\n\nexport { isFunction as default };\n","import toNumber from './toNumber.js';\n\nvar MAX_VALUE = 1.7976931348623157e308;\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === Infinity || value === -Infinity) {\n var sign = value < 0 ? -1 : 1;\n return sign * MAX_VALUE;\n }\n return value === value ? value : 0;\n}\n\nexport { toFinite as default };\n","import { mathFloor, mathRandom, mathCeil, mathMin, mathMax } from './internals/native.js';\nimport toFinite from './toFinite.js';\n\nfunction randomInt(lower, upper) {\n if (lower === void 0) { lower = 0; }\n if (upper === void 0) { upper = 1; }\n lower = toFinite(lower);\n upper = toFinite(upper);\n var min = mathCeil(mathMin(lower, upper) || 0);\n var max = mathFloor(mathMax(lower, upper) || 0);\n if (min > max) {\n var temp = min;\n min = max;\n max = temp;\n }\n return mathFloor(min + mathRandom() * (max - min + 1));\n}\n\nexport { randomInt as default };\n","import getSymbols from './internals/getSymbols.js';\nimport { objectKeys } from './internals/native.js';\nimport isObject from './isObject.js';\n\nfunction allKeys(object) {\n if (!isObject(object)) {\n return [];\n }\n return objectKeys(object).concat(getSymbols(object));\n}\n\nexport { allKeys as default };\n","import { objectGetOwnPropertySymbols, objectProtoPropertyIsEnumerable } from './native.js';\n\nfunction getSymbols(object) {\n if (!objectGetOwnPropertySymbols || object === null) {\n return [];\n }\n return objectGetOwnPropertySymbols(object).filter(function (item) { return objectProtoPropertyIsEnumerable.call(object, item); });\n}\n\nexport { getSymbols as default };\n","import createForEach from './internals/createForEach.js';\n\nvar forEach = createForEach(1);\n\nexport { forEach as default };\n","import allKeys from '../allKeys.js';\nimport identity from '../identity.js';\nimport isArrayLike from '../isArrayLike.js';\n\nfunction createForEach(dir) {\n var forEach = function (collection, iteratee) {\n if (iteratee === void 0) { iteratee = identity; }\n var _keys = !isArrayLike(collection) && allKeys(collection);\n var len = (_keys || collection).length;\n var i = dir > 0 ? 0 : len - 1;\n while (i >= 0 && i < len) {\n var currentKey = _keys ? _keys[i] : i;\n if (iteratee(collection[currentKey], currentKey, collection) === false) {\n break;\n }\n i += dir;\n }\n return collection;\n };\n return forEach;\n}\n\nexport { createForEach as default };\n","import getTag from './internals/getTag.js';\nimport { numberTag } from './internals/native.js';\n\nfunction isNumber(value) {\n return typeof value === 'number' || getTag(value) === numberTag;\n}\n\nexport { isNumber as default };\n","import { symbolProto, nativeUndefined } from './internals/native.js';\nimport isArray from './isArray.js';\nimport isNil from './isNil.js';\nimport isSymbol from './isSymbol.js';\n\nvar symbolToString = symbolProto ? symbolProto.toString : nativeUndefined;\nfunction baseToString(value) {\n if (typeof value === 'string') {\n return value;\n }\n if (isArray(value)) {\n return '' + value.map(baseToString);\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = '' + value;\n return result === '0' && 1 / value === -Infinity ? '-0' : result;\n}\nfunction toString(value) {\n return isNil(value) ? '' : baseToString(value);\n}\n\nexport { toString as default };\n","function isNil(value) {\n return value == null;\n}\n\nexport { isNil as default };\n","import getTag from './internals/getTag.js';\nimport { blobTag, stringUndefined } from './internals/native.js';\n\nvar blobExisted = typeof Blob !== stringUndefined;\nfunction isBlob(value) {\n if (blobExisted && value instanceof Blob) {\n return true;\n }\n return getTag(value) === blobTag;\n}\n\nexport { isBlob as default };\n","import getTag from './internals/getTag.js';\nimport { functionProtoToString, objectTag, objectProtoHasOwnProperty, objectGetPrototypeOf } from './internals/native.js';\nimport isObjectLike from './isObjectLike.js';\n\nvar objectCtorString = functionProtoToString.call(Object);\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || getTag(value) !== objectTag) {\n return false;\n }\n var proto = objectGetPrototypeOf(Object(value));\n if (proto === null) {\n return true;\n }\n var Ctor = objectProtoHasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor === 'function' && Ctor instanceof Ctor && functionProtoToString.call(Ctor) === objectCtorString;\n}\n\nexport { isPlainObject as default };\n","import getTag from './internals/getTag.js';\nimport { fileTag, stringUndefined } from './internals/native.js';\n\nvar fileExisted = typeof File !== stringUndefined;\nfunction isFile(value) {\n if (fileExisted && value instanceof File) {\n return true;\n }\n return getTag(value) === fileTag;\n}\n\nexport { isFile as default };\n","import { globalThisExisted, globalExisted, selfExisted } from './native.js';\n\nvar freeGlobalThis = globalThisExisted && globalThis.Object === Object && globalThis;\nvar freeGlobal = globalExisted && global.Object === Object && global;\nvar freeSelf = selfExisted && self.Object === Object && self;\nvar root = freeGlobalThis || freeGlobal || freeSelf || Function('return this')();\n\nexport { root as default };\n","import root from './internals/root.js';\nimport isNumber from './isNumber.js';\n\nfunction isNaN(value) {\n return isNumber(value) && root.isNaN(value);\n}\n\nexport { isNaN as default };\n","import isObject from './isObject.js';\n\nfunction isPromiseLike(value) {\n return isObject(value) && typeof value.then === 'function';\n}\n\nexport { isPromiseLike as default };\n","import getTag from './internals/getTag.js';\nimport { stringTag } from './internals/native.js';\n\nfunction isString(value) {\n return typeof value === 'string' || getTag(value) === stringTag;\n}\n\nexport { isString as default };\n","import isFinite from '../isFinite.js';\nimport toInteger from '../toInteger.js';\nimport toNumber from '../toNumber.js';\nimport toString from '../toString.js';\nimport { mathMin } from './native.js';\n\nfunction decimalAdjust(type, value, precision) {\n if (precision === void 0) { precision = 0; }\n var func = Math[type];\n value = toNumber(value);\n precision = mathMin(toInteger(precision), 292);\n if (precision === 0 || !isFinite(value)) {\n return func(value);\n }\n var pair = toString(value).split('e');\n value = func(+(pair[0] + 'e' + (pair[1] ? +pair[1] + precision : precision)));\n pair = toString(value).split('e');\n return +(pair[0] + 'e' + (pair[1] ? +pair[1] - precision : -precision));\n}\n\nexport { decimalAdjust as default };\n","import toNumber from './toNumber.js';\n\nfunction toInteger(value) {\n var result = toNumber(value);\n if (!result || result === Infinity || result === -Infinity) {\n return result === result ? result : 0;\n }\n var remainder = result % 1;\n return remainder ? result - remainder : result;\n}\n\nexport { toInteger as default };\n","import root from './internals/root.js';\nimport { numberIsFinite } from './internals/native.js';\n\nfunction isFinite(value) {\n return numberIsFinite ? numberIsFinite(value) : typeof value === 'number' && root.isFinite(value);\n}\n\nexport { isFinite as default };\n","import decimalAdjust from './internals/decimalAdjust.js';\n\nfunction round(number, precision) {\n return decimalAdjust('round', number, precision);\n}\n\nexport { round as default };\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import { __spreadArray, __read } from 'tslib';\nimport { nativeUndefined } from './internals/native.js';\nimport isPromiseLike from './isPromiseLike.js';\n\nvar tryit = function (fn) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n try {\n var result = fn.apply(void 0, __spreadArray([], __read(args), false));\n if (isPromiseLike(result)) {\n return result\n .then(function (res) {\n return [null, res];\n })\n .catch(function (err) {\n return [err, nativeUndefined];\n });\n }\n return [null, result];\n }\n catch (err) {\n return [err, nativeUndefined];\n }\n };\n};\n\nexport { tryit as default };\n","import { mathRandom } from './internals/native.js';\n\nvar idCounter = 0;\nvar defaultPrefix = '_' + mathRandom().toString(36).substring(2, 4);\nfunction uniqueId(prefix) {\n if (prefix === void 0) { prefix = defaultPrefix; }\n return '' + prefix + ++idCounter;\n}\n\nexport { uniqueId as default };\n","import { toString } from 'ut2';\n\n// 手机号码 11位数字,以1开头,第二位是3456789其中一个,后面再加9个数字\nconst reg = /^1[3456789]\\d{9}$/;\n\n/**\n * 检测值是否为手机号码\n *\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: any) {\n const valueStr = toString(value);\n return reg.test(valueStr);\n}\n\nexport default isMobile;\n","import { toString } from 'ut2';\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 * @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: any) {\n const valueStr = toString(value);\n return reg.test(valueStr);\n}\n\nexport default isTelephone;\n","import { toString } from 'ut2';\n\n// 邮政编码\nconst reg = /^\\d{6}$/;\n\n/**\n * 检测值是否为邮政编码,6位数字\n *\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: any) {\n const valueStr = toString(value);\n return reg.test(valueStr);\n}\n\nexport default isPostcode;\n","import { toString } from 'ut2';\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: string) {\n let index, sum;\n for (sum = index = 0; index < 17; index++) {\n sum += (Math.pow(2, 17 - index) % 11) * Number(id[index]);\n }\n const 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\ntype Options = {\n loose?: boolean;\n checkCode?: boolean;\n};\n\n/**\n * 检测值是否为18位身份证号码。\n *\n * 宽松模式下,支持15位身份证号码。\n *\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] 宽松模式,默认`false`。如果为`true`,支持15位身份证号码\n * @param {boolean} [options.checkCode=true] 是否校验最后一位校验码,默认`true`。仅在`loose=false`时生效\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: any, options: Options = {}) {\n const { loose = false, checkCode = true } = options;\n\n const valueStr = toString(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 { toString } from 'ut2';\n\n// 邮箱\nconst reg = /^[\\da-z]+([-._]?[\\da-z]+)*@[\\da-z]+([-.]?[\\da-z]+)*(\\.[a-z]{2,})+$/i;\n\n/**\n * 检测值是否为Email\n *\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: any) {\n const valueStr = toString(value);\n return reg.test(valueStr);\n}\n\nexport default isEmail;\n","import { toString } from 'ut2';\n\n// QQ号正则\nconst reg = /^[1-9]\\d{4,10}$/;\n\n/**\n * 检测值是否为QQ号,非0开头,5至11位数字\n *\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: any) {\n const valueStr = toString(value);\n return reg.test(valueStr);\n}\n\nexport default isQQ;\n","import { toString } from 'ut2';\n\n// 微信号 6至20位,以字母开头,字母,数字,减号(连接符),下划线\nconst reg = /^[a-z]([-_a-z0-9]{5,19})+$/i;\n\n/**\n * 检测值是否为微信号\n *\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: any) {\n const valueStr = toString(value);\n return reg.test(valueStr);\n}\n\nexport default isWX;\n","import { toString } from 'ut2';\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 * @alias module:Validator.isVehicle\n * @since 1.1.0\n * @see {@link https://baike.baidu.com/item/车牌号 车牌号}\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: any) {\n const valueStr = toString(value);\n return reg.test(valueStr);\n}\n\nexport default isVehicle;\n","import { toString } from 'ut2';\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: string) {\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\ntype Options = {\n loose?: boolean;\n luhn?: boolean;\n};\n\n/**\n * 检测值是否为银行卡号。正常模式(非0开头,10-21位数字)宽松模式(8-30位数字)\n *\n * @alias module:Validator.isBankCard\n * @since 1.1.0\n * @see {@link https://kf.qq.com/faq/170112ABnm6b170112FvquAn.html 常用银行账号位数参考}\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.loose=false] 宽松模式,默认`false`。正常模式10-21位数字(个人账户),宽松模式8-30位数字(企业账户)。\n * @param {boolean} [options.luhn=false] 使用 Luhn 算法校验校验码,默认`false`\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: any, options: Options = {}) {\n const { loose = false, luhn = false } = options;\n\n const valueStr = toString(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\nisBankCard.sumCheckCode = sumCheckCode;\n\nexport default isBankCard;\n","import { toString } from 'ut2';\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: string) {\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\ntype Options = {\n checkCode?: boolean;\n};\n\n/**\n * 检测值是否为统一社会信用代码,也叫三证合一组织代码。由18位数字和大写字母组成,不使用I、O、Z、S、V。\n *\n * @alias module:Validator.isSocialCreditCode\n * @since 1.1.0\n * @see {@link https://zh.wikisource.org/zh-hans/GB_32100-2015_法人和其他组织统一社会信用代码编码规则 GB 32100-2015 法人和其他组织统一社会信用代码编码规则}\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: any, options?: Options) {\n const valueStr = toString(value);\n const { checkCode: needCheckCode = true } = options || {};\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\nisSocialCreditCode.sumCheckCode = sumCheckCode;\n\nexport default isSocialCreditCode;\n","const config = {\n // 禁用warning提示\n disableWarning: true\n};\n\n/**\n * 设置禁止warning提示\n * @alias module:Debug.formatBankCard\n * @since 3.6.1\n * @param {boolean} bool 是否禁止warning提示\n */\nfunction setDisableWarning(bool: boolean) {\n config.disableWarning = !!bool;\n}\n\nexport { config, setDisableWarning };\n","import { config } from './config';\n\n/**\n * 打印警告信息\n *\n * @param {any[]} args 打印的信息\n */\nfunction devWarn(...args: any[]) {\n if (!config.disableWarning) {\n console.warn.apply(void 0, 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 hasHex(val: string) {\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: string, chars: string) {\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: string, chars: string) {\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\ntype Options = {\n level?: number;\n ignoreCase?: boolean;\n special?: string;\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 * @alias module:Validator.validatePassword\n * @since 3.7.0\n * @see {@link https://baike.baidu.com/item/ASCII#3 ASCII}\n * @param {string} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {number} [options.level=2] 密码强度,默认`2`。`1`-包含一种字符 `2`-包含两种字符 `3`-包含三种字符。(大写字母、小写字母、数字、特殊字符)\n * @param {boolean} [options.ignoreCase=false] 是否忽略大小写,默认`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: string, options: 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 = regNumber.test(valStr);\n // 包含小写字母\n const containesLowerCaseLetter = regLowerCaseLetter.test(valStr);\n // 包含大写字母\n const containesUpperCaseLetter = regUpperCaseLetter.test(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 { toString } from 'ut2';\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 * @alias module:Validator.isPassport\n * @since 1.1.0\n * @see {@link https://zh.wikipedia.org/wiki/中华人民共和国护照#个人资料页 中华人民共和国护照#个人资料页}\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为护照号\n * @example\n *\n * isPassport('E12345678'); // true\n * isPassport('abc'); // false\n *\n */\nfunction isPassport(value: any) {\n const valueStr = toString(value);\n return reg.test(valueStr);\n}\n\nexport default isPassport;\n","export const URLExisted = typeof URL !== 'undefined';\n","function constant(value) {\n return function () {\n return value;\n };\n}\n\nexport { constant as default };\n","import { constant, noop } from 'ut2';\nimport { URLExisted } from './setup';\n\nexport const nativeUndefined = void 0;\n\nexport const objectKeys = Object.keys;\nexport const objectValues = Object.values;\n\nexport const createObjectURL = URLExisted ? URL.createObjectURL : constant('');\nexport const revokeObjectURL = URLExisted ? URL.revokeObjectURL : noop;\n","function noop() { }\n\nexport { noop as default };\n","import { toString } from 'ut2';\nimport { nativeUndefined, objectValues } from './utils/native';\n\nconst chineseDictionary = {\n // 基本汉字\n chineseBasic: '[\\u4e00-\\u9fa5]',\n\n // 基本汉字补充\n chineseExtend: '[\\u9ea6-\\u9fff]',\n\n // 兼容性表意文字\n chineseExtend2: '[\\uF900-\\uFAD9]',\n\n // 汉字扩展A\n chineseExtendA: '[\\u3400-\\u4DBF]',\n\n // 汉字扩展B\n chineseExtendB: '[\\u{20000}-\\u{2A6DF}]',\n\n // 汉字扩展C\n chineseExtendC: '[\\u{2A700}-\\u{2B738}]',\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 // 汉字扩展G\n chineseExtendG: '[\\u{30000}-\\u{3134A}]',\n\n // 汉字扩展H\n chineseExtendH: '[\\u{31350}-\\u{323AF}]',\n\n // 汉字扩展I\n chineseExtendI: '[\\u{2EBF0}-\\u{2EE5D}]'\n};\n\nconst looseChineseRegExp = chineseDictionary.chineseBasic + '+';\nconst chineseRegExp = '^' + chineseDictionary.chineseBasic + '+$';\n\nconst chineseWithExtend = '(?:' + objectValues(chineseDictionary).join('|') + ')';\nconst looseChineseExtendRegExp = chineseWithExtend + '+';\nconst chineseExtendRegExp = '^' + chineseWithExtend + '+$';\n\n// eslint-disable-next-line no-prototype-builtins\nconst supportRegExpUnicode = RegExp.prototype.hasOwnProperty('unicode');\n\ntype Options = {\n loose?: boolean;\n useExtend?: boolean;\n};\n\n/**\n * 检测值是否为中文\n *\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] 宽松模式,默认`false`。如果为`true`,只要包含中文就返回`true`\n * @param {boolean} [options.useExtend=false] 使用统一表意文字扩展A-I,默认`false`。注意:如果不支持 `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: any, options: Options = {}) {\n const { loose = false, useExtend = false } = options;\n\n const valueStr = toString(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' : nativeUndefined;\n const reg = new RegExp(resultRegExp, flag);\n return reg.test(valueStr);\n}\n\nexport default isChinese;\n","import { toString } from 'ut2';\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 * @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: any) {\n const valueStr = toString(value);\n return reg.test(valueStr);\n}\n\nexport default isIPv4;\n","import { toString } from 'ut2';\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 * @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: any) {\n const valueStr = toString(value);\n return reg.test(valueStr);\n}\n\nexport default isIPv6;\n","import { toString } from 'ut2';\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 * @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: any) {\n const valueStr = toString(value);\n return regWithProtocal.test(valueStr) || regNonProtocal.test(valueStr);\n}\n\nexport default isUrl;\n","import { toString } from 'ut2';\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: string) {\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\ntype Options = {\n checkCode?: boolean;\n};\n\n/**\n * 检测值是否为营业执照号,也叫工商注册号。由14位数字本体码和1位数字校验码组成,其中本体码从左至右依次为:6位首次登记机关码、8位顺序码。\n *\n * @alias module:Validator.isBusinessLicense\n * @since 3.5.0\n * @see {@link https://wenku.baidu.com/view/19873704cc1755270722087c.html GS15—2006 工商行政管理市场主体注册号编制规则}\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.checkCode=true] 是否校验最后一位校验码,默认`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: any, options: Options = {}) {\n const valueStr = toString(value);\n const { checkCode: needCheckCode = true } = options;\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\nisBusinessLicense.sumCheckCode = sumCheckCode;\n\nexport default isBusinessLicense;\n","import { toString } from 'ut2';\n\n// 港澳居民来往内地通行证正则\nconst regHMCard = /^[hm]{1}([0-9]{10}|[0-9]{8})$/i;\n\n/**\n * 检测值是否为港澳居民来往内地通行证,俗称回乡证或回乡卡。\n *\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: any) {\n const valueStr = toString(value);\n return regHMCard.test(valueStr);\n}\n\nexport default isHMCard;\n","import { toString } from 'ut2';\n\n// 台湾居民来往大陆通行证正则\nconst regTWCard = /^\\d{8}$/i;\n\n// 一次性短期台胞证\nconst singleRegTWCard = /^[\\da-z]{10,12}$/i;\n\ntype Options = {\n loose?: boolean;\n};\n\n/**\n * 检测值是否为台湾居民来往大陆通行证,俗称台胞证。\n *\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] 宽松模式,默认`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: any, options: Options = {}) {\n const { loose = false } = options;\n\n const valueStr = toString(value);\n if (regTWCard.test(valueStr)) {\n return true;\n }\n return loose ? singleRegTWCard.test(valueStr) : false;\n}\n\nexport default isTWCard;\n","import { toString } from 'ut2';\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 * @alias module:Validator.isSwiftCode\n * @since 4.9.0\n * @see {@link https://zh.wikipedia.org/wiki/ISO_9362 ISO 9362}\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: any) {\n const valueStr = toString(value);\n return reg.test(valueStr);\n}\n\nexport default isSwiftCode;\n","import { isSymbol, isNaN } from 'ut2';\n\n/**\n * 检测值是否为有效数值,支持隐式转换。如果返回 true ,表示可以通过 Number() 转为数字。\n *\n * @alias module:Validator.isValidNumber\n * @since 4.17.2\n * @param {*} value 待检测的值\n * @param {boolean} [strict=false] 严格模式,默认`false`。如果为 true ,仅支持字符串和数字类型,不处理其他类型隐式转换,且空字符串返回 false 。\n * @returns {boolean} 值是否为有效数值\n * @example\n *\n * isValidNumber(null); // true\n * isValidNumber(true); // true\n * isValidNumber(''); // true\n * isValidNumber(1234); // true\n * isValidNumber('1234'); // true\n * isValidNumber(' 1234 '); // true\n * isValidNumber(' 1234 '); // true\n *\n * isValidNumber(undefined); // false\n * isValidNumber('0.10.1'); // false\n *\n * // 严格模式\n * isValidNumber(null, true); // false\n * isValidNumber(true, true); // false\n * isValidNumber('', true); // false\n * isValidNumber(1234, true); // true\n * isValidNumber('1234', true); // true\n * isValidNumber(' 1234 ', true); // true\n * isValidNumber(' 1234 ', true); // true\n */\nfunction isValidNumber(value: any, strict = false) {\n let ret: number;\n\n if (strict) {\n ret = typeof value === 'string' && value !== '' ? Number(value) : value;\n } else {\n if (typeof value === 'number') {\n ret = value;\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 {\n ret = Number(value);\n }\n }\n\n return typeof ret === 'number' && !isNaN(ret);\n}\n\nexport default isValidNumber;\n","import { tryit } from 'ut2';\n\n/**\n * 检查函数执行结果。\n *\n * 如果函数执行异常或返回下列结果,则返回 `false` ,否则返回 `true`。\n * 1. `Promise.reject()`\n * 2. `Promise.resolve(false)`\n * 3. `false`\n *\n * @alias module:Other.checkResult\n * @since 5.5.0\n * @param {Function} [fn=()=>true] 处理函数,默认 `()=>true`。\n * @param {...*} [args] 展开参数,`fn` 执行参数。\n * @returns {Promise<boolean>}\n * @example\n * await checkResult(()=>throw new Error()); // false\n * await checkResult(()=>Promise.reject()); // false\n * await checkResult(()=>Promise.resolve(false)); // false\n * await checkResult(async ()=>false); // false\n * await checkResult(()=>false); // false\n *\n * await checkResult(undefined); // true\n * await checkResult(()=>true); // true\n * await checkResult(()=>Promise.resolve()); // true\n * await checkResult(async ()=>true); // true\n * await checkResult(()=>null); // true\n * await checkResult(()=>undefined); // true\n * await checkResult(()=>'foo'); // true\n *\n * // 传入参数\n * await checkResult((...args)=>args.length > 1); // false\n * await checkResult((...args)=>args.length > 1, 'a', 'b'); // true\n */\nconst checkResult = async <P extends any[]>(fn: (...args: P) => any | Promise<any> = () => true, ...args: P) => {\n const [err, ret] = await tryit(fn)(...args);\n return !err && ret !== false;\n};\n\nexport default checkResult;\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, isNaN, isNumber, isString, isSymbol, toNumber } from 'ut2';\nimport devWarn from './devWarn';\n\nconst radixReg = /^[-+]?0[b|o|x]\\d+/i;\nconst dotNumberStringReg = /^\\.\\d+/;\n\n/**\n * 将值转换为有效数值\n *\n * @param {*} value 要转换的值\n * @returns {number|string} 有效数值\n */\nexport function transformEffectiveNumber(value: any) {\n let ret: string | number;\n if (isString(value)) {\n ret = value.trim(); // ' 15' ' 15 ' 兼容 Number(string) 处理\n\n if (ret === '') {\n ret = Number(ret);\n } else if (radixReg.test(ret) || dotNumberStringReg.test(ret)) {\n ret = toNumber(ret);\n } else if (isNaN(Number(ret))) {\n // string如果可以转换为number,默认不转换为number类型。如使用了字符串大数 '12435465768798090897'\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 (isNaN(ret)) {\n return Number.NaN;\n }\n\n return ret;\n}\n\n/**\n * 是否为科学计数法数字\n *\n * @param {string} num 检查值\n * @returns {boolean}\n */\nexport function isScientificNumber(num: string) {\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: number, 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: number | string) {\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: number | string) {\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 *\n * @param {number} num 输入数\n */\nexport function checkBoundary(num: number) {\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: string) {\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: number | string) {\n const strNum = String(num);\n\n if (!isScientificNumber(strNum)) {\n return num;\n }\n\n let ret: string;\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","import { isNaN } from 'ut2';\nimport { checkBoundary } from './utils/math.util';\nimport devWarn from './utils/devWarn';\n\n// 简体\nconst chnNumberChar = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];\nconst chnUnitChar = ['', '十', '百', '千'];\n\n// 繁体\nconst big5NumberChar = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];\nconst big5UnitChar = ['', '拾', '佰', '仟'];\n\n// 数字字符、计数单位\nlet numberChar: string[];\nlet unitChar: string[];\nlet unitSection: string[];\n\n/**\n * 每个小节的内部进行转化\n *\n * @private\n * @param {number} section 数字\n * @returns {string} 转化的数字\n */\nfunction sectionToChinese(section: number) {\n let str = '';\n let chnstr = '';\n let zero = false; //zero为是否进行补零, 第一次进行取余由于为个位数,默认不补零\n let unitPos = 0;\n\n while (section > 0) {\n // 对数字取余10,得到的数即为个位数\n const 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: number) {\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 const 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: number) {\n const strNum = num + '';\n const index = strNum.indexOf('.');\n\n let ret = '';\n if (index > -1) {\n const decimalStr = strNum.slice(index + 1);\n ret = mapNumberChar(decimalStr);\n }\n\n return ret;\n}\n\n/**\n * 映射为中文数字\n *\n * @private\n * @param {number|string} num 要处理的数字\n * @returns {string} 返回中文数字的映射\n */\nfunction mapNumberChar(num: number | string) {\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\ntype Options = {\n big5?: boolean;\n unit?: boolean;\n decimal?: string;\n zero?: string;\n negative?: string;\n unitConfig?: {\n w?: string;\n y?: string;\n };\n};\n\n/**\n * 数字转中文数字\n *\n * 如果数字不在安全数字 -9007199254740991~9007199254740991 范围内,处理会有异常。\n *\n * @alias module:Processor.numberToChinese\n * @since 1.2.0\n * @see {@link https://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=F5DAC3377DA99C8D78AE66735B6359C7 出版物上数字用法}\n * @param {number} num 数字\n * @param {Object} [options] 配置项\n * @param {boolean} [options.big5=false] 繁体,默认`false`\n * @param {boolean} [options.unit=true] 计数单位,默认`true`\n * @param {string} [options.decimal=\"点\"] 中文小数点。默认`点`,当`big5=true`时,默认`點`\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: number, options: 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;\n const numAbs = Math.abs(num);\n\n if (unit) {\n chnInteger = convertInteger(numAbs);\n } else {\n chnInteger = mapNumberChar(Math.floor(numAbs));\n }\n\n // 小数\n const chnDecimal = convertDecimal(numAbs);\n\n return chnDecimal ? `${preStr}${chnInteger}${decimal}${chnDecimal}` : `${preStr}${chnInteger}`;\n}\n\nexport default numberToChinese;\n","import { isNaN } from 'ut2';\n\ntype BytesToSizeOptions = {\n spaceMark?: string;\n precision?: number;\n};\n\n/**\n * 字节转换存储单位\n *\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] 精度,默认`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: number, options: BytesToSizeOptions = {}) {\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","// 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;\nconst regIdCard = /^(\\d{2})(\\d{2})(\\d{2})((?:\\d{2})?\\d{2})(\\d{2})(\\d{2})\\d{2}(\\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\ntype IdCardOrigin = {\n province: string;\n city: string;\n area: string;\n year: string;\n month: string;\n day: string;\n gender: string;\n};\n\ntype IdCardInfo = {\n province: string;\n birthday: string;\n gender: string;\n origin: IdCardOrigin;\n};\n\n/**\n * 解析身份证号码,支持15、18位身份证号码\n *\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: string) {\n const match = regIdCard.exec(id);\n\n if (!match) {\n return null;\n }\n\n // const origin = match.groups || {\n const origin = {\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 } as IdCardInfo;\n}\n\nexport default parseIdCard;\n","import { forEach, isArray, isPlainObject } from 'ut2';\n\ntype PropertyName = string | symbol;\n\ninterface TransformObjectValue {\n <V, R>(arr: V[], fn: (value: V, index: number) => R, deep: false): R[];\n <V, R>(arr: V[], fn: (value: any, index: number) => R, deep?: boolean): R[];\n <T extends object, R>(obj: T, fn: (value: T[keyof T], key: keyof T) => R, deep: false): Record<keyof T, R>;\n <T extends object, R>(obj: T, fn: (value: T[keyof T] extends object ? any : T[keyof T], key: T[keyof T] extends object ? any : keyof T) => R, deep?: boolean): Record<keyof T, R>;\n <T>(obj: T, fn: (...args: any[]) => any): T;\n}\n\n/**\n * 创建一个转换值的新对象或数组。\n *\n * 例如 antd Form 中的设置表单值时,如果值为空字符串可能需要转为 `undefined` ,才不影响表单的初始值。\n *\n * @alias module:Processor.transformObjectValue\n * @since 4.23.0\n * @param {Array | Object} data 要转换值的普通对象或数组\n * @param {Function} fn 遍历普通对象或数组键值方法\n * @param {boolean} [deep=true] 深度遍历,检测值为普通对象或数组时递归处理。默认`true`\n * @returns {Array | Object} 如果是普通对象或数组,返回一个新的对象或数组,否则返回自身\n * @example\n *\n * const data1 = { foo: 'bar', baz: 42 }\n * // 数字转为字符串\n * transformObjectValue(data1, value => {\n * if(typeof value === 'number'){\n * return String(value)\n * }\n * return value;\n * });\n * // { foo: 'bar', baz: '42' }\n *\n * const data2 = [1,2,3,4];\n * // 数字转为字符串\n * transformObjectValue(data2, value=>{\n * if(typeof value === 'number'){\n * return String(value)\n * }\n * });\n * // ['1', '2', '3', '4']\n *\n * // 嵌套普通对象或数组\n * const data3 = { foo: 'bar', baz: 42, c: [1,2,3,4], d: '' }\n * // 数字转为字符串,空字符串转为undefined\n * transformObjectValue(data3, value=>{\n * if(typeof value === 'number'){\n * return String(value);\n * }\n * retrun value === '' ? undefined : value\n * });\n * // { foo: 'bar', baz: '42', ['1', '2', '3', '4'], d: undefined }\n *\n * // 数组的值不处理,对象值为数字转为字符串,空字符串转为undefined\n * transformObjectValue(data3, (value, key)=>{\n * if(typeof key === 'number'){\n * return value;\n * }\n * if(typeof value === 'number'){\n * return String(value);\n * }\n * retrun value === '' ? undefined : value\n * });\n * // { foo: 'bar', baz: '42', [1, 2, 3, 4], d: undefined }\n *\n */\nconst transformObjectValue: TransformObjectValue = function (data: any, fn: (value: any, key: any) => any, deep = true) {\n if (isPlainObject(data)) {\n const result: Record<PropertyName, any> = {};\n forEach(data, (value, key) => {\n const newValue = deep && (isPlainObject(value) || isArray(value)) ? transformObjectValue(value as any, fn) : fn(value, key);\n result[key as PropertyName] = newValue;\n });\n return result;\n } else if (isArray(data)) {\n const result: any[] = [];\n forEach(data, (value, index) => {\n const newValue = deep && (isPlainObject(value) || isArray(value)) ? transformObjectValue(value, fn) : fn(value, index);\n result.push(newValue);\n });\n return result;\n }\n return data;\n};\n\nexport default transformObjectValue;\n","import { isNaN } from 'ut2';\nimport { digitLength, float2Fixed, checkBoundary, transformEffectiveNumber } from './utils/math.util';\n\n/**\n * 精确乘法,支持多个数相乘,乘数默认为 1 。\n *\n * @alias module:Math.times\n * @since 3.1.0\n * @param {...(number|string)} nums 相乘的数\n * @returns {number} 乘积\n * @example\n *\n * times(3); // 3\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: (string | number)[]): number {\n // eslint-disable-next-line prefer-const\n // let [num1, num2 = 1, ...rest] = nums;\n\n let num1 = nums[0];\n let num2 = nums[1] === void 0 ? 1 : nums[1];\n const rest = nums.slice(2);\n\n if (rest.length > 0) {\n // return times(times(num1, num2), ...rest);\n\n // eslint-disable-next-line prefer-spread\n return times.apply(void 0, [times(num1, num2)].concat(rest as number[]));\n }\n\n num1 = transformEffectiveNumber(num1);\n num2 = transformEffectiveNumber(num2);\n\n // 兼容处理,如果参数包含无效数值时,返回 NaN\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 { isNaN } from 'ut2';\nimport { strip, digitLength, float2Fixed, checkBoundary, transformEffectiveNumber } from './utils/math.util';\nimport times from './times';\n\n/**\n * 精确除法,支持多个数相除,除数默认为 1 。\n *\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: (string | number)[]): number {\n // eslint-disable-next-line prefer-const\n // let [num1, num2 = 1, ...rest] = nums;\n\n let num1 = nums[0];\n let num2 = nums[1] === void 0 ? 1 : nums[1];\n const rest = nums.slice(2);\n\n if (rest.length > 0) {\n // return divide(divide(num1, num2), ...rest);\n\n // eslint-disable-next-line prefer-spread\n return divide.apply(void 0, [divide(num1, num2)].concat(rest as number[]));\n }\n\n num1 = transformEffectiveNumber(num1);\n num2 = transformEffectiveNumber(num2);\n\n // 兼容处理,如果参数包含无效数值时,返回 NaN\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","import { isNaN, round, toNumber } from 'ut2';\n\n/**\n * 最大公约数,使用辗转相除法。\n *\n * 遵循以下约定:\n *\n * 1. 如果参数中包含无效数值,返回 `NaN` 。\n * 2. 如果全部参数都为 `0` ,返回 `0` 。\n * 3. 如果参数包含 `0` ,仅计算非零的数。\n * 4. 如果参数为负数,将转为绝对值的正数。\n * 5. 如果参数包含小数点,将转为四舍五入的整数。\n *\n * @alias module:Math.gcd\n * @since 4.20.0\n * @see {@link https://baike.baidu.com/item/最大公约数 最大公约数}\n * @param {...(number|string)} nums 两个或多个整数。\n * @returns {number} 最大公约数。\n * @example\n *\n * gcd(8, 14); // 2\n * gcd(57, 48); // 3\n * gcd(140, 21, 42); // 7\n * gcd('foo', 'bar'); // NaN\n * gcd(0, 10); // 10\n * gcd(2.3, 3.8, 8, -10); // 2\n *\n */\nfunction gcd(...nums: (string | number)[]): number {\n let num1 = nums[0];\n let num2 = nums[1] === void 0 ? 0 : nums[1];\n const rest = nums.slice(2);\n\n if (rest.length > 0) {\n // eslint-disable-next-line prefer-spread\n return gcd.apply(void 0, [gcd(num1, num2)].concat(rest as number[]));\n }\n\n num1 = Math.abs(round(num1 as number));\n num2 = Math.abs(round(num2 as number));\n\n // 兼容处理,如果参数包含无效数值时,返回 NaN\n if (isNaN(num1) || isNaN(num2)) {\n return Number.NaN;\n }\n\n if (num1 === 0 && num2 === 0) {\n return 0;\n }\n\n if (num1 === 0) {\n return num2;\n }\n\n if (num2 === 0) {\n return num1;\n }\n\n let temp = num2;\n if (num1 < num2) {\n temp = num1;\n num1 = num2;\n num2 = temp;\n }\n\n while (temp) {\n temp = num1 % num2;\n num1 = num2;\n num2 = temp;\n }\n return toNumber(num1);\n}\n\nexport default gcd;\n","import { objectKeys } from './utils/native';\n\ntype XMLHttpRequestListener = XMLHttpRequest['onloadstart'];\n\ntype AjaxOptions = {\n method?: string;\n async?: boolean;\n user?: string | null;\n password?: string | null;\n data?: Parameters<XMLHttpRequest['send']>[0];\n headers?: Record<string, string>;\n responseType?: XMLHttpRequestResponseType;\n timeout?: number;\n withCredentials?: boolean;\n onReadyStateChange?: XMLHttpRequest['onreadystatechange'];\n onLoadStart?: XMLHttpRequestListener;\n onProgress?: XMLHttpRequestListener;\n onAbort?: XMLHttpRequestListener;\n onTimeout?: XMLHttpRequestListener;\n onError?: XMLHttpRequestListener;\n onLoad?: XMLHttpRequestListener;\n onLoadEnd?: XMLHttpRequestListener;\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 {boolean} [async=true] 是否异步执行操作\n * @property {string|null} [user=null] 用户名,用于认证用途\n * @property {string|null} [password=null] 密码,用于认证用途\n * @property {Object} [headers] 自定义请求头\n * @property {string} [responseType] 响应类型\n * @property {number} [timeout] 请求超时的毫秒数\n * @property {boolean} [withCredentials=false] 跨域请求时是否需要使用凭证\n * @property {*} [data=null] 请求体被发送的数据\n * @property {function} [onReadyStateChange] 当 readyState 属性发生变化时触发\n * @property {function} [onLoadStart] 接收到响应数据时触发\n * @property {function} [onProgress] 请求接收到更多数据时,周期性地触发\n * @property {function} [onAbort] 当 request 被停止时触发,例如当程序调用 XMLHttpRequest.abort() 时\n * @property {function} [onTimeout] 在预设时间内没有接收到响应时触发\n * @property {function} [onError] 当 request 遭遇错误时触发\n * @property {function} [onLoad] 请求成功完成时触发\n * @property {function} [onLoadEnd] 请求结束时触发,无论请求成功 (load) 还是失败 (abort 或 error)\n */\n\n/**\n * 请求\n *\n * <em style=\"font-weight: bold;\">注意:该方法仅适用于浏览器端。</em>\n *\n * @alias module:Browser.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 * @param {string} [options.method=\"get\"] 创建请求时使用的方法。默认 `'get'`。\n * @param {boolean} [options.async=true] 是否异步执行操作。默认 `true`。\n * @param {string|null} [options.user=null] 用户名,用于认证用途。默认 `null`。\n * @param {string|null} [options.password=null] 密码,用于认证用途。默认 `null`。\n * @param {Object} [options.headers] 自定义请求头。\n * @param {string} [options.responseType] 响应类型。\n * @param {number} [options.timeout] 请求超时的毫秒数。\n * @param {boolean} [options.withCredentials=false] 跨域请求时是否需要使用凭证。默认 `false`。\n * @param {*} [options.data=null] 请求体被发送的数据。默认 `null`。\n * @param {function} [options.onReadyStateChange] 当 readyState 属性发生变化时触发。\n * @param {function} [options.onLoadStart] 接收到响应数据时触发。\n * @param {function} [options.onProgress] 请求接收到更多数据时,周期性地触发。\n * @param {function} [options.onAbort] 当 request 被停止时触发,例如当程序调用 XMLHttpRequest.abort() 时。\n * @param {function} [options.onTimeout] 在预设时间内没有接收到响应时触发。\n * @param {function} [options.onError] 当 request 遭遇错误时触发。\n * @param {function} [options.onLoad] 请求成功完成时触发。\n * @param {function} [options.onLoadEnd] 请求结束时触发,无论请求成功 (load) 还是失败 (abort 或 error)。\n * @returns {Promise<object>} XHR 事件对象。\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: string, options?: AjaxOptions) {\n const { method = 'get', data = null, timeout, headers, withCredentials = false, async = true, user = null, password = null, responseType, onReadyStateChange, onLoadStart, onProgress, onAbort, onTimeout, onError, onLoad, onLoadEnd } = options || {};\n\n return new Promise<ProgressEvent>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open(method.toLowerCase(), url, async, user, password);\n\n if (onReadyStateChange) {\n xhr.onreadystatechange = onReadyStateChange;\n }\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 objectKeys(headers).map((item) => {\n xhr.setRequestHeader(item, headers[item]);\n });\n }\n\n // 请求成功异步调用\n const wrapSuccess = (cb?: XMLHttpRequestListener) => {\n // 内部方法\n return (e: ProgressEvent) => {\n resolve(e);\n cb?.call(xhr, e);\n };\n };\n\n // 请求失败(中断/超时/失败)处理\n const wrapError = (cb?: XMLHttpRequestListener) => {\n // 内部方法\n return (e: ProgressEvent) => {\n reject(e);\n cb?.call(xhr, e);\n };\n };\n\n // 事件处理\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\n const eventKeys = objectKeys(events) as unknown as (keyof typeof events)[];\n\n eventKeys.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;\n","import { isObjectLike, isString } from 'ut2';\n\nexport type UploadFile = { name: string; type?: string; url?: string; fileName?: string; uid?: string; originFileObj?: File };\n\n// 是否为 UploadFile\nexport function isUploadFile(fileObj: UploadFile) {\n if (isObjectLike(fileObj) && isString(fileObj.name)) {\n return true;\n }\n return false;\n}\n","import { isString, nth } from 'ut2';\n\n/**\n * 获取路径的扩展名。\n *\n * @alias module:Other.getExtname\n * @since 5.4.0\n * @see {@link https://nodejs.org/docs/latest/api/path.html#pathextnamepath Node.js path.extname}\n * @param {string} path 路径。\n * @returns 返回从最后一次出现 `.` 字符到路径最后一部分的字符串结尾。如果路径没有 `.` 或者除了第一个字符之外没有其他 `.` 字符,则返回空字符串。\n * @example\n * getExtname('index.html'); // '.html'\n * getExtname('index.coffee.md'); // '.md'\n * getExtname('index.'); // '.'\n * getExtname('index'); // ''\n * getExtname('.index'); // ''\n * getExtname('index.md'); // '.md'\n */\nfunction getExtname(path: string) {\n return isString(path) && path.indexOf('.') > 0 ? '.' + nth(path.split('.'), -1) : '';\n}\n\nexport default getExtname;\n","import { nativeUndefined } from './internals/native.js';\nimport isArrayLike from './isArrayLike.js';\n\nvar nth = function (array, n) {\n if (n === void 0) { n = 0; }\n if (!isArrayLike(array)) {\n return nativeUndefined;\n }\n n += n < 0 ? array.length : 0;\n return array[n];\n};\n\nexport { nth as default };\n","import { isFile, isString, toString } from 'ut2';\nimport { isUploadFile, UploadFile } from './utils/file.util';\nimport getExtname from './getExtname';\n\n/**\n * 检查文件是否符合 `accept` 类型说明符。\n *\n * 通过 `file.type` `file.name` `file.url` 与 `accept` 进行匹配。\n *\n * @alias module:Browser.checkFileType\n * @since 5.1.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/input/file#唯一文件类型说明符 唯一文件类型说明符}\n * @see {@link https://www.iana.org/assignments/media-types/media-types.xhtml Media Types}\n * @param {File} file 文件对象。支持 antd `UploadFile` 对象。\n * @param {string} [accept] 文件类型说明符。\n * @returns {boolean} 如果 `file` 符合 `accept` 返回 `true`, 否则返回 `false`。\n * @example\n *\n * const pdf = new File([], '1.pdf', { type: 'application/pdf' });\n * const jpeg = new File([], 'xx.jpeg', { type: 'image/jpeg' });\n *\n * // 文件类型\n * checkFileType(pdf, 'application/pdf'); // true\n * checkFileType(jpeg, 'image/jpeg'); // true\n *\n * // 通配符\n * checkFileType(jpeg, 'image/*'); // true\n * checkFileType(pdf, 'image/*'); // false\n * checkFileType(pdf, 'application/*'); // true\n * checkFileType(pdf, '*'); // true\n * checkFileType(jpeg, '*'); // true\n *\n * // 文件名扩展名\n * checkFileType(jpeg, '.png,.jpeg,.jpg'); // true\n * checkFileType(pdf, '.pdf'); // true\n *\n */\nfunction checkFileType(file: File | UploadFile, accept?: string) {\n const isFileType = isFile(file);\n if (!isFileType && !isUploadFile(file)) {\n return false;\n }\n\n if (!isString(accept)) {\n accept = toString(accept);\n }\n\n accept = accept.trim();\n\n if (!accept || accept === '*') {\n return true;\n }\n\n let ret = false;\n\n const types = accept.toLowerCase().split(/,(?:\\s+)?/);\n const fileName = (file.name || (!isFileType && (file.fileName || file.originFileObj?.name)) || '').toLowerCase();\n const fileType = file.type || (!isFileType && file.originFileObj?.type) || '';\n const fileUrl = (!isFileType && file.url) || '';\n\n types.some((type) => {\n // .doc .docx .jpg .png\n if (type === '*' || fileType === type || (type.indexOf('.') === 0 && (getExtname(fileName) === type || getExtname(fileUrl) === type))) {\n ret = true;\n } else if (type.includes('/*') && fileType.includes('/')) {\n // image/* 匹配所有图片类型\n const match = type.match(/(.*)\\/\\*/);\n const fileParentType = fileType.split('/')[0];\n if (match && match[1] === fileParentType) {\n ret = true;\n }\n }\n return ret;\n });\n\n return ret;\n}\n\nexport default checkFileType;\n","import { isBlob } from 'ut2';\nimport ajax from './ajax';\n\nconst SuccessResponseStatus = [200, 304];\n\n/**\n * 获取文件 Blob 。\n *\n * @alias module:Browser.getFileBlob\n * @since 4.21.0\n * @param {string | Blob} file 文件地址或对象。\n * @param {AjaxOptions} [ajaxOptions] ajax 请求配置项,当传入的图片为字符串时才会触发请求。\n * @returns {Promise<Blob>} 文件 Blob 。\n * @example\n *\n * getFileBlob(file).then((blob)=>{\n * // do something\n * });\n *\n * getFileBlob('https://dummyimage.com/200x300').then((blob)=>{\n * // do something\n * });\n */\nfunction getFileBlob(file: string | Blob, ajaxOptions?: Parameters<typeof ajax>[1]) {\n return new Promise<Blob>((resolve, reject) => {\n if (isBlob(file)) {\n resolve(file);\n } else {\n ajax(file, { responseType: 'blob', ...ajaxOptions })\n .then((ev) => {\n // @ts-ignore\n // 进入 onload 表示 readyStatus 为 4 ,但是 status 不一定是 200 。\n const responseStatus = ev.target.status;\n if (SuccessResponseStatus.indexOf(responseStatus) !== -1) {\n // @ts-ignore\n resolve(ev.target.response as Blob);\n } else {\n const err = new Error(`The file does not support get requests, responseStatus ${responseStatus}, '${file}'.`);\n console.error(err);\n reject(err);\n }\n })\n .catch((err) => {\n console.error(new Error(`Failed to request file. ${err}`));\n reject(err);\n });\n }\n });\n}\n\nexport default getFileBlob;\n","import { isBlob } from 'ut2';\nimport { createObjectURL, revokeObjectURL } from './utils/native';\n\n/**\n * 加载图片。\n *\n * <em style=\"font-weight: bold;\">注意:该方法仅适用于浏览器端。</em>\n *\n * @alias module:Browser.loadImage\n * @since 4.20.0\n * @param {string | Blob} img 图片地址或 blob 对象\n * @returns {Promise<HTMLImageElement>} HTML图片元素\n * @example\n *\n * loadImage(file).then(image=>{\n * // do something\n * });\n *\n * loadImage('https://dummyimage.com/200x300').then(image=>{\n * // do something\n * });\n *\n * loadImage('data:image/png;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=').then(image=>{\n * // do something\n * });\n *\n */\nfunction loadImage(img: string | Blob) {\n return new Promise<HTMLImageElement>((resolve, reject) => {\n const imgIsBlob = isBlob(img);\n const url = imgIsBlob ? createObjectURL(img as Blob) : img;\n const image = new Image();\n if (!imgIsBlob) {\n image.crossOrigin = 'anonymous';\n }\n image.onload = () => {\n resolve(image);\n };\n image.onerror = (err) => {\n if (imgIsBlob) {\n revokeObjectURL(url);\n }\n console.error(`[loadImage] The image load failed, '${img}'.`);\n reject(err);\n };\n image.src = url;\n });\n}\n\nexport default loadImage;\n","import getFileBlob from './getFileBlob';\nimport loadImage from './loadImage';\n\n/**\n * @typedef {Object} ImageWithBlob HTML图片元素和 blob 对象\n * @property {HTMLImageElement} image HTML图片元素\n * @property {Blob} blob blob 对象\n */\n\n/**\n * 加载图片,返回图片元素和 blob 对象。\n *\n * 如果传入图片地址,将通过 ajax 请求转为 blob 格式。\n *\n * <em style=\"font-weight: bold;\">注意:该方法仅适用于浏览器端。</em>\n *\n * @method\n * @alias module:Browser.loadImageWithBlob\n * @since 4.20.0\n * @param {string | Blob} img 图片地址或 blob 对象\n * @param {AjaxOptions} [ajaxOptions] ajax 请求配置项,当传入的图片为字符串时才会触发请求。\n * @returns {Promise<ImageWithBlob>} HTML图片元素和 blob 对象\n * @example\n *\n * loadImage(file).then(({image, blob})=>{\n * console.log(image, blob);\n * // HTMLImageElement {} Blob {}\n * });\n *\n * loadImage('https://dummyimage.com/200x300').then(({image, blob})=>{\n * // do something\n * });\n *\n * loadImage('data:image/png;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=').then(({image, blob})=>{\n * // do something\n * });\n *\n */\nfunction loadImageWithBlob(img: string | Blob, ajaxOptions?: Parameters<typeof getFileBlob>[1]) {\n return getFileBlob(img, ajaxOptions).then((blob) => {\n return loadImage(blob).then((image) => {\n return { blob, image };\n });\n });\n}\n\nexport default loadImageWithBlob;\n","/**\n * 将 DataURL 转为 Blob 对象\n *\n * @alias module:Browser.dataURLToBlob\n * @since 4.1.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Glossary/Base64 Base64}\n * @param {string} data data: 协议的URL\n * @returns {Blob} Blob 对象\n * @example\n * const data = 'data:text/html;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=';\n * dataURLToBlob(dataurl); // Blob {size: 32, type: 'text/html'}\n */\nfunction dataURLToBlob(data: string) {\n const parts = data.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 { isBlob, isPromiseLike } from 'ut2';\nimport dataURLToBlob from './dataURLToBlob';\nimport isUrl from './isUrl';\nimport ajax from './ajax';\nimport { createObjectURL, nativeUndefined, revokeObjectURL } from './utils/native';\n\n// 下载文件到本地\nfunction saver(blobUrl: string, 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 // 处理点击事件,防止事件冒泡到 body/html 的点击事件。\n function handleClick(e: MouseEvent) {\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\ntype DataType = string | Blob | ArrayBuffer | Int8Array | Uint8Array | Uint8ClampedArray | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array | BigInt64Array | BigUint64Array;\n\ntype AjaxOptions = Parameters<typeof ajax>[1];\ntype TransformRequest = (options: AjaxOptions) => AjaxOptions | Promise<AjaxOptions>;\ntype TransformResponse = (res: Blob) => Blob | Promise<Blob>; // 响应的Blob对象。如果你通过 transformRequest 修改了 responseType ,该参数将是该类型响应值。\n\ntype DownloadOptions = {\n fileName?: string;\n type?: string;\n dataType?: 'url' | 'text';\n transformRequest?: TransformRequest;\n transformResponse?: TransformResponse;\n};\n\n/**\n * 下载\n *\n * <em style=\"font-weight: bold;\">注意:该方法仅适用于浏览器端,兼容 IE10+ 和现代浏览器。</em>\n *\n * <em style=\"font-weight: bold;\">注意:微信浏览器不支持H5下载文件。</em>\n *\n * <em>响应头中有 \"Content-Disposition\" 字段,客户端获取不到?</em> 请参考查阅 [Access-Control-Expose-Headers](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Access-Control-Expose-Headers) 。\n *\n * @alias module:Browser.download\n * @since 4.16.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Access-Control-Expose-Headers Access-Control-Expose-Headers}\n * @see {@link https://zh.wikipedia.org/wiki/多用途互聯網郵件擴展 MIME}\n * @see {@link https://9ykc9s.csb.app/ 在线示例}\n * @param {string|Blob|ArrayBuffer|TypedArray} data 字符串、blob数据或url地址\n * @param {string|Object} [options] 文件名称 或 配置项。\n * @param {string} [options.fileName] 文件名称。\n * @param {string} [options.type] MIME 类型。\n * @param {'url'|'text'} [options.dataType] 手动设置数据类型,主要是为了区分 `url` 和 `text`,默认会根据传入的数据判断类型。<br/>如果你要下载的文本是 `url` ,请设置 `'text'` ;如果你要下载的 url 是绝对/相对路径,请设置 'url' 。\n * @param {Function} [options.transformRequest] 请求前触发,XHR 对象或配置调整。\n * @param {Function} [options.transformResponse] 请求成功后触发,在传递给 then/catch 前,允许修改响应数据。\n * @returns {Promise<void>}\n * @example\n * // 文本\n * download('hello world', 'text.txt');\n *\n * // 远程文件1\n * // 不带协议的绝对地址,需要通过 dataType 指定为 url 类型\n * download('/xxx.jpg', { dataType: 'url', fileName: 'test.jpg' });\n *\n * // 远程文件2\n * download('https://example.com/xxx.jpg');\n *\n * // base64\n * download('data:image/png;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=', 'test.png');\n *\n * // blob文件\n * download(new Blob(['hello world']), 'text.txt');\n *\n * // 本地文件\n * download(File, 'filename.ext');\n *\n */\nasync function download(data: DataType, options?: string | DownloadOptions): Promise<void> {\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 let payload: Blob | undefined;\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 // 包装为异步方法\n const asyncTransformRequest = (opts: AjaxOptions) => {\n // 请求前配置调整\n const tempOptions = typeof transformRequest === 'function' ? transformRequest(opts) : opts;\n return isPromiseLike(tempOptions) ? (tempOptions as Promise<AjaxOptions>) : Promise.resolve(tempOptions);\n };\n const asyncTransformResponse = (res: Blob) => {\n const tempRes = typeof transformResponse === 'function' ? transformResponse(res) : res;\n return isPromiseLike(tempRes) ? (tempRes as Promise<Blob>) : Promise.resolve(tempRes);\n };\n\n const ajaxOptions = await asyncTransformRequest({ responseType: 'blob' });\n const ev = await ajax(data, ajaxOptions);\n // @ts-ignore\n const res = await asyncTransformResponse(ev.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 : nativeUndefined) });\n } else {\n // string\n payload = new Blob([data], { type: type || 'text/plain' });\n }\n } else if (data instanceof Blob) {\n // File or Blob\n payload = data;\n }\n\n // html、TypedArray\n if (!payload) {\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 = createObjectURL(payload);\n saver(url, fileName);\n revokeObjectURL(url);\n }\n\n return Promise.resolve();\n}\n\nexport default download;\n","const FileReaderMethodMap = {\n arrayBuffer: 'readAsArrayBuffer',\n binaryString: 'readAsBinaryString',\n dataURL: 'readAsDataURL',\n text: 'readAsText'\n} as const;\n\ntype ReadType = keyof typeof FileReaderMethodMap;\n\ninterface FileReader {\n (blob: Blob, type: 'arrayBuffer'): Promise<ArrayBuffer>;\n (blob: Blob, type?: Exclude<ReadType, 'arrayBuffer'>): Promise<string>;\n}\n\n/**\n * 读取 Blob 或 File 对象,转为 Base64/String/ArrayBuffer\n *\n * <em style=\"font-weight: bold;\">注意:该方法仅适用于浏览器端。</em>\n *\n * @function\n * @alias module:Browser.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'] 读取类型,默认`dataURL`。可选 `arrayBuffer` `binaryString` `dataURL` `text` 。\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 */\nconst fileReader: FileReader = function (blob: Blob, type: keyof typeof FileReaderMethodMap = 'dataURL') {\n let method = FileReaderMethodMap[type];\n if (!method) {\n method = FileReaderMethodMap.dataURL;\n }\n\n return new Promise<any>((resolve, reject) => {\n const reader = new FileReader();\n reader[method](blob);\n reader.onload = () => resolve(reader.result);\n reader.onerror = (error) => reject(error);\n });\n};\n\nexport default fileReader;\n","import { forEach, isBlob } from 'ut2';\nimport checkFileType from './checkFileType';\nimport { isUploadFile, UploadFile } from './utils/file.util';\n\n// 内置文件类型和文件类型说明符\nconst config = {\n image: 'image/*,.jpeg,.jpg,.gif,.bmp,.png,.webp,.svg,.apng,.avif,.ico,.tif,.tiff',\n audio: 'audio/*,.mp3,.wav,.aac,.flac',\n video: 'video/*,.mp4,.webm,.ogg,.mov',\n pdf: 'application/pdf,.pdf',\n word: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document,.doc,.docx',\n excel: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel,.xls,.xlsx'\n};\n\ntype FileType = keyof typeof config;\n\n/**\n * @summary 获取文件类型。\n * @alias module:Browser.getFileType\n * @since 5.1.0\n * @requires Other.checkFileType\n * @param {File} file 文件对象。支持 antd `UploadFile` 对象。\n * @returns {\"image\" | \"audio\" | \"video\" | \"pdf\" | \"word\" | \"excel\" | undefined} 如果是 `image` `audio` `video` `pdf` `word` `excel` 这些类型的文件,返回对应的类型值,否则返回 `undefined`。\n * @example\n *\n * const pdf = new File([], '1.pdf', { type: 'application/pdf' });\n * const jpeg = new File([], 'xx.jpeg', { type: 'image/jpeg' });\n *\n * getFileType(pdf); // 'pdf'\n * getFileType(jpeg); // 'image'\n *\n * @description 内置文件类型和文件类型说明符\n *\n * | 类型 | 说明符 |\n * |---|---|\n * | `image` | `image/*,.jpeg,.jpg,.gif,.bmp,.png,.webp,.svg,.apng,.avif,.ico,.tif,.tiff` |\n * | `audio` | `audio/*,.mp3,.wav,.aac,.flac` |\n * | `video` | `video/*,.mp4,.webm,.ogg,.mov` |\n * | `pdf` | `application/pdf,.pdf` |\n * | `word` | `application/vnd.openxmlformats-officedocument.wordprocessingml.document,.doc,.docx` |\n * | `excel` | `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel,.xls,.xlsx` |\n *\n */\nfunction getFileType(file: File | UploadFile) {\n let type: undefined | FileType;\n\n if (isBlob(file) || isUploadFile(file)) {\n forEach(config, (accept, fileType) => {\n if (checkFileType(file, accept)) {\n type = fileType;\n return false;\n }\n });\n }\n return type;\n}\n\nexport default getFileType;\n","import getExtname from './getExtname';\nimport { nativeUndefined } from './utils/native';\n\nconst mimeTypes = [\n // text\n ['text/plain', ['txt']],\n ['text/css', ['css']],\n ['text/html', ['htm', 'html']],\n ['text/javascript', ['js', 'mjs']],\n ['text/csv', ['csv']],\n ['text/markdown', ['md', 'markdown']],\n\n // image\n ['image/gif', ['gif']],\n ['image/jpeg', ['jpg', 'jpeg', 'jfif', 'pjpeg', 'pjp']],\n ['image/png', ['png']],\n ['image/svg+xml', ['svg']],\n ['image/webp', ['webp']],\n ['image/apng', ['apng']],\n ['image/avif', ['avif']],\n ['image/bmp', ['bmp']],\n ['image/x-icon', ['ico', 'cur']],\n ['image/tiff', ['tif', 'tiff']],\n\n // application\n ['application/xml', ['xml']],\n ['application/zip', ['zip']],\n ['application/pdf', ['pdf']],\n ['application/json', ['json']],\n ['application/yaml', ['yaml', 'yml']],\n ['application/vnd.openxmlformats-officedocument.wordprocessingml.document', ['doc', 'docx']],\n ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', ['xls', 'xlsx']],\n\n // media\n ['audio/mp3', ['mp3']],\n ['audio/wav', ['wav']],\n ['audio/aac', ['aac']],\n ['audio/flac', ['flac']],\n ['video/mp4', ['mp4']],\n ['video/ogg', ['ogg']],\n ['video/webm', ['webm']],\n ['video/quicktime', ['mov']]\n];\n\n/**\n * @summary 获取常用的 MIME 类型。通过文件名后缀查找对应的 MIME 类型。\n *\n * @alias module:Browser.getMimeType\n * @since 5.2.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/HTTP/MIME_types MIME 类型(IANA 媒体类型)}\n * @see {@link https://www.iana.org/assignments/media-types/media-types.xhtml Media Types}\n * @param {string} fileName 文件名。\n * @returns 如果找到,返回 MIME 类型字符串,否则返回 `undefined`。\n * @example\n * getMimeType('xxx.png'); // 'image/png'\n * getMimeType('xxx.jpg'); // 'image/jpeg'\n * getMimeType('xxx.mp3'); // 'audio/mp3'\n * getMimeType('xxx.mp4'); // 'video/mp4'\n * getMimeType('xxx.pdf'); // 'application/pdf'\n * getMimeType('xxx.zip'); // 'application/zip'\n * getMimeType('xxx.doc'); // 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\n *\n * // 不常用或未知类型\n * getMimeTye('xxx.ci'); // undefined\n *\n * // 非法文件名\n * getMimeType('.zip'); // undefined\n *\n * @description 内置常用的 MIME 类型和文件名后缀映射\n *\n * | MIME 类型 | 文件名后缀 |\n * |---|---|\n * | `text/plain` | `txt` |\n * | `text/css` | `css` |\n * | `text/html` | `htm` `html` |\n * | `text/javascript` | `js` `mjs` |\n * | `text/csv` | `csv` |\n * | `text/markdown` | `md` `markdown` |\n * | `image/gif` | `gif` |\n * | `image/jpeg` | `jpg` `jpeg` `jfif` `pjpeg` `pjp` |\n * | `image/png` | `png` |\n * | `image/svg+xml` | `svg` |\n * | `image/webp` | `webp` |\n * | `image/apng` | `apng` |\n * | `image/avif` | `avif` |\n * | `image/bmp` | `bmp` |\n * | `image/x-icon` | `ico` `cur` |\n * | `image/tiff` | `tif` `tiff` |\n * | `application/xml` | `xml` |\n * | `application/zip` | `zip` |\n * | `application/pdf` | `pdf` |\n * | `application/json` | `json` |\n * | `application/yaml` | `yaml` `yml` |\n * | `application/vnd.openxmlformats-officedocument.wordprocessingml.document` | `doc` `docx` |\n * | `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet` | `xls` `xlsx` |\n * | `audio/mp3` | `mp3` |\n * | `audio/wav` | `wav` |\n * | `audio/aac` | `aac` |\n * | `audio/flac` | `flac` |\n * | `video/mp4` | `mp4` |\n * | `video/ogg` | `ogg` |\n * | `video/webm` | `webm` |\n * | `video/quicktime` | `mov` |\n */\nfunction getMimeType(fileName: string) {\n const ext = getExtname(fileName).slice(1).toLowerCase();\n return ext ? (mimeTypes.find((item) => item[1].includes(ext))?.[0] as string) : nativeUndefined;\n}\n\nexport default getMimeType;\n","import { randomInt, toNumber } from 'ut2';\n\nconst letter = 'abcdefghijklmnopqrstuvwxyz';\nconst chars = {\n number: '0123456789',\n lower: letter,\n upper: letter.toUpperCase()\n};\nconst allChars = chars.number + chars.lower + chars.upper;\n\n/**\n * @private\n * @param {number} len 长度\n * @param {string} pool 字符池\n * @param {string} [prefix=''] 前缀部分,不计入长度\n * @returns {string}\n */\nfunction internalRandomString(len: number, pool: string, prefix = ''): string {\n while (len-- > 0) {\n const r = pool[randomInt(0, pool.length - 1)];\n return internalRandomString(len, pool, prefix + r);\n }\n return prefix;\n}\n\ninterface RandomString {\n (len: number, poll: 'number' | 'lower' | 'upper'): string;\n (len: number, poll?: string): string;\n}\n\n/**\n * 生成随机字符串\n *\n * @function\n * @alias module:Other.randomString\n * @since 4.8.0\n * @param {number} [len=0] 长度,默认`0`\n * @param {'number' | 'lower' | 'upper' | string} [pool='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'] 字符池,默认为数字和大小写字母。支持设置类型`number` `lower` `upper` 或字符串。\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 */\nconst randomString: RandomString = function (len = 0, pool?: string) {\n let _pool: string;\n\n if (typeof pool !== 'string') {\n _pool = allChars;\n } else if (chars[pool as keyof typeof chars]) {\n _pool = chars[pool as keyof typeof chars];\n } else {\n _pool = pool;\n }\n\n return internalRandomString(toNumber(len), _pool);\n};\n\nexport default randomString;\n","import { isArray, isObject } from 'ut2';\n\ntype NodeAssign = 'spread' | 'self';\n\ntype Options = {\n keyField?: string;\n parentField?: string;\n childrenField?: string;\n emptyChildrenValue?: 'none' | 'null' | 'array';\n nodeAssign?: NodeAssign;\n};\n\n/**\n * 递归处理空子级\n *\n * @private\n * @param {Object[]} arr 列表数据\n * @param {Object} [options] 配置项\n * @param {string} [options.childrenField='children'] 子级字段名称,默认`children`\n * @param {'none'|'null'} [options.emptyChildrenValue='none'] 子级为空时的值,默认`none`。`none`表示删除该子级,`null`表示为`null`,`array`表示为`[]`。\n */\nfunction processEmptyChildren<T extends Record<string, any> = Record<string, any>>(arr: T[], options: Pick<Options, 'childrenField' | 'emptyChildrenValue'>) {\n const { childrenField = 'children', emptyChildrenValue = 'none' } = options;\n arr.forEach((item) => {\n if (item[childrenField].length <= 0) {\n if (emptyChildrenValue === 'null') {\n // @ts-ignore\n item[childrenField] = null;\n } else {\n delete item[childrenField];\n }\n } else {\n processEmptyChildren(item[childrenField], options);\n }\n });\n}\n\n/**\n * 列表数据转树结构\n *\n * @alias module:Tree.listToTree\n * @since 4.14.0\n * @param {Object[]} list 列表数据\n * @param {Object} [options] 配置项\n * @param {string} [options.keyField='id'] 当前数据的键值字段名称,默认`id`\n * @param {string} [options.parentField='pid'] 当前数据的父级字段名称,默认`pid`\n * @param {string} [options.childrenField='children'] 子级字段名称,默认`children`\n * @param {'none'|'null'|'array'} [options.emptyChildrenValue='none'] 子级为空时的值,默认`none`。`none`表示删除该子级,`null`表示为`null`,`array`表示为`[]`。\n * @param {'spread'|'self'} [options.nodeAssign='spread'] 节点赋值方式,默认`spread`。`spread`表示使用展开运算符创建新值,`self`表示使用自身对象。\n * @returns {Object[]} 树结构\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<T extends Record<string, any> = Record<string, any>, R extends unknown = T & Record<string, any>>(list: T[], options: Options = {}) {\n const { keyField = 'id', parentField = 'pid', childrenField = 'children', emptyChildrenValue = 'none', nodeAssign = 'spread' } = options;\n\n const tree: R[] = [];\n\n const record: Record<string, T[]> = {};\n\n if (!isArray(list)) {\n return tree;\n }\n\n list.forEach((item) => {\n if (isObject(item)) {\n const newItem = nodeAssign === 'spread' ? { ...item } : item;\n\n const id = newItem[keyField] as string;\n const pid = newItem[parentField] as string;\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;\n","import { forEach, isArray, isObject } from 'ut2';\n\n/**\n * 内部实现\n *\n * @private\n * @param {Object[]} tree 树结构数据\n * @param {function} predicate 遍历每一项执行的函数,参数是当前遍历到的节点数据,如果返回 Truthy 将返回包含该节点的所有父级节点\n * @param {string} [childrenField] 子级字段名\n * @param {Object[]} [path=[]] 当前遍历路径\n * @returns {Object[]}\n */\nfunction internalFindTreeSelect<T extends any, F extends (item: T) => boolean>(tree: T[], predicate: F, childrenField?: string, path: T[] = []): T[] {\n let result: T[] = [];\n\n if (isArray(tree)) {\n forEach(tree, (item) => {\n path.push(item);\n\n if (predicate(item)) {\n result = path;\n return false;\n }\n\n if (isObject(item)) {\n // @ts-ignore\n const childs = item[childrenField] as T[];\n\n if (isArray(childs) && childs.length > 0) {\n const findChildren = internalFindTreeSelect(childs, predicate, childrenField, path);\n if (findChildren.length > 0) {\n result = findChildren;\n return false;\n }\n }\n }\n\n path.pop();\n });\n }\n\n return result;\n}\n\n/**\n * 查找包含当前节点的所有父级节点\n *\n * @alias module:Tree.findTreeSelect\n * @since 4.14.0\n * @param {Object[]} tree 树结构数据\n * @param {function} predicate 遍历每一项执行的函数,参数是当前遍历到的节点数据,如果返回 Truthy 将返回包含该节点的所有父级节点\n * @param {string} [childrenField='children'] 子级字段名,默认`children`\n * @returns {Object[]}\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<T extends any, F extends (item: T) => boolean>(tree: T[], predicate: F, childrenField = 'children') {\n return internalFindTreeSelect(tree, predicate, childrenField);\n}\n\nexport default findTreeSelect;\n","/**\n * @summary util-helpers 版本号。\n * @since 4.18.0\n */\nconst VERSION = BUILD_VERSION;\n\nexport default VERSION;\n","/**\n * 事件触发器,支持浏览器端和 node 端。\n *\n * @class\n * @example\n *\n * const emitter = new Emitter();\n *\n * // 注册监听方法\n * emitter.on('foo', () => console.log('foo 1'));\n * emitter.on('foo', () => console.log('foo 2'));\n *\n * // 触发方法\n * emitter.emit('foo');\n * // foo 1\n * // foo 2\n *\n * // 取消监听方法\n * emitter.off('foo');\n *\n * // 支持链式调用\n * emitter.on('foo', () => {})\n * .on('foo', () => {})\n * .off('foo');\n */\nvar EmitterPro = /** @class */ (function () {\n function EmitterPro() {\n this.handlers = {};\n }\n /**\n * 获取全部事件名称。\n *\n * @returns 事件名称数组。\n * @example\n * emitter.on('foo', () => {});\n * emitter.on('bar', () => {});\n *\n * emitter.eventNames(); // ['foo', 'bar']\n */\n EmitterPro.prototype.eventNames = function () {\n var _a;\n var symbols = ((_a = Object.getOwnPropertySymbols) === null || _a === void 0 ? void 0 : _a.call(Object, this.handlers)) || [];\n var keys = Object.keys(this.handlers);\n return keys.concat(symbols);\n };\n /**\n * 获取事件名称的全部监听方法(原始方法,未经过包装处理)。\n *\n * @param eventName 事件名称\n * @returns 对应事件名称的监听方法数组\n * @example\n * const fn1 = () => console.log('bar');\n * const fn2 = () => console.log('baz');\n *\n * emitter.on('test', fn1);\n * emitter.once('test', fn2);\n *\n * emitter.rawListeners('test'); // [fn1, fn2]\n */\n EmitterPro.prototype.rawListeners = function (eventName) {\n var handler = this.handlers[eventName];\n return handler ? handler.map(function (item) { return item.raw; }) : [];\n };\n /**\n * 获取事件名称的全部监听方法(如通过 `once` 方法注册,返回的是包装方法)。\n *\n * @param eventName 事件名称\n * @returns 对应事件名称的监听方法数组\n * @example\n * const fn1 = () => console.log('bar');\n * const fn2 = () => console.log('baz');\n *\n * emitter.on('test', fn1);\n * emitter.once('test', fn2);\n *\n * emitter.rawListeners('test'); // [fn1, wrapFn2]\n */\n EmitterPro.prototype.listeners = function (eventName) {\n var handler = this.handlers[eventName];\n return handler ? handler.map(function (item) { return item.wrap; }) : [];\n };\n /**\n * 判断事件名称对应的监听方法是否存在。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @returns 如果事件名称存在该事件方法返回 `true`,否则返回 `false`。\n * @example\n * const fn1 = () => console.log('bar');\n * const fn2 = () => console.log('baz');\n *\n * emitter.on('test', fn1);\n * emitter.once('test', fn2);\n *\n * emitter.hasListener('test', fn1); // true\n * emitter.hasListener('test', fn2); // true\n *\n * // fn2 是通过 once 方法注册,执行一次后自动解绑\n * emitter.emit('test');\n *\n * emitter.hasListener('test', fn1); // true\n * emitter.hasListener('test', fn2); // false\n */\n EmitterPro.prototype.hasListener = function (eventName, listener) {\n return this.rawListeners(eventName).some(function (item) { return item === listener; });\n };\n EmitterPro.prototype._on = function (eventName, raw, wrap, context, dir) {\n if (context === void 0) { context = null; }\n if (dir === void 0) { dir = 1; }\n var currentListener = { raw: raw, wrap: wrap, context: context };\n if (!this.handlers[eventName]) {\n this.handlers[eventName] = [currentListener];\n }\n else {\n var appendMethod = dir === 1 ? 'push' : 'unshift';\n this.handlers[eventName][appendMethod](currentListener);\n }\n return this;\n };\n /**\n * 注册监听方法。同 `on` 方法,只是将监听方法添加到最前面(事件触发是按顺序执行)。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.prependListener('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // 42\n * // bar\n */\n EmitterPro.prototype.prependListener = function (eventName, listener, context) {\n return this._on(eventName, listener, listener, context, 0);\n };\n /**\n * 注册监听方法。允许多次添加同一引用的函数。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.on('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n */\n EmitterPro.prototype.on = function (eventName, listener, context) {\n return this._on(eventName, listener, listener, context);\n };\n EmitterPro.prototype._wrapOnce = function (eventName, listener, context) {\n var _this = this;\n if (context === void 0) { context = null; }\n var wrap = (function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n listener.apply(context, args);\n _this.off(eventName, wrap);\n });\n return wrap;\n };\n /**\n * 仅触发一次的监听方法。使用方法同 `on` 。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.once('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n *\n * emitter.emit('foo');\n * // bar\n */\n EmitterPro.prototype.once = function (eventName, listener, context) {\n var wrap = this._wrapOnce(eventName, listener, context);\n return this._on(eventName, listener, wrap, context);\n };\n /**\n * 仅触发一次的监听方法。同 `once` 方法,只是添加到最前面(事件触发是按顺序执行)。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.prependOnceListener('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // 42\n * // bar\n *\n * emitter.emit('foo');\n * // bar\n */\n EmitterPro.prototype.prependOnceListener = function (eventName, listener, context) {\n var wrap = this._wrapOnce(eventName, listener, context);\n return this._on(eventName, listener, wrap, context, 0);\n };\n /**\n * 取消监听方法。如果不传第二个参数,将取消该事件名称的全部监听方法。如果多次添加同一引用的函数,需要多次删除。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @returns 事件触发器实例。\n * @example\n * const fn = () => console.log('bar');\n * emitter.on('foo', fn);\n * emitter.on('foo', () => console.log('baz'));\n * emitter.on('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // baz\n * // 42\n *\n * emitter.off('foo', fn); // 取消 foo 的监听方法 fn\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n *\n * emitter.off('foo'); // 取消 foo 的全部监听方法\n * emitter.emit('foo'); // 什么都没发生\n */\n EmitterPro.prototype.off = function (eventName, listener) {\n var handler = this.handlers[eventName];\n if (handler) {\n if (listener) {\n var index = handler.findIndex(function (item) { return item.wrap === listener || item.raw === listener; });\n if (index !== -1) {\n handler.splice(index, 1);\n }\n }\n else {\n delete this.handlers[eventName];\n }\n }\n return this;\n };\n /**\n * 取消全部事件名称的监听方法。\n *\n * @returns 事件触发器实例。\n * @example\n * const fn = () => console.log('bar');\n * emitter.on('test', fn);\n * emitter.on('test', () => console.log('baz'));\n * emitter.on('test', () => console.log(42));\n *\n * emitter.on('other', fn);\n * emitter.on('other', () => console.log('baz'));\n *\n * emitter.emit('test');\n * // bar\n * // baz\n * // 42\n *\n * emitter.emit('other');\n * // bar\n * // baz\n *\n * emitter.offAll(); // 取消全部监听方法\n *\n * emitter.emit('test'); // 什么都没发生\n * emitter.emit('other'); // 什么都没发生\n */\n EmitterPro.prototype.offAll = function () {\n this.handlers = {};\n return this;\n };\n /**\n * 触发监听方法。\n *\n * @param eventName 事件名称\n * @param args 触发监听方法的参数(从第二个参数开始都将传给监听方法)\n * @returns 如果触发成功返回 `true`,否则返回 `false`。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.on('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n *\n * // 支持传入参数\n * emitter.on('test' (a, b) => console.log(a + b));\n * emitter.on('test' (a, b) => console.log(a * b));\n *\n * emitter.emit('other', 2, 5);\n * // 7\n * // 10\n *\n * emitter.emit('other', 5, 5);\n * // 10\n * // 25\n */\n EmitterPro.prototype.emit = function (eventName) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n var handler = this.handlers[eventName];\n if (handler && handler.length > 0) {\n handler.forEach(function (listener) {\n listener.wrap.apply(listener.context, args);\n });\n return true;\n }\n return false;\n };\n return EmitterPro;\n}());\n\nexport { EmitterPro as default };\n","import { __assign, __extends } from 'tslib';\nimport Emitter from 'emitter-pro';\n\nvar cache = {};\nvar MemoryStorage = /** @class */ (function () {\n function MemoryStorage(scope) {\n if (scope === void 0) { scope = 'default'; }\n this.scope = scope;\n if (!cache[this.scope]) {\n cache[this.scope] = {};\n }\n this.data = cache[this.scope];\n }\n MemoryStorage.prototype.getItem = function (key) {\n return key in this.data ? this.data[key] : null;\n };\n MemoryStorage.prototype.setItem = function (key, value) {\n this.data[key] = value;\n };\n MemoryStorage.prototype.removeItem = function (key) {\n delete this.data[key];\n };\n MemoryStorage.prototype.clear = function () {\n cache[this.scope] = {};\n this.data = cache[this.scope];\n };\n return MemoryStorage;\n}());\n\n// 随机字符串\nfunction randomString() {\n return Math.random().toString(16).substring(2, 8);\n}\n// 是否支持 storage\nfunction isStorageSupported(storage) {\n try {\n var isSupport = typeof storage === 'object' &&\n storage !== null &&\n !!storage.setItem &&\n !!storage.getItem &&\n !!storage.removeItem;\n if (isSupport) {\n var key = randomString() + new Date().getTime();\n var value = '1';\n storage.setItem(key, value);\n if (storage.getItem(key) !== value) {\n return false;\n }\n storage.removeItem(key);\n }\n return isSupport;\n }\n catch (e) {\n console.error(\"[cache2] \".concat(storage, \" is not supported. The default memory cache will be used.\"));\n return false;\n }\n}\nfunction parse(value, reviver) {\n try {\n return JSON.parse(value, reviver);\n }\n catch (e) {\n return value;\n }\n}\nfunction stringify(value, replacer) {\n return JSON.stringify(value, replacer);\n}\n\n/**\n * 数据存储管理。\n *\n * @class\n * @param {Object} [storage] 自定义缓存对象要包含 `getItem` `setItem` `removeItem` 方法。默认使用内存缓存。\n * @param {Object} [options] 配置项。可选。\n * @param {boolean} [options.needParsed] 存取数据时是否需要序列化和解析数据。如果使用内置的内存缓存,默认 `false`,如果自定义 `storage` 默认 `true`。\n * @param {Function} [options.replacer] 数据存储时序列化的参数,透传给 [JSON.stringify](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) 的 `replacer` 参数。仅在 `needParsed=true` 时生效。\n * @param {Function} [options.reviver] 数据获取时转换的参数,透传给 [JSON.parse](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse) 的 `reviver` 参数。仅在 `needParsed=true` 时生效。\n * @param {string} [options.prefix] 缓存键前缀。便于管理同域名下的不同项目缓存。\n * @example\n * // 使用内存缓存\n * const memory = new Storage();\n * memory.set('foo', { baz: 42 });\n * memory.get('foo');\n * // { baz: 42 }\n *\n * // 自定义缓存 sessionStorage 。\n * const session = new Storage(window.sessionStorage);\n * session.set('foo', { a: 1, b: ['bar'], c: ['x', 2, 3] });\n * session.get('foo');\n * // { a: 1, b: ['bar'], c: ['x', 2, 3] }\n *\n * session.del('foo'); // 删除缓存\n * session.get('foo');\n * // null\n *\n * // 使用缓存键前缀。\n * // 如果要使用内存缓存, storage 传 `undefined`。\n * const local = new Storage(window.localStorage, { prefix: 'project_name' });\n * local.set('foo', { baz: 42 });\n * local.get('foo');\n * // { baz: 42 }\n */\nvar Storage = /** @class */ (function () {\n function Storage(storage, options) {\n if (options === void 0) { options = {}; }\n var isSupported = storage ? isStorageSupported(storage) : false;\n this.options = __assign({ needParsed: isSupported, prefix: '' }, options);\n this.storage = isSupported ? storage : new MemoryStorage(this.options.memoryScope);\n }\n /**\n * 内部用于获取存储的键名称。\n *\n * 如果实例有设置 `prefix`,返回 `prefix + key`。\n *\n * @protected\n * @param key 原键名称\n * @returns 存储的键名称\n */\n Storage.prototype.getKey = function (key) {\n return this.options.prefix + key;\n };\n /**\n * 获取存储的数据。\n *\n * @param {string} key 键名称。\n * @returns 如果键值存在返回键值,否则返回 `null`。\n * @example\n * const local = new Storage(window.localStorage);\n * local.set('foo', { baz: 42 });\n * local.get('foo');\n * // { baz: 42 }\n */\n Storage.prototype.get = function (key) {\n var value = this.storage.getItem(this.getKey(key));\n return this.options.needParsed ? parse(value, this.options.reviver) : value;\n };\n /**\n * 存储数据。\n *\n * @param key 键名称。\n * @param value 键值。\n * @example\n * const local = new Storage(window.localStorage);\n * local.set('foo', { baz: 42 });\n * local.get('foo');\n * // { baz: 42 }\n */\n Storage.prototype.set = function (key, value) {\n this.storage.setItem(this.getKey(key), this.options.needParsed ? stringify(value, this.options.replacer) : value);\n };\n /**\n * 删除存储的数据。\n *\n * @param key 键名称。\n * @example\n * const local = new Storage(window.localStorage);\n * local.set('foo', { baz: 42 });\n * local.get('foo');\n * // { baz: 42 }\n *\n * local.del('foo');\n * local.get('foo');\n * // null\n */\n Storage.prototype.del = function (key) {\n this.storage.removeItem(this.getKey(key));\n };\n /**\n * 清除存储的所有键。\n *\n * 注意:该方法调用 `storage.clear()`,可能会将同域下的不同实例的所有键都清除。如果要避免这种情况,建议使用 `import { Cache } 'cache2'`。\n *\n * @example\n * const local = new Storage(window.localStorage);\n * local.set('foo', { baz: 42 });\n * local.get('foo');\n * // { baz: 42 }\n *\n * local.clear();\n * local.get('foo');\n * // null\n */\n Storage.prototype.clear = function () {\n if (typeof this.storage.clear === 'function') {\n this.storage.clear();\n }\n };\n return Storage;\n}());\n\n// 命名空间缓存键前缀。\nvar defaultPrefix = 'cache2_';\nvar defaultNamespace = 'default';\n/**\n * 功能丰富的数据存储管理,支持 `自定义缓存` `命名空间` `数据过期时间` `限制缓存数量` `自定义事件`。\n *\n * 注意:如果你需要的是简单的基本数据存储管理,例如浏览器存储,建议使用 `import { Storage } from 'cache2'`。\n *\n * @class\n * @param {string} [namespace] 命名空间。可选。\n * @param {Object} [options] 配置项。可选。\n * @param {Object} [options.storage] 自定义缓存对象要包含 `getItem` `setItem` `removeItem` 方法。默认使用内置的内存缓存。\n * @param {number} [options.max=-1] 最大缓存数据数量。`-1` 表示无限制。默认 `-1`。\n * @param {'limited' | 'replaced'} [options.maxStrategy='limited'] 当达到最大缓存数量限制时的缓存策略。`limited` 表示达到限制数量后不存入数据,保存时返回 `false`。`replaced` 表示优先替换快过期的数据,如果都是一样的过期时间(0),按照先入先出规则处理,保存时始终返回 `true`。默认 `limited`。\n * @param {number} [options.stdTTL=0] 相对当前时间的数据存活时间,应用于当前实例的所有缓存数据。单位为毫秒,`0` 表示无期限。默认 `0`。\n * @param {number} [options.checkperiod=0] 定时检查过期数据,单位毫秒。如果小于等于 `0` 表示不启动定时器检查。默认 `0`。\n * @param {boolean} [options.needParsed] 存取数据时是否需要序列化和解析数据。如果使用内置的内存缓存,默认 `false`,如果自定义 `storage` 默认 `true`。\n * @param {Function} [options.replacer] 数据存储时序列化的参数,透传给 [JSON.stringify](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) 的 `replacer` 参数。仅在 `needParsed=true` 时生效。\n * @param {Function} [options.reviver] 数据获取时转换的参数,透传给 [JSON.parse](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse) 的 `reviver` 参数。仅在 `needParsed=true` 时生效。\n * @param {string} [options.prefix] 缓存键前缀。\n * @example\n * // 自定义过期时间\n * const memoryCache = new Cache({ stdTTL: 60 * 1000 });\n * memoryCache.set('foo', { baz: 42 });\n * memoryCache.get('foo');\n * // { baz: 42 }\n *\n * // 60 seconds later\n *\n * memoryCache.get('foo');\n * // undefined\n *\n * // 命名空间、自定义缓存\n * const localCache = new Cache('namespace', { storage: window.localStorage });\n * localCache.set('foo', { baz: 42 });\n * localCache.get('foo');\n * // { baz: 42 }\n *\n * localCache.del('foo');\n * localCache.get('foo');\n * // undefined\n */\nvar Cache = /** @class */ (function (_super) {\n __extends(Cache, _super);\n function Cache(namespace, options) {\n var _this = _super.call(this) || this;\n var ns = defaultNamespace, opts;\n if (typeof namespace === 'string') {\n ns = namespace || defaultNamespace;\n }\n else if (typeof namespace === 'object') {\n opts = namespace;\n }\n if (!opts && typeof options === 'object') {\n opts = options;\n }\n _this.options = __assign({ max: -1, stdTTL: 0, maxStrategy: 'limited', checkperiod: 0, prefix: defaultPrefix }, opts);\n _this.storage = new Storage(_this.options.storage, __assign({ memoryScope: ns }, _this.options));\n _this.cacheKey = ns;\n _this.startCheckperiod();\n return _this;\n }\n /**\n * 检查当前键值是否过期,如果过期将会自动删除。\n *\n * @param key 键名称。\n * @param data 缓存数据。\n * @returns 如果键值已过期返回 `false` ,否则返回 `true`。\n */\n Cache.prototype._check = function (key, data) {\n var ret = true;\n if (data.t !== 0 && data.t < Date.now()) {\n ret = false;\n this.del(key);\n this.emit('expired', key, data.v);\n }\n return ret;\n };\n Cache.prototype._wrap = function (value, ttl) {\n var now = Date.now();\n var currentTtl = typeof ttl === 'number' ? ttl : this.options.stdTTL;\n var livetime = currentTtl > 0 ? now + currentTtl : 0;\n return {\n v: value,\n t: livetime,\n n: now\n };\n };\n Cache.prototype._isLimited = function (len) {\n return this.options.max > -1 && len >= this.options.max;\n };\n Cache.prototype._getReplaceKey = function (keys, cacheValues) {\n var retkey = keys[0];\n keys.forEach(function (key) {\n if (cacheValues[key].t < cacheValues[retkey].t ||\n (cacheValues[key].t === cacheValues[retkey].t && cacheValues[key].n < cacheValues[retkey].n)) {\n retkey = key;\n }\n });\n return retkey;\n };\n Object.defineProperty(Cache.prototype, \"cacheValues\", {\n /**\n * 获取全部缓存数据,不处理过期数据和排序\n */\n get: function () {\n return this.storage.get(this.cacheKey) || {};\n },\n enumerable: false,\n configurable: true\n });\n // 设置缓存数据\n Cache.prototype.setCacheValues = function (values) {\n this.storage.set(this.cacheKey, values);\n };\n /**\n * 获取缓存值。\n *\n * @param {string} key 键名称。\n * @returns {*} 如果找到该值,则返回该值。如果未找到或已过期,则返回 `undefined`。\n * @example\n * myCache.set('myKey', obj, 5 * 60 * 1000);\n * myCache.get('myKey');\n * // { foo: 'bar', baz: 42 }\n *\n * myCache.get('myKey2');\n * // undefined\n */\n Cache.prototype.get = function (key) {\n var data = this.cacheValues[key];\n if (data && this._check(key, data)) {\n return data.v;\n }\n return;\n };\n /**\n * 获取多个缓存值。\n *\n * @param {string[]} keys 多个键名称。\n * @returns {Object} 如果找到对应键名的值,返回一个具有键值对的对象。如果未找到或已过期,则返回一个空对象 `{}`。\n * @example\n * myCache.mset([\n * { key: 'myKey', value: { foo: 'bar', baz: 42 }, ttl: 5 * 60 * 1000 },\n * { key: 'myKey2', value: { a: 1, b: 2 } },\n * { key: 'myKey3', value: 'abc' }\n * ]);\n *\n * myCache.mget(['myKey', 'myKey2']);\n * // {\n * // myKey: { foo: 'bar', baz: 42 },\n * // myKey2: { a: 1, b: 2 }\n * // }\n */\n Cache.prototype.mget = function (keys) {\n var _this = this;\n var ret = {};\n if (!Array.isArray(keys)) {\n return ret;\n }\n var cacheValues = this.cacheValues;\n keys.forEach(function (key) {\n var data = cacheValues[key];\n if (data && _this._check(key, data)) {\n ret[key] = data.v;\n }\n });\n return ret;\n };\n /**\n * 获取全部缓存值。\n *\n * @returns {Object} 返回一个具有键值对的对象。\n * @example\n * myCache.mset([\n * { key: 'myKey', value: { foo: 'bar', baz: 42 }, ttl: 5 * 60 * 1000 },\n * { key: 'myKey2', value: { a: 1, b: 2 } },\n * { key: 'myKey3', value: 'abc' }\n * ]);\n *\n * myCache.getAll();\n * // {\n * // myKey: { foo: 'bar', baz: 42 },\n * // myKey2: { a: 1, b: 2 }\n * // myKey3: 'abc'\n * // }\n */\n Cache.prototype.getAll = function () {\n var keys = Object.keys(this.cacheValues);\n return this.mget(keys);\n };\n /**\n * 设置缓存数据。\n *\n * 如果超出缓存数量,可能会设置失败。\n *\n * @param {string} key 键名称。\n * @param {*} value 键值。\n * @param {number} [ttl] 数据存活时间。单位毫秒 `ms`。\n * @returns {boolean} 如果设置成功返回 `true`,否则返回 `false`。\n * @example\n * myCache.set('myKey', { foo: 'bar', baz: 42 }, 5 * 60 * 1000);\n * // true\n */\n Cache.prototype.set = function (key, value, ttl) {\n if (this.options.max === 0) {\n return false;\n }\n var cacheValues = this.cacheValues;\n var keys = Object.keys(cacheValues);\n // 当前不存在该键值,并且数据量超过最大限制\n if (!cacheValues[key] && this._isLimited(keys.length)) {\n var validKeys = this.keys();\n if (this._isLimited(validKeys.length)) {\n // 如果最大限制策略是替换,将优先替换快过期的数据,如果都是一样的过期时间(0),按照先入先出规则处理。\n if (this.options.maxStrategy === 'replaced') {\n var replaceKey = this._getReplaceKey(validKeys, cacheValues);\n this.del(replaceKey);\n }\n else {\n // 如果是最大限制策略是不允许添加,返回 false 。\n return false;\n }\n }\n }\n cacheValues[key] = this._wrap(value, ttl);\n this.setCacheValues(cacheValues);\n this.emit('set', key, cacheValues[key].v);\n return true;\n };\n /**\n * 设置多个缓存数据。\n *\n * @param {Object[]} keyValueSet 多个键值对数据。\n * @returns {boolean} 如果全部设置成功返回 `true`,否则返回 `false`。\n * @example\n * myCache.mset([\n * { key: 'myKey', value: { foo: 'bar', baz: 42 }, ttl: 5 * 60 * 1000 },\n * { key: 'myKey2', value: { a: 1, b: 2 } },\n * { key: 'myKey3', value: 'abc' }\n * ]);\n * // true\n */\n Cache.prototype.mset = function (keyValueSet) {\n var _this = this;\n // 该处不使用数组 some 方法,是因为不能某个失败,而导致其他就不在更新。\n var ret = true;\n keyValueSet.forEach(function (item) {\n var itemSetResult = _this.set(item.key, item.value, item.ttl);\n if (ret && !itemSetResult) {\n ret = false;\n }\n });\n return ret;\n };\n /**\n * 删除一个或多个键。\n *\n * @param {string|string[]} key 要删除的键名。\n * @returns {number} 返回已删除的数量。\n * @example\n * myCache.set('myKey', { foo: 'bar', baz: 42 });\n * myCache.del('myKey'); // 1\n * myCache.del('not found'); // 0\n *\n * myCache.mset([\n * { key: 'myKey', value: { foo: 'bar', baz: 42 }, ttl: 5 * 60 * 1000 },\n * { key: 'myKey2', value: { a: 1, b: 2 } },\n * { key: 'myKey3', value: 'abc' }\n * ]);\n * myCache.del(['myKey', 'myKey2']); // 2\n */\n Cache.prototype.del = function (key) {\n var _this = this;\n var cacheValues = this.cacheValues;\n var count = 0;\n var keys = Array.isArray(key) ? key : [key];\n keys.forEach(function (key) {\n if (cacheValues[key]) {\n count++;\n var oldData = cacheValues[key];\n delete cacheValues[key];\n _this.emit('del', key, oldData.v);\n }\n });\n if (count > 0) {\n this.setCacheValues(cacheValues);\n }\n return count;\n };\n /**\n * 清除全部缓存的数据。\n *\n * @example\n * myCache.set('bar', 1);\n * myCache.set('foo', 2);\n * myCache.keys(); // ['bar', 'foo']\n *\n * myCache.clear();\n * myCache.keys(); // []\n */\n Cache.prototype.clear = function () {\n this.storage.del(this.cacheKey);\n };\n /**\n * 获取全部键名的数组。\n *\n * @returns {string[]} 返回全部键名的数组。\n * @example\n * myCache.set('bar', 1);\n * myCache.set('foo', 2);\n *\n * myCache.keys(); // ['bar', 'foo']\n */\n Cache.prototype.keys = function () {\n var _this = this;\n var cacheValues = this.cacheValues;\n var keys = Object.keys(cacheValues);\n return keys.filter(function (key) { return _this._check(key, cacheValues[key]); });\n };\n /**\n * 判断是否存在某个键。\n *\n * @param {string} key 键名称。\n * @returns {boolean} 如果包含该键返回 `true`,否则返回 `false`。\n * @example\n * myCache.has('foo'); // false\n *\n * myCache.set('foo', 1);\n * myCache.has('foo'); // true\n */\n Cache.prototype.has = function (key) {\n var data = this.cacheValues[key];\n return !!(data && this._check(key, data));\n };\n /**\n * 获取缓存值并从缓存中删除键。\n *\n * @param {string} key 键名称。\n * @returns {*} 如果找到该值,则返回该值,并从缓存中删除该键。如果未找到或已过期,则返回 `undefined`。\n * @example\n * myCache.set('myKey', 'myValue');\n * myCache.has('myKey'); // true\n *\n * myCache.take('myKey'); // 'myValue'\n * myCache.has('myKey'); // false\n */\n Cache.prototype.take = function (key) {\n var ret;\n var data = this.cacheValues[key];\n if (data && this._check(key, data)) {\n ret = data.v;\n this.del(key);\n }\n return ret;\n };\n /**\n * 更新缓存键值的数据存活时间。\n *\n * @param {string} key 键名称。\n * @param {number} ttl 数据存活时间。\n * @returns {boolean} 如果找到并更新成功,则返回 `true`,否则返回 `false`。\n * @example\n * myCache.set('myKey', { foo: 'bar', baz: 42 }, 5 * 60 * 1000);\n * myCache.ttl('myKey', 60 * 1000);\n * // true\n *\n * myCache.ttl('not found', 1000);\n * // false\n */\n Cache.prototype.ttl = function (key, ttl) {\n var cacheValues = this.cacheValues;\n var data = cacheValues[key];\n if (data && this._check(key, data)) {\n cacheValues[key] = this._wrap(data.v, ttl);\n return true;\n }\n return false;\n };\n /**\n * 获取某个键的过期时间戳。\n *\n * @param {string} key 键名称。\n * @returns {number | undefined} 如果未找到键或已过期,返回 `undefined`。如果 `ttl` 为 `0`,返回 `0`,否则返回一个以毫秒为单位的时间戳,表示键值将过期的时间。\n * @example\n * const myCache = new Cache({ stdTTL: 5 * 1000 });\n *\n * // 假如 Date.now() = 1673330000000\n * myCache.set('ttlKey', 'expireData');\n * myCache.set('noTtlKey', 'nonExpireData', 0);\n *\n * myCache.getTtl('ttlKey'); // 1673330005000\n * myCache.getTtl('noTtlKey'); // 0\n * myCache.getTtl('unknownKey'); // undefined\n */\n Cache.prototype.getTtl = function (key) {\n var cacheValues = this.cacheValues;\n var data = cacheValues[key];\n if (data && this._check(key, data)) {\n return cacheValues[key].t;\n }\n return;\n };\n /**\n * 获取某个键值的最后修改时间。\n *\n * @param {string} key 键名称。\n * @returns {number | undefined} 如果未找到键或已过期,返回 `undefined`,否则返回一个以毫秒时间戳,表示键值最后修改时间。\n * @example\n * const myCache = new Cache();\n *\n * // 假如 Date.now() = 1673330000000\n * myCache.set('myKey', 'foo');\n * myCache.getLastModified('myKey'); // 1673330000000\n *\n * // 5000ms later\n * myCache.set('myKey', 'bar');\n * myCache.getLastModified('myKey'); // 1673330005000\n */\n Cache.prototype.getLastModified = function (key) {\n var cacheValues = this.cacheValues;\n var data = cacheValues[key];\n if (data && this._check(key, data)) {\n return cacheValues[key].n;\n }\n return;\n };\n /**\n * 启动定时校验过期数据。\n *\n * 注意,如果没有设置 `checkperiod` 将不会触发定时器。\n *\n * @example\n * // 设置 checkperiod 之后自动生效\n * const myCache = new Cache({\n * checkperiod: 10 * 60 * 1000 // 10分钟检查一次数据是否过期\n * });\n *\n * // 停止定时校验过期数据\n * myCache.stopCheckperiod();\n *\n * // 启动定时校验过期数据\n * myCache.startCheckperiod();\n */\n Cache.prototype.startCheckperiod = function () {\n var _this = this;\n // 触发全部缓存数据是否过期校验\n this.keys();\n if (this.options.checkperiod > 0) {\n clearTimeout(this._checkTimeout);\n this._checkTimeout = setTimeout(function () {\n _this.startCheckperiod();\n }, this.options.checkperiod);\n }\n };\n /**\n * 停止定时校验过期数据。\n *\n * @example\n * // 设置 checkperiod 之后自动生效\n * const myCache = new Cache({\n * checkperiod: 10 * 60 * 1000 // 10分钟检查一次数据是否过期\n * });\n *\n * // 停止定时校验过期数据\n * myCache.stopCheckperiod();\n */\n Cache.prototype.stopCheckperiod = function () {\n clearTimeout(this._checkTimeout);\n };\n return Cache;\n}(Emitter));\n\nexport { Cache, Storage, Cache as default };\n","import { Cache, CacheOptions } from 'cache2';\nimport { isString, uniqueId } from 'ut2';\n\n/**\n * 异步缓存\n *\n * 特点:\n * 1. 共享异步。同一个缓存键的异步,最多同时运行一个异步,异步结果共享。\n * 2. 持久化数据。存在缓存结果,不再执行异步方法,直接返回该结果。\n * 3. 每个实例都有独立的缓存空间。相互之间隔离,缓存灵活配置,更多配置请查阅 [`cache2`](https://www.npmjs.com/package/cache2)。\n *\n * @class\n * @see {@link https://www.npmjs.com/package/cache2 cache2}\n * @param {Object} [options] 缓存配置项,更多配置项可参考 [`cache2`](https://www.npmjs.com/package/cache2)\n * @param {number} [options.max] 最大缓存数量\n * @param {'replaced' | 'limited'} [options.maxStrategy] 缓存策略\n * @example\n *\n * const asyncMemo = new AsyncMemo({ max: 20, maxStrategy: 'replaced' });\n * asyncMemo.run(()=>download({ fssid: 'a' }), 'a');\n * asyncMemo.run(()=>download({ fssid: 'b' }), 'b');\n * asyncMemo.run(()=>download({ fssid: 'a' }), 'a'); // 如果有缓存结果直接返回,如果有异步执行中,不会重复触发异步,但共享异步结果。\n *\n * asyncMemo.run(()=>download({ fssid: 'a' }), 'a', { persisted: false }); // 不读取缓存结果,但是异步执行结果还是会缓存。\n * asyncMemo.run(()=>download({ fssid: 'a' })); // 没有缓存键时,直接执行异步方法,不读取缓存结果,也不会缓存异步结果。\n */\nclass AsyncMemo<DataType = any> {\n private promiseCache: Record<string, Promise<any>>;\n /**\n * @summary cache2 实例,用于管理缓存\n */\n cache: Cache<DataType>;\n\n constructor(options?: Partial<CacheOptions>) {\n this.promiseCache = {};\n this.cache = new Cache(uniqueId('uh_async_memo'), options);\n }\n\n /**\n * 执行异步方法\n *\n * @param {Function} asyncFn 异步方法\n * @param {string} [key] 缓存键,如果没有该值将直接执行异步方法。\n * @param {Object} [options] 配置项\n * @param {number} [options.ttl] 数据存活时间\n * @param {boolean} [options.persisted=true] 数据持久化,默认`true`。如果存在缓存数据,直接返回缓存数据,不再执行异步方法。<br/>即使不开启该配置,不影响在异步执行成功后缓存数据。\n * @returns {Promise<*>} 异步结果\n * @example\n *\n * const asyncMemo = new AsyncMemo();\n * asyncMemo.run(()=>download({ fssid: 'a' }), 'a');\n * asyncMemo.run(()=>download({ fssid: 'b' }), 'b');\n * asyncMemo.run(()=>download({ fssid: 'a' }), 'a'); // 如果有缓存结果直接返回,如果有异步执行中,不会重复触发异步,但共享异步结果。\n *\n * asyncMemo.run(()=>download({ fssid: 'a' }), 'a', { persisted: false }); // 不读取缓存结果,但是异步执行结果还是会缓存。\n * asyncMemo.run(()=>download({ fssid: 'a' })); // 没有缓存键时,直接执行异步方法,不读取缓存结果,也不会缓存异步结果。\n */\n run(\n asyncFn: (...args: any[]) => Promise<DataType>,\n key?: string,\n options?: {\n ttl?: number;\n persisted?: boolean;\n }\n ): Promise<DataType> {\n if (!key || !isString(key)) {\n return asyncFn();\n }\n\n const opts = {\n persisted: true,\n ...options\n };\n\n if (opts.persisted) {\n const data = this.cache.get(key);\n if (data) {\n return Promise.resolve(data);\n }\n }\n\n if (!this.promiseCache[key]) {\n this.promiseCache[key] = asyncFn()\n .then((res) => {\n delete this.promiseCache[key];\n this.cache.set(key, res, opts.ttl);\n return res;\n })\n .catch((err) => {\n delete this.promiseCache[key];\n return Promise.reject(err);\n });\n }\n return this.promiseCache[key] as Promise<DataType>;\n }\n}\n\nexport default AsyncMemo;\n","import { isArray, toString } from 'ut2';\n\ntype CalculateCursorPositionOptions = {\n placeholderChar?: string | string[];\n maskReg?: RegExp;\n type?: 'mobile' | 'bankCard';\n};\n\n/**\n * 计算输入框的值格式化后光标位置\n *\n * @alias module:Other.calculateCursorPosition\n * @since 4.6.0\n * @see {@link https://2950v9.csb.app/ h5示例}\n * @see {@link https://33ccy9.csb.app/ react示例}\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] 需要遮盖的字符规则。默认`/\\D/g` 去掉非数字,意味着 ctrlValue 需要去掉非数字。\n * @param {'mobile'|'bankCard'} [options.type] 格式化类型,内置手机号码和银行卡号特殊处理\n * @returns {number} 格式化后的光标位置\n */\nfunction calculateCursorPosition(prevPos: number, prevCtrlValue: string, rawValue: string, ctrlValue: string, options: CalculateCursorPositionOptions = {}) {\n const { placeholderChar = ' ', maskReg = /\\D/g, type } = options;\n\n const realCtrlValue = toString(prevCtrlValue);\n const realRawValue = toString(rawValue);\n const placeholderChars = 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 { toNumber } from 'ut2';\nimport loadImageWithBlob from './loadImageWithBlob';\nimport { nativeUndefined } from './utils/native';\n\n/**\n * canvas 导出 blob 对象\n *\n * @private\n * @param canvas 画布元素\n * @param type 导出图片类型\n * @param quality 图像质量\n * @returns {Promise<Blob>}\n */\nfunction canvasToBlob(canvas: HTMLCanvasElement, type?: string, quality?: number) {\n return new Promise<Blob | null>((resolve) => {\n canvas.toBlob(\n (blob) => {\n resolve(blob);\n },\n type,\n quality\n );\n });\n}\n\n// 压缩图片信息\ntype Info = {\n image: HTMLImageElement; // 图片元素\n blob: Blob; // 图片 blob 对象\n canvas: HTMLCanvasElement; // canvas 元素\n context: CanvasRenderingContext2D; // canvas 2D 渲染上下文\n};\n\ntype Options = {\n // 图片配置\n width?: number; // 自定义图片宽度。默认图片自身宽度\n height?: number; // 自定义图片高度。默认图片自身高度\n rotate?: number; // 旋转角度\n offset?: [number, number] | ((info: Info, options: Options) => [number, number]); // 偏移值\n\n // 画布配置\n background?: string; // 背景色。默认白色\n canvasWidth?: number | ((info: Info, options: Options) => number); // 画布宽度。默认图片宽度\n canvasHeight?: number | ((info: Info, options: Options) => number); // 画布高度。默认图片高度\n\n // 导出配置\n format?: 'blob' | 'dataURL'; // 导出格式。默认 blob\n type?: string; // 图片类型。默认 image/jpeg\n quality?: number; // 图片质量。默认 0.8\n\n // 钩子方法\n beforeCompress?: (imageWithBlob: Pick<Info, 'image' | 'blob'>, options: Options) => void; // 压缩前触发\n beforeDraw?: (info: Info, options: Options) => void; // 画之前\n afterDraw?: (info: Info, options: Options) => void; // 画之后\n\n // 其他\n ajaxOptions?: Parameters<typeof loadImageWithBlob>[1];\n};\n\ninterface CompressImage {\n (img: string | Blob, options: Omit<Options, 'format'> & { format: 'dataURL' }): Promise<string>;\n (img: string | Blob, options?: Options): Promise<Blob>;\n}\n\n/**\n * 压缩图片。\n *\n * <em style=\"font-weight: bold;\">注意:该方法仅适用于浏览器端。</em>\n *\n * <em style=\"font-weight: bold;\">如果是半透明图片并且导出 `image/png` 格式,建议将背景变成透明 `background=transparent`,避免出现白边。注意正常图片压缩导出 `image/png` 格式后文件可能会比原图大。</em>\n *\n * @function\n * @alias module:Browser.compressImage\n * @since 4.20.0\n * @see {@link https://sytpwg.csb.app/ 在线示例}\n * @param {string | Blob} img 图片地址或 blob 对象\n * @param {Object} [options] 配置项\n * @param {number} [options.width] 自定义图片宽度,默认图片自身宽度\n * @param {number} [options.height] 自定义图片高度,默认图片自身高度\n * @param {number} [options.rotate] 旋转\n * @param {Array | function} [options.offset=[0, 0]] x,y轴偏移值,默认`[0, 0]`\n * @param {string} [options.background=#fff] 背景颜色,默认`#fff`\n * @param {number | function} [options.canvasWidth] 画布宽度,默认图片宽度\n * @param {number | function} [options.canvasHeight] 画布高度,默认图片高度\n * @param {'blob' | 'dataURL'} [options.format='blob'] 导出格式,默认`blob`\n * @param {string} [options.type='image/jpeg'] 图片类型,默认`image/jpeg`\n * @param {number} [options.quality=0.8] 图片质量,默认`0.8`\n * @param {function} [options.beforeCompress] 图片加载完成,画布创建之前调用\n * @param {function} [options.beforeDraw] 图片载入画布之前调用\n * @param {function} [options.afterDraw] 图片载入画布之后调用\n * @param {AjaxOptions} [options.ajaxOptions] ajax 请求配置项,当传入图片地址时才会触发ajax请求。\n * @returns {Promise<Blob | string>} blob 对象 或 data url 图片\n * @example\n *\n * // 默认返回压缩后的 blob 对象\n * compressImage(file).then(blob=>{\n * // do something\n * // 转为文件对象 new File([blob], file.name, { type: file.type })\n * });\n *\n * // 设置返回格式 data url\n * compressImage(file, { format: 'dataURL' }).then(url=>{\n * // do something\n * });\n *\n * // 自定义配置\n * compressImage('https://dummyimage.com/200x300', {\n * width: 100,\n * height: 100,\n * quality: 0.5,\n * beforeCompress({ image, blob }){},\n * beforeDraw({ image, blob, canvas, context }){}\n * afterDraw({ image, blob, canvas, context }){}\n * }).then(blob=>{\n * // do something\n * });\n *\n * // 支持不同形式的图片文件\n * compressImage('data:image/png;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=').then(blob=>{\n * // do something\n * });\n *\n */\nconst compressImage: CompressImage = function (img: string | Blob, options: Options = {}) {\n return new Promise<any>((resolve, reject) => {\n const {\n width,\n height,\n rotate,\n offset = [0, 0],\n\n background = '#fff',\n canvasWidth,\n canvasHeight,\n\n format = 'blob',\n type = 'image/jpeg',\n quality = 0.8,\n\n beforeCompress,\n beforeDraw,\n afterDraw,\n\n ajaxOptions\n } = options;\n\n // 加载图片\n loadImageWithBlob(img, ajaxOptions)\n .then(({ image, blob }) => {\n const numWidth = toNumber(width);\n const numHeight = toNumber(height);\n const numQuality = toNumber(quality);\n\n // 自定义图片宽高\n if (numWidth) {\n image.width = numWidth;\n }\n if (numHeight) {\n image.height = numHeight;\n }\n\n beforeCompress?.({ image, blob }, options);\n\n // 创建 canvas\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n const info = { image, blob, canvas, context: ctx };\n\n // 设置 canvas 宽高\n const numCanvasWidth = toNumber(typeof canvasWidth === 'function' ? canvasWidth(info, options) : canvasWidth);\n const numCanvasHeight = toNumber(typeof canvasHeight === 'function' ? canvasHeight(info, options) : canvasHeight);\n canvas.width = numCanvasWidth || image.width;\n canvas.height = numCanvasHeight || image.height;\n\n const bgIsTransparent = background === 'none' || background === 'transparent';\n\n // 填充背景色\n if (bgIsTransparent) {\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n } else {\n ctx.fillStyle = background;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n }\n\n // 旋转/变换/偏移\n // 如果设置了旋转,自动将原点设置为图片中心,并调整偏移值。\n let internalOffset = [0, 0];\n if (rotate !== nativeUndefined) {\n ctx.translate(image.width / 2, image.height / 2);\n internalOffset = [-image.width / 2, -image.height / 2];\n ctx.rotate((rotate * Math.PI) / 180);\n }\n const outOffset = typeof offset === 'function' ? offset(info, options) : offset;\n\n beforeDraw?.(info, options);\n\n // 将图像载入 canvas 中\n const dx = internalOffset[0] + toNumber(outOffset[0]);\n const dy = internalOffset[1] + toNumber(outOffset[1]);\n ctx.drawImage(image, dx, dy, image.width, image.height);\n\n // 处理png图片透明背景\n if (type === 'image/png' && bgIsTransparent) {\n ctx.globalCompositeOperation = 'destination-in';\n ctx.drawImage(image, dx, dy, image.width, image.height);\n }\n\n afterDraw?.(info, options);\n\n // 导出压缩后的图片\n if (format === 'blob') {\n canvasToBlob(canvas, type, numQuality).then(resolve).catch(reject);\n } else {\n resolve(canvas.toDataURL(type, numQuality));\n }\n })\n .catch(reject);\n });\n};\n\nexport default compressImage;\n","import { isArray, isObject } from 'ut2';\n\ntype NodeAssign = 'spread' | 'self';\n\n/**\n * 过滤/筛选树节点。\n *\n * 如果某节点被过滤掉,它的子节点也一并抛弃。\n *\n * @alias module:Tree.filterTree\n * @since 4.15.0\n * @param {Object[]} tree 树结构数据\n * @param {function} predicate 遍历每一项执行的函数,参数是当前遍历到的节点数据,如果返回 `Truthy` ,结果将包含该节点\n * @param {string} [childrenField='children'] 子级字段名,默认`children`\n * @param {'spread'|'self'} [nodeAssign='spread'] 节点赋值方式,默认`spread`。`spread`表示使用展开运算符创建新值,`self`-表示使用自身对象。\n * @returns {Object[]}\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 * // 如果某节点被过滤掉,它的子节点也一并抛弃\n * filterTree(menus, item=>item.id === '7');\n * // []\n *\n * filterTree(menus, item=>item.id === 'not found');\n * // []\n */\nfunction filterTree<T extends any, F extends (item: T) => boolean>(tree: T[], predicate: F, childrenField = 'children', nodeAssign: NodeAssign = 'spread') {\n const result: T[] = [];\n\n if (!isArray(tree)) {\n return result;\n }\n\n tree.forEach((item) => {\n let newItem = item;\n\n if (isObject(item)) {\n newItem = nodeAssign === 'spread' ? { ...item } : item;\n }\n\n if (predicate(newItem)) {\n if (isObject(newItem)) {\n // @ts-ignore\n const childs = newItem[childrenField] as T[];\n\n if (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;\n","import { forEach, isArray, isObject } from 'ut2';\n\n/**\n * 查找树结构数据节点\n *\n * @alias module:Tree.findTreeNode\n * @since 4.14.0\n * @param {Object[]} tree 树结构数据\n * @param {function} predicate 遍历每一项执行的函数,参数是当前遍历到的节点数据,如果返回 `Truthy` ,将返回该节点\n * @param {string} [childrenField='children'] 子级字段名,默认`children`\n * @returns {Object|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<T extends any, F extends (item: T) => boolean>(tree: T[], predicate: F, childrenField = 'children') {\n const stack: T[] = [];\n\n let node: T | undefined;\n\n if (isArray(tree)) {\n forEach(tree, (item) => {\n stack.push(item);\n\n while (stack.length) {\n const temp = stack.pop() as T;\n if (predicate(temp)) {\n node = temp;\n break;\n }\n\n if (isObject(temp)) {\n // @ts-ignore\n const childs = temp[childrenField] as T[];\n if (isArray(childs) && childs.length > 0) {\n childs.forEach((c) => {\n stack.push(c);\n });\n }\n }\n }\n\n if (node) {\n return false;\n }\n });\n }\n\n return node;\n}\n\nexport default findTreeNode;\n","import { forEach, isArray, isObject } from 'ut2';\n\n/**\n * 查找树结构数据多个节点\n *\n * @alias module:Tree.findTreeNodes\n * @since 4.15.0\n * @param {Object[]} tree 树结构数据\n * @param {function} predicate 遍历每一项执行的函数,参数是当前遍历到的节点数据,如果返回 Truthy ,返回结果将包含该节点\n * @param {string} [childrenField='children'] 子级字段名,默认`children`\n * @returns {Object[]}\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<T extends any, F extends (item: T) => boolean>(tree: T[], predicate: F, childrenField = 'children') {\n const stack: T[] = [];\n\n const nodes: T[] = [];\n\n if (isArray(tree)) {\n forEach(tree, (item) => {\n stack.push(item);\n\n while (stack.length) {\n const temp = stack.pop() as T;\n if (predicate(temp)) {\n nodes.push(temp);\n }\n\n if (isObject(temp)) {\n // @ts-ignore\n const childs = temp[childrenField] as T[];\n if (isArray(childs) && childs.length > 0) {\n childs.forEach((c) => {\n stack.push(c);\n });\n }\n }\n }\n });\n }\n\n return nodes;\n}\n\nexport default findTreeNodes;\n","import { toString } from 'ut2';\n\ntype Options = {\n spaceMark?: string;\n length?: number;\n};\n\n/**\n * 格式化银行卡号\n *\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] 间隔长度,默认`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 * // 自定义间隔符\n * formatBankCard('6228480402564890', {spaceMark: '-'}); // 6228-4804-0256-4890\n *\n */\nfunction formatBankCard(bankCardNo = '', options?: Options) {\n const { spaceMark = ' ', length = 4 } = options || {};\n\n const reg = new RegExp(`(.{${length}})`, 'g');\n const regChar = new RegExp(`${spaceMark}`, 'g');\n\n const realValue = toString(bankCardNo).replace(regChar, '');\n const str = realValue.replace(reg, `$1${spaceMark}`);\n\n return realValue.length % length === 0 ? str.substring(0, str.length - 1) : str;\n}\n\nexport default formatBankCard;\n","import { toString } from 'ut2';\n\ntype Options = {\n spaceMark?: string;\n};\n\n/**\n * 格式化手机号码\n *\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?: Options) {\n const { spaceMark = ' ' } = options || {};\n\n const regChar = new RegExp(spaceMark, 'g');\n const realValue = toString(mobileNo).replace(regChar, '').substring(0, 11);\n\n if (realValue.length > 7) {\n return realValue.replace(/^(...)(....)/g, `$1${spaceMark}$2${spaceMark}`);\n }\n if (realValue.length > 3) {\n return realValue.replace(/^(...)/g, `$1${spaceMark}`);\n }\n return realValue;\n}\n\nexport default formatMobile;\n","import { isNaN, isNumber, isString } from 'ut2';\nimport { checkBoundary, transformEffectiveNumber, trimLeftZero } from './utils/math.util';\nimport devWarn from './utils/devWarn';\nimport isValidNumber from './isValidNumber';\n\n/**\n * 检查数字或数字字符串\n *\n * @private\n * @param {string|number} [num]\n * @returns 是否为数字\n */\nfunction checkNumber(num?: string | number) {\n if (!isValidNumber(num)) {\n devWarn(`${num} invalid parameter.`);\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: string, thousand: string) {\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: string, precision: number, decimal: string) {\n if (precision === 0) {\n return '';\n }\n\n const zero = 0;\n let ret = '';\n\n if (decStr && Number(decStr) > 0) {\n const 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\ntype Options = {\n precision?: number;\n symbol?: string;\n thousand?: string;\n decimal?: string;\n strict?: boolean;\n};\n\n/**\n * 格式化金额\n *\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] 保留位数,默认`2`。最高`10`。\n * @param {string} [options.symbol] 货币符号\n * @param {string} [options.thousand=\",\"] 千分位符号, 默认`,`\n * @param {string} [options.decimal=\".\"] 小数位符号,默认`.`\n * @param {boolean} [options.strict=ture] 严格模式,默认`true`。开启后,只支持非空字符串和数字格式化,其他类型值如`null` `undefined` `true` `false`等将返回空字符串。\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?: string | number, options: Options = {}) => {\n let {\n precision = 2,\n symbol,\n thousand = ',',\n decimal = '.',\n // eslint-disable-next-line prefer-const\n strict = true\n } = options;\n\n // 数字参数不正确,返回空字符串\n if (!checkNumber(num) || (strict && (!isString(num) || num === '') && !isNumber(num))) {\n return '';\n }\n\n if (typeof num === 'number' && !isFinite(num)) {\n return num + '';\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 = transformEffectiveNumber(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 { round } from 'ut2';\nimport divide from './divide';\nimport gcd from './gcd';\nimport loadImageWithBlob from './loadImageWithBlob';\nimport bytesToSize from './bytesToSize';\n\n/**\n * 计算宽高比\n *\n * @private\n * @param {number} w 宽度\n * @param {number} h 高度\n * @returns {string} 宽高比\n */\nfunction calcContrast(w: number, h: number) {\n const n = gcd(w, h);\n return `${divide(round(w), n)}:${divide(round(h), n)}`;\n}\n\n/**\n * @typedef {Object} ImageInfo 图片信息\n * @property {number} width 宽度\n * @property {number} height 高度\n * @property {string} contrast 宽高比\n * @property {string} measure 尺寸\n * @property {string} size 大小\n * @property {number} bytes 大小,单位字节\n * @property {HTMLImageElement} image HTML图片元素\n * @property {Blob} blob 图片 Blob 对象\n */\n\n/**\n * 获取图片信息。\n *\n * <em style=\"font-weight: bold;\">注意:该方法仅适用于浏览器端。</em>\n *\n * @alias module:Browser.getImageInfo\n * @since 4.20.0\n * @param {string | Blob} img 图片地址或 blob 对象。\n * @param {AjaxOptions} [ajaxOptions] ajax 请求配置项,当传入的图片为字符串时才会触发请求。\n * @returns {Promise<ImageInfo>} 图片信息。\n * @example\n *\n * getImageInfo(file).then(imageInfo=>{\n * console.log(imageInfo);\n * // {\n * // width: 100,\n * // height: 100,\n * // contrast: '1:1',\n * // measure: '100 × 100 px',\n * // size: '11 B',\n * // bytes: 11,\n * // image: HTMLImageElement {},\n * // blob: Blob {}\n * // }\n * });\n *\n * getImageInfo('https://dummyimage.com/200x300').then(imageInfo=>{\n * // do something\n * });\n *\n * getImageInfo('data:image/png;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=').then(imageInfo=>{\n * // do something\n * });\n *\n */\nfunction getImageInfo(img: string | Blob, ajaxOptions?: Parameters<typeof loadImageWithBlob>[1]) {\n return loadImageWithBlob(img, ajaxOptions).then(({ image, blob }) => {\n const { width, height } = image;\n return {\n width,\n height,\n contrast: calcContrast(width, height),\n measure: `${width} × ${height} px`,\n size: bytesToSize(blob.size),\n bytes: blob.size,\n image,\n blob\n };\n });\n}\n\nexport default getImageInfo;\n","/**\n * 注入样式。\n *\n * @alias module:Browser.injectStyle\n * @since 5.3.0\n * @param {string} css 样式内容。\n * @param {Object} [options] 配置项。\n * @param {HTMLElement} [options.container=document.head] 要注入样式的容器。默认 `document.head`。如果 `document.head` 不存在,默认 `document.body`。\n * @param {'top' | 'bottom'} [options.insertAt='top'] 注入容器内容前面还是后面。默认 `top`。\n * @param {Function} [options.onBefore] 注入样式前的回调方法。\n * @returns {HTMLStyleElement} `style` 元素。\n * @example\n * const css1 = 'body { background-color: red; }';\n * injectStyle(css1);\n *\n * // 自定义配置\n * const css2 = 'p { margin: 10px; } a { color: blue; }';\n * injectStyle(css2, {\n * container: document.body,\n * insertAt: 'bottom',\n * onBefore(style){\n * style.nonce = '...';\n * }\n * });\n */\nfunction injectStyle(\n css: string,\n options?: {\n container?: HTMLElement;\n insertAt?: 'top' | 'bottom';\n onBefore?: (style: HTMLStyleElement) => void;\n }\n) {\n const { container = document.head || document.getElementsByTagName('head')[0] || document.body, insertAt = 'top', onBefore } = options || {};\n const style = document.createElement('style');\n\n // IE\n // @ts-ignore\n if (style.styleSheet) {\n // @ts-ignore\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n\n if (typeof onBefore === 'function') {\n onBefore(style);\n }\n\n const atTop = insertAt === 'top';\n\n if (atTop && container.prepend) {\n container.prepend(style);\n } else if (atTop && container.firstChild) {\n container.insertBefore(style, container.firstChild);\n } else {\n container.appendChild(style);\n }\n return style;\n}\n\nexport default injectStyle;\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 * @alias module:Validator.isPassword\n * @requires module:Validator.validatePassword\n * @since 1.1.0\n * @see {@link https://baike.baidu.com/item/ASCII#3 ASCII}\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {number} [options.level=2] 密码强度,默认`2`。`1`-包含一种字符 `2`-包含两种字符 `3`-包含三种字符。(大写字母、小写字母、数字、特殊字符)\n * @param {boolean} [options.ignoreCase=false] 是否忽略大小写,默认`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: any, options: Parameters<typeof validatePassword>[1] = {}) {\n const { level = 2, ignoreCase = false, special = '\\\\x21-\\\\x2F\\\\x3A-\\\\x40\\\\x5B-\\\\x60\\\\x7B-\\\\x7E' } = options;\n return validatePassword(value, { level, ignoreCase, special }).validated;\n}\n\nexport default isPassword;\n","import divide from './divide';\nimport times from './times';\nimport gcd from './gcd';\nimport { round } from 'ut2';\n\n/**\n * 最小公倍数。\n *\n * 遵循以下约定:\n *\n * 1. 如果参数中包含无效数值,返回 `NaN` 。\n * 2. 如果只有一个参数,另一个参数默认为 `1` 。\n * 3. 如果全部参数都为 `0` ,返回 `NaN` 。因为作为除数的最大公约数为 `0` ,结果为 `NaN` 。\n * 4. 如果全部参数都为 `Infinity` ,返回 `NaN` 。因为除数和被除数都是 `Infinity` ,结果为 `NaN` 。\n * 5. 如果参数包含 `0` ,返回 `0` 。\n * 6. 如果参数为负数,将转为绝对值的正数。\n * 7. 如果参数包含小数点,将转为四舍五入的整数。\n *\n * @alias module:Math.lcm\n * @since 4.20.0\n * @see {@link https://baike.baidu.com/item/最小公倍数 最小公倍数}\n * @param {...(number|string)} nums 两个或多个整数。\n * @returns {number} 最小公倍数。\n * @example\n *\n * lcm(3, 4); // 12\n * lcm(8, 4); // 8\n * lcm(2, 4, 8); // 32\n * lcm('foo', 'bar'); // NaN\n * lcm(0, 10); // 0\n * lcm(2.3, 3.8, 8, -10); // 320\n *\n */\nfunction lcm(...nums: (string | number)[]): number {\n let args = nums.map((item) => Math.abs(round(item as number)));\n if (args.length === 1) {\n args = args.concat([1]);\n }\n const product = args.indexOf(0) > -1 ? 0 : times(...args);\n return divide(product, gcd(...args));\n}\n\nexport default lcm;\n","import { objectKeys } from './utils/native';\n\ntype ScriptAttribute = Pick<HTMLScriptElement, 'async' | 'crossOrigin' | 'defer' | 'integrity' | 'noModule' | 'referrerPolicy' | 'text' | 'type' | 'onload' | 'onerror' | 'id' | 'className'> & {\n attrs: Record<string, string>;\n destroyOnError: boolean;\n};\n\n/**\n * 加载 js 文件。\n *\n * <em style=\"font-weight: bold;\">注意:该方法仅适用于浏览器端。</em>\n *\n * @alias module:Browser.loadScript\n * @since 4.19.0\n * @param {string} src js 地址。\n * @param {Object} [options] script 标签属性。比如 `defer` `onload` `onerror` `id` 等,下面列举部分带有默认值或额外扩展的配置。\n * @param {boolean} [options.destroyOnError=true] 如果加载失败或错误,自动删除 dom 中的 script 标签。默认`true`\n * @param {Object} [options.attrs] 自定义 script 属性,通过 script.setAttribute 设置。\n * @param {boolean} [options.async=true] 异步加载。默认`true`\n * @param {string} [options.type='text/javascript'] 类型。默认`text/javascript`\n * @return {Promise<HTMLScriptElement>} 异步返回 script 元素。\n * @example\n *\n * loadScript('some.js').then(script=>{\n * // do something\n * })\n *\n * loadScript('some.js', { id: 'xxx', async: false, attrs: { foo: 'bar' } }).then(script=>{\n * // do something\n * })\n *\n */\nfunction loadScript(src: string, options?: Partial<ScriptAttribute>) {\n return new Promise<HTMLScriptElement>((resolve, reject) => {\n const container = document.head || document.getElementsByTagName('head')[0] || document.body;\n const script = document.createElement('script');\n\n const { attrs, destroyOnError = true, ...restOptions } = options || {};\n\n const props: Partial<HTMLScriptElement> = {\n async: true,\n type: 'text/javascript',\n ...restOptions,\n src\n };\n\n for (const key in props) {\n if (key === 'onload' || key === 'onerror') {\n continue;\n }\n // @ts-ignore\n script[key] = props[key as keyof ScriptAttribute];\n }\n\n if (typeof attrs === 'object') {\n objectKeys(attrs).forEach((key) => {\n script.setAttribute(key, attrs[key]);\n });\n }\n\n script.onload = function (ev: Event) {\n this.onerror = this.onload = null;\n props.onload?.call(this, ev);\n resolve(script);\n };\n\n script.onerror = function (ev: Event | string) {\n this.onerror = this.onload = null;\n props.onerror?.call(this, ev);\n if (destroyOnError) {\n container.removeChild(script);\n }\n reject(new URIError('Failed to load ' + this.src));\n };\n\n container.appendChild(script);\n });\n}\n\nexport default loadScript;\n","import { isNaN } from 'ut2';\nimport { digitLength, transformEffectiveNumber } from './utils/math.util';\nimport times from './times';\n\n/**\n * 精确减法,支持多个数相减,减数默认为 0 。\n *\n * @alias module:Math.minus\n * @since 3.1.0\n * @param {...(number|string)} nums 相减的数\n * @returns {number} 差\n * @example\n *\n * minus(1); // 1\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: (string | number)[]): number {\n // eslint-disable-next-line prefer-const\n // let [num1, num2 = 0, ...rest] = nums;\n\n let num1 = nums[0];\n let num2 = nums[1] === void 0 ? 0 : nums[1];\n const rest = nums.slice(2);\n\n if (rest.length > 0) {\n // return minus(minus(num1, num2), ...rest);\n\n // eslint-disable-next-line prefer-spread\n return minus.apply(void 0, [minus(num1, num2)].concat(rest as number[]));\n }\n\n num1 = transformEffectiveNumber(num1);\n num2 = transformEffectiveNumber(num2);\n\n // 兼容处理,如果参数包含无效数值时,返回 NaN\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 { toString } from 'ut2';\n\n/**\n * 前置补零\n *\n * @alias module:Processor.padZero\n * @since 4.7.0\n * @param {string|number} value 要处理的值\n * @param {number} [size=2] 指定字符串长度,默认`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: string | number, size = 2) {\n const str = toString(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 { isNaN } from 'ut2';\nimport { digitLength, transformEffectiveNumber } from './utils/math.util';\nimport times from './times';\n\n/**\n * 精确加法,支持多个数相加,加数默认为 0 。\n *\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.1\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: (string | number)[]): number {\n // eslint-disable-next-line prefer-const\n // let [num1, num2 = 0, ...rest] = nums;\n\n let num1 = nums[0];\n let num2 = nums[1] === void 0 ? 0 : nums[1];\n const rest = nums.slice(2);\n\n if (rest.length > 0) {\n // return plus(plus(num1, num2), ...rest);\n\n // eslint-disable-next-line prefer-spread\n return plus.apply(void 0, [plus(num1, num2)].concat(rest as number[]));\n }\n\n num1 = transformEffectiveNumber(num1);\n num2 = transformEffectiveNumber(num2);\n\n // 兼容处理,如果参数包含无效数值时,返回 NaN\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 { toString } from 'ut2';\n\ntype Options = {\n start?: number;\n end?: number;\n char?: string;\n repeat?: number;\n exclude?: string;\n};\n\n/**\n * 替换字符,应用场景如:脱敏\n *\n * @alias module:Processor.replaceChar\n * @since 1.1.0\n * @param {string} str 要处理的字符串\n * @param {Object} [options] 配置项\n * @param {number} [options.start=3] 开始位置,默认`3`\n * @param {number} [options.end=-4] 结束位置,默认`-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 * // 手机号 前2后4\n * replaceChar('13000000000', { start: 2 }); // 13*****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 *\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 *\n * // 银行卡号 前6后4\n * replaceChar('6228480402564890018', { start: 6, end: -4 }); // 622848*********0018\n *\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: -1, repeat: 1 }); // 林*某\n *\n */\nfunction replaceChar(str = '', options: Options = {}) {\n const { char = '*', exclude } = options;\n let { start = 3, end = -4, repeat } = options;\n\n const realStr = toString(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 { round } from 'ut2';\n\n/**\n * 四舍五入,支持设置精度\n *\n * @alias module:Math.round\n * @since 3.1.0\n * @param {number|string} num 要四舍五入的数字\n * @param {number} [precision=0] 四舍五入的精度,默认`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: string | number, precision = 0) {\n return round(num as number, precision);\n}\n\nexport default _round;\n","interface SafeDate {\n (): Date;\n (value: number | string | Date): Date;\n (year: number, monthIndex: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): 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>\n *\n * 规避了苹果设备浏览器不支持部分格式(例如,YYYY-MM-DD HH-mm 或 YYYY.MM.DD)。\n *\n * 如果参数为 undefined 正常返回 Date 。\n *\n * @function\n * @alias module:Processor.safeDate\n * @since 4.4.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date Date}\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 */\nconst safeDate: SafeDate = function (value?: number | string | Date, ...args: any[]) {\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 标识。\n *\n * 如果你需要获取DataURL 的 MIME 类型和数据本身,推荐使用 <a href=\"https://www.npmjs.com/package/data-urls\">data-urls</a>。\n *\n * @alias module:Processor.setDataURLPrefix\n * @since 4.1.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/URI/Schemes/data Data URLs}\n * @see {@link https://www.iana.org/assignments/media-types/media-types.xhtml Media Types}\n * @param {string} data 数据本身\n * @param {string} [mimeType=\"image/png\"] MIME 类型,默认`image/png`\n * @param {boolean} [base64=true] 添加 base64 标识,默认`true`\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: string, mimeType = 'image/png', base64 = true) {\n return `data:${mimeType}${base64 ? ';base64' : ''},${data}`;\n}\n\nexport default setDataURLPrefix;\n","import { toString } from 'ut2';\n\n/**\n * 获取字符长度。中文汉字占2个字符,英文占1个字符,特殊如emoji占4个字符。\n *\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: string) {\n const realStr = toString(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","import { isArray, isObject } from 'ut2';\nimport { objectKeys } from './utils/native';\n\ntype NodeAssign = 'spread' | 'self';\n\n// 交换字段名\ntype ExchangeFieldNames<D extends any, F extends Record<string, keyof D>> = Omit<D, F[keyof F]> & {\n [P in keyof F]: D[F[P]];\n};\n\n// 交换字段名,支持嵌套\n// 先排除子级字段名,再交换字段名,然后加上子级字段名,再替换一次。\ntype TransformFieldNames<D extends any, F extends Record<string, any>, C extends string> = (C extends keyof D ? ExchangeFieldNames<Omit<D, C> & Record<C, TransformFieldNames<D, F, C>>, F> : ExchangeFieldNames<D, F>)[];\n\n/**\n * 转换字段名,返回一个转换字段后的值,不改变原值。\n *\n * @alias module:Tree.transformFieldNames\n * @since 4.14.0\n * @param {Object[]} data 对象数组。如果是树结构数据,需要指定第三个参数 childrenField\n * @param {Object} fieldNames 字段名映射\n * @param {string} [childrenField] 子级数据字段名\n * @param {'spread'|'self'} [nodeAssign='spread'] 节点赋值方式,默认`spread`。`spread`表示使用展开运算符创建新值,`self`表示使用自身对象。\n * @returns {Object[]}\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<D extends any, F extends Record<string, keyof D>, C extends string>(data: D[], fieldNames: F, childrenField?: C, nodeAssign: NodeAssign = 'spread'): TransformFieldNames<D, F, C> {\n if (!isArray(data)) {\n return data;\n }\n\n if (data.length <= 0) {\n return [];\n }\n\n // 递归处理字段名\n function recusion(arr: object[]) {\n return arr.map((item) => {\n if (!isObject(item)) {\n return item;\n }\n\n const newItem = nodeAssign === 'spread' ? { ...item } : item;\n const delKeys: string[] = [];\n\n // 树形数据子节点\n // @ts-ignore\n if (childrenField && isArray(newItem[childrenField]) && newItem[childrenField].length > 0) {\n // @ts-ignore\n newItem[childrenField] = recusion(newItem[childrenField].slice());\n }\n\n const newKeys = objectKeys(fieldNames);\n\n // 替换字段名\n newKeys.forEach((newKey) => {\n const oldKey = fieldNames[newKey];\n if (oldKey in newItem) {\n // @ts-ignore\n newItem[newKey] = newItem[oldKey];\n\n // @ts-ignore\n if (newKeys.indexOf(oldKey) === -1) {\n // @ts-ignore\n delKeys.push(oldKey);\n }\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;\n","import { isArray, isObject } from 'ut2';\n\n/**\n * 树结构转列表数据\n *\n * @alias module:Tree.treeToList\n * @since 4.14.0\n * @param {Object[]} tree 树结构数据\n * @param {string} childrenField 子级字段名称\n * @returns {Object[]} 列表数据\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<T extends Record<string, any>, K extends keyof T, R extends Omit<T, K>>(tree: T[], childrenField: K) {\n const list: R[] = [];\n\n if (!isArray(tree)) {\n return list;\n }\n\n // 递归遍历\n function recusion(arr: T[]) {\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 (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 (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"],"names":["nativeUndefined","stringUndefined","stringObject","objectProto","Object","prototype","objectProtoToString","toString","objectProtoHasOwnProperty","hasOwnProperty","objectProtoPropertyIsEnumerable","propertyIsEnumerable","objectGetOwnPropertySymbols","getOwnPropertySymbols","objectGetPrototypeOf","getPrototypeOf","objectKeys","keys","functionProtoToString","Function","symbolProto","Symbol","mathMin","Math","min","mathMax","max","mathRandom","random","mathFloor","floor","mathCeil","ceil","numberIsFinite","Number","isFinite","globalThisExisted","globalThis","globalExisted","global","selfExisted","self","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","functionTags","map","item","isArray","value","Array","isObjectLike","isObject","getTag","call","isSymbol","reIsBinary","reIsOctal","reIsBadHex","toNumber","NaN","trim","isBinary","test","parseInt","slice","identity","isArrayLike","isLength","length","tag","some","isFunction","toFinite","Infinity","randomInt","lower","upper","temp","allKeys","object","concat","filter","getSymbols","dir","forEach","collection","iteratee","_keys","len","i","currentKey","isNumber","symbolToString","baseToString","result","isNil","blobExisted","Blob","isBlob","objectCtorString","isPlainObject","proto","Ctor","constructor","fileExisted","File","freeGlobalThis","freeGlobal","freeSelf","root","isNaN","isPromiseLike","then","isString","decimalAdjust","type","precision","func","remainder","toInteger","pair","split","round","number","extendStatics","d","b","setPrototypeOf","__proto__","p","__assign","assign","t","s","n","arguments","apply","this","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","e","rejected","done","__generator","body","f","y","_","label","sent","trys","ops","g","create","Iterator","verb","iterator","v","op","TypeError","pop","push","__read","o","m","r","ar","error","__spreadArray","to","from","pack","l","SuppressedError","tryit","fn","args","_i","res","catch","err","idCounter","substring","reg","regIdCard","regLoose","sumCheckCode","numStr","numArr","replace","reverse","sum","currNum","mod","isBankCard","options","_a","loose","_b","luhn","valueStr","validateResult","precode","String","baseReg","baseCodeArr","preCode","total","index","findIndex","wf","pow","isSocialCreditCode","checkCode","needCheckCode","passBaseRule","config","disableWarning","devWarn","console","warn","regNumber","regLowerCaseLetter","regUpperCaseLetter","regAllNumberAndLetter","hasHex","val","indexOf","validatePassword","level","ignoreCase","_c","special","valStr","currentLevel","containesNumber","containesLowerCaseLetter","containesUpperCaseLetter","containesSpecialCharacter","chars","specialChars","regChars","RegExp","ret","charItem","hasSpecialCharacter","containesUnallowableCharacter","hasUnallowableCharacter","validated","containes","lowerCaseLetter","upperCaseLetter","specialCharacter","unallowableCharacter","URLExisted","URL","objectValues","values","createObjectURL","revokeObjectURL","chineseDictionary","chineseBasic","chineseExtend","chineseExtend2","chineseExtendA","chineseExtendB","chineseExtendC","chineseExtendD","chineseExtendE","chineseExtendF","chineseExtendG","chineseExtendH","chineseExtendI","looseChineseRegExp","chineseRegExp","chineseWithExtend","join","looseChineseExtendRegExp","chineseExtendRegExp","supportRegExpUnicode","serverReg","portReg","pathReg","searchReg","regWithProtocal","regNonProtocal","isUrl","pj","j","sj10","isBusinessLicense","lastCode","regHMCard","regTWCard","singleRegTWCard","isValidNumber","strict","radixReg","dotNumberStringReg","transformEffectiveNumber","strip","num","parseFloat","toPrecision","digitLength","eSplit","float2Fixed","strNum","isScientificNumber","dLen","checkBoundary","numberChar","unitChar","unitSection","chnNumberChar","chnUnitChar","big5NumberChar","big5UnitChar","sectionToChinese","section","str","chnstr","zero","unitPos","mapNumberChar","bytesToSize","bytes","spaceMark","numBytes","sizes","log","toFixed","Provinces","transformObjectValue","data","deep","result_1","key","newValue","result_2","times","nums","num1","num2","rest","num1Changed","num2Changed","baseNum","leftValue","divide","gcd","abs","ajax","url","method","timeout","headers","_d","withCredentials","_e","async","_f","user","_g","password","responseType","onReadyStateChange","onLoadStart","onProgress","onAbort","onTimeout","onError","onLoad","onLoadEnd","xhr","XMLHttpRequest","open","toLowerCase","onreadystatechange","setRequestHeader","cb","wrapError","events","loadstart","progress","abort","load","loadend","addEventListener","send","isUploadFile","fileObj","name","getExtname","path","array","checkFileType","file","accept","isFileType","isFile","types","fileName","originFileObj","fileType","fileUrl","includes","match","fileParentType","SuccessResponseStatus","getFileBlob","ajaxOptions","ev","responseStatus","target","status","response","Error","loadImage","img","imgIsBlob","image","Image","crossOrigin","onload","onerror","src","loadImageWithBlob","blob","dataURLToBlob","parts","meta","bstr","atob","decodeURIComponent","u8arr","Uint8Array","charCodeAt","saver","blobUrl","anchor","document","createElement","href","style","display","setAttribute","handleClick","stopPropagation","removeEventListener","appendChild","click","removeChild","FileReaderMethodMap","arrayBuffer","binaryString","dataURL","text","audio","video","pdf","word","excel","mimeTypes","letter","toUpperCase","allChars","internalRandomString","pool","prefix","processEmptyChildren","arr","childrenField","emptyChildrenValue","internalFindTreeSelect","tree","predicate","childs","findChildren","EmitterPro","handlers","eventNames","symbols","rawListeners","eventName","handler","raw","listeners","wrap","hasListener","listener","_on","context","currentListener","appendMethod","prependListener","on","_wrapOnce","_this","off","once","prependOnceListener","splice","offAll","emit","cache","MemoryStorage","scope","getItem","setItem","removeItem","clear","isStorageSupported","storage","isSupport","Date","getTime","Storage","isSupported","needParsed","memoryScope","getKey","get","reviver","JSON","parse","set","replacer","stringify","del","defaultNamespace","Cache","_super","namespace","opts","ns","stdTTL","maxStrategy","checkperiod","cacheKey","startCheckperiod","__","__extends","_check","now","_wrap","ttl","currentTtl","_isLimited","_getReplaceKey","cacheValues","retkey","defineProperty","enumerable","configurable","setCacheValues","mget","getAll","validKeys","replaceKey","mset","keyValueSet","itemSetResult","count","oldData","has","take","getTtl","getLastModified","clearTimeout","_checkTimeout","setTimeout","stopCheckperiod","Emitter","AsyncMemo","promiseCache","run","asyncFn","persisted","prevPos","prevCtrlValue","rawValue","ctrlValue","placeholderChar","maskReg","realCtrlValue","realRawValue","placeholderChars","editLength","pos","ctrlCharCount","placeholderCharCount","charAt","width","height","rotate","offset","background","canvasWidth","canvasHeight","format","quality","beforeCompress","beforeDraw","afterDraw","numWidth","numHeight","numQuality","canvas","ctx","getContext","info","numCanvasWidth","numCanvasHeight","bgIsTransparent","clearRect","fillStyle","fillRect","internalOffset","translate","PI","outOffset","dx","dy","drawImage","globalCompositeOperation","toBlob","canvasToBlob","toDataURL","download","dataType","transformRequest","transformResponse","payload","asyncTransformResponse","tempRes","tempOptions","asyncTransformRequest","currentFileName","navigator","msSaveBlob","reader","FileReader","filterTree","nodeAssign","newItem","node","stack","c","nodes","bankCardNo","regChar","realValue","mobileNo","symbol","thousand","decimal","checkNumber","intStr","decStr","txt","exec","negativeSymbol","reArr","formatInt","formatDec","w","h","contrast","measure","size","ext","find","css","container","head","getElementsByTagName","insertAt","onBefore","styleSheet","cssText","createTextNode","atTop","prepend","firstChild","insertBefore","useExtend","hasExtend","id","check","list","keyField","parentField","record","pid","script","attrs","destroyOnError","restOptions","__rest","props","URIError","minus","big5","unit","negative","unitConfig","unitWan","unitYi","chnInteger","preStr","numAbs","numInt","strIns","chnStr","needZero","convertInteger","chnDecimal","convertDecimal","repeat","origin","province","city","area","year","month","day","gender","birthday","plus","_pool","char","exclude","start","end","realStr","strLen","middleStr","safeValue","bind","mimeType","base64","bool","fieldNames","recusion","delKeys","newKeys","newKey","oldKey","delKey"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,49,51,73,87,88]}
1
+ {"version":3,"file":"util-helpers.min.js","sources":["../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/internals/native.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/isArray.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/isObjectLike.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/isObject.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/internals/getTag.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/isSymbol.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/toNumber.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/identity.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/isArrayLike.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/isLength.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/isFunction.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/toFinite.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/randomInt.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/allKeys.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/internals/getSymbols.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/forEach.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/internals/createForEach.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/isNumber.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/toString.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/isNil.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/isBlob.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/isPlainObject.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/isFile.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/internals/root.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/isNaN.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/isPromiseLike.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/isString.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/internals/decimalAdjust.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/toInteger.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/isFinite.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/round.js","../node_modules/.pnpm/@rollup+plugin-typescript@11.1.6_rollup@4.36.0_tslib@2.8.1_typescript@5.8.2/node_modules/tslib/tslib.es6.js","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/tryit.js","../src/isMobile.ts","../src/isTelephone.ts","../src/isPostcode.ts","../src/isIdCard.ts","../src/isEmail.ts","../src/isQQ.ts","../src/isWX.ts","../src/isVehicle.ts","../src/isBankCard.ts","../src/isUnifiedIdentifier.ts","../src/isSocialCreditCode.ts","../src/utils/config.ts","../src/utils/devWarn.ts","../src/validatePassword.ts","../src/isPassport.ts","../src/utils/setup.ts","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/constant.js","../src/utils/native.ts","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/noop.js","../src/isChinese.ts","../src/isIPv4.ts","../src/isIPv6.ts","../src/isUrl.ts","../src/isBusinessLicense.ts","../src/isHMCard.ts","../src/isTWCard.ts","../src/isSwiftCode.ts","../src/isValidNumber.ts","../src/utils/math.util.ts","../src/numberToChinese.ts","../src/bytesToSize.ts","../src/parseIdCard.ts","../src/transformObjectValue.ts","../src/times.ts","../src/divide.ts","../src/gcd.ts","../src/ajax.ts","../src/utils/file.util.ts","../src/getExtname.ts","../node_modules/.pnpm/ut2@1.17.0/node_modules/ut2/es/nth.js","../src/checkFileType.ts","../src/getFileBlob.ts","../src/loadImage.ts","../src/loadImageWithBlob.ts","../src/dataURLToBlob.ts","../src/download.ts","../src/fileReader.ts","../src/getFileType.ts","../src/getMimeType.ts","../src/randomString.ts","../src/listToTree.ts","../src/findTreeSelect.ts","../src/VERSION.ts","../node_modules/.pnpm/emitter-pro@1.2.2/node_modules/emitter-pro/dist/emitter-pro.esm.js","../node_modules/.pnpm/cache2@3.1.2/node_modules/cache2/dist/cache2.esm.js","../src/AsyncMemo.ts","../src/calculateCursorPosition.ts","../src/checkResult.ts","../src/compressImage.ts","../src/filterTree.ts","../src/findTreeNode.ts","../src/findTreeNodes.ts","../src/formatBankCard.ts","../src/formatMobile.ts","../src/formatMoney.ts","../src/getImageInfo.ts","../src/injectStyle.ts","../src/isPassword.ts","../src/lcm.ts","../src/loadScript.ts","../src/minus.ts","../src/padZero.ts","../src/plus.ts","../src/replaceChar.ts","../src/round.ts","../src/safeDate.ts","../src/setDataURLPrefix.ts","../src/strlen.ts","../src/transformFieldNames.ts","../src/treeToList.ts"],"sourcesContent":["var nativeUndefined = void 0;\nvar stringUndefined = 'undefined';\nvar stringObject = 'object';\nvar objectProto = Object.prototype;\nvar objectProtoToString = objectProto.toString;\nvar objectProtoHasOwnProperty = objectProto.hasOwnProperty;\nvar objectProtoPropertyIsEnumerable = objectProto.propertyIsEnumerable;\nvar objectGetOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar objectGetPrototypeOf = Object.getPrototypeOf;\nvar objectKeys = Object.keys;\nvar functionProto = Function.prototype;\nvar functionProtoToString = functionProto.toString;\nvar symbolExisted = typeof Symbol !== stringUndefined;\nvar symbolProto = symbolExisted ? Symbol.prototype : nativeUndefined;\nvar arrayProto = Array.prototype;\nvar arrayProtoSlice = arrayProto.slice;\nvar mathMin = Math.min;\nvar mathMax = Math.max;\nvar mathRandom = Math.random;\nvar mathFloor = Math.floor;\nvar mathCeil = Math.ceil;\nvar mathAbs = Math.abs;\nvar numberIsFinite = Number.isFinite;\nvar numberIsInteger = Number.isInteger;\nvar numberIsSafeInteger = Number.isSafeInteger;\nvar globalThisExisted = typeof globalThis === stringObject && globalThis;\nvar globalExisted = typeof global === stringObject && global;\nvar selfExisted = typeof self === stringObject && self;\nvar MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\nvar MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;\nvar MAX_ARRAY_LENGTH = 4294967295;\nvar tagPrefix = '[object ';\nvar bigIntTag = tagPrefix + 'BigInt]';\nvar numberTag = tagPrefix + 'Number]';\nvar booleanTag = tagPrefix + 'Boolean]';\nvar stringTag = tagPrefix + 'String]';\nvar dateTag = tagPrefix + 'Date]';\nvar regExpTag = tagPrefix + 'RegExp]';\nvar symbolTag = tagPrefix + 'Symbol]';\nvar errorTag = tagPrefix + 'Error]';\nvar arrayBufferTag = tagPrefix + 'ArrayBuffer]';\nvar argumentsTag = tagPrefix + 'Arguments]';\nvar arrayTag = tagPrefix + 'Array]';\nvar functionTags = ['Function', 'AsyncFunction', 'GeneratorFunction', 'Proxy'].map(function (item) { return tagPrefix + item + ']'; });\nvar weakSetTag = tagPrefix + 'WeakSet]';\nvar blobTag = tagPrefix + 'Blob]';\nvar fileTag = tagPrefix + 'File]';\nvar domExceptionTag = tagPrefix + 'DOMException]';\nvar objectTag = tagPrefix + 'Object]';\nvar dataViewTag = tagPrefix + 'DataView]';\nvar mapTag = tagPrefix + 'Map]';\nvar promiseTag = tagPrefix + 'Promise]';\nvar setTag = tagPrefix + 'Set]';\nvar weakMapTag = tagPrefix + 'WeakMap]';\nvar windowTag = tagPrefix + 'Window]';\n\nexport { MAX_ARRAY_LENGTH, MAX_SAFE_INTEGER, MIN_SAFE_INTEGER, argumentsTag, arrayBufferTag, arrayProto, arrayProtoSlice, arrayTag, bigIntTag, blobTag, booleanTag, dataViewTag, dateTag, domExceptionTag, errorTag, fileTag, functionProto, functionProtoToString, functionTags, globalExisted, globalThisExisted, mapTag, mathAbs, mathCeil, mathFloor, mathMax, mathMin, mathRandom, nativeUndefined, numberIsFinite, numberIsInteger, numberIsSafeInteger, numberTag, objectGetOwnPropertySymbols, objectGetPrototypeOf, objectKeys, objectProto, objectProtoHasOwnProperty, objectProtoPropertyIsEnumerable, objectProtoToString, objectTag, promiseTag, regExpTag, selfExisted, setTag, stringObject, stringTag, stringUndefined, symbolProto, symbolTag, weakMapTag, weakSetTag, windowTag };\n","function isArray(value) {\n return Array.isArray(value);\n}\n\nexport { isArray as default };\n","function isObjectLike(value) {\n return value !== null && typeof value === 'object';\n}\n\nexport { isObjectLike as default };\n","import isObjectLike from './isObjectLike.js';\n\nfunction isObject(value) {\n return typeof value === 'function' || isObjectLike(value);\n}\n\nexport { isObject as default };\n","import { objectProtoToString } from './native.js';\n\nfunction getTag(value) {\n return objectProtoToString.call(value);\n}\n\nexport { getTag as default };\n","import getTag from './internals/getTag.js';\nimport { symbolTag } from './internals/native.js';\n\nfunction isSymbol(value) {\n return typeof value === 'symbol' || getTag(value) === symbolTag;\n}\n\nexport { isSymbol as default };\n","import isObject from './isObject.js';\nimport isSymbol from './isSymbol.js';\n\nvar reIsBinary = /^0b[01]+$/i;\nvar reIsOctal = /^0o[0-7]+$/i;\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\nfunction toNumber(value) {\n if (typeof value === 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NaN;\n }\n if (isObject(value)) {\n value = Number(value);\n }\n if (typeof value !== 'string') {\n return value === 0 ? value : +value;\n }\n value = value.trim();\n var isBinary = reIsBinary.test(value);\n return isBinary || reIsOctal.test(value) ? parseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NaN : +value;\n}\n\nexport { toNumber as default };\n","function identity(value) {\n return value;\n}\n\nexport { identity as default };\n","import isFunction from './isFunction.js';\nimport isLength from './isLength.js';\n\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nexport { isArrayLike as default };\n","import { MAX_SAFE_INTEGER } from './internals/native.js';\n\nfunction isLength(value) {\n return typeof value === 'number' && value > -1 && value % 1 === 0 && value <= MAX_SAFE_INTEGER;\n}\n\nexport { isLength as default };\n","import getTag from './internals/getTag.js';\nimport { functionTags } from './internals/native.js';\n\nfunction isFunction(value) {\n if (typeof value === 'function') {\n return true;\n }\n var tag = getTag(value);\n return functionTags.some(function (item) { return item === tag; });\n}\n\nexport { isFunction as default };\n","import toNumber from './toNumber.js';\n\nvar MAX_VALUE = 1.7976931348623157e308;\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === Infinity || value === -Infinity) {\n var sign = value < 0 ? -1 : 1;\n return sign * MAX_VALUE;\n }\n return value === value ? value : 0;\n}\n\nexport { toFinite as default };\n","import { mathFloor, mathRandom, mathCeil, mathMin, mathMax } from './internals/native.js';\nimport toFinite from './toFinite.js';\n\nfunction randomInt(lower, upper) {\n if (lower === void 0) { lower = 0; }\n if (upper === void 0) { upper = 1; }\n lower = toFinite(lower);\n upper = toFinite(upper);\n var min = mathCeil(mathMin(lower, upper) || 0);\n var max = mathFloor(mathMax(lower, upper) || 0);\n if (min > max) {\n var temp = min;\n min = max;\n max = temp;\n }\n return mathFloor(min + mathRandom() * (max - min + 1));\n}\n\nexport { randomInt as default };\n","import getSymbols from './internals/getSymbols.js';\nimport { objectKeys } from './internals/native.js';\nimport isObject from './isObject.js';\n\nfunction allKeys(object) {\n if (!isObject(object)) {\n return [];\n }\n return objectKeys(object).concat(getSymbols(object));\n}\n\nexport { allKeys as default };\n","import { objectGetOwnPropertySymbols, objectProtoPropertyIsEnumerable } from './native.js';\n\nfunction getSymbols(object) {\n if (!objectGetOwnPropertySymbols || object === null) {\n return [];\n }\n return objectGetOwnPropertySymbols(object).filter(function (item) { return objectProtoPropertyIsEnumerable.call(object, item); });\n}\n\nexport { getSymbols as default };\n","import createForEach from './internals/createForEach.js';\n\nvar forEach = createForEach(1);\n\nexport { forEach as default };\n","import allKeys from '../allKeys.js';\nimport identity from '../identity.js';\nimport isArrayLike from '../isArrayLike.js';\n\nfunction createForEach(dir) {\n var forEach = function (collection, iteratee) {\n if (iteratee === void 0) { iteratee = identity; }\n var _keys = !isArrayLike(collection) && allKeys(collection);\n var len = (_keys || collection).length;\n var i = dir > 0 ? 0 : len - 1;\n while (i >= 0 && i < len) {\n var currentKey = _keys ? _keys[i] : i;\n if (iteratee(collection[currentKey], currentKey, collection) === false) {\n break;\n }\n i += dir;\n }\n return collection;\n };\n return forEach;\n}\n\nexport { createForEach as default };\n","import getTag from './internals/getTag.js';\nimport { numberTag } from './internals/native.js';\n\nfunction isNumber(value) {\n return typeof value === 'number' || getTag(value) === numberTag;\n}\n\nexport { isNumber as default };\n","import { symbolProto, nativeUndefined } from './internals/native.js';\nimport isArray from './isArray.js';\nimport isNil from './isNil.js';\nimport isSymbol from './isSymbol.js';\n\nvar symbolToString = symbolProto ? symbolProto.toString : nativeUndefined;\nfunction baseToString(value) {\n if (typeof value === 'string') {\n return value;\n }\n if (isArray(value)) {\n return '' + value.map(baseToString);\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = '' + value;\n return result === '0' && 1 / value === -Infinity ? '-0' : result;\n}\nfunction toString(value) {\n return isNil(value) ? '' : baseToString(value);\n}\n\nexport { toString as default };\n","function isNil(value) {\n return value == null;\n}\n\nexport { isNil as default };\n","import getTag from './internals/getTag.js';\nimport { blobTag, stringUndefined } from './internals/native.js';\n\nvar blobExisted = typeof Blob !== stringUndefined;\nfunction isBlob(value) {\n if (blobExisted && value instanceof Blob) {\n return true;\n }\n return getTag(value) === blobTag;\n}\n\nexport { isBlob as default };\n","import getTag from './internals/getTag.js';\nimport { functionProtoToString, objectTag, objectProtoHasOwnProperty, objectGetPrototypeOf } from './internals/native.js';\nimport isObjectLike from './isObjectLike.js';\n\nvar objectCtorString = functionProtoToString.call(Object);\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || getTag(value) !== objectTag) {\n return false;\n }\n var proto = objectGetPrototypeOf(Object(value));\n if (proto === null) {\n return true;\n }\n var Ctor = objectProtoHasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor === 'function' && Ctor instanceof Ctor && functionProtoToString.call(Ctor) === objectCtorString;\n}\n\nexport { isPlainObject as default };\n","import getTag from './internals/getTag.js';\nimport { fileTag, stringUndefined } from './internals/native.js';\n\nvar fileExisted = typeof File !== stringUndefined;\nfunction isFile(value) {\n if (fileExisted && value instanceof File) {\n return true;\n }\n return getTag(value) === fileTag;\n}\n\nexport { isFile as default };\n","import { globalThisExisted, globalExisted, selfExisted } from './native.js';\n\nvar freeGlobalThis = globalThisExisted && globalThis.Object === Object && globalThis;\nvar freeGlobal = globalExisted && global.Object === Object && global;\nvar freeSelf = selfExisted && self.Object === Object && self;\nvar root = freeGlobalThis || freeGlobal || freeSelf || Function('return this')();\n\nexport { root as default };\n","import root from './internals/root.js';\nimport isNumber from './isNumber.js';\n\nfunction isNaN(value) {\n return isNumber(value) && root.isNaN(value);\n}\n\nexport { isNaN as default };\n","import isObject from './isObject.js';\n\nfunction isPromiseLike(value) {\n return isObject(value) && typeof value.then === 'function';\n}\n\nexport { isPromiseLike as default };\n","import getTag from './internals/getTag.js';\nimport { stringTag } from './internals/native.js';\n\nfunction isString(value) {\n return typeof value === 'string' || getTag(value) === stringTag;\n}\n\nexport { isString as default };\n","import isFinite from '../isFinite.js';\nimport toInteger from '../toInteger.js';\nimport toNumber from '../toNumber.js';\nimport toString from '../toString.js';\nimport { mathMin } from './native.js';\n\nfunction decimalAdjust(type, value, precision) {\n if (precision === void 0) { precision = 0; }\n var func = Math[type];\n value = toNumber(value);\n precision = mathMin(toInteger(precision), 292);\n if (precision === 0 || !isFinite(value)) {\n return func(value);\n }\n var pair = toString(value).split('e');\n value = func(+(pair[0] + 'e' + (pair[1] ? +pair[1] + precision : precision)));\n pair = toString(value).split('e');\n return +(pair[0] + 'e' + (pair[1] ? +pair[1] - precision : -precision));\n}\n\nexport { decimalAdjust as default };\n","import toNumber from './toNumber.js';\n\nfunction toInteger(value) {\n var result = toNumber(value);\n if (!result || result === Infinity || result === -Infinity) {\n return result === result ? result : 0;\n }\n var remainder = result % 1;\n return remainder ? result - remainder : result;\n}\n\nexport { toInteger as default };\n","import root from './internals/root.js';\nimport { numberIsFinite } from './internals/native.js';\n\nfunction isFinite(value) {\n return numberIsFinite ? numberIsFinite(value) : typeof value === 'number' && root.isFinite(value);\n}\n\nexport { isFinite as default };\n","import decimalAdjust from './internals/decimalAdjust.js';\n\nfunction round(number, precision) {\n return decimalAdjust('round', number, precision);\n}\n\nexport { round as default };\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import { __spreadArray, __read } from 'tslib';\nimport { nativeUndefined } from './internals/native.js';\nimport isPromiseLike from './isPromiseLike.js';\n\nvar tryit = function (fn) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n try {\n var result = fn.apply(void 0, __spreadArray([], __read(args), false));\n if (isPromiseLike(result)) {\n return result\n .then(function (res) {\n return [null, res];\n })\n .catch(function (err) {\n return [err, nativeUndefined];\n });\n }\n return [null, result];\n }\n catch (err) {\n return [err, nativeUndefined];\n }\n };\n};\n\nexport { tryit as default };\n","import { toString } from 'ut2';\n\n// 手机号码 11位数字,以1开头,第二位是3456789其中一个,后面再加9个数字\nconst reg = /^1[3456789]\\d{9}$/;\n\n/**\n * 检测值是否为手机号码\n *\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: any) {\n const valueStr = toString(value);\n return reg.test(valueStr);\n}\n\nexport default isMobile;\n","import { toString } from 'ut2';\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 * @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: any) {\n const valueStr = toString(value);\n return reg.test(valueStr);\n}\n\nexport default isTelephone;\n","import { toString } from 'ut2';\n\n// 邮政编码\nconst reg = /^\\d{6}$/;\n\n/**\n * 检测值是否为邮政编码,6位数字\n *\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: any) {\n const valueStr = toString(value);\n return reg.test(valueStr);\n}\n\nexport default isPostcode;\n","import { toString } from 'ut2';\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: string) {\n let index, sum;\n for (sum = index = 0; index < 17; index++) {\n sum += (Math.pow(2, 17 - index) % 11) * Number(id[index]);\n }\n const 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\ntype Options = {\n loose?: boolean;\n checkCode?: boolean;\n};\n\n/**\n * 检测值是否为18位身份证号码。\n *\n * 宽松模式下,支持15位身份证号码。\n *\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] 宽松模式,默认`false`。如果为`true`,支持15位身份证号码\n * @param {boolean} [options.checkCode=true] 是否校验最后一位校验码,默认`true`。仅在`loose=false`时生效\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: any, options: Options = {}) {\n const { loose = false, checkCode = true } = options;\n\n const valueStr = toString(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 { toString } from 'ut2';\n\n// 邮箱\nconst reg = /^[\\da-z]+([-._]?[\\da-z]+)*@[\\da-z]+([-.]?[\\da-z]+)*(\\.[a-z]{2,})+$/i;\n\n/**\n * 检测值是否为Email\n *\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: any) {\n const valueStr = toString(value);\n return reg.test(valueStr);\n}\n\nexport default isEmail;\n","import { toString } from 'ut2';\n\n// QQ号正则\nconst reg = /^[1-9]\\d{4,10}$/;\n\n/**\n * 检测值是否为QQ号,非0开头,5至11位数字\n *\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: any) {\n const valueStr = toString(value);\n return reg.test(valueStr);\n}\n\nexport default isQQ;\n","import { toString } from 'ut2';\n\n// 微信号 6至20位,以字母开头,字母,数字,减号(连接符),下划线\nconst reg = /^[a-z]([-_a-z0-9]{5,19})+$/i;\n\n/**\n * 检测值是否为微信号\n *\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: any) {\n const valueStr = toString(value);\n return reg.test(valueStr);\n}\n\nexport default isWX;\n","import { toString } from 'ut2';\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 * @alias module:Validator.isVehicle\n * @since 1.1.0\n * @see {@link https://baike.baidu.com/item/车牌号 车牌号}\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: any) {\n const valueStr = toString(value);\n return reg.test(valueStr);\n}\n\nexport default isVehicle;\n","import { toString } from 'ut2';\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: string) {\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\ntype Options = {\n loose?: boolean;\n luhn?: boolean;\n};\n\n/**\n * 检测值是否为银行卡号。正常模式(非0开头,10-21位数字)宽松模式(8-30位数字)\n *\n * @alias module:Validator.isBankCard\n * @since 1.1.0\n * @see {@link https://kf.qq.com/faq/170112ABnm6b170112FvquAn.html 常用银行账号位数参考}\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.loose=false] 宽松模式,默认`false`。正常模式10-21位数字(个人账户),宽松模式8-30位数字(企业账户)。\n * @param {boolean} [options.luhn=false] 使用 Luhn 算法校验校验码,默认`false`\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: any, options: Options = {}) {\n const { loose = false, luhn = false } = options;\n\n const valueStr = toString(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\nisBankCard.sumCheckCode = sumCheckCode;\n\nexport default isBankCard;\n","import { toString } from 'ut2';\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: string) {\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\ntype Options = {\n checkCode?: boolean;\n};\n\n/**\n * 检测值是否为统一社会信用代码,也叫三证合一组织代码。由18位数字和大写字母组成,不使用I、O、Z、S、V。\n *\n * 之前版本的方法名为 `isSocialCreditCode` 。\n *\n * @alias module:Validator.isUnifiedIdentifier\n * @since 5.6.0\n * @see {@link https://zh.wikisource.org/zh-hans/GB_32100-2015_法人和其他组织统一社会信用代码编码规则 GB 32100-2015 法人和其他组织统一社会信用代码编码规则}\n * @see {@link https://std.samr.gov.cn/gb/search/gbDetailed?id=71F772D808D6D3A7E05397BE0A0AB82A 法人和其他组织统一社会信用代码编码规则}\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.checkCode=true] 是否校验最后一位校验码,如果为false,不校验校验位。\n * @returns {boolean} 值是否为统一社会信用代码\n * @example\n *\n * isUnifiedIdentifier('91350100M000100Y43'); // true\n * isUnifiedIdentifier('91350100M000100Y4A'); // false\n *\n * // 不校验校验位,长度和类型还是有校验的\n * isUnifiedIdentifier('91350100M000100Y4A', { checkCode: false }); // true\n * isUnifiedIdentifier('91350100M000100YIO', { checkCode: false }); // false\n * isUnifiedIdentifier('91350100M000100Y', { checkCode: false }); // false\n *\n */\nfunction isUnifiedIdentifier(value: any, options?: Options) {\n const valueStr = toString(value);\n const { checkCode: needCheckCode = true } = options || {};\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\nisUnifiedIdentifier.sumCheckCode = sumCheckCode;\n\nexport default isUnifiedIdentifier;\n","import isUnifiedIdentifier from './isUnifiedIdentifier';\n\n/**\n * 检测值是否为统一社会信用代码,也叫三证合一组织代码。由18位数字和大写字母组成,不使用I、O、Z、S、V。\n *\n * @private\n * @alias module:Validator.isSocialCreditCode\n * @since 1.1.0\n * @see {@link https://zh.wikisource.org/zh-hans/GB_32100-2015_法人和其他组织统一社会信用代码编码规则 GB 32100-2015 法人和其他组织统一社会信用代码编码规则}\n * @deprecated 即将废弃,请使用 `isUnifiedIdentifier` 替代。\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 */\nconst isSocialCreditCode = isUnifiedIdentifier;\n\nexport default isSocialCreditCode;\n","const config = {\n // 禁用warning提示\n disableWarning: true\n};\n\n/**\n * 设置禁止warning提示\n * @alias module:Debug.formatBankCard\n * @since 3.6.1\n * @param {boolean} bool 是否禁止warning提示\n */\nfunction setDisableWarning(bool: boolean) {\n config.disableWarning = !!bool;\n}\n\nexport { config, setDisableWarning };\n","import { config } from './config';\n\n/**\n * 打印警告信息\n *\n * @param {any[]} args 打印的信息\n */\nfunction devWarn(...args: any[]) {\n if (!config.disableWarning) {\n console.warn.apply(void 0, 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 hasHex(val: string) {\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: string, chars: string) {\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: string, chars: string) {\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\ntype Options = {\n level?: number;\n ignoreCase?: boolean;\n special?: string;\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 * @alias module:Validator.validatePassword\n * @since 3.7.0\n * @see {@link https://baike.baidu.com/item/ASCII#3 ASCII}\n * @param {string} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {number} [options.level=2] 密码强度,默认`2`。`1`-包含一种字符 `2`-包含两种字符 `3`-包含三种字符。(大写字母、小写字母、数字、特殊字符)\n * @param {boolean} [options.ignoreCase=false] 是否忽略大小写,默认`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: string, options: 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 = regNumber.test(valStr);\n // 包含小写字母\n const containesLowerCaseLetter = regLowerCaseLetter.test(valStr);\n // 包含大写字母\n const containesUpperCaseLetter = regUpperCaseLetter.test(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 { toString } from 'ut2';\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 * @alias module:Validator.isPassport\n * @since 1.1.0\n * @see {@link https://zh.wikipedia.org/wiki/中华人民共和国护照#个人资料页 中华人民共和国护照#个人资料页}\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为护照号\n * @example\n *\n * isPassport('E12345678'); // true\n * isPassport('abc'); // false\n *\n */\nfunction isPassport(value: any) {\n const valueStr = toString(value);\n return reg.test(valueStr);\n}\n\nexport default isPassport;\n","export const URLExisted = typeof URL !== 'undefined';\n","function constant(value) {\n return function () {\n return value;\n };\n}\n\nexport { constant as default };\n","import { constant, noop } from 'ut2';\nimport { URLExisted } from './setup';\n\nexport const nativeUndefined = void 0;\n\nexport const objectKeys = Object.keys;\nexport const objectValues = Object.values;\n\nexport const createObjectURL = URLExisted ? URL.createObjectURL : constant('');\nexport const revokeObjectURL = URLExisted ? URL.revokeObjectURL : noop;\n","function noop() { }\n\nexport { noop as default };\n","import { toString } from 'ut2';\nimport { nativeUndefined, objectValues } from './utils/native';\n\nconst chineseDictionary = {\n // 基本汉字\n chineseBasic: '[\\u4e00-\\u9fa5]',\n\n // 基本汉字补充\n chineseExtend: '[\\u9ea6-\\u9fff]',\n\n // 兼容性表意文字\n chineseExtend2: '[\\uF900-\\uFAD9]',\n\n // 汉字扩展A\n chineseExtendA: '[\\u3400-\\u4DBF]',\n\n // 汉字扩展B\n chineseExtendB: '[\\u{20000}-\\u{2A6DF}]',\n\n // 汉字扩展C\n chineseExtendC: '[\\u{2A700}-\\u{2B738}]',\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 // 汉字扩展G\n chineseExtendG: '[\\u{30000}-\\u{3134A}]',\n\n // 汉字扩展H\n chineseExtendH: '[\\u{31350}-\\u{323AF}]',\n\n // 汉字扩展I\n chineseExtendI: '[\\u{2EBF0}-\\u{2EE5D}]'\n};\n\nconst looseChineseRegExp = chineseDictionary.chineseBasic + '+';\nconst chineseRegExp = '^' + chineseDictionary.chineseBasic + '+$';\n\nconst chineseWithExtend = '(?:' + objectValues(chineseDictionary).join('|') + ')';\nconst looseChineseExtendRegExp = chineseWithExtend + '+';\nconst chineseExtendRegExp = '^' + chineseWithExtend + '+$';\n\n// eslint-disable-next-line no-prototype-builtins\nconst supportRegExpUnicode = RegExp.prototype.hasOwnProperty('unicode');\n\ntype Options = {\n loose?: boolean;\n useExtend?: boolean;\n};\n\n/**\n * 检测值是否为中文\n *\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] 宽松模式,默认`false`。如果为`true`,只要包含中文就返回`true`\n * @param {boolean} [options.useExtend=false] 使用统一表意文字扩展A-I,默认`false`。注意:如果不支持 `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: any, options: Options = {}) {\n const { loose = false, useExtend = false } = options;\n\n const valueStr = toString(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' : nativeUndefined;\n const reg = new RegExp(resultRegExp, flag);\n return reg.test(valueStr);\n}\n\nexport default isChinese;\n","import { toString } from 'ut2';\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 * @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: any) {\n const valueStr = toString(value);\n return reg.test(valueStr);\n}\n\nexport default isIPv4;\n","import { toString } from 'ut2';\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 * @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: any) {\n const valueStr = toString(value);\n return reg.test(valueStr);\n}\n\nexport default isIPv6;\n","import { toString } from 'ut2';\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 * @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: any) {\n const valueStr = toString(value);\n return regWithProtocal.test(valueStr) || regNonProtocal.test(valueStr);\n}\n\nexport default isUrl;\n","import { toString } from 'ut2';\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: string) {\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\ntype Options = {\n checkCode?: boolean;\n};\n\n/**\n * 检测值是否为营业执照号,也叫工商注册号。由14位数字本体码和1位数字校验码组成,其中本体码从左至右依次为:6位首次登记机关码、8位顺序码。\n *\n * @private\n * @alias module:Validator.isBusinessLicense\n * @since 3.5.0\n * @see {@link https://wenku.baidu.com/view/19873704cc1755270722087c.html GS15—2006 工商行政管理市场主体注册号编制规则}\n * @deprecated 即将废弃。\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.checkCode=true] 是否校验最后一位校验码,默认`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: any, options: Options = {}) {\n const valueStr = toString(value);\n const { checkCode: needCheckCode = true } = options;\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\nisBusinessLicense.sumCheckCode = sumCheckCode;\n\nexport default isBusinessLicense;\n","import { toString } from 'ut2';\n\n// 港澳居民来往内地通行证正则\nconst regHMCard = /^[hm]{1}([0-9]{10}|[0-9]{8})$/i;\n\n/**\n * 检测值是否为港澳居民来往内地通行证,俗称回乡证或回乡卡。\n *\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: any) {\n const valueStr = toString(value);\n return regHMCard.test(valueStr);\n}\n\nexport default isHMCard;\n","import { toString } from 'ut2';\n\n// 台湾居民来往大陆通行证正则\nconst regTWCard = /^\\d{8}$/i;\n\n// 一次性短期台胞证\nconst singleRegTWCard = /^[\\da-z]{10,12}$/i;\n\ntype Options = {\n loose?: boolean;\n};\n\n/**\n * 检测值是否为台湾居民来往大陆通行证,俗称台胞证。\n *\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] 宽松模式,默认`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: any, options: Options = {}) {\n const { loose = false } = options;\n\n const valueStr = toString(value);\n if (regTWCard.test(valueStr)) {\n return true;\n }\n return loose ? singleRegTWCard.test(valueStr) : false;\n}\n\nexport default isTWCard;\n","import { toString } from 'ut2';\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 * @alias module:Validator.isSwiftCode\n * @since 4.9.0\n * @see {@link https://zh.wikipedia.org/wiki/ISO_9362 ISO 9362}\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: any) {\n const valueStr = toString(value);\n return reg.test(valueStr);\n}\n\nexport default isSwiftCode;\n","import { isSymbol, isNaN } from 'ut2';\n\n/**\n * 检测值是否为有效数值,支持隐式转换。如果返回 true ,表示可以通过 Number() 转为数字。\n *\n * @alias module:Validator.isValidNumber\n * @since 4.17.2\n * @param {*} value 待检测的值\n * @param {boolean} [strict=false] 严格模式,默认`false`。如果为 true ,仅支持字符串和数字类型,不处理其他类型隐式转换,且空字符串返回 false 。\n * @returns {boolean} 值是否为有效数值\n * @example\n *\n * isValidNumber(null); // true\n * isValidNumber(true); // true\n * isValidNumber(''); // true\n * isValidNumber(1234); // true\n * isValidNumber('1234'); // true\n * isValidNumber(' 1234 '); // true\n * isValidNumber(' 1234 '); // true\n *\n * isValidNumber(undefined); // false\n * isValidNumber('0.10.1'); // false\n *\n * // 严格模式\n * isValidNumber(null, true); // false\n * isValidNumber(true, true); // false\n * isValidNumber('', true); // false\n * isValidNumber(1234, true); // true\n * isValidNumber('1234', true); // true\n * isValidNumber(' 1234 ', true); // true\n * isValidNumber(' 1234 ', true); // true\n */\nfunction isValidNumber(value: any, strict = false) {\n let ret: number;\n\n if (strict) {\n ret = typeof value === 'string' && value !== '' ? Number(value) : value;\n } else {\n if (typeof value === 'number') {\n ret = value;\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 {\n ret = Number(value);\n }\n }\n\n return typeof ret === 'number' && !isNaN(ret);\n}\n\nexport default isValidNumber;\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, isNaN, isNumber, isString, isSymbol, toNumber } from 'ut2';\nimport devWarn from './devWarn';\n\nconst radixReg = /^[-+]?0[b|o|x]\\d+/i;\nconst dotNumberStringReg = /^\\.\\d+/;\n\n/**\n * 将值转换为有效数值\n *\n * @param {*} value 要转换的值\n * @returns {number|string} 有效数值\n */\nexport function transformEffectiveNumber(value: any) {\n let ret: string | number;\n if (isString(value)) {\n ret = value.trim(); // ' 15' ' 15 ' 兼容 Number(string) 处理\n\n if (ret === '') {\n ret = Number(ret);\n } else if (radixReg.test(ret) || dotNumberStringReg.test(ret)) {\n ret = toNumber(ret);\n } else if (isNaN(Number(ret))) {\n // string如果可以转换为number,默认不转换为number类型。如使用了字符串大数 '12435465768798090897'\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 (isNaN(ret)) {\n return Number.NaN;\n }\n\n return ret;\n}\n\n/**\n * 是否为科学计数法数字\n *\n * @param {string} num 检查值\n * @returns {boolean}\n */\nexport function isScientificNumber(num: string) {\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: number, 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: number | string) {\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: number | string) {\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 *\n * @param {number} num 输入数\n */\nexport function checkBoundary(num: number) {\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: string) {\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: number | string) {\n const strNum = String(num);\n\n if (!isScientificNumber(strNum)) {\n return num;\n }\n\n let ret: string;\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","import { isNaN } from 'ut2';\nimport { checkBoundary } from './utils/math.util';\nimport devWarn from './utils/devWarn';\n\n// 简体\nconst chnNumberChar = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];\nconst chnUnitChar = ['', '十', '百', '千'];\n\n// 繁体\nconst big5NumberChar = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];\nconst big5UnitChar = ['', '拾', '佰', '仟'];\n\n// 数字字符、计数单位\nlet numberChar: string[];\nlet unitChar: string[];\nlet unitSection: string[];\n\n/**\n * 每个小节的内部进行转化\n *\n * @private\n * @param {number} section 数字\n * @returns {string} 转化的数字\n */\nfunction sectionToChinese(section: number) {\n let str = '';\n let chnstr = '';\n let zero = false; //zero为是否进行补零, 第一次进行取余由于为个位数,默认不补零\n let unitPos = 0;\n\n while (section > 0) {\n // 对数字取余10,得到的数即为个位数\n const 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: number) {\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 const 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: number) {\n const strNum = num + '';\n const index = strNum.indexOf('.');\n\n let ret = '';\n if (index > -1) {\n const decimalStr = strNum.slice(index + 1);\n ret = mapNumberChar(decimalStr);\n }\n\n return ret;\n}\n\n/**\n * 映射为中文数字\n *\n * @private\n * @param {number|string} num 要处理的数字\n * @returns {string} 返回中文数字的映射\n */\nfunction mapNumberChar(num: number | string) {\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\ntype Options = {\n big5?: boolean;\n unit?: boolean;\n decimal?: string;\n zero?: string;\n negative?: string;\n unitConfig?: {\n w?: string;\n y?: string;\n };\n};\n\n/**\n * 数字转中文数字\n *\n * 如果数字不在安全数字 -9007199254740991~9007199254740991 范围内,处理会有异常。\n *\n * @alias module:Processor.numberToChinese\n * @since 1.2.0\n * @see {@link https://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=F5DAC3377DA99C8D78AE66735B6359C7 出版物上数字用法}\n * @param {number} num 数字\n * @param {Object} [options] 配置项\n * @param {boolean} [options.big5=false] 繁体,默认`false`\n * @param {boolean} [options.unit=true] 计数单位,默认`true`\n * @param {string} [options.decimal=\"点\"] 中文小数点。默认`点`,当`big5=true`时,默认`點`\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: number, options: 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;\n const numAbs = Math.abs(num);\n\n if (unit) {\n chnInteger = convertInteger(numAbs);\n } else {\n chnInteger = mapNumberChar(Math.floor(numAbs));\n }\n\n // 小数\n const chnDecimal = convertDecimal(numAbs);\n\n return chnDecimal ? `${preStr}${chnInteger}${decimal}${chnDecimal}` : `${preStr}${chnInteger}`;\n}\n\nexport default numberToChinese;\n","import { isNaN } from 'ut2';\n\ntype BytesToSizeOptions = {\n spaceMark?: string;\n precision?: number;\n};\n\n/**\n * 字节转换存储单位\n *\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] 精度,默认`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: number, options: BytesToSizeOptions = {}) {\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","// 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;\nconst regIdCard = /^(\\d{2})(\\d{2})(\\d{2})((?:\\d{2})?\\d{2})(\\d{2})(\\d{2})\\d{2}(\\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\ntype IdCardOrigin = {\n province: string;\n city: string;\n area: string;\n year: string;\n month: string;\n day: string;\n gender: string;\n};\n\ntype IdCardInfo = {\n province: string;\n birthday: string;\n gender: string;\n origin: IdCardOrigin;\n};\n\n/**\n * 解析身份证号码,支持15、18位身份证号码\n *\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: string) {\n const match = regIdCard.exec(id);\n\n if (!match) {\n return null;\n }\n\n // const origin = match.groups || {\n const origin = {\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 } as IdCardInfo;\n}\n\nexport default parseIdCard;\n","import { forEach, isArray, isPlainObject } from 'ut2';\n\ntype PropertyName = string | symbol;\n\ninterface TransformObjectValue {\n <V, R>(arr: V[], fn: (value: V, index: number) => R, deep: false): R[];\n <V, R>(arr: V[], fn: (value: any, index: number) => R, deep?: boolean): R[];\n <T extends object, R>(obj: T, fn: (value: T[keyof T], key: keyof T) => R, deep: false): Record<keyof T, R>;\n <T extends object, R>(obj: T, fn: (value: T[keyof T] extends object ? any : T[keyof T], key: T[keyof T] extends object ? any : keyof T) => R, deep?: boolean): Record<keyof T, R>;\n <T>(obj: T, fn: (...args: any[]) => any): T;\n}\n\n/**\n * 创建一个转换值的新对象或数组。\n *\n * 例如 antd Form 中的设置表单值时,如果值为空字符串可能需要转为 `undefined` ,才不影响表单的初始值。\n *\n * @alias module:Processor.transformObjectValue\n * @since 4.23.0\n * @param {Array | Object} data 要转换值的普通对象或数组\n * @param {Function} fn 遍历普通对象或数组键值方法\n * @param {boolean} [deep=true] 深度遍历,检测值为普通对象或数组时递归处理。默认`true`\n * @returns {Array | Object} 如果是普通对象或数组,返回一个新的对象或数组,否则返回自身\n * @example\n *\n * const data1 = { foo: 'bar', baz: 42 }\n * // 数字转为字符串\n * transformObjectValue(data1, value => {\n * if(typeof value === 'number'){\n * return String(value)\n * }\n * return value;\n * });\n * // { foo: 'bar', baz: '42' }\n *\n * const data2 = [1,2,3,4];\n * // 数字转为字符串\n * transformObjectValue(data2, value=>{\n * if(typeof value === 'number'){\n * return String(value)\n * }\n * });\n * // ['1', '2', '3', '4']\n *\n * // 嵌套普通对象或数组\n * const data3 = { foo: 'bar', baz: 42, c: [1,2,3,4], d: '' }\n * // 数字转为字符串,空字符串转为undefined\n * transformObjectValue(data3, value=>{\n * if(typeof value === 'number'){\n * return String(value);\n * }\n * retrun value === '' ? undefined : value\n * });\n * // { foo: 'bar', baz: '42', ['1', '2', '3', '4'], d: undefined }\n *\n * // 数组的值不处理,对象值为数字转为字符串,空字符串转为undefined\n * transformObjectValue(data3, (value, key)=>{\n * if(typeof key === 'number'){\n * return value;\n * }\n * if(typeof value === 'number'){\n * return String(value);\n * }\n * retrun value === '' ? undefined : value\n * });\n * // { foo: 'bar', baz: '42', [1, 2, 3, 4], d: undefined }\n *\n */\nconst transformObjectValue: TransformObjectValue = function (data: any, fn: (value: any, key: any) => any, deep = true) {\n if (isPlainObject(data)) {\n const result: Record<PropertyName, any> = {};\n forEach(data, (value, key) => {\n const newValue = deep && (isPlainObject(value) || isArray(value)) ? transformObjectValue(value as any, fn) : fn(value, key);\n result[key as PropertyName] = newValue;\n });\n return result;\n } else if (isArray(data)) {\n const result: any[] = [];\n forEach(data, (value, index) => {\n const newValue = deep && (isPlainObject(value) || isArray(value)) ? transformObjectValue(value, fn) : fn(value, index);\n result.push(newValue);\n });\n return result;\n }\n return data;\n};\n\nexport default transformObjectValue;\n","import { isNaN } from 'ut2';\nimport { digitLength, float2Fixed, checkBoundary, transformEffectiveNumber } from './utils/math.util';\n\n/**\n * 精确乘法,支持多个数相乘,乘数默认为 1 。\n *\n * @alias module:Math.times\n * @since 3.1.0\n * @param {...(number|string)} nums 相乘的数\n * @returns {number} 乘积\n * @example\n *\n * times(3); // 3\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: (string | number)[]): number {\n // eslint-disable-next-line prefer-const\n // let [num1, num2 = 1, ...rest] = nums;\n\n let num1 = nums[0];\n let num2 = nums[1] === void 0 ? 1 : nums[1];\n const rest = nums.slice(2);\n\n if (rest.length > 0) {\n // return times(times(num1, num2), ...rest);\n\n // eslint-disable-next-line prefer-spread\n return times.apply(void 0, [times(num1, num2)].concat(rest as number[]));\n }\n\n num1 = transformEffectiveNumber(num1);\n num2 = transformEffectiveNumber(num2);\n\n // 兼容处理,如果参数包含无效数值时,返回 NaN\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 { isNaN } from 'ut2';\nimport { strip, digitLength, float2Fixed, checkBoundary, transformEffectiveNumber } from './utils/math.util';\nimport times from './times';\n\n/**\n * 精确除法,支持多个数相除,除数默认为 1 。\n *\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: (string | number)[]): number {\n // eslint-disable-next-line prefer-const\n // let [num1, num2 = 1, ...rest] = nums;\n\n let num1 = nums[0];\n let num2 = nums[1] === void 0 ? 1 : nums[1];\n const rest = nums.slice(2);\n\n if (rest.length > 0) {\n // return divide(divide(num1, num2), ...rest);\n\n // eslint-disable-next-line prefer-spread\n return divide.apply(void 0, [divide(num1, num2)].concat(rest as number[]));\n }\n\n num1 = transformEffectiveNumber(num1);\n num2 = transformEffectiveNumber(num2);\n\n // 兼容处理,如果参数包含无效数值时,返回 NaN\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","import { isNaN, round, toNumber } from 'ut2';\n\n/**\n * 最大公约数,使用辗转相除法。\n *\n * 遵循以下约定:\n *\n * 1. 如果参数中包含无效数值,返回 `NaN` 。\n * 2. 如果全部参数都为 `0` ,返回 `0` 。\n * 3. 如果参数包含 `0` ,仅计算非零的数。\n * 4. 如果参数为负数,将转为绝对值的正数。\n * 5. 如果参数包含小数点,将转为四舍五入的整数。\n *\n * @alias module:Math.gcd\n * @since 4.20.0\n * @see {@link https://baike.baidu.com/item/最大公约数 最大公约数}\n * @param {...(number|string)} nums 两个或多个整数。\n * @returns {number} 最大公约数。\n * @example\n *\n * gcd(8, 14); // 2\n * gcd(57, 48); // 3\n * gcd(140, 21, 42); // 7\n * gcd('foo', 'bar'); // NaN\n * gcd(0, 10); // 10\n * gcd(2.3, 3.8, 8, -10); // 2\n *\n */\nfunction gcd(...nums: (string | number)[]): number {\n let num1 = nums[0];\n let num2 = nums[1] === void 0 ? 0 : nums[1];\n const rest = nums.slice(2);\n\n if (rest.length > 0) {\n // eslint-disable-next-line prefer-spread\n return gcd.apply(void 0, [gcd(num1, num2)].concat(rest as number[]));\n }\n\n num1 = Math.abs(round(num1 as number));\n num2 = Math.abs(round(num2 as number));\n\n // 兼容处理,如果参数包含无效数值时,返回 NaN\n if (isNaN(num1) || isNaN(num2)) {\n return Number.NaN;\n }\n\n if (num1 === 0 && num2 === 0) {\n return 0;\n }\n\n if (num1 === 0) {\n return num2;\n }\n\n if (num2 === 0) {\n return num1;\n }\n\n let temp = num2;\n if (num1 < num2) {\n temp = num1;\n num1 = num2;\n num2 = temp;\n }\n\n while (temp) {\n temp = num1 % num2;\n num1 = num2;\n num2 = temp;\n }\n return toNumber(num1);\n}\n\nexport default gcd;\n","import { objectKeys } from './utils/native';\n\ntype XMLHttpRequestListener = XMLHttpRequest['onloadstart'];\ntype DataType = Parameters<XMLHttpRequest['send']>[0];\n\ntype AjaxOptions = {\n method?: string;\n async?: boolean;\n user?: string | null;\n password?: string | null;\n data?: DataType;\n headers?: Record<string, string>;\n responseType?: XMLHttpRequestResponseType;\n timeout?: number;\n withCredentials?: boolean;\n onReadyStateChange?: XMLHttpRequest['onreadystatechange'];\n onLoadStart?: XMLHttpRequestListener;\n onProgress?: XMLHttpRequestListener;\n onAbort?: XMLHttpRequestListener;\n onTimeout?: XMLHttpRequestListener;\n onError?: XMLHttpRequestListener;\n onLoad?: XMLHttpRequestListener;\n onLoadEnd?: XMLHttpRequestListener;\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 {boolean} [async=true] 是否异步执行操作\n * @property {string|null} [user=null] 用户名,用于认证用途\n * @property {string|null} [password=null] 密码,用于认证用途\n * @property {Object} [headers] 自定义请求头\n * @property {string} [responseType] 响应类型\n * @property {number} [timeout] 请求超时的毫秒数\n * @property {boolean} [withCredentials=false] 跨域请求时是否需要使用凭证\n * @property {*} [data=null] 请求体被发送的数据\n * @property {function} [onReadyStateChange] 当 readyState 属性发生变化时触发\n * @property {function} [onLoadStart] 接收到响应数据时触发\n * @property {function} [onProgress] 请求接收到更多数据时,周期性地触发\n * @property {function} [onAbort] 当 request 被停止时触发,例如当程序调用 XMLHttpRequest.abort() 时\n * @property {function} [onTimeout] 在预设时间内没有接收到响应时触发\n * @property {function} [onError] 当 request 遭遇错误时触发\n * @property {function} [onLoad] 请求成功完成时触发\n * @property {function} [onLoadEnd] 请求结束时触发,无论请求成功 (load) 还是失败 (abort 或 error)\n */\n\n/**\n * 请求\n *\n * <em style=\"font-weight: bold;\">注意:该方法仅适用于浏览器端。</em>\n *\n * @alias module:Browser.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 * @param {string} [options.method=\"get\"] 创建请求时使用的方法。默认 `'get'`。\n * @param {boolean} [options.async=true] 是否异步执行操作。默认 `true`。\n * @param {string|null} [options.user=null] 用户名,用于认证用途。默认 `null`。\n * @param {string|null} [options.password=null] 密码,用于认证用途。默认 `null`。\n * @param {Object} [options.headers] 自定义请求头。\n * @param {string} [options.responseType] 响应类型。\n * @param {number} [options.timeout] 请求超时的毫秒数。\n * @param {boolean} [options.withCredentials=false] 跨域请求时是否需要使用凭证。默认 `false`。\n * @param {*} [options.data=null] 请求体被发送的数据。默认 `null`。\n * @param {function} [options.onReadyStateChange] 当 readyState 属性发生变化时触发。\n * @param {function} [options.onLoadStart] 接收到响应数据时触发。\n * @param {function} [options.onProgress] 请求接收到更多数据时,周期性地触发。\n * @param {function} [options.onAbort] 当 request 被停止时触发,例如当程序调用 XMLHttpRequest.abort() 时。\n * @param {function} [options.onTimeout] 在预设时间内没有接收到响应时触发。\n * @param {function} [options.onError] 当 request 遭遇错误时触发。\n * @param {function} [options.onLoad] 请求成功完成时触发。\n * @param {function} [options.onLoadEnd] 请求结束时触发,无论请求成功 (load) 还是失败 (abort 或 error)。\n * @returns {Promise<object>} XHR 事件对象。\n * @example\n * ajax('/somefile').then(res=>{\n * // do something\n * });\n *\n * ajax('/api', { method: 'post' }).then(res=>{\n * // do something\n * });\n *\n * // 中断请求\n * let xhr: XMLHttpRequest | null = null;\n * ajax('./download/test.txt', {\n * onLoadStart(e) {\n * console.log('onLoadStart', e);\n * xhr = e.target;\n * }\n * }).finally(() => {\n * console.log('finally');\n * xhr = null;\n * });\n *\n * if(ABORT_CONDITION){\n * if(xhr){\n * xhr.abort();\n * }\n * }\n *\n */\nfunction ajax(url: string, options?: AjaxOptions) {\n const { method = 'get', data = null, timeout, headers, withCredentials = false, async = true, user = null, password = null, responseType, onReadyStateChange, onLoadStart, onProgress, onAbort, onTimeout, onError, onLoad, onLoadEnd } = options || {};\n\n return new Promise<ProgressEvent>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open(method.toLowerCase(), url, async, user, password);\n\n if (onReadyStateChange) {\n xhr.onreadystatechange = onReadyStateChange;\n }\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 objectKeys(headers).map((item) => {\n xhr.setRequestHeader(item, headers[item]);\n });\n }\n\n // 请求成功异步调用\n const wrapSuccess = (cb?: XMLHttpRequestListener) => {\n // 内部方法\n return (e: ProgressEvent) => {\n resolve(e);\n cb?.call(xhr, e);\n };\n };\n\n // 请求失败(中断/超时/失败)处理\n const wrapError = (cb?: XMLHttpRequestListener) => {\n // 内部方法\n return (e: ProgressEvent) => {\n reject(e);\n cb?.call(xhr, e);\n };\n };\n\n // 事件处理\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\n const eventKeys = objectKeys(events) as (keyof typeof events)[];\n\n eventKeys.forEach((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;\n","import { isObjectLike, isString } from 'ut2';\n\nexport type UploadFile = { name: string; type?: string; url?: string; fileName?: string; uid?: string; originFileObj?: File };\n\n// 是否为 UploadFile\nexport function isUploadFile(fileObj: UploadFile) {\n if (isObjectLike(fileObj) && isString(fileObj.name)) {\n return true;\n }\n return false;\n}\n","import { isString, nth } from 'ut2';\n\n/**\n * 获取路径的扩展名。\n *\n * @alias module:Other.getExtname\n * @since 5.4.0\n * @see {@link https://nodejs.org/docs/latest/api/path.html#pathextnamepath Node.js path.extname}\n * @param {string} path 路径。\n * @returns 返回从最后一次出现 `.` 字符到路径最后一部分的字符串结尾。如果路径没有 `.` 或者除了第一个字符之外没有其他 `.` 字符,则返回空字符串。\n * @example\n * getExtname('index.html'); // '.html'\n * getExtname('index.coffee.md'); // '.md'\n * getExtname('index.'); // '.'\n * getExtname('index'); // ''\n * getExtname('.index'); // ''\n * getExtname('index.md'); // '.md'\n */\nfunction getExtname(path: string) {\n return isString(path) && path.indexOf('.') > 0 ? '.' + nth(path.split('.'), -1) : '';\n}\n\nexport default getExtname;\n","import { nativeUndefined } from './internals/native.js';\nimport isArrayLike from './isArrayLike.js';\n\nvar nth = function (array, n) {\n if (n === void 0) { n = 0; }\n if (!isArrayLike(array)) {\n return nativeUndefined;\n }\n n += n < 0 ? array.length : 0;\n return array[n];\n};\n\nexport { nth as default };\n","import { isFile, isString, toString } from 'ut2';\nimport { isUploadFile, UploadFile } from './utils/file.util';\nimport getExtname from './getExtname';\n\n/**\n * 检查文件是否符合 `accept` 类型说明符。\n *\n * 通过 `file.type` `file.name` `file.url` 与 `accept` 进行匹配。\n *\n * @alias module:Browser.checkFileType\n * @since 5.1.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/input/file#唯一文件类型说明符 唯一文件类型说明符}\n * @see {@link https://www.iana.org/assignments/media-types/media-types.xhtml Media Types}\n * @param {File} file 文件对象。支持 antd `UploadFile` 对象。\n * @param {string} [accept] 文件类型说明符。\n * @returns {boolean} 如果 `file` 符合 `accept` 返回 `true`, 否则返回 `false`。\n * @example\n *\n * const pdf = new File([], '1.pdf', { type: 'application/pdf' });\n * const jpeg = new File([], 'xx.jpeg', { type: 'image/jpeg' });\n *\n * // 文件类型\n * checkFileType(pdf, 'application/pdf'); // true\n * checkFileType(jpeg, 'image/jpeg'); // true\n *\n * // 通配符\n * checkFileType(jpeg, 'image/*'); // true\n * checkFileType(pdf, 'image/*'); // false\n * checkFileType(pdf, 'application/*'); // true\n * checkFileType(pdf, '*'); // true\n * checkFileType(jpeg, '*'); // true\n *\n * // 文件名扩展名\n * checkFileType(jpeg, '.png,.jpeg,.jpg'); // true\n * checkFileType(pdf, '.pdf'); // true\n *\n */\nfunction checkFileType(file: File | UploadFile, accept?: string) {\n const isFileType = isFile(file);\n if (!isFileType && !isUploadFile(file)) {\n return false;\n }\n\n if (!isString(accept)) {\n accept = toString(accept);\n }\n\n accept = accept.trim();\n\n if (!accept || accept === '*') {\n return true;\n }\n\n let ret = false;\n\n const types = accept.toLowerCase().split(/,(?:\\s+)?/);\n const fileName = (file.name || (!isFileType && (file.fileName || file.originFileObj?.name)) || '').toLowerCase();\n const fileType = file.type || (!isFileType && file.originFileObj?.type) || '';\n const fileUrl = (!isFileType && file.url) || '';\n\n types.some((type) => {\n // .doc .docx .jpg .png\n if (type === '*' || fileType === type || (type.indexOf('.') === 0 && (getExtname(fileName) === type || getExtname(fileUrl) === type))) {\n ret = true;\n } else if (type.includes('/*') && fileType.includes('/')) {\n // image/* 匹配所有图片类型\n const match = type.match(/(.*)\\/\\*/);\n const fileParentType = fileType.split('/')[0];\n if (match && match[1] === fileParentType) {\n ret = true;\n }\n }\n return ret;\n });\n\n return ret;\n}\n\nexport default checkFileType;\n","import { isBlob } from 'ut2';\nimport ajax from './ajax';\n\nconst SuccessResponseStatus = [200, 304];\n\n/**\n * 获取文件 Blob 。\n *\n * @alias module:Browser.getFileBlob\n * @since 4.21.0\n * @param {string | Blob} file 文件地址或对象。\n * @param {AjaxOptions} [ajaxOptions] ajax 请求配置项,当传入的图片为字符串时才会触发请求。\n * @returns {Promise<Blob>} 文件 Blob 。\n * @example\n *\n * getFileBlob(file).then((blob)=>{\n * // do something\n * });\n *\n * getFileBlob('https://dummyimage.com/200x300').then((blob)=>{\n * // do something\n * });\n */\nfunction getFileBlob(file: string | Blob, ajaxOptions?: Parameters<typeof ajax>[1]) {\n return new Promise<Blob>((resolve, reject) => {\n if (isBlob(file)) {\n resolve(file);\n } else {\n ajax(file, { responseType: 'blob', ...ajaxOptions })\n .then((ev) => {\n // @ts-ignore\n // 进入 onload 表示 readyStatus 为 4 ,但是 status 不一定是 200 。\n const responseStatus = ev.target.status;\n if (SuccessResponseStatus.indexOf(responseStatus) !== -1) {\n // @ts-ignore\n resolve(ev.target.response as Blob);\n } else {\n const err = new Error(`The file does not support get requests, responseStatus ${responseStatus}, '${file}'.`);\n console.error(err);\n reject(err);\n }\n })\n .catch((err) => {\n console.error(new Error(`Failed to request file. ${err}`));\n reject(err);\n });\n }\n });\n}\n\nexport default getFileBlob;\n","import { isBlob } from 'ut2';\nimport { createObjectURL, revokeObjectURL } from './utils/native';\n\n/**\n * 加载图片。\n *\n * <em style=\"font-weight: bold;\">注意:该方法仅适用于浏览器端。</em>\n *\n * @alias module:Browser.loadImage\n * @since 4.20.0\n * @param {string | Blob} img 图片地址或 blob 对象\n * @returns {Promise<HTMLImageElement>} HTML图片元素\n * @example\n *\n * loadImage(file).then(image=>{\n * // do something\n * });\n *\n * loadImage('https://dummyimage.com/200x300').then(image=>{\n * // do something\n * });\n *\n * loadImage('data:image/png;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=').then(image=>{\n * // do something\n * });\n *\n */\nfunction loadImage(img: string | Blob) {\n return new Promise<HTMLImageElement>((resolve, reject) => {\n const imgIsBlob = isBlob(img);\n const url = imgIsBlob ? createObjectURL(img as Blob) : img;\n const image = new Image();\n if (!imgIsBlob) {\n image.crossOrigin = 'anonymous';\n }\n image.onload = () => {\n resolve(image);\n };\n image.onerror = (err) => {\n if (imgIsBlob) {\n revokeObjectURL(url);\n }\n console.error(`[loadImage] The image load failed, '${img}'.`);\n reject(err);\n };\n image.src = url;\n });\n}\n\nexport default loadImage;\n","import getFileBlob from './getFileBlob';\nimport loadImage from './loadImage';\n\n/**\n * @typedef {Object} ImageWithBlob HTML图片元素和 blob 对象\n * @property {HTMLImageElement} image HTML图片元素\n * @property {Blob} blob blob 对象\n */\n\n/**\n * 加载图片,返回图片元素和 blob 对象。\n *\n * 如果传入图片地址,将通过 ajax 请求转为 blob 格式。\n *\n * <em style=\"font-weight: bold;\">注意:该方法仅适用于浏览器端。</em>\n *\n * @method\n * @alias module:Browser.loadImageWithBlob\n * @since 4.20.0\n * @param {string | Blob} img 图片地址或 blob 对象\n * @param {AjaxOptions} [ajaxOptions] ajax 请求配置项,当传入的图片为字符串时才会触发请求。\n * @returns {Promise<ImageWithBlob>} HTML图片元素和 blob 对象\n * @example\n *\n * loadImage(file).then(({image, blob})=>{\n * console.log(image, blob);\n * // HTMLImageElement {} Blob {}\n * });\n *\n * loadImage('https://dummyimage.com/200x300').then(({image, blob})=>{\n * // do something\n * });\n *\n * loadImage('data:image/png;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=').then(({image, blob})=>{\n * // do something\n * });\n *\n */\nfunction loadImageWithBlob(img: string | Blob, ajaxOptions?: Parameters<typeof getFileBlob>[1]) {\n return getFileBlob(img, ajaxOptions).then((blob) => {\n return loadImage(blob).then((image) => {\n return { blob, image };\n });\n });\n}\n\nexport default loadImageWithBlob;\n","/**\n * 将 DataURL 转为 Blob 对象\n *\n * @alias module:Browser.dataURLToBlob\n * @since 4.1.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Glossary/Base64 Base64}\n * @param {string} data data: 协议的URL\n * @returns {Blob} Blob 对象\n * @example\n * const data = 'data:text/html;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=';\n * dataURLToBlob(dataurl); // Blob {size: 32, type: 'text/html'}\n */\nfunction dataURLToBlob(data: string) {\n const parts = data.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 { isBlob, isPromiseLike } from 'ut2';\nimport dataURLToBlob from './dataURLToBlob';\nimport isUrl from './isUrl';\nimport ajax from './ajax';\nimport { createObjectURL, nativeUndefined, revokeObjectURL } from './utils/native';\n\n// 下载文件到本地\nfunction saver(blobUrl: string, 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 // 处理点击事件,防止事件冒泡到 body/html 的点击事件。\n function handleClick(e: MouseEvent) {\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\ntype DataType = string | Blob | ArrayBuffer | Int8Array | Uint8Array | Uint8ClampedArray | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array | BigInt64Array | BigUint64Array;\n\ntype AjaxOptions = Parameters<typeof ajax>[1];\ntype TransformRequest = (options: AjaxOptions) => AjaxOptions | Promise<AjaxOptions>;\ntype TransformResponse = (res: Blob) => Blob | Promise<Blob>; // 响应的Blob对象。如果你通过 transformRequest 修改了 responseType ,该参数将是该类型响应值。\n\ntype DownloadOptions = {\n fileName?: string;\n type?: string;\n dataType?: 'url' | 'text';\n transformRequest?: TransformRequest;\n transformResponse?: TransformResponse;\n};\n\n/**\n * 下载\n *\n * <em style=\"font-weight: bold;\">注意:该方法仅适用于浏览器端,兼容 IE10+ 和现代浏览器。</em>\n *\n * <em style=\"font-weight: bold;\">注意:微信浏览器不支持H5下载文件。</em>\n *\n * <em>响应头中有 \"Content-Disposition\" 字段,客户端获取不到?</em> 请参考查阅 [Access-Control-Expose-Headers](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Access-Control-Expose-Headers) 。\n *\n * @alias module:Browser.download\n * @since 4.16.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Access-Control-Expose-Headers Access-Control-Expose-Headers}\n * @see {@link https://zh.wikipedia.org/wiki/多用途互聯網郵件擴展 MIME}\n * @see {@link https://9ykc9s.csb.app/ 在线示例}\n * @param {string|Blob|ArrayBuffer|TypedArray} data 字符串、blob数据或url地址\n * @param {string|Object} [options] 文件名称 或 配置项。\n * @param {string} [options.fileName] 文件名称。\n * @param {string} [options.type] MIME 类型。\n * @param {'url'|'text'} [options.dataType] 手动设置数据类型,主要是为了区分 `url` 和 `text`,默认会根据传入的数据判断类型。<br/>如果你要下载的文本是 `url` ,请设置 `'text'` ;如果你要下载的 url 是绝对/相对路径,请设置 'url' 。\n * @param {Function} [options.transformRequest] 请求前触发,XHR 对象或配置调整。\n * @param {Function} [options.transformResponse] 请求成功后触发,在传递给 then/catch 前,允许修改响应数据。\n * @returns {Promise<void>}\n * @example\n * // 文本\n * download('hello world', 'text.txt');\n *\n * // 远程文件1\n * // 不带协议的绝对地址,需要通过 dataType 指定为 url 类型\n * download('/xxx.jpg', { dataType: 'url', fileName: 'test.jpg' });\n *\n * // 远程文件2\n * download('https://example.com/xxx.jpg');\n *\n * // base64\n * download('data:image/png;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=', 'test.png');\n *\n * // blob文件\n * download(new Blob(['hello world']), 'text.txt');\n *\n * // 本地文件\n * download(File, 'filename.ext');\n *\n */\nasync function download(data: DataType, options?: string | DownloadOptions): Promise<void> {\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 let payload: Blob | undefined;\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 // 包装为异步方法\n const asyncTransformRequest = (opts: AjaxOptions) => {\n // 请求前配置调整\n const tempOptions = typeof transformRequest === 'function' ? transformRequest(opts) : opts;\n return isPromiseLike(tempOptions) ? (tempOptions as Promise<AjaxOptions>) : Promise.resolve(tempOptions);\n };\n const asyncTransformResponse = (res: Blob) => {\n const tempRes = typeof transformResponse === 'function' ? transformResponse(res) : res;\n return isPromiseLike(tempRes) ? (tempRes as Promise<Blob>) : Promise.resolve(tempRes);\n };\n\n const ajaxOptions = await asyncTransformRequest({ responseType: 'blob' });\n const ev = await ajax(data, ajaxOptions);\n // @ts-ignore\n const res = await asyncTransformResponse(ev.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 : nativeUndefined) });\n } else {\n // string\n payload = new Blob([data], { type: type || 'text/plain' });\n }\n } else if (data instanceof Blob) {\n // File or Blob\n payload = data;\n }\n\n // html、TypedArray\n if (!payload) {\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 = createObjectURL(payload);\n saver(url, fileName);\n revokeObjectURL(url);\n }\n\n return Promise.resolve();\n}\n\nexport default download;\n","const FileReaderMethodMap = {\n arrayBuffer: 'readAsArrayBuffer',\n binaryString: 'readAsBinaryString',\n dataURL: 'readAsDataURL',\n text: 'readAsText'\n} as const;\n\ntype ReadType = keyof typeof FileReaderMethodMap;\n\ninterface FileReader {\n (blob: Blob, type: 'arrayBuffer'): Promise<ArrayBuffer>;\n (blob: Blob, type?: Exclude<ReadType, 'arrayBuffer'>): Promise<string>;\n}\n\n/**\n * 读取 Blob 或 File 对象,转为 Base64/String/ArrayBuffer\n *\n * <em style=\"font-weight: bold;\">注意:该方法仅适用于浏览器端。</em>\n *\n * @function\n * @alias module:Browser.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'] 读取类型,默认`dataURL`。可选 `arrayBuffer` `binaryString` `dataURL` `text` 。\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 */\nconst fileReader: FileReader = function (blob: Blob, type: keyof typeof FileReaderMethodMap = 'dataURL') {\n let method = FileReaderMethodMap[type];\n if (!method) {\n method = FileReaderMethodMap.dataURL;\n }\n\n return new Promise<any>((resolve, reject) => {\n const reader = new FileReader();\n reader[method](blob);\n reader.onload = () => resolve(reader.result);\n reader.onerror = (error) => reject(error);\n });\n};\n\nexport default fileReader;\n","import { forEach, isBlob } from 'ut2';\nimport checkFileType from './checkFileType';\nimport { isUploadFile, UploadFile } from './utils/file.util';\n\n// 内置文件类型和文件类型说明符\nconst config = {\n image: 'image/*,.jpeg,.jpg,.gif,.bmp,.png,.webp,.svg,.apng,.avif,.ico,.tif,.tiff',\n audio: 'audio/*,.mp3,.wav,.aac,.flac',\n video: 'video/*,.mp4,.webm,.ogg,.mov',\n pdf: 'application/pdf,.pdf',\n word: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document,.doc,.docx',\n excel: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel,.xls,.xlsx'\n};\n\ntype FileType = keyof typeof config;\n\n/**\n * @summary 获取文件类型。\n * @alias module:Browser.getFileType\n * @since 5.1.0\n * @requires Other.checkFileType\n * @param {File} file 文件对象。支持 antd `UploadFile` 对象。\n * @returns {\"image\" | \"audio\" | \"video\" | \"pdf\" | \"word\" | \"excel\" | undefined} 如果是 `image` `audio` `video` `pdf` `word` `excel` 这些类型的文件,返回对应的类型值,否则返回 `undefined`。\n * @example\n *\n * const pdf = new File([], '1.pdf', { type: 'application/pdf' });\n * const jpeg = new File([], 'xx.jpeg', { type: 'image/jpeg' });\n *\n * getFileType(pdf); // 'pdf'\n * getFileType(jpeg); // 'image'\n *\n * @description 内置文件类型和文件类型说明符\n *\n * | 类型 | 说明符 |\n * |---|---|\n * | `image` | `image/*,.jpeg,.jpg,.gif,.bmp,.png,.webp,.svg,.apng,.avif,.ico,.tif,.tiff` |\n * | `audio` | `audio/*,.mp3,.wav,.aac,.flac` |\n * | `video` | `video/*,.mp4,.webm,.ogg,.mov` |\n * | `pdf` | `application/pdf,.pdf` |\n * | `word` | `application/vnd.openxmlformats-officedocument.wordprocessingml.document,.doc,.docx` |\n * | `excel` | `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel,.xls,.xlsx` |\n *\n */\nfunction getFileType(file: File | UploadFile) {\n let type: undefined | FileType;\n\n if (isBlob(file) || isUploadFile(file)) {\n forEach(config, (accept, fileType) => {\n if (checkFileType(file, accept)) {\n type = fileType;\n return false;\n }\n });\n }\n return type;\n}\n\nexport default getFileType;\n","import getExtname from './getExtname';\nimport { nativeUndefined } from './utils/native';\n\nconst mimeTypes = [\n // text\n ['text/plain', ['txt']],\n ['text/css', ['css']],\n ['text/html', ['htm', 'html']],\n ['text/javascript', ['js', 'mjs']],\n ['text/csv', ['csv']],\n ['text/markdown', ['md', 'markdown']],\n\n // image\n ['image/gif', ['gif']],\n ['image/jpeg', ['jpg', 'jpeg', 'jfif', 'pjpeg', 'pjp']],\n ['image/png', ['png']],\n ['image/svg+xml', ['svg']],\n ['image/webp', ['webp']],\n ['image/apng', ['apng']],\n ['image/avif', ['avif']],\n ['image/bmp', ['bmp']],\n ['image/x-icon', ['ico', 'cur']],\n ['image/tiff', ['tif', 'tiff']],\n\n // application\n ['application/xml', ['xml']],\n ['application/zip', ['zip']],\n ['application/pdf', ['pdf']],\n ['application/json', ['json']],\n ['application/yaml', ['yaml', 'yml']],\n ['application/vnd.openxmlformats-officedocument.wordprocessingml.document', ['doc', 'docx']],\n ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', ['xls', 'xlsx']],\n\n // media\n ['audio/mp3', ['mp3']],\n ['audio/wav', ['wav']],\n ['audio/aac', ['aac']],\n ['audio/flac', ['flac']],\n ['video/mp4', ['mp4']],\n ['video/ogg', ['ogg']],\n ['video/webm', ['webm']],\n ['video/quicktime', ['mov']]\n];\n\n/**\n * @summary 获取常用的 MIME 类型。通过文件名后缀查找对应的 MIME 类型。\n *\n * @alias module:Browser.getMimeType\n * @since 5.2.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/HTTP/MIME_types MIME 类型(IANA 媒体类型)}\n * @see {@link https://www.iana.org/assignments/media-types/media-types.xhtml Media Types}\n * @param {string} fileName 文件名。\n * @returns 如果找到,返回 MIME 类型字符串,否则返回 `undefined`。\n * @example\n * getMimeType('xxx.png'); // 'image/png'\n * getMimeType('xxx.jpg'); // 'image/jpeg'\n * getMimeType('xxx.mp3'); // 'audio/mp3'\n * getMimeType('xxx.mp4'); // 'video/mp4'\n * getMimeType('xxx.pdf'); // 'application/pdf'\n * getMimeType('xxx.zip'); // 'application/zip'\n * getMimeType('xxx.doc'); // 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\n *\n * // 不常用或未知类型\n * getMimeTye('xxx.ci'); // undefined\n *\n * // 非法文件名\n * getMimeType('.zip'); // undefined\n *\n * @description 内置常用的 MIME 类型和文件名后缀映射\n *\n * | MIME 类型 | 文件名后缀 |\n * |---|---|\n * | `text/plain` | `txt` |\n * | `text/css` | `css` |\n * | `text/html` | `htm` `html` |\n * | `text/javascript` | `js` `mjs` |\n * | `text/csv` | `csv` |\n * | `text/markdown` | `md` `markdown` |\n * | `image/gif` | `gif` |\n * | `image/jpeg` | `jpg` `jpeg` `jfif` `pjpeg` `pjp` |\n * | `image/png` | `png` |\n * | `image/svg+xml` | `svg` |\n * | `image/webp` | `webp` |\n * | `image/apng` | `apng` |\n * | `image/avif` | `avif` |\n * | `image/bmp` | `bmp` |\n * | `image/x-icon` | `ico` `cur` |\n * | `image/tiff` | `tif` `tiff` |\n * | `application/xml` | `xml` |\n * | `application/zip` | `zip` |\n * | `application/pdf` | `pdf` |\n * | `application/json` | `json` |\n * | `application/yaml` | `yaml` `yml` |\n * | `application/vnd.openxmlformats-officedocument.wordprocessingml.document` | `doc` `docx` |\n * | `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet` | `xls` `xlsx` |\n * | `audio/mp3` | `mp3` |\n * | `audio/wav` | `wav` |\n * | `audio/aac` | `aac` |\n * | `audio/flac` | `flac` |\n * | `video/mp4` | `mp4` |\n * | `video/ogg` | `ogg` |\n * | `video/webm` | `webm` |\n * | `video/quicktime` | `mov` |\n */\nfunction getMimeType(fileName: string) {\n const ext = getExtname(fileName).slice(1).toLowerCase();\n return ext ? (mimeTypes.find((item) => item[1].includes(ext))?.[0] as string) : nativeUndefined;\n}\n\nexport default getMimeType;\n","import { randomInt, toNumber } from 'ut2';\n\nconst letter = 'abcdefghijklmnopqrstuvwxyz';\nconst chars = {\n number: '0123456789',\n lower: letter,\n upper: letter.toUpperCase()\n};\nconst allChars = chars.number + chars.lower + chars.upper;\n\n/**\n * @private\n * @param {number} len 长度\n * @param {string} pool 字符池\n * @param {string} [prefix=''] 前缀部分,不计入长度\n * @returns {string}\n */\nfunction internalRandomString(len: number, pool: string, prefix = ''): string {\n while (len-- > 0) {\n const r = pool[randomInt(0, pool.length - 1)];\n return internalRandomString(len, pool, prefix + r);\n }\n return prefix;\n}\n\ninterface RandomString {\n (len: number, poll: 'number' | 'lower' | 'upper'): string;\n (len: number, poll?: string): string;\n}\n\n/**\n * 生成随机字符串\n *\n * @function\n * @alias module:Other.randomString\n * @since 4.8.0\n * @param {number} [len=0] 长度,默认`0`\n * @param {'number' | 'lower' | 'upper' | string} [pool='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'] 字符池,默认为数字和大小写字母。支持设置类型`number` `lower` `upper` 或字符串。\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 */\nconst randomString: RandomString = function (len = 0, pool?: string) {\n let _pool: string;\n\n if (typeof pool !== 'string') {\n _pool = allChars;\n } else if (chars[pool as keyof typeof chars]) {\n _pool = chars[pool as keyof typeof chars];\n } else {\n _pool = pool;\n }\n\n return internalRandomString(toNumber(len), _pool);\n};\n\nexport default randomString;\n","import { isArray, isObject } from 'ut2';\n\ntype NodeAssign = 'spread' | 'self';\n\ntype Options = {\n keyField?: string;\n parentField?: string;\n childrenField?: string;\n emptyChildrenValue?: 'none' | 'null' | 'array';\n nodeAssign?: NodeAssign;\n};\n\n/**\n * 递归处理空子级\n *\n * @private\n * @param {Object[]} arr 列表数据\n * @param {Object} [options] 配置项\n * @param {string} [options.childrenField='children'] 子级字段名称,默认`children`\n * @param {'none'|'null'} [options.emptyChildrenValue='none'] 子级为空时的值,默认`none`。`none`表示删除该子级,`null`表示为`null`,`array`表示为`[]`。\n */\nfunction processEmptyChildren<T extends Record<string, any> = Record<string, any>>(arr: T[], options: Pick<Options, 'childrenField' | 'emptyChildrenValue'>) {\n const { childrenField = 'children', emptyChildrenValue = 'none' } = options;\n arr.forEach((item) => {\n if (item[childrenField].length <= 0) {\n if (emptyChildrenValue === 'null') {\n // @ts-ignore\n item[childrenField] = null;\n } else {\n delete item[childrenField];\n }\n } else {\n processEmptyChildren(item[childrenField], options);\n }\n });\n}\n\n/**\n * 列表数据转树结构\n *\n * @alias module:Tree.listToTree\n * @since 4.14.0\n * @param {Object[]} list 列表数据\n * @param {Object} [options] 配置项\n * @param {string} [options.keyField='id'] 当前数据的键值字段名称,默认`id`\n * @param {string} [options.parentField='pid'] 当前数据的父级字段名称,默认`pid`\n * @param {string} [options.childrenField='children'] 子级字段名称,默认`children`\n * @param {'none'|'null'|'array'} [options.emptyChildrenValue='none'] 子级为空时的值,默认`none`。`none`表示删除该子级,`null`表示为`null`,`array`表示为`[]`。\n * @param {'spread'|'self'} [options.nodeAssign='spread'] 节点赋值方式,默认`spread`。`spread`表示使用展开运算符创建新值,`self`表示使用自身对象。\n * @returns {Object[]} 树结构\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<T extends Record<string, any> = Record<string, any>, R extends unknown = T & Record<string, any>>(list: T[], options: Options = {}) {\n const { keyField = 'id', parentField = 'pid', childrenField = 'children', emptyChildrenValue = 'none', nodeAssign = 'spread' } = options;\n\n const tree: R[] = [];\n\n const record: Record<string, T[]> = {};\n\n if (!isArray(list)) {\n return tree;\n }\n\n list.forEach((item) => {\n if (isObject(item)) {\n const newItem = nodeAssign === 'spread' ? { ...item } : item;\n\n const id = newItem[keyField] as string;\n const pid = newItem[parentField] as string;\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;\n","import { forEach, isArray, isObject } from 'ut2';\n\n/**\n * 内部实现\n *\n * @private\n * @param {Object[]} tree 树结构数据\n * @param {function} predicate 遍历每一项执行的函数,参数是当前遍历到的节点数据,如果返回 Truthy 将返回包含该节点的所有父级节点\n * @param {string} [childrenField] 子级字段名\n * @param {Object[]} [path=[]] 当前遍历路径\n * @returns {Object[]}\n */\nfunction internalFindTreeSelect<T extends any, F extends (item: T) => boolean>(tree: T[], predicate: F, childrenField?: string, path: T[] = []): T[] {\n let result: T[] = [];\n\n if (isArray(tree)) {\n forEach(tree, (item) => {\n path.push(item);\n\n if (predicate(item)) {\n result = path;\n return false;\n }\n\n if (isObject(item)) {\n // @ts-ignore\n const childs = item[childrenField] as T[];\n\n if (isArray(childs) && childs.length > 0) {\n const findChildren = internalFindTreeSelect(childs, predicate, childrenField, path);\n if (findChildren.length > 0) {\n result = findChildren;\n return false;\n }\n }\n }\n\n path.pop();\n });\n }\n\n return result;\n}\n\n/**\n * 查找包含当前节点的所有父级节点\n *\n * @alias module:Tree.findTreeSelect\n * @since 4.14.0\n * @param {Object[]} tree 树结构数据\n * @param {function} predicate 遍历每一项执行的函数,参数是当前遍历到的节点数据,如果返回 Truthy 将返回包含该节点的所有父级节点\n * @param {string} [childrenField='children'] 子级字段名,默认`children`\n * @returns {Object[]}\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<T extends any, F extends (item: T) => boolean>(tree: T[], predicate: F, childrenField = 'children') {\n return internalFindTreeSelect(tree, predicate, childrenField);\n}\n\nexport default findTreeSelect;\n","/**\n * @summary util-helpers 版本号。\n * @since 4.18.0\n */\nconst VERSION = BUILD_VERSION;\n\nexport default VERSION;\n","/**\n * 事件触发器,支持浏览器端和 node 端。\n *\n * @class\n * @example\n *\n * const emitter = new Emitter();\n *\n * // 注册监听方法\n * emitter.on('foo', () => console.log('foo 1'));\n * emitter.on('foo', () => console.log('foo 2'));\n *\n * // 触发方法\n * emitter.emit('foo');\n * // foo 1\n * // foo 2\n *\n * // 取消监听方法\n * emitter.off('foo');\n *\n * // 支持链式调用\n * emitter.on('foo', () => {})\n * .on('foo', () => {})\n * .off('foo');\n */\nvar EmitterPro = /** @class */ (function () {\n function EmitterPro() {\n this.handlers = {};\n }\n /**\n * 获取全部事件名称。\n *\n * @returns 事件名称数组。\n * @example\n * emitter.on('foo', () => {});\n * emitter.on('bar', () => {});\n *\n * emitter.eventNames(); // ['foo', 'bar']\n */\n EmitterPro.prototype.eventNames = function () {\n var _a;\n var symbols = ((_a = Object.getOwnPropertySymbols) === null || _a === void 0 ? void 0 : _a.call(Object, this.handlers)) || [];\n var keys = Object.keys(this.handlers);\n return keys.concat(symbols);\n };\n /**\n * 获取事件名称的全部监听方法(原始方法,未经过包装处理)。\n *\n * @param eventName 事件名称\n * @returns 对应事件名称的监听方法数组\n * @example\n * const fn1 = () => console.log('bar');\n * const fn2 = () => console.log('baz');\n *\n * emitter.on('test', fn1);\n * emitter.once('test', fn2);\n *\n * emitter.rawListeners('test'); // [fn1, fn2]\n */\n EmitterPro.prototype.rawListeners = function (eventName) {\n var handler = this.handlers[eventName];\n return handler ? handler.map(function (item) { return item.raw; }) : [];\n };\n /**\n * 获取事件名称的全部监听方法(如通过 `once` 方法注册,返回的是包装方法)。\n *\n * @param eventName 事件名称\n * @returns 对应事件名称的监听方法数组\n * @example\n * const fn1 = () => console.log('bar');\n * const fn2 = () => console.log('baz');\n *\n * emitter.on('test', fn1);\n * emitter.once('test', fn2);\n *\n * emitter.rawListeners('test'); // [fn1, wrapFn2]\n */\n EmitterPro.prototype.listeners = function (eventName) {\n var handler = this.handlers[eventName];\n return handler ? handler.map(function (item) { return item.wrap; }) : [];\n };\n /**\n * 判断事件名称对应的监听方法是否存在。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @returns 如果事件名称存在该事件方法返回 `true`,否则返回 `false`。\n * @example\n * const fn1 = () => console.log('bar');\n * const fn2 = () => console.log('baz');\n *\n * emitter.on('test', fn1);\n * emitter.once('test', fn2);\n *\n * emitter.hasListener('test', fn1); // true\n * emitter.hasListener('test', fn2); // true\n *\n * // fn2 是通过 once 方法注册,执行一次后自动解绑\n * emitter.emit('test');\n *\n * emitter.hasListener('test', fn1); // true\n * emitter.hasListener('test', fn2); // false\n */\n EmitterPro.prototype.hasListener = function (eventName, listener) {\n return this.rawListeners(eventName).some(function (item) { return item === listener; });\n };\n EmitterPro.prototype._on = function (eventName, raw, wrap, context, dir) {\n if (context === void 0) { context = null; }\n if (dir === void 0) { dir = 1; }\n var currentListener = { raw: raw, wrap: wrap, context: context };\n if (!this.handlers[eventName]) {\n this.handlers[eventName] = [currentListener];\n }\n else {\n var appendMethod = dir === 1 ? 'push' : 'unshift';\n this.handlers[eventName][appendMethod](currentListener);\n }\n return this;\n };\n /**\n * 注册监听方法。同 `on` 方法,只是将监听方法添加到最前面(事件触发是按顺序执行)。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.prependListener('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // 42\n * // bar\n */\n EmitterPro.prototype.prependListener = function (eventName, listener, context) {\n return this._on(eventName, listener, listener, context, 0);\n };\n /**\n * 注册监听方法。允许多次添加同一引用的函数。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.on('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n */\n EmitterPro.prototype.on = function (eventName, listener, context) {\n return this._on(eventName, listener, listener, context);\n };\n EmitterPro.prototype._wrapOnce = function (eventName, listener, context) {\n var _this = this;\n if (context === void 0) { context = null; }\n var wrap = (function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n listener.apply(context, args);\n _this.off(eventName, wrap);\n });\n return wrap;\n };\n /**\n * 仅触发一次的监听方法。使用方法同 `on` 。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.once('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n *\n * emitter.emit('foo');\n * // bar\n */\n EmitterPro.prototype.once = function (eventName, listener, context) {\n var wrap = this._wrapOnce(eventName, listener, context);\n return this._on(eventName, listener, wrap, context);\n };\n /**\n * 仅触发一次的监听方法。同 `once` 方法,只是添加到最前面(事件触发是按顺序执行)。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.prependOnceListener('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // 42\n * // bar\n *\n * emitter.emit('foo');\n * // bar\n */\n EmitterPro.prototype.prependOnceListener = function (eventName, listener, context) {\n var wrap = this._wrapOnce(eventName, listener, context);\n return this._on(eventName, listener, wrap, context, 0);\n };\n /**\n * 取消监听方法。如果不传第二个参数,将取消该事件名称的全部监听方法。如果多次添加同一引用的函数,需要多次删除。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @returns 事件触发器实例。\n * @example\n * const fn = () => console.log('bar');\n * emitter.on('foo', fn);\n * emitter.on('foo', () => console.log('baz'));\n * emitter.on('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // baz\n * // 42\n *\n * emitter.off('foo', fn); // 取消 foo 的监听方法 fn\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n *\n * emitter.off('foo'); // 取消 foo 的全部监听方法\n * emitter.emit('foo'); // 什么都没发生\n */\n EmitterPro.prototype.off = function (eventName, listener) {\n var handler = this.handlers[eventName];\n if (handler) {\n if (listener) {\n var index = handler.findIndex(function (item) { return item.wrap === listener || item.raw === listener; });\n if (index !== -1) {\n handler.splice(index, 1);\n }\n }\n else {\n delete this.handlers[eventName];\n }\n }\n return this;\n };\n /**\n * 取消全部事件名称的监听方法。\n *\n * @returns 事件触发器实例。\n * @example\n * const fn = () => console.log('bar');\n * emitter.on('test', fn);\n * emitter.on('test', () => console.log('baz'));\n * emitter.on('test', () => console.log(42));\n *\n * emitter.on('other', fn);\n * emitter.on('other', () => console.log('baz'));\n *\n * emitter.emit('test');\n * // bar\n * // baz\n * // 42\n *\n * emitter.emit('other');\n * // bar\n * // baz\n *\n * emitter.offAll(); // 取消全部监听方法\n *\n * emitter.emit('test'); // 什么都没发生\n * emitter.emit('other'); // 什么都没发生\n */\n EmitterPro.prototype.offAll = function () {\n this.handlers = {};\n return this;\n };\n /**\n * 触发监听方法。\n *\n * @param eventName 事件名称\n * @param args 触发监听方法的参数(从第二个参数开始都将传给监听方法)\n * @returns 如果触发成功返回 `true`,否则返回 `false`。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.on('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n *\n * // 支持传入参数\n * emitter.on('test' (a, b) => console.log(a + b));\n * emitter.on('test' (a, b) => console.log(a * b));\n *\n * emitter.emit('other', 2, 5);\n * // 7\n * // 10\n *\n * emitter.emit('other', 5, 5);\n * // 10\n * // 25\n */\n EmitterPro.prototype.emit = function (eventName) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n var handler = this.handlers[eventName];\n if (handler && handler.length > 0) {\n handler.forEach(function (listener) {\n listener.wrap.apply(listener.context, args);\n });\n return true;\n }\n return false;\n };\n return EmitterPro;\n}());\n\nexport { EmitterPro as default };\n","import { __assign, __extends } from 'tslib';\nimport Emitter from 'emitter-pro';\n\nvar cache = {};\nvar MemoryStorage = /** @class */ (function () {\n function MemoryStorage(scope) {\n if (scope === void 0) { scope = 'default'; }\n this.scope = scope;\n if (!cache[this.scope]) {\n cache[this.scope] = {};\n }\n this.data = cache[this.scope];\n }\n MemoryStorage.prototype.getItem = function (key) {\n return key in this.data ? this.data[key] : null;\n };\n MemoryStorage.prototype.setItem = function (key, value) {\n this.data[key] = value;\n };\n MemoryStorage.prototype.removeItem = function (key) {\n delete this.data[key];\n };\n MemoryStorage.prototype.clear = function () {\n cache[this.scope] = {};\n this.data = cache[this.scope];\n };\n return MemoryStorage;\n}());\n\n// 随机字符串\nfunction randomString() {\n return Math.random().toString(16).substring(2, 8);\n}\n// 是否支持 storage\nfunction isStorageSupported(storage) {\n try {\n var isSupport = typeof storage === 'object' &&\n storage !== null &&\n !!storage.setItem &&\n !!storage.getItem &&\n !!storage.removeItem;\n if (isSupport) {\n var key = randomString() + new Date().getTime();\n var value = '1';\n storage.setItem(key, value);\n if (storage.getItem(key) !== value) {\n return false;\n }\n storage.removeItem(key);\n }\n return isSupport;\n }\n catch (e) {\n console.error(\"[cache2] \".concat(storage, \" is not supported. The default memory cache will be used.\"));\n return false;\n }\n}\nfunction parse(value, reviver) {\n try {\n return JSON.parse(value, reviver);\n }\n catch (e) {\n return value;\n }\n}\nfunction stringify(value, replacer) {\n return JSON.stringify(value, replacer);\n}\n\n/**\n * 数据存储管理。\n *\n * @class\n * @param {Object} [storage] 自定义缓存对象要包含 `getItem` `setItem` `removeItem` 方法。默认使用内存缓存。\n * @param {Object} [options] 配置项。可选。\n * @param {boolean} [options.needParsed] 存取数据时是否需要序列化和解析数据。如果使用内置的内存缓存,默认 `false`,如果自定义 `storage` 默认 `true`。\n * @param {Function} [options.replacer] 数据存储时序列化的参数,透传给 [JSON.stringify](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) 的 `replacer` 参数。仅在 `needParsed=true` 时生效。\n * @param {Function} [options.reviver] 数据获取时转换的参数,透传给 [JSON.parse](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse) 的 `reviver` 参数。仅在 `needParsed=true` 时生效。\n * @param {string} [options.prefix] 缓存键前缀。便于管理同域名下的不同项目缓存。\n * @example\n * // 使用内存缓存\n * const memory = new Storage();\n * memory.set('foo', { baz: 42 });\n * memory.get('foo');\n * // { baz: 42 }\n *\n * // 自定义缓存 sessionStorage 。\n * const session = new Storage(window.sessionStorage);\n * session.set('foo', { a: 1, b: ['bar'], c: ['x', 2, 3] });\n * session.get('foo');\n * // { a: 1, b: ['bar'], c: ['x', 2, 3] }\n *\n * session.del('foo'); // 删除缓存\n * session.get('foo');\n * // null\n *\n * // 使用缓存键前缀。\n * // 如果要使用内存缓存, storage 传 `undefined`。\n * const local = new Storage(window.localStorage, { prefix: 'project_name' });\n * local.set('foo', { baz: 42 });\n * local.get('foo');\n * // { baz: 42 }\n */\nvar Storage = /** @class */ (function () {\n function Storage(storage, options) {\n if (options === void 0) { options = {}; }\n var isSupported = storage ? isStorageSupported(storage) : false;\n this.options = __assign({ needParsed: isSupported, prefix: '' }, options);\n this.storage = isSupported ? storage : new MemoryStorage(this.options.memoryScope);\n }\n /**\n * 内部用于获取存储的键名称。\n *\n * 如果实例有设置 `prefix`,返回 `prefix + key`。\n *\n * @protected\n * @param key 原键名称\n * @returns 存储的键名称\n */\n Storage.prototype.getKey = function (key) {\n return this.options.prefix + key;\n };\n /**\n * 获取存储的数据。\n *\n * @param {string} key 键名称。\n * @returns 如果键值存在返回键值,否则返回 `null`。\n * @example\n * const local = new Storage(window.localStorage);\n * local.set('foo', { baz: 42 });\n * local.get('foo');\n * // { baz: 42 }\n */\n Storage.prototype.get = function (key) {\n var value = this.storage.getItem(this.getKey(key));\n return this.options.needParsed ? parse(value, this.options.reviver) : value;\n };\n /**\n * 存储数据。\n *\n * @param key 键名称。\n * @param value 键值。\n * @example\n * const local = new Storage(window.localStorage);\n * local.set('foo', { baz: 42 });\n * local.get('foo');\n * // { baz: 42 }\n */\n Storage.prototype.set = function (key, value) {\n this.storage.setItem(this.getKey(key), this.options.needParsed ? stringify(value, this.options.replacer) : value);\n };\n /**\n * 删除存储的数据。\n *\n * @param key 键名称。\n * @example\n * const local = new Storage(window.localStorage);\n * local.set('foo', { baz: 42 });\n * local.get('foo');\n * // { baz: 42 }\n *\n * local.del('foo');\n * local.get('foo');\n * // null\n */\n Storage.prototype.del = function (key) {\n this.storage.removeItem(this.getKey(key));\n };\n /**\n * 清除存储的所有键。\n *\n * 注意:该方法调用 `storage.clear()`,可能会将同域下的不同实例的所有键都清除。如果要避免这种情况,建议使用 `import { Cache } 'cache2'`。\n *\n * @example\n * const local = new Storage(window.localStorage);\n * local.set('foo', { baz: 42 });\n * local.get('foo');\n * // { baz: 42 }\n *\n * local.clear();\n * local.get('foo');\n * // null\n */\n Storage.prototype.clear = function () {\n if (typeof this.storage.clear === 'function') {\n this.storage.clear();\n }\n };\n return Storage;\n}());\n\n// 命名空间缓存键前缀。\nvar defaultPrefix = 'cache2_';\nvar defaultNamespace = 'default';\n/**\n * 功能丰富的数据存储管理,支持 `自定义缓存` `命名空间` `数据过期时间` `限制缓存数量` `自定义事件`。\n *\n * 注意:如果你需要的是简单的基本数据存储管理,例如浏览器存储,建议使用 `import { Storage } from 'cache2'`。\n *\n * @class\n * @param {string} [namespace] 命名空间。可选。\n * @param {Object} [options] 配置项。可选。\n * @param {Object} [options.storage] 自定义缓存对象要包含 `getItem` `setItem` `removeItem` 方法。默认使用内置的内存缓存。\n * @param {number} [options.max=-1] 最大缓存数据数量。`-1` 表示无限制。默认 `-1`。\n * @param {'limited' | 'replaced'} [options.maxStrategy='limited'] 当达到最大缓存数量限制时的缓存策略。`limited` 表示达到限制数量后不存入数据,保存时返回 `false`。`replaced` 表示优先替换快过期的数据,如果都是一样的过期时间(0),按照先入先出规则处理,保存时始终返回 `true`。默认 `limited`。\n * @param {number} [options.stdTTL=0] 相对当前时间的数据存活时间,应用于当前实例的所有缓存数据。单位为毫秒,`0` 表示无期限。默认 `0`。\n * @param {number} [options.checkperiod=0] 定时检查过期数据,单位毫秒。如果小于等于 `0` 表示不启动定时器检查。默认 `0`。\n * @param {boolean} [options.needParsed] 存取数据时是否需要序列化和解析数据。如果使用内置的内存缓存,默认 `false`,如果自定义 `storage` 默认 `true`。\n * @param {Function} [options.replacer] 数据存储时序列化的参数,透传给 [JSON.stringify](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) 的 `replacer` 参数。仅在 `needParsed=true` 时生效。\n * @param {Function} [options.reviver] 数据获取时转换的参数,透传给 [JSON.parse](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse) 的 `reviver` 参数。仅在 `needParsed=true` 时生效。\n * @param {string} [options.prefix] 缓存键前缀。\n * @example\n * // 自定义过期时间\n * const memoryCache = new Cache({ stdTTL: 60 * 1000 });\n * memoryCache.set('foo', { baz: 42 });\n * memoryCache.get('foo');\n * // { baz: 42 }\n *\n * // 60 seconds later\n *\n * memoryCache.get('foo');\n * // undefined\n *\n * // 命名空间、自定义缓存\n * const localCache = new Cache('namespace', { storage: window.localStorage });\n * localCache.set('foo', { baz: 42 });\n * localCache.get('foo');\n * // { baz: 42 }\n *\n * localCache.del('foo');\n * localCache.get('foo');\n * // undefined\n */\nvar Cache = /** @class */ (function (_super) {\n __extends(Cache, _super);\n function Cache(namespace, options) {\n var _this = _super.call(this) || this;\n var ns = defaultNamespace, opts;\n if (typeof namespace === 'string') {\n ns = namespace || defaultNamespace;\n }\n else if (typeof namespace === 'object') {\n opts = namespace;\n }\n if (!opts && typeof options === 'object') {\n opts = options;\n }\n _this.options = __assign({ max: -1, stdTTL: 0, maxStrategy: 'limited', checkperiod: 0, prefix: defaultPrefix }, opts);\n _this.storage = new Storage(_this.options.storage, __assign({ memoryScope: ns }, _this.options));\n _this.cacheKey = ns;\n _this.startCheckperiod();\n return _this;\n }\n /**\n * 检查当前键值是否过期,如果过期将会自动删除。\n *\n * @param key 键名称。\n * @param data 缓存数据。\n * @returns 如果键值已过期返回 `false` ,否则返回 `true`。\n */\n Cache.prototype._check = function (key, data) {\n var ret = true;\n if (data.t !== 0 && data.t < Date.now()) {\n ret = false;\n this.del(key);\n this.emit('expired', key, data.v);\n }\n return ret;\n };\n Cache.prototype._wrap = function (value, ttl) {\n var now = Date.now();\n var currentTtl = typeof ttl === 'number' ? ttl : this.options.stdTTL;\n var livetime = currentTtl > 0 ? now + currentTtl : 0;\n return {\n v: value,\n t: livetime,\n n: now\n };\n };\n Cache.prototype._isLimited = function (len) {\n return this.options.max > -1 && len >= this.options.max;\n };\n Cache.prototype._getReplaceKey = function (keys, cacheValues) {\n var retkey = keys[0];\n keys.forEach(function (key) {\n if (cacheValues[key].t < cacheValues[retkey].t ||\n (cacheValues[key].t === cacheValues[retkey].t && cacheValues[key].n < cacheValues[retkey].n)) {\n retkey = key;\n }\n });\n return retkey;\n };\n Object.defineProperty(Cache.prototype, \"cacheValues\", {\n /**\n * 获取全部缓存数据,不处理过期数据和排序\n */\n get: function () {\n return this.storage.get(this.cacheKey) || {};\n },\n enumerable: false,\n configurable: true\n });\n // 设置缓存数据\n Cache.prototype.setCacheValues = function (values) {\n this.storage.set(this.cacheKey, values);\n };\n /**\n * 获取缓存值。\n *\n * @param {string} key 键名称。\n * @returns {*} 如果找到该值,则返回该值。如果未找到或已过期,则返回 `undefined`。\n * @example\n * myCache.set('myKey', obj, 5 * 60 * 1000);\n * myCache.get('myKey');\n * // { foo: 'bar', baz: 42 }\n *\n * myCache.get('myKey2');\n * // undefined\n */\n Cache.prototype.get = function (key) {\n var data = this.cacheValues[key];\n if (data && this._check(key, data)) {\n return data.v;\n }\n return;\n };\n /**\n * 获取多个缓存值。\n *\n * @param {string[]} keys 多个键名称。\n * @returns {Object} 如果找到对应键名的值,返回一个具有键值对的对象。如果未找到或已过期,则返回一个空对象 `{}`。\n * @example\n * myCache.mset([\n * { key: 'myKey', value: { foo: 'bar', baz: 42 }, ttl: 5 * 60 * 1000 },\n * { key: 'myKey2', value: { a: 1, b: 2 } },\n * { key: 'myKey3', value: 'abc' }\n * ]);\n *\n * myCache.mget(['myKey', 'myKey2']);\n * // {\n * // myKey: { foo: 'bar', baz: 42 },\n * // myKey2: { a: 1, b: 2 }\n * // }\n */\n Cache.prototype.mget = function (keys) {\n var _this = this;\n var ret = {};\n if (!Array.isArray(keys)) {\n return ret;\n }\n var cacheValues = this.cacheValues;\n keys.forEach(function (key) {\n var data = cacheValues[key];\n if (data && _this._check(key, data)) {\n ret[key] = data.v;\n }\n });\n return ret;\n };\n /**\n * 获取全部缓存值。\n *\n * @returns {Object} 返回一个具有键值对的对象。\n * @example\n * myCache.mset([\n * { key: 'myKey', value: { foo: 'bar', baz: 42 }, ttl: 5 * 60 * 1000 },\n * { key: 'myKey2', value: { a: 1, b: 2 } },\n * { key: 'myKey3', value: 'abc' }\n * ]);\n *\n * myCache.getAll();\n * // {\n * // myKey: { foo: 'bar', baz: 42 },\n * // myKey2: { a: 1, b: 2 }\n * // myKey3: 'abc'\n * // }\n */\n Cache.prototype.getAll = function () {\n var keys = Object.keys(this.cacheValues);\n return this.mget(keys);\n };\n /**\n * 设置缓存数据。\n *\n * 如果超出缓存数量,可能会设置失败。\n *\n * @param {string} key 键名称。\n * @param {*} value 键值。\n * @param {number} [ttl] 数据存活时间。单位毫秒 `ms`。\n * @returns {boolean} 如果设置成功返回 `true`,否则返回 `false`。\n * @example\n * myCache.set('myKey', { foo: 'bar', baz: 42 }, 5 * 60 * 1000);\n * // true\n */\n Cache.prototype.set = function (key, value, ttl) {\n if (this.options.max === 0) {\n return false;\n }\n var cacheValues = this.cacheValues;\n var keys = Object.keys(cacheValues);\n // 当前不存在该键值,并且数据量超过最大限制\n if (!cacheValues[key] && this._isLimited(keys.length)) {\n var validKeys = this.keys();\n if (this._isLimited(validKeys.length)) {\n // 如果最大限制策略是替换,将优先替换快过期的数据,如果都是一样的过期时间(0),按照先入先出规则处理。\n if (this.options.maxStrategy === 'replaced') {\n var replaceKey = this._getReplaceKey(validKeys, cacheValues);\n this.del(replaceKey);\n }\n else {\n // 如果是最大限制策略是不允许添加,返回 false 。\n return false;\n }\n }\n }\n cacheValues[key] = this._wrap(value, ttl);\n this.setCacheValues(cacheValues);\n this.emit('set', key, cacheValues[key].v);\n return true;\n };\n /**\n * 设置多个缓存数据。\n *\n * @param {Object[]} keyValueSet 多个键值对数据。\n * @returns {boolean} 如果全部设置成功返回 `true`,否则返回 `false`。\n * @example\n * myCache.mset([\n * { key: 'myKey', value: { foo: 'bar', baz: 42 }, ttl: 5 * 60 * 1000 },\n * { key: 'myKey2', value: { a: 1, b: 2 } },\n * { key: 'myKey3', value: 'abc' }\n * ]);\n * // true\n */\n Cache.prototype.mset = function (keyValueSet) {\n var _this = this;\n // 该处不使用数组 some 方法,是因为不能某个失败,而导致其他就不在更新。\n var ret = true;\n keyValueSet.forEach(function (item) {\n var itemSetResult = _this.set(item.key, item.value, item.ttl);\n if (ret && !itemSetResult) {\n ret = false;\n }\n });\n return ret;\n };\n /**\n * 删除一个或多个键。\n *\n * @param {string|string[]} key 要删除的键名。\n * @returns {number} 返回已删除的数量。\n * @example\n * myCache.set('myKey', { foo: 'bar', baz: 42 });\n * myCache.del('myKey'); // 1\n * myCache.del('not found'); // 0\n *\n * myCache.mset([\n * { key: 'myKey', value: { foo: 'bar', baz: 42 }, ttl: 5 * 60 * 1000 },\n * { key: 'myKey2', value: { a: 1, b: 2 } },\n * { key: 'myKey3', value: 'abc' }\n * ]);\n * myCache.del(['myKey', 'myKey2']); // 2\n */\n Cache.prototype.del = function (key) {\n var _this = this;\n var cacheValues = this.cacheValues;\n var count = 0;\n var keys = Array.isArray(key) ? key : [key];\n keys.forEach(function (key) {\n if (cacheValues[key]) {\n count++;\n var oldData = cacheValues[key];\n delete cacheValues[key];\n _this.emit('del', key, oldData.v);\n }\n });\n if (count > 0) {\n this.setCacheValues(cacheValues);\n }\n return count;\n };\n /**\n * 清除全部缓存的数据。\n *\n * @example\n * myCache.set('bar', 1);\n * myCache.set('foo', 2);\n * myCache.keys(); // ['bar', 'foo']\n *\n * myCache.clear();\n * myCache.keys(); // []\n */\n Cache.prototype.clear = function () {\n this.storage.del(this.cacheKey);\n };\n /**\n * 获取全部键名的数组。\n *\n * @returns {string[]} 返回全部键名的数组。\n * @example\n * myCache.set('bar', 1);\n * myCache.set('foo', 2);\n *\n * myCache.keys(); // ['bar', 'foo']\n */\n Cache.prototype.keys = function () {\n var _this = this;\n var cacheValues = this.cacheValues;\n var keys = Object.keys(cacheValues);\n return keys.filter(function (key) { return _this._check(key, cacheValues[key]); });\n };\n /**\n * 判断是否存在某个键。\n *\n * @param {string} key 键名称。\n * @returns {boolean} 如果包含该键返回 `true`,否则返回 `false`。\n * @example\n * myCache.has('foo'); // false\n *\n * myCache.set('foo', 1);\n * myCache.has('foo'); // true\n */\n Cache.prototype.has = function (key) {\n var data = this.cacheValues[key];\n return !!(data && this._check(key, data));\n };\n /**\n * 获取缓存值并从缓存中删除键。\n *\n * @param {string} key 键名称。\n * @returns {*} 如果找到该值,则返回该值,并从缓存中删除该键。如果未找到或已过期,则返回 `undefined`。\n * @example\n * myCache.set('myKey', 'myValue');\n * myCache.has('myKey'); // true\n *\n * myCache.take('myKey'); // 'myValue'\n * myCache.has('myKey'); // false\n */\n Cache.prototype.take = function (key) {\n var ret;\n var data = this.cacheValues[key];\n if (data && this._check(key, data)) {\n ret = data.v;\n this.del(key);\n }\n return ret;\n };\n /**\n * 更新缓存键值的数据存活时间。\n *\n * @param {string} key 键名称。\n * @param {number} ttl 数据存活时间。\n * @returns {boolean} 如果找到并更新成功,则返回 `true`,否则返回 `false`。\n * @example\n * myCache.set('myKey', { foo: 'bar', baz: 42 }, 5 * 60 * 1000);\n * myCache.ttl('myKey', 60 * 1000);\n * // true\n *\n * myCache.ttl('not found', 1000);\n * // false\n */\n Cache.prototype.ttl = function (key, ttl) {\n var cacheValues = this.cacheValues;\n var data = cacheValues[key];\n if (data && this._check(key, data)) {\n cacheValues[key] = this._wrap(data.v, ttl);\n return true;\n }\n return false;\n };\n /**\n * 获取某个键的过期时间戳。\n *\n * @param {string} key 键名称。\n * @returns {number | undefined} 如果未找到键或已过期,返回 `undefined`。如果 `ttl` 为 `0`,返回 `0`,否则返回一个以毫秒为单位的时间戳,表示键值将过期的时间。\n * @example\n * const myCache = new Cache({ stdTTL: 5 * 1000 });\n *\n * // 假如 Date.now() = 1673330000000\n * myCache.set('ttlKey', 'expireData');\n * myCache.set('noTtlKey', 'nonExpireData', 0);\n *\n * myCache.getTtl('ttlKey'); // 1673330005000\n * myCache.getTtl('noTtlKey'); // 0\n * myCache.getTtl('unknownKey'); // undefined\n */\n Cache.prototype.getTtl = function (key) {\n var cacheValues = this.cacheValues;\n var data = cacheValues[key];\n if (data && this._check(key, data)) {\n return cacheValues[key].t;\n }\n return;\n };\n /**\n * 获取某个键值的最后修改时间。\n *\n * @param {string} key 键名称。\n * @returns {number | undefined} 如果未找到键或已过期,返回 `undefined`,否则返回一个以毫秒时间戳,表示键值最后修改时间。\n * @example\n * const myCache = new Cache();\n *\n * // 假如 Date.now() = 1673330000000\n * myCache.set('myKey', 'foo');\n * myCache.getLastModified('myKey'); // 1673330000000\n *\n * // 5000ms later\n * myCache.set('myKey', 'bar');\n * myCache.getLastModified('myKey'); // 1673330005000\n */\n Cache.prototype.getLastModified = function (key) {\n var cacheValues = this.cacheValues;\n var data = cacheValues[key];\n if (data && this._check(key, data)) {\n return cacheValues[key].n;\n }\n return;\n };\n /**\n * 启动定时校验过期数据。\n *\n * 注意,如果没有设置 `checkperiod` 将不会触发定时器。\n *\n * @example\n * // 设置 checkperiod 之后自动生效\n * const myCache = new Cache({\n * checkperiod: 10 * 60 * 1000 // 10分钟检查一次数据是否过期\n * });\n *\n * // 停止定时校验过期数据\n * myCache.stopCheckperiod();\n *\n * // 启动定时校验过期数据\n * myCache.startCheckperiod();\n */\n Cache.prototype.startCheckperiod = function () {\n var _this = this;\n // 触发全部缓存数据是否过期校验\n this.keys();\n if (this.options.checkperiod > 0) {\n clearTimeout(this._checkTimeout);\n this._checkTimeout = setTimeout(function () {\n _this.startCheckperiod();\n }, this.options.checkperiod);\n }\n };\n /**\n * 停止定时校验过期数据。\n *\n * @example\n * // 设置 checkperiod 之后自动生效\n * const myCache = new Cache({\n * checkperiod: 10 * 60 * 1000 // 10分钟检查一次数据是否过期\n * });\n *\n * // 停止定时校验过期数据\n * myCache.stopCheckperiod();\n */\n Cache.prototype.stopCheckperiod = function () {\n clearTimeout(this._checkTimeout);\n };\n return Cache;\n}(Emitter));\n\nexport { Cache, Storage, Cache as default };\n","import { Cache, CacheOptions } from 'cache2';\nimport { isString } from 'ut2';\n\n/**\n * 异步缓存\n *\n * 特点:\n * 1. 共享异步。同一个缓存键的异步,最多同时运行一个异步,异步结果共享。\n * 2. 持久化数据。存在缓存结果,不再执行异步方法,直接返回该结果。\n * 3. 每个实例都有独立的缓存空间。相互之间隔离,缓存灵活配置,更多配置请查阅 [`cache2`](https://www.npmjs.com/package/cache2)。\n *\n * @class\n * @see {@link https://www.npmjs.com/package/cache2 cache2}\n * @param {Object} [options] 缓存配置项,更多配置项可参考 [`cache2`](https://www.npmjs.com/package/cache2)。\n * @param {number} [options.max] 最大缓存数量。\n * @param {'replaced' | 'limited'} [options.maxStrategy] 缓存策略。\n * @param {string} [options.prefix] 缓存健前缀。\n * @param {string} [ns='uh_async_memo'] 缓存命名空间。默认 `uh_async_memo`。\n * @example\n *\n * const asyncMemo = new AsyncMemo({ max: 20, maxStrategy: 'replaced', prefix: 'some key' });\n * asyncMemo.run(()=>download({ fssid: 'a' }), 'a');\n * asyncMemo.run(()=>download({ fssid: 'b' }), 'b');\n * asyncMemo.run(()=>download({ fssid: 'a' }), 'a'); // 如果有缓存结果直接返回,如果有异步执行中,不会重复触发异步,但共享异步结果。\n *\n * asyncMemo.run(()=>download({ fssid: 'a' }), 'a', { persisted: false }); // 不读取缓存结果,但是异步执行结果还是会缓存。\n * asyncMemo.run(()=>download({ fssid: 'a' })); // 没有缓存键时,直接执行异步方法,不读取缓存结果,也不会缓存异步结果。\n *\n * // 自定义命名空间\n * const asyncMemo2 = new AsyncMemo({}, 'namespace');\n *\n */\nclass AsyncMemo<DataType = any> {\n private promiseCache: Record<string, Promise<any>>;\n /**\n * @summary cache2 实例,用于管理缓存\n */\n cache: Cache<DataType>;\n\n constructor(options?: Partial<CacheOptions>, ns = 'uh_async_memo') {\n this.promiseCache = {};\n this.cache = new Cache(ns, options);\n }\n\n /**\n * 执行异步方法\n *\n * @param {Function} asyncFn 异步方法\n * @param {string} [key] 缓存键,如果没有该值将直接执行异步方法。\n * @param {Object} [options] 配置项\n * @param {number} [options.ttl] 数据存活时间\n * @param {boolean} [options.persisted=true] 数据持久化,默认`true`。如果存在缓存数据,直接返回缓存数据,不再执行异步方法。<br/>即使不开启该配置,不影响在异步执行成功后缓存数据。\n * @returns {Promise<*>} 异步结果\n * @example\n *\n * const asyncMemo = new AsyncMemo();\n * asyncMemo.run(()=>download({ fssid: 'a' }), 'a');\n * asyncMemo.run(()=>download({ fssid: 'b' }), 'b');\n * asyncMemo.run(()=>download({ fssid: 'a' }), 'a'); // 如果有缓存结果直接返回,如果有异步执行中,不会重复触发异步,但共享异步结果。\n *\n * asyncMemo.run(()=>download({ fssid: 'a' }), 'a', { persisted: false }); // 不读取缓存结果,但是异步执行结果还是会缓存。\n * asyncMemo.run(()=>download({ fssid: 'a' })); // 没有缓存键时,直接执行异步方法,不读取缓存结果,也不会缓存异步结果。\n */\n run(\n asyncFn: (...args: any[]) => Promise<DataType>,\n key?: string,\n options?: {\n ttl?: number;\n persisted?: boolean;\n }\n ): Promise<DataType> {\n if (!key || !isString(key)) {\n return asyncFn();\n }\n\n const opts = {\n persisted: true,\n ...options\n };\n\n if (opts.persisted) {\n const data = this.cache.get(key);\n if (data) {\n return Promise.resolve(data);\n }\n }\n\n if (!this.promiseCache[key]) {\n this.promiseCache[key] = asyncFn()\n .then((res) => {\n delete this.promiseCache[key];\n this.cache.set(key, res, opts.ttl);\n return res;\n })\n .catch((err) => {\n delete this.promiseCache[key];\n return Promise.reject(err);\n });\n }\n return this.promiseCache[key] as Promise<DataType>;\n }\n}\n\nexport default AsyncMemo;\n","import { isArray, toString } from 'ut2';\n\ntype CalculateCursorPositionOptions = {\n placeholderChar?: string | string[];\n maskReg?: RegExp;\n type?: 'mobile' | 'bankCard';\n};\n\n/**\n * 计算输入框的值格式化后光标位置\n *\n * @alias module:Other.calculateCursorPosition\n * @since 4.6.0\n * @see {@link https://2950v9.csb.app/ h5示例}\n * @see {@link https://33ccy9.csb.app/ react示例}\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] 需要遮盖的字符规则。默认`/\\D/g` 去掉非数字,意味着 ctrlValue 需要去掉非数字。\n * @param {'mobile'|'bankCard'} [options.type] 格式化类型,内置手机号码和银行卡号特殊处理\n * @returns {number} 格式化后的光标位置\n */\nfunction calculateCursorPosition(prevPos: number, prevCtrlValue: string, rawValue: string, ctrlValue: string, options: CalculateCursorPositionOptions = {}) {\n const { placeholderChar = ' ', maskReg = /\\D/g, type } = options;\n\n const realCtrlValue = toString(prevCtrlValue);\n const realRawValue = toString(rawValue);\n const placeholderChars = 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 { tryit } from 'ut2';\n\n/**\n * 检查函数执行结果。\n *\n * 如果函数执行异常或返回下列结果,则返回 `false` ,否则返回 `true`。\n * 1. `Promise.reject()`\n * 2. `Promise.resolve(false)`\n * 3. `false`\n *\n * @alias module:Other.checkResult\n * @since 5.5.0\n * @param {Function} [fn=()=>true] 处理函数,默认 `()=>true`。\n * @param {...*} [args] 展开参数,`fn` 执行参数。\n * @returns {Promise<boolean>}\n * @example\n * await checkResult(()=>throw new Error()); // false\n * await checkResult(()=>Promise.reject()); // false\n * await checkResult(()=>Promise.resolve(false)); // false\n * await checkResult(async ()=>false); // false\n * await checkResult(()=>false); // false\n *\n * await checkResult(undefined); // true\n * await checkResult(()=>true); // true\n * await checkResult(()=>Promise.resolve()); // true\n * await checkResult(async ()=>true); // true\n * await checkResult(()=>null); // true\n * await checkResult(()=>undefined); // true\n * await checkResult(()=>'foo'); // true\n *\n * // 传入参数\n * await checkResult((...args)=>args.length > 1); // false\n * await checkResult((...args)=>args.length > 1, 'a', 'b'); // true\n */\nconst checkResult = async <P extends any[]>(fn: (...args: P) => any | Promise<any> = () => true, ...args: P) => {\n const [err, ret] = await tryit(fn)(...args);\n return !err && ret !== false;\n};\n\nexport default checkResult;\n","import { toNumber } from 'ut2';\nimport loadImageWithBlob from './loadImageWithBlob';\nimport { nativeUndefined } from './utils/native';\n\n/**\n * canvas 导出 blob 对象\n *\n * @private\n * @param canvas 画布元素\n * @param type 导出图片类型\n * @param quality 图像质量\n * @returns {Promise<Blob>}\n */\nfunction canvasToBlob(canvas: HTMLCanvasElement, type?: string, quality?: number) {\n return new Promise<Blob | null>((resolve) => {\n canvas.toBlob(\n (blob) => {\n resolve(blob);\n },\n type,\n quality\n );\n });\n}\n\n// 压缩图片信息\ntype Info = {\n image: HTMLImageElement; // 图片元素\n blob: Blob; // 图片 blob 对象\n canvas: HTMLCanvasElement; // canvas 元素\n context: CanvasRenderingContext2D; // canvas 2D 渲染上下文\n};\n\ntype Options = {\n // 图片配置\n width?: number; // 自定义图片宽度。默认图片自身宽度\n height?: number; // 自定义图片高度。默认图片自身高度\n rotate?: number; // 旋转角度\n offset?: [number, number] | ((info: Info, options: Options) => [number, number]); // 偏移值\n\n // 画布配置\n background?: string; // 背景色。默认白色\n canvasWidth?: number | ((info: Info, options: Options) => number); // 画布宽度。默认图片宽度\n canvasHeight?: number | ((info: Info, options: Options) => number); // 画布高度。默认图片高度\n\n // 导出配置\n format?: 'blob' | 'dataURL'; // 导出格式。默认 blob\n type?: string; // 图片类型。默认 image/jpeg\n quality?: number; // 图片质量。默认 0.8\n\n // 钩子方法\n beforeCompress?: (imageWithBlob: Pick<Info, 'image' | 'blob'>, options: Options) => void; // 压缩前触发\n beforeDraw?: (info: Info, options: Options) => void; // 画之前\n afterDraw?: (info: Info, options: Options) => void; // 画之后\n\n // 其他\n ajaxOptions?: Parameters<typeof loadImageWithBlob>[1];\n};\n\ninterface CompressImage {\n (img: string | Blob, options: Omit<Options, 'format'> & { format: 'dataURL' }): Promise<string>;\n (img: string | Blob, options?: Options): Promise<Blob>;\n}\n\n/**\n * 压缩图片。\n *\n * <em style=\"font-weight: bold;\">注意:该方法仅适用于浏览器端。</em>\n *\n * <em style=\"font-weight: bold;\">如果是半透明图片并且导出 `image/png` 格式,建议将背景变成透明 `background=transparent`,避免出现白边。注意正常图片压缩导出 `image/png` 格式后文件可能会比原图大。</em>\n *\n * @function\n * @alias module:Browser.compressImage\n * @since 4.20.0\n * @see {@link https://sytpwg.csb.app/ 在线示例}\n * @param {string | Blob} img 图片地址或 blob 对象\n * @param {Object} [options] 配置项\n * @param {number} [options.width] 自定义图片宽度,默认图片自身宽度\n * @param {number} [options.height] 自定义图片高度,默认图片自身高度\n * @param {number} [options.rotate] 旋转\n * @param {Array | function} [options.offset=[0, 0]] x,y轴偏移值,默认`[0, 0]`\n * @param {string} [options.background=#fff] 背景颜色,默认`#fff`\n * @param {number | function} [options.canvasWidth] 画布宽度,默认图片宽度\n * @param {number | function} [options.canvasHeight] 画布高度,默认图片高度\n * @param {'blob' | 'dataURL'} [options.format='blob'] 导出格式,默认`blob`\n * @param {string} [options.type='image/jpeg'] 图片类型,默认`image/jpeg`\n * @param {number} [options.quality=0.8] 图片质量,默认`0.8`\n * @param {function} [options.beforeCompress] 图片加载完成,画布创建之前调用\n * @param {function} [options.beforeDraw] 图片载入画布之前调用\n * @param {function} [options.afterDraw] 图片载入画布之后调用\n * @param {AjaxOptions} [options.ajaxOptions] ajax 请求配置项,当传入图片地址时才会触发ajax请求。\n * @returns {Promise<Blob | string>} blob 对象 或 data url 图片\n * @example\n *\n * // 默认返回压缩后的 blob 对象\n * compressImage(file).then(blob=>{\n * // do something\n * // 转为文件对象 new File([blob], file.name, { type: file.type })\n * });\n *\n * // 设置返回格式 data url\n * compressImage(file, { format: 'dataURL' }).then(url=>{\n * // do something\n * });\n *\n * // 自定义配置\n * compressImage('https://dummyimage.com/200x300', {\n * width: 100,\n * height: 100,\n * quality: 0.5,\n * beforeCompress({ image, blob }){},\n * beforeDraw({ image, blob, canvas, context }){}\n * afterDraw({ image, blob, canvas, context }){}\n * }).then(blob=>{\n * // do something\n * });\n *\n * // 支持不同形式的图片文件\n * compressImage('data:image/png;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=').then(blob=>{\n * // do something\n * });\n *\n */\nconst compressImage: CompressImage = function (img: string | Blob, options: Options = {}) {\n return new Promise<any>((resolve, reject) => {\n const {\n width,\n height,\n rotate,\n offset = [0, 0],\n\n background = '#fff',\n canvasWidth,\n canvasHeight,\n\n format = 'blob',\n type = 'image/jpeg',\n quality = 0.8,\n\n beforeCompress,\n beforeDraw,\n afterDraw,\n\n ajaxOptions\n } = options;\n\n // 加载图片\n loadImageWithBlob(img, ajaxOptions)\n .then(({ image, blob }) => {\n const numWidth = toNumber(width);\n const numHeight = toNumber(height);\n const numQuality = toNumber(quality);\n\n // 自定义图片宽高\n if (numWidth) {\n image.width = numWidth;\n }\n if (numHeight) {\n image.height = numHeight;\n }\n\n beforeCompress?.({ image, blob }, options);\n\n // 创建 canvas\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n const info = { image, blob, canvas, context: ctx };\n\n // 设置 canvas 宽高\n const numCanvasWidth = toNumber(typeof canvasWidth === 'function' ? canvasWidth(info, options) : canvasWidth);\n const numCanvasHeight = toNumber(typeof canvasHeight === 'function' ? canvasHeight(info, options) : canvasHeight);\n canvas.width = numCanvasWidth || image.width;\n canvas.height = numCanvasHeight || image.height;\n\n const bgIsTransparent = background === 'none' || background === 'transparent';\n\n // 填充背景色\n if (bgIsTransparent) {\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n } else {\n ctx.fillStyle = background;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n }\n\n // 旋转/变换/偏移\n // 如果设置了旋转,自动将原点设置为图片中心,并调整偏移值。\n let internalOffset = [0, 0];\n if (rotate !== nativeUndefined) {\n ctx.translate(image.width / 2, image.height / 2);\n internalOffset = [-image.width / 2, -image.height / 2];\n ctx.rotate((rotate * Math.PI) / 180);\n }\n const outOffset = typeof offset === 'function' ? offset(info, options) : offset;\n\n beforeDraw?.(info, options);\n\n // 将图像载入 canvas 中\n const dx = internalOffset[0] + toNumber(outOffset[0]);\n const dy = internalOffset[1] + toNumber(outOffset[1]);\n ctx.drawImage(image, dx, dy, image.width, image.height);\n\n // 处理png图片透明背景\n if (type === 'image/png' && bgIsTransparent) {\n ctx.globalCompositeOperation = 'destination-in';\n ctx.drawImage(image, dx, dy, image.width, image.height);\n }\n\n afterDraw?.(info, options);\n\n // 导出压缩后的图片\n if (format === 'blob') {\n canvasToBlob(canvas, type, numQuality).then(resolve).catch(reject);\n } else {\n resolve(canvas.toDataURL(type, numQuality));\n }\n })\n .catch(reject);\n });\n};\n\nexport default compressImage;\n","import { isArray, isObject } from 'ut2';\n\ntype NodeAssign = 'spread' | 'self';\n\n/**\n * 过滤/筛选树节点。\n *\n * 如果某节点被过滤掉,它的子节点也一并抛弃。\n *\n * @alias module:Tree.filterTree\n * @since 4.15.0\n * @param {Object[]} tree 树结构数据\n * @param {function} predicate 遍历每一项执行的函数,参数是当前遍历到的节点数据,如果返回 `Truthy` ,结果将包含该节点\n * @param {string} [childrenField='children'] 子级字段名,默认`children`\n * @param {'spread'|'self'} [nodeAssign='spread'] 节点赋值方式,默认`spread`。`spread`表示使用展开运算符创建新值,`self`-表示使用自身对象。\n * @returns {Object[]}\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 * // 如果某节点被过滤掉,它的子节点也一并抛弃\n * filterTree(menus, item=>item.id === '7');\n * // []\n *\n * filterTree(menus, item=>item.id === 'not found');\n * // []\n */\nfunction filterTree<T extends any, F extends (item: T) => boolean>(tree: T[], predicate: F, childrenField = 'children', nodeAssign: NodeAssign = 'spread') {\n const result: T[] = [];\n\n if (!isArray(tree)) {\n return result;\n }\n\n tree.forEach((item) => {\n let newItem = item;\n\n if (isObject(item)) {\n newItem = nodeAssign === 'spread' ? { ...item } : item;\n }\n\n if (predicate(newItem)) {\n if (isObject(newItem)) {\n // @ts-ignore\n const childs = newItem[childrenField] as T[];\n\n if (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;\n","import { forEach, isArray, isObject } from 'ut2';\n\n/**\n * 查找树结构数据节点\n *\n * @alias module:Tree.findTreeNode\n * @since 4.14.0\n * @param {Object[]} tree 树结构数据\n * @param {function} predicate 遍历每一项执行的函数,参数是当前遍历到的节点数据,如果返回 `Truthy` ,将返回该节点\n * @param {string} [childrenField='children'] 子级字段名,默认`children`\n * @returns {Object|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<T extends any, F extends (item: T) => boolean>(tree: T[], predicate: F, childrenField = 'children') {\n const stack: T[] = [];\n\n let node: T | undefined;\n\n if (isArray(tree)) {\n forEach(tree, (item) => {\n stack.push(item);\n\n while (stack.length) {\n const temp = stack.pop() as T;\n if (predicate(temp)) {\n node = temp;\n break;\n }\n\n if (isObject(temp)) {\n // @ts-ignore\n const childs = temp[childrenField] as T[];\n if (isArray(childs) && childs.length > 0) {\n childs.forEach((c) => {\n stack.push(c);\n });\n }\n }\n }\n\n if (node) {\n return false;\n }\n });\n }\n\n return node;\n}\n\nexport default findTreeNode;\n","import { forEach, isArray, isObject } from 'ut2';\n\n/**\n * 查找树结构数据多个节点\n *\n * @alias module:Tree.findTreeNodes\n * @since 4.15.0\n * @param {Object[]} tree 树结构数据\n * @param {function} predicate 遍历每一项执行的函数,参数是当前遍历到的节点数据,如果返回 Truthy ,返回结果将包含该节点\n * @param {string} [childrenField='children'] 子级字段名,默认`children`\n * @returns {Object[]}\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<T extends any, F extends (item: T) => boolean>(tree: T[], predicate: F, childrenField = 'children') {\n const stack: T[] = [];\n\n const nodes: T[] = [];\n\n if (isArray(tree)) {\n forEach(tree, (item) => {\n stack.push(item);\n\n while (stack.length) {\n const temp = stack.pop() as T;\n if (predicate(temp)) {\n nodes.push(temp);\n }\n\n if (isObject(temp)) {\n // @ts-ignore\n const childs = temp[childrenField] as T[];\n if (isArray(childs) && childs.length > 0) {\n childs.forEach((c) => {\n stack.push(c);\n });\n }\n }\n }\n });\n }\n\n return nodes;\n}\n\nexport default findTreeNodes;\n","import { toString } from 'ut2';\n\ntype Options = {\n spaceMark?: string;\n length?: number;\n};\n\n/**\n * 格式化银行卡号\n *\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] 间隔长度,默认`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 * // 自定义间隔符\n * formatBankCard('6228480402564890', {spaceMark: '-'}); // 6228-4804-0256-4890\n *\n */\nfunction formatBankCard(bankCardNo = '', options?: Options) {\n const { spaceMark = ' ', length = 4 } = options || {};\n\n const reg = new RegExp(`(.{${length}})`, 'g');\n const regChar = new RegExp(`${spaceMark}`, 'g');\n\n const realValue = toString(bankCardNo).replace(regChar, '');\n const str = realValue.replace(reg, `$1${spaceMark}`);\n\n return realValue.length % length === 0 ? str.substring(0, str.length - 1) : str;\n}\n\nexport default formatBankCard;\n","import { toString } from 'ut2';\n\ntype Options = {\n spaceMark?: string;\n};\n\n/**\n * 格式化手机号码\n *\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?: Options) {\n const { spaceMark = ' ' } = options || {};\n\n const regChar = new RegExp(spaceMark, 'g');\n const realValue = toString(mobileNo).replace(regChar, '').substring(0, 11);\n\n if (realValue.length > 7) {\n return realValue.replace(/^(...)(....)/g, `$1${spaceMark}$2${spaceMark}`);\n }\n if (realValue.length > 3) {\n return realValue.replace(/^(...)/g, `$1${spaceMark}`);\n }\n return realValue;\n}\n\nexport default formatMobile;\n","import { isNaN, isNumber, isString } from 'ut2';\nimport { checkBoundary, transformEffectiveNumber, trimLeftZero } from './utils/math.util';\nimport devWarn from './utils/devWarn';\nimport isValidNumber from './isValidNumber';\n\n/**\n * 检查数字或数字字符串\n *\n * @private\n * @param {string|number} [num]\n * @returns 是否为数字\n */\nfunction checkNumber(num?: string | number) {\n if (!isValidNumber(num)) {\n devWarn(`${num} invalid parameter.`);\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: string, thousand: string) {\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: string, precision: number, decimal: string) {\n if (precision === 0) {\n return '';\n }\n\n const zero = 0;\n let ret = '';\n\n if (decStr && Number(decStr) > 0) {\n const 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\ntype Options = {\n precision?: number;\n symbol?: string;\n thousand?: string;\n decimal?: string;\n strict?: boolean;\n};\n\n/**\n * 格式化金额\n *\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] 保留位数,默认`2`。最高`10`。\n * @param {string} [options.symbol] 货币符号\n * @param {string} [options.thousand=\",\"] 千分位符号, 默认`,`\n * @param {string} [options.decimal=\".\"] 小数位符号,默认`.`\n * @param {boolean} [options.strict=ture] 严格模式,默认`true`。开启后,只支持非空字符串和数字格式化,其他类型值如`null` `undefined` `true` `false`等将返回空字符串。\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?: string | number, options: Options = {}) => {\n let {\n precision = 2,\n symbol,\n thousand = ',',\n decimal = '.',\n // eslint-disable-next-line prefer-const\n strict = true\n } = options;\n\n // 数字参数不正确,返回空字符串\n if (!checkNumber(num) || (strict && (!isString(num) || num === '') && !isNumber(num))) {\n return '';\n }\n\n if (typeof num === 'number' && !isFinite(num)) {\n return num + '';\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 = transformEffectiveNumber(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 { round } from 'ut2';\nimport divide from './divide';\nimport gcd from './gcd';\nimport loadImageWithBlob from './loadImageWithBlob';\nimport bytesToSize from './bytesToSize';\n\n/**\n * 计算宽高比\n *\n * @private\n * @param {number} w 宽度\n * @param {number} h 高度\n * @returns {string} 宽高比\n */\nfunction calcContrast(w: number, h: number) {\n const n = gcd(w, h);\n return `${divide(round(w), n)}:${divide(round(h), n)}`;\n}\n\n/**\n * @typedef {Object} ImageInfo 图片信息\n * @property {number} width 宽度\n * @property {number} height 高度\n * @property {string} contrast 宽高比\n * @property {string} measure 尺寸\n * @property {string} size 大小\n * @property {number} bytes 大小,单位字节\n * @property {HTMLImageElement} image HTML图片元素\n * @property {Blob} blob 图片 Blob 对象\n */\n\n/**\n * 获取图片信息。\n *\n * <em style=\"font-weight: bold;\">注意:该方法仅适用于浏览器端。</em>\n *\n * @alias module:Browser.getImageInfo\n * @since 4.20.0\n * @param {string | Blob} img 图片地址或 blob 对象。\n * @param {AjaxOptions} [ajaxOptions] ajax 请求配置项,当传入的图片为字符串时才会触发请求。\n * @returns {Promise<ImageInfo>} 图片信息。\n * @example\n *\n * getImageInfo(file).then(imageInfo=>{\n * console.log(imageInfo);\n * // {\n * // width: 100,\n * // height: 100,\n * // contrast: '1:1',\n * // measure: '100 × 100 px',\n * // size: '11 B',\n * // bytes: 11,\n * // image: HTMLImageElement {},\n * // blob: Blob {}\n * // }\n * });\n *\n * getImageInfo('https://dummyimage.com/200x300').then(imageInfo=>{\n * // do something\n * });\n *\n * getImageInfo('data:image/png;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=').then(imageInfo=>{\n * // do something\n * });\n *\n */\nfunction getImageInfo(img: string | Blob, ajaxOptions?: Parameters<typeof loadImageWithBlob>[1]) {\n return loadImageWithBlob(img, ajaxOptions).then(({ image, blob }) => {\n const { width, height } = image;\n return {\n width,\n height,\n contrast: calcContrast(width, height),\n measure: `${width} × ${height} px`,\n size: bytesToSize(blob.size),\n bytes: blob.size,\n image,\n blob\n };\n });\n}\n\nexport default getImageInfo;\n","/**\n * 注入样式。\n *\n * @alias module:Browser.injectStyle\n * @since 5.3.0\n * @param {string} css 样式内容。\n * @param {Object} [options] 配置项。\n * @param {HTMLElement} [options.container=document.head] 要注入样式的容器。默认 `document.head`。如果 `document.head` 不存在,默认 `document.body`。\n * @param {'top' | 'bottom'} [options.insertAt='top'] 注入容器内容前面还是后面。默认 `top`。\n * @param {Function} [options.onBefore] 注入样式前的回调方法。\n * @returns {HTMLStyleElement} `style` 元素。\n * @example\n * const css1 = 'body { background-color: red; }';\n * injectStyle(css1);\n *\n * // 自定义配置\n * const css2 = 'p { margin: 10px; } a { color: blue; }';\n * injectStyle(css2, {\n * container: document.body,\n * insertAt: 'bottom',\n * onBefore(style){\n * style.nonce = '...';\n * }\n * });\n */\nfunction injectStyle(\n css: string,\n options?: {\n container?: HTMLElement;\n insertAt?: 'top' | 'bottom';\n onBefore?: (style: HTMLStyleElement) => void;\n }\n) {\n const { container = document.head || document.getElementsByTagName('head')[0] || document.body, insertAt = 'top', onBefore } = options || {};\n const style = document.createElement('style');\n\n // IE\n // @ts-ignore\n if (style.styleSheet) {\n // @ts-ignore\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n\n if (typeof onBefore === 'function') {\n onBefore(style);\n }\n\n const atTop = insertAt === 'top';\n\n if (atTop && container.prepend) {\n container.prepend(style);\n } else if (atTop && container.firstChild) {\n container.insertBefore(style, container.firstChild);\n } else {\n container.appendChild(style);\n }\n return style;\n}\n\nexport default injectStyle;\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 * @alias module:Validator.isPassword\n * @requires module:Validator.validatePassword\n * @since 1.1.0\n * @see {@link https://baike.baidu.com/item/ASCII#3 ASCII}\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {number} [options.level=2] 密码强度,默认`2`。`1`-包含一种字符 `2`-包含两种字符 `3`-包含三种字符。(大写字母、小写字母、数字、特殊字符)\n * @param {boolean} [options.ignoreCase=false] 是否忽略大小写,默认`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: any, options: Parameters<typeof validatePassword>[1] = {}) {\n const { level = 2, ignoreCase = false, special = '\\\\x21-\\\\x2F\\\\x3A-\\\\x40\\\\x5B-\\\\x60\\\\x7B-\\\\x7E' } = options;\n return validatePassword(value, { level, ignoreCase, special }).validated;\n}\n\nexport default isPassword;\n","import divide from './divide';\nimport times from './times';\nimport gcd from './gcd';\nimport { round } from 'ut2';\n\n/**\n * 最小公倍数。\n *\n * 遵循以下约定:\n *\n * 1. 如果参数中包含无效数值,返回 `NaN` 。\n * 2. 如果只有一个参数,另一个参数默认为 `1` 。\n * 3. 如果全部参数都为 `0` ,返回 `NaN` 。因为作为除数的最大公约数为 `0` ,结果为 `NaN` 。\n * 4. 如果全部参数都为 `Infinity` ,返回 `NaN` 。因为除数和被除数都是 `Infinity` ,结果为 `NaN` 。\n * 5. 如果参数包含 `0` ,返回 `0` 。\n * 6. 如果参数为负数,将转为绝对值的正数。\n * 7. 如果参数包含小数点,将转为四舍五入的整数。\n *\n * @alias module:Math.lcm\n * @since 4.20.0\n * @see {@link https://baike.baidu.com/item/最小公倍数 最小公倍数}\n * @param {...(number|string)} nums 两个或多个整数。\n * @returns {number} 最小公倍数。\n * @example\n *\n * lcm(3, 4); // 12\n * lcm(8, 4); // 8\n * lcm(2, 4, 8); // 32\n * lcm('foo', 'bar'); // NaN\n * lcm(0, 10); // 0\n * lcm(2.3, 3.8, 8, -10); // 320\n *\n */\nfunction lcm(...nums: (string | number)[]): number {\n let args = nums.map((item) => Math.abs(round(item as number)));\n if (args.length === 1) {\n args = args.concat([1]);\n }\n const product = args.indexOf(0) > -1 ? 0 : times(...args);\n return divide(product, gcd(...args));\n}\n\nexport default lcm;\n","import { objectKeys } from './utils/native';\n\ntype ScriptAttribute = Pick<HTMLScriptElement, 'async' | 'crossOrigin' | 'defer' | 'integrity' | 'noModule' | 'referrerPolicy' | 'text' | 'type' | 'onload' | 'onerror' | 'id' | 'className'> & {\n attrs: Record<string, string>;\n destroyOnError: boolean;\n};\n\n/**\n * 加载 js 文件。\n *\n * <em style=\"font-weight: bold;\">注意:该方法仅适用于浏览器端。</em>\n *\n * @alias module:Browser.loadScript\n * @since 4.19.0\n * @param {string} src js 地址。\n * @param {Object} [options] script 标签属性。比如 `defer` `onload` `onerror` `id` 等,下面列举部分带有默认值或额外扩展的配置。\n * @param {boolean} [options.destroyOnError=true] 如果加载失败或错误,自动删除 dom 中的 script 标签。默认`true`\n * @param {Object} [options.attrs] 自定义 script 属性,通过 script.setAttribute 设置。\n * @param {boolean} [options.async=true] 异步加载。默认`true`\n * @param {string} [options.type='text/javascript'] 类型。默认`text/javascript`\n * @return {Promise<HTMLScriptElement>} 异步返回 script 元素。\n * @example\n *\n * loadScript('some.js').then(script=>{\n * // do something\n * })\n *\n * loadScript('some.js', { id: 'xxx', async: false, attrs: { foo: 'bar' } }).then(script=>{\n * // do something\n * })\n *\n */\nfunction loadScript(src: string, options?: Partial<ScriptAttribute>) {\n return new Promise<HTMLScriptElement>((resolve, reject) => {\n const container = document.head || document.getElementsByTagName('head')[0] || document.body;\n const script = document.createElement('script');\n\n const { attrs, destroyOnError = true, ...restOptions } = options || {};\n\n const props: Partial<HTMLScriptElement> = {\n async: true,\n type: 'text/javascript',\n ...restOptions,\n src\n };\n\n for (const key in props) {\n if (key === 'onload' || key === 'onerror') {\n continue;\n }\n // @ts-ignore\n script[key] = props[key as keyof ScriptAttribute];\n }\n\n if (typeof attrs === 'object') {\n objectKeys(attrs).forEach((key) => {\n script.setAttribute(key, attrs[key]);\n });\n }\n\n script.onload = function (ev: Event) {\n this.onerror = this.onload = null;\n props.onload?.call(this, ev);\n resolve(script);\n };\n\n script.onerror = function (ev: Event | string) {\n this.onerror = this.onload = null;\n props.onerror?.call(this, ev);\n if (destroyOnError) {\n container.removeChild(script);\n }\n reject(new URIError('Failed to load ' + this.src));\n };\n\n container.appendChild(script);\n });\n}\n\nexport default loadScript;\n","import { isNaN } from 'ut2';\nimport { digitLength, transformEffectiveNumber } from './utils/math.util';\nimport times from './times';\n\n/**\n * 精确减法,支持多个数相减,减数默认为 0 。\n *\n * @alias module:Math.minus\n * @since 3.1.0\n * @param {...(number|string)} nums 相减的数\n * @returns {number} 差\n * @example\n *\n * minus(1); // 1\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: (string | number)[]): number {\n // eslint-disable-next-line prefer-const\n // let [num1, num2 = 0, ...rest] = nums;\n\n let num1 = nums[0];\n let num2 = nums[1] === void 0 ? 0 : nums[1];\n const rest = nums.slice(2);\n\n if (rest.length > 0) {\n // return minus(minus(num1, num2), ...rest);\n\n // eslint-disable-next-line prefer-spread\n return minus.apply(void 0, [minus(num1, num2)].concat(rest as number[]));\n }\n\n num1 = transformEffectiveNumber(num1);\n num2 = transformEffectiveNumber(num2);\n\n // 兼容处理,如果参数包含无效数值时,返回 NaN\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 { toString } from 'ut2';\n\n/**\n * 前置补零\n *\n * @alias module:Processor.padZero\n * @since 4.7.0\n * @param {string|number} value 要处理的值\n * @param {number} [size=2] 指定字符串长度,默认`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: string | number, size = 2) {\n const str = toString(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 { isNaN } from 'ut2';\nimport { digitLength, transformEffectiveNumber } from './utils/math.util';\nimport times from './times';\n\n/**\n * 精确加法,支持多个数相加,加数默认为 0 。\n *\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.1\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: (string | number)[]): number {\n // eslint-disable-next-line prefer-const\n // let [num1, num2 = 0, ...rest] = nums;\n\n let num1 = nums[0];\n let num2 = nums[1] === void 0 ? 0 : nums[1];\n const rest = nums.slice(2);\n\n if (rest.length > 0) {\n // return plus(plus(num1, num2), ...rest);\n\n // eslint-disable-next-line prefer-spread\n return plus.apply(void 0, [plus(num1, num2)].concat(rest as number[]));\n }\n\n num1 = transformEffectiveNumber(num1);\n num2 = transformEffectiveNumber(num2);\n\n // 兼容处理,如果参数包含无效数值时,返回 NaN\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 { toString } from 'ut2';\n\ntype Options = {\n start?: number;\n end?: number;\n char?: string;\n repeat?: number;\n exclude?: string;\n};\n\n/**\n * 替换字符,应用场景如:脱敏\n *\n * @alias module:Processor.replaceChar\n * @since 1.1.0\n * @param {string} str 要处理的字符串\n * @param {Object} [options] 配置项\n * @param {number} [options.start=3] 开始位置,默认`3`\n * @param {number} [options.end=-4] 结束位置,默认`-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 * // 手机号 前2后4\n * replaceChar('13000000000', { start: 2 }); // 13*****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 *\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 *\n * // 银行卡号 前6后4\n * replaceChar('6228480402564890018', { start: 6, end: -4 }); // 622848*********0018\n *\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: -1, repeat: 1 }); // 林*某\n *\n */\nfunction replaceChar(str = '', options: Options = {}) {\n const { char = '*', exclude } = options;\n let { start = 3, end = -4, repeat } = options;\n\n const realStr = toString(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 { round } from 'ut2';\n\n/**\n * 四舍五入,支持设置精度\n *\n * @alias module:Math.round\n * @since 3.1.0\n * @param {number|string} num 要四舍五入的数字\n * @param {number} [precision=0] 四舍五入的精度,默认`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: string | number, precision = 0) {\n return round(num as number, precision);\n}\n\nexport default _round;\n","interface SafeDate {\n (): Date;\n (value: number | string | Date): Date;\n (year: number, monthIndex: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): 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>\n *\n * 规避了苹果设备浏览器不支持部分格式(例如,YYYY-MM-DD HH-mm 或 YYYY.MM.DD)。\n *\n * 如果参数为 undefined 正常返回 Date 。\n *\n * @function\n * @alias module:Processor.safeDate\n * @since 4.4.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date Date}\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 */\nconst safeDate: SafeDate = function (value?: number | string | Date, ...args: any[]) {\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 标识。\n *\n * 如果你需要获取DataURL 的 MIME 类型和数据本身,推荐使用 <a href=\"https://www.npmjs.com/package/data-urls\">data-urls</a>。\n *\n * @alias module:Processor.setDataURLPrefix\n * @since 4.1.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/URI/Schemes/data Data URLs}\n * @see {@link https://www.iana.org/assignments/media-types/media-types.xhtml Media Types}\n * @param {string} data 数据本身\n * @param {string} [mimeType=\"image/png\"] MIME 类型,默认`image/png`\n * @param {boolean} [base64=true] 添加 base64 标识,默认`true`\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: string, mimeType = 'image/png', base64 = true) {\n return `data:${mimeType}${base64 ? ';base64' : ''},${data}`;\n}\n\nexport default setDataURLPrefix;\n","import { toString } from 'ut2';\n\n/**\n * 获取字符长度。中文汉字占2个字符,英文占1个字符,特殊如emoji占4个字符。\n *\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: string) {\n const realStr = toString(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","import { isArray, isObject } from 'ut2';\nimport { objectKeys } from './utils/native';\n\ntype NodeAssign = 'spread' | 'self';\n\n// 交换字段名\ntype ExchangeFieldNames<D extends any, F extends Record<string, keyof D>> = Omit<D, F[keyof F]> & {\n [P in keyof F]: D[F[P]];\n};\n\n// 交换字段名,支持嵌套\n// 先排除子级字段名,再交换字段名,然后加上子级字段名,再替换一次。\ntype TransformFieldNames<D extends any, F extends Record<string, any>, C extends string> = (C extends keyof D ? ExchangeFieldNames<Omit<D, C> & Record<C, TransformFieldNames<D, F, C>>, F> : ExchangeFieldNames<D, F>)[];\n\n/**\n * 转换字段名,返回一个转换字段后的值,不改变原值。\n *\n * @alias module:Tree.transformFieldNames\n * @since 4.14.0\n * @param {Object[]} data 对象数组。如果是树结构数据,需要指定第三个参数 childrenField\n * @param {Object} fieldNames 字段名映射\n * @param {string} [childrenField] 子级数据字段名\n * @param {'spread'|'self'} [nodeAssign='spread'] 节点赋值方式,默认`spread`。`spread`表示使用展开运算符创建新值,`self`表示使用自身对象。\n * @returns {Object[]}\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<D extends any, F extends Record<string, keyof D>, C extends string>(data: D[], fieldNames: F, childrenField?: C, nodeAssign: NodeAssign = 'spread'): TransformFieldNames<D, F, C> {\n if (!isArray(data)) {\n return data;\n }\n\n if (data.length <= 0) {\n return [];\n }\n\n // 递归处理字段名\n function recusion(arr: object[]) {\n return arr.map((item) => {\n if (!isObject(item)) {\n return item;\n }\n\n const newItem = nodeAssign === 'spread' ? { ...item } : item;\n const delKeys: string[] = [];\n\n // 树形数据子节点\n // @ts-ignore\n if (childrenField && isArray(newItem[childrenField]) && newItem[childrenField].length > 0) {\n // @ts-ignore\n newItem[childrenField] = recusion(newItem[childrenField].slice());\n }\n\n const newKeys = objectKeys(fieldNames);\n\n // 替换字段名\n newKeys.forEach((newKey) => {\n const oldKey = fieldNames[newKey];\n if (oldKey in newItem) {\n // @ts-ignore\n newItem[newKey] = newItem[oldKey];\n\n // @ts-ignore\n if (newKeys.indexOf(oldKey) === -1) {\n // @ts-ignore\n delKeys.push(oldKey);\n }\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;\n","import { isArray, isObject } from 'ut2';\n\n/**\n * 树结构转列表数据\n *\n * @alias module:Tree.treeToList\n * @since 4.14.0\n * @param {Object[]} tree 树结构数据\n * @param {string} childrenField 子级字段名称\n * @returns {Object[]} 列表数据\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<T extends Record<string, any>, K extends keyof T, R extends Omit<T, K>>(tree: T[], childrenField: K) {\n const list: R[] = [];\n\n if (!isArray(tree)) {\n return list;\n }\n\n // 递归遍历\n function recusion(arr: T[]) {\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 (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 (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"],"names":["nativeUndefined","stringUndefined","stringObject","objectProto","Object","prototype","objectProtoToString","toString","objectProtoHasOwnProperty","hasOwnProperty","objectProtoPropertyIsEnumerable","propertyIsEnumerable","objectGetOwnPropertySymbols","getOwnPropertySymbols","objectGetPrototypeOf","getPrototypeOf","objectKeys","keys","functionProtoToString","Function","symbolProto","Symbol","mathMin","Math","min","mathMax","max","mathRandom","random","mathFloor","floor","mathCeil","ceil","numberIsFinite","Number","isFinite","globalThisExisted","globalThis","globalExisted","global","selfExisted","self","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","tagPrefix","numberTag","stringTag","symbolTag","functionTags","map","item","blobTag","fileTag","objectTag","isArray","value","Array","isObjectLike","isObject","getTag","call","isSymbol","reIsBinary","reIsOctal","reIsBadHex","toNumber","NaN","trim","isBinary","test","parseInt","slice","identity","isArrayLike","isLength","length","tag","some","isFunction","toFinite","Infinity","randomInt","lower","upper","temp","allKeys","object","concat","filter","getSymbols","dir","forEach","collection","iteratee","_keys","len","i","currentKey","isNumber","symbolToString","baseToString","result","isNil","blobExisted","Blob","isBlob","objectCtorString","isPlainObject","proto","Ctor","constructor","fileExisted","File","freeGlobalThis","freeGlobal","freeSelf","root","isNaN","isPromiseLike","then","isString","decimalAdjust","type","precision","func","remainder","toInteger","pair","split","round","number","extendStatics","d","b","setPrototypeOf","__proto__","p","__assign","assign","t","s","n","arguments","apply","this","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","e","rejected","done","__generator","body","f","y","_","label","sent","trys","ops","g","create","Iterator","verb","iterator","v","op","TypeError","pop","push","__read","o","m","r","ar","error","__spreadArray","to","from","pack","l","SuppressedError","tryit","fn","args","_i","res","catch","err","reg","regIdCard","regLoose","sumCheckCode","numStr","numArr","replace","reverse","sum","currNum","mod","isBankCard","options","_a","loose","_b","luhn","valueStr","validateResult","precode","substring","String","baseReg","baseCodeArr","preCode","total","index","findIndex","wf","pow","isUnifiedIdentifier","checkCode","needCheckCode","passBaseRule","isSocialCreditCode","config","disableWarning","devWarn","console","warn","regNumber","regLowerCaseLetter","regUpperCaseLetter","regAllNumberAndLetter","hasHex","val","indexOf","validatePassword","level","ignoreCase","_c","special","valStr","currentLevel","containesNumber","containesLowerCaseLetter","containesUpperCaseLetter","containesSpecialCharacter","chars","specialChars","regChars","RegExp","ret","charItem","hasSpecialCharacter","containesUnallowableCharacter","hasUnallowableCharacter","validated","containes","lowerCaseLetter","upperCaseLetter","specialCharacter","unallowableCharacter","URLExisted","URL","objectValues","values","createObjectURL","revokeObjectURL","chineseDictionary","chineseBasic","chineseExtend","chineseExtend2","chineseExtendA","chineseExtendB","chineseExtendC","chineseExtendD","chineseExtendE","chineseExtendF","chineseExtendG","chineseExtendH","chineseExtendI","looseChineseRegExp","chineseRegExp","chineseWithExtend","join","looseChineseExtendRegExp","chineseExtendRegExp","supportRegExpUnicode","serverReg","portReg","pathReg","searchReg","regWithProtocal","regNonProtocal","isUrl","pj","j","sj10","isBusinessLicense","lastCode","regHMCard","regTWCard","singleRegTWCard","isValidNumber","strict","radixReg","dotNumberStringReg","transformEffectiveNumber","strip","num","parseFloat","toPrecision","digitLength","eSplit","float2Fixed","strNum","isScientificNumber","dLen","checkBoundary","numberChar","unitChar","unitSection","chnNumberChar","chnUnitChar","big5NumberChar","big5UnitChar","sectionToChinese","section","str","chnstr","zero","unitPos","mapNumberChar","bytesToSize","bytes","spaceMark","numBytes","sizes","log","toFixed","Provinces","transformObjectValue","data","deep","result_1","key","newValue","result_2","times","nums","num1","num2","rest","num1Changed","num2Changed","baseNum","leftValue","divide","gcd","abs","ajax","url","method","timeout","headers","_d","withCredentials","_e","async","_f","user","_g","password","responseType","onReadyStateChange","onLoadStart","onProgress","onAbort","onTimeout","onError","onLoad","onLoadEnd","xhr","XMLHttpRequest","open","toLowerCase","onreadystatechange","setRequestHeader","cb","wrapError","events","loadstart","progress","abort","load","loadend","addEventListener","send","isUploadFile","fileObj","name","getExtname","path","array","checkFileType","file","accept","isFileType","isFile","types","fileName","originFileObj","fileType","fileUrl","includes","match","fileParentType","SuccessResponseStatus","getFileBlob","ajaxOptions","ev","responseStatus","target","status","response","Error","loadImage","img","imgIsBlob","image","Image","crossOrigin","onload","onerror","src","loadImageWithBlob","blob","dataURLToBlob","parts","meta","bstr","atob","decodeURIComponent","u8arr","Uint8Array","charCodeAt","saver","blobUrl","anchor","document","createElement","href","style","display","setAttribute","handleClick","stopPropagation","removeEventListener","appendChild","click","removeChild","FileReaderMethodMap","arrayBuffer","binaryString","dataURL","text","audio","video","pdf","word","excel","mimeTypes","letter","toUpperCase","allChars","internalRandomString","pool","prefix","processEmptyChildren","arr","childrenField","emptyChildrenValue","internalFindTreeSelect","tree","predicate","childs","findChildren","EmitterPro","handlers","eventNames","symbols","rawListeners","eventName","handler","raw","listeners","wrap","hasListener","listener","_on","context","currentListener","appendMethod","prependListener","on","_wrapOnce","_this","off","once","prependOnceListener","splice","offAll","emit","cache","MemoryStorage","scope","getItem","setItem","removeItem","clear","isStorageSupported","storage","isSupport","Date","getTime","Storage","isSupported","needParsed","memoryScope","getKey","get","reviver","JSON","parse","set","replacer","stringify","del","defaultNamespace","Cache","_super","namespace","opts","ns","stdTTL","maxStrategy","checkperiod","cacheKey","startCheckperiod","__","__extends","_check","now","_wrap","ttl","currentTtl","_isLimited","_getReplaceKey","cacheValues","retkey","defineProperty","enumerable","configurable","setCacheValues","mget","getAll","validKeys","replaceKey","mset","keyValueSet","itemSetResult","count","oldData","has","take","getTtl","getLastModified","clearTimeout","_checkTimeout","setTimeout","stopCheckperiod","Emitter","AsyncMemo","promiseCache","run","asyncFn","persisted","prevPos","prevCtrlValue","rawValue","ctrlValue","placeholderChar","maskReg","realCtrlValue","realRawValue","placeholderChars","editLength","pos","ctrlCharCount","placeholderCharCount","charAt","width","height","rotate","offset","background","canvasWidth","canvasHeight","format","quality","beforeCompress","beforeDraw","afterDraw","numWidth","numHeight","numQuality","canvas","ctx","getContext","info","numCanvasWidth","numCanvasHeight","bgIsTransparent","clearRect","fillStyle","fillRect","internalOffset","translate","PI","outOffset","dx","dy","drawImage","globalCompositeOperation","toBlob","canvasToBlob","toDataURL","download","dataType","transformRequest","transformResponse","payload","asyncTransformResponse","tempRes","tempOptions","asyncTransformRequest","currentFileName","navigator","msSaveBlob","reader","FileReader","filterTree","nodeAssign","newItem","node","stack","c","nodes","bankCardNo","regChar","realValue","mobileNo","symbol","thousand","decimal","checkNumber","intStr","decStr","txt","exec","negativeSymbol","reArr","formatInt","formatDec","w","h","contrast","measure","size","ext","find","css","container","head","getElementsByTagName","insertAt","onBefore","styleSheet","cssText","createTextNode","atTop","prepend","firstChild","insertBefore","useExtend","hasExtend","id","check","list","keyField","parentField","record","pid","script","attrs","destroyOnError","restOptions","__rest","props","URIError","minus","big5","unit","negative","unitConfig","unitWan","unitYi","chnInteger","preStr","numAbs","numInt","strIns","chnStr","needZero","convertInteger","chnDecimal","convertDecimal","repeat","origin","province","city","area","year","month","day","gender","birthday","plus","_pool","char","exclude","start","end","realStr","strLen","middleStr","safeValue","bind","mimeType","base64","bool","fieldNames","recusion","delKeys","newKeys","newKey","oldKey","delKey"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,49,51,72,86,87]}