@codady/utils 0.0.12 → 0.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/dist/utils.cjs.js +47 -9
- package/dist/utils.cjs.min.js +3 -3
- package/dist/utils.esm.js +47 -9
- package/dist/utils.esm.min.js +3 -3
- package/dist/utils.umd.js +47 -9
- package/dist/utils.umd.min.js +3 -3
- package/dist.zip +0 -0
- package/modules.js +3 -1
- package/modules.ts +3 -1
- package/package.json +1 -1
- package/src/copyObjectWithSymbol.js +26 -0
- package/src/copyObjectWithSymbol.ts +28 -0
- package/src/getDataType - /345/211/257/346/234/254.js" +38 -0
- package/src/isEmpty - /345/211/257/346/234/254.js" +45 -0
- package/src/isEmpty.js +45 -0
- package/src/isEmpty.ts +44 -0
- package/src/shallowCopy.js +40 -8
- package/src/shallowCopy.ts +47 -9
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,24 @@
|
|
|
3
3
|
All changes to Utils including new features, updates, and removals are documented here.
|
|
4
4
|
|
|
5
5
|
|
|
6
|
+
## [v0.0.13] - 2025-12-25
|
|
7
|
+
|
|
8
|
+
### Distribution Files
|
|
9
|
+
* **JS**: https://unpkg.com/@codady/utils@0.0.13/dist/js/utils.js
|
|
10
|
+
* **Zip**:https://unpkg.com/@codady/utils@0.0.13/dist.zip
|
|
11
|
+
|
|
12
|
+
### Changes
|
|
13
|
+
|
|
14
|
+
#### Fixed
|
|
15
|
+
* Modify the `shallowCopy` function to add support for data types such as Date, Regex, Error, Buffer, ArrayBuffer, WeakSet, and WeakMap.修改`shallowCopy`函数,增加对Date、Regex、Error、Buffer、ArrayBuffer、WeakSet、WeakMap数据类型的支持。
|
|
16
|
+
|
|
17
|
+
#### Added
|
|
18
|
+
* Added the following functions: `copyObjectWithSymbol`.新增`copyObjectWithSymbol`函数。
|
|
19
|
+
|
|
20
|
+
#### Removed
|
|
21
|
+
* Null
|
|
22
|
+
|
|
23
|
+
|
|
6
24
|
## [v0.0.12] - 2025-12-25
|
|
7
25
|
|
|
8
26
|
### Distribution Files
|
package/dist/utils.cjs.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
|
|
2
2
|
/*!
|
|
3
|
-
* @since Last modified: 2025-12-25
|
|
3
|
+
* @since Last modified: 2025-12-25 14:33:12
|
|
4
4
|
* @name Utils for web front-end.
|
|
5
|
-
* @version 0.0.
|
|
5
|
+
* @version 0.0.13
|
|
6
6
|
* @author AXUI development team <3217728223@qq.com>
|
|
7
7
|
* @description This is a set of general-purpose JavaScript utility functions developed by the AXUI team. All functions are pure and do not involve CSS or other third-party libraries. They are suitable for any web front-end environment.
|
|
8
8
|
* @see {@link https://www.axui.cn|Official website}
|
|
@@ -422,7 +422,20 @@ const wrapMapMethods = ({ target, onBeforeMutate = () => { }, onAfterMutate = ()
|
|
|
422
422
|
return methods;
|
|
423
423
|
};
|
|
424
424
|
|
|
425
|
-
const
|
|
425
|
+
const copyObjectWithSymbol = (data) => {
|
|
426
|
+
if (!data || typeof data !== 'object') {
|
|
427
|
+
return data;
|
|
428
|
+
}
|
|
429
|
+
// Ensure the object type includes string and symbol keys
|
|
430
|
+
const obj = data, symbolProperties = Object.getOwnPropertySymbols(obj).reduce((acc, sym) => {
|
|
431
|
+
acc[sym] = obj[sym];
|
|
432
|
+
return acc;
|
|
433
|
+
}, {});
|
|
434
|
+
// Shallow copy the object and include the Symbol properties
|
|
435
|
+
return { ...obj, ...symbolProperties };
|
|
436
|
+
};
|
|
437
|
+
|
|
438
|
+
const shallowCopy = (data, options = {}) => {
|
|
426
439
|
const dataType = getDataType(data);
|
|
427
440
|
// Check if data is a Set
|
|
428
441
|
if (dataType === 'Set') {
|
|
@@ -441,13 +454,37 @@ const shallowCopy = (data) => {
|
|
|
441
454
|
}
|
|
442
455
|
// Check if data is a Plain Object (including Symbol keys)
|
|
443
456
|
if (dataType === 'object') {
|
|
444
|
-
|
|
445
|
-
const symbolProperties = Object.getOwnPropertySymbols(obj).reduce((acc, sym) => {
|
|
446
|
-
acc[sym] = obj[sym];
|
|
447
|
-
return acc;
|
|
448
|
-
}, {});
|
|
457
|
+
// Ensure the object type includes string and symbol keys
|
|
449
458
|
// Shallow copy the object and include the Symbol properties
|
|
450
|
-
return
|
|
459
|
+
return copyObjectWithSymbol(data);
|
|
460
|
+
}
|
|
461
|
+
// Check if data is a Date
|
|
462
|
+
if (dataType === 'Date') {
|
|
463
|
+
return new Date(data.getTime());
|
|
464
|
+
}
|
|
465
|
+
// Check if data is a RegExp
|
|
466
|
+
if (dataType === 'RegExp') {
|
|
467
|
+
return new RegExp(data.source, data.flags);
|
|
468
|
+
}
|
|
469
|
+
// Check if data is a Buffer (for Node.js)
|
|
470
|
+
if (dataType === 'Buffer') {
|
|
471
|
+
return Buffer.from(data);
|
|
472
|
+
}
|
|
473
|
+
// Check if data is an ArrayBuffer or TypedArray
|
|
474
|
+
if (dataType === 'ArrayBuffer' || ArrayBuffer.isView(data)) {
|
|
475
|
+
return data.slice(0);
|
|
476
|
+
}
|
|
477
|
+
// Check if data is a WeakSet
|
|
478
|
+
if (dataType === 'WeakSet') {
|
|
479
|
+
return new WeakSet([...data]);
|
|
480
|
+
}
|
|
481
|
+
// Check if data is a WeakMap
|
|
482
|
+
if (dataType === 'WeakMap') {
|
|
483
|
+
return new WeakMap([...data]);
|
|
484
|
+
}
|
|
485
|
+
// Check if data is an Error
|
|
486
|
+
if (dataType === 'Error') {
|
|
487
|
+
return new Error(data.message);
|
|
451
488
|
}
|
|
452
489
|
// For other types (such as numbers, strings, booleans, etc.), return the original value
|
|
453
490
|
return data;
|
|
@@ -708,6 +745,7 @@ const utils = {
|
|
|
708
745
|
getUniqueId,
|
|
709
746
|
deepMerge,
|
|
710
747
|
shallowCopy,
|
|
748
|
+
copyObjectWithSymbol,
|
|
711
749
|
};
|
|
712
750
|
|
|
713
751
|
module.exports = utils;
|
package/dist/utils.cjs.min.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @since Last modified: 2025-12-25
|
|
2
|
+
* @since Last modified: 2025-12-25 14:33:12
|
|
3
3
|
* @name Utils for web front-end.
|
|
4
|
-
* @version 0.0.
|
|
4
|
+
* @version 0.0.13
|
|
5
5
|
* @author AXUI development team <3217728223@qq.com>
|
|
6
6
|
* @description This is a set of general-purpose JavaScript utility functions developed by the AXUI team. All functions are pure and do not involve CSS or other third-party libraries. They are suitable for any web front-end environment.
|
|
7
7
|
* @see {@link https://www.axui.cn|Official website}
|
|
@@ -12,4 +12,4 @@
|
|
|
12
12
|
* @copyright This software supports the MIT License, allowing free learning and commercial use, but please retain the terms 'ax,' 'axui,' 'AX,' and 'AXUI' within the software.
|
|
13
13
|
* @license MIT license
|
|
14
14
|
*/
|
|
15
|
-
"use strict";const getDataType=e=>{let t,r=Object.prototype.toString.call(e).slice(8,-1);return t="Function"===r&&/^\s*class\s+/.test(e.toString())?"Class":"Object"===r&&Object.getPrototypeOf(e)!==Object.prototype?"Instance":r,t},deepClone=(e,t={})=>{const r=getDataType(e),o=Object.assign({cloneSet:!0,cloneMap:!0,cloneObject:!0,cloneArray:!0,cloneDate:!0,cloneRegex:!0},t);if(o.interceptor&&"function"==typeof o.interceptor){let t=o.interceptor(e,r);if(t)return o.onAfterClone?.({output:t,input:e,type:r,cloned:t!==e}),t}o.onBeforeClone?.(e,r);let a,n=!0;if("Object"===r&&o.cloneObject){const t={},r=Object.getOwnPropertySymbols(e);for(const r in e)t[r]=deepClone(e[r],o);if(r.length>0)for(const a of r)t[a]=deepClone(e[a],o);a=t}else if("Array"===r&&o.cloneArray)a=e.map(e=>deepClone(e,o));else if("Map"===r&&o.cloneMap){const t=new Map;for(const[r,a]of e)t.set(deepClone(r,o),deepClone(a,o));a=t}else if("Set"===r&&o.cloneSet){const t=new Set;for(const r of e)t.add(deepClone(r,o));a=t}else if("Date"===r&&o.cloneDate)a=new Date(e.getTime());else if("RegExp"===r&&o.cloneRegex){const t=e;a=new RegExp(t.source,t.flags)}else a=e,n=!1;return o.onAfterClone?.({output:a,input:e,type:r,cloned:n}),a},deepCloneToJSON=e=>{const t=getDataType(e);if("Object"===t){const t={};for(const r in e)t[r]=deepCloneToJSON(e[r]);for(const e in t)void 0===t[e]&&Reflect.deleteProperty(t,e);return t}if("Array"===t){return e.map((e,t)=>deepCloneToJSON(e)).filter(e=>void 0!==e)}return["Number","String","Boolean","Null"].includes(t)?e:void 0},arrayMutableMethods=["push","pop","shift","unshift","splice","sort","reverse","copyWithin","fill"],wrapArrayMethods=({target:e,onBeforeMutate:t=()=>{},onAfterMutate:r=()=>{},allowList:o,props:a={}})=>{if(!Array.isArray(e))throw new TypeError("The 'target' parameter must be an array.");o&&!o?.length||(o=arrayMutableMethods);const n={};for(let s of o)n[s]=function(...o){const n={},l=e.length;switch(s){case"push":case"unshift":n.addedItems=[...o];break;case"pop":n.poppedItem=e[l-1];break;case"shift":n.shiftedItem=e[0];break;case"splice":const[t,r]=o,a=t<0?Math.max(l+t,0):Math.min(t,l),s=void 0===r?l-a:r;n.deletedItems=e.slice(a,a+s);break;case"sort":case"reverse":n.oldSnapshot=[...e];break;case"fill":case"copyWithin":const i=o[1]||0,c=void 0===o[2]?l:o[2];n.oldItems=e.slice(i,c),n.start=i,n.end=c}t?.(n);const i=Array.prototype[s].apply(e,o),c={value:i,key:s,args:o,context:n,target:e,...a};return r?.(c),i};return n},requireTypes=(e,t,r)=>{let o=Array.isArray(t)?t:[t],a=getDataType(e),n=a.toLowerCase(),s=o.map(e=>e.toLowerCase()),l=n.includes("html")?"element":n;if(r)try{if(!s.includes(l))throw new TypeError(`Expected data type(s): [${s.join(", ")}], but got: ${l}`)}catch(e){r(e,a)}else if(!s.includes(l))throw new TypeError(`Expected data type(s): [${s.join(", ")}], but got: ${l}`);return a},getUniqueId=(e={})=>{const t=e.prefix,r=e.suffix,o=e.base10,a=e.base36;return`${t?t+"-":""}${Date.now()}${a?"-"+Math.random().toString(36).substring(2,11):""}${o?"-"+Math.floor(1e4*Math.random()).toString().padStart(4,"0"):""}${r?"-"+r:""}`},setMutableMethods=["add","delete","clear"],mapMutableMethods=["set","delete","clear"],wrapSetMethods=({target:e,onBeforeMutate:t=()=>{},onAfterMutate:r=()=>{},allowList:o=setMutableMethods,props:a={}})=>{if(!(e instanceof Set))throw new TypeError("The 'target' parameter must be a Set.");const n={},createWrappedMethod=o=>function(...n){const s={};switch(o){case"add":{const[t]=n;s.addedItem=t,s.existed=e.has(t);break}case"delete":{const[t]=n;s.existed=e.has(t),s.deletedItem=s.existed?t:void 0;break}case"clear":s.clearedItems=Array.from(e),s.previousSize=e.size}t(s);const l=e[o].apply(e,n),i={method:o,result:l,args:n,context:s,target:e,...a};return r(i),l};for(const e of o)setMutableMethods.includes(e)&&(n[e]=createWrappedMethod(e));return Object.defineProperty(n,"target",{get:()=>e,enumerable:!1,configurable:!1}),n},wrapMapMethods=({target:e,onBeforeMutate:t=()=>{},onAfterMutate:r=()=>{},allowList:o=mapMutableMethods,props:a={}})=>{if(!(e instanceof Map))throw new TypeError("The 'target' parameter must be a Map.");const n={},createWrappedMethod=o=>function(...n){const s={};switch(o){case"set":{const[t,r]=n;s.key=t,s.newValue=r,s.existed=e.has(t),s.oldValue=s.existed?e.get(t):void 0;break}case"delete":{const[t]=n;s.key=t,s.existed=e.has(t),s.value=s.existed?e.get(t):void 0;break}case"clear":s.clearedItems=Array.from(e.entries()),s.previousSize=e.size}t(s);const l=e[o].apply(e,n),i={method:o,result:l,args:n,context:s,target:e,...a};return r(i),l};for(const e of o)mapMutableMethods.includes(e)&&(n[e]=createWrappedMethod(e));return Object.defineProperty(n,"target",{get:()=>e,enumerable:!1,configurable:!1}),n},
|
|
15
|
+
"use strict";const getDataType=e=>{let t,r=Object.prototype.toString.call(e).slice(8,-1);return t="Function"===r&&/^\s*class\s+/.test(e.toString())?"Class":"Object"===r&&Object.getPrototypeOf(e)!==Object.prototype?"Instance":r,t},deepClone=(e,t={})=>{const r=getDataType(e),o=Object.assign({cloneSet:!0,cloneMap:!0,cloneObject:!0,cloneArray:!0,cloneDate:!0,cloneRegex:!0},t);if(o.interceptor&&"function"==typeof o.interceptor){let t=o.interceptor(e,r);if(t)return o.onAfterClone?.({output:t,input:e,type:r,cloned:t!==e}),t}o.onBeforeClone?.(e,r);let a,n=!0;if("Object"===r&&o.cloneObject){const t={},r=Object.getOwnPropertySymbols(e);for(const r in e)t[r]=deepClone(e[r],o);if(r.length>0)for(const a of r)t[a]=deepClone(e[a],o);a=t}else if("Array"===r&&o.cloneArray)a=e.map(e=>deepClone(e,o));else if("Map"===r&&o.cloneMap){const t=new Map;for(const[r,a]of e)t.set(deepClone(r,o),deepClone(a,o));a=t}else if("Set"===r&&o.cloneSet){const t=new Set;for(const r of e)t.add(deepClone(r,o));a=t}else if("Date"===r&&o.cloneDate)a=new Date(e.getTime());else if("RegExp"===r&&o.cloneRegex){const t=e;a=new RegExp(t.source,t.flags)}else a=e,n=!1;return o.onAfterClone?.({output:a,input:e,type:r,cloned:n}),a},deepCloneToJSON=e=>{const t=getDataType(e);if("Object"===t){const t={};for(const r in e)t[r]=deepCloneToJSON(e[r]);for(const e in t)void 0===t[e]&&Reflect.deleteProperty(t,e);return t}if("Array"===t){return e.map((e,t)=>deepCloneToJSON(e)).filter(e=>void 0!==e)}return["Number","String","Boolean","Null"].includes(t)?e:void 0},arrayMutableMethods=["push","pop","shift","unshift","splice","sort","reverse","copyWithin","fill"],wrapArrayMethods=({target:e,onBeforeMutate:t=()=>{},onAfterMutate:r=()=>{},allowList:o,props:a={}})=>{if(!Array.isArray(e))throw new TypeError("The 'target' parameter must be an array.");o&&!o?.length||(o=arrayMutableMethods);const n={};for(let s of o)n[s]=function(...o){const n={},l=e.length;switch(s){case"push":case"unshift":n.addedItems=[...o];break;case"pop":n.poppedItem=e[l-1];break;case"shift":n.shiftedItem=e[0];break;case"splice":const[t,r]=o,a=t<0?Math.max(l+t,0):Math.min(t,l),s=void 0===r?l-a:r;n.deletedItems=e.slice(a,a+s);break;case"sort":case"reverse":n.oldSnapshot=[...e];break;case"fill":case"copyWithin":const i=o[1]||0,c=void 0===o[2]?l:o[2];n.oldItems=e.slice(i,c),n.start=i,n.end=c}t?.(n);const i=Array.prototype[s].apply(e,o),c={value:i,key:s,args:o,context:n,target:e,...a};return r?.(c),i};return n},requireTypes=(e,t,r)=>{let o=Array.isArray(t)?t:[t],a=getDataType(e),n=a.toLowerCase(),s=o.map(e=>e.toLowerCase()),l=n.includes("html")?"element":n;if(r)try{if(!s.includes(l))throw new TypeError(`Expected data type(s): [${s.join(", ")}], but got: ${l}`)}catch(e){r(e,a)}else if(!s.includes(l))throw new TypeError(`Expected data type(s): [${s.join(", ")}], but got: ${l}`);return a},getUniqueId=(e={})=>{const t=e.prefix,r=e.suffix,o=e.base10,a=e.base36;return`${t?t+"-":""}${Date.now()}${a?"-"+Math.random().toString(36).substring(2,11):""}${o?"-"+Math.floor(1e4*Math.random()).toString().padStart(4,"0"):""}${r?"-"+r:""}`},setMutableMethods=["add","delete","clear"],mapMutableMethods=["set","delete","clear"],wrapSetMethods=({target:e,onBeforeMutate:t=()=>{},onAfterMutate:r=()=>{},allowList:o=setMutableMethods,props:a={}})=>{if(!(e instanceof Set))throw new TypeError("The 'target' parameter must be a Set.");const n={},createWrappedMethod=o=>function(...n){const s={};switch(o){case"add":{const[t]=n;s.addedItem=t,s.existed=e.has(t);break}case"delete":{const[t]=n;s.existed=e.has(t),s.deletedItem=s.existed?t:void 0;break}case"clear":s.clearedItems=Array.from(e),s.previousSize=e.size}t(s);const l=e[o].apply(e,n),i={method:o,result:l,args:n,context:s,target:e,...a};return r(i),l};for(const e of o)setMutableMethods.includes(e)&&(n[e]=createWrappedMethod(e));return Object.defineProperty(n,"target",{get:()=>e,enumerable:!1,configurable:!1}),n},wrapMapMethods=({target:e,onBeforeMutate:t=()=>{},onAfterMutate:r=()=>{},allowList:o=mapMutableMethods,props:a={}})=>{if(!(e instanceof Map))throw new TypeError("The 'target' parameter must be a Map.");const n={},createWrappedMethod=o=>function(...n){const s={};switch(o){case"set":{const[t,r]=n;s.key=t,s.newValue=r,s.existed=e.has(t),s.oldValue=s.existed?e.get(t):void 0;break}case"delete":{const[t]=n;s.key=t,s.existed=e.has(t),s.value=s.existed?e.get(t):void 0;break}case"clear":s.clearedItems=Array.from(e.entries()),s.previousSize=e.size}t(s);const l=e[o].apply(e,n),i={method:o,result:l,args:n,context:s,target:e,...a};return r(i),l};for(const e of o)mapMutableMethods.includes(e)&&(n[e]=createWrappedMethod(e));return Object.defineProperty(n,"target",{get:()=>e,enumerable:!1,configurable:!1}),n},copyObjectWithSymbol=e=>{if(!e||"object"!=typeof e)return e;const t=e,r=Object.getOwnPropertySymbols(t).reduce((e,r)=>(e[r]=t[r],e),{});return{...t,...r}},shallowCopy=(e,t={})=>{const r=getDataType(e);return"Set"===r?new Set([...e]):"Map"===r?new Map([...e]):Array.isArray(e)?[...e]:"object"===r?copyObjectWithSymbol(e):"Date"===r?new Date(e.getTime()):"RegExp"===r?new RegExp(e.source,e.flags):"Buffer"===r?Buffer.from(e):"ArrayBuffer"===r||ArrayBuffer.isView(e)?e.slice(0):"WeakSet"===r?new WeakSet([...e]):"WeakMap"===r?new WeakMap([...e]):"Error"===r?new Error(e.message):e},deepMerge=(e,t,r={})=>{const o=Object.assign({dataMode:"clear",inheritMissing:!0,targetClone:!1,useEnable:!0,useSymbol:!0,deepClone:{},onBeforeMerge:void 0,onAfterMerge:void 0},r),deepMergeHelper=(e,t,r)=>{let o,a,n=getDataType(e),s=getDataType(t),l=!0;return"Object"===n&&"Object"===s?(a=deepMergeObjects(e,t,r),o="Object"):"Array"===n&&"Array"===s?(a=deepMergeArrays(e,t,r),o="Array"):"Set"===n&&"Set"===s?(a=deepMergeSets(e,t,r),o="Set"):"Map"===n&&"Map"===s?(a=deepMergeMaps(e,t,r),o="Map"):(l=!1,a=e),{result:a,flag:l,type:o}},mergeEnableObject=(e,t)=>e?.hasOwnProperty("enable")&&"boolean"==typeof t?(e.enable=t,e):t?.hasOwnProperty("enable")&&"boolean"==typeof e?Object.assign({enable:e},t):t,deepMergeObjects=(e,t,r={})=>{let o=getDataType(e),a=getDataType(t);if("Object"!==o||"Object"!==a)return e;r?.onBeforeMerge?.(e,t);const n=Object.assign({inheritMissing:!0,targetClone:!1,useEnable:!0},r);let s={};s=n.targetClone?shallowCopy(e):e;for(let e in t)if(t.hasOwnProperty(e)&&s.hasOwnProperty(e)){let o=deepMergeHelper(s[e],t[e],r);o.flag?o.type?"Object"===o.type&&(s[e]=o.result):s[e]=t[e]:n.useEnable?s[e]=mergeEnableObject(s[e],t[e]):s[e]=t[e]}else t.hasOwnProperty(e)&&!s.hasOwnProperty(e)&&n.inheritMissing&&(s[e]=t[e]);if(n.useSymbol){let e=Object.getOwnPropertySymbols(t);if(e.length)for(let r of e)s[r]=t[r]}return n?.onAfterMerge?.(s,e,t),s},deepMergeArrays=(e,t,r={})=>{if(!Array.isArray(e)||!Array.isArray(t))return e;r?.onBeforeMerge?.(e,t);const o=Object.assign({dataMode:"clear",inheritMissing:!0,targetClone:!1},r),a=o.targetClone?[...e]:e;if("replace"===o.dataMode)for(let e=0;e<t.length&&(o.inheritMissing||!(e>=a.length));e++){deepMergeHelper(a[e],t[e],o).flag||(a[e]=t[e])}else"concat"===o.dataMode||(a.length=0),a.push(...t);return r?.onAfterMerge?.(a,e,t),a},deepMergeMaps=(e,t,r={})=>{if(!(e instanceof Map&&t instanceof Map))return e;r?.onBeforeMerge?.(e,t);const o=Object.assign({inheritMissing:!0,targetClone:!1,useEnable:!0},r),a=o.targetClone?new Map([...e]):e;for(const[e,n]of t.entries())if(a.has(e)){const t=a.get(e),r=n,s=deepMergeHelper(t,r,o);s.flag?"Object"===s.type&&a.set(e,s.result):a.set(e,r)}else r.inheritMissing&&a.set(e,n);return r?.onAfterMerge?.(a,e,t),a},deepMergeSets=(e,t,r={})=>{if(!(e instanceof Set&&t instanceof Set))return e;r?.onBeforeMerge?.(e,t);const o=Object.assign({dataMode:"clear",inheritMissing:!0,targetClone:!1,useEnable:!0},r),a=o.targetClone?new Set(...e):e;if("replace"===o.dataMode){const e=[...a],r=[...t],n=deepMergeHelper(e,r,o);a.clear();for(let e of n.result)a.add(e)}else if("concat"===o.dataMode)for(let e of t)a.add(e);else{a.clear();for(let e of t)a.add(e)}return r?.onAfterMerge?.(a,e,t),a};return deepMergeHelper(e,t,o).result},utils={getDataType:getDataType,requireTypes:requireTypes,deepClone:deepClone,deepCloneToJSON:deepCloneToJSON,wrapArrayMethods:wrapArrayMethods,arrayMutableMethods:arrayMutableMethods,setMutableMethods:setMutableMethods,mapMutableMethods:mapMutableMethods,wrapSetMethods:wrapSetMethods,wrapMapMethods:wrapMapMethods,getUniqueId:getUniqueId,deepMerge:deepMerge,shallowCopy:shallowCopy,copyObjectWithSymbol:copyObjectWithSymbol};module.exports=utils;
|
package/dist/utils.esm.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
|
|
2
2
|
/*!
|
|
3
|
-
* @since Last modified: 2025-12-25
|
|
3
|
+
* @since Last modified: 2025-12-25 14:33:12
|
|
4
4
|
* @name Utils for web front-end.
|
|
5
|
-
* @version 0.0.
|
|
5
|
+
* @version 0.0.13
|
|
6
6
|
* @author AXUI development team <3217728223@qq.com>
|
|
7
7
|
* @description This is a set of general-purpose JavaScript utility functions developed by the AXUI team. All functions are pure and do not involve CSS or other third-party libraries. They are suitable for any web front-end environment.
|
|
8
8
|
* @see {@link https://www.axui.cn|Official website}
|
|
@@ -420,7 +420,20 @@ const wrapMapMethods = ({ target, onBeforeMutate = () => { }, onAfterMutate = ()
|
|
|
420
420
|
return methods;
|
|
421
421
|
};
|
|
422
422
|
|
|
423
|
-
const
|
|
423
|
+
const copyObjectWithSymbol = (data) => {
|
|
424
|
+
if (!data || typeof data !== 'object') {
|
|
425
|
+
return data;
|
|
426
|
+
}
|
|
427
|
+
// Ensure the object type includes string and symbol keys
|
|
428
|
+
const obj = data, symbolProperties = Object.getOwnPropertySymbols(obj).reduce((acc, sym) => {
|
|
429
|
+
acc[sym] = obj[sym];
|
|
430
|
+
return acc;
|
|
431
|
+
}, {});
|
|
432
|
+
// Shallow copy the object and include the Symbol properties
|
|
433
|
+
return { ...obj, ...symbolProperties };
|
|
434
|
+
};
|
|
435
|
+
|
|
436
|
+
const shallowCopy = (data, options = {}) => {
|
|
424
437
|
const dataType = getDataType(data);
|
|
425
438
|
// Check if data is a Set
|
|
426
439
|
if (dataType === 'Set') {
|
|
@@ -439,13 +452,37 @@ const shallowCopy = (data) => {
|
|
|
439
452
|
}
|
|
440
453
|
// Check if data is a Plain Object (including Symbol keys)
|
|
441
454
|
if (dataType === 'object') {
|
|
442
|
-
|
|
443
|
-
const symbolProperties = Object.getOwnPropertySymbols(obj).reduce((acc, sym) => {
|
|
444
|
-
acc[sym] = obj[sym];
|
|
445
|
-
return acc;
|
|
446
|
-
}, {});
|
|
455
|
+
// Ensure the object type includes string and symbol keys
|
|
447
456
|
// Shallow copy the object and include the Symbol properties
|
|
448
|
-
return
|
|
457
|
+
return copyObjectWithSymbol(data);
|
|
458
|
+
}
|
|
459
|
+
// Check if data is a Date
|
|
460
|
+
if (dataType === 'Date') {
|
|
461
|
+
return new Date(data.getTime());
|
|
462
|
+
}
|
|
463
|
+
// Check if data is a RegExp
|
|
464
|
+
if (dataType === 'RegExp') {
|
|
465
|
+
return new RegExp(data.source, data.flags);
|
|
466
|
+
}
|
|
467
|
+
// Check if data is a Buffer (for Node.js)
|
|
468
|
+
if (dataType === 'Buffer') {
|
|
469
|
+
return Buffer.from(data);
|
|
470
|
+
}
|
|
471
|
+
// Check if data is an ArrayBuffer or TypedArray
|
|
472
|
+
if (dataType === 'ArrayBuffer' || ArrayBuffer.isView(data)) {
|
|
473
|
+
return data.slice(0);
|
|
474
|
+
}
|
|
475
|
+
// Check if data is a WeakSet
|
|
476
|
+
if (dataType === 'WeakSet') {
|
|
477
|
+
return new WeakSet([...data]);
|
|
478
|
+
}
|
|
479
|
+
// Check if data is a WeakMap
|
|
480
|
+
if (dataType === 'WeakMap') {
|
|
481
|
+
return new WeakMap([...data]);
|
|
482
|
+
}
|
|
483
|
+
// Check if data is an Error
|
|
484
|
+
if (dataType === 'Error') {
|
|
485
|
+
return new Error(data.message);
|
|
449
486
|
}
|
|
450
487
|
// For other types (such as numbers, strings, booleans, etc.), return the original value
|
|
451
488
|
return data;
|
|
@@ -706,6 +743,7 @@ const utils = {
|
|
|
706
743
|
getUniqueId,
|
|
707
744
|
deepMerge,
|
|
708
745
|
shallowCopy,
|
|
746
|
+
copyObjectWithSymbol,
|
|
709
747
|
};
|
|
710
748
|
|
|
711
749
|
export { utils as default };
|
package/dist/utils.esm.min.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @since Last modified: 2025-12-25
|
|
2
|
+
* @since Last modified: 2025-12-25 14:33:12
|
|
3
3
|
* @name Utils for web front-end.
|
|
4
|
-
* @version 0.0.
|
|
4
|
+
* @version 0.0.13
|
|
5
5
|
* @author AXUI development team <3217728223@qq.com>
|
|
6
6
|
* @description This is a set of general-purpose JavaScript utility functions developed by the AXUI team. All functions are pure and do not involve CSS or other third-party libraries. They are suitable for any web front-end environment.
|
|
7
7
|
* @see {@link https://www.axui.cn|Official website}
|
|
@@ -12,4 +12,4 @@
|
|
|
12
12
|
* @copyright This software supports the MIT License, allowing free learning and commercial use, but please retain the terms 'ax,' 'axui,' 'AX,' and 'AXUI' within the software.
|
|
13
13
|
* @license MIT license
|
|
14
14
|
*/
|
|
15
|
-
const getDataType=e=>{let t,r=Object.prototype.toString.call(e).slice(8,-1);return t="Function"===r&&/^\s*class\s+/.test(e.toString())?"Class":"Object"===r&&Object.getPrototypeOf(e)!==Object.prototype?"Instance":r,t},deepClone=(e,t={})=>{const r=getDataType(e),o=Object.assign({cloneSet:!0,cloneMap:!0,cloneObject:!0,cloneArray:!0,cloneDate:!0,cloneRegex:!0},t);if(o.interceptor&&"function"==typeof o.interceptor){let t=o.interceptor(e,r);if(t)return o.onAfterClone?.({output:t,input:e,type:r,cloned:t!==e}),t}o.onBeforeClone?.(e,r);let a,n=!0;if("Object"===r&&o.cloneObject){const t={},r=Object.getOwnPropertySymbols(e);for(const r in e)t[r]=deepClone(e[r],o);if(r.length>0)for(const a of r)t[a]=deepClone(e[a],o);a=t}else if("Array"===r&&o.cloneArray)a=e.map(e=>deepClone(e,o));else if("Map"===r&&o.cloneMap){const t=new Map;for(const[r,a]of e)t.set(deepClone(r,o),deepClone(a,o));a=t}else if("Set"===r&&o.cloneSet){const t=new Set;for(const r of e)t.add(deepClone(r,o));a=t}else if("Date"===r&&o.cloneDate)a=new Date(e.getTime());else if("RegExp"===r&&o.cloneRegex){const t=e;a=new RegExp(t.source,t.flags)}else a=e,n=!1;return o.onAfterClone?.({output:a,input:e,type:r,cloned:n}),a},deepCloneToJSON=e=>{const t=getDataType(e);if("Object"===t){const t={};for(const r in e)t[r]=deepCloneToJSON(e[r]);for(const e in t)void 0===t[e]&&Reflect.deleteProperty(t,e);return t}if("Array"===t){return e.map((e,t)=>deepCloneToJSON(e)).filter(e=>void 0!==e)}return["Number","String","Boolean","Null"].includes(t)?e:void 0},arrayMutableMethods=["push","pop","shift","unshift","splice","sort","reverse","copyWithin","fill"],wrapArrayMethods=({target:e,onBeforeMutate:t=()=>{},onAfterMutate:r=()=>{},allowList:o,props:a={}})=>{if(!Array.isArray(e))throw new TypeError("The 'target' parameter must be an array.");o&&!o?.length||(o=arrayMutableMethods);const n={};for(let s of o)n[s]=function(...o){const n={},l=e.length;switch(s){case"push":case"unshift":n.addedItems=[...o];break;case"pop":n.poppedItem=e[l-1];break;case"shift":n.shiftedItem=e[0];break;case"splice":const[t,r]=o,a=t<0?Math.max(l+t,0):Math.min(t,l),s=void 0===r?l-a:r;n.deletedItems=e.slice(a,a+s);break;case"sort":case"reverse":n.oldSnapshot=[...e];break;case"fill":case"copyWithin":const i=o[1]||0,c=void 0===o[2]?l:o[2];n.oldItems=e.slice(i,c),n.start=i,n.end=c}t?.(n);const i=Array.prototype[s].apply(e,o),c={value:i,key:s,args:o,context:n,target:e,...a};return r?.(c),i};return n},requireTypes=(e,t,r)=>{let o=Array.isArray(t)?t:[t],a=getDataType(e),n=a.toLowerCase(),s=o.map(e=>e.toLowerCase()),l=n.includes("html")?"element":n;if(r)try{if(!s.includes(l))throw new TypeError(`Expected data type(s): [${s.join(", ")}], but got: ${l}`)}catch(e){r(e,a)}else if(!s.includes(l))throw new TypeError(`Expected data type(s): [${s.join(", ")}], but got: ${l}`);return a},getUniqueId=(e={})=>{const t=e.prefix,r=e.suffix,o=e.base10,a=e.base36;return`${t?t+"-":""}${Date.now()}${a?"-"+Math.random().toString(36).substring(2,11):""}${o?"-"+Math.floor(1e4*Math.random()).toString().padStart(4,"0"):""}${r?"-"+r:""}`},setMutableMethods=["add","delete","clear"],mapMutableMethods=["set","delete","clear"],wrapSetMethods=({target:e,onBeforeMutate:t=()=>{},onAfterMutate:r=()=>{},allowList:o=setMutableMethods,props:a={}})=>{if(!(e instanceof Set))throw new TypeError("The 'target' parameter must be a Set.");const n={},createWrappedMethod=o=>function(...n){const s={};switch(o){case"add":{const[t]=n;s.addedItem=t,s.existed=e.has(t);break}case"delete":{const[t]=n;s.existed=e.has(t),s.deletedItem=s.existed?t:void 0;break}case"clear":s.clearedItems=Array.from(e),s.previousSize=e.size}t(s);const l=e[o].apply(e,n),i={method:o,result:l,args:n,context:s,target:e,...a};return r(i),l};for(const e of o)setMutableMethods.includes(e)&&(n[e]=createWrappedMethod(e));return Object.defineProperty(n,"target",{get:()=>e,enumerable:!1,configurable:!1}),n},wrapMapMethods=({target:e,onBeforeMutate:t=()=>{},onAfterMutate:r=()=>{},allowList:o=mapMutableMethods,props:a={}})=>{if(!(e instanceof Map))throw new TypeError("The 'target' parameter must be a Map.");const n={},createWrappedMethod=o=>function(...n){const s={};switch(o){case"set":{const[t,r]=n;s.key=t,s.newValue=r,s.existed=e.has(t),s.oldValue=s.existed?e.get(t):void 0;break}case"delete":{const[t]=n;s.key=t,s.existed=e.has(t),s.value=s.existed?e.get(t):void 0;break}case"clear":s.clearedItems=Array.from(e.entries()),s.previousSize=e.size}t(s);const l=e[o].apply(e,n),i={method:o,result:l,args:n,context:s,target:e,...a};return r(i),l};for(const e of o)mapMutableMethods.includes(e)&&(n[e]=createWrappedMethod(e));return Object.defineProperty(n,"target",{get:()=>e,enumerable:!1,configurable:!1}),n},
|
|
15
|
+
const getDataType=e=>{let t,r=Object.prototype.toString.call(e).slice(8,-1);return t="Function"===r&&/^\s*class\s+/.test(e.toString())?"Class":"Object"===r&&Object.getPrototypeOf(e)!==Object.prototype?"Instance":r,t},deepClone=(e,t={})=>{const r=getDataType(e),o=Object.assign({cloneSet:!0,cloneMap:!0,cloneObject:!0,cloneArray:!0,cloneDate:!0,cloneRegex:!0},t);if(o.interceptor&&"function"==typeof o.interceptor){let t=o.interceptor(e,r);if(t)return o.onAfterClone?.({output:t,input:e,type:r,cloned:t!==e}),t}o.onBeforeClone?.(e,r);let a,n=!0;if("Object"===r&&o.cloneObject){const t={},r=Object.getOwnPropertySymbols(e);for(const r in e)t[r]=deepClone(e[r],o);if(r.length>0)for(const a of r)t[a]=deepClone(e[a],o);a=t}else if("Array"===r&&o.cloneArray)a=e.map(e=>deepClone(e,o));else if("Map"===r&&o.cloneMap){const t=new Map;for(const[r,a]of e)t.set(deepClone(r,o),deepClone(a,o));a=t}else if("Set"===r&&o.cloneSet){const t=new Set;for(const r of e)t.add(deepClone(r,o));a=t}else if("Date"===r&&o.cloneDate)a=new Date(e.getTime());else if("RegExp"===r&&o.cloneRegex){const t=e;a=new RegExp(t.source,t.flags)}else a=e,n=!1;return o.onAfterClone?.({output:a,input:e,type:r,cloned:n}),a},deepCloneToJSON=e=>{const t=getDataType(e);if("Object"===t){const t={};for(const r in e)t[r]=deepCloneToJSON(e[r]);for(const e in t)void 0===t[e]&&Reflect.deleteProperty(t,e);return t}if("Array"===t){return e.map((e,t)=>deepCloneToJSON(e)).filter(e=>void 0!==e)}return["Number","String","Boolean","Null"].includes(t)?e:void 0},arrayMutableMethods=["push","pop","shift","unshift","splice","sort","reverse","copyWithin","fill"],wrapArrayMethods=({target:e,onBeforeMutate:t=()=>{},onAfterMutate:r=()=>{},allowList:o,props:a={}})=>{if(!Array.isArray(e))throw new TypeError("The 'target' parameter must be an array.");o&&!o?.length||(o=arrayMutableMethods);const n={};for(let s of o)n[s]=function(...o){const n={},l=e.length;switch(s){case"push":case"unshift":n.addedItems=[...o];break;case"pop":n.poppedItem=e[l-1];break;case"shift":n.shiftedItem=e[0];break;case"splice":const[t,r]=o,a=t<0?Math.max(l+t,0):Math.min(t,l),s=void 0===r?l-a:r;n.deletedItems=e.slice(a,a+s);break;case"sort":case"reverse":n.oldSnapshot=[...e];break;case"fill":case"copyWithin":const i=o[1]||0,c=void 0===o[2]?l:o[2];n.oldItems=e.slice(i,c),n.start=i,n.end=c}t?.(n);const i=Array.prototype[s].apply(e,o),c={value:i,key:s,args:o,context:n,target:e,...a};return r?.(c),i};return n},requireTypes=(e,t,r)=>{let o=Array.isArray(t)?t:[t],a=getDataType(e),n=a.toLowerCase(),s=o.map(e=>e.toLowerCase()),l=n.includes("html")?"element":n;if(r)try{if(!s.includes(l))throw new TypeError(`Expected data type(s): [${s.join(", ")}], but got: ${l}`)}catch(e){r(e,a)}else if(!s.includes(l))throw new TypeError(`Expected data type(s): [${s.join(", ")}], but got: ${l}`);return a},getUniqueId=(e={})=>{const t=e.prefix,r=e.suffix,o=e.base10,a=e.base36;return`${t?t+"-":""}${Date.now()}${a?"-"+Math.random().toString(36).substring(2,11):""}${o?"-"+Math.floor(1e4*Math.random()).toString().padStart(4,"0"):""}${r?"-"+r:""}`},setMutableMethods=["add","delete","clear"],mapMutableMethods=["set","delete","clear"],wrapSetMethods=({target:e,onBeforeMutate:t=()=>{},onAfterMutate:r=()=>{},allowList:o=setMutableMethods,props:a={}})=>{if(!(e instanceof Set))throw new TypeError("The 'target' parameter must be a Set.");const n={},createWrappedMethod=o=>function(...n){const s={};switch(o){case"add":{const[t]=n;s.addedItem=t,s.existed=e.has(t);break}case"delete":{const[t]=n;s.existed=e.has(t),s.deletedItem=s.existed?t:void 0;break}case"clear":s.clearedItems=Array.from(e),s.previousSize=e.size}t(s);const l=e[o].apply(e,n),i={method:o,result:l,args:n,context:s,target:e,...a};return r(i),l};for(const e of o)setMutableMethods.includes(e)&&(n[e]=createWrappedMethod(e));return Object.defineProperty(n,"target",{get:()=>e,enumerable:!1,configurable:!1}),n},wrapMapMethods=({target:e,onBeforeMutate:t=()=>{},onAfterMutate:r=()=>{},allowList:o=mapMutableMethods,props:a={}})=>{if(!(e instanceof Map))throw new TypeError("The 'target' parameter must be a Map.");const n={},createWrappedMethod=o=>function(...n){const s={};switch(o){case"set":{const[t,r]=n;s.key=t,s.newValue=r,s.existed=e.has(t),s.oldValue=s.existed?e.get(t):void 0;break}case"delete":{const[t]=n;s.key=t,s.existed=e.has(t),s.value=s.existed?e.get(t):void 0;break}case"clear":s.clearedItems=Array.from(e.entries()),s.previousSize=e.size}t(s);const l=e[o].apply(e,n),i={method:o,result:l,args:n,context:s,target:e,...a};return r(i),l};for(const e of o)mapMutableMethods.includes(e)&&(n[e]=createWrappedMethod(e));return Object.defineProperty(n,"target",{get:()=>e,enumerable:!1,configurable:!1}),n},copyObjectWithSymbol=e=>{if(!e||"object"!=typeof e)return e;const t=e,r=Object.getOwnPropertySymbols(t).reduce((e,r)=>(e[r]=t[r],e),{});return{...t,...r}},shallowCopy=(e,t={})=>{const r=getDataType(e);return"Set"===r?new Set([...e]):"Map"===r?new Map([...e]):Array.isArray(e)?[...e]:"object"===r?copyObjectWithSymbol(e):"Date"===r?new Date(e.getTime()):"RegExp"===r?new RegExp(e.source,e.flags):"Buffer"===r?Buffer.from(e):"ArrayBuffer"===r||ArrayBuffer.isView(e)?e.slice(0):"WeakSet"===r?new WeakSet([...e]):"WeakMap"===r?new WeakMap([...e]):"Error"===r?new Error(e.message):e},deepMerge=(e,t,r={})=>{const o=Object.assign({dataMode:"clear",inheritMissing:!0,targetClone:!1,useEnable:!0,useSymbol:!0,deepClone:{},onBeforeMerge:void 0,onAfterMerge:void 0},r),deepMergeHelper=(e,t,r)=>{let o,a,n=getDataType(e),s=getDataType(t),l=!0;return"Object"===n&&"Object"===s?(a=deepMergeObjects(e,t,r),o="Object"):"Array"===n&&"Array"===s?(a=deepMergeArrays(e,t,r),o="Array"):"Set"===n&&"Set"===s?(a=deepMergeSets(e,t,r),o="Set"):"Map"===n&&"Map"===s?(a=deepMergeMaps(e,t,r),o="Map"):(l=!1,a=e),{result:a,flag:l,type:o}},mergeEnableObject=(e,t)=>e?.hasOwnProperty("enable")&&"boolean"==typeof t?(e.enable=t,e):t?.hasOwnProperty("enable")&&"boolean"==typeof e?Object.assign({enable:e},t):t,deepMergeObjects=(e,t,r={})=>{let o=getDataType(e),a=getDataType(t);if("Object"!==o||"Object"!==a)return e;r?.onBeforeMerge?.(e,t);const n=Object.assign({inheritMissing:!0,targetClone:!1,useEnable:!0},r);let s={};s=n.targetClone?shallowCopy(e):e;for(let e in t)if(t.hasOwnProperty(e)&&s.hasOwnProperty(e)){let o=deepMergeHelper(s[e],t[e],r);o.flag?o.type?"Object"===o.type&&(s[e]=o.result):s[e]=t[e]:n.useEnable?s[e]=mergeEnableObject(s[e],t[e]):s[e]=t[e]}else t.hasOwnProperty(e)&&!s.hasOwnProperty(e)&&n.inheritMissing&&(s[e]=t[e]);if(n.useSymbol){let e=Object.getOwnPropertySymbols(t);if(e.length)for(let r of e)s[r]=t[r]}return n?.onAfterMerge?.(s,e,t),s},deepMergeArrays=(e,t,r={})=>{if(!Array.isArray(e)||!Array.isArray(t))return e;r?.onBeforeMerge?.(e,t);const o=Object.assign({dataMode:"clear",inheritMissing:!0,targetClone:!1},r),a=o.targetClone?[...e]:e;if("replace"===o.dataMode)for(let e=0;e<t.length&&(o.inheritMissing||!(e>=a.length));e++){deepMergeHelper(a[e],t[e],o).flag||(a[e]=t[e])}else"concat"===o.dataMode||(a.length=0),a.push(...t);return r?.onAfterMerge?.(a,e,t),a},deepMergeMaps=(e,t,r={})=>{if(!(e instanceof Map&&t instanceof Map))return e;r?.onBeforeMerge?.(e,t);const o=Object.assign({inheritMissing:!0,targetClone:!1,useEnable:!0},r),a=o.targetClone?new Map([...e]):e;for(const[e,n]of t.entries())if(a.has(e)){const t=a.get(e),r=n,s=deepMergeHelper(t,r,o);s.flag?"Object"===s.type&&a.set(e,s.result):a.set(e,r)}else r.inheritMissing&&a.set(e,n);return r?.onAfterMerge?.(a,e,t),a},deepMergeSets=(e,t,r={})=>{if(!(e instanceof Set&&t instanceof Set))return e;r?.onBeforeMerge?.(e,t);const o=Object.assign({dataMode:"clear",inheritMissing:!0,targetClone:!1,useEnable:!0},r),a=o.targetClone?new Set(...e):e;if("replace"===o.dataMode){const e=[...a],r=[...t],n=deepMergeHelper(e,r,o);a.clear();for(let e of n.result)a.add(e)}else if("concat"===o.dataMode)for(let e of t)a.add(e);else{a.clear();for(let e of t)a.add(e)}return r?.onAfterMerge?.(a,e,t),a};return deepMergeHelper(e,t,o).result},utils={getDataType:getDataType,requireTypes:requireTypes,deepClone:deepClone,deepCloneToJSON:deepCloneToJSON,wrapArrayMethods:wrapArrayMethods,arrayMutableMethods:arrayMutableMethods,setMutableMethods:setMutableMethods,mapMutableMethods:mapMutableMethods,wrapSetMethods:wrapSetMethods,wrapMapMethods:wrapMapMethods,getUniqueId:getUniqueId,deepMerge:deepMerge,shallowCopy:shallowCopy,copyObjectWithSymbol:copyObjectWithSymbol};export{utils as default};
|
package/dist/utils.umd.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
|
|
2
2
|
/*!
|
|
3
|
-
* @since Last modified: 2025-12-25
|
|
3
|
+
* @since Last modified: 2025-12-25 14:33:12
|
|
4
4
|
* @name Utils for web front-end.
|
|
5
|
-
* @version 0.0.
|
|
5
|
+
* @version 0.0.13
|
|
6
6
|
* @author AXUI development team <3217728223@qq.com>
|
|
7
7
|
* @description This is a set of general-purpose JavaScript utility functions developed by the AXUI team. All functions are pure and do not involve CSS or other third-party libraries. They are suitable for any web front-end environment.
|
|
8
8
|
* @see {@link https://www.axui.cn|Official website}
|
|
@@ -426,7 +426,20 @@
|
|
|
426
426
|
return methods;
|
|
427
427
|
};
|
|
428
428
|
|
|
429
|
-
const
|
|
429
|
+
const copyObjectWithSymbol = (data) => {
|
|
430
|
+
if (!data || typeof data !== 'object') {
|
|
431
|
+
return data;
|
|
432
|
+
}
|
|
433
|
+
// Ensure the object type includes string and symbol keys
|
|
434
|
+
const obj = data, symbolProperties = Object.getOwnPropertySymbols(obj).reduce((acc, sym) => {
|
|
435
|
+
acc[sym] = obj[sym];
|
|
436
|
+
return acc;
|
|
437
|
+
}, {});
|
|
438
|
+
// Shallow copy the object and include the Symbol properties
|
|
439
|
+
return { ...obj, ...symbolProperties };
|
|
440
|
+
};
|
|
441
|
+
|
|
442
|
+
const shallowCopy = (data, options = {}) => {
|
|
430
443
|
const dataType = getDataType(data);
|
|
431
444
|
// Check if data is a Set
|
|
432
445
|
if (dataType === 'Set') {
|
|
@@ -445,13 +458,37 @@
|
|
|
445
458
|
}
|
|
446
459
|
// Check if data is a Plain Object (including Symbol keys)
|
|
447
460
|
if (dataType === 'object') {
|
|
448
|
-
|
|
449
|
-
const symbolProperties = Object.getOwnPropertySymbols(obj).reduce((acc, sym) => {
|
|
450
|
-
acc[sym] = obj[sym];
|
|
451
|
-
return acc;
|
|
452
|
-
}, {});
|
|
461
|
+
// Ensure the object type includes string and symbol keys
|
|
453
462
|
// Shallow copy the object and include the Symbol properties
|
|
454
|
-
return
|
|
463
|
+
return copyObjectWithSymbol(data);
|
|
464
|
+
}
|
|
465
|
+
// Check if data is a Date
|
|
466
|
+
if (dataType === 'Date') {
|
|
467
|
+
return new Date(data.getTime());
|
|
468
|
+
}
|
|
469
|
+
// Check if data is a RegExp
|
|
470
|
+
if (dataType === 'RegExp') {
|
|
471
|
+
return new RegExp(data.source, data.flags);
|
|
472
|
+
}
|
|
473
|
+
// Check if data is a Buffer (for Node.js)
|
|
474
|
+
if (dataType === 'Buffer') {
|
|
475
|
+
return Buffer.from(data);
|
|
476
|
+
}
|
|
477
|
+
// Check if data is an ArrayBuffer or TypedArray
|
|
478
|
+
if (dataType === 'ArrayBuffer' || ArrayBuffer.isView(data)) {
|
|
479
|
+
return data.slice(0);
|
|
480
|
+
}
|
|
481
|
+
// Check if data is a WeakSet
|
|
482
|
+
if (dataType === 'WeakSet') {
|
|
483
|
+
return new WeakSet([...data]);
|
|
484
|
+
}
|
|
485
|
+
// Check if data is a WeakMap
|
|
486
|
+
if (dataType === 'WeakMap') {
|
|
487
|
+
return new WeakMap([...data]);
|
|
488
|
+
}
|
|
489
|
+
// Check if data is an Error
|
|
490
|
+
if (dataType === 'Error') {
|
|
491
|
+
return new Error(data.message);
|
|
455
492
|
}
|
|
456
493
|
// For other types (such as numbers, strings, booleans, etc.), return the original value
|
|
457
494
|
return data;
|
|
@@ -712,6 +749,7 @@
|
|
|
712
749
|
getUniqueId,
|
|
713
750
|
deepMerge,
|
|
714
751
|
shallowCopy,
|
|
752
|
+
copyObjectWithSymbol,
|
|
715
753
|
};
|
|
716
754
|
|
|
717
755
|
return utils;
|
package/dist/utils.umd.min.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @since Last modified: 2025-12-25
|
|
2
|
+
* @since Last modified: 2025-12-25 14:33:12
|
|
3
3
|
* @name Utils for web front-end.
|
|
4
|
-
* @version 0.0.
|
|
4
|
+
* @version 0.0.13
|
|
5
5
|
* @author AXUI development team <3217728223@qq.com>
|
|
6
6
|
* @description This is a set of general-purpose JavaScript utility functions developed by the AXUI team. All functions are pure and do not involve CSS or other third-party libraries. They are suitable for any web front-end environment.
|
|
7
7
|
* @see {@link https://www.axui.cn|Official website}
|
|
@@ -12,4 +12,4 @@
|
|
|
12
12
|
* @copyright This software supports the MIT License, allowing free learning and commercial use, but please retain the terms 'ax,' 'axui,' 'AX,' and 'AXUI' within the software.
|
|
13
13
|
* @license MIT license
|
|
14
14
|
*/
|
|
15
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).utils=t()}(this,function(){"use strict";const getDataType=e=>{let t,r=Object.prototype.toString.call(e).slice(8,-1);return t="Function"===r&&/^\s*class\s+/.test(e.toString())?"Class":"Object"===r&&Object.getPrototypeOf(e)!==Object.prototype?"Instance":r,t},deepClone=(e,t={})=>{const r=getDataType(e),o=Object.assign({cloneSet:!0,cloneMap:!0,cloneObject:!0,cloneArray:!0,cloneDate:!0,cloneRegex:!0},t);if(o.interceptor&&"function"==typeof o.interceptor){let t=o.interceptor(e,r);if(t)return o.onAfterClone?.({output:t,input:e,type:r,cloned:t!==e}),t}o.onBeforeClone?.(e,r);let n,a=!0;if("Object"===r&&o.cloneObject){const t={},r=Object.getOwnPropertySymbols(e);for(const r in e)t[r]=deepClone(e[r],o);if(r.length>0)for(const n of r)t[n]=deepClone(e[n],o);n=t}else if("Array"===r&&o.cloneArray)n=e.map(e=>deepClone(e,o));else if("Map"===r&&o.cloneMap){const t=new Map;for(const[r,n]of e)t.set(deepClone(r,o),deepClone(n,o));n=t}else if("Set"===r&&o.cloneSet){const t=new Set;for(const r of e)t.add(deepClone(r,o));n=t}else if("Date"===r&&o.cloneDate)n=new Date(e.getTime());else if("RegExp"===r&&o.cloneRegex){const t=e;n=new RegExp(t.source,t.flags)}else n=e,a=!1;return o.onAfterClone?.({output:n,input:e,type:r,cloned:a}),n},deepCloneToJSON=e=>{const t=getDataType(e);if("Object"===t){const t={};for(const r in e)t[r]=deepCloneToJSON(e[r]);for(const e in t)void 0===t[e]&&Reflect.deleteProperty(t,e);return t}if("Array"===t){return e.map((e,t)=>deepCloneToJSON(e)).filter(e=>void 0!==e)}return["Number","String","Boolean","Null"].includes(t)?e:void 0},e=["push","pop","shift","unshift","splice","sort","reverse","copyWithin","fill"],t=["add","delete","clear"],r=["set","delete","clear"],
|
|
15
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).utils=t()}(this,function(){"use strict";const getDataType=e=>{let t,r=Object.prototype.toString.call(e).slice(8,-1);return t="Function"===r&&/^\s*class\s+/.test(e.toString())?"Class":"Object"===r&&Object.getPrototypeOf(e)!==Object.prototype?"Instance":r,t},deepClone=(e,t={})=>{const r=getDataType(e),o=Object.assign({cloneSet:!0,cloneMap:!0,cloneObject:!0,cloneArray:!0,cloneDate:!0,cloneRegex:!0},t);if(o.interceptor&&"function"==typeof o.interceptor){let t=o.interceptor(e,r);if(t)return o.onAfterClone?.({output:t,input:e,type:r,cloned:t!==e}),t}o.onBeforeClone?.(e,r);let n,a=!0;if("Object"===r&&o.cloneObject){const t={},r=Object.getOwnPropertySymbols(e);for(const r in e)t[r]=deepClone(e[r],o);if(r.length>0)for(const n of r)t[n]=deepClone(e[n],o);n=t}else if("Array"===r&&o.cloneArray)n=e.map(e=>deepClone(e,o));else if("Map"===r&&o.cloneMap){const t=new Map;for(const[r,n]of e)t.set(deepClone(r,o),deepClone(n,o));n=t}else if("Set"===r&&o.cloneSet){const t=new Set;for(const r of e)t.add(deepClone(r,o));n=t}else if("Date"===r&&o.cloneDate)n=new Date(e.getTime());else if("RegExp"===r&&o.cloneRegex){const t=e;n=new RegExp(t.source,t.flags)}else n=e,a=!1;return o.onAfterClone?.({output:n,input:e,type:r,cloned:a}),n},deepCloneToJSON=e=>{const t=getDataType(e);if("Object"===t){const t={};for(const r in e)t[r]=deepCloneToJSON(e[r]);for(const e in t)void 0===t[e]&&Reflect.deleteProperty(t,e);return t}if("Array"===t){return e.map((e,t)=>deepCloneToJSON(e)).filter(e=>void 0!==e)}return["Number","String","Boolean","Null"].includes(t)?e:void 0},e=["push","pop","shift","unshift","splice","sort","reverse","copyWithin","fill"],t=["add","delete","clear"],r=["set","delete","clear"],copyObjectWithSymbol=e=>{if(!e||"object"!=typeof e)return e;const t=e,r=Object.getOwnPropertySymbols(t).reduce((e,r)=>(e[r]=t[r],e),{});return{...t,...r}},shallowCopy=(e,t={})=>{const r=getDataType(e);return"Set"===r?new Set([...e]):"Map"===r?new Map([...e]):Array.isArray(e)?[...e]:"object"===r?copyObjectWithSymbol(e):"Date"===r?new Date(e.getTime()):"RegExp"===r?new RegExp(e.source,e.flags):"Buffer"===r?Buffer.from(e):"ArrayBuffer"===r||ArrayBuffer.isView(e)?e.slice(0):"WeakSet"===r?new WeakSet([...e]):"WeakMap"===r?new WeakMap([...e]):"Error"===r?new Error(e.message):e};return{getDataType:getDataType,requireTypes:(e,t,r)=>{let o=Array.isArray(t)?t:[t],n=getDataType(e),a=n.toLowerCase(),s=o.map(e=>e.toLowerCase()),i=a.includes("html")?"element":a;if(r)try{if(!s.includes(i))throw new TypeError(`Expected data type(s): [${s.join(", ")}], but got: ${i}`)}catch(e){r(e,n)}else if(!s.includes(i))throw new TypeError(`Expected data type(s): [${s.join(", ")}], but got: ${i}`);return n},deepClone:deepClone,deepCloneToJSON:deepCloneToJSON,wrapArrayMethods:({target:t,onBeforeMutate:r=()=>{},onAfterMutate:o=()=>{},allowList:n,props:a={}})=>{if(!Array.isArray(t))throw new TypeError("The 'target' parameter must be an array.");n&&!n?.length||(n=e);const s={};for(let e of n)s[e]=function(...n){const s={},i=t.length;switch(e){case"push":case"unshift":s.addedItems=[...n];break;case"pop":s.poppedItem=t[i-1];break;case"shift":s.shiftedItem=t[0];break;case"splice":const[e,r]=n,o=e<0?Math.max(i+e,0):Math.min(e,i),a=void 0===r?i-o:r;s.deletedItems=t.slice(o,o+a);break;case"sort":case"reverse":s.oldSnapshot=[...t];break;case"fill":case"copyWithin":const l=n[1]||0,c=void 0===n[2]?i:n[2];s.oldItems=t.slice(l,c),s.start=l,s.end=c}r?.(s);const l=Array.prototype[e].apply(t,n),c={value:l,key:e,args:n,context:s,target:t,...a};return o?.(c),l};return s},arrayMutableMethods:e,setMutableMethods:t,mapMutableMethods:r,wrapSetMethods:({target:e,onBeforeMutate:r=()=>{},onAfterMutate:o=()=>{},allowList:n=t,props:a={}})=>{if(!(e instanceof Set))throw new TypeError("The 'target' parameter must be a Set.");const s={},createWrappedMethod=t=>function(...n){const s={};switch(t){case"add":{const[t]=n;s.addedItem=t,s.existed=e.has(t);break}case"delete":{const[t]=n;s.existed=e.has(t),s.deletedItem=s.existed?t:void 0;break}case"clear":s.clearedItems=Array.from(e),s.previousSize=e.size}r(s);const i=e[t].apply(e,n),l={method:t,result:i,args:n,context:s,target:e,...a};return o(l),i};for(const e of n)t.includes(e)&&(s[e]=createWrappedMethod(e));return Object.defineProperty(s,"target",{get:()=>e,enumerable:!1,configurable:!1}),s},wrapMapMethods:({target:e,onBeforeMutate:t=()=>{},onAfterMutate:o=()=>{},allowList:n=r,props:a={}})=>{if(!(e instanceof Map))throw new TypeError("The 'target' parameter must be a Map.");const s={},createWrappedMethod=r=>function(...n){const s={};switch(r){case"set":{const[t,r]=n;s.key=t,s.newValue=r,s.existed=e.has(t),s.oldValue=s.existed?e.get(t):void 0;break}case"delete":{const[t]=n;s.key=t,s.existed=e.has(t),s.value=s.existed?e.get(t):void 0;break}case"clear":s.clearedItems=Array.from(e.entries()),s.previousSize=e.size}t(s);const i=e[r].apply(e,n),l={method:r,result:i,args:n,context:s,target:e,...a};return o(l),i};for(const e of n)r.includes(e)&&(s[e]=createWrappedMethod(e));return Object.defineProperty(s,"target",{get:()=>e,enumerable:!1,configurable:!1}),s},getUniqueId:(e={})=>{const t=e.prefix,r=e.suffix,o=e.base10,n=e.base36;return`${t?t+"-":""}${Date.now()}${n?"-"+Math.random().toString(36).substring(2,11):""}${o?"-"+Math.floor(1e4*Math.random()).toString().padStart(4,"0"):""}${r?"-"+r:""}`},deepMerge:(e,t,r={})=>{const o=Object.assign({dataMode:"clear",inheritMissing:!0,targetClone:!1,useEnable:!0,useSymbol:!0,deepClone:{},onBeforeMerge:void 0,onAfterMerge:void 0},r),deepMergeHelper=(e,t,r)=>{let o,n,a=getDataType(e),s=getDataType(t),i=!0;return"Object"===a&&"Object"===s?(n=deepMergeObjects(e,t,r),o="Object"):"Array"===a&&"Array"===s?(n=deepMergeArrays(e,t,r),o="Array"):"Set"===a&&"Set"===s?(n=deepMergeSets(e,t,r),o="Set"):"Map"===a&&"Map"===s?(n=deepMergeMaps(e,t,r),o="Map"):(i=!1,n=e),{result:n,flag:i,type:o}},mergeEnableObject=(e,t)=>e?.hasOwnProperty("enable")&&"boolean"==typeof t?(e.enable=t,e):t?.hasOwnProperty("enable")&&"boolean"==typeof e?Object.assign({enable:e},t):t,deepMergeObjects=(e,t,r={})=>{let o=getDataType(e),n=getDataType(t);if("Object"!==o||"Object"!==n)return e;r?.onBeforeMerge?.(e,t);const a=Object.assign({inheritMissing:!0,targetClone:!1,useEnable:!0},r);let s={};s=a.targetClone?shallowCopy(e):e;for(let e in t)if(t.hasOwnProperty(e)&&s.hasOwnProperty(e)){let o=deepMergeHelper(s[e],t[e],r);o.flag?o.type?"Object"===o.type&&(s[e]=o.result):s[e]=t[e]:a.useEnable?s[e]=mergeEnableObject(s[e],t[e]):s[e]=t[e]}else t.hasOwnProperty(e)&&!s.hasOwnProperty(e)&&a.inheritMissing&&(s[e]=t[e]);if(a.useSymbol){let e=Object.getOwnPropertySymbols(t);if(e.length)for(let r of e)s[r]=t[r]}return a?.onAfterMerge?.(s,e,t),s},deepMergeArrays=(e,t,r={})=>{if(!Array.isArray(e)||!Array.isArray(t))return e;r?.onBeforeMerge?.(e,t);const o=Object.assign({dataMode:"clear",inheritMissing:!0,targetClone:!1},r),n=o.targetClone?[...e]:e;if("replace"===o.dataMode)for(let e=0;e<t.length&&(o.inheritMissing||!(e>=n.length));e++){deepMergeHelper(n[e],t[e],o).flag||(n[e]=t[e])}else"concat"===o.dataMode||(n.length=0),n.push(...t);return r?.onAfterMerge?.(n,e,t),n},deepMergeMaps=(e,t,r={})=>{if(!(e instanceof Map&&t instanceof Map))return e;r?.onBeforeMerge?.(e,t);const o=Object.assign({inheritMissing:!0,targetClone:!1,useEnable:!0},r),n=o.targetClone?new Map([...e]):e;for(const[e,a]of t.entries())if(n.has(e)){const t=n.get(e),r=a,s=deepMergeHelper(t,r,o);s.flag?"Object"===s.type&&n.set(e,s.result):n.set(e,r)}else r.inheritMissing&&n.set(e,a);return r?.onAfterMerge?.(n,e,t),n},deepMergeSets=(e,t,r={})=>{if(!(e instanceof Set&&t instanceof Set))return e;r?.onBeforeMerge?.(e,t);const o=Object.assign({dataMode:"clear",inheritMissing:!0,targetClone:!1,useEnable:!0},r),n=o.targetClone?new Set(...e):e;if("replace"===o.dataMode){const e=[...n],r=[...t],a=deepMergeHelper(e,r,o);n.clear();for(let e of a.result)n.add(e)}else if("concat"===o.dataMode)for(let e of t)n.add(e);else{n.clear();for(let e of t)n.add(e)}return r?.onAfterMerge?.(n,e,t),n};return deepMergeHelper(e,t,o).result},shallowCopy:shallowCopy,copyObjectWithSymbol:copyObjectWithSymbol}});
|
package/dist.zip
CHANGED
|
Binary file
|
package/modules.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Last modified: 2025/12/25
|
|
2
|
+
* Last modified: 2025/12/25 14:29:40
|
|
3
3
|
*/
|
|
4
4
|
'use strict';
|
|
5
5
|
import deepClone from './src/deepClone';
|
|
@@ -15,6 +15,7 @@ import wrapSetMethods from './src/wrapSetMethods';
|
|
|
15
15
|
import wrapMapMethods from './src/wrapMapMethods';
|
|
16
16
|
import deepMerge from './src/deepMerge';
|
|
17
17
|
import shallowCopy from './src/shallowCopy';
|
|
18
|
+
import copyObjectWithSymbol from './src/copyObjectWithSymbol';
|
|
18
19
|
const utils = {
|
|
19
20
|
//executeStr,
|
|
20
21
|
getDataType,
|
|
@@ -32,5 +33,6 @@ const utils = {
|
|
|
32
33
|
getUniqueId,
|
|
33
34
|
deepMerge,
|
|
34
35
|
shallowCopy,
|
|
36
|
+
copyObjectWithSymbol,
|
|
35
37
|
};
|
|
36
38
|
export default utils;
|
package/modules.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Last modified: 2025/12/25
|
|
2
|
+
* Last modified: 2025/12/25 14:29:40
|
|
3
3
|
*/
|
|
4
4
|
'use strict'
|
|
5
5
|
import deepClone from './src/deepClone';
|
|
@@ -23,6 +23,7 @@ import deepMergeObjects from './src/deepMergeObjects';
|
|
|
23
23
|
import deepMergeSets from './src/deepMergeSets';
|
|
24
24
|
import deepEqual from './src/deepEqual';
|
|
25
25
|
import shallowCopy from './src/shallowCopy';
|
|
26
|
+
import copyObjectWithSymbol from './src/copyObjectWithSymbol';
|
|
26
27
|
|
|
27
28
|
|
|
28
29
|
|
|
@@ -43,6 +44,7 @@ const utils = {
|
|
|
43
44
|
getUniqueId,
|
|
44
45
|
deepMerge,
|
|
45
46
|
shallowCopy,
|
|
47
|
+
copyObjectWithSymbol,
|
|
46
48
|
|
|
47
49
|
};
|
|
48
50
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codady/utils",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.13",
|
|
4
4
|
"author": "AXUI Development Team",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "This is a set of general-purpose JavaScript utility functions developed by the AXUI team. All functions are pure and do not involve CSS or other third-party libraries. They are suitable for any web front-end environment.",
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shallow copies an object, including both string keys and Symbol keys.
|
|
3
|
+
* 浅复制对象,包括字符串键和Symbol键
|
|
4
|
+
*
|
|
5
|
+
* @param data The source object to copy
|
|
6
|
+
* @returns A new object with all enumerable properties (both string and Symbol keys)
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* const sym = Symbol('test');
|
|
10
|
+
* const obj = { a: 1, [sym]: 'symbol value' };
|
|
11
|
+
* const copy = copyObjectWithSymbol(obj);
|
|
12
|
+
* // copy = { a: 1, [Symbol('test')]: 'symbol value' }
|
|
13
|
+
*/
|
|
14
|
+
const copyObjectWithSymbol = (data) => {
|
|
15
|
+
if (!data || typeof data !== 'object') {
|
|
16
|
+
return data;
|
|
17
|
+
}
|
|
18
|
+
// Ensure the object type includes string and symbol keys
|
|
19
|
+
const obj = data, symbolProperties = Object.getOwnPropertySymbols(obj).reduce((acc, sym) => {
|
|
20
|
+
acc[sym] = obj[sym];
|
|
21
|
+
return acc;
|
|
22
|
+
}, {});
|
|
23
|
+
// Shallow copy the object and include the Symbol properties
|
|
24
|
+
return { ...obj, ...symbolProperties };
|
|
25
|
+
};
|
|
26
|
+
export default copyObjectWithSymbol;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shallow copies an object, including both string keys and Symbol keys.
|
|
3
|
+
* 浅复制对象,包括字符串键和Symbol键
|
|
4
|
+
*
|
|
5
|
+
* @param data The source object to copy
|
|
6
|
+
* @returns A new object with all enumerable properties (both string and Symbol keys)
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* const sym = Symbol('test');
|
|
10
|
+
* const obj = { a: 1, [sym]: 'symbol value' };
|
|
11
|
+
* const copy = copyObjectWithSymbol(obj);
|
|
12
|
+
* // copy = { a: 1, [Symbol('test')]: 'symbol value' }
|
|
13
|
+
*/
|
|
14
|
+
const copyObjectWithSymbol = <T extends Record<string | symbol, any>>(data: T): T => {
|
|
15
|
+
if (!data || typeof data !== 'object') {
|
|
16
|
+
return data;
|
|
17
|
+
}
|
|
18
|
+
// Ensure the object type includes string and symbol keys
|
|
19
|
+
const obj = data as { [key: string | symbol]: any },
|
|
20
|
+
symbolProperties = Object.getOwnPropertySymbols(obj).reduce((acc: { [key: symbol]: any }, sym: symbol) => {
|
|
21
|
+
acc[sym] = obj[sym];
|
|
22
|
+
return acc;
|
|
23
|
+
}, {});
|
|
24
|
+
|
|
25
|
+
// Shallow copy the object and include the Symbol properties
|
|
26
|
+
return { ...obj, ...symbolProperties } as T;
|
|
27
|
+
}
|
|
28
|
+
export default copyObjectWithSymbol;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since Last modified: 2025/12/16 09:00:41
|
|
3
|
+
* @function getDataType
|
|
4
|
+
* @description Get object type.Can detect object types such as Array, Object, Function,
|
|
5
|
+
* Window,Location,History,Navigator,XMLHttpRequest, WebSocket,FileReader,MediaStream
|
|
6
|
+
* Class , String, Number, Boolean, Date, Symbol ,File ,Blob,
|
|
7
|
+
* Error,Promise,ArrayBuffer,TypedArray, Set, weakSet, Map, weakMap, Null, Undefined,
|
|
8
|
+
* Text, DocumentFragment,Comment, XMLDocument, ProcessingInstruction, Range, TreeWalker,
|
|
9
|
+
* NodeIterator,SVGSVGElement,MathMLElement, HTMLxxxElement (Dom nodes all contain HTML),Promise,AsyncFunction and Instance.
|
|
10
|
+
* @param {*} obj - Can be any object
|
|
11
|
+
* @returns {string} - Returns the name of the data type.
|
|
12
|
+
*/
|
|
13
|
+
'use strict';
|
|
14
|
+
const getDataType = (obj) => {
|
|
15
|
+
let tmp = Object.prototype.toString.call(obj).slice(8, -1), result;
|
|
16
|
+
if (tmp === 'Function' && /^\s*class\s+/.test(obj.toString())) {
|
|
17
|
+
result = 'Class';
|
|
18
|
+
}
|
|
19
|
+
else if (tmp === 'Object' && Object.getPrototypeOf(obj) !== Object.prototype) {
|
|
20
|
+
result = 'Instance';
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
result = tmp;
|
|
24
|
+
}
|
|
25
|
+
return result;
|
|
26
|
+
//document.createElement -> HTMLxxxElement
|
|
27
|
+
//document.createDocumentFragment() -> DocumentFragment
|
|
28
|
+
//document.createComment() -> Comment
|
|
29
|
+
//document.createTextNode -> Text
|
|
30
|
+
//document.createCDATASection() -> XMLDocument
|
|
31
|
+
//document.createProcessingInstruction() -> ProcessingInstruction
|
|
32
|
+
//document.createRange() -> Range
|
|
33
|
+
//document.createTreeWalker() -> TreeWalker
|
|
34
|
+
//document.createNodeIterator() -> NodeIterator
|
|
35
|
+
//document.createElementNS('http://www.w3.org/2000/svg', 'svg'); -> SVGSVGElement
|
|
36
|
+
//document.createElementNS('http://www.w3.org/1998/Math/MathML', 'math'); -> MathMLElement
|
|
37
|
+
};
|
|
38
|
+
export default getDataType;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since Last modified: 2025/12/25 14:22:26
|
|
3
|
+
* @function isEmpty
|
|
4
|
+
* @description Determine whether it is empty data.The data itself is empty data: 0| ''|false|undefined|null; <br>empty function: function () {}|() => {}; <br>empty array and empty objects: []|{}| [null]| [ undefined]| ['']| [""];<br> empty symbol object: symbol()|symbol.For(), will be judged as empty.
|
|
5
|
+
* @param {*} data - Can be any data
|
|
6
|
+
* @returns {boolean} - Return true or false
|
|
7
|
+
* @example
|
|
8
|
+
* ax.isEmpty([null]);
|
|
9
|
+
* <!--return true-->
|
|
10
|
+
*/
|
|
11
|
+
//简介:判断是否为空数据。本身为空的数据:0|''|false|undefined|null;空函数:function(){}|()=>{};空数组和空对象:[]|{}|[null]|[undefined]|['']|[""];空Symbol对象:Symbol()|Symbol.for(),都将判断为空。
|
|
12
|
+
//返回:true或false
|
|
13
|
+
'use strict';
|
|
14
|
+
import getDataType from './getDataType';
|
|
15
|
+
const isEmpty = (data) => {
|
|
16
|
+
let type = getDataType(data), flag;
|
|
17
|
+
if (!data) {
|
|
18
|
+
//0,'',false,undefined,null
|
|
19
|
+
flag = true;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
//function(){}|()=>{}
|
|
23
|
+
//[null]|[undefined]|['']|[""]
|
|
24
|
+
//[]|{}
|
|
25
|
+
//Symbol()|Symbol.for()
|
|
26
|
+
//Set,Map
|
|
27
|
+
//Date/Regex
|
|
28
|
+
flag = (type === 'Object') ? (Object.keys(data).length === 0) :
|
|
29
|
+
(type === 'Array') ? data.join('') === '' :
|
|
30
|
+
(type === 'Function') ? (data.toString().replace(/\s+/g, '').match(/{.*}/g)[0] === '{}') :
|
|
31
|
+
(type === 'Symbol') ? (data.toString().replace(/\s+/g, '').match(/\(.*\)/g)[0] === '()') :
|
|
32
|
+
(type === 'Set' || type === 'Map') ? data.size === 0 :
|
|
33
|
+
type === 'Date' ? isNaN(data.getTime()) :
|
|
34
|
+
type === 'RegExp' ? data.source === '' :
|
|
35
|
+
type === 'ArrayBuffer' ? data.byteLength === 0 :
|
|
36
|
+
(type === 'NodeList' || type === 'HTMLCollection') ? data.length === 0 :
|
|
37
|
+
('length' in data && typeof data.length === 'number') ? data.length === 0 :
|
|
38
|
+
('size' in data && typeof data.size === 'number') ? data.size === 0 :
|
|
39
|
+
(type === 'Error' || data instanceof Error) ? data.message === '' :
|
|
40
|
+
(type.includes('Array') && (['Uint8Array', 'Int8Array', 'Uint16Array', 'Int16Array', 'Uint32Array', 'Int32Array', 'Float32Array', 'Float64Array'].includes(type))) ? data.length === 0 :
|
|
41
|
+
false;
|
|
42
|
+
}
|
|
43
|
+
return flag;
|
|
44
|
+
};
|
|
45
|
+
export default isEmpty;
|
package/src/isEmpty.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since Last modified: 2025/12/25 14:22:26
|
|
3
|
+
* @function isEmpty
|
|
4
|
+
* @description Determine whether it is empty data.The data itself is empty data: 0| ''|false|undefined|null; <br>empty function: function () {}|() => {}; <br>empty array and empty objects: []|{}| [null]| [ undefined]| ['']| [""];<br> empty symbol object: symbol()|symbol.For(), will be judged as empty.
|
|
5
|
+
* @param {*} data - Can be any data
|
|
6
|
+
* @returns {boolean} - Return true or false
|
|
7
|
+
* @example
|
|
8
|
+
* ax.isEmpty([null]);
|
|
9
|
+
* <!--return true-->
|
|
10
|
+
*/
|
|
11
|
+
//简介:判断是否为空数据。本身为空的数据:0|''|false|undefined|null;空函数:function(){}|()=>{};空数组和空对象:[]|{}|[null]|[undefined]|['']|[""];空Symbol对象:Symbol()|Symbol.for(),都将判断为空。
|
|
12
|
+
//返回:true或false
|
|
13
|
+
'use strict';
|
|
14
|
+
import getDataType from './getDataType';
|
|
15
|
+
const isEmpty = (data) => {
|
|
16
|
+
let type = getDataType(data), flag;
|
|
17
|
+
if (!data) {
|
|
18
|
+
//0,'',false,undefined,null
|
|
19
|
+
flag = true;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
//function(){}|()=>{}
|
|
23
|
+
//[null]|[undefined]|['']|[""]
|
|
24
|
+
//[]|{}
|
|
25
|
+
//Symbol()|Symbol.for()
|
|
26
|
+
//Set,Map
|
|
27
|
+
//Date/Regex
|
|
28
|
+
flag = (type === 'Object') ? (Object.keys(data).length === 0) :
|
|
29
|
+
(type === 'Array') ? data.join('') === '' :
|
|
30
|
+
(type === 'Function') ? (data.toString().replace(/\s+/g, '').match(/{.*}/g)[0] === '{}') :
|
|
31
|
+
(type === 'Symbol') ? (data.toString().replace(/\s+/g, '').match(/\(.*\)/g)[0] === '()') :
|
|
32
|
+
(type === 'Set' || type === 'Map') ? data.size === 0 :
|
|
33
|
+
type === 'Date' ? isNaN(data.getTime()) :
|
|
34
|
+
type === 'RegExp' ? data.source === '' :
|
|
35
|
+
type === 'ArrayBuffer' ? data.byteLength === 0 :
|
|
36
|
+
(type === 'NodeList' || type === 'HTMLCollection') ? data.length === 0 :
|
|
37
|
+
('length' in data && typeof data.length === 'number') ? data.length === 0 :
|
|
38
|
+
('size' in data && typeof data.size === 'number') ? data.size === 0 :
|
|
39
|
+
(type === 'Error' || data instanceof Error) ? data.message === '' :
|
|
40
|
+
(type.includes('Array') && (['Uint8Array', 'Int8Array', 'Uint16Array', 'Int16Array', 'Uint32Array', 'Int32Array', 'Float32Array', 'Float64Array'].includes(type))) ? data.length === 0 :
|
|
41
|
+
false;
|
|
42
|
+
}
|
|
43
|
+
return flag;
|
|
44
|
+
};
|
|
45
|
+
export default isEmpty;
|
package/src/isEmpty.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since Last modified: 2025/12/25 14:22:26
|
|
3
|
+
* @function isEmpty
|
|
4
|
+
* @description Determine whether it is empty data.The data itself is empty data: 0| ''|false|undefined|null; <br>empty function: function () {}|() => {}; <br>empty array and empty objects: []|{}| [null]| [ undefined]| ['']| [""];<br> empty symbol object: symbol()|symbol.For(), will be judged as empty.
|
|
5
|
+
* @param {*} data - Can be any data
|
|
6
|
+
* @returns {boolean} - Return true or false
|
|
7
|
+
* @example
|
|
8
|
+
* ax.isEmpty([null]);
|
|
9
|
+
* <!--return true-->
|
|
10
|
+
*/
|
|
11
|
+
//简介:判断是否为空数据。本身为空的数据:0|''|false|undefined|null;空函数:function(){}|()=>{};空数组和空对象:[]|{}|[null]|[undefined]|['']|[""];空Symbol对象:Symbol()|Symbol.for(),都将判断为空。
|
|
12
|
+
//返回:true或false
|
|
13
|
+
'use strict';
|
|
14
|
+
import getDataType from './getDataType';
|
|
15
|
+
const isEmpty = (data: any): boolean => {
|
|
16
|
+
let type = getDataType(data), flag: boolean;
|
|
17
|
+
if (!data) {
|
|
18
|
+
//0,'',false,undefined,null
|
|
19
|
+
flag = true;
|
|
20
|
+
} else {
|
|
21
|
+
//function(){}|()=>{}
|
|
22
|
+
//[null]|[undefined]|['']|[""]
|
|
23
|
+
//[]|{}
|
|
24
|
+
//Symbol()|Symbol.for()
|
|
25
|
+
//Set,Map
|
|
26
|
+
//Date/Regex
|
|
27
|
+
flag = (type === 'Object') ? (Object.keys(data).length === 0) :
|
|
28
|
+
(type === 'Array') ? data.join('') === '' :
|
|
29
|
+
(type === 'Function') ? (data.toString().replace(/\s+/g, '').match(/{.*}/g)[0] === '{}') :
|
|
30
|
+
(type === 'Symbol') ? (data.toString().replace(/\s+/g, '').match(/\(.*\)/g)[0] === '()') :
|
|
31
|
+
(type === 'Set' || type === 'Map') ? data.size === 0 :
|
|
32
|
+
type === 'Date' ? isNaN(data.getTime()) :
|
|
33
|
+
type === 'RegExp' ? data.source === '' :
|
|
34
|
+
type === 'ArrayBuffer' ? data.byteLength === 0 :
|
|
35
|
+
(type === 'NodeList' || type === 'HTMLCollection') ? data.length === 0 :
|
|
36
|
+
('length' in data && typeof data.length === 'number') ? data.length === 0 :
|
|
37
|
+
('size' in data && typeof data.size === 'number') ? data.size === 0 :
|
|
38
|
+
(type === 'Error' || data instanceof Error) ? data.message === '' :
|
|
39
|
+
(type.includes('Array') && (['Uint8Array', 'Int8Array', 'Uint16Array', 'Int16Array', 'Uint32Array', 'Int32Array', 'Float32Array', 'Float64Array'].includes(type))) ? data.length === 0 :
|
|
40
|
+
false;
|
|
41
|
+
}
|
|
42
|
+
return flag;
|
|
43
|
+
}
|
|
44
|
+
export default isEmpty;
|
package/src/shallowCopy.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @since Last modified: 2025/12/25
|
|
2
|
+
* @since Last modified: 2025/12/25 14:29:53
|
|
3
3
|
* shallowCopy
|
|
4
4
|
*
|
|
5
5
|
* This function performs a shallow copy of various data structures:
|
|
@@ -7,13 +7,21 @@
|
|
|
7
7
|
* - Map
|
|
8
8
|
* - Array
|
|
9
9
|
* - Plain Object (including properties with Symbol keys)
|
|
10
|
+
* - Date
|
|
11
|
+
* - RegExp
|
|
12
|
+
* - Buffer (Node.js)
|
|
13
|
+
* - ArrayBuffer and Typed Arrays
|
|
14
|
+
* - WeakSet
|
|
15
|
+
* - WeakMap
|
|
16
|
+
* - Error
|
|
10
17
|
*
|
|
11
18
|
* It returns a new instance of the data structure, but the elements or properties of reference types (such as objects or arrays) will be copied by reference.
|
|
12
19
|
* Primitive types (e.g., number, string, boolean) will be returned directly.
|
|
13
20
|
*/
|
|
14
21
|
'use strict';
|
|
22
|
+
import copyObjectWithSymbol from "./copyObjectWithSymbol";
|
|
15
23
|
import getDataType from "./getDataType";
|
|
16
|
-
const shallowCopy = (data) => {
|
|
24
|
+
const shallowCopy = (data, options = {}) => {
|
|
17
25
|
const dataType = getDataType(data);
|
|
18
26
|
// Check if data is a Set
|
|
19
27
|
if (dataType === 'Set') {
|
|
@@ -32,13 +40,37 @@ const shallowCopy = (data) => {
|
|
|
32
40
|
}
|
|
33
41
|
// Check if data is a Plain Object (including Symbol keys)
|
|
34
42
|
if (dataType === 'object') {
|
|
35
|
-
|
|
36
|
-
const symbolProperties = Object.getOwnPropertySymbols(obj).reduce((acc, sym) => {
|
|
37
|
-
acc[sym] = obj[sym];
|
|
38
|
-
return acc;
|
|
39
|
-
}, {});
|
|
43
|
+
// Ensure the object type includes string and symbol keys
|
|
40
44
|
// Shallow copy the object and include the Symbol properties
|
|
41
|
-
return
|
|
45
|
+
return copyObjectWithSymbol(data);
|
|
46
|
+
}
|
|
47
|
+
// Check if data is a Date
|
|
48
|
+
if (dataType === 'Date') {
|
|
49
|
+
return new Date(data.getTime());
|
|
50
|
+
}
|
|
51
|
+
// Check if data is a RegExp
|
|
52
|
+
if (dataType === 'RegExp') {
|
|
53
|
+
return new RegExp(data.source, data.flags);
|
|
54
|
+
}
|
|
55
|
+
// Check if data is a Buffer (for Node.js)
|
|
56
|
+
if (dataType === 'Buffer') {
|
|
57
|
+
return Buffer.from(data);
|
|
58
|
+
}
|
|
59
|
+
// Check if data is an ArrayBuffer or TypedArray
|
|
60
|
+
if (dataType === 'ArrayBuffer' || ArrayBuffer.isView(data)) {
|
|
61
|
+
return data.slice(0);
|
|
62
|
+
}
|
|
63
|
+
// Check if data is a WeakSet
|
|
64
|
+
if (dataType === 'WeakSet') {
|
|
65
|
+
return new WeakSet([...data]);
|
|
66
|
+
}
|
|
67
|
+
// Check if data is a WeakMap
|
|
68
|
+
if (dataType === 'WeakMap') {
|
|
69
|
+
return new WeakMap([...data]);
|
|
70
|
+
}
|
|
71
|
+
// Check if data is an Error
|
|
72
|
+
if (dataType === 'Error') {
|
|
73
|
+
return new Error(data.message);
|
|
42
74
|
}
|
|
43
75
|
// For other types (such as numbers, strings, booleans, etc.), return the original value
|
|
44
76
|
return data;
|
package/src/shallowCopy.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @since Last modified: 2025/12/25
|
|
2
|
+
* @since Last modified: 2025/12/25 14:29:53
|
|
3
3
|
* shallowCopy
|
|
4
4
|
*
|
|
5
5
|
* This function performs a shallow copy of various data structures:
|
|
@@ -7,15 +7,23 @@
|
|
|
7
7
|
* - Map
|
|
8
8
|
* - Array
|
|
9
9
|
* - Plain Object (including properties with Symbol keys)
|
|
10
|
+
* - Date
|
|
11
|
+
* - RegExp
|
|
12
|
+
* - Buffer (Node.js)
|
|
13
|
+
* - ArrayBuffer and Typed Arrays
|
|
14
|
+
* - WeakSet
|
|
15
|
+
* - WeakMap
|
|
16
|
+
* - Error
|
|
10
17
|
*
|
|
11
18
|
* It returns a new instance of the data structure, but the elements or properties of reference types (such as objects or arrays) will be copied by reference.
|
|
12
19
|
* Primitive types (e.g., number, string, boolean) will be returned directly.
|
|
13
20
|
*/
|
|
14
21
|
'use strict';
|
|
15
22
|
|
|
23
|
+
import copyObjectWithSymbol from "./copyObjectWithSymbol";
|
|
16
24
|
import getDataType from "./getDataType";
|
|
17
25
|
|
|
18
|
-
const shallowCopy = (data: any): any => {
|
|
26
|
+
const shallowCopy = (data: any,options={}): any => {
|
|
19
27
|
const dataType = getDataType(data);
|
|
20
28
|
|
|
21
29
|
// Check if data is a Set
|
|
@@ -38,14 +46,44 @@ const shallowCopy = (data: any): any => {
|
|
|
38
46
|
|
|
39
47
|
// Check if data is a Plain Object (including Symbol keys)
|
|
40
48
|
if (dataType === 'object') {
|
|
41
|
-
|
|
42
|
-
const symbolProperties = Object.getOwnPropertySymbols(obj).reduce((acc: { [key: symbol]: any }, sym: symbol) => {
|
|
43
|
-
acc[sym] = obj[sym];
|
|
44
|
-
return acc;
|
|
45
|
-
}, {});
|
|
46
|
-
|
|
49
|
+
// Ensure the object type includes string and symbol keys
|
|
47
50
|
// Shallow copy the object and include the Symbol properties
|
|
48
|
-
return
|
|
51
|
+
return copyObjectWithSymbol(data);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Check if data is a Date
|
|
55
|
+
if (dataType === 'Date') {
|
|
56
|
+
return new Date(data.getTime());
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Check if data is a RegExp
|
|
60
|
+
if (dataType === 'RegExp') {
|
|
61
|
+
return new RegExp(data.source, data.flags);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Check if data is a Buffer (for Node.js)
|
|
65
|
+
if (dataType === 'Buffer') {
|
|
66
|
+
return Buffer.from(data);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Check if data is an ArrayBuffer or TypedArray
|
|
70
|
+
if (dataType === 'ArrayBuffer' || ArrayBuffer.isView(data)) {
|
|
71
|
+
return data.slice(0);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Check if data is a WeakSet
|
|
75
|
+
if (dataType === 'WeakSet') {
|
|
76
|
+
return new WeakSet([...data]);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Check if data is a WeakMap
|
|
80
|
+
if (dataType === 'WeakMap') {
|
|
81
|
+
return new WeakMap([...data]);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Check if data is an Error
|
|
85
|
+
if (dataType === 'Error') {
|
|
86
|
+
return new Error(data.message);
|
|
49
87
|
}
|
|
50
88
|
|
|
51
89
|
// For other types (such as numbers, strings, booleans, etc.), return the original value
|