@codady/utils 0.0.38 → 0.0.39
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 +18 -0
- package/dist/utils.cjs.js +472 -23
- package/dist/utils.cjs.min.js +2 -2
- package/dist/utils.esm.js +472 -23
- package/dist/utils.esm.min.js +2 -2
- package/dist/utils.umd.js +472 -23
- package/dist/utils.umd.min.js +2 -2
- package/dist.zip +0 -0
- package/examples/ajax-get.html +59 -0
- package/examples/ajax-hook.html +55 -0
- package/examples/ajax-method.html +36 -0
- package/examples/ajax-post.html +37 -0
- package/examples/buildUrl.html +99 -0
- package/examples/getUrlHash.html +71 -0
- package/modules.js +13 -1
- package/modules.ts +13 -1
- package/package.json +1 -1
- package/src/ajax.js +363 -0
- package/src/ajax.ts +450 -0
- package/src/buildUrl.js +64 -0
- package/src/buildUrl.ts +86 -0
- package/src/capitalize - /345/211/257/346/234/254.js" +19 -0
- package/src/capitalize.js +19 -0
- package/src/capitalize.ts +20 -0
- package/src/cleanQueryString.js +19 -0
- package/src/cleanQueryString.ts +20 -0
- package/src/getBodyHTML.js +53 -0
- package/src/getBodyHTML.ts +61 -0
- package/src/getEl.js +1 -1
- package/src/getEl.ts +6 -5
- package/src/getEls.js +1 -1
- package/src/getEls.ts +5 -5
- package/src/getUrlHash.js +37 -0
- package/src/getUrlHash.ts +39 -0
- package/src/isEmpty.js +24 -23
- package/src/isEmpty.ts +26 -23
- package/src/sliceStrEnd.js +63 -0
- package/src/sliceStrEnd.ts +60 -0
package/dist/utils.umd.min.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @since Last modified: 2026-1-16
|
|
2
|
+
* @since Last modified: 2026-1-20 16:40:28
|
|
3
3
|
* @name Utils for web front-end.
|
|
4
4
|
* @version 0.0.38
|
|
5
5
|
* @author AXUI development team <3217728223@qq.com>
|
|
@@ -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 t=!e||("Object"===r?0===Object.keys(e).length:"Array"===r?""===e.join(""):"Function"===r?"{}"===e.toString().replace(/\s+/g,"").match(/{.*}/g)[0]:"Symbol"===r?"()"===e.toString().replace(/\s+/g,"").match(/\(.*\)/g)[0]:"Set"===r||"Map"===r?0===e.size:"Date"===r?isNaN(e.getTime()):"RegExp"===r?""===e.source:"ArrayBuffer"===r?0===e.byteLength:"NodeList"===r||"HTMLCollection"===r||"length"in e&&"number"==typeof e.length?0===e.length:"size"in e&&"number"==typeof e.size?0===e.size:"Error"===r||e instanceof Error?""===e.message:!(!r.includes("Array")||!["Uint8Array","Int8Array","Uint16Array","Int16Array","Uint32Array","Int32Array","Float32Array","Float64Array"].includes(r))&&0===e.length),t},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)})};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="",f=`__esc__${getUniqueId()}`,add=(e,t)=>(t?e.endsWith(s.suffix)?c+=e.slice(0,-s.suffix.length)+"\n":c+=s.escape?`str.push(${f}(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(f,c).apply(t,[escapeHTML]);else{let e=Object.keys(t),r=Object.values(t);u=new Function(...e,f,c).bind(t)(...r,escapeHTML)}}catch(e){}return u}}});
|
|
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}});
|
package/dist.zip
CHANGED
|
Binary file
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<body>
|
|
4
|
+
<h2>Demo 1: GET / HEAD / TRACE</h2>
|
|
5
|
+
<button id="btnGet">GET Data (with params)</button>
|
|
6
|
+
<button id="btnSelector">GET with Selector (#main)</button>
|
|
7
|
+
<button id="btnSelector2">GET with Selector (#main)</button>
|
|
8
|
+
<button id="btnHead">HEAD (Headers Only)</button>
|
|
9
|
+
<div id="result" style="border:1px solid #ccc; padding:10px; margin-top:10px;">Results will appear here...</div>
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
<script src="../dist/utils.umd.js"></script>
|
|
13
|
+
<script >
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
// 1. GET with automatic params conversion
|
|
17
|
+
document.getElementById('btnGet').onclick = () => {
|
|
18
|
+
utils.ajax({
|
|
19
|
+
url: 'https://jsonplaceholder.typicode.com/posts',
|
|
20
|
+
method: 'GET',
|
|
21
|
+
data: { userId: 1, _limit: 3 } // Automatically becomes ?userId=1&_limit=3
|
|
22
|
+
}).then(res => {
|
|
23
|
+
document.getElementById('result').innerText = JSON.stringify(res.content, null, 2);
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// 2. Selector Filter: Extract specific part of a page
|
|
28
|
+
document.getElementById('btnSelector').onclick = () => {
|
|
29
|
+
utils.ajax({
|
|
30
|
+
url: 'https://req.axui.cn/v3/html/his01.html', // In real use, this would be your own page
|
|
31
|
+
method: 'GET',
|
|
32
|
+
selector: '.post' // Only get the <h1> content
|
|
33
|
+
}).then(res => {
|
|
34
|
+
document.getElementById('result').innerHTML = `Extracted .post: ${res.content}`;
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
document.getElementById('btnSelector2').onclick = () => {
|
|
39
|
+
utils.ajax({
|
|
40
|
+
url: 'https://req.axui.cn/v3/html/his01.html#post03', // user hash
|
|
41
|
+
method: 'GET',
|
|
42
|
+
}).then(res => {
|
|
43
|
+
document.getElementById('result').innerHTML = `Extracted #post03: ${res.content}`;
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
// 3. HEAD request: No body, just metadata
|
|
48
|
+
document.getElementById('btnHead').onclick = () => {
|
|
49
|
+
utils.ajax({
|
|
50
|
+
url: 'https://jsonplaceholder.typicode.com/posts/1',
|
|
51
|
+
method: 'HEAD'
|
|
52
|
+
}).then(res => {
|
|
53
|
+
const contentType = res.xhr.getResponseHeader('Content-Type');
|
|
54
|
+
document.getElementById('result').innerText = `Status: ${res.status}\nContent-Type: ${contentType}`;
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
</script>
|
|
58
|
+
</body>
|
|
59
|
+
</html>
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
|
|
4
|
+
<body>
|
|
5
|
+
<h2>Demo 3: Lifecycle & Progress</h2>
|
|
6
|
+
<progress id="prog" value="0" max="100" style="width:100%"></progress>
|
|
7
|
+
<div id="status">Ready</div>
|
|
8
|
+
<button id="btnUpload">Upload Sim</button>
|
|
9
|
+
<button id="btnAbort">Abort Request</button>
|
|
10
|
+
<ul id="logs" style="font-family:monospace; font-size:12px;"></ul>
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
<script src="../dist/utils.umd.js"></script>
|
|
14
|
+
<script>
|
|
15
|
+
let currentReq = null;
|
|
16
|
+
|
|
17
|
+
document.getElementById('btnUpload').onclick = () => {
|
|
18
|
+
const logs = document.getElementById('logs');
|
|
19
|
+
logs.innerHTML = '';
|
|
20
|
+
const addLog = (txt) => logs.innerHTML += `<li>${txt}</li>`;
|
|
21
|
+
|
|
22
|
+
currentReq = utils.ajax({
|
|
23
|
+
url: 'https://httpbin.org/post',
|
|
24
|
+
method: 'POST',
|
|
25
|
+
data: new Array(10000).fill('data-chunk').join(''), // Large data for progress
|
|
26
|
+
onCreated: () => addLog('Lifecycle: Created'),
|
|
27
|
+
onHeadersReceived: () => addLog('Lifecycle: HeadersReceived'),
|
|
28
|
+
onLoading: () => addLog('Lifecycle: Loading'),
|
|
29
|
+
onBeforeSend: () => addLog('Lifecycle: BeforeSend'),
|
|
30
|
+
onOpened: () => addLog('Lifecycle: Opened'),
|
|
31
|
+
onUpload: (res) => {
|
|
32
|
+
document.getElementById('prog').value = res.progress.percent;
|
|
33
|
+
document.getElementById('status').innerText = `Uploading: ${res.progress.percent}%`;
|
|
34
|
+
console.log(res.progress.percent)
|
|
35
|
+
},
|
|
36
|
+
onSuccess: () => addLog('<b>Lifecycle: Success!</b>'),
|
|
37
|
+
onFinish: () => addLog('Lifecycle: Finished (Done)'),
|
|
38
|
+
onComplete: () => addLog('Lifecycle: Complete (100% Done)'),
|
|
39
|
+
onAbort: () => addLog('Lifecycle: Abort'),
|
|
40
|
+
onFailure: () => addLog('Lifecycle: Failure'),
|
|
41
|
+
onServerError: () => addLog('Lifecycle: ServerError'),
|
|
42
|
+
onClientError: () => addLog('Lifecycle: ClientError'),
|
|
43
|
+
onUnknownError: () => addLog('Lifecycle: UnknownError'),
|
|
44
|
+
onInformation: () => addLog('Lifecycle: Information'),
|
|
45
|
+
onRedirection: () => addLog('Lifecycle: Redirection'),
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
document.getElementById('btnAbort').onclick = () => {
|
|
50
|
+
currentReq && currentReq.abort();
|
|
51
|
+
};
|
|
52
|
+
</script>
|
|
53
|
+
</body>
|
|
54
|
+
|
|
55
|
+
</html>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
|
|
4
|
+
<body>
|
|
5
|
+
<h2>Demo 4: Static Methods & All</h2>
|
|
6
|
+
<button id="btnAll">Fetch All (3 APIs)</button>
|
|
7
|
+
<div id="result"></div>
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
<script src="../dist/utils.umd.js"></script>
|
|
11
|
+
<script>
|
|
12
|
+
let currentReq = null;
|
|
13
|
+
|
|
14
|
+
// Using static ajax.all
|
|
15
|
+
document.getElementById('btnAll').onclick = async () => {
|
|
16
|
+
let elem = document.getElementById('result');
|
|
17
|
+
elem.innerText = 'Loading multiple...';
|
|
18
|
+
|
|
19
|
+
await utils.ajax.all([
|
|
20
|
+
{ url: 'https://jsonplaceholder.typicode.com/posts/1', method: 'GET' },
|
|
21
|
+
{ url: 'https://jsonplaceholder.typicode.com/posts/2', method: 'GET' },
|
|
22
|
+
{ url: 'https://jsonplaceholder.typicode.com/posts/3', method: 'GET' }
|
|
23
|
+
]).then(responses => {
|
|
24
|
+
const titles = responses.map(r => r.content.title);
|
|
25
|
+
elem.innerHTML = `
|
|
26
|
+
<h3>All Fetched:</h3>
|
|
27
|
+
<ul>${titles.map(t => `<li>${t}</li>`).join('')}</ul>
|
|
28
|
+
`;
|
|
29
|
+
});
|
|
30
|
+
elem.innerHTML += `<h3>Finish</h3>`
|
|
31
|
+
|
|
32
|
+
};
|
|
33
|
+
</script>
|
|
34
|
+
</body>
|
|
35
|
+
|
|
36
|
+
</html>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<body>
|
|
4
|
+
<h2>Demo 2: POST / PUT / DELETE</h2>
|
|
5
|
+
<button id="btnPostJson">POST JSON</button>
|
|
6
|
+
<button id="btnDelete">DELETE (Silent Error)</button>
|
|
7
|
+
<div id="result">Submit data to see result...</div>
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
<script src="../dist/utils.umd.js"></script>
|
|
11
|
+
<script >
|
|
12
|
+
|
|
13
|
+
// POST as JSON
|
|
14
|
+
document.getElementById('btnPostJson').onclick = () => {
|
|
15
|
+
utils.ajax({
|
|
16
|
+
url: 'https://jsonplaceholder.typicode.com/posts',
|
|
17
|
+
method: 'POST',
|
|
18
|
+
headers: { 'Content-Type': 'application/json' },
|
|
19
|
+
data: { title: 'Hello', body: 'World', userId: 1 }
|
|
20
|
+
}).then(res => {
|
|
21
|
+
document.getElementById('result').innerHTML = `<b>Success:</b> ${JSON.stringify(res.content)}`;
|
|
22
|
+
});
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// DELETE with catchError: false (No red error in console if 404)
|
|
26
|
+
document.getElementById('btnDelete').onclick = () => {
|
|
27
|
+
utils.ajax({
|
|
28
|
+
url: 'https://jsonplaceholder.typicode.com/invalid-url',
|
|
29
|
+
method: 'DELETE',
|
|
30
|
+
catchError: false
|
|
31
|
+
}).then(res => {
|
|
32
|
+
document.getElementById('result').innerHTML = `Caught logic error without console red: ${res.type}`;
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
</script>
|
|
36
|
+
</body>
|
|
37
|
+
</html>
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>URL Builder Demo</title>
|
|
7
|
+
<style>
|
|
8
|
+
body {
|
|
9
|
+
font-family: Arial, sans-serif;
|
|
10
|
+
margin: 20px;
|
|
11
|
+
}
|
|
12
|
+
.section {
|
|
13
|
+
margin-bottom: 20px;
|
|
14
|
+
}
|
|
15
|
+
label {
|
|
16
|
+
font-weight: bold;
|
|
17
|
+
}
|
|
18
|
+
input, button {
|
|
19
|
+
padding: 5px;
|
|
20
|
+
margin: 5px 0;
|
|
21
|
+
font-size: 16px;
|
|
22
|
+
}
|
|
23
|
+
pre {
|
|
24
|
+
background-color: #f4f4f4;
|
|
25
|
+
padding: 10px;
|
|
26
|
+
border-radius: 5px;
|
|
27
|
+
border: 1px solid #ddd;
|
|
28
|
+
font-family: monospace;
|
|
29
|
+
}
|
|
30
|
+
</style>
|
|
31
|
+
</head>
|
|
32
|
+
<body>
|
|
33
|
+
<h1>URL Builder Demo</h1>
|
|
34
|
+
|
|
35
|
+
<div class="section">
|
|
36
|
+
<label for="baseUrl">Base URL:</label>
|
|
37
|
+
<input type="text" id="baseUrl" value="/api/data" placeholder="Enter Base URL">
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
<div class="section">
|
|
41
|
+
<label for="data">Data (Query Params):</label>
|
|
42
|
+
<input type="text" id="data" value="key=value&name=John" placeholder="Enter query params (key=value)">
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
<div class="section">
|
|
46
|
+
<label for="cacheBustKey">Cache Bust Key:</label>
|
|
47
|
+
<input type="text" id="cacheBustKey" value="_cache" placeholder="Enter cache-bust key">
|
|
48
|
+
</div>
|
|
49
|
+
|
|
50
|
+
<div class="section">
|
|
51
|
+
<label for="appendCacheBust">Append Cache Bust:</label>
|
|
52
|
+
<input type="checkbox" id="appendCacheBust" checked>
|
|
53
|
+
</div>
|
|
54
|
+
|
|
55
|
+
<div class="section">
|
|
56
|
+
<label for="hash">Hash Fragment:</label>
|
|
57
|
+
<input type="text" id="hash" value="#section" placeholder="Enter hash fragment (e.g. #section)">
|
|
58
|
+
</div>
|
|
59
|
+
|
|
60
|
+
<div class="section">
|
|
61
|
+
<button onclick="generateUrl()">Generate URL</button>
|
|
62
|
+
</div>
|
|
63
|
+
|
|
64
|
+
<div class="section">
|
|
65
|
+
<h3>Generated URL:</h3>
|
|
66
|
+
<pre id="resultUrl"></pre>
|
|
67
|
+
</div>
|
|
68
|
+
|
|
69
|
+
<script src="../dist/utils.umd.js"></script>
|
|
70
|
+
|
|
71
|
+
<script>
|
|
72
|
+
// The buildUrl function (as provided)
|
|
73
|
+
|
|
74
|
+
// Function to generate and display the URL
|
|
75
|
+
function generateUrl() {
|
|
76
|
+
const baseUrl = document.getElementById('baseUrl').value;
|
|
77
|
+
const data = document.getElementById('data').value;
|
|
78
|
+
const cacheBustKey = document.getElementById('cacheBustKey').value;
|
|
79
|
+
const appendCacheBust = document.getElementById('appendCacheBust').checked;
|
|
80
|
+
const hash = document.getElementById('hash').value;
|
|
81
|
+
|
|
82
|
+
// If there is data, convert it into an object or URLSearchParams
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
// Call buildUrl with the current form data
|
|
86
|
+
const url = utils.buildUrl({
|
|
87
|
+
url: baseUrl + hash, // Include the hash if present
|
|
88
|
+
data, // Data can be a string, object, or URLSearchParams
|
|
89
|
+
cacheBustKey: cacheBustKey,
|
|
90
|
+
appendCacheBust: appendCacheBust
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
// Display the result
|
|
94
|
+
document.getElementById('resultUrl').textContent = url;
|
|
95
|
+
console.log(url)
|
|
96
|
+
}
|
|
97
|
+
</script>
|
|
98
|
+
</body>
|
|
99
|
+
</html>
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>getUrlHash Function Demo</title>
|
|
7
|
+
<style>
|
|
8
|
+
body { font-family: sans-serif; line-height: 1.6; padding: 20px; max-width: 800px; margin: 0 auto; background: #f4f7f6; }
|
|
9
|
+
.container { background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
|
|
10
|
+
code { background: #eee; padding: 2px 5px; border-radius: 4px; color: #d63384; }
|
|
11
|
+
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
|
|
12
|
+
th, td { text-align: left; padding: 12px; border-bottom: 1px solid #ddd; }
|
|
13
|
+
th { background: #f8f9fa; }
|
|
14
|
+
.hash-tag { font-weight: bold; color: #007bff; }
|
|
15
|
+
.empty { color: #999; font-style: italic; }
|
|
16
|
+
.note { margin-top: 20px; font-size: 0.9em; color: #666; border-left: 4px solid #007bff; padding-left: 15px; }
|
|
17
|
+
</style>
|
|
18
|
+
</head>
|
|
19
|
+
<body>
|
|
20
|
+
|
|
21
|
+
<div class="container">
|
|
22
|
+
<h2>URL Hash Extractor Demo</h2>
|
|
23
|
+
<p>This demo tests the <code>getUrlHash</code> function using <code>new URL()</code> logic.</p>
|
|
24
|
+
|
|
25
|
+
<table>
|
|
26
|
+
<thead>
|
|
27
|
+
<tr>
|
|
28
|
+
<th>Test Input URL</th>
|
|
29
|
+
<th>Extracted Hash</th>
|
|
30
|
+
</tr>
|
|
31
|
+
</thead>
|
|
32
|
+
<tbody id="resultsTable">
|
|
33
|
+
</tbody>
|
|
34
|
+
</table>
|
|
35
|
+
|
|
36
|
+
<div class="note">
|
|
37
|
+
<strong>Check the Network Tab:</strong> Open your browser's Developer Tools (F12) and go to the "Network" tab. You will see that <strong>no requests</strong> are made to these URLs during parsing.
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
<script src="../dist/utils.umd.js" type="text/javascript" charset="utf-8"></script>
|
|
42
|
+
<script>
|
|
43
|
+
|
|
44
|
+
// Array of test cases including absolute, relative, and non-standard paths
|
|
45
|
+
const testCases = [
|
|
46
|
+
"https://example.com/page.html#section1",
|
|
47
|
+
"../../src/index.html#hello",
|
|
48
|
+
"/about#team",
|
|
49
|
+
"api/data?id=123#debug-info",
|
|
50
|
+
"https://google.com/search?q=ajax#top",
|
|
51
|
+
"#just-hash",
|
|
52
|
+
"no-hash-here.html"
|
|
53
|
+
];
|
|
54
|
+
|
|
55
|
+
const tableBody = document.getElementById('resultsTable');
|
|
56
|
+
|
|
57
|
+
testCases.forEach(testUrl => {
|
|
58
|
+
const hash = utils.getUrlHash(testUrl);
|
|
59
|
+
const row = document.createElement('tr');
|
|
60
|
+
|
|
61
|
+
row.innerHTML = `
|
|
62
|
+
<td><code>${testUrl}</code></td>
|
|
63
|
+
<td><span class="${hash ? 'hash-tag' : 'empty'}">${hash || '(empty)'}</span></td>
|
|
64
|
+
`;
|
|
65
|
+
|
|
66
|
+
tableBody.appendChild(row);
|
|
67
|
+
});
|
|
68
|
+
</script>
|
|
69
|
+
|
|
70
|
+
</body>
|
|
71
|
+
</html>
|
package/modules.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Last modified: 2026/01/
|
|
2
|
+
* Last modified: 2026/01/20 13:55:43
|
|
3
3
|
*/
|
|
4
4
|
'use strict';
|
|
5
5
|
import deepClone from './src/deepClone';
|
|
@@ -41,6 +41,12 @@ import escapeHTML from './src/escapeHTML';
|
|
|
41
41
|
import escapeRegexMaps from './src/escapeRegexMaps';
|
|
42
42
|
import escapeCharsMaps from './src/escapeCharsMaps';
|
|
43
43
|
import toSingleLine from './src/toSingleLine';
|
|
44
|
+
import getBodyHTML from './src/getBodyHTML';
|
|
45
|
+
import getUrlHash from './src/getUrlHash';
|
|
46
|
+
import buildUrl from './src/buildUrl';
|
|
47
|
+
import ajax from './src/ajax';
|
|
48
|
+
import capitalize from './src/capitalize';
|
|
49
|
+
import cleanQueryString from './src/cleanQueryString';
|
|
44
50
|
const utils = {
|
|
45
51
|
//executeStr,
|
|
46
52
|
getDataType,
|
|
@@ -84,5 +90,11 @@ const utils = {
|
|
|
84
90
|
escapeHTML,
|
|
85
91
|
toSingleLine,
|
|
86
92
|
renderTpl,
|
|
93
|
+
getBodyHTML,
|
|
94
|
+
getUrlHash,
|
|
95
|
+
buildUrl,
|
|
96
|
+
ajax,
|
|
97
|
+
capitalize,
|
|
98
|
+
cleanQueryString,
|
|
87
99
|
};
|
|
88
100
|
export default utils;
|
package/modules.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Last modified: 2026/01/
|
|
2
|
+
* Last modified: 2026/01/20 13:55:43
|
|
3
3
|
*/
|
|
4
4
|
'use strict'
|
|
5
5
|
import deepClone from './src/deepClone';
|
|
@@ -48,6 +48,12 @@ import escapeHTML from './src/escapeHTML';
|
|
|
48
48
|
import escapeRegexMaps from './src/escapeRegexMaps';
|
|
49
49
|
import escapeCharsMaps from './src/escapeCharsMaps';
|
|
50
50
|
import toSingleLine from './src/toSingleLine';
|
|
51
|
+
import getBodyHTML from './src/getBodyHTML';
|
|
52
|
+
import getUrlHash from './src/getUrlHash';
|
|
53
|
+
import buildUrl from './src/buildUrl';
|
|
54
|
+
import ajax from './src/ajax';
|
|
55
|
+
import capitalize from './src/capitalize';
|
|
56
|
+
import cleanQueryString from './src/cleanQueryString';
|
|
51
57
|
|
|
52
58
|
const utils = {
|
|
53
59
|
//executeStr,
|
|
@@ -92,6 +98,12 @@ const utils = {
|
|
|
92
98
|
escapeHTML,
|
|
93
99
|
toSingleLine,
|
|
94
100
|
renderTpl,
|
|
101
|
+
getBodyHTML,
|
|
102
|
+
getUrlHash,
|
|
103
|
+
buildUrl,
|
|
104
|
+
ajax,
|
|
105
|
+
capitalize,
|
|
106
|
+
cleanQueryString,
|
|
95
107
|
|
|
96
108
|
};
|
|
97
109
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codady/utils",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.39",
|
|
4
4
|
"author": "AXUI Development Team",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "This is a set of general-purpose JavaScript utility functions developed by the AXUI team. All functions are pure and do not involve CSS or other third-party libraries. They are suitable for any web front-end environment.",
|