@i.un/libs 0.0.36 → 0.0.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.modern.js +1 -1
- package/dist/index.modern.js.map +1 -1
- package/dist/index.module.js +1 -1
- package/dist/index.module.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var t=Symbol("undefined");function e(t){return"function"==typeof(null==t?void 0:t.clone)}function n(t){var e=typeof t;return null===t||"string"===e||"number"===e||"boolean"===e||"undefined"===e}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(function(t,n){return t[n]=e[n],t},{})})}function
|
|
1
|
+
var t=Symbol("undefined");function e(t){return"function"==typeof(null==t?void 0:t.clone)}function n(t){var e=typeof t;return null===t||"string"===e||"number"===e||"boolean"===e||"undefined"===e}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(function(t,n){return t[n]=e[n],t},{})})}function o(t){if(null===t||"object"!=typeof t)return t;if(e(t))return t.clone();if(Array.isArray(t))return t.map(function(t){return o(t)});var n={};for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(n[i]=o(t[i]));return n}function r(t){return new Proxy({},{get:function(e,n){return e.hasOwnProperty(n)?e[n]:t}})}var s=r(t),l=r(!1);function a(t){return s[t]}function u(e){return s[e]!==t}var c={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};function h(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=Array(e);n<e;n++)i[n]=t[n];return i}function d(){return d=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)({}).hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t},d.apply(null,arguments)}function f(t,e,n,i){if(void 0===i&&(i=!1),e in t.style)t.style[e]=n;else{var o=i?"important":"";t.style.setProperty(e,String(n),o)}}function p(t){var e=document.createElementNS("http://www.w3.org/2000/svg",t.type);if(t.props)for(var n=0,i=Object.entries(t.props);n<i.length;n++){var o=i[n];e.setAttribute(o[0],o[1])}if("string"==typeof t.children){var r=document.createTextNode(t.children);e.appendChild(r)}else Array.isArray(t.children)&&t.children.forEach(function(t){var n=p(t);e.appendChild(n)});return e}function m(t){var e=(new DOMParser).parseFromString(t,"image/svg+xml").documentElement;if(!(e instanceof SVGElement))throw new Error("解析失败,结果不是有效的 SVG 元素");return e}function v(t){t&&setTimeout(function(){t.scrollTop=t.scrollHeight},0)}exports.Draggable=/*#__PURE__*/function(){function t(t,e){void 0===e&&(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=d({coordinate:"tl"},e);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 e=t.prototype;return e.onMouseDown=function(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)},e.onMouseMove=function(t){if(!this.isDragging){var 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){var n=t.clientX-this.startX,i=t.clientY-this.startY;this.element.style.right="auto",this.element.style.bottom="auto",this.element.style.left=this.initialX+n+"px",this.element.style.top=this.initialY+i+"px",this.options.onDrag&&this.options.onDrag(t)}},e.convertCoordinate=function(){var t=this.element.getBoundingClientRect(),e=getComputedStyle(this.element).position,n=null,i=null;if("fixed"===e?(n=null,i=new DOMRect(0,0,window.innerWidth,window.innerHeight)):((n=this.element.offsetParent)||(n=document.documentElement),"static"===getComputedStyle(n).position?(n=null,i=new DOMRect(0,0,window.innerWidth,window.innerHeight)):i=n.getBoundingClientRect()),i){var o,r;if("fixed"===e)o=t.left,r=t.top;else if(o=t.left-i.left,r=t.top-i.top,n instanceof HTMLElement){var s=getComputedStyle(n);o-=parseFloat(s.borderLeftWidth)||0,r-=parseFloat(s.borderTopWidth)||0}else o+=window.scrollX,r+=window.scrollY;switch(this.options.coordinate){case"tr":var l=i.width-o-t.width;this.element.style.left="auto",this.element.style.right=l+"px",this.element.style.top=r+"px",this.element.style.bottom="auto";break;case"bl":var a=i.height-r-t.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=i.width-o-t.width,c=i.height-r-t.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=r+"px",this.element.style.bottom="auto"}}},e.onMouseUp=function(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)},t}(),exports.RealUndefined=t,exports.cacheWrapper=function(t,e){return void 0===e&&(e=c),function(){var n=[].slice.call(arguments),r=i(n)+t.name+(e.identifier||"");if(u(r))return Promise.resolve(o(a(r)));if(l[r]){var h=Object.assign({},c,e);return new Promise(function(t){var e=Date.now(),n=setInterval(function(){u(r)?(clearInterval(n),t(o(a(r)))):Date.now()-e>h.timeout&&(l[r]=!1,clearInterval(n),t(o(h.timeoutResult)))},100)})}return l[r]=!0,t.apply(this,n).then(function(t){return s[r]=t,o(s[r])}).catch(function(t){throw t}).finally(function(){l[r]=!1})}},exports.cloneDeep=o,exports.createDefaultObject=r,exports.createElement=function t(e){var n=void 0===e?{}:e,i=n.tag,o=n.children,r=void 0===o?[]:o,s=n.props,l=void 0===s?{}:s,a=n.attrs,u=void 0===a?{}:a,c=n.styles,d=void 0===c?{}:c,p=document.createElement(void 0===i?"div":i);Object.assign(p,l);for(var m=0,v=Object.entries(u);m<v.length;m++){var g=v[m],y=g[1];!1!==y&&p.setAttribute(g[0],y)}for(var b=0,w=Object.entries(d);b<w.length;b++){var x=w[b];f(p,x[0],x[1])}for(var E,M=function(t){var e="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(e)return(e=e.call(t)).next.bind(e);if(Array.isArray(t)||(e=function(t,e){if(t){if("string"==typeof t)return h(t,e);var n={}.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?h(t,e):void 0}}(t))){e&&(t=e);var n=0;return function(){return n>=t.length?{done:!0}:{done:!1,value:t[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(r)?r:[r]);!(E=M()).done;){var S=E.value;S&&("object"==typeof S?S instanceof Element?p.appendChild(S):p.appendChild(t(S)):p.appendChild(document.createTextNode(S)))}return p},exports.createSvg=function(t){return"string"==typeof t?m(t):p(t)},exports.createSvgFromUrl=function(t){try{return Promise.resolve(function(e,n){try{var i=Promise.resolve(fetch(t)).then(function(t){if(!t.ok)throw new Error("网络请求失败: "+t.status+" "+t.statusText);return Promise.resolve(t.text()).then(m)})}catch(t){return n(t)}return i&&i.then?i.then(void 0,n):i}(0,function(t){var e=t instanceof Error?t.message:"未知错误";throw new Error("无法创建 SVG 元素: "+e)}))}catch(t){return Promise.reject(t)}},exports.debounce=function(t,e){var n=null;return function(){var i=arguments,o=this;null!==n&&clearTimeout(n),n=setTimeout(function(){t.apply(o,[].slice.call(i)),n=null},e)}},exports.delayExecution=function(t,e){return void 0===e&&(e=0),new Promise(function(n){0===e?n(t()):setTimeout(function(){n(t())},e)})},exports.generateStableUniqueKey=i,exports.getGlobal=function(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this},exports.isCloneable=e,exports.isPrimitive=n,exports.scrollToBottom=v,exports.scrollToBottomIfNeeded=function(t){t&&("true"!==t.dataset.isListeningForUserScroll&&(function(t){t&&t.addEventListener("scroll",function(){!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&&v(t))},exports.singleExecutionWrapper=function(e,n){void 0===n&&(n=0);var i=function(){if(i.isExecuting)return Promise.resolve(t);i.isExecuting=!0;var o=performance.now(),r=e.apply(this,[].slice.call(arguments));return r.finally(function(){var t=performance.now()-o;n&&n>t?setTimeout(function(){i.isExecuting=!1},n-t):i.isExecuting=!1}),r};return i.isExecuting=!1,i};
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -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","../src/common/cacheWrapper.ts","../src/browser/dom.ts","../src/browser/scroll.ts","../src/browser/draggable.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 * @returns 一个 Promise 对象,该对象在回调函数执行后解析。\n */\nexport function delayExecution<T>(\n callback: () => T,\n delay: number = 0\n): Promise<T> {\n return new Promise<T>((resolve) => {\n if (delay === 0) {\n resolve(callback());\n } else {\n setTimeout(() => {\n resolve(callback());\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","import { 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 return function (this: ThisParameterType<F>, ...args: Parameters<F>) {\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 * 表示 DOM 中可能的子元素类型。\n */\nexport type ChildrenType = DomOptionsType | Element | string;\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 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 this.element.style.right = \"auto\";\n this.element.style.bottom = \"auto\";\n this.element.style.left = this.initialX + dx + \"px\";\n this.element.style.top = this.initialY + dy + \"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.body;\n }\n containerRect = container.getBoundingClientRect();\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 }\n }\n\n // 根据不同的坐标原点设置位置\n switch (this.options.coordinate) {\n case \"tr\":\n const right = (containerRect.width - currentLeft - rect.width);\n this.element.style.left = \"\";\n this.element.style.right = `${right}px`;\n this.element.style.top = `${currentTop}px`;\n this.element.style.bottom = \"\";\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 = \"\";\n this.element.style.top = \"\";\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 = \"\";\n this.element.style.right = `${brRight}px`;\n this.element.style.top = \"\";\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 = \"\";\n this.element.style.top = `${currentTop}px`;\n this.element.style.bottom = \"\";\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","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","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","dy","Math","abs","onDragStart","dx","right","bottom","onDrag","convertCoordinate","rect","getBoundingClientRect","container","containerRect","DOMRect","innerWidth","innerHeight","offsetParent","body","currentLeft","currentTop","HTMLElement","containerStyle","parseFloat","borderLeftWidth","borderTopWidth","width","height","brRight","brBottom","onDragEnd","removeEventListener","func","setting","args","slice","arguments","name","Promise","resolve","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","apply","then","res","error","createElement","_temp","_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","_catch","errorMessage","message","reject","wait","_arguments","context","clearTimeout","callback","delay","globalThis","self","global","dataset","isListeningForUserScroll","inter","userInteracted","userInteractedWithScroll","clientHeight","listenForUserScroll","minTime","singleExecutionFn","isExecuting","performance","result","loadTime"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/common/type.ts","../src/common/generateStableUniqueKey.ts","../src/common/cloneDeep.ts","../src/common/utils.ts","../src/common/cacheWrapper.ts","../src/browser/dom.ts","../src/browser/scroll.ts","../src/browser/draggable.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 * @returns 一个 Promise 对象,该对象在回调函数执行后解析。\n */\nexport function delayExecution<T>(\n callback: () => T,\n delay: number = 0\n): Promise<T> {\n return new Promise<T>((resolve) => {\n if (delay === 0) {\n resolve(callback());\n } else {\n setTimeout(() => {\n resolve(callback());\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","import { 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 return function (this: ThisParameterType<F>, ...args: Parameters<F>) {\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 * 表示 DOM 中可能的子元素类型。\n */\nexport type ChildrenType = DomOptionsType | Element | string;\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 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 this.element.style.right = \"auto\";\n this.element.style.bottom = \"auto\";\n this.element.style.left = this.initialX + dx + \"px\";\n this.element.style.top = this.initialY + dy + \"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(0, 0, window.innerWidth, window.innerHeight);\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","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","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","isDragging","startX","startY","this","initialX","initialY","threshold","onMouseMoveHandler","onMouseUpHandler","_extends","coordinate","originPosition","getComputedStyle","position","onMouseMove","bind","onMouseUp","addEventListener","onMouseDown","_proto","e","preventDefault","clientX","clientY","parseInt","window","left","top","dy","Math","abs","onDragStart","dx","right","bottom","onDrag","convertCoordinate","rect","getBoundingClientRect","container","containerRect","DOMRect","innerWidth","innerHeight","offsetParent","currentLeft","currentTop","HTMLElement","containerStyle","parseFloat","borderLeftWidth","borderTopWidth","scrollX","scrollY","width","height","brRight","brBottom","onDragEnd","removeEventListener","func","setting","args","slice","arguments","name","Promise","resolve","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","apply","then","res","error","createElement","_temp","_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","_catch","errorMessage","message","reject","wait","_arguments","context","clearTimeout","callback","delay","globalThis","self","global","dataset","isListeningForUserScroll","inter","userInteracted","userInteractedWithScroll","clientHeight","listenForUserScroll","minTime","singleExecutionFn","isExecuting","performance","result","loadTime"],"mappings":"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"}
|
package/dist/index.modern.js
CHANGED
|
@@ -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 i(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this}function o(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(...i){const o=this;null!==n&&clearTimeout(n),n=setTimeout(()=>{t.apply(o,i),n=null},e)}}function l(t,e=0){return new Promise(n=>{0===e?n(t()):setTimeout(()=>{n(t())},e)})}function a(t){return new Proxy({},{get:(e,n)=>e.hasOwnProperty(n)?e[n]:t})}const c=a(t),u=a(!1);function h(t){return c[t]}function d(e){return c[e]!==t}const p={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};function f(t,e=p){return function(...n){const i=o(n)+t.name+(e.identifier||"");if(d(i))return Promise.resolve(s(h(i)));if(u[i]){const t=Object.assign({},p,e);return new Promise(e=>{const n=Date.now(),o=setInterval(()=>{d(i)?(clearInterval(o),e(s(h(i)))):Date.now()-n>t.timeout&&(u[i]=!1,clearInterval(o),e(s(t.timeoutResult)))},100)})}return u[i]=!0,t.apply(this,n).then(t=>(c[i]=t,s(c[i]))).catch(t=>{throw t}).finally(()=>{u[i]=!1})}}function m(e,n=0){const i=function i(...o){if(i.isExecuting)return Promise.resolve(t);i.isExecuting=!0;const s=performance.now(),r=e.apply(this,o);return r.finally(()=>{const t=performance.now()-s;n&&n>t?setTimeout(()=>{i.isExecuting=!1},n-t):i.isExecuting=!1}),r};return i.isExecuting=!1,i}function g(t,e,n,i=!1){if(e in t.style)t.style[e]=n;else{const o=i?"important":"";t.style.setProperty(e,String(n),o)}}function y({tag:t="div",children:e=[],props:n={},attrs:i={},styles:o={}}={}){const s=document.createElement(t);Object.assign(s,n);for(const[t,e]of Object.entries(i))!1!==e&&s.setAttribute(t,e);for(const[t,e]of Object.entries(o))g(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(y(t)):s.appendChild(document.createTextNode(t)));return s}function w(t){const e=document.createElementNS("http://www.w3.org/2000/svg",t.type);if(t.props)for(const[n,i]of Object.entries(t.props))e.setAttribute(n,i);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=w(t);e.appendChild(n)});return e}function b(t){const e=(new DOMParser).parseFromString(t,"image/svg+xml").documentElement;if(!(e instanceof SVGElement))throw new Error("解析失败,结果不是有效的 SVG 元素");return e}function v(t){return"string"==typeof t?b(t):w(t)}async function M(t){try{const e=await fetch(t);if(!e.ok)throw new Error(`网络请求失败: ${e.status} ${e.statusText}`);return b(await e.text())}catch(t){const e=t instanceof Error?t.message:"未知错误";throw new Error(`无法创建 SVG 元素: ${e}`)}}function
|
|
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 i(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this}function o(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(...i){const o=this;null!==n&&clearTimeout(n),n=setTimeout(()=>{t.apply(o,i),n=null},e)}}function l(t,e=0){return new Promise(n=>{0===e?n(t()):setTimeout(()=>{n(t())},e)})}function a(t){return new Proxy({},{get:(e,n)=>e.hasOwnProperty(n)?e[n]:t})}const c=a(t),u=a(!1);function h(t){return c[t]}function d(e){return c[e]!==t}const p={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};function f(t,e=p){return function(...n){const i=o(n)+t.name+(e.identifier||"");if(d(i))return Promise.resolve(s(h(i)));if(u[i]){const t=Object.assign({},p,e);return new Promise(e=>{const n=Date.now(),o=setInterval(()=>{d(i)?(clearInterval(o),e(s(h(i)))):Date.now()-n>t.timeout&&(u[i]=!1,clearInterval(o),e(s(t.timeoutResult)))},100)})}return u[i]=!0,t.apply(this,n).then(t=>(c[i]=t,s(c[i]))).catch(t=>{throw t}).finally(()=>{u[i]=!1})}}function m(e,n=0){const i=function i(...o){if(i.isExecuting)return Promise.resolve(t);i.isExecuting=!0;const s=performance.now(),r=e.apply(this,o);return r.finally(()=>{const t=performance.now()-s;n&&n>t?setTimeout(()=>{i.isExecuting=!1},n-t):i.isExecuting=!1}),r};return i.isExecuting=!1,i}function g(t,e,n,i=!1){if(e in t.style)t.style[e]=n;else{const o=i?"important":"";t.style.setProperty(e,String(n),o)}}function y({tag:t="div",children:e=[],props:n={},attrs:i={},styles:o={}}={}){const s=document.createElement(t);Object.assign(s,n);for(const[t,e]of Object.entries(i))!1!==e&&s.setAttribute(t,e);for(const[t,e]of Object.entries(o))g(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(y(t)):s.appendChild(document.createTextNode(t)));return s}function w(t){const e=document.createElementNS("http://www.w3.org/2000/svg",t.type);if(t.props)for(const[n,i]of Object.entries(t.props))e.setAttribute(n,i);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=w(t);e.appendChild(n)});return e}function b(t){const e=(new DOMParser).parseFromString(t,"image/svg+xml").documentElement;if(!(e instanceof SVGElement))throw new Error("解析失败,结果不是有效的 SVG 元素");return e}function v(t){return"string"==typeof t?b(t):w(t)}async function M(t){try{const e=await fetch(t);if(!e.ok)throw new Error(`网络请求失败: ${e.status} ${e.statusText}`);return b(await e.text())}catch(t){const e=t instanceof Error?t.message:"未知错误";throw new Error(`无法创建 SVG 元素: ${e}`)}}function E(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&&E(t))}function D(){return D=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)({}).hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t},D.apply(null,arguments)}class S{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=D({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)}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=t.clientX-this.startX,n=t.clientY-this.startY;this.element.style.right="auto",this.element.style.bottom="auto",this.element.style.left=this.initialX+e+"px",this.element.style.top=this.initialY+n+"px",this.options.onDrag&&this.options.onDrag(t)}}convertCoordinate(){const t=this.element.getBoundingClientRect(),e=getComputedStyle(this.element).position;let n,i,o=null,s=null;if("fixed"===e?(o=null,s=new DOMRect(0,0,window.innerWidth,window.innerHeight)):(o=this.element.offsetParent,o||(o=document.documentElement),"static"===getComputedStyle(o).position?(o=null,s=new DOMRect(0,0,window.innerWidth,window.innerHeight)):s=o.getBoundingClientRect()),s){if("fixed"===e)n=t.left,i=t.top;else if(n=t.left-s.left,i=t.top-s.top,o instanceof HTMLElement){const t=getComputedStyle(o);n-=parseFloat(t.borderLeftWidth)||0,i-=parseFloat(t.borderTopWidth)||0}else n+=window.scrollX,i+=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=`${i}px`,this.element.style.bottom="auto";break;case"bl":const o=s.height-i-t.height;this.element.style.left=`${n}px`,this.element.style.right="auto",this.element.style.top="auto",this.element.style.bottom=`${o}px`;break;case"br":const r=s.width-n-t.width,l=s.height-i-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=`${i}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)}}export{S as Draggable,t as RealUndefined,f as cacheWrapper,s as cloneDeep,a as createDefaultObject,y as createElement,v as createSvg,M as createSvgFromUrl,r as debounce,l as delayExecution,o as generateStableUniqueKey,i as getGlobal,e as isCloneable,n as isPrimitive,E as scrollToBottom,x as scrollToBottomIfNeeded,m as singleExecutionWrapper};
|
|
2
2
|
//# sourceMappingURL=index.modern.js.map
|
package/dist/index.modern.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.modern.js","sources":["../src/common/type.ts","../src/common/getGlobal.ts","../src/common/generateStableUniqueKey.ts","../src/common/cloneDeep.ts","../src/common/utils.ts","../src/common/cacheWrapper.ts","../src/common/singleExecutionWrapper.ts","../src/browser/dom.ts","../src/browser/scroll.ts","../src/browser/draggable.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","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 { 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 * @returns 一个 Promise 对象,该对象在回调函数执行后解析。\n */\nexport function delayExecution<T>(\n callback: () => T,\n delay: number = 0\n): Promise<T> {\n return new Promise<T>((resolve) => {\n if (delay === 0) {\n resolve(callback());\n } else {\n setTimeout(() => {\n resolve(callback());\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","import { 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 return function (this: ThisParameterType<F>, ...args: Parameters<F>) {\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","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","/**\n * 表示 DOM 中可能的子元素类型。\n */\nexport type ChildrenType = DomOptionsType | Element | string;\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 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 this.element.style.right = \"auto\";\n this.element.style.bottom = \"auto\";\n this.element.style.left = this.initialX + dx + \"px\";\n this.element.style.top = this.initialY + dy + \"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.body;\n }\n containerRect = container.getBoundingClientRect();\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 }\n }\n\n // 根据不同的坐标原点设置位置\n switch (this.options.coordinate) {\n case \"tr\":\n const right = (containerRect.width - currentLeft - rect.width);\n this.element.style.left = \"\";\n this.element.style.right = `${right}px`;\n this.element.style.top = `${currentTop}px`;\n this.element.style.bottom = \"\";\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 = \"\";\n this.element.style.top = \"\";\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 = \"\";\n this.element.style.right = `${brRight}px`;\n this.element.style.top = \"\";\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 = \"\";\n this.element.style.top = `${currentTop}px`;\n this.element.style.bottom = \"\";\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"],"names":["RealUndefined","Symbol","isCloneable","obj","clone","isPrimitive","value","type","getGlobal","globalThis","self","window","global","this","generateStableUniqueKey","params","String","JSON","stringify","_key","Array","isArray","Object","keys","sort","reduce","pre","cur","cloneDeep","map","item","newObj","key","prototype","hasOwnProperty","call","debounce","func","wait","timeout","args","context","clearTimeout","setTimeout","apply","delayExecution","callback","delay","Promise","resolve","createDefaultObject","defaultValue","Proxy","get","target","property","cache","loadingCache","getCachedData","apiKey","hasCachedData","defalutSetting","timeoutResult","code","msg","identifier","cacheWrapper","setting","name","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","then","res","catch","error","finally","singleExecutionWrapper","minTime","singleExecutionFn","isExecuting","performance","result","loadTime","setStyle","element","important","style","priority","setProperty","createElement","tag","children","props","attrs","styles","ele","document","entries","setAttribute","childArray","child","Element","appendChild","createTextNode","createSvgFromVNode","vnode","createElementNS","textNode","forEach","childElement","createSvgFromString","svgString","svgElement","DOMParser","parseFromString","documentElement","SVGElement","Error","createSvg","async","createSvgFromUrl","url","response","fetch","ok","status","statusText","text","errorMessage","message","scrollToBottom","dom","scrollTop","scrollHeight","scrollToBottomIfNeeded","dataset","isListeningForUserScroll","addEventListener","inter","userInteracted","userInteractedWithScroll","clientHeight","listenForUserScroll","Draggable","constructor","options","isDragging","startX","startY","initialX","initialY","threshold","onMouseMoveHandler","onMouseUpHandler","_extends","coordinate","originPosition","getComputedStyle","position","onMouseMove","bind","onMouseUp","onMouseDown","e","preventDefault","clientX","clientY","parseInt","left","top","dy","Math","abs","onDragStart","dx","right","bottom","onDrag","convertCoordinate","rect","getBoundingClientRect","currentLeft","currentTop","container","containerRect","DOMRect","innerWidth","innerHeight","offsetParent","body","HTMLElement","containerStyle","parseFloat","borderLeftWidth","borderTopWidth","width","height","brRight","brBottom","onDragEnd","removeEventListener"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.modern.js","sources":["../src/common/type.ts","../src/common/getGlobal.ts","../src/common/generateStableUniqueKey.ts","../src/common/cloneDeep.ts","../src/common/utils.ts","../src/common/cacheWrapper.ts","../src/common/singleExecutionWrapper.ts","../src/browser/dom.ts","../src/browser/scroll.ts","../src/browser/draggable.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","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 { 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 * @returns 一个 Promise 对象,该对象在回调函数执行后解析。\n */\nexport function delayExecution<T>(\n callback: () => T,\n delay: number = 0\n): Promise<T> {\n return new Promise<T>((resolve) => {\n if (delay === 0) {\n resolve(callback());\n } else {\n setTimeout(() => {\n resolve(callback());\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","import { 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 return function (this: ThisParameterType<F>, ...args: Parameters<F>) {\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","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","/**\n * 表示 DOM 中可能的子元素类型。\n */\nexport type ChildrenType = DomOptionsType | Element | string;\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 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 this.element.style.right = \"auto\";\n this.element.style.bottom = \"auto\";\n this.element.style.left = this.initialX + dx + \"px\";\n this.element.style.top = this.initialY + dy + \"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(0, 0, window.innerWidth, window.innerHeight);\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"],"names":["RealUndefined","Symbol","isCloneable","obj","clone","isPrimitive","value","type","getGlobal","globalThis","self","window","global","this","generateStableUniqueKey","params","String","JSON","stringify","_key","Array","isArray","Object","keys","sort","reduce","pre","cur","cloneDeep","map","item","newObj","key","prototype","hasOwnProperty","call","debounce","func","wait","timeout","args","context","clearTimeout","setTimeout","apply","delayExecution","callback","delay","Promise","resolve","createDefaultObject","defaultValue","Proxy","get","target","property","cache","loadingCache","getCachedData","apiKey","hasCachedData","defalutSetting","timeoutResult","code","msg","identifier","cacheWrapper","setting","name","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","then","res","catch","error","finally","singleExecutionWrapper","minTime","singleExecutionFn","isExecuting","performance","result","loadTime","setStyle","element","important","style","priority","setProperty","createElement","tag","children","props","attrs","styles","ele","document","entries","setAttribute","childArray","child","Element","appendChild","createTextNode","createSvgFromVNode","vnode","createElementNS","textNode","forEach","childElement","createSvgFromString","svgString","svgElement","DOMParser","parseFromString","documentElement","SVGElement","Error","createSvg","async","createSvgFromUrl","url","response","fetch","ok","status","statusText","text","errorMessage","message","scrollToBottom","dom","scrollTop","scrollHeight","scrollToBottomIfNeeded","dataset","isListeningForUserScroll","addEventListener","inter","userInteracted","userInteractedWithScroll","clientHeight","listenForUserScroll","Draggable","constructor","options","isDragging","startX","startY","initialX","initialY","threshold","onMouseMoveHandler","onMouseUpHandler","_extends","coordinate","originPosition","getComputedStyle","position","onMouseMove","bind","onMouseUp","onMouseDown","e","preventDefault","clientX","clientY","parseInt","left","top","dy","Math","abs","onDragStart","dx","right","bottom","onDrag","convertCoordinate","rect","getBoundingClientRect","currentLeft","currentTop","container","containerRect","DOMRect","innerWidth","innerHeight","offsetParent","HTMLElement","containerStyle","parseFloat","borderLeftWidth","borderTopWidth","scrollX","scrollY","width","height","brRight","brBottom","onDragEnd","removeEventListener"],"mappings":"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"}
|
package/dist/index.module.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var t=Symbol("undefined");function e(t){return"function"==typeof(null==t?void 0:t.clone)}function n(t){var e=typeof t;return null===t||"string"===e||"number"===e||"boolean"===e||"undefined"===e}function i(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this}function
|
|
1
|
+
var t=Symbol("undefined");function e(t){return"function"==typeof(null==t?void 0:t.clone)}function n(t){var e=typeof t;return null===t||"string"===e||"number"===e||"boolean"===e||"undefined"===e}function i(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this}function o(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(function(t,n){return t[n]=e[n],t},{})})}function r(t){if(null===t||"object"!=typeof t)return t;if(e(t))return t.clone();if(Array.isArray(t))return t.map(function(t){return r(t)});var n={};for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(n[i]=r(t[i]));return n}function s(t,e){var n=null;return function(){var i=arguments,o=this;null!==n&&clearTimeout(n),n=setTimeout(function(){t.apply(o,[].slice.call(i)),n=null},e)}}function l(t,e){return void 0===e&&(e=0),new Promise(function(n){0===e?n(t()):setTimeout(function(){n(t())},e)})}function a(t){return new Proxy({},{get:function(e,n){return e.hasOwnProperty(n)?e[n]:t}})}var u=a(t),c=a(!1);function h(t){return u[t]}function d(e){return u[e]!==t}var f={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};function p(t,e){return void 0===e&&(e=f),function(){var n=[].slice.call(arguments),i=o(n)+t.name+(e.identifier||"");if(d(i))return Promise.resolve(r(h(i)));if(c[i]){var s=Object.assign({},f,e);return new Promise(function(t){var e=Date.now(),n=setInterval(function(){d(i)?(clearInterval(n),t(r(h(i)))):Date.now()-e>s.timeout&&(c[i]=!1,clearInterval(n),t(r(s.timeoutResult)))},100)})}return c[i]=!0,t.apply(this,n).then(function(t){return u[i]=t,r(u[i])}).catch(function(t){throw t}).finally(function(){c[i]=!1})}}function m(e,n){void 0===n&&(n=0);var i=function(){if(i.isExecuting)return Promise.resolve(t);i.isExecuting=!0;var o=performance.now(),r=e.apply(this,[].slice.call(arguments));return r.finally(function(){var t=performance.now()-o;n&&n>t?setTimeout(function(){i.isExecuting=!1},n-t):i.isExecuting=!1}),r};return i.isExecuting=!1,i}function v(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=Array(e);n<e;n++)i[n]=t[n];return i}function g(){return g=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)({}).hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t},g.apply(null,arguments)}function y(t,e,n,i){if(void 0===i&&(i=!1),e in t.style)t.style[e]=n;else{var o=i?"important":"";t.style.setProperty(e,String(n),o)}}var w=function(t){try{return Promise.resolve(function(e,n){try{var i=Promise.resolve(fetch(t)).then(function(t){if(!t.ok)throw new Error("网络请求失败: "+t.status+" "+t.statusText);return Promise.resolve(t.text()).then(E)})}catch(t){return n(t)}return i&&i.then?i.then(void 0,n):i}(0,function(t){var e=t instanceof Error?t.message:"未知错误";throw new Error("无法创建 SVG 元素: "+e)}))}catch(t){return Promise.reject(t)}};function b(t){var e=void 0===t?{}:t,n=e.tag,i=e.children,o=void 0===i?[]:i,r=e.props,s=void 0===r?{}:r,l=e.attrs,a=void 0===l?{}:l,u=e.styles,c=void 0===u?{}:u,h=document.createElement(void 0===n?"div":n);Object.assign(h,s);for(var d=0,f=Object.entries(a);d<f.length;d++){var p=f[d],m=p[1];!1!==m&&h.setAttribute(p[0],m)}for(var g=0,w=Object.entries(c);g<w.length;g++){var M=w[g];y(h,M[0],M[1])}for(var E,x=function(t){var e="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(e)return(e=e.call(t)).next.bind(e);if(Array.isArray(t)||(e=function(t,e){if(t){if("string"==typeof t)return v(t,e);var n={}.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?v(t,e):void 0}}(t))){e&&(t=e);var n=0;return function(){return n>=t.length?{done:!0}:{done:!1,value:t[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(o)?o:[o]);!(E=x()).done;){var S=E.value;S&&("object"==typeof S?S instanceof Element?h.appendChild(S):h.appendChild(b(S)):h.appendChild(document.createTextNode(S)))}return h}function M(t){var e=document.createElementNS("http://www.w3.org/2000/svg",t.type);if(t.props)for(var n=0,i=Object.entries(t.props);n<i.length;n++){var o=i[n];e.setAttribute(o[0],o[1])}if("string"==typeof t.children){var r=document.createTextNode(t.children);e.appendChild(r)}else Array.isArray(t.children)&&t.children.forEach(function(t){var n=M(t);e.appendChild(n)});return e}function E(t){var e=(new DOMParser).parseFromString(t,"image/svg+xml").documentElement;if(!(e instanceof SVGElement))throw new Error("解析失败,结果不是有效的 SVG 元素");return e}function x(t){return"string"==typeof t?E(t):M(t)}function S(t){t&&setTimeout(function(){t.scrollTop=t.scrollHeight},0)}function D(t){t&&("true"!==t.dataset.isListeningForUserScroll&&(function(t){t&&t.addEventListener("scroll",function(){!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&&S(t))}var O=/*#__PURE__*/function(){function t(t,e){void 0===e&&(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=g({coordinate:"tl"},e);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 e=t.prototype;return e.onMouseDown=function(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)},e.onMouseMove=function(t){if(!this.isDragging){var 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){var n=t.clientX-this.startX,i=t.clientY-this.startY;this.element.style.right="auto",this.element.style.bottom="auto",this.element.style.left=this.initialX+n+"px",this.element.style.top=this.initialY+i+"px",this.options.onDrag&&this.options.onDrag(t)}},e.convertCoordinate=function(){var t=this.element.getBoundingClientRect(),e=getComputedStyle(this.element).position,n=null,i=null;if("fixed"===e?(n=null,i=new DOMRect(0,0,window.innerWidth,window.innerHeight)):((n=this.element.offsetParent)||(n=document.documentElement),"static"===getComputedStyle(n).position?(n=null,i=new DOMRect(0,0,window.innerWidth,window.innerHeight)):i=n.getBoundingClientRect()),i){var o,r;if("fixed"===e)o=t.left,r=t.top;else if(o=t.left-i.left,r=t.top-i.top,n instanceof HTMLElement){var s=getComputedStyle(n);o-=parseFloat(s.borderLeftWidth)||0,r-=parseFloat(s.borderTopWidth)||0}else o+=window.scrollX,r+=window.scrollY;switch(this.options.coordinate){case"tr":var l=i.width-o-t.width;this.element.style.left="auto",this.element.style.right=l+"px",this.element.style.top=r+"px",this.element.style.bottom="auto";break;case"bl":var a=i.height-r-t.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=i.width-o-t.width,c=i.height-r-t.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=r+"px",this.element.style.bottom="auto"}}},e.onMouseUp=function(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)},t}();export{O as Draggable,t as RealUndefined,p as cacheWrapper,r as cloneDeep,a as createDefaultObject,b as createElement,x as createSvg,w as createSvgFromUrl,s as debounce,l as delayExecution,o as generateStableUniqueKey,i as getGlobal,e as isCloneable,n as isPrimitive,S as scrollToBottom,D as scrollToBottomIfNeeded,m as singleExecutionWrapper};
|
|
2
2
|
//# sourceMappingURL=index.module.js.map
|
package/dist/index.module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.module.js","sources":["../src/common/type.ts","../src/common/getGlobal.ts","../src/common/generateStableUniqueKey.ts","../src/common/cloneDeep.ts","../src/common/utils.ts","../src/common/cacheWrapper.ts","../src/common/singleExecutionWrapper.ts","../src/browser/dom.ts","../src/browser/scroll.ts","../src/browser/draggable.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","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 { 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 * @returns 一个 Promise 对象,该对象在回调函数执行后解析。\n */\nexport function delayExecution<T>(\n callback: () => T,\n delay: number = 0\n): Promise<T> {\n return new Promise<T>((resolve) => {\n if (delay === 0) {\n resolve(callback());\n } else {\n setTimeout(() => {\n resolve(callback());\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","import { 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 return function (this: ThisParameterType<F>, ...args: Parameters<F>) {\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","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","/**\n * 表示 DOM 中可能的子元素类型。\n */\nexport type ChildrenType = DomOptionsType | Element | string;\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 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 this.element.style.right = \"auto\";\n this.element.style.bottom = \"auto\";\n this.element.style.left = this.initialX + dx + \"px\";\n this.element.style.top = this.initialY + dy + \"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.body;\n }\n containerRect = container.getBoundingClientRect();\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 }\n }\n\n // 根据不同的坐标原点设置位置\n switch (this.options.coordinate) {\n case \"tr\":\n const right = (containerRect.width - currentLeft - rect.width);\n this.element.style.left = \"\";\n this.element.style.right = `${right}px`;\n this.element.style.top = `${currentTop}px`;\n this.element.style.bottom = \"\";\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 = \"\";\n this.element.style.top = \"\";\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 = \"\";\n this.element.style.right = `${brRight}px`;\n this.element.style.top = \"\";\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 = \"\";\n this.element.style.top = `${currentTop}px`;\n this.element.style.bottom = \"\";\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"],"names":["RealUndefined","Symbol","isCloneable","obj","clone","isPrimitive","value","type","getGlobal","globalThis","self","window","global","this","generateStableUniqueKey","params","String","JSON","stringify","_key","Array","isArray","Object","keys","sort","reduce","pre","cur","cloneDeep","map","item","newObj","key","prototype","hasOwnProperty","call","debounce","func","wait","timeout","_arguments","arguments","context","clearTimeout","setTimeout","apply","slice","delayExecution","callback","delay","Promise","resolve","createDefaultObject","defaultValue","Proxy","get","target","property","cache","loadingCache","getCachedData","apiKey","hasCachedData","defalutSetting","timeoutResult","code","msg","identifier","cacheWrapper","setting","args","name","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","then","res","error","singleExecutionWrapper","minTime","singleExecutionFn","isExecuting","performance","result","loadTime","setStyle","element","important","style","priority","setProperty","createSvgFromUrl","url","fetch","response","ok","Error","status","statusText","text","createSvgFromString","_catch","errorMessage","message","e","reject","createElement","_temp","_ref","_ref$tag","tag","_ref$children","children","_ref$props","props","_ref$attrs","attrs","_ref$styles","styles","ele","document","_i","_Object$entries","entries","length","_Object$entries$_i","setAttribute","_i2","_Object$entries2","_Object$entries2$_i","_step","_iterator","_createForOfIteratorHelperLoose","done","child","Element","appendChild","createTextNode","createSvgFromVNode","vnode","createElementNS","_i3","_Object$entries3","_Object$entries3$_i","textNode","forEach","childElement","svgString","svgElement","DOMParser","parseFromString","documentElement","SVGElement","createSvg","scrollToBottom","dom","scrollTop","scrollHeight","scrollToBottomIfNeeded","dataset","isListeningForUserScroll","addEventListener","inter","userInteracted","userInteractedWithScroll","clientHeight","listenForUserScroll","Draggable","options","isDragging","startX","startY","initialX","initialY","threshold","onMouseMoveHandler","onMouseUpHandler","_extends","coordinate","originPosition","getComputedStyle","position","onMouseMove","bind","onMouseUp","onMouseDown","_proto","preventDefault","clientX","clientY","parseInt","left","top","dy","Math","abs","onDragStart","dx","right","bottom","onDrag","convertCoordinate","rect","getBoundingClientRect","container","containerRect","DOMRect","innerWidth","innerHeight","offsetParent","body","currentLeft","currentTop","HTMLElement","containerStyle","parseFloat","borderLeftWidth","borderTopWidth","width","height","brRight","brBottom","onDragEnd","removeEventListener"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.module.js","sources":["../src/common/type.ts","../src/common/getGlobal.ts","../src/common/generateStableUniqueKey.ts","../src/common/cloneDeep.ts","../src/common/utils.ts","../src/common/cacheWrapper.ts","../src/common/singleExecutionWrapper.ts","../src/browser/dom.ts","../src/browser/scroll.ts","../src/browser/draggable.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","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 { 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 * @returns 一个 Promise 对象,该对象在回调函数执行后解析。\n */\nexport function delayExecution<T>(\n callback: () => T,\n delay: number = 0\n): Promise<T> {\n return new Promise<T>((resolve) => {\n if (delay === 0) {\n resolve(callback());\n } else {\n setTimeout(() => {\n resolve(callback());\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","import { 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 return function (this: ThisParameterType<F>, ...args: Parameters<F>) {\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","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","/**\n * 表示 DOM 中可能的子元素类型。\n */\nexport type ChildrenType = DomOptionsType | Element | string;\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 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 this.element.style.right = \"auto\";\n this.element.style.bottom = \"auto\";\n this.element.style.left = this.initialX + dx + \"px\";\n this.element.style.top = this.initialY + dy + \"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(0, 0, window.innerWidth, window.innerHeight);\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"],"names":["RealUndefined","Symbol","isCloneable","obj","clone","isPrimitive","value","type","getGlobal","globalThis","self","window","global","this","generateStableUniqueKey","params","String","JSON","stringify","_key","Array","isArray","Object","keys","sort","reduce","pre","cur","cloneDeep","map","item","newObj","key","prototype","hasOwnProperty","call","debounce","func","wait","timeout","_arguments","arguments","context","clearTimeout","setTimeout","apply","slice","delayExecution","callback","delay","Promise","resolve","createDefaultObject","defaultValue","Proxy","get","target","property","cache","loadingCache","getCachedData","apiKey","hasCachedData","defalutSetting","timeoutResult","code","msg","identifier","cacheWrapper","setting","args","name","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","then","res","error","singleExecutionWrapper","minTime","singleExecutionFn","isExecuting","performance","result","loadTime","setStyle","element","important","style","priority","setProperty","createSvgFromUrl","url","fetch","response","ok","Error","status","statusText","text","createSvgFromString","_catch","errorMessage","message","e","reject","createElement","_temp","_ref","_ref$tag","tag","_ref$children","children","_ref$props","props","_ref$attrs","attrs","_ref$styles","styles","ele","document","_i","_Object$entries","entries","length","_Object$entries$_i","setAttribute","_i2","_Object$entries2","_Object$entries2$_i","_step","_iterator","_createForOfIteratorHelperLoose","done","child","Element","appendChild","createTextNode","createSvgFromVNode","vnode","createElementNS","_i3","_Object$entries3","_Object$entries3$_i","textNode","forEach","childElement","svgString","svgElement","DOMParser","parseFromString","documentElement","SVGElement","createSvg","scrollToBottom","dom","scrollTop","scrollHeight","scrollToBottomIfNeeded","dataset","isListeningForUserScroll","addEventListener","inter","userInteracted","userInteractedWithScroll","clientHeight","listenForUserScroll","Draggable","options","isDragging","startX","startY","initialX","initialY","threshold","onMouseMoveHandler","onMouseUpHandler","_extends","coordinate","originPosition","getComputedStyle","position","onMouseMove","bind","onMouseUp","onMouseDown","_proto","preventDefault","clientX","clientY","parseInt","left","top","dy","Math","abs","onDragStart","dx","right","bottom","onDrag","convertCoordinate","rect","getBoundingClientRect","container","containerRect","DOMRect","innerWidth","innerHeight","offsetParent","currentLeft","currentTop","HTMLElement","containerStyle","parseFloat","borderLeftWidth","borderTopWidth","scrollX","scrollY","width","height","brRight","brBottom","onDragEnd","removeEventListener"],"mappings":"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"}
|
package/dist/index.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t||self).iunLibs={})}(this,function(t){var e=Symbol("undefined");function n(t){return"function"==typeof(null==t?void 0:t.clone)}function i(t){var e=typeof t;return null===t||"string"===e||"number"===e||"boolean"===e||"undefined"===e}function o(t){return i(t)?String(t):JSON.stringify(t,function(t,e){return"object"!=typeof e||null===e||Array.isArray(e)?e:Object.keys(e).sort().reduce(function(t,n){return t[n]=e[n],t},{})})}function r(t){if(null===t||"object"!=typeof t)return t;if(n(t))return t.clone();if(Array.isArray(t))return t.map(function(t){return r(t)});var e={};for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=r(t[i]));return e}function s(t){return new Proxy({},{get:function(e,n){return e.hasOwnProperty(n)?e[n]:t}})}var l=s(e),a=s(!1);function u(t){return l[t]}function c(t){return l[t]!==e}var h={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};function
|
|
1
|
+
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t||self).iunLibs={})}(this,function(t){var e=Symbol("undefined");function n(t){return"function"==typeof(null==t?void 0:t.clone)}function i(t){var e=typeof t;return null===t||"string"===e||"number"===e||"boolean"===e||"undefined"===e}function o(t){return i(t)?String(t):JSON.stringify(t,function(t,e){return"object"!=typeof e||null===e||Array.isArray(e)?e:Object.keys(e).sort().reduce(function(t,n){return t[n]=e[n],t},{})})}function r(t){if(null===t||"object"!=typeof t)return t;if(n(t))return t.clone();if(Array.isArray(t))return t.map(function(t){return r(t)});var e={};for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=r(t[i]));return e}function s(t){return new Proxy({},{get:function(e,n){return e.hasOwnProperty(n)?e[n]:t}})}var l=s(e),a=s(!1);function u(t){return l[t]}function c(t){return l[t]!==e}var h={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};function d(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=Array(e);n<e;n++)i[n]=t[n];return i}function f(){return f=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)({}).hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t},f.apply(null,arguments)}function p(t,e,n,i){if(void 0===i&&(i=!1),e in t.style)t.style[e]=n;else{var o=i?"important":"";t.style.setProperty(e,String(n),o)}}function m(t){var e=document.createElementNS("http://www.w3.org/2000/svg",t.type);if(t.props)for(var n=0,i=Object.entries(t.props);n<i.length;n++){var o=i[n];e.setAttribute(o[0],o[1])}if("string"==typeof t.children){var r=document.createTextNode(t.children);e.appendChild(r)}else Array.isArray(t.children)&&t.children.forEach(function(t){var n=m(t);e.appendChild(n)});return e}function v(t){var e=(new DOMParser).parseFromString(t,"image/svg+xml").documentElement;if(!(e instanceof SVGElement))throw new Error("解析失败,结果不是有效的 SVG 元素");return e}function g(t){t&&setTimeout(function(){t.scrollTop=t.scrollHeight},0)}t.Draggable=/*#__PURE__*/function(){function t(t,e){void 0===e&&(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=f({coordinate:"tl"},e);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 e=t.prototype;return e.onMouseDown=function(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)},e.onMouseMove=function(t){if(!this.isDragging){var 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){var n=t.clientX-this.startX,i=t.clientY-this.startY;this.element.style.right="auto",this.element.style.bottom="auto",this.element.style.left=this.initialX+n+"px",this.element.style.top=this.initialY+i+"px",this.options.onDrag&&this.options.onDrag(t)}},e.convertCoordinate=function(){var t=this.element.getBoundingClientRect(),e=getComputedStyle(this.element).position,n=null,i=null;if("fixed"===e?(n=null,i=new DOMRect(0,0,window.innerWidth,window.innerHeight)):((n=this.element.offsetParent)||(n=document.documentElement),"static"===getComputedStyle(n).position?(n=null,i=new DOMRect(0,0,window.innerWidth,window.innerHeight)):i=n.getBoundingClientRect()),i){var o,r;if("fixed"===e)o=t.left,r=t.top;else if(o=t.left-i.left,r=t.top-i.top,n instanceof HTMLElement){var s=getComputedStyle(n);o-=parseFloat(s.borderLeftWidth)||0,r-=parseFloat(s.borderTopWidth)||0}else o+=window.scrollX,r+=window.scrollY;switch(this.options.coordinate){case"tr":var l=i.width-o-t.width;this.element.style.left="auto",this.element.style.right=l+"px",this.element.style.top=r+"px",this.element.style.bottom="auto";break;case"bl":var a=i.height-r-t.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=i.width-o-t.width,c=i.height-r-t.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=r+"px",this.element.style.bottom="auto"}}},e.onMouseUp=function(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)},t}(),t.RealUndefined=e,t.cacheWrapper=function(t,e){return void 0===e&&(e=h),function(){var n=[].slice.call(arguments),i=o(n)+t.name+(e.identifier||"");if(c(i))return Promise.resolve(r(u(i)));if(a[i]){var s=Object.assign({},h,e);return new Promise(function(t){var e=Date.now(),n=setInterval(function(){c(i)?(clearInterval(n),t(r(u(i)))):Date.now()-e>s.timeout&&(a[i]=!1,clearInterval(n),t(r(s.timeoutResult)))},100)})}return a[i]=!0,t.apply(this,n).then(function(t){return l[i]=t,r(l[i])}).catch(function(t){throw t}).finally(function(){a[i]=!1})}},t.cloneDeep=r,t.createDefaultObject=s,t.createElement=function t(e){var n=void 0===e?{}:e,i=n.tag,o=n.children,r=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===i?"div":i);Object.assign(f,l);for(var m=0,v=Object.entries(u);m<v.length;m++){var g=v[m],y=g[1];!1!==y&&f.setAttribute(g[0],y)}for(var b=0,w=Object.entries(h);b<w.length;b++){var x=w[b];p(f,x[0],x[1])}for(var E,M=function(t){var e="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(e)return(e=e.call(t)).next.bind(e);if(Array.isArray(t)||(e=function(t,e){if(t){if("string"==typeof t)return d(t,e);var n={}.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?d(t,e):void 0}}(t))){e&&(t=e);var n=0;return function(){return n>=t.length?{done:!0}:{done:!1,value:t[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(r)?r:[r]);!(E=M()).done;){var S=E.value;S&&("object"==typeof S?S instanceof Element?f.appendChild(S):f.appendChild(t(S)):f.appendChild(document.createTextNode(S)))}return f},t.createSvg=function(t){return"string"==typeof t?v(t):m(t)},t.createSvgFromUrl=function(t){try{return Promise.resolve(function(e,n){try{var i=Promise.resolve(fetch(t)).then(function(t){if(!t.ok)throw new Error("网络请求失败: "+t.status+" "+t.statusText);return Promise.resolve(t.text()).then(v)})}catch(t){return n(t)}return i&&i.then?i.then(void 0,n):i}(0,function(t){var e=t instanceof Error?t.message:"未知错误";throw new Error("无法创建 SVG 元素: "+e)}))}catch(t){return Promise.reject(t)}},t.debounce=function(t,e){var n=null;return function(){var i=arguments,o=this;null!==n&&clearTimeout(n),n=setTimeout(function(){t.apply(o,[].slice.call(i)),n=null},e)}},t.delayExecution=function(t,e){return void 0===e&&(e=0),new Promise(function(n){0===e?n(t()):setTimeout(function(){n(t())},e)})},t.generateStableUniqueKey=o,t.getGlobal=function(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this},t.isCloneable=n,t.isPrimitive=i,t.scrollToBottom=g,t.scrollToBottomIfNeeded=function(t){t&&("true"!==t.dataset.isListeningForUserScroll&&(function(t){t&&t.addEventListener("scroll",function(){!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&&g(t))},t.singleExecutionWrapper=function(t,n){void 0===n&&(n=0);var i=function(){if(i.isExecuting)return Promise.resolve(e);i.isExecuting=!0;var o=performance.now(),r=t.apply(this,[].slice.call(arguments));return r.finally(function(){var t=performance.now()-o;n&&n>t?setTimeout(function(){i.isExecuting=!1},n-t):i.isExecuting=!1}),r};return i.isExecuting=!1,i}});
|
|
2
2
|
//# sourceMappingURL=index.umd.js.map
|
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../src/common/type.ts","../src/common/generateStableUniqueKey.ts","../src/common/cloneDeep.ts","../src/common/utils.ts","../src/common/cacheWrapper.ts","../src/browser/dom.ts","../src/browser/scroll.ts","../src/browser/draggable.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 * @returns 一个 Promise 对象,该对象在回调函数执行后解析。\n */\nexport function delayExecution<T>(\n callback: () => T,\n delay: number = 0\n): Promise<T> {\n return new Promise<T>((resolve) => {\n if (delay === 0) {\n resolve(callback());\n } else {\n setTimeout(() => {\n resolve(callback());\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","import { 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 return function (this: ThisParameterType<F>, ...args: Parameters<F>) {\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 * 表示 DOM 中可能的子元素类型。\n */\nexport type ChildrenType = DomOptionsType | Element | string;\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 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 this.element.style.right = \"auto\";\n this.element.style.bottom = \"auto\";\n this.element.style.left = this.initialX + dx + \"px\";\n this.element.style.top = this.initialY + dy + \"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.body;\n }\n containerRect = container.getBoundingClientRect();\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 }\n }\n\n // 根据不同的坐标原点设置位置\n switch (this.options.coordinate) {\n case \"tr\":\n const right = (containerRect.width - currentLeft - rect.width);\n this.element.style.left = \"\";\n this.element.style.right = `${right}px`;\n this.element.style.top = `${currentTop}px`;\n this.element.style.bottom = \"\";\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 = \"\";\n this.element.style.top = \"\";\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 = \"\";\n this.element.style.right = `${brRight}px`;\n this.element.style.top = \"\";\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 = \"\";\n this.element.style.top = `${currentTop}px`;\n this.element.style.bottom = \"\";\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","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","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","dy","Math","abs","onDragStart","dx","right","bottom","onDrag","convertCoordinate","rect","getBoundingClientRect","container","containerRect","DOMRect","innerWidth","innerHeight","offsetParent","body","currentLeft","currentTop","HTMLElement","containerStyle","parseFloat","borderLeftWidth","borderTopWidth","width","height","brRight","brBottom","onDragEnd","removeEventListener","func","setting","args","slice","arguments","name","Promise","resolve","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","apply","then","res","error","createElement","_temp","_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","_catch","errorMessage","message","reject","wait","_arguments","context","clearTimeout","callback","delay","globalThis","self","global","dataset","isListeningForUserScroll","inter","userInteracted","userInteractedWithScroll","clientHeight","listenForUserScroll","minTime","singleExecutionFn","isExecuting","performance","result","loadTime"],"mappings":"iOAAaA,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,CCqDgB,SAAAK,EAAuBC,GACrC,OAAW,IAAAC,MACT,CAAA,EACA,CACEC,IAAK,SAACC,EAAQC,GACZ,OAAOD,EAAON,eAAeO,GACzBD,EAAOC,GACPJ,CACN,GAGN,CCxFA,IAAMK,EAA6BN,EAAyB9B,GACtDqC,EAAeP,GAAoB,GACzC,SAASQ,EAAuBC,GAC9B,OAAOH,EAAMG,EACf,CAEA,SAASC,EAAcD,GACrB,OAAOH,EAAMG,KAAYvC,CAC3B,CAQA,IAAMyC,EAA0B,CAC9BC,QAAS,IACTC,cAAe,CAAEC,KAAM,IAAKC,IAAK,QACjCC,WAAY,kUCmBd,SAASC,EACPC,EACAb,EACA7B,EACA2C,GAEA,QAFAA,IAAAA,IAAAA,GAAqB,GAEjBd,KAAYa,EAAQE,MACrBF,EAAQE,MAAcf,GAAY7B,MAC9B,CACL,IAAM6C,EAAWF,EAAY,YAAc,GAC3CD,EAAQE,MAAME,YAAYjB,EAAUzB,OAAOJ,GAAQ6C,EACrD,CACF,CA8EA,SAASE,EAAmBC,GAC1B,IACMN,EAAUO,SAASC,gBADP,6BACkCF,EAAM/C,MAE1D,GAAI+C,EAAMG,MACR,IAAAC,IAAAA,IAAAC,EAA2B3C,OAAO4C,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,MAAWnD,MAAMC,QAAQuC,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,0BCkBsB,WAapB,SAAAC,EAAYpC,EAAsBqC,QAAAA,IAAAA,IAAAA,EAA4B,CAAA,GAAEC,KAZxDtC,aAAO,EAAAsC,KACPD,aAAO,EAAAC,KACPC,YAAsB,EAAKD,KAC3BE,OAAiB,EAACF,KAClBG,OAAiB,EAACH,KAClBI,SAAmB,EAACJ,KACpBK,SAAmB,EAACL,KACpBM,UAAoB,EAACN,KAErBO,wBAAkB,EAAAP,KAClBQ,sBAAgB,EAGtBR,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,EAAAzD,UAsIA,OAtIA8E,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,EAEOL,YAAA,SAAYM,GAClB,IAAKpB,KAAKC,WAAY,CACpB,IACM2B,EAAKR,EAAEG,QAAUvB,KAAKG,QACxB0B,KAAKC,IAFEV,EAAEE,QAAUtB,KAAKE,QAETF,KAAKM,WAAauB,KAAKC,IAAIF,GAAM5B,KAAKM,aACvDN,KAAKC,YAAa,EACdD,KAAKD,QAAQgC,aACf/B,KAAKD,QAAQgC,YAAYX,GAG/B,CAEA,GAAIpB,KAAKC,WAAY,CACnB,IAAM+B,EAAKZ,EAAEE,QAAUtB,KAAKE,OACtB0B,EAAKR,EAAEG,QAAUvB,KAAKG,OAC5BH,KAAKtC,QAAQE,MAAMqE,MAAQ,OAC3BjC,KAAKtC,QAAQE,MAAMsE,OAAS,OAC5BlC,KAAKtC,QAAQE,MAAM8D,KAAO1B,KAAKI,SAAW4B,EAAK,KAC/ChC,KAAKtC,QAAQE,MAAM+D,IAAM3B,KAAKK,SAAWuB,EAAK,KAE1C5B,KAAKD,QAAQoC,QACfnC,KAAKD,QAAQoC,OAAOf,EAExB,CACF,EAACD,EAEOiB,kBAAA,WACN,IAAMC,EAAOrC,KAAKtC,QAAQ4E,wBAEpBzB,EADQD,iBAAiBZ,KAAKtC,SACbmD,SAGnB0B,EAA4B,KAC5BC,EAAgC,KAepC,GAbiB,UAAb3B,GAEF0B,EAAY,KACZC,EAAgB,IAAIC,QAAQ,EAAG,EAAGhB,OAAOiB,WAAYjB,OAAOkB,gBAG5DJ,EAAYvC,KAAKtC,QAAQkF,gBAEvBL,EAAYtE,SAAS4E,MAEvBL,EAAgBD,EAAUD,yBAGvBE,EAAL,CAGA,IAAIM,EACAC,EAEJ,GAAiB,UAAblC,EACFiC,EAAcT,EAAKX,KACnBqB,EAAaV,EAAKV,SAMlB,GAHAmB,EAAcT,EAAKX,KAAOc,EAAcd,KACxCqB,EAAaV,EAAKV,IAAMa,EAAcb,IAElCY,aAAqBS,YAAa,CAEpC,IAAMC,EAAiBrC,iBAAiB2B,GAGxCO,GAFmBI,WAAWD,EAAeE,kBAAoB,EAGjEJ,GAFkBG,WAAWD,EAAeG,iBAAmB,CAGjE,CAIF,OAAQpD,KAAKD,QAAQW,YACnB,IAAK,KACH,IAAMuB,EAASO,EAAca,MAAQP,EAAcT,EAAKgB,MACxDrD,KAAKtC,QAAQE,MAAM8D,KAAO,GAC1B1B,KAAKtC,QAAQE,MAAMqE,MAAWA,EAAK,KACnCjC,KAAKtC,QAAQE,MAAM+D,IAASoB,EAAc,KAC1C/C,KAAKtC,QAAQE,MAAMsE,OAAS,GAC5B,MACF,IAAK,KACH,IAAMA,EAAUM,EAAcc,OAASP,EAAaV,EAAKiB,OACzDtD,KAAKtC,QAAQE,MAAM8D,KAAUoB,EAAe,KAC5C9C,KAAKtC,QAAQE,MAAMqE,MAAQ,GAC3BjC,KAAKtC,QAAQE,MAAM+D,IAAM,GACzB3B,KAAKtC,QAAQE,MAAMsE,OAAYA,EAAM,KACrC,MACF,IAAK,KACH,IAAMqB,EAAWf,EAAca,MAAQP,EAAcT,EAAKgB,MACpDG,EAAYhB,EAAcc,OAASP,EAAaV,EAAKiB,OAC3DtD,KAAKtC,QAAQE,MAAM8D,KAAO,GAC1B1B,KAAKtC,QAAQE,MAAMqE,MAAWsB,EAAW,KACzCvD,KAAKtC,QAAQE,MAAM+D,IAAM,GACzB3B,KAAKtC,QAAQE,MAAMsE,OAAYsB,EAAQ,KACvC,MAEF,QACExD,KAAKtC,QAAQE,MAAM8D,KAAUoB,EAAe,KAC5C9C,KAAKtC,QAAQE,MAAMqE,MAAQ,GAC3BjC,KAAKtC,QAAQE,MAAM+D,IAASoB,EAAU,KACtC/C,KAAKtC,QAAQE,MAAMsE,OAAS,GAlDhC,CAoDF,EAACf,EAEOH,UAAA,SAAUI,GACZpB,KAAKC,aAEHD,KAAKD,QAAQW,YAA0C,OAA5BV,KAAKD,QAAQW,YAC1CV,KAAKoC,oBAGHpC,KAAKD,QAAQ0D,WACfzD,KAAKD,QAAQ0D,UAAUrC,IAG3BpB,KAAKC,YAAa,EAClBhC,SAASyF,oBAAoB,YAAa1D,KAAKO,oBAC/CtC,SAASyF,oBAAoB,UAAW1D,KAAKQ,iBAC/C,EAACV,CAAA,CAvKmB,6CHYpB6D,EAASC,GACT,YADSA,IAAAA,IAAAA,EAAmBzG,GACrB,eAAyC0G,KAAmBC,MAAAvH,KAAAwH,WAC3D9G,EACJ/B,EAAwB2I,GAAQF,EAAKK,MAAQJ,EAAQpG,YAAc,IAErE,GAAIN,EAAcD,GAChB,OAAOgH,QAAQC,QAAQlI,EAAUgB,EAAiBC,KAGpD,GAAIF,EAAaE,GAAS,CACxB,IAAMkH,EAAWzI,OAAO0I,OAAO,CAAA,EAAIjH,EAAgByG,GACnD,WAAWK,QAAQ,SAACC,GAClB,IAAMG,EAAYC,KAAKC,MACjBC,EAAQC,YAAY,WACpBvH,EAAcD,IAChByH,cAAcF,GACdN,EAAQlI,EAAUgB,EAAiBC,MAC1BqH,KAAKC,MAAQF,EAAYF,EAAS/G,UAC3CL,EAAaE,IAAU,EACvByH,cAAcF,GACdN,EAAQlI,EAAUmI,EAAS9G,gBAE/B,EAAG,IACL,EACF,CAGA,OAFAN,EAAaE,IAAU,EAEhB0G,EACJgB,MAAM3E,KAAM6D,GACZe,KAAK,SAACC,GAGL,OADA/H,EAAMG,GAAU4H,EACT7I,EAAUc,EAAMG,GACzB,SACO,SAAC6H,GACN,MAAMA,CACR,WACS,WACP/H,EAAaE,IAAU,CACzB,EACJ,CACF,wDCNM,SAAU8H,EAAaC,GAMP,IAAAC,WAAAD,EAAF,CAAA,EAAEA,EAAAE,EAAAD,EALpBE,IAAWC,EAAAH,EACXvG,SAAAA,OAAQ,IAAA0G,EAAG,GAAEA,EAAAC,EAAAJ,EACb9G,MAAAA,OAAQ,IAAHkH,EAAG,CAAA,EAAEA,EAAAC,EAAAL,EACVM,MAAAA,OAAQ,IAAHD,EAAG,CAAE,EAAAA,EAAAE,EAAAP,EACVQ,OAAAA,OAAS,IAAHD,EAAG,CAAA,EAAEA,EAELE,EAAMzH,SAAS8G,uBANlBG,EAAG,MAAKA,GASXxJ,OAAO0I,OAAOsB,EAAKvH,GAGnB,QAAAwH,EAAA,EAAAC,EAA2BlK,OAAO4C,QAAQiH,GAAMI,EAAAC,EAAArH,OAAAoH,IAAE,CAA7C,IAAAE,EAAAD,EAAAD,GAAY3K,EAAK6K,EAAA,IACN,IAAV7K,GACF0K,EAAIjH,aAFOoH,EAAE7K,GAESA,EAE1B,CAGA,QAAA8K,EAAA,EAAAC,EAA2BrK,OAAO4C,QAAQmH,GAAOK,EAAAC,EAAAxH,OAAAuH,IAAE,CAA9C,IAAAE,EAAAD,EAAAD,GACHrI,EAASiI,EADIM,EAAEhL,GAAKgL,EAAA,GAEtB,CAIA,IADA,IAC8BC,EAA9BC,2pBAAAC,CADmB3K,MAAMC,QAAQiD,GAAYA,EAAW,CAACA,MAC3BuH,EAAAC,KAAAE,MAAE,CAAA,IAArBrH,EAAKkH,EAAAjL,MACT+D,IAEgB,iBAAVA,EACLA,aAAiBsH,QACnBX,EAAI7G,YAAYE,GAEhB2G,EAAI7G,YAAYkG,EAAchG,IAGhC2G,EAAI7G,YAAYZ,SAASW,eAAeG,IAE5C,CAEA,OAAO2G,CACT,cA+DM,SAAoBvK,GACxB,MAAsB,iBAAXA,EACF8D,EAAoB9D,GAEtB4C,EAAmB5C,EAC5B,qBASsC,SAACmL,GAAW,IAAA,OAAArC,QAAAC,gCAC5CD,QAAAC,QACqBqC,MAAMD,IAAI1B,KAAA,SAA3B4B,GACN,IAAKA,EAASC,GACZ,MAAU,IAAAjH,MACGgH,WAAAA,EAASE,OAAM,IAAIF,EAASG,YAE1C,OAAA1C,QAAAC,QAEuBsC,EAASI,QAAMhC,KAChC3F,EACT,4DAXgD4H,CAAA,WAWvC/B,GACP,IAAMgC,EAAehC,aAAiBtF,MAAQsF,EAAMiC,QAAU,OAC9D,MAAU,IAAAvH,MAAsBsH,gBAAAA,EAClC,GACF,CAAC,MAAA1F,UAAA6C,QAAA+C,OAAA5F,yBF3MCuC,EACAsD,GAEA,IAAI7J,EAAgD,KAEpD,kBAAmE8J,IAAAA,EAAAnD,UAC3DoD,EAAUnH,KAGA,OAAZ5C,GACFgK,aAAahK,GAIfA,EAAUuC,WAAW,WACnBgE,EAAKgB,MAAMwC,EAAOrD,GAAAA,MAAAvH,KAAA2K,IAClB9J,EAAU,IACZ,EAAG6J,EACL,CACF,mBAiCgB,SACdI,EACAC,GAEA,gBAFAA,IAAAA,EAAgB,GAEL,IAAArD,QAAW,SAACC,GACP,IAAVoD,EACFpD,EAAQmD,KAER1H,WAAW,WACTuE,EAAQmD,IACV,EAAGC,EAEP,EACF,qDK1DE,MAA0B,oBAAfC,WACFA,WAGW,oBAATC,KACFA,KAGa,oBAAX/F,OACFA,OAGa,oBAAXgG,OACFA,OAKXzH,IAAA,8EFZM,SAAiCN,GAChCA,IAIwC,SAAzCA,EAAIgI,QAAQC,2BA4BlB,SAA6BjI,GACtBA,GAGLA,EAAIuB,iBAAiB,SAAU,YAfjC,SAAkCvB,EAAkBkI,GAElDlI,EAAIgI,QAAQG,eAAiBD,EAAQ,OAAS,OAChD,CAgBME,CAAyBpI,EAFvBA,EAAIE,UAAYF,EAAIqI,aAAerI,EAAIG,aAAe,EAO5D,EACF,CAzCImI,CAAoBtI,GACpBA,EAAIgI,QAAQC,yBAA2B,QAIN,SAA/BjI,EAAIgI,QAAQG,gBACdpI,EAAeC,GAEnB,2BGjBgB,SACdiE,EACAsE,YAAAA,IAAAA,EAAkB,GAElB,IAAMC,EAAoB,WAIxB,GAAIA,EAAkBC,YAEpB,OAAOlE,QAAQC,QAAQxJ,GAEzBwN,EAAkBC,aAAc,EAEhC,IAAM9D,EAAY+D,YAAY7D,MACxB8D,EAAS1E,EAAKgB,MAAM3E,KAAI8D,GAAAA,MAAAvH,KAAAwH,YAY9B,OAXAsE,EAAM,QAAS,WACb,IAAMC,EAAWF,YAAY7D,MAAQF,EACjC4D,GAAWA,EAAUK,EACvB3I,WAAW,WACTuI,EAAkBC,aAAc,CAClC,EAAGF,EAAUK,GAEbJ,EAAkBC,aAAc,CAEpC,GAEOE,CACT,EAIA,OAFAH,EAAkBC,aAAc,EAEzBD,CACT"}
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../src/common/type.ts","../src/common/generateStableUniqueKey.ts","../src/common/cloneDeep.ts","../src/common/utils.ts","../src/common/cacheWrapper.ts","../src/browser/dom.ts","../src/browser/scroll.ts","../src/browser/draggable.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 * @returns 一个 Promise 对象,该对象在回调函数执行后解析。\n */\nexport function delayExecution<T>(\n callback: () => T,\n delay: number = 0\n): Promise<T> {\n return new Promise<T>((resolve) => {\n if (delay === 0) {\n resolve(callback());\n } else {\n setTimeout(() => {\n resolve(callback());\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","import { 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 return function (this: ThisParameterType<F>, ...args: Parameters<F>) {\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 * 表示 DOM 中可能的子元素类型。\n */\nexport type ChildrenType = DomOptionsType | Element | string;\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 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 this.element.style.right = \"auto\";\n this.element.style.bottom = \"auto\";\n this.element.style.left = this.initialX + dx + \"px\";\n this.element.style.top = this.initialY + dy + \"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(0, 0, window.innerWidth, window.innerHeight);\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","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","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","isDragging","startX","startY","this","initialX","initialY","threshold","onMouseMoveHandler","onMouseUpHandler","_extends","coordinate","originPosition","getComputedStyle","position","onMouseMove","bind","onMouseUp","addEventListener","onMouseDown","_proto","e","preventDefault","clientX","clientY","parseInt","window","left","top","dy","Math","abs","onDragStart","dx","right","bottom","onDrag","convertCoordinate","rect","getBoundingClientRect","container","containerRect","DOMRect","innerWidth","innerHeight","offsetParent","currentLeft","currentTop","HTMLElement","containerStyle","parseFloat","borderLeftWidth","borderTopWidth","scrollX","scrollY","width","height","brRight","brBottom","onDragEnd","removeEventListener","func","setting","args","slice","arguments","name","Promise","resolve","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","apply","then","res","error","createElement","_temp","_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","_catch","errorMessage","message","reject","wait","_arguments","context","clearTimeout","callback","delay","globalThis","self","global","dataset","isListeningForUserScroll","inter","userInteracted","userInteractedWithScroll","clientHeight","listenForUserScroll","minTime","singleExecutionFn","isExecuting","performance","result","loadTime"],"mappings":"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"}
|