@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/dist/utils.esm.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
|
-
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};export{utils as default};
|
|
15
|
+
const getDataType=e=>{let t,r=Object.prototype.toString.call(e).slice(8,-1);return t="Function"===r&&/^\s*class\s+/.test(e.toString())?"Class":"Object"===r&&Object.getPrototypeOf(e)!==Object.prototype?"Instance":r,t},deepClone=(e,t={})=>{const r=getDataType(e),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};export{utils as default};
|
package/dist/utils.umd.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}
|
|
@@ -1465,6 +1465,7 @@
|
|
|
1465
1465
|
signal: null,
|
|
1466
1466
|
xhrFields: {},
|
|
1467
1467
|
cacheBustKey: '_t',
|
|
1468
|
+
precision: 2,
|
|
1468
1469
|
//
|
|
1469
1470
|
onAbort: null,
|
|
1470
1471
|
onTimeout: null,
|
|
@@ -1569,6 +1570,10 @@
|
|
|
1569
1570
|
config?.onTimeout?.(resp);
|
|
1570
1571
|
//reject只能接受一个参数
|
|
1571
1572
|
config.catchError ? reject(resp) : resolve(resp);
|
|
1573
|
+
//超时也是不能获得数据的行为,定义为failure
|
|
1574
|
+
config?.onFailure?.(resp);
|
|
1575
|
+
//timeout会经过onreadystatechange,但是被及时的return了,所以这里多加一行
|
|
1576
|
+
config?.onFinish?.(resp);
|
|
1572
1577
|
},
|
|
1573
1578
|
//报错监听
|
|
1574
1579
|
errorHandler = (resp) => {
|
|
@@ -1594,6 +1599,8 @@
|
|
|
1594
1599
|
config.catchError ? reject(resp) : resolve(resp);
|
|
1595
1600
|
//回调,status和content在此确认
|
|
1596
1601
|
config?.onAbort?.(resp);
|
|
1602
|
+
//abort行为不会经过onreadystatechange,这里需要多这一行以表示xhr的完成(结束)
|
|
1603
|
+
config?.onFinish?.(resp);
|
|
1597
1604
|
}, abortHandlerWithSignal = () => {
|
|
1598
1605
|
//先中止请求,防止触发其他 readystate 事件
|
|
1599
1606
|
xhr.abort();
|
|
@@ -1637,23 +1644,26 @@
|
|
|
1637
1644
|
type: 'unset',
|
|
1638
1645
|
//上传和下载进度
|
|
1639
1646
|
progress: {}
|
|
1647
|
+
}, getProgressValues = (ratio) => {
|
|
1648
|
+
let text = (ratio * 100).toFixed(config.precision);
|
|
1649
|
+
return { percent: parseFloat(text), text };
|
|
1640
1650
|
},
|
|
1641
1651
|
//定义进度函数
|
|
1642
1652
|
progressHandler = (name, data, callback) => {
|
|
1643
1653
|
if (data.lengthComputable) {
|
|
1644
|
-
const resp = { ...context, status: xhr.status }, ratio = data.loaded / data.total;
|
|
1654
|
+
const resp = { ...context, status: xhr.status }, ratio = data.loaded / data.total, { percent, text } = getProgressValues(ratio);
|
|
1645
1655
|
resp.progress = {
|
|
1646
1656
|
name,
|
|
1647
1657
|
loaded: data.loaded,
|
|
1648
1658
|
total: data.total,
|
|
1649
1659
|
timestamp: (new Date(data.timeStamp)).getTime(),
|
|
1650
1660
|
ratio,
|
|
1651
|
-
percent
|
|
1661
|
+
percent,
|
|
1662
|
+
text,
|
|
1652
1663
|
};
|
|
1653
1664
|
callback?.(resp);
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
resp.progress.percent = 100;
|
|
1665
|
+
if (ratio >= 1) {
|
|
1666
|
+
Object.assign(resp.progress, getProgressValues(1));
|
|
1657
1667
|
config?.onComplete?.(resp);
|
|
1658
1668
|
}
|
|
1659
1669
|
}
|
|
@@ -1691,8 +1701,15 @@
|
|
|
1691
1701
|
config[`on${capitalize(context.type)}`]?.({ ...context });
|
|
1692
1702
|
return;
|
|
1693
1703
|
}
|
|
1704
|
+
//tiemeout事件也会执行这里,此时需要让它触发onTimeout事件
|
|
1705
|
+
//abort和timeout行为的status是0
|
|
1706
|
+
//不过abort行为不会执行到这里
|
|
1707
|
+
if (xhr.status === 0 && context.type !== 'abort') {
|
|
1708
|
+
return;
|
|
1709
|
+
}
|
|
1694
1710
|
//已经请求成功,不会有timeout事件,也不需要abort了,所以移除abort事件
|
|
1695
1711
|
cleanup();
|
|
1712
|
+
//根据状态码判断响应结果
|
|
1696
1713
|
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;
|
|
1697
1714
|
//已经获得返回数据
|
|
1698
1715
|
if (isSuccess) {
|
|
@@ -1787,6 +1804,90 @@
|
|
|
1787
1804
|
});
|
|
1788
1805
|
ajax.all = (requests) => Promise.all(requests.map(ajax));
|
|
1789
1806
|
|
|
1807
|
+
const stringToEncodings = (name, options = {}) => {
|
|
1808
|
+
// Default: Supplementary Private Use Area (Plane 15 and Plane 16)
|
|
1809
|
+
//1,114,110 places,5000 strings => 0 collision
|
|
1810
|
+
const start = options.start ?? 0xF0000, end = options.end ?? 0x10FFFD, range = BigInt(end - start + 1), registry = options.registryMap,
|
|
1811
|
+
|
|
1812
|
+
formatResult = (name, codePoint, hash, collision) => {
|
|
1813
|
+
const hex = codePoint.toString(16).toUpperCase();
|
|
1814
|
+
return {
|
|
1815
|
+
name,
|
|
1816
|
+
unicode: `U+${hex}`,
|
|
1817
|
+
htmlDec: `&#${codePoint};`,
|
|
1818
|
+
htmlHex: `&#x${hex};`,
|
|
1819
|
+
hex,
|
|
1820
|
+
codePoint,
|
|
1821
|
+
hash,
|
|
1822
|
+
collision,
|
|
1823
|
+
};
|
|
1824
|
+
};
|
|
1825
|
+
// -----------------------------
|
|
1826
|
+
// 1. Compute FNV-1a 64-bit hash
|
|
1827
|
+
// -----------------------------
|
|
1828
|
+
let hash = BigInt("0xcbf29ce484222325");
|
|
1829
|
+
const prime = BigInt("0x100000001b3");
|
|
1830
|
+
for (const ch of name) {
|
|
1831
|
+
hash ^= BigInt(ch.codePointAt(0));
|
|
1832
|
+
hash *= prime;
|
|
1833
|
+
}
|
|
1834
|
+
const hashHex = hash.toString(16).toUpperCase();
|
|
1835
|
+
// -----------------------------
|
|
1836
|
+
// 2. Stateless mode (no registry)
|
|
1837
|
+
// -----------------------------
|
|
1838
|
+
if (!registry) {
|
|
1839
|
+
const offset = Number(hash % range), codePoint = start + offset;
|
|
1840
|
+
return formatResult(name, codePoint, hashHex, false);
|
|
1841
|
+
}
|
|
1842
|
+
// -----------------------------
|
|
1843
|
+
// 3. Registry mode (0 collision)
|
|
1844
|
+
// -----------------------------
|
|
1845
|
+
// Already assigned → return stable mapping
|
|
1846
|
+
if (registry.has(name)) {
|
|
1847
|
+
return formatResult(name, registry.get(name), hashHex, false);
|
|
1848
|
+
}
|
|
1849
|
+
// Initial candidate from hash
|
|
1850
|
+
let offset = Number(hash % range), codePoint = start + offset, collision = false;
|
|
1851
|
+
const used = new Set(registry.values());
|
|
1852
|
+
// Linear probing to resolve collisions
|
|
1853
|
+
while (used.has(codePoint)) {
|
|
1854
|
+
collision = true;
|
|
1855
|
+
offset = (offset + 1) % Number(range);
|
|
1856
|
+
codePoint = start + offset;
|
|
1857
|
+
}
|
|
1858
|
+
// Commit allocation
|
|
1859
|
+
registry.set(name, codePoint);
|
|
1860
|
+
return formatResult(name, codePoint, hashHex, collision);
|
|
1861
|
+
};
|
|
1862
|
+
|
|
1863
|
+
const unicodeToEncodings = (input) => {
|
|
1864
|
+
let codePoint;
|
|
1865
|
+
if (typeof input === "number") {
|
|
1866
|
+
codePoint = input;
|
|
1867
|
+
}
|
|
1868
|
+
else {
|
|
1869
|
+
const cleaned = input.trim()
|
|
1870
|
+
.replace(/^U\+/i, "")
|
|
1871
|
+
.replace(/^0x/i, "");
|
|
1872
|
+
codePoint = /^[0-9A-F]+$/i.test(cleaned)
|
|
1873
|
+
? parseInt(cleaned, 16)
|
|
1874
|
+
: parseInt(cleaned, 10);
|
|
1875
|
+
}
|
|
1876
|
+
// Validate parsed code point
|
|
1877
|
+
if (!Number.isFinite(codePoint)) {
|
|
1878
|
+
throw new Error("Invalid Unicode input");
|
|
1879
|
+
}
|
|
1880
|
+
// Convert code point to uppercase hexadecimal representation
|
|
1881
|
+
const hex = codePoint.toString(16).toUpperCase();
|
|
1882
|
+
return {
|
|
1883
|
+
unicode: `U+${hex}`,
|
|
1884
|
+
hex,
|
|
1885
|
+
codePoint,
|
|
1886
|
+
htmlDec: `&#${codePoint};`,
|
|
1887
|
+
htmlHex: `&#x${hex};`,
|
|
1888
|
+
};
|
|
1889
|
+
};
|
|
1890
|
+
|
|
1790
1891
|
const utils = {
|
|
1791
1892
|
//executeStr,
|
|
1792
1893
|
getDataType,
|
|
@@ -1836,6 +1937,8 @@
|
|
|
1836
1937
|
ajax,
|
|
1837
1938
|
capitalize,
|
|
1838
1939
|
cleanQueryString,
|
|
1940
|
+
stringToEncodings,
|
|
1941
|
+
unicodeToEncodings,
|
|
1839
1942
|
};
|
|
1840
1943
|
|
|
1841
1944
|
return utils;
|
package/dist/utils.umd.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
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).utils=t()}(this,function(){"use strict";const getDataType=e=>{let t,r=Object.prototype.toString.call(e).slice(8,-1);return t="Function"===r&&/^\s*class\s+/.test(e.toString())?"Class":"Object"===r&&Object.getPrototypeOf(e)!==Object.prototype?"Instance":r,t},deepClone=(e,t={})=>{const r=getDataType(e),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},e=["push","pop","shift","unshift","splice","sort","reverse","copyWithin","fill"],t={basic:{"&":"&","<":"<",">":">"},attribute:{"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},content:{"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"},uri:{"&":"&","<":"<",">":">",'"':""","'":"'","(":"(",")":")","[":"[","]":"]"},paranoid:{"&":"&","<":"<",">":">",'"':""","'":"'","`":"`","/":"/","=":"=","!":"!","#":"#","(":"(",")":")","[":"[","]":"]","{":"{","}":"}",":":":",";":";"}},r=Object.keys(t).reduce((e,r)=>{const n=Object.keys(t[r]).map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"));return e[r]=new RegExp(`[${n.join("")}]`,"g"),e},{}),escapeHTML=(e,n="attribute")=>{if("string"!=typeof e)return"";const a=t[n],s=r[n];return e.replace(s,e=>a[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},n=["add","delete","clear"],a=["set","delete","clear"],copyObjectWithSymbol=e=>{if(!e||"object"!=typeof e)return e;const t=e,r=Object.getOwnPropertySymbols(t).reduce((e,r)=>(e[r]=t[r],e),{});return{...t,...r}},shallowCopy=(e,t={})=>{const r=getDataType(e);return"Set"===r?new Set([...e]):"Map"===r?new Map([...e]):Array.isArray(e)?[...e]:"object"===r?copyObjectWithSymbol(e):"Date"===r?new Date(e.getTime()):"RegExp"===r?new RegExp(e.source,e.flags):"Buffer"===r?Buffer.from(e):"ArrayBuffer"===r||ArrayBuffer.isView(e)?e.slice(0):"WeakSet"===r?new WeakSet([...e]):"WeakMap"===r?new WeakMap([...e]):"Error"===r?new Error(e.message):e},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)},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},s="rep",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)})},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",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)},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)},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:{}},progressHandler=(e,r,n)=>{if(r.lengthComputable){const s={...i,status:a.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)},n?.(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&&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})}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));return{getDataType:getDataType,requireTypes:requireTypes,deepClone:deepClone,deepCloneToJSON:deepCloneToJSON,wrapArrayMethods:({target:t,onBeforeMutate:r=()=>{},onAfterMutate:n=()=>{},allowList:a,props:s={}})=>{if(!Array.isArray(t))throw new TypeError("The 'target' parameter must be an array.");a&&!a?.length||(a=e);const o={};for(let e of a)o[e]=function(...a){const o={},i=t.length;switch(e){case"push":case"unshift":o.addedItems=[...a];break;case"pop":o.poppedItem=t[i-1];break;case"shift":o.shiftedItem=t[0];break;case"splice":const[e,r]=a,n=e<0?Math.max(i+e,0):Math.min(e,i),s=void 0===r?i-n:r;o.deletedItems=t.slice(n,n+s);break;case"sort":case"reverse":o.oldSnapshot=[...t];break;case"fill":case"copyWithin":const l=a[1]||0,c=void 0===a[2]?i:a[2];o.oldItems=t.slice(l,c),o.start=l,o.end=c}r?.(o);const l=Array.prototype[e].apply(t,a),c={value:l,key:e,args:a,context:o,target:t,...s};return n?.(c),l};return o},arrayMutableMethods:e,setMutableMethods:n,mapMutableMethods:a,wrapSetMethods:({target:e,onBeforeMutate:t=()=>{},onAfterMutate:r=()=>{},allowList:a=n,props:s={}})=>{if(!(e instanceof Set))throw new TypeError("The 'target' parameter must be a Set.");const o={},createWrappedMethod=n=>function(...a){const o={};switch(n){case"add":{const[t]=a;o.addedItem=t,o.existed=e.has(t);break}case"delete":{const[t]=a;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,a),l={method:n,result:i,args:a,context:o,target:e,...s};return r(l),i};for(const e of a)n.includes(e)&&(o[e]=createWrappedMethod(e));return Object.defineProperty(o,"target",{get:()=>e,enumerable:!1,configurable:!1}),o},wrapMapMethods:({target:e,onBeforeMutate:t=()=>{},onAfterMutate:r=()=>{},allowList:n=a,props:s={}})=>{if(!(e instanceof Map))throw new TypeError("The 'target' parameter must be a Map.");const o={},createWrappedMethod=n=>function(...a){const o={};switch(n){case"set":{const[t,r]=a;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]=a;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,a),l={method:n,result:i,args:a,context:o,target:e,...s};return r(l),i};for(const e of n)a.includes(e)&&(o[e]=createWrappedMethod(e));return Object.defineProperty(o,"target",{get:()=>e,enumerable:!1,configurable:!1}),o},getUniqueId:getUniqueId,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},shallowCopy:shallowCopy,copyObjectWithSymbol:copyObjectWithSymbol,getEl:getEl,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:createEl,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:s,COMMA:",",SPACE:" ",trim:trim,parseClasses:parseClasses,getClasses:e=>{let t=getEl(e);return t?parseClasses(t.getAttribute("class")||""):[]},addClasses:addClasses,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)})},createTools:e=>{const t=createEl("span",{class:"ax-box-tools"}),renderFn=e=>{const t={},r=e.extendable?`<i ${s}="arrow"></i>`:"",n=(e.icon?`<i ${s}="icon">${e.icon}</i>`:"")+(e.disk?`<i ${s}="disk"><img src="${e.disk}"/></i>`:"")+(e.cube?`<i ${s}="cube"><img src="${e.cube}"/></i>`:"")+(e.image?`<i ${s}="image"><img src="${e.image}"/></i>`:"")+(e.label?`<i ${s}="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(`[${s}="icon"]`),e.cubeEl=e.wrapEl.querySelector(`[${s}="cube"]`),e.diskEl=e.wrapEl.querySelector(`[${s}="disk"]`),e.imageEl=e.wrapEl.querySelector(`[${s}="image"]`),e.labelEl=e.wrapEl.querySelector(`[${s}="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},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},escapeCharsMaps:t,escapeRegexMaps:r,escapeHTML:escapeHTML,toSingleLine:toSingleLine,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},getBodyHTML:getBodyHTML,getUrlHash:getUrlHash,buildUrl:buildUrl,ajax:ajax,capitalize:capitalize,cleanQueryString:cleanQueryString}});
|
|
15
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).utils=t()}(this,function(){"use strict";const getDataType=e=>{let t,r=Object.prototype.toString.call(e).slice(8,-1);return t="Function"===r&&/^\s*class\s+/.test(e.toString())?"Class":"Object"===r&&Object.getPrototypeOf(e)!==Object.prototype?"Instance":r,t},deepClone=(e,t={})=>{const r=getDataType(e),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 s,o=!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 s of r)t[s]=deepClone(e[s],{...n,parent:e});s=t}else if("Array"===r&&n.cloneArray)s=e.map(t=>deepClone(t,{...n,parent:e}));else if("Map"===r&&n.cloneMap){const t=new Map;for(const[r,s]of e)t.set(deepClone(r,n),deepClone(s,{...n,parent:e}));s=t}else if("Set"===r&&n.cloneSet){const t=new Set;for(const r of e)t.add(deepClone(r,{...n,parent:e}));s=t}else if("Date"===r&&n.cloneDate)s=new Date(e.getTime());else if("RegExp"===r&&n.cloneRegex){const t=e;s=new RegExp(t.source,t.flags)}else s=e,o=!1;return n.onAfterClone?.({output:s,input:e,type:r,cloned:o,parent:n.parent}),s},deepCloneToJSON=e=>{const t=getDataType(e);if("Object"===t){const t={};for(const r in e)t[r]=deepCloneToJSON(e[r]);for(const e in t)void 0===t[e]&&Reflect.deleteProperty(t,e);return t}if("Array"===t){return e.map((e,t)=>deepCloneToJSON(e)).filter(e=>void 0!==e)}return["Number","String","Boolean","Null"].includes(t)?e:void 0},e=["push","pop","shift","unshift","splice","sort","reverse","copyWithin","fill"],t={basic:{"&":"&","<":"<",">":">"},attribute:{"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},content:{"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"},uri:{"&":"&","<":"<",">":">",'"':""","'":"'","(":"(",")":")","[":"[","]":"]"},paranoid:{"&":"&","<":"<",">":">",'"':""","'":"'","`":"`","/":"/","=":"=","!":"!","#":"#","(":"(",")":")","[":"[","]":"]","{":"{","}":"}",":":":",";":";"}},r=Object.keys(t).reduce((e,r)=>{const n=Object.keys(t[r]).map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"));return e[r]=new RegExp(`[${n.join("")}]`,"g"),e},{}),escapeHTML=(e,n="attribute")=>{if("string"!=typeof e)return"";const s=t[n],o=r[n];return e.replace(o,e=>s[e])},getUniqueId=(e={})=>{const t=e.prefix,r=e.suffix,n=e.base10,s=e.base36;return`${t?t+"-":""}${Date.now()}${s?"-"+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],s=getDataType(e),o=s.toLowerCase(),a=n.map(e=>e.toLowerCase()),i=o.includes("html")?"element":o;if(r)try{if(!a.includes(i))throw new TypeError(`Expected data type(s): [${a.join(", ")}], but got: ${i}`)}catch(e){r(e,s)}else if(!a.includes(i))throw new TypeError(`Expected data type(s): [${a.join(", ")}], but got: ${i}`);return s},toSingleLine=(e,t=!1)=>{const r=e.replace(/[\r\t\n]/g,"");return t?r.replace(/\s+/g," "):r},n=["add","delete","clear"],s=["set","delete","clear"],copyObjectWithSymbol=e=>{if(!e||"object"!=typeof e)return e;const t=e,r=Object.getOwnPropertySymbols(t).reduce((e,r)=>(e[r]=t[r],e),{});return{...t,...r}},shallowCopy=(e,t={})=>{const r=getDataType(e);return"Set"===r?new Set([...e]):"Map"===r?new Map([...e]):Array.isArray(e)?[...e]:"object"===r?copyObjectWithSymbol(e):"Date"===r?new Date(e.getTime()):"RegExp"===r?new RegExp(e.source,e.flags):"Buffer"===r?Buffer.from(e):"ArrayBuffer"===r||ArrayBuffer.isView(e)?e.slice(0):"WeakSet"===r?new WeakSet([...e]):"WeakMap"===r?new WeakMap([...e]):"Error"===r?new Error(e.message):e},getEl=(e,t=document.body)=>{let r=getDataType(e),n=getDataType(t),s=n.includes("HTML")||"ShadowRoot"===n?t:document.querySelector(t),o=s&&s instanceof HTMLTemplateElement?s.content:s,a=null;if(e)if(r.includes("HTML"))a=e;else if("String"===r)try{a=(o||document).querySelector(e.trim())}catch{a=null}return a},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)},createEl=(e,t,r)=>{let n=(e=e||"div").toUpperCase().trim(),s=document.createElement(n),o=getDataType(t);if(t&&"Object"===o)for(let e in t)t.hasOwnProperty(e)&&s.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)})(s,r),s},o="rep",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),s=parseClasses(t);n&&0!==s.length&&s.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)})},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 s=e.indexOf("#");let o="",a=e;-1!==s&&(o=e.slice(s),a=e.slice(0,s));const i=new URL(a,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()+o},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 s=new XMLHttpRequest,o=null,a=t?.headers?.["Content-Type"]||t?.headers?.["content-type"];if(!isEmpty(t.data)){let e=getDataType(t.data);"FormData"===e?(o=t.data,a&&(delete t.headers["Content-Type"],delete t.headers["content-type"])):"Object"===e?a?o=a?.includes("application/json")?JSON.stringify(t.data):t.data:(o=new URLSearchParams(t.data).toString(),n.includes(r)||(t.headers["Content-Type"]="application/x-www-form-urlencoded")):"String"===e&&(!a||a.includes("urlencoded"))?(o=cleanQueryString(t.data.trim()),n.includes(r)||a||(t.headers["Content-Type"]="application/x-www-form-urlencoded")):o=t.data}s.timeout=t.timeout,t.responseType&&(s.responseType=t.responseType);const i=new Promise((e,a)=>{const timeoutHandler=()=>{cleanup();let r={...i,status:s.status,content:s.response,type:"timeout"};t?.onTimeout?.(r),t.catchError?a(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?a(r):e(r)},abortHandler=()=>{cleanup();const r={...i,status:s.status,type:"abort"};t.catchError?a(r):e(r),t?.onAbort?.(r),t?.onFinish?.(r)},abortHandlerWithSignal=()=>{s.abort(),abortHandler()},cleanup=()=>{t.signal&&t.signal.removeEventListener("abort",abortHandlerWithSignal),t.onError&&s.removeEventListener("error",errorHandler),t.onTimeout&&s.removeEventListener("timeout",timeoutHandler),t.onUpload&&s.upload.removeEventListener("progress",uploadProgressHandler),t.onDownload&&s.removeEventListener("progress",downloadProgressHandler),s.onreadystatechange=null},i={xhr:s,data:o,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 o={...i,status:s.status},a=r.loaded/r.total,{percent:l,text:c}=getProgressValues(a);o.progress={name:e,loaded:r.loaded,total:r.total,timestamp:new Date(r.timeStamp).getTime(),ratio:a,percent:l,text:c},n?.(o),a>=1&&(Object.assign(o.progress,getProgressValues(1)),t?.onComplete?.(o))}},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&&s.upload.addEventListener("progress",uploadProgressHandler),t.onDownload&&s.addEventListener("progress",downloadProgressHandler),t.onError&&s.addEventListener("error",errorHandler),t.onTimeout&&s.addEventListener("timeout",timeoutHandler),t.onAbort&&s.addEventListener("abort",abortHandler),t.onCreated?.({...i,type:"created"}),s.onreadystatechange=function(){i.stage=s.readyState,i.status=s.status;const r={1:"opened",2:"headersReceived",3:"loading"};if(s.readyState<4){if(!s.readyState)return;return i.type=r[s.readyState],void t[`on${capitalize(i.type)}`]?.({...i})}if(0===s.status&&"abort"!==i.type)return;cleanup();const n=s.status>=100&&s.status<200,o=s.status>=200&&s.status<300||304===s.status,a=s.status>=300&&s.status<400,l=s.status>=400&&s.status<500,c=s.status>=500&&s.status<600;if(o){if(t.responseType&&"text"!==s.responseType)i.content=s.response;else{let e=s.responseText.trim(),r="";if(e.startsWith("[")&&e.endsWith("]")||e.startsWith("{")&&e.endsWith("}"))try{r=JSON.parse(e)}catch{r=s.responseText}else if(/(<\/html>|<\/body>)/i.test(e)){let n=getUrlHash(t.url);r=getBodyHTML(e,t.selector||n)}else r=s.responseText;i.content=r}i.type="success",p={...i},t?.onSuccess?.(p),e(p)}else i.content=s.response,i.type=n?"infomation":a?"redirection":l?"client-error":c?"server-error":"unknown-error",n?t?.onInformation?.({...i}):a?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:o,cacheBustKey:t.cacheBustKey,appendCacheBust:!0});l=[r,e,t.async]}for(let e in t.xhrFields)t.xhrFields.hasOwnProperty(e)&&(s[e]=t.xhrFields[e]);s.open(...l);for(let e in t.headers)t.headers.hasOwnProperty(e)&&!isEmpty(t.headers[e])&&s.setRequestHeader(e,t.headers[e]);t?.onBeforeSend?.({...i,status:s.status,type:"beforeSend"}),s.send(n.includes(r)?null:o||null)});return i.xhr=s,i.abort=()=>s.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));return{getDataType:getDataType,requireTypes:requireTypes,deepClone:deepClone,deepCloneToJSON:deepCloneToJSON,wrapArrayMethods:({target:t,onBeforeMutate:r=()=>{},onAfterMutate:n=()=>{},allowList:s,props:o={}})=>{if(!Array.isArray(t))throw new TypeError("The 'target' parameter must be an array.");s&&!s?.length||(s=e);const a={};for(let e of s)a[e]=function(...s){const a={},i=t.length;switch(e){case"push":case"unshift":a.addedItems=[...s];break;case"pop":a.poppedItem=t[i-1];break;case"shift":a.shiftedItem=t[0];break;case"splice":const[e,r]=s,n=e<0?Math.max(i+e,0):Math.min(e,i),o=void 0===r?i-n:r;a.deletedItems=t.slice(n,n+o);break;case"sort":case"reverse":a.oldSnapshot=[...t];break;case"fill":case"copyWithin":const l=s[1]||0,c=void 0===s[2]?i:s[2];a.oldItems=t.slice(l,c),a.start=l,a.end=c}r?.(a);const l=Array.prototype[e].apply(t,s),c={value:l,key:e,args:s,context:a,target:t,...o};return n?.(c),l};return a},arrayMutableMethods:e,setMutableMethods:n,mapMutableMethods:s,wrapSetMethods:({target:e,onBeforeMutate:t=()=>{},onAfterMutate:r=()=>{},allowList:s=n,props:o={}})=>{if(!(e instanceof Set))throw new TypeError("The 'target' parameter must be a Set.");const a={},createWrappedMethod=n=>function(...s){const a={};switch(n){case"add":{const[t]=s;a.addedItem=t,a.existed=e.has(t);break}case"delete":{const[t]=s;a.existed=e.has(t),a.deletedItem=a.existed?t:void 0;break}case"clear":a.clearedItems=Array.from(e),a.previousSize=e.size}t(a);const i=e[n].apply(e,s),l={method:n,result:i,args:s,context:a,target:e,...o};return r(l),i};for(const e of s)n.includes(e)&&(a[e]=createWrappedMethod(e));return Object.defineProperty(a,"target",{get:()=>e,enumerable:!1,configurable:!1}),a},wrapMapMethods:({target:e,onBeforeMutate:t=()=>{},onAfterMutate:r=()=>{},allowList:n=s,props:o={}})=>{if(!(e instanceof Map))throw new TypeError("The 'target' parameter must be a Map.");const a={},createWrappedMethod=n=>function(...s){const a={};switch(n){case"set":{const[t,r]=s;a.key=t,a.newValue=r,a.existed=e.has(t),a.oldValue=a.existed?e.get(t):void 0;break}case"delete":{const[t]=s;a.key=t,a.existed=e.has(t),a.value=a.existed?e.get(t):void 0;break}case"clear":a.clearedItems=Array.from(e.entries()),a.previousSize=e.size}t(a);const i=e[n].apply(e,s),l={method:n,result:i,args:s,context:a,target:e,...o};return r(l),i};for(const e of n)s.includes(e)&&(a[e]=createWrappedMethod(e));return Object.defineProperty(a,"target",{get:()=>e,enumerable:!1,configurable:!1}),a},getUniqueId:getUniqueId,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 s,o,a=getDataType(e),i=getDataType(t),l=!0;if(n.interceptor&&"function"==typeof n.interceptor){let r=n.interceptor({target:e,source:t,targetType:a,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:a,sourceType:i,parent:n.parent}),"Object"===a&&"Object"===i?(o=deepMergeObjects(e,t,n),s="Object"):"Array"===a&&"Array"===i?(o=deepMergeArrays(e,t,n),s="Array"):"Set"===a&&"Set"===i?(o=deepMergeSets(e,t,n),s="Set"):"Map"===a&&"Map"===i?(o=deepMergeMaps(e,t,n),s="Map"):(l=!1,o=e),n?.onAfterMerge?.({result:o,target:e,source:t,targetType:a,sourceType:i,mergeType:s,parent:r.parent}),{result:o,flag:l,mergeType:s}},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),s=getDataType(t);if("Object"!==n||"Object"!==s)return e;const o=Object.assign({inheritMissing:!0,targetClone:!1,useEnable:!0},r);let a={};a=o.targetClone?shallowCopy(e):e;for(let e in t){const n=a[e],s=t[e];if(t.hasOwnProperty(e)&&a.hasOwnProperty(e)){const t=smartMerger(n,s,{...r,parent:a});if(t.flag)t.mergeType?"Object"===t.mergeType&&(a[e]=t.result):a[e]=s;else{let t=o.useEnable?mergeEnableObject(n,s):s;n!==t&&null===t?"ignore"===o.nullBehavior||("delete"===o.nullBehavior?Reflect.deleteProperty(a,e):a[e]=t):n!==t&&void 0===t?"ignore"===o.undefinedBehavior||("delete"===o.undefinedBehavior?Reflect.deleteProperty(a,e):a[e]=s):a[e]=s}}else t.hasOwnProperty(e)&&!a.hasOwnProperty(e)&&o.inheritMissing&&(a[e]=s)}if(o.useSymbol){let e=Object.getOwnPropertySymbols(t);if(e.length)for(let r of e)a[r]=t[r]}return a},deepMergeArrays=(e,t,r={})=>{if(!Array.isArray(e)||!Array.isArray(t))return e;const n=Object.assign({dataMode:"clear",inheritMissing:!0,targetClone:!1},r),s=n.targetClone?[...e]:e;if("replace"===n.dataMode)for(let e=0;e<t.length&&(n.inheritMissing||!(e>=s.length));e++){smartMerger(s[e],t[e],{...n,parent:s}).flag||(s[e]=t[e])}else"concat"===n.dataMode||(s.length=0),s.push(...t);return s},deepMergeMaps=(e,t,r={})=>{if(!(e instanceof Map&&t instanceof Map))return e;const n=Object.assign({inheritMissing:!0,targetClone:!1,useEnable:!0},r),s=n.targetClone?new Map([...e]):e;for(const[e,o]of t.entries())if(s.has(e)){const t=s.get(e),r=o,a=smartMerger(t,r,n);a.flag?"Object"===a.mergeType&&s.set(e,a.result):s.set(e,r)}else r.inheritMissing&&s.set(e,o);return s},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),s=n.targetClone?new Set(...e):e;if("replace"===n.dataMode){const e=[...s],r=[...t],o=smartMerger(e,r,n);s.clear();for(let e of o.result)s.add(e)}else if("concat"===n.dataMode)for(let e of t)s.add(e);else{s.clear();for(let e of t)s.add(e)}return s};return smartMerger(e,t,n).result},shallowCopy:shallowCopy,copyObjectWithSymbol:copyObjectWithSymbol,getEl:getEl,getEls:(e,t=document.body)=>{let r=getDataType(e),n=getEl(t),s=n&&n instanceof HTMLTemplateElement?n.content:n||document,o=[];return isEmpty(e)?o:(r.includes("HTML")?o.push(e):"String"===r?o=(e=e.trim()).split(",").map(e=>[...s.querySelectorAll(e)]).flat():"Array"===r&&(o=e.map(e=>getEl(e,n))),o.filter(Boolean))},createEl:createEl,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:o,COMMA:",",SPACE:" ",trim:trim,parseClasses:parseClasses,getClasses:e=>{let t=getEl(e);return t?parseClasses(t.getAttribute("class")||""):[]},addClasses:addClasses,removeClasses:(e,t,r)=>{const n=getEl(e),s=parseClasses(t);n&&0!==s.length&&s.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)})},createTools:e=>{const t=createEl("span",{class:"ax-box-tools"}),renderFn=e=>{const t={},r=e.extendable?`<i ${o}="arrow"></i>`:"",n=(e.icon?`<i ${o}="icon">${e.icon}</i>`:"")+(e.disk?`<i ${o}="disk"><img src="${e.disk}"/></i>`:"")+(e.cube?`<i ${o}="cube"><img src="${e.cube}"/></i>`:"")+(e.image?`<i ${o}="image"><img src="${e.image}"/></i>`:"")+(e.label?`<i ${o}="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(`[${o}="icon"]`),e.cubeEl=e.wrapEl.querySelector(`[${o}="cube"]`),e.diskEl=e.wrapEl.querySelector(`[${o}="disk"]`),e.imageEl=e.wrapEl.querySelector(`[${o}="image"]`),e.labelEl=e.wrapEl.querySelector(`[${o}="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},typeWriter:(e,t)=>{const r=t.speed||100;return new Promise(n=>{t?.onBeforeType?.(e);let s=0;const o=setInterval(()=>{if(s<e.length){const r=e.charAt(s),n=e.substring(0,s+1);t?.onDuringType?.(r,n),s++}else clearInterval(o),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 s="";const o={fullText:"",finishReason:null,usage:null,isCompleted:!1};try{for(;;){const{done:e,value:a}=await r.read();if(e)break;s+=n.decode(a,{stream:!0});let i=s.split("\n");s=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],s=r?.delta?.content||"";s&&(o.fullText+=s,t?.(s)),r?.finish_reason&&(o.finishReason=r.finish_reason),e.usage&&(o.usage=e.usage)}catch(e){}else o.isCompleted=!0}}}catch(e){throw e}return o},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},escapeCharsMaps:t,escapeRegexMaps:r,escapeHTML:escapeHTML,toSingleLine:toSingleLine,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 s,o=Object.assign({strict:!1,start:"{{",end:"}}",suffix:"/"},r),a=o.start.split("").map(e=>"\\"+e).join(""),i=o.end.split("").map(e=>"\\"+e).join(""),l=new RegExp(`${a}([\\s\\S]+?)?${i}`,"g"),c='"use strict";let str=[];\n',p=0,u="",d=`__esc__${getUniqueId()}`,add=(e,t)=>(t?e.endsWith(o.suffix)?c+=e.slice(0,-o.suffix.length)+"\n":c+=o.escape?`str.push(${d}(String(${e}), "${o.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(;s=l.exec(e);)add(e.slice(p,s.index))(s[1],!0),p=s.index+s[0].length;add(e.slice(p)),c+="return str.join('');",c=toSingleLine(c);try{if(o.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},getBodyHTML:getBodyHTML,getUrlHash:getUrlHash,buildUrl:buildUrl,ajax:ajax,capitalize:capitalize,cleanQueryString:cleanQueryString,stringToEncodings:(e,t={})=>{const r=t.start??983040,n=t.end??1114109,s=BigInt(n-r+1),o=t.registryMap,formatResult=(e,t,r,n)=>{const s=t.toString(16).toUpperCase();return{name:e,unicode:`U+${s}`,htmlDec:`&#${t};`,htmlHex:`&#x${s};`,hex:s,codePoint:t,hash:r,collision:n}};let a=BigInt("0xcbf29ce484222325");const i=BigInt("0x100000001b3");for(const t of e)a^=BigInt(t.codePointAt(0)),a*=i;const l=a.toString(16).toUpperCase();if(!o){return formatResult(e,r+Number(a%s),l,!1)}if(o.has(e))return formatResult(e,o.get(e),l,!1);let c=Number(a%s),p=r+c,u=!1;const d=new Set(o.values());for(;d.has(p);)u=!0,c=(c+1)%Number(s),p=r+c;return o.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};`}}}});
|
package/dist.zip
CHANGED
|
Binary file
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<title>AJAX Download Progress Demo</title>
|
|
6
|
+
<style>
|
|
7
|
+
.download-card { border: 1px solid #e0e0e0; border-radius: 12px; padding: 20px; max-width: 500px; font-family: sans-serif; }
|
|
8
|
+
.progress-container { height: 10px; background: #eee; border-radius: 5px; margin: 15px 0; overflow: hidden; }
|
|
9
|
+
#progressBar { height: 100%; background: #2ecc71; width: 0%; transition: width 0.1s ease; }
|
|
10
|
+
.stats { display: flex; justify-content: space-between; font-size: 13px; color: #666; }
|
|
11
|
+
#statusText { font-weight: bold; margin-bottom: 5px; display: block; }
|
|
12
|
+
</style>
|
|
13
|
+
</head>
|
|
14
|
+
<body>
|
|
15
|
+
<h2>Demo 6: Large File Download</h2>
|
|
16
|
+
|
|
17
|
+
<div class="download-card">
|
|
18
|
+
<span id="statusText">Ready to download</span>
|
|
19
|
+
<div class="progress-container">
|
|
20
|
+
<div id="progressBar"></div>
|
|
21
|
+
</div>
|
|
22
|
+
<div class="stats">
|
|
23
|
+
<span id="percentText">0.00%</span>
|
|
24
|
+
<span id="sizeText">0 / 0 MB</span>
|
|
25
|
+
</div>
|
|
26
|
+
<hr>
|
|
27
|
+
<button id="btnDownload">Start 10MB Download</button>
|
|
28
|
+
<button id="btnAbort" disabled>Cancel</button>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<script src="../dist/utils.umd.js"></script>
|
|
32
|
+
<script>
|
|
33
|
+
let downloadCtrl = null;
|
|
34
|
+
const btnDownload = document.getElementById('btnDownload');
|
|
35
|
+
const btnAbort = document.getElementById('btnAbort');
|
|
36
|
+
const progressBar = document.getElementById('progressBar');
|
|
37
|
+
const percentText = document.getElementById('percentText');
|
|
38
|
+
const sizeText = document.getElementById('sizeText');
|
|
39
|
+
const statusText = document.getElementById('statusText');
|
|
40
|
+
|
|
41
|
+
btnDownload.onclick = () => {
|
|
42
|
+
// 重置 UI
|
|
43
|
+
progressBar.style.width = '0%';
|
|
44
|
+
btnDownload.disabled = true;
|
|
45
|
+
btnAbort.disabled = false;
|
|
46
|
+
statusText.innerText = "Connecting...";
|
|
47
|
+
|
|
48
|
+
downloadCtrl = utils.ajax({
|
|
49
|
+
// 使模拟 10 秒钟内持续吐出 1MB 的数据。
|
|
50
|
+
url: 'https://httpbin.org/drip?duration=10&numbytes=1000000&code=200',
|
|
51
|
+
method: 'GET',
|
|
52
|
+
precision: 2, // 演示你刚才要求的:保留两位小数
|
|
53
|
+
onCreated: (res) => {
|
|
54
|
+
downloadCtrl = res;
|
|
55
|
+
},
|
|
56
|
+
onDownload: (res) => {
|
|
57
|
+
const p = res.progress;
|
|
58
|
+
// 使用你建议的 text 字段(带补零)
|
|
59
|
+
progressBar.style.width = p.text + '%';
|
|
60
|
+
percentText.innerText = p.text + '%';
|
|
61
|
+
|
|
62
|
+
// 转换单位为 MB
|
|
63
|
+
const loadedMB = (p.loaded / 1024 / 1024).toFixed(2);
|
|
64
|
+
const totalMB = (p.total / 1024 / 1024).toFixed(2);
|
|
65
|
+
sizeText.innerText = `${loadedMB} / ${totalMB} MB`;
|
|
66
|
+
statusText.innerText = "Downloading...";
|
|
67
|
+
},
|
|
68
|
+
onSuccess: (res) => {
|
|
69
|
+
statusText.innerText = "Download Complete!";
|
|
70
|
+
statusText.style.color = "#2ecc71";
|
|
71
|
+
// 这里可以将 res.content (Blob) 转化为 URL 进行下载保存
|
|
72
|
+
// const url = window.URL.createObjectURL(res.content);
|
|
73
|
+
},
|
|
74
|
+
onAbort: () => {
|
|
75
|
+
statusText.innerText = "Download Canceled";
|
|
76
|
+
statusText.style.color = "#e67e22";
|
|
77
|
+
},
|
|
78
|
+
onFailure: (res) => {
|
|
79
|
+
statusText.innerText = "Download Failed";
|
|
80
|
+
statusText.style.color = "#e74c3c";
|
|
81
|
+
},
|
|
82
|
+
onFinish: () => {
|
|
83
|
+
btnDownload.disabled = false;
|
|
84
|
+
btnAbort.disabled = true;
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
btnAbort.onclick = () => {
|
|
90
|
+
downloadCtrl && downloadCtrl.abort();
|
|
91
|
+
};
|
|
92
|
+
</script>
|
|
93
|
+
</body>
|
|
94
|
+
</html>
|
package/examples/ajax-hook.html
CHANGED
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
currentReq = utils.ajax({
|
|
23
23
|
url: 'https://httpbin.org/post',
|
|
24
24
|
method: 'POST',
|
|
25
|
-
data: new Array(
|
|
25
|
+
data: new Array(100000).fill('data-chunk').join(''), // Large data for progress
|
|
26
26
|
onCreated: () => addLog('Lifecycle: Created'),
|
|
27
27
|
onHeadersReceived: () => addLog('Lifecycle: HeadersReceived'),
|
|
28
28
|
onLoading: () => addLog('Lifecycle: Loading'),
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
onUpload: (res) => {
|
|
32
32
|
document.getElementById('prog').value = res.progress.percent;
|
|
33
33
|
document.getElementById('status').innerText = `Uploading: ${res.progress.percent}%`;
|
|
34
|
-
console.log(res.progress.percent)
|
|
34
|
+
console.log(res.progress.percent,res.progress.ratio,res.progress.text)
|
|
35
35
|
},
|
|
36
36
|
onSuccess: () => addLog('<b>Lifecycle: Success!</b>'),
|
|
37
37
|
onFinish: () => addLog('Lifecycle: Finished (Done)'),
|