{"_id":"@51jbs/core-utils","_rev":"4-3b851110fc53b87b84a9721e79eb8164","name":"@51jbs/core-utils","dist-tags":{"latest":"1.0.5"},"versions":{"1.0.1":{"name":"@51jbs/core-utils","version":"1.0.1","keywords":["utils","core","deep-clone","precision","51jbs"],"author":{"name":"Chuanjing Li"},"license":"MIT","_id":"@51jbs/core-utils@1.0.1","maintainers":[{"name":"chuanjing729","email":"chuanjing729@gmail.com"}],"dist":{"shasum":"f0e933347491b31ad61b017d4234d0276bae1376","tarball":"https://registry.npmjs.org/@51jbs/core-utils/-/core-utils-1.0.1.tgz","fileCount":45,"integrity":"sha512-Eo6LesM5mZjM7IaI01MmJRh3K6/EyNdZ+j9YFRi/Qh482w/03J2MtH3KnVOIZD/HbQ23SzTCbYfJO9+lhM/YSQ==","signatures":[{"sig":"MEYCIQDglH4uZ61Ussw1PRXbdLvXQbpwek+s3Ux/3SEdcD6j6gIhAKuZYkskae88b2MuSAZxGncUdxEShf8v+AhdAmJO4vv7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":157183},"main":"dist/index.js","_from":"file:51jbs-core-utils-1.0.1.tgz","types":"dist/index.d.ts","module":"dist/index.esm.js","scripts":{"dev":"tsc --watch","test":"jest","build":"tsc"},"_npmUser":{"name":"chuanjing729","email":"chuanjing729@gmail.com"},"_resolved":"/tmp/095db2e611ed8a2fc1bf2e4dcfeacc28/51jbs-core-utils-1.0.1.tgz","_integrity":"sha512-Eo6LesM5mZjM7IaI01MmJRh3K6/EyNdZ+j9YFRi/Qh482w/03J2MtH3KnVOIZD/HbQ23SzTCbYfJO9+lhM/YSQ==","_npmVersion":"10.8.2","description":"纯JS工具库，框架无关，提供深拷贝、日期、数字精确计算等核心功能","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","jsdom":"^27.3.0","ts-jest":"^29.4.6","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","jest-environment-jsdom":"^30.2.0"},"_npmOperationalInternal":{"tmp":"tmp/core-utils_1.0.1_1766008030146_0.006534397830363803","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@51jbs/core-utils","version":"1.0.2","keywords":["utils","core","deep-clone","precision","51jbs"],"author":{"name":"Chuanjing Li"},"license":"MIT","_id":"@51jbs/core-utils@1.0.2","maintainers":[{"name":"chuanjing729","email":"chuanjing729@gmail.com"}],"dist":{"shasum":"e517787bccfb4e492b9dcfddbd441d4f4ba1aa74","tarball":"https://registry.npmjs.org/@51jbs/core-utils/-/core-utils-1.0.2.tgz","fileCount":45,"integrity":"sha512-6H2RUshxtGXKwqTyG1DkVMmIWO6PI/FJXBUxLPwJYYZUpoPYB9y4cfKf8P9IR9HvdMx/FTlamn8WKQbTpHqKVQ==","signatures":[{"sig":"MEUCIG64SUfyqgQkOLI4AR2h1IIFu3ih86CnYyk+5hLbL7IoAiEAtYWDx+VWS/DcffccuYkqRn6fTX5mdXDqCBkzMLwd+q0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":157183},"main":"dist/index.js","_from":"file:51jbs-core-utils-1.0.2.tgz","types":"dist/index.d.ts","module":"dist/index.esm.js","scripts":{"dev":"tsc --watch","test":"jest","build":"tsc"},"_npmUser":{"name":"chuanjing729","email":"chuanjing729@gmail.com"},"_resolved":"/tmp/58735266d8658ec75aba1c36d381b3d8/51jbs-core-utils-1.0.2.tgz","_integrity":"sha512-6H2RUshxtGXKwqTyG1DkVMmIWO6PI/FJXBUxLPwJYYZUpoPYB9y4cfKf8P9IR9HvdMx/FTlamn8WKQbTpHqKVQ==","_npmVersion":"10.8.2","description":"纯JS工具库，框架无关，提供深拷贝、日期、数字精确计算等核心功能","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","jsdom":"^27.3.0","ts-jest":"^29.4.6","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","jest-environment-jsdom":"^30.2.0"},"_npmOperationalInternal":{"tmp":"tmp/core-utils_1.0.2_1766009541235_0.7297536039638828","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@51jbs/core-utils","version":"1.0.3","keywords":["utils","core","deep-clone","precision","51jbs"],"author":{"name":"Chuanjing Li"},"license":"MIT","_id":"@51jbs/core-utils@1.0.3","maintainers":[{"name":"chuanjing729","email":"chuanjing729@gmail.com"}],"dist":{"shasum":"5173091c40325e47dea97b954b392f23be5e080e","tarball":"https://registry.npmjs.org/@51jbs/core-utils/-/core-utils-1.0.3.tgz","fileCount":45,"integrity":"sha512-/dFhnuiqMxtVchmRaCDnuZMg3kzAYpt0LuzndUPRJMuZ+heT8CRL20+gE7fz1Pbz1H2umDZbGc4STm3x4GDQtA==","signatures":[{"sig":"MEQCIFHfmjvXiU7G3+Gqq2cGMJkrMopFlJTU2632HVCdF8qaAiADZijbsCC/oXaZfD0n0M9gxwPowfMVawXujMnvwj1SCA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":157183},"main":"dist/index.js","_from":"file:51jbs-core-utils-1.0.3.tgz","types":"dist/index.d.ts","module":"dist/index.esm.js","scripts":{"dev":"tsc --watch","test":"jest","build":"tsc"},"_npmUser":{"name":"chuanjing729","email":"chuanjing729@gmail.com"},"_resolved":"/tmp/8bc237076619be9801788202b475cd9f/51jbs-core-utils-1.0.3.tgz","_integrity":"sha512-/dFhnuiqMxtVchmRaCDnuZMg3kzAYpt0LuzndUPRJMuZ+heT8CRL20+gE7fz1Pbz1H2umDZbGc4STm3x4GDQtA==","_npmVersion":"10.8.2","description":"纯JS工具库，框架无关，提供深拷贝、日期、数字精确计算等核心功能","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","jsdom":"^27.3.0","ts-jest":"^29.4.6","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","jest-environment-jsdom":"^30.2.0"},"_npmOperationalInternal":{"tmp":"tmp/core-utils_1.0.3_1766010439041_0.7924232204312669","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@51jbs/core-utils","version":"1.0.5","description":"纯JS工具库，框架无关，提供深拷贝、日期、数字精确计算等核心功能","main":"dist/index.js","module":"dist/index.esm.js","types":"dist/index.d.ts","keywords":["utils","core","deep-clone","precision","51jbs"],"author":{"name":"chuanjing.li"},"license":"MIT","devDependencies":{"@types/jest":"^30.0.0","@types/node":"^20.0.0","jest":"^30.2.0","jest-environment-jsdom":"^30.2.0","jsdom":"^27.3.0","ts-jest":"^29.4.6","typescript":"^5.0.0"},"scripts":{"build":"tsc","test":"jest","dev":"tsc --watch"},"_id":"@51jbs/core-utils@1.0.5","_integrity":"sha512-sTI68HPscObBMR/HU9B/UFRW+imGaoudnd17efLj2mX7On8ynC2oPXA9fR2NFufHe2cgToa7fKk9+mj9X9BrIg==","_resolved":"/tmp/5ff32142af5ae5fa9fb85348dc00aaa7/51jbs-core-utils-1.0.5.tgz","_from":"file:51jbs-core-utils-1.0.5.tgz","_nodeVersion":"20.19.6","_npmVersion":"10.8.2","dist":{"integrity":"sha512-sTI68HPscObBMR/HU9B/UFRW+imGaoudnd17efLj2mX7On8ynC2oPXA9fR2NFufHe2cgToa7fKk9+mj9X9BrIg==","shasum":"e6eebec533e49f8df4fbf7246d32e1a953b65b32","tarball":"https://registry.npmjs.org/@51jbs/core-utils/-/core-utils-1.0.5.tgz","fileCount":45,"unpackedSize":165373,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFdGsIxSH9gN6b2Mc3wg8SG9c4ldLVWyH8UcU3m8iVHPAiEA+vBkG5HkhYy8d3EmfObih/cK92B5E9qyjDC1YRaPJjo="}]},"_npmUser":{"name":"chuanjing729","email":"chuanjing729@gmail.com"},"directories":{},"maintainers":[{"name":"chuanjing729","email":"chuanjing729@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/core-utils_1.0.5_1766322606544_0.15148628451600477"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-17T21:47:10.087Z","modified":"2025-12-21T13:10:06.996Z","1.0.1":"2025-12-17T21:47:10.283Z","1.0.2":"2025-12-17T22:12:21.400Z","1.0.3":"2025-12-17T22:27:19.164Z","1.0.5":"2025-12-21T13:10:06.773Z"},"author":{"name":"chuanjing.li"},"license":"MIT","keywords":["utils","core","deep-clone","precision","51jbs"],"description":"纯JS工具库，框架无关，提供深拷贝、日期、数字精确计算等核心功能","maintainers":[{"name":"chuanjing729","email":"chuanjing729@gmail.com"}],"readme":"# @51jbs/core-utils\n\n> 纯 JS 工具库，框架无关，提供深拷贝、日期、数字精确计算等核心功能\n\n## 📦 安装\n\n```bash\nnpm install @51jbs/core-utils\n```\n\n## 🚀 快速使用\n\n```javascript\nimport { deepClone, add, formatDate, maskPhone, local } from '@51jbs/core-utils'\n\n// 深拷贝（支持循环引用）\nconst copy = deepClone(data)\n\n// 精确数字计算\nconst result = add(0.1, 0.2)  // 0.3\n\n// 日期格式化\nconst dateStr = formatDate(new Date(), 'YYYY-MM-DD HH:mm:ss')\n\n// 手机号脱敏\nconst masked = maskPhone('13800138000')  // 138****8000\n\n// 本地存储\nlocal.set('user', { name: 'test' })\nconst user = local.get('user')\n```\n\n## 📚 API 文档\n\n### 对象操作\n\n```javascript\nimport { deepClone, shallowClone, merge, isEmpty } from '@51jbs/core-utils'\n\n// 深拷贝（解决 JSON.parse(JSON.stringify()) 的问题）\nconst copy = deepClone(obj)  // 支持循环引用、Date、RegExp、Symbol\n\n// 浅拷贝\nconst copy2 = shallowClone(obj)\n\n// 深度合并\nconst merged = merge(obj1, obj2, obj3)\n\n// 判空\nisEmpty({})  // true\nisEmpty([])  // true\nisEmpty('')  // true\n```\n\n### 数字操作\n\n```javascript\nimport { add, subtract, multiply, divide, formatNumber, formatCurrency } from '@51jbs/core-utils'\n\n// 精确加法\nadd(0.1, 0.2)  // 0.3\n\n// 精确减法\nsubtract(1.5, 1.2)  // 0.3\n\n// 精确乘法\nmultiply(0.2, 0.1)  // 0.02\n\n// 精确除法\ndivide(0.3, 0.1)  // 3\n\n// 千分位格式化\nformatNumber(123456.789)  // \"123,456.79\"\n\n// 货币格式化\nformatCurrency(1234.56)  // \"¥1,234.56\"\n```\n\n### 日期操作\n\n```javascript\nimport { formatDate, dateDiff, getRelativeTime, isToday } from '@51jbs/core-utils'\n\n// 格式化日期\nformatDate(new Date(), 'YYYY-MM-DD')  // \"2025-12-15\"\nformatDate(Date.now(), 'HH:mm:ss')    // \"21:30:00\"\n\n// 日期差值（天数）\ndateDiff('2025-12-01', '2025-12-15')  // 14\n\n// 相对时间\ngetRelativeTime(Date.now() - 60000)  // \"1分钟前\"\n\n// 判断是否为今天\nisToday(new Date())  // true\n```\n\n### 字符串操作\n\n```javascript\nimport { maskPhone, maskIdCard, maskEmail, isValidPhone } from '@51jbs/core-utils'\n\n// 手机号脱敏\nmaskPhone('13800138000')  // \"138****8000\"\n\n// 身份证脱敏\nmaskIdCard('110101199001011234')  // \"110101********1234\"\n\n// 邮箱脱敏\nmaskEmail('test@example.com')  // \"t***t@example.com\"\n\n// 验证手机号\nisValidPhone('13800138000')  // true\n\n// 其他工具\nimport { capitalize, camelToSnake, truncate, randomString } from '@51jbs/core-utils'\n\ncapitalize('hello')  // \"Hello\"\ncamelToSnake('userName')  // \"user_name\"\ntruncate('很长的文本...', 10)  // \"很长的文本...\"\nrandomString(8)  // \"aB3dE9fG\"\n```\n\n### 存储操作\n\n```javascript\nimport { local, session, storage } from '@51jbs/core-utils'\n\n// LocalStorage\nlocal.set('key', { data: 'value' })\nlocal.get('key')  // { data: 'value' }\nlocal.has('key')  // true\nlocal.remove('key')\n\n// SessionStorage\nsession.set('key', 'value')\nsession.get('key')\n\n// 带过期时间的存储\nstorage.set('key', 'value', 60000)  // 60秒后过期\nstorage.get('key')  // 自动检查过期\n```\n\n### 数组操作\n\n```javascript\nimport { unique, groupBy, flatten, shuffle, sum, average, intersection, union, difference, chunk, paginate } from '@51jbs/core-utils'\n\n// 数组去重\nunique([1, 2, 2, 3])  // [1, 2, 3]\n\n// 数组分组\ngroupBy([{name: 'Alice', age: 25}, {name: 'Bob', age: 25}], item => item.age)\n// { '25': [{name: 'Alice', age: 25}, {name: 'Bob', age: 25}] }\n\n// 数组扁平化\nflatten([1, [2, [3, 4]]], 2)  // [1, 2, 3, 4]\n\n// 数组乱序\nshuffle([1, 2, 3, 4, 5])  // [3, 1, 4, 5, 2]\n\n// 数组求和与平均值\nsum([1, 2, 3, 4, 5])  // 15\naverage([1, 2, 3, 4, 5])  // 3\n\n// 数组交集、并集、差集\nintersection([1, 2, 3], [2, 3, 4])  // [2, 3]\nunion([1, 2], [2, 3])  // [1, 2, 3]\ndifference([1, 2, 3], [2, 3])  // [1]\n\n// 数组分块和分页\nchunk([1, 2, 3, 4, 5], 2)  // [[1, 2], [3, 4], [5]]\npaginate([1, 2, 3, 4, 5], 2, 2)  // { data: [3, 4], total: 5, page: 2, pageSize: 2, totalPages: 3 }\n```\n\n### URL 操作\n\n```javascript\nimport { parseUrlParams, buildUrlParams, buildFullUrl, isExternal, getQueryParam } from '@51jbs/core-utils'\n\n// 解析 URL 参数\nparseUrlParams('https://example.com?a=1&b=2')  // { a: '1', b: '2' }\n\n// 构建 URL 参数\nbuildUrlParams({ a: 1, b: 2 })  // \"a=1&b=2\"\n\n// 构建完整 URL\nbuildFullUrl('https://example.com', { a: 1 })  // \"https://example.com?a=1\"\n\n// 检查是否为外部链接\nisExternal('https://example.com')  // true\n\n// 获取查询参数\ngetQueryParam('a', 'https://example.com?a=1')  // \"1\"\n```\n\n### 表单验证\n\n```javascript\nimport { isPhone, isEmail, isIdCard, validatePassword, validateUsername } from '@51jbs/core-utils'\n\n// 验证手机号、邮箱、身份证\nisPhone('13800138000')  // true\nisEmail('test@example.com')  // true\nisIdCard('110101199001011234')  // true\n\n// 密码验证\nvalidatePassword('Abc123')  // { valid: true, message: '密码符合要求' }\n\n// 用户名验证\nvalidateUsername('test_user')  // { valid: true, message: '用户名符合要求' }\n```\n\n### 设备检测\n\n```javascript\nimport { isMobile, isIOS, isAndroid, isWechat, getBrowserInfo } from '@51jbs/core-utils'\n\n// 设备类型检测\nisMobile()  // true/false\nisIOS()  // true/false\nisAndroid()  // true/false\nisWechat()  // true/false\n\n// 浏览器信息\ngetBrowserInfo()  // { name: 'Chrome', version: '98.0.4758.102' }\n```\n\n### DOM 操作\n\n```javascript\nimport { addClass, removeClass, hasClass, scrollToElement, isInViewport } from '@51jbs/core-utils'\n\n// 类名操作\naddClass(element, 'active')\nremoveClass(element, 'active')\nhasClass(element, 'active')\n\n// 滚动到指定元素\nscrollToElement('#target', { offset: 50 })\n\n// 检查元素是否在视口中\nisInViewport(element)\n```\n\n### 格式化工具\n\n```javascript\nimport { formatPhone, formatCurrency, formatDate, formatFileSize, formatBankCard, formatIdCard } from '@51jbs/core-utils'\n\n// 格式化手机号\nformatPhone('13800138000')  // \"138****8000\"\n\n// 格式化金额\nformatCurrency(1234.56)  // \"¥1,234.56\"\n\n// 格式化文件大小\nformatFileSize(1024)  // \"1 KB\"\n\n// 格式化银行卡号\nformatBankCard('6222021234567890')  // \"6222 0212 3456 7890\"\n\n// 格式化身份证号\nformatIdCard('110101199001011234')  // \"110101********1234\"\n```\n\n### 事件管理\n\n```javascript\nimport { EventBus, createEventBus, globalEventBus } from '@51jbs/core-utils'\n\n// 使用全局事件总线\nglobalEventBus.on('update', (data) => console.log(data))\nglobalEventBus.emit('update', { message: 'hello' })\n\n// 创建自定义事件总线\nconst bus = createEventBus()\nconst unsubscribe = bus.on('custom-event', (data) => console.log(data))\nbus.emit('custom-event', { value: 123 })\nunsubscribe()  // 取消订阅\n```\n\n### HTTP 请求\n\n```javascript\nimport { http, createHttpClient } from '@51jbs/core-utils'\n\n// 使用默认 HTTP 客户端\nhttp.get('/api/users').then(data => console.log(data))\nhttp.post('/api/users', { name: 'John' }).then(data => console.log(data))\n\n// 创建自定义 HTTP 客户端\nconst client = createHttpClient({ baseURL: 'https://api.example.com' })\nclient.get('/users').then(data => console.log(data))\n```\n\n## 🎯 解决的问题\n\n| 问题 | 解决方案 |\n|------|---------|\n| **64处不安全的深拷贝** | `deepClone()` 替代 `JSON.parse(JSON.stringify())` |\n| **浮点数精度问题** | `add/subtract/multiply/divide()` 精确计算 |\n| **日期格式化重复** | `formatDate()` 统一格式化 |\n| **数据脱敏不统一** | `maskPhone/maskEmail/maskIdCard()` |\n| **存储操作繁琐** | `local/session/storage` 封装 |\n| **数组操作复杂** | `unique/groupBy/shuffle/sum` 等丰富数组工具 |\n| **表单验证重复** | `isPhone/isEmail/validatePassword` 统一验证 |\n| **设备检测困难** | `isMobile/isIOS/isWechat` 一键检测 |\n\n## 📊 功能统计\n\n- **2000+行**源码\n- **13个模块**（object、number、date、string、storage、array、url、validation、device、dom、format、event、http）\n- **100+个函数**\n\n## 📄 License\n\nMIT © Chuanjing Li","readmeFilename":"README.md"}