@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.
Files changed (36) hide show
  1. package/CHANGELOG.md +21 -2
  2. package/dist/utils.cjs.js +110 -7
  3. package/dist/utils.cjs.min.js +3 -3
  4. package/dist/utils.esm.js +110 -7
  5. package/dist/utils.esm.min.js +3 -3
  6. package/dist/utils.umd.js +110 -7
  7. package/dist/utils.umd.min.js +3 -3
  8. package/dist.zip +0 -0
  9. package/examples/ajax-download.html +94 -0
  10. package/examples/ajax-hook.html +2 -2
  11. package/examples/ajax-signal.html +91 -0
  12. package/examples/ajax-timeout.html +85 -0
  13. package/examples/stringToEncodings-collision-test-registry.html +117 -0
  14. package/examples/stringToEncodings-collision-test.html +71 -0
  15. package/examples/stringToEncodings.html +138 -0
  16. package/examples/unicodeToEncodings.html +195 -0
  17. package/modules.js +5 -1
  18. package/modules.ts +5 -1
  19. package/package.json +1 -1
  20. package/src/ajax.js +23 -6
  21. package/src/ajax.ts +30 -10
  22. package/src/stringToEncodings.js +56 -0
  23. package/src/stringToEncodings.ts +110 -0
  24. package/src/unicodeToEncodings.js +51 -0
  25. package/src/unicodeToEncodings.ts +55 -0
  26. package/src/arrayMutableMethods - /345/211/257/346/234/254.js" +0 -5
  27. package/src/capitalize - /345/211/257/346/234/254.js" +0 -19
  28. package/src/comma - /345/211/257/346/234/254.js" +0 -2
  29. package/src/deepCloneToJSON - /345/211/257/346/234/254.js" +0 -47
  30. package/src/deepMergeMaps - /345/211/257/346/234/254.js" +0 -78
  31. package/src/escapeHTML - /345/211/257/346/234/254.js" +0 -29
  32. package/src/getDataType - /345/211/257/346/234/254.js" +0 -38
  33. package/src/isEmpty - /345/211/257/346/234/254.js" +0 -45
  34. package/src/mapMutableMethods - /345/211/257/346/234/254.js" +0 -5
  35. package/src/setMutableMethods - /345/211/257/346/234/254.js" +0 -5
  36. 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.20/dist/js/utils.js
9
- * **Zip**:https://unpkg.com/@codady/utils@0.0.20/dist.zip
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-1-20 16:40:28
3
+ * @since Last modified: 2026-2-5 17:4:41
4
4
  * @name Utils for web front-end.
5
- * @version 0.0.38
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: Math.round(ratio * 100),
1657
+ percent,
1658
+ text,
1648
1659
  };
1649
1660
  callback?.(resp);
1650
- //到达100%执行complete
1651
- if (resp.progress.percent >= 100) {
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;
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @since Last modified: 2026-1-20 16:40:28
2
+ * @since Last modified: 2026-2-5 17:4:41
3
3
  * @name Utils for web front-end.
4
- * @version 0.0.38
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:{"&":"&amp;","<":"&lt;",">":"&gt;"},attribute:{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&apos;","`":"&#x60;"},content:{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&apos;","/":"&#x2F;"},uri:{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&apos;","(":"&#40;",")":"&#41;","[":"&#91;","]":"&#93;"},paranoid:{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&apos;","`":"&#x60;","/":"&#x2F;","=":"&#x3D;","!":"&#x21;","#":"&#x23;","(":"&#40;",")":"&#41;","[":"&#91;","]":"&#93;","{":"&#x7B;","}":"&#x7D;",":":"&#x3A;",";":"&#x3B;"}},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:{"&":"&amp;","<":"&lt;",">":"&gt;"},attribute:{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&apos;","`":"&#x60;"},content:{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&apos;","/":"&#x2F;"},uri:{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&apos;","(":"&#40;",")":"&#41;","[":"&#91;","]":"&#93;"},paranoid:{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&apos;","`":"&#x60;","/":"&#x2F;","=":"&#x3D;","!":"&#x21;","#":"&#x23;","(":"&#40;",")":"&#41;","[":"&#91;","]":"&#93;","{":"&#x7B;","}":"&#x7D;",":":"&#x3A;",";":"&#x3B;"}},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-1-20 16:40:28
3
+ * @since Last modified: 2026-2-5 17:4:41
4
4
  * @name Utils for web front-end.
5
- * @version 0.0.38
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: Math.round(ratio * 100),
1655
+ percent,
1656
+ text,
1646
1657
  };
1647
1658
  callback?.(resp);
1648
- //到达100%执行complete
1649
- if (resp.progress.percent >= 100) {
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 };