@codady/utils 0.0.39 → 0.0.40
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 +21 -2
- package/dist/utils.cjs.js +110 -7
- package/dist/utils.cjs.min.js +3 -3
- package/dist/utils.esm.js +110 -7
- package/dist/utils.esm.min.js +3 -3
- package/dist/utils.umd.js +110 -7
- package/dist/utils.umd.min.js +3 -3
- package/dist.zip +0 -0
- package/examples/ajax-download.html +94 -0
- package/examples/ajax-hook.html +2 -2
- package/examples/ajax-signal.html +91 -0
- package/examples/ajax-timeout.html +85 -0
- package/examples/stringToEncodings-collision-test-registry.html +117 -0
- package/examples/stringToEncodings-collision-test.html +71 -0
- package/examples/stringToEncodings.html +138 -0
- package/examples/unicodeToEncodings.html +195 -0
- package/modules.js +5 -1
- package/modules.ts +5 -1
- package/package.json +1 -1
- package/src/ajax.js +23 -6
- package/src/ajax.ts +30 -10
- package/src/stringToEncodings.js +56 -0
- package/src/stringToEncodings.ts +110 -0
- package/src/unicodeToEncodings.js +51 -0
- package/src/unicodeToEncodings.ts +55 -0
- package/src/arrayMutableMethods - /345/211/257/346/234/254.js" +0 -5
- package/src/capitalize - /345/211/257/346/234/254.js" +0 -19
- package/src/comma - /345/211/257/346/234/254.js" +0 -2
- package/src/deepCloneToJSON - /345/211/257/346/234/254.js" +0 -47
- package/src/deepMergeMaps - /345/211/257/346/234/254.js" +0 -78
- package/src/escapeHTML - /345/211/257/346/234/254.js" +0 -29
- package/src/getDataType - /345/211/257/346/234/254.js" +0 -38
- package/src/isEmpty - /345/211/257/346/234/254.js" +0 -45
- package/src/mapMutableMethods - /345/211/257/346/234/254.js" +0 -5
- package/src/setMutableMethods - /345/211/257/346/234/254.js" +0 -5
- package/src/wrapMap - /345/211/257/346/234/254.js" +0 -119
package/CHANGELOG.md
CHANGED
|
@@ -2,11 +2,30 @@
|
|
|
2
2
|
|
|
3
3
|
All changes to Utils including new features, updates, and removals are documented here.
|
|
4
4
|
|
|
5
|
+
|
|
6
|
+
## [v0.0.40] - 2026-1-20
|
|
7
|
+
|
|
8
|
+
### Distribution Files
|
|
9
|
+
* **JS**: https://unpkg.com/@codady/utils@0.0.40/dist/js/utils.js
|
|
10
|
+
* **Zip**:https://unpkg.com/@codady/utils@0.0.40/dist.zip
|
|
11
|
+
|
|
12
|
+
### Changes
|
|
13
|
+
|
|
14
|
+
#### Fixed
|
|
15
|
+
* Null
|
|
16
|
+
|
|
17
|
+
#### Added
|
|
18
|
+
* Added the functions `stringToEncodings`、`unicodeToEncodings`.新增 `stringToEncodings`、`unicodeToEncodings`函数。
|
|
19
|
+
|
|
20
|
+
#### Removed
|
|
21
|
+
* Null
|
|
22
|
+
|
|
23
|
+
|
|
5
24
|
## [v0.0.39] - 2026-1-20
|
|
6
25
|
|
|
7
26
|
### Distribution Files
|
|
8
|
-
* **JS**: https://unpkg.com/@codady/utils@0.0.
|
|
9
|
-
* **Zip**:https://unpkg.com/@codady/utils@0.0.
|
|
27
|
+
* **JS**: https://unpkg.com/@codady/utils@0.0.39/dist/js/utils.js
|
|
28
|
+
* **Zip**:https://unpkg.com/@codady/utils@0.0.39/dist.zip
|
|
10
29
|
|
|
11
30
|
### Changes
|
|
12
31
|
|
package/dist/utils.cjs.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
|
|
2
2
|
/*!
|
|
3
|
-
* @since Last modified: 2026-
|
|
3
|
+
* @since Last modified: 2026-2-5 17:4:41
|
|
4
4
|
* @name Utils for web front-end.
|
|
5
|
-
* @version 0.0.
|
|
5
|
+
* @version 0.0.40
|
|
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}
|
|
@@ -1461,6 +1461,7 @@ const ajax = (options) => {
|
|
|
1461
1461
|
signal: null,
|
|
1462
1462
|
xhrFields: {},
|
|
1463
1463
|
cacheBustKey: '_t',
|
|
1464
|
+
precision: 2,
|
|
1464
1465
|
//
|
|
1465
1466
|
onAbort: null,
|
|
1466
1467
|
onTimeout: null,
|
|
@@ -1565,6 +1566,10 @@ const ajax = (options) => {
|
|
|
1565
1566
|
config?.onTimeout?.(resp);
|
|
1566
1567
|
//reject只能接受一个参数
|
|
1567
1568
|
config.catchError ? reject(resp) : resolve(resp);
|
|
1569
|
+
//超时也是不能获得数据的行为,定义为failure
|
|
1570
|
+
config?.onFailure?.(resp);
|
|
1571
|
+
//timeout会经过onreadystatechange,但是被及时的return了,所以这里多加一行
|
|
1572
|
+
config?.onFinish?.(resp);
|
|
1568
1573
|
},
|
|
1569
1574
|
//报错监听
|
|
1570
1575
|
errorHandler = (resp) => {
|
|
@@ -1590,6 +1595,8 @@ const ajax = (options) => {
|
|
|
1590
1595
|
config.catchError ? reject(resp) : resolve(resp);
|
|
1591
1596
|
//回调,status和content在此确认
|
|
1592
1597
|
config?.onAbort?.(resp);
|
|
1598
|
+
//abort行为不会经过onreadystatechange,这里需要多这一行以表示xhr的完成(结束)
|
|
1599
|
+
config?.onFinish?.(resp);
|
|
1593
1600
|
}, abortHandlerWithSignal = () => {
|
|
1594
1601
|
//先中止请求,防止触发其他 readystate 事件
|
|
1595
1602
|
xhr.abort();
|
|
@@ -1633,23 +1640,26 @@ const ajax = (options) => {
|
|
|
1633
1640
|
type: 'unset',
|
|
1634
1641
|
//上传和下载进度
|
|
1635
1642
|
progress: {}
|
|
1643
|
+
}, getProgressValues = (ratio) => {
|
|
1644
|
+
let text = (ratio * 100).toFixed(config.precision);
|
|
1645
|
+
return { percent: parseFloat(text), text };
|
|
1636
1646
|
},
|
|
1637
1647
|
//定义进度函数
|
|
1638
1648
|
progressHandler = (name, data, callback) => {
|
|
1639
1649
|
if (data.lengthComputable) {
|
|
1640
|
-
const resp = { ...context, status: xhr.status }, ratio = data.loaded / data.total;
|
|
1650
|
+
const resp = { ...context, status: xhr.status }, ratio = data.loaded / data.total, { percent, text } = getProgressValues(ratio);
|
|
1641
1651
|
resp.progress = {
|
|
1642
1652
|
name,
|
|
1643
1653
|
loaded: data.loaded,
|
|
1644
1654
|
total: data.total,
|
|
1645
1655
|
timestamp: (new Date(data.timeStamp)).getTime(),
|
|
1646
1656
|
ratio,
|
|
1647
|
-
percent
|
|
1657
|
+
percent,
|
|
1658
|
+
text,
|
|
1648
1659
|
};
|
|
1649
1660
|
callback?.(resp);
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
resp.progress.percent = 100;
|
|
1661
|
+
if (ratio >= 1) {
|
|
1662
|
+
Object.assign(resp.progress, getProgressValues(1));
|
|
1653
1663
|
config?.onComplete?.(resp);
|
|
1654
1664
|
}
|
|
1655
1665
|
}
|
|
@@ -1687,8 +1697,15 @@ const ajax = (options) => {
|
|
|
1687
1697
|
config[`on${capitalize(context.type)}`]?.({ ...context });
|
|
1688
1698
|
return;
|
|
1689
1699
|
}
|
|
1700
|
+
//tiemeout事件也会执行这里,此时需要让它触发onTimeout事件
|
|
1701
|
+
//abort和timeout行为的status是0
|
|
1702
|
+
//不过abort行为不会执行到这里
|
|
1703
|
+
if (xhr.status === 0 && context.type !== 'abort') {
|
|
1704
|
+
return;
|
|
1705
|
+
}
|
|
1690
1706
|
//已经请求成功,不会有timeout事件,也不需要abort了,所以移除abort事件
|
|
1691
1707
|
cleanup();
|
|
1708
|
+
//根据状态码判断响应结果
|
|
1692
1709
|
const isInformation = xhr.status >= 100 && xhr.status < 200, isSuccess = (xhr.status >= 200 && xhr.status < 300) || xhr.status === 304, isRedirection = xhr.status >= 300 && xhr.status < 400, isClientError = xhr.status >= 400 && xhr.status < 500, isServerError = xhr.status >= 500 && xhr.status < 600;
|
|
1693
1710
|
//已经获得返回数据
|
|
1694
1711
|
if (isSuccess) {
|
|
@@ -1783,6 +1800,90 @@ const ajax = (options) => {
|
|
|
1783
1800
|
});
|
|
1784
1801
|
ajax.all = (requests) => Promise.all(requests.map(ajax));
|
|
1785
1802
|
|
|
1803
|
+
const stringToEncodings = (name, options = {}) => {
|
|
1804
|
+
// Default: Supplementary Private Use Area (Plane 15 and Plane 16)
|
|
1805
|
+
//1,114,110 places,5000 strings => 0 collision
|
|
1806
|
+
const start = options.start ?? 0xF0000, end = options.end ?? 0x10FFFD, range = BigInt(end - start + 1), registry = options.registryMap,
|
|
1807
|
+
|
|
1808
|
+
formatResult = (name, codePoint, hash, collision) => {
|
|
1809
|
+
const hex = codePoint.toString(16).toUpperCase();
|
|
1810
|
+
return {
|
|
1811
|
+
name,
|
|
1812
|
+
unicode: `U+${hex}`,
|
|
1813
|
+
htmlDec: `&#${codePoint};`,
|
|
1814
|
+
htmlHex: `&#x${hex};`,
|
|
1815
|
+
hex,
|
|
1816
|
+
codePoint,
|
|
1817
|
+
hash,
|
|
1818
|
+
collision,
|
|
1819
|
+
};
|
|
1820
|
+
};
|
|
1821
|
+
// -----------------------------
|
|
1822
|
+
// 1. Compute FNV-1a 64-bit hash
|
|
1823
|
+
// -----------------------------
|
|
1824
|
+
let hash = BigInt("0xcbf29ce484222325");
|
|
1825
|
+
const prime = BigInt("0x100000001b3");
|
|
1826
|
+
for (const ch of name) {
|
|
1827
|
+
hash ^= BigInt(ch.codePointAt(0));
|
|
1828
|
+
hash *= prime;
|
|
1829
|
+
}
|
|
1830
|
+
const hashHex = hash.toString(16).toUpperCase();
|
|
1831
|
+
// -----------------------------
|
|
1832
|
+
// 2. Stateless mode (no registry)
|
|
1833
|
+
// -----------------------------
|
|
1834
|
+
if (!registry) {
|
|
1835
|
+
const offset = Number(hash % range), codePoint = start + offset;
|
|
1836
|
+
return formatResult(name, codePoint, hashHex, false);
|
|
1837
|
+
}
|
|
1838
|
+
// -----------------------------
|
|
1839
|
+
// 3. Registry mode (0 collision)
|
|
1840
|
+
// -----------------------------
|
|
1841
|
+
// Already assigned → return stable mapping
|
|
1842
|
+
if (registry.has(name)) {
|
|
1843
|
+
return formatResult(name, registry.get(name), hashHex, false);
|
|
1844
|
+
}
|
|
1845
|
+
// Initial candidate from hash
|
|
1846
|
+
let offset = Number(hash % range), codePoint = start + offset, collision = false;
|
|
1847
|
+
const used = new Set(registry.values());
|
|
1848
|
+
// Linear probing to resolve collisions
|
|
1849
|
+
while (used.has(codePoint)) {
|
|
1850
|
+
collision = true;
|
|
1851
|
+
offset = (offset + 1) % Number(range);
|
|
1852
|
+
codePoint = start + offset;
|
|
1853
|
+
}
|
|
1854
|
+
// Commit allocation
|
|
1855
|
+
registry.set(name, codePoint);
|
|
1856
|
+
return formatResult(name, codePoint, hashHex, collision);
|
|
1857
|
+
};
|
|
1858
|
+
|
|
1859
|
+
const unicodeToEncodings = (input) => {
|
|
1860
|
+
let codePoint;
|
|
1861
|
+
if (typeof input === "number") {
|
|
1862
|
+
codePoint = input;
|
|
1863
|
+
}
|
|
1864
|
+
else {
|
|
1865
|
+
const cleaned = input.trim()
|
|
1866
|
+
.replace(/^U\+/i, "")
|
|
1867
|
+
.replace(/^0x/i, "");
|
|
1868
|
+
codePoint = /^[0-9A-F]+$/i.test(cleaned)
|
|
1869
|
+
? parseInt(cleaned, 16)
|
|
1870
|
+
: parseInt(cleaned, 10);
|
|
1871
|
+
}
|
|
1872
|
+
// Validate parsed code point
|
|
1873
|
+
if (!Number.isFinite(codePoint)) {
|
|
1874
|
+
throw new Error("Invalid Unicode input");
|
|
1875
|
+
}
|
|
1876
|
+
// Convert code point to uppercase hexadecimal representation
|
|
1877
|
+
const hex = codePoint.toString(16).toUpperCase();
|
|
1878
|
+
return {
|
|
1879
|
+
unicode: `U+${hex}`,
|
|
1880
|
+
hex,
|
|
1881
|
+
codePoint,
|
|
1882
|
+
htmlDec: `&#${codePoint};`,
|
|
1883
|
+
htmlHex: `&#x${hex};`,
|
|
1884
|
+
};
|
|
1885
|
+
};
|
|
1886
|
+
|
|
1786
1887
|
const utils = {
|
|
1787
1888
|
//executeStr,
|
|
1788
1889
|
getDataType,
|
|
@@ -1832,6 +1933,8 @@ const utils = {
|
|
|
1832
1933
|
ajax,
|
|
1833
1934
|
capitalize,
|
|
1834
1935
|
cleanQueryString,
|
|
1936
|
+
stringToEncodings,
|
|
1937
|
+
unicodeToEncodings,
|
|
1835
1938
|
};
|
|
1836
1939
|
|
|
1837
1940
|
module.exports = utils;
|
package/dist/utils.cjs.min.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @since Last modified: 2026-
|
|
2
|
+
* @since Last modified: 2026-2-5 17:4:41
|
|
3
3
|
* @name Utils for web front-end.
|
|
4
|
-
* @version 0.0.
|
|
4
|
+
* @version 0.0.40
|
|
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 n,s=!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,s=!1;return a.onAfterClone?.({output:n,input:e,type:r,cloned:s,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 s={};for(let o of a)s[o]=function(...a){const s={},l=e.length;switch(o){case"push":case"unshift":s.addedItems=[...a];break;case"pop":s.poppedItem=e[l-1];break;case"shift":s.shiftedItem=e[0];break;case"splice":const[t,r]=a,n=t<0?Math.max(l+t,0):Math.min(t,l),o=void 0===r?l-n:r;s.deletedItems=e.slice(n,n+o);break;case"sort":case"reverse":s.oldSnapshot=[...e];break;case"fill":case"copyWithin":const i=a[1]||0,c=void 0===a[2]?l:a[2];s.oldItems=e.slice(i,c),s.start=i,s.end=c}t?.(s);const i=Array.prototype[o].apply(e,a),c={value:i,key:o,args:a,context:s,target:e,...n};return r?.(c),i};return s},escapeCharsMaps={basic:{"&":"&","<":"<",">":">"},attribute:{"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},content:{"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"},uri:{"&":"&","<":"<",">":">",'"':""","'":"'","(":"(",")":")","[":"[","]":"]"},paranoid:{"&":"&","<":"<",">":">",'"':""","'":"'","`":"`","/":"/","=":"=","!":"!","#":"#","(":"(",")":")","[":"[","]":"]","{":"{","}":"}",":":":",";":";"}},escapeRegexMaps=Object.keys(escapeCharsMaps).reduce((e,t)=>{const r=Object.keys(escapeCharsMaps[t]).map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"));return e[t]=new RegExp(`[${r.join("")}]`,"g"),e},{}),escapeHTML=(e,t="attribute")=>{if("string"!=typeof e)return"";const r=escapeCharsMaps[t],a=escapeRegexMaps[t];return e.replace(a,e=>r[e])},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:""}`},requireTypes=(e,t,r)=>{let a=Array.isArray(t)?t:[t],n=getDataType(e),s=n.toLowerCase(),o=a.map(e=>e.toLowerCase()),l=s.includes("html")?"element":s;if(r)try{if(!o.includes(l))throw new TypeError(`Expected data type(s): [${o.join(", ")}], but got: ${l}`)}catch(e){r(e,n)}else if(!o.includes(l))throw new TypeError(`Expected data type(s): [${o.join(", ")}], but got: ${l}`);return n},toSingleLine=(e,t=!1)=>{const r=e.replace(/[\r\t\n]/g,"");return t?r.replace(/\s+/g," "):r},renderTpl=(e,t,r={})=>{if(requireTypes(e,"string",e=>""),!e.trim())return"";let a=requireTypes(t,["array","object"],t=>e);if(0===Object.keys(t).length)return e;let n,s=Object.assign({strict:!1,start:"{{",end:"}}",suffix:"/"},r),o=s.start.split("").map(e=>"\\"+e).join(""),l=s.end.split("").map(e=>"\\"+e).join(""),i=new RegExp(`${o}([\\s\\S]+?)?${l}`,"g"),c='"use strict";let str=[];\n',p=0,u="",d=`__esc__${getUniqueId()}`,add=(e,t)=>(t?e.endsWith(s.suffix)?c+=e.slice(0,-s.suffix.length)+"\n":c+=s.escape?`str.push(${d}(String(${e}), "${s.escape}"));\n`:`str.push(${e});\n`:c+=""!==e?'str.push("'+e.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r")+'");\n':"",add);for(;n=i.exec(e);)add(e.slice(p,n.index))(n[1],!0),p=n.index+n[0].length;add(e.slice(p)),c+="return str.join('');",c=toSingleLine(c);try{if(s.strict||"Array"===a)u=new Function(d,c).apply(t,[escapeHTML]);else{let e=Object.keys(t),r=Object.values(t);u=new Function(...e,d,c).bind(t)(...r,escapeHTML)}}catch(e){}return u},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 s={},createWrappedMethod=a=>function(...s){const o={};switch(a){case"add":{const[t]=s;o.addedItem=t,o.existed=e.has(t);break}case"delete":{const[t]=s;o.existed=e.has(t),o.deletedItem=o.existed?t:void 0;break}case"clear":o.clearedItems=Array.from(e),o.previousSize=e.size}t(o);const l=e[a].apply(e,s),i={method:a,result:l,args:s,context:o,target:e,...n};return r(i),l};for(const e of a)setMutableMethods.includes(e)&&(s[e]=createWrappedMethod(e));return Object.defineProperty(s,"target",{get:()=>e,enumerable:!1,configurable:!1}),s},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 s={},createWrappedMethod=a=>function(...s){const o={};switch(a){case"set":{const[t,r]=s;o.key=t,o.newValue=r,o.existed=e.has(t),o.oldValue=o.existed?e.get(t):void 0;break}case"delete":{const[t]=s;o.key=t,o.existed=e.has(t),o.value=o.existed?e.get(t):void 0;break}case"clear":o.clearedItems=Array.from(e.entries()),o.previousSize=e.size}t(o);const l=e[a].apply(e,s),i={method:a,result:l,args:s,context:o,target:e,...n};return r(i),l};for(const e of a)mapMutableMethods.includes(e)&&(s[e]=createWrappedMethod(e));return Object.defineProperty(s,"target",{get:()=>e,enumerable:!1,configurable:!1}),s},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,s,o=getDataType(e),l=getDataType(t),i=!0;if(a.interceptor&&"function"==typeof a.interceptor){let r=a.interceptor({target:e,source:t,targetType:o,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:o,sourceType:l,parent:a.parent}),"Object"===o&&"Object"===l?(s=deepMergeObjects(e,t,a),n="Object"):"Array"===o&&"Array"===l?(s=deepMergeArrays(e,t,a),n="Array"):"Set"===o&&"Set"===l?(s=deepMergeSets(e,t,a),n="Set"):"Map"===o&&"Map"===l?(s=deepMergeMaps(e,t,a),n="Map"):(i=!1,s=e),a?.onAfterMerge?.({result:s,target:e,source:t,targetType:o,sourceType:l,mergeType:n,parent:r.parent}),{result:s,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 s=Object.assign({inheritMissing:!0,targetClone:!1,useEnable:!0},r);let o={};o=s.targetClone?shallowCopy(e):e;for(let e in t){const a=o[e],n=t[e];if(t.hasOwnProperty(e)&&o.hasOwnProperty(e)){const t=smartMerger(a,n,{...r,parent:o});if(t.flag)t.mergeType?"Object"===t.mergeType&&(o[e]=t.result):o[e]=n;else{let t=s.useEnable?mergeEnableObject(a,n):n;a!==t&&null===t?"ignore"===s.nullBehavior||("delete"===s.nullBehavior?Reflect.deleteProperty(o,e):o[e]=t):a!==t&&void 0===t?"ignore"===s.undefinedBehavior||("delete"===s.undefinedBehavior?Reflect.deleteProperty(o,e):o[e]=n):o[e]=n}}else t.hasOwnProperty(e)&&!o.hasOwnProperty(e)&&s.inheritMissing&&(o[e]=n)}if(s.useSymbol){let e=Object.getOwnPropertySymbols(t);if(e.length)for(let r of e)o[r]=t[r]}return o},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,s]of t.entries())if(n.has(e)){const t=n.get(e),r=s,o=smartMerger(t,r,a);o.flag?"Object"===o.mergeType&&n.set(e,o.result):n.set(e,r)}else r.inheritMissing&&n.set(e,s);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],s=smartMerger(e,r,a);n.clear();for(let e of s.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),n=a.includes("HTML")||"ShadowRoot"===a?t:document.querySelector(t),s=n&&n instanceof HTMLTemplateElement?n.content:n,o=null;if(e)if(r.includes("HTML"))o=e;else if("String"===r)try{o=(s||document).querySelector(e.trim())}catch{o=null}return o},isEmpty=e=>{let t,r=getDataType(e);return!e||!["String","Number","Boolean"].includes(r)&&(t="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,s=[];return isEmpty(e)?s:(r.includes("HTML")?s.push(e):"String"===r?s=(e=e.trim()).split(",").map(e=>[...n.querySelectorAll(e)]).flat():"Array"===r&&(s=e.map(e=>getEl(e,a))),s.filter(Boolean))},createEl=(e,t,r)=>{let a=(e=e||"div").toUpperCase().trim(),n=document.createElement(a),s=getDataType(t);if(t&&"Object"===s)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},getSvgUri=e=>`data:image/svg+xml;utf8,${e.replace(/\n/g,"").replace(/\s+/g," ").trim().replace(/%/g,"%25").replace(/#/g,"%23").replace(/{/g,"%7B").replace(/}/g,"%7D").replace(/</g,"%3C").replace(/>/g,"%3E")}`,fileToBase64=e=>new Promise((t,r)=>{const a=new FileReader;a.onload=()=>{"string"==typeof a.result?t(a.result):r(new Error("FileReader result is not a string"))},a.onerror=()=>{r(a.error||new Error("Unknown error occurred during file reading"))},a.readAsDataURL(e)}),NAMESPACE="ax",ALIAS="rep",COMMA=",",SPACE=" ",trim=(e,t="compress")=>{if("string"!=typeof e)return"";switch(t){case"start":return e.trimStart();case"end":return e.trimEnd();case"both":return e.trim();case"global":return e.replace(/[\s\r\n]+/g,"");default:return e.trim().replace(/[\s\r\n]+/g," ")}},parseClasses=e=>{let t,r=[];return Array.isArray(e)?r=e.filter(e=>e&&"string"==typeof e):(t=(e=trim(e)).includes(",")?",":" ",r=e.split(t)),r.map(e=>trim(e,"global")).filter(Boolean)},addClasses=(e,t,r)=>{const a=getEl(e),n=parseClasses(t);a&&0!==n.length&&n.forEach(e=>{let t;r?(t=r(e),!0===t?a.classList.add(e):"string"==typeof t&&t&&a.classList.add(t)):a.classList.add(e)})},createTools=e=>{const t=createEl("span",{class:"ax-box-tools"}),renderFn=e=>{const t={},r=e.extendable?'<i rep="arrow"></i>':"",a=(e.icon?`<i rep="icon">${e.icon}</i>`:"")+(e.disk?`<i rep="disk"><img src="${e.disk}"/></i>`:"")+(e.cube?`<i rep="cube"><img src="${e.cube}"/></i>`:"")+(e.image?`<i rep="image"><img src="${e.image}"/></i>`:"")+(e.label?`<i rep="label">${e.label}</i>`:"")+r;e.title&&(t.title=e.title),e.focusable&&(t.tabindex=1),e.wrapEl=createEl(e.nodeName||"span",Object.assign(t,e.attrs),a),e.iconEl=e.wrapEl.querySelector('[rep="icon"]'),e.cubeEl=e.wrapEl.querySelector('[rep="cube"]'),e.diskEl=e.wrapEl.querySelector('[rep="disk"]'),e.imageEl=e.wrapEl.querySelector('[rep="image"]'),e.labelEl=e.wrapEl.querySelector('[rep="label"]'),!isEmpty(e.classes)&&addClasses(e.wrapEl,e.classes),!isEmpty(e.styles)&&(e.wrapEl.style.cssText+=e.styles)};for(let r of e)renderFn(r),t.appendChild(r.wrapEl),r?.action?.(r);return t},getClasses=e=>{let t=getEl(e);return t?parseClasses(t.getAttribute("class")||""):[]},removeClasses=(e,t,r)=>{const a=getEl(e),n=parseClasses(t);a&&0!==n.length&&n.forEach(e=>{let t;r?(t=r(e),!0===t?a.classList.remove(e):"string"==typeof t&&t&&a.classList.remove(t)):a.classList.remove(e)})},typeWriter=(e,t)=>{const r=t.speed||100;return new Promise(a=>{t?.onBeforeType?.(e);let n=0;const s=setInterval(()=>{if(n<e.length){const r=e.charAt(n),a=e.substring(0,n+1);t?.onDuringType?.(r,a),n++}else clearInterval(s),a(e),t?.onAfterType?.(e)},r)})},parseLLMStream=async(e,t)=>{if(!(e&&e instanceof ReadableStream))throw new Error("Invalid input: ReadableStream is missing or not an instance of ReadableStream.");const r=e.getReader(),a=new TextDecoder("utf-8");let n="";const s={fullText:"",finishReason:null,usage:null,isCompleted:!1};try{for(;;){const{done:e,value:o}=await r.read();if(e)break;n+=a.decode(o,{stream:!0});let l=n.split("\n");n=l.pop()||"";for(const e of l){const r=e.trim();if(!r||!r.startsWith("data: "))continue;const a=r.substring(6);if("[DONE]"!==a)try{const e=JSON.parse(a),r=e.choices?.[0],n=r?.delta?.content||"";n&&(s.fullText+=n,t?.(n)),r?.finish_reason&&(s.finishReason=r.finish_reason),e.usage&&(s.usage=e.usage)}catch(e){}else s.isCompleted=!0}}}catch(e){throw e}return s},toKebabCase=(e,t="",r="")=>`${t}${e.replace(/([A-Z])/g,"-$1").toLowerCase()}${r}`,trimEmptyLines=e=>null==e?"":e.replace(/^\s*\n|\n\s*$/g,"")||"",decodeHtmlEntities=e=>{if(!e)return"";const t=document.createElement("textarea");return t.innerHTML=e,t.value},getBodyHTML=(e,t)=>{if(!e||"string"!=typeof e)return"";try{const r=(new DOMParser).parseFromString(e,"text/html"),a=r.body.innerHTML;if(t){const e=r.querySelector(t);if(e)return e.innerHTML}return a?a.trim():e}catch(t){return e}},getUrlHash=e=>{if(!e||"string"!=typeof e)return"";try{const t=window?.location?.origin||"https://www.axui.cn";return new URL(e,t).hash}catch(e){return""}},cleanQueryString=e=>"string"==typeof e&&(e.startsWith("?")||e.startsWith("&"))?e.slice(1):e,buildUrl=({url:e,data:t,cacheBustKey:r="_t",appendCacheBust:a=!0})=>{const n=e.indexOf("#");let s="",o=e;-1!==n&&(s=e.slice(n),o=e.slice(0,n));const l=new URL(o,window.location.origin);if(!isEmpty(t)){let e,r=getDataType(t);e="URLSearchParams"===r?t:"object"===r?new URLSearchParams(t):new URLSearchParams(cleanQueryString(t)),e.forEach((e,t)=>{l.searchParams.append(t,e)})}return a&&r&&l.searchParams.set(r,Date.now().toString()),l.toString()+s},capitalize=e=>e?e.charAt(0).toUpperCase()+e.slice(1):e,ajax=e=>{if(isEmpty(e))return Promise.reject(new Error("Options are required"));if(!e.url||"string"!=typeof e.url)return Promise.reject(new Error("URL is required and must be a string"));const t={url:"",method:"POST",async:!0,selector:"",data:null,timeout:36e5,headers:{},responseType:"",catchError:!1,signal:null,xhrFields:{},cacheBustKey:"_t",onAbort:null,onTimeout:null,onBeforeSend:null,onCreated:null,onOpened:null,onHeadersReceived:null,onLoading:null,onSuccess:null,onFailure:null,onInformation:null,onRedirection:null,onClientError:null,onServerError:null,onUnknownError:null,onError:null,onFinish:null,onDownload:null,onUpload:null,onComplete:null};Object.assign(t,e);const r=t.method.toUpperCase()||"POST",a=["GET","HEAD","TRACE"];let n=new XMLHttpRequest,s=null,o=t?.headers?.["Content-Type"]||t?.headers?.["content-type"];if(!isEmpty(t.data)){let e=getDataType(t.data);"FormData"===e?(s=t.data,o&&(delete t.headers["Content-Type"],delete t.headers["content-type"])):"Object"===e?o?s=o?.includes("application/json")?JSON.stringify(t.data):t.data:(s=new URLSearchParams(t.data).toString(),a.includes(r)||(t.headers["Content-Type"]="application/x-www-form-urlencoded")):"String"===e&&(!o||o.includes("urlencoded"))?(s=cleanQueryString(t.data.trim()),a.includes(r)||o||(t.headers["Content-Type"]="application/x-www-form-urlencoded")):s=t.data}n.timeout=t.timeout,t.responseType&&(n.responseType=t.responseType);const l=new Promise((e,o)=>{const timeoutHandler=()=>{cleanup();let r={...l,status:n.status,content:n.response,type:"timeout"};t?.onTimeout?.(r),t.catchError?o(r):e(r)},errorHandler=r=>{"client-error"===r.type?t?.onClientError?.({...l}):"server-error"===r.type?t?.onServerError?.({...l}):"unknown-error"===r.type&&t?.onUnknownError?.({...l}),t?.onError?.(r),t.catchError?o(r):e(r)},abortHandler=()=>{cleanup();const r={...l,status:n.status,type:"abort"};t.catchError?o(r):e(r),t?.onAbort?.(r)},abortHandlerWithSignal=()=>{n.abort(),abortHandler()},cleanup=()=>{t.signal&&t.signal.removeEventListener("abort",abortHandlerWithSignal),t.onError&&n.removeEventListener("error",errorHandler),t.onTimeout&&n.removeEventListener("timeout",timeoutHandler),t.onUpload&&n.upload.removeEventListener("progress",uploadProgressHandler),t.onDownload&&n.removeEventListener("progress",downloadProgressHandler),n.onreadystatechange=null},l={xhr:n,data:s,abort:abortHandler,status:"",content:null,stage:0,type:"unset",progress:{}},progressHandler=(e,r,a)=>{if(r.lengthComputable){const s={...l,status:n.status},o=r.loaded/r.total;s.progress={name:e,loaded:r.loaded,total:r.total,timestamp:new Date(r.timeStamp).getTime(),ratio:o,percent:Math.round(100*o)},a?.(s),s.progress.percent>=100&&(s.progress.percent=100,t?.onComplete?.(s))}},uploadProgressHandler=e=>{progressHandler("upload",e,e=>t.onUpload(e))},downloadProgressHandler=e=>{progressHandler("download",e,e=>t.onDownload(e))};if(t.signal){if(t.signal.aborted)return abortHandlerWithSignal();t.signal.addEventListener("abort",abortHandlerWithSignal)}t.onUpload&&n.upload.addEventListener("progress",uploadProgressHandler),t.onDownload&&n.addEventListener("progress",downloadProgressHandler),t.onError&&n.addEventListener("error",errorHandler),t.onTimeout&&n.addEventListener("timeout",timeoutHandler),t.onAbort&&n.addEventListener("abort",abortHandler),t.onCreated?.({...l,type:"created"}),n.onreadystatechange=function(){l.stage=n.readyState,l.status=n.status;const r={1:"opened",2:"headersReceived",3:"loading"};if(n.readyState<4){if(!n.readyState)return;return l.type=r[n.readyState],void t[`on${capitalize(l.type)}`]?.({...l})}cleanup();const a=n.status>=100&&n.status<200,s=n.status>=200&&n.status<300||304===n.status,o=n.status>=300&&n.status<400,i=n.status>=400&&n.status<500,c=n.status>=500&&n.status<600;if(s){if(t.responseType&&"text"!==n.responseType)l.content=n.response;else{let e=n.responseText.trim(),r="";if(e.startsWith("[")&&e.endsWith("]")||e.startsWith("{")&&e.endsWith("}"))try{r=JSON.parse(e)}catch{r=n.responseText}else if(/(<\/html>|<\/body>)/i.test(e)){let a=getUrlHash(t.url);r=getBodyHTML(e,t.selector||a)}else r=n.responseText;l.content=r}l.type="success",p={...l},t?.onSuccess?.(p),e(p)}else l.content=n.response,l.type=a?"infomation":o?"redirection":i?"client-error":c?"server-error":"unknown-error",a?t?.onInformation?.({...l}):o?t?.onRedirection?.({...l}):errorHandler({...l}),t?.onFailure?.({...l});var p;t?.onFinish?.({...l})};let i=[r,t.url,t.async];if(a.includes(r)){const e=buildUrl({url:t.url,data:s,cacheBustKey:t.cacheBustKey,appendCacheBust:!0});i=[r,e,t.async]}for(let e in t.xhrFields)t.xhrFields.hasOwnProperty(e)&&(n[e]=t.xhrFields[e]);n.open(...i);for(let e in t.headers)t.headers.hasOwnProperty(e)&&!isEmpty(t.headers[e])&&n.setRequestHeader(e,t.headers[e]);t?.onBeforeSend?.({...l,status:n.status,type:"beforeSend"}),n.send(a.includes(r)?null:s||null)});return l.xhr=n,l.abort=()=>n.abort(),l};["post","put","delete","patch","options","get","head","trace"].forEach(e=>{ajax[e]=(t,r,a={url:""})=>ajax({...a,method:e,url:t,data:r})}),ajax.all=e=>Promise.all(e.map(ajax));const 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,getSvgUri:getSvgUri,fileToBase64:fileToBase64,NAMESPACE:"ax",ALIAS:"rep",COMMA:",",SPACE:" ",trim:trim,parseClasses:parseClasses,getClasses:getClasses,addClasses:addClasses,removeClasses:removeClasses,createTools:createTools,typeWriter:typeWriter,parseLLMStream:parseLLMStream,toKebabCase:toKebabCase,trimEmptyLines:trimEmptyLines,decodeHtmlEntities:decodeHtmlEntities,escapeCharsMaps:escapeCharsMaps,escapeRegexMaps:escapeRegexMaps,escapeHTML:escapeHTML,toSingleLine:toSingleLine,renderTpl:renderTpl,getBodyHTML:getBodyHTML,getUrlHash:getUrlHash,buildUrl:buildUrl,ajax:ajax,capitalize:capitalize,cleanQueryString:cleanQueryString};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),n=Object.assign({cloneSet:!0,cloneMap:!0,cloneObject:!0,cloneArray:!0,cloneDate:!0,cloneRegex:!0},t);if(n.interceptor&&"function"==typeof n.interceptor){let t=n.interceptor({input:e,type:r,parent:n.parent});if(t)return t}n.onBeforeClone?.({input:e,type:r,parent:n.parent});let a,s=!0;if("Object"===r&&n.cloneObject){const t={},r=Object.getOwnPropertySymbols(e);for(const r in e)t[r]=deepClone(e[r],n);if(r.length>0)for(const a of r)t[a]=deepClone(e[a],{...n,parent:e});a=t}else if("Array"===r&&n.cloneArray)a=e.map(t=>deepClone(t,{...n,parent:e}));else if("Map"===r&&n.cloneMap){const t=new Map;for(const[r,a]of e)t.set(deepClone(r,n),deepClone(a,{...n,parent:e}));a=t}else if("Set"===r&&n.cloneSet){const t=new Set;for(const r of e)t.add(deepClone(r,{...n,parent:e}));a=t}else if("Date"===r&&n.cloneDate)a=new Date(e.getTime());else if("RegExp"===r&&n.cloneRegex){const t=e;a=new RegExp(t.source,t.flags)}else a=e,s=!1;return n.onAfterClone?.({output:a,input:e,type:r,cloned:s,parent:n.parent}),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:n,props:a={}})=>{if(!Array.isArray(e))throw new TypeError("The 'target' parameter must be an array.");n&&!n?.length||(n=arrayMutableMethods);const s={};for(let o of n)s[o]=function(...n){const s={},i=e.length;switch(o){case"push":case"unshift":s.addedItems=[...n];break;case"pop":s.poppedItem=e[i-1];break;case"shift":s.shiftedItem=e[0];break;case"splice":const[t,r]=n,a=t<0?Math.max(i+t,0):Math.min(t,i),o=void 0===r?i-a:r;s.deletedItems=e.slice(a,a+o);break;case"sort":case"reverse":s.oldSnapshot=[...e];break;case"fill":case"copyWithin":const l=n[1]||0,c=void 0===n[2]?i:n[2];s.oldItems=e.slice(l,c),s.start=l,s.end=c}t?.(s);const l=Array.prototype[o].apply(e,n),c={value:l,key:o,args:n,context:s,target:e,...a};return r?.(c),l};return s},escapeCharsMaps={basic:{"&":"&","<":"<",">":">"},attribute:{"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},content:{"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"},uri:{"&":"&","<":"<",">":">",'"':""","'":"'","(":"(",")":")","[":"[","]":"]"},paranoid:{"&":"&","<":"<",">":">",'"':""","'":"'","`":"`","/":"/","=":"=","!":"!","#":"#","(":"(",")":")","[":"[","]":"]","{":"{","}":"}",":":":",";":";"}},escapeRegexMaps=Object.keys(escapeCharsMaps).reduce((e,t)=>{const r=Object.keys(escapeCharsMaps[t]).map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"));return e[t]=new RegExp(`[${r.join("")}]`,"g"),e},{}),escapeHTML=(e,t="attribute")=>{if("string"!=typeof e)return"";const r=escapeCharsMaps[t],n=escapeRegexMaps[t];return e.replace(n,e=>r[e])},getUniqueId=(e={})=>{const t=e.prefix,r=e.suffix,n=e.base10,a=e.base36;return`${t?t+"-":""}${Date.now()}${a?"-"+Math.random().toString(36).substring(2,11):""}${n?"-"+Math.floor(1e4*Math.random()).toString().padStart(4,"0"):""}${r?"-"+r:""}`},requireTypes=(e,t,r)=>{let n=Array.isArray(t)?t:[t],a=getDataType(e),s=a.toLowerCase(),o=n.map(e=>e.toLowerCase()),i=s.includes("html")?"element":s;if(r)try{if(!o.includes(i))throw new TypeError(`Expected data type(s): [${o.join(", ")}], but got: ${i}`)}catch(e){r(e,a)}else if(!o.includes(i))throw new TypeError(`Expected data type(s): [${o.join(", ")}], but got: ${i}`);return a},toSingleLine=(e,t=!1)=>{const r=e.replace(/[\r\t\n]/g,"");return t?r.replace(/\s+/g," "):r},renderTpl=(e,t,r={})=>{if(requireTypes(e,"string",e=>""),!e.trim())return"";let n=requireTypes(t,["array","object"],t=>e);if(0===Object.keys(t).length)return e;let a,s=Object.assign({strict:!1,start:"{{",end:"}}",suffix:"/"},r),o=s.start.split("").map(e=>"\\"+e).join(""),i=s.end.split("").map(e=>"\\"+e).join(""),l=new RegExp(`${o}([\\s\\S]+?)?${i}`,"g"),c='"use strict";let str=[];\n',p=0,u="",d=`__esc__${getUniqueId()}`,add=(e,t)=>(t?e.endsWith(s.suffix)?c+=e.slice(0,-s.suffix.length)+"\n":c+=s.escape?`str.push(${d}(String(${e}), "${s.escape}"));\n`:`str.push(${e});\n`:c+=""!==e?'str.push("'+e.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r")+'");\n':"",add);for(;a=l.exec(e);)add(e.slice(p,a.index))(a[1],!0),p=a.index+a[0].length;add(e.slice(p)),c+="return str.join('');",c=toSingleLine(c);try{if(s.strict||"Array"===n)u=new Function(d,c).apply(t,[escapeHTML]);else{let e=Object.keys(t),r=Object.values(t);u=new Function(...e,d,c).bind(t)(...r,escapeHTML)}}catch(e){}return u},setMutableMethods=["add","delete","clear"],mapMutableMethods=["set","delete","clear"],wrapSetMethods=({target:e,onBeforeMutate:t=()=>{},onAfterMutate:r=()=>{},allowList:n=setMutableMethods,props:a={}})=>{if(!(e instanceof Set))throw new TypeError("The 'target' parameter must be a Set.");const s={},createWrappedMethod=n=>function(...s){const o={};switch(n){case"add":{const[t]=s;o.addedItem=t,o.existed=e.has(t);break}case"delete":{const[t]=s;o.existed=e.has(t),o.deletedItem=o.existed?t:void 0;break}case"clear":o.clearedItems=Array.from(e),o.previousSize=e.size}t(o);const i=e[n].apply(e,s),l={method:n,result:i,args:s,context:o,target:e,...a};return r(l),i};for(const e of n)setMutableMethods.includes(e)&&(s[e]=createWrappedMethod(e));return Object.defineProperty(s,"target",{get:()=>e,enumerable:!1,configurable:!1}),s},wrapMapMethods=({target:e,onBeforeMutate:t=()=>{},onAfterMutate:r=()=>{},allowList:n=mapMutableMethods,props:a={}})=>{if(!(e instanceof Map))throw new TypeError("The 'target' parameter must be a Map.");const s={},createWrappedMethod=n=>function(...s){const o={};switch(n){case"set":{const[t,r]=s;o.key=t,o.newValue=r,o.existed=e.has(t),o.oldValue=o.existed?e.get(t):void 0;break}case"delete":{const[t]=s;o.key=t,o.existed=e.has(t),o.value=o.existed?e.get(t):void 0;break}case"clear":o.clearedItems=Array.from(e.entries()),o.previousSize=e.size}t(o);const i=e[n].apply(e,s),l={method:n,result:i,args:s,context:o,target:e,...a};return r(l),i};for(const e of n)mapMutableMethods.includes(e)&&(s[e]=createWrappedMethod(e));return Object.defineProperty(s,"target",{get:()=>e,enumerable:!1,configurable:!1}),s},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 n=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,n)=>{let a,s,o=getDataType(e),i=getDataType(t),l=!0;if(n.interceptor&&"function"==typeof n.interceptor){let r=n.interceptor({target:e,source:t,targetType:o,sourceType:i,parent:n.parent});if(r){if(null===r?.target||null===r?.source)return r;e=r.target,t=r.source}}return n?.onBeforeMerge?.({target:e,source:t,targetType:o,sourceType:i,parent:n.parent}),"Object"===o&&"Object"===i?(s=deepMergeObjects(e,t,n),a="Object"):"Array"===o&&"Array"===i?(s=deepMergeArrays(e,t,n),a="Array"):"Set"===o&&"Set"===i?(s=deepMergeSets(e,t,n),a="Set"):"Map"===o&&"Map"===i?(s=deepMergeMaps(e,t,n),a="Map"):(l=!1,s=e),n?.onAfterMerge?.({result:s,target:e,source:t,targetType:o,sourceType:i,mergeType:a,parent:r.parent}),{result:s,flag:l,mergeType:a}},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 n=getDataType(e),a=getDataType(t);if("Object"!==n||"Object"!==a)return e;const s=Object.assign({inheritMissing:!0,targetClone:!1,useEnable:!0},r);let o={};o=s.targetClone?shallowCopy(e):e;for(let e in t){const n=o[e],a=t[e];if(t.hasOwnProperty(e)&&o.hasOwnProperty(e)){const t=smartMerger(n,a,{...r,parent:o});if(t.flag)t.mergeType?"Object"===t.mergeType&&(o[e]=t.result):o[e]=a;else{let t=s.useEnable?mergeEnableObject(n,a):a;n!==t&&null===t?"ignore"===s.nullBehavior||("delete"===s.nullBehavior?Reflect.deleteProperty(o,e):o[e]=t):n!==t&&void 0===t?"ignore"===s.undefinedBehavior||("delete"===s.undefinedBehavior?Reflect.deleteProperty(o,e):o[e]=a):o[e]=a}}else t.hasOwnProperty(e)&&!o.hasOwnProperty(e)&&s.inheritMissing&&(o[e]=a)}if(s.useSymbol){let e=Object.getOwnPropertySymbols(t);if(e.length)for(let r of e)o[r]=t[r]}return o},deepMergeArrays=(e,t,r={})=>{if(!Array.isArray(e)||!Array.isArray(t))return e;const n=Object.assign({dataMode:"clear",inheritMissing:!0,targetClone:!1},r),a=n.targetClone?[...e]:e;if("replace"===n.dataMode)for(let e=0;e<t.length&&(n.inheritMissing||!(e>=a.length));e++){smartMerger(a[e],t[e],{...n,parent:a}).flag||(a[e]=t[e])}else"concat"===n.dataMode||(a.length=0),a.push(...t);return a},deepMergeMaps=(e,t,r={})=>{if(!(e instanceof Map&&t instanceof Map))return e;const n=Object.assign({inheritMissing:!0,targetClone:!1,useEnable:!0},r),a=n.targetClone?new Map([...e]):e;for(const[e,s]of t.entries())if(a.has(e)){const t=a.get(e),r=s,o=smartMerger(t,r,n);o.flag?"Object"===o.mergeType&&a.set(e,o.result):a.set(e,r)}else r.inheritMissing&&a.set(e,s);return a},deepMergeSets=(e,t,r={})=>{if(!(e instanceof Set&&t instanceof Set))return e;const n=Object.assign({dataMode:"clear",inheritMissing:!0,targetClone:!1,useEnable:!0},r),a=n.targetClone?new Set(...e):e;if("replace"===n.dataMode){const e=[...a],r=[...t],s=smartMerger(e,r,n);a.clear();for(let e of s.result)a.add(e)}else if("concat"===n.dataMode)for(let e of t)a.add(e);else{a.clear();for(let e of t)a.add(e)}return a};return smartMerger(e,t,n).result},getEl=(e,t=document.body)=>{let r=getDataType(e),n=getDataType(t),a=n.includes("HTML")||"ShadowRoot"===n?t:document.querySelector(t),s=a&&a instanceof HTMLTemplateElement?a.content:a,o=null;if(e)if(r.includes("HTML"))o=e;else if("String"===r)try{o=(s||document).querySelector(e.trim())}catch{o=null}return o},isEmpty=e=>{let t,r=getDataType(e);return!e||!["String","Number","Boolean"].includes(r)&&(t="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),n=getEl(t),a=n&&n instanceof HTMLTemplateElement?n.content:n||document,s=[];return isEmpty(e)?s:(r.includes("HTML")?s.push(e):"String"===r?s=(e=e.trim()).split(",").map(e=>[...a.querySelectorAll(e)]).flat():"Array"===r&&(s=e.map(e=>getEl(e,n))),s.filter(Boolean))},createEl=(e,t,r)=>{let n=(e=e||"div").toUpperCase().trim(),a=document.createElement(n),s=getDataType(t);if(t&&"Object"===s)for(let e in t)t.hasOwnProperty(e)&&a.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"===n)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)})(a,r),a},getSvgUri=e=>`data:image/svg+xml;utf8,${e.replace(/\n/g,"").replace(/\s+/g," ").trim().replace(/%/g,"%25").replace(/#/g,"%23").replace(/{/g,"%7B").replace(/}/g,"%7D").replace(/</g,"%3C").replace(/>/g,"%3E")}`,fileToBase64=e=>new Promise((t,r)=>{const n=new FileReader;n.onload=()=>{"string"==typeof n.result?t(n.result):r(new Error("FileReader result is not a string"))},n.onerror=()=>{r(n.error||new Error("Unknown error occurred during file reading"))},n.readAsDataURL(e)}),NAMESPACE="ax",ALIAS="rep",COMMA=",",SPACE=" ",trim=(e,t="compress")=>{if("string"!=typeof e)return"";switch(t){case"start":return e.trimStart();case"end":return e.trimEnd();case"both":return e.trim();case"global":return e.replace(/[\s\r\n]+/g,"");default:return e.trim().replace(/[\s\r\n]+/g," ")}},parseClasses=e=>{let t,r=[];return Array.isArray(e)?r=e.filter(e=>e&&"string"==typeof e):(t=(e=trim(e)).includes(",")?",":" ",r=e.split(t)),r.map(e=>trim(e,"global")).filter(Boolean)},addClasses=(e,t,r)=>{const n=getEl(e),a=parseClasses(t);n&&0!==a.length&&a.forEach(e=>{let t;r?(t=r(e),!0===t?n.classList.add(e):"string"==typeof t&&t&&n.classList.add(t)):n.classList.add(e)})},createTools=e=>{const t=createEl("span",{class:"ax-box-tools"}),renderFn=e=>{const t={},r=e.extendable?'<i rep="arrow"></i>':"",n=(e.icon?`<i rep="icon">${e.icon}</i>`:"")+(e.disk?`<i rep="disk"><img src="${e.disk}"/></i>`:"")+(e.cube?`<i rep="cube"><img src="${e.cube}"/></i>`:"")+(e.image?`<i rep="image"><img src="${e.image}"/></i>`:"")+(e.label?`<i rep="label">${e.label}</i>`:"")+r;e.title&&(t.title=e.title),e.focusable&&(t.tabindex=1),e.wrapEl=createEl(e.nodeName||"span",Object.assign(t,e.attrs),n),e.iconEl=e.wrapEl.querySelector('[rep="icon"]'),e.cubeEl=e.wrapEl.querySelector('[rep="cube"]'),e.diskEl=e.wrapEl.querySelector('[rep="disk"]'),e.imageEl=e.wrapEl.querySelector('[rep="image"]'),e.labelEl=e.wrapEl.querySelector('[rep="label"]'),!isEmpty(e.classes)&&addClasses(e.wrapEl,e.classes),!isEmpty(e.styles)&&(e.wrapEl.style.cssText+=e.styles)};for(let r of e)renderFn(r),t.appendChild(r.wrapEl),r?.action?.(r);return t},getClasses=e=>{let t=getEl(e);return t?parseClasses(t.getAttribute("class")||""):[]},removeClasses=(e,t,r)=>{const n=getEl(e),a=parseClasses(t);n&&0!==a.length&&a.forEach(e=>{let t;r?(t=r(e),!0===t?n.classList.remove(e):"string"==typeof t&&t&&n.classList.remove(t)):n.classList.remove(e)})},typeWriter=(e,t)=>{const r=t.speed||100;return new Promise(n=>{t?.onBeforeType?.(e);let a=0;const s=setInterval(()=>{if(a<e.length){const r=e.charAt(a),n=e.substring(0,a+1);t?.onDuringType?.(r,n),a++}else clearInterval(s),n(e),t?.onAfterType?.(e)},r)})},parseLLMStream=async(e,t)=>{if(!(e&&e instanceof ReadableStream))throw new Error("Invalid input: ReadableStream is missing or not an instance of ReadableStream.");const r=e.getReader(),n=new TextDecoder("utf-8");let a="";const s={fullText:"",finishReason:null,usage:null,isCompleted:!1};try{for(;;){const{done:e,value:o}=await r.read();if(e)break;a+=n.decode(o,{stream:!0});let i=a.split("\n");a=i.pop()||"";for(const e of i){const r=e.trim();if(!r||!r.startsWith("data: "))continue;const n=r.substring(6);if("[DONE]"!==n)try{const e=JSON.parse(n),r=e.choices?.[0],a=r?.delta?.content||"";a&&(s.fullText+=a,t?.(a)),r?.finish_reason&&(s.finishReason=r.finish_reason),e.usage&&(s.usage=e.usage)}catch(e){}else s.isCompleted=!0}}}catch(e){throw e}return s},toKebabCase=(e,t="",r="")=>`${t}${e.replace(/([A-Z])/g,"-$1").toLowerCase()}${r}`,trimEmptyLines=e=>null==e?"":e.replace(/^\s*\n|\n\s*$/g,"")||"",decodeHtmlEntities=e=>{if(!e)return"";const t=document.createElement("textarea");return t.innerHTML=e,t.value},getBodyHTML=(e,t)=>{if(!e||"string"!=typeof e)return"";try{const r=(new DOMParser).parseFromString(e,"text/html"),n=r.body.innerHTML;if(t){const e=r.querySelector(t);if(e)return e.innerHTML}return n?n.trim():e}catch(t){return e}},getUrlHash=e=>{if(!e||"string"!=typeof e)return"";try{const t=window?.location?.origin||"https://www.axui.cn";return new URL(e,t).hash}catch(e){return""}},cleanQueryString=e=>"string"==typeof e&&(e.startsWith("?")||e.startsWith("&"))?e.slice(1):e,buildUrl=({url:e,data:t,cacheBustKey:r="_t",appendCacheBust:n=!0})=>{const a=e.indexOf("#");let s="",o=e;-1!==a&&(s=e.slice(a),o=e.slice(0,a));const i=new URL(o,window.location.origin);if(!isEmpty(t)){let e,r=getDataType(t);e="URLSearchParams"===r?t:"object"===r?new URLSearchParams(t):new URLSearchParams(cleanQueryString(t)),e.forEach((e,t)=>{i.searchParams.append(t,e)})}return n&&r&&i.searchParams.set(r,Date.now().toString()),i.toString()+s},capitalize=e=>e?e.charAt(0).toUpperCase()+e.slice(1):e,ajax=e=>{if(isEmpty(e))return Promise.reject(new Error("Options are required"));if(!e.url||"string"!=typeof e.url)return Promise.reject(new Error("URL is required and must be a string"));const t={url:"",method:"POST",async:!0,selector:"",data:null,timeout:36e5,headers:{},responseType:"",catchError:!1,signal:null,xhrFields:{},cacheBustKey:"_t",precision:2,onAbort:null,onTimeout:null,onBeforeSend:null,onCreated:null,onOpened:null,onHeadersReceived:null,onLoading:null,onSuccess:null,onFailure:null,onInformation:null,onRedirection:null,onClientError:null,onServerError:null,onUnknownError:null,onError:null,onFinish:null,onDownload:null,onUpload:null,onComplete:null};Object.assign(t,e);const r=t.method.toUpperCase()||"POST",n=["GET","HEAD","TRACE"];let a=new XMLHttpRequest,s=null,o=t?.headers?.["Content-Type"]||t?.headers?.["content-type"];if(!isEmpty(t.data)){let e=getDataType(t.data);"FormData"===e?(s=t.data,o&&(delete t.headers["Content-Type"],delete t.headers["content-type"])):"Object"===e?o?s=o?.includes("application/json")?JSON.stringify(t.data):t.data:(s=new URLSearchParams(t.data).toString(),n.includes(r)||(t.headers["Content-Type"]="application/x-www-form-urlencoded")):"String"===e&&(!o||o.includes("urlencoded"))?(s=cleanQueryString(t.data.trim()),n.includes(r)||o||(t.headers["Content-Type"]="application/x-www-form-urlencoded")):s=t.data}a.timeout=t.timeout,t.responseType&&(a.responseType=t.responseType);const i=new Promise((e,o)=>{const timeoutHandler=()=>{cleanup();let r={...i,status:a.status,content:a.response,type:"timeout"};t?.onTimeout?.(r),t.catchError?o(r):e(r),t?.onFailure?.(r),t?.onFinish?.(r)},errorHandler=r=>{"client-error"===r.type?t?.onClientError?.({...i}):"server-error"===r.type?t?.onServerError?.({...i}):"unknown-error"===r.type&&t?.onUnknownError?.({...i}),t?.onError?.(r),t.catchError?o(r):e(r)},abortHandler=()=>{cleanup();const r={...i,status:a.status,type:"abort"};t.catchError?o(r):e(r),t?.onAbort?.(r),t?.onFinish?.(r)},abortHandlerWithSignal=()=>{a.abort(),abortHandler()},cleanup=()=>{t.signal&&t.signal.removeEventListener("abort",abortHandlerWithSignal),t.onError&&a.removeEventListener("error",errorHandler),t.onTimeout&&a.removeEventListener("timeout",timeoutHandler),t.onUpload&&a.upload.removeEventListener("progress",uploadProgressHandler),t.onDownload&&a.removeEventListener("progress",downloadProgressHandler),a.onreadystatechange=null},i={xhr:a,data:s,abort:abortHandler,status:"",content:null,stage:0,type:"unset",progress:{}},getProgressValues=e=>{let r=(100*e).toFixed(t.precision);return{percent:parseFloat(r),text:r}},progressHandler=(e,r,n)=>{if(r.lengthComputable){const s={...i,status:a.status},o=r.loaded/r.total,{percent:l,text:c}=getProgressValues(o);s.progress={name:e,loaded:r.loaded,total:r.total,timestamp:new Date(r.timeStamp).getTime(),ratio:o,percent:l,text:c},n?.(s),o>=1&&(Object.assign(s.progress,getProgressValues(1)),t?.onComplete?.(s))}},uploadProgressHandler=e=>{progressHandler("upload",e,e=>t.onUpload(e))},downloadProgressHandler=e=>{progressHandler("download",e,e=>t.onDownload(e))};if(t.signal){if(t.signal.aborted)return abortHandlerWithSignal();t.signal.addEventListener("abort",abortHandlerWithSignal)}t.onUpload&&a.upload.addEventListener("progress",uploadProgressHandler),t.onDownload&&a.addEventListener("progress",downloadProgressHandler),t.onError&&a.addEventListener("error",errorHandler),t.onTimeout&&a.addEventListener("timeout",timeoutHandler),t.onAbort&&a.addEventListener("abort",abortHandler),t.onCreated?.({...i,type:"created"}),a.onreadystatechange=function(){i.stage=a.readyState,i.status=a.status;const r={1:"opened",2:"headersReceived",3:"loading"};if(a.readyState<4){if(!a.readyState)return;return i.type=r[a.readyState],void t[`on${capitalize(i.type)}`]?.({...i})}if(0===a.status&&"abort"!==i.type)return;cleanup();const n=a.status>=100&&a.status<200,s=a.status>=200&&a.status<300||304===a.status,o=a.status>=300&&a.status<400,l=a.status>=400&&a.status<500,c=a.status>=500&&a.status<600;if(s){if(t.responseType&&"text"!==a.responseType)i.content=a.response;else{let e=a.responseText.trim(),r="";if(e.startsWith("[")&&e.endsWith("]")||e.startsWith("{")&&e.endsWith("}"))try{r=JSON.parse(e)}catch{r=a.responseText}else if(/(<\/html>|<\/body>)/i.test(e)){let n=getUrlHash(t.url);r=getBodyHTML(e,t.selector||n)}else r=a.responseText;i.content=r}i.type="success",p={...i},t?.onSuccess?.(p),e(p)}else i.content=a.response,i.type=n?"infomation":o?"redirection":l?"client-error":c?"server-error":"unknown-error",n?t?.onInformation?.({...i}):o?t?.onRedirection?.({...i}):errorHandler({...i}),t?.onFailure?.({...i});var p;t?.onFinish?.({...i})};let l=[r,t.url,t.async];if(n.includes(r)){const e=buildUrl({url:t.url,data:s,cacheBustKey:t.cacheBustKey,appendCacheBust:!0});l=[r,e,t.async]}for(let e in t.xhrFields)t.xhrFields.hasOwnProperty(e)&&(a[e]=t.xhrFields[e]);a.open(...l);for(let e in t.headers)t.headers.hasOwnProperty(e)&&!isEmpty(t.headers[e])&&a.setRequestHeader(e,t.headers[e]);t?.onBeforeSend?.({...i,status:a.status,type:"beforeSend"}),a.send(n.includes(r)?null:s||null)});return i.xhr=a,i.abort=()=>a.abort(),i};["post","put","delete","patch","options","get","head","trace"].forEach(e=>{ajax[e]=(t,r,n={url:""})=>ajax({...n,method:e,url:t,data:r})}),ajax.all=e=>Promise.all(e.map(ajax));const stringToEncodings=(e,t={})=>{const r=t.start??983040,n=t.end??1114109,a=BigInt(n-r+1),s=t.registryMap,formatResult=(e,t,r,n)=>{const a=t.toString(16).toUpperCase();return{name:e,unicode:`U+${a}`,htmlDec:`&#${t};`,htmlHex:`&#x${a};`,hex:a,codePoint:t,hash:r,collision:n}};let o=BigInt("0xcbf29ce484222325");const i=BigInt("0x100000001b3");for(const t of e)o^=BigInt(t.codePointAt(0)),o*=i;const l=o.toString(16).toUpperCase();if(!s){return formatResult(e,r+Number(o%a),l,!1)}if(s.has(e))return formatResult(e,s.get(e),l,!1);let c=Number(o%a),p=r+c,u=!1;const d=new Set(s.values());for(;d.has(p);)u=!0,c=(c+1)%Number(a),p=r+c;return s.set(e,p),formatResult(e,p,l,u)},unicodeToEncodings=e=>{let t;if("number"==typeof e)t=e;else{const r=e.trim().replace(/^U\+/i,"").replace(/^0x/i,"");t=/^[0-9A-F]+$/i.test(r)?parseInt(r,16):parseInt(r,10)}if(!Number.isFinite(t))throw new Error("Invalid Unicode input");const r=t.toString(16).toUpperCase();return{unicode:`U+${r}`,hex:r,codePoint:t,htmlDec:`&#${t};`,htmlHex:`&#x${r};`}},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,getSvgUri:getSvgUri,fileToBase64:fileToBase64,NAMESPACE:"ax",ALIAS:"rep",COMMA:",",SPACE:" ",trim:trim,parseClasses:parseClasses,getClasses:getClasses,addClasses:addClasses,removeClasses:removeClasses,createTools:createTools,typeWriter:typeWriter,parseLLMStream:parseLLMStream,toKebabCase:toKebabCase,trimEmptyLines:trimEmptyLines,decodeHtmlEntities:decodeHtmlEntities,escapeCharsMaps:escapeCharsMaps,escapeRegexMaps:escapeRegexMaps,escapeHTML:escapeHTML,toSingleLine:toSingleLine,renderTpl:renderTpl,getBodyHTML:getBodyHTML,getUrlHash:getUrlHash,buildUrl:buildUrl,ajax:ajax,capitalize:capitalize,cleanQueryString:cleanQueryString,stringToEncodings:stringToEncodings,unicodeToEncodings:unicodeToEncodings};module.exports=utils;
|
package/dist/utils.esm.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
|
|
2
2
|
/*!
|
|
3
|
-
* @since Last modified: 2026-
|
|
3
|
+
* @since Last modified: 2026-2-5 17:4:41
|
|
4
4
|
* @name Utils for web front-end.
|
|
5
|
-
* @version 0.0.
|
|
5
|
+
* @version 0.0.40
|
|
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}
|
|
@@ -1459,6 +1459,7 @@ const ajax = (options) => {
|
|
|
1459
1459
|
signal: null,
|
|
1460
1460
|
xhrFields: {},
|
|
1461
1461
|
cacheBustKey: '_t',
|
|
1462
|
+
precision: 2,
|
|
1462
1463
|
//
|
|
1463
1464
|
onAbort: null,
|
|
1464
1465
|
onTimeout: null,
|
|
@@ -1563,6 +1564,10 @@ const ajax = (options) => {
|
|
|
1563
1564
|
config?.onTimeout?.(resp);
|
|
1564
1565
|
//reject只能接受一个参数
|
|
1565
1566
|
config.catchError ? reject(resp) : resolve(resp);
|
|
1567
|
+
//超时也是不能获得数据的行为,定义为failure
|
|
1568
|
+
config?.onFailure?.(resp);
|
|
1569
|
+
//timeout会经过onreadystatechange,但是被及时的return了,所以这里多加一行
|
|
1570
|
+
config?.onFinish?.(resp);
|
|
1566
1571
|
},
|
|
1567
1572
|
//报错监听
|
|
1568
1573
|
errorHandler = (resp) => {
|
|
@@ -1588,6 +1593,8 @@ const ajax = (options) => {
|
|
|
1588
1593
|
config.catchError ? reject(resp) : resolve(resp);
|
|
1589
1594
|
//回调,status和content在此确认
|
|
1590
1595
|
config?.onAbort?.(resp);
|
|
1596
|
+
//abort行为不会经过onreadystatechange,这里需要多这一行以表示xhr的完成(结束)
|
|
1597
|
+
config?.onFinish?.(resp);
|
|
1591
1598
|
}, abortHandlerWithSignal = () => {
|
|
1592
1599
|
//先中止请求,防止触发其他 readystate 事件
|
|
1593
1600
|
xhr.abort();
|
|
@@ -1631,23 +1638,26 @@ const ajax = (options) => {
|
|
|
1631
1638
|
type: 'unset',
|
|
1632
1639
|
//上传和下载进度
|
|
1633
1640
|
progress: {}
|
|
1641
|
+
}, getProgressValues = (ratio) => {
|
|
1642
|
+
let text = (ratio * 100).toFixed(config.precision);
|
|
1643
|
+
return { percent: parseFloat(text), text };
|
|
1634
1644
|
},
|
|
1635
1645
|
//定义进度函数
|
|
1636
1646
|
progressHandler = (name, data, callback) => {
|
|
1637
1647
|
if (data.lengthComputable) {
|
|
1638
|
-
const resp = { ...context, status: xhr.status }, ratio = data.loaded / data.total;
|
|
1648
|
+
const resp = { ...context, status: xhr.status }, ratio = data.loaded / data.total, { percent, text } = getProgressValues(ratio);
|
|
1639
1649
|
resp.progress = {
|
|
1640
1650
|
name,
|
|
1641
1651
|
loaded: data.loaded,
|
|
1642
1652
|
total: data.total,
|
|
1643
1653
|
timestamp: (new Date(data.timeStamp)).getTime(),
|
|
1644
1654
|
ratio,
|
|
1645
|
-
percent
|
|
1655
|
+
percent,
|
|
1656
|
+
text,
|
|
1646
1657
|
};
|
|
1647
1658
|
callback?.(resp);
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
resp.progress.percent = 100;
|
|
1659
|
+
if (ratio >= 1) {
|
|
1660
|
+
Object.assign(resp.progress, getProgressValues(1));
|
|
1651
1661
|
config?.onComplete?.(resp);
|
|
1652
1662
|
}
|
|
1653
1663
|
}
|
|
@@ -1685,8 +1695,15 @@ const ajax = (options) => {
|
|
|
1685
1695
|
config[`on${capitalize(context.type)}`]?.({ ...context });
|
|
1686
1696
|
return;
|
|
1687
1697
|
}
|
|
1698
|
+
//tiemeout事件也会执行这里,此时需要让它触发onTimeout事件
|
|
1699
|
+
//abort和timeout行为的status是0
|
|
1700
|
+
//不过abort行为不会执行到这里
|
|
1701
|
+
if (xhr.status === 0 && context.type !== 'abort') {
|
|
1702
|
+
return;
|
|
1703
|
+
}
|
|
1688
1704
|
//已经请求成功,不会有timeout事件,也不需要abort了,所以移除abort事件
|
|
1689
1705
|
cleanup();
|
|
1706
|
+
//根据状态码判断响应结果
|
|
1690
1707
|
const isInformation = xhr.status >= 100 && xhr.status < 200, isSuccess = (xhr.status >= 200 && xhr.status < 300) || xhr.status === 304, isRedirection = xhr.status >= 300 && xhr.status < 400, isClientError = xhr.status >= 400 && xhr.status < 500, isServerError = xhr.status >= 500 && xhr.status < 600;
|
|
1691
1708
|
//已经获得返回数据
|
|
1692
1709
|
if (isSuccess) {
|
|
@@ -1781,6 +1798,90 @@ const ajax = (options) => {
|
|
|
1781
1798
|
});
|
|
1782
1799
|
ajax.all = (requests) => Promise.all(requests.map(ajax));
|
|
1783
1800
|
|
|
1801
|
+
const stringToEncodings = (name, options = {}) => {
|
|
1802
|
+
// Default: Supplementary Private Use Area (Plane 15 and Plane 16)
|
|
1803
|
+
//1,114,110 places,5000 strings => 0 collision
|
|
1804
|
+
const start = options.start ?? 0xF0000, end = options.end ?? 0x10FFFD, range = BigInt(end - start + 1), registry = options.registryMap,
|
|
1805
|
+
|
|
1806
|
+
formatResult = (name, codePoint, hash, collision) => {
|
|
1807
|
+
const hex = codePoint.toString(16).toUpperCase();
|
|
1808
|
+
return {
|
|
1809
|
+
name,
|
|
1810
|
+
unicode: `U+${hex}`,
|
|
1811
|
+
htmlDec: `&#${codePoint};`,
|
|
1812
|
+
htmlHex: `&#x${hex};`,
|
|
1813
|
+
hex,
|
|
1814
|
+
codePoint,
|
|
1815
|
+
hash,
|
|
1816
|
+
collision,
|
|
1817
|
+
};
|
|
1818
|
+
};
|
|
1819
|
+
// -----------------------------
|
|
1820
|
+
// 1. Compute FNV-1a 64-bit hash
|
|
1821
|
+
// -----------------------------
|
|
1822
|
+
let hash = BigInt("0xcbf29ce484222325");
|
|
1823
|
+
const prime = BigInt("0x100000001b3");
|
|
1824
|
+
for (const ch of name) {
|
|
1825
|
+
hash ^= BigInt(ch.codePointAt(0));
|
|
1826
|
+
hash *= prime;
|
|
1827
|
+
}
|
|
1828
|
+
const hashHex = hash.toString(16).toUpperCase();
|
|
1829
|
+
// -----------------------------
|
|
1830
|
+
// 2. Stateless mode (no registry)
|
|
1831
|
+
// -----------------------------
|
|
1832
|
+
if (!registry) {
|
|
1833
|
+
const offset = Number(hash % range), codePoint = start + offset;
|
|
1834
|
+
return formatResult(name, codePoint, hashHex, false);
|
|
1835
|
+
}
|
|
1836
|
+
// -----------------------------
|
|
1837
|
+
// 3. Registry mode (0 collision)
|
|
1838
|
+
// -----------------------------
|
|
1839
|
+
// Already assigned → return stable mapping
|
|
1840
|
+
if (registry.has(name)) {
|
|
1841
|
+
return formatResult(name, registry.get(name), hashHex, false);
|
|
1842
|
+
}
|
|
1843
|
+
// Initial candidate from hash
|
|
1844
|
+
let offset = Number(hash % range), codePoint = start + offset, collision = false;
|
|
1845
|
+
const used = new Set(registry.values());
|
|
1846
|
+
// Linear probing to resolve collisions
|
|
1847
|
+
while (used.has(codePoint)) {
|
|
1848
|
+
collision = true;
|
|
1849
|
+
offset = (offset + 1) % Number(range);
|
|
1850
|
+
codePoint = start + offset;
|
|
1851
|
+
}
|
|
1852
|
+
// Commit allocation
|
|
1853
|
+
registry.set(name, codePoint);
|
|
1854
|
+
return formatResult(name, codePoint, hashHex, collision);
|
|
1855
|
+
};
|
|
1856
|
+
|
|
1857
|
+
const unicodeToEncodings = (input) => {
|
|
1858
|
+
let codePoint;
|
|
1859
|
+
if (typeof input === "number") {
|
|
1860
|
+
codePoint = input;
|
|
1861
|
+
}
|
|
1862
|
+
else {
|
|
1863
|
+
const cleaned = input.trim()
|
|
1864
|
+
.replace(/^U\+/i, "")
|
|
1865
|
+
.replace(/^0x/i, "");
|
|
1866
|
+
codePoint = /^[0-9A-F]+$/i.test(cleaned)
|
|
1867
|
+
? parseInt(cleaned, 16)
|
|
1868
|
+
: parseInt(cleaned, 10);
|
|
1869
|
+
}
|
|
1870
|
+
// Validate parsed code point
|
|
1871
|
+
if (!Number.isFinite(codePoint)) {
|
|
1872
|
+
throw new Error("Invalid Unicode input");
|
|
1873
|
+
}
|
|
1874
|
+
// Convert code point to uppercase hexadecimal representation
|
|
1875
|
+
const hex = codePoint.toString(16).toUpperCase();
|
|
1876
|
+
return {
|
|
1877
|
+
unicode: `U+${hex}`,
|
|
1878
|
+
hex,
|
|
1879
|
+
codePoint,
|
|
1880
|
+
htmlDec: `&#${codePoint};`,
|
|
1881
|
+
htmlHex: `&#x${hex};`,
|
|
1882
|
+
};
|
|
1883
|
+
};
|
|
1884
|
+
|
|
1784
1885
|
const utils = {
|
|
1785
1886
|
//executeStr,
|
|
1786
1887
|
getDataType,
|
|
@@ -1830,6 +1931,8 @@ const utils = {
|
|
|
1830
1931
|
ajax,
|
|
1831
1932
|
capitalize,
|
|
1832
1933
|
cleanQueryString,
|
|
1934
|
+
stringToEncodings,
|
|
1935
|
+
unicodeToEncodings,
|
|
1833
1936
|
};
|
|
1834
1937
|
|
|
1835
1938
|
export { utils as default };
|