@i.un/libs 0.0.47 → 0.0.49

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.
@@ -4,14 +4,15 @@
4
4
  */
5
5
  export declare class WebStore<T extends Record<string, any>> {
6
6
  private readonly storageKey;
7
- private readonly store;
7
+ private readonly storeType;
8
+ private store?;
8
9
  private static instances;
9
10
  private constructor();
10
11
  private static getInstanceKey;
11
12
  /**
12
13
  * 获取单例实例
13
14
  */
14
- static getInstance<T extends Record<string, any>>(storageKey: string, storeType?: "local" | "session"): WebStore<T>;
15
+ private static getInstance;
15
16
  /**
16
17
  * 便捷方法:创建本地存储实例
17
18
  */
@@ -28,6 +29,7 @@ export declare class WebStore<T extends Record<string, any>> {
28
29
  * 清理所有实例
29
30
  */
30
31
  static clearAllInstances(): void;
32
+ private getStore;
31
33
  /**
32
34
  * 设置数据到 localStorage 或 sessionStorage
33
35
  */
@@ -1,3 +1,4 @@
1
1
  export * from "./dom";
2
2
  export * from "./scroll";
3
3
  export * from "./draggable";
4
+ export * from "./WebStore";
@@ -5,14 +5,14 @@
5
5
  export declare class ChromeStore<T extends Record<string, any>> {
6
6
  private readonly storageKey;
7
7
  private readonly storeType;
8
- private readonly store;
8
+ private store?;
9
9
  private static instances;
10
10
  private constructor();
11
11
  private static getInstanceKey;
12
12
  /**
13
13
  * 获取单例实例
14
14
  */
15
- static getInstance<T extends Record<string, any>>(storageKey: string, storeType?: "local" | "sync"): ChromeStore<T>;
15
+ private static getInstance;
16
16
  /**
17
17
  * 便捷方法:创建本地存储实例
18
18
  */
@@ -29,6 +29,7 @@ export declare class ChromeStore<T extends Record<string, any>> {
29
29
  * 清理所有实例
30
30
  */
31
31
  static clearAllInstances(): void;
32
+ private getStore;
32
33
  /**
33
34
  * 设置数据到 chrome.storage.local 或 chrome.storage.sync
34
35
  */
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- var e=Symbol("undefined");function t(e){return"function"==typeof(null==e?void 0:e.clone)}function n(e){var t=typeof e;return null===e||"string"===t||"number"===t||"boolean"===t||"undefined"===t}function r(e){return n(e)?String(e):JSON.stringify(e,function(e,t){return"object"!=typeof t||null===t||Array.isArray(t)?t:Object.keys(t).sort().reduce(function(e,n){return e[n]=t[n],e},{})})}function o(e){if(null===e||"object"!=typeof e)return e;if(t(e))return e.clone();if(Array.isArray(e))return e.map(function(e){return o(e)});var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=o(e[r]));return n}function i(e){return new Proxy({},{get:function(t,n){return t.hasOwnProperty(n)?t[n]:e}})}const s=void 0!==globalThis.process?.versions?.node;globalThis.navigator?.userAgent?.includes("jsdom"),"undefined"!=typeof WorkerGlobalScope&&(globalThis,WorkerGlobalScope),"undefined"!=typeof DedicatedWorkerGlobalScope&&(globalThis,DedicatedWorkerGlobalScope),"undefined"!=typeof SharedWorkerGlobalScope&&(globalThis,SharedWorkerGlobalScope),"undefined"!=typeof ServiceWorkerGlobalScope&&(globalThis,ServiceWorkerGlobalScope);const l=globalThis.navigator?.userAgentData?.platform;"macOS"===l||"MacIntel"===globalThis.navigator?.platform||!0===globalThis.navigator?.userAgent?.includes(" Mac ")||globalThis,"Linux"===l||!0===globalThis.navigator?.platform?.startsWith("Linux")||!0===globalThis.navigator?.userAgent?.includes(" Linux ")||globalThis,"iOS"===l||"MacIntel"===globalThis.navigator?.platform&&globalThis.navigator?.maxTouchPoints>1||/iPad|iPhone|iPod/.test(globalThis.navigator?.platform),"Android"===l||"Android"===globalThis.navigator?.platform||!0===globalThis.navigator?.userAgent?.includes(" Android ")||globalThis;var a=i(e),u=i(!1);function c(e){return a[e]}function h(t){return a[t]!==e}var f={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function g(){return g=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},g.apply(null,arguments)}function p(e,t,n,r){if(void 0===r&&(r=!1),t in e.style)e.style[t]=n;else{var o=r?"important":"";e.style.setProperty(t,String(n),o)}}function v(e){var t=document.createElementNS("http://www.w3.org/2000/svg",e.type);if(e.props)for(var n=0,r=Object.entries(e.props);n<r.length;n++){var o=r[n];t.setAttribute(o[0],o[1])}if("string"==typeof e.children){var i=document.createTextNode(e.children);t.appendChild(i)}else Array.isArray(e.children)&&e.children.forEach(function(e){var n=v(e);t.appendChild(n)});return t}function m(e){var t=(new DOMParser).parseFromString(e,"image/svg+xml").documentElement;if(!(t instanceof SVGElement))throw new Error("解析失败,结果不是有效的 SVG 元素");return t}function y(e){e&&setTimeout(function(){e.scrollTop=e.scrollHeight},0)}var b=/*#__PURE__*/function(){function e(e,t){void 0===t&&(t={}),this.element=void 0,this.options=void 0,this.isDragging=!1,this.startX=0,this.startY=0,this.initialX=0,this.initialY=0,this.threshold=5,this.onMouseMoveHandler=void 0,this.onMouseUpHandler=void 0,this.element=e,this.options=g({coordinate:"tl"},t);var n=getComputedStyle(this.element).position;n&&"static"!==n||(this.element.style.position="absolute"),this.options.position&&(this.element.style.position=this.options.position),this.onMouseMoveHandler=this.onMouseMove.bind(this),this.onMouseUpHandler=this.onMouseUp.bind(this),this.element.addEventListener("mousedown",this.onMouseDown.bind(this))}var t=e.prototype;return t.onMouseDown=function(e){e.preventDefault(),this.startX=e.clientX,this.startY=e.clientY,this.initialX=parseInt(window.getComputedStyle(this.element).left,10)||0,this.initialY=parseInt(window.getComputedStyle(this.element).top,10)||0,document.addEventListener("mousemove",this.onMouseMoveHandler),document.addEventListener("mouseup",this.onMouseUpHandler)},t.getBoundedPosition=function(e,t){var n,r,o=this.element.getBoundingClientRect();if("fixed"===getComputedStyle(this.element).position)n=window.innerWidth-o.width,r=window.innerHeight-o.height;else{var i=(this.element.offsetParent||document.documentElement).getBoundingClientRect();n=i.width-o.width,r=i.height-o.height}return{x:Math.min(Math.max(0,e),n),y:Math.min(Math.max(0,t),r)}},t.onMouseMove=function(e){if(!this.isDragging){var t=e.clientY-this.startY;(Math.abs(e.clientX-this.startX)>this.threshold||Math.abs(t)>this.threshold)&&(this.isDragging=!0,this.options.onDragStart&&this.options.onDragStart(e))}if(this.isDragging){var n=this.getBoundedPosition(this.initialX+(e.clientX-this.startX),this.initialY+(e.clientY-this.startY));this.element.style.right="auto",this.element.style.bottom="auto",this.element.style.left=n.x+"px",this.element.style.top=n.y+"px",this.options.onDrag&&this.options.onDrag(e)}},t.convertCoordinate=function(){var e=this.element.getBoundingClientRect(),t=getComputedStyle(this.element).position,n=null,r=null;if("fixed"===t?(n=null,r=new DOMRect(0,0,window.innerWidth,window.innerHeight)):((n=this.element.offsetParent)||(n=document.documentElement),"static"===getComputedStyle(n).position?(n=null,r=new DOMRect(0,0,window.innerWidth,window.innerHeight)):r=n.getBoundingClientRect()),r){var o,i;if("fixed"===t)o=e.left,i=e.top;else if(o=e.left-r.left,i=e.top-r.top,n instanceof HTMLElement){var s=getComputedStyle(n);o-=parseFloat(s.borderLeftWidth)||0,i-=parseFloat(s.borderTopWidth)||0}else o+=window.scrollX,i+=window.scrollY;switch(this.options.coordinate){case"tr":var l=r.width-o-e.width;this.element.style.left="auto",this.element.style.right=l+"px",this.element.style.top=i+"px",this.element.style.bottom="auto";break;case"bl":var a=r.height-i-e.height;this.element.style.left=o+"px",this.element.style.right="auto",this.element.style.top="auto",this.element.style.bottom=a+"px";break;case"br":var u=r.width-o-e.width,c=r.height-i-e.height;this.element.style.left="auto",this.element.style.right=u+"px",this.element.style.top="auto",this.element.style.bottom=c+"px";break;default:this.element.style.left=o+"px",this.element.style.right="auto",this.element.style.top=i+"px",this.element.style.bottom="auto"}}},t.onMouseUp=function(e){this.isDragging&&(this.options.coordinate&&"tl"!==this.options.coordinate&&this.convertCoordinate(),this.options.onDragEnd&&this.options.onDragEnd(e)),this.isDragging=!1,document.removeEventListener("mousemove",this.onMouseMoveHandler),document.removeEventListener("mouseup",this.onMouseUpHandler)},e}();function w(e,t){try{var n=e()}catch(e){return t(e)}return n&&n.then?n.then(void 0,t):n}var S=/*#__PURE__*/function(){function e(e,t){void 0===t&&(t="local"),this.storageKey=void 0,this.storeType=void 0,this.store=void 0,this.storageKey=e,this.storeType=t,this.store=chrome.storage[t]}e.getInstanceKey=function(e,t){return void 0===t&&(t="local"),t+":"+e},e.getInstance=function(t,n){void 0===n&&(n="local");var r=this.getInstanceKey(t,n);return this.instances.has(r)||this.instances.set(r,new e(t,n)),this.instances.get(r)},e.local=function(e){return this.getInstance(e,"local")},e.sync=function(e){return this.getInstance(e,"sync")},e.clearInstance=function(e,t){void 0===t&&(t="local");var n=this.getInstanceKey(e,t);this.instances.delete(n)},e.clearAllInstances=function(){this.instances.clear()};var t=e.prototype;return t.set=function(e,t){try{var n=this;return Promise.resolve(w(function(){return Promise.resolve(n.getAll()).then(function(r){var o,i,s=g({},r,((o={})[e]=t,o));return Promise.resolve(n.store.set((i={},i[n.storageKey]=s,i))).then(function(){})})},function(e){throw console.error("ChromeStore.set 失败:",e),e}))}catch(e){return Promise.reject(e)}},t.get=function(e){try{var t=this;return Promise.resolve(w(function(){return Promise.resolve(t.getAll()).then(function(t){return null==t?void 0:t[e]})},function(e){throw console.error("ChromeStore.get 失败:",e),e}))}catch(e){return Promise.reject(e)}},t.getAll=function(){try{var e=this;return Promise.resolve(w(function(){return Promise.resolve(e.store.get(e.storageKey)).then(function(t){return t[e.storageKey]||{}})},function(e){throw console.error("ChromeStore.getAll 失败:",e),e}))}catch(e){return Promise.reject(e)}},t.remove=function(e){try{var t=this;return Promise.resolve(w(function(){return Promise.resolve(t.getAll()).then(function(n){var r=function(){var r;if(n&&e in n)return delete n[e],Promise.resolve(t.store.set((r={},r[t.storageKey]=n,r))).then(function(){})}();if(r&&r.then)return r.then(function(){})})},function(e){throw console.error("ChromeStore.remove 失败:",e),e}))}catch(e){return Promise.reject(e)}},t.clear=function(){try{var e=this;return Promise.resolve(w(function(){return Promise.resolve(e.store.remove(e.storageKey)).then(function(){})},function(e){throw console.error("ChromeStore.clear 失败:",e),e}))}catch(e){return Promise.reject(e)}},t.setMultiple=function(e){try{var t=this;return Promise.resolve(w(function(){return Promise.resolve(t.getAll()).then(function(n){var r,o=g({},n,e);return Promise.resolve(t.store.set((r={},r[t.storageKey]=o,r))).then(function(){})})},function(e){throw console.error("ChromeStore.setMultiple 失败:",e),e}))}catch(e){return Promise.reject(e)}},t.onChanged=function(e){var t=this;chrome.storage.onChanged.addListener(function(n,r){r===t.storeType&&n[t.storageKey]&&e(n)})},t.has=function(e){try{var t=this;return Promise.resolve(w(function(){return Promise.resolve(t.get(e)).then(function(e){return void 0!==e})},function(e){return console.error("ChromeStore.has 失败:",e),!1}))}catch(e){return Promise.reject(e)}},t.getSize=function(){try{var e=this;return Promise.resolve(w(function(){return Promise.resolve(e.getAll()).then(function(e){var t=JSON.stringify(e);return new Blob([t]).size})},function(e){return console.error("ChromeStore.getSize 失败:",e),0}))}catch(e){return Promise.reject(e)}},t.getStoreKey=function(){return this.storageKey},e}();S.instances=new Map,exports.ChromeStore=S,exports.Draggable=b,exports.RealUndefined=e,exports.cacheWrapper=function(e,t){void 0===t&&(t=f);var n=function(){var n=[].slice.call(arguments);if(s)return e.apply(this,n);var i=r(n)+e.name+(t.identifier||"");if(h(i))return Promise.resolve(o(c(i)));if(u[i]){var l=Object.assign({},f,t);return new Promise(function(e){var t=Date.now(),n=setInterval(function(){h(i)?(clearInterval(n),e(o(c(i)))):Date.now()-t>l.timeout&&(u[i]=!1,clearInterval(n),e(o(l.timeoutResult)))},100)})}return u[i]=!0,e.apply(this,n).then(function(e){return a[i]=e,o(a[i])}).catch(function(e){throw e}).finally(function(){u[i]=!1})};return Object.defineProperty(n,"name",{value:"cacheWrapper_"+e.name,configurable:!0}),n},exports.cloneDeep=o,exports.createDefaultObject=i,exports.createElement=function e(t){var n=void 0===t?{}:t,r=n.tag,o=n.children,i=void 0===o?[]:o,s=n.props,l=void 0===s?{}:s,a=n.attrs,u=void 0===a?{}:a,c=n.styles,h=void 0===c?{}:c,f=document.createElement(void 0===r?"div":r);Object.assign(f,l);for(var g=0,v=Object.entries(u);g<v.length;g++){var m=v[g],y=m[1];!1!==y&&f.setAttribute(m[0],y)}for(var b=0,w=Object.entries(h);b<w.length;b++){var S=w[b];p(f,S[0],S[1])}for(var x,P=function(e){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=function(e,t){if(e){if("string"==typeof e)return d(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?d(e,t):void 0}}(e))){t&&(e=t);var n=0;return function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(Array.isArray(i)?i:[i]);!(x=P()).done;){var T=x.value;T&&("object"==typeof T?T instanceof Element?f.appendChild(T):f.appendChild(e(T)):f.appendChild(document.createTextNode(T)))}return f},exports.createSvg=function(e){return"string"==typeof e?m(e):v(e)},exports.createSvgFromUrl=function(e){try{return Promise.resolve(function(t,n){try{var r=Promise.resolve(fetch(e)).then(function(e){if(!e.ok)throw new Error("网络请求失败: "+e.status+" "+e.statusText);return Promise.resolve(e.text()).then(m)})}catch(e){return n(e)}return r&&r.then?r.then(void 0,n):r}(0,function(e){var t=e instanceof Error?e.message:"未知错误";throw new Error("无法创建 SVG 元素: "+t)}))}catch(e){return Promise.reject(e)}},exports.debounce=function(e,t){var n=null;return function(){var r=arguments,o=this;null!==n&&clearTimeout(n),n=setTimeout(function(){e.apply(o,[].slice.call(r)),n=null},t)}},exports.delayExecution=function(e,t){void 0===t&&(t=0);var n=[].slice.call(arguments,2);return new Promise(function(r){0===t?r(e.apply(void 0,n)):setTimeout(function(){r(e.apply(void 0,n))},t)})},exports.generateStableUniqueKey=r,exports.getGlobal=function(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this},exports.isCloneable=t,exports.isPrimitive=n,exports.scrollToBottom=y,exports.scrollToBottomIfNeeded=function(e){e&&("true"!==e.dataset.isListeningForUserScroll&&(function(e){e&&e.addEventListener("scroll",function(){!function(e,t){e.dataset.userInteracted=t?"true":"false"}(e,e.scrollTop+e.clientHeight<e.scrollHeight-5)})}(e),e.dataset.isListeningForUserScroll="true"),"true"!==e.dataset.userInteracted&&y(e))},exports.singleExecutionWrapper=function(t,n){void 0===n&&(n=0);var r=function(){if(r.isExecuting)return Promise.resolve(e);r.isExecuting=!0;var o=performance.now(),i=t.apply(this,[].slice.call(arguments));return i.finally(function(){var e=performance.now()-o;n&&n>e?setTimeout(function(){r.isExecuting=!1},n-e):r.isExecuting=!1}),i};return r.isExecuting=!1,r};
1
+ var e=Symbol("undefined");function t(e){return"function"==typeof(null==e?void 0:e.clone)}function n(e){var t=typeof e;return null===e||"string"===t||"number"===t||"boolean"===t||"undefined"===t}function r(e){return n(e)?String(e):JSON.stringify(e,function(e,t){return"object"!=typeof t||null===t||Array.isArray(t)?t:Object.keys(t).sort().reduce(function(e,n){return e[n]=t[n],e},{})})}function o(e){if(null===e||"object"!=typeof e)return e;if(t(e))return e.clone();if(Array.isArray(e))return e.map(function(e){return o(e)});var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=o(e[r]));return n}function i(e){return new Proxy({},{get:function(t,n){return t.hasOwnProperty(n)?t[n]:e}})}const s=void 0!==globalThis.process?.versions?.node;globalThis.navigator?.userAgent?.includes("jsdom"),"undefined"!=typeof WorkerGlobalScope&&(globalThis,WorkerGlobalScope),"undefined"!=typeof DedicatedWorkerGlobalScope&&(globalThis,DedicatedWorkerGlobalScope),"undefined"!=typeof SharedWorkerGlobalScope&&(globalThis,SharedWorkerGlobalScope),"undefined"!=typeof ServiceWorkerGlobalScope&&(globalThis,ServiceWorkerGlobalScope);const a=globalThis.navigator?.userAgentData?.platform;"macOS"===a||"MacIntel"===globalThis.navigator?.platform||!0===globalThis.navigator?.userAgent?.includes(" Mac ")||globalThis,"Linux"===a||!0===globalThis.navigator?.platform?.startsWith("Linux")||!0===globalThis.navigator?.userAgent?.includes(" Linux ")||globalThis,"iOS"===a||"MacIntel"===globalThis.navigator?.platform&&globalThis.navigator?.maxTouchPoints>1||/iPad|iPhone|iPod/.test(globalThis.navigator?.platform),"Android"===a||"Android"===globalThis.navigator?.platform||!0===globalThis.navigator?.userAgent?.includes(" Android ")||globalThis;var l=i(e),c=i(!1);function u(e){return l[e]}function h(t){return l[t]!==e}var f={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function g(){return g=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},g.apply(null,arguments)}function v(e,t,n,r){if(void 0===r&&(r=!1),t in e.style)e.style[t]=n;else{var o=r?"important":"";e.style.setProperty(t,String(n),o)}}function p(e){var t=document.createElementNS("http://www.w3.org/2000/svg",e.type);if(e.props)for(var n=0,r=Object.entries(e.props);n<r.length;n++){var o=r[n];t.setAttribute(o[0],o[1])}if("string"==typeof e.children){var i=document.createTextNode(e.children);t.appendChild(i)}else Array.isArray(e.children)&&e.children.forEach(function(e){var n=p(e);t.appendChild(n)});return t}function m(e){var t=(new DOMParser).parseFromString(e,"image/svg+xml").documentElement;if(!(t instanceof SVGElement))throw new Error("解析失败,结果不是有效的 SVG 元素");return t}function y(e){e&&setTimeout(function(){e.scrollTop=e.scrollHeight},0)}var b=/*#__PURE__*/function(){function e(e,t){void 0===t&&(t={}),this.element=void 0,this.options=void 0,this.isDragging=!1,this.startX=0,this.startY=0,this.initialX=0,this.initialY=0,this.threshold=5,this.onMouseMoveHandler=void 0,this.onMouseUpHandler=void 0,this.element=e,this.options=g({coordinate:"tl"},t);var n=getComputedStyle(this.element).position;n&&"static"!==n||(this.element.style.position="absolute"),this.options.position&&(this.element.style.position=this.options.position),this.onMouseMoveHandler=this.onMouseMove.bind(this),this.onMouseUpHandler=this.onMouseUp.bind(this),this.element.addEventListener("mousedown",this.onMouseDown.bind(this))}var t=e.prototype;return t.onMouseDown=function(e){e.preventDefault(),this.startX=e.clientX,this.startY=e.clientY,this.initialX=parseInt(window.getComputedStyle(this.element).left,10)||0,this.initialY=parseInt(window.getComputedStyle(this.element).top,10)||0,document.addEventListener("mousemove",this.onMouseMoveHandler),document.addEventListener("mouseup",this.onMouseUpHandler)},t.getBoundedPosition=function(e,t){var n,r,o=this.element.getBoundingClientRect();if("fixed"===getComputedStyle(this.element).position)n=window.innerWidth-o.width,r=window.innerHeight-o.height;else{var i=(this.element.offsetParent||document.documentElement).getBoundingClientRect();n=i.width-o.width,r=i.height-o.height}return{x:Math.min(Math.max(0,e),n),y:Math.min(Math.max(0,t),r)}},t.onMouseMove=function(e){if(!this.isDragging){var t=e.clientY-this.startY;(Math.abs(e.clientX-this.startX)>this.threshold||Math.abs(t)>this.threshold)&&(this.isDragging=!0,this.options.onDragStart&&this.options.onDragStart(e))}if(this.isDragging){var n=this.getBoundedPosition(this.initialX+(e.clientX-this.startX),this.initialY+(e.clientY-this.startY));this.element.style.right="auto",this.element.style.bottom="auto",this.element.style.left=n.x+"px",this.element.style.top=n.y+"px",this.options.onDrag&&this.options.onDrag(e)}},t.convertCoordinate=function(){var e=this.element.getBoundingClientRect(),t=getComputedStyle(this.element).position,n=null,r=null;if("fixed"===t?(n=null,r=new DOMRect(0,0,window.innerWidth,window.innerHeight)):((n=this.element.offsetParent)||(n=document.documentElement),"static"===getComputedStyle(n).position?(n=null,r=new DOMRect(0,0,window.innerWidth,window.innerHeight)):r=n.getBoundingClientRect()),r){var o,i;if("fixed"===t)o=e.left,i=e.top;else if(o=e.left-r.left,i=e.top-r.top,n instanceof HTMLElement){var s=getComputedStyle(n);o-=parseFloat(s.borderLeftWidth)||0,i-=parseFloat(s.borderTopWidth)||0}else o+=window.scrollX,i+=window.scrollY;switch(this.options.coordinate){case"tr":var a=r.width-o-e.width;this.element.style.left="auto",this.element.style.right=a+"px",this.element.style.top=i+"px",this.element.style.bottom="auto";break;case"bl":var l=r.height-i-e.height;this.element.style.left=o+"px",this.element.style.right="auto",this.element.style.top="auto",this.element.style.bottom=l+"px";break;case"br":var c=r.width-o-e.width,u=r.height-i-e.height;this.element.style.left="auto",this.element.style.right=c+"px",this.element.style.top="auto",this.element.style.bottom=u+"px";break;default:this.element.style.left=o+"px",this.element.style.right="auto",this.element.style.top=i+"px",this.element.style.bottom="auto"}}},t.onMouseUp=function(e){this.isDragging&&(this.options.coordinate&&"tl"!==this.options.coordinate&&this.convertCoordinate(),this.options.onDragEnd&&this.options.onDragEnd(e)),this.isDragging=!1,document.removeEventListener("mousemove",this.onMouseMoveHandler),document.removeEventListener("mouseup",this.onMouseUpHandler)},e}(),S=/*#__PURE__*/function(){function e(e,t){void 0===t&&(t="local"),this.storageKey=void 0,this.storeType=void 0,this.store=void 0,this.storageKey=e,this.storeType=t}e.getInstanceKey=function(e,t){return void 0===t&&(t="local"),t+":"+e},e.getInstance=function(t,n){void 0===n&&(n="local");var r=this.getInstanceKey(t,n);return this.instances.has(r)||this.instances.set(r,new e(t,n)),this.instances.get(r)},e.local=function(e){return this.getInstance(e,"local")},e.session=function(e){return this.getInstance(e,"session")},e.clearInstance=function(e,t){void 0===t&&(t="local");var n=this.getInstanceKey(e,t);this.instances.delete(n)},e.clearAllInstances=function(){this.instances.clear()};var t=e.prototype;return t.getStore=function(){return this.store||(this.store="local"===this.storeType?localStorage:sessionStorage),this.store},t.set=function(e,t){try{var n,r=g({},this.getAll(),((n={})[e]=t,n));this.getStore().setItem(this.storageKey,JSON.stringify(r))}catch(e){throw console.error("WebStore.set 失败:",e),e}},t.get=function(e){try{var t=this.getAll();return null==t?void 0:t[e]}catch(e){throw console.error("WebStore.get 失败:",e),e}},t.getAll=function(){try{var e=this.getStore().getItem(this.storageKey);return e?JSON.parse(e):{}}catch(e){return console.error("WebStore.getAll 失败:",e),{}}},t.remove=function(e){try{var t=this.getAll();t&&e in t&&(delete t[e],this.getStore().setItem(this.storageKey,JSON.stringify(t)))}catch(e){throw console.error("WebStore.remove 失败:",e),e}},t.clear=function(){try{this.getStore().removeItem(this.storageKey)}catch(e){throw console.error("WebStore.clear 失败:",e),e}},t.setMultiple=function(e){try{var t=g({},this.getAll(),e);this.getStore().setItem(this.storageKey,JSON.stringify(t))}catch(e){throw console.error("WebStore.setMultiple 失败:",e),e}},t.onChanged=function(e){var t=this;window.addEventListener("storage",function(n){if(n.key===t.storageKey&&n.storageArea===t.getStore()){var r,o=((r={})[t.storageKey]={oldValue:n.oldValue?JSON.parse(n.oldValue):void 0,newValue:n.newValue?JSON.parse(n.newValue):void 0},r);e(o)}})},t.has=function(e){try{return void 0!==this.get(e)}catch(e){return console.error("WebStore.has 失败:",e),!1}},t.getSize=function(){try{var e=this.getStore().getItem(this.storageKey)||"";return new Blob([e]).size}catch(e){return console.error("WebStore.getSize 失败:",e),0}},t.getStoreKey=function(){return this.storageKey},e}();function w(e,t){try{var n=e()}catch(e){return t(e)}return n&&n.then?n.then(void 0,t):n}S.instances=new Map;var x=/*#__PURE__*/function(){function e(e,t){void 0===t&&(t="local"),this.storageKey=void 0,this.storeType=void 0,this.store=void 0,this.storageKey=e,this.storeType=t}e.getInstanceKey=function(e,t){return void 0===t&&(t="local"),t+":"+e},e.getInstance=function(t,n){void 0===n&&(n="local");var r=this.getInstanceKey(t,n);return this.instances.has(r)||this.instances.set(r,new e(t,n)),this.instances.get(r)},e.local=function(e){return this.getInstance(e,"local")},e.sync=function(e){return this.getInstance(e,"sync")},e.clearInstance=function(e,t){void 0===t&&(t="local");var n=this.getInstanceKey(e,t);this.instances.delete(n)},e.clearAllInstances=function(){this.instances.clear()};var t=e.prototype;return t.getStore=function(){return this.store||(this.store=chrome.storage[this.storeType]),this.store},t.set=function(e,t){try{var n=this;return Promise.resolve(w(function(){return Promise.resolve(n.getAll()).then(function(r){var o,i,s=g({},r,((o={})[e]=t,o));return Promise.resolve(n.getStore().set((i={},i[n.storageKey]=s,i))).then(function(){})})},function(e){throw console.error("ChromeStore.set 失败:",e),e}))}catch(e){return Promise.reject(e)}},t.get=function(e){try{var t=this;return Promise.resolve(w(function(){return Promise.resolve(t.getAll()).then(function(t){return null==t?void 0:t[e]})},function(e){throw console.error("ChromeStore.get 失败:",e),e}))}catch(e){return Promise.reject(e)}},t.getAll=function(){try{var e=this;return Promise.resolve(w(function(){return Promise.resolve(e.getStore().get(e.storageKey)).then(function(t){return t[e.storageKey]||{}})},function(e){throw console.error("ChromeStore.getAll 失败:",e),e}))}catch(e){return Promise.reject(e)}},t.remove=function(e){try{var t=this;return Promise.resolve(w(function(){return Promise.resolve(t.getAll()).then(function(n){var r=function(){var r;if(n&&e in n)return delete n[e],Promise.resolve(t.getStore().set((r={},r[t.storageKey]=n,r))).then(function(){})}();if(r&&r.then)return r.then(function(){})})},function(e){throw console.error("ChromeStore.remove 失败:",e),e}))}catch(e){return Promise.reject(e)}},t.clear=function(){try{var e=this;return Promise.resolve(w(function(){return Promise.resolve(e.getStore().remove(e.storageKey)).then(function(){})},function(e){throw console.error("ChromeStore.clear 失败:",e),e}))}catch(e){return Promise.reject(e)}},t.setMultiple=function(e){try{var t=this;return Promise.resolve(w(function(){return Promise.resolve(t.getAll()).then(function(n){var r,o=g({},n,e);return Promise.resolve(t.getStore().set((r={},r[t.storageKey]=o,r))).then(function(){})})},function(e){throw console.error("ChromeStore.setMultiple 失败:",e),e}))}catch(e){return Promise.reject(e)}},t.onChanged=function(e){var t=this;chrome.storage.onChanged.addListener(function(n,r){r===t.storeType&&n[t.storageKey]&&e(n)})},t.has=function(e){try{var t=this;return Promise.resolve(w(function(){return Promise.resolve(t.get(e)).then(function(e){return void 0!==e})},function(e){return console.error("ChromeStore.has 失败:",e),!1}))}catch(e){return Promise.reject(e)}},t.getSize=function(){try{var e=this;return Promise.resolve(w(function(){return Promise.resolve(e.getAll()).then(function(e){var t=JSON.stringify(e);return new Blob([t]).size})},function(e){return console.error("ChromeStore.getSize 失败:",e),0}))}catch(e){return Promise.reject(e)}},t.getStoreKey=function(){return this.storageKey},e}();x.instances=new Map,exports.ChromeStore=x,exports.Draggable=b,exports.RealUndefined=e,exports.WebStore=S,exports.cacheWrapper=function(e,t){void 0===t&&(t=f);var n=function(){var n=[].slice.call(arguments);if(s)return e.apply(this,n);var i=r(n)+e.name+(t.identifier||"");if(h(i))return Promise.resolve(o(u(i)));if(c[i]){var a=Object.assign({},f,t);return new Promise(function(e){var t=Date.now(),n=setInterval(function(){h(i)?(clearInterval(n),e(o(u(i)))):Date.now()-t>a.timeout&&(c[i]=!1,clearInterval(n),e(o(a.timeoutResult)))},100)})}return c[i]=!0,e.apply(this,n).then(function(e){return l[i]=e,o(l[i])}).catch(function(e){throw e}).finally(function(){c[i]=!1})};return Object.defineProperty(n,"name",{value:"cacheWrapper_"+e.name,configurable:!0}),n},exports.cloneDeep=o,exports.createDefaultObject=i,exports.createElement=function e(t){var n=void 0===t?{}:t,r=n.tag,o=n.children,i=void 0===o?[]:o,s=n.props,a=void 0===s?{}:s,l=n.attrs,c=void 0===l?{}:l,u=n.styles,h=void 0===u?{}:u,f=document.createElement(void 0===r?"div":r);Object.assign(f,a);for(var g=0,p=Object.entries(c);g<p.length;g++){var m=p[g],y=m[1];!1!==y&&f.setAttribute(m[0],y)}for(var b=0,S=Object.entries(h);b<S.length;b++){var w=S[b];v(f,w[0],w[1])}for(var x,P=function(e){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=function(e,t){if(e){if("string"==typeof e)return d(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?d(e,t):void 0}}(e))){t&&(e=t);var n=0;return function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(Array.isArray(i)?i:[i]);!(x=P()).done;){var T=x.value;T&&("object"==typeof T?T instanceof Element?f.appendChild(T):f.appendChild(e(T)):f.appendChild(document.createTextNode(T)))}return f},exports.createSvg=function(e){return"string"==typeof e?m(e):p(e)},exports.createSvgFromUrl=function(e){try{return Promise.resolve(function(t,n){try{var r=Promise.resolve(fetch(e)).then(function(e){if(!e.ok)throw new Error("网络请求失败: "+e.status+" "+e.statusText);return Promise.resolve(e.text()).then(m)})}catch(e){return n(e)}return r&&r.then?r.then(void 0,n):r}(0,function(e){var t=e instanceof Error?e.message:"未知错误";throw new Error("无法创建 SVG 元素: "+t)}))}catch(e){return Promise.reject(e)}},exports.debounce=function(e,t){var n=null;return function(){var r=arguments,o=this;null!==n&&clearTimeout(n),n=setTimeout(function(){e.apply(o,[].slice.call(r)),n=null},t)}},exports.delayExecution=function(e,t){void 0===t&&(t=0);var n=[].slice.call(arguments,2);return new Promise(function(r){0===t?r(e.apply(void 0,n)):setTimeout(function(){r(e.apply(void 0,n))},t)})},exports.generateStableUniqueKey=r,exports.getGlobal=function(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this},exports.isCloneable=t,exports.isPrimitive=n,exports.scrollToBottom=y,exports.scrollToBottomIfNeeded=function(e){e&&("true"!==e.dataset.isListeningForUserScroll&&(function(e){e&&e.addEventListener("scroll",function(){!function(e,t){e.dataset.userInteracted=t?"true":"false"}(e,e.scrollTop+e.clientHeight<e.scrollHeight-5)})}(e),e.dataset.isListeningForUserScroll="true"),"true"!==e.dataset.userInteracted&&y(e))},exports.singleExecutionWrapper=function(t,n){void 0===n&&(n=0);var r=function(){if(r.isExecuting)return Promise.resolve(e);r.isExecuting=!0;var o=performance.now(),i=t.apply(this,[].slice.call(arguments));return i.finally(function(){var e=performance.now()-o;n&&n>e?setTimeout(function(){r.isExecuting=!1},n-e):r.isExecuting=!1}),i};return r.isExecuting=!1,r};
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/common/type.ts","../src/common/generateStableUniqueKey.ts","../src/common/cloneDeep.ts","../src/common/utils.ts","../node_modules/.pnpm/environment@1.1.0/node_modules/environment/index.js","../src/common/cacheWrapper.ts","../src/browser/dom.ts","../src/browser/scroll.ts","../src/browser/draggable.ts","../src/chrome/ChromeStore.ts","../src/common/getGlobal.ts","../src/common/singleExecutionWrapper.ts"],"sourcesContent":["export const RealUndefined = Symbol(\"undefined\");\nexport type RealUndefined = typeof RealUndefined;\n\n/**\n * 异步函数类型。\n *\n * @template Args - 表示函数参数的类型数组。\n * @template T - 表示函数返回的 Promise 解析后的类型。\n *\n * @param args - 函数的参数。\n * @returns 一个 Promise 对象,解析后的值类型为 T。\n */\nexport type AsyncFunction<Args extends any[], T> = (\n this: any,\n ...args: Args\n) => Promise<T>;\n\n/**\n * 表示一个可以克隆自身的对象接口。\n *\n * @interface Cloneable\n */\nexport interface Cloneable {\n /**\n * 创建并返回当前对象的一个副本。\n *\n * @returns {this} 当前对象的一个副本。\n */\n clone(): this;\n}\n\n/**\n *\n * 检查一个对象是否实现了 Cloneable 接口。\n *\n * 这个函数是一个类型保护函数,它会在类型检查时将传入的对象类型缩小为 Cloneable。\n *\n * @param {any} obj - 要检查的对象。\n * @returns {obj is Cloneable} 如果对象实现了 Cloneable 接口,则返回 true;否则返回 false。\n */\nexport function isCloneable(obj: any): obj is Cloneable {\n return typeof obj?.clone === \"function\";\n}\n\n/**\n * 检查一个值是否是原始类型(primitive type)。\n *\n * 这个函数是一个类型保护函数,它会在类型检查时将传入的值类型缩小为原始类型之一:string, number, boolean, null 或 undefined。\n *\n * @param {any} value - 要检查的值。\n * @returns {value is string | number | boolean | null | undefined} 如果值是原始类型,则返回 true;否则返回 false。\n */\nexport function isPrimitive(\n value: any\n): value is string | number | boolean | null | undefined {\n const type = typeof value;\n return (\n value === null ||\n type === \"string\" ||\n type === \"number\" ||\n type === \"boolean\" ||\n type === \"undefined\"\n );\n}\n","import { isPrimitive } from \"./type\";\n\n/**\n * 为给定的参数生成一个稳定且唯一的键。\n *\n * 该函数确保生成的键是确定性的,即相同的输入总是会生成相同的输出。\n * 这在缓存、记忆化或任何需要一致键的场景中非常有用。\n *\n * @param params - 用于生成键的参数。可以是任何类型。\n * @returns 表示输入参数的稳定且唯一的字符串键。\n */\nexport function generateStableUniqueKey(params: any) {\n if (isPrimitive(params)) {\n return String(params);\n }\n return JSON.stringify(params, function (_key: string | number, value: any) {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n return Object.keys(value)\n .sort()\n .reduce((pre: any, cur: string) => {\n pre[cur] = value[cur];\n return pre;\n }, {});\n }\n return value;\n });\n}\n","import { isCloneable } from \"./type\";\n\n/**\n * 深度克隆一个对象或数组。\n *\n * @param {T} obj - 要克隆的对象或数组。\n * @returns {T} 克隆后的对象或数组。\n */\nexport function cloneDeep<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n\n if (isCloneable(obj)) {\n return obj.clone();\n }\n\n // 处理数组\n if (Array.isArray(obj)) {\n return obj.map((item) => cloneDeep(item)) as unknown as T;\n }\n\n const newObj: { [key: string]: any } = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n newObj[key] = cloneDeep(obj[key]);\n }\n }\n return newObj as T;\n}\n","/**\n * 创建一个防抖函数,该函数会在最后一次调用后的指定时间间隔后执行。\n *\n * @param func - 需要防抖处理的函数。\n * @param wait - 延迟的毫秒数。\n * @returns 一个新的防抖函数。\n */\nexport function debounce<T extends (...args: any[]) => void>(\n func: T,\n wait: number\n): T {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n\n return function (this: ThisParameterType<T>, ...args: Parameters<T>) {\n const context = this;\n\n // 如果已经设定了调用,取消之前的调用\n if (timeout !== null) {\n clearTimeout(timeout);\n }\n\n // 设定一个新的调用,等待指定的时间后执行\n timeout = setTimeout(() => {\n func.apply(context, args);\n timeout = null; // 确保能够在下次触发时重新设定定时器\n }, wait);\n } as T;\n}\n\n/**\n * 创建一个节流函数,该函数会在每个指定的时间间隔内最多执行一次。\n *\n * @param func - 需要节流处理的函数。\n * @param delay - 时间间隔的毫秒数。\n * @returns 一个新的节流函数。\n */\n// export function throttle<T extends (...agrs: any[]) => any>(\n// func: T,\n// delay: number\n// ): T {\n// let lastExecutedTime: number = 0;\n\n// return function (this: ThisParameterType<T>, ...args: Parameters<T>) {\n// const context = this;\n// const currentTime = Date.now();\n\n// if (currentTime - lastExecutedTime >= delay) {\n// func.apply(context, args);\n// lastExecutedTime = currentTime;\n// }\n// } as T;\n// }\n\n/**\n * 创建一个延迟执行回调函数并返回 Promise 的函数。\n *\n * @param callback - 需要执行的回调函数。\n * @param delay - 延迟的毫秒数,默认为 0。\n * @param args - 传递给回调函数的参数。\n * @returns 一个 Promise 对象,该对象在回调函数执行后解析。\n */\nexport function delayExecution<T, Args extends any[]>(\n callback: (...args: Args) => T,\n delay: number = 0,\n ...args: Args\n): Promise<T> {\n return new Promise<T>((resolve) => {\n if (delay === 0) {\n resolve(callback(...args));\n } else {\n setTimeout(() => {\n resolve(callback(...args));\n }, delay);\n }\n });\n}\n\n/**\n * 创建一个带有默认值的代理对象。\n * 如果访问的属性不存在,则返回默认值。\n *\n * @param defaultValue - 当属性不存在时返回的默认值。\n * @returns 一个代理对象,未定义的属性将返回默认值。\n */\nexport function createDefaultObject<T>(defaultValue: T): Record<string, T> {\n return new Proxy<Record<string, T>>(\n {},\n {\n get: (target, property: string) => {\n return target.hasOwnProperty(property)\n ? target[property]\n : defaultValue;\n },\n }\n );\n}\n","/* globals WorkerGlobalScope, DedicatedWorkerGlobalScope, SharedWorkerGlobalScope, ServiceWorkerGlobalScope */\n\nexport const isBrowser = globalThis.window?.document !== undefined;\n\nexport const isNode = globalThis.process?.versions?.node !== undefined;\n\nexport const isBun = globalThis.process?.versions?.bun !== undefined;\n\nexport const isDeno = globalThis.Deno?.version?.deno !== undefined;\n\nexport const isElectron = globalThis.process?.versions?.electron !== undefined;\n\nexport const isJsDom = globalThis.navigator?.userAgent?.includes('jsdom') === true;\n\nexport const isWebWorker = typeof WorkerGlobalScope !== 'undefined' && globalThis instanceof WorkerGlobalScope;\n\nexport const isDedicatedWorker = typeof DedicatedWorkerGlobalScope !== 'undefined' && globalThis instanceof DedicatedWorkerGlobalScope;\n\nexport const isSharedWorker = typeof SharedWorkerGlobalScope !== 'undefined' && globalThis instanceof SharedWorkerGlobalScope;\n\nexport const isServiceWorker = typeof ServiceWorkerGlobalScope !== 'undefined' && globalThis instanceof ServiceWorkerGlobalScope;\n\n// Note: I'm intentionally not DRYing up the other variables to keep them \"lazy\".\nconst platform = globalThis.navigator?.userAgentData?.platform;\n\nexport const isMacOs = platform === 'macOS'\n\t|| globalThis.navigator?.platform === 'MacIntel' // Even on Apple silicon Macs.\n\t|| globalThis.navigator?.userAgent?.includes(' Mac ') === true\n\t|| globalThis.process?.platform === 'darwin';\n\nexport const isWindows = platform === 'Windows'\n\t|| globalThis.navigator?.platform === 'Win32'\n\t|| globalThis.process?.platform === 'win32';\n\nexport const isLinux = platform === 'Linux'\n\t|| globalThis.navigator?.platform?.startsWith('Linux') === true\n\t|| globalThis.navigator?.userAgent?.includes(' Linux ') === true\n\t|| globalThis.process?.platform === 'linux';\n\nexport const isIos = platform === 'iOS'\n\t|| (globalThis.navigator?.platform === 'MacIntel' && globalThis.navigator?.maxTouchPoints > 1)\n\t|| /iPad|iPhone|iPod/.test(globalThis.navigator?.platform);\n\nexport const isAndroid = platform === 'Android'\n\t|| globalThis.navigator?.platform === 'Android'\n\t|| globalThis.navigator?.userAgent?.includes(' Android ') === true\n\t|| globalThis.process?.platform === 'android';\n","import { isNode } from \"environment\";\n\nimport { generateStableUniqueKey } from \"./generateStableUniqueKey\";\nimport { cloneDeep } from \"./cloneDeep\";\nimport { createDefaultObject } from \"./utils\";\nimport { AsyncFunction, RealUndefined } from \"./type\";\n\nconst cache: Record<string, any> = createDefaultObject<any>(RealUndefined);\nconst loadingCache = createDefaultObject(false);\nfunction getCachedData<T = any>(apiKey: string) {\n return cache[apiKey] as T;\n}\n\nfunction hasCachedData(apiKey: string) {\n return cache[apiKey] !== RealUndefined;\n}\n\nexport interface Setting {\n timeout?: number;\n timeoutResult?: any;\n identifier?: string;\n}\n\nconst defalutSetting: Setting = {\n timeout: 60000,\n timeoutResult: { code: 408, msg: \"请求超时\" },\n identifier: \"\",\n};\n\n/**\n * 为异步函数添加缓存功能。\n *\n * 该函数根据函数参数、函数名和一个可选的标识符来缓存异步函数的结果。\n * 如果结果已经缓存,则返回缓存的结果。如果函数正在执行中,则等待结果返回,并使用一个超时机制防止无限等待。\n *\n * @template Args - 函数参数的类型。\n * @template Promise<T> - 函数返回值的类型。\n * @param {AsyncFunction<Args, T>} func - 需要包装的异步函数。\n * @param {Setting} [setting=defalutSetting] - 可选的缓存设置。\n * @returns {AsyncFunction<Args, T>} - 带有缓存功能的包装函数,返回类型为 `Promise<T>`。\n */\nexport function cacheWrapper<\n Args extends any[],\n T,\n F extends AsyncFunction<Args, T>\n>(func: F, setting: Setting = defalutSetting) {\n const wrappedFunction = function (\n this: ThisParameterType<F>,\n ...args: Parameters<F>\n ) {\n // 在服务端的时候 不缓存\n if (isNode) {\n return func.apply(this, args);\n }\n const apiKey: string =\n generateStableUniqueKey(args) + func.name + (setting.identifier || \"\"); //缓存key\n\n if (hasCachedData(apiKey)) {\n return Promise.resolve(cloneDeep(getCachedData<T>(apiKey)));\n }\n\n if (loadingCache[apiKey]) {\n const _setting = Object.assign({}, defalutSetting, setting);\n return new Promise((resolve) => {\n const startTime = Date.now();\n const timer = setInterval(() => {\n if (hasCachedData(apiKey)) {\n clearInterval(timer);\n resolve(cloneDeep(getCachedData<T>(apiKey)));\n } else if (Date.now() - startTime > _setting.timeout!) {\n loadingCache[apiKey] = false;\n clearInterval(timer);\n resolve(cloneDeep(_setting.timeoutResult));\n }\n }, 100);\n });\n }\n loadingCache[apiKey] = true;\n\n return func\n .apply(this, args)\n .then((res) => {\n // 缓存原始数据或其克隆,避免数据被释放\n cache[apiKey] = res;\n return cloneDeep(cache[apiKey]);\n })\n .catch((error: any) => {\n throw error;\n })\n .finally(() => {\n loadingCache[apiKey] = false;\n });\n } as F;\n\n // 设置函数名\n Object.defineProperty(wrappedFunction, \"name\", {\n value: `cacheWrapper_${func.name}`,\n configurable: true,\n });\n\n return wrappedFunction;\n}\n","/**\n * 表示 DOM 中可能的子元素类型。\n */\nexport type ChildrenType = DomOptionsType | Element | string | null;\n\n/**\n * 表示创建 DOM 元素的选项类型。\n */\nexport type DomOptionsType = {\n /**\n * 要创建的元素的标签名。默认为 \"div\"。\n */\n tag?: string;\n\n /**\n * 要附加到创建的元素的子元素。可以是单个子元素或子元素数组。\n */\n children?: ChildrenType | ChildrenType[];\n\n /**\n * 要设置在创建的元素上的属性。\n */\n props?: Record<string, any>;\n\n /**\n * 要设置在创建的元素上的属性。\n */\n attrs?: Record<string, string | boolean>;\n\n /**\n * 要应用于创建的元素的样式。\n */\n styles?: Record<string, string | number>;\n};\n\n/**\n * 设置 HTML 元素的样式属性。\n *\n * @param element - 要设置样式的 HTML 元素。\n * @param property - CSS 属性名,可以是驼峰命名法(camelCase)或连字符命名法(kebab-case)。\n * @param value - 要设置的属性值。\n * @param important - 可选参数,布尔值,表示是否将属性设置为 `important` 优先级,默认为 `false`。\n */\nfunction setStyle(\n element: HTMLElement | SVGElement,\n property: string,\n value: string | number,\n important: boolean = false\n): void {\n if (property in element.style) {\n (element.style as any)[property] = value;\n } else {\n const priority = important ? \"important\" : \"\";\n element.style.setProperty(property, String(value), priority);\n }\n}\n\n/**\n * 使用指定选项创建一个 DOM 元素。\n *\n * @param options - 创建 DOM 元素的选项。\n *\n * @returns 创建的 DOM 元素。\n *\n * @remarks\n * 此函数旨在浏览器环境中使用。\n *\n * @example\n * ```typescript\n * const element = createElement({\n * tag: 'button',\n * children: '点击我',\n * attrs: { id: 'myButton' },\n * styles: { color: 'red' }\n * });\n * document.body.appendChild(element);\n * ```\n */\nexport function createElement({\n tag = \"div\",\n children = [],\n props = {},\n attrs = {},\n styles = {},\n}: DomOptionsType = {}): HTMLElement {\n const ele = document.createElement(tag);\n\n // 设置属性\n Object.assign(ele, props);\n\n // 设置属性\n for (const [key, value] of Object.entries(attrs)) {\n if (value !== false) {\n ele.setAttribute(key, value as string);\n }\n }\n\n // 设置样式\n for (const [key, value] of Object.entries(styles)) {\n setStyle(ele, key, value);\n }\n\n // 处理子元素\n const childArray = Array.isArray(children) ? children : [children];\n for (const child of childArray) {\n if (!child) continue;\n\n if (typeof child === \"object\") {\n if (child instanceof Element) {\n ele.appendChild(child);\n } else {\n ele.appendChild(createElement(child as DomOptionsType));\n }\n } else {\n ele.appendChild(document.createTextNode(child));\n }\n }\n\n return ele;\n}\n\ninterface VNode {\n type: string;\n props: Record<string, string> | null;\n children: VNode[] | string | null;\n}\n\n/**\n * 从 VNode 对象创建 SVG 元素。\n *\n * @param {VNode} vnode - 表示 SVG 结构的 VNode 对象。\n * @returns {SVGSVGElement} 创建的 SVG 元素。\n */\nfunction createSvgFromVNode(vnode: VNode): SVGSVGElement {\n const namespace = \"http://www.w3.org/2000/svg\";\n const element = document.createElementNS(namespace, vnode.type);\n\n if (vnode.props) {\n for (const [key, value] of Object.entries(vnode.props)) {\n element.setAttribute(key, value);\n }\n }\n\n if (typeof vnode.children === \"string\") {\n const textNode = document.createTextNode(vnode.children);\n element.appendChild(textNode);\n } else if (Array.isArray(vnode.children)) {\n vnode.children.forEach((child) => {\n const childElement = createSvgFromVNode(child);\n element.appendChild(childElement);\n });\n }\n\n return element as SVGSVGElement;\n}\n\n/**\n * 从 SVG 字符串创建 SVG 元素。\n *\n * @param {string} svgString - 包含 SVG 内容的字符串。\n * @returns {SVGElement} 创建的 SVG 元素。\n * @throws {Error} 如果解析失败或结果不是 SVG 元素。\n */\nfunction createSvgFromString(svgString: string): SVGSVGElement {\n const parser = new DOMParser();\n const doc = parser.parseFromString(svgString, \"image/svg+xml\");\n\n const svgElement = doc.documentElement;\n if (!(svgElement instanceof SVGElement)) {\n throw new Error(\"解析失败,结果不是有效的 SVG 元素\");\n }\n\n return svgElement as SVGElement as SVGSVGElement;\n}\n\n/**\n * 创建 SVG 元素,根据输入参数的类型选择合适的创建方法。\n *\n * @param {VNode | string} params - VNode 对象或 SVG 字符串。\n * @returns {SVGElement} 创建的 SVG 元素。\n * @throws {Error} 如果输入字符串无法解析为有效的 SVG 元素。\n */\nexport function createSvg(params: VNode | string): SVGSVGElement {\n if (typeof params === \"string\") {\n return createSvgFromString(params);\n }\n return createSvgFromVNode(params);\n}\n\n/**\n * 从指定的 URL 加载 SVG 内容并创建 SVG 元素。\n *\n * @param {string} url - 包含 SVG 内容的 URL。\n * @returns {Promise<SVGElement>} Promise,解析为创建的 SVG 元素。\n * @throws {Error} 如果无法获取或解析 SVG 内容。\n */\nexport async function createSvgFromUrl(url: string): Promise<SVGSVGElement> {\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(\n `网络请求失败: ${response.status} ${response.statusText}`\n );\n }\n\n const svgString = await response.text();\n return createSvgFromString(svgString);\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : \"未知错误\";\n throw new Error(`无法创建 SVG 元素: ${errorMessage}`);\n }\n}\n","/**\n * 将指定的 DOM 元素滚动到底部。\n * 使用 setTimeout 确保在当前调用栈之后执行。\n *\n * @param {HTMLElement} dom - 要滚动的 DOM 元素。\n */\nexport function scrollToBottom(dom: HTMLElement) {\n if (dom) {\n setTimeout(() => {\n // 设置滚动条位置为元素的最大滚动高度,滚动到底部\n dom.scrollTop = dom.scrollHeight;\n }, 0);\n }\n}\n\n/**\n * 如果用户未与 DOM 元素交互,则将其滚动到底部。\n * 如果尚未设置事件监听器,则设置一个以跟踪用户滚动交互。\n *\n * @param {HTMLElement} dom - 可能需要滚动的 DOM 元素。\n */\nexport function scrollToBottomIfNeeded(dom: HTMLElement): void {\n if (!dom) {\n return;\n }\n // 检查是否已设置滚动监听器\n if (dom.dataset.isListeningForUserScroll !== \"true\") {\n listenForUserScroll(dom);\n dom.dataset.isListeningForUserScroll = \"true\";\n }\n\n // 如果用户未与滚动条交互,则滚动到底部\n if (dom.dataset.userInteracted !== \"true\") {\n scrollToBottom(dom);\n }\n}\n\n/**\n * 更新用户是否与滚动条交互的状态。\n *\n * @param {HTMLElement} dom - 要更新状态的 DOM 元素。\n * @param {boolean} inter - 用户是否与滚动条交互。\n */\nfunction userInteractedWithScroll(dom: HTMLElement, inter: boolean): void {\n // 根据用户交互状态更新数据属性\n dom.dataset.userInteracted = inter ? \"true\" : \"false\";\n}\n\n/**\n * 为 DOM 元素设置滚动事件监听器。\n * 当用户滚动时,更新交互状态。\n *\n * @param {HTMLElement} dom - 要监听滚动事件的 DOM 元素。\n */\nfunction listenForUserScroll(dom: HTMLElement): void {\n if (!dom) {\n return;\n }\n dom.addEventListener(\"scroll\", () => {\n // 检查用户是否滚动到接近底部\n if (dom.scrollTop + dom.clientHeight < dom.scrollHeight - 5) {\n // 用户已滚动,更新交互状态\n userInteractedWithScroll(dom, true);\n } else {\n // 用户未滚动到接近底部\n userInteractedWithScroll(dom, false);\n }\n });\n}\n","/**\n * 拖拽组件类\n * @class Draggable\n * @description 为DOM元素添加拖拽功能的类,支持拖拽开始、拖拽中、拖拽结束的回调函数\n * @example\n * const element = document.getElementById('draggable');\n * const draggable = new Draggable(element, {\n * onDragStart: (e) => console.log('开始拖拽'),\n * onDrag: (e) => console.log('拖拽中'),\n * onDragEnd: (e) => console.log('结束拖拽'),\n * coordinate: 'tl' // 可选: tl(左上), tr(右上), bl(左下), br(右下)\n * });\n */\n\ninterface DraggableOptions {\n onDragStart?: (event: MouseEvent) => void;\n onDrag?: (event: MouseEvent) => void;\n onDragEnd?: (event: MouseEvent) => void;\n position?: \"absolute\" | \"fixed\";\n coordinate?: \"tl\" | \"tr\" | \"bl\" | \"br\";\n}\n/**\n * 拖拽组件配置选项接口\n * @interface DraggableOptions\n * @property {function} [onDragStart] - 开始拖拽时的回调函数\n * @property {function} [onDrag] - 拖拽过程中的回调函数\n * @property {function} [onDragEnd] - 结束拖拽时的回调函数\n * @property {string} [position] - 定位方式,可选 absolute 或 fixed\n * @property {string} [coordinate] - 坐标原点,可选 tl(左上)、tr(右上)、bl(左下)、br(右下)\n */\n\nexport class Draggable {\n private element: HTMLElement;\n private options: DraggableOptions;\n private isDragging: boolean = false;\n private startX: number = 0;\n private startY: number = 0;\n private initialX: number = 0;\n private initialY: number = 0;\n private threshold: number = 5; // 拖动阈值\n\n private onMouseMoveHandler: (e: MouseEvent) => void;\n private onMouseUpHandler: (e: MouseEvent) => void;\n\n constructor(element: HTMLElement, options: DraggableOptions = {}) {\n this.element = element;\n this.options = {\n coordinate: \"tl\", // 默认使用左上角作为原点\n ...options,\n };\n\n let originPosition = getComputedStyle(this.element).position;\n if (!originPosition || originPosition === \"static\") {\n this.element.style.position = \"absolute\";\n }\n\n if (this.options.position) {\n this.element.style.position = this.options.position;\n }\n\n this.onMouseMoveHandler = this.onMouseMove.bind(this);\n this.onMouseUpHandler = this.onMouseUp.bind(this);\n\n this.element.addEventListener(\"mousedown\", this.onMouseDown.bind(this));\n }\n\n private onMouseDown(e: MouseEvent): void {\n e.preventDefault();\n this.startX = e.clientX;\n this.startY = e.clientY;\n this.initialX =\n parseInt(window.getComputedStyle(this.element).left, 10) || 0;\n this.initialY =\n parseInt(window.getComputedStyle(this.element).top, 10) || 0;\n\n document.addEventListener(\"mousemove\", this.onMouseMoveHandler);\n document.addEventListener(\"mouseup\", this.onMouseUpHandler);\n }\n\n private getBoundedPosition(x: number, y: number): { x: number; y: number } {\n const rect = this.element.getBoundingClientRect();\n const position = getComputedStyle(this.element).position;\n\n let maxX: number;\n let maxY: number;\n\n if (position === \"fixed\") {\n // 对于 fixed 定位,使用视口大小\n maxX = window.innerWidth - rect.width;\n maxY = window.innerHeight - rect.height;\n } else {\n // 对于 absolute 定位,使用父容器大小\n const container =\n (this.element.offsetParent as HTMLElement) || document.documentElement;\n const containerRect = container.getBoundingClientRect();\n maxX = containerRect.width - rect.width;\n maxY = containerRect.height - rect.height;\n }\n\n return {\n x: Math.min(Math.max(0, x), maxX),\n y: Math.min(Math.max(0, y), maxY),\n };\n }\n\n private onMouseMove(e: MouseEvent): void {\n if (!this.isDragging) {\n const dx = e.clientX - this.startX;\n const dy = e.clientY - this.startY;\n if (Math.abs(dx) > this.threshold || Math.abs(dy) > this.threshold) {\n this.isDragging = true;\n if (this.options.onDragStart) {\n this.options.onDragStart(e);\n }\n }\n }\n\n if (this.isDragging) {\n const dx = e.clientX - this.startX;\n const dy = e.clientY - this.startY;\n const newX = this.initialX + dx;\n const newY = this.initialY + dy;\n\n const boundedPosition = this.getBoundedPosition(newX, newY);\n\n this.element.style.right = \"auto\";\n this.element.style.bottom = \"auto\";\n this.element.style.left = boundedPosition.x + \"px\";\n this.element.style.top = boundedPosition.y + \"px\";\n\n if (this.options.onDrag) {\n this.options.onDrag(e);\n }\n }\n }\n\n private convertCoordinate(): void {\n const rect = this.element.getBoundingClientRect();\n const style = getComputedStyle(this.element);\n const position = style.position;\n\n // 获取参考容器\n let container: Element | null = null;\n let containerRect: DOMRect | null = null;\n\n if (position === \"fixed\") {\n // fixed定位相对于视口\n container = null;\n containerRect = new DOMRect(0, 0, window.innerWidth, window.innerHeight);\n } else {\n // 获取定位参考元素\n container = this.element.offsetParent as Element;\n if (!container) {\n container = document.documentElement;\n }\n const containerStyle = getComputedStyle(container);\n if (containerStyle.position === \"static\") {\n // 如果容器是static定位,使用视口作为参考\n container = null;\n containerRect = new DOMRect(\n 0,\n 0,\n window.innerWidth,\n window.innerHeight\n );\n } else {\n containerRect = container.getBoundingClientRect();\n }\n }\n\n if (!containerRect) return;\n\n // 计算当前位置\n let currentLeft: number;\n let currentTop: number;\n\n if (position === \"fixed\") {\n currentLeft = rect.left;\n currentTop = rect.top;\n } else {\n // 对于非fixed定位,需要计算相对位置\n currentLeft = rect.left - containerRect.left;\n currentTop = rect.top - containerRect.top;\n\n if (container instanceof HTMLElement) {\n // 考虑边框\n const containerStyle = getComputedStyle(container);\n const borderLeft = parseFloat(containerStyle.borderLeftWidth) || 0;\n const borderTop = parseFloat(containerStyle.borderTopWidth) || 0;\n currentLeft -= borderLeft;\n currentTop -= borderTop;\n } else {\n currentLeft = currentLeft + window.scrollX;\n currentTop = currentTop + window.scrollY;\n }\n }\n\n // 根据不同的坐标原点设置位置\n switch (this.options.coordinate) {\n case \"tr\":\n const right = containerRect.width - currentLeft - rect.width;\n this.element.style.left = \"auto\";\n this.element.style.right = `${right}px`;\n this.element.style.top = `${currentTop}px`;\n this.element.style.bottom = \"auto\";\n break;\n case \"bl\":\n const bottom = containerRect.height - currentTop - rect.height;\n this.element.style.left = `${currentLeft}px`;\n this.element.style.right = \"auto\";\n this.element.style.top = \"auto\";\n this.element.style.bottom = `${bottom}px`;\n break;\n case \"br\":\n const brRight = containerRect.width - currentLeft - rect.width;\n const brBottom = containerRect.height - currentTop - rect.height;\n this.element.style.left = \"auto\";\n this.element.style.right = `${brRight}px`;\n this.element.style.top = \"auto\";\n this.element.style.bottom = `${brBottom}px`;\n break;\n case \"tl\":\n default:\n this.element.style.left = `${currentLeft}px`;\n this.element.style.right = \"auto\";\n this.element.style.top = `${currentTop}px`;\n this.element.style.bottom = \"auto\";\n }\n }\n\n private onMouseUp(e: MouseEvent): void {\n if (this.isDragging) {\n // 在拖拽结束时转换坐标\n if (this.options.coordinate && this.options.coordinate !== \"tl\") {\n this.convertCoordinate();\n }\n\n if (this.options.onDragEnd) {\n this.options.onDragEnd(e);\n }\n }\n this.isDragging = false;\n document.removeEventListener(\"mousemove\", this.onMouseMoveHandler);\n document.removeEventListener(\"mouseup\", this.onMouseUpHandler);\n }\n}\n","/**\n * 通用的chrome存储管理类\n * 提供对 chrome.storage.local 和 chrome.storage.sync 的封装操作,支持单例模式\n */\nexport class ChromeStore<T extends Record<string, any>> {\n private readonly storageKey: string;\n private readonly storeType: \"local\" | \"sync\";\n private readonly store: chrome.storage.StorageArea;\n private static instances = new Map<string, ChromeStore<any>>();\n\n private constructor(\n storageKey: string,\n storeType: \"local\" | \"sync\" = \"local\"\n ) {\n this.storageKey = storageKey;\n this.storeType = storeType;\n this.store = chrome.storage[storeType];\n }\n\n private static getInstanceKey(\n storageKey: string,\n storeType: \"local\" | \"sync\" = \"local\"\n ): string {\n return `${storeType}:${storageKey}`;\n }\n\n /**\n * 获取单例实例\n */\n static getInstance<T extends Record<string, any>>(\n storageKey: string,\n storeType: \"local\" | \"sync\" = \"local\"\n ): ChromeStore<T> {\n const key = this.getInstanceKey(storageKey, storeType);\n\n if (!this.instances.has(key)) {\n this.instances.set(key, new ChromeStore<T>(storageKey, storeType));\n }\n\n return this.instances.get(key) as ChromeStore<T>;\n }\n\n /**\n * 便捷方法:创建本地存储实例\n */\n static local<T extends Record<string, any>>(\n storageKey: string\n ): ChromeStore<T> {\n return this.getInstance<T>(storageKey, \"local\");\n }\n\n /**\n * 便捷方法:创建同步存储实例\n */\n static sync<T extends Record<string, any>>(\n storageKey: string\n ): ChromeStore<T> {\n return this.getInstance<T>(storageKey, \"sync\");\n }\n\n /**\n * 清理指定实例\n */\n static clearInstance(\n storageKey: string,\n storeType: \"local\" | \"sync\" = \"local\"\n ): void {\n const key = this.getInstanceKey(storageKey, storeType);\n this.instances.delete(key);\n }\n\n /**\n * 清理所有实例\n */\n static clearAllInstances(): void {\n this.instances.clear();\n }\n\n /**\n * 设置数据到 chrome.storage.local 或 chrome.storage.sync\n */\n async set<K extends keyof T>(prop: K, value: T[K]): Promise<void> {\n try {\n const currentData = await this.getAll();\n const updatedData = { ...currentData, [prop]: value };\n await this.store.set({\n [this.storageKey]: updatedData,\n });\n } catch (error) {\n console.error(\"ChromeStore.set 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 获取数据从 chrome.storage.local 或 chrome.storage.sync\n */\n async get<K extends keyof T>(prop: K): Promise<T[K] | undefined> {\n try {\n const data = await this.getAll();\n return data?.[prop];\n } catch (error) {\n console.error(\"ChromeStore.get 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 获取所有数据从 chrome.storage.local 或 chrome.storage.sync\n */\n async getAll(): Promise<T> {\n try {\n const result = await this.store.get(this.storageKey);\n return (result[this.storageKey] as T) || ({} as T);\n } catch (error) {\n console.error(\"ChromeStore.getAll 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 删除指定的数据从 chrome.storage.local 或 chrome.storage.sync\n */\n async remove<K extends keyof T>(prop: K): Promise<void> {\n try {\n const currentData = await this.getAll();\n if (currentData && prop in currentData) {\n delete currentData[prop];\n await this.store.set({\n [this.storageKey]: currentData,\n });\n }\n } catch (error) {\n console.error(\"ChromeStore.remove 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 清空所有数据\n */\n async clear(): Promise<void> {\n try {\n await this.store.remove(this.storageKey);\n } catch (error) {\n console.error(\"ChromeStore.clear 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 批量设置多个数据\n */\n async setMultiple(data: Partial<T>): Promise<void> {\n try {\n const currentData = await this.getAll();\n const updatedData = { ...currentData, ...data };\n await this.store.set({\n [this.storageKey]: updatedData,\n });\n } catch (error) {\n console.error(\"ChromeStore.setMultiple 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 监听存储变化\n */\n onChanged(\n callback: (changes: { [key: string]: chrome.storage.StorageChange }) => void\n ): void {\n chrome.storage.onChanged.addListener((changes, namespace) => {\n if (namespace === this.storeType && changes[this.storageKey]) {\n callback(changes);\n }\n });\n }\n\n /**\n * 检查是否存在指定的数据\n */\n async has<K extends keyof T>(prop: K): Promise<boolean> {\n try {\n const value = await this.get(prop);\n return value !== undefined;\n } catch (error) {\n console.error(\"ChromeStore.has 失败:\", error);\n return false;\n }\n }\n\n /**\n * 获取存储大小(字节数)\n */\n async getSize(): Promise<number> {\n try {\n const data = await this.getAll();\n const jsonString = JSON.stringify(data);\n return new Blob([jsonString]).size;\n } catch (error) {\n console.error(\"ChromeStore.getSize 失败:\", error);\n return 0;\n }\n }\n\n /**\n * 获取当前存储键名\n */\n getStoreKey(): string {\n return this.storageKey;\n }\n}\n\n// // demo\n// type AppData = {\n// InstallTimestamp: number; // 安装时间\n// };\n\n// // 用户登录后可用的数据\n// type UserData = {\n// AddedInstallReward: boolean; // 是否已经添加奖励\n// ResharePostTimes: number; // 转发post次数\n// };\n\n// type TChromeStore = {\n// app_data: AppData;\n// user_data: UserData;\n// };\n\n// function getStore<T extends keyof TChromeStore>(key: T) {\n// return ChromeStore.local<TChromeStore[T]>(key);\n// }\n\n// // 创建特定类型的存储实例\n// export const AppStore = getStore(\"app_data\");\n// export const UserStore = getStore(\"user_data\");\n","declare var global: typeof globalThis;\n\n/**\n * 获取当前环境的全局对象。\n *\n * 在不同的 JavaScript 运行环境中,全局对象的名称不同:\n * - 在浏览器环境中,全局对象是 `window`。\n * - 在 Node.js 环境中,全局对象是 `global`。\n * - 在 Web Worker 环境中,全局对象是 `self`。\n *\n * 这个函数提供了一种统一的方式来获取当前环境的全局对象。\n *\n * @returns 当前环境的全局对象。\n */\nexport function getGlobal(this: any) {\n if (typeof globalThis !== \"undefined\") {\n return globalThis;\n }\n\n if (typeof self !== \"undefined\") {\n return self;\n }\n\n if (typeof window !== \"undefined\") {\n return window;\n }\n\n if (typeof global !== \"undefined\") {\n return global;\n }\n\n // 如果以上都不符合,则返回 this\n return this;\n}\n","import { AsyncFunction, RealUndefined } from \"./type\";\n\n/**\n * 定义一个类型,用于扩展函数类型,增加一个可选的 isExecuting 属性\n */\nexport type SingleExecutionFunction<F extends AsyncFunction<any[], any>> =\n F extends (this: infer This, ...args: infer Args) => Promise<infer R>\n ? ((this: This, ...args: Args) => Promise<R | RealUndefined>) & {\n isExecuting?: boolean;\n }\n : never;\n\n/**\n * 创建一个有执行状态的函数,该函数在前一次调用未完成时不会被再次调用。\n *\n * @param func - 需要包裹的函数。\n * @returns 一个增强版的函数,该函数具有 isExecuting 属性。\n */\nexport function singleExecutionWrapper<T extends AsyncFunction<any[], any>>(\n func: T,\n minTime: number = 0\n) {\n const singleExecutionFn = function (\n this: ThisParameterType<T>,\n ...args: Parameters<T>\n ): ReturnType<T> | Promise<RealUndefined> {\n if (singleExecutionFn.isExecuting) {\n // console.log(`Function(${func.name}) is executing.`);\n return Promise.resolve(RealUndefined);\n }\n singleExecutionFn.isExecuting = true;\n\n const startTime = performance.now();\n const result = func.apply(this, args) as Promise<any>;\n result.finally(() => {\n const loadTime = performance.now() - startTime;\n if (minTime && minTime > loadTime) {\n setTimeout(() => {\n singleExecutionFn.isExecuting = false;\n }, minTime - loadTime);\n } else {\n singleExecutionFn.isExecuting = false;\n }\n });\n\n return result;\n } as SingleExecutionFunction<T>;\n\n singleExecutionFn.isExecuting = false;\n\n return singleExecutionFn as unknown as T & { isExecuting: boolean };\n}\n"],"names":["RealUndefined","Symbol","isCloneable","obj","clone","isPrimitive","value","type","generateStableUniqueKey","params","String","JSON","stringify","_key","Array","isArray","Object","keys","sort","reduce","pre","cur","cloneDeep","map","item","newObj","key","prototype","hasOwnProperty","call","createDefaultObject","defaultValue","Proxy","get","target","property","isNode","undefined","globalThis","process","versions","node","navigator","userAgent","includes","WorkerGlobalScope","DedicatedWorkerGlobalScope","SharedWorkerGlobalScope","ServiceWorkerGlobalScope","platform","userAgentData","startsWith","maxTouchPoints","test","cache","loadingCache","getCachedData","apiKey","hasCachedData","defalutSetting","timeout","timeoutResult","code","msg","identifier","setStyle","element","important","style","priority","setProperty","createSvgFromVNode","vnode","document","createElementNS","props","_i3","_Object$entries3","entries","length","_Object$entries3$_i","setAttribute","children","textNode","createTextNode","appendChild","forEach","child","childElement","createSvgFromString","svgString","svgElement","DOMParser","parseFromString","documentElement","SVGElement","Error","scrollToBottom","dom","setTimeout","scrollTop","scrollHeight","Draggable","options","this","isDragging","startX","startY","initialX","initialY","threshold","onMouseMoveHandler","onMouseUpHandler","_extends","coordinate","originPosition","getComputedStyle","position","onMouseMove","bind","onMouseUp","addEventListener","onMouseDown","_proto","e","preventDefault","clientX","clientY","parseInt","window","left","top","getBoundedPosition","x","y","maxX","maxY","rect","getBoundingClientRect","innerWidth","width","innerHeight","height","containerRect","offsetParent","Math","min","max","dy","abs","onDragStart","boundedPosition","right","bottom","onDrag","convertCoordinate","container","DOMRect","currentLeft","currentTop","HTMLElement","containerStyle","parseFloat","borderLeftWidth","borderTopWidth","scrollX","scrollY","brRight","brBottom","onDragEnd","removeEventListener","ChromeStore","storageKey","storeType","store","chrome","storage","getInstanceKey","getInstance","instances","has","set","local","sync","clearInstance","clearAllInstances","clear","prop","_this","Promise","resolve","_catch","getAll","then","currentData","_extends2","_this$store$set","updatedData","error","console","reject","_this2","data","_this3","result","remove","_this4","_temp","_this4$store$set","_this5","setMultiple","_this6","_this6$store$set","onChanged","callback","_this7","addListener","changes","namespace","_this8","getSize","_this9","jsonString","Blob","size","getStoreKey","Map","func","setting","wrappedFunction","args","slice","arguments","apply","name","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","res","defineProperty","configurable","createElement","_ref","_ref$tag","tag","_ref$children","_ref$props","_ref$attrs","attrs","_ref$styles","styles","ele","_i","_Object$entries","_Object$entries$_i","_i2","_Object$entries2","_Object$entries2$_i","_step","_iterator","_createForOfIteratorHelperLoose","done","Element","url","fetch","response","ok","status","statusText","text","errorMessage","message","wait","_arguments","context","clearTimeout","delay","self","global","dataset","isListeningForUserScroll","inter","userInteracted","userInteractedWithScroll","clientHeight","listenForUserScroll","minTime","singleExecutionFn","isExecuting","performance","loadTime"],"mappings":"AAAa,IAAAA,EAAgBC,OAAO,aAwCpB,SAAAC,EAAYC,GAC1B,MAA6B,mBAAfA,MAAAA,OAAAA,EAAAA,EAAKC,MACrB,UAUgBC,EACdC,GAEA,IAAMC,SAAcD,EACpB,OACY,OAAVA,GACS,WAATC,GACS,WAATA,GACS,YAATA,GACS,cAATA,CAEJ,CCpDgB,SAAAC,EAAwBC,GACtC,OAAIJ,EAAYI,GACPC,OAAOD,GAETE,KAAKC,UAAUH,EAAQ,SAAUI,EAAuBP,GAC7D,MAAqB,iBAAVA,GAAgC,OAAVA,GAAmBQ,MAAMC,QAAQT,GAQ3DA,EAPEU,OAAOC,KAAKX,GAChBY,OACAC,OAAO,SAACC,EAAUC,GAEjB,OADAD,EAAIC,GAAOf,EAAMe,GACVD,CACT,EAAG,CAAE,EAGX,EACF,UClBgBE,EAAanB,GAC3B,GAAY,OAARA,GAA+B,iBAARA,EACzB,OAAOA,EAGT,GAAID,EAAYC,GACd,OAAOA,EAAIC,QAIb,GAAIU,MAAMC,QAAQZ,GAChB,OAAOA,EAAIoB,IAAI,SAACC,GAAS,OAAAF,EAAUE,EAAK,GAG1C,IAAMC,EAAiC,CAAE,EACzC,IAAK,IAAMC,KAAOvB,EACZa,OAAOW,UAAUC,eAAeC,KAAK1B,EAAKuB,KAC5CD,EAAOC,GAAOJ,EAAUnB,EAAIuB,KAGhC,OAAOD,CACT,CCuDM,SAAUK,EAAuBC,GACrC,OAAW,IAAAC,MACT,GACA,CACEC,IAAK,SAACC,EAAQC,GACZ,OAAOD,EAAON,eAAeO,GACzBD,EAAOC,GACPJ,CACN,GAGN,CC3FO,MAAMK,OAAgDC,IAAvCC,WAAWC,SAASC,UAAUC,KAQ7BH,WAAWI,WAAWC,WAAWC,SAAS,SAET,oBAAtBC,oBAAqCP,WAAsBO,mBAEtB,oBAA/BC,6BAA8CR,WAAsBQ,4BAE3C,oBAA5BC,0BAA2CT,WAAsBS,yBAEnC,oBAA7BC,2BAA4CV,WAAsBU,0BAGxG,MAAMC,EAAWX,WAAWI,WAAWQ,eAAeD,SAElB,UAAbA,GACgB,aAAnCX,WAAWI,WAAWO,WACiC,IAAvDX,WAAWI,WAAWC,WAAWC,SAAS,UAC1CN,WAMgC,UAAbW,IACqC,IAAxDX,WAAWI,WAAWO,UAAUE,WAAW,WACc,IAAzDb,WAAWI,WAAWC,WAAWC,SAAS,YAC1CN,WAE8B,QAAbW,GACmB,aAAnCX,WAAWI,WAAWO,UAA2BX,WAAWI,WAAWU,eAAiB,GACzF,mBAAmBC,KAAKf,WAAWI,WAAWO,UAEZ,YAAbA,GACc,YAAnCX,WAAWI,WAAWO,WACqC,IAA3DX,WAAWI,WAAWC,WAAWC,SAAS,cAC1CN,WCvCJ,IAAMgB,EAA6BxB,EAAyB9B,GACtDuD,EAAezB,GAAoB,GACzC,SAAS0B,EAAuBC,GAC9B,OAAOH,EAAMG,EACf,CAEA,SAASC,EAAcD,GACrB,OAAOH,EAAMG,KAAYzD,CAC3B,CAQA,IAAM2D,EAA0B,CAC9BC,QAAS,IACTC,cAAe,CAAEC,KAAM,IAAKC,IAAK,QACjCC,WAAY,kUCiBd,SAASC,EACPC,EACA/B,EACA7B,EACA6D,GAEA,QAFAA,IAAAA,IAAAA,GAAqB,GAEjBhC,KAAY+B,EAAQE,MACrBF,EAAQE,MAAcjC,GAAY7B,MAC9B,CACL,IAAM+D,EAAWF,EAAY,YAAc,GAC3CD,EAAQE,MAAME,YAAYnC,EAAUzB,OAAOJ,GAAQ+D,EACrD,CACF,CA8EA,SAASE,EAAmBC,GAC1B,IACMN,EAAUO,SAASC,gBADP,6BACkCF,EAAMjE,MAE1D,GAAIiE,EAAMG,MACR,IAAAC,IAAAA,IAAAC,EAA2B7D,OAAO8D,QAAQN,EAAMG,OAAMC,EAAAC,EAAAE,OAAAH,IAAE,CAAnD,IAAAI,EAAAH,EAAAD,GACHV,EAAQe,aADKD,KAAOA,EACpBd,GACF,CAGF,GAA8B,iBAAnBM,EAAMU,SAAuB,CACtC,IAAMC,EAAWV,SAASW,eAAeZ,EAAMU,UAC/ChB,EAAQmB,YAAYF,EACtB,MAAWrE,MAAMC,QAAQyD,EAAMU,WAC7BV,EAAMU,SAASI,QAAQ,SAACC,GACtB,IAAMC,EAAejB,EAAmBgB,GACxCrB,EAAQmB,YAAYG,EACtB,GAGF,OAAOtB,CACT,CASA,SAASuB,EAAoBC,GAC3B,IAGMC,GAHS,IAAIC,WACAC,gBAAgBH,EAAW,iBAEvBI,gBACvB,KAAMH,aAAsBI,YAC1B,MAAM,IAAIC,MAAM,uBAGlB,OAAOL,CACT,UCvKgBM,EAAeC,GACzBA,GACFC,WAAW,WAETD,EAAIE,UAAYF,EAAIG,YACtB,EAAG,EAEP,CCkBa,IAAAC,eAaX,WAAA,SAAAA,EAAYpC,EAAsBqC,QAAA,IAAAA,IAAAA,EAA4B,CAAA,GAAEC,KAZxDtC,aAAO,EAAAsC,KACPD,aACAE,EAAAA,KAAAA,YAAsB,OACtBC,OAAiB,EAACF,KAClBG,OAAiB,EACjBC,KAAAA,SAAmB,EAACJ,KACpBK,SAAmB,EAACL,KACpBM,UAAoB,EAEpBC,KAAAA,wBACAC,EAAAA,KAAAA,wBAGNR,KAAKtC,QAAUA,EACfsC,KAAKD,QAAOU,EAAA,CACVC,WAAY,MACTX,GAGL,IAAIY,EAAiBC,iBAAiBZ,KAAKtC,SAASmD,SAC/CF,GAAqC,WAAnBA,IACrBX,KAAKtC,QAAQE,MAAMiD,SAAW,YAG5Bb,KAAKD,QAAQc,WACfb,KAAKtC,QAAQE,MAAMiD,SAAWb,KAAKD,QAAQc,UAG7Cb,KAAKO,mBAAqBP,KAAKc,YAAYC,KAAKf,MAChDA,KAAKQ,iBAAmBR,KAAKgB,UAAUD,KAAKf,MAE5CA,KAAKtC,QAAQuD,iBAAiB,YAAajB,KAAKkB,YAAYH,KAAKf,MACnE,CAAC,IAAAmB,EAAArB,EAAA3E,iBAAAgG,EAEOD,YAAA,SAAYE,GAClBA,EAAEC,iBACFrB,KAAKE,OAASkB,EAAEE,QAChBtB,KAAKG,OAASiB,EAAEG,QAChBvB,KAAKI,SACHoB,SAASC,OAAOb,iBAAiBZ,KAAKtC,SAASgE,KAAM,KAAO,EAC9D1B,KAAKK,SACHmB,SAASC,OAAOb,iBAAiBZ,KAAKtC,SAASiE,IAAK,KAAO,EAE7D1D,SAASgD,iBAAiB,YAAajB,KAAKO,oBAC5CtC,SAASgD,iBAAiB,UAAWjB,KAAKQ,iBAC5C,EAACW,EAEOS,mBAAA,SAAmBC,EAAWC,GACpC,IAGIC,EACAC,EAJEC,EAAOjC,KAAKtC,QAAQwE,wBAM1B,GAAiB,UALAtB,iBAAiBZ,KAAKtC,SAASmD,SAO9CkB,EAAON,OAAOU,WAAaF,EAAKG,MAChCJ,EAAOP,OAAOY,YAAcJ,EAAKK,WAC5B,CAEL,IAEMC,GADHvC,KAAKtC,QAAQ8E,cAAgCvE,SAASqB,iBACzB4C,wBAChCH,EAAOQ,EAAcH,MAAQH,EAAKG,MAClCJ,EAAOO,EAAcD,OAASL,EAAKK,MACrC,CAEA,MAAO,CACLT,EAAGY,KAAKC,IAAID,KAAKE,IAAI,EAAGd,GAAIE,GAC5BD,EAAGW,KAAKC,IAAID,KAAKE,IAAI,EAAGb,GAAIE,GAEhC,EAACb,EAEOL,YAAA,SAAYM,GAClB,IAAKpB,KAAKC,WAAY,CACpB,IACM2C,EAAKxB,EAAEG,QAAUvB,KAAKG,QACxBsC,KAAKI,IAFEzB,EAAEE,QAAUtB,KAAKE,QAETF,KAAKM,WAAamC,KAAKI,IAAID,GAAM5C,KAAKM,aACvDN,KAAKC,YAAa,EACdD,KAAKD,QAAQ+C,aACf9C,KAAKD,QAAQ+C,YAAY1B,GAG/B,CAEA,GAAIpB,KAAKC,WAAY,CACnB,IAKM8C,EAAkB/C,KAAK4B,mBAHhB5B,KAAKI,UAFPgB,EAAEE,QAAUtB,KAAKE,QAGfF,KAAKK,UAFPe,EAAEG,QAAUvB,KAAKG,SAM5BH,KAAKtC,QAAQE,MAAMoF,MAAQ,OAC3BhD,KAAKtC,QAAQE,MAAMqF,OAAS,OAC5BjD,KAAKtC,QAAQE,MAAM8D,KAAOqB,EAAgBlB,EAAI,KAC9C7B,KAAKtC,QAAQE,MAAM+D,IAAMoB,EAAgBjB,EAAI,KAEzC9B,KAAKD,QAAQmD,QACflD,KAAKD,QAAQmD,OAAO9B,EAExB,CACF,EAACD,EAEOgC,kBAAA,WACN,IAAMlB,EAAOjC,KAAKtC,QAAQwE,wBAEpBrB,EADQD,iBAAiBZ,KAAKtC,SACbmD,SAGnBuC,EAA4B,KAC5Bb,EAAgC,KA2BpC,GAzBiB,UAAb1B,GAEFuC,EAAY,KACZb,EAAgB,IAAIc,QAAQ,EAAG,EAAG5B,OAAOU,WAAYV,OAAOY,gBAG5De,EAAYpD,KAAKtC,QAAQ8E,gBAEvBY,EAAYnF,SAASqB,iBAGS,WADTsB,iBAAiBwC,GACrBvC,UAEjBuC,EAAY,KACZb,EAAgB,IAAIc,QAClB,EACA,EACA5B,OAAOU,WACPV,OAAOY,cAGTE,EAAgBa,EAAUlB,yBAIzBK,EAAL,CAGA,IAAIe,EACAC,EAEJ,GAAiB,UAAb1C,EACFyC,EAAcrB,EAAKP,KACnB6B,EAAatB,EAAKN,SAMlB,GAHA2B,EAAcrB,EAAKP,KAAOa,EAAcb,KACxC6B,EAAatB,EAAKN,IAAMY,EAAcZ,IAElCyB,aAAqBI,YAAa,CAEpC,IAAMC,EAAiB7C,iBAAiBwC,GAGxCE,GAFmBI,WAAWD,EAAeE,kBAAoB,EAGjEJ,GAFkBG,WAAWD,EAAeG,iBAAmB,CAGjE,MACEN,GAA4B7B,OAAOoC,QACnCN,GAA0B9B,OAAOqC,QAKrC,OAAQ9D,KAAKD,QAAQW,YACnB,IAAK,KACH,IAAMsC,EAAQT,EAAcH,MAAQkB,EAAcrB,EAAKG,MACvDpC,KAAKtC,QAAQE,MAAM8D,KAAO,OAC1B1B,KAAKtC,QAAQE,MAAMoF,MAAWA,EAAK,KACnChD,KAAKtC,QAAQE,MAAM+D,IAAS4B,EAAc,KAC1CvD,KAAKtC,QAAQE,MAAMqF,OAAS,OAC5B,MACF,IAAK,KACH,IAAMA,EAASV,EAAcD,OAASiB,EAAatB,EAAKK,OACxDtC,KAAKtC,QAAQE,MAAM8D,KAAU4B,EAAW,KACxCtD,KAAKtC,QAAQE,MAAMoF,MAAQ,OAC3BhD,KAAKtC,QAAQE,MAAM+D,IAAM,OACzB3B,KAAKtC,QAAQE,MAAMqF,OAAYA,EAAM,KACrC,MACF,IAAK,KACH,IAAMc,EAAUxB,EAAcH,MAAQkB,EAAcrB,EAAKG,MACnD4B,EAAWzB,EAAcD,OAASiB,EAAatB,EAAKK,OAC1DtC,KAAKtC,QAAQE,MAAM8D,KAAO,OAC1B1B,KAAKtC,QAAQE,MAAMoF,MAAWe,EAAO,KACrC/D,KAAKtC,QAAQE,MAAM+D,IAAM,OACzB3B,KAAKtC,QAAQE,MAAMqF,OAAYe,EAAQ,KACvC,MAEF,QACEhE,KAAKtC,QAAQE,MAAM8D,KAAU4B,OAC7BtD,KAAKtC,QAAQE,MAAMoF,MAAQ,OAC3BhD,KAAKtC,QAAQE,MAAM+D,IAAS4B,EAAc,KAC1CvD,KAAKtC,QAAQE,MAAMqF,OAAS,OAxDZ,CA0DtB,EAAC9B,EAEOH,UAAA,SAAUI,GACZpB,KAAKC,aAEHD,KAAKD,QAAQW,YAA0C,OAA5BV,KAAKD,QAAQW,YAC1CV,KAAKmD,oBAGHnD,KAAKD,QAAQkE,WACfjE,KAAKD,QAAQkE,UAAU7C,IAG3BpB,KAAKC,YAAa,EAClBhC,SAASiG,oBAAoB,YAAalE,KAAKO,oBAC/CtC,SAASiG,oBAAoB,UAAWlE,KAAKQ,iBAC/C,EAACV,CAAA,CAxMD,0FCxCW,IAAAqE,eAAW,WAMtB,SAAAA,EACEC,EACAC,YAAAA,IAAAA,EAA8B,SAAOrE,KAPtBoE,gBAAU,EAAApE,KACVqE,eAAS,EAAArE,KACTsE,WAAK,EAOpBtE,KAAKoE,WAAaA,EAClBpE,KAAKqE,UAAYA,EACjBrE,KAAKsE,MAAQC,OAAOC,QAAQH,EAC9B,CAACF,EAEcM,eAAP,SACNL,EACAC,GAEA,gBAFAA,IAAAA,EAA8B,SAEpBA,EAAaD,IAAAA,CACzB,EAACD,EAKMO,YAAP,SACEN,EACAC,QAAAA,IAAAA,IAAAA,EAA8B,SAE9B,IAAMnJ,EAAM8E,KAAKyE,eAAeL,EAAYC,GAM5C,OAJKrE,KAAK2E,UAAUC,IAAI1J,IACtB8E,KAAK2E,UAAUE,IAAI3J,EAAK,IAAIiJ,EAAeC,EAAYC,IAG9CrE,KAAC2E,UAAUlJ,IAAIP,EAC5B,EAACiJ,EAKMW,MAAP,SACEV,GAEA,OAAOpE,KAAK0E,YAAeN,EAAY,QACzC,EAACD,EAKMY,KAAP,SACEX,GAEA,OAAWpE,KAAC0E,YAAeN,EAAY,OACzC,EAACD,EAKMa,cAAP,SACEZ,EACAC,QAAAA,IAAAA,IAAAA,EAA8B,SAE9B,IAAMnJ,EAAM8E,KAAKyE,eAAeL,EAAYC,GAC5CrE,KAAK2E,UAAS,OAAQzJ,EACxB,EAACiJ,EAKMc,kBAAP,WACEjF,KAAK2E,UAAUO,OACjB,EAAC/D,IAAAA,EAAAgD,EAAAhJ,UAuIAgJ,OAvIAhD,EAKK0D,IAAG,SAAoBM,EAASrL,GAAW,IAAA,IAAAsL,EAEnBpF,KAAIqF,OAAAA,QAAAC,QAAAC,EAD5B,WAAA,OAAAF,QAAAC,QACwBF,EAAKI,UAAQC,KAAjCC,SAAAA,GAAWC,IAAAA,EAAAC,EACXC,EAAWpF,EAAQiF,CAAAA,EAAAA,IAAWC,EAAA,CAAA,GAAGR,GAAOrL,EAAK6L,IAAG,OAAAN,QAAAC,QAChDF,EAAKd,MAAMO,KAAGe,EAAAA,CAAAA,EAAAA,EACjBR,EAAKhB,YAAayB,EAAWD,KAC9BH,KAAA,aAAA,EACJ,EAAC,SAAQK,GAEP,MADAC,QAAQD,MAAM,sBAAuBA,GAC/BA,CACR,GACF,CAAC,MAAA1E,GAAAiE,OAAAA,QAAAW,OAAA5E,EAAAD,CAAAA,EAAAA,EAKK1F,IAAG,SAAoB0J,GAAO,IAAA,IAAAc,EAEbjG,KAAI,OAAAqF,QAAAC,QAAAC,EADrB,WAAA,OAAAF,QAAAC,QACiBW,EAAKT,UAAQC,KAAA,SAA1BS,GACN,OAAOA,MAAAA,OAAAA,EAAAA,EAAOf,EAAM,EACtB,EAAC,SAAQW,GAEP,MADAC,QAAQD,MAAM,sBAAuBA,GAC/BA,CACR,GACF,CAAC,MAAA1E,GAAA,OAAAiE,QAAAW,OAAA5E,EAAAD,CAAAA,EAAAA,EAKKqE,OAAA,WAAM,IAAA,IAAAW,EAEanG,KAAI,OAAAqF,QAAAC,QAAAC,EADvB,WAAA,OAAAF,QAAAC,QACmBa,EAAK7B,MAAM7I,IAAI0K,EAAK/B,aAAWqB,KAAA,SAA9CW,GACN,OAAQA,EAAOD,EAAK/B,aAAsB,EAAS,EACrD,EAAC,SAAQ0B,GAEP,MADAC,QAAQD,MAAM,yBAA0BA,GAClCA,CACR,GACF,CAAC,MAAA1E,GAAA,OAAAiE,QAAAW,OAAA5E,EAAA,CAAA,EAAAD,EAKKkF,OAAA,SAA0BlB,GAAO,IAAAmB,IAAAA,EAETtG,KAAIqF,OAAAA,QAAAC,QAAAC,aAD5BF,OAAAA,QAAAC,QACwBgB,EAAKd,UAAQC,KAAjCC,SAAAA,GAAWa,IAAAA,aACqBC,IAAAA,KAAlCd,GAAeP,KAAQO,EACA,cAAlBA,EAAYP,GAAME,QAAAC,QACnBgB,EAAKhC,MAAMO,KAAG2B,EAAA,GAAAA,EACjBF,EAAKlC,YAAasB,EAAWc,KAC9Bf,KAAAc,WAAAA,EAAAA,IAAAA,GAAAA,GAAAA,EAAAd,KAAAc,OAAAA,EAAAd,KAAA,WAAA,EAAA,EAEN,EAAC,SAAQK,GAEP,MADAC,QAAQD,MAAM,yBAA0BA,GAClCA,CACR,GACF,CAAC,MAAA1E,GAAAiE,OAAAA,QAAAW,OAAA5E,EAAAD,CAAAA,EAAAA,EAKK+D,iBAAK,IAAAuB,IAAAA,EAEDzG,KAAIqF,OAAAA,QAAAC,QAAAC,EADR,WAAA,OAAAF,QAAAC,QACImB,EAAKnC,MAAM+B,OAAOI,EAAKrC,aAAWqB,KAAA,WAAA,EAC1C,EAASK,SAAAA,GAEP,MADAC,QAAQD,MAAM,wBAAyBA,GACjCA,CACR,GACF,CAAC,MAAA1E,GAAAiE,OAAAA,QAAAW,OAAA5E,EAAAD,CAAAA,EAAAA,EAKKuF,YAAA,SAAYR,GAAgB,IAAA,IAAAS,EAEJ3G,KAAI,OAAAqF,QAAAC,QAAAC,EAAA,WAD5BF,OAAAA,QAAAC,QACwBqB,EAAKnB,UAAQC,KAAA,SAAjCC,GAAW,IAAAkB,EACXf,EAAWpF,EAAQiF,CAAAA,EAAAA,EAAgBQ,GAAO,OAAAb,QAAAC,QAC1CqB,EAAKrC,MAAMO,KAAG+B,EAAAA,CAAAA,EAAAA,EACjBD,EAAKvC,YAAayB,EAAWe,KAC9BnB,oBACJ,EAAC,SAAQK,GAEP,MADAC,QAAQD,MAAM,8BAA+BA,GACvCA,CACR,GACF,CAAC,MAAA1E,GAAA,OAAAiE,QAAAW,OAAA5E,EAAA,CAAA,EAAAD,EAKD0F,UAAA,SACEC,GAA4EC,IAAAA,EAE5ExC,KAAAA,OAAOC,QAAQqC,UAAUG,YAAY,SAACC,EAASC,GACzCA,IAAcH,EAAK1C,WAAa4C,EAAQF,EAAK3C,aAC/C0C,EAASG,EAEb,EACF,EAAC9F,EAKKyD,IAAA,SAAuBO,GAAO,IAAA,IAAAgC,EAEZnH,KAAI,OAAAqF,QAAAC,QAAAC,EAAA,WADtBF,OAAAA,QAAAC,QACkB6B,EAAK1L,IAAI0J,IAAKM,KAAA,SAA5B3L,GACN,YAAiB+B,IAAV/B,CAAoB,EAC7B,EAASgM,SAAAA,GAEP,OADAC,QAAQD,MAAM,sBAAuBA,KAEvC,GACF,CAAC,MAAA1E,GAAA,OAAAiE,QAAAW,OAAA5E,EAAA,CAAA,EAAAD,EAKKiG,QAAO,WAAA,IAAA,IAAAC,EAEUrH,KAAI,OAAAqF,QAAAC,QAAAC,EAAA,WADrBF,OAAAA,QAAAC,QACiB+B,EAAK7B,UAAQC,KAAA,SAA1BS,GACN,IAAMoB,EAAanN,KAAKC,UAAU8L,GAClC,OAAO,IAAIqB,KAAK,CAACD,IAAaE,IAAK,EACrC,EAAS1B,SAAAA,GAEP,OADAC,QAAQD,MAAM,0BAA2BA,IAE3C,GACF,CAAC,MAAA1E,GAAA,OAAAiE,QAAAW,OAAA5E,EAAA,CAAA,EAAAD,EAKDsG,YAAA,WACE,OAAOzH,KAAKoE,UACd,EAACD,CAAA,CA/MqB,GAAXA,EAIIQ,UAAY,IAAI+C,2FJiCjB,SAIdC,EAASC,YAAAA,IAAAA,EAAmBzK,GAC5B,IAAM0K,EAAkB,eAEnBC,KAAmBC,MAAA1M,KAAA2M,WAGtB,GAAIpM,EACF,OAAO+L,EAAKM,MAAMjI,KAAM8H,GAE1B,IAAM7K,EACJjD,EAAwB8N,GAAQH,EAAKO,MAAQN,EAAQpK,YAAc,IAErE,GAAIN,EAAcD,GAChB,OAAOoI,QAAQC,QAAQxK,EAAUkC,EAAiBC,KAGpD,GAAIF,EAAaE,GAAS,CACxB,IAAMkL,EAAW3N,OAAO4N,OAAO,CAAE,EAAEjL,EAAgByK,GACnD,OAAW,IAAAvC,QAAQ,SAACC,GAClB,IAAM+C,EAAYC,KAAKC,MACjBC,EAAQC,YAAY,WACpBvL,EAAcD,IAChByL,cAAcF,GACdlD,EAAQxK,EAAUkC,EAAiBC,MAC1BqL,KAAKC,MAAQF,EAAYF,EAAS/K,UAC3CL,EAAaE,IAAU,EACvByL,cAAcF,GACdlD,EAAQxK,EAAUqN,EAAS9K,gBAE/B,EAAG,IACL,EACF,CAGA,OAFAN,EAAaE,IAAU,EAEhB0K,EACJM,MAAMjI,KAAM8H,GACZrC,KAAK,SAACkD,GAGL,OADA7L,EAAMG,GAAU0L,EACT7N,EAAUgC,EAAMG,GACzB,GACM,MAAC,SAAC6I,GACN,MAAMA,CACR,WACS,WACP/I,EAAaE,IAAU,CACzB,EACJ,EAQA,OALAzC,OAAOoO,eAAef,EAAiB,OAAQ,CAC7C/N,MAAuB6N,gBAAAA,EAAKO,KAC5BW,cAAc,IAGThB,CACT,0ECvBM,SAAUiB,EAAavC,GAMP,IAAAwC,WAAAxC,EAAF,CAAA,EAAEA,EAAAyC,EAAAD,EALpBE,IAAWC,EAAAH,EACXrK,SAAAA,OAAQ,IAAAwK,EAAG,GAAEA,EAAAC,EAAAJ,EACb5K,MAAAA,OAAQ,IAAHgL,EAAG,CAAA,EAAEA,EAAAC,EAAAL,EACVM,MAAAA,OAAQ,IAAHD,EAAG,CAAE,EAAAA,EAAAE,EAAAP,EACVQ,OAAAA,OAAS,IAAHD,EAAG,CAAA,EAAEA,EAELE,EAAMvL,SAAS6K,uBANlBE,EAAG,MAAKA,GASXxO,OAAO4N,OAAOoB,EAAKrL,GAGnB,QAAAsL,EAAA,EAAAC,EAA2BlP,OAAO8D,QAAQ+K,GAAMI,EAAAC,EAAAnL,OAAAkL,IAAE,CAA7C,IAAAE,EAAAD,EAAAD,GAAY3P,EAAK6P,EAAA,IACN,IAAV7P,GACF0P,EAAI/K,aAFOkL,EAAE7P,GAESA,EAE1B,CAGA,QAAA8P,EAAA,EAAAC,EAA2BrP,OAAO8D,QAAQiL,GAAOK,EAAAC,EAAAtL,OAAAqL,IAAE,CAA9C,IAAAE,EAAAD,EAAAD,GACHnM,EAAS+L,EADIM,EAAEhQ,GAAKgQ,EAAA,GAEtB,CAIA,IADA,IAC8BC,EAA9BC,2pBAAAC,CADmB3P,MAAMC,QAAQmE,GAAYA,EAAW,CAACA,MAC3BqL,EAAAC,KAAAE,MAAE,CAAA,IAArBnL,EAAKgL,EAAAjQ,MACTiF,IAEgB,iBAAVA,EACLA,aAAiBoL,QACnBX,EAAI3K,YAAYE,GAEhByK,EAAI3K,YAAYiK,EAAc/J,IAGhCyK,EAAI3K,YAAYZ,SAASW,eAAeG,IAE5C,CAEA,OAAOyK,CACT,oBA+DM,SAAoBvP,GACxB,MAAsB,iBAAXA,EACFgF,EAAoBhF,GAEtB8D,EAAmB9D,EAC5B,2BASsC,SAACmQ,GAAW,IAAA,OAAA/E,QAAAC,gCAC5CD,QAAAC,QACqB+E,MAAMD,IAAI3E,KAAA,SAA3B6E,GACN,IAAKA,EAASC,GACZ,MAAU,IAAA/K,MACG8K,WAAAA,EAASE,OAAM,IAAIF,EAASG,YAE1C,OAAApF,QAAAC,QAEuBgF,EAASI,QAAMjF,KAChCxG,EACT,4DAXgDsG,CAAA,WAWvCO,GACP,IAAM6E,EAAe7E,aAAiBtG,MAAQsG,EAAM8E,QAAU,OAC9D,MAAU,IAAApL,MAAsBmL,gBAAAA,EAClC,GACF,CAAC,MAAAvJ,UAAAiE,QAAAW,OAAA5E,+BH3MCuG,EACAkD,GAEA,IAAIzN,EAAgD,KAEpD,OAAmE,WAAA,IAAA0N,EAAA9C,UAC3D+C,EAAU/K,KAGA,OAAZ5C,GACF4N,aAAa5N,GAIfA,EAAUuC,WAAW,WACnBgI,EAAKM,MAAM8C,EAAO,GAAAhD,MAAA1M,KAAAyP,IAClB1N,EAAU,IACZ,EAAGyN,EACL,CACF,kCAmCE/D,EACAmE,QAAAA,IAAAA,IAAAA,EAAgB,GAAC,IACdnD,EAAU,GAAAC,MAAA1M,KAAA2M,UAAA,GAEb,OAAO,IAAI3C,QAAW,SAACC,GACP,IAAV2F,EACF3F,EAAQwB,EAAQmB,aAAIH,IAEpBnI,WAAW,WACT2F,EAAQwB,EAAQmB,WAAIH,EAAAA,GACtB,EAAGmD,EAEP,EACF,iEO5DE,MAA0B,oBAAfnP,WACFA,WAGW,oBAAToP,KACFA,KAGa,oBAAXzJ,OACFA,OAGa,oBAAX0J,OACFA,OAKXnL,IAAA,sGHZM,SAAiCN,GAChCA,IAIwC,SAAzCA,EAAI0L,QAAQC,2BA4BlB,SAA6B3L,GACtBA,GAGLA,EAAIuB,iBAAiB,SAAU,YAfjC,SAAkCvB,EAAkB4L,GAElD5L,EAAI0L,QAAQG,eAAiBD,EAAQ,OAAS,OAChD,CAgBME,CAAyB9L,EAFvBA,EAAIE,UAAYF,EAAI+L,aAAe/L,EAAIG,aAAe,EAO5D,EACF,CAzCI6L,CAAoBhM,GACpBA,EAAI0L,QAAQC,yBAA2B,QAIN,SAA/B3L,EAAI0L,QAAQG,gBACd9L,EAAeC,GAEnB,iCIjBgB,SACdiI,EACAgE,YAAAA,IAAAA,EAAkB,GAElB,IAAMC,EAAoB,WAIxB,GAAIA,EAAkBC,YAEpB,OAAOxG,QAAQC,QAAQ9L,GAEzBoS,EAAkBC,aAAc,EAEhC,IAAMxD,EAAYyD,YAAYvD,MACxBnC,EAASuB,EAAKM,MAAMjI,KAAI+H,GAAAA,MAAA1M,KAAA2M,YAY9B,OAXA5B,EAAM,QAAS,WACb,IAAM2F,EAAWD,YAAYvD,MAAQF,EACjCsD,GAAWA,EAAUI,EACvBpM,WAAW,WACTiM,EAAkBC,aAAc,CAClC,EAAGF,EAAUI,GAEbH,EAAkBC,aAAc,CAEpC,GAEOzF,CACT,EAIA,OAFAwF,EAAkBC,aAAc,EAEzBD,CACT"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/common/type.ts","../src/common/generateStableUniqueKey.ts","../src/common/cloneDeep.ts","../src/common/utils.ts","../node_modules/.pnpm/environment@1.1.0/node_modules/environment/index.js","../src/common/cacheWrapper.ts","../src/browser/dom.ts","../src/browser/scroll.ts","../src/browser/draggable.ts","../src/browser/WebStore.ts","../src/chrome/ChromeStore.ts","../src/common/getGlobal.ts","../src/common/singleExecutionWrapper.ts"],"sourcesContent":["export const RealUndefined = Symbol(\"undefined\");\nexport type RealUndefined = typeof RealUndefined;\n\n/**\n * 异步函数类型。\n *\n * @template Args - 表示函数参数的类型数组。\n * @template T - 表示函数返回的 Promise 解析后的类型。\n *\n * @param args - 函数的参数。\n * @returns 一个 Promise 对象,解析后的值类型为 T。\n */\nexport type AsyncFunction<Args extends any[], T> = (\n this: any,\n ...args: Args\n) => Promise<T>;\n\n/**\n * 表示一个可以克隆自身的对象接口。\n *\n * @interface Cloneable\n */\nexport interface Cloneable {\n /**\n * 创建并返回当前对象的一个副本。\n *\n * @returns {this} 当前对象的一个副本。\n */\n clone(): this;\n}\n\n/**\n *\n * 检查一个对象是否实现了 Cloneable 接口。\n *\n * 这个函数是一个类型保护函数,它会在类型检查时将传入的对象类型缩小为 Cloneable。\n *\n * @param {any} obj - 要检查的对象。\n * @returns {obj is Cloneable} 如果对象实现了 Cloneable 接口,则返回 true;否则返回 false。\n */\nexport function isCloneable(obj: any): obj is Cloneable {\n return typeof obj?.clone === \"function\";\n}\n\n/**\n * 检查一个值是否是原始类型(primitive type)。\n *\n * 这个函数是一个类型保护函数,它会在类型检查时将传入的值类型缩小为原始类型之一:string, number, boolean, null 或 undefined。\n *\n * @param {any} value - 要检查的值。\n * @returns {value is string | number | boolean | null | undefined} 如果值是原始类型,则返回 true;否则返回 false。\n */\nexport function isPrimitive(\n value: any\n): value is string | number | boolean | null | undefined {\n const type = typeof value;\n return (\n value === null ||\n type === \"string\" ||\n type === \"number\" ||\n type === \"boolean\" ||\n type === \"undefined\"\n );\n}\n","import { isPrimitive } from \"./type\";\n\n/**\n * 为给定的参数生成一个稳定且唯一的键。\n *\n * 该函数确保生成的键是确定性的,即相同的输入总是会生成相同的输出。\n * 这在缓存、记忆化或任何需要一致键的场景中非常有用。\n *\n * @param params - 用于生成键的参数。可以是任何类型。\n * @returns 表示输入参数的稳定且唯一的字符串键。\n */\nexport function generateStableUniqueKey(params: any) {\n if (isPrimitive(params)) {\n return String(params);\n }\n return JSON.stringify(params, function (_key: string | number, value: any) {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n return Object.keys(value)\n .sort()\n .reduce((pre: any, cur: string) => {\n pre[cur] = value[cur];\n return pre;\n }, {});\n }\n return value;\n });\n}\n","import { isCloneable } from \"./type\";\n\n/**\n * 深度克隆一个对象或数组。\n *\n * @param {T} obj - 要克隆的对象或数组。\n * @returns {T} 克隆后的对象或数组。\n */\nexport function cloneDeep<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n\n if (isCloneable(obj)) {\n return obj.clone();\n }\n\n // 处理数组\n if (Array.isArray(obj)) {\n return obj.map((item) => cloneDeep(item)) as unknown as T;\n }\n\n const newObj: { [key: string]: any } = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n newObj[key] = cloneDeep(obj[key]);\n }\n }\n return newObj as T;\n}\n","/**\n * 创建一个防抖函数,该函数会在最后一次调用后的指定时间间隔后执行。\n *\n * @param func - 需要防抖处理的函数。\n * @param wait - 延迟的毫秒数。\n * @returns 一个新的防抖函数。\n */\nexport function debounce<T extends (...args: any[]) => void>(\n func: T,\n wait: number\n): T {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n\n return function (this: ThisParameterType<T>, ...args: Parameters<T>) {\n const context = this;\n\n // 如果已经设定了调用,取消之前的调用\n if (timeout !== null) {\n clearTimeout(timeout);\n }\n\n // 设定一个新的调用,等待指定的时间后执行\n timeout = setTimeout(() => {\n func.apply(context, args);\n timeout = null; // 确保能够在下次触发时重新设定定时器\n }, wait);\n } as T;\n}\n\n/**\n * 创建一个节流函数,该函数会在每个指定的时间间隔内最多执行一次。\n *\n * @param func - 需要节流处理的函数。\n * @param delay - 时间间隔的毫秒数。\n * @returns 一个新的节流函数。\n */\n// export function throttle<T extends (...agrs: any[]) => any>(\n// func: T,\n// delay: number\n// ): T {\n// let lastExecutedTime: number = 0;\n\n// return function (this: ThisParameterType<T>, ...args: Parameters<T>) {\n// const context = this;\n// const currentTime = Date.now();\n\n// if (currentTime - lastExecutedTime >= delay) {\n// func.apply(context, args);\n// lastExecutedTime = currentTime;\n// }\n// } as T;\n// }\n\n/**\n * 创建一个延迟执行回调函数并返回 Promise 的函数。\n *\n * @param callback - 需要执行的回调函数。\n * @param delay - 延迟的毫秒数,默认为 0。\n * @param args - 传递给回调函数的参数。\n * @returns 一个 Promise 对象,该对象在回调函数执行后解析。\n */\nexport function delayExecution<T, Args extends any[]>(\n callback: (...args: Args) => T,\n delay: number = 0,\n ...args: Args\n): Promise<T> {\n return new Promise<T>((resolve) => {\n if (delay === 0) {\n resolve(callback(...args));\n } else {\n setTimeout(() => {\n resolve(callback(...args));\n }, delay);\n }\n });\n}\n\n/**\n * 创建一个带有默认值的代理对象。\n * 如果访问的属性不存在,则返回默认值。\n *\n * @param defaultValue - 当属性不存在时返回的默认值。\n * @returns 一个代理对象,未定义的属性将返回默认值。\n */\nexport function createDefaultObject<T>(defaultValue: T): Record<string, T> {\n return new Proxy<Record<string, T>>(\n {},\n {\n get: (target, property: string) => {\n return target.hasOwnProperty(property)\n ? target[property]\n : defaultValue;\n },\n }\n );\n}\n","/* globals WorkerGlobalScope, DedicatedWorkerGlobalScope, SharedWorkerGlobalScope, ServiceWorkerGlobalScope */\n\nexport const isBrowser = globalThis.window?.document !== undefined;\n\nexport const isNode = globalThis.process?.versions?.node !== undefined;\n\nexport const isBun = globalThis.process?.versions?.bun !== undefined;\n\nexport const isDeno = globalThis.Deno?.version?.deno !== undefined;\n\nexport const isElectron = globalThis.process?.versions?.electron !== undefined;\n\nexport const isJsDom = globalThis.navigator?.userAgent?.includes('jsdom') === true;\n\nexport const isWebWorker = typeof WorkerGlobalScope !== 'undefined' && globalThis instanceof WorkerGlobalScope;\n\nexport const isDedicatedWorker = typeof DedicatedWorkerGlobalScope !== 'undefined' && globalThis instanceof DedicatedWorkerGlobalScope;\n\nexport const isSharedWorker = typeof SharedWorkerGlobalScope !== 'undefined' && globalThis instanceof SharedWorkerGlobalScope;\n\nexport const isServiceWorker = typeof ServiceWorkerGlobalScope !== 'undefined' && globalThis instanceof ServiceWorkerGlobalScope;\n\n// Note: I'm intentionally not DRYing up the other variables to keep them \"lazy\".\nconst platform = globalThis.navigator?.userAgentData?.platform;\n\nexport const isMacOs = platform === 'macOS'\n\t|| globalThis.navigator?.platform === 'MacIntel' // Even on Apple silicon Macs.\n\t|| globalThis.navigator?.userAgent?.includes(' Mac ') === true\n\t|| globalThis.process?.platform === 'darwin';\n\nexport const isWindows = platform === 'Windows'\n\t|| globalThis.navigator?.platform === 'Win32'\n\t|| globalThis.process?.platform === 'win32';\n\nexport const isLinux = platform === 'Linux'\n\t|| globalThis.navigator?.platform?.startsWith('Linux') === true\n\t|| globalThis.navigator?.userAgent?.includes(' Linux ') === true\n\t|| globalThis.process?.platform === 'linux';\n\nexport const isIos = platform === 'iOS'\n\t|| (globalThis.navigator?.platform === 'MacIntel' && globalThis.navigator?.maxTouchPoints > 1)\n\t|| /iPad|iPhone|iPod/.test(globalThis.navigator?.platform);\n\nexport const isAndroid = platform === 'Android'\n\t|| globalThis.navigator?.platform === 'Android'\n\t|| globalThis.navigator?.userAgent?.includes(' Android ') === true\n\t|| globalThis.process?.platform === 'android';\n","import { isNode } from \"environment\";\n\nimport { generateStableUniqueKey } from \"./generateStableUniqueKey\";\nimport { cloneDeep } from \"./cloneDeep\";\nimport { createDefaultObject } from \"./utils\";\nimport { AsyncFunction, RealUndefined } from \"./type\";\n\nconst cache: Record<string, any> = createDefaultObject<any>(RealUndefined);\nconst loadingCache = createDefaultObject(false);\nfunction getCachedData<T = any>(apiKey: string) {\n return cache[apiKey] as T;\n}\n\nfunction hasCachedData(apiKey: string) {\n return cache[apiKey] !== RealUndefined;\n}\n\nexport interface Setting {\n timeout?: number;\n timeoutResult?: any;\n identifier?: string;\n}\n\nconst defalutSetting: Setting = {\n timeout: 60000,\n timeoutResult: { code: 408, msg: \"请求超时\" },\n identifier: \"\",\n};\n\n/**\n * 为异步函数添加缓存功能。\n *\n * 该函数根据函数参数、函数名和一个可选的标识符来缓存异步函数的结果。\n * 如果结果已经缓存,则返回缓存的结果。如果函数正在执行中,则等待结果返回,并使用一个超时机制防止无限等待。\n *\n * @template Args - 函数参数的类型。\n * @template Promise<T> - 函数返回值的类型。\n * @param {AsyncFunction<Args, T>} func - 需要包装的异步函数。\n * @param {Setting} [setting=defalutSetting] - 可选的缓存设置。\n * @returns {AsyncFunction<Args, T>} - 带有缓存功能的包装函数,返回类型为 `Promise<T>`。\n */\nexport function cacheWrapper<\n Args extends any[],\n T,\n F extends AsyncFunction<Args, T>\n>(func: F, setting: Setting = defalutSetting) {\n const wrappedFunction = function (\n this: ThisParameterType<F>,\n ...args: Parameters<F>\n ) {\n // 在服务端的时候 不缓存\n if (isNode) {\n return func.apply(this, args);\n }\n const apiKey: string =\n generateStableUniqueKey(args) + func.name + (setting.identifier || \"\"); //缓存key\n\n if (hasCachedData(apiKey)) {\n return Promise.resolve(cloneDeep(getCachedData<T>(apiKey)));\n }\n\n if (loadingCache[apiKey]) {\n const _setting = Object.assign({}, defalutSetting, setting);\n return new Promise((resolve) => {\n const startTime = Date.now();\n const timer = setInterval(() => {\n if (hasCachedData(apiKey)) {\n clearInterval(timer);\n resolve(cloneDeep(getCachedData<T>(apiKey)));\n } else if (Date.now() - startTime > _setting.timeout!) {\n loadingCache[apiKey] = false;\n clearInterval(timer);\n resolve(cloneDeep(_setting.timeoutResult));\n }\n }, 100);\n });\n }\n loadingCache[apiKey] = true;\n\n return func\n .apply(this, args)\n .then((res) => {\n // 缓存原始数据或其克隆,避免数据被释放\n cache[apiKey] = res;\n return cloneDeep(cache[apiKey]);\n })\n .catch((error: any) => {\n throw error;\n })\n .finally(() => {\n loadingCache[apiKey] = false;\n });\n } as F;\n\n // 设置函数名\n Object.defineProperty(wrappedFunction, \"name\", {\n value: `cacheWrapper_${func.name}`,\n configurable: true,\n });\n\n return wrappedFunction;\n}\n","/**\n * 表示 DOM 中可能的子元素类型。\n */\nexport type ChildrenType = DomOptionsType | Element | string | null;\n\n/**\n * 表示创建 DOM 元素的选项类型。\n */\nexport type DomOptionsType = {\n /**\n * 要创建的元素的标签名。默认为 \"div\"。\n */\n tag?: string;\n\n /**\n * 要附加到创建的元素的子元素。可以是单个子元素或子元素数组。\n */\n children?: ChildrenType | ChildrenType[];\n\n /**\n * 要设置在创建的元素上的属性。\n */\n props?: Record<string, any>;\n\n /**\n * 要设置在创建的元素上的属性。\n */\n attrs?: Record<string, string | boolean>;\n\n /**\n * 要应用于创建的元素的样式。\n */\n styles?: Record<string, string | number>;\n};\n\n/**\n * 设置 HTML 元素的样式属性。\n *\n * @param element - 要设置样式的 HTML 元素。\n * @param property - CSS 属性名,可以是驼峰命名法(camelCase)或连字符命名法(kebab-case)。\n * @param value - 要设置的属性值。\n * @param important - 可选参数,布尔值,表示是否将属性设置为 `important` 优先级,默认为 `false`。\n */\nfunction setStyle(\n element: HTMLElement | SVGElement,\n property: string,\n value: string | number,\n important: boolean = false\n): void {\n if (property in element.style) {\n (element.style as any)[property] = value;\n } else {\n const priority = important ? \"important\" : \"\";\n element.style.setProperty(property, String(value), priority);\n }\n}\n\n/**\n * 使用指定选项创建一个 DOM 元素。\n *\n * @param options - 创建 DOM 元素的选项。\n *\n * @returns 创建的 DOM 元素。\n *\n * @remarks\n * 此函数旨在浏览器环境中使用。\n *\n * @example\n * ```typescript\n * const element = createElement({\n * tag: 'button',\n * children: '点击我',\n * attrs: { id: 'myButton' },\n * styles: { color: 'red' }\n * });\n * document.body.appendChild(element);\n * ```\n */\nexport function createElement({\n tag = \"div\",\n children = [],\n props = {},\n attrs = {},\n styles = {},\n}: DomOptionsType = {}): HTMLElement {\n const ele = document.createElement(tag);\n\n // 设置属性\n Object.assign(ele, props);\n\n // 设置属性\n for (const [key, value] of Object.entries(attrs)) {\n if (value !== false) {\n ele.setAttribute(key, value as string);\n }\n }\n\n // 设置样式\n for (const [key, value] of Object.entries(styles)) {\n setStyle(ele, key, value);\n }\n\n // 处理子元素\n const childArray = Array.isArray(children) ? children : [children];\n for (const child of childArray) {\n if (!child) continue;\n\n if (typeof child === \"object\") {\n if (child instanceof Element) {\n ele.appendChild(child);\n } else {\n ele.appendChild(createElement(child as DomOptionsType));\n }\n } else {\n ele.appendChild(document.createTextNode(child));\n }\n }\n\n return ele;\n}\n\ninterface VNode {\n type: string;\n props: Record<string, string> | null;\n children: VNode[] | string | null;\n}\n\n/**\n * 从 VNode 对象创建 SVG 元素。\n *\n * @param {VNode} vnode - 表示 SVG 结构的 VNode 对象。\n * @returns {SVGSVGElement} 创建的 SVG 元素。\n */\nfunction createSvgFromVNode(vnode: VNode): SVGSVGElement {\n const namespace = \"http://www.w3.org/2000/svg\";\n const element = document.createElementNS(namespace, vnode.type);\n\n if (vnode.props) {\n for (const [key, value] of Object.entries(vnode.props)) {\n element.setAttribute(key, value);\n }\n }\n\n if (typeof vnode.children === \"string\") {\n const textNode = document.createTextNode(vnode.children);\n element.appendChild(textNode);\n } else if (Array.isArray(vnode.children)) {\n vnode.children.forEach((child) => {\n const childElement = createSvgFromVNode(child);\n element.appendChild(childElement);\n });\n }\n\n return element as SVGSVGElement;\n}\n\n/**\n * 从 SVG 字符串创建 SVG 元素。\n *\n * @param {string} svgString - 包含 SVG 内容的字符串。\n * @returns {SVGElement} 创建的 SVG 元素。\n * @throws {Error} 如果解析失败或结果不是 SVG 元素。\n */\nfunction createSvgFromString(svgString: string): SVGSVGElement {\n const parser = new DOMParser();\n const doc = parser.parseFromString(svgString, \"image/svg+xml\");\n\n const svgElement = doc.documentElement;\n if (!(svgElement instanceof SVGElement)) {\n throw new Error(\"解析失败,结果不是有效的 SVG 元素\");\n }\n\n return svgElement as SVGElement as SVGSVGElement;\n}\n\n/**\n * 创建 SVG 元素,根据输入参数的类型选择合适的创建方法。\n *\n * @param {VNode | string} params - VNode 对象或 SVG 字符串。\n * @returns {SVGElement} 创建的 SVG 元素。\n * @throws {Error} 如果输入字符串无法解析为有效的 SVG 元素。\n */\nexport function createSvg(params: VNode | string): SVGSVGElement {\n if (typeof params === \"string\") {\n return createSvgFromString(params);\n }\n return createSvgFromVNode(params);\n}\n\n/**\n * 从指定的 URL 加载 SVG 内容并创建 SVG 元素。\n *\n * @param {string} url - 包含 SVG 内容的 URL。\n * @returns {Promise<SVGElement>} Promise,解析为创建的 SVG 元素。\n * @throws {Error} 如果无法获取或解析 SVG 内容。\n */\nexport async function createSvgFromUrl(url: string): Promise<SVGSVGElement> {\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(\n `网络请求失败: ${response.status} ${response.statusText}`\n );\n }\n\n const svgString = await response.text();\n return createSvgFromString(svgString);\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : \"未知错误\";\n throw new Error(`无法创建 SVG 元素: ${errorMessage}`);\n }\n}\n","/**\n * 将指定的 DOM 元素滚动到底部。\n * 使用 setTimeout 确保在当前调用栈之后执行。\n *\n * @param {HTMLElement} dom - 要滚动的 DOM 元素。\n */\nexport function scrollToBottom(dom: HTMLElement) {\n if (dom) {\n setTimeout(() => {\n // 设置滚动条位置为元素的最大滚动高度,滚动到底部\n dom.scrollTop = dom.scrollHeight;\n }, 0);\n }\n}\n\n/**\n * 如果用户未与 DOM 元素交互,则将其滚动到底部。\n * 如果尚未设置事件监听器,则设置一个以跟踪用户滚动交互。\n *\n * @param {HTMLElement} dom - 可能需要滚动的 DOM 元素。\n */\nexport function scrollToBottomIfNeeded(dom: HTMLElement): void {\n if (!dom) {\n return;\n }\n // 检查是否已设置滚动监听器\n if (dom.dataset.isListeningForUserScroll !== \"true\") {\n listenForUserScroll(dom);\n dom.dataset.isListeningForUserScroll = \"true\";\n }\n\n // 如果用户未与滚动条交互,则滚动到底部\n if (dom.dataset.userInteracted !== \"true\") {\n scrollToBottom(dom);\n }\n}\n\n/**\n * 更新用户是否与滚动条交互的状态。\n *\n * @param {HTMLElement} dom - 要更新状态的 DOM 元素。\n * @param {boolean} inter - 用户是否与滚动条交互。\n */\nfunction userInteractedWithScroll(dom: HTMLElement, inter: boolean): void {\n // 根据用户交互状态更新数据属性\n dom.dataset.userInteracted = inter ? \"true\" : \"false\";\n}\n\n/**\n * 为 DOM 元素设置滚动事件监听器。\n * 当用户滚动时,更新交互状态。\n *\n * @param {HTMLElement} dom - 要监听滚动事件的 DOM 元素。\n */\nfunction listenForUserScroll(dom: HTMLElement): void {\n if (!dom) {\n return;\n }\n dom.addEventListener(\"scroll\", () => {\n // 检查用户是否滚动到接近底部\n if (dom.scrollTop + dom.clientHeight < dom.scrollHeight - 5) {\n // 用户已滚动,更新交互状态\n userInteractedWithScroll(dom, true);\n } else {\n // 用户未滚动到接近底部\n userInteractedWithScroll(dom, false);\n }\n });\n}\n","/**\n * 拖拽组件类\n * @class Draggable\n * @description 为DOM元素添加拖拽功能的类,支持拖拽开始、拖拽中、拖拽结束的回调函数\n * @example\n * const element = document.getElementById('draggable');\n * const draggable = new Draggable(element, {\n * onDragStart: (e) => console.log('开始拖拽'),\n * onDrag: (e) => console.log('拖拽中'),\n * onDragEnd: (e) => console.log('结束拖拽'),\n * coordinate: 'tl' // 可选: tl(左上), tr(右上), bl(左下), br(右下)\n * });\n */\n\ninterface DraggableOptions {\n onDragStart?: (event: MouseEvent) => void;\n onDrag?: (event: MouseEvent) => void;\n onDragEnd?: (event: MouseEvent) => void;\n position?: \"absolute\" | \"fixed\";\n coordinate?: \"tl\" | \"tr\" | \"bl\" | \"br\";\n}\n/**\n * 拖拽组件配置选项接口\n * @interface DraggableOptions\n * @property {function} [onDragStart] - 开始拖拽时的回调函数\n * @property {function} [onDrag] - 拖拽过程中的回调函数\n * @property {function} [onDragEnd] - 结束拖拽时的回调函数\n * @property {string} [position] - 定位方式,可选 absolute 或 fixed\n * @property {string} [coordinate] - 坐标原点,可选 tl(左上)、tr(右上)、bl(左下)、br(右下)\n */\n\nexport class Draggable {\n private element: HTMLElement;\n private options: DraggableOptions;\n private isDragging: boolean = false;\n private startX: number = 0;\n private startY: number = 0;\n private initialX: number = 0;\n private initialY: number = 0;\n private threshold: number = 5; // 拖动阈值\n\n private onMouseMoveHandler: (e: MouseEvent) => void;\n private onMouseUpHandler: (e: MouseEvent) => void;\n\n constructor(element: HTMLElement, options: DraggableOptions = {}) {\n this.element = element;\n this.options = {\n coordinate: \"tl\", // 默认使用左上角作为原点\n ...options,\n };\n\n let originPosition = getComputedStyle(this.element).position;\n if (!originPosition || originPosition === \"static\") {\n this.element.style.position = \"absolute\";\n }\n\n if (this.options.position) {\n this.element.style.position = this.options.position;\n }\n\n this.onMouseMoveHandler = this.onMouseMove.bind(this);\n this.onMouseUpHandler = this.onMouseUp.bind(this);\n\n this.element.addEventListener(\"mousedown\", this.onMouseDown.bind(this));\n }\n\n private onMouseDown(e: MouseEvent): void {\n e.preventDefault();\n this.startX = e.clientX;\n this.startY = e.clientY;\n this.initialX =\n parseInt(window.getComputedStyle(this.element).left, 10) || 0;\n this.initialY =\n parseInt(window.getComputedStyle(this.element).top, 10) || 0;\n\n document.addEventListener(\"mousemove\", this.onMouseMoveHandler);\n document.addEventListener(\"mouseup\", this.onMouseUpHandler);\n }\n\n private getBoundedPosition(x: number, y: number): { x: number; y: number } {\n const rect = this.element.getBoundingClientRect();\n const position = getComputedStyle(this.element).position;\n\n let maxX: number;\n let maxY: number;\n\n if (position === \"fixed\") {\n // 对于 fixed 定位,使用视口大小\n maxX = window.innerWidth - rect.width;\n maxY = window.innerHeight - rect.height;\n } else {\n // 对于 absolute 定位,使用父容器大小\n const container =\n (this.element.offsetParent as HTMLElement) || document.documentElement;\n const containerRect = container.getBoundingClientRect();\n maxX = containerRect.width - rect.width;\n maxY = containerRect.height - rect.height;\n }\n\n return {\n x: Math.min(Math.max(0, x), maxX),\n y: Math.min(Math.max(0, y), maxY),\n };\n }\n\n private onMouseMove(e: MouseEvent): void {\n if (!this.isDragging) {\n const dx = e.clientX - this.startX;\n const dy = e.clientY - this.startY;\n if (Math.abs(dx) > this.threshold || Math.abs(dy) > this.threshold) {\n this.isDragging = true;\n if (this.options.onDragStart) {\n this.options.onDragStart(e);\n }\n }\n }\n\n if (this.isDragging) {\n const dx = e.clientX - this.startX;\n const dy = e.clientY - this.startY;\n const newX = this.initialX + dx;\n const newY = this.initialY + dy;\n\n const boundedPosition = this.getBoundedPosition(newX, newY);\n\n this.element.style.right = \"auto\";\n this.element.style.bottom = \"auto\";\n this.element.style.left = boundedPosition.x + \"px\";\n this.element.style.top = boundedPosition.y + \"px\";\n\n if (this.options.onDrag) {\n this.options.onDrag(e);\n }\n }\n }\n\n private convertCoordinate(): void {\n const rect = this.element.getBoundingClientRect();\n const style = getComputedStyle(this.element);\n const position = style.position;\n\n // 获取参考容器\n let container: Element | null = null;\n let containerRect: DOMRect | null = null;\n\n if (position === \"fixed\") {\n // fixed定位相对于视口\n container = null;\n containerRect = new DOMRect(0, 0, window.innerWidth, window.innerHeight);\n } else {\n // 获取定位参考元素\n container = this.element.offsetParent as Element;\n if (!container) {\n container = document.documentElement;\n }\n const containerStyle = getComputedStyle(container);\n if (containerStyle.position === \"static\") {\n // 如果容器是static定位,使用视口作为参考\n container = null;\n containerRect = new DOMRect(\n 0,\n 0,\n window.innerWidth,\n window.innerHeight\n );\n } else {\n containerRect = container.getBoundingClientRect();\n }\n }\n\n if (!containerRect) return;\n\n // 计算当前位置\n let currentLeft: number;\n let currentTop: number;\n\n if (position === \"fixed\") {\n currentLeft = rect.left;\n currentTop = rect.top;\n } else {\n // 对于非fixed定位,需要计算相对位置\n currentLeft = rect.left - containerRect.left;\n currentTop = rect.top - containerRect.top;\n\n if (container instanceof HTMLElement) {\n // 考虑边框\n const containerStyle = getComputedStyle(container);\n const borderLeft = parseFloat(containerStyle.borderLeftWidth) || 0;\n const borderTop = parseFloat(containerStyle.borderTopWidth) || 0;\n currentLeft -= borderLeft;\n currentTop -= borderTop;\n } else {\n currentLeft = currentLeft + window.scrollX;\n currentTop = currentTop + window.scrollY;\n }\n }\n\n // 根据不同的坐标原点设置位置\n switch (this.options.coordinate) {\n case \"tr\":\n const right = containerRect.width - currentLeft - rect.width;\n this.element.style.left = \"auto\";\n this.element.style.right = `${right}px`;\n this.element.style.top = `${currentTop}px`;\n this.element.style.bottom = \"auto\";\n break;\n case \"bl\":\n const bottom = containerRect.height - currentTop - rect.height;\n this.element.style.left = `${currentLeft}px`;\n this.element.style.right = \"auto\";\n this.element.style.top = \"auto\";\n this.element.style.bottom = `${bottom}px`;\n break;\n case \"br\":\n const brRight = containerRect.width - currentLeft - rect.width;\n const brBottom = containerRect.height - currentTop - rect.height;\n this.element.style.left = \"auto\";\n this.element.style.right = `${brRight}px`;\n this.element.style.top = \"auto\";\n this.element.style.bottom = `${brBottom}px`;\n break;\n case \"tl\":\n default:\n this.element.style.left = `${currentLeft}px`;\n this.element.style.right = \"auto\";\n this.element.style.top = `${currentTop}px`;\n this.element.style.bottom = \"auto\";\n }\n }\n\n private onMouseUp(e: MouseEvent): void {\n if (this.isDragging) {\n // 在拖拽结束时转换坐标\n if (this.options.coordinate && this.options.coordinate !== \"tl\") {\n this.convertCoordinate();\n }\n\n if (this.options.onDragEnd) {\n this.options.onDragEnd(e);\n }\n }\n this.isDragging = false;\n document.removeEventListener(\"mousemove\", this.onMouseMoveHandler);\n document.removeEventListener(\"mouseup\", this.onMouseUpHandler);\n }\n}\n","/**\n * 通用的本地存储管理类\n * 提供对 localStorage 和 sessionStorage 的封装操作,支持单例模式\n */\nexport class WebStore<T extends Record<string, any>> {\n private readonly storageKey: string;\n private readonly storeType: \"local\" | \"session\";\n private store?: Storage;\n private static instances = new Map<string, WebStore<any>>();\n\n private constructor(\n storageKey: string,\n storeType: \"local\" | \"session\" = \"local\"\n ) {\n this.storageKey = storageKey;\n this.storeType = storeType;\n }\n\n private static getInstanceKey(\n storageKey: string,\n storeType: \"local\" | \"session\" = \"local\"\n ): string {\n return `${storeType}:${storageKey}`;\n }\n\n /**\n * 获取单例实例\n */\n private static getInstance<T extends Record<string, any>>(\n storageKey: string,\n storeType: \"local\" | \"session\" = \"local\"\n ): WebStore<T> {\n const key = this.getInstanceKey(storageKey, storeType);\n\n if (!this.instances.has(key)) {\n this.instances.set(key, new WebStore<T>(storageKey, storeType));\n }\n\n return this.instances.get(key) as WebStore<T>;\n }\n\n /**\n * 便捷方法:创建本地存储实例\n */\n static local<T extends Record<string, any>>(storageKey: string): WebStore<T> {\n return this.getInstance<T>(storageKey, \"local\");\n }\n\n /**\n * 便捷方法:创建会话存储实例\n */\n static session<T extends Record<string, any>>(\n storageKey: string\n ): WebStore<T> {\n return this.getInstance<T>(storageKey, \"session\");\n }\n\n /**\n * 清理指定实例\n */\n static clearInstance(\n storageKey: string,\n storeType: \"local\" | \"session\" = \"local\"\n ): void {\n const key = this.getInstanceKey(storageKey, storeType);\n this.instances.delete(key);\n }\n\n /**\n * 清理所有实例\n */\n static clearAllInstances(): void {\n this.instances.clear();\n }\n\n private getStore() {\n if (this.store) {\n return this.store;\n }\n this.store = this.storeType === \"local\" ? localStorage : sessionStorage;\n return this.store;\n }\n\n /**\n * 设置数据到 localStorage 或 sessionStorage\n */\n set<K extends keyof T>(prop: K, value: T[K]): void {\n try {\n const currentData = this.getAll();\n const updatedData = { ...currentData, [prop]: value };\n this.getStore().setItem(this.storageKey, JSON.stringify(updatedData));\n } catch (error) {\n console.error(\"WebStore.set 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 获取数据从 localStorage 或 sessionStorage\n */\n get<K extends keyof T>(prop: K): T[K] | undefined {\n try {\n const data = this.getAll();\n return data?.[prop];\n } catch (error) {\n console.error(\"WebStore.get 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 获取所有数据\n */\n getAll(): T {\n try {\n const data = this.getStore().getItem(this.storageKey);\n return data ? JSON.parse(data) : ({} as T);\n } catch (error) {\n console.error(\"WebStore.getAll 失败:\", error);\n return {} as T;\n }\n }\n\n /**\n * 删除指定的数据\n */\n remove<K extends keyof T>(prop: K): void {\n try {\n const currentData = this.getAll();\n if (currentData && prop in currentData) {\n delete currentData[prop];\n this.getStore().setItem(this.storageKey, JSON.stringify(currentData));\n }\n } catch (error) {\n console.error(\"WebStore.remove 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 清空所有数据\n */\n clear(): void {\n try {\n this.getStore().removeItem(this.storageKey);\n } catch (error) {\n console.error(\"WebStore.clear 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 批量设置多个数据\n */\n setMultiple(data: Partial<T>): void {\n try {\n const currentData = this.getAll();\n const updatedData = { ...currentData, ...data };\n this.getStore().setItem(this.storageKey, JSON.stringify(updatedData));\n } catch (error) {\n console.error(\"WebStore.setMultiple 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 监听存储变化\n * 注意:localStorage 和 sessionStorage 没有原生的事件监听,这里使用 storage 事件来模拟\n */\n onChanged(\n callback: (changes: {\n [key: string]: { oldValue?: any; newValue?: any };\n }) => void\n ): void {\n const handleStorageChange = (event: StorageEvent) => {\n if (event.key === this.storageKey && event.storageArea === this.getStore()) {\n const changes = {\n [this.storageKey]: {\n oldValue: event.oldValue ? JSON.parse(event.oldValue) : undefined,\n newValue: event.newValue ? JSON.parse(event.newValue) : undefined,\n },\n };\n callback(changes);\n }\n };\n\n window.addEventListener(\"storage\", handleStorageChange);\n }\n\n /**\n * 检查是否存在指定的数据\n */\n has<K extends keyof T>(prop: K): boolean {\n try {\n const value = this.get(prop);\n return value !== undefined;\n } catch (error) {\n console.error(\"WebStore.has 失败:\", error);\n return false;\n }\n }\n\n /**\n * 获取存储大小(字节数)\n */\n getSize(): number {\n try {\n // const data = this.getAll();\n // const jsonString = JSON.stringify(data);\n const jsonString = this.getStore().getItem(this.storageKey) || \"\";\n return new Blob([jsonString]).size;\n } catch (error) {\n console.error(\"WebStore.getSize 失败:\", error);\n return 0;\n }\n }\n\n /**\n * 获取当前存储键名\n */\n getStoreKey(): string {\n return this.storageKey;\n }\n}\n\n// //demo\n// type AppBridgeData = {\n// CommonParams: {\n// cookie: string;\n// csrfToken: string;\n// userAgent?: string;\n// locale?: string;\n// extId?: string;\n// version?: any;\n// };\n// };\n\n// // 用户登录后可用的数据\n// type UserLocalData = {\n// SubscripVersionChooseName: string; // 选择名称\n// };\n\n// type TWebStore = {\n// app_bridge_data: AppBridgeData;\n// user_local_data: UserLocalData;\n// };\n\n// function getStore<T extends keyof TWebStore>(key: T) {\n// return WebStore.local<TWebStore[T]>(key);\n// }\n\n// // 创建特定类型的存储实例\n// export const AppBridgeStore = getStore(\"app_bridge_data\");\n// export const UserLocalStore = getStore(\"user_local_data\");\n// AppBridgeStore.get(\"CommonParams\");\n// UserLocalStore.get(\"SubscripVersionChooseName\");\n","/**\n * 通用的chrome存储管理类\n * 提供对 chrome.storage.local 和 chrome.storage.sync 的封装操作,支持单例模式\n */\nexport class ChromeStore<T extends Record<string, any>> {\n private readonly storageKey: string;\n private readonly storeType: \"local\" | \"sync\";\n private store?: chrome.storage.StorageArea;\n private static instances = new Map<string, ChromeStore<any>>();\n\n private constructor(\n storageKey: string,\n storeType: \"local\" | \"sync\" = \"local\"\n ) {\n this.storageKey = storageKey;\n this.storeType = storeType;\n }\n\n private static getInstanceKey(\n storageKey: string,\n storeType: \"local\" | \"sync\" = \"local\"\n ): string {\n return `${storeType}:${storageKey}`;\n }\n\n /**\n * 获取单例实例\n */\n private static getInstance<T extends Record<string, any>>(\n storageKey: string,\n storeType: \"local\" | \"sync\" = \"local\"\n ): ChromeStore<T> {\n const key = this.getInstanceKey(storageKey, storeType);\n\n if (!this.instances.has(key)) {\n this.instances.set(key, new ChromeStore<T>(storageKey, storeType));\n }\n\n return this.instances.get(key) as ChromeStore<T>;\n }\n\n /**\n * 便捷方法:创建本地存储实例\n */\n static local<T extends Record<string, any>>(\n storageKey: string\n ): ChromeStore<T> {\n return this.getInstance<T>(storageKey, \"local\");\n }\n\n /**\n * 便捷方法:创建同步存储实例\n */\n static sync<T extends Record<string, any>>(\n storageKey: string\n ): ChromeStore<T> {\n return this.getInstance<T>(storageKey, \"sync\");\n }\n\n /**\n * 清理指定实例\n */\n static clearInstance(\n storageKey: string,\n storeType: \"local\" | \"sync\" = \"local\"\n ): void {\n const key = this.getInstanceKey(storageKey, storeType);\n this.instances.delete(key);\n }\n\n /**\n * 清理所有实例\n */\n static clearAllInstances(): void {\n this.instances.clear();\n }\n\n private getStore() {\n if (this.store) {\n return this.store;\n }\n this.store = chrome.storage[this.storeType];\n return this.store;\n }\n\n /**\n * 设置数据到 chrome.storage.local 或 chrome.storage.sync\n */\n async set<K extends keyof T>(prop: K, value: T[K]): Promise<void> {\n try {\n const currentData = await this.getAll();\n const updatedData = { ...currentData, [prop]: value };\n await this.getStore().set({\n [this.storageKey]: updatedData,\n });\n } catch (error) {\n console.error(\"ChromeStore.set 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 获取数据从 chrome.storage.local 或 chrome.storage.sync\n */\n async get<K extends keyof T>(prop: K): Promise<T[K] | undefined> {\n try {\n const data = await this.getAll();\n return data?.[prop];\n } catch (error) {\n console.error(\"ChromeStore.get 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 获取所有数据从 chrome.storage.local 或 chrome.storage.sync\n */\n async getAll(): Promise<T> {\n try {\n const result = await this.getStore().get(this.storageKey);\n return (result[this.storageKey] as T) || ({} as T);\n } catch (error) {\n console.error(\"ChromeStore.getAll 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 删除指定的数据从 chrome.storage.local 或 chrome.storage.sync\n */\n async remove<K extends keyof T>(prop: K): Promise<void> {\n try {\n const currentData = await this.getAll();\n if (currentData && prop in currentData) {\n delete currentData[prop];\n await this.getStore().set({\n [this.storageKey]: currentData,\n });\n }\n } catch (error) {\n console.error(\"ChromeStore.remove 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 清空所有数据\n */\n async clear(): Promise<void> {\n try {\n await this.getStore().remove(this.storageKey);\n } catch (error) {\n console.error(\"ChromeStore.clear 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 批量设置多个数据\n */\n async setMultiple(data: Partial<T>): Promise<void> {\n try {\n const currentData = await this.getAll();\n const updatedData = { ...currentData, ...data };\n await this.getStore().set({\n [this.storageKey]: updatedData,\n });\n } catch (error) {\n console.error(\"ChromeStore.setMultiple 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 监听存储变化\n */\n onChanged(\n callback: (changes: { [key: string]: chrome.storage.StorageChange }) => void\n ): void {\n chrome.storage.onChanged.addListener((changes, namespace) => {\n if (namespace === this.storeType && changes[this.storageKey]) {\n callback(changes);\n }\n });\n }\n\n /**\n * 检查是否存在指定的数据\n */\n async has<K extends keyof T>(prop: K): Promise<boolean> {\n try {\n const value = await this.get(prop);\n return value !== undefined;\n } catch (error) {\n console.error(\"ChromeStore.has 失败:\", error);\n return false;\n }\n }\n\n /**\n * 获取存储大小(字节数)\n */\n async getSize(): Promise<number> {\n try {\n const data = await this.getAll();\n const jsonString = JSON.stringify(data);\n return new Blob([jsonString]).size;\n } catch (error) {\n console.error(\"ChromeStore.getSize 失败:\", error);\n return 0;\n }\n }\n\n /**\n * 获取当前存储键名\n */\n getStoreKey(): string {\n return this.storageKey;\n }\n}\n\n// // demo\n// type AppData = {\n// InstallTimestamp: number; // 安装时间\n// };\n\n// // 用户登录后可用的数据\n// type UserData = {\n// AddedInstallReward: boolean; // 是否已经添加奖励\n// ResharePostTimes: number; // 转发post次数\n// };\n\n// type TChromeStore = {\n// app_data: AppData;\n// user_data: UserData;\n// };\n\n// function getStore<T extends keyof TChromeStore>(key: T) {\n// return ChromeStore.local<TChromeStore[T]>(key);\n// }\n\n// // 创建特定类型的存储实例\n// export const AppStore = getStore(\"app_data\");\n// export const UserStore = getStore(\"user_data\");\n","declare var global: typeof globalThis;\n\n/**\n * 获取当前环境的全局对象。\n *\n * 在不同的 JavaScript 运行环境中,全局对象的名称不同:\n * - 在浏览器环境中,全局对象是 `window`。\n * - 在 Node.js 环境中,全局对象是 `global`。\n * - 在 Web Worker 环境中,全局对象是 `self`。\n *\n * 这个函数提供了一种统一的方式来获取当前环境的全局对象。\n *\n * @returns 当前环境的全局对象。\n */\nexport function getGlobal(this: any) {\n if (typeof globalThis !== \"undefined\") {\n return globalThis;\n }\n\n if (typeof self !== \"undefined\") {\n return self;\n }\n\n if (typeof window !== \"undefined\") {\n return window;\n }\n\n if (typeof global !== \"undefined\") {\n return global;\n }\n\n // 如果以上都不符合,则返回 this\n return this;\n}\n","import { AsyncFunction, RealUndefined } from \"./type\";\n\n/**\n * 定义一个类型,用于扩展函数类型,增加一个可选的 isExecuting 属性\n */\nexport type SingleExecutionFunction<F extends AsyncFunction<any[], any>> =\n F extends (this: infer This, ...args: infer Args) => Promise<infer R>\n ? ((this: This, ...args: Args) => Promise<R | RealUndefined>) & {\n isExecuting?: boolean;\n }\n : never;\n\n/**\n * 创建一个有执行状态的函数,该函数在前一次调用未完成时不会被再次调用。\n *\n * @param func - 需要包裹的函数。\n * @returns 一个增强版的函数,该函数具有 isExecuting 属性。\n */\nexport function singleExecutionWrapper<T extends AsyncFunction<any[], any>>(\n func: T,\n minTime: number = 0\n) {\n const singleExecutionFn = function (\n this: ThisParameterType<T>,\n ...args: Parameters<T>\n ): ReturnType<T> | Promise<RealUndefined> {\n if (singleExecutionFn.isExecuting) {\n // console.log(`Function(${func.name}) is executing.`);\n return Promise.resolve(RealUndefined);\n }\n singleExecutionFn.isExecuting = true;\n\n const startTime = performance.now();\n const result = func.apply(this, args) as Promise<any>;\n result.finally(() => {\n const loadTime = performance.now() - startTime;\n if (minTime && minTime > loadTime) {\n setTimeout(() => {\n singleExecutionFn.isExecuting = false;\n }, minTime - loadTime);\n } else {\n singleExecutionFn.isExecuting = false;\n }\n });\n\n return result;\n } as SingleExecutionFunction<T>;\n\n singleExecutionFn.isExecuting = false;\n\n return singleExecutionFn as unknown as T & { isExecuting: boolean };\n}\n"],"names":["RealUndefined","Symbol","isCloneable","obj","clone","isPrimitive","value","type","generateStableUniqueKey","params","String","JSON","stringify","_key","Array","isArray","Object","keys","sort","reduce","pre","cur","cloneDeep","map","item","newObj","key","prototype","hasOwnProperty","call","createDefaultObject","defaultValue","Proxy","get","target","property","isNode","undefined","globalThis","process","versions","node","navigator","userAgent","includes","WorkerGlobalScope","DedicatedWorkerGlobalScope","SharedWorkerGlobalScope","ServiceWorkerGlobalScope","platform","userAgentData","startsWith","maxTouchPoints","test","cache","loadingCache","getCachedData","apiKey","hasCachedData","defalutSetting","timeout","timeoutResult","code","msg","identifier","setStyle","element","important","style","priority","setProperty","createSvgFromVNode","vnode","document","createElementNS","props","_i3","_Object$entries3","entries","length","_Object$entries3$_i","setAttribute","children","textNode","createTextNode","appendChild","forEach","child","childElement","createSvgFromString","svgString","svgElement","DOMParser","parseFromString","documentElement","SVGElement","Error","scrollToBottom","dom","setTimeout","scrollTop","scrollHeight","Draggable","options","this","isDragging","startX","startY","initialX","initialY","threshold","onMouseMoveHandler","onMouseUpHandler","_extends","coordinate","originPosition","getComputedStyle","position","onMouseMove","bind","onMouseUp","addEventListener","onMouseDown","_proto","e","preventDefault","clientX","clientY","parseInt","window","left","top","getBoundedPosition","x","y","maxX","maxY","rect","getBoundingClientRect","innerWidth","width","innerHeight","height","containerRect","offsetParent","Math","min","max","dy","abs","onDragStart","boundedPosition","right","bottom","onDrag","convertCoordinate","container","DOMRect","currentLeft","currentTop","HTMLElement","containerStyle","parseFloat","borderLeftWidth","borderTopWidth","scrollX","scrollY","brRight","brBottom","onDragEnd","removeEventListener","WebStore","storageKey","storeType","store","getInstanceKey","getInstance","instances","has","set","local","session","clearInstance","clearAllInstances","clear","getStore","localStorage","sessionStorage","prop","_extends2","updatedData","currentData","getAll","setItem","error","console","data","getItem","parse","remove","removeItem","setMultiple","onChanged","callback","_this","event","storageArea","_changes","changes","oldValue","newValue","getSize","jsonString","Blob","size","getStoreKey","Map","ChromeStore","sync","chrome","storage","Promise","resolve","_catch","then","_this$getStore$set","reject","_this2","_this3","result","_this4","_temp","_this4$getStore$set","_this5","_this6","_this6$getStore$set","_this7","addListener","namespace","_this8","_this9","func","setting","wrappedFunction","args","slice","arguments","apply","name","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","res","defineProperty","configurable","createElement","_ref","_ref$tag","tag","_ref$children","_ref$props","_ref$attrs","attrs","_ref$styles","styles","ele","_i","_Object$entries","_Object$entries$_i","_i2","_Object$entries2","_Object$entries2$_i","_step","_iterator","_createForOfIteratorHelperLoose","done","Element","url","fetch","response","ok","status","statusText","text","errorMessage","message","wait","_arguments","context","clearTimeout","delay","self","global","dataset","isListeningForUserScroll","inter","userInteracted","userInteractedWithScroll","clientHeight","listenForUserScroll","minTime","singleExecutionFn","isExecuting","performance","loadTime"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const t=Symbol("undefined");function e(t){return"function"==typeof(null==t?void 0:t.clone)}function n(t){const e=typeof t;return null===t||"string"===e||"number"===e||"boolean"===e||"undefined"===e}function o(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this}function i(t){return n(t)?String(t):JSON.stringify(t,function(t,e){return"object"!=typeof e||null===e||Array.isArray(e)?e:Object.keys(e).sort().reduce((t,n)=>(t[n]=e[n],t),{})})}function s(t){if(null===t||"object"!=typeof t)return t;if(e(t))return t.clone();if(Array.isArray(t))return t.map(t=>s(t));const n={};for(const e in t)Object.prototype.hasOwnProperty.call(t,e)&&(n[e]=s(t[e]));return n}function r(t,e){let n=null;return function(...o){const i=this;null!==n&&clearTimeout(n),n=setTimeout(()=>{t.apply(i,o),n=null},e)}}function l(t,e=0,...n){return new Promise(o=>{0===e?o(t(...n)):setTimeout(()=>{o(t(...n))},e)})}function a(t){return new Proxy({},{get:(e,n)=>e.hasOwnProperty(n)?e[n]:t})}const c=void 0!==globalThis.process?.versions?.node;globalThis.navigator?.userAgent?.includes("jsdom"),"undefined"!=typeof WorkerGlobalScope&&(globalThis,WorkerGlobalScope),"undefined"!=typeof DedicatedWorkerGlobalScope&&(globalThis,DedicatedWorkerGlobalScope),"undefined"!=typeof SharedWorkerGlobalScope&&(globalThis,SharedWorkerGlobalScope),"undefined"!=typeof ServiceWorkerGlobalScope&&(globalThis,ServiceWorkerGlobalScope);const h=globalThis.navigator?.userAgentData?.platform;"macOS"===h||"MacIntel"===globalThis.navigator?.platform||!0===globalThis.navigator?.userAgent?.includes(" Mac ")||globalThis,"Linux"===h||!0===globalThis.navigator?.platform?.startsWith("Linux")||!0===globalThis.navigator?.userAgent?.includes(" Linux ")||globalThis,"iOS"===h||"MacIntel"===globalThis.navigator?.platform&&globalThis.navigator?.maxTouchPoints>1||/iPad|iPhone|iPod/.test(globalThis.navigator?.platform),"Android"===h||"Android"===globalThis.navigator?.platform||!0===globalThis.navigator?.userAgent?.includes(" Android ")||globalThis;const u=a(t),d=a(!1);function g(t){return u[t]}function p(e){return u[e]!==t}const m={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};function f(t,e=m){const n=function(...n){if(c)return t.apply(this,n);const o=i(n)+t.name+(e.identifier||"");if(p(o))return Promise.resolve(s(g(o)));if(d[o]){const t=Object.assign({},m,e);return new Promise(e=>{const n=Date.now(),i=setInterval(()=>{p(o)?(clearInterval(i),e(s(g(o)))):Date.now()-n>t.timeout&&(d[o]=!1,clearInterval(i),e(s(t.timeoutResult)))},100)})}return d[o]=!0,t.apply(this,n).then(t=>(u[o]=t,s(u[o]))).catch(t=>{throw t}).finally(()=>{d[o]=!1})};return Object.defineProperty(n,"name",{value:`cacheWrapper_${t.name}`,configurable:!0}),n}function y(e,n=0){const o=function o(...i){if(o.isExecuting)return Promise.resolve(t);o.isExecuting=!0;const s=performance.now(),r=e.apply(this,i);return r.finally(()=>{const t=performance.now()-s;n&&n>t?setTimeout(()=>{o.isExecuting=!1},n-t):o.isExecuting=!1}),r};return o.isExecuting=!1,o}function w(t,e,n,o=!1){if(e in t.style)t.style[e]=n;else{const i=o?"important":"";t.style.setProperty(e,String(n),i)}}function b({tag:t="div",children:e=[],props:n={},attrs:o={},styles:i={}}={}){const s=document.createElement(t);Object.assign(s,n);for(const[t,e]of Object.entries(o))!1!==e&&s.setAttribute(t,e);for(const[t,e]of Object.entries(i))w(s,t,e);const r=Array.isArray(e)?e:[e];for(const t of r)t&&("object"==typeof t?t instanceof Element?s.appendChild(t):s.appendChild(b(t)):s.appendChild(document.createTextNode(t)));return s}function v(t){const e=document.createElementNS("http://www.w3.org/2000/svg",t.type);if(t.props)for(const[n,o]of Object.entries(t.props))e.setAttribute(n,o);if("string"==typeof t.children){const n=document.createTextNode(t.children);e.appendChild(n)}else Array.isArray(t.children)&&t.children.forEach(t=>{const n=v(t);e.appendChild(n)});return e}function S(t){const e=(new DOMParser).parseFromString(t,"image/svg+xml").documentElement;if(!(e instanceof SVGElement))throw new Error("解析失败,结果不是有效的 SVG 元素");return e}function T(t){return"string"==typeof t?S(t):v(t)}async function M(t){try{const e=await fetch(t);if(!e.ok)throw new Error(`网络请求失败: ${e.status} ${e.statusText}`);return S(await e.text())}catch(t){const e=t instanceof Error?t.message:"未知错误";throw new Error(`无法创建 SVG 元素: ${e}`)}}function x(t){t&&setTimeout(()=>{t.scrollTop=t.scrollHeight},0)}function C(t){t&&("true"!==t.dataset.isListeningForUserScroll&&(function(t){t&&t.addEventListener("scroll",()=>{!function(t,e){t.dataset.userInteracted=e?"true":"false"}(t,t.scrollTop+t.clientHeight<t.scrollHeight-5)})}(t),t.dataset.isListeningForUserScroll="true"),"true"!==t.dataset.userInteracted&&x(t))}function A(){return A=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var o in n)({}).hasOwnProperty.call(n,o)&&(t[o]=n[o])}return t},A.apply(null,arguments)}class E{constructor(t,e={}){this.element=void 0,this.options=void 0,this.isDragging=!1,this.startX=0,this.startY=0,this.initialX=0,this.initialY=0,this.threshold=5,this.onMouseMoveHandler=void 0,this.onMouseUpHandler=void 0,this.element=t,this.options=A({coordinate:"tl"},e);let n=getComputedStyle(this.element).position;n&&"static"!==n||(this.element.style.position="absolute"),this.options.position&&(this.element.style.position=this.options.position),this.onMouseMoveHandler=this.onMouseMove.bind(this),this.onMouseUpHandler=this.onMouseUp.bind(this),this.element.addEventListener("mousedown",this.onMouseDown.bind(this))}onMouseDown(t){t.preventDefault(),this.startX=t.clientX,this.startY=t.clientY,this.initialX=parseInt(window.getComputedStyle(this.element).left,10)||0,this.initialY=parseInt(window.getComputedStyle(this.element).top,10)||0,document.addEventListener("mousemove",this.onMouseMoveHandler),document.addEventListener("mouseup",this.onMouseUpHandler)}getBoundedPosition(t,e){const n=this.element.getBoundingClientRect();let o,i;if("fixed"===getComputedStyle(this.element).position)o=window.innerWidth-n.width,i=window.innerHeight-n.height;else{const t=(this.element.offsetParent||document.documentElement).getBoundingClientRect();o=t.width-n.width,i=t.height-n.height}return{x:Math.min(Math.max(0,t),o),y:Math.min(Math.max(0,e),i)}}onMouseMove(t){if(!this.isDragging){const e=t.clientY-this.startY;(Math.abs(t.clientX-this.startX)>this.threshold||Math.abs(e)>this.threshold)&&(this.isDragging=!0,this.options.onDragStart&&this.options.onDragStart(t))}if(this.isDragging){const e=this.getBoundedPosition(this.initialX+(t.clientX-this.startX),this.initialY+(t.clientY-this.startY));this.element.style.right="auto",this.element.style.bottom="auto",this.element.style.left=e.x+"px",this.element.style.top=e.y+"px",this.options.onDrag&&this.options.onDrag(t)}}convertCoordinate(){const t=this.element.getBoundingClientRect(),e=getComputedStyle(this.element).position;let n,o,i=null,s=null;if("fixed"===e?(i=null,s=new DOMRect(0,0,window.innerWidth,window.innerHeight)):(i=this.element.offsetParent,i||(i=document.documentElement),"static"===getComputedStyle(i).position?(i=null,s=new DOMRect(0,0,window.innerWidth,window.innerHeight)):s=i.getBoundingClientRect()),s){if("fixed"===e)n=t.left,o=t.top;else if(n=t.left-s.left,o=t.top-s.top,i instanceof HTMLElement){const t=getComputedStyle(i);n-=parseFloat(t.borderLeftWidth)||0,o-=parseFloat(t.borderTopWidth)||0}else n+=window.scrollX,o+=window.scrollY;switch(this.options.coordinate){case"tr":const e=s.width-n-t.width;this.element.style.left="auto",this.element.style.right=`${e}px`,this.element.style.top=`${o}px`,this.element.style.bottom="auto";break;case"bl":const i=s.height-o-t.height;this.element.style.left=`${n}px`,this.element.style.right="auto",this.element.style.top="auto",this.element.style.bottom=`${i}px`;break;case"br":const r=s.width-n-t.width,l=s.height-o-t.height;this.element.style.left="auto",this.element.style.right=`${r}px`,this.element.style.top="auto",this.element.style.bottom=`${l}px`;break;default:this.element.style.left=`${n}px`,this.element.style.right="auto",this.element.style.top=`${o}px`,this.element.style.bottom="auto"}}}onMouseUp(t){this.isDragging&&(this.options.coordinate&&"tl"!==this.options.coordinate&&this.convertCoordinate(),this.options.onDragEnd&&this.options.onDragEnd(t)),this.isDragging=!1,document.removeEventListener("mousemove",this.onMouseMoveHandler),document.removeEventListener("mouseup",this.onMouseUpHandler)}}class D{constructor(t,e="local"){this.storageKey=void 0,this.storeType=void 0,this.store=void 0,this.storageKey=t,this.storeType=e,this.store=chrome.storage[e]}static getInstanceKey(t,e="local"){return`${e}:${t}`}static getInstance(t,e="local"){const n=this.getInstanceKey(t,e);return this.instances.has(n)||this.instances.set(n,new D(t,e)),this.instances.get(n)}static local(t){return this.getInstance(t,"local")}static sync(t){return this.getInstance(t,"sync")}static clearInstance(t,e="local"){const n=this.getInstanceKey(t,e);this.instances.delete(n)}static clearAllInstances(){this.instances.clear()}async set(t,e){try{const n=A({},await this.getAll(),{[t]:e});await this.store.set({[this.storageKey]:n})}catch(t){throw console.error("ChromeStore.set 失败:",t),t}}async get(t){try{const e=await this.getAll();return null==e?void 0:e[t]}catch(t){throw console.error("ChromeStore.get 失败:",t),t}}async getAll(){try{return(await this.store.get(this.storageKey))[this.storageKey]||{}}catch(t){throw console.error("ChromeStore.getAll 失败:",t),t}}async remove(t){try{const e=await this.getAll();e&&t in e&&(delete e[t],await this.store.set({[this.storageKey]:e}))}catch(t){throw console.error("ChromeStore.remove 失败:",t),t}}async clear(){try{await this.store.remove(this.storageKey)}catch(t){throw console.error("ChromeStore.clear 失败:",t),t}}async setMultiple(t){try{const e=A({},await this.getAll(),t);await this.store.set({[this.storageKey]:e})}catch(t){throw console.error("ChromeStore.setMultiple 失败:",t),t}}onChanged(t){chrome.storage.onChanged.addListener((e,n)=>{n===this.storeType&&e[this.storageKey]&&t(e)})}async has(t){try{return void 0!==await this.get(t)}catch(t){return console.error("ChromeStore.has 失败:",t),!1}}async getSize(){try{const t=await this.getAll(),e=JSON.stringify(t);return new Blob([e]).size}catch(t){return console.error("ChromeStore.getSize 失败:",t),0}}getStoreKey(){return this.storageKey}}D.instances=new Map;export{D as ChromeStore,E as Draggable,t as RealUndefined,f as cacheWrapper,s as cloneDeep,a as createDefaultObject,b as createElement,T as createSvg,M as createSvgFromUrl,r as debounce,l as delayExecution,i as generateStableUniqueKey,o as getGlobal,e as isCloneable,n as isPrimitive,x as scrollToBottom,C as scrollToBottomIfNeeded,y as singleExecutionWrapper};
1
+ const t=Symbol("undefined");function e(t){return"function"==typeof(null==t?void 0:t.clone)}function o(t){const e=typeof t;return null===t||"string"===e||"number"===e||"boolean"===e||"undefined"===e}function s(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this}function n(t){return o(t)?String(t):JSON.stringify(t,function(t,e){return"object"!=typeof e||null===e||Array.isArray(e)?e:Object.keys(e).sort().reduce((t,o)=>(t[o]=e[o],t),{})})}function i(t){if(null===t||"object"!=typeof t)return t;if(e(t))return t.clone();if(Array.isArray(t))return t.map(t=>i(t));const o={};for(const e in t)Object.prototype.hasOwnProperty.call(t,e)&&(o[e]=i(t[e]));return o}function r(t,e){let o=null;return function(...s){const n=this;null!==o&&clearTimeout(o),o=setTimeout(()=>{t.apply(n,s),o=null},e)}}function a(t,e=0,...o){return new Promise(s=>{0===e?s(t(...o)):setTimeout(()=>{s(t(...o))},e)})}function l(t){return new Proxy({},{get:(e,o)=>e.hasOwnProperty(o)?e[o]:t})}const c=void 0!==globalThis.process?.versions?.node;globalThis.navigator?.userAgent?.includes("jsdom"),"undefined"!=typeof WorkerGlobalScope&&(globalThis,WorkerGlobalScope),"undefined"!=typeof DedicatedWorkerGlobalScope&&(globalThis,DedicatedWorkerGlobalScope),"undefined"!=typeof SharedWorkerGlobalScope&&(globalThis,SharedWorkerGlobalScope),"undefined"!=typeof ServiceWorkerGlobalScope&&(globalThis,ServiceWorkerGlobalScope);const h=globalThis.navigator?.userAgentData?.platform;"macOS"===h||"MacIntel"===globalThis.navigator?.platform||!0===globalThis.navigator?.userAgent?.includes(" Mac ")||globalThis,"Linux"===h||!0===globalThis.navigator?.platform?.startsWith("Linux")||!0===globalThis.navigator?.userAgent?.includes(" Linux ")||globalThis,"iOS"===h||"MacIntel"===globalThis.navigator?.platform&&globalThis.navigator?.maxTouchPoints>1||/iPad|iPhone|iPod/.test(globalThis.navigator?.platform),"Android"===h||"Android"===globalThis.navigator?.platform||!0===globalThis.navigator?.userAgent?.includes(" Android ")||globalThis;const u=l(t),g=l(!1);function d(t){return u[t]}function p(e){return u[e]!==t}const y={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};function m(t,e=y){const o=function(...o){if(c)return t.apply(this,o);const s=n(o)+t.name+(e.identifier||"");if(p(s))return Promise.resolve(i(d(s)));if(g[s]){const t=Object.assign({},y,e);return new Promise(e=>{const o=Date.now(),n=setInterval(()=>{p(s)?(clearInterval(n),e(i(d(s)))):Date.now()-o>t.timeout&&(g[s]=!1,clearInterval(n),e(i(t.timeoutResult)))},100)})}return g[s]=!0,t.apply(this,o).then(t=>(u[s]=t,i(u[s]))).catch(t=>{throw t}).finally(()=>{g[s]=!1})};return Object.defineProperty(o,"name",{value:`cacheWrapper_${t.name}`,configurable:!0}),o}function f(e,o=0){const s=function s(...n){if(s.isExecuting)return Promise.resolve(t);s.isExecuting=!0;const i=performance.now(),r=e.apply(this,n);return r.finally(()=>{const t=performance.now()-i;o&&o>t?setTimeout(()=>{s.isExecuting=!1},o-t):s.isExecuting=!1}),r};return s.isExecuting=!1,s}function w(t,e,o,s=!1){if(e in t.style)t.style[e]=o;else{const n=s?"important":"";t.style.setProperty(e,String(o),n)}}function b({tag:t="div",children:e=[],props:o={},attrs:s={},styles:n={}}={}){const i=document.createElement(t);Object.assign(i,o);for(const[t,e]of Object.entries(s))!1!==e&&i.setAttribute(t,e);for(const[t,e]of Object.entries(n))w(i,t,e);const r=Array.isArray(e)?e:[e];for(const t of r)t&&("object"==typeof t?t instanceof Element?i.appendChild(t):i.appendChild(b(t)):i.appendChild(document.createTextNode(t)));return i}function S(t){const e=document.createElementNS("http://www.w3.org/2000/svg",t.type);if(t.props)for(const[o,s]of Object.entries(t.props))e.setAttribute(o,s);if("string"==typeof t.children){const o=document.createTextNode(t.children);e.appendChild(o)}else Array.isArray(t.children)&&t.children.forEach(t=>{const o=S(t);e.appendChild(o)});return e}function v(t){const e=(new DOMParser).parseFromString(t,"image/svg+xml").documentElement;if(!(e instanceof SVGElement))throw new Error("解析失败,结果不是有效的 SVG 元素");return e}function T(t){return"string"==typeof t?v(t):S(t)}async function M(t){try{const e=await fetch(t);if(!e.ok)throw new Error(`网络请求失败: ${e.status} ${e.statusText}`);return v(await e.text())}catch(t){const e=t instanceof Error?t.message:"未知错误";throw new Error(`无法创建 SVG 元素: ${e}`)}}function A(t){t&&setTimeout(()=>{t.scrollTop=t.scrollHeight},0)}function x(t){t&&("true"!==t.dataset.isListeningForUserScroll&&(function(t){t&&t.addEventListener("scroll",()=>{!function(t,e){t.dataset.userInteracted=e?"true":"false"}(t,t.scrollTop+t.clientHeight<t.scrollHeight-5)})}(t),t.dataset.isListeningForUserScroll="true"),"true"!==t.dataset.userInteracted&&A(t))}function I(){return I=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var o=arguments[e];for(var s in o)({}).hasOwnProperty.call(o,s)&&(t[s]=o[s])}return t},I.apply(null,arguments)}class C{constructor(t,e={}){this.element=void 0,this.options=void 0,this.isDragging=!1,this.startX=0,this.startY=0,this.initialX=0,this.initialY=0,this.threshold=5,this.onMouseMoveHandler=void 0,this.onMouseUpHandler=void 0,this.element=t,this.options=I({coordinate:"tl"},e);let o=getComputedStyle(this.element).position;o&&"static"!==o||(this.element.style.position="absolute"),this.options.position&&(this.element.style.position=this.options.position),this.onMouseMoveHandler=this.onMouseMove.bind(this),this.onMouseUpHandler=this.onMouseUp.bind(this),this.element.addEventListener("mousedown",this.onMouseDown.bind(this))}onMouseDown(t){t.preventDefault(),this.startX=t.clientX,this.startY=t.clientY,this.initialX=parseInt(window.getComputedStyle(this.element).left,10)||0,this.initialY=parseInt(window.getComputedStyle(this.element).top,10)||0,document.addEventListener("mousemove",this.onMouseMoveHandler),document.addEventListener("mouseup",this.onMouseUpHandler)}getBoundedPosition(t,e){const o=this.element.getBoundingClientRect();let s,n;if("fixed"===getComputedStyle(this.element).position)s=window.innerWidth-o.width,n=window.innerHeight-o.height;else{const t=(this.element.offsetParent||document.documentElement).getBoundingClientRect();s=t.width-o.width,n=t.height-o.height}return{x:Math.min(Math.max(0,t),s),y:Math.min(Math.max(0,e),n)}}onMouseMove(t){if(!this.isDragging){const e=t.clientY-this.startY;(Math.abs(t.clientX-this.startX)>this.threshold||Math.abs(e)>this.threshold)&&(this.isDragging=!0,this.options.onDragStart&&this.options.onDragStart(t))}if(this.isDragging){const e=this.getBoundedPosition(this.initialX+(t.clientX-this.startX),this.initialY+(t.clientY-this.startY));this.element.style.right="auto",this.element.style.bottom="auto",this.element.style.left=e.x+"px",this.element.style.top=e.y+"px",this.options.onDrag&&this.options.onDrag(t)}}convertCoordinate(){const t=this.element.getBoundingClientRect(),e=getComputedStyle(this.element).position;let o,s,n=null,i=null;if("fixed"===e?(n=null,i=new DOMRect(0,0,window.innerWidth,window.innerHeight)):(n=this.element.offsetParent,n||(n=document.documentElement),"static"===getComputedStyle(n).position?(n=null,i=new DOMRect(0,0,window.innerWidth,window.innerHeight)):i=n.getBoundingClientRect()),i){if("fixed"===e)o=t.left,s=t.top;else if(o=t.left-i.left,s=t.top-i.top,n instanceof HTMLElement){const t=getComputedStyle(n);o-=parseFloat(t.borderLeftWidth)||0,s-=parseFloat(t.borderTopWidth)||0}else o+=window.scrollX,s+=window.scrollY;switch(this.options.coordinate){case"tr":const e=i.width-o-t.width;this.element.style.left="auto",this.element.style.right=`${e}px`,this.element.style.top=`${s}px`,this.element.style.bottom="auto";break;case"bl":const n=i.height-s-t.height;this.element.style.left=`${o}px`,this.element.style.right="auto",this.element.style.top="auto",this.element.style.bottom=`${n}px`;break;case"br":const r=i.width-o-t.width,a=i.height-s-t.height;this.element.style.left="auto",this.element.style.right=`${r}px`,this.element.style.top="auto",this.element.style.bottom=`${a}px`;break;default:this.element.style.left=`${o}px`,this.element.style.right="auto",this.element.style.top=`${s}px`,this.element.style.bottom="auto"}}}onMouseUp(t){this.isDragging&&(this.options.coordinate&&"tl"!==this.options.coordinate&&this.convertCoordinate(),this.options.onDragEnd&&this.options.onDragEnd(t)),this.isDragging=!1,document.removeEventListener("mousemove",this.onMouseMoveHandler),document.removeEventListener("mouseup",this.onMouseUpHandler)}}class K{constructor(t,e="local"){this.storageKey=void 0,this.storeType=void 0,this.store=void 0,this.storageKey=t,this.storeType=e}static getInstanceKey(t,e="local"){return`${e}:${t}`}static getInstance(t,e="local"){const o=this.getInstanceKey(t,e);return this.instances.has(o)||this.instances.set(o,new K(t,e)),this.instances.get(o)}static local(t){return this.getInstance(t,"local")}static session(t){return this.getInstance(t,"session")}static clearInstance(t,e="local"){const o=this.getInstanceKey(t,e);this.instances.delete(o)}static clearAllInstances(){this.instances.clear()}getStore(){return this.store||(this.store="local"===this.storeType?localStorage:sessionStorage),this.store}set(t,e){try{const o=I({},this.getAll(),{[t]:e});this.getStore().setItem(this.storageKey,JSON.stringify(o))}catch(t){throw console.error("WebStore.set 失败:",t),t}}get(t){try{const e=this.getAll();return null==e?void 0:e[t]}catch(t){throw console.error("WebStore.get 失败:",t),t}}getAll(){try{const t=this.getStore().getItem(this.storageKey);return t?JSON.parse(t):{}}catch(t){return console.error("WebStore.getAll 失败:",t),{}}}remove(t){try{const e=this.getAll();e&&t in e&&(delete e[t],this.getStore().setItem(this.storageKey,JSON.stringify(e)))}catch(t){throw console.error("WebStore.remove 失败:",t),t}}clear(){try{this.getStore().removeItem(this.storageKey)}catch(t){throw console.error("WebStore.clear 失败:",t),t}}setMultiple(t){try{const e=I({},this.getAll(),t);this.getStore().setItem(this.storageKey,JSON.stringify(e))}catch(t){throw console.error("WebStore.setMultiple 失败:",t),t}}onChanged(t){window.addEventListener("storage",e=>{if(e.key===this.storageKey&&e.storageArea===this.getStore()){const o={[this.storageKey]:{oldValue:e.oldValue?JSON.parse(e.oldValue):void 0,newValue:e.newValue?JSON.parse(e.newValue):void 0}};t(o)}})}has(t){try{return void 0!==this.get(t)}catch(t){return console.error("WebStore.has 失败:",t),!1}}getSize(){try{const t=this.getStore().getItem(this.storageKey)||"";return new Blob([t]).size}catch(t){return console.error("WebStore.getSize 失败:",t),0}}getStoreKey(){return this.storageKey}}K.instances=new Map;class E{constructor(t,e="local"){this.storageKey=void 0,this.storeType=void 0,this.store=void 0,this.storageKey=t,this.storeType=e}static getInstanceKey(t,e="local"){return`${e}:${t}`}static getInstance(t,e="local"){const o=this.getInstanceKey(t,e);return this.instances.has(o)||this.instances.set(o,new E(t,e)),this.instances.get(o)}static local(t){return this.getInstance(t,"local")}static sync(t){return this.getInstance(t,"sync")}static clearInstance(t,e="local"){const o=this.getInstanceKey(t,e);this.instances.delete(o)}static clearAllInstances(){this.instances.clear()}getStore(){return this.store||(this.store=chrome.storage[this.storeType]),this.store}async set(t,e){try{const o=I({},await this.getAll(),{[t]:e});await this.getStore().set({[this.storageKey]:o})}catch(t){throw console.error("ChromeStore.set 失败:",t),t}}async get(t){try{const e=await this.getAll();return null==e?void 0:e[t]}catch(t){throw console.error("ChromeStore.get 失败:",t),t}}async getAll(){try{return(await this.getStore().get(this.storageKey))[this.storageKey]||{}}catch(t){throw console.error("ChromeStore.getAll 失败:",t),t}}async remove(t){try{const e=await this.getAll();e&&t in e&&(delete e[t],await this.getStore().set({[this.storageKey]:e}))}catch(t){throw console.error("ChromeStore.remove 失败:",t),t}}async clear(){try{await this.getStore().remove(this.storageKey)}catch(t){throw console.error("ChromeStore.clear 失败:",t),t}}async setMultiple(t){try{const e=I({},await this.getAll(),t);await this.getStore().set({[this.storageKey]:e})}catch(t){throw console.error("ChromeStore.setMultiple 失败:",t),t}}onChanged(t){chrome.storage.onChanged.addListener((e,o)=>{o===this.storeType&&e[this.storageKey]&&t(e)})}async has(t){try{return void 0!==await this.get(t)}catch(t){return console.error("ChromeStore.has 失败:",t),!1}}async getSize(){try{const t=await this.getAll(),e=JSON.stringify(t);return new Blob([e]).size}catch(t){return console.error("ChromeStore.getSize 失败:",t),0}}getStoreKey(){return this.storageKey}}E.instances=new Map;export{E as ChromeStore,C as Draggable,t as RealUndefined,K as WebStore,m as cacheWrapper,i as cloneDeep,l as createDefaultObject,b as createElement,T as createSvg,M as createSvgFromUrl,r as debounce,a as delayExecution,n as generateStableUniqueKey,s as getGlobal,e as isCloneable,o as isPrimitive,A as scrollToBottom,x as scrollToBottomIfNeeded,f as singleExecutionWrapper};
2
2
  //# sourceMappingURL=index.modern.js.map