@codady/utils 0.0.17 → 0.0.19
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 +39 -0
- package/dist/utils.cjs.js +175 -10
- package/dist/utils.cjs.min.js +3 -3
- package/dist/utils.esm.js +175 -10
- package/dist/utils.esm.min.js +3 -3
- package/dist/utils.umd.js +175 -10
- package/dist/utils.umd.min.js +3 -3
- package/dist.zip +0 -0
- package/modules.js +7 -1
- package/modules.ts +7 -1
- package/package.json +1 -1
- package/src/createEl.js +83 -0
- package/src/createEl.ts +80 -0
- package/src/deepClone.js +1 -1
- package/src/deepClone.ts +1 -1
- package/src/deepMerge.js +35 -9
- package/src/deepMerge.ts +37 -9
- package/src/getEl.js +38 -0
- package/src/getEl.ts +41 -0
- package/src/getEls.js +48 -0
- package/src/getEls.ts +48 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,45 @@
|
|
|
2
2
|
|
|
3
3
|
All changes to Utils including new features, updates, and removals are documented here.
|
|
4
4
|
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
## [v0.0.19] - 2025-1-5
|
|
8
|
+
|
|
9
|
+
### Distribution Files
|
|
10
|
+
* **JS**: https://unpkg.com/@codady/utils@0.0.19/dist/js/utils.js
|
|
11
|
+
* **Zip**:https://unpkg.com/@codady/utils@0.0.19/dist.zip
|
|
12
|
+
|
|
13
|
+
### Changes
|
|
14
|
+
|
|
15
|
+
#### Fixed
|
|
16
|
+
* Null
|
|
17
|
+
|
|
18
|
+
#### Added
|
|
19
|
+
* Added the functions `getEl`, `getEls`, and `createEl`.新增`getEl`、`getEls`和`ceateEl`函数。
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
#### Removed
|
|
23
|
+
* Null
|
|
24
|
+
|
|
25
|
+
## [v0.0.18] - 2025-12-27
|
|
26
|
+
|
|
27
|
+
### Distribution Files
|
|
28
|
+
* **JS**: https://unpkg.com/@codady/utils@0.0.18/dist/js/utils.js
|
|
29
|
+
* **Zip**:https://unpkg.com/@codady/utils@0.0.18/dist.zip
|
|
30
|
+
|
|
31
|
+
### Changes
|
|
32
|
+
|
|
33
|
+
#### Fixed
|
|
34
|
+
* Null
|
|
35
|
+
|
|
36
|
+
#### Added
|
|
37
|
+
* Modified the `deepMerge` function to add `nullBehavior` and `undefinedBehavior` properties to the parameters for handling `null` and `undefined` values.修改了`deepMerge`函数,对参数增加`nullBehavior`和`undefinedBehavior`属性,用来处理null和undefined值。
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
#### Removed
|
|
41
|
+
* Null
|
|
42
|
+
|
|
43
|
+
|
|
5
44
|
## [v0.0.16] - 2025-12-26
|
|
6
45
|
|
|
7
46
|
### Distribution Files
|
package/dist/utils.cjs.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
|
|
2
2
|
/*!
|
|
3
|
-
* @since Last modified:
|
|
3
|
+
* @since Last modified: 2026-1-5 10:34:3
|
|
4
4
|
* @name Utils for web front-end.
|
|
5
|
-
* @version 0.0.
|
|
5
|
+
* @version 0.0.19
|
|
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}
|
|
@@ -514,6 +514,8 @@ const deepMerge = (target, source, opts = {}) => {
|
|
|
514
514
|
// Whether to allow merging key=symbol key-value pairs when target is {} type.
|
|
515
515
|
// target是{}类型时,是否允许合并key=symbol的键值对。
|
|
516
516
|
useSymbol: true,
|
|
517
|
+
nullBehavior: 'preserve',
|
|
518
|
+
undefinedBehavior: 'preserve',
|
|
517
519
|
// Options passed to the deepClone function when targetClone is true
|
|
518
520
|
// 当targetClone为true时传递给deepClone函数的选项
|
|
519
521
|
deepClone: {},
|
|
@@ -602,18 +604,38 @@ const deepMerge = (target, source, opts = {}) => {
|
|
|
602
604
|
// 如果是复制方法,则先复制target
|
|
603
605
|
result = options.targetClone ? shallowCopy(target) : target;
|
|
604
606
|
for (let k in source) {
|
|
607
|
+
const _result = result[k], _source = source[k];
|
|
605
608
|
if (source.hasOwnProperty(k) && result.hasOwnProperty(k)) {
|
|
606
|
-
|
|
609
|
+
const resp = smartMerger(_result, _source, { ...opts, parent: result });
|
|
607
610
|
//resp={result,flag,type}
|
|
608
|
-
//flag=true
|
|
611
|
+
//flag=true表示类型一致(object/array/map/set)并完成了合并,false表示并没有合并需要直接赋值
|
|
609
612
|
if (!resp.flag) {
|
|
610
613
|
//类型不同则直接覆盖
|
|
611
|
-
|
|
612
|
-
|
|
614
|
+
let tmp = options.useEnable ? mergeEnableObject(_result, _source) : _source;
|
|
615
|
+
if (_result !== tmp && tmp === null) {
|
|
616
|
+
if (options.nullBehavior === 'ignore') ;
|
|
617
|
+
else if (options.nullBehavior === 'delete') {
|
|
618
|
+
//删除属性
|
|
619
|
+
Reflect.deleteProperty(result, k);
|
|
620
|
+
}
|
|
621
|
+
else {
|
|
622
|
+
//替换
|
|
623
|
+
result[k] = tmp;
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
else if (_result !== tmp && tmp === undefined) {
|
|
627
|
+
if (options.undefinedBehavior === 'ignore') ;
|
|
628
|
+
else if (options.undefinedBehavior === 'delete') {
|
|
629
|
+
//删除属性
|
|
630
|
+
Reflect.deleteProperty(result, k);
|
|
631
|
+
}
|
|
632
|
+
else {
|
|
633
|
+
//替换
|
|
634
|
+
result[k] = _source;
|
|
635
|
+
}
|
|
613
636
|
}
|
|
614
637
|
else {
|
|
615
|
-
|
|
616
|
-
result[k] = source[k];
|
|
638
|
+
result[k] = _source;
|
|
617
639
|
}
|
|
618
640
|
}
|
|
619
641
|
else {
|
|
@@ -626,13 +648,13 @@ const deepMerge = (target, source, opts = {}) => {
|
|
|
626
648
|
}
|
|
627
649
|
else {
|
|
628
650
|
//其他类型则直接覆盖
|
|
629
|
-
result[k] =
|
|
651
|
+
result[k] = _source;
|
|
630
652
|
}
|
|
631
653
|
}
|
|
632
654
|
}
|
|
633
655
|
else if (source.hasOwnProperty(k) && !result.hasOwnProperty(k) && options.inheritMissing) {
|
|
634
656
|
//如果source有属性,result没有该属性,但是options允许追加属性则直接赋值
|
|
635
|
-
result[k] =
|
|
657
|
+
result[k] = _source;
|
|
636
658
|
}
|
|
637
659
|
}
|
|
638
660
|
//Symbol键直接追加,因为Symbol是唯一,结果同Object.assign
|
|
@@ -739,6 +761,146 @@ const deepMerge = (target, source, opts = {}) => {
|
|
|
739
761
|
return smartMerger(target, source, options).result;
|
|
740
762
|
};
|
|
741
763
|
|
|
764
|
+
const getEl = (obj, wrap = document.body) => {
|
|
765
|
+
let objType = getDataType(obj), parType = getDataType(wrap), parent = parType.includes('HTML') ? wrap : document.querySelector(wrap),
|
|
766
|
+
//如果parent是template节点,需要通过node.content.querySelector取得子节点
|
|
767
|
+
root = parent && parent instanceof HTMLTemplateElement ? parent.content : parent, result = null;
|
|
768
|
+
if (obj) {
|
|
769
|
+
if (objType.includes('HTML')) {
|
|
770
|
+
result = obj;
|
|
771
|
+
}
|
|
772
|
+
else if (objType === 'String') {
|
|
773
|
+
try {
|
|
774
|
+
result = (root || document).querySelector(obj.trim());
|
|
775
|
+
//可能会报错,报错则返回null
|
|
776
|
+
}
|
|
777
|
+
catch {
|
|
778
|
+
result = null;
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
return result;
|
|
783
|
+
};
|
|
784
|
+
|
|
785
|
+
const isEmpty = (data) => {
|
|
786
|
+
let type = getDataType(data), flag;
|
|
787
|
+
if (!data) {
|
|
788
|
+
//0,'',false,undefined,null
|
|
789
|
+
flag = true;
|
|
790
|
+
}
|
|
791
|
+
else {
|
|
792
|
+
//function(){}|()=>{}
|
|
793
|
+
//[null]|[undefined]|['']|[""]
|
|
794
|
+
//[]|{}
|
|
795
|
+
//Symbol()|Symbol.for()
|
|
796
|
+
//Set,Map
|
|
797
|
+
//Date/Regex
|
|
798
|
+
flag = (type === 'Object') ? (Object.keys(data).length === 0) :
|
|
799
|
+
(type === 'Array') ? data.join('') === '' :
|
|
800
|
+
(type === 'Function') ? (data.toString().replace(/\s+/g, '').match(/{.*}/g)[0] === '{}') :
|
|
801
|
+
(type === 'Symbol') ? (data.toString().replace(/\s+/g, '').match(/\(.*\)/g)[0] === '()') :
|
|
802
|
+
(type === 'Set' || type === 'Map') ? data.size === 0 :
|
|
803
|
+
type === 'Date' ? isNaN(data.getTime()) :
|
|
804
|
+
type === 'RegExp' ? data.source === '' :
|
|
805
|
+
type === 'ArrayBuffer' ? data.byteLength === 0 :
|
|
806
|
+
(type === 'NodeList' || type === 'HTMLCollection') ? data.length === 0 :
|
|
807
|
+
('length' in data && typeof data.length === 'number') ? data.length === 0 :
|
|
808
|
+
('size' in data && typeof data.size === 'number') ? data.size === 0 :
|
|
809
|
+
(type === 'Error' || data instanceof Error) ? data.message === '' :
|
|
810
|
+
(type.includes('Array') && (['Uint8Array', 'Int8Array', 'Uint16Array', 'Int16Array', 'Uint32Array', 'Int32Array', 'Float32Array', 'Float64Array'].includes(type))) ? data.length === 0 :
|
|
811
|
+
false;
|
|
812
|
+
}
|
|
813
|
+
return flag;
|
|
814
|
+
};
|
|
815
|
+
|
|
816
|
+
const getEls = (data, parent = document.body) => {
|
|
817
|
+
let type = getDataType(data), parentEl = getEl(parent), root = parentEl && parentEl instanceof HTMLTemplateElement ? parentEl.content : (parentEl || document), result = [];
|
|
818
|
+
//data为空直接返回空数组
|
|
819
|
+
if (isEmpty(data)) {
|
|
820
|
+
return result;
|
|
821
|
+
}
|
|
822
|
+
if (type.includes('HTML')) {
|
|
823
|
+
//一个节点
|
|
824
|
+
result.push(data);
|
|
825
|
+
}
|
|
826
|
+
else if (type === 'String') {
|
|
827
|
+
data = data.trim();
|
|
828
|
+
//以英文逗号作为节点选择器分隔符
|
|
829
|
+
result = data.split(',').map((k) => {
|
|
830
|
+
return [...root.querySelectorAll(k)];
|
|
831
|
+
}).flat();
|
|
832
|
+
}
|
|
833
|
+
else if (type === 'Array') {
|
|
834
|
+
result = data.map((k) => {
|
|
835
|
+
return getEl(k, parentEl);
|
|
836
|
+
});
|
|
837
|
+
}
|
|
838
|
+
return result.filter(Boolean);
|
|
839
|
+
};
|
|
840
|
+
|
|
841
|
+
const createEl = (name, attrs, content) => {
|
|
842
|
+
//默认为div
|
|
843
|
+
name = name || 'div';
|
|
844
|
+
//统一大小写
|
|
845
|
+
let rootName = name.toUpperCase().trim(), rootEl = document.createElement(rootName), attrsType = getDataType(attrs), loop = (host, data) => {
|
|
846
|
+
if (data === '' || data === null || data === undefined) {
|
|
847
|
+
//为空、未定义则不再执行
|
|
848
|
+
return false;
|
|
849
|
+
}
|
|
850
|
+
let dataType = getDataType(data);
|
|
851
|
+
//template是DocumentFragment类型不能用insertAdjacentHTML
|
|
852
|
+
if (rootName === 'TEMPLATE') {
|
|
853
|
+
host.innerHTML = data.toString();
|
|
854
|
+
}
|
|
855
|
+
else {
|
|
856
|
+
if (dataType === 'Array' && data.length > 0) {
|
|
857
|
+
//节点数组
|
|
858
|
+
//data.forEach((i: T_obj) => loop(el, i));
|
|
859
|
+
for (let k of data) {
|
|
860
|
+
let childType = getDataType(k);
|
|
861
|
+
if (childType.includes('HTML')) {
|
|
862
|
+
//是个节点
|
|
863
|
+
host.appendChild(k);
|
|
864
|
+
}
|
|
865
|
+
else {
|
|
866
|
+
//是个对象{name:'',attrs:{},content:''}
|
|
867
|
+
let child = createEl(k.name, k.attrs, k.content);
|
|
868
|
+
child && host.appendChild(child);
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
else if (dataType.includes('HTML')) {
|
|
873
|
+
//HTML节点
|
|
874
|
+
host.appendChild(data);
|
|
875
|
+
}
|
|
876
|
+
else if (dataType === 'String' && data.trim().startsWith('#') && data.trim().length > 1) {
|
|
877
|
+
//是字符串且是#id选择器,则取其文本
|
|
878
|
+
let el = getEl(data);
|
|
879
|
+
if (!el)
|
|
880
|
+
return;
|
|
881
|
+
//如果是template模板节点则需要特殊处理
|
|
882
|
+
el.nodeName === 'TEMPLATE' ? host.appendChild(el.content.cloneNode(true)) : host.insertAdjacentHTML('beforeEnd', el.innerHTML);
|
|
883
|
+
}
|
|
884
|
+
else {
|
|
885
|
+
//字符串数字等
|
|
886
|
+
host.insertAdjacentHTML('beforeEnd', data);
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
};
|
|
890
|
+
//添加属性
|
|
891
|
+
if (attrs && attrsType === 'Object') {
|
|
892
|
+
for (let k in attrs) {
|
|
893
|
+
//注意,attrs[k]可能是一个{}或[],不一定是字符串
|
|
894
|
+
// JSON.stringify可以将所有格式的数据都转成文本,会忽略函数和节点数据
|
|
895
|
+
//字符串则不需要stringify,否则会将字符串的引号也一并输出
|
|
896
|
+
attrs.hasOwnProperty(k) && rootEl.setAttribute(k, typeof attrs[k] === 'string' ? attrs[k] : JSON.stringify(attrs[k]));
|
|
897
|
+
}
|
|
898
|
+
}
|
|
899
|
+
//执行循环创建子节点
|
|
900
|
+
loop(rootEl, content);
|
|
901
|
+
return rootEl;
|
|
902
|
+
};
|
|
903
|
+
|
|
742
904
|
const utils = {
|
|
743
905
|
//executeStr,
|
|
744
906
|
getDataType,
|
|
@@ -757,6 +919,9 @@ const utils = {
|
|
|
757
919
|
deepMerge,
|
|
758
920
|
shallowCopy,
|
|
759
921
|
copyObjectWithSymbol,
|
|
922
|
+
getEl,
|
|
923
|
+
getEls,
|
|
924
|
+
createEl,
|
|
760
925
|
};
|
|
761
926
|
|
|
762
927
|
module.exports = utils;
|
package/dist/utils.cjs.min.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @since Last modified:
|
|
2
|
+
* @since Last modified: 2026-1-5 10:34:3
|
|
3
3
|
* @name Utils for web front-end.
|
|
4
|
-
* @version 0.0.
|
|
4
|
+
* @version 0.0.19
|
|
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),a=Object.assign({cloneSet:!0,cloneMap:!0,cloneObject:!0,cloneArray:!0,cloneDate:!0,cloneRegex:!0},t);if(a.interceptor&&"function"==typeof a.interceptor){let t=a.interceptor({input:e,type:r,parent:a.parent});if(t)return t}a.onBeforeClone?.({input:e,type:r,parent:a.parent});let o,n=!0;if("Object"===r&&a.cloneObject){const t={},r=Object.getOwnPropertySymbols(e);for(const r in e)t[r]=deepClone(e[r],a);if(r.length>0)for(const o of r)t[o]=deepClone(e[o],{...a,parent:e});o=t}else if("Array"===r&&a.cloneArray)o=e.map(t=>deepClone(t,{...a,parent:e}));else if("Map"===r&&a.cloneMap){const t=new Map;for(const[r,o]of e)t.set(deepClone(r,a),deepClone(o,{...a,parent:e}));o=t}else if("Set"===r&&a.cloneSet){const t=new Set;for(const r of e)t.add(deepClone(r,{...a,parent:e}));o=t}else if("Date"===r&&a.cloneDate)o=new Date(e.getTime());else if("RegExp"===r&&a.cloneRegex){const t=e;o=new RegExp(t.source,t.flags)}else o=e,n=!1;return a.onAfterClone?.({output:o,input:e,type:r,cloned:n,parent:a.parent}),o},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:a,props:o={}})=>{if(!Array.isArray(e))throw new TypeError("The 'target' parameter must be an array.");a&&!a?.length||(a=arrayMutableMethods);const n={};for(let s of a)n[s]=function(...a){const n={},l=e.length;switch(s){case"push":case"unshift":n.addedItems=[...a];break;case"pop":n.poppedItem=e[l-1];break;case"shift":n.shiftedItem=e[0];break;case"splice":const[t,r]=a,o=t<0?Math.max(l+t,0):Math.min(t,l),s=void 0===r?l-o:r;n.deletedItems=e.slice(o,o+s);break;case"sort":case"reverse":n.oldSnapshot=[...e];break;case"fill":case"copyWithin":const p=a[1]||0,i=void 0===a[2]?l:a[2];n.oldItems=e.slice(p,i),n.start=p,n.end=i}t?.(n);const p=Array.prototype[s].apply(e,a),i={value:p,key:s,args:a,context:n,target:e,...o};return r?.(i),p};return n},requireTypes=(e,t,r)=>{let a=Array.isArray(t)?t:[t],o=getDataType(e),n=o.toLowerCase(),s=a.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,o)}else if(!s.includes(l))throw new TypeError(`Expected data type(s): [${s.join(", ")}], but got: ${l}`);return o},getUniqueId=(e={})=>{const t=e.prefix,r=e.suffix,a=e.base10,o=e.base36;return`${t?t+"-":""}${Date.now()}${o?"-"+Math.random().toString(36).substring(2,11):""}${a?"-"+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:a=setMutableMethods,props:o={}})=>{if(!(e instanceof Set))throw new TypeError("The 'target' parameter must be a Set.");const n={},createWrappedMethod=a=>function(...n){const s={};switch(a){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[a].apply(e,n),p={method:a,result:l,args:n,context:s,target:e,...o};return r(p),l};for(const e of a)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:a=mapMutableMethods,props:o={}})=>{if(!(e instanceof Map))throw new TypeError("The 'target' parameter must be a Map.");const n={},createWrappedMethod=a=>function(...n){const s={};switch(a){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[a].apply(e,n),p={method:a,result:l,args:n,context:s,target:e,...o};return r(p),l};for(const e of a)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 a=Object.assign({dataMode:"clear",inheritMissing:!0,targetClone:!1,useEnable:!0,useSymbol:!0,deepClone:{},onBeforeMerge:void 0,onAfterMerge:void 0},r),smartMerger=(e,t,a)=>{let o,n,s=getDataType(e),l=getDataType(t),p=!0;if(a.interceptor&&"function"==typeof a.interceptor){let r=a.interceptor({target:e,source:t,targetType:s,sourceType:l,parent:a.parent});if(r){if(null===r?.target||null===r?.source)return r;e=r.target,t=r.source}}return a?.onBeforeMerge?.({target:e,source:t,targetType:s,sourceType:l,parent:a.parent}),"Object"===s&&"Object"===l?(n=deepMergeObjects(e,t,a),o="Object"):"Array"===s&&"Array"===l?(n=deepMergeArrays(e,t,a),o="Array"):"Set"===s&&"Set"===l?(n=deepMergeSets(e,t,a),o="Set"):"Map"===s&&"Map"===l?(n=deepMergeMaps(e,t,a),o="Map"):(p=!1,n=e),a?.onAfterMerge?.({result:n,target:e,source:t,targetType:s,sourceType:l,mergeType:o,parent:r.parent}),{result:n,flag:p,mergeType: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 a=getDataType(e),o=getDataType(t);if("Object"!==a||"Object"!==o)return e;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 a=smartMerger(s[e],t[e],{...r,parent:s});a.flag?a.mergeType?"Object"===a.mergeType&&(s[e]=a.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 s},deepMergeArrays=(e,t,r={})=>{if(!Array.isArray(e)||!Array.isArray(t))return e;const a=Object.assign({dataMode:"clear",inheritMissing:!0,targetClone:!1},r),o=a.targetClone?[...e]:e;if("replace"===a.dataMode)for(let e=0;e<t.length&&(a.inheritMissing||!(e>=o.length));e++){smartMerger(o[e],t[e],{...a,parent:o}).flag||(o[e]=t[e])}else"concat"===a.dataMode||(o.length=0),o.push(...t);return o},deepMergeMaps=(e,t,r={})=>{if(!(e instanceof Map&&t instanceof Map))return e;const a=Object.assign({inheritMissing:!0,targetClone:!1,useEnable:!0},r),o=a.targetClone?new Map([...e]):e;for(const[e,n]of t.entries())if(o.has(e)){const t=o.get(e),r=n,s=smartMerger(t,r,a);s.flag?"Object"===s.mergeType&&o.set(e,s.result):o.set(e,r)}else r.inheritMissing&&o.set(e,n);return o},deepMergeSets=(e,t,r={})=>{if(!(e instanceof Set&&t instanceof Set))return e;const a=Object.assign({dataMode:"clear",inheritMissing:!0,targetClone:!1,useEnable:!0},r),o=a.targetClone?new Set(...e):e;if("replace"===a.dataMode){const e=[...o],r=[...t],n=smartMerger(e,r,a);o.clear();for(let e of n.result)o.add(e)}else if("concat"===a.dataMode)for(let e of t)o.add(e);else{o.clear();for(let e of t)o.add(e)}return o};return smartMerger(e,t,a).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;
|
|
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),a=Object.assign({cloneSet:!0,cloneMap:!0,cloneObject:!0,cloneArray:!0,cloneDate:!0,cloneRegex:!0},t);if(a.interceptor&&"function"==typeof a.interceptor){let t=a.interceptor({input:e,type:r,parent:a.parent});if(t)return t}a.onBeforeClone?.({input:e,type:r,parent:a.parent});let n,o=!0;if("Object"===r&&a.cloneObject){const t={},r=Object.getOwnPropertySymbols(e);for(const r in e)t[r]=deepClone(e[r],a);if(r.length>0)for(const n of r)t[n]=deepClone(e[n],{...a,parent:e});n=t}else if("Array"===r&&a.cloneArray)n=e.map(t=>deepClone(t,{...a,parent:e}));else if("Map"===r&&a.cloneMap){const t=new Map;for(const[r,n]of e)t.set(deepClone(r,a),deepClone(n,{...a,parent:e}));n=t}else if("Set"===r&&a.cloneSet){const t=new Set;for(const r of e)t.add(deepClone(r,{...a,parent:e}));n=t}else if("Date"===r&&a.cloneDate)n=new Date(e.getTime());else if("RegExp"===r&&a.cloneRegex){const t=e;n=new RegExp(t.source,t.flags)}else n=e,o=!1;return a.onAfterClone?.({output:n,input:e,type:r,cloned:o,parent:a.parent}),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},arrayMutableMethods=["push","pop","shift","unshift","splice","sort","reverse","copyWithin","fill"],wrapArrayMethods=({target:e,onBeforeMutate:t=()=>{},onAfterMutate:r=()=>{},allowList:a,props:n={}})=>{if(!Array.isArray(e))throw new TypeError("The 'target' parameter must be an array.");a&&!a?.length||(a=arrayMutableMethods);const o={};for(let s of a)o[s]=function(...a){const o={},l=e.length;switch(s){case"push":case"unshift":o.addedItems=[...a];break;case"pop":o.poppedItem=e[l-1];break;case"shift":o.shiftedItem=e[0];break;case"splice":const[t,r]=a,n=t<0?Math.max(l+t,0):Math.min(t,l),s=void 0===r?l-n:r;o.deletedItems=e.slice(n,n+s);break;case"sort":case"reverse":o.oldSnapshot=[...e];break;case"fill":case"copyWithin":const i=a[1]||0,c=void 0===a[2]?l:a[2];o.oldItems=e.slice(i,c),o.start=i,o.end=c}t?.(o);const i=Array.prototype[s].apply(e,a),c={value:i,key:s,args:a,context:o,target:e,...n};return r?.(c),i};return o},requireTypes=(e,t,r)=>{let a=Array.isArray(t)?t:[t],n=getDataType(e),o=n.toLowerCase(),s=a.map(e=>e.toLowerCase()),l=o.includes("html")?"element":o;if(r)try{if(!s.includes(l))throw new TypeError(`Expected data type(s): [${s.join(", ")}], but got: ${l}`)}catch(e){r(e,n)}else if(!s.includes(l))throw new TypeError(`Expected data type(s): [${s.join(", ")}], but got: ${l}`);return n},getUniqueId=(e={})=>{const t=e.prefix,r=e.suffix,a=e.base10,n=e.base36;return`${t?t+"-":""}${Date.now()}${n?"-"+Math.random().toString(36).substring(2,11):""}${a?"-"+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:a=setMutableMethods,props:n={}})=>{if(!(e instanceof Set))throw new TypeError("The 'target' parameter must be a Set.");const o={},createWrappedMethod=a=>function(...o){const s={};switch(a){case"add":{const[t]=o;s.addedItem=t,s.existed=e.has(t);break}case"delete":{const[t]=o;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[a].apply(e,o),i={method:a,result:l,args:o,context:s,target:e,...n};return r(i),l};for(const e of a)setMutableMethods.includes(e)&&(o[e]=createWrappedMethod(e));return Object.defineProperty(o,"target",{get:()=>e,enumerable:!1,configurable:!1}),o},wrapMapMethods=({target:e,onBeforeMutate:t=()=>{},onAfterMutate:r=()=>{},allowList:a=mapMutableMethods,props:n={}})=>{if(!(e instanceof Map))throw new TypeError("The 'target' parameter must be a Map.");const o={},createWrappedMethod=a=>function(...o){const s={};switch(a){case"set":{const[t,r]=o;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]=o;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[a].apply(e,o),i={method:a,result:l,args:o,context:s,target:e,...n};return r(i),l};for(const e of a)mapMutableMethods.includes(e)&&(o[e]=createWrappedMethod(e));return Object.defineProperty(o,"target",{get:()=>e,enumerable:!1,configurable:!1}),o},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 a=Object.assign({dataMode:"clear",inheritMissing:!0,targetClone:!1,useEnable:!0,useSymbol:!0,nullBehavior:"preserve",undefinedBehavior:"preserve",deepClone:{},onBeforeMerge:void 0,onAfterMerge:void 0},r),smartMerger=(e,t,a)=>{let n,o,s=getDataType(e),l=getDataType(t),i=!0;if(a.interceptor&&"function"==typeof a.interceptor){let r=a.interceptor({target:e,source:t,targetType:s,sourceType:l,parent:a.parent});if(r){if(null===r?.target||null===r?.source)return r;e=r.target,t=r.source}}return a?.onBeforeMerge?.({target:e,source:t,targetType:s,sourceType:l,parent:a.parent}),"Object"===s&&"Object"===l?(o=deepMergeObjects(e,t,a),n="Object"):"Array"===s&&"Array"===l?(o=deepMergeArrays(e,t,a),n="Array"):"Set"===s&&"Set"===l?(o=deepMergeSets(e,t,a),n="Set"):"Map"===s&&"Map"===l?(o=deepMergeMaps(e,t,a),n="Map"):(i=!1,o=e),a?.onAfterMerge?.({result:o,target:e,source:t,targetType:s,sourceType:l,mergeType:n,parent:r.parent}),{result:o,flag:i,mergeType:n}},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 a=getDataType(e),n=getDataType(t);if("Object"!==a||"Object"!==n)return e;const o=Object.assign({inheritMissing:!0,targetClone:!1,useEnable:!0},r);let s={};s=o.targetClone?shallowCopy(e):e;for(let e in t){const a=s[e],n=t[e];if(t.hasOwnProperty(e)&&s.hasOwnProperty(e)){const t=smartMerger(a,n,{...r,parent:s});if(t.flag)t.mergeType?"Object"===t.mergeType&&(s[e]=t.result):s[e]=n;else{let t=o.useEnable?mergeEnableObject(a,n):n;a!==t&&null===t?"ignore"===o.nullBehavior||("delete"===o.nullBehavior?Reflect.deleteProperty(s,e):s[e]=t):a!==t&&void 0===t?"ignore"===o.undefinedBehavior||("delete"===o.undefinedBehavior?Reflect.deleteProperty(s,e):s[e]=n):s[e]=n}}else t.hasOwnProperty(e)&&!s.hasOwnProperty(e)&&o.inheritMissing&&(s[e]=n)}if(o.useSymbol){let e=Object.getOwnPropertySymbols(t);if(e.length)for(let r of e)s[r]=t[r]}return s},deepMergeArrays=(e,t,r={})=>{if(!Array.isArray(e)||!Array.isArray(t))return e;const a=Object.assign({dataMode:"clear",inheritMissing:!0,targetClone:!1},r),n=a.targetClone?[...e]:e;if("replace"===a.dataMode)for(let e=0;e<t.length&&(a.inheritMissing||!(e>=n.length));e++){smartMerger(n[e],t[e],{...a,parent:n}).flag||(n[e]=t[e])}else"concat"===a.dataMode||(n.length=0),n.push(...t);return n},deepMergeMaps=(e,t,r={})=>{if(!(e instanceof Map&&t instanceof Map))return e;const a=Object.assign({inheritMissing:!0,targetClone:!1,useEnable:!0},r),n=a.targetClone?new Map([...e]):e;for(const[e,o]of t.entries())if(n.has(e)){const t=n.get(e),r=o,s=smartMerger(t,r,a);s.flag?"Object"===s.mergeType&&n.set(e,s.result):n.set(e,r)}else r.inheritMissing&&n.set(e,o);return n},deepMergeSets=(e,t,r={})=>{if(!(e instanceof Set&&t instanceof Set))return e;const a=Object.assign({dataMode:"clear",inheritMissing:!0,targetClone:!1,useEnable:!0},r),n=a.targetClone?new Set(...e):e;if("replace"===a.dataMode){const e=[...n],r=[...t],o=smartMerger(e,r,a);n.clear();for(let e of o.result)n.add(e)}else if("concat"===a.dataMode)for(let e of t)n.add(e);else{n.clear();for(let e of t)n.add(e)}return n};return smartMerger(e,t,a).result},getEl=(e,t=document.body)=>{let r=getDataType(e),a=getDataType(t).includes("HTML")?t:document.querySelector(t),n=a&&a instanceof HTMLTemplateElement?a.content:a,o=null;if(e)if(r.includes("HTML"))o=e;else if("String"===r)try{o=(n||document).querySelector(e.trim())}catch{o=null}return o},isEmpty=e=>{let t,r=getDataType(e);return t=!e||("Object"===r?0===Object.keys(e).length:"Array"===r?""===e.join(""):"Function"===r?"{}"===e.toString().replace(/\s+/g,"").match(/{.*}/g)[0]:"Symbol"===r?"()"===e.toString().replace(/\s+/g,"").match(/\(.*\)/g)[0]:"Set"===r||"Map"===r?0===e.size:"Date"===r?isNaN(e.getTime()):"RegExp"===r?""===e.source:"ArrayBuffer"===r?0===e.byteLength:"NodeList"===r||"HTMLCollection"===r||"length"in e&&"number"==typeof e.length?0===e.length:"size"in e&&"number"==typeof e.size?0===e.size:"Error"===r||e instanceof Error?""===e.message:!(!r.includes("Array")||!["Uint8Array","Int8Array","Uint16Array","Int16Array","Uint32Array","Int32Array","Float32Array","Float64Array"].includes(r))&&0===e.length),t},getEls=(e,t=document.body)=>{let r=getDataType(e),a=getEl(t),n=a&&a instanceof HTMLTemplateElement?a.content:a||document,o=[];return isEmpty(e)?o:(r.includes("HTML")?o.push(e):"String"===r?o=(e=e.trim()).split(",").map(e=>[...n.querySelectorAll(e)]).flat():"Array"===r&&(o=e.map(e=>getEl(e,a))),o.filter(Boolean))},createEl=(e,t,r)=>{let a=(e=e||"div").toUpperCase().trim(),n=document.createElement(a),o=getDataType(t);if(t&&"Object"===o)for(let e in t)t.hasOwnProperty(e)&&n.setAttribute(e,"string"==typeof t[e]?t[e]:JSON.stringify(t[e]));return((e,t)=>{if(""===t||null==t)return!1;let r=getDataType(t);if("TEMPLATE"===a)e.innerHTML=t.toString();else if("Array"===r&&t.length>0)for(let r of t){if(getDataType(r).includes("HTML"))e.appendChild(r);else{let t=createEl(r.name,r.attrs,r.content);t&&e.appendChild(t)}}else if(r.includes("HTML"))e.appendChild(t);else if("String"===r&&t.trim().startsWith("#")&&t.trim().length>1){let r=getEl(t);if(!r)return;"TEMPLATE"===r.nodeName?e.appendChild(r.content.cloneNode(!0)):e.insertAdjacentHTML("beforeEnd",r.innerHTML)}else e.insertAdjacentHTML("beforeEnd",t)})(n,r),n},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,getEl:getEl,getEls:getEls,createEl:createEl};module.exports=utils;
|
package/dist/utils.esm.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
|
|
2
2
|
/*!
|
|
3
|
-
* @since Last modified:
|
|
3
|
+
* @since Last modified: 2026-1-5 10:34:3
|
|
4
4
|
* @name Utils for web front-end.
|
|
5
|
-
* @version 0.0.
|
|
5
|
+
* @version 0.0.19
|
|
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}
|
|
@@ -512,6 +512,8 @@ const deepMerge = (target, source, opts = {}) => {
|
|
|
512
512
|
// Whether to allow merging key=symbol key-value pairs when target is {} type.
|
|
513
513
|
// target是{}类型时,是否允许合并key=symbol的键值对。
|
|
514
514
|
useSymbol: true,
|
|
515
|
+
nullBehavior: 'preserve',
|
|
516
|
+
undefinedBehavior: 'preserve',
|
|
515
517
|
// Options passed to the deepClone function when targetClone is true
|
|
516
518
|
// 当targetClone为true时传递给deepClone函数的选项
|
|
517
519
|
deepClone: {},
|
|
@@ -600,18 +602,38 @@ const deepMerge = (target, source, opts = {}) => {
|
|
|
600
602
|
// 如果是复制方法,则先复制target
|
|
601
603
|
result = options.targetClone ? shallowCopy(target) : target;
|
|
602
604
|
for (let k in source) {
|
|
605
|
+
const _result = result[k], _source = source[k];
|
|
603
606
|
if (source.hasOwnProperty(k) && result.hasOwnProperty(k)) {
|
|
604
|
-
|
|
607
|
+
const resp = smartMerger(_result, _source, { ...opts, parent: result });
|
|
605
608
|
//resp={result,flag,type}
|
|
606
|
-
//flag=true
|
|
609
|
+
//flag=true表示类型一致(object/array/map/set)并完成了合并,false表示并没有合并需要直接赋值
|
|
607
610
|
if (!resp.flag) {
|
|
608
611
|
//类型不同则直接覆盖
|
|
609
|
-
|
|
610
|
-
|
|
612
|
+
let tmp = options.useEnable ? mergeEnableObject(_result, _source) : _source;
|
|
613
|
+
if (_result !== tmp && tmp === null) {
|
|
614
|
+
if (options.nullBehavior === 'ignore') ;
|
|
615
|
+
else if (options.nullBehavior === 'delete') {
|
|
616
|
+
//删除属性
|
|
617
|
+
Reflect.deleteProperty(result, k);
|
|
618
|
+
}
|
|
619
|
+
else {
|
|
620
|
+
//替换
|
|
621
|
+
result[k] = tmp;
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
else if (_result !== tmp && tmp === undefined) {
|
|
625
|
+
if (options.undefinedBehavior === 'ignore') ;
|
|
626
|
+
else if (options.undefinedBehavior === 'delete') {
|
|
627
|
+
//删除属性
|
|
628
|
+
Reflect.deleteProperty(result, k);
|
|
629
|
+
}
|
|
630
|
+
else {
|
|
631
|
+
//替换
|
|
632
|
+
result[k] = _source;
|
|
633
|
+
}
|
|
611
634
|
}
|
|
612
635
|
else {
|
|
613
|
-
|
|
614
|
-
result[k] = source[k];
|
|
636
|
+
result[k] = _source;
|
|
615
637
|
}
|
|
616
638
|
}
|
|
617
639
|
else {
|
|
@@ -624,13 +646,13 @@ const deepMerge = (target, source, opts = {}) => {
|
|
|
624
646
|
}
|
|
625
647
|
else {
|
|
626
648
|
//其他类型则直接覆盖
|
|
627
|
-
result[k] =
|
|
649
|
+
result[k] = _source;
|
|
628
650
|
}
|
|
629
651
|
}
|
|
630
652
|
}
|
|
631
653
|
else if (source.hasOwnProperty(k) && !result.hasOwnProperty(k) && options.inheritMissing) {
|
|
632
654
|
//如果source有属性,result没有该属性,但是options允许追加属性则直接赋值
|
|
633
|
-
result[k] =
|
|
655
|
+
result[k] = _source;
|
|
634
656
|
}
|
|
635
657
|
}
|
|
636
658
|
//Symbol键直接追加,因为Symbol是唯一,结果同Object.assign
|
|
@@ -737,6 +759,146 @@ const deepMerge = (target, source, opts = {}) => {
|
|
|
737
759
|
return smartMerger(target, source, options).result;
|
|
738
760
|
};
|
|
739
761
|
|
|
762
|
+
const getEl = (obj, wrap = document.body) => {
|
|
763
|
+
let objType = getDataType(obj), parType = getDataType(wrap), parent = parType.includes('HTML') ? wrap : document.querySelector(wrap),
|
|
764
|
+
//如果parent是template节点,需要通过node.content.querySelector取得子节点
|
|
765
|
+
root = parent && parent instanceof HTMLTemplateElement ? parent.content : parent, result = null;
|
|
766
|
+
if (obj) {
|
|
767
|
+
if (objType.includes('HTML')) {
|
|
768
|
+
result = obj;
|
|
769
|
+
}
|
|
770
|
+
else if (objType === 'String') {
|
|
771
|
+
try {
|
|
772
|
+
result = (root || document).querySelector(obj.trim());
|
|
773
|
+
//可能会报错,报错则返回null
|
|
774
|
+
}
|
|
775
|
+
catch {
|
|
776
|
+
result = null;
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
return result;
|
|
781
|
+
};
|
|
782
|
+
|
|
783
|
+
const isEmpty = (data) => {
|
|
784
|
+
let type = getDataType(data), flag;
|
|
785
|
+
if (!data) {
|
|
786
|
+
//0,'',false,undefined,null
|
|
787
|
+
flag = true;
|
|
788
|
+
}
|
|
789
|
+
else {
|
|
790
|
+
//function(){}|()=>{}
|
|
791
|
+
//[null]|[undefined]|['']|[""]
|
|
792
|
+
//[]|{}
|
|
793
|
+
//Symbol()|Symbol.for()
|
|
794
|
+
//Set,Map
|
|
795
|
+
//Date/Regex
|
|
796
|
+
flag = (type === 'Object') ? (Object.keys(data).length === 0) :
|
|
797
|
+
(type === 'Array') ? data.join('') === '' :
|
|
798
|
+
(type === 'Function') ? (data.toString().replace(/\s+/g, '').match(/{.*}/g)[0] === '{}') :
|
|
799
|
+
(type === 'Symbol') ? (data.toString().replace(/\s+/g, '').match(/\(.*\)/g)[0] === '()') :
|
|
800
|
+
(type === 'Set' || type === 'Map') ? data.size === 0 :
|
|
801
|
+
type === 'Date' ? isNaN(data.getTime()) :
|
|
802
|
+
type === 'RegExp' ? data.source === '' :
|
|
803
|
+
type === 'ArrayBuffer' ? data.byteLength === 0 :
|
|
804
|
+
(type === 'NodeList' || type === 'HTMLCollection') ? data.length === 0 :
|
|
805
|
+
('length' in data && typeof data.length === 'number') ? data.length === 0 :
|
|
806
|
+
('size' in data && typeof data.size === 'number') ? data.size === 0 :
|
|
807
|
+
(type === 'Error' || data instanceof Error) ? data.message === '' :
|
|
808
|
+
(type.includes('Array') && (['Uint8Array', 'Int8Array', 'Uint16Array', 'Int16Array', 'Uint32Array', 'Int32Array', 'Float32Array', 'Float64Array'].includes(type))) ? data.length === 0 :
|
|
809
|
+
false;
|
|
810
|
+
}
|
|
811
|
+
return flag;
|
|
812
|
+
};
|
|
813
|
+
|
|
814
|
+
const getEls = (data, parent = document.body) => {
|
|
815
|
+
let type = getDataType(data), parentEl = getEl(parent), root = parentEl && parentEl instanceof HTMLTemplateElement ? parentEl.content : (parentEl || document), result = [];
|
|
816
|
+
//data为空直接返回空数组
|
|
817
|
+
if (isEmpty(data)) {
|
|
818
|
+
return result;
|
|
819
|
+
}
|
|
820
|
+
if (type.includes('HTML')) {
|
|
821
|
+
//一个节点
|
|
822
|
+
result.push(data);
|
|
823
|
+
}
|
|
824
|
+
else if (type === 'String') {
|
|
825
|
+
data = data.trim();
|
|
826
|
+
//以英文逗号作为节点选择器分隔符
|
|
827
|
+
result = data.split(',').map((k) => {
|
|
828
|
+
return [...root.querySelectorAll(k)];
|
|
829
|
+
}).flat();
|
|
830
|
+
}
|
|
831
|
+
else if (type === 'Array') {
|
|
832
|
+
result = data.map((k) => {
|
|
833
|
+
return getEl(k, parentEl);
|
|
834
|
+
});
|
|
835
|
+
}
|
|
836
|
+
return result.filter(Boolean);
|
|
837
|
+
};
|
|
838
|
+
|
|
839
|
+
const createEl = (name, attrs, content) => {
|
|
840
|
+
//默认为div
|
|
841
|
+
name = name || 'div';
|
|
842
|
+
//统一大小写
|
|
843
|
+
let rootName = name.toUpperCase().trim(), rootEl = document.createElement(rootName), attrsType = getDataType(attrs), loop = (host, data) => {
|
|
844
|
+
if (data === '' || data === null || data === undefined) {
|
|
845
|
+
//为空、未定义则不再执行
|
|
846
|
+
return false;
|
|
847
|
+
}
|
|
848
|
+
let dataType = getDataType(data);
|
|
849
|
+
//template是DocumentFragment类型不能用insertAdjacentHTML
|
|
850
|
+
if (rootName === 'TEMPLATE') {
|
|
851
|
+
host.innerHTML = data.toString();
|
|
852
|
+
}
|
|
853
|
+
else {
|
|
854
|
+
if (dataType === 'Array' && data.length > 0) {
|
|
855
|
+
//节点数组
|
|
856
|
+
//data.forEach((i: T_obj) => loop(el, i));
|
|
857
|
+
for (let k of data) {
|
|
858
|
+
let childType = getDataType(k);
|
|
859
|
+
if (childType.includes('HTML')) {
|
|
860
|
+
//是个节点
|
|
861
|
+
host.appendChild(k);
|
|
862
|
+
}
|
|
863
|
+
else {
|
|
864
|
+
//是个对象{name:'',attrs:{},content:''}
|
|
865
|
+
let child = createEl(k.name, k.attrs, k.content);
|
|
866
|
+
child && host.appendChild(child);
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
}
|
|
870
|
+
else if (dataType.includes('HTML')) {
|
|
871
|
+
//HTML节点
|
|
872
|
+
host.appendChild(data);
|
|
873
|
+
}
|
|
874
|
+
else if (dataType === 'String' && data.trim().startsWith('#') && data.trim().length > 1) {
|
|
875
|
+
//是字符串且是#id选择器,则取其文本
|
|
876
|
+
let el = getEl(data);
|
|
877
|
+
if (!el)
|
|
878
|
+
return;
|
|
879
|
+
//如果是template模板节点则需要特殊处理
|
|
880
|
+
el.nodeName === 'TEMPLATE' ? host.appendChild(el.content.cloneNode(true)) : host.insertAdjacentHTML('beforeEnd', el.innerHTML);
|
|
881
|
+
}
|
|
882
|
+
else {
|
|
883
|
+
//字符串数字等
|
|
884
|
+
host.insertAdjacentHTML('beforeEnd', data);
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
};
|
|
888
|
+
//添加属性
|
|
889
|
+
if (attrs && attrsType === 'Object') {
|
|
890
|
+
for (let k in attrs) {
|
|
891
|
+
//注意,attrs[k]可能是一个{}或[],不一定是字符串
|
|
892
|
+
// JSON.stringify可以将所有格式的数据都转成文本,会忽略函数和节点数据
|
|
893
|
+
//字符串则不需要stringify,否则会将字符串的引号也一并输出
|
|
894
|
+
attrs.hasOwnProperty(k) && rootEl.setAttribute(k, typeof attrs[k] === 'string' ? attrs[k] : JSON.stringify(attrs[k]));
|
|
895
|
+
}
|
|
896
|
+
}
|
|
897
|
+
//执行循环创建子节点
|
|
898
|
+
loop(rootEl, content);
|
|
899
|
+
return rootEl;
|
|
900
|
+
};
|
|
901
|
+
|
|
740
902
|
const utils = {
|
|
741
903
|
//executeStr,
|
|
742
904
|
getDataType,
|
|
@@ -755,6 +917,9 @@ const utils = {
|
|
|
755
917
|
deepMerge,
|
|
756
918
|
shallowCopy,
|
|
757
919
|
copyObjectWithSymbol,
|
|
920
|
+
getEl,
|
|
921
|
+
getEls,
|
|
922
|
+
createEl,
|
|
758
923
|
};
|
|
759
924
|
|
|
760
925
|
export { utils as default };
|
package/dist/utils.esm.min.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @since Last modified:
|
|
2
|
+
* @since Last modified: 2026-1-5 10:34:3
|
|
3
3
|
* @name Utils for web front-end.
|
|
4
|
-
* @version 0.0.
|
|
4
|
+
* @version 0.0.19
|
|
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),a=Object.assign({cloneSet:!0,cloneMap:!0,cloneObject:!0,cloneArray:!0,cloneDate:!0,cloneRegex:!0},t);if(a.interceptor&&"function"==typeof a.interceptor){let t=a.interceptor({input:e,type:r,parent:a.parent});if(t)return t}a.onBeforeClone?.({input:e,type:r,parent:a.parent});let o,n=!0;if("Object"===r&&a.cloneObject){const t={},r=Object.getOwnPropertySymbols(e);for(const r in e)t[r]=deepClone(e[r],a);if(r.length>0)for(const o of r)t[o]=deepClone(e[o],{...a,parent:e});o=t}else if("Array"===r&&a.cloneArray)o=e.map(t=>deepClone(t,{...a,parent:e}));else if("Map"===r&&a.cloneMap){const t=new Map;for(const[r,o]of e)t.set(deepClone(r,a),deepClone(o,{...a,parent:e}));o=t}else if("Set"===r&&a.cloneSet){const t=new Set;for(const r of e)t.add(deepClone(r,{...a,parent:e}));o=t}else if("Date"===r&&a.cloneDate)o=new Date(e.getTime());else if("RegExp"===r&&a.cloneRegex){const t=e;o=new RegExp(t.source,t.flags)}else o=e,n=!1;return a.onAfterClone?.({output:o,input:e,type:r,cloned:n,parent:a.parent}),o},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:a,props:o={}})=>{if(!Array.isArray(e))throw new TypeError("The 'target' parameter must be an array.");a&&!a?.length||(a=arrayMutableMethods);const n={};for(let s of a)n[s]=function(...a){const n={},l=e.length;switch(s){case"push":case"unshift":n.addedItems=[...a];break;case"pop":n.poppedItem=e[l-1];break;case"shift":n.shiftedItem=e[0];break;case"splice":const[t,r]=a,o=t<0?Math.max(l+t,0):Math.min(t,l),s=void 0===r?l-o:r;n.deletedItems=e.slice(o,o+s);break;case"sort":case"reverse":n.oldSnapshot=[...e];break;case"fill":case"copyWithin":const p=a[1]||0,i=void 0===a[2]?l:a[2];n.oldItems=e.slice(p,i),n.start=p,n.end=i}t?.(n);const p=Array.prototype[s].apply(e,a),i={value:p,key:s,args:a,context:n,target:e,...o};return r?.(i),p};return n},requireTypes=(e,t,r)=>{let a=Array.isArray(t)?t:[t],o=getDataType(e),n=o.toLowerCase(),s=a.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,o)}else if(!s.includes(l))throw new TypeError(`Expected data type(s): [${s.join(", ")}], but got: ${l}`);return o},getUniqueId=(e={})=>{const t=e.prefix,r=e.suffix,a=e.base10,o=e.base36;return`${t?t+"-":""}${Date.now()}${o?"-"+Math.random().toString(36).substring(2,11):""}${a?"-"+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:a=setMutableMethods,props:o={}})=>{if(!(e instanceof Set))throw new TypeError("The 'target' parameter must be a Set.");const n={},createWrappedMethod=a=>function(...n){const s={};switch(a){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[a].apply(e,n),p={method:a,result:l,args:n,context:s,target:e,...o};return r(p),l};for(const e of a)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:a=mapMutableMethods,props:o={}})=>{if(!(e instanceof Map))throw new TypeError("The 'target' parameter must be a Map.");const n={},createWrappedMethod=a=>function(...n){const s={};switch(a){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[a].apply(e,n),p={method:a,result:l,args:n,context:s,target:e,...o};return r(p),l};for(const e of a)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 a=Object.assign({dataMode:"clear",inheritMissing:!0,targetClone:!1,useEnable:!0,useSymbol:!0,deepClone:{},onBeforeMerge:void 0,onAfterMerge:void 0},r),smartMerger=(e,t,a)=>{let o,n,s=getDataType(e),l=getDataType(t),p=!0;if(a.interceptor&&"function"==typeof a.interceptor){let r=a.interceptor({target:e,source:t,targetType:s,sourceType:l,parent:a.parent});if(r){if(null===r?.target||null===r?.source)return r;e=r.target,t=r.source}}return a?.onBeforeMerge?.({target:e,source:t,targetType:s,sourceType:l,parent:a.parent}),"Object"===s&&"Object"===l?(n=deepMergeObjects(e,t,a),o="Object"):"Array"===s&&"Array"===l?(n=deepMergeArrays(e,t,a),o="Array"):"Set"===s&&"Set"===l?(n=deepMergeSets(e,t,a),o="Set"):"Map"===s&&"Map"===l?(n=deepMergeMaps(e,t,a),o="Map"):(p=!1,n=e),a?.onAfterMerge?.({result:n,target:e,source:t,targetType:s,sourceType:l,mergeType:o,parent:r.parent}),{result:n,flag:p,mergeType: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 a=getDataType(e),o=getDataType(t);if("Object"!==a||"Object"!==o)return e;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 a=smartMerger(s[e],t[e],{...r,parent:s});a.flag?a.mergeType?"Object"===a.mergeType&&(s[e]=a.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 s},deepMergeArrays=(e,t,r={})=>{if(!Array.isArray(e)||!Array.isArray(t))return e;const a=Object.assign({dataMode:"clear",inheritMissing:!0,targetClone:!1},r),o=a.targetClone?[...e]:e;if("replace"===a.dataMode)for(let e=0;e<t.length&&(a.inheritMissing||!(e>=o.length));e++){smartMerger(o[e],t[e],{...a,parent:o}).flag||(o[e]=t[e])}else"concat"===a.dataMode||(o.length=0),o.push(...t);return o},deepMergeMaps=(e,t,r={})=>{if(!(e instanceof Map&&t instanceof Map))return e;const a=Object.assign({inheritMissing:!0,targetClone:!1,useEnable:!0},r),o=a.targetClone?new Map([...e]):e;for(const[e,n]of t.entries())if(o.has(e)){const t=o.get(e),r=n,s=smartMerger(t,r,a);s.flag?"Object"===s.mergeType&&o.set(e,s.result):o.set(e,r)}else r.inheritMissing&&o.set(e,n);return o},deepMergeSets=(e,t,r={})=>{if(!(e instanceof Set&&t instanceof Set))return e;const a=Object.assign({dataMode:"clear",inheritMissing:!0,targetClone:!1,useEnable:!0},r),o=a.targetClone?new Set(...e):e;if("replace"===a.dataMode){const e=[...o],r=[...t],n=smartMerger(e,r,a);o.clear();for(let e of n.result)o.add(e)}else if("concat"===a.dataMode)for(let e of t)o.add(e);else{o.clear();for(let e of t)o.add(e)}return o};return smartMerger(e,t,a).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};
|
|
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),a=Object.assign({cloneSet:!0,cloneMap:!0,cloneObject:!0,cloneArray:!0,cloneDate:!0,cloneRegex:!0},t);if(a.interceptor&&"function"==typeof a.interceptor){let t=a.interceptor({input:e,type:r,parent:a.parent});if(t)return t}a.onBeforeClone?.({input:e,type:r,parent:a.parent});let n,o=!0;if("Object"===r&&a.cloneObject){const t={},r=Object.getOwnPropertySymbols(e);for(const r in e)t[r]=deepClone(e[r],a);if(r.length>0)for(const n of r)t[n]=deepClone(e[n],{...a,parent:e});n=t}else if("Array"===r&&a.cloneArray)n=e.map(t=>deepClone(t,{...a,parent:e}));else if("Map"===r&&a.cloneMap){const t=new Map;for(const[r,n]of e)t.set(deepClone(r,a),deepClone(n,{...a,parent:e}));n=t}else if("Set"===r&&a.cloneSet){const t=new Set;for(const r of e)t.add(deepClone(r,{...a,parent:e}));n=t}else if("Date"===r&&a.cloneDate)n=new Date(e.getTime());else if("RegExp"===r&&a.cloneRegex){const t=e;n=new RegExp(t.source,t.flags)}else n=e,o=!1;return a.onAfterClone?.({output:n,input:e,type:r,cloned:o,parent:a.parent}),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},arrayMutableMethods=["push","pop","shift","unshift","splice","sort","reverse","copyWithin","fill"],wrapArrayMethods=({target:e,onBeforeMutate:t=()=>{},onAfterMutate:r=()=>{},allowList:a,props:n={}})=>{if(!Array.isArray(e))throw new TypeError("The 'target' parameter must be an array.");a&&!a?.length||(a=arrayMutableMethods);const o={};for(let s of a)o[s]=function(...a){const o={},l=e.length;switch(s){case"push":case"unshift":o.addedItems=[...a];break;case"pop":o.poppedItem=e[l-1];break;case"shift":o.shiftedItem=e[0];break;case"splice":const[t,r]=a,n=t<0?Math.max(l+t,0):Math.min(t,l),s=void 0===r?l-n:r;o.deletedItems=e.slice(n,n+s);break;case"sort":case"reverse":o.oldSnapshot=[...e];break;case"fill":case"copyWithin":const i=a[1]||0,c=void 0===a[2]?l:a[2];o.oldItems=e.slice(i,c),o.start=i,o.end=c}t?.(o);const i=Array.prototype[s].apply(e,a),c={value:i,key:s,args:a,context:o,target:e,...n};return r?.(c),i};return o},requireTypes=(e,t,r)=>{let a=Array.isArray(t)?t:[t],n=getDataType(e),o=n.toLowerCase(),s=a.map(e=>e.toLowerCase()),l=o.includes("html")?"element":o;if(r)try{if(!s.includes(l))throw new TypeError(`Expected data type(s): [${s.join(", ")}], but got: ${l}`)}catch(e){r(e,n)}else if(!s.includes(l))throw new TypeError(`Expected data type(s): [${s.join(", ")}], but got: ${l}`);return n},getUniqueId=(e={})=>{const t=e.prefix,r=e.suffix,a=e.base10,n=e.base36;return`${t?t+"-":""}${Date.now()}${n?"-"+Math.random().toString(36).substring(2,11):""}${a?"-"+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:a=setMutableMethods,props:n={}})=>{if(!(e instanceof Set))throw new TypeError("The 'target' parameter must be a Set.");const o={},createWrappedMethod=a=>function(...o){const s={};switch(a){case"add":{const[t]=o;s.addedItem=t,s.existed=e.has(t);break}case"delete":{const[t]=o;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[a].apply(e,o),i={method:a,result:l,args:o,context:s,target:e,...n};return r(i),l};for(const e of a)setMutableMethods.includes(e)&&(o[e]=createWrappedMethod(e));return Object.defineProperty(o,"target",{get:()=>e,enumerable:!1,configurable:!1}),o},wrapMapMethods=({target:e,onBeforeMutate:t=()=>{},onAfterMutate:r=()=>{},allowList:a=mapMutableMethods,props:n={}})=>{if(!(e instanceof Map))throw new TypeError("The 'target' parameter must be a Map.");const o={},createWrappedMethod=a=>function(...o){const s={};switch(a){case"set":{const[t,r]=o;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]=o;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[a].apply(e,o),i={method:a,result:l,args:o,context:s,target:e,...n};return r(i),l};for(const e of a)mapMutableMethods.includes(e)&&(o[e]=createWrappedMethod(e));return Object.defineProperty(o,"target",{get:()=>e,enumerable:!1,configurable:!1}),o},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 a=Object.assign({dataMode:"clear",inheritMissing:!0,targetClone:!1,useEnable:!0,useSymbol:!0,nullBehavior:"preserve",undefinedBehavior:"preserve",deepClone:{},onBeforeMerge:void 0,onAfterMerge:void 0},r),smartMerger=(e,t,a)=>{let n,o,s=getDataType(e),l=getDataType(t),i=!0;if(a.interceptor&&"function"==typeof a.interceptor){let r=a.interceptor({target:e,source:t,targetType:s,sourceType:l,parent:a.parent});if(r){if(null===r?.target||null===r?.source)return r;e=r.target,t=r.source}}return a?.onBeforeMerge?.({target:e,source:t,targetType:s,sourceType:l,parent:a.parent}),"Object"===s&&"Object"===l?(o=deepMergeObjects(e,t,a),n="Object"):"Array"===s&&"Array"===l?(o=deepMergeArrays(e,t,a),n="Array"):"Set"===s&&"Set"===l?(o=deepMergeSets(e,t,a),n="Set"):"Map"===s&&"Map"===l?(o=deepMergeMaps(e,t,a),n="Map"):(i=!1,o=e),a?.onAfterMerge?.({result:o,target:e,source:t,targetType:s,sourceType:l,mergeType:n,parent:r.parent}),{result:o,flag:i,mergeType:n}},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 a=getDataType(e),n=getDataType(t);if("Object"!==a||"Object"!==n)return e;const o=Object.assign({inheritMissing:!0,targetClone:!1,useEnable:!0},r);let s={};s=o.targetClone?shallowCopy(e):e;for(let e in t){const a=s[e],n=t[e];if(t.hasOwnProperty(e)&&s.hasOwnProperty(e)){const t=smartMerger(a,n,{...r,parent:s});if(t.flag)t.mergeType?"Object"===t.mergeType&&(s[e]=t.result):s[e]=n;else{let t=o.useEnable?mergeEnableObject(a,n):n;a!==t&&null===t?"ignore"===o.nullBehavior||("delete"===o.nullBehavior?Reflect.deleteProperty(s,e):s[e]=t):a!==t&&void 0===t?"ignore"===o.undefinedBehavior||("delete"===o.undefinedBehavior?Reflect.deleteProperty(s,e):s[e]=n):s[e]=n}}else t.hasOwnProperty(e)&&!s.hasOwnProperty(e)&&o.inheritMissing&&(s[e]=n)}if(o.useSymbol){let e=Object.getOwnPropertySymbols(t);if(e.length)for(let r of e)s[r]=t[r]}return s},deepMergeArrays=(e,t,r={})=>{if(!Array.isArray(e)||!Array.isArray(t))return e;const a=Object.assign({dataMode:"clear",inheritMissing:!0,targetClone:!1},r),n=a.targetClone?[...e]:e;if("replace"===a.dataMode)for(let e=0;e<t.length&&(a.inheritMissing||!(e>=n.length));e++){smartMerger(n[e],t[e],{...a,parent:n}).flag||(n[e]=t[e])}else"concat"===a.dataMode||(n.length=0),n.push(...t);return n},deepMergeMaps=(e,t,r={})=>{if(!(e instanceof Map&&t instanceof Map))return e;const a=Object.assign({inheritMissing:!0,targetClone:!1,useEnable:!0},r),n=a.targetClone?new Map([...e]):e;for(const[e,o]of t.entries())if(n.has(e)){const t=n.get(e),r=o,s=smartMerger(t,r,a);s.flag?"Object"===s.mergeType&&n.set(e,s.result):n.set(e,r)}else r.inheritMissing&&n.set(e,o);return n},deepMergeSets=(e,t,r={})=>{if(!(e instanceof Set&&t instanceof Set))return e;const a=Object.assign({dataMode:"clear",inheritMissing:!0,targetClone:!1,useEnable:!0},r),n=a.targetClone?new Set(...e):e;if("replace"===a.dataMode){const e=[...n],r=[...t],o=smartMerger(e,r,a);n.clear();for(let e of o.result)n.add(e)}else if("concat"===a.dataMode)for(let e of t)n.add(e);else{n.clear();for(let e of t)n.add(e)}return n};return smartMerger(e,t,a).result},getEl=(e,t=document.body)=>{let r=getDataType(e),a=getDataType(t).includes("HTML")?t:document.querySelector(t),n=a&&a instanceof HTMLTemplateElement?a.content:a,o=null;if(e)if(r.includes("HTML"))o=e;else if("String"===r)try{o=(n||document).querySelector(e.trim())}catch{o=null}return o},isEmpty=e=>{let t,r=getDataType(e);return t=!e||("Object"===r?0===Object.keys(e).length:"Array"===r?""===e.join(""):"Function"===r?"{}"===e.toString().replace(/\s+/g,"").match(/{.*}/g)[0]:"Symbol"===r?"()"===e.toString().replace(/\s+/g,"").match(/\(.*\)/g)[0]:"Set"===r||"Map"===r?0===e.size:"Date"===r?isNaN(e.getTime()):"RegExp"===r?""===e.source:"ArrayBuffer"===r?0===e.byteLength:"NodeList"===r||"HTMLCollection"===r||"length"in e&&"number"==typeof e.length?0===e.length:"size"in e&&"number"==typeof e.size?0===e.size:"Error"===r||e instanceof Error?""===e.message:!(!r.includes("Array")||!["Uint8Array","Int8Array","Uint16Array","Int16Array","Uint32Array","Int32Array","Float32Array","Float64Array"].includes(r))&&0===e.length),t},getEls=(e,t=document.body)=>{let r=getDataType(e),a=getEl(t),n=a&&a instanceof HTMLTemplateElement?a.content:a||document,o=[];return isEmpty(e)?o:(r.includes("HTML")?o.push(e):"String"===r?o=(e=e.trim()).split(",").map(e=>[...n.querySelectorAll(e)]).flat():"Array"===r&&(o=e.map(e=>getEl(e,a))),o.filter(Boolean))},createEl=(e,t,r)=>{let a=(e=e||"div").toUpperCase().trim(),n=document.createElement(a),o=getDataType(t);if(t&&"Object"===o)for(let e in t)t.hasOwnProperty(e)&&n.setAttribute(e,"string"==typeof t[e]?t[e]:JSON.stringify(t[e]));return((e,t)=>{if(""===t||null==t)return!1;let r=getDataType(t);if("TEMPLATE"===a)e.innerHTML=t.toString();else if("Array"===r&&t.length>0)for(let r of t){if(getDataType(r).includes("HTML"))e.appendChild(r);else{let t=createEl(r.name,r.attrs,r.content);t&&e.appendChild(t)}}else if(r.includes("HTML"))e.appendChild(t);else if("String"===r&&t.trim().startsWith("#")&&t.trim().length>1){let r=getEl(t);if(!r)return;"TEMPLATE"===r.nodeName?e.appendChild(r.content.cloneNode(!0)):e.insertAdjacentHTML("beforeEnd",r.innerHTML)}else e.insertAdjacentHTML("beforeEnd",t)})(n,r),n},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,getEl:getEl,getEls:getEls,createEl:createEl};export{utils as default};
|