@nickyzj2023/utils 1.0.72 → 1.0.73

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -186,35 +186,47 @@ declare function chatCompletions(model: ChatCompletions.Model, messages: ChatCom
186
186
  */
187
187
  declare const defineModel: (config: ChatCompletions.Model) => ChatCompletions.Model;
188
188
  //#endregion
189
- //#region src/dom/log.d.ts
189
+ //#region src/dom/logger.d.ts
190
190
  /**
191
- * log 配置选项
191
+ * logger 配置选项
192
192
  */
193
- interface LogOptions {
193
+ interface LoggerOptions {
194
194
  /**
195
195
  * 是否显示时间
196
196
  * @default true
197
197
  */
198
- time?: boolean;
198
+ withTime?: boolean;
199
199
  /**
200
200
  * 是否显示调用者文件名
201
201
  * @default true
202
202
  */
203
- fileName?: boolean;
203
+ withFileName?: boolean;
204
204
  }
205
205
  /**
206
206
  * 带额外信息的 console.log
207
- * @param message - 日志消息,支持单条消息或消息数组
207
+ *
208
+ * **直接调用**:使用默认选项打印消息
209
+ * @param messages - 日志消息,支持多条
210
+ *
211
+ * **预配置**:先传入选项返回 logger 函数,再调用打印
208
212
  * @param options - 配置选项
213
+ * @returns 配置后的 logger 函数
209
214
  *
210
215
  * @example
211
- * log("调试信息"); // "[14:30:00] [index.ts:15] 调试信息"
212
- * log("调试信息", { time: false }); // "[index.ts:15] 调试信息"
213
- * log("调试信息", { fileName: false }); // "[14:30:00] 调试信息"
214
- * log("调试信息", { time: false, fileName: false }); // "调试信息"
215
- * log(["消息1", "消息2"]); // "[14:30:00] [index.ts:15] 消息1 消息2"
216
+ * // 直接调用(默认显示时间和文件名)
217
+ * logger("调试信息"); // "[14:30:00] [index.ts:15:2] 调试信息"
218
+ * logger("消息1", "消息2"); // "[14:30:00] [index.ts:15:2] 消息1 消息2"
219
+ *
220
+ * // 预配置后调用
221
+ * const myLogger = logger({ withTime: true, withFileName: true });
222
+ * myLogger("一段消息", "另一段消息"); // "[18:59:47] [index.ts:137:2] 一段消息 另一段消息"
223
+ *
224
+ * // 关闭时间或文件名
225
+ * const plainLogger = logger({ withTime: false });
226
+ * plainLogger("纯文件名前缀"); // "[index.ts:15:2] 纯文件名前缀"
216
227
  */
217
- declare const log: (message: any | any[], options?: LogOptions) => void;
228
+ declare function logger(options?: LoggerOptions): (...messages: any[]) => void;
229
+ declare function logger(...messages: any[]): void;
218
230
  //#endregion
219
231
  //#region src/function/loop-until.d.ts
220
232
  /**
@@ -800,4 +812,4 @@ declare const sleep: (time?: number) => Promise<unknown>;
800
812
  */
801
813
  declare const throttle: <T extends (...args: any[]) => any>(fn: T, delay?: number) => (this: any, ...args: Parameters<T>) => void;
802
814
  //#endregion
803
- export { CamelToSnake, Capitalize, type ChatCompletions, Decapitalize, DeepMapKeys, DeepMapValues, ImageCompressionOptions, LockQueue, LogOptions, Primitive, RequestInit, SetTtl, SnakeToCamel, camelToSnake, capitalize, chatCompletions, compactStr, debounce, decapitalize, defineModel, extractErrorMessage, fetcher, getRealURL, imageUrlToBase64, isNil, isObject, isPrimitive, log, loopUntil, mapKeys, mapValues, mergeObjects, omit, omitBy, parseSSE, pick, pickBy, qs, randomInt, sleep, snakeToCamel, throttle, to, withCache };
815
+ export { CamelToSnake, Capitalize, type ChatCompletions, Decapitalize, DeepMapKeys, DeepMapValues, ImageCompressionOptions, LockQueue, LoggerOptions, Primitive, RequestInit, SetTtl, SnakeToCamel, camelToSnake, capitalize, chatCompletions, compactStr, debounce, decapitalize, defineModel, extractErrorMessage, fetcher, getRealURL, imageUrlToBase64, isNil, isObject, isPrimitive, logger, loopUntil, mapKeys, mapValues, mergeObjects, omit, omitBy, parseSSE, pick, pickBy, qs, randomInt, sleep, snakeToCamel, throttle, to, withCache };
package/dist/index.mjs CHANGED
@@ -3,5 +3,5 @@ const e=e=>e==null,t=e=>e?.constructor===Object,n=e=>e==null||typeof e!=`object`
3
3
  `);r=a.pop()||``;for(let e of a){let t=e.split(`
4
4
  `);for(let e of t){if(!e.startsWith(`data:`))continue;let t=e.replace(/^data:\s*/,``).trim();try{yield JSON.parse(t)}catch{yield t}}}}}finally{t.releaseLock()}}const g=e=>e.replace(/_([a-zA-Z])/g,(e,t)=>t.toUpperCase()),_=e=>e.replace(/([A-Z])/g,(e,t)=>`_${t.toLowerCase()}`),v=e=>e.charAt(0).toUpperCase()+e.slice(1),y=e=>e.charAt(0).toLowerCase()+e.slice(1),b=(e=``,t)=>{if(!e)return``;let{maxLength:n=1/0,disableNewLineReplace:r=!1,disableCollapse:i=!1}=t??{},a=e;return i||(a=a.replace(/[\n\t]+/g,`
5
5
  `)),a=r?a.replace(/\r?\n/g,` `):a.replace(/\r?\n/g,`\\n`),a=a.replace(/\s+/g,` `).trim(),n>0&&a.length>n?`${a.slice(0,n)}...`:a},x=e=>{if(e instanceof Error)return e.message;if(typeof e==`string`)return e;if(t(e)){let t=e.message||e.msg;if(t)return t;for(let t of Object.values(e)){let e=x(t);if(e)return e}}return JSON.stringify(e,null,2)},S={parse:e=>{let t=new URLSearchParams(e),n={};for(let[e,r]of t)Number.isNaN(Number(r))?n[e]=r:n[e]=Number(r);return n},stringify:(e,t)=>{let{addQueryPrefix:n=!1}=t??{},r=new URLSearchParams(e).toString();return r?n?`?${r}`:r:``}},C=async e=>{let t=(await e.get(`/models`)).data[0]?.id;if(!t)throw Error(`无法从 /models 获取模型名称`);return t},w=async(e,t)=>{let n=t[e.function.name];if(!n)return`没有找到工具“${e.function.name}”的处理函数`;try{let t=await n(JSON.parse(e.function.arguments));return typeof t==`string`?t:JSON.stringify(t)}catch(t){return`工具“${e.function.name}”处理失败:${x(t)}`}},T=e=>typeof e==`string`?e:e.filter(e=>e.type===`text`).map(e=>e.text).join(`
6
- `),E=async(e,t,n,r)=>{let{baseUrl:i,apiKey:a=``,model:o}=e,s=u(i,{headers:{Authorization:`Bearer ${a}`}}),c={model:o??await C(s),messages:t,...r};for(;;){let{choices:e,usage:r,...i}=await s.post(`/chat/completions`,c),{message:a}=e?.[0]??{};if(!a)throw Error(`模型没有回复任何内容`);t.push(a);let{content:o=``,tool_calls:l=[],...u}=a,d=u?.reasoning_content||u?.reasoning;if(l.length>0&&Object.keys(n).length>0){for(let e of l){let r=await w(e,n);t.push({role:`tool`,content:r,tool_call_id:e.id})}continue}return{content:T(o),reasoningContent:d,usage:r,...i,...u}}},D=async function*(e,t,n,r){let{baseUrl:i,apiKey:a=``,model:o}=e,s=u(i,{headers:{Authorization:`Bearer ${a}`}}),c={model:o??await C(s),messages:t,stream:!0,...r};for(;;){let e=new Map,r=``,i=null,a,o=await s.post(`/chat/completions`,c,{parser:async e=>e});for await(let t of h(o)){t.usage&&(a=t.usage);let n=t.choices?.[0];if(!n)continue;let{delta:o}=n,{content:s,tool_calls:c}=o,l=o.reasoning_content||o.reasoning;if(l&&(yield{reasoningContent:l}),s&&(r+=s,yield{content:s}),c)for(let t of c){let n=e.get(t.index)??{id:``,type:`function`,function:{name:``,arguments:``}};t.id&&(n.id=t.id),t.function?.name&&(n.function.name+=t.function.name),t.function?.arguments&&(n.function.arguments+=t.function.arguments),e.set(t.index,n)}n.finish_reason&&(i=n.finish_reason)}let l=Array.from(e.values());if(i===`tool_calls`&&l.length>0&&Object.keys(n).length>0){t.push({role:`assistant`,content:r,tool_calls:l});for(let e of l){let r=await w(e,n);t.push({role:`tool`,content:r,tool_call_id:e.id})}continue}a&&(yield{usage:a});break}};async function O(e,t,n={}){let{stream:r,toolHandlers:i={},...a}=n;return r?D(e,t,i,a):E(e,t,i,a)}const k=e=>e,A=(e,t)=>{let{time:n=!0,fileName:r=!0}=t??{},i=[];if(n&&i.push(`[${new Date().toLocaleTimeString()}]`),r){let{stack:e}=Error(),t=(e?.split(`
7
- `)[2]?.trim())?.match(/at\s+(.*):(\d+)/);if(t?.[1]){let e=t[1].split(/[/\\]/).pop();i.push(`[${e}:${t[2]}]`)}}Array.isArray(e)?i.push(...e):i.push(e),console.log(...i)},j=async(e,t)=>{let{maxRetries:n=5,shouldStop:r}=t??{},i;for(let t=0;t<n;t++)if(i=await e(t),r?.(i)===!0)return i;if(!r)return i;throw Error(`超过了最大循环次数(${n})且未满足停止执行条件`)},M=(e,t=-1)=>{let n=new Map,r=(...r)=>{let i=JSON.stringify(r),a=Date.now(),o=n.get(i);if(o&&a<o.expiresAt)return o.value;let s=t===-1?1/0:a+t*1e3,c=e.apply({setTtl:e=>{s=a+e*1e3}},r);if(c instanceof Promise){let e=c.then(e=>(n.set(i,{value:e,expiresAt:s}),e));return n.set(i,{value:e,expiresAt:s}),e}return n.set(i,{value:c,expiresAt:s}),c};return r.clear=()=>n.clear(),r.updateTtl=e=>{t=e;let r=Date.now(),i=r+e*1e3;for(let[e,t]of n.entries())t.expiresAt>r&&(t.expiresAt=i,n.set(e,t))},r},N=(e,t)=>Math.floor(Math.random()*(t-e+1))+e,P=(e,t=300)=>{let n=null;return(...r)=>{n&&clearTimeout(n),n=setTimeout(()=>{e(...r)},t)}};var F=class{queue;constructor(){this.queue=Promise.resolve()}waitInQueue(){let e,t=new Promise(t=>{e=t}),n=this.queue.then(()=>e);return this.queue=t,n}};const I=async(e=150)=>new Promise(t=>{setTimeout(t,e)}),L=(e,t=300)=>{let n=null;return function(...r){n||=setTimeout(()=>{n=null,e.apply(this,r)},t)}};export{F as LockQueue,_ as camelToSnake,v as capitalize,O as chatCompletions,b as compactStr,P as debounce,y as decapitalize,k as defineModel,x as extractErrorMessage,u as fetcher,f as getRealURL,m as imageUrlToBase64,e as isNil,t as isObject,n as isPrimitive,A as log,j as loopUntil,r as mapKeys,i as mapValues,a as mergeObjects,o as omit,s as omitBy,h as parseSSE,c as pick,l as pickBy,S as qs,N as randomInt,I as sleep,g as snakeToCamel,L as throttle,d as to,M as withCache};
6
+ `),E=async(e,t,n,r)=>{let{baseUrl:i,apiKey:a=``,model:o}=e,s=u(i,{headers:{Authorization:`Bearer ${a}`}}),c={model:o??await C(s),messages:t,...r};for(;;){let{choices:e,usage:r,...i}=await s.post(`/chat/completions`,c),{message:a}=e?.[0]??{};if(!a)throw Error(`模型没有回复任何内容`);t.push(a);let{content:o=``,tool_calls:l=[],...u}=a,d=u?.reasoning_content||u?.reasoning;if(l.length>0&&Object.keys(n).length>0){for(let e of l){let r=await w(e,n);t.push({role:`tool`,content:r,tool_call_id:e.id})}continue}return{content:T(o),reasoningContent:d,usage:r,...i,...u}}},D=async function*(e,t,n,r){let{baseUrl:i,apiKey:a=``,model:o}=e,s=u(i,{headers:{Authorization:`Bearer ${a}`}}),c={model:o??await C(s),messages:t,stream:!0,...r};for(;;){let e=new Map,r=``,i=null,a,o=await s.post(`/chat/completions`,c,{parser:async e=>e});for await(let t of h(o)){t.usage&&(a=t.usage);let n=t.choices?.[0];if(!n)continue;let{delta:o}=n,{content:s,tool_calls:c}=o,l=o.reasoning_content||o.reasoning;if(l&&(yield{reasoningContent:l}),s&&(r+=s,yield{content:s}),c)for(let t of c){let n=e.get(t.index)??{id:``,type:`function`,function:{name:``,arguments:``}};t.id&&(n.id=t.id),t.function?.name&&(n.function.name+=t.function.name),t.function?.arguments&&(n.function.arguments+=t.function.arguments),e.set(t.index,n)}n.finish_reason&&(i=n.finish_reason)}let l=Array.from(e.values());if(i===`tool_calls`&&l.length>0&&Object.keys(n).length>0){t.push({role:`assistant`,content:r,tool_calls:l});for(let e of l){let r=await w(e,n);t.push({role:`tool`,content:r,tool_call_id:e.id})}continue}a&&(yield{usage:a});break}};async function O(e,t,n={}){let{stream:r,toolHandlers:i={},...a}=n;return r?D(e,t,i,a):E(e,t,i,a)}const k=e=>e;function A(e={},t=0){let{withTime:n=!0,withFileName:r=!0}=e;return(...e)=>{let i=[];if(n&&i.push(`[${new Date().toLocaleTimeString()}]`),r){let{stack:e}=Error(),n=(e?.split(`
7
+ `)[2+t]?.trim())?.match(/^at\s+(?:.*?\s*\()?(.*?):(\d+)(?::(\d+))?\)?/);if(n?.[1]){let e=n[1].split(/[/\\]/).pop();i.push(`[${e}:${n[2]}]`)}}i.push(...e),console.log(...i)}}function j(e,...n){if(t(e)&&(`withTime`in e||`withFileName`in e))return A(e,0);A({},1)(e,...n)}const M=async(e,t)=>{let{maxRetries:n=5,shouldStop:r}=t??{},i;for(let t=0;t<n;t++)if(i=await e(t),r?.(i)===!0)return i;if(!r)return i;throw Error(`超过了最大循环次数(${n})且未满足停止执行条件`)},N=(e,t=-1)=>{let n=new Map,r=(...r)=>{let i=JSON.stringify(r),a=Date.now(),o=n.get(i);if(o&&a<o.expiresAt)return o.value;let s=t===-1?1/0:a+t*1e3,c=e.apply({setTtl:e=>{s=a+e*1e3}},r);if(c instanceof Promise){let e=c.then(e=>(n.set(i,{value:e,expiresAt:s}),e));return n.set(i,{value:e,expiresAt:s}),e}return n.set(i,{value:c,expiresAt:s}),c};return r.clear=()=>n.clear(),r.updateTtl=e=>{t=e;let r=Date.now(),i=r+e*1e3;for(let[e,t]of n.entries())t.expiresAt>r&&(t.expiresAt=i,n.set(e,t))},r},P=(e,t)=>Math.floor(Math.random()*(t-e+1))+e,F=(e,t=300)=>{let n=null;return(...r)=>{n&&clearTimeout(n),n=setTimeout(()=>{e(...r)},t)}};var I=class{queue;constructor(){this.queue=Promise.resolve()}waitInQueue(){let e,t=new Promise(t=>{e=t}),n=this.queue.then(()=>e);return this.queue=t,n}};const L=async(e=150)=>new Promise(t=>{setTimeout(t,e)}),R=(e,t=300)=>{let n=null;return function(...r){n||=setTimeout(()=>{n=null,e.apply(this,r)},t)}};export{I as LockQueue,_ as camelToSnake,v as capitalize,O as chatCompletions,b as compactStr,F as debounce,y as decapitalize,k as defineModel,x as extractErrorMessage,u as fetcher,f as getRealURL,m as imageUrlToBase64,e as isNil,t as isObject,n as isPrimitive,j as logger,M as loopUntil,r as mapKeys,i as mapValues,a as mergeObjects,o as omit,s as omitBy,h as parseSSE,c as pick,l as pickBy,S as qs,P as randomInt,L as sleep,g as snakeToCamel,R as throttle,d as to,N as withCache};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nickyzj2023/utils",
3
- "version": "1.0.72",
3
+ "version": "1.0.73",
4
4
  "type": "module",
5
5
  "main": "dist/index.mjs",
6
6
  "module": "dist/index.mjs",