{"_id":"@arui-diushi/common-utils","name":"@arui-diushi/common-utils","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@arui-diushi/common-utils","version":"1.0.0","description":"Vue3 常用工具函数库 - 防抖、节流、深拷贝、日期格式化、URL处理等","type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"sideEffects":false,"scripts":{"dev":"vite build --watch","build":"vite build && pnpm build:types","build:types":"tsc --emitDeclarationOnly","test":"vitest","test:run":"vitest run","test:coverage":"vitest run --coverage","prepublishOnly":"pnpm test:run && pnpm build","preversion":"pnpm test:run","postversion":"git push && git push --tags"},"keywords":["vue3","utils","debounce","throttle","deep-clone","date-format","javascript","typescript"],"author":{"name":"your-name"},"license":"MIT","repository":{"type":"git","url":"https://gitee.com/positive-and-motivated/common-utils.git"},"bugs":{"url":"https://gitee.com/positive-and-motivated/common-utils/issues"},"homepage":"https://gitee.com/positive-and-motivated/common-utils#readme","publishConfig":{"registry":"https://registry.npmjs.org/","access":"public"},"devDependencies":{"@vitest/coverage-v8":"^1.6.0","terser":"^5.46.1","typescript":"^5.6.0","vite":"^6.2.0","vitest":"^1.6.0"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"engines":{"node":">=18.0.0","pnpm":">=9.0.0"},"packageManager":"pnpm@9.15.0","_id":"@arui-diushi/common-utils@1.0.0","_nodeVersion":"18.12.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-SZaK2Rd/iQxSZngHD8VNwqWs+8HKDJU0UgGDH/y2LiV3AEEWrgCSTgTyD85DSkVpCp0gPj77i1PznQ1q3H1CCg==","shasum":"181aff15aed1740d3f8556bd76a58d7d20ff1775","tarball":"https://registry.npmjs.org/@arui-diushi/common-utils/-/common-utils-1.0.0.tgz","fileCount":9,"unpackedSize":181682,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCs+O3zwujCrml6kiWRV6sDNd2OOM6vXfbAuSSAbELKhAIhAM24ToMpTAtZ9Zap/BYGVD0A+Mi0W47YX6owB0gfDZ3o"}]},"_npmUser":{"name":"arui-diushi","email":"250780315@qq.com"},"directories":{},"maintainers":[{"name":"arui-diushi","email":"250780315@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/common-utils_1.0.0_1775532176015_0.6403141939288719"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-07T03:22:55.906Z","1.0.0":"2026-04-07T03:22:56.156Z","modified":"2026-04-07T03:22:56.422Z"},"maintainers":[{"name":"arui-diushi","email":"250780315@qq.com"}],"description":"Vue3 常用工具函数库 - 防抖、节流、深拷贝、日期格式化、URL处理等","homepage":"https://gitee.com/positive-and-motivated/common-utils#readme","keywords":["vue3","utils","debounce","throttle","deep-clone","date-format","javascript","typescript"],"repository":{"type":"git","url":"https://gitee.com/positive-and-motivated/common-utils.git"},"author":{"name":"your-name"},"bugs":{"url":"https://gitee.com/positive-and-motivated/common-utils/issues"},"license":"MIT","readme":"# @yourscope/common-utils\r\n\r\n> Vue3 常用工具函数库 - 防抖、节流、深拷贝、日期格式化、URL处理等\r\n\r\n## ✨ 特性\r\n\r\n- 🚀 **轻量级** - Tree-shaking 友好，按需引入\r\n- 💪 **类型安全** - 完整的 TypeScript 类型定义\r\n- 🎯 **零依赖** - 核心函数无第三方依赖\r\n- 📦 **多格式支持** - 支持 ESM、CJS\r\n- 🧪 **测试完善** - 100% 测试覆盖率\r\n\r\n## 📦 安装\r\n\r\n```bash\r\n# npm\r\nnpm install @yourscope/common-utils\r\n\r\n# yarn\r\nyarn add @yourscope/common-utils\r\n\r\n# pnpm\r\npnpm add @yourscope/common-utils\r\n```\r\n\r\n## 🔨 使用\r\n\r\n### 方式1：按需引入（推荐 ✅）\r\n\r\n```javascript\r\nimport { debounce, throttle, deepClone, formatDate } from '@yourscope/common-utils'\r\n\r\n// 防抖函数\r\nconst handleSearch = debounce((value) => {\r\n  console.log('搜索:', value)\r\n}, 300)\r\n\r\n// 节流函数\r\nconst handleScroll = throttle(() => {\r\n  console.log('滚动事件')\r\n}, 500)\r\n\r\n// 深拷贝\r\nconst clonedData = deepClone(originalData)\r\n\r\n// 日期格式化\r\nconst formatted = formatDate(new Date(), 'YYYY-MM-DD HH:mm:ss')\r\n```\r\n\r\n### 方式2：全量引入\r\n\r\n```javascript\r\nimport * as utils from '@yourscope/common-utils'\r\n\r\nutils.debounce(fn, 300)\r\nutils.throttle(fn, 500)\r\nutils.deepClone(obj)\r\n```\r\n\r\n## 📚 API 文档\r\n\r\n### 类型判断\r\n\r\n#### `isNotEmptyStr(val)`\r\n判断字符串非空（排除 'null' 和 'undefined'）\r\n\r\n```javascript\r\nisNotEmptyStr('hello')    // true\r\nisNotEmptyStr('null')     // false\r\nisNotEmptyStr('')         // false\r\n```\r\n\r\n#### `isNotEmptyKeys(obj)`\r\n判断对象是否有可枚举属性\r\n\r\n```javascript\r\nisNotEmptyKeys({ a: 1 })  // true\r\nisNotEmptyKeys({})        // false\r\n```\r\n\r\n#### `checkType(data)`\r\n检测数据类型\r\n\r\n```javascript\r\ncheckType({})             // 'Object'\r\ncheckType([])             // 'Array'\r\ncheckType('')             // 'String'\r\n```\r\n\r\n---\r\n\r\n### 防抖与节流\r\n\r\n#### `debounce(fn, delay = 300)`\r\n防抖函数，延迟执行，重复触发会重新计时\r\n\r\n```javascript\r\nconst handleSearch = debounce((value) => {\r\n  // 搜索逻辑\r\n}, 300)\r\n\r\n// 兼容旧名称\r\nexport const debounceFuc = debounce\r\n```\r\n\r\n#### `throttle(fn, delay = 500)`\r\n节流函数，固定频率执行\r\n\r\n```javascript\r\nconst handleScroll = throttle(() => {\r\n  // 滚动逻辑\r\n}, 500)\r\n\r\n// 兼容旧名称\r\nexport const throttleFuc = throttle\r\n```\r\n\r\n---\r\n\r\n### 对象处理\r\n\r\n#### `deepClone(obj, hash = new WeakMap())`\r\n深拷贝对象，支持循环引用\r\n\r\n```javascript\r\nconst cloned = deepClone({ a: 1, b: { c: 2 } })\r\n```\r\n\r\n#### `mergeObject(...objs)`\r\n深度合并对象\r\n\r\n```javascript\r\nconst merged = mergeObject({ a: 1 }, { b: 2 }, { a: 3 })\r\n// { a: 3, b: 2 }\r\n```\r\n\r\n#### `objectToQueryString(params)`\r\n对象转 URL 查询字符串\r\n\r\n```javascript\r\nconst query = objectToQueryString({ name: '张三', age: 18 })\r\n// 输出: name=%E5%BC%A0%E4%B8%89&age=18\r\n\r\n// 兼容旧名称\r\nexport const tansParams = objectToQueryString\r\n```\r\n\r\n#### `convertKeysKebabToCamel(obj)`\r\n对象键名从 kebab-case 转为 camelCase\r\n\r\n```javascript\r\nconvertKeysKebabToCamel({ 'user-name': 'Alice' })\r\n// { userName: 'Alice' }\r\n\r\n// 兼容旧名称\r\nexport const convertKeys = convertKeysKebabToCamel\r\n```\r\n\r\n---\r\n\r\n### 数组处理\r\n\r\n#### `calculateTableSpan(data, fieldArr)`\r\n计算表格合并行数据\r\n\r\n```javascript\r\nconst spanArr = calculateTableSpan(tableData, ['province', 'city'])\r\n// 兼容旧名称\r\nexport const getSpanArr = calculateTableSpan\r\n```\r\n\r\n#### `flattenArray(arr)`\r\n数组扁平化\r\n\r\n```javascript\r\nflattenArray([1, [2, [3]]])  // [1, 2, 3]\r\n```\r\n\r\n---\r\n\r\n### 日期处理\r\n\r\n#### `formatDate(date, format = 'YYYY-MM-DD HH:mm:ss')`\r\n格式化日期\r\n\r\n```javascript\r\nformatDate(new Date(), 'YYYY-MM-DD')              // 2026-04-07\r\nformatDate('2026-04-07', 'YYYY年MM月DD日')        // 2026年04月07日\r\n```\r\n\r\n---\r\n\r\n### 字符串处理\r\n\r\n#### `maskEmail(email)`\r\n邮箱脱敏\r\n\r\n```javascript\r\nmaskEmail('example@gmail.com')\r\n// e****e@gmail.com\r\n```\r\n\r\n#### `trim(str)`\r\n去除字符串首尾空格\r\n\r\n```javascript\r\ntrim('  hello  ')  // 'hello'\r\n```\r\n\r\n---\r\n\r\n### 文件处理\r\n\r\n#### `downloadFile(url, filename)`\r\n下载文件\r\n\r\n```javascript\r\ndownloadFile('https://example.com/file.pdf', 'document.pdf')\r\n```\r\n\r\n#### `copyTextToClipboard(text)`\r\n复制文本到剪贴板\r\n\r\n```javascript\r\nawait copyTextToClipboard('Hello World')\r\n```\r\n\r\n#### `copyImageToClipboard(imageUrl)`\r\n复制图片到剪贴板\r\n\r\n```javascript\r\nawait copyImageToClipboard('https://example.com/image.png')\r\n```\r\n\r\n---\r\n\r\n### 其他工具\r\n\r\n#### `uuid()`\r\n生成 UUID\r\n\r\n```javascript\r\nuuid()  // 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'\r\n```\r\n\r\n#### `sleep(ms)`\r\n异步等待\r\n\r\n```javascript\r\nawait sleep(1000)  // 等待 1 秒\r\n```\r\n\r\n## 🌰 完整示例\r\n\r\n```vue\r\n<template>\r\n  <div>\r\n    <input v-model=\"searchValue\" @input=\"handleSearch\" placeholder=\"搜索...\" />\r\n    <div v-for=\"item in list\" :key=\"item.id\">{{ item.name }}</div>\r\n  </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref } from 'vue'\r\nimport { debounce, deepClone, formatDate } from '@yourscope/common-utils'\r\n\r\nconst searchValue = ref('')\r\nconst list = ref([])\r\n\r\n// 防抖搜索\r\nconst handleSearch = debounce((e) => {\r\n  console.log('搜索:', e.target.value)\r\n  // 调用 API...\r\n}, 300)\r\n\r\n// 深拷贝数据\r\nconst originalData = { a: 1, b: { c: 2 } }\r\nconst clonedData = deepClone(originalData)\r\n\r\n// 格式化日期\r\nconst formattedDate = formatDate(new Date(), 'YYYY-MM-DD')\r\n</script>\r\n```\r\n\r\n## 🧪 单元测试\r\n\r\n```bash\r\n# 运行测试\r\npnpm test\r\n\r\n# 测试覆盖率\r\npnpm test:coverage\r\n```\r\n\r\n## 🔄 版本更新\r\n\r\n### v1.0.0 (2026-04-07)\r\n- ✨ 初始版本发布\r\n- 🎉 支持 30+ 常用工具函数\r\n- 📦 完整的 TypeScript 类型定义\r\n- 🧪 100% 测试覆盖率\r\n\r\n## 📄 开源协议\r\n\r\n[MIT](./LICENSE)\r\n\r\n## 🤝 贡献指南\r\n\r\n欢迎提交 Issue 和 Pull Request！\r\n\r\n### 开发流程\r\n\r\n```bash\r\n# 克隆仓库\r\ngit clone https://github.com/your-username/common-utils.git\r\n\r\n# 安装依赖\r\npnpm install\r\n\r\n# 运行测试\r\npnpm test\r\n\r\n# 构建\r\npnpm build\r\n```\r\n\r\n## 📝 常见问题\r\n\r\n### Q: 如何按需引入？\r\n\r\nA: 直接解构导入即可，支持 Tree-shaking：\r\n\r\n```javascript\r\nimport { debounce, throttle } from '@yourscope/common-utils'\r\n```\r\n\r\n### Q: 支持 TypeScript 吗？\r\n\r\nA: 支持！包内置了类型声明文件，无需额外安装 `@types/xxx`。\r\n\r\n### Q: 兼容旧项目吗？\r\n\r\nA: 兼容！所有重命名的函数都提供了旧名称的别名导出：\r\n\r\n```javascript\r\n// 新名称\r\nimport { debounce, throttle, objectToQueryString } from '@yourscope/common-utils'\r\n\r\n// 旧名称（兼容）\r\nimport { debounceFuc, throttleFuc, tansParams } from '@yourscope/common-utils'\r\n```\r\n\r\n## 📖 相关资源\r\n\r\n- [Vue3 官方文档](https://vuejs.org/)\r\n- [Vite 官方文档](https://vitejs.dev/)\r\n- [Vitest 官方文档](https://vitest.dev/)\r\n\r\n---\r\n\r\n**⭐ 如果这个项目对你有帮助，欢迎 Star 支持！**\r\n","readmeFilename":"README.md","_rev":"1-29977f3fef9f38fb0dd42221047f7dff"}