@nickyzj2023/utils 1.0.74 → 1.0.75

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
@@ -39,22 +39,28 @@ declare namespace ChatCompletions {
39
39
  tool_calls?: ToolCall[];
40
40
  tool_call_id?: string;
41
41
  };
42
- type ToolCall = {
43
- id: string;
42
+ type ToolDefinition = {
44
43
  type: "function";
45
44
  function: {
46
45
  name: string;
47
- arguments: string;
46
+ description?: string;
47
+ parameters?: Record<string, any>;
48
48
  };
49
49
  };
50
- type ToolDefinition = {
50
+ type ToolCall = {
51
+ id: string;
51
52
  type: "function";
52
53
  function: {
53
54
  name: string;
54
- description?: string;
55
- parameters?: Record<string, any>;
55
+ arguments: string;
56
56
  };
57
57
  };
58
+ type ExtraArgs = {
59
+ messages?: ChatCompletions.Message[];
60
+ [key: string]: any;
61
+ };
62
+ type ToolHandler = (args: any, extraArgs?: ExtraArgs) => any | Promise<any>;
63
+ type ToolHandlers = Record<string, ChatCompletions.ToolHandler>;
58
64
  type Usage = {
59
65
  prompt_tokens: number;
60
66
  completion_tokens: number;
@@ -76,7 +82,7 @@ declare namespace ChatCompletions {
76
82
  };
77
83
  type ExtraBody = {
78
84
  /** 工具列表 */tools?: ToolDefinition[]; /** 工具调用函数表,key 为工具名,value 为函数 */
79
- toolHandlers?: Record<string, (args: any) => any | Promise<any>>; /** 是否使用流式传输,启用后函数返回异步迭代器 */
85
+ toolHandlers?: ToolHandlers; /** 是否使用流式传输,启用后函数返回异步迭代器 */
80
86
  stream?: boolean; /** 其他额外参数 */
81
87
  [key: string]: any;
82
88
  };
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
- const e=e=>e==null,t=e=>e?.constructor===Object,n=e=>e==null||typeof e!=`object`&&typeof e!=`function`,r=(e,n)=>Array.isArray(e)?e.map(e=>r(e,n)):t(e)?Object.keys(e).reduce((t,i)=>{let a=n(i),o=e[i];return t[a]=r(o,n),t},{}):e,i=(e,n,r)=>{let{filter:a}=r??{};if(Array.isArray(e)){let o=e.map((e,a)=>t(e)?i(e,n,r):n(e,a));return a?o.filter((e,t)=>a(e,t)):o}return t(e)?Object.keys(e).reduce((o,s)=>{let c=e[s],l;return l=t(c)||Array.isArray(c)?i(c,n,r):n(c,s),(!a||a(l,s))&&(o[s]=l),o},{}):e},a=(e,r)=>{let i={...e};for(let e of Object.keys(r)){let o=i[e],s=r[e];if(n(o)&&n(s)){i[e]=s;continue}if(Array.isArray(o)&&Array.isArray(s)){i[e]=o.concat(s);continue}if(t(o)&&t(s)){i[e]=a(o,s);continue}i[e]=s}return i},o=(e,t)=>{let n={...e};for(let e of t)delete n[e];return n},s=(e,t)=>{let n={};for(let[r,i]of Object.entries(e))t(r,i)||(n[r]=i);return n},c=(e,t)=>t.reduce((t,n)=>(Object.hasOwn(e,n)&&(t[n]=e[n]),t),{}),l=(e,t)=>{let n={};for(let[r,i]of Object.entries(e))t(r,i)&&(n[r]=i);return n},u=(n=``,r={})=>{let i=async(i,o={})=>{let s=new URL(n?`${n}${i}`:i),{params:c,parser:l,...u}=a(r,o);t(c)&&Object.entries(c).forEach(([t,n])=>{e(n)||s.searchParams.append(t,n.toString())}),(t(u.body)||Array.isArray(u.body))&&(u.body=JSON.stringify(u.body),u.headers={...u.headers,"Content-Type":`application/json`});let d=await fetch(s,u);if(!d.ok){if(d.headers.get(`Content-Type`)?.startsWith(`application/json`)){let e=await d.json(),t=Error(e.error?.message||d.statusText);throw t.data=e,t}throw Error(d.statusText)}return await(l?.(d)??d.json())};return{get:(e,t)=>i(e,{...t,method:`GET`}),post:(e,t,n)=>i(e,{...n,method:`POST`,body:t}),put:(e,t,n)=>i(e,{...n,method:`PUT`,body:t}),delete:(e,t)=>i(e,{...t,method:`DELETE`})}},d=async e=>{try{return[null,await e]}catch(e){return[e,void 0]}},f=async e=>{let[t,n]=await d(fetch(e,{method:`HEAD`,redirect:`manual`}));return t?e:n.headers.get(`location`)||e},p=e=>{let t=new Uint8Array(e),n=``;for(let e=0;e<t.byteLength;e++)n+=String.fromCharCode(t[e]);return btoa(n)},m=async(e,t={})=>{let{quality:n=.92,compressor:r,fetcher:i=fetch}=t;if(!e.startsWith(`http`))throw Error(`图片地址必须以http或https开头`);let a=await i(e);if(!a.ok)throw Error(`获取图片失败: ${a.statusText}`);let o=a.headers.get(`Content-Type`)||`image/jpeg`,s=await a.arrayBuffer();if(o!==`image/jpeg`&&o!==`image/png`)return`data:${o};base64,${p(s)}`;if(r)return await r(s,o,n);if(typeof OffscreenCanvas<`u`){let e=null;try{let t=new Blob([s],{type:o});e=await createImageBitmap(t);let r=new OffscreenCanvas(e.width,e.height),i=r.getContext(`2d`);if(!i)throw Error(`无法获取 OffscreenCanvas context`);return i.drawImage(e,0,0),e.close(),e=null,`data:${o};base64,${p(await(await r.convertToBlob({type:o,quality:n})).arrayBuffer())}`}catch{return e?.close(),`data:${o};base64,${p(s)}`}}return`data:${o};base64,${p(s)}`};async function*h(e){let t=e.body?.getReader();if(!t)return;let n=new TextDecoder,r=``;try{for(;;){let{value:e,done:i}=await t.read();if(i)break;r+=n.decode(e,{stream:!0});let a=r.split(`
1
+ const e=e=>e==null,t=e=>e?.constructor===Object,n=e=>e==null||typeof e!=`object`&&typeof e!=`function`,r=(e,n)=>Array.isArray(e)?e.map(e=>r(e,n)):t(e)?Object.keys(e).reduce((t,i)=>{let a=n(i),o=e[i];return t[a]=r(o,n),t},{}):e,i=(e,n,r)=>{let{filter:a}=r??{};if(Array.isArray(e)){let o=e.map((e,a)=>t(e)?i(e,n,r):n(e,a));return a?o.filter((e,t)=>a(e,t)):o}return t(e)?Object.keys(e).reduce((o,s)=>{let c=e[s],l;return l=t(c)||Array.isArray(c)?i(c,n,r):n(c,s),(!a||a(l,s))&&(o[s]=l),o},{}):e},a=(e,r)=>{let i={...e};for(let e of Object.keys(r)){let o=i[e],s=r[e];if(n(o)&&n(s)){i[e]=s;continue}if(Array.isArray(o)&&Array.isArray(s)){i[e]=o.concat(s);continue}if(t(o)&&t(s)){i[e]=a(o,s);continue}i[e]=s}return i},o=(e,t)=>{let n={...e};for(let e of t)delete n[e];return n},s=(e,t)=>{let n={};for(let[r,i]of Object.entries(e))t(r,i)||(n[r]=i);return n},c=(e,t)=>t.reduce((t,n)=>(Object.hasOwn(e,n)&&(t[n]=e[n]),t),{}),l=(e,t)=>{let n={};for(let[r,i]of Object.entries(e))t(r,i)&&(n[r]=i);return n},u=e=>e.replace(/_([a-zA-Z])/g,(e,t)=>t.toUpperCase()),d=e=>e.replace(/([A-Z])/g,(e,t)=>`_${t.toLowerCase()}`),f=e=>e.charAt(0).toUpperCase()+e.slice(1),p=e=>e.charAt(0).toLowerCase()+e.slice(1),m=(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,`
2
+ `)),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},h=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=h(t);if(e)return e}}return JSON.stringify(e,null,2)},g={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:``}},_=(n=``,r={})=>{let i=async(i,o={})=>{let s=new URL(n?`${n}${i}`:i),{params:c,parser:l,...u}=a(r,o);t(c)&&Object.entries(c).forEach(([t,n])=>{e(n)||s.searchParams.append(t,n.toString())}),(t(u.body)||Array.isArray(u.body))&&(u.body=JSON.stringify(u.body),u.headers={...u.headers,"Content-Type":`application/json`});let d=await fetch(s,u);if(!d.ok){let e=d.statusText||await d.text();try{e=h(JSON.parse(e))}catch{}throw Error(e)}return await(l?.(d)??d.json())};return{get:(e,t)=>i(e,{...t,method:`GET`}),post:(e,t,n)=>i(e,{...n,method:`POST`,body:t}),put:(e,t,n)=>i(e,{...n,method:`PUT`,body:t}),delete:(e,t)=>i(e,{...t,method:`DELETE`})}},v=async e=>{try{return[null,await e]}catch(e){return[e,void 0]}},y=async e=>{let[t,n]=await v(fetch(e,{method:`HEAD`,redirect:`manual`}));return t?e:n.headers.get(`location`)||e},b=e=>{let t=new Uint8Array(e),n=``;for(let e=0;e<t.byteLength;e++)n+=String.fromCharCode(t[e]);return btoa(n)},x=async(e,t={})=>{let{quality:n=.92,compressor:r,fetcher:i=fetch}=t;if(!e.startsWith(`http`))throw Error(`图片地址必须以http或https开头`);let a=await i(e);if(!a.ok)throw Error(`获取图片失败: ${a.statusText}`);let o=a.headers.get(`Content-Type`)||`image/jpeg`,s=await a.arrayBuffer();if(o!==`image/jpeg`&&o!==`image/png`)return`data:${o};base64,${b(s)}`;if(r)return await r(s,o,n);if(typeof OffscreenCanvas<`u`){let e=null;try{let t=new Blob([s],{type:o});e=await createImageBitmap(t);let r=new OffscreenCanvas(e.width,e.height),i=r.getContext(`2d`);if(!i)throw Error(`无法获取 OffscreenCanvas context`);return i.drawImage(e,0,0),e.close(),e=null,`data:${o};base64,${b(await(await r.convertToBlob({type:o,quality:n})).arrayBuffer())}`}catch{return e?.close(),`data:${o};base64,${b(s)}`}}return`data:${o};base64,${b(s)}`};async function*S(e){let t=e.body?.getReader();if(!t)return;let n=new TextDecoder,r=``;try{for(;;){let{value:e,done:i}=await t.read();if(i)break;r+=n.decode(e,{stream:!0});let a=r.split(`
2
3
 
3
4
  `);r=a.pop()||``;for(let e of a){let t=e.split(`
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
- `)),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){if(t instanceof Error&&t.name===`CustomError`)throw 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;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};
5
+ `);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 C=async e=>{let t=(await e.get(`/models`)).data[0]?.id;if(!t)throw Error(`无法从 /models 获取模型名称`);return t},w=async(e,t,n)=>{let r=t[e.function.name];if(!r)return`没有找到工具“${e.function.name}”的处理函数`;try{let t=await r(JSON.parse(e.function.arguments),n);return typeof t==`string`?t:JSON.stringify(t)}catch(t){if(t instanceof Error&&t.name===e.function.name)throw t;return`工具“${e.function.name}”处理失败:${h(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=_(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,{messages:t});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=_(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 S(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}t.push({role:`assistant`,content:r}),a&&(yield{usage:a});break}};async function O(e,t,n={}){let{stream:r,toolHandlers:i={},...a}=n;return(r?D: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,d as camelToSnake,f as capitalize,O as chatCompletions,m as compactStr,F as debounce,p as decapitalize,k as defineModel,h as extractErrorMessage,_ as fetcher,y as getRealURL,x 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,S as parseSSE,c as pick,l as pickBy,g as qs,P as randomInt,L as sleep,u as snakeToCamel,R as throttle,v as to,N as withCache};
package/package.json CHANGED
@@ -1,33 +1,33 @@
1
- {
2
- "name": "@nickyzj2023/utils",
3
- "version": "1.0.74",
4
- "type": "module",
5
- "main": "dist/index.mjs",
6
- "module": "dist/index.mjs",
7
- "types": "dist/index.d.mts",
8
- "exports": {
9
- ".": {
10
- "types": "./dist/index.d.mts",
11
- "import": "./dist/index.mjs"
12
- }
13
- },
14
- "files": [
15
- "dist"
16
- ],
17
- "scripts": {
18
- "build": "tsdown",
19
- "docs": "typedoc",
20
- "check": "biome check --diagnostic-level=error --write src/"
21
- },
22
- "repository": {
23
- "type": "git",
24
- "url": "https://github.com/Nickyzj628/utils.git"
25
- },
26
- "devDependencies": {
27
- "@types/node": "^25.9.1",
28
- "tsdown": "^0.22.0",
29
- "typedoc": "^0.28.19",
30
- "typedoc-material-theme": "^1.4.1",
31
- "typescript": "^6.0.3"
32
- }
33
- }
1
+ {
2
+ "name": "@nickyzj2023/utils",
3
+ "version": "1.0.75",
4
+ "type": "module",
5
+ "main": "dist/index.mjs",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.mts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.mts",
11
+ "import": "./dist/index.mjs"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsdown",
19
+ "docs": "typedoc",
20
+ "check": "biome check --diagnostic-level=error --write src/"
21
+ },
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "https://github.com/Nickyzj628/utils.git"
25
+ },
26
+ "devDependencies": {
27
+ "@types/node": "^25.9.3",
28
+ "tsdown": "^0.22.2",
29
+ "typedoc": "^0.28.19",
30
+ "typedoc-material-theme": "^1.4.1",
31
+ "typescript": "^6.0.3"
32
+ }
33
+ }