@i.un/libs 0.0.2 → 0.0.5

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.
@@ -1 +1,51 @@
1
- export declare function createDocument(): Document;
1
+ /**
2
+ * 表示 DOM 中可能的子元素类型。
3
+ */
4
+ export type ChildrenType = DomOptionsType | HTMLElement | Text | string;
5
+ /**
6
+ * 表示创建 DOM 元素的选项类型。
7
+ */
8
+ export type DomOptionsType = {
9
+ /**
10
+ * 要创建的元素的标签名。默认为 "div"。
11
+ */
12
+ tag?: string;
13
+ /**
14
+ * 要附加到创建的元素的子元素。可以是单个子元素或子元素数组。
15
+ */
16
+ children?: ChildrenType | ChildrenType[];
17
+ /**
18
+ * 要设置在创建的元素上的属性。
19
+ */
20
+ props?: Record<string, any>;
21
+ /**
22
+ * 要设置在创建的元素上的属性。
23
+ */
24
+ attrs?: Record<string, string | boolean>;
25
+ /**
26
+ * 要应用于创建的元素的样式。
27
+ */
28
+ styles?: Record<string, string>;
29
+ };
30
+ /**
31
+ * 使用指定选项创建一个 DOM 元素。
32
+ *
33
+ * @param options - 创建 DOM 元素的选项。
34
+ *
35
+ * @returns 创建的 DOM 元素。
36
+ *
37
+ * @remarks
38
+ * 此函数旨在浏览器环境中使用。
39
+ *
40
+ * @example
41
+ * ```typescript
42
+ * const element = createElement({
43
+ * tag: 'button',
44
+ * children: '点击我',
45
+ * attrs: { id: 'myButton' },
46
+ * styles: { color: 'red' }
47
+ * });
48
+ * document.body.appendChild(element);
49
+ * ```
50
+ */
51
+ export declare function createElement({ tag, children, props, attrs, styles, }?: DomOptionsType): HTMLElement;
@@ -1 +1 @@
1
- export * from "./dom";
1
+ export * from "./dom";
@@ -1 +1,7 @@
1
- export declare function cloneDeep<T>(obj: T): T;
1
+ /**
2
+ * 深度克隆一个对象或数组。
3
+ *
4
+ * @param {T} obj - 要克隆的对象或数组。
5
+ * @returns {T} 克隆后的对象或数组。
6
+ */
7
+ export declare function cloneDeep<T>(obj: T): T;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 为给定的参数生成一个稳定且唯一的键。
3
+ *
4
+ * 该函数确保生成的键是确定性的,即相同的输入总是会生成相同的输出。
5
+ * 这在缓存、记忆化或任何需要一致键的场景中非常有用。
6
+ *
7
+ * @param params - 用于生成键的参数。可以是任何类型。
8
+ * @returns 表示输入参数的稳定且唯一的字符串键。
9
+ */
10
+ export declare function generateStableUniqueKey(params: any): string;
@@ -1 +1,13 @@
1
- export declare function getGlobal(this: any): any;
1
+ /**
2
+ * 获取当前环境的全局对象。
3
+ *
4
+ * 在不同的 JavaScript 运行环境中,全局对象的名称不同:
5
+ * - 在浏览器环境中,全局对象是 `window`。
6
+ * - 在 Node.js 环境中,全局对象是 `global`。
7
+ * - 在 Web Worker 环境中,全局对象是 `self`。
8
+ *
9
+ * 这个函数提供了一种统一的方式来获取当前环境的全局对象。
10
+ *
11
+ * @returns 当前环境的全局对象。
12
+ */
13
+ export declare function getGlobal(this: any): any;
@@ -1,5 +1,5 @@
1
- export * from './type';
2
- export * from './getGlobal';
3
- export * from './wrapFunctionWithCache';
4
- export * from './generateDeterministicUniqueKey';
5
- export * from './cloneDeep';
1
+ export * from "./type";
2
+ export * from "./getGlobal";
3
+ export * from "./wrapFunctionWithCache";
4
+ export * from "./generateStableUniqueKey";
5
+ export * from "./cloneDeep";
@@ -1,17 +1,42 @@
1
- export type AsyncFunction<Args extends any[], T> = (...args: Args) => Promise<T>;
2
- interface Cloneable {
3
- clone(): this;
4
- }
5
- /**
6
- * 类型保护函数,检查一个对象是否实现了 Cloneable 接口
7
- */
8
- export declare function isCloneable(obj: any): obj is Cloneable;
9
- /**
10
- *
11
- * @param value
12
- * @returns boolean
13
- *
14
- * 判断一个变量是否为简单值
15
- */
16
- export declare function isPrimitive(value: any): value is string | number | boolean | null | undefined;
17
- export {};
1
+ /**
2
+ * 异步函数类型。
3
+ *
4
+ * @template Args - 表示函数参数的类型数组。
5
+ * @template T - 表示函数返回的 Promise 解析后的类型。
6
+ *
7
+ * @param args - 函数的参数。
8
+ * @returns 一个 Promise 对象,解析后的值类型为 T。
9
+ */
10
+ export type AsyncFunction<Args extends any[], T> = (...args: Args) => Promise<T>;
11
+ /**
12
+ * 表示一个可以克隆自身的对象接口。
13
+ *
14
+ * @interface Cloneable
15
+ */
16
+ export interface Cloneable {
17
+ /**
18
+ * 创建并返回当前对象的一个副本。
19
+ *
20
+ * @returns {this} 当前对象的一个副本。
21
+ */
22
+ clone(): this;
23
+ }
24
+ /**
25
+ *
26
+ * 检查一个对象是否实现了 Cloneable 接口。
27
+ *
28
+ * 这个函数是一个类型保护函数,它会在类型检查时将传入的对象类型缩小为 Cloneable。
29
+ *
30
+ * @param {any} obj - 要检查的对象。
31
+ * @returns {obj is Cloneable} 如果对象实现了 Cloneable 接口,则返回 true;否则返回 false。
32
+ */
33
+ export declare function isCloneable(obj: any): obj is Cloneable;
34
+ /**
35
+ * 检查一个值是否是原始类型(primitive type)。
36
+ *
37
+ * 这个函数是一个类型保护函数,它会在类型检查时将传入的值类型缩小为原始类型之一:string, number, boolean, null 或 undefined。
38
+ *
39
+ * @param {any} value - 要检查的值。
40
+ * @returns {value is string | number | boolean | null | undefined} 如果值是原始类型,则返回 true;否则返回 false。
41
+ */
42
+ export declare function isPrimitive(value: any): value is string | number | boolean | null | undefined;
@@ -1,11 +1,19 @@
1
- import { AsyncFunction } from './type';
2
- interface Setting {
3
- timeout?: number;
4
- timeoutResult?: any;
5
- identifier?: string;
6
- }
7
- /**
8
- * 给函数包装缓存功能
9
- */
10
- export declare function wrapFunctionWithCache<Args extends any[], T>(func: AsyncFunction<Args, T>, setting?: Setting): AsyncFunction<Args, T>;
11
- export {};
1
+ import { AsyncFunction } from "./type";
2
+ export interface Setting {
3
+ timeout?: number;
4
+ timeoutResult?: any;
5
+ identifier?: string;
6
+ }
7
+ /**
8
+ * 为异步函数添加缓存功能。
9
+ *
10
+ * 该函数根据函数参数、函数名和一个可选的标识符来缓存异步函数的结果。
11
+ * 如果结果已经缓存,则返回缓存的结果。如果函数正在执行中,则等待结果返回,并使用一个超时机制防止无限等待。
12
+ *
13
+ * @template Args - 函数参数的类型。
14
+ * @template Promise<T> - 函数返回值的类型。
15
+ * @param {AsyncFunction<Args, T>} func - 需要包装的异步函数。
16
+ * @param {Setting} [setting=defalutSetting] - 可选的缓存设置。
17
+ * @returns {AsyncFunction<Args, T>} - 带有缓存功能的包装函数,返回类型为 `Promise<T>`。
18
+ */
19
+ export declare function wrapFunctionWithCache<Args extends any[], T>(func: AsyncFunction<Args, T>, setting?: Setting): AsyncFunction<Args, T>;
@@ -0,0 +1,3 @@
1
+ export declare const Config: {
2
+ domClassPrefix: string;
3
+ };
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- function e(e){return"function"==typeof(null==e?void 0:e.clone)}function n(e){return"object"!=typeof e&&"function"!=typeof e&&"symbol"!=typeof e||null===e}function t(e){return n(e)?e+"":JSON.stringify(e,function(e,n){return"object"!=typeof n||null===n||Array.isArray(n)?n:Object.keys(n).sort().reduce(function(e,t){return e[t]=n[t],e},{})})}function r(n){if(null===n||"object"!=typeof n)return n;if(e(n))return n.clone();if(Array.isArray(n)){for(var t=[],o=0;o<n.length;o++)t[o]=r(n[o]);return t}if("object"==typeof n){var i={};for(var u in n)n.hasOwnProperty(u)&&(i[u]=r(n[u]));return i}return n}var o={};function i(e){return o[e]}var u={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};exports.cloneDeep=r,exports.generateDeterministicUniqueKey=t,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.wrapFunctionWithCache=function(n,f){return void 0===f&&(f=u),function(){var l=[].slice.call(arguments),c=t(l)+n.name+(f.identifier||"");if(o[c])return Promise.resolve(r(i(c)));var a=c+"_wl_loading";if(o[a]){var s=Object.assign({},u,f);return new Promise(function(e){var n=Date.now(),t=setInterval(function(){o[c]?(clearInterval(t),e(r(i(c)))):Date.now()-n>s.timeout&&(o[a]=!1,clearInterval(t),e(r(s.timeoutResult)))},100)})}return o[a]=!0,n.apply(void 0,l).then(function(n){return o[c]=n,n&&e(n)?n.clone():o[c]}).catch(function(e){throw e}).finally(function(){o[a]=!1})}};
1
+ function e(e){return"function"==typeof(null==e?void 0:e.clone)}function t(e){var t=typeof e;return null===e||"string"===t||"number"===t||"boolean"===t||"undefined"===t}function n(e){return t(e)?String(e):JSON.stringify(e,function(e,t){return"object"!=typeof t||null===t||Array.isArray(t)?t:Object.keys(t).sort().reduce(function(e,n){return e[n]=t[n],e},{})})}function r(t){if(null===t||"object"!=typeof t)return t;if(e(t))return t.clone();if(Array.isArray(t))return t.map(function(e){return r(e)});var n={};for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(n[o]=r(t[o]));return n}var o={};function i(e){return o[e]}var a={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function l(e,t,n,r){void 0===r&&(r=!1),t in e.style?e.style[t]=n:e.style.setProperty(t,n,r?"important":"")}exports.cloneDeep=r,exports.createElement=function e(t){var n=void 0===t?{}:t,r=n.tag,o=n.children,i=void 0===o?[]:o,a=n.props,c=void 0===a?{}:a,f=n.attrs,s=void 0===f?{}:f,d=n.styles,v=void 0===d?{}:d,p=document.createElement(void 0===r?"div":r);Object.assign(p,c);for(var y=0,b=Object.entries(s);y<b.length;y++){var m=b[y],g=m[1];!1!==g&&p.setAttribute(m[0],g)}for(var h=0,A=Object.entries(v);h<A.length;h++){var w=A[h];l(p,w[0],w[1])}for(var j,x=function(e){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=function(e,t){if(e){if("string"==typeof e)return u(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?u(e,t):void 0}}(e))){t&&(e=t);var n=0;return function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(Array.isArray(i)?i:[i]);!(j=x()).done;){var O=j.value;O&&("object"==typeof O?O instanceof HTMLElement||O instanceof Text?p.appendChild(O):p.appendChild(e(O)):p.appendChild(document.createTextNode(O)))}return p},exports.generateStableUniqueKey=n,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=t,exports.wrapFunctionWithCache=function(e,t){return void 0===t&&(t=a),function(){var u=[].slice.call(arguments),l=n(u)+e.name+(t.identifier||"");if(o[l])return Promise.resolve(r(i(l)));var c=l+"_iun_load_ing";if(o[c]){var f=Object.assign({},a,t);return new Promise(function(e){var t=Date.now(),n=setInterval(function(){o[l]?(clearInterval(n),e(r(i(l)))):Date.now()-t>f.timeout&&(o[c]=!1,clearInterval(n),e(r(f.timeoutResult)))},100)})}return o[c]=!0,e.apply(void 0,u).then(function(e){return o[l]=e,r(o[l])}).catch(function(e){throw e}).finally(function(){o[c]=!1})}};
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/common/type.ts","../src/common/generateDeterministicUniqueKey.ts","../src/common/cloneDeep.ts","../src/common/wrapFunctionWithCache.ts","../src/common/getGlobal.ts"],"sourcesContent":["export type AsyncFunction<Args extends any[], T> = (\n ...args: Args\n) => Promise<T>;\n\ninterface Cloneable {\n clone(): this;\n}\n/**\n * 类型保护函数,检查一个对象是否实现了 Cloneable 接口\n */\nexport function isCloneable(obj: any): obj is Cloneable {\n return typeof obj?.clone === 'function';\n}\n\n/**\n *\n * @param value\n * @returns boolean\n *\n * 判断一个变量是否为简单值\n */\nexport function isPrimitive(\n value: any\n): value is string | number | boolean | null | undefined {\n return (\n (typeof value !== 'object' &&\n typeof value !== 'function' &&\n typeof value !== 'symbol') ||\n value === null\n );\n}\n","import { isPrimitive } from './type';\n/**\n * @private\n * 序列化 api 参数, 相等的对象,返回相同的字符串\n */\nexport function generateDeterministicUniqueKey(params: any) {\n if (isPrimitive(params)) {\n return 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\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 if (Array.isArray(obj)) {\n const newArray: any[] = [];\n for (let i = 0; i < obj.length; i++) {\n newArray[i] = cloneDeep(obj[i]);\n }\n return (newArray as unknown) as T;\n }\n\n if (typeof obj === 'object') {\n const newObj: { [key: string]: any } = {};\n for (let key in obj) {\n if ((obj as any).hasOwnProperty(key)) {\n newObj[key] = cloneDeep(obj[key]);\n }\n }\n return newObj as T;\n }\n\n return obj;\n}\n","// import { getGlobal } from './getGlobal';\nimport { generateDeterministicUniqueKey } from './generateDeterministicUniqueKey';\nimport { cloneDeep } from './cloneDeep';\nimport { isCloneable, AsyncFunction } from './type';\n// const global = getGlobal();\n// if (!global.__wl_fun_api_cache) {\n// global.__wl_fun_api_cache = {};\n// }\n\n// const cache = global.__wl_fun_api_cache;\nconst cache: Record<string, any> = {};\nfunction getCachedData<T = any>(apiKey: string) {\n return cache[apiKey] as T;\n}\n\ninterface Setting {\n timeout?: number;\n timeoutResult?: any;\n identifier?: string;\n}\nconst defalutSetting: Setting = {\n timeout: 60000,\n timeoutResult: { code: 408, msg: '请求超时' },\n identifier: '',\n};\n\n/**\n * 给函数包装缓存功能\n */\n\n\nexport function wrapFunctionWithCache<Args extends any[], T>(\n func: AsyncFunction<Args, T>,\n setting: Setting = defalutSetting\n): AsyncFunction<Args, T> {\n return function(...args: Args): Promise<T> {\n const apiKey: string =\n generateDeterministicUniqueKey(args) +\n func.name +\n (setting.identifier || ''); //缓存key\n\n if (cache[apiKey]) {\n return Promise.resolve(cloneDeep(getCachedData<T>(apiKey)));\n }\n\n const apiLoadingKey: string = apiKey + '_wl_loading'; //缓存loading key\n\n if (cache[apiLoadingKey]) {\n const _setting = Object.assign({}, defalutSetting, setting);\n return new Promise(resolve => {\n const startTime = Date.now();\n const timer = setInterval(() => {\n if (cache[apiKey]) {\n clearInterval(timer);\n resolve(cloneDeep(getCachedData<T>(apiKey)));\n } else if (Date.now() - startTime > _setting.timeout!) {\n cache[apiLoadingKey] = false;\n clearInterval(timer);\n resolve(cloneDeep(_setting.timeoutResult));\n }\n }, 100);\n });\n }\n cache[apiLoadingKey] = true;\n\n return func(...args)\n .then(res => {\n // 缓存原始数据,或者clone数据,不能return 同一份数据,会被释放\n cache[apiKey] = res;\n if (res && isCloneable(res)) {\n // fetch 缓存,不能把原始数据return,否则会被释放\n return res.clone();\n }\n return cache[apiKey];\n })\n .catch((error: any) => {\n throw error;\n })\n .finally(() => {\n cache[apiLoadingKey] = false;\n });\n };\n}\n","declare var global: typeof globalThis;\n\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"],"names":["isCloneable","obj","clone","isPrimitive","value","generateDeterministicUniqueKey","params","JSON","stringify","_key","Array","isArray","Object","keys","sort","reduce","pre","cur","cloneDeep","newArray","i","length","newObj","key","hasOwnProperty","cache","getCachedData","apiKey","defalutSetting","timeout","timeoutResult","code","msg","identifier","globalThis","self","window","global","this","func","setting","args","slice","call","arguments","name","Promise","resolve","apiLoadingKey","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","apply","then","res","error"],"mappings":"AAUM,SAAUA,EAAYC,GAC1B,MAA6B,yBAAfA,SAAAA,EAAKC,MACrB,CASM,SAAUC,EACdC,GAEA,MACoB,iBAAVA,GACW,mBAAVA,GACU,iBAAVA,GACC,OAAVA,CAEJ,CCzBgB,SAAAC,EAA+BC,GAC7C,OAAIH,EAAYG,GACPA,EAAS,GAEXC,KAAKC,UAAUF,EAAQ,SAASG,EAAuBL,GAC5D,MAAqB,iBAAVA,GAAgC,OAAVA,GAAmBM,MAAMC,QAAQP,GAQ3DA,EAPEQ,OAAOC,KAAKT,GAChBU,OACAC,OAAO,SAACC,EAAUC,GAEjB,OADAD,EAAIC,GAAOb,EAAMa,GACVD,CACT,EAAG,CAAE,EAGX,EACF,CClBgB,SAAAE,EAAajB,GAC3B,GAAY,OAARA,GAA+B,iBAARA,EACzB,OAAOA,EAGT,GAAGD,EAAYC,GACb,OAAOA,EAAIC,QAGb,GAAIQ,MAAMC,QAAQV,GAAM,CAEtB,IADA,IAAMkB,EAAkB,GACfC,EAAI,EAAGA,EAAInB,EAAIoB,OAAQD,IAC9BD,EAASC,GAAKF,EAAUjB,EAAImB,IAE9B,OAAQD,CACT,CAED,GAAmB,iBAARlB,EAAkB,CAC3B,IAAMqB,EAAiC,CAAE,EACzC,IAAK,IAAIC,KAAOtB,EACTA,EAAYuB,eAAeD,KAC9BD,EAAOC,GAAOL,EAAUjB,EAAIsB,KAGhC,OAAOD,CACR,CAED,OAAOrB,CACT,CCpBA,IAAMwB,EAA6B,CAAE,EACrC,SAASC,EAAuBC,GAC9B,OAAOF,EAAME,EACf,CAOA,IAAMC,EAA0B,CAC9BC,QAAS,IACTC,cAAe,CAAEC,KAAM,IAAKC,IAAK,QACjCC,WAAY,8FCnBZ,MAA0B,oBAAfC,WACFA,WAGW,oBAATC,KACFA,KAGa,oBAAXC,OACFA,OAGa,oBAAXC,OACFA,OAKXC,IAAA,qFDUEC,EACAC,GAEA,gBAFAA,IAAAA,EAAmBZ,GAEZ,eAAYa,EAAUC,GAAAA,MAAAC,KAAAC,WACrBjB,EACJtB,EAA+BoC,GAC/BF,EAAKM,MACJL,EAAQP,YAAc,IAEzB,GAAIR,EAAME,GACR,OAAOmB,QAAQC,QAAQ7B,EAAUQ,EAAiBC,KAGpD,IAAMqB,EAAwBrB,EAAS,cAEvC,GAAIF,EAAMuB,GAAgB,CACxB,IAAMC,EAAWrC,OAAOsC,OAAO,CAAA,EAAItB,EAAgBY,GACnD,WAAWM,QAAQ,SAAAC,GACjB,IAAMI,EAAYC,KAAKC,MACjBC,EAAQC,YAAY,WACpB9B,EAAME,IACR6B,cAAcF,GACdP,EAAQ7B,EAAUQ,EAAiBC,MAC1ByB,KAAKC,MAAQF,EAAYF,EAASpB,UAC3CJ,EAAMuB,IAAiB,EACvBQ,cAAcF,GACdP,EAAQ7B,EAAU+B,EAASnB,gBAE/B,EAAG,IACL,EACD,CAGD,OAFAL,EAAMuB,IAAiB,EAEhBT,EAAIkB,aAAIhB,GACZiB,KAAK,SAAAC,GAGJ,OADAlC,EAAME,GAAUgC,EACZA,GAAO3D,EAAY2D,GAEdA,EAAIzD,QAENuB,EAAME,EACf,SACO,SAACiC,GACN,MAAMA,CACR,WACS,WACPnC,EAAMuB,IAAiB,CACzB,EACJ,CACF"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/common/type.ts","../src/common/generateStableUniqueKey.ts","../src/common/cloneDeep.ts","../src/common/wrapFunctionWithCache.ts","../src/browser/dom.ts","../src/common/getGlobal.ts"],"sourcesContent":["/**\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 ...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","import { generateStableUniqueKey } from \"./generateStableUniqueKey\";\nimport { cloneDeep } from \"./cloneDeep\";\nimport { AsyncFunction } from \"./type\";\n\nconst cache: Record<string, any> = {};\nfunction getCachedData<T = any>(apiKey: string) {\n return cache[apiKey] as T;\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 wrapFunctionWithCache<Args extends any[], T>(\n func: AsyncFunction<Args, T>,\n setting: Setting = defalutSetting\n): AsyncFunction<Args, T> {\n return function (...args: Args): Promise<T> {\n const apiKey: string =\n generateStableUniqueKey(args) + func.name + (setting.identifier || \"\"); //缓存key\n\n if (cache[apiKey]) {\n return Promise.resolve(cloneDeep(getCachedData<T>(apiKey)));\n }\n\n const apiLoadingKey: string = apiKey + \"_iun_load_ing\"; //缓存loading key\n\n if (cache[apiLoadingKey]) {\n const _setting = Object.assign({}, defalutSetting, setting);\n return new Promise((resolve) => {\n const startTime = Date.now();\n const timer = setInterval(() => {\n if (cache[apiKey]) {\n clearInterval(timer);\n resolve(cloneDeep(getCachedData<T>(apiKey)));\n } else if (Date.now() - startTime > _setting.timeout!) {\n cache[apiLoadingKey] = false;\n clearInterval(timer);\n resolve(cloneDeep(_setting.timeoutResult));\n }\n }, 100);\n });\n }\n cache[apiLoadingKey] = true;\n\n return func(...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 cache[apiLoadingKey] = false;\n });\n };\n}\n","/**\n * 表示 DOM 中可能的子元素类型。\n */\nexport type ChildrenType = DomOptionsType | HTMLElement | Text | 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>;\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,\n property: string,\n value: string,\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, 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 HTMLElement || child instanceof Text) {\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","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"],"names":["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","cache","getCachedData","apiKey","defalutSetting","timeout","timeoutResult","code","msg","identifier","setStyle","element","property","important","style","setProperty","createElement","_temp","_ref","_ref$tag","tag","_ref$children","children","_ref$props","props","_ref$attrs","attrs","_ref$styles","styles","ele","document","assign","_i","_Object$entries","entries","length","_Object$entries$_i","setAttribute","_i2","_Object$entries2","_Object$entries2$_i","_step","_iterator","_createForOfIteratorHelperLoose","done","child","HTMLElement","Text","appendChild","createTextNode","globalThis","self","window","global","this","func","setting","args","slice","arguments","name","Promise","resolve","apiLoadingKey","_setting","startTime","Date","now","timer","setInterval","clearInterval","apply","then","res","error"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1 +1,3 @@
1
- export * from "./common";
1
+ export * from "./common/index";
2
+ export * from "./browser/index";
3
+ export * from "./node/index";
@@ -1,2 +1,2 @@
1
- function e(e){return"function"==typeof(null==e?void 0:e.clone)}function t(e){return"object"!=typeof e&&"function"!=typeof e&&"symbol"!=typeof e||null===e}function n(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this}function o(e){return t(e)?e+"":JSON.stringify(e,function(e,t){return"object"!=typeof t||null===t||Array.isArray(t)?t:Object.keys(t).sort().reduce((e,n)=>(e[n]=t[n],e),{})})}function r(t){if(null===t||"object"!=typeof t)return t;if(e(t))return t.clone();if(Array.isArray(t)){const e=[];for(let n=0;n<t.length;n++)e[n]=r(t[n]);return e}if("object"==typeof t){const e={};for(let n in t)t.hasOwnProperty(n)&&(e[n]=r(t[n]));return e}return t}const i={};function u(e){return i[e]}const f={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};function l(t,n=f){return function(...l){const c=o(l)+t.name+(n.identifier||"");if(i[c])return Promise.resolve(r(u(c)));const s=c+"_wl_loading";if(i[s]){const e=Object.assign({},f,n);return new Promise(t=>{const n=Date.now(),o=setInterval(()=>{i[c]?(clearInterval(o),t(r(u(c)))):Date.now()-n>e.timeout&&(i[s]=!1,clearInterval(o),t(r(e.timeoutResult)))},100)})}return i[s]=!0,t(...l).then(t=>(i[c]=t,t&&e(t)?t.clone():i[c])).catch(e=>{throw e}).finally(()=>{i[s]=!1})}}export{r as cloneDeep,o as generateDeterministicUniqueKey,n as getGlobal,e as isCloneable,t as isPrimitive,l as wrapFunctionWithCache};
1
+ function t(t){return"function"==typeof(null==t?void 0:t.clone)}function e(t){const e=typeof t;return null===t||"string"===e||"number"===e||"boolean"===e||"undefined"===e}function n(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this}function o(t){return e(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 r(e){if(null===e||"object"!=typeof e)return e;if(t(e))return e.clone();if(Array.isArray(e))return e.map(t=>r(t));const n={};for(const t in e)Object.prototype.hasOwnProperty.call(e,t)&&(n[t]=r(e[t]));return n}const i={};function c(t){return i[t]}const s={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};function u(t,e=s){return function(...n){const u=o(n)+t.name+(e.identifier||"");if(i[u])return Promise.resolve(r(c(u)));const f=u+"_iun_load_ing";if(i[f]){const t=Object.assign({},s,e);return new Promise(e=>{const n=Date.now(),o=setInterval(()=>{i[u]?(clearInterval(o),e(r(c(u)))):Date.now()-n>t.timeout&&(i[f]=!1,clearInterval(o),e(r(t.timeoutResult)))},100)})}return i[f]=!0,t(...n).then(t=>(i[u]=t,r(i[u]))).catch(t=>{throw t}).finally(()=>{i[f]=!1})}}function f(t,e,n,o=!1){e in t.style?t.style[e]=n:t.style.setProperty(e,n,o?"important":"")}function l({tag:t="div",children:e=[],props:n={},attrs:o={},styles:r={}}={}){const i=document.createElement(t);Object.assign(i,n);for(const[t,e]of Object.entries(o))!1!==e&&i.setAttribute(t,e);for(const[t,e]of Object.entries(r))f(i,t,e);const c=Array.isArray(e)?e:[e];for(const t of c)t&&("object"==typeof t?t instanceof HTMLElement||t instanceof Text?i.appendChild(t):i.appendChild(l(t)):i.appendChild(document.createTextNode(t)));return i}export{r as cloneDeep,l as createElement,o as generateStableUniqueKey,n as getGlobal,t as isCloneable,e as isPrimitive,u as wrapFunctionWithCache};
2
2
  //# sourceMappingURL=index.modern.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.modern.js","sources":["../src/common/type.ts","../src/common/getGlobal.ts","../src/common/generateDeterministicUniqueKey.ts","../src/common/cloneDeep.ts","../src/common/wrapFunctionWithCache.ts"],"sourcesContent":["export type AsyncFunction<Args extends any[], T> = (\n ...args: Args\n) => Promise<T>;\n\ninterface Cloneable {\n clone(): this;\n}\n/**\n * 类型保护函数,检查一个对象是否实现了 Cloneable 接口\n */\nexport function isCloneable(obj: any): obj is Cloneable {\n return typeof obj?.clone === 'function';\n}\n\n/**\n *\n * @param value\n * @returns boolean\n *\n * 判断一个变量是否为简单值\n */\nexport function isPrimitive(\n value: any\n): value is string | number | boolean | null | undefined {\n return (\n (typeof value !== 'object' &&\n typeof value !== 'function' &&\n typeof value !== 'symbol') ||\n value === null\n );\n}\n","declare var global: typeof globalThis;\n\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 * @private\n * 序列化 api 参数, 相等的对象,返回相同的字符串\n */\nexport function generateDeterministicUniqueKey(params: any) {\n if (isPrimitive(params)) {\n return 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\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 if (Array.isArray(obj)) {\n const newArray: any[] = [];\n for (let i = 0; i < obj.length; i++) {\n newArray[i] = cloneDeep(obj[i]);\n }\n return (newArray as unknown) as T;\n }\n\n if (typeof obj === 'object') {\n const newObj: { [key: string]: any } = {};\n for (let key in obj) {\n if ((obj as any).hasOwnProperty(key)) {\n newObj[key] = cloneDeep(obj[key]);\n }\n }\n return newObj as T;\n }\n\n return obj;\n}\n","// import { getGlobal } from './getGlobal';\nimport { generateDeterministicUniqueKey } from './generateDeterministicUniqueKey';\nimport { cloneDeep } from './cloneDeep';\nimport { isCloneable, AsyncFunction } from './type';\n// const global = getGlobal();\n// if (!global.__wl_fun_api_cache) {\n// global.__wl_fun_api_cache = {};\n// }\n\n// const cache = global.__wl_fun_api_cache;\nconst cache: Record<string, any> = {};\nfunction getCachedData<T = any>(apiKey: string) {\n return cache[apiKey] as T;\n}\n\ninterface Setting {\n timeout?: number;\n timeoutResult?: any;\n identifier?: string;\n}\nconst defalutSetting: Setting = {\n timeout: 60000,\n timeoutResult: { code: 408, msg: '请求超时' },\n identifier: '',\n};\n\n/**\n * 给函数包装缓存功能\n */\n\n\nexport function wrapFunctionWithCache<Args extends any[], T>(\n func: AsyncFunction<Args, T>,\n setting: Setting = defalutSetting\n): AsyncFunction<Args, T> {\n return function(...args: Args): Promise<T> {\n const apiKey: string =\n generateDeterministicUniqueKey(args) +\n func.name +\n (setting.identifier || ''); //缓存key\n\n if (cache[apiKey]) {\n return Promise.resolve(cloneDeep(getCachedData<T>(apiKey)));\n }\n\n const apiLoadingKey: string = apiKey + '_wl_loading'; //缓存loading key\n\n if (cache[apiLoadingKey]) {\n const _setting = Object.assign({}, defalutSetting, setting);\n return new Promise(resolve => {\n const startTime = Date.now();\n const timer = setInterval(() => {\n if (cache[apiKey]) {\n clearInterval(timer);\n resolve(cloneDeep(getCachedData<T>(apiKey)));\n } else if (Date.now() - startTime > _setting.timeout!) {\n cache[apiLoadingKey] = false;\n clearInterval(timer);\n resolve(cloneDeep(_setting.timeoutResult));\n }\n }, 100);\n });\n }\n cache[apiLoadingKey] = true;\n\n return func(...args)\n .then(res => {\n // 缓存原始数据,或者clone数据,不能return 同一份数据,会被释放\n cache[apiKey] = res;\n if (res && isCloneable(res)) {\n // fetch 缓存,不能把原始数据return,否则会被释放\n return res.clone();\n }\n return cache[apiKey];\n })\n .catch((error: any) => {\n throw error;\n })\n .finally(() => {\n cache[apiLoadingKey] = false;\n });\n };\n}\n"],"names":["isCloneable","obj","clone","isPrimitive","value","getGlobal","globalThis","self","window","global","this","generateDeterministicUniqueKey","params","JSON","stringify","_key","Array","isArray","Object","keys","sort","reduce","pre","cur","cloneDeep","newArray","i","length","newObj","key","hasOwnProperty","cache","getCachedData","apiKey","defalutSetting","timeout","timeoutResult","code","msg","identifier","wrapFunctionWithCache","func","setting","args","name","Promise","resolve","apiLoadingKey","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","then","res","catch","error","finally"],"mappings":"AAUM,SAAUA,EAAYC,GAC1B,MAA6B,yBAAfA,SAAAA,EAAKC,MACrB,CASM,SAAUC,EACdC,GAEA,MACoB,iBAAVA,GACW,mBAAVA,GACU,iBAAVA,GACC,OAAVA,CAEJ,UC3BgBC,IACd,MAA0B,oBAAfC,WACFA,WAGW,oBAATC,KACFA,KAGa,oBAAXC,OACFA,OAGa,oBAAXC,OACFA,OAKXC,IAAA,CCjBgB,SAAAC,EAA+BC,GAC7C,OAAIT,EAAYS,GACPA,EAAS,GAEXC,KAAKC,UAAUF,EAAQ,SAASG,EAAuBX,GAC5D,MAAqB,iBAAVA,GAAgC,OAAVA,GAAmBY,MAAMC,QAAQb,GAQ3DA,EAPEc,OAAOC,KAAKf,GAChBgB,OACAC,OAAO,CAACC,EAAUC,KACjBD,EAAIC,GAAOnB,EAAMmB,GACVD,GACN,CAAE,EAGX,EACF,CClBgB,SAAAE,EAAavB,GAC3B,GAAY,OAARA,GAA+B,iBAARA,EACzB,OAAOA,EAGT,GAAGD,EAAYC,GACb,OAAOA,EAAIC,QAGb,GAAIc,MAAMC,QAAQhB,GAAM,CACtB,MAAMwB,EAAkB,GACxB,IAAK,IAAIC,EAAI,EAAGA,EAAIzB,EAAI0B,OAAQD,IAC9BD,EAASC,GAAKF,EAAUvB,EAAIyB,IAE9B,OAAQD,CACT,CAED,GAAmB,iBAARxB,EAAkB,CAC3B,MAAM2B,EAAiC,CAAE,EACzC,IAAK,IAAIC,KAAO5B,EACTA,EAAY6B,eAAeD,KAC9BD,EAAOC,GAAOL,EAAUvB,EAAI4B,KAGhC,OAAOD,CACR,CAED,OAAO3B,CACT,CCpBA,MAAM8B,EAA6B,CAAE,EACrC,SAASC,EAAuBC,GAC9B,OAAOF,EAAME,EACf,CAOA,MAAMC,EAA0B,CAC9BC,QAAS,IACTC,cAAe,CAAEC,KAAM,IAAKC,IAAK,QACjCC,WAAY,aAQEC,EACdC,EACAC,EAAmBR,GAEnB,OAAgB,YAAGS,GACjB,MAAMV,EACJtB,EAA+BgC,GAC/BF,EAAKG,MACJF,EAAQH,YAAc,IAEzB,GAAIR,EAAME,GACR,OAAOY,QAAQC,QAAQtB,EAAUQ,EAAiBC,KAGpD,MAAMc,EAAwBd,EAAS,cAEvC,GAAIF,EAAMgB,GAAgB,CACxB,MAAMC,EAAW9B,OAAO+B,OAAO,CAAA,EAAIf,EAAgBQ,GACnD,OAAO,IAAIG,QAAQC,IACjB,MAAMI,EAAYC,KAAKC,MACjBC,EAAQC,YAAY,KACpBvB,EAAME,IACRsB,cAAcF,GACdP,EAAQtB,EAAUQ,EAAiBC,MAC1BkB,KAAKC,MAAQF,EAAYF,EAASb,UAC3CJ,EAAMgB,IAAiB,EACvBQ,cAAcF,GACdP,EAAQtB,EAAUwB,EAASZ,gBAC5B,EACA,IACL,EACD,CAGD,OAFAL,EAAMgB,IAAiB,EAEhBN,KAAQE,GACZa,KAAKC,IAEJ1B,EAAME,GAAUwB,EACZA,GAAOzD,EAAYyD,GAEdA,EAAIvD,QAEN6B,EAAME,KAEdyB,MAAOC,IACN,MAAMA,IAEPC,QAAQ,KACP7B,EAAMgB,IAAiB,CACzB,EACJ,CACF"}
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/wrapFunctionWithCache.ts","../src/browser/dom.ts"],"sourcesContent":["/**\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 ...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","import { generateStableUniqueKey } from \"./generateStableUniqueKey\";\nimport { cloneDeep } from \"./cloneDeep\";\nimport { AsyncFunction } from \"./type\";\n\nconst cache: Record<string, any> = {};\nfunction getCachedData<T = any>(apiKey: string) {\n return cache[apiKey] as T;\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 wrapFunctionWithCache<Args extends any[], T>(\n func: AsyncFunction<Args, T>,\n setting: Setting = defalutSetting\n): AsyncFunction<Args, T> {\n return function (...args: Args): Promise<T> {\n const apiKey: string =\n generateStableUniqueKey(args) + func.name + (setting.identifier || \"\"); //缓存key\n\n if (cache[apiKey]) {\n return Promise.resolve(cloneDeep(getCachedData<T>(apiKey)));\n }\n\n const apiLoadingKey: string = apiKey + \"_iun_load_ing\"; //缓存loading key\n\n if (cache[apiLoadingKey]) {\n const _setting = Object.assign({}, defalutSetting, setting);\n return new Promise((resolve) => {\n const startTime = Date.now();\n const timer = setInterval(() => {\n if (cache[apiKey]) {\n clearInterval(timer);\n resolve(cloneDeep(getCachedData<T>(apiKey)));\n } else if (Date.now() - startTime > _setting.timeout!) {\n cache[apiLoadingKey] = false;\n clearInterval(timer);\n resolve(cloneDeep(_setting.timeoutResult));\n }\n }, 100);\n });\n }\n cache[apiLoadingKey] = true;\n\n return func(...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 cache[apiLoadingKey] = false;\n });\n };\n}\n","/**\n * 表示 DOM 中可能的子元素类型。\n */\nexport type ChildrenType = DomOptionsType | HTMLElement | Text | 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>;\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,\n property: string,\n value: string,\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, 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 HTMLElement || child instanceof Text) {\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"],"names":["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","cache","getCachedData","apiKey","defalutSetting","timeout","timeoutResult","code","msg","identifier","wrapFunctionWithCache","func","setting","args","name","Promise","resolve","apiLoadingKey","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","then","res","catch","error","finally","setStyle","element","property","important","style","setProperty","createElement","tag","children","props","attrs","styles","ele","document","entries","setAttribute","childArray","child","HTMLElement","Text","appendChild","createTextNode"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- function n(n){return"function"==typeof(null==n?void 0:n.clone)}function e(n){return"object"!=typeof n&&"function"!=typeof n&&"symbol"!=typeof n||null===n}function t(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this}function r(n){return e(n)?n+"":JSON.stringify(n,function(n,e){return"object"!=typeof e||null===e||Array.isArray(e)?e:Object.keys(e).sort().reduce(function(n,t){return n[t]=e[t],n},{})})}function o(e){if(null===e||"object"!=typeof e)return e;if(n(e))return e.clone();if(Array.isArray(e)){for(var t=[],r=0;r<e.length;r++)t[r]=o(e[r]);return t}if("object"==typeof e){var i={};for(var u in e)e.hasOwnProperty(u)&&(i[u]=o(e[u]));return i}return e}var i={};function u(n){return i[n]}var f={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};function l(e,t){return void 0===t&&(t=f),function(){var l=[].slice.call(arguments),c=r(l)+e.name+(t.identifier||"");if(i[c])return Promise.resolve(o(u(c)));var a=c+"_wl_loading";if(i[a]){var s=Object.assign({},f,t);return new Promise(function(n){var e=Date.now(),t=setInterval(function(){i[c]?(clearInterval(t),n(o(u(c)))):Date.now()-e>s.timeout&&(i[a]=!1,clearInterval(t),n(o(s.timeoutResult)))},100)})}return i[a]=!0,e.apply(void 0,l).then(function(e){return i[c]=e,e&&n(e)?e.clone():i[c]}).catch(function(n){throw n}).finally(function(){i[a]=!1})}}export{o as cloneDeep,r as generateDeterministicUniqueKey,t as getGlobal,n as isCloneable,e as isPrimitive,l as wrapFunctionWithCache};
1
+ function e(e){return"function"==typeof(null==e?void 0:e.clone)}function t(e){var t=typeof e;return null===e||"string"===t||"number"===t||"boolean"===t||"undefined"===t}function n(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this}function r(e){return t(e)?String(e):JSON.stringify(e,function(e,t){return"object"!=typeof t||null===t||Array.isArray(t)?t:Object.keys(t).sort().reduce(function(e,n){return e[n]=t[n],e},{})})}function o(t){if(null===t||"object"!=typeof t)return t;if(e(t))return t.clone();if(Array.isArray(t))return t.map(function(e){return o(e)});var n={};for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=o(t[r]));return n}var i={};function a(e){return i[e]}var u={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};function l(e,t){return void 0===t&&(t=u),function(){var n=[].slice.call(arguments),l=r(n)+e.name+(t.identifier||"");if(i[l])return Promise.resolve(o(a(l)));var f=l+"_iun_load_ing";if(i[f]){var c=Object.assign({},u,t);return new Promise(function(e){var t=Date.now(),n=setInterval(function(){i[l]?(clearInterval(n),e(o(a(l)))):Date.now()-t>c.timeout&&(i[f]=!1,clearInterval(n),e(o(c.timeoutResult)))},100)})}return i[f]=!0,e.apply(void 0,n).then(function(e){return i[l]=e,o(i[l])}).catch(function(e){throw e}).finally(function(){i[f]=!1})}}function f(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function c(e,t,n,r){void 0===r&&(r=!1),t in e.style?e.style[t]=n:e.style.setProperty(t,n,r?"important":"")}function d(e){var t=void 0===e?{}:e,n=t.tag,r=t.children,o=void 0===r?[]:r,i=t.props,a=void 0===i?{}:i,u=t.attrs,l=void 0===u?{}:u,s=t.styles,v=void 0===s?{}:s,y=document.createElement(void 0===n?"div":n);Object.assign(y,a);for(var p=0,b=Object.entries(l);p<b.length;p++){var m=b[p],g=m[1];!1!==g&&y.setAttribute(m[0],g)}for(var h=0,A=Object.entries(v);h<A.length;h++){var j=A[h];c(y,j[0],j[1])}for(var w,O=function(e){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=function(e,t){if(e){if("string"==typeof e)return f(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?f(e,t):void 0}}(e))){t&&(e=t);var n=0;return function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(Array.isArray(o)?o:[o]);!(w=O()).done;){var S=w.value;S&&("object"==typeof S?S instanceof HTMLElement||S instanceof Text?y.appendChild(S):y.appendChild(d(S)):y.appendChild(document.createTextNode(S)))}return y}export{o as cloneDeep,d as createElement,r as generateStableUniqueKey,n as getGlobal,e as isCloneable,t as isPrimitive,l as wrapFunctionWithCache};
2
2
  //# sourceMappingURL=index.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.module.js","sources":["../src/common/type.ts","../src/common/getGlobal.ts","../src/common/generateDeterministicUniqueKey.ts","../src/common/cloneDeep.ts","../src/common/wrapFunctionWithCache.ts"],"sourcesContent":["export type AsyncFunction<Args extends any[], T> = (\n ...args: Args\n) => Promise<T>;\n\ninterface Cloneable {\n clone(): this;\n}\n/**\n * 类型保护函数,检查一个对象是否实现了 Cloneable 接口\n */\nexport function isCloneable(obj: any): obj is Cloneable {\n return typeof obj?.clone === 'function';\n}\n\n/**\n *\n * @param value\n * @returns boolean\n *\n * 判断一个变量是否为简单值\n */\nexport function isPrimitive(\n value: any\n): value is string | number | boolean | null | undefined {\n return (\n (typeof value !== 'object' &&\n typeof value !== 'function' &&\n typeof value !== 'symbol') ||\n value === null\n );\n}\n","declare var global: typeof globalThis;\n\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 * @private\n * 序列化 api 参数, 相等的对象,返回相同的字符串\n */\nexport function generateDeterministicUniqueKey(params: any) {\n if (isPrimitive(params)) {\n return 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\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 if (Array.isArray(obj)) {\n const newArray: any[] = [];\n for (let i = 0; i < obj.length; i++) {\n newArray[i] = cloneDeep(obj[i]);\n }\n return (newArray as unknown) as T;\n }\n\n if (typeof obj === 'object') {\n const newObj: { [key: string]: any } = {};\n for (let key in obj) {\n if ((obj as any).hasOwnProperty(key)) {\n newObj[key] = cloneDeep(obj[key]);\n }\n }\n return newObj as T;\n }\n\n return obj;\n}\n","// import { getGlobal } from './getGlobal';\nimport { generateDeterministicUniqueKey } from './generateDeterministicUniqueKey';\nimport { cloneDeep } from './cloneDeep';\nimport { isCloneable, AsyncFunction } from './type';\n// const global = getGlobal();\n// if (!global.__wl_fun_api_cache) {\n// global.__wl_fun_api_cache = {};\n// }\n\n// const cache = global.__wl_fun_api_cache;\nconst cache: Record<string, any> = {};\nfunction getCachedData<T = any>(apiKey: string) {\n return cache[apiKey] as T;\n}\n\ninterface Setting {\n timeout?: number;\n timeoutResult?: any;\n identifier?: string;\n}\nconst defalutSetting: Setting = {\n timeout: 60000,\n timeoutResult: { code: 408, msg: '请求超时' },\n identifier: '',\n};\n\n/**\n * 给函数包装缓存功能\n */\n\n\nexport function wrapFunctionWithCache<Args extends any[], T>(\n func: AsyncFunction<Args, T>,\n setting: Setting = defalutSetting\n): AsyncFunction<Args, T> {\n return function(...args: Args): Promise<T> {\n const apiKey: string =\n generateDeterministicUniqueKey(args) +\n func.name +\n (setting.identifier || ''); //缓存key\n\n if (cache[apiKey]) {\n return Promise.resolve(cloneDeep(getCachedData<T>(apiKey)));\n }\n\n const apiLoadingKey: string = apiKey + '_wl_loading'; //缓存loading key\n\n if (cache[apiLoadingKey]) {\n const _setting = Object.assign({}, defalutSetting, setting);\n return new Promise(resolve => {\n const startTime = Date.now();\n const timer = setInterval(() => {\n if (cache[apiKey]) {\n clearInterval(timer);\n resolve(cloneDeep(getCachedData<T>(apiKey)));\n } else if (Date.now() - startTime > _setting.timeout!) {\n cache[apiLoadingKey] = false;\n clearInterval(timer);\n resolve(cloneDeep(_setting.timeoutResult));\n }\n }, 100);\n });\n }\n cache[apiLoadingKey] = true;\n\n return func(...args)\n .then(res => {\n // 缓存原始数据,或者clone数据,不能return 同一份数据,会被释放\n cache[apiKey] = res;\n if (res && isCloneable(res)) {\n // fetch 缓存,不能把原始数据return,否则会被释放\n return res.clone();\n }\n return cache[apiKey];\n })\n .catch((error: any) => {\n throw error;\n })\n .finally(() => {\n cache[apiLoadingKey] = false;\n });\n };\n}\n"],"names":["isCloneable","obj","clone","isPrimitive","value","getGlobal","globalThis","self","window","global","this","generateDeterministicUniqueKey","params","JSON","stringify","_key","Array","isArray","Object","keys","sort","reduce","pre","cur","cloneDeep","newArray","i","length","newObj","key","hasOwnProperty","cache","getCachedData","apiKey","defalutSetting","timeout","timeoutResult","code","msg","identifier","wrapFunctionWithCache","func","setting","args","slice","call","arguments","name","Promise","resolve","apiLoadingKey","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","apply","then","res","error"],"mappings":"AAUM,SAAUA,EAAYC,GAC1B,MAA6B,yBAAfA,SAAAA,EAAKC,MACrB,CASM,SAAUC,EACdC,GAEA,MACoB,iBAAVA,GACW,mBAAVA,GACU,iBAAVA,GACC,OAAVA,CAEJ,UC3BgBC,IACd,MAA0B,oBAAfC,WACFA,WAGW,oBAATC,KACFA,KAGa,oBAAXC,OACFA,OAGa,oBAAXC,OACFA,OAKXC,IAAA,CCjBgB,SAAAC,EAA+BC,GAC7C,OAAIT,EAAYS,GACPA,EAAS,GAEXC,KAAKC,UAAUF,EAAQ,SAASG,EAAuBX,GAC5D,MAAqB,iBAAVA,GAAgC,OAAVA,GAAmBY,MAAMC,QAAQb,GAQ3DA,EAPEc,OAAOC,KAAKf,GAChBgB,OACAC,OAAO,SAACC,EAAUC,GAEjB,OADAD,EAAIC,GAAOnB,EAAMmB,GACVD,CACT,EAAG,CAAE,EAGX,EACF,CClBgB,SAAAE,EAAavB,GAC3B,GAAY,OAARA,GAA+B,iBAARA,EACzB,OAAOA,EAGT,GAAGD,EAAYC,GACb,OAAOA,EAAIC,QAGb,GAAIc,MAAMC,QAAQhB,GAAM,CAEtB,IADA,IAAMwB,EAAkB,GACfC,EAAI,EAAGA,EAAIzB,EAAI0B,OAAQD,IAC9BD,EAASC,GAAKF,EAAUvB,EAAIyB,IAE9B,OAAQD,CACT,CAED,GAAmB,iBAARxB,EAAkB,CAC3B,IAAM2B,EAAiC,CAAE,EACzC,IAAK,IAAIC,KAAO5B,EACTA,EAAY6B,eAAeD,KAC9BD,EAAOC,GAAOL,EAAUvB,EAAI4B,KAGhC,OAAOD,CACR,CAED,OAAO3B,CACT,CCpBA,IAAM8B,EAA6B,CAAE,EACrC,SAASC,EAAuBC,GAC9B,OAAOF,EAAME,EACf,CAOA,IAAMC,EAA0B,CAC9BC,QAAS,IACTC,cAAe,CAAEC,KAAM,IAAKC,IAAK,QACjCC,WAAY,aAQEC,EACdC,EACAC,GAEA,gBAFAA,IAAAA,EAAmBR,GAEZ,eAAYS,EAAUC,GAAAA,MAAAC,KAAAC,WACrBb,EACJtB,EAA+BgC,GAC/BF,EAAKM,MACJL,EAAQH,YAAc,IAEzB,GAAIR,EAAME,GACR,OAAOe,QAAQC,QAAQzB,EAAUQ,EAAiBC,KAGpD,IAAMiB,EAAwBjB,EAAS,cAEvC,GAAIF,EAAMmB,GAAgB,CACxB,IAAMC,EAAWjC,OAAOkC,OAAO,CAAA,EAAIlB,EAAgBQ,GACnD,WAAWM,QAAQ,SAAAC,GACjB,IAAMI,EAAYC,KAAKC,MACjBC,EAAQC,YAAY,WACpB1B,EAAME,IACRyB,cAAcF,GACdP,EAAQzB,EAAUQ,EAAiBC,MAC1BqB,KAAKC,MAAQF,EAAYF,EAAShB,UAC3CJ,EAAMmB,IAAiB,EACvBQ,cAAcF,GACdP,EAAQzB,EAAU2B,EAASf,gBAE/B,EAAG,IACL,EACD,CAGD,OAFAL,EAAMmB,IAAiB,EAEhBT,EAAIkB,aAAIhB,GACZiB,KAAK,SAAAC,GAGJ,OADA9B,EAAME,GAAU4B,EACZA,GAAO7D,EAAY6D,GAEdA,EAAI3D,QAEN6B,EAAME,EACf,SACO,SAAC6B,GACN,MAAMA,CACR,WACS,WACP/B,EAAMmB,IAAiB,CACzB,EACJ,CACF"}
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/wrapFunctionWithCache.ts","../src/browser/dom.ts"],"sourcesContent":["/**\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 ...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","import { generateStableUniqueKey } from \"./generateStableUniqueKey\";\nimport { cloneDeep } from \"./cloneDeep\";\nimport { AsyncFunction } from \"./type\";\n\nconst cache: Record<string, any> = {};\nfunction getCachedData<T = any>(apiKey: string) {\n return cache[apiKey] as T;\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 wrapFunctionWithCache<Args extends any[], T>(\n func: AsyncFunction<Args, T>,\n setting: Setting = defalutSetting\n): AsyncFunction<Args, T> {\n return function (...args: Args): Promise<T> {\n const apiKey: string =\n generateStableUniqueKey(args) + func.name + (setting.identifier || \"\"); //缓存key\n\n if (cache[apiKey]) {\n return Promise.resolve(cloneDeep(getCachedData<T>(apiKey)));\n }\n\n const apiLoadingKey: string = apiKey + \"_iun_load_ing\"; //缓存loading key\n\n if (cache[apiLoadingKey]) {\n const _setting = Object.assign({}, defalutSetting, setting);\n return new Promise((resolve) => {\n const startTime = Date.now();\n const timer = setInterval(() => {\n if (cache[apiKey]) {\n clearInterval(timer);\n resolve(cloneDeep(getCachedData<T>(apiKey)));\n } else if (Date.now() - startTime > _setting.timeout!) {\n cache[apiLoadingKey] = false;\n clearInterval(timer);\n resolve(cloneDeep(_setting.timeoutResult));\n }\n }, 100);\n });\n }\n cache[apiLoadingKey] = true;\n\n return func(...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 cache[apiLoadingKey] = false;\n });\n };\n}\n","/**\n * 表示 DOM 中可能的子元素类型。\n */\nexport type ChildrenType = DomOptionsType | HTMLElement | Text | 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>;\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,\n property: string,\n value: string,\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, 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 HTMLElement || child instanceof Text) {\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"],"names":["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","cache","getCachedData","apiKey","defalutSetting","timeout","timeoutResult","code","msg","identifier","wrapFunctionWithCache","func","setting","args","slice","arguments","name","Promise","resolve","apiLoadingKey","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","apply","then","res","error","setStyle","element","property","important","style","setProperty","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","HTMLElement","Text","appendChild","createTextNode"],"mappings":"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"}
package/dist/index.umd.js CHANGED
@@ -1,2 +1,2 @@
1
- !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e||self).iunLibs={})}(this,function(e){function n(e){return"function"==typeof(null==e?void 0:e.clone)}function t(e){return"object"!=typeof e&&"function"!=typeof e&&"symbol"!=typeof e||null===e}function i(e){return t(e)?e+"":JSON.stringify(e,function(e,n){return"object"!=typeof n||null===n||Array.isArray(n)?n:Object.keys(n).sort().reduce(function(e,t){return e[t]=n[t],e},{})})}function o(e){if(null===e||"object"!=typeof e)return e;if(n(e))return e.clone();if(Array.isArray(e)){for(var t=[],i=0;i<e.length;i++)t[i]=o(e[i]);return t}if("object"==typeof e){var r={};for(var f in e)e.hasOwnProperty(f)&&(r[f]=o(e[f]));return r}return e}var r={};function f(e){return r[e]}var u={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};e.cloneDeep=o,e.generateDeterministicUniqueKey=i,e.getGlobal=function(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this},e.isCloneable=n,e.isPrimitive=t,e.wrapFunctionWithCache=function(e,t){return void 0===t&&(t=u),function(){var l=[].slice.call(arguments),c=i(l)+e.name+(t.identifier||"");if(r[c])return Promise.resolve(o(f(c)));var a=c+"_wl_loading";if(r[a]){var s=Object.assign({},u,t);return new Promise(function(e){var n=Date.now(),t=setInterval(function(){r[c]?(clearInterval(t),e(o(f(c)))):Date.now()-n>s.timeout&&(r[a]=!1,clearInterval(t),e(o(s.timeoutResult)))},100)})}return r[a]=!0,e.apply(void 0,l).then(function(e){return r[c]=e,e&&n(e)?e.clone():r[c]}).catch(function(e){throw e}).finally(function(){r[a]=!1})}}});
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e||self).iunLibs={})}(this,function(e){function t(e){return"function"==typeof(null==e?void 0:e.clone)}function n(e){var t=typeof e;return null===e||"string"===t||"number"===t||"boolean"===t||"undefined"===t}function r(e){return n(e)?String(e):JSON.stringify(e,function(e,t){return"object"!=typeof t||null===t||Array.isArray(t)?t:Object.keys(t).sort().reduce(function(e,n){return e[n]=t[n],e},{})})}function o(e){if(null===e||"object"!=typeof e)return e;if(t(e))return e.clone();if(Array.isArray(e))return e.map(function(e){return o(e)});var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=o(e[r]));return n}var i={};function a(e){return i[e]}var u={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function f(e,t,n,r){void 0===r&&(r=!1),t in e.style?e.style[t]=n:e.style.setProperty(t,n,r?"important":"")}e.cloneDeep=o,e.createElement=function e(t){var n=void 0===t?{}:t,r=n.tag,o=n.children,i=void 0===o?[]:o,a=n.props,u=void 0===a?{}:a,c=n.attrs,d=void 0===c?{}:c,s=n.styles,y=void 0===s?{}:s,v=document.createElement(void 0===r?"div":r);Object.assign(v,u);for(var p=0,b=Object.entries(d);p<b.length;p++){var m=b[p],g=m[1];!1!==g&&v.setAttribute(m[0],g)}for(var h=0,A=Object.entries(y);h<A.length;h++){var j=A[h];f(v,j[0],j[1])}for(var w,O=function(e){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=function(e,t){if(e){if("string"==typeof e)return l(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?l(e,t):void 0}}(e))){t&&(e=t);var n=0;return function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(Array.isArray(i)?i:[i]);!(w=O()).done;){var S=w.value;S&&("object"==typeof S?S instanceof HTMLElement||S instanceof Text?v.appendChild(S):v.appendChild(e(S)):v.appendChild(document.createTextNode(S)))}return v},e.generateStableUniqueKey=r,e.getGlobal=function(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this},e.isCloneable=t,e.isPrimitive=n,e.wrapFunctionWithCache=function(e,t){return void 0===t&&(t=u),function(){var n=[].slice.call(arguments),l=r(n)+e.name+(t.identifier||"");if(i[l])return Promise.resolve(o(a(l)));var f=l+"_iun_load_ing";if(i[f]){var c=Object.assign({},u,t);return new Promise(function(e){var t=Date.now(),n=setInterval(function(){i[l]?(clearInterval(n),e(o(a(l)))):Date.now()-t>c.timeout&&(i[f]=!1,clearInterval(n),e(o(c.timeoutResult)))},100)})}return i[f]=!0,e.apply(void 0,n).then(function(e){return i[l]=e,o(i[l])}).catch(function(e){throw e}).finally(function(){i[f]=!1})}}});
2
2
  //# sourceMappingURL=index.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/common/type.ts","../src/common/generateDeterministicUniqueKey.ts","../src/common/cloneDeep.ts","../src/common/wrapFunctionWithCache.ts","../src/common/getGlobal.ts"],"sourcesContent":["export type AsyncFunction<Args extends any[], T> = (\n ...args: Args\n) => Promise<T>;\n\ninterface Cloneable {\n clone(): this;\n}\n/**\n * 类型保护函数,检查一个对象是否实现了 Cloneable 接口\n */\nexport function isCloneable(obj: any): obj is Cloneable {\n return typeof obj?.clone === 'function';\n}\n\n/**\n *\n * @param value\n * @returns boolean\n *\n * 判断一个变量是否为简单值\n */\nexport function isPrimitive(\n value: any\n): value is string | number | boolean | null | undefined {\n return (\n (typeof value !== 'object' &&\n typeof value !== 'function' &&\n typeof value !== 'symbol') ||\n value === null\n );\n}\n","import { isPrimitive } from './type';\n/**\n * @private\n * 序列化 api 参数, 相等的对象,返回相同的字符串\n */\nexport function generateDeterministicUniqueKey(params: any) {\n if (isPrimitive(params)) {\n return 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\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 if (Array.isArray(obj)) {\n const newArray: any[] = [];\n for (let i = 0; i < obj.length; i++) {\n newArray[i] = cloneDeep(obj[i]);\n }\n return (newArray as unknown) as T;\n }\n\n if (typeof obj === 'object') {\n const newObj: { [key: string]: any } = {};\n for (let key in obj) {\n if ((obj as any).hasOwnProperty(key)) {\n newObj[key] = cloneDeep(obj[key]);\n }\n }\n return newObj as T;\n }\n\n return obj;\n}\n","// import { getGlobal } from './getGlobal';\nimport { generateDeterministicUniqueKey } from './generateDeterministicUniqueKey';\nimport { cloneDeep } from './cloneDeep';\nimport { isCloneable, AsyncFunction } from './type';\n// const global = getGlobal();\n// if (!global.__wl_fun_api_cache) {\n// global.__wl_fun_api_cache = {};\n// }\n\n// const cache = global.__wl_fun_api_cache;\nconst cache: Record<string, any> = {};\nfunction getCachedData<T = any>(apiKey: string) {\n return cache[apiKey] as T;\n}\n\ninterface Setting {\n timeout?: number;\n timeoutResult?: any;\n identifier?: string;\n}\nconst defalutSetting: Setting = {\n timeout: 60000,\n timeoutResult: { code: 408, msg: '请求超时' },\n identifier: '',\n};\n\n/**\n * 给函数包装缓存功能\n */\n\n\nexport function wrapFunctionWithCache<Args extends any[], T>(\n func: AsyncFunction<Args, T>,\n setting: Setting = defalutSetting\n): AsyncFunction<Args, T> {\n return function(...args: Args): Promise<T> {\n const apiKey: string =\n generateDeterministicUniqueKey(args) +\n func.name +\n (setting.identifier || ''); //缓存key\n\n if (cache[apiKey]) {\n return Promise.resolve(cloneDeep(getCachedData<T>(apiKey)));\n }\n\n const apiLoadingKey: string = apiKey + '_wl_loading'; //缓存loading key\n\n if (cache[apiLoadingKey]) {\n const _setting = Object.assign({}, defalutSetting, setting);\n return new Promise(resolve => {\n const startTime = Date.now();\n const timer = setInterval(() => {\n if (cache[apiKey]) {\n clearInterval(timer);\n resolve(cloneDeep(getCachedData<T>(apiKey)));\n } else if (Date.now() - startTime > _setting.timeout!) {\n cache[apiLoadingKey] = false;\n clearInterval(timer);\n resolve(cloneDeep(_setting.timeoutResult));\n }\n }, 100);\n });\n }\n cache[apiLoadingKey] = true;\n\n return func(...args)\n .then(res => {\n // 缓存原始数据,或者clone数据,不能return 同一份数据,会被释放\n cache[apiKey] = res;\n if (res && isCloneable(res)) {\n // fetch 缓存,不能把原始数据return,否则会被释放\n return res.clone();\n }\n return cache[apiKey];\n })\n .catch((error: any) => {\n throw error;\n })\n .finally(() => {\n cache[apiLoadingKey] = false;\n });\n };\n}\n","declare var global: typeof globalThis;\n\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"],"names":["isCloneable","obj","clone","isPrimitive","value","generateDeterministicUniqueKey","params","JSON","stringify","_key","Array","isArray","Object","keys","sort","reduce","pre","cur","cloneDeep","newArray","i","length","newObj","key","hasOwnProperty","cache","getCachedData","apiKey","defalutSetting","timeout","timeoutResult","code","msg","identifier","globalThis","self","window","global","this","func","setting","args","slice","call","arguments","name","Promise","resolve","apiLoadingKey","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","apply","then","res","error"],"mappings":"iOAUM,SAAUA,EAAYC,GAC1B,MAA6B,yBAAfA,SAAAA,EAAKC,MACrB,CASM,SAAUC,EACdC,GAEA,MACoB,iBAAVA,GACW,mBAAVA,GACU,iBAAVA,GACC,OAAVA,CAEJ,CCzBgB,SAAAC,EAA+BC,GAC7C,OAAIH,EAAYG,GACPA,EAAS,GAEXC,KAAKC,UAAUF,EAAQ,SAASG,EAAuBL,GAC5D,MAAqB,iBAAVA,GAAgC,OAAVA,GAAmBM,MAAMC,QAAQP,GAQ3DA,EAPEQ,OAAOC,KAAKT,GAChBU,OACAC,OAAO,SAACC,EAAUC,GAEjB,OADAD,EAAIC,GAAOb,EAAMa,GACVD,CACT,EAAG,CAAE,EAGX,EACF,CClBgB,SAAAE,EAAajB,GAC3B,GAAY,OAARA,GAA+B,iBAARA,EACzB,OAAOA,EAGT,GAAGD,EAAYC,GACb,OAAOA,EAAIC,QAGb,GAAIQ,MAAMC,QAAQV,GAAM,CAEtB,IADA,IAAMkB,EAAkB,GACfC,EAAI,EAAGA,EAAInB,EAAIoB,OAAQD,IAC9BD,EAASC,GAAKF,EAAUjB,EAAImB,IAE9B,OAAQD,CACT,CAED,GAAmB,iBAARlB,EAAkB,CAC3B,IAAMqB,EAAiC,CAAE,EACzC,IAAK,IAAIC,KAAOtB,EACTA,EAAYuB,eAAeD,KAC9BD,EAAOC,GAAOL,EAAUjB,EAAIsB,KAGhC,OAAOD,CACR,CAED,OAAOrB,CACT,CCpBA,IAAMwB,EAA6B,CAAE,EACrC,SAASC,EAAuBC,GAC9B,OAAOF,EAAME,EACf,CAOA,IAAMC,EAA0B,CAC9BC,QAAS,IACTC,cAAe,CAAEC,KAAM,IAAKC,IAAK,QACjCC,WAAY,4ECnBZ,MAA0B,oBAAfC,WACFA,WAGW,oBAATC,KACFA,KAGa,oBAAXC,OACFA,OAGa,oBAAXC,OACFA,OAKXC,IAAA,mEDUEC,EACAC,GAEA,gBAFAA,IAAAA,EAAmBZ,GAEZ,eAAYa,EAAUC,GAAAA,MAAAC,KAAAC,WACrBjB,EACJtB,EAA+BoC,GAC/BF,EAAKM,MACJL,EAAQP,YAAc,IAEzB,GAAIR,EAAME,GACR,OAAOmB,QAAQC,QAAQ7B,EAAUQ,EAAiBC,KAGpD,IAAMqB,EAAwBrB,EAAS,cAEvC,GAAIF,EAAMuB,GAAgB,CACxB,IAAMC,EAAWrC,OAAOsC,OAAO,CAAA,EAAItB,EAAgBY,GACnD,WAAWM,QAAQ,SAAAC,GACjB,IAAMI,EAAYC,KAAKC,MACjBC,EAAQC,YAAY,WACpB9B,EAAME,IACR6B,cAAcF,GACdP,EAAQ7B,EAAUQ,EAAiBC,MAC1ByB,KAAKC,MAAQF,EAAYF,EAASpB,UAC3CJ,EAAMuB,IAAiB,EACvBQ,cAAcF,GACdP,EAAQ7B,EAAU+B,EAASnB,gBAE/B,EAAG,IACL,EACD,CAGD,OAFAL,EAAMuB,IAAiB,EAEhBT,EAAIkB,aAAIhB,GACZiB,KAAK,SAAAC,GAGJ,OADAlC,EAAME,GAAUgC,EACZA,GAAO3D,EAAY2D,GAEdA,EAAIzD,QAENuB,EAAME,EACf,SACO,SAACiC,GACN,MAAMA,CACR,WACS,WACPnC,EAAMuB,IAAiB,CACzB,EACJ,CACF"}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/common/type.ts","../src/common/generateStableUniqueKey.ts","../src/common/cloneDeep.ts","../src/common/wrapFunctionWithCache.ts","../src/browser/dom.ts","../src/common/getGlobal.ts"],"sourcesContent":["/**\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 ...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","import { generateStableUniqueKey } from \"./generateStableUniqueKey\";\nimport { cloneDeep } from \"./cloneDeep\";\nimport { AsyncFunction } from \"./type\";\n\nconst cache: Record<string, any> = {};\nfunction getCachedData<T = any>(apiKey: string) {\n return cache[apiKey] as T;\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 wrapFunctionWithCache<Args extends any[], T>(\n func: AsyncFunction<Args, T>,\n setting: Setting = defalutSetting\n): AsyncFunction<Args, T> {\n return function (...args: Args): Promise<T> {\n const apiKey: string =\n generateStableUniqueKey(args) + func.name + (setting.identifier || \"\"); //缓存key\n\n if (cache[apiKey]) {\n return Promise.resolve(cloneDeep(getCachedData<T>(apiKey)));\n }\n\n const apiLoadingKey: string = apiKey + \"_iun_load_ing\"; //缓存loading key\n\n if (cache[apiLoadingKey]) {\n const _setting = Object.assign({}, defalutSetting, setting);\n return new Promise((resolve) => {\n const startTime = Date.now();\n const timer = setInterval(() => {\n if (cache[apiKey]) {\n clearInterval(timer);\n resolve(cloneDeep(getCachedData<T>(apiKey)));\n } else if (Date.now() - startTime > _setting.timeout!) {\n cache[apiLoadingKey] = false;\n clearInterval(timer);\n resolve(cloneDeep(_setting.timeoutResult));\n }\n }, 100);\n });\n }\n cache[apiLoadingKey] = true;\n\n return func(...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 cache[apiLoadingKey] = false;\n });\n };\n}\n","/**\n * 表示 DOM 中可能的子元素类型。\n */\nexport type ChildrenType = DomOptionsType | HTMLElement | Text | 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>;\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,\n property: string,\n value: string,\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, 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 HTMLElement || child instanceof Text) {\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","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"],"names":["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","cache","getCachedData","apiKey","defalutSetting","timeout","timeoutResult","code","msg","identifier","setStyle","element","property","important","style","setProperty","createElement","_temp","_ref","_ref$tag","tag","_ref$children","children","_ref$props","props","_ref$attrs","attrs","_ref$styles","styles","ele","document","assign","_i","_Object$entries","entries","length","_Object$entries$_i","setAttribute","_i2","_Object$entries2","_Object$entries2$_i","_step","_iterator","_createForOfIteratorHelperLoose","done","child","HTMLElement","Text","appendChild","createTextNode","globalThis","self","window","global","this","func","setting","args","slice","arguments","name","Promise","resolve","apiLoadingKey","_setting","startTime","Date","now","timer","setInterval","clearInterval","apply","then","res","error"],"mappings":"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"}
@@ -1 +1 @@
1
- export {};
1
+ export * from "./node";
@@ -1 +1 @@
1
- export declare function getNode(): void;
1
+ export {};
package/package.json CHANGED
@@ -1,25 +1,13 @@
1
1
  {
2
2
  "name": "@i.un/libs",
3
- "version": "0.0.2",
3
+ "version": "0.0.5",
4
4
  "description": "一个实用的ts函数库",
5
5
  "type": "module",
6
6
  "source": "src/index.ts",
7
7
  "exports": {
8
- "browser": {
9
- "types": "./dist/browser.d.ts",
10
- "require": "./dist/browser.cjs",
11
- "default": "./dist/browser.modern.js"
12
- },
13
- "node": {
14
- "types": "./dist/node.d.ts",
15
- "require": "./dist/node.cjs",
16
- "default": "./dist/node.modern.js"
17
- },
18
- "default": {
19
- "types": "./dist/index.d.ts",
20
- "require": "./dist/index.cjs",
21
- "default": "./dist/index.modern.js"
22
- }
8
+ "types": "./dist/index.d.ts",
9
+ "require": "./dist/index.cjs",
10
+ "default": "./dist/index.modern.js"
23
11
  },
24
12
  "main": "dist/index.cjs",
25
13
  "module": "dist/index.module.js",
@@ -27,9 +15,10 @@
27
15
  "amdName": "iunLibs",
28
16
  "types": "dist/index.d.ts",
29
17
  "scripts": {
30
- "build": "microbundle src/*.ts",
18
+ "build": "microbundle --tsconfig tsconfig.build.json",
31
19
  "dev": "microbundle watch",
32
- "test": "echo \"Error: no test specified\" && exit 1"
20
+ "test": "jest",
21
+ "doc": "typedoc"
33
22
  },
34
23
  "publishConfig": {
35
24
  "access": "public"
@@ -41,6 +30,20 @@
41
30
  "author": "zhyswan",
42
31
  "license": "ISC",
43
32
  "devDependencies": {
44
- "microbundle": "^0.15.1"
33
+ "@types/jest": "^29.5.13",
34
+ "jest": "^29.7.0",
35
+ "jest-environment-jsdom": "^29.7.0",
36
+ "microbundle": "^0.15.1",
37
+ "ts-jest": "^29.2.5",
38
+ "ts-node": "^10.9.2",
39
+ "typedoc": "^0.26.7",
40
+ "typescript": "^5.6.2"
41
+ },
42
+ "repository": {
43
+ "type": "git",
44
+ "url": "https://github.com/zhyswan/libs"
45
+ },
46
+ "dependencies": {
47
+ "tslib": "^2.7.0"
45
48
  }
46
- }
49
+ }
package/dist/browser.cjs DELETED
@@ -1,2 +0,0 @@
1
- function e(e){return"function"==typeof(null==e?void 0:e.clone)}function n(e){return"object"!=typeof e&&"function"!=typeof e&&"symbol"!=typeof e||null===e}function t(e){return n(e)?e+"":JSON.stringify(e,function(e,n){return"object"!=typeof n||null===n||Array.isArray(n)?n:Object.keys(n).sort().reduce(function(e,t){return e[t]=n[t],e},{})})}function r(n){if(null===n||"object"!=typeof n)return n;if(e(n))return n.clone();if(Array.isArray(n)){for(var t=[],o=0;o<n.length;o++)t[o]=r(n[o]);return t}if("object"==typeof n){var i={};for(var u in n)n.hasOwnProperty(u)&&(i[u]=r(n[u]));return i}return n}var o={};function i(e){return o[e]}var u={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};exports.cloneDeep=r,exports.createDocument=function(){return document.implementation.createHTMLDocument()},exports.generateDeterministicUniqueKey=t,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.wrapFunctionWithCache=function(n,f){return void 0===f&&(f=u),function(){var l=[].slice.call(arguments),c=t(l)+n.name+(f.identifier||"");if(o[c])return Promise.resolve(r(i(c)));var a=c+"_wl_loading";if(o[a]){var s=Object.assign({},u,f);return new Promise(function(e){var n=Date.now(),t=setInterval(function(){o[c]?(clearInterval(t),e(r(i(c)))):Date.now()-n>s.timeout&&(o[a]=!1,clearInterval(t),e(r(s.timeoutResult)))},100)})}return o[a]=!0,n.apply(void 0,l).then(function(n){return o[c]=n,n&&e(n)?n.clone():o[c]}).catch(function(e){throw e}).finally(function(){o[a]=!1})}};
2
- //# sourceMappingURL=browser.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser.cjs","sources":["../src/common/type.ts","../src/common/generateDeterministicUniqueKey.ts","../src/common/cloneDeep.ts","../src/common/wrapFunctionWithCache.ts","../src/browser/dom.ts","../src/common/getGlobal.ts"],"sourcesContent":["export type AsyncFunction<Args extends any[], T> = (\n ...args: Args\n) => Promise<T>;\n\ninterface Cloneable {\n clone(): this;\n}\n/**\n * 类型保护函数,检查一个对象是否实现了 Cloneable 接口\n */\nexport function isCloneable(obj: any): obj is Cloneable {\n return typeof obj?.clone === 'function';\n}\n\n/**\n *\n * @param value\n * @returns boolean\n *\n * 判断一个变量是否为简单值\n */\nexport function isPrimitive(\n value: any\n): value is string | number | boolean | null | undefined {\n return (\n (typeof value !== 'object' &&\n typeof value !== 'function' &&\n typeof value !== 'symbol') ||\n value === null\n );\n}\n","import { isPrimitive } from './type';\n/**\n * @private\n * 序列化 api 参数, 相等的对象,返回相同的字符串\n */\nexport function generateDeterministicUniqueKey(params: any) {\n if (isPrimitive(params)) {\n return 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\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 if (Array.isArray(obj)) {\n const newArray: any[] = [];\n for (let i = 0; i < obj.length; i++) {\n newArray[i] = cloneDeep(obj[i]);\n }\n return (newArray as unknown) as T;\n }\n\n if (typeof obj === 'object') {\n const newObj: { [key: string]: any } = {};\n for (let key in obj) {\n if ((obj as any).hasOwnProperty(key)) {\n newObj[key] = cloneDeep(obj[key]);\n }\n }\n return newObj as T;\n }\n\n return obj;\n}\n","// import { getGlobal } from './getGlobal';\nimport { generateDeterministicUniqueKey } from './generateDeterministicUniqueKey';\nimport { cloneDeep } from './cloneDeep';\nimport { isCloneable, AsyncFunction } from './type';\n// const global = getGlobal();\n// if (!global.__wl_fun_api_cache) {\n// global.__wl_fun_api_cache = {};\n// }\n\n// const cache = global.__wl_fun_api_cache;\nconst cache: Record<string, any> = {};\nfunction getCachedData<T = any>(apiKey: string) {\n return cache[apiKey] as T;\n}\n\ninterface Setting {\n timeout?: number;\n timeoutResult?: any;\n identifier?: string;\n}\nconst defalutSetting: Setting = {\n timeout: 60000,\n timeoutResult: { code: 408, msg: '请求超时' },\n identifier: '',\n};\n\n/**\n * 给函数包装缓存功能\n */\n\n\nexport function wrapFunctionWithCache<Args extends any[], T>(\n func: AsyncFunction<Args, T>,\n setting: Setting = defalutSetting\n): AsyncFunction<Args, T> {\n return function(...args: Args): Promise<T> {\n const apiKey: string =\n generateDeterministicUniqueKey(args) +\n func.name +\n (setting.identifier || ''); //缓存key\n\n if (cache[apiKey]) {\n return Promise.resolve(cloneDeep(getCachedData<T>(apiKey)));\n }\n\n const apiLoadingKey: string = apiKey + '_wl_loading'; //缓存loading key\n\n if (cache[apiLoadingKey]) {\n const _setting = Object.assign({}, defalutSetting, setting);\n return new Promise(resolve => {\n const startTime = Date.now();\n const timer = setInterval(() => {\n if (cache[apiKey]) {\n clearInterval(timer);\n resolve(cloneDeep(getCachedData<T>(apiKey)));\n } else if (Date.now() - startTime > _setting.timeout!) {\n cache[apiLoadingKey] = false;\n clearInterval(timer);\n resolve(cloneDeep(_setting.timeoutResult));\n }\n }, 100);\n });\n }\n cache[apiLoadingKey] = true;\n\n return func(...args)\n .then(res => {\n // 缓存原始数据,或者clone数据,不能return 同一份数据,会被释放\n cache[apiKey] = res;\n if (res && isCloneable(res)) {\n // fetch 缓存,不能把原始数据return,否则会被释放\n return res.clone();\n }\n return cache[apiKey];\n })\n .catch((error: any) => {\n throw error;\n })\n .finally(() => {\n cache[apiLoadingKey] = false;\n });\n };\n}\n","export function createDocument() {\n return document.implementation.createHTMLDocument();\n}","declare var global: typeof globalThis;\n\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"],"names":["isCloneable","obj","clone","isPrimitive","value","generateDeterministicUniqueKey","params","JSON","stringify","_key","Array","isArray","Object","keys","sort","reduce","pre","cur","cloneDeep","newArray","i","length","newObj","key","hasOwnProperty","cache","getCachedData","apiKey","defalutSetting","timeout","timeoutResult","code","msg","identifier","document","implementation","createHTMLDocument","globalThis","self","window","global","this","func","setting","args","slice","call","arguments","name","Promise","resolve","apiLoadingKey","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","apply","then","res","error"],"mappings":"AAUM,SAAUA,EAAYC,GAC1B,MAA6B,yBAAfA,SAAAA,EAAKC,MACrB,CASM,SAAUC,EACdC,GAEA,MACoB,iBAAVA,GACW,mBAAVA,GACU,iBAAVA,GACC,OAAVA,CAEJ,CCzBgB,SAAAC,EAA+BC,GAC7C,OAAIH,EAAYG,GACPA,EAAS,GAEXC,KAAKC,UAAUF,EAAQ,SAASG,EAAuBL,GAC5D,MAAqB,iBAAVA,GAAgC,OAAVA,GAAmBM,MAAMC,QAAQP,GAQ3DA,EAPEQ,OAAOC,KAAKT,GAChBU,OACAC,OAAO,SAACC,EAAUC,GAEjB,OADAD,EAAIC,GAAOb,EAAMa,GACVD,CACT,EAAG,CAAE,EAGX,EACF,CClBgB,SAAAE,EAAajB,GAC3B,GAAY,OAARA,GAA+B,iBAARA,EACzB,OAAOA,EAGT,GAAGD,EAAYC,GACb,OAAOA,EAAIC,QAGb,GAAIQ,MAAMC,QAAQV,GAAM,CAEtB,IADA,IAAMkB,EAAkB,GACfC,EAAI,EAAGA,EAAInB,EAAIoB,OAAQD,IAC9BD,EAASC,GAAKF,EAAUjB,EAAImB,IAE9B,OAAQD,CACT,CAED,GAAmB,iBAARlB,EAAkB,CAC3B,IAAMqB,EAAiC,CAAE,EACzC,IAAK,IAAIC,KAAOtB,EACTA,EAAYuB,eAAeD,KAC9BD,EAAOC,GAAOL,EAAUjB,EAAIsB,KAGhC,OAAOD,CACR,CAED,OAAOrB,CACT,CCpBA,IAAMwB,EAA6B,CAAE,EACrC,SAASC,EAAuBC,GAC9B,OAAOF,EAAME,EACf,CAOA,IAAMC,EAA0B,CAC9BC,QAAS,IACTC,cAAe,CAAEC,KAAM,IAAKC,IAAK,QACjCC,WAAY,+CCvBE,WACZ,OAAOC,SAASC,eAAeC,oBACnC,wECEE,MAA0B,oBAAfC,WACFA,WAGW,oBAATC,KACFA,KAGa,oBAAXC,OACFA,OAGa,oBAAXC,OACFA,OAKXC,IAAA,qFFUEC,EACAC,GAEA,gBAFAA,IAAAA,EAAmBf,GAEZ,eAAYgB,EAAUC,GAAAA,MAAAC,KAAAC,WACrBpB,EACJtB,EAA+BuC,GAC/BF,EAAKM,MACJL,EAAQV,YAAc,IAEzB,GAAIR,EAAME,GACR,OAAOsB,QAAQC,QAAQhC,EAAUQ,EAAiBC,KAGpD,IAAMwB,EAAwBxB,EAAS,cAEvC,GAAIF,EAAM0B,GAAgB,CACxB,IAAMC,EAAWxC,OAAOyC,OAAO,CAAA,EAAIzB,EAAgBe,GACnD,WAAWM,QAAQ,SAAAC,GACjB,IAAMI,EAAYC,KAAKC,MACjBC,EAAQC,YAAY,WACpBjC,EAAME,IACRgC,cAAcF,GACdP,EAAQhC,EAAUQ,EAAiBC,MAC1B4B,KAAKC,MAAQF,EAAYF,EAASvB,UAC3CJ,EAAM0B,IAAiB,EACvBQ,cAAcF,GACdP,EAAQhC,EAAUkC,EAAStB,gBAE/B,EAAG,IACL,EACD,CAGD,OAFAL,EAAM0B,IAAiB,EAEhBT,EAAIkB,aAAIhB,GACZiB,KAAK,SAAAC,GAGJ,OADArC,EAAME,GAAUmC,EACZA,GAAO9D,EAAY8D,GAEdA,EAAI5D,QAENuB,EAAME,EACf,SACO,SAACoC,GACN,MAAMA,CACR,WACS,WACPtC,EAAM0B,IAAiB,CACzB,EACJ,CACF"}
package/dist/browser.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export * from "./common";
2
- export * from "./browser/index";
@@ -1,2 +0,0 @@
1
- function e(e){return"function"==typeof(null==e?void 0:e.clone)}function t(e){return"object"!=typeof e&&"function"!=typeof e&&"symbol"!=typeof e||null===e}function n(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this}function o(e){return t(e)?e+"":JSON.stringify(e,function(e,t){return"object"!=typeof t||null===t||Array.isArray(t)?t:Object.keys(t).sort().reduce((e,n)=>(e[n]=t[n],e),{})})}function r(t){if(null===t||"object"!=typeof t)return t;if(e(t))return t.clone();if(Array.isArray(t)){const e=[];for(let n=0;n<t.length;n++)e[n]=r(t[n]);return e}if("object"==typeof t){const e={};for(let n in t)t.hasOwnProperty(n)&&(e[n]=r(t[n]));return e}return t}const i={};function u(e){return i[e]}const f={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};function c(t,n=f){return function(...c){const l=o(c)+t.name+(n.identifier||"");if(i[l])return Promise.resolve(r(u(l)));const s=l+"_wl_loading";if(i[s]){const e=Object.assign({},f,n);return new Promise(t=>{const n=Date.now(),o=setInterval(()=>{i[l]?(clearInterval(o),t(r(u(l)))):Date.now()-n>e.timeout&&(i[s]=!1,clearInterval(o),t(r(e.timeoutResult)))},100)})}return i[s]=!0,t(...c).then(t=>(i[l]=t,t&&e(t)?t.clone():i[l])).catch(e=>{throw e}).finally(()=>{i[s]=!1})}}function l(){return document.implementation.createHTMLDocument()}export{r as cloneDeep,l as createDocument,o as generateDeterministicUniqueKey,n as getGlobal,e as isCloneable,t as isPrimitive,c as wrapFunctionWithCache};
2
- //# sourceMappingURL=browser.modern.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser.modern.js","sources":["../src/common/type.ts","../src/common/getGlobal.ts","../src/common/generateDeterministicUniqueKey.ts","../src/common/cloneDeep.ts","../src/common/wrapFunctionWithCache.ts","../src/browser/dom.ts"],"sourcesContent":["export type AsyncFunction<Args extends any[], T> = (\n ...args: Args\n) => Promise<T>;\n\ninterface Cloneable {\n clone(): this;\n}\n/**\n * 类型保护函数,检查一个对象是否实现了 Cloneable 接口\n */\nexport function isCloneable(obj: any): obj is Cloneable {\n return typeof obj?.clone === 'function';\n}\n\n/**\n *\n * @param value\n * @returns boolean\n *\n * 判断一个变量是否为简单值\n */\nexport function isPrimitive(\n value: any\n): value is string | number | boolean | null | undefined {\n return (\n (typeof value !== 'object' &&\n typeof value !== 'function' &&\n typeof value !== 'symbol') ||\n value === null\n );\n}\n","declare var global: typeof globalThis;\n\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 * @private\n * 序列化 api 参数, 相等的对象,返回相同的字符串\n */\nexport function generateDeterministicUniqueKey(params: any) {\n if (isPrimitive(params)) {\n return 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\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 if (Array.isArray(obj)) {\n const newArray: any[] = [];\n for (let i = 0; i < obj.length; i++) {\n newArray[i] = cloneDeep(obj[i]);\n }\n return (newArray as unknown) as T;\n }\n\n if (typeof obj === 'object') {\n const newObj: { [key: string]: any } = {};\n for (let key in obj) {\n if ((obj as any).hasOwnProperty(key)) {\n newObj[key] = cloneDeep(obj[key]);\n }\n }\n return newObj as T;\n }\n\n return obj;\n}\n","// import { getGlobal } from './getGlobal';\nimport { generateDeterministicUniqueKey } from './generateDeterministicUniqueKey';\nimport { cloneDeep } from './cloneDeep';\nimport { isCloneable, AsyncFunction } from './type';\n// const global = getGlobal();\n// if (!global.__wl_fun_api_cache) {\n// global.__wl_fun_api_cache = {};\n// }\n\n// const cache = global.__wl_fun_api_cache;\nconst cache: Record<string, any> = {};\nfunction getCachedData<T = any>(apiKey: string) {\n return cache[apiKey] as T;\n}\n\ninterface Setting {\n timeout?: number;\n timeoutResult?: any;\n identifier?: string;\n}\nconst defalutSetting: Setting = {\n timeout: 60000,\n timeoutResult: { code: 408, msg: '请求超时' },\n identifier: '',\n};\n\n/**\n * 给函数包装缓存功能\n */\n\n\nexport function wrapFunctionWithCache<Args extends any[], T>(\n func: AsyncFunction<Args, T>,\n setting: Setting = defalutSetting\n): AsyncFunction<Args, T> {\n return function(...args: Args): Promise<T> {\n const apiKey: string =\n generateDeterministicUniqueKey(args) +\n func.name +\n (setting.identifier || ''); //缓存key\n\n if (cache[apiKey]) {\n return Promise.resolve(cloneDeep(getCachedData<T>(apiKey)));\n }\n\n const apiLoadingKey: string = apiKey + '_wl_loading'; //缓存loading key\n\n if (cache[apiLoadingKey]) {\n const _setting = Object.assign({}, defalutSetting, setting);\n return new Promise(resolve => {\n const startTime = Date.now();\n const timer = setInterval(() => {\n if (cache[apiKey]) {\n clearInterval(timer);\n resolve(cloneDeep(getCachedData<T>(apiKey)));\n } else if (Date.now() - startTime > _setting.timeout!) {\n cache[apiLoadingKey] = false;\n clearInterval(timer);\n resolve(cloneDeep(_setting.timeoutResult));\n }\n }, 100);\n });\n }\n cache[apiLoadingKey] = true;\n\n return func(...args)\n .then(res => {\n // 缓存原始数据,或者clone数据,不能return 同一份数据,会被释放\n cache[apiKey] = res;\n if (res && isCloneable(res)) {\n // fetch 缓存,不能把原始数据return,否则会被释放\n return res.clone();\n }\n return cache[apiKey];\n })\n .catch((error: any) => {\n throw error;\n })\n .finally(() => {\n cache[apiLoadingKey] = false;\n });\n };\n}\n","export function createDocument() {\n return document.implementation.createHTMLDocument();\n}"],"names":["isCloneable","obj","clone","isPrimitive","value","getGlobal","globalThis","self","window","global","this","generateDeterministicUniqueKey","params","JSON","stringify","_key","Array","isArray","Object","keys","sort","reduce","pre","cur","cloneDeep","newArray","i","length","newObj","key","hasOwnProperty","cache","getCachedData","apiKey","defalutSetting","timeout","timeoutResult","code","msg","identifier","wrapFunctionWithCache","func","setting","args","name","Promise","resolve","apiLoadingKey","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","then","res","catch","error","finally","createDocument","document","implementation","createHTMLDocument"],"mappings":"AAUM,SAAUA,EAAYC,GAC1B,MAA6B,yBAAfA,SAAAA,EAAKC,MACrB,CASM,SAAUC,EACdC,GAEA,MACoB,iBAAVA,GACW,mBAAVA,GACU,iBAAVA,GACC,OAAVA,CAEJ,UC3BgBC,IACd,MAA0B,oBAAfC,WACFA,WAGW,oBAATC,KACFA,KAGa,oBAAXC,OACFA,OAGa,oBAAXC,OACFA,OAKXC,IAAA,CCjBgB,SAAAC,EAA+BC,GAC7C,OAAIT,EAAYS,GACPA,EAAS,GAEXC,KAAKC,UAAUF,EAAQ,SAASG,EAAuBX,GAC5D,MAAqB,iBAAVA,GAAgC,OAAVA,GAAmBY,MAAMC,QAAQb,GAQ3DA,EAPEc,OAAOC,KAAKf,GAChBgB,OACAC,OAAO,CAACC,EAAUC,KACjBD,EAAIC,GAAOnB,EAAMmB,GACVD,GACN,CAAE,EAGX,EACF,CClBgB,SAAAE,EAAavB,GAC3B,GAAY,OAARA,GAA+B,iBAARA,EACzB,OAAOA,EAGT,GAAGD,EAAYC,GACb,OAAOA,EAAIC,QAGb,GAAIc,MAAMC,QAAQhB,GAAM,CACtB,MAAMwB,EAAkB,GACxB,IAAK,IAAIC,EAAI,EAAGA,EAAIzB,EAAI0B,OAAQD,IAC9BD,EAASC,GAAKF,EAAUvB,EAAIyB,IAE9B,OAAQD,CACT,CAED,GAAmB,iBAARxB,EAAkB,CAC3B,MAAM2B,EAAiC,CAAE,EACzC,IAAK,IAAIC,KAAO5B,EACTA,EAAY6B,eAAeD,KAC9BD,EAAOC,GAAOL,EAAUvB,EAAI4B,KAGhC,OAAOD,CACR,CAED,OAAO3B,CACT,CCpBA,MAAM8B,EAA6B,CAAE,EACrC,SAASC,EAAuBC,GAC9B,OAAOF,EAAME,EACf,CAOA,MAAMC,EAA0B,CAC9BC,QAAS,IACTC,cAAe,CAAEC,KAAM,IAAKC,IAAK,QACjCC,WAAY,aAQEC,EACdC,EACAC,EAAmBR,GAEnB,OAAgB,YAAGS,GACjB,MAAMV,EACJtB,EAA+BgC,GAC/BF,EAAKG,MACJF,EAAQH,YAAc,IAEzB,GAAIR,EAAME,GACR,OAAOY,QAAQC,QAAQtB,EAAUQ,EAAiBC,KAGpD,MAAMc,EAAwBd,EAAS,cAEvC,GAAIF,EAAMgB,GAAgB,CACxB,MAAMC,EAAW9B,OAAO+B,OAAO,CAAA,EAAIf,EAAgBQ,GACnD,OAAO,IAAIG,QAAQC,IACjB,MAAMI,EAAYC,KAAKC,MACjBC,EAAQC,YAAY,KACpBvB,EAAME,IACRsB,cAAcF,GACdP,EAAQtB,EAAUQ,EAAiBC,MAC1BkB,KAAKC,MAAQF,EAAYF,EAASb,UAC3CJ,EAAMgB,IAAiB,EACvBQ,cAAcF,GACdP,EAAQtB,EAAUwB,EAASZ,gBAC5B,EACA,IACL,EACD,CAGD,OAFAL,EAAMgB,IAAiB,EAEhBN,KAAQE,GACZa,KAAKC,IAEJ1B,EAAME,GAAUwB,EACZA,GAAOzD,EAAYyD,GAEdA,EAAIvD,QAEN6B,EAAME,KAEdyB,MAAOC,IACN,MAAMA,IAEPC,QAAQ,KACP7B,EAAMgB,IAAiB,CACzB,EACJ,CACF,CClFgB,SAAAc,IACZ,OAAOC,SAASC,eAAeC,oBACnC"}
@@ -1,2 +0,0 @@
1
- function n(n){return"function"==typeof(null==n?void 0:n.clone)}function e(n){return"object"!=typeof n&&"function"!=typeof n&&"symbol"!=typeof n||null===n}function t(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this}function r(n){return e(n)?n+"":JSON.stringify(n,function(n,e){return"object"!=typeof e||null===e||Array.isArray(e)?e:Object.keys(e).sort().reduce(function(n,t){return n[t]=e[t],n},{})})}function o(e){if(null===e||"object"!=typeof e)return e;if(n(e))return e.clone();if(Array.isArray(e)){for(var t=[],r=0;r<e.length;r++)t[r]=o(e[r]);return t}if("object"==typeof e){var i={};for(var u in e)e.hasOwnProperty(u)&&(i[u]=o(e[u]));return i}return e}var i={};function u(n){return i[n]}var f={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};function l(e,t){return void 0===t&&(t=f),function(){var l=[].slice.call(arguments),c=r(l)+e.name+(t.identifier||"");if(i[c])return Promise.resolve(o(u(c)));var a=c+"_wl_loading";if(i[a]){var s=Object.assign({},f,t);return new Promise(function(n){var e=Date.now(),t=setInterval(function(){i[c]?(clearInterval(t),n(o(u(c)))):Date.now()-e>s.timeout&&(i[a]=!1,clearInterval(t),n(o(s.timeoutResult)))},100)})}return i[a]=!0,e.apply(void 0,l).then(function(e){return i[c]=e,e&&n(e)?e.clone():i[c]}).catch(function(n){throw n}).finally(function(){i[a]=!1})}}function c(){return document.implementation.createHTMLDocument()}export{o as cloneDeep,c as createDocument,r as generateDeterministicUniqueKey,t as getGlobal,n as isCloneable,e as isPrimitive,l as wrapFunctionWithCache};
2
- //# sourceMappingURL=browser.module.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser.module.js","sources":["../src/common/type.ts","../src/common/getGlobal.ts","../src/common/generateDeterministicUniqueKey.ts","../src/common/cloneDeep.ts","../src/common/wrapFunctionWithCache.ts","../src/browser/dom.ts"],"sourcesContent":["export type AsyncFunction<Args extends any[], T> = (\n ...args: Args\n) => Promise<T>;\n\ninterface Cloneable {\n clone(): this;\n}\n/**\n * 类型保护函数,检查一个对象是否实现了 Cloneable 接口\n */\nexport function isCloneable(obj: any): obj is Cloneable {\n return typeof obj?.clone === 'function';\n}\n\n/**\n *\n * @param value\n * @returns boolean\n *\n * 判断一个变量是否为简单值\n */\nexport function isPrimitive(\n value: any\n): value is string | number | boolean | null | undefined {\n return (\n (typeof value !== 'object' &&\n typeof value !== 'function' &&\n typeof value !== 'symbol') ||\n value === null\n );\n}\n","declare var global: typeof globalThis;\n\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 * @private\n * 序列化 api 参数, 相等的对象,返回相同的字符串\n */\nexport function generateDeterministicUniqueKey(params: any) {\n if (isPrimitive(params)) {\n return 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\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 if (Array.isArray(obj)) {\n const newArray: any[] = [];\n for (let i = 0; i < obj.length; i++) {\n newArray[i] = cloneDeep(obj[i]);\n }\n return (newArray as unknown) as T;\n }\n\n if (typeof obj === 'object') {\n const newObj: { [key: string]: any } = {};\n for (let key in obj) {\n if ((obj as any).hasOwnProperty(key)) {\n newObj[key] = cloneDeep(obj[key]);\n }\n }\n return newObj as T;\n }\n\n return obj;\n}\n","// import { getGlobal } from './getGlobal';\nimport { generateDeterministicUniqueKey } from './generateDeterministicUniqueKey';\nimport { cloneDeep } from './cloneDeep';\nimport { isCloneable, AsyncFunction } from './type';\n// const global = getGlobal();\n// if (!global.__wl_fun_api_cache) {\n// global.__wl_fun_api_cache = {};\n// }\n\n// const cache = global.__wl_fun_api_cache;\nconst cache: Record<string, any> = {};\nfunction getCachedData<T = any>(apiKey: string) {\n return cache[apiKey] as T;\n}\n\ninterface Setting {\n timeout?: number;\n timeoutResult?: any;\n identifier?: string;\n}\nconst defalutSetting: Setting = {\n timeout: 60000,\n timeoutResult: { code: 408, msg: '请求超时' },\n identifier: '',\n};\n\n/**\n * 给函数包装缓存功能\n */\n\n\nexport function wrapFunctionWithCache<Args extends any[], T>(\n func: AsyncFunction<Args, T>,\n setting: Setting = defalutSetting\n): AsyncFunction<Args, T> {\n return function(...args: Args): Promise<T> {\n const apiKey: string =\n generateDeterministicUniqueKey(args) +\n func.name +\n (setting.identifier || ''); //缓存key\n\n if (cache[apiKey]) {\n return Promise.resolve(cloneDeep(getCachedData<T>(apiKey)));\n }\n\n const apiLoadingKey: string = apiKey + '_wl_loading'; //缓存loading key\n\n if (cache[apiLoadingKey]) {\n const _setting = Object.assign({}, defalutSetting, setting);\n return new Promise(resolve => {\n const startTime = Date.now();\n const timer = setInterval(() => {\n if (cache[apiKey]) {\n clearInterval(timer);\n resolve(cloneDeep(getCachedData<T>(apiKey)));\n } else if (Date.now() - startTime > _setting.timeout!) {\n cache[apiLoadingKey] = false;\n clearInterval(timer);\n resolve(cloneDeep(_setting.timeoutResult));\n }\n }, 100);\n });\n }\n cache[apiLoadingKey] = true;\n\n return func(...args)\n .then(res => {\n // 缓存原始数据,或者clone数据,不能return 同一份数据,会被释放\n cache[apiKey] = res;\n if (res && isCloneable(res)) {\n // fetch 缓存,不能把原始数据return,否则会被释放\n return res.clone();\n }\n return cache[apiKey];\n })\n .catch((error: any) => {\n throw error;\n })\n .finally(() => {\n cache[apiLoadingKey] = false;\n });\n };\n}\n","export function createDocument() {\n return document.implementation.createHTMLDocument();\n}"],"names":["isCloneable","obj","clone","isPrimitive","value","getGlobal","globalThis","self","window","global","this","generateDeterministicUniqueKey","params","JSON","stringify","_key","Array","isArray","Object","keys","sort","reduce","pre","cur","cloneDeep","newArray","i","length","newObj","key","hasOwnProperty","cache","getCachedData","apiKey","defalutSetting","timeout","timeoutResult","code","msg","identifier","wrapFunctionWithCache","func","setting","args","slice","call","arguments","name","Promise","resolve","apiLoadingKey","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","apply","then","res","error","createDocument","document","implementation","createHTMLDocument"],"mappings":"AAUM,SAAUA,EAAYC,GAC1B,MAA6B,yBAAfA,SAAAA,EAAKC,MACrB,CASM,SAAUC,EACdC,GAEA,MACoB,iBAAVA,GACW,mBAAVA,GACU,iBAAVA,GACC,OAAVA,CAEJ,UC3BgBC,IACd,MAA0B,oBAAfC,WACFA,WAGW,oBAATC,KACFA,KAGa,oBAAXC,OACFA,OAGa,oBAAXC,OACFA,OAKXC,IAAA,CCjBgB,SAAAC,EAA+BC,GAC7C,OAAIT,EAAYS,GACPA,EAAS,GAEXC,KAAKC,UAAUF,EAAQ,SAASG,EAAuBX,GAC5D,MAAqB,iBAAVA,GAAgC,OAAVA,GAAmBY,MAAMC,QAAQb,GAQ3DA,EAPEc,OAAOC,KAAKf,GAChBgB,OACAC,OAAO,SAACC,EAAUC,GAEjB,OADAD,EAAIC,GAAOnB,EAAMmB,GACVD,CACT,EAAG,CAAE,EAGX,EACF,CClBgB,SAAAE,EAAavB,GAC3B,GAAY,OAARA,GAA+B,iBAARA,EACzB,OAAOA,EAGT,GAAGD,EAAYC,GACb,OAAOA,EAAIC,QAGb,GAAIc,MAAMC,QAAQhB,GAAM,CAEtB,IADA,IAAMwB,EAAkB,GACfC,EAAI,EAAGA,EAAIzB,EAAI0B,OAAQD,IAC9BD,EAASC,GAAKF,EAAUvB,EAAIyB,IAE9B,OAAQD,CACT,CAED,GAAmB,iBAARxB,EAAkB,CAC3B,IAAM2B,EAAiC,CAAE,EACzC,IAAK,IAAIC,KAAO5B,EACTA,EAAY6B,eAAeD,KAC9BD,EAAOC,GAAOL,EAAUvB,EAAI4B,KAGhC,OAAOD,CACR,CAED,OAAO3B,CACT,CCpBA,IAAM8B,EAA6B,CAAE,EACrC,SAASC,EAAuBC,GAC9B,OAAOF,EAAME,EACf,CAOA,IAAMC,EAA0B,CAC9BC,QAAS,IACTC,cAAe,CAAEC,KAAM,IAAKC,IAAK,QACjCC,WAAY,aAQEC,EACdC,EACAC,GAEA,gBAFAA,IAAAA,EAAmBR,GAEZ,eAAYS,EAAUC,GAAAA,MAAAC,KAAAC,WACrBb,EACJtB,EAA+BgC,GAC/BF,EAAKM,MACJL,EAAQH,YAAc,IAEzB,GAAIR,EAAME,GACR,OAAOe,QAAQC,QAAQzB,EAAUQ,EAAiBC,KAGpD,IAAMiB,EAAwBjB,EAAS,cAEvC,GAAIF,EAAMmB,GAAgB,CACxB,IAAMC,EAAWjC,OAAOkC,OAAO,CAAA,EAAIlB,EAAgBQ,GACnD,WAAWM,QAAQ,SAAAC,GACjB,IAAMI,EAAYC,KAAKC,MACjBC,EAAQC,YAAY,WACpB1B,EAAME,IACRyB,cAAcF,GACdP,EAAQzB,EAAUQ,EAAiBC,MAC1BqB,KAAKC,MAAQF,EAAYF,EAAShB,UAC3CJ,EAAMmB,IAAiB,EACvBQ,cAAcF,GACdP,EAAQzB,EAAU2B,EAASf,gBAE/B,EAAG,IACL,EACD,CAGD,OAFAL,EAAMmB,IAAiB,EAEhBT,EAAIkB,aAAIhB,GACZiB,KAAK,SAAAC,GAGJ,OADA9B,EAAME,GAAU4B,EACZA,GAAO7D,EAAY6D,GAEdA,EAAI3D,QAEN6B,EAAME,EACf,SACO,SAAC6B,GACN,MAAMA,CACR,WACS,WACP/B,EAAMmB,IAAiB,CACzB,EACJ,CACF,CClFgB,SAAAa,IACZ,OAAOC,SAASC,eAAeC,oBACnC"}
@@ -1,2 +0,0 @@
1
- !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e||self).iunLibs={})}(this,function(e){function n(e){return"function"==typeof(null==e?void 0:e.clone)}function t(e){return"object"!=typeof e&&"function"!=typeof e&&"symbol"!=typeof e||null===e}function o(e){return t(e)?e+"":JSON.stringify(e,function(e,n){return"object"!=typeof n||null===n||Array.isArray(n)?n:Object.keys(n).sort().reduce(function(e,t){return e[t]=n[t],e},{})})}function i(e){if(null===e||"object"!=typeof e)return e;if(n(e))return e.clone();if(Array.isArray(e)){for(var t=[],o=0;o<e.length;o++)t[o]=i(e[o]);return t}if("object"==typeof e){var r={};for(var u in e)e.hasOwnProperty(u)&&(r[u]=i(e[u]));return r}return e}var r={};function u(e){return r[e]}var f={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};e.cloneDeep=i,e.createDocument=function(){return document.implementation.createHTMLDocument()},e.generateDeterministicUniqueKey=o,e.getGlobal=function(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this},e.isCloneable=n,e.isPrimitive=t,e.wrapFunctionWithCache=function(e,t){return void 0===t&&(t=f),function(){var l=[].slice.call(arguments),c=o(l)+e.name+(t.identifier||"");if(r[c])return Promise.resolve(i(u(c)));var a=c+"_wl_loading";if(r[a]){var s=Object.assign({},f,t);return new Promise(function(e){var n=Date.now(),t=setInterval(function(){r[c]?(clearInterval(t),e(i(u(c)))):Date.now()-n>s.timeout&&(r[a]=!1,clearInterval(t),e(i(s.timeoutResult)))},100)})}return r[a]=!0,e.apply(void 0,l).then(function(e){return r[c]=e,e&&n(e)?e.clone():r[c]}).catch(function(e){throw e}).finally(function(){r[a]=!1})}}});
2
- //# sourceMappingURL=browser.umd.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser.umd.js","sources":["../src/common/type.ts","../src/common/generateDeterministicUniqueKey.ts","../src/common/cloneDeep.ts","../src/common/wrapFunctionWithCache.ts","../src/browser/dom.ts","../src/common/getGlobal.ts"],"sourcesContent":["export type AsyncFunction<Args extends any[], T> = (\n ...args: Args\n) => Promise<T>;\n\ninterface Cloneable {\n clone(): this;\n}\n/**\n * 类型保护函数,检查一个对象是否实现了 Cloneable 接口\n */\nexport function isCloneable(obj: any): obj is Cloneable {\n return typeof obj?.clone === 'function';\n}\n\n/**\n *\n * @param value\n * @returns boolean\n *\n * 判断一个变量是否为简单值\n */\nexport function isPrimitive(\n value: any\n): value is string | number | boolean | null | undefined {\n return (\n (typeof value !== 'object' &&\n typeof value !== 'function' &&\n typeof value !== 'symbol') ||\n value === null\n );\n}\n","import { isPrimitive } from './type';\n/**\n * @private\n * 序列化 api 参数, 相等的对象,返回相同的字符串\n */\nexport function generateDeterministicUniqueKey(params: any) {\n if (isPrimitive(params)) {\n return 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\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 if (Array.isArray(obj)) {\n const newArray: any[] = [];\n for (let i = 0; i < obj.length; i++) {\n newArray[i] = cloneDeep(obj[i]);\n }\n return (newArray as unknown) as T;\n }\n\n if (typeof obj === 'object') {\n const newObj: { [key: string]: any } = {};\n for (let key in obj) {\n if ((obj as any).hasOwnProperty(key)) {\n newObj[key] = cloneDeep(obj[key]);\n }\n }\n return newObj as T;\n }\n\n return obj;\n}\n","// import { getGlobal } from './getGlobal';\nimport { generateDeterministicUniqueKey } from './generateDeterministicUniqueKey';\nimport { cloneDeep } from './cloneDeep';\nimport { isCloneable, AsyncFunction } from './type';\n// const global = getGlobal();\n// if (!global.__wl_fun_api_cache) {\n// global.__wl_fun_api_cache = {};\n// }\n\n// const cache = global.__wl_fun_api_cache;\nconst cache: Record<string, any> = {};\nfunction getCachedData<T = any>(apiKey: string) {\n return cache[apiKey] as T;\n}\n\ninterface Setting {\n timeout?: number;\n timeoutResult?: any;\n identifier?: string;\n}\nconst defalutSetting: Setting = {\n timeout: 60000,\n timeoutResult: { code: 408, msg: '请求超时' },\n identifier: '',\n};\n\n/**\n * 给函数包装缓存功能\n */\n\n\nexport function wrapFunctionWithCache<Args extends any[], T>(\n func: AsyncFunction<Args, T>,\n setting: Setting = defalutSetting\n): AsyncFunction<Args, T> {\n return function(...args: Args): Promise<T> {\n const apiKey: string =\n generateDeterministicUniqueKey(args) +\n func.name +\n (setting.identifier || ''); //缓存key\n\n if (cache[apiKey]) {\n return Promise.resolve(cloneDeep(getCachedData<T>(apiKey)));\n }\n\n const apiLoadingKey: string = apiKey + '_wl_loading'; //缓存loading key\n\n if (cache[apiLoadingKey]) {\n const _setting = Object.assign({}, defalutSetting, setting);\n return new Promise(resolve => {\n const startTime = Date.now();\n const timer = setInterval(() => {\n if (cache[apiKey]) {\n clearInterval(timer);\n resolve(cloneDeep(getCachedData<T>(apiKey)));\n } else if (Date.now() - startTime > _setting.timeout!) {\n cache[apiLoadingKey] = false;\n clearInterval(timer);\n resolve(cloneDeep(_setting.timeoutResult));\n }\n }, 100);\n });\n }\n cache[apiLoadingKey] = true;\n\n return func(...args)\n .then(res => {\n // 缓存原始数据,或者clone数据,不能return 同一份数据,会被释放\n cache[apiKey] = res;\n if (res && isCloneable(res)) {\n // fetch 缓存,不能把原始数据return,否则会被释放\n return res.clone();\n }\n return cache[apiKey];\n })\n .catch((error: any) => {\n throw error;\n })\n .finally(() => {\n cache[apiLoadingKey] = false;\n });\n };\n}\n","export function createDocument() {\n return document.implementation.createHTMLDocument();\n}","declare var global: typeof globalThis;\n\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"],"names":["isCloneable","obj","clone","isPrimitive","value","generateDeterministicUniqueKey","params","JSON","stringify","_key","Array","isArray","Object","keys","sort","reduce","pre","cur","cloneDeep","newArray","i","length","newObj","key","hasOwnProperty","cache","getCachedData","apiKey","defalutSetting","timeout","timeoutResult","code","msg","identifier","document","implementation","createHTMLDocument","globalThis","self","window","global","this","func","setting","args","slice","call","arguments","name","Promise","resolve","apiLoadingKey","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","apply","then","res","error"],"mappings":"iOAUM,SAAUA,EAAYC,GAC1B,MAA6B,yBAAfA,SAAAA,EAAKC,MACrB,CASM,SAAUC,EACdC,GAEA,MACoB,iBAAVA,GACW,mBAAVA,GACU,iBAAVA,GACC,OAAVA,CAEJ,CCzBgB,SAAAC,EAA+BC,GAC7C,OAAIH,EAAYG,GACPA,EAAS,GAEXC,KAAKC,UAAUF,EAAQ,SAASG,EAAuBL,GAC5D,MAAqB,iBAAVA,GAAgC,OAAVA,GAAmBM,MAAMC,QAAQP,GAQ3DA,EAPEQ,OAAOC,KAAKT,GAChBU,OACAC,OAAO,SAACC,EAAUC,GAEjB,OADAD,EAAIC,GAAOb,EAAMa,GACVD,CACT,EAAG,CAAE,EAGX,EACF,CClBgB,SAAAE,EAAajB,GAC3B,GAAY,OAARA,GAA+B,iBAARA,EACzB,OAAOA,EAGT,GAAGD,EAAYC,GACb,OAAOA,EAAIC,QAGb,GAAIQ,MAAMC,QAAQV,GAAM,CAEtB,IADA,IAAMkB,EAAkB,GACfC,EAAI,EAAGA,EAAInB,EAAIoB,OAAQD,IAC9BD,EAASC,GAAKF,EAAUjB,EAAImB,IAE9B,OAAQD,CACT,CAED,GAAmB,iBAARlB,EAAkB,CAC3B,IAAMqB,EAAiC,CAAE,EACzC,IAAK,IAAIC,KAAOtB,EACTA,EAAYuB,eAAeD,KAC9BD,EAAOC,GAAOL,EAAUjB,EAAIsB,KAGhC,OAAOD,CACR,CAED,OAAOrB,CACT,CCpBA,IAAMwB,EAA6B,CAAE,EACrC,SAASC,EAAuBC,GAC9B,OAAOF,EAAME,EACf,CAOA,IAAMC,EAA0B,CAC9BC,QAAS,IACTC,cAAe,CAAEC,KAAM,IAAKC,IAAK,QACjCC,WAAY,mCCvBE,WACZ,OAAOC,SAASC,eAAeC,oBACnC,4DCEE,MAA0B,oBAAfC,WACFA,WAGW,oBAATC,KACFA,KAGa,oBAAXC,OACFA,OAGa,oBAAXC,OACFA,OAKXC,IAAA,mEFUEC,EACAC,GAEA,gBAFAA,IAAAA,EAAmBf,GAEZ,eAAYgB,EAAUC,GAAAA,MAAAC,KAAAC,WACrBpB,EACJtB,EAA+BuC,GAC/BF,EAAKM,MACJL,EAAQV,YAAc,IAEzB,GAAIR,EAAME,GACR,OAAOsB,QAAQC,QAAQhC,EAAUQ,EAAiBC,KAGpD,IAAMwB,EAAwBxB,EAAS,cAEvC,GAAIF,EAAM0B,GAAgB,CACxB,IAAMC,EAAWxC,OAAOyC,OAAO,CAAA,EAAIzB,EAAgBe,GACnD,WAAWM,QAAQ,SAAAC,GACjB,IAAMI,EAAYC,KAAKC,MACjBC,EAAQC,YAAY,WACpBjC,EAAME,IACRgC,cAAcF,GACdP,EAAQhC,EAAUQ,EAAiBC,MAC1B4B,KAAKC,MAAQF,EAAYF,EAASvB,UAC3CJ,EAAM0B,IAAiB,EACvBQ,cAAcF,GACdP,EAAQhC,EAAUkC,EAAStB,gBAE/B,EAAG,IACL,EACD,CAGD,OAFAL,EAAM0B,IAAiB,EAEhBT,EAAIkB,aAAIhB,GACZiB,KAAK,SAAAC,GAGJ,OADArC,EAAME,GAAUmC,EACZA,GAAO9D,EAAY8D,GAEdA,EAAI5D,QAENuB,EAAME,EACf,SACO,SAACoC,GACN,MAAMA,CACR,WACS,WACPtC,EAAM0B,IAAiB,CACzB,EACJ,CACF"}
@@ -1,5 +0,0 @@
1
- /**
2
- * @private
3
- * 序列化 api 参数, 相等的对象,返回相同的字符串
4
- */
5
- export declare function generateDeterministicUniqueKey(params: any): string;
package/dist/node.cjs DELETED
@@ -1,2 +0,0 @@
1
- function e(e){return"function"==typeof(null==e?void 0:e.clone)}function n(e){return"object"!=typeof e&&"function"!=typeof e&&"symbol"!=typeof e||null===e}function t(e){return n(e)?e+"":JSON.stringify(e,function(e,n){return"object"!=typeof n||null===n||Array.isArray(n)?n:Object.keys(n).sort().reduce(function(e,t){return e[t]=n[t],e},{})})}function r(n){if(null===n||"object"!=typeof n)return n;if(e(n))return n.clone();if(Array.isArray(n)){for(var t=[],o=0;o<n.length;o++)t[o]=r(n[o]);return t}if("object"==typeof n){var i={};for(var u in n)n.hasOwnProperty(u)&&(i[u]=r(n[u]));return i}return n}var o={};function i(e){return o[e]}var u={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};exports.cloneDeep=r,exports.generateDeterministicUniqueKey=t,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.wrapFunctionWithCache=function(n,f){return void 0===f&&(f=u),function(){var l=[].slice.call(arguments),c=t(l)+n.name+(f.identifier||"");if(o[c])return Promise.resolve(r(i(c)));var a=c+"_wl_loading";if(o[a]){var s=Object.assign({},u,f);return new Promise(function(e){var n=Date.now(),t=setInterval(function(){o[c]?(clearInterval(t),e(r(i(c)))):Date.now()-n>s.timeout&&(o[a]=!1,clearInterval(t),e(r(s.timeoutResult)))},100)})}return o[a]=!0,n.apply(void 0,l).then(function(n){return o[c]=n,n&&e(n)?n.clone():o[c]}).catch(function(e){throw e}).finally(function(){o[a]=!1})}};
2
- //# sourceMappingURL=node.cjs.map
package/dist/node.cjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"node.cjs","sources":["../src/common/type.ts","../src/common/generateDeterministicUniqueKey.ts","../src/common/cloneDeep.ts","../src/common/wrapFunctionWithCache.ts","../src/common/getGlobal.ts"],"sourcesContent":["export type AsyncFunction<Args extends any[], T> = (\n ...args: Args\n) => Promise<T>;\n\ninterface Cloneable {\n clone(): this;\n}\n/**\n * 类型保护函数,检查一个对象是否实现了 Cloneable 接口\n */\nexport function isCloneable(obj: any): obj is Cloneable {\n return typeof obj?.clone === 'function';\n}\n\n/**\n *\n * @param value\n * @returns boolean\n *\n * 判断一个变量是否为简单值\n */\nexport function isPrimitive(\n value: any\n): value is string | number | boolean | null | undefined {\n return (\n (typeof value !== 'object' &&\n typeof value !== 'function' &&\n typeof value !== 'symbol') ||\n value === null\n );\n}\n","import { isPrimitive } from './type';\n/**\n * @private\n * 序列化 api 参数, 相等的对象,返回相同的字符串\n */\nexport function generateDeterministicUniqueKey(params: any) {\n if (isPrimitive(params)) {\n return 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\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 if (Array.isArray(obj)) {\n const newArray: any[] = [];\n for (let i = 0; i < obj.length; i++) {\n newArray[i] = cloneDeep(obj[i]);\n }\n return (newArray as unknown) as T;\n }\n\n if (typeof obj === 'object') {\n const newObj: { [key: string]: any } = {};\n for (let key in obj) {\n if ((obj as any).hasOwnProperty(key)) {\n newObj[key] = cloneDeep(obj[key]);\n }\n }\n return newObj as T;\n }\n\n return obj;\n}\n","// import { getGlobal } from './getGlobal';\nimport { generateDeterministicUniqueKey } from './generateDeterministicUniqueKey';\nimport { cloneDeep } from './cloneDeep';\nimport { isCloneable, AsyncFunction } from './type';\n// const global = getGlobal();\n// if (!global.__wl_fun_api_cache) {\n// global.__wl_fun_api_cache = {};\n// }\n\n// const cache = global.__wl_fun_api_cache;\nconst cache: Record<string, any> = {};\nfunction getCachedData<T = any>(apiKey: string) {\n return cache[apiKey] as T;\n}\n\ninterface Setting {\n timeout?: number;\n timeoutResult?: any;\n identifier?: string;\n}\nconst defalutSetting: Setting = {\n timeout: 60000,\n timeoutResult: { code: 408, msg: '请求超时' },\n identifier: '',\n};\n\n/**\n * 给函数包装缓存功能\n */\n\n\nexport function wrapFunctionWithCache<Args extends any[], T>(\n func: AsyncFunction<Args, T>,\n setting: Setting = defalutSetting\n): AsyncFunction<Args, T> {\n return function(...args: Args): Promise<T> {\n const apiKey: string =\n generateDeterministicUniqueKey(args) +\n func.name +\n (setting.identifier || ''); //缓存key\n\n if (cache[apiKey]) {\n return Promise.resolve(cloneDeep(getCachedData<T>(apiKey)));\n }\n\n const apiLoadingKey: string = apiKey + '_wl_loading'; //缓存loading key\n\n if (cache[apiLoadingKey]) {\n const _setting = Object.assign({}, defalutSetting, setting);\n return new Promise(resolve => {\n const startTime = Date.now();\n const timer = setInterval(() => {\n if (cache[apiKey]) {\n clearInterval(timer);\n resolve(cloneDeep(getCachedData<T>(apiKey)));\n } else if (Date.now() - startTime > _setting.timeout!) {\n cache[apiLoadingKey] = false;\n clearInterval(timer);\n resolve(cloneDeep(_setting.timeoutResult));\n }\n }, 100);\n });\n }\n cache[apiLoadingKey] = true;\n\n return func(...args)\n .then(res => {\n // 缓存原始数据,或者clone数据,不能return 同一份数据,会被释放\n cache[apiKey] = res;\n if (res && isCloneable(res)) {\n // fetch 缓存,不能把原始数据return,否则会被释放\n return res.clone();\n }\n return cache[apiKey];\n })\n .catch((error: any) => {\n throw error;\n })\n .finally(() => {\n cache[apiLoadingKey] = false;\n });\n };\n}\n","declare var global: typeof globalThis;\n\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"],"names":["isCloneable","obj","clone","isPrimitive","value","generateDeterministicUniqueKey","params","JSON","stringify","_key","Array","isArray","Object","keys","sort","reduce","pre","cur","cloneDeep","newArray","i","length","newObj","key","hasOwnProperty","cache","getCachedData","apiKey","defalutSetting","timeout","timeoutResult","code","msg","identifier","globalThis","self","window","global","this","func","setting","args","slice","call","arguments","name","Promise","resolve","apiLoadingKey","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","apply","then","res","error"],"mappings":"AAUM,SAAUA,EAAYC,GAC1B,MAA6B,yBAAfA,SAAAA,EAAKC,MACrB,CASM,SAAUC,EACdC,GAEA,MACoB,iBAAVA,GACW,mBAAVA,GACU,iBAAVA,GACC,OAAVA,CAEJ,CCzBgB,SAAAC,EAA+BC,GAC7C,OAAIH,EAAYG,GACPA,EAAS,GAEXC,KAAKC,UAAUF,EAAQ,SAASG,EAAuBL,GAC5D,MAAqB,iBAAVA,GAAgC,OAAVA,GAAmBM,MAAMC,QAAQP,GAQ3DA,EAPEQ,OAAOC,KAAKT,GAChBU,OACAC,OAAO,SAACC,EAAUC,GAEjB,OADAD,EAAIC,GAAOb,EAAMa,GACVD,CACT,EAAG,CAAE,EAGX,EACF,CClBgB,SAAAE,EAAajB,GAC3B,GAAY,OAARA,GAA+B,iBAARA,EACzB,OAAOA,EAGT,GAAGD,EAAYC,GACb,OAAOA,EAAIC,QAGb,GAAIQ,MAAMC,QAAQV,GAAM,CAEtB,IADA,IAAMkB,EAAkB,GACfC,EAAI,EAAGA,EAAInB,EAAIoB,OAAQD,IAC9BD,EAASC,GAAKF,EAAUjB,EAAImB,IAE9B,OAAQD,CACT,CAED,GAAmB,iBAARlB,EAAkB,CAC3B,IAAMqB,EAAiC,CAAE,EACzC,IAAK,IAAIC,KAAOtB,EACTA,EAAYuB,eAAeD,KAC9BD,EAAOC,GAAOL,EAAUjB,EAAIsB,KAGhC,OAAOD,CACR,CAED,OAAOrB,CACT,CCpBA,IAAMwB,EAA6B,CAAE,EACrC,SAASC,EAAuBC,GAC9B,OAAOF,EAAME,EACf,CAOA,IAAMC,EAA0B,CAC9BC,QAAS,IACTC,cAAe,CAAEC,KAAM,IAAKC,IAAK,QACjCC,WAAY,8FCnBZ,MAA0B,oBAAfC,WACFA,WAGW,oBAATC,KACFA,KAGa,oBAAXC,OACFA,OAGa,oBAAXC,OACFA,OAKXC,IAAA,qFDUEC,EACAC,GAEA,gBAFAA,IAAAA,EAAmBZ,GAEZ,eAAYa,EAAUC,GAAAA,MAAAC,KAAAC,WACrBjB,EACJtB,EAA+BoC,GAC/BF,EAAKM,MACJL,EAAQP,YAAc,IAEzB,GAAIR,EAAME,GACR,OAAOmB,QAAQC,QAAQ7B,EAAUQ,EAAiBC,KAGpD,IAAMqB,EAAwBrB,EAAS,cAEvC,GAAIF,EAAMuB,GAAgB,CACxB,IAAMC,EAAWrC,OAAOsC,OAAO,CAAA,EAAItB,EAAgBY,GACnD,WAAWM,QAAQ,SAAAC,GACjB,IAAMI,EAAYC,KAAKC,MACjBC,EAAQC,YAAY,WACpB9B,EAAME,IACR6B,cAAcF,GACdP,EAAQ7B,EAAUQ,EAAiBC,MAC1ByB,KAAKC,MAAQF,EAAYF,EAASpB,UAC3CJ,EAAMuB,IAAiB,EACvBQ,cAAcF,GACdP,EAAQ7B,EAAU+B,EAASnB,gBAE/B,EAAG,IACL,EACD,CAGD,OAFAL,EAAMuB,IAAiB,EAEhBT,EAAIkB,aAAIhB,GACZiB,KAAK,SAAAC,GAGJ,OADAlC,EAAME,GAAUgC,EACZA,GAAO3D,EAAY2D,GAEdA,EAAIzD,QAENuB,EAAME,EACf,SACO,SAACiC,GACN,MAAMA,CACR,WACS,WACPnC,EAAMuB,IAAiB,CACzB,EACJ,CACF"}
package/dist/node.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export * from "./common";
2
- export * from "./node/index";
@@ -1,2 +0,0 @@
1
- function e(e){return"function"==typeof(null==e?void 0:e.clone)}function t(e){return"object"!=typeof e&&"function"!=typeof e&&"symbol"!=typeof e||null===e}function n(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this}function o(e){return t(e)?e+"":JSON.stringify(e,function(e,t){return"object"!=typeof t||null===t||Array.isArray(t)?t:Object.keys(t).sort().reduce((e,n)=>(e[n]=t[n],e),{})})}function r(t){if(null===t||"object"!=typeof t)return t;if(e(t))return t.clone();if(Array.isArray(t)){const e=[];for(let n=0;n<t.length;n++)e[n]=r(t[n]);return e}if("object"==typeof t){const e={};for(let n in t)t.hasOwnProperty(n)&&(e[n]=r(t[n]));return e}return t}const i={};function u(e){return i[e]}const f={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};function l(t,n=f){return function(...l){const c=o(l)+t.name+(n.identifier||"");if(i[c])return Promise.resolve(r(u(c)));const s=c+"_wl_loading";if(i[s]){const e=Object.assign({},f,n);return new Promise(t=>{const n=Date.now(),o=setInterval(()=>{i[c]?(clearInterval(o),t(r(u(c)))):Date.now()-n>e.timeout&&(i[s]=!1,clearInterval(o),t(r(e.timeoutResult)))},100)})}return i[s]=!0,t(...l).then(t=>(i[c]=t,t&&e(t)?t.clone():i[c])).catch(e=>{throw e}).finally(()=>{i[s]=!1})}}export{r as cloneDeep,o as generateDeterministicUniqueKey,n as getGlobal,e as isCloneable,t as isPrimitive,l as wrapFunctionWithCache};
2
- //# sourceMappingURL=node.modern.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node.modern.js","sources":["../src/common/type.ts","../src/common/getGlobal.ts","../src/common/generateDeterministicUniqueKey.ts","../src/common/cloneDeep.ts","../src/common/wrapFunctionWithCache.ts"],"sourcesContent":["export type AsyncFunction<Args extends any[], T> = (\n ...args: Args\n) => Promise<T>;\n\ninterface Cloneable {\n clone(): this;\n}\n/**\n * 类型保护函数,检查一个对象是否实现了 Cloneable 接口\n */\nexport function isCloneable(obj: any): obj is Cloneable {\n return typeof obj?.clone === 'function';\n}\n\n/**\n *\n * @param value\n * @returns boolean\n *\n * 判断一个变量是否为简单值\n */\nexport function isPrimitive(\n value: any\n): value is string | number | boolean | null | undefined {\n return (\n (typeof value !== 'object' &&\n typeof value !== 'function' &&\n typeof value !== 'symbol') ||\n value === null\n );\n}\n","declare var global: typeof globalThis;\n\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 * @private\n * 序列化 api 参数, 相等的对象,返回相同的字符串\n */\nexport function generateDeterministicUniqueKey(params: any) {\n if (isPrimitive(params)) {\n return 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\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 if (Array.isArray(obj)) {\n const newArray: any[] = [];\n for (let i = 0; i < obj.length; i++) {\n newArray[i] = cloneDeep(obj[i]);\n }\n return (newArray as unknown) as T;\n }\n\n if (typeof obj === 'object') {\n const newObj: { [key: string]: any } = {};\n for (let key in obj) {\n if ((obj as any).hasOwnProperty(key)) {\n newObj[key] = cloneDeep(obj[key]);\n }\n }\n return newObj as T;\n }\n\n return obj;\n}\n","// import { getGlobal } from './getGlobal';\nimport { generateDeterministicUniqueKey } from './generateDeterministicUniqueKey';\nimport { cloneDeep } from './cloneDeep';\nimport { isCloneable, AsyncFunction } from './type';\n// const global = getGlobal();\n// if (!global.__wl_fun_api_cache) {\n// global.__wl_fun_api_cache = {};\n// }\n\n// const cache = global.__wl_fun_api_cache;\nconst cache: Record<string, any> = {};\nfunction getCachedData<T = any>(apiKey: string) {\n return cache[apiKey] as T;\n}\n\ninterface Setting {\n timeout?: number;\n timeoutResult?: any;\n identifier?: string;\n}\nconst defalutSetting: Setting = {\n timeout: 60000,\n timeoutResult: { code: 408, msg: '请求超时' },\n identifier: '',\n};\n\n/**\n * 给函数包装缓存功能\n */\n\n\nexport function wrapFunctionWithCache<Args extends any[], T>(\n func: AsyncFunction<Args, T>,\n setting: Setting = defalutSetting\n): AsyncFunction<Args, T> {\n return function(...args: Args): Promise<T> {\n const apiKey: string =\n generateDeterministicUniqueKey(args) +\n func.name +\n (setting.identifier || ''); //缓存key\n\n if (cache[apiKey]) {\n return Promise.resolve(cloneDeep(getCachedData<T>(apiKey)));\n }\n\n const apiLoadingKey: string = apiKey + '_wl_loading'; //缓存loading key\n\n if (cache[apiLoadingKey]) {\n const _setting = Object.assign({}, defalutSetting, setting);\n return new Promise(resolve => {\n const startTime = Date.now();\n const timer = setInterval(() => {\n if (cache[apiKey]) {\n clearInterval(timer);\n resolve(cloneDeep(getCachedData<T>(apiKey)));\n } else if (Date.now() - startTime > _setting.timeout!) {\n cache[apiLoadingKey] = false;\n clearInterval(timer);\n resolve(cloneDeep(_setting.timeoutResult));\n }\n }, 100);\n });\n }\n cache[apiLoadingKey] = true;\n\n return func(...args)\n .then(res => {\n // 缓存原始数据,或者clone数据,不能return 同一份数据,会被释放\n cache[apiKey] = res;\n if (res && isCloneable(res)) {\n // fetch 缓存,不能把原始数据return,否则会被释放\n return res.clone();\n }\n return cache[apiKey];\n })\n .catch((error: any) => {\n throw error;\n })\n .finally(() => {\n cache[apiLoadingKey] = false;\n });\n };\n}\n"],"names":["isCloneable","obj","clone","isPrimitive","value","getGlobal","globalThis","self","window","global","this","generateDeterministicUniqueKey","params","JSON","stringify","_key","Array","isArray","Object","keys","sort","reduce","pre","cur","cloneDeep","newArray","i","length","newObj","key","hasOwnProperty","cache","getCachedData","apiKey","defalutSetting","timeout","timeoutResult","code","msg","identifier","wrapFunctionWithCache","func","setting","args","name","Promise","resolve","apiLoadingKey","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","then","res","catch","error","finally"],"mappings":"AAUM,SAAUA,EAAYC,GAC1B,MAA6B,yBAAfA,SAAAA,EAAKC,MACrB,CASM,SAAUC,EACdC,GAEA,MACoB,iBAAVA,GACW,mBAAVA,GACU,iBAAVA,GACC,OAAVA,CAEJ,UC3BgBC,IACd,MAA0B,oBAAfC,WACFA,WAGW,oBAATC,KACFA,KAGa,oBAAXC,OACFA,OAGa,oBAAXC,OACFA,OAKXC,IAAA,CCjBgB,SAAAC,EAA+BC,GAC7C,OAAIT,EAAYS,GACPA,EAAS,GAEXC,KAAKC,UAAUF,EAAQ,SAASG,EAAuBX,GAC5D,MAAqB,iBAAVA,GAAgC,OAAVA,GAAmBY,MAAMC,QAAQb,GAQ3DA,EAPEc,OAAOC,KAAKf,GAChBgB,OACAC,OAAO,CAACC,EAAUC,KACjBD,EAAIC,GAAOnB,EAAMmB,GACVD,GACN,CAAE,EAGX,EACF,CClBgB,SAAAE,EAAavB,GAC3B,GAAY,OAARA,GAA+B,iBAARA,EACzB,OAAOA,EAGT,GAAGD,EAAYC,GACb,OAAOA,EAAIC,QAGb,GAAIc,MAAMC,QAAQhB,GAAM,CACtB,MAAMwB,EAAkB,GACxB,IAAK,IAAIC,EAAI,EAAGA,EAAIzB,EAAI0B,OAAQD,IAC9BD,EAASC,GAAKF,EAAUvB,EAAIyB,IAE9B,OAAQD,CACT,CAED,GAAmB,iBAARxB,EAAkB,CAC3B,MAAM2B,EAAiC,CAAE,EACzC,IAAK,IAAIC,KAAO5B,EACTA,EAAY6B,eAAeD,KAC9BD,EAAOC,GAAOL,EAAUvB,EAAI4B,KAGhC,OAAOD,CACR,CAED,OAAO3B,CACT,CCpBA,MAAM8B,EAA6B,CAAE,EACrC,SAASC,EAAuBC,GAC9B,OAAOF,EAAME,EACf,CAOA,MAAMC,EAA0B,CAC9BC,QAAS,IACTC,cAAe,CAAEC,KAAM,IAAKC,IAAK,QACjCC,WAAY,aAQEC,EACdC,EACAC,EAAmBR,GAEnB,OAAgB,YAAGS,GACjB,MAAMV,EACJtB,EAA+BgC,GAC/BF,EAAKG,MACJF,EAAQH,YAAc,IAEzB,GAAIR,EAAME,GACR,OAAOY,QAAQC,QAAQtB,EAAUQ,EAAiBC,KAGpD,MAAMc,EAAwBd,EAAS,cAEvC,GAAIF,EAAMgB,GAAgB,CACxB,MAAMC,EAAW9B,OAAO+B,OAAO,CAAA,EAAIf,EAAgBQ,GACnD,OAAO,IAAIG,QAAQC,IACjB,MAAMI,EAAYC,KAAKC,MACjBC,EAAQC,YAAY,KACpBvB,EAAME,IACRsB,cAAcF,GACdP,EAAQtB,EAAUQ,EAAiBC,MAC1BkB,KAAKC,MAAQF,EAAYF,EAASb,UAC3CJ,EAAMgB,IAAiB,EACvBQ,cAAcF,GACdP,EAAQtB,EAAUwB,EAASZ,gBAC5B,EACA,IACL,EACD,CAGD,OAFAL,EAAMgB,IAAiB,EAEhBN,KAAQE,GACZa,KAAKC,IAEJ1B,EAAME,GAAUwB,EACZA,GAAOzD,EAAYyD,GAEdA,EAAIvD,QAEN6B,EAAME,KAEdyB,MAAOC,IACN,MAAMA,IAEPC,QAAQ,KACP7B,EAAMgB,IAAiB,CACzB,EACJ,CACF"}
@@ -1,2 +0,0 @@
1
- function n(n){return"function"==typeof(null==n?void 0:n.clone)}function e(n){return"object"!=typeof n&&"function"!=typeof n&&"symbol"!=typeof n||null===n}function t(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this}function r(n){return e(n)?n+"":JSON.stringify(n,function(n,e){return"object"!=typeof e||null===e||Array.isArray(e)?e:Object.keys(e).sort().reduce(function(n,t){return n[t]=e[t],n},{})})}function o(e){if(null===e||"object"!=typeof e)return e;if(n(e))return e.clone();if(Array.isArray(e)){for(var t=[],r=0;r<e.length;r++)t[r]=o(e[r]);return t}if("object"==typeof e){var i={};for(var u in e)e.hasOwnProperty(u)&&(i[u]=o(e[u]));return i}return e}var i={};function u(n){return i[n]}var f={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};function l(e,t){return void 0===t&&(t=f),function(){var l=[].slice.call(arguments),c=r(l)+e.name+(t.identifier||"");if(i[c])return Promise.resolve(o(u(c)));var a=c+"_wl_loading";if(i[a]){var s=Object.assign({},f,t);return new Promise(function(n){var e=Date.now(),t=setInterval(function(){i[c]?(clearInterval(t),n(o(u(c)))):Date.now()-e>s.timeout&&(i[a]=!1,clearInterval(t),n(o(s.timeoutResult)))},100)})}return i[a]=!0,e.apply(void 0,l).then(function(e){return i[c]=e,e&&n(e)?e.clone():i[c]}).catch(function(n){throw n}).finally(function(){i[a]=!1})}}export{o as cloneDeep,r as generateDeterministicUniqueKey,t as getGlobal,n as isCloneable,e as isPrimitive,l as wrapFunctionWithCache};
2
- //# sourceMappingURL=node.module.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node.module.js","sources":["../src/common/type.ts","../src/common/getGlobal.ts","../src/common/generateDeterministicUniqueKey.ts","../src/common/cloneDeep.ts","../src/common/wrapFunctionWithCache.ts"],"sourcesContent":["export type AsyncFunction<Args extends any[], T> = (\n ...args: Args\n) => Promise<T>;\n\ninterface Cloneable {\n clone(): this;\n}\n/**\n * 类型保护函数,检查一个对象是否实现了 Cloneable 接口\n */\nexport function isCloneable(obj: any): obj is Cloneable {\n return typeof obj?.clone === 'function';\n}\n\n/**\n *\n * @param value\n * @returns boolean\n *\n * 判断一个变量是否为简单值\n */\nexport function isPrimitive(\n value: any\n): value is string | number | boolean | null | undefined {\n return (\n (typeof value !== 'object' &&\n typeof value !== 'function' &&\n typeof value !== 'symbol') ||\n value === null\n );\n}\n","declare var global: typeof globalThis;\n\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 * @private\n * 序列化 api 参数, 相等的对象,返回相同的字符串\n */\nexport function generateDeterministicUniqueKey(params: any) {\n if (isPrimitive(params)) {\n return 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\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 if (Array.isArray(obj)) {\n const newArray: any[] = [];\n for (let i = 0; i < obj.length; i++) {\n newArray[i] = cloneDeep(obj[i]);\n }\n return (newArray as unknown) as T;\n }\n\n if (typeof obj === 'object') {\n const newObj: { [key: string]: any } = {};\n for (let key in obj) {\n if ((obj as any).hasOwnProperty(key)) {\n newObj[key] = cloneDeep(obj[key]);\n }\n }\n return newObj as T;\n }\n\n return obj;\n}\n","// import { getGlobal } from './getGlobal';\nimport { generateDeterministicUniqueKey } from './generateDeterministicUniqueKey';\nimport { cloneDeep } from './cloneDeep';\nimport { isCloneable, AsyncFunction } from './type';\n// const global = getGlobal();\n// if (!global.__wl_fun_api_cache) {\n// global.__wl_fun_api_cache = {};\n// }\n\n// const cache = global.__wl_fun_api_cache;\nconst cache: Record<string, any> = {};\nfunction getCachedData<T = any>(apiKey: string) {\n return cache[apiKey] as T;\n}\n\ninterface Setting {\n timeout?: number;\n timeoutResult?: any;\n identifier?: string;\n}\nconst defalutSetting: Setting = {\n timeout: 60000,\n timeoutResult: { code: 408, msg: '请求超时' },\n identifier: '',\n};\n\n/**\n * 给函数包装缓存功能\n */\n\n\nexport function wrapFunctionWithCache<Args extends any[], T>(\n func: AsyncFunction<Args, T>,\n setting: Setting = defalutSetting\n): AsyncFunction<Args, T> {\n return function(...args: Args): Promise<T> {\n const apiKey: string =\n generateDeterministicUniqueKey(args) +\n func.name +\n (setting.identifier || ''); //缓存key\n\n if (cache[apiKey]) {\n return Promise.resolve(cloneDeep(getCachedData<T>(apiKey)));\n }\n\n const apiLoadingKey: string = apiKey + '_wl_loading'; //缓存loading key\n\n if (cache[apiLoadingKey]) {\n const _setting = Object.assign({}, defalutSetting, setting);\n return new Promise(resolve => {\n const startTime = Date.now();\n const timer = setInterval(() => {\n if (cache[apiKey]) {\n clearInterval(timer);\n resolve(cloneDeep(getCachedData<T>(apiKey)));\n } else if (Date.now() - startTime > _setting.timeout!) {\n cache[apiLoadingKey] = false;\n clearInterval(timer);\n resolve(cloneDeep(_setting.timeoutResult));\n }\n }, 100);\n });\n }\n cache[apiLoadingKey] = true;\n\n return func(...args)\n .then(res => {\n // 缓存原始数据,或者clone数据,不能return 同一份数据,会被释放\n cache[apiKey] = res;\n if (res && isCloneable(res)) {\n // fetch 缓存,不能把原始数据return,否则会被释放\n return res.clone();\n }\n return cache[apiKey];\n })\n .catch((error: any) => {\n throw error;\n })\n .finally(() => {\n cache[apiLoadingKey] = false;\n });\n };\n}\n"],"names":["isCloneable","obj","clone","isPrimitive","value","getGlobal","globalThis","self","window","global","this","generateDeterministicUniqueKey","params","JSON","stringify","_key","Array","isArray","Object","keys","sort","reduce","pre","cur","cloneDeep","newArray","i","length","newObj","key","hasOwnProperty","cache","getCachedData","apiKey","defalutSetting","timeout","timeoutResult","code","msg","identifier","wrapFunctionWithCache","func","setting","args","slice","call","arguments","name","Promise","resolve","apiLoadingKey","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","apply","then","res","error"],"mappings":"AAUM,SAAUA,EAAYC,GAC1B,MAA6B,yBAAfA,SAAAA,EAAKC,MACrB,CASM,SAAUC,EACdC,GAEA,MACoB,iBAAVA,GACW,mBAAVA,GACU,iBAAVA,GACC,OAAVA,CAEJ,UC3BgBC,IACd,MAA0B,oBAAfC,WACFA,WAGW,oBAATC,KACFA,KAGa,oBAAXC,OACFA,OAGa,oBAAXC,OACFA,OAKXC,IAAA,CCjBgB,SAAAC,EAA+BC,GAC7C,OAAIT,EAAYS,GACPA,EAAS,GAEXC,KAAKC,UAAUF,EAAQ,SAASG,EAAuBX,GAC5D,MAAqB,iBAAVA,GAAgC,OAAVA,GAAmBY,MAAMC,QAAQb,GAQ3DA,EAPEc,OAAOC,KAAKf,GAChBgB,OACAC,OAAO,SAACC,EAAUC,GAEjB,OADAD,EAAIC,GAAOnB,EAAMmB,GACVD,CACT,EAAG,CAAE,EAGX,EACF,CClBgB,SAAAE,EAAavB,GAC3B,GAAY,OAARA,GAA+B,iBAARA,EACzB,OAAOA,EAGT,GAAGD,EAAYC,GACb,OAAOA,EAAIC,QAGb,GAAIc,MAAMC,QAAQhB,GAAM,CAEtB,IADA,IAAMwB,EAAkB,GACfC,EAAI,EAAGA,EAAIzB,EAAI0B,OAAQD,IAC9BD,EAASC,GAAKF,EAAUvB,EAAIyB,IAE9B,OAAQD,CACT,CAED,GAAmB,iBAARxB,EAAkB,CAC3B,IAAM2B,EAAiC,CAAE,EACzC,IAAK,IAAIC,KAAO5B,EACTA,EAAY6B,eAAeD,KAC9BD,EAAOC,GAAOL,EAAUvB,EAAI4B,KAGhC,OAAOD,CACR,CAED,OAAO3B,CACT,CCpBA,IAAM8B,EAA6B,CAAE,EACrC,SAASC,EAAuBC,GAC9B,OAAOF,EAAME,EACf,CAOA,IAAMC,EAA0B,CAC9BC,QAAS,IACTC,cAAe,CAAEC,KAAM,IAAKC,IAAK,QACjCC,WAAY,aAQEC,EACdC,EACAC,GAEA,gBAFAA,IAAAA,EAAmBR,GAEZ,eAAYS,EAAUC,GAAAA,MAAAC,KAAAC,WACrBb,EACJtB,EAA+BgC,GAC/BF,EAAKM,MACJL,EAAQH,YAAc,IAEzB,GAAIR,EAAME,GACR,OAAOe,QAAQC,QAAQzB,EAAUQ,EAAiBC,KAGpD,IAAMiB,EAAwBjB,EAAS,cAEvC,GAAIF,EAAMmB,GAAgB,CACxB,IAAMC,EAAWjC,OAAOkC,OAAO,CAAA,EAAIlB,EAAgBQ,GACnD,WAAWM,QAAQ,SAAAC,GACjB,IAAMI,EAAYC,KAAKC,MACjBC,EAAQC,YAAY,WACpB1B,EAAME,IACRyB,cAAcF,GACdP,EAAQzB,EAAUQ,EAAiBC,MAC1BqB,KAAKC,MAAQF,EAAYF,EAAShB,UAC3CJ,EAAMmB,IAAiB,EACvBQ,cAAcF,GACdP,EAAQzB,EAAU2B,EAASf,gBAE/B,EAAG,IACL,EACD,CAGD,OAFAL,EAAMmB,IAAiB,EAEhBT,EAAIkB,aAAIhB,GACZiB,KAAK,SAAAC,GAGJ,OADA9B,EAAME,GAAU4B,EACZA,GAAO7D,EAAY6D,GAEdA,EAAI3D,QAEN6B,EAAME,EACf,SACO,SAAC6B,GACN,MAAMA,CACR,WACS,WACP/B,EAAMmB,IAAiB,CACzB,EACJ,CACF"}
package/dist/node.umd.js DELETED
@@ -1,2 +0,0 @@
1
- !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e||self).iunLibs={})}(this,function(e){function n(e){return"function"==typeof(null==e?void 0:e.clone)}function t(e){return"object"!=typeof e&&"function"!=typeof e&&"symbol"!=typeof e||null===e}function i(e){return t(e)?e+"":JSON.stringify(e,function(e,n){return"object"!=typeof n||null===n||Array.isArray(n)?n:Object.keys(n).sort().reduce(function(e,t){return e[t]=n[t],e},{})})}function o(e){if(null===e||"object"!=typeof e)return e;if(n(e))return e.clone();if(Array.isArray(e)){for(var t=[],i=0;i<e.length;i++)t[i]=o(e[i]);return t}if("object"==typeof e){var r={};for(var f in e)e.hasOwnProperty(f)&&(r[f]=o(e[f]));return r}return e}var r={};function f(e){return r[e]}var u={timeout:6e4,timeoutResult:{code:408,msg:"请求超时"},identifier:""};e.cloneDeep=o,e.generateDeterministicUniqueKey=i,e.getGlobal=function(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this},e.isCloneable=n,e.isPrimitive=t,e.wrapFunctionWithCache=function(e,t){return void 0===t&&(t=u),function(){var l=[].slice.call(arguments),c=i(l)+e.name+(t.identifier||"");if(r[c])return Promise.resolve(o(f(c)));var a=c+"_wl_loading";if(r[a]){var s=Object.assign({},u,t);return new Promise(function(e){var n=Date.now(),t=setInterval(function(){r[c]?(clearInterval(t),e(o(f(c)))):Date.now()-n>s.timeout&&(r[a]=!1,clearInterval(t),e(o(s.timeoutResult)))},100)})}return r[a]=!0,e.apply(void 0,l).then(function(e){return r[c]=e,e&&n(e)?e.clone():r[c]}).catch(function(e){throw e}).finally(function(){r[a]=!1})}}});
2
- //# sourceMappingURL=node.umd.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node.umd.js","sources":["../src/common/type.ts","../src/common/generateDeterministicUniqueKey.ts","../src/common/cloneDeep.ts","../src/common/wrapFunctionWithCache.ts","../src/common/getGlobal.ts"],"sourcesContent":["export type AsyncFunction<Args extends any[], T> = (\n ...args: Args\n) => Promise<T>;\n\ninterface Cloneable {\n clone(): this;\n}\n/**\n * 类型保护函数,检查一个对象是否实现了 Cloneable 接口\n */\nexport function isCloneable(obj: any): obj is Cloneable {\n return typeof obj?.clone === 'function';\n}\n\n/**\n *\n * @param value\n * @returns boolean\n *\n * 判断一个变量是否为简单值\n */\nexport function isPrimitive(\n value: any\n): value is string | number | boolean | null | undefined {\n return (\n (typeof value !== 'object' &&\n typeof value !== 'function' &&\n typeof value !== 'symbol') ||\n value === null\n );\n}\n","import { isPrimitive } from './type';\n/**\n * @private\n * 序列化 api 参数, 相等的对象,返回相同的字符串\n */\nexport function generateDeterministicUniqueKey(params: any) {\n if (isPrimitive(params)) {\n return 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\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 if (Array.isArray(obj)) {\n const newArray: any[] = [];\n for (let i = 0; i < obj.length; i++) {\n newArray[i] = cloneDeep(obj[i]);\n }\n return (newArray as unknown) as T;\n }\n\n if (typeof obj === 'object') {\n const newObj: { [key: string]: any } = {};\n for (let key in obj) {\n if ((obj as any).hasOwnProperty(key)) {\n newObj[key] = cloneDeep(obj[key]);\n }\n }\n return newObj as T;\n }\n\n return obj;\n}\n","// import { getGlobal } from './getGlobal';\nimport { generateDeterministicUniqueKey } from './generateDeterministicUniqueKey';\nimport { cloneDeep } from './cloneDeep';\nimport { isCloneable, AsyncFunction } from './type';\n// const global = getGlobal();\n// if (!global.__wl_fun_api_cache) {\n// global.__wl_fun_api_cache = {};\n// }\n\n// const cache = global.__wl_fun_api_cache;\nconst cache: Record<string, any> = {};\nfunction getCachedData<T = any>(apiKey: string) {\n return cache[apiKey] as T;\n}\n\ninterface Setting {\n timeout?: number;\n timeoutResult?: any;\n identifier?: string;\n}\nconst defalutSetting: Setting = {\n timeout: 60000,\n timeoutResult: { code: 408, msg: '请求超时' },\n identifier: '',\n};\n\n/**\n * 给函数包装缓存功能\n */\n\n\nexport function wrapFunctionWithCache<Args extends any[], T>(\n func: AsyncFunction<Args, T>,\n setting: Setting = defalutSetting\n): AsyncFunction<Args, T> {\n return function(...args: Args): Promise<T> {\n const apiKey: string =\n generateDeterministicUniqueKey(args) +\n func.name +\n (setting.identifier || ''); //缓存key\n\n if (cache[apiKey]) {\n return Promise.resolve(cloneDeep(getCachedData<T>(apiKey)));\n }\n\n const apiLoadingKey: string = apiKey + '_wl_loading'; //缓存loading key\n\n if (cache[apiLoadingKey]) {\n const _setting = Object.assign({}, defalutSetting, setting);\n return new Promise(resolve => {\n const startTime = Date.now();\n const timer = setInterval(() => {\n if (cache[apiKey]) {\n clearInterval(timer);\n resolve(cloneDeep(getCachedData<T>(apiKey)));\n } else if (Date.now() - startTime > _setting.timeout!) {\n cache[apiLoadingKey] = false;\n clearInterval(timer);\n resolve(cloneDeep(_setting.timeoutResult));\n }\n }, 100);\n });\n }\n cache[apiLoadingKey] = true;\n\n return func(...args)\n .then(res => {\n // 缓存原始数据,或者clone数据,不能return 同一份数据,会被释放\n cache[apiKey] = res;\n if (res && isCloneable(res)) {\n // fetch 缓存,不能把原始数据return,否则会被释放\n return res.clone();\n }\n return cache[apiKey];\n })\n .catch((error: any) => {\n throw error;\n })\n .finally(() => {\n cache[apiLoadingKey] = false;\n });\n };\n}\n","declare var global: typeof globalThis;\n\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"],"names":["isCloneable","obj","clone","isPrimitive","value","generateDeterministicUniqueKey","params","JSON","stringify","_key","Array","isArray","Object","keys","sort","reduce","pre","cur","cloneDeep","newArray","i","length","newObj","key","hasOwnProperty","cache","getCachedData","apiKey","defalutSetting","timeout","timeoutResult","code","msg","identifier","globalThis","self","window","global","this","func","setting","args","slice","call","arguments","name","Promise","resolve","apiLoadingKey","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","apply","then","res","error"],"mappings":"iOAUM,SAAUA,EAAYC,GAC1B,MAA6B,yBAAfA,SAAAA,EAAKC,MACrB,CASM,SAAUC,EACdC,GAEA,MACoB,iBAAVA,GACW,mBAAVA,GACU,iBAAVA,GACC,OAAVA,CAEJ,CCzBgB,SAAAC,EAA+BC,GAC7C,OAAIH,EAAYG,GACPA,EAAS,GAEXC,KAAKC,UAAUF,EAAQ,SAASG,EAAuBL,GAC5D,MAAqB,iBAAVA,GAAgC,OAAVA,GAAmBM,MAAMC,QAAQP,GAQ3DA,EAPEQ,OAAOC,KAAKT,GAChBU,OACAC,OAAO,SAACC,EAAUC,GAEjB,OADAD,EAAIC,GAAOb,EAAMa,GACVD,CACT,EAAG,CAAE,EAGX,EACF,CClBgB,SAAAE,EAAajB,GAC3B,GAAY,OAARA,GAA+B,iBAARA,EACzB,OAAOA,EAGT,GAAGD,EAAYC,GACb,OAAOA,EAAIC,QAGb,GAAIQ,MAAMC,QAAQV,GAAM,CAEtB,IADA,IAAMkB,EAAkB,GACfC,EAAI,EAAGA,EAAInB,EAAIoB,OAAQD,IAC9BD,EAASC,GAAKF,EAAUjB,EAAImB,IAE9B,OAAQD,CACT,CAED,GAAmB,iBAARlB,EAAkB,CAC3B,IAAMqB,EAAiC,CAAE,EACzC,IAAK,IAAIC,KAAOtB,EACTA,EAAYuB,eAAeD,KAC9BD,EAAOC,GAAOL,EAAUjB,EAAIsB,KAGhC,OAAOD,CACR,CAED,OAAOrB,CACT,CCpBA,IAAMwB,EAA6B,CAAE,EACrC,SAASC,EAAuBC,GAC9B,OAAOF,EAAME,EACf,CAOA,IAAMC,EAA0B,CAC9BC,QAAS,IACTC,cAAe,CAAEC,KAAM,IAAKC,IAAK,QACjCC,WAAY,4ECnBZ,MAA0B,oBAAfC,WACFA,WAGW,oBAATC,KACFA,KAGa,oBAAXC,OACFA,OAGa,oBAAXC,OACFA,OAKXC,IAAA,mEDUEC,EACAC,GAEA,gBAFAA,IAAAA,EAAmBZ,GAEZ,eAAYa,EAAUC,GAAAA,MAAAC,KAAAC,WACrBjB,EACJtB,EAA+BoC,GAC/BF,EAAKM,MACJL,EAAQP,YAAc,IAEzB,GAAIR,EAAME,GACR,OAAOmB,QAAQC,QAAQ7B,EAAUQ,EAAiBC,KAGpD,IAAMqB,EAAwBrB,EAAS,cAEvC,GAAIF,EAAMuB,GAAgB,CACxB,IAAMC,EAAWrC,OAAOsC,OAAO,CAAA,EAAItB,EAAgBY,GACnD,WAAWM,QAAQ,SAAAC,GACjB,IAAMI,EAAYC,KAAKC,MACjBC,EAAQC,YAAY,WACpB9B,EAAME,IACR6B,cAAcF,GACdP,EAAQ7B,EAAUQ,EAAiBC,MAC1ByB,KAAKC,MAAQF,EAAYF,EAASpB,UAC3CJ,EAAMuB,IAAiB,EACvBQ,cAAcF,GACdP,EAAQ7B,EAAU+B,EAASnB,gBAE/B,EAAG,IACL,EACD,CAGD,OAFAL,EAAMuB,IAAiB,EAEhBT,EAAIkB,aAAIhB,GACZiB,KAAK,SAAAC,GAGJ,OADAlC,EAAME,GAAUgC,EACZA,GAAO3D,EAAY2D,GAEdA,EAAIzD,QAENuB,EAAME,EACf,SACO,SAACiC,GACN,MAAMA,CACR,WACS,WACPnC,EAAMuB,IAAiB,CACzB,EACJ,CACF"}