@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 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 12:10:38
3
+ * @since Last modified: 2025-12-25 14:33:12
4
4
  * @name Utils for web front-end.
5
- * @version 0.0.12
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 shallowCopy = (data) => {
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
- const obj = data; // Ensure the object type includes string and symbol keys
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 { ...obj, ...symbolProperties };
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;
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @since Last modified: 2025-12-25 12:10:38
2
+ * @since Last modified: 2025-12-25 14:33:12
3
3
  * @name Utils for web front-end.
4
- * @version 0.0.12
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},shallowCopy=e=>{const t=getDataType(e);if("Set"===t)return new Set([...e]);if("Map"===t)return new Map([...e]);if(Array.isArray(e))return[...e];if("object"===t){const t=e,r=Object.getOwnPropertySymbols(t).reduce((e,r)=>(e[r]=t[r],e),{});return{...t,...r}}return 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};module.exports=utils;
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 12:10:38
3
+ * @since Last modified: 2025-12-25 14:33:12
4
4
  * @name Utils for web front-end.
5
- * @version 0.0.12
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 shallowCopy = (data) => {
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
- const obj = data; // Ensure the object type includes string and symbol keys
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 { ...obj, ...symbolProperties };
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 };
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @since Last modified: 2025-12-25 12:10:38
2
+ * @since Last modified: 2025-12-25 14:33:12
3
3
  * @name Utils for web front-end.
4
- * @version 0.0.12
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},shallowCopy=e=>{const t=getDataType(e);if("Set"===t)return new Set([...e]);if("Map"===t)return new Map([...e]);if(Array.isArray(e))return[...e];if("object"===t){const t=e,r=Object.getOwnPropertySymbols(t).reduce((e,r)=>(e[r]=t[r],e),{});return{...t,...r}}return 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};export{utils as default};
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 12:10:38
3
+ * @since Last modified: 2025-12-25 14:33:12
4
4
  * @name Utils for web front-end.
5
- * @version 0.0.12
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 shallowCopy = (data) => {
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
- const obj = data; // Ensure the object type includes string and symbol keys
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 { ...obj, ...symbolProperties };
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;
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @since Last modified: 2025-12-25 12:10:38
2
+ * @since Last modified: 2025-12-25 14:33:12
3
3
  * @name Utils for web front-end.
4
- * @version 0.0.12
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"],shallowCopy=e=>{const t=getDataType(e);if("Set"===t)return new Set([...e]);if("Map"===t)return new Map([...e]);if(Array.isArray(e))return[...e];if("object"===t){const t=e,r=Object.getOwnPropertySymbols(t).reduce((e,r)=>(e[r]=t[r],e),{});return{...t,...r}}return 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}});
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 12:08:43
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 12:08:43
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.12",
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;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @since Last modified: 2025/12/25 12:07:26
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
- const obj = data; // Ensure the object type includes string and symbol keys
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 { ...obj, ...symbolProperties };
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;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @since Last modified: 2025/12/25 12:07:26
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
- const obj = data as { [key: string | symbol]: any }; // Ensure the object type includes string and symbol keys
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 { ...obj, ...symbolProperties };
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