@lntvow/utils 3.2.5 → 3.2.6
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.
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/utils/code.ts","../src/utils/compose.ts","../src/utils/debounce.ts","../src/utils/type.ts","../src/utils/deepClone.ts","../src/utils/error.ts","../src/utils/deepMerge.ts","../src/utils/qs.ts","../src/utils/throttle.ts","../src/utils/validator.ts","../src/Array22231312/castArray.ts","../src/Object23312/compareProperties.ts","../src/Object23312/propertyManipulation.ts","../src/random/generateRandomArray.ts","../src/random/generateRandomColor.ts","../src/random/generateRandomDate.ts","../src/random/generateRandomInteger.ts","../src/random/generateRandomString.ts","../src/random/getRandomItem.ts","../src/random/generateRandomEmail.ts","../src/random/generateRandomFloat.ts","../src/random/generateRandomStringFromSource.ts","../src/random/generateRandomIdCard.ts","../src/random/generateRandomMobilePhone.ts","../src/random/generateRandomUrl.ts","../src/validator/aphabet.ts","../src/validator/float.ts","../src/validator/integer.ts","../src/validator/utils.ts"],"sourcesContent":["export * from './Array22231312'\n\nexport * from './Object23312'\n\nexport * from './random'\n\nexport * from './utils'\n\nexport * from './validator'\n","/**\n * 十进制转二进制\n * @example decimalToBinary(233) => '11101001'\n */\nexport function decimalToBinary(decNumber: number): string {\n const stack = []\n let remainder\n let binaryString = ''\n\n while (decNumber > 0) {\n remainder = Math.floor(decNumber % 2)\n stack.push(remainder)\n decNumber = Math.floor(decNumber / 2)\n }\n\n while (stack.length > 0) {\n binaryString += stack.pop()!.toString()\n }\n\n return binaryString\n}\n\nconst BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n\n/**\n * Base64 编码\n * @example base64Encode('hello') => 'aGVsbG8='\n */\nexport function base64Encode(str: string): string {\n let result = ''\n let bin = ''\n\n for (let i = 0; i < str.length; i++) {\n bin += str[i].charCodeAt(0).toString(2).padStart(8, '0')\n }\n\n for (let i = 0; i < bin.length; i += 6) {\n result += BASE64_CHARS[parseInt(bin.slice(i, i + 6).padEnd(6, '0'), 2)]\n }\n\n const padding = result.length % 4\n if (padding !== 0) result += '='.repeat(4 - padding)\n\n return result\n}\n\n/**\n * Base64 解码\n * @example base64Decode('aGVsbG8=') => 'hello'\n */\nexport function base64Decode(str: string): string {\n let result = ''\n let bin = ''\n\n for (let i = 0; i < str.length; i++) {\n if (str[i] === '=') break\n bin += BASE64_CHARS.indexOf(str[i]).toString(2).padStart(6, '0')\n }\n\n for (let i = 0; i < bin.length; i += 8) {\n const binary = parseInt(bin.slice(i, i + 8), 2)\n if (binary) {\n result += String.fromCharCode(binary)\n }\n }\n\n return result\n}\n","/**\n * compose\n * @param fns 任意函数\n */\nexport function compose(...fns: ((...args: any[]) => any)[]) {\n return fns.reduce(\n (previous, current) =>\n function (...args) {\n return current(previous(...args))\n }\n )\n}\n\n/**\n * compose 从右到左\n * @param fns 任意函数\n */\nexport function composeRight(...fns: ((...args: any[]) => any)[]) {\n return fns.reduce(\n (previous, current) =>\n function (...args) {\n return previous(current(...args))\n }\n )\n}\n","/**\n * 防抖函数\n * @param target 目标函数\n * @param wait 等待时间 默认 500ms\n * @example debounce(() => console.log('debounce'), 500)\n */\nexport function debounce(target: Function, wait = 500) {\n let timer: number | null = null\n\n return function (...args: any[]) {\n if (timer) clearTimeout(timer)\n timer = setTimeout(() => {\n target.apply(this, args)\n }, wait) as any\n }\n}\n","/* eslint-disable no-console */\n\n/* eslint-disable ts/ban-types */\nexport type AnyObject = Record<string, any>\n\nexport type ArrayItem<T> = T extends (infer U)[] ? U : never\n\nexport const objectToString = Object.prototype.toString\n\nexport const toTypeString = (value: unknown): string => objectToString.call(value)\n\nlet logCb: Function | null = null\n\nexport function initLog(cb: Function) {\n if (isFunction(cb)) {\n logCb = cb\n }\n}\n\nconst origConsole = (type: 'info' | 'warn' | 'error', name: unknown, ...arg: unknown[]) => {\n if (!name) return\n const context = arg.length === 0 ? '' : arg.length === 1 ? arg[0] : arg\n\n console[type](`[Log] ${name}:`, context)\n}\n\nexport const log = (name: unknown, ...arg: unknown[]) => {\n origConsole('info', name, ...arg)\n}\n\nlog.info = (name: unknown, ...arg: unknown[]) => {\n origConsole('info', name, ...arg)\n}\n\nlog.error = (name: unknown, ...arg: unknown[]) => {\n origConsole('error', name, ...arg)\n}\n\nlog.warn = (name: unknown, ...arg: unknown[]) => {\n origConsole('warn', name, ...arg)\n}\n\nexport const warn = (...arg: unknown[]) => console.warn(...arg)\n\nexport const error = (...arg: unknown[]) => console.error(...arg)\n\nexport const isMap = (val: unknown): val is Map<any, any> => toTypeString(val) === '[object Map]'\n\nexport const isSet = (val: unknown): val is Set<any> => toTypeString(val) === '[object Set]'\n\nexport const isDate = (val: unknown): val is Date => toTypeString(val) === '[object Date]'\n\nexport const isRegExp = (val: unknown): val is RegExp => toTypeString(val) === '[object RegExp]'\n\nexport const isFunction = (val: unknown): val is Function => typeof val === 'function'\n\nexport const isNumber = (val: unknown): val is number => typeof val === 'number'\n\nexport const isString = (val: unknown): val is string => typeof val === 'string'\n\nexport const isSymbol = (val: unknown): val is symbol => typeof val === 'symbol'\n\nexport const isObject = (val: unknown): val is Record<any, any> => val !== null && typeof val === 'object'\n\nexport const isPromise = <T = any>(val: unknown): val is Promise<T> =>\n isObject(val) && isFunction(val.then) && isFunction(val.catch)\n\nexport const isUndef = (val: unknown): val is undefined | null => val === undefined || val === null\n\nexport const isUndefined = (val: unknown): val is undefined => val === undefined\n\nexport const isNull = (val: unknown): val is null => val === null\n\nexport const isDef = <T>(val: T): val is NonNullable<T> => val !== undefined && val !== null\n\nexport const isBoolean = (val: unknown): val is boolean => typeof val === 'boolean'\n\nexport const isArray = Array.isArray\n\nexport const hasOwn = <T extends object, U extends keyof T>(target: T, key: U) => Object.hasOwn(target, key)\n\nexport const hasChanged = (oldValue: unknown, newValue: unknown) => oldValue !== newValue\n\nexport type Arrayable<T> = T | T[]\n\n// export function isMobilePhone() {\n// if (\n// navigator.userAgent.indexOf('Mobile') > -1 ||\n// navigator.userAgent.indexOf('Android') > -1 ||\n// navigator.userAgent.indexOf('iPhone') > -1 ||\n// navigator.userAgent.indexOf('iPad') > -1 ||\n// navigator.userAgent.indexOf('Windows Phone') > -1 ||\n// navigator.userAgent.indexOf('BlackBerry') > -1 ||\n// navigator.userAgent.indexOf('Symbian') > -1\n// ) {\n// return true\n// }\n// return false\n// }\n","import { hasOwn, isArray, isDate, isObject, isRegExp } from './type'\n\n/**\n * 深拷贝\n * @param target 拷贝对象\n * @example deepClone({ name: 1, obj: { name: 1 }, arr: [1, 2, 3] }) => { name: 1, obj: { name: 1 }, arr: [1, 2, 3] }\n */\nexport function deepClone<T>(target: T): T {\n const map = new WeakMap()\n\n function _deepClone(value: any) {\n if (isDate(value)) return new Date(value)\n if (isRegExp(value)) return new RegExp(value)\n\n if (isObject(value)) {\n // 取出 WeakMap 中缓存的 clone 对象\n if (map.has(value)) return map.get(value)\n let clone: Record<any, any> = {}\n\n // 处理数组\n if (isArray(value)) {\n clone = []\n map.set(value, clone)\n for (let i = 0; i < value.length; i++) {\n clone[i] = _deepClone(value[i])\n }\n\n return clone\n }\n\n // 设置缓存\n map.set(value, clone)\n\n for (const key in value) {\n if (hasOwn(value, key)) {\n clone[key] = _deepClone(value[key])\n }\n }\n\n return clone\n }\n return value\n }\n\n return _deepClone(target)\n}\n","import { isString } from './type'\n\nclass LntvowError extends Error {\n constructor(m: string) {\n super(m)\n this.name = 'LntvowError'\n }\n}\n\nexport function throwError(scope: string, message: string) {\n throw new LntvowError(`[${scope}] ${message}`)\n}\n\nexport function debugWarn(err: Error): void\n\nexport function debugWarn(scope: string, message: string): void\n\nexport function debugWarn(scope: string | Error, message?: string) {\n if (process.env.NODE_ENV !== 'production') {\n const error: Error = isString(scope) ? new LntvowError(`[${scope}] ${message}`) : scope\n\n console.warn(error)\n }\n}\n\nexport const deprecated = ({\n from,\n replacement,\n version,\n type = 'API',\n}: {\n from: string\n replacement: string\n version: string\n type?: 'API'\n}) => {\n debugWarn(`${type}`, `${from} is about to be deprecated in version ${version}, please use ${replacement} instead.`)\n}\n","import { isArray, type AnyObject, isObject, isUndef } from './type'\nimport { deepClone as _deepClone } from './deepClone'\nimport { throwError } from './error'\n\ninterface DeepMergeOptions {\n /**\n * 是否开启深拷贝 默认开启\n * @default true\n */\n deepClone: boolean\n}\n\n/**\n * 深度合并两对象\n * @param template 模板对象 就是默认值\n * @param source 源对象 就是用户传入的值\n * @param options 配置对象\n * @example deepMerge({ name: 1, obj: { name: '默认' , text: '旧值' }, arr: [1, 2, 3] }, { name: 1, obj: { name: '修改', age: '新增' }, test: 'test' }) => { name: 1, obj: { name: '修改', text: '旧值', age: '新增' }, arr: [1, 2, 3], test: 'test' }\n */\n\nexport function deepMerge(template: AnyObject, source: AnyObject, options?: DeepMergeOptions): any {\n if (!isObject(template) || !isObject(source)) {\n throwError('deepMerge', 'template 和 source 必须是对象')\n }\n\n return isArray(template) ? arrayMerge(template, source, options) : mergeObject(template, source, options)\n}\n\nfunction mergeObject(template: AnyObject, source: AnyObject, options?: DeepMergeOptions) {\n const target = process(source, options)\n const templateKeys = Object.keys(template)\n templateKeys.forEach(key => {\n if (isUndef(source[key])) {\n target[key] = process(template[key], options)\n } else {\n target[key] =\n isObject(template[key]) && isObject(source[key])\n ? deepMerge(template[key], source[key], options)\n : process(source[key], options)\n }\n })\n\n return target\n}\n\n// 数组暂时没有深拷贝的需求\nfunction arrayMerge<T>(template: T[], source: AnyObject, options?: DeepMergeOptions) {\n if (isArray(source)) {\n const result = process(source, options)\n result.push(...process(template, options))\n\n return result\n }\n return process(template, options)\n}\n\nfunction process<T>(source: T, options?: DeepMergeOptions): T {\n const { deepClone = true } = options || {}\n\n return deepClone ? _deepClone(source) : source\n}\n","import { deepMerge } from './deepMerge'\nimport type { AnyObject } from './type'\n\n/**\n * 解析查询字符串\n * @param str 转换的字符串\n * @return 转换后的对象\n * @example\n * parse('a=1&b=2') => { a: '1', b: '2' }\n * parse('?a=1&b=2') => { a: '1', b: '2' }\n * parse('&a=1&b=2') => { a: '1', b: '2' }\n * parse('from=%E4%B8%AD%E5%9B%BD') => { from: '中国' }\n * parse('from=%E4%B8%AD%E5%9B%BD', { decode: false }) => { from: '%E4%B8%AD%E5%9B%BD' }\n */\nfunction parse(str: string, options?: ParseOptions) {\n const { decode } = deepMerge({ decode: true }, options || {}) as ParseOptions\n const result: Record<string, string> = {}\n str.startsWith('?') && (str = str.slice(1))\n str.includes('?') && (str = str.slice(str.indexOf('?') + 1))\n\n const pairs = str.split('&').filter(Boolean)\n\n for (const pair of pairs) {\n const [key, value] = pair.split('=')\n result[key] = decode ? decodeURIComponent(value) : value\n }\n\n return result\n}\n\n/**\n * 转换对象为查询字符串\n * @param obj 转换的对象\n * @return 转换后的字符串\n * @example\n * stringify({ a: '1', b: '2' }) => 'a=1&b=2'\n * stringify({ from: '中国' }) => 'from=%E4%B8%AD%E5%9B%BD'\n * stringify({ from: '中国' }, { encode: false }) => 'from=中国'\n */\nfunction stringify(obj: Record<string, any>, options?: StringifyOptions) {\n const { encode } = deepMerge({ encode: true }, options || {}) as StringifyOptions\n\n const pairs = []\n for (const key in obj) {\n const value = obj[key]\n pairs.push(`${key}=${encode ? encodeURIComponent(value) : value}`)\n }\n\n return pairs.join('&')\n}\n\n/**\n * url追加查询字符串\n * @param url url\n * @param obj 查询字符串对象\n * @return 追加后的url\n * @example\n * appendQueryString('https://www.baidu.com', { a: '1', b: '2' }) => 'https://www.baidu.com?a=1&b=2'\n * appendQueryString('/pages/index?id=10', { test:'23' }) => '/pages/index?id=10&test=23'\n */\nfunction appendQueryString(url: string, obj: AnyObject, options?: StringifyOptions) {\n const stringifyOptions = deepMerge({ encode: true }, options || {}) as StringifyOptions\n const query = stringify(obj, stringifyOptions)\n\n if (url.includes('?')) {\n return url.endsWith('?') || url.endsWith('&') ? `${url}${query}` : `${url}&${query}`\n }\n return `${url}?${query}`\n}\n\nexport const qs = {\n parse,\n stringify,\n appendQueryString,\n}\n\nexport interface ParseOptions {\n /**\n * 是否解码\n * @default true\n */\n decode?: boolean\n}\n\nexport interface StringifyOptions {\n /**\n * 是否编码\n * @default true\n */\n encode?: boolean\n}\n","/* eslint-disable no-invalid-this */\n/* eslint-disable ts/ban-types */\nimport { isUndef } from './type'\n\n/**\n * 节流函数\n * @param target 目标函数\n * @param wait 等待时间 默认 500ms\n * @example throttle(() => console.log('hello world'), 500)\n */\nexport function throttle(target: Function, wait = 500) {\n let timer: number | null = null\n\n return function (...args: any[]) {\n if (isUndef(timer)) {\n timer = Date.now()\n\n return target.apply(this, args)\n }\n const now = Date.now()\n if (now - timer >= wait) {\n timer = now\n\n return target.apply(this, args)\n }\n }\n}\n","import { deprecated } from './error'\nimport { isUndef } from './type'\n\n/**\n * 校验经纬度\n */\nexport function validatorLatitudeOrLongitude(value: string) {\n return /^-?\\d{1,3}\\.\\d{6}$/.test(value)\n}\n\n/**\n * 校验中文、字母、数字\n */\nexport function validatorChineseOrEnglishOrNumber(value: string) {\n return !isUndef(value) && /^[\\dA-Za-z\\u4E00-\\u9FA5]+$/.test(value)\n}\n\n/**\n * 校验中英文\n */\nexport function validatorChineseOrEnglish(value: string) {\n return !isUndef(value) && /^[A-Za-z\\u4E00-\\u9FA5]+$/.test(value)\n}\n\n/**\n * 校验大写字母、数字、特殊字符 特殊字符包括 !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\n */\nexport function validatorUppercaseOrNumbersOrSpecial(value: string) {\n return !isUndef(value) && /^[\\d!\"#$%&'()*+,./:;<=>?@A-Z[\\\\\\]^_`{|}~]+$/.test(value)\n}\n\n/**\n * 校验大写字母、数字、_\n */\nexport function validatorUppercaseOrNumbersOrUnderline(value: string) {\n return /^[\\dA-Z_]+$/.test(value)\n}\n\n/**\n * 校验是否为邮箱\n * @deprecated 使用 isEmail 代替\n */\nexport function validatorEmail(value: string) {\n deprecated({ from: 'validatorEmail', replacement: 'isEmail', version: '2.4.0' })\n\n return /^([\\w-])+@([\\w-])+(\\.[\\w-])+/.test(value)\n}\n","import { isArray } from '@/utils'\n\n/**\n * 将非数组转换为数组 如果是目标本就是数组则直接返回\n * @example castArray(1) => [1]\n */\nexport function castArray<T>(target: T | T[]): T[] {\n return isArray(target) ? target : [target]\n}\n","import { isObject, type AnyObject, isArray, throwError } from '../utils'\n\nexport function compareProperties(target: AnyObject, source: AnyObject) {\n if (!isObject(target) || !isObject(source)) {\n throwError('deepMerge', 'template 和 source 必须是对象')\n }\n\n return isArray(target) ? compareArray(target, source) : compareObject(target, source)\n}\n\nfunction compareObject(target: AnyObject, source: AnyObject) {\n const result = {} as AnyObject\n\n Object.keys(target).forEach(key => {\n const targetItem = target[key]\n const sourceItem = source[key]\n if (isObject(targetItem) && isObject(sourceItem)) {\n result[key] = compareObject(targetItem, sourceItem)\n } else if (!Object.is(targetItem, sourceItem)) {\n result[key] = sourceItem\n }\n })\n\n return result\n}\n\nfunction compareArray<T>(target: T[], source: AnyObject) {\n // if (isArray(source)) {\n // target.every((item, index) => {})\n // } else {\n // return source\n // }\n}\n","import { deepClone, type Arrayable, hasOwn, type AnyObject } from '../utils'\nimport { castArray } from '../Array22231312'\n\n/**\n * 排除对象中的某些属性\n * @param target 目标对象\n * @param properties 要排除的属性\n * @example excludeProperties({ a: 1, b: 2, c: 3 }, ['a', 'b']) => { c: 3 }\n */\nexport function excludeProperties<T extends AnyObject, K extends keyof T>(\n target: T,\n properties: Arrayable<K>\n): Omit<T, K> {\n const result = deepClone(target)\n const list = castArray(properties)\n list.forEach(property => {\n if (hasOwn(result, property)) {\n // eslint-disable-next-line ts/no-dynamic-delete\n delete result[property]\n }\n })\n\n return result\n}\n\n/**\n * 提取对象中的某些属性\n * @param target 目标对象\n * @param properties 要提取的属性\n * @example extractProperties({ a: 1, b: 2, c: 3 }, ['a', 'b']) => { a: 1, b: 2 }\n */\nexport function extractProperties<T extends AnyObject, K extends keyof T>(\n target: T,\n properties: Arrayable<K>\n): Pick<T, K> {\n const result = {} as Pick<T, K>\n const list = castArray(properties)\n\n list.forEach(property => {\n if (hasOwn(target, property)) {\n result[property] = target[property]\n }\n })\n\n return result\n}\n","import { isFunction, isNumber, throwError } from '@/utils'\n\n/**\n * 生成随机数组\n * @example generateRandomArray(4, () => 1) => [1, 1, 1, 1]\n * */\nexport function generateRandomArray<T>(num: number, cb: (item?: unknown, index?: number) => T): T[] {\n if (!isNumber(num) || num <= 0) {\n throwError('generateRandomArray', 'num 必须大于0')\n }\n if (!isFunction(cb)) {\n throwError('generateRandomArray', 'cb 必须是函数')\n }\n\n return Array.from({ length: num })\n .fill(0)\n .map((e, i) => cb(e, i))\n}\n","/**\n * 生成随机颜色\n * @example generateRandomColor() => '#f36a38'\n * */\nexport function generateRandomColor(): string {\n return `#${Math.random().toString(16).slice(2, 8).padEnd(6, '0')}`\n}\n","import dayjs, { extend } from 'dayjs'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\nimport { generateRandomInteger } from './generateRandomInteger'\nimport { throwError } from '@/utils'\n\nextend(customParseFormat)\n\n/**\n * 生成随机时间\n * @example generateRandomDate() => '2021-07-01 08:51:34'\n * */\n\nexport function generateRandomDate(options: GenerateRandomDate = {}): string {\n const {\n start = '1800-01-01 00:00:00',\n end = dayjs().format('YYYY-MM-DD HH:mm:ss'),\n format = 'YYYY-MM-DD HH:mm:ss',\n } = options\n\n if (!dayjs(start).isValid() || !dayjs(end).isValid()) {\n throwError('generateRandomDate', 'start end 参数必须是合法的时间格式')\n }\n\n const startYear = dayjs(start).year()\n const endYear = dayjs(end).year()\n\n const randomYear = generateRandomInteger({ min: startYear, max: endYear })\n const randomMonth = generateRandomInteger({ min: 1, max: 12 })\n const randomDay = generateRandomInteger({ min: 1, max: 31 })\n const randomHour = generateRandomInteger(23)\n const randomMinute = generateRandomInteger(59)\n const randomSecond = generateRandomInteger(59)\n\n const result = dayjs(`${randomYear}-${randomMonth}-${randomDay} ${randomHour}:${randomMinute}:${randomSecond}`)\n\n // 异常时间处理\n if (result.isBefore(dayjs(start)) || result.isAfter(dayjs(end))) {\n return generateRandomDate(options)\n }\n\n return result.format(format)\n}\n\ninterface GenerateRandomDate {\n /**\n * 开始时间\n * @default 1800-01-01 00:00:00\n */\n start?: string | Date\n\n /**\n * 结束时间\n * @default 当前时间\n */\n end?: string | Date\n\n /**\n * 时间格式\n * @default YYYY-MM-DD HH:mm:ss\n */\n format?: string\n}\n","import { isNumber, throwError } from '@/utils'\n\n/**\n * 生成范围内的随机整数\n * @example generateRandomInteger() => 217342\n * */\nexport function generateRandomInteger(options: GenerateRandomIntegerOptions = {}) {\n if (isNumber(options)) {\n options = { max: options }\n }\n\n const { min = 0, max = Number.MAX_SAFE_INTEGER } = options\n\n const effectiveMin = Math.ceil(min)\n const effectiveMax = Math.floor(max)\n\n if (effectiveMin === effectiveMax) {\n return effectiveMin\n }\n\n if (effectiveMax < effectiveMin) {\n if (max >= min) {\n throwError('generateRandomInteger', `未找到 ${min} 和 ${max} 之间的整数值`)\n }\n\n throwError('generateRandomInteger', `最大值 ${max} 应大于最小值 ${min}`)\n }\n\n return Math.floor(Math.random() * (effectiveMax - effectiveMin + 1) + effectiveMin)\n}\n\ntype GenerateRandomIntegerOptions =\n | number\n | {\n /**\n * 最大值\n * @default Number.MAX_SAFE_INTEGER\n */\n max?: number\n\n /**\n * 最小值\n * @default 0\n */\n min?: number\n }\n","import { castArray } from '..'\nimport { generateRandomInteger } from './generateRandomInteger'\nimport { isNumber, throwError, type Arrayable } from '@/utils'\n\nconst DEFAULT_MAX = 16\nconst DEFAULT_MIN = 1\n\n/**\n * 生成随机字符串 大小写字母和数字\n * @example generateRandomString() => 'lZtJqMl0dyTO3WDG'\n * */\nexport function generateRandomString(options: GenerateRandomStringOptions = {}): string {\n if (isNumber(options)) {\n options = { length: options }\n }\n\n const { lowerCase = true, upperCase = true, number = true, extra = [], length = DEFAULT_MAX } = options\n\n let generateRandomIntegerOptions = { max: DEFAULT_MAX, min: DEFAULT_MIN }\n if (isNumber(length)) {\n generateRandomIntegerOptions = { max: length, min: length }\n } else {\n generateRandomIntegerOptions = { ...generateRandomIntegerOptions, ...length }\n if (generateRandomIntegerOptions.min < DEFAULT_MIN) {\n throwError('generateRandomString', `length.min 必须大于等于${DEFAULT_MIN}`)\n }\n }\n\n if (!(lowerCase || upperCase || number)) {\n throwError('generateRandomString', 'lowerCase upperCase number 至少需要一个参数为true')\n }\n\n let characters = ''\n if (lowerCase) characters += 'abcdefghijklmnopqrstuvwxyz'\n if (upperCase) characters += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'\n if (number) characters += '0123456789'\n characters += castArray(extra)\n .flatMap(item => item.split(''))\n .join('')\n\n let result = ''\n const len = generateRandomInteger(generateRandomIntegerOptions)\n\n for (let i = 0; i < len; i++) {\n const randomIndex = Math.floor(Math.random() * characters.length)\n result += characters.charAt(randomIndex)\n }\n\n return result\n}\n\ntype GenerateRandomStringOptions =\n /**\n * 生成字符串的长度\n * @default 16\n */\n | number\n | {\n /**\n * 生成字符串的长度 若传递对象则生成 max 和 min 之间的随机长度\n */\n length?:\n | number\n | {\n /**\n * 最大值\n * @default 16\n */\n max?: number\n\n /**\n * 最小值\n * @default 1\n */\n min?: number\n }\n /**\n * 是否包含小写字母\n * @default true\n */\n lowerCase?: boolean\n /**\n * 是否包含大写字母\n * @default true\n */\n upperCase?: boolean\n /**\n * 是否包含数字\n * @default true\n */\n number?: boolean\n /**\n * 扩展字符\n * @default []\n * @example ['-', '_','@']\n */\n extra?: Arrayable<string>\n }\n","/**\n * 获取数组中的随机元素\n * @example getRandomItem([0, 1, 2, 3, 4]) => 2\n */\nexport function getRandomItem<T>(list: T[]): T {\n return list[Math.floor(Math.random() * list.length)]\n}\n","import { generateRandomInteger } from './generateRandomInteger'\nimport { generateRandomString } from './generateRandomString'\nimport { getRandomItem } from './getRandomItem'\n\n/**\n * 生成随机邮箱\n * @example generateRandomEmail() => lZtJqMl0dyTO3WDGzFDO@gmail.com\n */\nexport function generateRandomEmail(): string {\n const emailProviders = ['gmail.com', 'outlook.com.cn', 'example.com', 'qq.com', '163.com', 'test.com.cn']\n\n const result = `${generateRandomString(1)}${generateRandomString({\n length: generateRandomInteger({ max: 30, min: 1 }),\n extra: ['.', '_', '-'],\n })}${generateRandomString(1)}@${getRandomItem(emailProviders)}`\n\n // 异常邮箱处理\n if (/\\.{2,}/.test(result)) {\n return generateRandomEmail()\n }\n\n return result\n}\n","import { isNumber } from '@/utils'\n\n/**\n * 生成范围内的随机浮点数\n * @example generateRandomFloat() => 0.35\n * */\nexport function generateRandomFloat(options: GenerateRandomFloat = {}) {\n if (isNumber(options)) {\n options = { max: options }\n }\n\n const { min = 0, max = 1, fractionDigits = 2 } = options\n\n if (min === max) {\n return min\n }\n\n if (min > max) {\n throw new Error(`最大值 ${max} 应大于最小值 ${min}`)\n }\n\n return Math.random() * (max - min) + min\n}\n\ntype GenerateRandomFloat =\n | number\n | {\n /**\n * 最大值\n * @default 1.00\n */\n max?: number\n\n /**\n * 最小值\n * @default 0.00\n */\n min?: number\n\n /**\n * 小数位数\n * @default 2\n */\n fractionDigits?: number\n }\n","import { getRandomItem } from './getRandomItem'\nimport { isArray, isNumber, throwError } from '@/utils'\n\n/**\n * 生成随机数据从数据源中\n * @param num 随机获取数据源子项次数\n * @example generateRandomStringFromSource(4, ['1', 'b', 'c', 'd', 'e']) => 'dea1'\n * */\nexport function generateRandomStringFromSource(num: number, source: (number | string)[]): string {\n if (!isNumber(num) || num <= 0) {\n throwError('generateRandomStringFromSource', 'num 必须大于0')\n }\n\n if (!isArray(source) || source.length === 0) {\n throwError('generateRandomStringFromSource', 'source 不能为空数组')\n }\n\n let result = ''\n\n for (let i = 0; i < num; i++) {\n result += getRandomItem(source)\n }\n\n return result\n}\n","import { generateRandomStringFromSource } from './generateRandomStringFromSource'\nimport { generateRandomDate } from './generateRandomDate'\nimport { generateRandomInteger } from './generateRandomInteger'\n\n/**\n * 生成随机二代身份证号\n * @example generateRandomIdCard() => '410304200210165258'\n */\nexport function generateRandomIdCard(): string {\n const prefix = generateRandomInteger({ min: 100_000, max: 999_999 })\n const zeroToNine = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n\n return [\n prefix,\n generateRandomDate({ format: 'YYYYMMDD' }),\n generateRandomStringFromSource(3, zeroToNine),\n generateRandomStringFromSource(1, [...zeroToNine, 'X', 'x']),\n ].join('')\n}\n","import { generateRandomInteger } from './generateRandomInteger'\nimport { getRandomItem } from './getRandomItem'\n\n/**\n * 生成随机手机号码\n * @example generateRandomMobilePhone() => 13012345678\n */\nexport function generateRandomMobilePhone(): string {\n return (\n getRandomItem(['13', '14', '15', '16', '17', '18', '19']) +\n generateRandomInteger(999_999_999).toString().padEnd(9, '0')\n )\n}\n","import { generateRandomString } from './generateRandomString'\nimport { getRandomItem } from './getRandomItem'\n\n/**\n * 生成随机url\n * @example generateRandomUrl() => 'https://guyme6GCT/Nc58L/NFGdhfCkJi'\n */\nexport function generateRandomUrl(): string {\n const urlPrefix = ['http://', 'https://']\n\n const result = `${getRandomItem(urlPrefix)}${generateRandomString(1)}${generateRandomString({ length: { max: 60, min: 5 }, extra: ['/'] })}`\n\n // 异常url处理\n if (/^(?:http|https):\\/\\/\\w*\\/{2,}/.test(result)) {\n return generateRandomUrl()\n }\n\n return result\n}\n","/**\n * 校验是否为数字\n */\nexport function isNumberOrNumberString(val: string) {\n return /^\\d+$/.test(val)\n}\n\n/**\n * 校验是否为中文\n */\nexport function isChinese(val: string) {\n return /^[\\u4E00-\\u9FA5]+$/.test(val)\n}\n\n/**\n * 校验是否为英文字母\n */\nexport function isEnglishAphabet(val: string) {\n return /^[A-Za-z]+$/.test(val)\n}\n\n/**\n * 校验是否为大写字母\n */\nexport function isUpperCase(val: string) {\n return /^[A-Z]+$/.test(val)\n}\n\n/**\n * 校验是否为大写字母和数字\n */\nexport function isUpperCaseAndNumber(val: string) {\n return /^[\\dA-Z]+$/.test(val)\n}\n\n/**\n * 校验是否为大写字母数字和中文\n */\nexport function isUpperCaseAndNumberAndChinese(val: string) {\n return /^[\\dA-Z\\u4E00-\\u9FA5]+$/.test(val)\n}\n\n/**\n * 校验是否为小写字母\n */\nexport function isLowerCase(val: string) {\n return /^[a-z]+$/.test(val)\n}\n\n/**\n * 校验是否为小写字母和数字\n */\nexport function isLowerCaseAndNumber(val: string) {\n return /^[\\da-z]+$/.test(val)\n}\n\n/**\n * 校验是否为小写字母数字和中文\n */\nexport function isLowerCaseAndNumberAndChinese(val: string) {\n return /^[\\da-z\\u4E00-\\u9FA5]+$/.test(val)\n}\n","/**\n * 校验是否为浮点数\n */\nexport function isFloat(val: string, floatOptions: FloatOptions = {}) {\n const { integer = true } = floatOptions\n if (integer) {\n return /^-?(0|[1-9]\\d*)(\\.\\d+)?$/.test(val)\n }\n\n return /^-?(0|[1-9]\\d*)\\.\\d+$/.test(val)\n}\n\n/**\n * 校验是否为大于零的浮点数\n */\nexport function isPositiveFloat(val: string, floatOptions: FloatOptions = {}) {\n const { integer = true } = floatOptions\n\n if (integer) {\n return /^[1-9]\\d*\\.?\\d*|^0\\.\\d*[1-9]\\d*$/.test(val)\n }\n\n return /^[1-9]\\d*\\.\\d*|^0\\.\\d*[1-9]\\d*$/.test(val)\n}\n\n/**\n * 校验是否为小于零的浮点数\n */\nexport function isNegativeFloat(val: string, floatOptions: FloatOptions = {}) {\n const { integer = true } = floatOptions\n\n if (integer) {\n return /^-[1-9]\\d*\\.?\\d*|^-0\\.\\d*[1-9]\\d*$/.test(val)\n }\n\n return /^-[1-9]\\d*\\.\\d*|^-0\\.\\d*[1-9]\\d*$/.test(val)\n}\n\n/**\n * 校验是否为大于等于零的浮点数\n */\nexport function isPositiveFloatOrZero(val: string, floatOptions: FloatOptions = {}) {\n const { integer = true } = floatOptions\n\n if (integer) {\n return /^(0|[1-9]\\d*)(\\.\\d+)?$/.test(val)\n }\n\n return /^(0|[1-9]\\d*)\\.\\d+$/.test(val)\n}\n\n/**\n * 校验是否为小于等于零的浮点数\n */\nexport function isNegativeFloatOrZero(val: string, floatOptions: FloatOptions = {}) {\n const { integer = true } = floatOptions\n\n if (integer) {\n return /^(-?0(\\.0+)?|-(0|[1-9]\\d*)(\\.\\d+)?)$/.test(val)\n }\n\n return /^(-?0\\.0+|-(0|[1-9]\\d*)\\.\\d+)$/.test(val)\n}\n\nexport interface FloatOptions {\n /**\n * 是否包括整数\n * @default true\n */\n integer?: boolean\n}\n","/**\n * 校验是否为整数\n */\nexport function isInteger(val: string) {\n return /^-?(0|[1-9]\\d*)$/.test(val)\n}\n\n/**\n * 校验否为正整数\n */\nexport function isPositiveInteger(val: string) {\n return /^[1-9]\\d*$/.test(val)\n}\n\n/**\n * 校验是否为大于等于零的整数\n */\nexport function isPositiveIntegerOrZero(val: string) {\n return /^(0|[1-9]\\d*)$/.test(val)\n}\n\n/**\n * 校验是否为负整数\n */\nexport function isNegativeInteger(val: string) {\n return /^-([1-9]\\d*)$/.test(val)\n}\n\n/**\n * 校验是否为小于等于零的整数\n */\nexport function isNegativeIntegerOrZero(val: string) {\n return /^(0|-(0|[1-9]\\d*))$/.test(val)\n}\n","import dayjs, { extend } from 'dayjs'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\n\n/**\n * 校验是否为手机号\n */\nexport function isMobilePhone(val: string) {\n return /^1[3-9]\\d{9}$/.test(val)\n}\n\n/**\n * 校验是否为邮箱\n */\nexport function isEmail(val: string) {\n return /^[\\w-]+(?:\\.[\\w-]+)*@[\\w-]+(?:\\.[\\w-]+)*$/.test(val)\n}\n\n/**\n * 校验是否为空字符串\n */\nexport function isEmptyString(val: unknown) {\n return val === ''\n}\n\n// /**\n// * 校验是否为数字或数字字符串\n// */\n// export function isNumberString(val: unknown): val is number {\n// if (isNumber(val)) {\n// return val - val === 0 // 排除 NaN Infinity -Infinity\n// }\n// if (isString(val) && val.trim() !== '') {\n// return Number.isFinite(+val) // 排除字符串 Infinity -Infinity\n// }\n\n// return false\n// }\n\n// /**\n// * 校验是否为奇数\n// */\n// export function isOdd(val: unknown) {\n// const n = Math.abs(val as number)\n// if (!isNumberString(n)) return false\n// if (!Number.isInteger(n)) return false\n// if (!Number.isSafeInteger(n)) {\n// throwError('isOdd', 'value exceeds maximum safe integer')\n// }\n\n// return n % 2 === 1\n// }\n\n// /**\n// * 校验是否为偶数\n// */\n// export function isEven(val: unknown) {\n// const n = Math.abs(val as number)\n// console.log('🍏 ~ n:', val, n)\n// if (!isNumberString(n)) return false\n// if (!Number.isInteger(n)) return false\n// if (!Number.isSafeInteger(n)) {\n// throwError('isEven', 'value exceeds maximum safe integer')\n// }\n\n// return n % 2 === 0\n// }\n\n/**\n * 校验是否为合法时间格式\n * @param format 时间格式\n * @default 'YYYY-MM-DD HH:mm:ss'\n * @see https://day.js.org/docs/zh-CN/parse/string-format\n */\nexport function isDateString(val: string, format = 'YYYY-MM-DD HH:mm:ss') {\n extend(customParseFormat)\n\n return dayjs(val, format, true).isValid()\n}\n\n/**\n * 校验是否为二代身份证号\n */\nexport function isIdCard(val: string) {\n const flag =\n /^[1-9]\\d{5}(?:18|19|20)\\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\\d|3[01])\\d{3}[\\dX]$/i.test(val) &&\n isDateString(val.slice(6, 14), 'YYYYMMDD')\n\n return flag\n}\n\n/**\n * 是否是链接\n */\nexport function isUrl(val: string) {\n return /^(?:http|https):\\/\\/[\\w.]+/.test(val)\n}\n"],"mappings":"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","names":["src_exports","__export","base64Decode","base64Encode","castArray","compareProperties","compose","composeRight","debounce","debugWarn","decimalToBinary","deepClone","deepMerge","deprecated","error","excludeProperties","extractProperties","generateRandomArray","generateRandomColor","generateRandomDate","generateRandomEmail","generateRandomFloat","generateRandomIdCard","generateRandomInteger","generateRandomMobilePhone","generateRandomString","generateRandomStringFromSource","generateRandomUrl","getRandomItem","hasChanged","hasOwn","initLog","isArray","isBoolean","isChinese","isDate","isDateString","isDef","isEmail","isEmptyString","isEnglishAphabet","isFloat","isFunction","isIdCard","isInteger","isLowerCase","isLowerCaseAndNumber","isLowerCaseAndNumberAndChinese","isMap","isMobilePhone","isNegativeFloat","isNegativeFloatOrZero","isNegativeInteger","isNegativeIntegerOrZero","isNull","isNumber","isNumberOrNumberString","isObject","isPositiveFloat","isPositiveFloatOrZero","isPositiveInteger","isPositiveIntegerOrZero","isPromise","isRegExp","isSet","isString","isSymbol","isUndef","isUndefined","isUpperCase","isUpperCaseAndNumber","isUpperCaseAndNumberAndChinese","isUrl","log","objectToString","qs","throttle","throwError","toTypeString","validatorChineseOrEnglish","validatorChineseOrEnglishOrNumber","validatorEmail","validatorLatitudeOrLongitude","validatorUppercaseOrNumbersOrSpecial","validatorUppercaseOrNumbersOrUnderline","warn","__toCommonJS","decimalToBinary","decNumber","stack","remainder","binaryString","BASE64_CHARS","base64Encode","str","result","bin","i","padding","base64Decode","binary","compose","fns","previous","current","args","composeRight","debounce","target","wait","timer","args","objectToString","toTypeString","value","logCb","initLog","cb","isFunction","origConsole","type","name","arg","context","log","warn","error","isMap","val","isSet","isDate","isRegExp","isNumber","isString","isSymbol","isObject","isPromise","isUndef","isUndefined","isNull","isDef","isBoolean","isArray","hasOwn","target","key","hasChanged","oldValue","newValue","deepClone","target","map","_deepClone","value","isDate","isRegExp","isObject","clone","isArray","key","hasOwn","LntvowError","m","throwError","scope","message","debugWarn","error","isString","deprecated","from","replacement","version","type","deepMerge","template","source","options","isObject","throwError","isArray","arrayMerge","mergeObject","target","process","key","isUndef","result","deepClone","parse","str","options","decode","deepMerge","result","pairs","pair","key","value","stringify","obj","encode","appendQueryString","url","stringifyOptions","query","qs","throttle","target","wait","timer","args","isUndef","now","validatorLatitudeOrLongitude","value","validatorChineseOrEnglishOrNumber","isUndef","validatorChineseOrEnglish","validatorUppercaseOrNumbersOrSpecial","validatorUppercaseOrNumbersOrUnderline","validatorEmail","deprecated","castArray","target","isArray","compareProperties","target","source","isObject","throwError","isArray","compareObject","result","key","targetItem","sourceItem","excludeProperties","target","properties","result","deepClone","castArray","property","hasOwn","extractProperties","generateRandomArray","num","cb","isNumber","throwError","isFunction","e","i","generateRandomColor","import_dayjs","import_customParseFormat","generateRandomInteger","options","isNumber","min","max","effectiveMin","effectiveMax","throwError","customParseFormat","generateRandomDate","options","start","end","dayjs","format","throwError","startYear","endYear","randomYear","generateRandomInteger","randomMonth","randomDay","randomHour","randomMinute","randomSecond","result","DEFAULT_MAX","DEFAULT_MIN","generateRandomString","options","isNumber","lowerCase","upperCase","number","extra","length","generateRandomIntegerOptions","__spreadValues","throwError","characters","castArray","item","result","len","generateRandomInteger","i","randomIndex","getRandomItem","list","generateRandomEmail","emailProviders","result","generateRandomString","generateRandomInteger","getRandomItem","generateRandomFloat","options","isNumber","min","max","fractionDigits","generateRandomStringFromSource","num","source","isNumber","throwError","isArray","result","i","getRandomItem","generateRandomIdCard","prefix","generateRandomInteger","zeroToNine","generateRandomDate","generateRandomStringFromSource","generateRandomMobilePhone","getRandomItem","generateRandomInteger","generateRandomUrl","result","getRandomItem","generateRandomString","isNumberOrNumberString","val","isChinese","isEnglishAphabet","isUpperCase","isUpperCaseAndNumber","isUpperCaseAndNumberAndChinese","isLowerCase","isLowerCaseAndNumber","isLowerCaseAndNumberAndChinese","isFloat","val","floatOptions","integer","isPositiveFloat","isNegativeFloat","isPositiveFloatOrZero","isNegativeFloatOrZero","isInteger","val","isPositiveInteger","isPositiveIntegerOrZero","isNegativeInteger","isNegativeIntegerOrZero","import_dayjs","import_customParseFormat","isMobilePhone","val","isEmail","isEmptyString","isDateString","format","customParseFormat","dayjs","isIdCard","isUrl"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/utils/code.ts","../src/utils/compose.ts","../src/utils/debounce.ts","../src/utils/type.ts","../src/utils/deepClone.ts","../src/utils/error.ts","../src/utils/deepMerge.ts","../src/utils/qs.ts","../src/utils/throttle.ts","../src/utils/validator.ts","../src/array/castArray.ts","../src/object/compareProperties.ts","../src/object/propertyManipulation.ts","../src/random/generateRandomArray.ts","../src/random/generateRandomColor.ts","../src/random/generateRandomDate.ts","../src/random/generateRandomInteger.ts","../src/random/generateRandomString.ts","../src/random/getRandomItem.ts","../src/random/generateRandomEmail.ts","../src/random/generateRandomFloat.ts","../src/random/generateRandomStringFromSource.ts","../src/random/generateRandomIdCard.ts","../src/random/generateRandomMobilePhone.ts","../src/random/generateRandomUrl.ts","../src/validator/aphabet.ts","../src/validator/float.ts","../src/validator/integer.ts","../src/validator/utils.ts"],"sourcesContent":["export * from './array'\n\nexport * from './object'\n\nexport * from './random'\n\nexport * from './utils'\n\nexport * from './validator'\n","/**\n * 十进制转二进制\n * @example decimalToBinary(233) => '11101001'\n */\nexport function decimalToBinary(decNumber: number): string {\n const stack = []\n let remainder\n let binaryString = ''\n\n while (decNumber > 0) {\n remainder = Math.floor(decNumber % 2)\n stack.push(remainder)\n decNumber = Math.floor(decNumber / 2)\n }\n\n while (stack.length > 0) {\n binaryString += stack.pop()!.toString()\n }\n\n return binaryString\n}\n\nconst BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n\n/**\n * Base64 编码\n * @example base64Encode('hello') => 'aGVsbG8='\n */\nexport function base64Encode(str: string): string {\n let result = ''\n let bin = ''\n\n for (let i = 0; i < str.length; i++) {\n bin += str[i].charCodeAt(0).toString(2).padStart(8, '0')\n }\n\n for (let i = 0; i < bin.length; i += 6) {\n result += BASE64_CHARS[parseInt(bin.slice(i, i + 6).padEnd(6, '0'), 2)]\n }\n\n const padding = result.length % 4\n if (padding !== 0) result += '='.repeat(4 - padding)\n\n return result\n}\n\n/**\n * Base64 解码\n * @example base64Decode('aGVsbG8=') => 'hello'\n */\nexport function base64Decode(str: string): string {\n let result = ''\n let bin = ''\n\n for (let i = 0; i < str.length; i++) {\n if (str[i] === '=') break\n bin += BASE64_CHARS.indexOf(str[i]).toString(2).padStart(6, '0')\n }\n\n for (let i = 0; i < bin.length; i += 8) {\n const binary = parseInt(bin.slice(i, i + 8), 2)\n if (binary) {\n result += String.fromCharCode(binary)\n }\n }\n\n return result\n}\n","/**\n * compose\n * @param fns 任意函数\n */\nexport function compose(...fns: ((...args: any[]) => any)[]) {\n return fns.reduce(\n (previous, current) =>\n function (...args) {\n return current(previous(...args))\n }\n )\n}\n\n/**\n * compose 从右到左\n * @param fns 任意函数\n */\nexport function composeRight(...fns: ((...args: any[]) => any)[]) {\n return fns.reduce(\n (previous, current) =>\n function (...args) {\n return previous(current(...args))\n }\n )\n}\n","/**\n * 防抖函数\n * @param target 目标函数\n * @param wait 等待时间 默认 500ms\n * @example debounce(() => console.log('debounce'), 500)\n */\nexport function debounce(target: Function, wait = 500) {\n let timer: number | null = null\n\n return function (...args: any[]) {\n if (timer) clearTimeout(timer)\n timer = setTimeout(() => {\n target.apply(this, args)\n }, wait) as any\n }\n}\n","/* eslint-disable no-console */\n\n/* eslint-disable ts/ban-types */\nexport type AnyObject = Record<string, any>\n\nexport type ArrayItem<T> = T extends (infer U)[] ? U : never\n\nexport const objectToString = Object.prototype.toString\n\nexport const toTypeString = (value: unknown): string => objectToString.call(value)\n\nlet logCb: Function | null = null\n\nexport function initLog(cb: Function) {\n if (isFunction(cb)) {\n logCb = cb\n }\n}\n\nconst origConsole = (type: 'info' | 'warn' | 'error', name: unknown, ...arg: unknown[]) => {\n if (!name) return\n const context = arg.length === 0 ? '' : arg.length === 1 ? arg[0] : arg\n\n console[type](`[Log] ${name}:`, context)\n}\n\nexport const log = (name: unknown, ...arg: unknown[]) => {\n origConsole('info', name, ...arg)\n}\n\nlog.info = (name: unknown, ...arg: unknown[]) => {\n origConsole('info', name, ...arg)\n}\n\nlog.error = (name: unknown, ...arg: unknown[]) => {\n origConsole('error', name, ...arg)\n}\n\nlog.warn = (name: unknown, ...arg: unknown[]) => {\n origConsole('warn', name, ...arg)\n}\n\nexport const warn = (...arg: unknown[]) => console.warn(...arg)\n\nexport const error = (...arg: unknown[]) => console.error(...arg)\n\nexport const isMap = (val: unknown): val is Map<any, any> => toTypeString(val) === '[object Map]'\n\nexport const isSet = (val: unknown): val is Set<any> => toTypeString(val) === '[object Set]'\n\nexport const isDate = (val: unknown): val is Date => toTypeString(val) === '[object Date]'\n\nexport const isRegExp = (val: unknown): val is RegExp => toTypeString(val) === '[object RegExp]'\n\nexport const isFunction = (val: unknown): val is Function => typeof val === 'function'\n\nexport const isNumber = (val: unknown): val is number => typeof val === 'number'\n\nexport const isString = (val: unknown): val is string => typeof val === 'string'\n\nexport const isSymbol = (val: unknown): val is symbol => typeof val === 'symbol'\n\nexport const isObject = (val: unknown): val is Record<any, any> => val !== null && typeof val === 'object'\n\nexport const isPromise = <T = any>(val: unknown): val is Promise<T> =>\n isObject(val) && isFunction(val.then) && isFunction(val.catch)\n\nexport const isUndef = (val: unknown): val is undefined | null => val === undefined || val === null\n\nexport const isUndefined = (val: unknown): val is undefined => val === undefined\n\nexport const isNull = (val: unknown): val is null => val === null\n\nexport const isDef = <T>(val: T): val is NonNullable<T> => val !== undefined && val !== null\n\nexport const isBoolean = (val: unknown): val is boolean => typeof val === 'boolean'\n\nexport const isArray = Array.isArray\n\nexport const hasOwn = <T extends object, U extends keyof T>(target: T, key: U) => Object.hasOwn(target, key)\n\nexport const hasChanged = (oldValue: unknown, newValue: unknown) => oldValue !== newValue\n\nexport type Arrayable<T> = T | T[]\n\n// export function isMobilePhone() {\n// if (\n// navigator.userAgent.indexOf('Mobile') > -1 ||\n// navigator.userAgent.indexOf('Android') > -1 ||\n// navigator.userAgent.indexOf('iPhone') > -1 ||\n// navigator.userAgent.indexOf('iPad') > -1 ||\n// navigator.userAgent.indexOf('Windows Phone') > -1 ||\n// navigator.userAgent.indexOf('BlackBerry') > -1 ||\n// navigator.userAgent.indexOf('Symbian') > -1\n// ) {\n// return true\n// }\n// return false\n// }\n","import { hasOwn, isArray, isDate, isObject, isRegExp } from './type'\n\n/**\n * 深拷贝\n * @param target 拷贝对象\n * @example deepClone({ name: 1, obj: { name: 1 }, arr: [1, 2, 3] }) => { name: 1, obj: { name: 1 }, arr: [1, 2, 3] }\n */\nexport function deepClone<T>(target: T): T {\n const map = new WeakMap()\n\n function _deepClone(value: any) {\n if (isDate(value)) return new Date(value)\n if (isRegExp(value)) return new RegExp(value)\n\n if (isObject(value)) {\n // 取出 WeakMap 中缓存的 clone 对象\n if (map.has(value)) return map.get(value)\n let clone: Record<any, any> = {}\n\n // 处理数组\n if (isArray(value)) {\n clone = []\n map.set(value, clone)\n for (let i = 0; i < value.length; i++) {\n clone[i] = _deepClone(value[i])\n }\n\n return clone\n }\n\n // 设置缓存\n map.set(value, clone)\n\n for (const key in value) {\n if (hasOwn(value, key)) {\n clone[key] = _deepClone(value[key])\n }\n }\n\n return clone\n }\n return value\n }\n\n return _deepClone(target)\n}\n","import { isString } from './type'\n\nclass LntvowError extends Error {\n constructor(m: string) {\n super(m)\n this.name = 'LntvowError'\n }\n}\n\nexport function throwError(scope: string, message: string) {\n throw new LntvowError(`[${scope}] ${message}`)\n}\n\nexport function debugWarn(err: Error): void\n\nexport function debugWarn(scope: string, message: string): void\n\nexport function debugWarn(scope: string | Error, message?: string) {\n if (process.env.NODE_ENV !== 'production') {\n const error: Error = isString(scope) ? new LntvowError(`[${scope}] ${message}`) : scope\n\n console.warn(error)\n }\n}\n\nexport const deprecated = ({\n from,\n replacement,\n version,\n type = 'API',\n}: {\n from: string\n replacement: string\n version: string\n type?: 'API'\n}) => {\n debugWarn(`${type}`, `${from} is about to be deprecated in version ${version}, please use ${replacement} instead.`)\n}\n","import { isArray, type AnyObject, isObject, isUndef } from './type'\nimport { deepClone as _deepClone } from './deepClone'\nimport { throwError } from './error'\n\ninterface DeepMergeOptions {\n /**\n * 是否开启深拷贝 默认开启\n * @default true\n */\n deepClone: boolean\n}\n\n/**\n * 深度合并两对象\n * @param template 模板对象 就是默认值\n * @param source 源对象 就是用户传入的值\n * @param options 配置对象\n * @example deepMerge({ name: 1, obj: { name: '默认' , text: '旧值' }, arr: [1, 2, 3] }, { name: 1, obj: { name: '修改', age: '新增' }, test: 'test' }) => { name: 1, obj: { name: '修改', text: '旧值', age: '新增' }, arr: [1, 2, 3], test: 'test' }\n */\n\nexport function deepMerge(template: AnyObject, source: AnyObject, options?: DeepMergeOptions): any {\n if (!isObject(template) || !isObject(source)) {\n throwError('deepMerge', 'template 和 source 必须是对象')\n }\n\n return isArray(template) ? arrayMerge(template, source, options) : mergeObject(template, source, options)\n}\n\nfunction mergeObject(template: AnyObject, source: AnyObject, options?: DeepMergeOptions) {\n const target = process(source, options)\n const templateKeys = Object.keys(template)\n templateKeys.forEach(key => {\n if (isUndef(source[key])) {\n target[key] = process(template[key], options)\n } else {\n target[key] =\n isObject(template[key]) && isObject(source[key])\n ? deepMerge(template[key], source[key], options)\n : process(source[key], options)\n }\n })\n\n return target\n}\n\n// 数组暂时没有深拷贝的需求\nfunction arrayMerge<T>(template: T[], source: AnyObject, options?: DeepMergeOptions) {\n if (isArray(source)) {\n const result = process(source, options)\n result.push(...process(template, options))\n\n return result\n }\n return process(template, options)\n}\n\nfunction process<T>(source: T, options?: DeepMergeOptions): T {\n const { deepClone = true } = options || {}\n\n return deepClone ? _deepClone(source) : source\n}\n","import { deepMerge } from './deepMerge'\nimport type { AnyObject } from './type'\n\n/**\n * 解析查询字符串\n * @param str 转换的字符串\n * @return 转换后的对象\n * @example\n * parse('a=1&b=2') => { a: '1', b: '2' }\n * parse('?a=1&b=2') => { a: '1', b: '2' }\n * parse('&a=1&b=2') => { a: '1', b: '2' }\n * parse('from=%E4%B8%AD%E5%9B%BD') => { from: '中国' }\n * parse('from=%E4%B8%AD%E5%9B%BD', { decode: false }) => { from: '%E4%B8%AD%E5%9B%BD' }\n */\nfunction parse(str: string, options?: ParseOptions) {\n const { decode } = deepMerge({ decode: true }, options || {}) as ParseOptions\n const result: Record<string, string> = {}\n str.startsWith('?') && (str = str.slice(1))\n str.includes('?') && (str = str.slice(str.indexOf('?') + 1))\n\n const pairs = str.split('&').filter(Boolean)\n\n for (const pair of pairs) {\n const [key, value] = pair.split('=')\n result[key] = decode ? decodeURIComponent(value) : value\n }\n\n return result\n}\n\n/**\n * 转换对象为查询字符串\n * @param obj 转换的对象\n * @return 转换后的字符串\n * @example\n * stringify({ a: '1', b: '2' }) => 'a=1&b=2'\n * stringify({ from: '中国' }) => 'from=%E4%B8%AD%E5%9B%BD'\n * stringify({ from: '中国' }, { encode: false }) => 'from=中国'\n */\nfunction stringify(obj: Record<string, any>, options?: StringifyOptions) {\n const { encode } = deepMerge({ encode: true }, options || {}) as StringifyOptions\n\n const pairs = []\n for (const key in obj) {\n const value = obj[key]\n pairs.push(`${key}=${encode ? encodeURIComponent(value) : value}`)\n }\n\n return pairs.join('&')\n}\n\n/**\n * url追加查询字符串\n * @param url url\n * @param obj 查询字符串对象\n * @return 追加后的url\n * @example\n * appendQueryString('https://www.baidu.com', { a: '1', b: '2' }) => 'https://www.baidu.com?a=1&b=2'\n * appendQueryString('/pages/index?id=10', { test:'23' }) => '/pages/index?id=10&test=23'\n */\nfunction appendQueryString(url: string, obj: AnyObject, options?: StringifyOptions) {\n const stringifyOptions = deepMerge({ encode: true }, options || {}) as StringifyOptions\n const query = stringify(obj, stringifyOptions)\n\n if (url.includes('?')) {\n return url.endsWith('?') || url.endsWith('&') ? `${url}${query}` : `${url}&${query}`\n }\n return `${url}?${query}`\n}\n\nexport const qs = {\n parse,\n stringify,\n appendQueryString,\n}\n\nexport interface ParseOptions {\n /**\n * 是否解码\n * @default true\n */\n decode?: boolean\n}\n\nexport interface StringifyOptions {\n /**\n * 是否编码\n * @default true\n */\n encode?: boolean\n}\n","/* eslint-disable no-invalid-this */\n/* eslint-disable ts/ban-types */\nimport { isUndef } from './type'\n\n/**\n * 节流函数\n * @param target 目标函数\n * @param wait 等待时间 默认 500ms\n * @example throttle(() => console.log('hello world'), 500)\n */\nexport function throttle(target: Function, wait = 500) {\n let timer: number | null = null\n\n return function (...args: any[]) {\n if (isUndef(timer)) {\n timer = Date.now()\n\n return target.apply(this, args)\n }\n const now = Date.now()\n if (now - timer >= wait) {\n timer = now\n\n return target.apply(this, args)\n }\n }\n}\n","import { deprecated } from './error'\nimport { isUndef } from './type'\n\n/**\n * 校验经纬度\n */\nexport function validatorLatitudeOrLongitude(value: string) {\n return /^-?\\d{1,3}\\.\\d{6}$/.test(value)\n}\n\n/**\n * 校验中文、字母、数字\n */\nexport function validatorChineseOrEnglishOrNumber(value: string) {\n return !isUndef(value) && /^[\\dA-Za-z\\u4E00-\\u9FA5]+$/.test(value)\n}\n\n/**\n * 校验中英文\n */\nexport function validatorChineseOrEnglish(value: string) {\n return !isUndef(value) && /^[A-Za-z\\u4E00-\\u9FA5]+$/.test(value)\n}\n\n/**\n * 校验大写字母、数字、特殊字符 特殊字符包括 !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\n */\nexport function validatorUppercaseOrNumbersOrSpecial(value: string) {\n return !isUndef(value) && /^[\\d!\"#$%&'()*+,./:;<=>?@A-Z[\\\\\\]^_`{|}~]+$/.test(value)\n}\n\n/**\n * 校验大写字母、数字、_\n */\nexport function validatorUppercaseOrNumbersOrUnderline(value: string) {\n return /^[\\dA-Z_]+$/.test(value)\n}\n\n/**\n * 校验是否为邮箱\n * @deprecated 使用 isEmail 代替\n */\nexport function validatorEmail(value: string) {\n deprecated({ from: 'validatorEmail', replacement: 'isEmail', version: '2.4.0' })\n\n return /^([\\w-])+@([\\w-])+(\\.[\\w-])+/.test(value)\n}\n","import { isArray } from '@/utils'\n\n/**\n * 将非数组转换为数组 如果是目标本就是数组则直接返回\n * @example castArray(1) => [1]\n */\nexport function castArray<T>(target: T | T[]): T[] {\n return isArray(target) ? target : [target]\n}\n","import { isObject, type AnyObject, isArray, throwError } from '../utils'\n\nexport function compareProperties(target: AnyObject, source: AnyObject) {\n if (!isObject(target) || !isObject(source)) {\n throwError('deepMerge', 'template 和 source 必须是对象')\n }\n\n return isArray(target) ? compareArray(target, source) : compareObject(target, source)\n}\n\nfunction compareObject(target: AnyObject, source: AnyObject) {\n const result = {} as AnyObject\n\n Object.keys(target).forEach(key => {\n const targetItem = target[key]\n const sourceItem = source[key]\n if (isObject(targetItem) && isObject(sourceItem)) {\n result[key] = compareObject(targetItem, sourceItem)\n } else if (!Object.is(targetItem, sourceItem)) {\n result[key] = sourceItem\n }\n })\n\n return result\n}\n\nfunction compareArray<T>(target: T[], source: AnyObject) {\n // if (isArray(source)) {\n // target.every((item, index) => {})\n // } else {\n // return source\n // }\n}\n","import { deepClone, type Arrayable, hasOwn, type AnyObject } from '../utils'\nimport { castArray } from '../array'\n\n/**\n * 排除对象中的某些属性\n * @param target 目标对象\n * @param properties 要排除的属性\n * @example excludeProperties({ a: 1, b: 2, c: 3 }, ['a', 'b']) => { c: 3 }\n */\nexport function excludeProperties<T extends AnyObject, K extends keyof T>(\n target: T,\n properties: Arrayable<K>\n): Omit<T, K> {\n const result = deepClone(target)\n const list = castArray(properties)\n list.forEach(property => {\n if (hasOwn(result, property)) {\n // eslint-disable-next-line ts/no-dynamic-delete\n delete result[property]\n }\n })\n\n return result\n}\n\n/**\n * 提取对象中的某些属性\n * @param target 目标对象\n * @param properties 要提取的属性\n * @example extractProperties({ a: 1, b: 2, c: 3 }, ['a', 'b']) => { a: 1, b: 2 }\n */\nexport function extractProperties<T extends AnyObject, K extends keyof T>(\n target: T,\n properties: Arrayable<K>\n): Pick<T, K> {\n const result = {} as Pick<T, K>\n const list = castArray(properties)\n\n list.forEach(property => {\n if (hasOwn(target, property)) {\n result[property] = target[property]\n }\n })\n\n return result\n}\n","import { isFunction, isNumber, throwError } from '@/utils'\n\n/**\n * 生成随机数组\n * @example generateRandomArray(4, () => 1) => [1, 1, 1, 1]\n * */\nexport function generateRandomArray<T>(num: number, cb: (item?: unknown, index?: number) => T): T[] {\n if (!isNumber(num) || num <= 0) {\n throwError('generateRandomArray', 'num 必须大于0')\n }\n if (!isFunction(cb)) {\n throwError('generateRandomArray', 'cb 必须是函数')\n }\n\n return Array.from({ length: num })\n .fill(0)\n .map((e, i) => cb(e, i))\n}\n","/**\n * 生成随机颜色\n * @example generateRandomColor() => '#f36a38'\n * */\nexport function generateRandomColor(): string {\n return `#${Math.random().toString(16).slice(2, 8).padEnd(6, '0')}`\n}\n","import dayjs, { extend } from 'dayjs'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\nimport { generateRandomInteger } from './generateRandomInteger'\nimport { throwError } from '@/utils'\n\nextend(customParseFormat)\n\n/**\n * 生成随机时间\n * @example generateRandomDate() => '2021-07-01 08:51:34'\n * */\n\nexport function generateRandomDate(options: GenerateRandomDate = {}): string {\n const {\n start = '1800-01-01 00:00:00',\n end = dayjs().format('YYYY-MM-DD HH:mm:ss'),\n format = 'YYYY-MM-DD HH:mm:ss',\n } = options\n\n if (!dayjs(start).isValid() || !dayjs(end).isValid()) {\n throwError('generateRandomDate', 'start end 参数必须是合法的时间格式')\n }\n\n const startYear = dayjs(start).year()\n const endYear = dayjs(end).year()\n\n const randomYear = generateRandomInteger({ min: startYear, max: endYear })\n const randomMonth = generateRandomInteger({ min: 1, max: 12 })\n const randomDay = generateRandomInteger({ min: 1, max: 31 })\n const randomHour = generateRandomInteger(23)\n const randomMinute = generateRandomInteger(59)\n const randomSecond = generateRandomInteger(59)\n\n const result = dayjs(`${randomYear}-${randomMonth}-${randomDay} ${randomHour}:${randomMinute}:${randomSecond}`)\n\n // 异常时间处理\n if (result.isBefore(dayjs(start)) || result.isAfter(dayjs(end))) {\n return generateRandomDate(options)\n }\n\n return result.format(format)\n}\n\ninterface GenerateRandomDate {\n /**\n * 开始时间\n * @default 1800-01-01 00:00:00\n */\n start?: string | Date\n\n /**\n * 结束时间\n * @default 当前时间\n */\n end?: string | Date\n\n /**\n * 时间格式\n * @default YYYY-MM-DD HH:mm:ss\n */\n format?: string\n}\n","import { isNumber, throwError } from '@/utils'\n\n/**\n * 生成范围内的随机整数\n * @example generateRandomInteger() => 217342\n * */\nexport function generateRandomInteger(options: GenerateRandomIntegerOptions = {}) {\n if (isNumber(options)) {\n options = { max: options }\n }\n\n const { min = 0, max = Number.MAX_SAFE_INTEGER } = options\n\n const effectiveMin = Math.ceil(min)\n const effectiveMax = Math.floor(max)\n\n if (effectiveMin === effectiveMax) {\n return effectiveMin\n }\n\n if (effectiveMax < effectiveMin) {\n if (max >= min) {\n throwError('generateRandomInteger', `未找到 ${min} 和 ${max} 之间的整数值`)\n }\n\n throwError('generateRandomInteger', `最大值 ${max} 应大于最小值 ${min}`)\n }\n\n return Math.floor(Math.random() * (effectiveMax - effectiveMin + 1) + effectiveMin)\n}\n\ntype GenerateRandomIntegerOptions =\n | number\n | {\n /**\n * 最大值\n * @default Number.MAX_SAFE_INTEGER\n */\n max?: number\n\n /**\n * 最小值\n * @default 0\n */\n min?: number\n }\n","import { castArray } from '..'\nimport { generateRandomInteger } from './generateRandomInteger'\nimport { isNumber, throwError, type Arrayable } from '@/utils'\n\nconst DEFAULT_MAX = 16\nconst DEFAULT_MIN = 1\n\n/**\n * 生成随机字符串 大小写字母和数字\n * @example generateRandomString() => 'lZtJqMl0dyTO3WDG'\n * */\nexport function generateRandomString(options: GenerateRandomStringOptions = {}): string {\n if (isNumber(options)) {\n options = { length: options }\n }\n\n const { lowerCase = true, upperCase = true, number = true, extra = [], length = DEFAULT_MAX } = options\n\n let generateRandomIntegerOptions = { max: DEFAULT_MAX, min: DEFAULT_MIN }\n if (isNumber(length)) {\n generateRandomIntegerOptions = { max: length, min: length }\n } else {\n generateRandomIntegerOptions = { ...generateRandomIntegerOptions, ...length }\n if (generateRandomIntegerOptions.min < DEFAULT_MIN) {\n throwError('generateRandomString', `length.min 必须大于等于${DEFAULT_MIN}`)\n }\n }\n\n if (!(lowerCase || upperCase || number)) {\n throwError('generateRandomString', 'lowerCase upperCase number 至少需要一个参数为true')\n }\n\n let characters = ''\n if (lowerCase) characters += 'abcdefghijklmnopqrstuvwxyz'\n if (upperCase) characters += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'\n if (number) characters += '0123456789'\n characters += castArray(extra)\n .flatMap(item => item.split(''))\n .join('')\n\n let result = ''\n const len = generateRandomInteger(generateRandomIntegerOptions)\n\n for (let i = 0; i < len; i++) {\n const randomIndex = Math.floor(Math.random() * characters.length)\n result += characters.charAt(randomIndex)\n }\n\n return result\n}\n\ntype GenerateRandomStringOptions =\n /**\n * 生成字符串的长度\n * @default 16\n */\n | number\n | {\n /**\n * 生成字符串的长度 若传递对象则生成 max 和 min 之间的随机长度\n */\n length?:\n | number\n | {\n /**\n * 最大值\n * @default 16\n */\n max?: number\n\n /**\n * 最小值\n * @default 1\n */\n min?: number\n }\n /**\n * 是否包含小写字母\n * @default true\n */\n lowerCase?: boolean\n /**\n * 是否包含大写字母\n * @default true\n */\n upperCase?: boolean\n /**\n * 是否包含数字\n * @default true\n */\n number?: boolean\n /**\n * 扩展字符\n * @default []\n * @example ['-', '_','@']\n */\n extra?: Arrayable<string>\n }\n","/**\n * 获取数组中的随机元素\n * @example getRandomItem([0, 1, 2, 3, 4]) => 2\n */\nexport function getRandomItem<T>(list: T[]): T {\n return list[Math.floor(Math.random() * list.length)]\n}\n","import { generateRandomInteger } from './generateRandomInteger'\nimport { generateRandomString } from './generateRandomString'\nimport { getRandomItem } from './getRandomItem'\n\n/**\n * 生成随机邮箱\n * @example generateRandomEmail() => lZtJqMl0dyTO3WDGzFDO@gmail.com\n */\nexport function generateRandomEmail(): string {\n const emailProviders = ['gmail.com', 'outlook.com.cn', 'example.com', 'qq.com', '163.com', 'test.com.cn']\n\n const result = `${generateRandomString(1)}${generateRandomString({\n length: generateRandomInteger({ max: 30, min: 1 }),\n extra: ['.', '_', '-'],\n })}${generateRandomString(1)}@${getRandomItem(emailProviders)}`\n\n // 异常邮箱处理\n if (/\\.{2,}/.test(result)) {\n return generateRandomEmail()\n }\n\n return result\n}\n","import { isNumber } from '@/utils'\n\n/**\n * 生成范围内的随机浮点数\n * @example generateRandomFloat() => 0.35\n * */\nexport function generateRandomFloat(options: GenerateRandomFloat = {}) {\n if (isNumber(options)) {\n options = { max: options }\n }\n\n const { min = 0, max = 1, fractionDigits = 2 } = options\n\n if (min === max) {\n return min\n }\n\n if (min > max) {\n throw new Error(`最大值 ${max} 应大于最小值 ${min}`)\n }\n\n return Math.random() * (max - min) + min\n}\n\ntype GenerateRandomFloat =\n | number\n | {\n /**\n * 最大值\n * @default 1.00\n */\n max?: number\n\n /**\n * 最小值\n * @default 0.00\n */\n min?: number\n\n /**\n * 小数位数\n * @default 2\n */\n fractionDigits?: number\n }\n","import { getRandomItem } from './getRandomItem'\nimport { isArray, isNumber, throwError } from '@/utils'\n\n/**\n * 生成随机数据从数据源中\n * @param num 随机获取数据源子项次数\n * @example generateRandomStringFromSource(4, ['1', 'b', 'c', 'd', 'e']) => 'dea1'\n * */\nexport function generateRandomStringFromSource(num: number, source: (number | string)[]): string {\n if (!isNumber(num) || num <= 0) {\n throwError('generateRandomStringFromSource', 'num 必须大于0')\n }\n\n if (!isArray(source) || source.length === 0) {\n throwError('generateRandomStringFromSource', 'source 不能为空数组')\n }\n\n let result = ''\n\n for (let i = 0; i < num; i++) {\n result += getRandomItem(source)\n }\n\n return result\n}\n","import { generateRandomStringFromSource } from './generateRandomStringFromSource'\nimport { generateRandomDate } from './generateRandomDate'\nimport { generateRandomInteger } from './generateRandomInteger'\n\n/**\n * 生成随机二代身份证号\n * @example generateRandomIdCard() => '410304200210165258'\n */\nexport function generateRandomIdCard(): string {\n const prefix = generateRandomInteger({ min: 100_000, max: 999_999 })\n const zeroToNine = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n\n return [\n prefix,\n generateRandomDate({ format: 'YYYYMMDD' }),\n generateRandomStringFromSource(3, zeroToNine),\n generateRandomStringFromSource(1, [...zeroToNine, 'X', 'x']),\n ].join('')\n}\n","import { generateRandomInteger } from './generateRandomInteger'\nimport { getRandomItem } from './getRandomItem'\n\n/**\n * 生成随机手机号码\n * @example generateRandomMobilePhone() => 13012345678\n */\nexport function generateRandomMobilePhone(): string {\n return (\n getRandomItem(['13', '14', '15', '16', '17', '18', '19']) +\n generateRandomInteger(999_999_999).toString().padEnd(9, '0')\n )\n}\n","import { generateRandomString } from './generateRandomString'\nimport { getRandomItem } from './getRandomItem'\n\n/**\n * 生成随机url\n * @example generateRandomUrl() => 'https://guyme6GCT/Nc58L/NFGdhfCkJi'\n */\nexport function generateRandomUrl(): string {\n const urlPrefix = ['http://', 'https://']\n\n const result = `${getRandomItem(urlPrefix)}${generateRandomString(1)}${generateRandomString({ length: { max: 60, min: 5 }, extra: ['/'] })}`\n\n // 异常url处理\n if (/^(?:http|https):\\/\\/\\w*\\/{2,}/.test(result)) {\n return generateRandomUrl()\n }\n\n return result\n}\n","/**\n * 校验是否为数字\n */\nexport function isNumberOrNumberString(val: string) {\n return /^\\d+$/.test(val)\n}\n\n/**\n * 校验是否为中文\n */\nexport function isChinese(val: string) {\n return /^[\\u4E00-\\u9FA5]+$/.test(val)\n}\n\n/**\n * 校验是否为英文字母\n */\nexport function isEnglishAphabet(val: string) {\n return /^[A-Za-z]+$/.test(val)\n}\n\n/**\n * 校验是否为大写字母\n */\nexport function isUpperCase(val: string) {\n return /^[A-Z]+$/.test(val)\n}\n\n/**\n * 校验是否为大写字母和数字\n */\nexport function isUpperCaseAndNumber(val: string) {\n return /^[\\dA-Z]+$/.test(val)\n}\n\n/**\n * 校验是否为大写字母数字和中文\n */\nexport function isUpperCaseAndNumberAndChinese(val: string) {\n return /^[\\dA-Z\\u4E00-\\u9FA5]+$/.test(val)\n}\n\n/**\n * 校验是否为小写字母\n */\nexport function isLowerCase(val: string) {\n return /^[a-z]+$/.test(val)\n}\n\n/**\n * 校验是否为小写字母和数字\n */\nexport function isLowerCaseAndNumber(val: string) {\n return /^[\\da-z]+$/.test(val)\n}\n\n/**\n * 校验是否为小写字母数字和中文\n */\nexport function isLowerCaseAndNumberAndChinese(val: string) {\n return /^[\\da-z\\u4E00-\\u9FA5]+$/.test(val)\n}\n","/**\n * 校验是否为浮点数\n */\nexport function isFloat(val: string, floatOptions: FloatOptions = {}) {\n const { integer = true } = floatOptions\n if (integer) {\n return /^-?(0|[1-9]\\d*)(\\.\\d+)?$/.test(val)\n }\n\n return /^-?(0|[1-9]\\d*)\\.\\d+$/.test(val)\n}\n\n/**\n * 校验是否为大于零的浮点数\n */\nexport function isPositiveFloat(val: string, floatOptions: FloatOptions = {}) {\n const { integer = true } = floatOptions\n\n if (integer) {\n return /^[1-9]\\d*\\.?\\d*|^0\\.\\d*[1-9]\\d*$/.test(val)\n }\n\n return /^[1-9]\\d*\\.\\d*|^0\\.\\d*[1-9]\\d*$/.test(val)\n}\n\n/**\n * 校验是否为小于零的浮点数\n */\nexport function isNegativeFloat(val: string, floatOptions: FloatOptions = {}) {\n const { integer = true } = floatOptions\n\n if (integer) {\n return /^-[1-9]\\d*\\.?\\d*|^-0\\.\\d*[1-9]\\d*$/.test(val)\n }\n\n return /^-[1-9]\\d*\\.\\d*|^-0\\.\\d*[1-9]\\d*$/.test(val)\n}\n\n/**\n * 校验是否为大于等于零的浮点数\n */\nexport function isPositiveFloatOrZero(val: string, floatOptions: FloatOptions = {}) {\n const { integer = true } = floatOptions\n\n if (integer) {\n return /^(0|[1-9]\\d*)(\\.\\d+)?$/.test(val)\n }\n\n return /^(0|[1-9]\\d*)\\.\\d+$/.test(val)\n}\n\n/**\n * 校验是否为小于等于零的浮点数\n */\nexport function isNegativeFloatOrZero(val: string, floatOptions: FloatOptions = {}) {\n const { integer = true } = floatOptions\n\n if (integer) {\n return /^(-?0(\\.0+)?|-(0|[1-9]\\d*)(\\.\\d+)?)$/.test(val)\n }\n\n return /^(-?0\\.0+|-(0|[1-9]\\d*)\\.\\d+)$/.test(val)\n}\n\nexport interface FloatOptions {\n /**\n * 是否包括整数\n * @default true\n */\n integer?: boolean\n}\n","/**\n * 校验是否为整数\n */\nexport function isInteger(val: string) {\n return /^-?(0|[1-9]\\d*)$/.test(val)\n}\n\n/**\n * 校验否为正整数\n */\nexport function isPositiveInteger(val: string) {\n return /^[1-9]\\d*$/.test(val)\n}\n\n/**\n * 校验是否为大于等于零的整数\n */\nexport function isPositiveIntegerOrZero(val: string) {\n return /^(0|[1-9]\\d*)$/.test(val)\n}\n\n/**\n * 校验是否为负整数\n */\nexport function isNegativeInteger(val: string) {\n return /^-([1-9]\\d*)$/.test(val)\n}\n\n/**\n * 校验是否为小于等于零的整数\n */\nexport function isNegativeIntegerOrZero(val: string) {\n return /^(0|-(0|[1-9]\\d*))$/.test(val)\n}\n","import dayjs, { extend } from 'dayjs'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\n\n/**\n * 校验是否为手机号\n */\nexport function isMobilePhone(val: string) {\n return /^1[3-9]\\d{9}$/.test(val)\n}\n\n/**\n * 校验是否为邮箱\n */\nexport function isEmail(val: string) {\n return /^[\\w-]+(?:\\.[\\w-]+)*@[\\w-]+(?:\\.[\\w-]+)*$/.test(val)\n}\n\n/**\n * 校验是否为空字符串\n */\nexport function isEmptyString(val: unknown) {\n return val === ''\n}\n\n// /**\n// * 校验是否为数字或数字字符串\n// */\n// export function isNumberString(val: unknown): val is number {\n// if (isNumber(val)) {\n// return val - val === 0 // 排除 NaN Infinity -Infinity\n// }\n// if (isString(val) && val.trim() !== '') {\n// return Number.isFinite(+val) // 排除字符串 Infinity -Infinity\n// }\n\n// return false\n// }\n\n// /**\n// * 校验是否为奇数\n// */\n// export function isOdd(val: unknown) {\n// const n = Math.abs(val as number)\n// if (!isNumberString(n)) return false\n// if (!Number.isInteger(n)) return false\n// if (!Number.isSafeInteger(n)) {\n// throwError('isOdd', 'value exceeds maximum safe integer')\n// }\n\n// return n % 2 === 1\n// }\n\n// /**\n// * 校验是否为偶数\n// */\n// export function isEven(val: unknown) {\n// const n = Math.abs(val as number)\n// console.log('🍏 ~ n:', val, n)\n// if (!isNumberString(n)) return false\n// if (!Number.isInteger(n)) return false\n// if (!Number.isSafeInteger(n)) {\n// throwError('isEven', 'value exceeds maximum safe integer')\n// }\n\n// return n % 2 === 0\n// }\n\n/**\n * 校验是否为合法时间格式\n * @param format 时间格式\n * @default 'YYYY-MM-DD HH:mm:ss'\n * @see https://day.js.org/docs/zh-CN/parse/string-format\n */\nexport function isDateString(val: string, format = 'YYYY-MM-DD HH:mm:ss') {\n extend(customParseFormat)\n\n return dayjs(val, format, true).isValid()\n}\n\n/**\n * 校验是否为二代身份证号\n */\nexport function isIdCard(val: string) {\n const flag =\n /^[1-9]\\d{5}(?:18|19|20)\\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\\d|3[01])\\d{3}[\\dX]$/i.test(val) &&\n isDateString(val.slice(6, 14), 'YYYYMMDD')\n\n return flag\n}\n\n/**\n * 是否是链接\n */\nexport function isUrl(val: string) {\n return /^(?:http|https):\\/\\/[\\w.]+/.test(val)\n}\n"],"mappings":"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","names":["src_exports","__export","base64Decode","base64Encode","castArray","compareProperties","compose","composeRight","debounce","debugWarn","decimalToBinary","deepClone","deepMerge","deprecated","error","excludeProperties","extractProperties","generateRandomArray","generateRandomColor","generateRandomDate","generateRandomEmail","generateRandomFloat","generateRandomIdCard","generateRandomInteger","generateRandomMobilePhone","generateRandomString","generateRandomStringFromSource","generateRandomUrl","getRandomItem","hasChanged","hasOwn","initLog","isArray","isBoolean","isChinese","isDate","isDateString","isDef","isEmail","isEmptyString","isEnglishAphabet","isFloat","isFunction","isIdCard","isInteger","isLowerCase","isLowerCaseAndNumber","isLowerCaseAndNumberAndChinese","isMap","isMobilePhone","isNegativeFloat","isNegativeFloatOrZero","isNegativeInteger","isNegativeIntegerOrZero","isNull","isNumber","isNumberOrNumberString","isObject","isPositiveFloat","isPositiveFloatOrZero","isPositiveInteger","isPositiveIntegerOrZero","isPromise","isRegExp","isSet","isString","isSymbol","isUndef","isUndefined","isUpperCase","isUpperCaseAndNumber","isUpperCaseAndNumberAndChinese","isUrl","log","objectToString","qs","throttle","throwError","toTypeString","validatorChineseOrEnglish","validatorChineseOrEnglishOrNumber","validatorEmail","validatorLatitudeOrLongitude","validatorUppercaseOrNumbersOrSpecial","validatorUppercaseOrNumbersOrUnderline","warn","__toCommonJS","decimalToBinary","decNumber","stack","remainder","binaryString","BASE64_CHARS","base64Encode","str","result","bin","i","padding","base64Decode","binary","compose","fns","previous","current","args","composeRight","debounce","target","wait","timer","args","objectToString","toTypeString","value","logCb","initLog","cb","isFunction","origConsole","type","name","arg","context","log","warn","error","isMap","val","isSet","isDate","isRegExp","isNumber","isString","isSymbol","isObject","isPromise","isUndef","isUndefined","isNull","isDef","isBoolean","isArray","hasOwn","target","key","hasChanged","oldValue","newValue","deepClone","target","map","_deepClone","value","isDate","isRegExp","isObject","clone","isArray","key","hasOwn","LntvowError","m","throwError","scope","message","debugWarn","error","isString","deprecated","from","replacement","version","type","deepMerge","template","source","options","isObject","throwError","isArray","arrayMerge","mergeObject","target","process","key","isUndef","result","deepClone","parse","str","options","decode","deepMerge","result","pairs","pair","key","value","stringify","obj","encode","appendQueryString","url","stringifyOptions","query","qs","throttle","target","wait","timer","args","isUndef","now","validatorLatitudeOrLongitude","value","validatorChineseOrEnglishOrNumber","isUndef","validatorChineseOrEnglish","validatorUppercaseOrNumbersOrSpecial","validatorUppercaseOrNumbersOrUnderline","validatorEmail","deprecated","castArray","target","isArray","compareProperties","target","source","isObject","throwError","isArray","compareObject","result","key","targetItem","sourceItem","excludeProperties","target","properties","result","deepClone","castArray","property","hasOwn","extractProperties","generateRandomArray","num","cb","isNumber","throwError","isFunction","e","i","generateRandomColor","import_dayjs","import_customParseFormat","generateRandomInteger","options","isNumber","min","max","effectiveMin","effectiveMax","throwError","customParseFormat","generateRandomDate","options","start","end","dayjs","format","throwError","startYear","endYear","randomYear","generateRandomInteger","randomMonth","randomDay","randomHour","randomMinute","randomSecond","result","DEFAULT_MAX","DEFAULT_MIN","generateRandomString","options","isNumber","lowerCase","upperCase","number","extra","length","generateRandomIntegerOptions","__spreadValues","throwError","characters","castArray","item","result","len","generateRandomInteger","i","randomIndex","getRandomItem","list","generateRandomEmail","emailProviders","result","generateRandomString","generateRandomInteger","getRandomItem","generateRandomFloat","options","isNumber","min","max","fractionDigits","generateRandomStringFromSource","num","source","isNumber","throwError","isArray","result","i","getRandomItem","generateRandomIdCard","prefix","generateRandomInteger","zeroToNine","generateRandomDate","generateRandomStringFromSource","generateRandomMobilePhone","getRandomItem","generateRandomInteger","generateRandomUrl","result","getRandomItem","generateRandomString","isNumberOrNumberString","val","isChinese","isEnglishAphabet","isUpperCase","isUpperCaseAndNumber","isUpperCaseAndNumberAndChinese","isLowerCase","isLowerCaseAndNumber","isLowerCaseAndNumberAndChinese","isFloat","val","floatOptions","integer","isPositiveFloat","isNegativeFloat","isPositiveFloatOrZero","isNegativeFloatOrZero","isInteger","val","isPositiveInteger","isPositiveIntegerOrZero","isNegativeInteger","isNegativeIntegerOrZero","import_dayjs","import_customParseFormat","isMobilePhone","val","isEmail","isEmptyString","isDateString","format","customParseFormat","dayjs","isIdCard","isUrl"]}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/code.ts","../src/utils/compose.ts","../src/utils/debounce.ts","../src/utils/type.ts","../src/utils/deepClone.ts","../src/utils/error.ts","../src/utils/deepMerge.ts","../src/utils/qs.ts","../src/utils/throttle.ts","../src/utils/validator.ts","../src/Array22231312/castArray.ts","../src/Object23312/compareProperties.ts","../src/Object23312/propertyManipulation.ts","../src/random/generateRandomArray.ts","../src/random/generateRandomColor.ts","../src/random/generateRandomDate.ts","../src/random/generateRandomInteger.ts","../src/random/generateRandomString.ts","../src/random/getRandomItem.ts","../src/random/generateRandomEmail.ts","../src/random/generateRandomFloat.ts","../src/random/generateRandomStringFromSource.ts","../src/random/generateRandomIdCard.ts","../src/random/generateRandomMobilePhone.ts","../src/random/generateRandomUrl.ts","../src/validator/aphabet.ts","../src/validator/float.ts","../src/validator/integer.ts","../src/validator/utils.ts"],"sourcesContent":["/**\n * 十进制转二进制\n * @example decimalToBinary(233) => '11101001'\n */\nexport function decimalToBinary(decNumber: number): string {\n const stack = []\n let remainder\n let binaryString = ''\n\n while (decNumber > 0) {\n remainder = Math.floor(decNumber % 2)\n stack.push(remainder)\n decNumber = Math.floor(decNumber / 2)\n }\n\n while (stack.length > 0) {\n binaryString += stack.pop()!.toString()\n }\n\n return binaryString\n}\n\nconst BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n\n/**\n * Base64 编码\n * @example base64Encode('hello') => 'aGVsbG8='\n */\nexport function base64Encode(str: string): string {\n let result = ''\n let bin = ''\n\n for (let i = 0; i < str.length; i++) {\n bin += str[i].charCodeAt(0).toString(2).padStart(8, '0')\n }\n\n for (let i = 0; i < bin.length; i += 6) {\n result += BASE64_CHARS[parseInt(bin.slice(i, i + 6).padEnd(6, '0'), 2)]\n }\n\n const padding = result.length % 4\n if (padding !== 0) result += '='.repeat(4 - padding)\n\n return result\n}\n\n/**\n * Base64 解码\n * @example base64Decode('aGVsbG8=') => 'hello'\n */\nexport function base64Decode(str: string): string {\n let result = ''\n let bin = ''\n\n for (let i = 0; i < str.length; i++) {\n if (str[i] === '=') break\n bin += BASE64_CHARS.indexOf(str[i]).toString(2).padStart(6, '0')\n }\n\n for (let i = 0; i < bin.length; i += 8) {\n const binary = parseInt(bin.slice(i, i + 8), 2)\n if (binary) {\n result += String.fromCharCode(binary)\n }\n }\n\n return result\n}\n","/**\n * compose\n * @param fns 任意函数\n */\nexport function compose(...fns: ((...args: any[]) => any)[]) {\n return fns.reduce(\n (previous, current) =>\n function (...args) {\n return current(previous(...args))\n }\n )\n}\n\n/**\n * compose 从右到左\n * @param fns 任意函数\n */\nexport function composeRight(...fns: ((...args: any[]) => any)[]) {\n return fns.reduce(\n (previous, current) =>\n function (...args) {\n return previous(current(...args))\n }\n )\n}\n","/**\n * 防抖函数\n * @param target 目标函数\n * @param wait 等待时间 默认 500ms\n * @example debounce(() => console.log('debounce'), 500)\n */\nexport function debounce(target: Function, wait = 500) {\n let timer: number | null = null\n\n return function (...args: any[]) {\n if (timer) clearTimeout(timer)\n timer = setTimeout(() => {\n target.apply(this, args)\n }, wait) as any\n }\n}\n","/* eslint-disable no-console */\n\n/* eslint-disable ts/ban-types */\nexport type AnyObject = Record<string, any>\n\nexport type ArrayItem<T> = T extends (infer U)[] ? U : never\n\nexport const objectToString = Object.prototype.toString\n\nexport const toTypeString = (value: unknown): string => objectToString.call(value)\n\nlet logCb: Function | null = null\n\nexport function initLog(cb: Function) {\n if (isFunction(cb)) {\n logCb = cb\n }\n}\n\nconst origConsole = (type: 'info' | 'warn' | 'error', name: unknown, ...arg: unknown[]) => {\n if (!name) return\n const context = arg.length === 0 ? '' : arg.length === 1 ? arg[0] : arg\n\n console[type](`[Log] ${name}:`, context)\n}\n\nexport const log = (name: unknown, ...arg: unknown[]) => {\n origConsole('info', name, ...arg)\n}\n\nlog.info = (name: unknown, ...arg: unknown[]) => {\n origConsole('info', name, ...arg)\n}\n\nlog.error = (name: unknown, ...arg: unknown[]) => {\n origConsole('error', name, ...arg)\n}\n\nlog.warn = (name: unknown, ...arg: unknown[]) => {\n origConsole('warn', name, ...arg)\n}\n\nexport const warn = (...arg: unknown[]) => console.warn(...arg)\n\nexport const error = (...arg: unknown[]) => console.error(...arg)\n\nexport const isMap = (val: unknown): val is Map<any, any> => toTypeString(val) === '[object Map]'\n\nexport const isSet = (val: unknown): val is Set<any> => toTypeString(val) === '[object Set]'\n\nexport const isDate = (val: unknown): val is Date => toTypeString(val) === '[object Date]'\n\nexport const isRegExp = (val: unknown): val is RegExp => toTypeString(val) === '[object RegExp]'\n\nexport const isFunction = (val: unknown): val is Function => typeof val === 'function'\n\nexport const isNumber = (val: unknown): val is number => typeof val === 'number'\n\nexport const isString = (val: unknown): val is string => typeof val === 'string'\n\nexport const isSymbol = (val: unknown): val is symbol => typeof val === 'symbol'\n\nexport const isObject = (val: unknown): val is Record<any, any> => val !== null && typeof val === 'object'\n\nexport const isPromise = <T = any>(val: unknown): val is Promise<T> =>\n isObject(val) && isFunction(val.then) && isFunction(val.catch)\n\nexport const isUndef = (val: unknown): val is undefined | null => val === undefined || val === null\n\nexport const isUndefined = (val: unknown): val is undefined => val === undefined\n\nexport const isNull = (val: unknown): val is null => val === null\n\nexport const isDef = <T>(val: T): val is NonNullable<T> => val !== undefined && val !== null\n\nexport const isBoolean = (val: unknown): val is boolean => typeof val === 'boolean'\n\nexport const isArray = Array.isArray\n\nexport const hasOwn = <T extends object, U extends keyof T>(target: T, key: U) => Object.hasOwn(target, key)\n\nexport const hasChanged = (oldValue: unknown, newValue: unknown) => oldValue !== newValue\n\nexport type Arrayable<T> = T | T[]\n\n// export function isMobilePhone() {\n// if (\n// navigator.userAgent.indexOf('Mobile') > -1 ||\n// navigator.userAgent.indexOf('Android') > -1 ||\n// navigator.userAgent.indexOf('iPhone') > -1 ||\n// navigator.userAgent.indexOf('iPad') > -1 ||\n// navigator.userAgent.indexOf('Windows Phone') > -1 ||\n// navigator.userAgent.indexOf('BlackBerry') > -1 ||\n// navigator.userAgent.indexOf('Symbian') > -1\n// ) {\n// return true\n// }\n// return false\n// }\n","import { hasOwn, isArray, isDate, isObject, isRegExp } from './type'\n\n/**\n * 深拷贝\n * @param target 拷贝对象\n * @example deepClone({ name: 1, obj: { name: 1 }, arr: [1, 2, 3] }) => { name: 1, obj: { name: 1 }, arr: [1, 2, 3] }\n */\nexport function deepClone<T>(target: T): T {\n const map = new WeakMap()\n\n function _deepClone(value: any) {\n if (isDate(value)) return new Date(value)\n if (isRegExp(value)) return new RegExp(value)\n\n if (isObject(value)) {\n // 取出 WeakMap 中缓存的 clone 对象\n if (map.has(value)) return map.get(value)\n let clone: Record<any, any> = {}\n\n // 处理数组\n if (isArray(value)) {\n clone = []\n map.set(value, clone)\n for (let i = 0; i < value.length; i++) {\n clone[i] = _deepClone(value[i])\n }\n\n return clone\n }\n\n // 设置缓存\n map.set(value, clone)\n\n for (const key in value) {\n if (hasOwn(value, key)) {\n clone[key] = _deepClone(value[key])\n }\n }\n\n return clone\n }\n return value\n }\n\n return _deepClone(target)\n}\n","import { isString } from './type'\n\nclass LntvowError extends Error {\n constructor(m: string) {\n super(m)\n this.name = 'LntvowError'\n }\n}\n\nexport function throwError(scope: string, message: string) {\n throw new LntvowError(`[${scope}] ${message}`)\n}\n\nexport function debugWarn(err: Error): void\n\nexport function debugWarn(scope: string, message: string): void\n\nexport function debugWarn(scope: string | Error, message?: string) {\n if (process.env.NODE_ENV !== 'production') {\n const error: Error = isString(scope) ? new LntvowError(`[${scope}] ${message}`) : scope\n\n console.warn(error)\n }\n}\n\nexport const deprecated = ({\n from,\n replacement,\n version,\n type = 'API',\n}: {\n from: string\n replacement: string\n version: string\n type?: 'API'\n}) => {\n debugWarn(`${type}`, `${from} is about to be deprecated in version ${version}, please use ${replacement} instead.`)\n}\n","import { isArray, type AnyObject, isObject, isUndef } from './type'\nimport { deepClone as _deepClone } from './deepClone'\nimport { throwError } from './error'\n\ninterface DeepMergeOptions {\n /**\n * 是否开启深拷贝 默认开启\n * @default true\n */\n deepClone: boolean\n}\n\n/**\n * 深度合并两对象\n * @param template 模板对象 就是默认值\n * @param source 源对象 就是用户传入的值\n * @param options 配置对象\n * @example deepMerge({ name: 1, obj: { name: '默认' , text: '旧值' }, arr: [1, 2, 3] }, { name: 1, obj: { name: '修改', age: '新增' }, test: 'test' }) => { name: 1, obj: { name: '修改', text: '旧值', age: '新增' }, arr: [1, 2, 3], test: 'test' }\n */\n\nexport function deepMerge(template: AnyObject, source: AnyObject, options?: DeepMergeOptions): any {\n if (!isObject(template) || !isObject(source)) {\n throwError('deepMerge', 'template 和 source 必须是对象')\n }\n\n return isArray(template) ? arrayMerge(template, source, options) : mergeObject(template, source, options)\n}\n\nfunction mergeObject(template: AnyObject, source: AnyObject, options?: DeepMergeOptions) {\n const target = process(source, options)\n const templateKeys = Object.keys(template)\n templateKeys.forEach(key => {\n if (isUndef(source[key])) {\n target[key] = process(template[key], options)\n } else {\n target[key] =\n isObject(template[key]) && isObject(source[key])\n ? deepMerge(template[key], source[key], options)\n : process(source[key], options)\n }\n })\n\n return target\n}\n\n// 数组暂时没有深拷贝的需求\nfunction arrayMerge<T>(template: T[], source: AnyObject, options?: DeepMergeOptions) {\n if (isArray(source)) {\n const result = process(source, options)\n result.push(...process(template, options))\n\n return result\n }\n return process(template, options)\n}\n\nfunction process<T>(source: T, options?: DeepMergeOptions): T {\n const { deepClone = true } = options || {}\n\n return deepClone ? _deepClone(source) : source\n}\n","import { deepMerge } from './deepMerge'\nimport type { AnyObject } from './type'\n\n/**\n * 解析查询字符串\n * @param str 转换的字符串\n * @return 转换后的对象\n * @example\n * parse('a=1&b=2') => { a: '1', b: '2' }\n * parse('?a=1&b=2') => { a: '1', b: '2' }\n * parse('&a=1&b=2') => { a: '1', b: '2' }\n * parse('from=%E4%B8%AD%E5%9B%BD') => { from: '中国' }\n * parse('from=%E4%B8%AD%E5%9B%BD', { decode: false }) => { from: '%E4%B8%AD%E5%9B%BD' }\n */\nfunction parse(str: string, options?: ParseOptions) {\n const { decode } = deepMerge({ decode: true }, options || {}) as ParseOptions\n const result: Record<string, string> = {}\n str.startsWith('?') && (str = str.slice(1))\n str.includes('?') && (str = str.slice(str.indexOf('?') + 1))\n\n const pairs = str.split('&').filter(Boolean)\n\n for (const pair of pairs) {\n const [key, value] = pair.split('=')\n result[key] = decode ? decodeURIComponent(value) : value\n }\n\n return result\n}\n\n/**\n * 转换对象为查询字符串\n * @param obj 转换的对象\n * @return 转换后的字符串\n * @example\n * stringify({ a: '1', b: '2' }) => 'a=1&b=2'\n * stringify({ from: '中国' }) => 'from=%E4%B8%AD%E5%9B%BD'\n * stringify({ from: '中国' }, { encode: false }) => 'from=中国'\n */\nfunction stringify(obj: Record<string, any>, options?: StringifyOptions) {\n const { encode } = deepMerge({ encode: true }, options || {}) as StringifyOptions\n\n const pairs = []\n for (const key in obj) {\n const value = obj[key]\n pairs.push(`${key}=${encode ? encodeURIComponent(value) : value}`)\n }\n\n return pairs.join('&')\n}\n\n/**\n * url追加查询字符串\n * @param url url\n * @param obj 查询字符串对象\n * @return 追加后的url\n * @example\n * appendQueryString('https://www.baidu.com', { a: '1', b: '2' }) => 'https://www.baidu.com?a=1&b=2'\n * appendQueryString('/pages/index?id=10', { test:'23' }) => '/pages/index?id=10&test=23'\n */\nfunction appendQueryString(url: string, obj: AnyObject, options?: StringifyOptions) {\n const stringifyOptions = deepMerge({ encode: true }, options || {}) as StringifyOptions\n const query = stringify(obj, stringifyOptions)\n\n if (url.includes('?')) {\n return url.endsWith('?') || url.endsWith('&') ? `${url}${query}` : `${url}&${query}`\n }\n return `${url}?${query}`\n}\n\nexport const qs = {\n parse,\n stringify,\n appendQueryString,\n}\n\nexport interface ParseOptions {\n /**\n * 是否解码\n * @default true\n */\n decode?: boolean\n}\n\nexport interface StringifyOptions {\n /**\n * 是否编码\n * @default true\n */\n encode?: boolean\n}\n","/* eslint-disable no-invalid-this */\n/* eslint-disable ts/ban-types */\nimport { isUndef } from './type'\n\n/**\n * 节流函数\n * @param target 目标函数\n * @param wait 等待时间 默认 500ms\n * @example throttle(() => console.log('hello world'), 500)\n */\nexport function throttle(target: Function, wait = 500) {\n let timer: number | null = null\n\n return function (...args: any[]) {\n if (isUndef(timer)) {\n timer = Date.now()\n\n return target.apply(this, args)\n }\n const now = Date.now()\n if (now - timer >= wait) {\n timer = now\n\n return target.apply(this, args)\n }\n }\n}\n","import { deprecated } from './error'\nimport { isUndef } from './type'\n\n/**\n * 校验经纬度\n */\nexport function validatorLatitudeOrLongitude(value: string) {\n return /^-?\\d{1,3}\\.\\d{6}$/.test(value)\n}\n\n/**\n * 校验中文、字母、数字\n */\nexport function validatorChineseOrEnglishOrNumber(value: string) {\n return !isUndef(value) && /^[\\dA-Za-z\\u4E00-\\u9FA5]+$/.test(value)\n}\n\n/**\n * 校验中英文\n */\nexport function validatorChineseOrEnglish(value: string) {\n return !isUndef(value) && /^[A-Za-z\\u4E00-\\u9FA5]+$/.test(value)\n}\n\n/**\n * 校验大写字母、数字、特殊字符 特殊字符包括 !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\n */\nexport function validatorUppercaseOrNumbersOrSpecial(value: string) {\n return !isUndef(value) && /^[\\d!\"#$%&'()*+,./:;<=>?@A-Z[\\\\\\]^_`{|}~]+$/.test(value)\n}\n\n/**\n * 校验大写字母、数字、_\n */\nexport function validatorUppercaseOrNumbersOrUnderline(value: string) {\n return /^[\\dA-Z_]+$/.test(value)\n}\n\n/**\n * 校验是否为邮箱\n * @deprecated 使用 isEmail 代替\n */\nexport function validatorEmail(value: string) {\n deprecated({ from: 'validatorEmail', replacement: 'isEmail', version: '2.4.0' })\n\n return /^([\\w-])+@([\\w-])+(\\.[\\w-])+/.test(value)\n}\n","import { isArray } from '@/utils'\n\n/**\n * 将非数组转换为数组 如果是目标本就是数组则直接返回\n * @example castArray(1) => [1]\n */\nexport function castArray<T>(target: T | T[]): T[] {\n return isArray(target) ? target : [target]\n}\n","import { isObject, type AnyObject, isArray, throwError } from '../utils'\n\nexport function compareProperties(target: AnyObject, source: AnyObject) {\n if (!isObject(target) || !isObject(source)) {\n throwError('deepMerge', 'template 和 source 必须是对象')\n }\n\n return isArray(target) ? compareArray(target, source) : compareObject(target, source)\n}\n\nfunction compareObject(target: AnyObject, source: AnyObject) {\n const result = {} as AnyObject\n\n Object.keys(target).forEach(key => {\n const targetItem = target[key]\n const sourceItem = source[key]\n if (isObject(targetItem) && isObject(sourceItem)) {\n result[key] = compareObject(targetItem, sourceItem)\n } else if (!Object.is(targetItem, sourceItem)) {\n result[key] = sourceItem\n }\n })\n\n return result\n}\n\nfunction compareArray<T>(target: T[], source: AnyObject) {\n // if (isArray(source)) {\n // target.every((item, index) => {})\n // } else {\n // return source\n // }\n}\n","import { deepClone, type Arrayable, hasOwn, type AnyObject } from '../utils'\nimport { castArray } from '../Array22231312'\n\n/**\n * 排除对象中的某些属性\n * @param target 目标对象\n * @param properties 要排除的属性\n * @example excludeProperties({ a: 1, b: 2, c: 3 }, ['a', 'b']) => { c: 3 }\n */\nexport function excludeProperties<T extends AnyObject, K extends keyof T>(\n target: T,\n properties: Arrayable<K>\n): Omit<T, K> {\n const result = deepClone(target)\n const list = castArray(properties)\n list.forEach(property => {\n if (hasOwn(result, property)) {\n // eslint-disable-next-line ts/no-dynamic-delete\n delete result[property]\n }\n })\n\n return result\n}\n\n/**\n * 提取对象中的某些属性\n * @param target 目标对象\n * @param properties 要提取的属性\n * @example extractProperties({ a: 1, b: 2, c: 3 }, ['a', 'b']) => { a: 1, b: 2 }\n */\nexport function extractProperties<T extends AnyObject, K extends keyof T>(\n target: T,\n properties: Arrayable<K>\n): Pick<T, K> {\n const result = {} as Pick<T, K>\n const list = castArray(properties)\n\n list.forEach(property => {\n if (hasOwn(target, property)) {\n result[property] = target[property]\n }\n })\n\n return result\n}\n","import { isFunction, isNumber, throwError } from '@/utils'\n\n/**\n * 生成随机数组\n * @example generateRandomArray(4, () => 1) => [1, 1, 1, 1]\n * */\nexport function generateRandomArray<T>(num: number, cb: (item?: unknown, index?: number) => T): T[] {\n if (!isNumber(num) || num <= 0) {\n throwError('generateRandomArray', 'num 必须大于0')\n }\n if (!isFunction(cb)) {\n throwError('generateRandomArray', 'cb 必须是函数')\n }\n\n return Array.from({ length: num })\n .fill(0)\n .map((e, i) => cb(e, i))\n}\n","/**\n * 生成随机颜色\n * @example generateRandomColor() => '#f36a38'\n * */\nexport function generateRandomColor(): string {\n return `#${Math.random().toString(16).slice(2, 8).padEnd(6, '0')}`\n}\n","import dayjs, { extend } from 'dayjs'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\nimport { generateRandomInteger } from './generateRandomInteger'\nimport { throwError } from '@/utils'\n\nextend(customParseFormat)\n\n/**\n * 生成随机时间\n * @example generateRandomDate() => '2021-07-01 08:51:34'\n * */\n\nexport function generateRandomDate(options: GenerateRandomDate = {}): string {\n const {\n start = '1800-01-01 00:00:00',\n end = dayjs().format('YYYY-MM-DD HH:mm:ss'),\n format = 'YYYY-MM-DD HH:mm:ss',\n } = options\n\n if (!dayjs(start).isValid() || !dayjs(end).isValid()) {\n throwError('generateRandomDate', 'start end 参数必须是合法的时间格式')\n }\n\n const startYear = dayjs(start).year()\n const endYear = dayjs(end).year()\n\n const randomYear = generateRandomInteger({ min: startYear, max: endYear })\n const randomMonth = generateRandomInteger({ min: 1, max: 12 })\n const randomDay = generateRandomInteger({ min: 1, max: 31 })\n const randomHour = generateRandomInteger(23)\n const randomMinute = generateRandomInteger(59)\n const randomSecond = generateRandomInteger(59)\n\n const result = dayjs(`${randomYear}-${randomMonth}-${randomDay} ${randomHour}:${randomMinute}:${randomSecond}`)\n\n // 异常时间处理\n if (result.isBefore(dayjs(start)) || result.isAfter(dayjs(end))) {\n return generateRandomDate(options)\n }\n\n return result.format(format)\n}\n\ninterface GenerateRandomDate {\n /**\n * 开始时间\n * @default 1800-01-01 00:00:00\n */\n start?: string | Date\n\n /**\n * 结束时间\n * @default 当前时间\n */\n end?: string | Date\n\n /**\n * 时间格式\n * @default YYYY-MM-DD HH:mm:ss\n */\n format?: string\n}\n","import { isNumber, throwError } from '@/utils'\n\n/**\n * 生成范围内的随机整数\n * @example generateRandomInteger() => 217342\n * */\nexport function generateRandomInteger(options: GenerateRandomIntegerOptions = {}) {\n if (isNumber(options)) {\n options = { max: options }\n }\n\n const { min = 0, max = Number.MAX_SAFE_INTEGER } = options\n\n const effectiveMin = Math.ceil(min)\n const effectiveMax = Math.floor(max)\n\n if (effectiveMin === effectiveMax) {\n return effectiveMin\n }\n\n if (effectiveMax < effectiveMin) {\n if (max >= min) {\n throwError('generateRandomInteger', `未找到 ${min} 和 ${max} 之间的整数值`)\n }\n\n throwError('generateRandomInteger', `最大值 ${max} 应大于最小值 ${min}`)\n }\n\n return Math.floor(Math.random() * (effectiveMax - effectiveMin + 1) + effectiveMin)\n}\n\ntype GenerateRandomIntegerOptions =\n | number\n | {\n /**\n * 最大值\n * @default Number.MAX_SAFE_INTEGER\n */\n max?: number\n\n /**\n * 最小值\n * @default 0\n */\n min?: number\n }\n","import { castArray } from '..'\nimport { generateRandomInteger } from './generateRandomInteger'\nimport { isNumber, throwError, type Arrayable } from '@/utils'\n\nconst DEFAULT_MAX = 16\nconst DEFAULT_MIN = 1\n\n/**\n * 生成随机字符串 大小写字母和数字\n * @example generateRandomString() => 'lZtJqMl0dyTO3WDG'\n * */\nexport function generateRandomString(options: GenerateRandomStringOptions = {}): string {\n if (isNumber(options)) {\n options = { length: options }\n }\n\n const { lowerCase = true, upperCase = true, number = true, extra = [], length = DEFAULT_MAX } = options\n\n let generateRandomIntegerOptions = { max: DEFAULT_MAX, min: DEFAULT_MIN }\n if (isNumber(length)) {\n generateRandomIntegerOptions = { max: length, min: length }\n } else {\n generateRandomIntegerOptions = { ...generateRandomIntegerOptions, ...length }\n if (generateRandomIntegerOptions.min < DEFAULT_MIN) {\n throwError('generateRandomString', `length.min 必须大于等于${DEFAULT_MIN}`)\n }\n }\n\n if (!(lowerCase || upperCase || number)) {\n throwError('generateRandomString', 'lowerCase upperCase number 至少需要一个参数为true')\n }\n\n let characters = ''\n if (lowerCase) characters += 'abcdefghijklmnopqrstuvwxyz'\n if (upperCase) characters += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'\n if (number) characters += '0123456789'\n characters += castArray(extra)\n .flatMap(item => item.split(''))\n .join('')\n\n let result = ''\n const len = generateRandomInteger(generateRandomIntegerOptions)\n\n for (let i = 0; i < len; i++) {\n const randomIndex = Math.floor(Math.random() * characters.length)\n result += characters.charAt(randomIndex)\n }\n\n return result\n}\n\ntype GenerateRandomStringOptions =\n /**\n * 生成字符串的长度\n * @default 16\n */\n | number\n | {\n /**\n * 生成字符串的长度 若传递对象则生成 max 和 min 之间的随机长度\n */\n length?:\n | number\n | {\n /**\n * 最大值\n * @default 16\n */\n max?: number\n\n /**\n * 最小值\n * @default 1\n */\n min?: number\n }\n /**\n * 是否包含小写字母\n * @default true\n */\n lowerCase?: boolean\n /**\n * 是否包含大写字母\n * @default true\n */\n upperCase?: boolean\n /**\n * 是否包含数字\n * @default true\n */\n number?: boolean\n /**\n * 扩展字符\n * @default []\n * @example ['-', '_','@']\n */\n extra?: Arrayable<string>\n }\n","/**\n * 获取数组中的随机元素\n * @example getRandomItem([0, 1, 2, 3, 4]) => 2\n */\nexport function getRandomItem<T>(list: T[]): T {\n return list[Math.floor(Math.random() * list.length)]\n}\n","import { generateRandomInteger } from './generateRandomInteger'\nimport { generateRandomString } from './generateRandomString'\nimport { getRandomItem } from './getRandomItem'\n\n/**\n * 生成随机邮箱\n * @example generateRandomEmail() => lZtJqMl0dyTO3WDGzFDO@gmail.com\n */\nexport function generateRandomEmail(): string {\n const emailProviders = ['gmail.com', 'outlook.com.cn', 'example.com', 'qq.com', '163.com', 'test.com.cn']\n\n const result = `${generateRandomString(1)}${generateRandomString({\n length: generateRandomInteger({ max: 30, min: 1 }),\n extra: ['.', '_', '-'],\n })}${generateRandomString(1)}@${getRandomItem(emailProviders)}`\n\n // 异常邮箱处理\n if (/\\.{2,}/.test(result)) {\n return generateRandomEmail()\n }\n\n return result\n}\n","import { isNumber } from '@/utils'\n\n/**\n * 生成范围内的随机浮点数\n * @example generateRandomFloat() => 0.35\n * */\nexport function generateRandomFloat(options: GenerateRandomFloat = {}) {\n if (isNumber(options)) {\n options = { max: options }\n }\n\n const { min = 0, max = 1, fractionDigits = 2 } = options\n\n if (min === max) {\n return min\n }\n\n if (min > max) {\n throw new Error(`最大值 ${max} 应大于最小值 ${min}`)\n }\n\n return Math.random() * (max - min) + min\n}\n\ntype GenerateRandomFloat =\n | number\n | {\n /**\n * 最大值\n * @default 1.00\n */\n max?: number\n\n /**\n * 最小值\n * @default 0.00\n */\n min?: number\n\n /**\n * 小数位数\n * @default 2\n */\n fractionDigits?: number\n }\n","import { getRandomItem } from './getRandomItem'\nimport { isArray, isNumber, throwError } from '@/utils'\n\n/**\n * 生成随机数据从数据源中\n * @param num 随机获取数据源子项次数\n * @example generateRandomStringFromSource(4, ['1', 'b', 'c', 'd', 'e']) => 'dea1'\n * */\nexport function generateRandomStringFromSource(num: number, source: (number | string)[]): string {\n if (!isNumber(num) || num <= 0) {\n throwError('generateRandomStringFromSource', 'num 必须大于0')\n }\n\n if (!isArray(source) || source.length === 0) {\n throwError('generateRandomStringFromSource', 'source 不能为空数组')\n }\n\n let result = ''\n\n for (let i = 0; i < num; i++) {\n result += getRandomItem(source)\n }\n\n return result\n}\n","import { generateRandomStringFromSource } from './generateRandomStringFromSource'\nimport { generateRandomDate } from './generateRandomDate'\nimport { generateRandomInteger } from './generateRandomInteger'\n\n/**\n * 生成随机二代身份证号\n * @example generateRandomIdCard() => '410304200210165258'\n */\nexport function generateRandomIdCard(): string {\n const prefix = generateRandomInteger({ min: 100_000, max: 999_999 })\n const zeroToNine = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n\n return [\n prefix,\n generateRandomDate({ format: 'YYYYMMDD' }),\n generateRandomStringFromSource(3, zeroToNine),\n generateRandomStringFromSource(1, [...zeroToNine, 'X', 'x']),\n ].join('')\n}\n","import { generateRandomInteger } from './generateRandomInteger'\nimport { getRandomItem } from './getRandomItem'\n\n/**\n * 生成随机手机号码\n * @example generateRandomMobilePhone() => 13012345678\n */\nexport function generateRandomMobilePhone(): string {\n return (\n getRandomItem(['13', '14', '15', '16', '17', '18', '19']) +\n generateRandomInteger(999_999_999).toString().padEnd(9, '0')\n )\n}\n","import { generateRandomString } from './generateRandomString'\nimport { getRandomItem } from './getRandomItem'\n\n/**\n * 生成随机url\n * @example generateRandomUrl() => 'https://guyme6GCT/Nc58L/NFGdhfCkJi'\n */\nexport function generateRandomUrl(): string {\n const urlPrefix = ['http://', 'https://']\n\n const result = `${getRandomItem(urlPrefix)}${generateRandomString(1)}${generateRandomString({ length: { max: 60, min: 5 }, extra: ['/'] })}`\n\n // 异常url处理\n if (/^(?:http|https):\\/\\/\\w*\\/{2,}/.test(result)) {\n return generateRandomUrl()\n }\n\n return result\n}\n","/**\n * 校验是否为数字\n */\nexport function isNumberOrNumberString(val: string) {\n return /^\\d+$/.test(val)\n}\n\n/**\n * 校验是否为中文\n */\nexport function isChinese(val: string) {\n return /^[\\u4E00-\\u9FA5]+$/.test(val)\n}\n\n/**\n * 校验是否为英文字母\n */\nexport function isEnglishAphabet(val: string) {\n return /^[A-Za-z]+$/.test(val)\n}\n\n/**\n * 校验是否为大写字母\n */\nexport function isUpperCase(val: string) {\n return /^[A-Z]+$/.test(val)\n}\n\n/**\n * 校验是否为大写字母和数字\n */\nexport function isUpperCaseAndNumber(val: string) {\n return /^[\\dA-Z]+$/.test(val)\n}\n\n/**\n * 校验是否为大写字母数字和中文\n */\nexport function isUpperCaseAndNumberAndChinese(val: string) {\n return /^[\\dA-Z\\u4E00-\\u9FA5]+$/.test(val)\n}\n\n/**\n * 校验是否为小写字母\n */\nexport function isLowerCase(val: string) {\n return /^[a-z]+$/.test(val)\n}\n\n/**\n * 校验是否为小写字母和数字\n */\nexport function isLowerCaseAndNumber(val: string) {\n return /^[\\da-z]+$/.test(val)\n}\n\n/**\n * 校验是否为小写字母数字和中文\n */\nexport function isLowerCaseAndNumberAndChinese(val: string) {\n return /^[\\da-z\\u4E00-\\u9FA5]+$/.test(val)\n}\n","/**\n * 校验是否为浮点数\n */\nexport function isFloat(val: string, floatOptions: FloatOptions = {}) {\n const { integer = true } = floatOptions\n if (integer) {\n return /^-?(0|[1-9]\\d*)(\\.\\d+)?$/.test(val)\n }\n\n return /^-?(0|[1-9]\\d*)\\.\\d+$/.test(val)\n}\n\n/**\n * 校验是否为大于零的浮点数\n */\nexport function isPositiveFloat(val: string, floatOptions: FloatOptions = {}) {\n const { integer = true } = floatOptions\n\n if (integer) {\n return /^[1-9]\\d*\\.?\\d*|^0\\.\\d*[1-9]\\d*$/.test(val)\n }\n\n return /^[1-9]\\d*\\.\\d*|^0\\.\\d*[1-9]\\d*$/.test(val)\n}\n\n/**\n * 校验是否为小于零的浮点数\n */\nexport function isNegativeFloat(val: string, floatOptions: FloatOptions = {}) {\n const { integer = true } = floatOptions\n\n if (integer) {\n return /^-[1-9]\\d*\\.?\\d*|^-0\\.\\d*[1-9]\\d*$/.test(val)\n }\n\n return /^-[1-9]\\d*\\.\\d*|^-0\\.\\d*[1-9]\\d*$/.test(val)\n}\n\n/**\n * 校验是否为大于等于零的浮点数\n */\nexport function isPositiveFloatOrZero(val: string, floatOptions: FloatOptions = {}) {\n const { integer = true } = floatOptions\n\n if (integer) {\n return /^(0|[1-9]\\d*)(\\.\\d+)?$/.test(val)\n }\n\n return /^(0|[1-9]\\d*)\\.\\d+$/.test(val)\n}\n\n/**\n * 校验是否为小于等于零的浮点数\n */\nexport function isNegativeFloatOrZero(val: string, floatOptions: FloatOptions = {}) {\n const { integer = true } = floatOptions\n\n if (integer) {\n return /^(-?0(\\.0+)?|-(0|[1-9]\\d*)(\\.\\d+)?)$/.test(val)\n }\n\n return /^(-?0\\.0+|-(0|[1-9]\\d*)\\.\\d+)$/.test(val)\n}\n\nexport interface FloatOptions {\n /**\n * 是否包括整数\n * @default true\n */\n integer?: boolean\n}\n","/**\n * 校验是否为整数\n */\nexport function isInteger(val: string) {\n return /^-?(0|[1-9]\\d*)$/.test(val)\n}\n\n/**\n * 校验否为正整数\n */\nexport function isPositiveInteger(val: string) {\n return /^[1-9]\\d*$/.test(val)\n}\n\n/**\n * 校验是否为大于等于零的整数\n */\nexport function isPositiveIntegerOrZero(val: string) {\n return /^(0|[1-9]\\d*)$/.test(val)\n}\n\n/**\n * 校验是否为负整数\n */\nexport function isNegativeInteger(val: string) {\n return /^-([1-9]\\d*)$/.test(val)\n}\n\n/**\n * 校验是否为小于等于零的整数\n */\nexport function isNegativeIntegerOrZero(val: string) {\n return /^(0|-(0|[1-9]\\d*))$/.test(val)\n}\n","import dayjs, { extend } from 'dayjs'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\n\n/**\n * 校验是否为手机号\n */\nexport function isMobilePhone(val: string) {\n return /^1[3-9]\\d{9}$/.test(val)\n}\n\n/**\n * 校验是否为邮箱\n */\nexport function isEmail(val: string) {\n return /^[\\w-]+(?:\\.[\\w-]+)*@[\\w-]+(?:\\.[\\w-]+)*$/.test(val)\n}\n\n/**\n * 校验是否为空字符串\n */\nexport function isEmptyString(val: unknown) {\n return val === ''\n}\n\n// /**\n// * 校验是否为数字或数字字符串\n// */\n// export function isNumberString(val: unknown): val is number {\n// if (isNumber(val)) {\n// return val - val === 0 // 排除 NaN Infinity -Infinity\n// }\n// if (isString(val) && val.trim() !== '') {\n// return Number.isFinite(+val) // 排除字符串 Infinity -Infinity\n// }\n\n// return false\n// }\n\n// /**\n// * 校验是否为奇数\n// */\n// export function isOdd(val: unknown) {\n// const n = Math.abs(val as number)\n// if (!isNumberString(n)) return false\n// if (!Number.isInteger(n)) return false\n// if (!Number.isSafeInteger(n)) {\n// throwError('isOdd', 'value exceeds maximum safe integer')\n// }\n\n// return n % 2 === 1\n// }\n\n// /**\n// * 校验是否为偶数\n// */\n// export function isEven(val: unknown) {\n// const n = Math.abs(val as number)\n// console.log('🍏 ~ n:', val, n)\n// if (!isNumberString(n)) return false\n// if (!Number.isInteger(n)) return false\n// if (!Number.isSafeInteger(n)) {\n// throwError('isEven', 'value exceeds maximum safe integer')\n// }\n\n// return n % 2 === 0\n// }\n\n/**\n * 校验是否为合法时间格式\n * @param format 时间格式\n * @default 'YYYY-MM-DD HH:mm:ss'\n * @see https://day.js.org/docs/zh-CN/parse/string-format\n */\nexport function isDateString(val: string, format = 'YYYY-MM-DD HH:mm:ss') {\n extend(customParseFormat)\n\n return dayjs(val, format, true).isValid()\n}\n\n/**\n * 校验是否为二代身份证号\n */\nexport function isIdCard(val: string) {\n const flag =\n /^[1-9]\\d{5}(?:18|19|20)\\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\\d|3[01])\\d{3}[\\dX]$/i.test(val) &&\n isDateString(val.slice(6, 14), 'YYYYMMDD')\n\n return flag\n}\n\n/**\n * 是否是链接\n */\nexport function isUrl(val: string) {\n return /^(?:http|https):\\/\\/[\\w.]+/.test(val)\n}\n"],"mappings":"yVAIO,SAASA,GAAgBC,EAA2B,CACzD,IAAMC,EAAQ,CAAC,EACXC,EACAC,EAAe,GAEnB,KAAOH,EAAY,GACjBE,EAAY,KAAK,MAAMF,EAAY,CAAC,EACpCC,EAAM,KAAKC,CAAS,EACpBF,EAAY,KAAK,MAAMA,EAAY,CAAC,EAGtC,KAAOC,EAAM,OAAS,GACpBE,GAAgBF,EAAM,IAAI,EAAG,SAAS,EAGxC,OAAOE,CACT,CAEA,IAAMC,EAAe,mEAMd,SAASC,GAAaC,EAAqB,CAChD,IAAIC,EAAS,GACTC,EAAM,GAEV,QAASC,EAAI,EAAGA,EAAIH,EAAI,OAAQG,IAC9BD,GAAOF,EAAIG,CAAC,EAAE,WAAW,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,EAAG,GAAG,EAGzD,QAASA,EAAI,EAAGA,EAAID,EAAI,OAAQC,GAAK,EACnCF,GAAUH,EAAa,SAASI,EAAI,MAAMC,EAAGA,EAAI,CAAC,EAAE,OAAO,EAAG,GAAG,EAAG,CAAC,CAAC,EAGxE,IAAMC,EAAUH,EAAO,OAAS,EAChC,OAAIG,IAAY,IAAGH,GAAU,IAAI,OAAO,EAAIG,CAAO,GAE5CH,CACT,CAMO,SAASI,GAAaL,EAAqB,CAChD,IAAIC,EAAS,GACTC,EAAM,GAEV,QAASC,EAAI,EAAGA,EAAIH,EAAI,QAClBA,EAAIG,CAAC,IAAM,IADeA,IAE9BD,GAAOJ,EAAa,QAAQE,EAAIG,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,EAAG,GAAG,EAGjE,QAASA,EAAI,EAAGA,EAAID,EAAI,OAAQC,GAAK,EAAG,CACtC,IAAMG,EAAS,SAASJ,EAAI,MAAMC,EAAGA,EAAI,CAAC,EAAG,CAAC,EAC1CG,IACFL,GAAU,OAAO,aAAaK,CAAM,EAExC,CAEA,OAAOL,CACT,CC/DO,SAASM,MAAWC,EAAkC,CAC3D,OAAOA,EAAI,OACT,CAACC,EAAUC,IACT,YAAaC,EAAM,CACjB,OAAOD,EAAQD,EAAS,GAAGE,CAAI,CAAC,CAClC,CACJ,CACF,CAMO,SAASC,MAAgBJ,EAAkC,CAChE,OAAOA,EAAI,OACT,CAACC,EAAUC,IACT,YAAaC,EAAM,CACjB,OAAOF,EAASC,EAAQ,GAAGC,CAAI,CAAC,CAClC,CACJ,CACF,CClBO,SAASE,GAASC,EAAkBC,EAAO,IAAK,CACrD,IAAIC,EAAuB,KAE3B,OAAO,YAAaC,EAAa,CAC3BD,GAAO,aAAaA,CAAK,EAC7BA,EAAQ,WAAW,IAAM,CACvBF,EAAO,MAAM,KAAMG,CAAI,CACzB,EAAGF,CAAI,CACT,CACF,CCRO,IAAMG,EAAiB,OAAO,UAAU,SAElCC,EAAgBC,GAA2BF,EAAe,KAAKE,CAAK,EAE7EC,EAAyB,KAEtB,SAASC,GAAQC,EAAc,CAChCC,EAAWD,CAAE,IACfF,EAAQE,EAEZ,CAEA,IAAME,EAAc,CAACC,EAAiCC,KAAkBC,IAAmB,CACzF,GAAI,CAACD,EAAM,OACX,IAAME,EAAUD,EAAI,SAAW,EAAI,GAAKA,EAAI,SAAW,EAAIA,EAAI,CAAC,EAAIA,EAEpE,QAAQF,CAAI,EAAE,SAASC,CAAI,IAAKE,CAAO,CACzC,EAEaC,EAAM,CAACH,KAAkBC,IAAmB,CACvDH,EAAY,OAAQE,EAAM,GAAGC,CAAG,CAClC,EAEAE,EAAI,KAAO,CAACH,KAAkBC,IAAmB,CAC/CH,EAAY,OAAQE,EAAM,GAAGC,CAAG,CAClC,EAEAE,EAAI,MAAQ,CAACH,KAAkBC,IAAmB,CAChDH,EAAY,QAASE,EAAM,GAAGC,CAAG,CACnC,EAEAE,EAAI,KAAO,CAACH,KAAkBC,IAAmB,CAC/CH,EAAY,OAAQE,EAAM,GAAGC,CAAG,CAClC,EAEO,IAAMG,GAAO,IAAIH,IAAmB,QAAQ,KAAK,GAAGA,CAAG,EAEjDI,GAAQ,IAAIJ,IAAmB,QAAQ,MAAM,GAAGA,CAAG,EAEnDK,GAASC,GAAuCf,EAAae,CAAG,IAAM,eAEtEC,GAASD,GAAkCf,EAAae,CAAG,IAAM,eAEjEE,EAAUF,GAA8Bf,EAAae,CAAG,IAAM,gBAE9DG,EAAYH,GAAgCf,EAAae,CAAG,IAAM,kBAElEV,EAAcU,GAAkC,OAAOA,GAAQ,WAE/DI,EAAYJ,GAAgC,OAAOA,GAAQ,SAE3DK,EAAYL,GAAgC,OAAOA,GAAQ,SAE3DM,GAAYN,GAAgC,OAAOA,GAAQ,SAE3DO,EAAYP,GAA0CA,IAAQ,MAAQ,OAAOA,GAAQ,SAErFQ,GAAsBR,GACjCO,EAASP,CAAG,GAAKV,EAAWU,EAAI,IAAI,GAAKV,EAAWU,EAAI,KAAK,EAElDS,EAAWT,GAA+DA,GAAQ,KAElFU,GAAeV,GAAmCA,IAAQ,OAE1DW,GAAUX,GAA8BA,IAAQ,KAEhDY,GAAYZ,GAAuDA,GAAQ,KAE3Ea,GAAab,GAAiC,OAAOA,GAAQ,UAE7Dc,EAAU,MAAM,QAEhBC,EAAS,CAAsCC,EAAWC,IAAW,OAAO,OAAOD,EAAQC,CAAG,EAE9FC,GAAa,CAACC,EAAmBC,IAAsBD,IAAaC,EC1E1E,SAASC,EAAaC,EAAc,CACzC,IAAMC,EAAM,IAAI,QAEhB,SAASC,EAAWC,EAAY,CAC9B,GAAIC,EAAOD,CAAK,EAAG,OAAO,IAAI,KAAKA,CAAK,EACxC,GAAIE,EAASF,CAAK,EAAG,OAAO,IAAI,OAAOA,CAAK,EAE5C,GAAIG,EAASH,CAAK,EAAG,CAEnB,GAAIF,EAAI,IAAIE,CAAK,EAAG,OAAOF,EAAI,IAAIE,CAAK,EACxC,IAAII,EAA0B,CAAC,EAG/B,GAAIC,EAAQL,CAAK,EAAG,CAClBI,EAAQ,CAAC,EACTN,EAAI,IAAIE,EAAOI,CAAK,EACpB,QAAS,EAAI,EAAG,EAAIJ,EAAM,OAAQ,IAChCI,EAAM,CAAC,EAAIL,EAAWC,EAAM,CAAC,CAAC,EAGhC,OAAOI,CACT,CAGAN,EAAI,IAAIE,EAAOI,CAAK,EAEpB,QAAWE,KAAON,EACZO,EAAOP,EAAOM,CAAG,IACnBF,EAAME,CAAG,EAAIP,EAAWC,EAAMM,CAAG,CAAC,GAItC,OAAOF,CACT,CACA,OAAOJ,CACT,CAEA,OAAOD,EAAWF,CAAM,CAC1B,CC3CA,IAAMW,EAAN,cAA0B,KAAM,CAC9B,YAAYC,EAAW,CACrB,MAAMA,CAAC,EACP,KAAK,KAAO,aACd,CACF,EAEO,SAASC,EAAWC,EAAeC,EAAiB,CACzD,MAAM,IAAIJ,EAAY,IAAIG,CAAK,KAAKC,CAAO,EAAE,CAC/C,CAMO,SAASC,EAAUF,EAAuBC,EAAkB,CACjE,GAAI,QAAQ,IAAI,WAAa,aAAc,CACzC,IAAME,EAAeC,EAASJ,CAAK,EAAI,IAAIH,EAAY,IAAIG,CAAK,KAAKC,CAAO,EAAE,EAAID,EAElF,QAAQ,KAAKG,CAAK,CACpB,CACF,CAEO,IAAME,EAAa,CAAC,CACzB,KAAAC,EACA,YAAAC,EACA,QAAAC,EACA,KAAAC,EAAO,KACT,IAKM,CACJP,EAAU,GAAGO,CAAI,GAAI,GAAGH,CAAI,yCAAyCE,CAAO,gBAAgBD,CAAW,WAAW,CACpH,ECjBO,SAASG,EAAUC,EAAqBC,EAAmBC,EAAiC,CACjG,OAAI,CAACC,EAASH,CAAQ,GAAK,CAACG,EAASF,CAAM,IACzCG,EAAW,YAAa,uDAAyB,EAG5CC,EAAQL,CAAQ,EAAIM,GAAWN,EAAUC,EAAQC,CAAO,EAAIK,GAAYP,EAAUC,EAAQC,CAAO,CAC1G,CAEA,SAASK,GAAYP,EAAqBC,EAAmBC,EAA4B,CACvF,IAAMM,EAASC,EAAQR,EAAQC,CAAO,EAEtC,OADqB,OAAO,KAAKF,CAAQ,EAC5B,QAAQU,GAAO,CACtBC,EAAQV,EAAOS,CAAG,CAAC,EACrBF,EAAOE,CAAG,EAAID,EAAQT,EAASU,CAAG,EAAGR,CAAO,EAE5CM,EAAOE,CAAG,EACRP,EAASH,EAASU,CAAG,CAAC,GAAKP,EAASF,EAAOS,CAAG,CAAC,EAC3CX,EAAUC,EAASU,CAAG,EAAGT,EAAOS,CAAG,EAAGR,CAAO,EAC7CO,EAAQR,EAAOS,CAAG,EAAGR,CAAO,CAEtC,CAAC,EAEMM,CACT,CAGA,SAASF,GAAcN,EAAeC,EAAmBC,EAA4B,CACnF,GAAIG,EAAQJ,CAAM,EAAG,CACnB,IAAMW,EAASH,EAAQR,EAAQC,CAAO,EACtC,OAAAU,EAAO,KAAK,GAAGH,EAAQT,EAAUE,CAAO,CAAC,EAElCU,CACT,CACA,OAAOH,EAAQT,EAAUE,CAAO,CAClC,CAEA,SAASO,EAAWR,EAAWC,EAA+B,CAC5D,GAAM,CAAE,UAAAW,EAAY,EAAK,EAAIX,GAAW,CAAC,EAEzC,OAAOW,EAAYA,EAAWZ,CAAM,EAAIA,CAC1C,CC9CA,SAASa,GAAMC,EAAaC,EAAwB,CAClD,GAAM,CAAE,OAAAC,CAAO,EAAIC,EAAU,CAAE,OAAQ,EAAK,EAAGF,GAAW,CAAC,CAAC,EACtDG,EAAiC,CAAC,EACxCJ,EAAI,WAAW,GAAG,IAAMA,EAAMA,EAAI,MAAM,CAAC,GACzCA,EAAI,SAAS,GAAG,IAAMA,EAAMA,EAAI,MAAMA,EAAI,QAAQ,GAAG,EAAI,CAAC,GAE1D,IAAMK,EAAQL,EAAI,MAAM,GAAG,EAAE,OAAO,OAAO,EAE3C,QAAWM,KAAQD,EAAO,CACxB,GAAM,CAACE,EAAKC,CAAK,EAAIF,EAAK,MAAM,GAAG,EACnCF,EAAOG,CAAG,EAAIL,EAAS,mBAAmBM,CAAK,EAAIA,CACrD,CAEA,OAAOJ,CACT,CAWA,SAASK,EAAUC,EAA0BT,EAA4B,CACvE,GAAM,CAAE,OAAAU,CAAO,EAAIR,EAAU,CAAE,OAAQ,EAAK,EAAGF,GAAW,CAAC,CAAC,EAEtDI,EAAQ,CAAC,EACf,QAAWE,KAAOG,EAAK,CACrB,IAAMF,EAAQE,EAAIH,CAAG,EACrBF,EAAM,KAAK,GAAGE,CAAG,IAAII,EAAS,mBAAmBH,CAAK,EAAIA,CAAK,EAAE,CACnE,CAEA,OAAOH,EAAM,KAAK,GAAG,CACvB,CAWA,SAASO,GAAkBC,EAAaH,EAAgBT,EAA4B,CAClF,IAAMa,EAAmBX,EAAU,CAAE,OAAQ,EAAK,EAAGF,GAAW,CAAC,CAAC,EAC5Dc,EAAQN,EAAUC,EAAKI,CAAgB,EAE7C,OAAID,EAAI,SAAS,GAAG,EACXA,EAAI,SAAS,GAAG,GAAKA,EAAI,SAAS,GAAG,EAAI,GAAGA,CAAG,GAAGE,CAAK,GAAK,GAAGF,CAAG,IAAIE,CAAK,GAE7E,GAAGF,CAAG,IAAIE,CAAK,EACxB,CAEO,IAAMC,GAAK,CAChB,MAAAjB,GACA,UAAAU,EACA,kBAAAG,EACF,EChEO,SAASK,GAASC,EAAkBC,EAAO,IAAK,CACrD,IAAIC,EAAuB,KAE3B,OAAO,YAAaC,EAAa,CAC/B,GAAIC,EAAQF,CAAK,EACf,OAAAA,EAAQ,KAAK,IAAI,EAEVF,EAAO,MAAM,KAAMG,CAAI,EAEhC,IAAME,EAAM,KAAK,IAAI,EACrB,GAAIA,EAAMH,GAASD,EACjB,OAAAC,EAAQG,EAEDL,EAAO,MAAM,KAAMG,CAAI,CAElC,CACF,CCpBO,SAASG,GAA6BC,EAAe,CAC1D,MAAO,qBAAqB,KAAKA,CAAK,CACxC,CAKO,SAASC,GAAkCD,EAAe,CAC/D,MAAO,CAACE,EAAQF,CAAK,GAAK,6BAA6B,KAAKA,CAAK,CACnE,CAKO,SAASG,GAA0BH,EAAe,CACvD,MAAO,CAACE,EAAQF,CAAK,GAAK,2BAA2B,KAAKA,CAAK,CACjE,CAKO,SAASI,GAAqCJ,EAAe,CAClE,MAAO,CAACE,EAAQF,CAAK,GAAK,8CAA8C,KAAKA,CAAK,CACpF,CAKO,SAASK,GAAuCL,EAAe,CACpE,MAAO,cAAc,KAAKA,CAAK,CACjC,CAMO,SAASM,GAAeN,EAAe,CAC5C,OAAAO,EAAW,CAAE,KAAM,iBAAkB,YAAa,UAAW,QAAS,OAAQ,CAAC,EAExE,+BAA+B,KAAKP,CAAK,CAClD,CCxCO,SAASQ,EAAaC,EAAsB,CACjD,OAAOC,EAAQD,CAAM,EAAIA,EAAS,CAACA,CAAM,CAC3C,CCNO,SAASE,GAAkBC,EAAmBC,EAAmB,CACtE,OAAI,CAACC,EAASF,CAAM,GAAK,CAACE,EAASD,CAAM,IACvCE,EAAW,YAAa,uDAAyB,EAG5CC,EAAQJ,CAAM,EAAI,OAA+BK,EAAcL,EAAQC,CAAM,CACtF,CAEA,SAASI,EAAcL,EAAmBC,EAAmB,CAC3D,IAAMK,EAAS,CAAC,EAEhB,cAAO,KAAKN,CAAM,EAAE,QAAQO,GAAO,CACjC,IAAMC,EAAaR,EAAOO,CAAG,EACvBE,EAAaR,EAAOM,CAAG,EACzBL,EAASM,CAAU,GAAKN,EAASO,CAAU,EAC7CH,EAAOC,CAAG,EAAIF,EAAcG,EAAYC,CAAU,EACxC,OAAO,GAAGD,EAAYC,CAAU,IAC1CH,EAAOC,CAAG,EAAIE,EAElB,CAAC,EAEMH,CACT,CCfO,SAASI,GACdC,EACAC,EACY,CACZ,IAAMC,EAASC,EAAUH,CAAM,EAE/B,OADaI,EAAUH,CAAU,EAC5B,QAAQI,GAAY,CACnBC,EAAOJ,EAAQG,CAAQ,GAEzB,OAAOH,EAAOG,CAAQ,CAE1B,CAAC,EAEMH,CACT,CAQO,SAASK,GACdP,EACAC,EACY,CACZ,IAAMC,EAAS,CAAC,EAGhB,OAFaE,EAAUH,CAAU,EAE5B,QAAQI,GAAY,CACnBC,EAAON,EAAQK,CAAQ,IACzBH,EAAOG,CAAQ,EAAIL,EAAOK,CAAQ,EAEtC,CAAC,EAEMH,CACT,CCvCO,SAASM,GAAuBC,EAAaC,EAAgD,CAClG,OAAI,CAACC,EAASF,CAAG,GAAKA,GAAO,IAC3BG,EAAW,sBAAuB,+BAAW,EAE1CC,EAAWH,CAAE,GAChBE,EAAW,sBAAuB,mCAAU,EAGvC,MAAM,KAAK,CAAE,OAAQH,CAAI,CAAC,EAC9B,KAAK,CAAC,EACN,IAAI,CAACK,EAAGC,IAAML,EAAGI,EAAGC,CAAC,CAAC,CAC3B,CCbO,SAASC,IAA8B,CAC5C,MAAO,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,EAAG,CAAC,EAAE,OAAO,EAAG,GAAG,CAAC,EAClE,CCNA,OAAOC,GAAS,UAAAC,OAAc,QAC9B,OAAOC,OAAuB,iCCKvB,SAASC,EAAsBC,EAAwC,CAAC,EAAG,CAC5EC,EAASD,CAAO,IAClBA,EAAU,CAAE,IAAKA,CAAQ,GAG3B,GAAM,CAAE,IAAAE,EAAM,EAAG,IAAAC,EAAM,OAAO,gBAAiB,EAAIH,EAE7CI,EAAe,KAAK,KAAKF,CAAG,EAC5BG,EAAe,KAAK,MAAMF,CAAG,EAEnC,OAAIC,IAAiBC,EACZD,GAGLC,EAAeD,IACbD,GAAOD,GACTI,EAAW,wBAAyB,sBAAOJ,CAAG,WAAMC,CAAG,uCAAS,EAGlEG,EAAW,wBAAyB,sBAAOH,CAAG,yCAAWD,CAAG,EAAE,GAGzD,KAAK,MAAM,KAAK,OAAO,GAAKG,EAAeD,EAAe,GAAKA,CAAY,EACpF,CDxBAG,GAAOC,EAAiB,EAOjB,SAASC,EAAmBC,EAA8B,CAAC,EAAW,CAC3E,GAAM,CACJ,MAAAC,EAAQ,sBACR,IAAAC,EAAMC,EAAM,EAAE,OAAO,qBAAqB,EAC1C,OAAAC,EAAS,qBACX,EAAIJ,GAEA,CAACG,EAAMF,CAAK,EAAE,QAAQ,GAAK,CAACE,EAAMD,CAAG,EAAE,QAAQ,IACjDG,EAAW,qBAAsB,oFAAwB,EAG3D,IAAMC,EAAYH,EAAMF,CAAK,EAAE,KAAK,EAC9BM,EAAUJ,EAAMD,CAAG,EAAE,KAAK,EAE1BM,EAAaC,EAAsB,CAAE,IAAKH,EAAW,IAAKC,CAAQ,CAAC,EACnEG,EAAcD,EAAsB,CAAE,IAAK,EAAG,IAAK,EAAG,CAAC,EACvDE,EAAYF,EAAsB,CAAE,IAAK,EAAG,IAAK,EAAG,CAAC,EACrDG,EAAaH,EAAsB,EAAE,EACrCI,EAAeJ,EAAsB,EAAE,EACvCK,EAAeL,EAAsB,EAAE,EAEvCM,EAASZ,EAAM,GAAGK,CAAU,IAAIE,CAAW,IAAIC,CAAS,IAAIC,CAAU,IAAIC,CAAY,IAAIC,CAAY,EAAE,EAG9G,OAAIC,EAAO,SAASZ,EAAMF,CAAK,CAAC,GAAKc,EAAO,QAAQZ,EAAMD,CAAG,CAAC,EACrDH,EAAmBC,CAAO,EAG5Be,EAAO,OAAOX,CAAM,CAC7B,CErCA,IAAMY,EAAc,GACdC,EAAc,EAMb,SAASC,EAAqBC,EAAuC,CAAC,EAAW,CAClFC,EAASD,CAAO,IAClBA,EAAU,CAAE,OAAQA,CAAQ,GAG9B,GAAM,CAAE,UAAAE,EAAY,GAAM,UAAAC,EAAY,GAAM,OAAAC,EAAS,GAAM,MAAAC,EAAQ,CAAC,EAAG,OAAAC,EAAST,CAAY,EAAIG,EAE5FO,EAA+B,CAAE,IAAKV,EAAa,IAAKC,CAAY,EACpEG,EAASK,CAAM,EACjBC,EAA+B,CAAE,IAAKD,EAAQ,IAAKA,CAAO,GAE1DC,EAA+BC,IAAA,GAAKD,GAAiCD,GACjEC,EAA6B,IAAMT,GACrCW,EAAW,uBAAwB,kDAAoBX,CAAW,EAAE,GAIlEI,GAAaC,GAAaC,GAC9BK,EAAW,uBAAwB,wFAA2C,EAGhF,IAAIC,EAAa,GACbR,IAAWQ,GAAc,8BACzBP,IAAWO,GAAc,8BACzBN,IAAQM,GAAc,cAC1BA,GAAcC,EAAUN,CAAK,EAC1B,QAAQO,GAAQA,EAAK,MAAM,EAAE,CAAC,EAC9B,KAAK,EAAE,EAEV,IAAIC,EAAS,GACPC,EAAMC,EAAsBR,CAA4B,EAE9D,QAASS,EAAI,EAAGA,EAAIF,EAAKE,IAAK,CAC5B,IAAMC,EAAc,KAAK,MAAM,KAAK,OAAO,EAAIP,EAAW,MAAM,EAChEG,GAAUH,EAAW,OAAOO,CAAW,CACzC,CAEA,OAAOJ,CACT,CC7CO,SAASK,EAAiBC,EAAc,CAC7C,OAAOA,EAAK,KAAK,MAAM,KAAK,OAAO,EAAIA,EAAK,MAAM,CAAC,CACrD,CCEO,SAASC,IAA8B,CAC5C,IAAMC,EAAiB,CAAC,YAAa,iBAAkB,cAAe,SAAU,UAAW,aAAa,EAElGC,EAAS,GAAGC,EAAqB,CAAC,CAAC,GAAGA,EAAqB,CAC/D,OAAQC,EAAsB,CAAE,IAAK,GAAI,IAAK,CAAE,CAAC,EACjD,MAAO,CAAC,IAAK,IAAK,GAAG,CACvB,CAAC,CAAC,GAAGD,EAAqB,CAAC,CAAC,IAAIE,EAAcJ,CAAc,CAAC,GAG7D,MAAI,SAAS,KAAKC,CAAM,EACfF,GAAoB,EAGtBE,CACT,CChBO,SAASI,GAAoBC,EAA+B,CAAC,EAAG,CACjEC,EAASD,CAAO,IAClBA,EAAU,CAAE,IAAKA,CAAQ,GAG3B,GAAM,CAAE,IAAAE,EAAM,EAAG,IAAAC,EAAM,EAAG,eAAAC,EAAiB,CAAE,EAAIJ,EAEjD,GAAIE,IAAQC,EACV,OAAOD,EAGT,GAAIA,EAAMC,EACR,MAAM,IAAI,MAAM,sBAAOA,CAAG,yCAAWD,CAAG,EAAE,EAG5C,OAAO,KAAK,OAAO,GAAKC,EAAMD,GAAOA,CACvC,CCdO,SAASG,EAA+BC,EAAaC,EAAqC,EAC3F,CAACC,EAASF,CAAG,GAAKA,GAAO,IAC3BG,EAAW,iCAAkC,+BAAW,GAGtD,CAACC,EAAQH,CAAM,GAAKA,EAAO,SAAW,IACxCE,EAAW,iCAAkC,6CAAe,EAG9D,IAAIE,EAAS,GAEb,QAASC,EAAI,EAAGA,EAAIN,EAAKM,IACvBD,GAAUE,EAAcN,CAAM,EAGhC,OAAOI,CACT,CChBO,SAASG,IAA+B,CAC7C,IAAMC,EAASC,EAAsB,CAAE,IAAK,IAAS,IAAK,MAAQ,CAAC,EAC7DC,EAAa,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAEhD,MAAO,CACLF,EACAG,EAAmB,CAAE,OAAQ,UAAW,CAAC,EACzCC,EAA+B,EAAGF,CAAU,EAC5CE,EAA+B,EAAG,CAAC,GAAGF,EAAY,IAAK,GAAG,CAAC,CAC7D,EAAE,KAAK,EAAE,CACX,CCXO,SAASG,IAAoC,CAClD,OACEC,EAAc,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAI,CAAC,EACxDC,EAAsB,SAAW,EAAE,SAAS,EAAE,OAAO,EAAG,GAAG,CAE/D,CCLO,SAASC,IAA4B,CAG1C,IAAMC,EAAS,GAAGC,EAFA,CAAC,UAAW,UAAU,CAEC,CAAC,GAAGC,EAAqB,CAAC,CAAC,GAAGA,EAAqB,CAAE,OAAQ,CAAE,IAAK,GAAI,IAAK,CAAE,EAAG,MAAO,CAAC,GAAG,CAAE,CAAC,CAAC,GAG1I,MAAI,gCAAgC,KAAKF,CAAM,EACtCD,GAAkB,EAGpBC,CACT,CCfO,SAASG,GAAuBC,EAAa,CAClD,MAAO,QAAQ,KAAKA,CAAG,CACzB,CAKO,SAASC,GAAUD,EAAa,CACrC,MAAO,qBAAqB,KAAKA,CAAG,CACtC,CAKO,SAASE,GAAiBF,EAAa,CAC5C,MAAO,cAAc,KAAKA,CAAG,CAC/B,CAKO,SAASG,GAAYH,EAAa,CACvC,MAAO,WAAW,KAAKA,CAAG,CAC5B,CAKO,SAASI,GAAqBJ,EAAa,CAChD,MAAO,aAAa,KAAKA,CAAG,CAC9B,CAKO,SAASK,GAA+BL,EAAa,CAC1D,MAAO,0BAA0B,KAAKA,CAAG,CAC3C,CAKO,SAASM,GAAYN,EAAa,CACvC,MAAO,WAAW,KAAKA,CAAG,CAC5B,CAKO,SAASO,GAAqBP,EAAa,CAChD,MAAO,aAAa,KAAKA,CAAG,CAC9B,CAKO,SAASQ,GAA+BR,EAAa,CAC1D,MAAO,0BAA0B,KAAKA,CAAG,CAC3C,CC1DO,SAASS,GAAQC,EAAaC,EAA6B,CAAC,EAAG,CACpE,GAAM,CAAE,QAAAC,EAAU,EAAK,EAAID,EAC3B,OAAIC,EACK,2BAA2B,KAAKF,CAAG,EAGrC,wBAAwB,KAAKA,CAAG,CACzC,CAKO,SAASG,GAAgBH,EAAaC,EAA6B,CAAC,EAAG,CAC5E,GAAM,CAAE,QAAAC,EAAU,EAAK,EAAID,EAE3B,OAAIC,EACK,mCAAmC,KAAKF,CAAG,EAG7C,kCAAkC,KAAKA,CAAG,CACnD,CAKO,SAASI,GAAgBJ,EAAaC,EAA6B,CAAC,EAAG,CAC5E,GAAM,CAAE,QAAAC,EAAU,EAAK,EAAID,EAE3B,OAAIC,EACK,qCAAqC,KAAKF,CAAG,EAG/C,oCAAoC,KAAKA,CAAG,CACrD,CAKO,SAASK,GAAsBL,EAAaC,EAA6B,CAAC,EAAG,CAClF,GAAM,CAAE,QAAAC,EAAU,EAAK,EAAID,EAE3B,OAAIC,EACK,yBAAyB,KAAKF,CAAG,EAGnC,sBAAsB,KAAKA,CAAG,CACvC,CAKO,SAASM,GAAsBN,EAAaC,EAA6B,CAAC,EAAG,CAClF,GAAM,CAAE,QAAAC,EAAU,EAAK,EAAID,EAE3B,OAAIC,EACK,uCAAuC,KAAKF,CAAG,EAGjD,iCAAiC,KAAKA,CAAG,CAClD,CC3DO,SAASO,GAAUC,EAAa,CACrC,MAAO,mBAAmB,KAAKA,CAAG,CACpC,CAKO,SAASC,GAAkBD,EAAa,CAC7C,MAAO,aAAa,KAAKA,CAAG,CAC9B,CAKO,SAASE,GAAwBF,EAAa,CACnD,MAAO,iBAAiB,KAAKA,CAAG,CAClC,CAKO,SAASG,GAAkBH,EAAa,CAC7C,MAAO,gBAAgB,KAAKA,CAAG,CACjC,CAKO,SAASI,GAAwBJ,EAAa,CACnD,MAAO,sBAAsB,KAAKA,CAAG,CACvC,CCjCA,OAAOK,IAAS,UAAAC,OAAc,QAC9B,OAAOC,OAAuB,iCAKvB,SAASC,GAAcC,EAAa,CACzC,MAAO,gBAAgB,KAAKA,CAAG,CACjC,CAKO,SAASC,GAAQD,EAAa,CACnC,MAAO,4CAA4C,KAAKA,CAAG,CAC7D,CAKO,SAASE,GAAcF,EAAc,CAC1C,OAAOA,IAAQ,EACjB,CAmDO,SAASG,GAAaH,EAAaI,EAAS,sBAAuB,CACxE,OAAAP,GAAOC,EAAiB,EAEjBF,GAAMI,EAAKI,EAAQ,EAAI,EAAE,QAAQ,CAC1C,CAKO,SAASC,GAASL,EAAa,CAKpC,MAHE,mFAAmF,KAAKA,CAAG,GAC3FG,GAAaH,EAAI,MAAM,EAAG,EAAE,EAAG,UAAU,CAG7C,CAKO,SAASM,GAAMN,EAAa,CACjC,MAAO,6BAA6B,KAAKA,CAAG,CAC9C","names":["decimalToBinary","decNumber","stack","remainder","binaryString","BASE64_CHARS","base64Encode","str","result","bin","i","padding","base64Decode","binary","compose","fns","previous","current","args","composeRight","debounce","target","wait","timer","args","objectToString","toTypeString","value","logCb","initLog","cb","isFunction","origConsole","type","name","arg","context","log","warn","error","isMap","val","isSet","isDate","isRegExp","isNumber","isString","isSymbol","isObject","isPromise","isUndef","isUndefined","isNull","isDef","isBoolean","isArray","hasOwn","target","key","hasChanged","oldValue","newValue","deepClone","target","map","_deepClone","value","isDate","isRegExp","isObject","clone","isArray","key","hasOwn","LntvowError","m","throwError","scope","message","debugWarn","error","isString","deprecated","from","replacement","version","type","deepMerge","template","source","options","isObject","throwError","isArray","arrayMerge","mergeObject","target","process","key","isUndef","result","deepClone","parse","str","options","decode","deepMerge","result","pairs","pair","key","value","stringify","obj","encode","appendQueryString","url","stringifyOptions","query","qs","throttle","target","wait","timer","args","isUndef","now","validatorLatitudeOrLongitude","value","validatorChineseOrEnglishOrNumber","isUndef","validatorChineseOrEnglish","validatorUppercaseOrNumbersOrSpecial","validatorUppercaseOrNumbersOrUnderline","validatorEmail","deprecated","castArray","target","isArray","compareProperties","target","source","isObject","throwError","isArray","compareObject","result","key","targetItem","sourceItem","excludeProperties","target","properties","result","deepClone","castArray","property","hasOwn","extractProperties","generateRandomArray","num","cb","isNumber","throwError","isFunction","e","i","generateRandomColor","dayjs","extend","customParseFormat","generateRandomInteger","options","isNumber","min","max","effectiveMin","effectiveMax","throwError","extend","customParseFormat","generateRandomDate","options","start","end","dayjs","format","throwError","startYear","endYear","randomYear","generateRandomInteger","randomMonth","randomDay","randomHour","randomMinute","randomSecond","result","DEFAULT_MAX","DEFAULT_MIN","generateRandomString","options","isNumber","lowerCase","upperCase","number","extra","length","generateRandomIntegerOptions","__spreadValues","throwError","characters","castArray","item","result","len","generateRandomInteger","i","randomIndex","getRandomItem","list","generateRandomEmail","emailProviders","result","generateRandomString","generateRandomInteger","getRandomItem","generateRandomFloat","options","isNumber","min","max","fractionDigits","generateRandomStringFromSource","num","source","isNumber","throwError","isArray","result","i","getRandomItem","generateRandomIdCard","prefix","generateRandomInteger","zeroToNine","generateRandomDate","generateRandomStringFromSource","generateRandomMobilePhone","getRandomItem","generateRandomInteger","generateRandomUrl","result","getRandomItem","generateRandomString","isNumberOrNumberString","val","isChinese","isEnglishAphabet","isUpperCase","isUpperCaseAndNumber","isUpperCaseAndNumberAndChinese","isLowerCase","isLowerCaseAndNumber","isLowerCaseAndNumberAndChinese","isFloat","val","floatOptions","integer","isPositiveFloat","isNegativeFloat","isPositiveFloatOrZero","isNegativeFloatOrZero","isInteger","val","isPositiveInteger","isPositiveIntegerOrZero","isNegativeInteger","isNegativeIntegerOrZero","dayjs","extend","customParseFormat","isMobilePhone","val","isEmail","isEmptyString","isDateString","format","isIdCard","isUrl"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/code.ts","../src/utils/compose.ts","../src/utils/debounce.ts","../src/utils/type.ts","../src/utils/deepClone.ts","../src/utils/error.ts","../src/utils/deepMerge.ts","../src/utils/qs.ts","../src/utils/throttle.ts","../src/utils/validator.ts","../src/array/castArray.ts","../src/object/compareProperties.ts","../src/object/propertyManipulation.ts","../src/random/generateRandomArray.ts","../src/random/generateRandomColor.ts","../src/random/generateRandomDate.ts","../src/random/generateRandomInteger.ts","../src/random/generateRandomString.ts","../src/random/getRandomItem.ts","../src/random/generateRandomEmail.ts","../src/random/generateRandomFloat.ts","../src/random/generateRandomStringFromSource.ts","../src/random/generateRandomIdCard.ts","../src/random/generateRandomMobilePhone.ts","../src/random/generateRandomUrl.ts","../src/validator/aphabet.ts","../src/validator/float.ts","../src/validator/integer.ts","../src/validator/utils.ts"],"sourcesContent":["/**\n * 十进制转二进制\n * @example decimalToBinary(233) => '11101001'\n */\nexport function decimalToBinary(decNumber: number): string {\n const stack = []\n let remainder\n let binaryString = ''\n\n while (decNumber > 0) {\n remainder = Math.floor(decNumber % 2)\n stack.push(remainder)\n decNumber = Math.floor(decNumber / 2)\n }\n\n while (stack.length > 0) {\n binaryString += stack.pop()!.toString()\n }\n\n return binaryString\n}\n\nconst BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n\n/**\n * Base64 编码\n * @example base64Encode('hello') => 'aGVsbG8='\n */\nexport function base64Encode(str: string): string {\n let result = ''\n let bin = ''\n\n for (let i = 0; i < str.length; i++) {\n bin += str[i].charCodeAt(0).toString(2).padStart(8, '0')\n }\n\n for (let i = 0; i < bin.length; i += 6) {\n result += BASE64_CHARS[parseInt(bin.slice(i, i + 6).padEnd(6, '0'), 2)]\n }\n\n const padding = result.length % 4\n if (padding !== 0) result += '='.repeat(4 - padding)\n\n return result\n}\n\n/**\n * Base64 解码\n * @example base64Decode('aGVsbG8=') => 'hello'\n */\nexport function base64Decode(str: string): string {\n let result = ''\n let bin = ''\n\n for (let i = 0; i < str.length; i++) {\n if (str[i] === '=') break\n bin += BASE64_CHARS.indexOf(str[i]).toString(2).padStart(6, '0')\n }\n\n for (let i = 0; i < bin.length; i += 8) {\n const binary = parseInt(bin.slice(i, i + 8), 2)\n if (binary) {\n result += String.fromCharCode(binary)\n }\n }\n\n return result\n}\n","/**\n * compose\n * @param fns 任意函数\n */\nexport function compose(...fns: ((...args: any[]) => any)[]) {\n return fns.reduce(\n (previous, current) =>\n function (...args) {\n return current(previous(...args))\n }\n )\n}\n\n/**\n * compose 从右到左\n * @param fns 任意函数\n */\nexport function composeRight(...fns: ((...args: any[]) => any)[]) {\n return fns.reduce(\n (previous, current) =>\n function (...args) {\n return previous(current(...args))\n }\n )\n}\n","/**\n * 防抖函数\n * @param target 目标函数\n * @param wait 等待时间 默认 500ms\n * @example debounce(() => console.log('debounce'), 500)\n */\nexport function debounce(target: Function, wait = 500) {\n let timer: number | null = null\n\n return function (...args: any[]) {\n if (timer) clearTimeout(timer)\n timer = setTimeout(() => {\n target.apply(this, args)\n }, wait) as any\n }\n}\n","/* eslint-disable no-console */\n\n/* eslint-disable ts/ban-types */\nexport type AnyObject = Record<string, any>\n\nexport type ArrayItem<T> = T extends (infer U)[] ? U : never\n\nexport const objectToString = Object.prototype.toString\n\nexport const toTypeString = (value: unknown): string => objectToString.call(value)\n\nlet logCb: Function | null = null\n\nexport function initLog(cb: Function) {\n if (isFunction(cb)) {\n logCb = cb\n }\n}\n\nconst origConsole = (type: 'info' | 'warn' | 'error', name: unknown, ...arg: unknown[]) => {\n if (!name) return\n const context = arg.length === 0 ? '' : arg.length === 1 ? arg[0] : arg\n\n console[type](`[Log] ${name}:`, context)\n}\n\nexport const log = (name: unknown, ...arg: unknown[]) => {\n origConsole('info', name, ...arg)\n}\n\nlog.info = (name: unknown, ...arg: unknown[]) => {\n origConsole('info', name, ...arg)\n}\n\nlog.error = (name: unknown, ...arg: unknown[]) => {\n origConsole('error', name, ...arg)\n}\n\nlog.warn = (name: unknown, ...arg: unknown[]) => {\n origConsole('warn', name, ...arg)\n}\n\nexport const warn = (...arg: unknown[]) => console.warn(...arg)\n\nexport const error = (...arg: unknown[]) => console.error(...arg)\n\nexport const isMap = (val: unknown): val is Map<any, any> => toTypeString(val) === '[object Map]'\n\nexport const isSet = (val: unknown): val is Set<any> => toTypeString(val) === '[object Set]'\n\nexport const isDate = (val: unknown): val is Date => toTypeString(val) === '[object Date]'\n\nexport const isRegExp = (val: unknown): val is RegExp => toTypeString(val) === '[object RegExp]'\n\nexport const isFunction = (val: unknown): val is Function => typeof val === 'function'\n\nexport const isNumber = (val: unknown): val is number => typeof val === 'number'\n\nexport const isString = (val: unknown): val is string => typeof val === 'string'\n\nexport const isSymbol = (val: unknown): val is symbol => typeof val === 'symbol'\n\nexport const isObject = (val: unknown): val is Record<any, any> => val !== null && typeof val === 'object'\n\nexport const isPromise = <T = any>(val: unknown): val is Promise<T> =>\n isObject(val) && isFunction(val.then) && isFunction(val.catch)\n\nexport const isUndef = (val: unknown): val is undefined | null => val === undefined || val === null\n\nexport const isUndefined = (val: unknown): val is undefined => val === undefined\n\nexport const isNull = (val: unknown): val is null => val === null\n\nexport const isDef = <T>(val: T): val is NonNullable<T> => val !== undefined && val !== null\n\nexport const isBoolean = (val: unknown): val is boolean => typeof val === 'boolean'\n\nexport const isArray = Array.isArray\n\nexport const hasOwn = <T extends object, U extends keyof T>(target: T, key: U) => Object.hasOwn(target, key)\n\nexport const hasChanged = (oldValue: unknown, newValue: unknown) => oldValue !== newValue\n\nexport type Arrayable<T> = T | T[]\n\n// export function isMobilePhone() {\n// if (\n// navigator.userAgent.indexOf('Mobile') > -1 ||\n// navigator.userAgent.indexOf('Android') > -1 ||\n// navigator.userAgent.indexOf('iPhone') > -1 ||\n// navigator.userAgent.indexOf('iPad') > -1 ||\n// navigator.userAgent.indexOf('Windows Phone') > -1 ||\n// navigator.userAgent.indexOf('BlackBerry') > -1 ||\n// navigator.userAgent.indexOf('Symbian') > -1\n// ) {\n// return true\n// }\n// return false\n// }\n","import { hasOwn, isArray, isDate, isObject, isRegExp } from './type'\n\n/**\n * 深拷贝\n * @param target 拷贝对象\n * @example deepClone({ name: 1, obj: { name: 1 }, arr: [1, 2, 3] }) => { name: 1, obj: { name: 1 }, arr: [1, 2, 3] }\n */\nexport function deepClone<T>(target: T): T {\n const map = new WeakMap()\n\n function _deepClone(value: any) {\n if (isDate(value)) return new Date(value)\n if (isRegExp(value)) return new RegExp(value)\n\n if (isObject(value)) {\n // 取出 WeakMap 中缓存的 clone 对象\n if (map.has(value)) return map.get(value)\n let clone: Record<any, any> = {}\n\n // 处理数组\n if (isArray(value)) {\n clone = []\n map.set(value, clone)\n for (let i = 0; i < value.length; i++) {\n clone[i] = _deepClone(value[i])\n }\n\n return clone\n }\n\n // 设置缓存\n map.set(value, clone)\n\n for (const key in value) {\n if (hasOwn(value, key)) {\n clone[key] = _deepClone(value[key])\n }\n }\n\n return clone\n }\n return value\n }\n\n return _deepClone(target)\n}\n","import { isString } from './type'\n\nclass LntvowError extends Error {\n constructor(m: string) {\n super(m)\n this.name = 'LntvowError'\n }\n}\n\nexport function throwError(scope: string, message: string) {\n throw new LntvowError(`[${scope}] ${message}`)\n}\n\nexport function debugWarn(err: Error): void\n\nexport function debugWarn(scope: string, message: string): void\n\nexport function debugWarn(scope: string | Error, message?: string) {\n if (process.env.NODE_ENV !== 'production') {\n const error: Error = isString(scope) ? new LntvowError(`[${scope}] ${message}`) : scope\n\n console.warn(error)\n }\n}\n\nexport const deprecated = ({\n from,\n replacement,\n version,\n type = 'API',\n}: {\n from: string\n replacement: string\n version: string\n type?: 'API'\n}) => {\n debugWarn(`${type}`, `${from} is about to be deprecated in version ${version}, please use ${replacement} instead.`)\n}\n","import { isArray, type AnyObject, isObject, isUndef } from './type'\nimport { deepClone as _deepClone } from './deepClone'\nimport { throwError } from './error'\n\ninterface DeepMergeOptions {\n /**\n * 是否开启深拷贝 默认开启\n * @default true\n */\n deepClone: boolean\n}\n\n/**\n * 深度合并两对象\n * @param template 模板对象 就是默认值\n * @param source 源对象 就是用户传入的值\n * @param options 配置对象\n * @example deepMerge({ name: 1, obj: { name: '默认' , text: '旧值' }, arr: [1, 2, 3] }, { name: 1, obj: { name: '修改', age: '新增' }, test: 'test' }) => { name: 1, obj: { name: '修改', text: '旧值', age: '新增' }, arr: [1, 2, 3], test: 'test' }\n */\n\nexport function deepMerge(template: AnyObject, source: AnyObject, options?: DeepMergeOptions): any {\n if (!isObject(template) || !isObject(source)) {\n throwError('deepMerge', 'template 和 source 必须是对象')\n }\n\n return isArray(template) ? arrayMerge(template, source, options) : mergeObject(template, source, options)\n}\n\nfunction mergeObject(template: AnyObject, source: AnyObject, options?: DeepMergeOptions) {\n const target = process(source, options)\n const templateKeys = Object.keys(template)\n templateKeys.forEach(key => {\n if (isUndef(source[key])) {\n target[key] = process(template[key], options)\n } else {\n target[key] =\n isObject(template[key]) && isObject(source[key])\n ? deepMerge(template[key], source[key], options)\n : process(source[key], options)\n }\n })\n\n return target\n}\n\n// 数组暂时没有深拷贝的需求\nfunction arrayMerge<T>(template: T[], source: AnyObject, options?: DeepMergeOptions) {\n if (isArray(source)) {\n const result = process(source, options)\n result.push(...process(template, options))\n\n return result\n }\n return process(template, options)\n}\n\nfunction process<T>(source: T, options?: DeepMergeOptions): T {\n const { deepClone = true } = options || {}\n\n return deepClone ? _deepClone(source) : source\n}\n","import { deepMerge } from './deepMerge'\nimport type { AnyObject } from './type'\n\n/**\n * 解析查询字符串\n * @param str 转换的字符串\n * @return 转换后的对象\n * @example\n * parse('a=1&b=2') => { a: '1', b: '2' }\n * parse('?a=1&b=2') => { a: '1', b: '2' }\n * parse('&a=1&b=2') => { a: '1', b: '2' }\n * parse('from=%E4%B8%AD%E5%9B%BD') => { from: '中国' }\n * parse('from=%E4%B8%AD%E5%9B%BD', { decode: false }) => { from: '%E4%B8%AD%E5%9B%BD' }\n */\nfunction parse(str: string, options?: ParseOptions) {\n const { decode } = deepMerge({ decode: true }, options || {}) as ParseOptions\n const result: Record<string, string> = {}\n str.startsWith('?') && (str = str.slice(1))\n str.includes('?') && (str = str.slice(str.indexOf('?') + 1))\n\n const pairs = str.split('&').filter(Boolean)\n\n for (const pair of pairs) {\n const [key, value] = pair.split('=')\n result[key] = decode ? decodeURIComponent(value) : value\n }\n\n return result\n}\n\n/**\n * 转换对象为查询字符串\n * @param obj 转换的对象\n * @return 转换后的字符串\n * @example\n * stringify({ a: '1', b: '2' }) => 'a=1&b=2'\n * stringify({ from: '中国' }) => 'from=%E4%B8%AD%E5%9B%BD'\n * stringify({ from: '中国' }, { encode: false }) => 'from=中国'\n */\nfunction stringify(obj: Record<string, any>, options?: StringifyOptions) {\n const { encode } = deepMerge({ encode: true }, options || {}) as StringifyOptions\n\n const pairs = []\n for (const key in obj) {\n const value = obj[key]\n pairs.push(`${key}=${encode ? encodeURIComponent(value) : value}`)\n }\n\n return pairs.join('&')\n}\n\n/**\n * url追加查询字符串\n * @param url url\n * @param obj 查询字符串对象\n * @return 追加后的url\n * @example\n * appendQueryString('https://www.baidu.com', { a: '1', b: '2' }) => 'https://www.baidu.com?a=1&b=2'\n * appendQueryString('/pages/index?id=10', { test:'23' }) => '/pages/index?id=10&test=23'\n */\nfunction appendQueryString(url: string, obj: AnyObject, options?: StringifyOptions) {\n const stringifyOptions = deepMerge({ encode: true }, options || {}) as StringifyOptions\n const query = stringify(obj, stringifyOptions)\n\n if (url.includes('?')) {\n return url.endsWith('?') || url.endsWith('&') ? `${url}${query}` : `${url}&${query}`\n }\n return `${url}?${query}`\n}\n\nexport const qs = {\n parse,\n stringify,\n appendQueryString,\n}\n\nexport interface ParseOptions {\n /**\n * 是否解码\n * @default true\n */\n decode?: boolean\n}\n\nexport interface StringifyOptions {\n /**\n * 是否编码\n * @default true\n */\n encode?: boolean\n}\n","/* eslint-disable no-invalid-this */\n/* eslint-disable ts/ban-types */\nimport { isUndef } from './type'\n\n/**\n * 节流函数\n * @param target 目标函数\n * @param wait 等待时间 默认 500ms\n * @example throttle(() => console.log('hello world'), 500)\n */\nexport function throttle(target: Function, wait = 500) {\n let timer: number | null = null\n\n return function (...args: any[]) {\n if (isUndef(timer)) {\n timer = Date.now()\n\n return target.apply(this, args)\n }\n const now = Date.now()\n if (now - timer >= wait) {\n timer = now\n\n return target.apply(this, args)\n }\n }\n}\n","import { deprecated } from './error'\nimport { isUndef } from './type'\n\n/**\n * 校验经纬度\n */\nexport function validatorLatitudeOrLongitude(value: string) {\n return /^-?\\d{1,3}\\.\\d{6}$/.test(value)\n}\n\n/**\n * 校验中文、字母、数字\n */\nexport function validatorChineseOrEnglishOrNumber(value: string) {\n return !isUndef(value) && /^[\\dA-Za-z\\u4E00-\\u9FA5]+$/.test(value)\n}\n\n/**\n * 校验中英文\n */\nexport function validatorChineseOrEnglish(value: string) {\n return !isUndef(value) && /^[A-Za-z\\u4E00-\\u9FA5]+$/.test(value)\n}\n\n/**\n * 校验大写字母、数字、特殊字符 特殊字符包括 !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\n */\nexport function validatorUppercaseOrNumbersOrSpecial(value: string) {\n return !isUndef(value) && /^[\\d!\"#$%&'()*+,./:;<=>?@A-Z[\\\\\\]^_`{|}~]+$/.test(value)\n}\n\n/**\n * 校验大写字母、数字、_\n */\nexport function validatorUppercaseOrNumbersOrUnderline(value: string) {\n return /^[\\dA-Z_]+$/.test(value)\n}\n\n/**\n * 校验是否为邮箱\n * @deprecated 使用 isEmail 代替\n */\nexport function validatorEmail(value: string) {\n deprecated({ from: 'validatorEmail', replacement: 'isEmail', version: '2.4.0' })\n\n return /^([\\w-])+@([\\w-])+(\\.[\\w-])+/.test(value)\n}\n","import { isArray } from '@/utils'\n\n/**\n * 将非数组转换为数组 如果是目标本就是数组则直接返回\n * @example castArray(1) => [1]\n */\nexport function castArray<T>(target: T | T[]): T[] {\n return isArray(target) ? target : [target]\n}\n","import { isObject, type AnyObject, isArray, throwError } from '../utils'\n\nexport function compareProperties(target: AnyObject, source: AnyObject) {\n if (!isObject(target) || !isObject(source)) {\n throwError('deepMerge', 'template 和 source 必须是对象')\n }\n\n return isArray(target) ? compareArray(target, source) : compareObject(target, source)\n}\n\nfunction compareObject(target: AnyObject, source: AnyObject) {\n const result = {} as AnyObject\n\n Object.keys(target).forEach(key => {\n const targetItem = target[key]\n const sourceItem = source[key]\n if (isObject(targetItem) && isObject(sourceItem)) {\n result[key] = compareObject(targetItem, sourceItem)\n } else if (!Object.is(targetItem, sourceItem)) {\n result[key] = sourceItem\n }\n })\n\n return result\n}\n\nfunction compareArray<T>(target: T[], source: AnyObject) {\n // if (isArray(source)) {\n // target.every((item, index) => {})\n // } else {\n // return source\n // }\n}\n","import { deepClone, type Arrayable, hasOwn, type AnyObject } from '../utils'\nimport { castArray } from '../array'\n\n/**\n * 排除对象中的某些属性\n * @param target 目标对象\n * @param properties 要排除的属性\n * @example excludeProperties({ a: 1, b: 2, c: 3 }, ['a', 'b']) => { c: 3 }\n */\nexport function excludeProperties<T extends AnyObject, K extends keyof T>(\n target: T,\n properties: Arrayable<K>\n): Omit<T, K> {\n const result = deepClone(target)\n const list = castArray(properties)\n list.forEach(property => {\n if (hasOwn(result, property)) {\n // eslint-disable-next-line ts/no-dynamic-delete\n delete result[property]\n }\n })\n\n return result\n}\n\n/**\n * 提取对象中的某些属性\n * @param target 目标对象\n * @param properties 要提取的属性\n * @example extractProperties({ a: 1, b: 2, c: 3 }, ['a', 'b']) => { a: 1, b: 2 }\n */\nexport function extractProperties<T extends AnyObject, K extends keyof T>(\n target: T,\n properties: Arrayable<K>\n): Pick<T, K> {\n const result = {} as Pick<T, K>\n const list = castArray(properties)\n\n list.forEach(property => {\n if (hasOwn(target, property)) {\n result[property] = target[property]\n }\n })\n\n return result\n}\n","import { isFunction, isNumber, throwError } from '@/utils'\n\n/**\n * 生成随机数组\n * @example generateRandomArray(4, () => 1) => [1, 1, 1, 1]\n * */\nexport function generateRandomArray<T>(num: number, cb: (item?: unknown, index?: number) => T): T[] {\n if (!isNumber(num) || num <= 0) {\n throwError('generateRandomArray', 'num 必须大于0')\n }\n if (!isFunction(cb)) {\n throwError('generateRandomArray', 'cb 必须是函数')\n }\n\n return Array.from({ length: num })\n .fill(0)\n .map((e, i) => cb(e, i))\n}\n","/**\n * 生成随机颜色\n * @example generateRandomColor() => '#f36a38'\n * */\nexport function generateRandomColor(): string {\n return `#${Math.random().toString(16).slice(2, 8).padEnd(6, '0')}`\n}\n","import dayjs, { extend } from 'dayjs'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\nimport { generateRandomInteger } from './generateRandomInteger'\nimport { throwError } from '@/utils'\n\nextend(customParseFormat)\n\n/**\n * 生成随机时间\n * @example generateRandomDate() => '2021-07-01 08:51:34'\n * */\n\nexport function generateRandomDate(options: GenerateRandomDate = {}): string {\n const {\n start = '1800-01-01 00:00:00',\n end = dayjs().format('YYYY-MM-DD HH:mm:ss'),\n format = 'YYYY-MM-DD HH:mm:ss',\n } = options\n\n if (!dayjs(start).isValid() || !dayjs(end).isValid()) {\n throwError('generateRandomDate', 'start end 参数必须是合法的时间格式')\n }\n\n const startYear = dayjs(start).year()\n const endYear = dayjs(end).year()\n\n const randomYear = generateRandomInteger({ min: startYear, max: endYear })\n const randomMonth = generateRandomInteger({ min: 1, max: 12 })\n const randomDay = generateRandomInteger({ min: 1, max: 31 })\n const randomHour = generateRandomInteger(23)\n const randomMinute = generateRandomInteger(59)\n const randomSecond = generateRandomInteger(59)\n\n const result = dayjs(`${randomYear}-${randomMonth}-${randomDay} ${randomHour}:${randomMinute}:${randomSecond}`)\n\n // 异常时间处理\n if (result.isBefore(dayjs(start)) || result.isAfter(dayjs(end))) {\n return generateRandomDate(options)\n }\n\n return result.format(format)\n}\n\ninterface GenerateRandomDate {\n /**\n * 开始时间\n * @default 1800-01-01 00:00:00\n */\n start?: string | Date\n\n /**\n * 结束时间\n * @default 当前时间\n */\n end?: string | Date\n\n /**\n * 时间格式\n * @default YYYY-MM-DD HH:mm:ss\n */\n format?: string\n}\n","import { isNumber, throwError } from '@/utils'\n\n/**\n * 生成范围内的随机整数\n * @example generateRandomInteger() => 217342\n * */\nexport function generateRandomInteger(options: GenerateRandomIntegerOptions = {}) {\n if (isNumber(options)) {\n options = { max: options }\n }\n\n const { min = 0, max = Number.MAX_SAFE_INTEGER } = options\n\n const effectiveMin = Math.ceil(min)\n const effectiveMax = Math.floor(max)\n\n if (effectiveMin === effectiveMax) {\n return effectiveMin\n }\n\n if (effectiveMax < effectiveMin) {\n if (max >= min) {\n throwError('generateRandomInteger', `未找到 ${min} 和 ${max} 之间的整数值`)\n }\n\n throwError('generateRandomInteger', `最大值 ${max} 应大于最小值 ${min}`)\n }\n\n return Math.floor(Math.random() * (effectiveMax - effectiveMin + 1) + effectiveMin)\n}\n\ntype GenerateRandomIntegerOptions =\n | number\n | {\n /**\n * 最大值\n * @default Number.MAX_SAFE_INTEGER\n */\n max?: number\n\n /**\n * 最小值\n * @default 0\n */\n min?: number\n }\n","import { castArray } from '..'\nimport { generateRandomInteger } from './generateRandomInteger'\nimport { isNumber, throwError, type Arrayable } from '@/utils'\n\nconst DEFAULT_MAX = 16\nconst DEFAULT_MIN = 1\n\n/**\n * 生成随机字符串 大小写字母和数字\n * @example generateRandomString() => 'lZtJqMl0dyTO3WDG'\n * */\nexport function generateRandomString(options: GenerateRandomStringOptions = {}): string {\n if (isNumber(options)) {\n options = { length: options }\n }\n\n const { lowerCase = true, upperCase = true, number = true, extra = [], length = DEFAULT_MAX } = options\n\n let generateRandomIntegerOptions = { max: DEFAULT_MAX, min: DEFAULT_MIN }\n if (isNumber(length)) {\n generateRandomIntegerOptions = { max: length, min: length }\n } else {\n generateRandomIntegerOptions = { ...generateRandomIntegerOptions, ...length }\n if (generateRandomIntegerOptions.min < DEFAULT_MIN) {\n throwError('generateRandomString', `length.min 必须大于等于${DEFAULT_MIN}`)\n }\n }\n\n if (!(lowerCase || upperCase || number)) {\n throwError('generateRandomString', 'lowerCase upperCase number 至少需要一个参数为true')\n }\n\n let characters = ''\n if (lowerCase) characters += 'abcdefghijklmnopqrstuvwxyz'\n if (upperCase) characters += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'\n if (number) characters += '0123456789'\n characters += castArray(extra)\n .flatMap(item => item.split(''))\n .join('')\n\n let result = ''\n const len = generateRandomInteger(generateRandomIntegerOptions)\n\n for (let i = 0; i < len; i++) {\n const randomIndex = Math.floor(Math.random() * characters.length)\n result += characters.charAt(randomIndex)\n }\n\n return result\n}\n\ntype GenerateRandomStringOptions =\n /**\n * 生成字符串的长度\n * @default 16\n */\n | number\n | {\n /**\n * 生成字符串的长度 若传递对象则生成 max 和 min 之间的随机长度\n */\n length?:\n | number\n | {\n /**\n * 最大值\n * @default 16\n */\n max?: number\n\n /**\n * 最小值\n * @default 1\n */\n min?: number\n }\n /**\n * 是否包含小写字母\n * @default true\n */\n lowerCase?: boolean\n /**\n * 是否包含大写字母\n * @default true\n */\n upperCase?: boolean\n /**\n * 是否包含数字\n * @default true\n */\n number?: boolean\n /**\n * 扩展字符\n * @default []\n * @example ['-', '_','@']\n */\n extra?: Arrayable<string>\n }\n","/**\n * 获取数组中的随机元素\n * @example getRandomItem([0, 1, 2, 3, 4]) => 2\n */\nexport function getRandomItem<T>(list: T[]): T {\n return list[Math.floor(Math.random() * list.length)]\n}\n","import { generateRandomInteger } from './generateRandomInteger'\nimport { generateRandomString } from './generateRandomString'\nimport { getRandomItem } from './getRandomItem'\n\n/**\n * 生成随机邮箱\n * @example generateRandomEmail() => lZtJqMl0dyTO3WDGzFDO@gmail.com\n */\nexport function generateRandomEmail(): string {\n const emailProviders = ['gmail.com', 'outlook.com.cn', 'example.com', 'qq.com', '163.com', 'test.com.cn']\n\n const result = `${generateRandomString(1)}${generateRandomString({\n length: generateRandomInteger({ max: 30, min: 1 }),\n extra: ['.', '_', '-'],\n })}${generateRandomString(1)}@${getRandomItem(emailProviders)}`\n\n // 异常邮箱处理\n if (/\\.{2,}/.test(result)) {\n return generateRandomEmail()\n }\n\n return result\n}\n","import { isNumber } from '@/utils'\n\n/**\n * 生成范围内的随机浮点数\n * @example generateRandomFloat() => 0.35\n * */\nexport function generateRandomFloat(options: GenerateRandomFloat = {}) {\n if (isNumber(options)) {\n options = { max: options }\n }\n\n const { min = 0, max = 1, fractionDigits = 2 } = options\n\n if (min === max) {\n return min\n }\n\n if (min > max) {\n throw new Error(`最大值 ${max} 应大于最小值 ${min}`)\n }\n\n return Math.random() * (max - min) + min\n}\n\ntype GenerateRandomFloat =\n | number\n | {\n /**\n * 最大值\n * @default 1.00\n */\n max?: number\n\n /**\n * 最小值\n * @default 0.00\n */\n min?: number\n\n /**\n * 小数位数\n * @default 2\n */\n fractionDigits?: number\n }\n","import { getRandomItem } from './getRandomItem'\nimport { isArray, isNumber, throwError } from '@/utils'\n\n/**\n * 生成随机数据从数据源中\n * @param num 随机获取数据源子项次数\n * @example generateRandomStringFromSource(4, ['1', 'b', 'c', 'd', 'e']) => 'dea1'\n * */\nexport function generateRandomStringFromSource(num: number, source: (number | string)[]): string {\n if (!isNumber(num) || num <= 0) {\n throwError('generateRandomStringFromSource', 'num 必须大于0')\n }\n\n if (!isArray(source) || source.length === 0) {\n throwError('generateRandomStringFromSource', 'source 不能为空数组')\n }\n\n let result = ''\n\n for (let i = 0; i < num; i++) {\n result += getRandomItem(source)\n }\n\n return result\n}\n","import { generateRandomStringFromSource } from './generateRandomStringFromSource'\nimport { generateRandomDate } from './generateRandomDate'\nimport { generateRandomInteger } from './generateRandomInteger'\n\n/**\n * 生成随机二代身份证号\n * @example generateRandomIdCard() => '410304200210165258'\n */\nexport function generateRandomIdCard(): string {\n const prefix = generateRandomInteger({ min: 100_000, max: 999_999 })\n const zeroToNine = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n\n return [\n prefix,\n generateRandomDate({ format: 'YYYYMMDD' }),\n generateRandomStringFromSource(3, zeroToNine),\n generateRandomStringFromSource(1, [...zeroToNine, 'X', 'x']),\n ].join('')\n}\n","import { generateRandomInteger } from './generateRandomInteger'\nimport { getRandomItem } from './getRandomItem'\n\n/**\n * 生成随机手机号码\n * @example generateRandomMobilePhone() => 13012345678\n */\nexport function generateRandomMobilePhone(): string {\n return (\n getRandomItem(['13', '14', '15', '16', '17', '18', '19']) +\n generateRandomInteger(999_999_999).toString().padEnd(9, '0')\n )\n}\n","import { generateRandomString } from './generateRandomString'\nimport { getRandomItem } from './getRandomItem'\n\n/**\n * 生成随机url\n * @example generateRandomUrl() => 'https://guyme6GCT/Nc58L/NFGdhfCkJi'\n */\nexport function generateRandomUrl(): string {\n const urlPrefix = ['http://', 'https://']\n\n const result = `${getRandomItem(urlPrefix)}${generateRandomString(1)}${generateRandomString({ length: { max: 60, min: 5 }, extra: ['/'] })}`\n\n // 异常url处理\n if (/^(?:http|https):\\/\\/\\w*\\/{2,}/.test(result)) {\n return generateRandomUrl()\n }\n\n return result\n}\n","/**\n * 校验是否为数字\n */\nexport function isNumberOrNumberString(val: string) {\n return /^\\d+$/.test(val)\n}\n\n/**\n * 校验是否为中文\n */\nexport function isChinese(val: string) {\n return /^[\\u4E00-\\u9FA5]+$/.test(val)\n}\n\n/**\n * 校验是否为英文字母\n */\nexport function isEnglishAphabet(val: string) {\n return /^[A-Za-z]+$/.test(val)\n}\n\n/**\n * 校验是否为大写字母\n */\nexport function isUpperCase(val: string) {\n return /^[A-Z]+$/.test(val)\n}\n\n/**\n * 校验是否为大写字母和数字\n */\nexport function isUpperCaseAndNumber(val: string) {\n return /^[\\dA-Z]+$/.test(val)\n}\n\n/**\n * 校验是否为大写字母数字和中文\n */\nexport function isUpperCaseAndNumberAndChinese(val: string) {\n return /^[\\dA-Z\\u4E00-\\u9FA5]+$/.test(val)\n}\n\n/**\n * 校验是否为小写字母\n */\nexport function isLowerCase(val: string) {\n return /^[a-z]+$/.test(val)\n}\n\n/**\n * 校验是否为小写字母和数字\n */\nexport function isLowerCaseAndNumber(val: string) {\n return /^[\\da-z]+$/.test(val)\n}\n\n/**\n * 校验是否为小写字母数字和中文\n */\nexport function isLowerCaseAndNumberAndChinese(val: string) {\n return /^[\\da-z\\u4E00-\\u9FA5]+$/.test(val)\n}\n","/**\n * 校验是否为浮点数\n */\nexport function isFloat(val: string, floatOptions: FloatOptions = {}) {\n const { integer = true } = floatOptions\n if (integer) {\n return /^-?(0|[1-9]\\d*)(\\.\\d+)?$/.test(val)\n }\n\n return /^-?(0|[1-9]\\d*)\\.\\d+$/.test(val)\n}\n\n/**\n * 校验是否为大于零的浮点数\n */\nexport function isPositiveFloat(val: string, floatOptions: FloatOptions = {}) {\n const { integer = true } = floatOptions\n\n if (integer) {\n return /^[1-9]\\d*\\.?\\d*|^0\\.\\d*[1-9]\\d*$/.test(val)\n }\n\n return /^[1-9]\\d*\\.\\d*|^0\\.\\d*[1-9]\\d*$/.test(val)\n}\n\n/**\n * 校验是否为小于零的浮点数\n */\nexport function isNegativeFloat(val: string, floatOptions: FloatOptions = {}) {\n const { integer = true } = floatOptions\n\n if (integer) {\n return /^-[1-9]\\d*\\.?\\d*|^-0\\.\\d*[1-9]\\d*$/.test(val)\n }\n\n return /^-[1-9]\\d*\\.\\d*|^-0\\.\\d*[1-9]\\d*$/.test(val)\n}\n\n/**\n * 校验是否为大于等于零的浮点数\n */\nexport function isPositiveFloatOrZero(val: string, floatOptions: FloatOptions = {}) {\n const { integer = true } = floatOptions\n\n if (integer) {\n return /^(0|[1-9]\\d*)(\\.\\d+)?$/.test(val)\n }\n\n return /^(0|[1-9]\\d*)\\.\\d+$/.test(val)\n}\n\n/**\n * 校验是否为小于等于零的浮点数\n */\nexport function isNegativeFloatOrZero(val: string, floatOptions: FloatOptions = {}) {\n const { integer = true } = floatOptions\n\n if (integer) {\n return /^(-?0(\\.0+)?|-(0|[1-9]\\d*)(\\.\\d+)?)$/.test(val)\n }\n\n return /^(-?0\\.0+|-(0|[1-9]\\d*)\\.\\d+)$/.test(val)\n}\n\nexport interface FloatOptions {\n /**\n * 是否包括整数\n * @default true\n */\n integer?: boolean\n}\n","/**\n * 校验是否为整数\n */\nexport function isInteger(val: string) {\n return /^-?(0|[1-9]\\d*)$/.test(val)\n}\n\n/**\n * 校验否为正整数\n */\nexport function isPositiveInteger(val: string) {\n return /^[1-9]\\d*$/.test(val)\n}\n\n/**\n * 校验是否为大于等于零的整数\n */\nexport function isPositiveIntegerOrZero(val: string) {\n return /^(0|[1-9]\\d*)$/.test(val)\n}\n\n/**\n * 校验是否为负整数\n */\nexport function isNegativeInteger(val: string) {\n return /^-([1-9]\\d*)$/.test(val)\n}\n\n/**\n * 校验是否为小于等于零的整数\n */\nexport function isNegativeIntegerOrZero(val: string) {\n return /^(0|-(0|[1-9]\\d*))$/.test(val)\n}\n","import dayjs, { extend } from 'dayjs'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\n\n/**\n * 校验是否为手机号\n */\nexport function isMobilePhone(val: string) {\n return /^1[3-9]\\d{9}$/.test(val)\n}\n\n/**\n * 校验是否为邮箱\n */\nexport function isEmail(val: string) {\n return /^[\\w-]+(?:\\.[\\w-]+)*@[\\w-]+(?:\\.[\\w-]+)*$/.test(val)\n}\n\n/**\n * 校验是否为空字符串\n */\nexport function isEmptyString(val: unknown) {\n return val === ''\n}\n\n// /**\n// * 校验是否为数字或数字字符串\n// */\n// export function isNumberString(val: unknown): val is number {\n// if (isNumber(val)) {\n// return val - val === 0 // 排除 NaN Infinity -Infinity\n// }\n// if (isString(val) && val.trim() !== '') {\n// return Number.isFinite(+val) // 排除字符串 Infinity -Infinity\n// }\n\n// return false\n// }\n\n// /**\n// * 校验是否为奇数\n// */\n// export function isOdd(val: unknown) {\n// const n = Math.abs(val as number)\n// if (!isNumberString(n)) return false\n// if (!Number.isInteger(n)) return false\n// if (!Number.isSafeInteger(n)) {\n// throwError('isOdd', 'value exceeds maximum safe integer')\n// }\n\n// return n % 2 === 1\n// }\n\n// /**\n// * 校验是否为偶数\n// */\n// export function isEven(val: unknown) {\n// const n = Math.abs(val as number)\n// console.log('🍏 ~ n:', val, n)\n// if (!isNumberString(n)) return false\n// if (!Number.isInteger(n)) return false\n// if (!Number.isSafeInteger(n)) {\n// throwError('isEven', 'value exceeds maximum safe integer')\n// }\n\n// return n % 2 === 0\n// }\n\n/**\n * 校验是否为合法时间格式\n * @param format 时间格式\n * @default 'YYYY-MM-DD HH:mm:ss'\n * @see https://day.js.org/docs/zh-CN/parse/string-format\n */\nexport function isDateString(val: string, format = 'YYYY-MM-DD HH:mm:ss') {\n extend(customParseFormat)\n\n return dayjs(val, format, true).isValid()\n}\n\n/**\n * 校验是否为二代身份证号\n */\nexport function isIdCard(val: string) {\n const flag =\n /^[1-9]\\d{5}(?:18|19|20)\\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\\d|3[01])\\d{3}[\\dX]$/i.test(val) &&\n isDateString(val.slice(6, 14), 'YYYYMMDD')\n\n return flag\n}\n\n/**\n * 是否是链接\n */\nexport function isUrl(val: string) {\n return /^(?:http|https):\\/\\/[\\w.]+/.test(val)\n}\n"],"mappings":"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","names":["decimalToBinary","decNumber","stack","remainder","binaryString","BASE64_CHARS","base64Encode","str","result","bin","i","padding","base64Decode","binary","compose","fns","previous","current","args","composeRight","debounce","target","wait","timer","args","objectToString","toTypeString","value","logCb","initLog","cb","isFunction","origConsole","type","name","arg","context","log","warn","error","isMap","val","isSet","isDate","isRegExp","isNumber","isString","isSymbol","isObject","isPromise","isUndef","isUndefined","isNull","isDef","isBoolean","isArray","hasOwn","target","key","hasChanged","oldValue","newValue","deepClone","target","map","_deepClone","value","isDate","isRegExp","isObject","clone","isArray","key","hasOwn","LntvowError","m","throwError","scope","message","debugWarn","error","isString","deprecated","from","replacement","version","type","deepMerge","template","source","options","isObject","throwError","isArray","arrayMerge","mergeObject","target","process","key","isUndef","result","deepClone","parse","str","options","decode","deepMerge","result","pairs","pair","key","value","stringify","obj","encode","appendQueryString","url","stringifyOptions","query","qs","throttle","target","wait","timer","args","isUndef","now","validatorLatitudeOrLongitude","value","validatorChineseOrEnglishOrNumber","isUndef","validatorChineseOrEnglish","validatorUppercaseOrNumbersOrSpecial","validatorUppercaseOrNumbersOrUnderline","validatorEmail","deprecated","castArray","target","isArray","compareProperties","target","source","isObject","throwError","isArray","compareObject","result","key","targetItem","sourceItem","excludeProperties","target","properties","result","deepClone","castArray","property","hasOwn","extractProperties","generateRandomArray","num","cb","isNumber","throwError","isFunction","e","i","generateRandomColor","dayjs","extend","customParseFormat","generateRandomInteger","options","isNumber","min","max","effectiveMin","effectiveMax","throwError","extend","customParseFormat","generateRandomDate","options","start","end","dayjs","format","throwError","startYear","endYear","randomYear","generateRandomInteger","randomMonth","randomDay","randomHour","randomMinute","randomSecond","result","DEFAULT_MAX","DEFAULT_MIN","generateRandomString","options","isNumber","lowerCase","upperCase","number","extra","length","generateRandomIntegerOptions","__spreadValues","throwError","characters","castArray","item","result","len","generateRandomInteger","i","randomIndex","getRandomItem","list","generateRandomEmail","emailProviders","result","generateRandomString","generateRandomInteger","getRandomItem","generateRandomFloat","options","isNumber","min","max","fractionDigits","generateRandomStringFromSource","num","source","isNumber","throwError","isArray","result","i","getRandomItem","generateRandomIdCard","prefix","generateRandomInteger","zeroToNine","generateRandomDate","generateRandomStringFromSource","generateRandomMobilePhone","getRandomItem","generateRandomInteger","generateRandomUrl","result","getRandomItem","generateRandomString","isNumberOrNumberString","val","isChinese","isEnglishAphabet","isUpperCase","isUpperCaseAndNumber","isUpperCaseAndNumberAndChinese","isLowerCase","isLowerCaseAndNumber","isLowerCaseAndNumberAndChinese","isFloat","val","floatOptions","integer","isPositiveFloat","isNegativeFloat","isPositiveFloatOrZero","isNegativeFloatOrZero","isInteger","val","isPositiveInteger","isPositiveIntegerOrZero","isNegativeInteger","isNegativeIntegerOrZero","dayjs","extend","customParseFormat","isMobilePhone","val","isEmail","isEmptyString","isDateString","format","isIdCard","isUrl"]}
|