iota-utools 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/{src/array/index.ts → lib/array/index.d.ts} +1 -1
  2. package/lib/array/uniqueArrayByProperty.d.ts +7 -0
  3. package/lib/datatree/deepClone.d.ts +6 -0
  4. package/lib/datatree/deleteTreeNode.d.ts +7 -0
  5. package/lib/datatree/findTreeNode.d.ts +8 -0
  6. package/lib/datatree/fuzzySearchTree.d.ts +8 -0
  7. package/{src/datatree/index.ts → lib/datatree/index.d.ts} +6 -6
  8. package/lib/datatree/models.d.ts +4 -0
  9. package/lib/datatree/toFlatTree.d.ts +6 -0
  10. package/lib/datatree/toTreeFlat.d.ts +7 -0
  11. package/lib/fileStream/downFile.d.ts +8 -0
  12. package/lib/fileStream/downStream.d.ts +8 -0
  13. package/{src/fileStream/index.ts → lib/fileStream/index.d.ts} +2 -2
  14. package/lib/index.cjs.js +2 -0
  15. package/lib/index.cjs.js.map +1 -0
  16. package/lib/index.js +2 -0
  17. package/lib/index.js.map +1 -0
  18. package/{src/main.ts → lib/main.d.ts} +5 -5
  19. package/lib/params/decodeParams.d.ts +6 -0
  20. package/lib/params/encodeParams.d.ts +6 -0
  21. package/{src/params/index.ts → lib/params/index.d.ts} +2 -2
  22. package/lib/storage/index.d.ts +7 -0
  23. package/lib/storage/local.d.ts +21 -0
  24. package/lib/storage/session.d.ts +21 -0
  25. package/lib/utools/copyText.d.ts +6 -0
  26. package/lib/utools/debounce.d.ts +7 -0
  27. package/{src/utools/index.ts → lib/utools/index.d.ts} +5 -5
  28. package/lib/utools/sleep.d.ts +5 -0
  29. package/lib/utools/throttle.d.ts +7 -0
  30. package/lib/utools/typeof.d.ts +10 -0
  31. package/lib/uuid/generateString.d.ts +6 -0
  32. package/lib/uuid/generateUUID.d.ts +6 -0
  33. package/{src/uuid/index.ts → lib/uuid/index.d.ts} +2 -2
  34. package/package.json +2 -2
  35. package/rollup.config.js +1 -1
  36. package/public/index.html +0 -20
  37. package/src/array/uniqueArrayByProperty.ts +0 -14
  38. package/src/datatree/deepClone.ts +0 -26
  39. package/src/datatree/deleteTreeNode.ts +0 -14
  40. package/src/datatree/findTreeNode.ts +0 -28
  41. package/src/datatree/fuzzySearchTree.ts +0 -37
  42. package/src/datatree/models.ts +0 -4
  43. package/src/datatree/toFlatTree.ts +0 -11
  44. package/src/datatree/toTreeFlat.ts +0 -19
  45. package/src/fileStream/downFile.ts +0 -28
  46. package/src/fileStream/downStream.ts +0 -46
  47. package/src/params/decodeParams.ts +0 -13
  48. package/src/params/encodeParams.ts +0 -9
  49. package/src/storage/index.ts +0 -51
  50. package/src/storage/local.ts +0 -40
  51. package/src/storage/session.ts +0 -40
  52. package/src/utools/copyText.ts +0 -18
  53. package/src/utools/debounce.ts +0 -19
  54. package/src/utools/sleep.ts +0 -11
  55. package/src/utools/throttle.ts +0 -29
  56. package/src/utools/typeof.ts +0 -39
  57. package/src/uuid/generateString.ts +0 -14
  58. package/src/uuid/generateUUID.ts +0 -15
  59. package/test/tree.test.ts +0 -5
  60. package/test/utools.test.ts +0 -74
