@nickyzj2023/utils 1.0.52 → 1.0.54
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dom/index.d.ts +1 -1
- package/dist/dom/log.d.ts +26 -0
- package/dist/function/index.d.ts +1 -1
- package/dist/function/loop-until.d.ts +36 -0
- package/dist/hoc/index.d.ts +1 -1
- package/dist/hoc/with-cache.d.ts +42 -0
- package/dist/index.js +2 -1
- package/dist/is/index.d.ts +4 -5
- package/dist/is/is-falsy.d.ts +9 -0
- package/dist/is/is-nil.d.ts +9 -0
- package/dist/is/is-object.d.ts +8 -0
- package/dist/is/is-primitive.d.ts +9 -0
- package/dist/network/get-real-url.d.ts +2 -0
- package/dist/network/index.d.ts +4 -4
- package/dist/number/index.d.ts +1 -1
- package/dist/number/random-int.d.ts +7 -0
- package/dist/object/index.d.ts +3 -3
- package/dist/object/map-keys.d.ts +17 -0
- package/dist/object/map-values.d.ts +21 -0
- package/dist/object/merge-objects.d.ts +12 -0
- package/dist/string/index.d.ts +2 -2
- package/dist/time/index.d.ts +3 -3
- package/docs/assets/navigation.js +1 -1
- package/docs/assets/search.js +1 -1
- package/docs/functions/camelToSnake.html +1 -1
- package/docs/functions/capitalize.html +1 -1
- package/docs/functions/compactStr.html +1 -1
- package/docs/functions/debounce.html +1 -1
- package/docs/functions/decapitalize.html +1 -1
- package/docs/functions/fetcher.html +1 -1
- package/docs/functions/getRealURL.html +1 -1
- package/docs/functions/imageUrlToBase64.html +1 -1
- package/docs/functions/isFalsy.html +1 -1
- package/docs/functions/isNil.html +1 -1
- package/docs/functions/isObject.html +1 -1
- package/docs/functions/isPrimitive.html +1 -1
- package/docs/functions/{isTruthy.html → log.html} +6 -4
- package/docs/functions/loopUntil.html +10 -4
- package/docs/functions/mapKeys.html +1 -1
- package/docs/functions/mapValues.html +1 -1
- package/docs/functions/mergeObjects.html +1 -1
- package/docs/functions/randomInt.html +1 -1
- package/docs/functions/sleep.html +1 -1
- package/docs/functions/snakeToCamel.html +1 -1
- package/docs/functions/throttle.html +1 -1
- package/docs/functions/to.html +1 -1
- package/docs/functions/withCache.html +3 -3
- package/docs/{functions/timeLog.html → interfaces/LogOptions.html} +11 -4
- package/docs/modules.html +1 -1
- package/docs/types/BunFetchOptions.html +2 -2
- package/docs/types/CamelToSnake.html +1 -1
- package/docs/types/Capitalize.html +1 -1
- package/docs/types/Decapitalize.html +1 -1
- package/docs/types/DeepMapKeys.html +1 -1
- package/docs/types/DeepMapValues.html +1 -1
- package/docs/types/Falsy.html +1 -1
- package/docs/types/ImageCompressionOptions.html +4 -4
- package/docs/types/Primitive.html +1 -1
- package/docs/types/RequestInit.html +1 -1
- package/docs/types/SetTtl.html +1 -1
- package/docs/types/SnakeToCamel.html +1 -1
- package/package.json +1 -1
- package/src/dom/index.ts +1 -1
- package/src/dom/log.ts +62 -0
- package/src/function/index.ts +1 -1
- package/src/function/loop-until.ts +58 -0
- package/src/hoc/index.ts +1 -1
- package/src/is/index.ts +4 -5
- package/src/network/fetcher.ts +1 -0
- package/src/network/index.ts +4 -4
- package/src/number/index.ts +1 -1
- package/src/object/index.ts +3 -3
- package/src/string/index.ts +2 -12
- package/src/time/index.ts +3 -3
- package/src/dom/timeLog.ts +0 -10
- package/src/function/loopUntil.ts +0 -36
- package/src/is/isTruthy.ts +0 -10
- package/src/lru-cache.ts +0 -50
- /package/src/hoc/{withCache.ts → with-cache.ts} +0 -0
- /package/src/is/{isFalsy.ts → is-falsy.ts} +0 -0
- /package/src/is/{isNil.ts → is-nil.ts} +0 -0
- /package/src/is/{isObject.ts → is-object.ts} +0 -0
- /package/src/is/{isPrimitive.ts → is-primitive.ts} +0 -0
- /package/src/network/{getRealURL.ts → get-real-url.ts} +0 -0
- /package/src/number/{randomInt.ts → random-int.ts} +0 -0
- /package/src/object/{mapKeys.ts → map-keys.ts} +0 -0
- /package/src/object/{mapValues.ts → map-values.ts} +0 -0
- /package/src/object/{mergeObjects.ts → merge-objects.ts} +0 -0
package/dist/dom/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export
|
|
1
|
+
export * from "./log";
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* log 配置选项
|
|
3
|
+
*/
|
|
4
|
+
export interface LogOptions {
|
|
5
|
+
/**
|
|
6
|
+
* 是否显示时间
|
|
7
|
+
* @default true
|
|
8
|
+
*/
|
|
9
|
+
time?: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* 是否显示调用者文件名
|
|
12
|
+
* @default true
|
|
13
|
+
*/
|
|
14
|
+
fileName?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 带额外信息的 console.log
|
|
18
|
+
* @param message - 日志消息
|
|
19
|
+
* @param options - 配置选项
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* log("调试信息"); // "调试信息"
|
|
23
|
+
* log("调试信息", { time: true }); // "[14:30:00] 调试信息"
|
|
24
|
+
* log("调试信息", { time: true, fileName: true }); // "[14:30:00] [index.ts:15] 调试信息"
|
|
25
|
+
*/
|
|
26
|
+
export declare const log: (message: any, options?: LogOptions) => void;
|
package/dist/function/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export
|
|
1
|
+
export * from "./loop-until";
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 循环执行函数,直到符合停止条件
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* // 循环请求大语言模型,直到其不再调用工具
|
|
6
|
+
* loopUntil(
|
|
7
|
+
* async () => {
|
|
8
|
+
* const completion = await chatCompletions();
|
|
9
|
+
* completion.tool_calls?.forEach(chooseAndHandleTool)
|
|
10
|
+
* return completion;
|
|
11
|
+
* },
|
|
12
|
+
* {
|
|
13
|
+
* shouldStop: (completion) => !completion.tool_calls,
|
|
14
|
+
* },
|
|
15
|
+
* ),
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* // 不传递 shouldStop,执行 3 次后正常返回最后结果
|
|
19
|
+
* loopUntil(
|
|
20
|
+
* () => {
|
|
21
|
+
* return doSomething();
|
|
22
|
+
* },
|
|
23
|
+
* {
|
|
24
|
+
* maxRetries: 3,
|
|
25
|
+
* },
|
|
26
|
+
* ),
|
|
27
|
+
*/
|
|
28
|
+
export declare const loopUntil: <T>(fn: (count: number) => T | Promise<T>, options?: {
|
|
29
|
+
/**
|
|
30
|
+
* 最大循环次数
|
|
31
|
+
* @default 5
|
|
32
|
+
*/
|
|
33
|
+
maxRetries?: number;
|
|
34
|
+
/** 停止循环条件。如果未传递,则执行 maxRetries 次后退出并返回最后结果 */
|
|
35
|
+
shouldStop?: (result: T) => boolean;
|
|
36
|
+
}) => Promise<T>;
|
package/dist/hoc/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export
|
|
1
|
+
export * from "./with-cache";
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export type SetTtl = (seconds: number) => void;
|
|
2
|
+
/**
|
|
3
|
+
* 创建一个带缓存的高阶函数
|
|
4
|
+
*
|
|
5
|
+
* @template Args 被包装函数的参数类型数组
|
|
6
|
+
* @template Result 被包装函数的返回类型
|
|
7
|
+
*
|
|
8
|
+
* @param fn 需要被缓存的函数,参数里附带的 setTtl 方法用于根据具体情况改写过期时间
|
|
9
|
+
* @param ttlSeconds 以秒为单位的过期时间,-1 表示永不过期,默认 -1,会被回调函数里的 setTtl() 覆盖
|
|
10
|
+
*
|
|
11
|
+
* @returns 返回包装后的函数,以及缓存相关的额外方法
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* // 异步函数示例
|
|
15
|
+
* const fetchData = withCache(async function (url: string) {
|
|
16
|
+
* const data = await fetch(url).then((res) => res.json());
|
|
17
|
+
* this.setTtl(data.expiresIn); // 根据实际情况调整过期时间
|
|
18
|
+
* return data;
|
|
19
|
+
* });
|
|
20
|
+
*
|
|
21
|
+
* await fetchData(urlA);
|
|
22
|
+
* await fetchData(urlA); // 使用缓存结果
|
|
23
|
+
* await fetchData(urlB);
|
|
24
|
+
* await fetchData(urlB); // 使用缓存结果
|
|
25
|
+
*
|
|
26
|
+
* fetchData.clear(); // 清除缓存
|
|
27
|
+
* await fetchData(urlA); // 重新请求
|
|
28
|
+
* await fetchData(urlB); // 重新请求
|
|
29
|
+
*
|
|
30
|
+
* // 缓存过期前
|
|
31
|
+
* await sleep();
|
|
32
|
+
* fetchData.updateTtl(180); // 更新 ttl 并为所有未过期的缓存续期
|
|
33
|
+
* await fetchData(urlA); // 使用缓存结果
|
|
34
|
+
* await fetchData(urlB); // 使用缓存结果
|
|
35
|
+
*/
|
|
36
|
+
export declare const withCache: <Args extends any[], Result>(fn: (this: {
|
|
37
|
+
setTtl: SetTtl;
|
|
38
|
+
}, ...args: Args) => Result, ttlSeconds?: number) => {
|
|
39
|
+
(...args: Args): Result;
|
|
40
|
+
clear(): void;
|
|
41
|
+
updateTtl(seconds: number): void;
|
|
42
|
+
};
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var
|
|
2
|
+
var R=(x,Y)=>{let{time:T=!0,fileName:G=!0}=Y??{},M=[];if(T)M.push(`[${new Date().toLocaleTimeString()}]`);if(G){let{stack:E}=Error(),P=E?.split(`
|
|
3
|
+
`)[2]?.trim()?.match(/at\s+(.*):(\d+)/);if(P?.[1]){let Q=P[1].split(/[/\\]/).pop();M.push(`[${Q}:${P[2]}]`)}}M.push(x),console.log(...M)};var N=async(x,Y)=>{let{maxRetries:T=5,shouldStop:G}=Y??{},M;for(let E=0;E<T;E++)if(M=await x(E),G?.(M)===!0)return M;if(!G)return M;throw Error(`\u8D85\u8FC7\u4E86\u6700\u5927\u5FAA\u73AF\u6B21\u6570\uFF08${T}\uFF09\u4E14\u672A\u6EE1\u8DB3\u505C\u6B62\u6267\u884C\u6761\u4EF6`)};var h=(x,Y=-1)=>{let T=new Map,G=(...M)=>{let E=JSON.stringify(M),J=Date.now(),P=T.get(E);if(P&&J<P.expiresAt)return P.value;let Q=Y===-1?1/0:J+Y*1000,$={setTtl:(_)=>{Q=J+_*1000}},X=x.apply($,M);if(X instanceof Promise){let _=X.then((z)=>{return T.set(E,{value:z,expiresAt:Q}),z});return T.set(E,{value:_,expiresAt:Q}),_}return T.set(E,{value:X,expiresAt:Q}),X};return G.clear=()=>T.clear(),G.updateTtl=(M)=>{Y=M;let E=Date.now(),J=E+M*1000;for(let[P,Q]of T.entries())if(Q.expiresAt>E)Q.expiresAt=J,T.set(P,Q)},G};var j=(x)=>{return!x};var I=(x)=>{return x===null||x===void 0};var Z=(x)=>{return x?.constructor===Object};var C=(x)=>{return x===null||x===void 0||typeof x!=="object"&&typeof x!=="function"};var F=(x,Y)=>{if(Array.isArray(x))return x.map((T)=>F(T,Y));if(Z(x))return Object.keys(x).reduce((G,M)=>{let E=Y(M),J=x[M];return G[E]=F(J,Y),G},{});return x};var d=(x,Y,T)=>{let{filter:G}=T??{};if(Array.isArray(x)){let M=x.map((E,J)=>{if(Z(E))return d(E,Y,T);return Y(E,J)});if(G)return M.filter((E,J)=>G(E,J));return M}if(Z(x))return Object.keys(x).reduce((E,J)=>{let P=x[J],Q;if(Z(P)||Array.isArray(P))Q=d(P,Y,T);else Q=Y(P,J);if(!G||G(Q,J))E[J]=Q;return E},{});return x};var H=(x,Y)=>{let T={...x};for(let G of Object.keys(Y)){let M=T[G],E=Y[G];if(C(M)&&C(E)){T[G]=E;continue}if(Array.isArray(M)&&Array.isArray(E)){T[G]=M.concat(E);continue}if(Z(M)&&Z(E)){T[G]=H(M,E);continue}T[G]=E}return T};var Px=(x="",Y={})=>{let T=async(G,M={})=>{let E=new URL(x?`${x}${G}`:G),{params:J,parser:P,...Q}=H(Y,M);if(Z(J))Object.entries(J).forEach(([_,z])=>{if(I(z))return;E.searchParams.append(_,z.toString())});if(Z(Q.body)||Array.isArray(Q.body))Q.body=JSON.stringify(Q.body),Q.headers={...Q.headers,"Content-Type":"application/json"};let $=await fetch(E,Q);if(!$.ok){if($.headers.get("Content-Type")?.startsWith("application/json"))throw await $.json();throw Error($.statusText)}return await(P?.($)??$.json())};return{get:(G,M)=>T(G,{...M,method:"GET"}),post:(G,M,E)=>T(G,{...E,method:"POST",body:M}),put:(G,M,E)=>T(G,{...E,method:"PUT",body:M}),delete:(G,M)=>T(G,{...M,method:"DELETE"})}};var q=async(x)=>{try{return[null,await x]}catch(Y){return[Y,void 0]}};var _x=async(x)=>{let[Y,T]=await q(fetch(x,{method:"HEAD",redirect:"manual"}));if(Y)return x;return T.headers.get("location")||x};var D=(x)=>{let Y=new Uint8Array(x),T="";for(let G=0;G<Y.byteLength;G++)T+=String.fromCharCode(Y[G]);return btoa(T)},f=async()=>{try{let Y=await Function("modulePath","return import(modulePath)")("sharp");return Y.default||Y}catch{return null}},A=async(x,Y,T,G)=>{let M=Buffer.from(Y),E=x(M);if(T==="image/jpeg")E=E.jpeg({quality:Math.round(G*100)});else if(T==="image/png"){let P=Math.round((1-G)*9);E=E.png({compressionLevel:P})}let J=await E.toBuffer();return`data:${T};base64,${J.toString("base64")}`},zx=async(x,Y={})=>{let{quality:T=0.92,compressor:G,fetcher:M=fetch}=Y;if(!x.startsWith("http"))throw Error("\u56FE\u7247\u5730\u5740\u5FC5\u987B\u4EE5http\u6216https\u5F00\u5934");let E=await M(x);if(!E.ok)throw Error(`\u83B7\u53D6\u56FE\u7247\u5931\u8D25: ${E.statusText}`);let J=E.headers.get("Content-Type")||"image/jpeg",P=await E.arrayBuffer();if(J!=="image/jpeg"&&J!=="image/png"){let X=D(P);return`data:${J};base64,${X}`}if(G)return await G(P,J,T);if(typeof OffscreenCanvas<"u"){let X=null;try{let _=new Blob([P],{type:J});X=await createImageBitmap(_);let z=new OffscreenCanvas(X.width,X.height),W=z.getContext("2d");if(!W)throw Error("\u65E0\u6CD5\u83B7\u53D6 OffscreenCanvas context");W.drawImage(X,0,0),X.close(),X=null;let S=await(await z.convertToBlob({type:J,quality:T})).arrayBuffer(),K=D(S);return`data:${J};base64,${K}`}catch{X?.close();let _=D(P);return`data:${J};base64,${_}`}}let Q=await f();if(Q)try{return await A(Q,P,J,T)}catch{let X=D(P);return`data:${J};base64,${X}`}let $=D(P);return`data:${J};base64,${$}`};var dx=(x,Y)=>{return Math.floor(Math.random()*(Y-x+1))+x};var fx=(x)=>{return x.replace(/_([a-zA-Z])/g,(Y,T)=>T.toUpperCase())},Ax=(x)=>{return x.replace(/([A-Z])/g,(Y,T)=>`_${T.toLowerCase()}`)},Ox=(x)=>{return x.charAt(0).toUpperCase()+x.slice(1)},Rx=(x)=>{return x.charAt(0).toLowerCase()+x.slice(1)};var Ux=(x="",Y)=>{if(!x)return"";let{maxLength:T=1/0,disableNewLineReplace:G=!1,disableWhitespaceCollapse:M=!1,omission:E="..."}=Y??{},J=x;if(!G)J=J.replace(/\r?\n/g,"\\n");else J=J.replace(/\r?\n/g," ");if(!M)J=J.replace(/\s+/g," ");if(J=J.trim(),T>0&&J.length>T)return J.slice(0,T)+E;return J};var kx=(x,Y=300)=>{let T=null;return(...G)=>{if(T)clearTimeout(T);T=setTimeout(()=>{x(...G)},Y)}};var gx=async(x=150)=>{return new Promise((Y)=>{setTimeout(Y,x)})};var mx=(x,Y=300)=>{let T=null;return function(...G){if(!T)T=setTimeout(()=>{T=null,x.apply(this,G)},Y)}};export{h as withCache,q as to,mx as throttle,fx as snakeToCamel,gx as sleep,dx as randomInt,H as mergeObjects,d as mapValues,F as mapKeys,N as loopUntil,R as log,C as isPrimitive,Z as isObject,I as isNil,j as isFalsy,zx as imageUrlToBase64,_x as getRealURL,Px as fetcher,Rx as decapitalize,kx as debounce,Ux as compactStr,Ox as capitalize,Ax as camelToSnake};
|
package/dist/is/index.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
export
|
|
5
|
-
export { isTruthy } from "./isTruthy";
|
|
1
|
+
export * from "./is-falsy";
|
|
2
|
+
export * from "./is-nil";
|
|
3
|
+
export * from "./is-object";
|
|
4
|
+
export * from "./is-primitive";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type Primitive = number | string | boolean | symbol | bigint | undefined | null;
|
|
2
|
+
/**
|
|
3
|
+
* 检测传入的值是否为**原始值**(number、string、boolean、symbol、bigint、undefined、null)
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* isPrimitive(1); // true
|
|
7
|
+
* isPrimitive([]); // false
|
|
8
|
+
*/
|
|
9
|
+
export declare const isPrimitive: (value: any) => value is Primitive;
|
package/dist/network/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
export
|
|
1
|
+
export * from "./fetcher";
|
|
2
|
+
export * from "./get-real-url";
|
|
3
|
+
export * from "./image";
|
|
4
|
+
export * from "./to";
|
package/dist/number/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export
|
|
1
|
+
export * from "./random-int";
|
package/dist/object/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export
|
|
1
|
+
export * from "./map-keys";
|
|
2
|
+
export * from "./map-values";
|
|
3
|
+
export * from "./merge-objects";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type DeepMapKeys<T> = T extends Array<infer U> ? Array<DeepMapKeys<U>> : T extends object ? {
|
|
2
|
+
[key: string]: DeepMapKeys<T[keyof T]>;
|
|
3
|
+
} : T;
|
|
4
|
+
/**
|
|
5
|
+
* 递归处理对象里的 key
|
|
6
|
+
*
|
|
7
|
+
* @remarks
|
|
8
|
+
* 无法完整推导出类型,只能做到有递归,key 全为 string,value 为同层级的所有类型的联合
|
|
9
|
+
*
|
|
10
|
+
* @template T 要转换的对象
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* const obj = { a: { b: 1 } };
|
|
14
|
+
* const result = mapKeys(obj, (key) => key.toUpperCase());
|
|
15
|
+
* console.log(result); // { A: { B: 1 } }
|
|
16
|
+
*/
|
|
17
|
+
export declare const mapKeys: <T>(obj: T, getNewKey: (key: string) => string) => DeepMapKeys<T>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type DeepMapValues<T, R> = T extends Array<infer U> ? Array<DeepMapValues<U, R>> : T extends object ? {
|
|
2
|
+
[K in keyof T]: T[K] extends object ? DeepMapValues<T[K], R> : R;
|
|
3
|
+
} : R;
|
|
4
|
+
/**
|
|
5
|
+
* 递归处理对象里的 value
|
|
6
|
+
*
|
|
7
|
+
* @remarks
|
|
8
|
+
* 无法完整推导出类型,所有 value 最终都会变为 any
|
|
9
|
+
*
|
|
10
|
+
* @template T 要转换的对象
|
|
11
|
+
* @template R 转换后的值类型,为 any,无法进一步推导
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* const obj = { a: 1, b: { c: 2 } };
|
|
15
|
+
* const result = mapValues(obj, (value, key) => isPrimitive(value) ? value + 1 : value);
|
|
16
|
+
* console.log(result); // { a: 2, b: { c: 3 } }
|
|
17
|
+
*/
|
|
18
|
+
export declare const mapValues: <T, R = any>(obj: T, getNewValue: (value: any, key: string | number) => R, options?: {
|
|
19
|
+
/** 过滤函数,返回 true 表示保留该字段 */
|
|
20
|
+
filter?: (value: any, key: string | number) => boolean;
|
|
21
|
+
}) => DeepMapValues<T, R>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 深度合并两个对象,规则如下:
|
|
3
|
+
* 1. 原始值覆盖:如果两个值都是原始类型,则用后者覆盖;
|
|
4
|
+
* 2. 数组拼接:如果两个值都是数组,则拼接为大数组;
|
|
5
|
+
* 3. 对象递归合并:如果两个值都是对象,则进行递归深度合并;
|
|
6
|
+
*
|
|
7
|
+
* @template T 第一个对象
|
|
8
|
+
* @template U 第二个对象
|
|
9
|
+
* @param {T} obj1 要合并的第一个对象,相同字段会被 obj2 覆盖
|
|
10
|
+
* @param {U} obj2 要合并的第二个对象
|
|
11
|
+
*/
|
|
12
|
+
export declare const mergeObjects: <T extends Record<string, any>, U extends Record<string, any>>(obj1: T, obj2: U) => T & U;
|
package/dist/string/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
1
|
+
export * from "./case";
|
|
2
|
+
export * from "./compact";
|
package/dist/time/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export
|
|
1
|
+
export * from "./debounce";
|
|
2
|
+
export * from "./sleep";
|
|
3
|
+
export * from "./throttle";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
window.navigationData = "
|
|
1
|
+
window.navigationData = "eJyFlE1v2zAMhv8Lz8G8FWmK+dgUBYKl7ZCPXYYdVIWxtcqSZjHb0qH/fYhTATGhj6sfv48tiuT3f0D4l6CGpW2eHClrPEzACWqhBmUI+72Q6KuAjf/QUqdhAi/K7KC+up69TYIEbg/mHkm23AR0dOgrhpnp4+ebT9dXwQY1zEWHemPXRrwgV12ykmcunCKh1Su3VIG8lhxwhzJlqS5ZyXOH6B6E+4JHXp0qIDyWKhMs34Q+YMpzhiXTvdD+yA3Dw1Jy0YkG57ZzPXqvrEnceeK1kv1rrzpF6jcvdhVAqdKwwl8H9LQwirgjIKOoZFkjbUhzwflpKTs058YOrcoNl6zkkdE52B+MHEpZydQs1LPpSMMbeCyJt/BYYTsnJK2pjyoC7VMKqGGHz/ZgZPQfAsvG88fYpWZxrNmf1hBGT/GOUmGooUFaodDb1TKWD3S1TClOm/U0Fdteb+yt8DibxkT8nZzOszkOFl+9o2z4Uel49FHpbPDp+SdKimfPLBvnQ84MiVEfSbRtYmFtm2zIuq2h+KkDzJ284xs8xH3VxTY4D/PFPYrHFvdYgH2D5/LGHYFLyml6YXa2W5jo/QWYu0CvEV0sPIBcMLoYQ95XPrUcxxpqe0uko90TWC5uo0GbikANfxS1cyHb6CcD5N+cvv34D7ugK1A="
|
package/docs/assets/search.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
window.searchData = "
|
|
1
|
+
window.searchData = "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";
|
|
@@ -160,7 +160,7 @@
|
|
|
160
160
|
</div><section class="tsd-panel"><h4>Type Parameters</h4><ul class="tsd-type-parameter-list"><li><span id="cameltosnakes"><span class="tsd-kind-type-parameter">S</span> <span class="tsd-signature-keyword">extends</span> <span class="tsd-signature-type">string</span></span></li></ul></section><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">str</span>: <a class="tsd-signature-type tsd-kind-type-parameter" href="#cameltosnakes">S</a></span></li></ul></div><h4 class="tsd-returns-title">Returns <a href="../types/CamelToSnake.html" class="tsd-signature-type tsd-kind-type-alias">CamelToSnake</a><span class="tsd-signature-symbol"><</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#cameltosnakes">S</a><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd-typography"><div class="tsd-tag-example"><h4 class="tsd-anchor-link" id="example">Example<a href="#example" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><pre><code class="ts"><span class="hl-1">camelToSnake</span><span class="hl-2">(</span><span class="hl-3">"shouldComponentUpdate"</span><span class="hl-2">) </span><span class="hl-0">// "should_component_update"</span>
|
|
161
161
|
</code><button type="button">Copy</button></pre>
|
|
162
162
|
|
|
163
|
-
</div></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/Nickyzj628/utils/blob/
|
|
163
|
+
</div></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/Nickyzj628/utils/blob/5c8635da5062e64964cf6710e2001e90b0fcbfe4/src/string/case.ts#L33">string/case.ts:33</a></li></ul></aside></div></li></ul></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">@nickyzj2023/utils</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div><script>
|
|
164
164
|
try {
|
|
165
165
|
const generateLinkElement = document.querySelector(".tsd-generator a");
|
|
166
166
|
const link = document.createElement("a");
|
|
@@ -160,7 +160,7 @@
|
|
|
160
160
|
</div><section class="tsd-panel"><h4>Type Parameters</h4><ul class="tsd-type-parameter-list"><li><span id="capitalizes"><span class="tsd-kind-type-parameter">S</span> <span class="tsd-signature-keyword">extends</span> <span class="tsd-signature-type">string</span></span></li></ul></section><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">s</span>: <a class="tsd-signature-type tsd-kind-type-parameter" href="#capitalizes">S</a></span></li></ul></div><h4 class="tsd-returns-title">Returns <a href="../types/Capitalize.html" class="tsd-signature-type tsd-kind-type-alias">Capitalize</a><span class="tsd-signature-symbol"><</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#capitalizes">S</a><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd-typography"><div class="tsd-tag-example"><h4 class="tsd-anchor-link" id="example">Example<a href="#example" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><pre><code class="ts"><span class="hl-1">capitalize</span><span class="hl-2">(</span><span class="hl-3">"hello"</span><span class="hl-2">) </span><span class="hl-0">// "Hello"</span>
|
|
161
161
|
</code><button type="button">Copy</button></pre>
|
|
162
162
|
|
|
163
|
-
</div></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/Nickyzj628/utils/blob/
|
|
163
|
+
</div></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/Nickyzj628/utils/blob/5c8635da5062e64964cf6710e2001e90b0fcbfe4/src/string/case.ts#L52">string/case.ts:52</a></li></ul></aside></div></li></ul></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">@nickyzj2023/utils</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div><script>
|
|
164
164
|
try {
|
|
165
165
|
const generateLinkElement = document.querySelector(".tsd-generator a");
|
|
166
166
|
const link = document.createElement("a");
|
|
@@ -164,7 +164,7 @@
|
|
|
164
164
|
</div></li></ul></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">string</span></h4><div class="tsd-comment tsd-typography"><div class="tsd-tag-example"><h4 class="tsd-anchor-link" id="example">Example<a href="#example" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><pre><code class="ts"><span class="hl-0">// "Hello, world."</span><br/><span class="hl-1">compactStr</span><span class="hl-2">(</span><span class="hl-3">`</span><br/><span class="hl-3"> Hello,</span><br/><span class="hl-3"> world!</span><br/><span class="hl-3">`</span><span class="hl-2">, {</span><br/><span class="hl-2"> </span><span class="hl-5">disableNewLineReplace:</span><span class="hl-2"> </span><span class="hl-6">false</span><span class="hl-2">,</span><br/><span class="hl-2">});</span>
|
|
165
165
|
</code><button type="button">Copy</button></pre>
|
|
166
166
|
|
|
167
|
-
</div></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/Nickyzj628/utils/blob/
|
|
167
|
+
</div></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/Nickyzj628/utils/blob/5c8635da5062e64964cf6710e2001e90b0fcbfe4/src/string/compact.ts#L13">string/compact.ts:13</a></li></ul></aside></div></li></ul></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">@nickyzj2023/utils</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div><script>
|
|
168
168
|
try {
|
|
169
169
|
const generateLinkElement = document.querySelector(".tsd-generator a");
|
|
170
170
|
const link = document.createElement("a");
|
|
@@ -169,7 +169,7 @@
|
|
|
169
169
|
</div><div class="tsd-tag-example"><h4 class="tsd-anchor-link" id="example">Example<a href="#example" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><pre><code class="ts"><span class="hl-6">const</span><span class="hl-2"> </span><span class="hl-7">search</span><span class="hl-2"> = </span><span class="hl-1">debounce</span><span class="hl-2">((</span><span class="hl-5">keyword</span><span class="hl-2">: </span><span class="hl-8">string</span><span class="hl-2">) </span><span class="hl-6">=></span><span class="hl-2"> {</span><br/><span class="hl-2"> </span><span class="hl-5">console</span><span class="hl-2">.</span><span class="hl-1">log</span><span class="hl-2">(</span><span class="hl-3">'搜索:'</span><span class="hl-2">, </span><span class="hl-5">keyword</span><span class="hl-2">);</span><br/><span class="hl-2">});</span><br/><span class="hl-1">search</span><span class="hl-2">(</span><span class="hl-3">'hello'</span><span class="hl-2">); </span><span class="hl-0">// 300ms 后执行</span>
|
|
170
170
|
</code><button type="button">Copy</button></pre>
|
|
171
171
|
|
|
172
|
-
</div></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/Nickyzj628/utils/blob/
|
|
172
|
+
</div></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/Nickyzj628/utils/blob/5c8635da5062e64964cf6710e2001e90b0fcbfe4/src/time/debounce.ts#L20">time/debounce.ts:20</a></li></ul></aside></div></li></ul></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">@nickyzj2023/utils</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div><script>
|
|
173
173
|
try {
|
|
174
174
|
const generateLinkElement = document.querySelector(".tsd-generator a");
|
|
175
175
|
const link = document.createElement("a");
|
|
@@ -160,7 +160,7 @@
|
|
|
160
160
|
</div><section class="tsd-panel"><h4>Type Parameters</h4><ul class="tsd-type-parameter-list"><li><span id="decapitalizes"><span class="tsd-kind-type-parameter">S</span> <span class="tsd-signature-keyword">extends</span> <span class="tsd-signature-type">string</span></span></li></ul></section><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">s</span>: <a class="tsd-signature-type tsd-kind-type-parameter" href="#decapitalizes">S</a></span></li></ul></div><h4 class="tsd-returns-title">Returns <a href="../types/Decapitalize.html" class="tsd-signature-type tsd-kind-type-alias">Decapitalize</a><span class="tsd-signature-symbol"><</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#decapitalizes">S</a><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd-typography"><div class="tsd-tag-example"><h4 class="tsd-anchor-link" id="example">Example<a href="#example" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><pre><code class="ts"><span class="hl-1">decapitalize</span><span class="hl-2">(</span><span class="hl-3">"Hello"</span><span class="hl-2">) </span><span class="hl-0">// "hello"</span>
|
|
161
161
|
</code><button type="button">Copy</button></pre>
|
|
162
162
|
|
|
163
|
-
</div></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/Nickyzj628/utils/blob/
|
|
163
|
+
</div></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/Nickyzj628/utils/blob/5c8635da5062e64964cf6710e2001e90b0fcbfe4/src/string/case.ts#L69">string/case.ts:69</a></li></ul></aside></div></li></ul></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">@nickyzj2023/utils</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div><script>
|
|
164
164
|
try {
|
|
165
165
|
const generateLinkElement = document.querySelector(".tsd-generator a");
|
|
166
166
|
const link = document.createElement("a");
|
|
@@ -171,7 +171,7 @@
|
|
|
171
171
|
</div><div class="tsd-tag-example"><h4 class="tsd-anchor-link" id="example">Example<a href="#example" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><pre><code class="ts"><span class="hl-0">// 用法1:直接发送请求</span><br/><span class="hl-6">const</span><span class="hl-2"> </span><span class="hl-7">res</span><span class="hl-2"> = </span><span class="hl-4">await</span><span class="hl-2"> </span><span class="hl-1">fetcher</span><span class="hl-2">().</span><span class="hl-1">get</span><span class="hl-2"><</span><span class="hl-8">Blog</span><span class="hl-2">>(</span><span class="hl-3">"https://nickyzj.run:3030/blogs/hello-world"</span><span class="hl-2">);</span><br/><br/><span class="hl-0">// 用法2:创建实例</span><br/><span class="hl-6">const</span><span class="hl-2"> </span><span class="hl-7">api</span><span class="hl-2"> = </span><span class="hl-1">fetcher</span><span class="hl-2">(</span><span class="hl-3">"https://nickyzj.run:3030"</span><span class="hl-2">, { </span><span class="hl-5">headers:</span><span class="hl-2"> { </span><span class="hl-5">Authorization:</span><span class="hl-2"> </span><span class="hl-3">"Bearer token"</span><span class="hl-2"> } });</span><br/><span class="hl-6">const</span><span class="hl-2"> </span><span class="hl-7">res</span><span class="hl-2"> = </span><span class="hl-4">await</span><span class="hl-2"> </span><span class="hl-5">api</span><span class="hl-2">.</span><span class="hl-1">get</span><span class="hl-2"><</span><span class="hl-8">Blog</span><span class="hl-2">>(</span><span class="hl-3">"/blogs/hello-world"</span><span class="hl-2">, { </span><span class="hl-5">headers:</span><span class="hl-2"> {...}, </span><span class="hl-5">params:</span><span class="hl-2"> { </span><span class="hl-5">page:</span><span class="hl-2"> </span><span class="hl-9">1</span><span class="hl-2"> } }); </span><span class="hl-0">// 与实例相同的 headers 会覆盖上去,params 会转成 ?page=1 跟到 url 后面</span><br/><br/><span class="hl-0">// 用法3:使用代理(仅 Bun 环境)</span><br/><span class="hl-6">const</span><span class="hl-2"> </span><span class="hl-7">api</span><span class="hl-2"> = </span><span class="hl-1">fetcher</span><span class="hl-2">(</span><span class="hl-3">"https://api.example.com"</span><span class="hl-2">, {</span><br/><span class="hl-2"> </span><span class="hl-5">proxy:</span><span class="hl-2"> </span><span class="hl-3">"http://127.0.0.1:7890"</span><br/><span class="hl-2">});</span><br/><br/><span class="hl-0">// 安全处理请求结果</span><br/><span class="hl-6">const</span><span class="hl-2"> [</span><span class="hl-7">error</span><span class="hl-2">, </span><span class="hl-7">data</span><span class="hl-2">] = </span><span class="hl-4">await</span><span class="hl-2"> </span><span class="hl-1">to</span><span class="hl-2">(</span><span class="hl-5">api</span><span class="hl-2">.</span><span class="hl-1">get</span><span class="hl-2"><</span><span class="hl-8">Blog</span><span class="hl-2">>(</span><span class="hl-3">"/blogs/hello-world"</span><span class="hl-2">));</span><br/><span class="hl-4">if</span><span class="hl-2"> (</span><span class="hl-5">error</span><span class="hl-2">) {</span><br/><span class="hl-2"> </span><span class="hl-5">console</span><span class="hl-2">.</span><span class="hl-1">error</span><span class="hl-2">(</span><span class="hl-5">error</span><span class="hl-2">);</span><br/><span class="hl-2"> </span><span class="hl-4">return</span><span class="hl-2">;</span><br/><span class="hl-2">}</span><br/><span class="hl-5">console</span><span class="hl-2">.</span><span class="hl-1">log</span><span class="hl-2">(</span><span class="hl-5">data</span><span class="hl-2">);</span><br/><br/><span class="hl-0">// 缓存请求结果</span><br/><span class="hl-6">const</span><span class="hl-2"> </span><span class="hl-7">getBlogs</span><span class="hl-2"> = </span><span class="hl-1">withCache</span><span class="hl-2">(</span><span class="hl-5">api</span><span class="hl-2">.</span><span class="hl-5">get</span><span class="hl-2">);</span><br/><span class="hl-4">await</span><span class="hl-2"> </span><span class="hl-1">getBlogs</span><span class="hl-2">(</span><span class="hl-3">"/blogs"</span><span class="hl-2">);</span><br/><span class="hl-4">await</span><span class="hl-2"> </span><span class="hl-1">sleep</span><span class="hl-2">();</span><br/><span class="hl-4">await</span><span class="hl-2"> </span><span class="hl-1">getBlogs</span><span class="hl-2">(</span><span class="hl-3">"/blogs"</span><span class="hl-2">); </span><span class="hl-0">// 不发请求,使用缓存</span>
|
|
172
172
|
</code><button type="button">Copy</button></pre>
|
|
173
173
|
|
|
174
|
-
</div></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/Nickyzj628/utils/blob/
|
|
174
|
+
</div></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/Nickyzj628/utils/blob/5c8635da5062e64964cf6710e2001e90b0fcbfe4/src/network/fetcher.ts#L60">network/fetcher.ts:60</a></li></ul></aside></div></li></ul></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">@nickyzj2023/utils</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div><script>
|
|
175
175
|
try {
|
|
176
176
|
const generateLinkElement = document.querySelector(".tsd-generator a");
|
|
177
177
|
const link = document.createElement("a");
|