@@ -1 +1 @@
1
- export * from "./uniqueArrayByProperty";
1
+ export * from "./uniqueArrayByProperty";
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @description: 对象数组中去重处理
3
+ * @param array 数据源
4
+ * @param key 根据类型
5
+ * @return T[]
6
+ */
7
+ export declare function uniqueArrayByProperty<T>(array: T[], key: keyof T): T[];
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @description: 深拷贝
3
+ * @param {any} obj
4
+ * @return {*} obj
5
+ */
6
+ export declare const deepClone: <T = any>(obj: T) => T;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @description: 过滤筛选树 -- search tree
3
+ * @param origin 数据源
4
+ * @param id
5
+ * @return new tree data 纯函数
6
+ */
7
+ export declare function deleteTreeNode<T extends TreeData>(origin: T[], id: string | number, key?: keyof T): T[];
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @description: 查找树节点
3
+ * @param origin 数据源
4
+ * @param findValue 找到节点
5
+ * @param key 默认id
6
+ * @return T
7
+ */
8
+ export declare function findTreeNode<T extends TreeData>(origin: T[], findValue: any, key?: keyof T): T | null;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @description: 过滤筛选树 -- search tree
3
+ * @param treeData 数据源
4
+ * @param findStr 关键字
5
+ * @param label 关键字段
6
+ * @return new tree data
7
+ */
8
+ export declare const fuzzySearchTree: <T extends TreeData>(treeData: T[], findStr: string, label?: keyof T) => T[];
@@ -1,6 +1,6 @@
1
- export * from "./toFlatTree";
2
- export * from "./toTreeFlat";
3
- export * from "./findTreeNode";
4
- export * from "./fuzzySearchTree";
5
- export * from "./deleteTreeNode";
6
- export * from "./deepClone";
1
+ export * from "./toFlatTree";
2
+ export * from "./toTreeFlat";
3
+ export * from "./findTreeNode";
4
+ export * from "./fuzzySearchTree";
5
+ export * from "./deleteTreeNode";
6
+ export * from "./deepClone";
@@ -0,0 +1,4 @@
1
+ type TreeData = {
2
+ [s: string]: any;
3
+ children?: TreeData[];
4
+ };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @description: tree data -> 扁平树
3
+ * @param origin 数据源
4
+ * @return treedata
5
+ */
6
+ export declare function toFlatTree(origin: TreeData[]): any;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @description: 扁平树 -> tree data
3
+ * @param origins 数据源
4
+ * @param parentId 父级ID
5
+ * @return 平铺数据
6
+ */
7
+ export declare function toTreeFlat<T extends TreeData>(origin: T[], parentId?: number | string): any;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @description: 下载文件
3
+ * @param stream 文件源,string or buffer
4
+ * @param name 文件名称
5
+ * @param mimeType type josn
6
+ * @return new tree data 纯函数
7
+ */
8
+ export declare const downFile: (stream: string | ArrayBuffer, name: string, mimeType?: string) => void;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @description: 拉流下载方法
3
+ * @param path 下载url
4
+ * @param defaultName 匹配请求如果没有使用名称
5
+ * @param token 鉴权 Authorization
6
+ * @param params 参数 object
7
+ */
8
+ export declare const downStream: (path: string, defaultName: string, token?: string, params?: Record<string, any>) => void;
@@ -1,2 +1,2 @@
1
- export * from "./downFile";
2
- export * from "./downStream";
1
+ export * from "./downFile";
2
+ export * from "./downStream";
@@ -0,0 +1,2 @@
1
+ function getLocalStorage(r){r=localStorage.getItem(r);if(r){let t;try{t=JSON.parse(r)}catch(e){t=r}return t}return r}function setLocalStorage(e,t){"string"==typeof t?localStorage.setItem(e,t):localStorage.setItem(e,JSON.stringify(t))}function removeLocalStorageKey(...e){let t=[];return e.forEach(e=>{"string"==typeof e?localStorage.removeItem(e):t.push(e)}),t.length?{errMsg:"error param",errKey:t}:void 0}function getSessionStorage(r){r=sessionStorage.getItem(r);if(r){let t;try{t=JSON.parse(r)}catch(e){t=r}return t}return r}function setSessionStorage(e,t){"string"==typeof t?sessionStorage.setItem(e,t):sessionStorage.setItem(e,JSON.stringify(t))}function removeSessionStorageKey(...e){let t=[];return e.forEach(e=>{"string"==typeof e?sessionStorage.removeItem(e):t.push(e)}),t.length?{errMsg:"error param",errKey:t}:void 0}!function(e,t){e&&!e.getElementById("livereloadscript")&&((t=e.createElement("script")).async=1,t.src="//"+(self.location.host||"localhost").split(":")[0]+":35729/livereload.js?snipver=1",t.id="livereloadscript",e.getElementsByTagName("head")[0].appendChild(t))}(self.document);const monitorLocalStorage=()=>{let o=localStorage.setItem;localStorage.setItem=function(e,t){var r=new Event("setLocal");r.key=e,r.newValue=t,window.dispatchEvent(r),o.call(this,e,t)}},monitorSessionStorage=()=>{let o=sessionStorage.setItem;sessionStorage.setItem=function(e,t){var r=new Event("setSessoin");r.key=e,r.newValue=t,window.dispatchEvent(r),o.call(this,e,t)}},monitorStorage=()=>{monitorLocalStorage(),monitorSessionStorage()};function getTypeof(e){return Object.prototype.toString.call(e).slice(8,-1)}function isArray(e){return"Array"===getTypeof(e)}function isBoolean(e){return"Boolean"===getTypeof(e)}function isString(e){return"String"===getTypeof(e)}function isNumber(e){return"Number"===getTypeof(e)}function isObject(e){return"Object"===getTypeof(e)}function isFunction(e){return"Function"===getTypeof(e)}function isMap(e){return"Map"===getTypeof(e)}function isSet(e){return"Set"===getTypeof(e)}function isSymbol(e){return"Symbol"===getTypeof(e)}monitorStorage();const sleep=e=>{for(var t=(new Date).getTime()+e;!(t<=(new Date).getTime()););},copyText=e=>{if(navigator.clipboard&&window.isSecureContext)return navigator.clipboard.writeText(e);var t=document.createElement("textarea");t.value=e,document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t)};function debounce(r,o){let n;return function(...e){const t=this;clearTimeout(n),n=setTimeout(()=>{r.apply(t,e)},o)}}function throttle(o,n){let s,i;return function(...e){const t=Date.now(),r=this;i?(clearTimeout(s),s=setTimeout(()=>{t-i>=n&&(o.apply(r,e),i=t)},n-(t-i))):(o.apply(r,e),i=t)}}const downFile=(e,t,r="text/plain;charset=utf-8")=>{let o;o=new Blob([e],{type:r});e=document.createElement("a");e.href=URL.createObjectURL(o),e.download=t,e.style.display="none",document.body.appendChild(e),e.click(),document.body.removeChild(e),URL.revokeObjectURL(e.href)},downStream=(e,r,t,o)=>{o=new URLSearchParams(o).toString(),o=o?e+"?"+o:e;const n=new XMLHttpRequest;n.open("GET",o),n.responseType="blob",t&&n.setRequestHeader("Authorization",t),n.onload=function(){if(200===n.status||304===n.status){var t=n.getResponseHeader("Content-Disposition");let e=r;t&&-1!==t.indexOf("attachment")&&null!=(t=/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/.exec(t))&&t[1]&&(e=t[1].replace(/['"]/g,"")),downFile(this.response,e)}else console.error("Failed to download file. Status: "+n.status)},n.onerror=function(){console.error("Request failed.")},n.send()};function toFlatTree(e){return e.reduce((e,t)=>{const{children:r,...o}=t;return e.concat(o,r&&r.length?toFlatTree(r):[])},[])}function toTreeFlat(t,r="root"){return t.filter(e=>e.parentId===r).map(e=>({...e,children:toTreeFlat(t,e.id)}))}function findTreeNode(e,o,n="id"){let s=null;const i=t=>{if(Array.isArray(t))for(let e=0;e<t.length;e++){var r=t[e];if(r[n]===o)return void(s=r);r.children&&r.children.length&&i(r.children)}};return i(e),s}const fuzzySearchTree=(e,r,o="title")=>{if(!e)return[];let n=[];return e.forEach(e=>{var t;"string"==typeof e[o]&&e[o].includes(r)?(t=0<(t=e.children?fuzzySearchTree(e.children,r,o):[]).length?t:e.children,t={...e,children:t},n.push(t)):e.children&&0<e.children.length&&0<(t=fuzzySearchTree(e.children,r,o)).length&&(e={...e,children:t},n.push(e))}),n};function deleteTreeNode(e,t,r="id"){return e.filter(e=>(e.children&&(e.children=deleteTreeNode(e.children,t,r)),e[r]!==t))}const deepClone=e=>{if(null===e||"object"!=typeof e)return e;if(Array.isArray(e)){var t=[];for(const o of e)t.push(deepClone(o));return t}var r={};for(const n in e)e.hasOwnProperty(n)&&(r[n]=deepClone(e[n]));return r},generateUUID=(e="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx")=>{return e.replace(/[xy]/g,e=>{var t=crypto.getRandomValues(new Uint8Array(1))[0]&15>>("x"===e?0:4);return("x"===e?t:3&t|8).toString(16)})},generateString=(e=8)=>{const t="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";var r=Date.now().toString(36),e=r+Array.from({length:e-r.length},()=>t.charAt(Math.floor(Math.random()*t.length))).join("");return e.charAt(0).toUpperCase()+e.slice(1)};exports.copyText=copyText,exports.debounce=debounce,exports.deepClone=deepClone,exports.deleteTreeNode=deleteTreeNode,exports.downFile=downFile,exports.downStream=downStream,exports.findTreeNode=findTreeNode,exports.fuzzySearchTree=fuzzySearchTree,exports.generateString=generateString,exports.generateUUID=generateUUID,exports.getLocalStorage=getLocalStorage,exports.getSessionStorage=getSessionStorage,exports.getTypeof=getTypeof,exports.isArray=isArray,exports.isBoolean=isBoolean,exports.isFunction=isFunction,exports.isMap=isMap,exports.isNumber=isNumber,exports.isObject=isObject,exports.isSet=isSet,exports.isString=isString,exports.isSymbol=isSymbol,exports.removeLocalStorageKey=removeLocalStorageKey,exports.removeSessionStorageKey=removeSessionStorageKey,exports.setLocalStorage=setLocalStorage,exports.setSessionStorage=setSessionStorage,exports.sleep=sleep,exports.throttle=throttle,exports.toFlatTree=toFlatTree,exports.toTreeFlat=toTreeFlat;
2
+ //# sourceMappingURL=index.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/storage/local.ts","../src/storage/session.ts","../src/storage/index.ts","../src/utools/typeof.ts","../src/utools/sleep.ts","../src/utools/copyText.ts","../src/utools/debounce.ts","../src/utools/throttle.ts","../src/fileStream/downFile.ts","../src/fileStream/downStream.ts","../src/datatree/toFlatTree.ts","../src/datatree/toTreeFlat.ts","../src/datatree/findTreeNode.ts","../src/datatree/fuzzySearchTree.ts","../src/datatree/deleteTreeNode.ts","../src/datatree/deepClone.ts","../src/uuid/generateUUID.ts","../src/uuid/generateString.ts"],"sourcesContent":["/**\r\n * @description: get value\r\n * @param {type: String}\r\n * @return: [Object,String,null]\r\n */\r\nexport function getLocalStorage(key: string): any {\r\n let storageData = localStorage.getItem(key);\r\n if (storageData) {\r\n let storage;\r\n try {\r\n storage = JSON.parse(storageData);\r\n } catch (err) {\r\n storage = storageData;\r\n }\r\n return storage;\r\n }\r\n return storageData;\r\n}\r\n\r\n/**\r\n * @description: set value\r\n * @param {[key,data]}\r\n * @return:void\r\n */\r\nexport function setLocalStorage(key: string, data: any) {\r\n typeof data === \"string\" ? localStorage.setItem(key, data) : localStorage.setItem(key, JSON.stringify(data));\r\n}\r\n\r\n/**\r\n * @description: remove\r\n * @param { arguments }\r\n * @return: [Array,undefined]\r\n */\r\nexport function removeLocalStorageKey(...args: string[]) {\r\n let errArgs: string[] = [];\r\n args.forEach((item) => {\r\n typeof item === \"string\" ? localStorage.removeItem(item) : errArgs.push(item);\r\n });\r\n return errArgs.length ? { errMsg: \"error param\", errKey: errArgs } : undefined;\r\n}\r\n","/**\r\n * @description: sessionStorage Value\r\n * @param {type: String}\r\n * @return: [Object,String,null]\r\n */\r\nexport function getSessionStorage(key: string): any {\r\n let storageData = sessionStorage.getItem(key);\r\n if (storageData) {\r\n let storage;\r\n try {\r\n storage = JSON.parse(storageData);\r\n } catch (err) {\r\n storage = storageData;\r\n }\r\n return storage;\r\n }\r\n return storageData;\r\n}\r\n\r\n/**\r\n * @description: sessionStorage set Value\r\n * @param {[key,data]}\r\n * @return:void\r\n */\r\nexport function setSessionStorage(key: string, data: any) {\r\n typeof data === \"string\" ? sessionStorage.setItem(key, data) : sessionStorage.setItem(key, JSON.stringify(data));\r\n}\r\n\r\n/**\r\n * @description: remove sessionStorage key\r\n * @param { arguments }\r\n * @return: [Array,undefined]\r\n */\r\nexport function removeSessionStorageKey(...args: string[]) {\r\n let errArgs: string[] = [];\r\n args.forEach((item) => {\r\n typeof item === \"string\" ? sessionStorage.removeItem(item) : errArgs.push(item);\r\n });\r\n return errArgs.length ? { errMsg: \"error param\", errKey: errArgs } : undefined;\r\n}\r\n","/**\r\n * @web 环境下才能使用注册\r\n * 包含了storage 增删改查封装 存储监听等功能\r\n * 监听的方式使用的浏览器evet 事件模型\r\n */\r\n\r\nexport * from \"./local\";\r\nexport * from \"./session\";\r\n\r\n// init envet storage change\r\nconst monitorLocalStorage = () => {\r\n let originalSetItem = localStorage.setItem;\r\n //重写setItem函数\r\n localStorage.setItem = function (key, newValue) {\r\n //创建setItemEvent事件\r\n let event = new Event(\"setLocal\") as any;\r\n event.key = key;\r\n event.newValue = newValue;\r\n //提交setItemEvent事件\r\n window.dispatchEvent(event);\r\n //执行原setItem函数\r\n originalSetItem.call(this, key, newValue);\r\n };\r\n};\r\n\r\n\r\n/**\r\n * @这个方法实际没多大用\r\n*/\r\nconst monitorSessionStorage = () => {\r\n let originalSetItem = sessionStorage.setItem;\r\n //重写setItem函数\r\n sessionStorage.setItem = function (key, newValue) {\r\n //创建setItemEvent事件\r\n let event = new Event(\"setSessoin\") as any;\r\n event.key = key;\r\n event.newValue = newValue;\r\n //提交setItemEvent事件\r\n window.dispatchEvent(event);\r\n //执行原setItem函数\r\n originalSetItem.call(this, key, newValue);\r\n };\r\n};\r\n\r\n// 用于local 监听\r\nconst monitorStorage = () => {\r\n monitorLocalStorage();\r\n monitorSessionStorage();\r\n};\r\n\r\nmonitorStorage();\r\n","export function getTypeof(value: any): string {\r\n return Object.prototype.toString.call(value).slice(8, -1);\r\n}\r\n\r\nexport function isArray(value: any): boolean {\r\n return getTypeof(value) === \"Array\";\r\n}\r\n\r\nexport function isBoolean(value: any): boolean {\r\n return getTypeof(value) === \"Boolean\";\r\n}\r\n\r\nexport function isString(value: any): boolean {\r\n return getTypeof(value) === \"String\";\r\n}\r\n\r\nexport function isNumber(value: any): boolean {\r\n return getTypeof(value) === \"Number\";\r\n}\r\n\r\nexport function isObject(value: any): boolean {\r\n return getTypeof(value) === \"Object\";\r\n}\r\n\r\nexport function isFunction(value: any): boolean {\r\n return getTypeof(value) === \"Function\";\r\n}\r\n\r\nexport function isMap(value: any): boolean {\r\n return getTypeof(value) === \"Map\";\r\n}\r\n\r\nexport function isSet(value: any): boolean {\r\n return getTypeof(value) === \"Set\";\r\n}\r\n\r\nexport function isSymbol(value: any): boolean {\r\n return getTypeof(value) === \"Symbol\";\r\n}\r\n","/**\r\n * @description: Sleep 主线程阻塞方法\r\n * @return {*} int 单位 ms\r\n */\r\nexport const sleep = (ms: number) => {\r\n let target = new Date().getTime() + ms;\r\n while (true) {\r\n let now = new Date().getTime();\r\n if (now >= target) break;\r\n }\r\n};\r\n","/**\r\n * @description: 复制文本\r\n * @param {string} content\r\n * @return {*} string\r\n */\r\nexport const copyText = (text: string) => {\r\n if (navigator.clipboard && window.isSecureContext) {\r\n // navigator clipboard 向剪贴板写文本\r\n return navigator.clipboard.writeText(text);\r\n } else {\r\n const textarea = document.createElement(\"textarea\");\r\n textarea.value = text;\r\n document.body.appendChild(textarea);\r\n textarea.select();\r\n document.execCommand(\"copy\");\r\n document.body.removeChild(textarea);\r\n }\r\n};\r\n","/**\r\n * @description: 防抖函数\r\n * @param {func} 需要防抖的函数\r\n * @param {wait} 防抖时间\r\n * @return {*} (context,...args):void\r\n */\r\n\r\nexport function debounce<T extends (...args: any[]) => void>(func: T, wait: number): (...args: Parameters<T>) => void {\r\n let timeout: NodeJS.Timeout;\r\n\r\n return function (this: ThisParameterType<T>, ...args: Parameters<T>) {\r\n const context = this; // 保存当前的 this 上下文\r\n\r\n clearTimeout(timeout);\r\n timeout = setTimeout(() => {\r\n func.apply(context, args); // 使用 apply 绑定 this 和传递参数\r\n }, wait);\r\n };\r\n}\r\n","/**\r\n * @description: 节流函数\r\n * @param {func} 需要节流的函数\r\n * @param {wait} 节流时间区\r\n * @return {*} (context,...args):void\r\n */\r\n\r\nexport function throttle<T extends (...args: any[]) => void>(func: T, limit: number): (...args: Parameters<T>) => void {\r\n let lastFunc: NodeJS.Timeout;\r\n let lastRan: number;\r\n\r\n return function (this: ThisParameterType<T>, ...args: Parameters<T>) {\r\n const now = Date.now();\r\n const context = this; // 保存当前的 this 上下文\r\n\r\n if (!lastRan) {\r\n func.apply(context, args);\r\n lastRan = now;\r\n } else {\r\n clearTimeout(lastFunc);\r\n lastFunc = setTimeout(() => {\r\n if (now - lastRan >= limit) {\r\n func.apply(context, args);\r\n lastRan = now;\r\n }\r\n }, limit - (now - lastRan));\r\n }\r\n };\r\n}\r\n","/**\r\n * @description: 下载文件\r\n * @param stream 文件源,string or buffer\r\n * @param name 文件名称\r\n * @param mimeType type josn\r\n * @return new tree data 纯函数\r\n */\r\nexport const downFile = (stream: string | ArrayBuffer, name: string, mimeType: string = \"text/plain;charset=utf-8\") => {\r\n // 创建 Blob 对象\r\n let blob: Blob;\r\n if (typeof stream === \"string\") {\r\n blob = new Blob([stream], { type: mimeType });\r\n } else {\r\n blob = new Blob([stream], { type: mimeType });\r\n }\r\n\r\n // 创建下载链接并触发下载\r\n const a = document.createElement(\"a\");\r\n a.href = URL.createObjectURL(blob);\r\n a.download = name;\r\n a.style.display = \"none\";\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n\r\n // 清理创建的 URL 对象\r\n URL.revokeObjectURL(a.href);\r\n};\r\n","import { downFile } from \"./downFile\";\r\n\r\n/**\r\n * @description: 拉流下载方法\r\n * @param path 下载url\r\n * @param defaultName 匹配请求如果没有使用名称\r\n * @param token 鉴权 Authorization\r\n * @param params 参数 object\r\n */\r\nexport const downStream = (path: string, defaultName: string, token?: string, params?: Record<string, any>) => {\r\n // 处理查询参数\r\n const queryParams = new URLSearchParams(params).toString();\r\n const urlWithParams = queryParams ? `${path}?${queryParams}` : path;\r\n\r\n const xhr = new XMLHttpRequest();\r\n xhr.open(\"GET\", urlWithParams);\r\n xhr.responseType = \"blob\";\r\n\r\n if (token) xhr.setRequestHeader(\"Authorization\", token);\r\n xhr.onload = function () {\r\n if (xhr.status === 200 || xhr.status === 304) {\r\n const disposition = xhr.getResponseHeader(\"Content-Disposition\");\r\n let filename = defaultName;\r\n\r\n // 从 Content-Disposition 中提取文件名\r\n if (disposition && disposition.indexOf(\"attachment\") !== -1) {\r\n const filenameRegex = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/;\r\n const matches = filenameRegex.exec(disposition);\r\n if (matches != null && matches[1]) {\r\n filename = matches[1].replace(/['\"]/g, \"\");\r\n }\r\n }\r\n\r\n // 下载文件\r\n downFile(this.response, filename);\r\n } else {\r\n console.error(`Failed to download file. Status: ${xhr.status}`);\r\n }\r\n };\r\n\r\n xhr.onerror = function () {\r\n console.error(\"Request failed.\");\r\n };\r\n\r\n xhr.send();\r\n};\r\n","/**\r\n * @description: tree data -> 扁平树\r\n * @param origin 数据源\r\n * @return treedata\r\n */\r\nexport function toFlatTree(origin: TreeData[]) {\r\n return origin.reduce((res, item) => {\r\n const { children, ...i } = item;\r\n return res.concat(i, children && children.length ? toFlatTree(children) : []);\r\n }, []);\r\n}\r\n","/**\r\n * @description: 扁平树 -> tree data\r\n * @param origins 数据源\r\n * @param parentId 父级ID\r\n * @return 平铺数据\r\n */\r\nexport function toTreeFlat<T extends TreeData>(origin: T[], parentId: number | string = \"root\") {\r\n // treeArr 变量数据\r\n // 第一次:查找所有parentId为的数据组成第一级\r\n const child = origin.filter((item: any) => item.parentId === parentId);\r\n // 第一次:循环parentId为数组\r\n return child.map((item: T) => {\r\n return {\r\n ...item,\r\n // 当前存在id(id与parentId应该是必须有的)调用initTree() 查找所有parentId为本id的数据\r\n children: toTreeFlat(origin, item.id),\r\n };\r\n });\r\n}\r\n","/**\r\n * @description: 查找树节点\r\n * @param origin 数据源\r\n * @param findValue 找到节点\r\n * @param key 默认id\r\n * @return T\r\n */\r\nexport function findTreeNode<T extends TreeData>(origin: T[], findValue: any, key: keyof T = \"id\"): T | null {\r\n let result: T | null = null;\r\n\r\n const fun = (data: T[]) => {\r\n if (Array.isArray(data)) {\r\n for (let i = 0; i < data.length; i++) {\r\n let item = data[i];\r\n if (item[key] === findValue) {\r\n result = item;\r\n return;\r\n }\r\n if (item.children && item.children.length) {\r\n fun(item.children as T[]);\r\n }\r\n }\r\n }\r\n };\r\n\r\n fun(origin);\r\n return result;\r\n}\r\n","/**\r\n * @description: 过滤筛选树 -- search tree\r\n * @param treeData 数据源\r\n * @param findStr 关键字\r\n * @param label 关键字段\r\n * @return new tree data\r\n */\r\nexport const fuzzySearchTree = <T extends TreeData>(treeData: T[], findStr: string, label: keyof T = \"title\"): T[] => {\r\n if (!treeData) return [];\r\n let list: T[] = [];\r\n\r\n treeData.forEach((item) => {\r\n // 确保label属性是字符串并且包含findStr\r\n if (typeof item[label] === \"string\" && (item[label] as string).includes(findStr)) {\r\n // 递归处理子节点\r\n let children = item.children ? fuzzySearchTree(item.children as T[], findStr, label) : [];\r\n\r\n // 如果子节点中没有匹配的项,则保留原子节点\r\n children = children.length > 0 ? children : (item.children as T[]);\r\n\r\n // 构造新的节点,保留匹配的子节点\r\n const obj = { ...item, children };\r\n list.push(obj);\r\n } else if (item.children && item.children.length > 0) {\r\n // 如果当前节点不匹配,但有子节点,则递归处理子节点\r\n const children = fuzzySearchTree(item.children as T[], findStr, label);\r\n\r\n // 如果子节点中有匹配的项,则保留当前节点,并更新其子节点\r\n if (children.length > 0) {\r\n const obj = { ...item, children };\r\n list.push(obj);\r\n }\r\n }\r\n });\r\n\r\n return list;\r\n};\r\n","/**\r\n * @description: 过滤筛选树 -- search tree\r\n * @param origin 数据源\r\n * @param id\r\n * @return new tree data 纯函数\r\n */\r\nexport function deleteTreeNode<T extends TreeData>(origin: T[], id: string | number, key: keyof T = \"id\"): T[] {\r\n return origin.filter((node) => {\r\n if (node.children) {\r\n node.children = deleteTreeNode(node.children as T[], id, key);\r\n }\r\n return node[key] !== id;\r\n });\r\n}\r\n","/**\r\n * @description: 深拷贝\r\n * @param {any} obj\r\n * @return {*} obj\r\n */\r\nexport const deepClone = <T = any>(obj: T): T => {\r\n if (obj === null || typeof obj !== \"object\") {\r\n return obj;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n const arrCopy: any[] = [];\r\n for (const item of obj) {\r\n arrCopy.push(deepClone(item));\r\n }\r\n return arrCopy as any;\r\n }\r\n\r\n const objCopy: { [key: string]: any } = {};\r\n for (const key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n objCopy[key] = deepClone((obj as { [key: string]: any })[key]);\r\n }\r\n }\r\n return objCopy as T;\r\n};\r\n","/**\r\n * @description: uuid\r\n * @param template uuid模板 默认\r\n * @return string\r\n */\r\nexport const generateUUID = (template: string = \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\"): string => {\r\n // Helper function to generate a random hex digit\r\n const randomHexDigit = (c: string): string => {\r\n const r = crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c === \"x\" ? 0 : 4));\r\n return (c === \"x\" ? r : (r & 0x3) | 0x8).toString(16);\r\n };\r\n\r\n // Generate UUID based on template\r\n return template.replace(/[xy]/g, randomHexDigit);\r\n};\r\n","/**\r\n * @description: 需要以字母开头的随机字符串\r\n * @param length 字符串长度 默认8\r\n * @return string\r\n */\r\nexport const generateString = (length: number = 8): string => {\r\n const characters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\r\n const randomChar = () => characters.charAt(Math.floor(Math.random() * characters.length));\r\n\r\n const timestamp = Date.now().toString(36); // Use timestamp for uniqueness\r\n let result = timestamp + Array.from({ length: length - timestamp.length }, randomChar).join(\"\");\r\n\r\n return result.charAt(0).toUpperCase() + result.slice(1); // Ensure it starts with a letter\r\n};\r\n"],"names":["getLocalStorage","key","storageData","localStorage","getItem","let","storage","JSON","parse","err","setLocalStorage","data","setItem","stringify","removeLocalStorageKey","args","errArgs","forEach","item","removeItem","push","length","errMsg","errKey","undefined","getSessionStorage","sessionStorage","setSessionStorage","removeSessionStorageKey","monitorLocalStorage","originalSetItem","newValue","event","Event","window","dispatchEvent","call","this","monitorSessionStorage","monitorStorage","getTypeof","value","Object","prototype","toString","slice","isArray","isBoolean","isString","isNumber","isObject","isFunction","isMap","isSet","isSymbol","sleep","target","Date","getTime","ms","now","copyText","navigator","clipboard","isSecureContext","writeText","text","textarea","document","createElement","body","appendChild","select","execCommand","removeChild","debounce","func","wait","timeout","context","clearTimeout","setTimeout","apply","throttle","limit","lastFunc","lastRan","downFile","stream","name","mimeType","blob","Blob","type","a","href","URL","createObjectURL","download","style","display","click","revokeObjectURL","downStream","path","defaultName","token","params","queryParams","URLSearchParams","urlWithParams","xhr","XMLHttpRequest","open","responseType","setRequestHeader","onload","status","disposition","getResponseHeader","filename","indexOf","matches","exec","replace","response","console","error","onerror","send","toFlatTree","origin","reduce","res","children","i","concat","toTreeFlat","parentId","filter","map","id","findTreeNode","findValue","result","fun","Array","fuzzySearchTree","treeData","findStr","label","list","includes","obj","deleteTreeNode","node","deepClone","arrCopy","objCopy","hasOwnProperty","generateUUID","template","r","crypto","getRandomValues","Uint8Array","c","generateString","characters","timestamp","from","charAt","Math","floor","random","join","toUpperCase"],"mappings":"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"}
package/lib/index.js ADDED
@@ -0,0 +1,2 @@
1
+ function getLocalStorage(r){r=localStorage.getItem(r);if(r){let t;try{t=JSON.parse(r)}catch(e){t=r}return t}return r}function setLocalStorage(e,t){"string"==typeof t?localStorage.setItem(e,t):localStorage.setItem(e,JSON.stringify(t))}function removeLocalStorageKey(...e){let t=[];return e.forEach(e=>{"string"==typeof e?localStorage.removeItem(e):t.push(e)}),t.length?{errMsg:"error param",errKey:t}:void 0}function getSessionStorage(r){r=sessionStorage.getItem(r);if(r){let t;try{t=JSON.parse(r)}catch(e){t=r}return t}return r}function setSessionStorage(e,t){"string"==typeof t?sessionStorage.setItem(e,t):sessionStorage.setItem(e,JSON.stringify(t))}function removeSessionStorageKey(...e){let t=[];return e.forEach(e=>{"string"==typeof e?sessionStorage.removeItem(e):t.push(e)}),t.length?{errMsg:"error param",errKey:t}:void 0}!function(e,t){e&&!e.getElementById("livereloadscript")&&((t=e.createElement("script")).async=1,t.src="//"+(self.location.host||"localhost").split(":")[0]+":35729/livereload.js?snipver=1",t.id="livereloadscript",e.getElementsByTagName("head")[0].appendChild(t))}(self.document);const monitorLocalStorage=()=>{let o=localStorage.setItem;localStorage.setItem=function(e,t){var r=new Event("setLocal");r.key=e,r.newValue=t,window.dispatchEvent(r),o.call(this,e,t)}},monitorSessionStorage=()=>{let o=sessionStorage.setItem;sessionStorage.setItem=function(e,t){var r=new Event("setSessoin");r.key=e,r.newValue=t,window.dispatchEvent(r),o.call(this,e,t)}},monitorStorage=()=>{monitorLocalStorage(),monitorSessionStorage()};function getTypeof(e){return Object.prototype.toString.call(e).slice(8,-1)}function isArray(e){return"Array"===getTypeof(e)}function isBoolean(e){return"Boolean"===getTypeof(e)}function isString(e){return"String"===getTypeof(e)}function isNumber(e){return"Number"===getTypeof(e)}function isObject(e){return"Object"===getTypeof(e)}function isFunction(e){return"Function"===getTypeof(e)}function isMap(e){return"Map"===getTypeof(e)}function isSet(e){return"Set"===getTypeof(e)}function isSymbol(e){return"Symbol"===getTypeof(e)}monitorStorage();const sleep=e=>{for(var t=(new Date).getTime()+e;!(t<=(new Date).getTime()););},copyText=e=>{if(navigator.clipboard&&window.isSecureContext)return navigator.clipboard.writeText(e);var t=document.createElement("textarea");t.value=e,document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t)};function debounce(r,o){let n;return function(...e){const t=this;clearTimeout(n),n=setTimeout(()=>{r.apply(t,e)},o)}}function throttle(o,n){let i,a;return function(...e){const t=Date.now(),r=this;a?(clearTimeout(i),i=setTimeout(()=>{t-a>=n&&(o.apply(r,e),a=t)},n-(t-a))):(o.apply(r,e),a=t)}}const downFile=(e,t,r="text/plain;charset=utf-8")=>{let o;o=new Blob([e],{type:r});e=document.createElement("a");e.href=URL.createObjectURL(o),e.download=t,e.style.display="none",document.body.appendChild(e),e.click(),document.body.removeChild(e),URL.revokeObjectURL(e.href)},downStream=(e,r,t,o)=>{o=new URLSearchParams(o).toString(),o=o?e+"?"+o:e;const n=new XMLHttpRequest;n.open("GET",o),n.responseType="blob",t&&n.setRequestHeader("Authorization",t),n.onload=function(){if(200===n.status||304===n.status){var t=n.getResponseHeader("Content-Disposition");let e=r;t&&-1!==t.indexOf("attachment")&&null!=(t=/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/.exec(t))&&t[1]&&(e=t[1].replace(/['"]/g,"")),downFile(this.response,e)}else console.error("Failed to download file. Status: "+n.status)},n.onerror=function(){console.error("Request failed.")},n.send()};function toFlatTree(e){return e.reduce((e,t)=>{const{children:r,...o}=t;return e.concat(o,r&&r.length?toFlatTree(r):[])},[])}function toTreeFlat(t,r="root"){return t.filter(e=>e.parentId===r).map(e=>({...e,children:toTreeFlat(t,e.id)}))}function findTreeNode(e,o,n="id"){let i=null;const a=t=>{if(Array.isArray(t))for(let e=0;e<t.length;e++){var r=t[e];if(r[n]===o)return void(i=r);r.children&&r.children.length&&a(r.children)}};return a(e),i}const fuzzySearchTree=(e,r,o="title")=>{if(!e)return[];let n=[];return e.forEach(e=>{var t;"string"==typeof e[o]&&e[o].includes(r)?(t=0<(t=e.children?fuzzySearchTree(e.children,r,o):[]).length?t:e.children,t={...e,children:t},n.push(t)):e.children&&0<e.children.length&&0<(t=fuzzySearchTree(e.children,r,o)).length&&(e={...e,children:t},n.push(e))}),n};function deleteTreeNode(e,t,r="id"){return e.filter(e=>(e.children&&(e.children=deleteTreeNode(e.children,t,r)),e[r]!==t))}const deepClone=e=>{if(null===e||"object"!=typeof e)return e;if(Array.isArray(e)){var t=[];for(const o of e)t.push(deepClone(o));return t}var r={};for(const n in e)e.hasOwnProperty(n)&&(r[n]=deepClone(e[n]));return r},generateUUID=(e="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx")=>{return e.replace(/[xy]/g,e=>{var t=crypto.getRandomValues(new Uint8Array(1))[0]&15>>("x"===e?0:4);return("x"===e?t:3&t|8).toString(16)})},generateString=(e=8)=>{const t="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";var r=Date.now().toString(36),e=r+Array.from({length:e-r.length},()=>t.charAt(Math.floor(Math.random()*t.length))).join("");return e.charAt(0).toUpperCase()+e.slice(1)};export{copyText,debounce,deepClone,deleteTreeNode,downFile,downStream,findTreeNode,fuzzySearchTree,generateString,generateUUID,getLocalStorage,getSessionStorage,getTypeof,isArray,isBoolean,isFunction,isMap,isNumber,isObject,isSet,isString,isSymbol,removeLocalStorageKey,removeSessionStorageKey,setLocalStorage,setSessionStorage,sleep,throttle,toFlatTree,toTreeFlat};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/storage/local.ts","../src/storage/session.ts","../src/storage/index.ts","../src/utools/typeof.ts","../src/utools/sleep.ts","../src/utools/copyText.ts","../src/utools/debounce.ts","../src/utools/throttle.ts","../src/fileStream/downFile.ts","../src/fileStream/downStream.ts","../src/datatree/toFlatTree.ts","../src/datatree/toTreeFlat.ts","../src/datatree/findTreeNode.ts","../src/datatree/fuzzySearchTree.ts","../src/datatree/deleteTreeNode.ts","../src/datatree/deepClone.ts","../src/uuid/generateUUID.ts","../src/uuid/generateString.ts"],"sourcesContent":["/**\r\n * @description: get value\r\n * @param {type: String}\r\n * @return: [Object,String,null]\r\n */\r\nexport function getLocalStorage(key: string): any {\r\n let storageData = localStorage.getItem(key);\r\n if (storageData) {\r\n let storage;\r\n try {\r\n storage = JSON.parse(storageData);\r\n } catch (err) {\r\n storage = storageData;\r\n }\r\n return storage;\r\n }\r\n return storageData;\r\n}\r\n\r\n/**\r\n * @description: set value\r\n * @param {[key,data]}\r\n * @return:void\r\n */\r\nexport function setLocalStorage(key: string, data: any) {\r\n typeof data === \"string\" ? localStorage.setItem(key, data) : localStorage.setItem(key, JSON.stringify(data));\r\n}\r\n\r\n/**\r\n * @description: remove\r\n * @param { arguments }\r\n * @return: [Array,undefined]\r\n */\r\nexport function removeLocalStorageKey(...args: string[]) {\r\n let errArgs: string[] = [];\r\n args.forEach((item) => {\r\n typeof item === \"string\" ? localStorage.removeItem(item) : errArgs.push(item);\r\n });\r\n return errArgs.length ? { errMsg: \"error param\", errKey: errArgs } : undefined;\r\n}\r\n","/**\r\n * @description: sessionStorage Value\r\n * @param {type: String}\r\n * @return: [Object,String,null]\r\n */\r\nexport function getSessionStorage(key: string): any {\r\n let storageData = sessionStorage.getItem(key);\r\n if (storageData) {\r\n let storage;\r\n try {\r\n storage = JSON.parse(storageData);\r\n } catch (err) {\r\n storage = storageData;\r\n }\r\n return storage;\r\n }\r\n return storageData;\r\n}\r\n\r\n/**\r\n * @description: sessionStorage set Value\r\n * @param {[key,data]}\r\n * @return:void\r\n */\r\nexport function setSessionStorage(key: string, data: any) {\r\n typeof data === \"string\" ? sessionStorage.setItem(key, data) : sessionStorage.setItem(key, JSON.stringify(data));\r\n}\r\n\r\n/**\r\n * @description: remove sessionStorage key\r\n * @param { arguments }\r\n * @return: [Array,undefined]\r\n */\r\nexport function removeSessionStorageKey(...args: string[]) {\r\n let errArgs: string[] = [];\r\n args.forEach((item) => {\r\n typeof item === \"string\" ? sessionStorage.removeItem(item) : errArgs.push(item);\r\n });\r\n return errArgs.length ? { errMsg: \"error param\", errKey: errArgs } : undefined;\r\n}\r\n","/**\r\n * @web 环境下才能使用注册\r\n * 包含了storage 增删改查封装 存储监听等功能\r\n * 监听的方式使用的浏览器evet 事件模型\r\n */\r\n\r\nexport * from \"./local\";\r\nexport * from \"./session\";\r\n\r\n// init envet storage change\r\nconst monitorLocalStorage = () => {\r\n let originalSetItem = localStorage.setItem;\r\n //重写setItem函数\r\n localStorage.setItem = function (key, newValue) {\r\n //创建setItemEvent事件\r\n let event = new Event(\"setLocal\") as any;\r\n event.key = key;\r\n event.newValue = newValue;\r\n //提交setItemEvent事件\r\n window.dispatchEvent(event);\r\n //执行原setItem函数\r\n originalSetItem.call(this, key, newValue);\r\n };\r\n};\r\n\r\n\r\n/**\r\n * @这个方法实际没多大用\r\n*/\r\nconst monitorSessionStorage = () => {\r\n let originalSetItem = sessionStorage.setItem;\r\n //重写setItem函数\r\n sessionStorage.setItem = function (key, newValue) {\r\n //创建setItemEvent事件\r\n let event = new Event(\"setSessoin\") as any;\r\n event.key = key;\r\n event.newValue = newValue;\r\n //提交setItemEvent事件\r\n window.dispatchEvent(event);\r\n //执行原setItem函数\r\n originalSetItem.call(this, key, newValue);\r\n };\r\n};\r\n\r\n// 用于local 监听\r\nconst monitorStorage = () => {\r\n monitorLocalStorage();\r\n monitorSessionStorage();\r\n};\r\n\r\nmonitorStorage();\r\n","export function getTypeof(value: any): string {\r\n return Object.prototype.toString.call(value).slice(8, -1);\r\n}\r\n\r\nexport function isArray(value: any): boolean {\r\n return getTypeof(value) === \"Array\";\r\n}\r\n\r\nexport function isBoolean(value: any): boolean {\r\n return getTypeof(value) === \"Boolean\";\r\n}\r\n\r\nexport function isString(value: any): boolean {\r\n return getTypeof(value) === \"String\";\r\n}\r\n\r\nexport function isNumber(value: any): boolean {\r\n return getTypeof(value) === \"Number\";\r\n}\r\n\r\nexport function isObject(value: any): boolean {\r\n return getTypeof(value) === \"Object\";\r\n}\r\n\r\nexport function isFunction(value: any): boolean {\r\n return getTypeof(value) === \"Function\";\r\n}\r\n\r\nexport function isMap(value: any): boolean {\r\n return getTypeof(value) === \"Map\";\r\n}\r\n\r\nexport function isSet(value: any): boolean {\r\n return getTypeof(value) === \"Set\";\r\n}\r\n\r\nexport function isSymbol(value: any): boolean {\r\n return getTypeof(value) === \"Symbol\";\r\n}\r\n","/**\r\n * @description: Sleep 主线程阻塞方法\r\n * @return {*} int 单位 ms\r\n */\r\nexport const sleep = (ms: number) => {\r\n let target = new Date().getTime() + ms;\r\n while (true) {\r\n let now = new Date().getTime();\r\n if (now >= target) break;\r\n }\r\n};\r\n","/**\r\n * @description: 复制文本\r\n * @param {string} content\r\n * @return {*} string\r\n */\r\nexport const copyText = (text: string) => {\r\n if (navigator.clipboard && window.isSecureContext) {\r\n // navigator clipboard 向剪贴板写文本\r\n return navigator.clipboard.writeText(text);\r\n } else {\r\n const textarea = document.createElement(\"textarea\");\r\n textarea.value = text;\r\n document.body.appendChild(textarea);\r\n textarea.select();\r\n document.execCommand(\"copy\");\r\n document.body.removeChild(textarea);\r\n }\r\n};\r\n","/**\r\n * @description: 防抖函数\r\n * @param {func} 需要防抖的函数\r\n * @param {wait} 防抖时间\r\n * @return {*} (context,...args):void\r\n */\r\n\r\nexport function debounce<T extends (...args: any[]) => void>(func: T, wait: number): (...args: Parameters<T>) => void {\r\n let timeout: NodeJS.Timeout;\r\n\r\n return function (this: ThisParameterType<T>, ...args: Parameters<T>) {\r\n const context = this; // 保存当前的 this 上下文\r\n\r\n clearTimeout(timeout);\r\n timeout = setTimeout(() => {\r\n func.apply(context, args); // 使用 apply 绑定 this 和传递参数\r\n }, wait);\r\n };\r\n}\r\n","/**\r\n * @description: 节流函数\r\n * @param {func} 需要节流的函数\r\n * @param {wait} 节流时间区\r\n * @return {*} (context,...args):void\r\n */\r\n\r\nexport function throttle<T extends (...args: any[]) => void>(func: T, limit: number): (...args: Parameters<T>) => void {\r\n let lastFunc: NodeJS.Timeout;\r\n let lastRan: number;\r\n\r\n return function (this: ThisParameterType<T>, ...args: Parameters<T>) {\r\n const now = Date.now();\r\n const context = this; // 保存当前的 this 上下文\r\n\r\n if (!lastRan) {\r\n func.apply(context, args);\r\n lastRan = now;\r\n } else {\r\n clearTimeout(lastFunc);\r\n lastFunc = setTimeout(() => {\r\n if (now - lastRan >= limit) {\r\n func.apply(context, args);\r\n lastRan = now;\r\n }\r\n }, limit - (now - lastRan));\r\n }\r\n };\r\n}\r\n","/**\r\n * @description: 下载文件\r\n * @param stream 文件源,string or buffer\r\n * @param name 文件名称\r\n * @param mimeType type josn\r\n * @return new tree data 纯函数\r\n */\r\nexport const downFile = (stream: string | ArrayBuffer, name: string, mimeType: string = \"text/plain;charset=utf-8\") => {\r\n // 创建 Blob 对象\r\n let blob: Blob;\r\n if (typeof stream === \"string\") {\r\n blob = new Blob([stream], { type: mimeType });\r\n } else {\r\n blob = new Blob([stream], { type: mimeType });\r\n }\r\n\r\n // 创建下载链接并触发下载\r\n const a = document.createElement(\"a\");\r\n a.href = URL.createObjectURL(blob);\r\n a.download = name;\r\n a.style.display = \"none\";\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n\r\n // 清理创建的 URL 对象\r\n URL.revokeObjectURL(a.href);\r\n};\r\n","import { downFile } from \"./downFile\";\r\n\r\n/**\r\n * @description: 拉流下载方法\r\n * @param path 下载url\r\n * @param defaultName 匹配请求如果没有使用名称\r\n * @param token 鉴权 Authorization\r\n * @param params 参数 object\r\n */\r\nexport const downStream = (path: string, defaultName: string, token?: string, params?: Record<string, any>) => {\r\n // 处理查询参数\r\n const queryParams = new URLSearchParams(params).toString();\r\n const urlWithParams = queryParams ? `${path}?${queryParams}` : path;\r\n\r\n const xhr = new XMLHttpRequest();\r\n xhr.open(\"GET\", urlWithParams);\r\n xhr.responseType = \"blob\";\r\n\r\n if (token) xhr.setRequestHeader(\"Authorization\", token);\r\n xhr.onload = function () {\r\n if (xhr.status === 200 || xhr.status === 304) {\r\n const disposition = xhr.getResponseHeader(\"Content-Disposition\");\r\n let filename = defaultName;\r\n\r\n // 从 Content-Disposition 中提取文件名\r\n if (disposition && disposition.indexOf(\"attachment\") !== -1) {\r\n const filenameRegex = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/;\r\n const matches = filenameRegex.exec(disposition);\r\n if (matches != null && matches[1]) {\r\n filename = matches[1].replace(/['\"]/g, \"\");\r\n }\r\n }\r\n\r\n // 下载文件\r\n downFile(this.response, filename);\r\n } else {\r\n console.error(`Failed to download file. Status: ${xhr.status}`);\r\n }\r\n };\r\n\r\n xhr.onerror = function () {\r\n console.error(\"Request failed.\");\r\n };\r\n\r\n xhr.send();\r\n};\r\n","/**\r\n * @description: tree data -> 扁平树\r\n * @param origin 数据源\r\n * @return treedata\r\n */\r\nexport function toFlatTree(origin: TreeData[]) {\r\n return origin.reduce((res, item) => {\r\n const { children, ...i } = item;\r\n return res.concat(i, children && children.length ? toFlatTree(children) : []);\r\n }, []);\r\n}\r\n","/**\r\n * @description: 扁平树 -> tree data\r\n * @param origins 数据源\r\n * @param parentId 父级ID\r\n * @return 平铺数据\r\n */\r\nexport function toTreeFlat<T extends TreeData>(origin: T[], parentId: number | string = \"root\") {\r\n // treeArr 变量数据\r\n // 第一次:查找所有parentId为的数据组成第一级\r\n const child = origin.filter((item: any) => item.parentId === parentId);\r\n // 第一次:循环parentId为数组\r\n return child.map((item: T) => {\r\n return {\r\n ...item,\r\n // 当前存在id(id与parentId应该是必须有的)调用initTree() 查找所有parentId为本id的数据\r\n children: toTreeFlat(origin, item.id),\r\n };\r\n });\r\n}\r\n","/**\r\n * @description: 查找树节点\r\n * @param origin 数据源\r\n * @param findValue 找到节点\r\n * @param key 默认id\r\n * @return T\r\n */\r\nexport function findTreeNode<T extends TreeData>(origin: T[], findValue: any, key: keyof T = \"id\"): T | null {\r\n let result: T | null = null;\r\n\r\n const fun = (data: T[]) => {\r\n if (Array.isArray(data)) {\r\n for (let i = 0; i < data.length; i++) {\r\n let item = data[i];\r\n if (item[key] === findValue) {\r\n result = item;\r\n return;\r\n }\r\n if (item.children && item.children.length) {\r\n fun(item.children as T[]);\r\n }\r\n }\r\n }\r\n };\r\n\r\n fun(origin);\r\n return result;\r\n}\r\n","/**\r\n * @description: 过滤筛选树 -- search tree\r\n * @param treeData 数据源\r\n * @param findStr 关键字\r\n * @param label 关键字段\r\n * @return new tree data\r\n */\r\nexport const fuzzySearchTree = <T extends TreeData>(treeData: T[], findStr: string, label: keyof T = \"title\"): T[] => {\r\n if (!treeData) return [];\r\n let list: T[] = [];\r\n\r\n treeData.forEach((item) => {\r\n // 确保label属性是字符串并且包含findStr\r\n if (typeof item[label] === \"string\" && (item[label] as string).includes(findStr)) {\r\n // 递归处理子节点\r\n let children = item.children ? fuzzySearchTree(item.children as T[], findStr, label) : [];\r\n\r\n // 如果子节点中没有匹配的项,则保留原子节点\r\n children = children.length > 0 ? children : (item.children as T[]);\r\n\r\n // 构造新的节点,保留匹配的子节点\r\n const obj = { ...item, children };\r\n list.push(obj);\r\n } else if (item.children && item.children.length > 0) {\r\n // 如果当前节点不匹配,但有子节点,则递归处理子节点\r\n const children = fuzzySearchTree(item.children as T[], findStr, label);\r\n\r\n // 如果子节点中有匹配的项,则保留当前节点,并更新其子节点\r\n if (children.length > 0) {\r\n const obj = { ...item, children };\r\n list.push(obj);\r\n }\r\n }\r\n });\r\n\r\n return list;\r\n};\r\n","/**\r\n * @description: 过滤筛选树 -- search tree\r\n * @param origin 数据源\r\n * @param id\r\n * @return new tree data 纯函数\r\n */\r\nexport function deleteTreeNode<T extends TreeData>(origin: T[], id: string | number, key: keyof T = \"id\"): T[] {\r\n return origin.filter((node) => {\r\n if (node.children) {\r\n node.children = deleteTreeNode(node.children as T[], id, key);\r\n }\r\n return node[key] !== id;\r\n });\r\n}\r\n","/**\r\n * @description: 深拷贝\r\n * @param {any} obj\r\n * @return {*} obj\r\n */\r\nexport const deepClone = <T = any>(obj: T): T => {\r\n if (obj === null || typeof obj !== \"object\") {\r\n return obj;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n const arrCopy: any[] = [];\r\n for (const item of obj) {\r\n arrCopy.push(deepClone(item));\r\n }\r\n return arrCopy as any;\r\n }\r\n\r\n const objCopy: { [key: string]: any } = {};\r\n for (const key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n objCopy[key] = deepClone((obj as { [key: string]: any })[key]);\r\n }\r\n }\r\n return objCopy as T;\r\n};\r\n","/**\r\n * @description: uuid\r\n * @param template uuid模板 默认\r\n * @return string\r\n */\r\nexport const generateUUID = (template: string = \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\"): string => {\r\n // Helper function to generate a random hex digit\r\n const randomHexDigit = (c: string): string => {\r\n const r = crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c === \"x\" ? 0 : 4));\r\n return (c === \"x\" ? r : (r & 0x3) | 0x8).toString(16);\r\n };\r\n\r\n // Generate UUID based on template\r\n return template.replace(/[xy]/g, randomHexDigit);\r\n};\r\n","/**\r\n * @description: 需要以字母开头的随机字符串\r\n * @param length 字符串长度 默认8\r\n * @return string\r\n */\r\nexport const generateString = (length: number = 8): string => {\r\n const characters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\r\n const randomChar = () => characters.charAt(Math.floor(Math.random() * characters.length));\r\n\r\n const timestamp = Date.now().toString(36); // Use timestamp for uniqueness\r\n let result = timestamp + Array.from({ length: length - timestamp.length }, randomChar).join(\"\");\r\n\r\n return result.charAt(0).toUpperCase() + result.slice(1); // Ensure it starts with a letter\r\n};\r\n"],"names":["getLocalStorage","key","storageData","localStorage","getItem","let","storage","JSON","parse","err","setLocalStorage","data","setItem","stringify","removeLocalStorageKey","args","errArgs","forEach","item","removeItem","push","length","errMsg","errKey","undefined","getSessionStorage","sessionStorage","setSessionStorage","removeSessionStorageKey","monitorLocalStorage","originalSetItem","newValue","event","Event","window","dispatchEvent","call","this","monitorSessionStorage","monitorStorage","getTypeof","value","Object","prototype","toString","slice","isArray","isBoolean","isString","isNumber","isObject","isFunction","isMap","isSet","isSymbol","sleep","target","Date","getTime","ms","now","copyText","navigator","clipboard","isSecureContext","writeText","text","textarea","document","createElement","body","appendChild","select","execCommand","removeChild","debounce","func","wait","timeout","context","clearTimeout","setTimeout","apply","throttle","limit","lastFunc","lastRan","downFile","stream","name","mimeType","blob","Blob","type","a","href","URL","createObjectURL","download","style","display","click","revokeObjectURL","downStream","path","defaultName","token","params","queryParams","URLSearchParams","urlWithParams","xhr","XMLHttpRequest","open","responseType","setRequestHeader","onload","status","disposition","getResponseHeader","filename","indexOf","matches","exec","replace","response","console","error","onerror","send","toFlatTree","origin","reduce","res","children","i","concat","toTreeFlat","parentId","filter","map","id","findTreeNode","findValue","result","fun","Array","fuzzySearchTree","treeData","findStr","label","list","includes","obj","deleteTreeNode","node","deepClone","arrCopy","objCopy","hasOwnProperty","generateUUID","template","r","crypto","getRandomValues","Uint8Array","c","generateString","characters","timestamp","from","charAt","Math","floor","random","join","toUpperCase"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- export * from "./storage";
2
- export * from "./utools";
3
- export * from "./fileStream";
4
- export * from "./datatree";
5
- export * from "./uuid";
1
+ export * from "./storage";
2
+ export * from "./utools";
3
+ export * from "./fileStream";
4
+ export * from "./datatree";
5
+ export * from "./uuid";
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @description: 将params code 转成 object
3
+ * @param {string} [queryString]
4
+ * @return {*} object
5
+ */
6
+ export declare const decodeParams: (queryString: string) => any;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @description: 将params code 转成 object
3
+ * @param {objct} [str:string]:any
4
+ * @return {*} string
5
+ */
6
+ export declare const encodeParams: (query: Record<string, any>) => string;
@@ -1,2 +1,2 @@
1
- export * from "./decodeParams";
2
- export * from "./encodeParams";
1
+ export * from "./decodeParams";
2
+ export * from "./encodeParams";
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @web 环境下才能使用注册
3
+ * 包含了storage 增删改查封装 存储监听等功能
4
+ * 监听的方式使用的浏览器evet 事件模型
5
+ */
6
+ export * from "./local";
7
+ export * from "./session";
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @description: get value
3
+ * @param {type: String}
4
+ * @return: [Object,String,null]
5
+ */
6
+ export declare function getLocalStorage(key: string): any;
7
+ /**
8
+ * @description: set value
9
+ * @param {[key,data]}
10
+ * @return:void
11
+ */
12
+ export declare function setLocalStorage(key: string, data: any): void;
13
+ /**
14
+ * @description: remove
15
+ * @param { arguments }
16
+ * @return: [Array,undefined]
17
+ */
18
+ export declare function removeLocalStorageKey(...args: string[]): {
19
+ errMsg: string;
20
+ errKey: string[];
21
+ } | undefined;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @description: sessionStorage Value
3
+ * @param {type: String}
4
+ * @return: [Object,String,null]
5
+ */
6
+ export declare function getSessionStorage(key: string): any;
7
+ /**
8
+ * @description: sessionStorage set Value
9
+ * @param {[key,data]}
10
+ * @return:void
11
+ */
12
+ export declare function setSessionStorage(key: string, data: any): void;
13
+ /**
14
+ * @description: remove sessionStorage key
15
+ * @param { arguments }
16
+ * @return: [Array,undefined]
17
+ */
18
+ export declare function removeSessionStorageKey(...args: string[]): {
19
+ errMsg: string;
20
+ errKey: string[];
21
+ } | undefined;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @description: 复制文本
3
+ * @param {string} content
4
+ * @return {*} string
5
+ */
6
+ export declare const copyText: (text: string) => Promise<void> | undefined;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @description: 防抖函数
3
+ * @param {func} 需要防抖的函数
4
+ * @param {wait} 防抖时间
5
+ * @return {*} (context,...args):void
6
+ */
7
+ export declare function debounce<T extends (...args: any[]) => void>(func: T, wait: number): (...args: Parameters<T>) => void;
@@ -1,5 +1,5 @@
1
- export * from "./typeof";
2
- export * from "./sleep";
3
- export * from "./copyText";
4
- export * from "./debounce";
5
- export * from "./throttle";
1
+ export * from "./typeof";
2
+ export * from "./sleep";
3
+ export * from "./copyText";
4
+ export * from "./debounce";
5
+ export * from "./throttle";
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @description: Sleep 主线程阻塞方法
3
+ * @return {*} int 单位 ms
4
+ */
5
+ export declare const sleep: (ms: number) => void;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @description: 节流函数
3
+ * @param {func} 需要节流的函数
4
+ * @param {wait} 节流时间区
5
+ * @return {*} (context,...args):void
6
+ */
7
+ export declare function throttle<T extends (...args: any[]) => void>(func: T, limit: number): (...args: Parameters<T>) => void;
@@ -0,0 +1,10 @@
1
+ export declare function getTypeof(value: any): string;
2
+ export declare function isArray(value: any): boolean;
3
+ export declare function isBoolean(value: any): boolean;
4
+ export declare function isString(value: any): boolean;
5
+ export declare function isNumber(value: any): boolean;
6
+ export declare function isObject(value: any): boolean;
7
+ export declare function isFunction(value: any): boolean;
8
+ export declare function isMap(value: any): boolean;
9
+ export declare function isSet(value: any): boolean;
10
+ export declare function isSymbol(value: any): boolean;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @description: 需要以字母开头的随机字符串
3
+ * @param length 字符串长度 默认8
4
+ * @return string
5
+ */
6
+ export declare const generateString: (length?: number) => string;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @description: uuid
3
+ * @param template uuid模板 默认
4
+ * @return string
5
+ */
6
+ export declare const generateUUID: (template?: string) => string;
@@ -1,2 +1,2 @@
1
- export * from "./generateUUID";
2
- export * from "./generateString";
1
+ export * from "./generateUUID";
2
+ export * from "./generateString";
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "iota-utools",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "description": "",
5
- "main": "./lib//bundle.esm.js",
5
+ "main": "./lib/index.js",
6
6
  "type": "module",
7
7
  "scripts": {
8
8
  "build": "rollup -c",
package/rollup.config.js CHANGED
@@ -14,7 +14,7 @@ export default {
14
14
  output: [
15
15
  {
16
16
  format: "cjs",
17
- file: "lib/bundle.cjs.js",
17
+ file: "lib/index.cjs.js",
18
18
  sourcemap: true,
19
19
  },
20
20
  {
package/public/index.html DELETED
@@ -1,20 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta http-equiv="X-UA-Compatible" content="IE=edge" />
6
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
- <title>Document</title>
8
- </head>
9
-
10
- <body>
11
- <h1>Test Fun In Page</h1>
12
- <hr />
13
- <h2>window utools object function!!</h2>
14
- <hr />
15
- <script type="module">
16
- import * as utools from "../lib/bundle.esm.js"
17
- window.utools = utools
18
- </script>
19
- </body>
20
- </html>
@@ -1,14 +0,0 @@
1
- /**
2
- * @description: 对象数组中去重处理
3
- * @param array 数据源
4
- * @param key 根据类型
5
- * @return T[]
6
- */
7
- export function uniqueArrayByProperty<T>(array: T[], key: keyof T): T[] {
8
- return array.reduce((acc, item) => {
9
- if (!acc.some((existingItem) => existingItem[key] === item[key])) {
10
- acc.push(item);
11
- }
12
- return acc;
13
- }, [] as T[]);
14
- }
@@ -1,26 +0,0 @@
1
- /**
2
- * @description: 深拷贝
3
- * @param {any} obj
4
- * @return {*} obj
5
- */
6
- export const deepClone = <T = any>(obj: T): T => {
7
- if (obj === null || typeof obj !== "object") {
8
- return obj;
9
- }
10
-
11
- if (Array.isArray(obj)) {
12
- const arrCopy: any[] = [];
13
- for (const item of obj) {
14
- arrCopy.push(deepClone(item));
15
- }
16
- return arrCopy as any;
17
- }
18
-
19
- const objCopy: { [key: string]: any } = {};
20
- for (const key in obj) {
21
- if (obj.hasOwnProperty(key)) {
22
- objCopy[key] = deepClone((obj as { [key: string]: any })[key]);
23
- }
24
- }
25
- return objCopy as T;
26
- };
@@ -1,14 +0,0 @@
1
- /**
2
- * @description: 过滤筛选树 -- search tree
3
- * @param origin 数据源
4
- * @param id
5
- * @return new tree data 纯函数
6
- */
7
- export function deleteTreeNode<T extends TreeData>(origin: T[], id: string | number, key: keyof T = "id"): T[] {
8
- return origin.filter((node) => {
9
- if (node.children) {
10
- node.children = deleteTreeNode(node.children as T[], id, key);
11
- }
12
- return node[key] !== id;
13
- });
14
- }
@@ -1,28 +0,0 @@
1
- /**
2
- * @description: 查找树节点
3
- * @param origin 数据源
4
- * @param findValue 找到节点
5
- * @param key 默认id
6
- * @return T
7
- */
8
- export function findTreeNode<T extends TreeData>(origin: T[], findValue: any, key: keyof T = "id"): T | null {
9
- let result: T | null = null;
10
-
11
- const fun = (data: T[]) => {
12
- if (Array.isArray(data)) {
13
- for (let i = 0; i < data.length; i++) {
14
- let item = data[i];
15
- if (item[key] === findValue) {
16
- result = item;
17
- return;
18
- }
19
- if (item.children && item.children.length) {
20
- fun(item.children as T[]);
21
- }
22
- }
23
- }
24
- };
25
-
26
- fun(origin);
27
- return result;
28
- }
@@ -1,37 +0,0 @@
1
- /**
2
- * @description: 过滤筛选树 -- search tree
3
- * @param treeData 数据源
4
- * @param findStr 关键字
5
- * @param label 关键字段
6
- * @return new tree data
7
- */
8
- export const fuzzySearchTree = <T extends TreeData>(treeData: T[], findStr: string, label: keyof T = "title"): T[] => {
9
- if (!treeData) return [];
10
- let list: T[] = [];
11
-
12
- treeData.forEach((item) => {
13
- // 确保label属性是字符串并且包含findStr
14
- if (typeof item[label] === "string" && (item[label] as string).includes(findStr)) {
15
- // 递归处理子节点
16
- let children = item.children ? fuzzySearchTree(item.children as T[], findStr, label) : [];
17
-
18
- // 如果子节点中没有匹配的项,则保留原子节点
19
- children = children.length > 0 ? children : (item.children as T[]);
20
-
21
- // 构造新的节点,保留匹配的子节点
22
- const obj = { ...item, children };
23
- list.push(obj);
24
- } else if (item.children && item.children.length > 0) {
25
- // 如果当前节点不匹配,但有子节点,则递归处理子节点
26
- const children = fuzzySearchTree(item.children as T[], findStr, label);
27
-
28
- // 如果子节点中有匹配的项,则保留当前节点,并更新其子节点
29
- if (children.length > 0) {
30
- const obj = { ...item, children };
31
- list.push(obj);
32
- }
33
- }
34
- });
35
-
36
- return list;
37
- };
@@ -1,4 +0,0 @@
1
- type TreeData = {
2
- [s: string]: any;
3
- children?: TreeData[];
4
- };
@@ -1,11 +0,0 @@
1
- /**
2
- * @description: tree data -> 扁平树
3
- * @param origin 数据源
4
- * @return treedata
5
- */
6
- export function toFlatTree(origin: TreeData[]) {
7
- return origin.reduce((res, item) => {
8
- const { children, ...i } = item;
9
- return res.concat(i, children && children.length ? toFlatTree(children) : []);
10
- }, []);
11
- }
@@ -1,19 +0,0 @@
1
- /**
2
- * @description: 扁平树 -> tree data
3
- * @param origins 数据源
4
- * @param parentId 父级ID
5
- * @return 平铺数据
6
- */
7
- export function toTreeFlat<T extends TreeData>(origin: T[], parentId: number | string = "root") {
8
- // treeArr 变量数据
9
- // 第一次:查找所有parentId为的数据组成第一级
10
- const child = origin.filter((item: any) => item.parentId === parentId);
11
- // 第一次:循环parentId为数组
12
- return child.map((item: T) => {
13
- return {
14
- ...item,
15
- // 当前存在id(id与parentId应该是必须有的)调用initTree() 查找所有parentId为本id的数据
16
- children: toTreeFlat(origin, item.id),
17
- };
18
- });
19
- }
@@ -1,28 +0,0 @@
1
- /**
2
- * @description: 下载文件
3
- * @param stream 文件源,string or buffer
4
- * @param name 文件名称
5
- * @param mimeType type josn
6
- * @return new tree data 纯函数
7
- */
8
- export const downFile = (stream: string | ArrayBuffer, name: string, mimeType: string = "text/plain;charset=utf-8") => {
9
- // 创建 Blob 对象
10
- let blob: Blob;
11
- if (typeof stream === "string") {
12
- blob = new Blob([stream], { type: mimeType });
13
- } else {
14
- blob = new Blob([stream], { type: mimeType });
15
- }
16
-
17
- // 创建下载链接并触发下载
18
- const a = document.createElement("a");
19
- a.href = URL.createObjectURL(blob);
20
- a.download = name;
21
- a.style.display = "none";
22
- document.body.appendChild(a);
23
- a.click();
24
- document.body.removeChild(a);
25
-
26
- // 清理创建的 URL 对象
27
- URL.revokeObjectURL(a.href);
28
- };
@@ -1,46 +0,0 @@
1
- import { downFile } from "./downFile";
2
-
3
- /**
4
- * @description: 拉流下载方法
5
- * @param path 下载url
6
- * @param defaultName 匹配请求如果没有使用名称
7
- * @param token 鉴权 Authorization
8
- * @param params 参数 object
9
- */
10
- export const downStream = (path: string, defaultName: string, token?: string, params?: Record<string, any>) => {
11
- // 处理查询参数
12
- const queryParams = new URLSearchParams(params).toString();
13
- const urlWithParams = queryParams ? `${path}?${queryParams}` : path;
14
-
15
- const xhr = new XMLHttpRequest();
16
- xhr.open("GET", urlWithParams);
17
- xhr.responseType = "blob";
18
-
19
- if (token) xhr.setRequestHeader("Authorization", token);
20
- xhr.onload = function () {
21
- if (xhr.status === 200 || xhr.status === 304) {
22
- const disposition = xhr.getResponseHeader("Content-Disposition");
23
- let filename = defaultName;
24
-
25
- // 从 Content-Disposition 中提取文件名
26
- if (disposition && disposition.indexOf("attachment") !== -1) {
27
- const filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
28
- const matches = filenameRegex.exec(disposition);
29
- if (matches != null && matches[1]) {
30
- filename = matches[1].replace(/['"]/g, "");
31
- }
32
- }
33
-
34
- // 下载文件
35
- downFile(this.response, filename);
36
- } else {
37
- console.error(`Failed to download file. Status: ${xhr.status}`);
38
- }
39
- };
40
-
41
- xhr.onerror = function () {
42
- console.error("Request failed.");
43
- };
44
-
45
- xhr.send();
46
- };
@@ -1,13 +0,0 @@
1
- /**
2
- * @description: 将params code 转成 object
3
- * @param {string} [queryString]
4
- * @return {*} object
5
- */
6
- export const decodeParams = (queryString: string) => {
7
- const params = new URLSearchParams(queryString);
8
- // 使用 Array.from 将迭代器转换为数组,然后使用 reduce 将数组转换为对象
9
- return Array.from(params.entries()).reduce((acc: any, [key, value]) => {
10
- acc[key] = value;
11
- return acc;
12
- }, {});
13
- };
@@ -1,9 +0,0 @@
1
- /**
2
- * @description: 将params code 转成 object
3
- * @param {objct} [str:string]:any
4
- * @return {*} string
5
- */
6
- export const encodeParams = (query: Record<string, any>) => {
7
- const queryString = "?" + new URLSearchParams(query).toString();
8
- return queryString;
9
- };
@@ -1,51 +0,0 @@
1
- /**
2
- * @web 环境下才能使用注册
3
- * 包含了storage 增删改查封装 存储监听等功能
4
- * 监听的方式使用的浏览器evet 事件模型
5
- */
6
-
7
- export * from "./local";
8
- export * from "./session";
9
-
10
- // init envet storage change
11
- const monitorLocalStorage = () => {
12
- let originalSetItem = localStorage.setItem;
13
- //重写setItem函数
14
- localStorage.setItem = function (key, newValue) {
15
- //创建setItemEvent事件
16
- let event = new Event("setLocal") as any;
17
- event.key = key;
18
- event.newValue = newValue;
19
- //提交setItemEvent事件
20
- window.dispatchEvent(event);
21
- //执行原setItem函数
22
- originalSetItem.call(this, key, newValue);
23
- };
24
- };
25
-
26
-
27
- /**
28
- * @这个方法实际没多大用
29
- */
30
- const monitorSessionStorage = () => {
31
- let originalSetItem = sessionStorage.setItem;
32
- //重写setItem函数
33
- sessionStorage.setItem = function (key, newValue) {
34
- //创建setItemEvent事件
35
- let event = new Event("setSessoin") as any;
36
- event.key = key;
37
- event.newValue = newValue;
38
- //提交setItemEvent事件
39
- window.dispatchEvent(event);
40
- //执行原setItem函数
41
- originalSetItem.call(this, key, newValue);
42
- };
43
- };
44
-
45
- // 用于local 监听
46
- const monitorStorage = () => {
47
- monitorLocalStorage();
48
- monitorSessionStorage();
49
- };
50
-
51
- monitorStorage();
@@ -1,40 +0,0 @@
1
- /**
2
- * @description: get value
3
- * @param {type: String}
4
- * @return: [Object,String,null]
5
- */
6
- export function getLocalStorage(key: string): any {
7
- let storageData = localStorage.getItem(key);
8
- if (storageData) {
9
- let storage;
10
- try {
11
- storage = JSON.parse(storageData);
12
- } catch (err) {
13
- storage = storageData;
14
- }
15
- return storage;
16
- }
17
- return storageData;
18
- }
19
-
20
- /**
21
- * @description: set value
22
- * @param {[key,data]}
23
- * @return:void
24
- */
25
- export function setLocalStorage(key: string, data: any) {
26
- typeof data === "string" ? localStorage.setItem(key, data) : localStorage.setItem(key, JSON.stringify(data));
27
- }
28
-
29
- /**
30
- * @description: remove
31
- * @param { arguments }
32
- * @return: [Array,undefined]
33
- */
34
- export function removeLocalStorageKey(...args: string[]) {
35
- let errArgs: string[] = [];
36
- args.forEach((item) => {
37
- typeof item === "string" ? localStorage.removeItem(item) : errArgs.push(item);
38
- });
39
- return errArgs.length ? { errMsg: "error param", errKey: errArgs } : undefined;
40
- }
@@ -1,40 +0,0 @@
1
- /**
2
- * @description: sessionStorage Value
3
- * @param {type: String}
4
- * @return: [Object,String,null]
5
- */
6
- export function getSessionStorage(key: string): any {
7
- let storageData = sessionStorage.getItem(key);
8
- if (storageData) {
9
- let storage;
10
- try {
11
- storage = JSON.parse(storageData);
12
- } catch (err) {
13
- storage = storageData;
14
- }
15
- return storage;
16
- }
17
- return storageData;
18
- }
19
-
20
- /**
21
- * @description: sessionStorage set Value
22
- * @param {[key,data]}
23
- * @return:void
24
- */
25
- export function setSessionStorage(key: string, data: any) {
26
- typeof data === "string" ? sessionStorage.setItem(key, data) : sessionStorage.setItem(key, JSON.stringify(data));
27
- }
28
-
29
- /**
30
- * @description: remove sessionStorage key
31
- * @param { arguments }
32
- * @return: [Array,undefined]
33
- */
34
- export function removeSessionStorageKey(...args: string[]) {
35
- let errArgs: string[] = [];
36
- args.forEach((item) => {
37
- typeof item === "string" ? sessionStorage.removeItem(item) : errArgs.push(item);
38
- });
39
- return errArgs.length ? { errMsg: "error param", errKey: errArgs } : undefined;
40
- }
@@ -1,18 +0,0 @@
1
- /**
2
- * @description: 复制文本
3
- * @param {string} content
4
- * @return {*} string
5
- */
6
- export const copyText = (text: string) => {
7
- if (navigator.clipboard && window.isSecureContext) {
8
- // navigator clipboard 向剪贴板写文本
9
- return navigator.clipboard.writeText(text);
10
- } else {
11
- const textarea = document.createElement("textarea");
12
- textarea.value = text;
13
- document.body.appendChild(textarea);
14
- textarea.select();
15
- document.execCommand("copy");
16
- document.body.removeChild(textarea);
17
- }
18
- };
@@ -1,19 +0,0 @@
1
- /**
2
- * @description: 防抖函数
3
- * @param {func} 需要防抖的函数
4
- * @param {wait} 防抖时间
5
- * @return {*} (context,...args):void
6
- */
7
-
8
- export function debounce<T extends (...args: any[]) => void>(func: T, wait: number): (...args: Parameters<T>) => void {
9
- let timeout: NodeJS.Timeout;
10
-
11
- return function (this: ThisParameterType<T>, ...args: Parameters<T>) {
12
- const context = this; // 保存当前的 this 上下文
13
-
14
- clearTimeout(timeout);
15
- timeout = setTimeout(() => {
16
- func.apply(context, args); // 使用 apply 绑定 this 和传递参数
17
- }, wait);
18
- };
19
- }
@@ -1,11 +0,0 @@
1
- /**
2
- * @description: Sleep 主线程阻塞方法
3
- * @return {*} int 单位 ms
4
- */
5
- export const sleep = (ms: number) => {
6
- let target = new Date().getTime() + ms;
7
- while (true) {
8
- let now = new Date().getTime();
9
- if (now >= target) break;
10
- }
11
- };
@@ -1,29 +0,0 @@
1
- /**
2
- * @description: 节流函数
3
- * @param {func} 需要节流的函数
4
- * @param {wait} 节流时间区
5
- * @return {*} (context,...args):void
6
- */
7
-
8
- export function throttle<T extends (...args: any[]) => void>(func: T, limit: number): (...args: Parameters<T>) => void {
9
- let lastFunc: NodeJS.Timeout;
10
- let lastRan: number;
11
-
12
- return function (this: ThisParameterType<T>, ...args: Parameters<T>) {
13
- const now = Date.now();
14
- const context = this; // 保存当前的 this 上下文
15
-
16
- if (!lastRan) {
17
- func.apply(context, args);
18
- lastRan = now;
19
- } else {
20
- clearTimeout(lastFunc);
21
- lastFunc = setTimeout(() => {
22
- if (now - lastRan >= limit) {
23
- func.apply(context, args);
24
- lastRan = now;
25
- }
26
- }, limit - (now - lastRan));
27
- }
28
- };
29
- }
@@ -1,39 +0,0 @@
1
- export function getTypeof(value: any): string {
2
- return Object.prototype.toString.call(value).slice(8, -1);
3
- }
4
-
5
- export function isArray(value: any): boolean {
6
- return getTypeof(value) === "Array";
7
- }
8
-
9
- export function isBoolean(value: any): boolean {
10
- return getTypeof(value) === "Boolean";
11
- }
12
-
13
- export function isString(value: any): boolean {
14
- return getTypeof(value) === "String";
15
- }
16
-
17
- export function isNumber(value: any): boolean {
18
- return getTypeof(value) === "Number";
19
- }
20
-
21
- export function isObject(value: any): boolean {
22
- return getTypeof(value) === "Object";
23
- }
24
-
25
- export function isFunction(value: any): boolean {
26
- return getTypeof(value) === "Function";
27
- }
28
-
29
- export function isMap(value: any): boolean {
30
- return getTypeof(value) === "Map";
31
- }
32
-
33
- export function isSet(value: any): boolean {
34
- return getTypeof(value) === "Set";
35
- }
36
-
37
- export function isSymbol(value: any): boolean {
38
- return getTypeof(value) === "Symbol";
39
- }
@@ -1,14 +0,0 @@
1
- /**
2
- * @description: 需要以字母开头的随机字符串
3
- * @param length 字符串长度 默认8
4
- * @return string
5
- */
6
- export const generateString = (length: number = 8): string => {
7
- const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
8
- const randomChar = () => characters.charAt(Math.floor(Math.random() * characters.length));
9
-
10
- const timestamp = Date.now().toString(36); // Use timestamp for uniqueness
11
- let result = timestamp + Array.from({ length: length - timestamp.length }, randomChar).join("");
12
-
13
- return result.charAt(0).toUpperCase() + result.slice(1); // Ensure it starts with a letter
14
- };
@@ -1,15 +0,0 @@
1
- /**
2
- * @description: uuid
3
- * @param template uuid模板 默认
4
- * @return string
5
- */
6
- export const generateUUID = (template: string = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"): string => {
7
- // Helper function to generate a random hex digit
8
- const randomHexDigit = (c: string): string => {
9
- const r = crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c === "x" ? 0 : 4));
10
- return (c === "x" ? r : (r & 0x3) | 0x8).toString(16);
11
- };
12
-
13
- // Generate UUID based on template
14
- return template.replace(/[xy]/g, randomHexDigit);
15
- };
package/test/tree.test.ts DELETED
@@ -1,5 +0,0 @@
1
- const nodeList = [
2
- { id: "1-1", children: [{ id: "1-2-1" }, { id: "1-2-2" }] },
3
- { id: "2-1" },
4
- { id: "3-1", children: [{ id: "3-2-1", children: [{ id: "3-3-1" }] }] },
5
- ];
@@ -1,74 +0,0 @@
1
- import { describe, expect, test } from "@jest/globals";
2
- import { getTypeof, isArray, isNumber, isString, isBoolean, isObject, isFunction } from "../src/main";
3
-
4
- describe("utools", () => {
5
- test("get value typeof", () => {
6
- expect(getTypeof("string")).toBe("String");
7
- });
8
- });
9
-
10
- describe("utools", () => {
11
- test("get value typeof", () => {
12
- expect(getTypeof(1024)).toBe("Number");
13
- });
14
- });
15
-
16
- describe("utools", () => {
17
- test("get value typeof", () => {
18
- expect(getTypeof(false)).toBe("Boolean");
19
- });
20
- });
21
-
22
- describe("utools", () => {
23
- test("value is Array", () => {
24
- expect(isArray([1, 2, 3])).toBe(true);
25
- });
26
- });
27
-
28
- describe("utools", () => {
29
- test("value is Array", () => {
30
- expect(isArray({ name: "lx" })).toBe(false);
31
- });
32
- });
33
-
34
- describe("utools", () => {
35
- test("value is number", () => {
36
- expect(isNumber("hello world")).toBe(false);
37
- });
38
- });
39
-
40
- describe("utools", () => {
41
- test("value is number", () => {
42
- expect(isNumber(1024)).toBe(true);
43
- });
44
- });
45
-
46
- describe("utools", () => {
47
- test("value is string", () => {
48
- expect(isString(1024)).toBe(false);
49
- });
50
- });
51
-
52
- describe("utools", () => {
53
- test("value is String", () => {
54
- expect(isString("hello world")).toBe(true);
55
- });
56
- });
57
-
58
- describe("utools", () => {
59
- test("value is bol", () => {
60
- expect(isObject({ name: "lx" })).toBe(true);
61
- });
62
- });
63
-
64
- describe("utools", () => {
65
- test("value is bol", () => {
66
- expect(isBoolean(false)).toBe(true);
67
- });
68
- });
69
-
70
- describe("utools", () => {
71
- test("value is bol", () => {
72
- expect(isFunction({ name: "lx" })).toBe(false);
73
- });
74
- });