@ts-utilities/core 1.3.2 → 1.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +146 -13
- package/dist/index.d.ts +146 -13
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=e=>!e,t=e=>e==null,n=e=>typeof e==`boolean`,r=e=>typeof e==`string`,i=e=>{if(typeof e==`number`)return Number.isFinite(e);if(typeof e==`string`){let t=Number(e);return Number.isFinite(t)}return!1},a=e=>Array.isArray(e),o=e=>typeof e==`function`,s=e=>{if(e==null)return!0;switch(typeof e){case`string`:case`number`:case`bigint`:case`boolean`:case`symbol`:return!0;default:return!1}};function c(e){if(typeof e!=`object`||!e||Object.prototype.toString.call(e)!==`[object Object]`)return!1;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype}function l(e,...t){let n,r={},i=t[t.length-1];i&&typeof i==`object`&&!Array.isArray(i)&&(i.arrayMerge!==void 0||i.clone!==void 0||i.customMerge!==void 0||i.functionMerge!==void 0||i.maxDepth!==void 0)?(r={...r,...i},n=t.slice(0,-1)):n=t;let{arrayMerge:a=`replace`,clone:o=!0,functionMerge:s=`replace`,maxDepth:l=100,customMerge:u}=r,d=new WeakMap;return f(e,n,0);function f(e,t,n){if(n>=l)return console.warn(`[deepmerge] Maximum depth ${l} exceeded. Returning target as-is.`),e;if(!c(e)&&!Array.isArray(e)){for(let n of t)if(n!==void 0){if(u){let t=u(``,e,n);if(t!==void 0)return t}return typeof e==`function`&&typeof n==`function`&&s===`compose`?(...t)=>{e(...t),n(...t)}:n}return e}let r=o?Array.isArray(e)?[...e]:{...e}:e;for(let e of t)if(e!=null&&!d.has(e))if(d.set(e,r),Array.isArray(r)&&Array.isArray(e))r=p(r,e,a);else if(c(r)&&c(e)){let t=new Set([...Object.keys(r),...Object.keys(e),...Object.getOwnPropertySymbols(r),...Object.getOwnPropertySymbols(e)]);for(let i of t){let t=r[i],o=e[i];u&&u(i,t,o)!==void 0?r[i]=u(i,t,o):typeof t==`function`&&typeof o==`function`?s===`compose`?r[i]=(...e)=>{t(...e),o(...e)}:r[i]=o:c(t)&&c(o)?r[i]=f(t,[o],n+1):Array.isArray(t)&&Array.isArray(o)?r[i]=p(t,o,a):o!==void 0&&(r[i]=o)}}else r=e;return r}function p(e,t,n){if(typeof n==`function`)return n(e,t);switch(n){case`concat`:return[...e,...t];case`merge`:let n=Math.max(e.length,t.length),r=[];for(let i=0;i<n;i++)i<e.length&&i<t.length?c(e[i])&&c(t[i])?r[i]=f(e[i],[t[i]],0):r[i]=t[i]:i<e.length?r[i]=e[i]:r[i]=t[i];return r;case`replace`:default:return[...t]}}}function u(e,t,n){
|
|
1
|
+
const e=e=>!e,t=e=>e==null,n=e=>typeof e==`boolean`,r=e=>typeof e==`string`,i=e=>{if(typeof e==`number`)return Number.isFinite(e);if(typeof e==`string`){let t=Number(e);return Number.isFinite(t)}return!1},a=e=>Array.isArray(e),o=e=>typeof e==`function`,s=e=>{if(e==null)return!0;switch(typeof e){case`string`:case`number`:case`bigint`:case`boolean`:case`symbol`:return!0;default:return!1}};function c(e){if(typeof e!=`object`||!e||Object.prototype.toString.call(e)!==`[object Object]`)return!1;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype}function l(e,...t){let n,r={},i=t[t.length-1];i&&typeof i==`object`&&!Array.isArray(i)&&(i.arrayMerge!==void 0||i.clone!==void 0||i.customMerge!==void 0||i.functionMerge!==void 0||i.maxDepth!==void 0)?(r={...r,...i},n=t.slice(0,-1)):n=t;let{arrayMerge:a=`replace`,clone:o=!0,functionMerge:s=`replace`,maxDepth:l=100,customMerge:u}=r,d=new WeakMap;return f(e,n,0);function f(e,t,n){if(n>=l)return console.warn(`[deepmerge] Maximum depth ${l} exceeded. Returning target as-is.`),e;if(!c(e)&&!Array.isArray(e)){for(let n of t)if(n!==void 0){if(u){let t=u(``,e,n);if(t!==void 0)return t}return typeof e==`function`&&typeof n==`function`&&s===`compose`?(...t)=>{e(...t),n(...t)}:n}return e}let r=o?Array.isArray(e)?[...e]:{...e}:e;for(let e of t)if(e!=null&&!d.has(e))if(d.set(e,r),Array.isArray(r)&&Array.isArray(e))r=p(r,e,a);else if(c(r)&&c(e)){let t=new Set([...Object.keys(r),...Object.keys(e),...Object.getOwnPropertySymbols(r),...Object.getOwnPropertySymbols(e)]);for(let i of t){let t=r[i],o=e[i];u&&u(i,t,o)!==void 0?r[i]=u(i,t,o):typeof t==`function`&&typeof o==`function`?s===`compose`?r[i]=(...e)=>{t(...e),o(...e)}:r[i]=o:c(t)&&c(o)?r[i]=f(t,[o],n+1):Array.isArray(t)&&Array.isArray(o)?r[i]=p(t,o,a):o!==void 0&&(r[i]=o)}}else r=e;return r}function p(e,t,n){if(typeof n==`function`)return n(e,t);switch(n){case`concat`:return[...e,...t];case`merge`:let n=Math.max(e.length,t.length),r=[];for(let i=0;i<n;i++)i<e.length&&i<t.length?c(e[i])&&c(t[i])?r[i]=f(e[i],[t[i]],0):r[i]=t[i]:i<e.length?r[i]=e[i]:r[i]=t[i];return r;case`replace`:default:return[...t]}}}function u(e,t,n){if(Array.isArray(t))return t.map(t=>u(e,t,n));if(typeof t==`object`&&t&&!Array.isArray(t)){let r={};for(let i in t)t.hasOwnProperty(i)&&(r[i]=u(e,t[i],n));return r}if(typeof t!=`string`)return n;let r=(()=>t===``?[]:t.split(`.`).filter(e=>e!==``))(),i=e;for(let e of r){if(i==null)return n;let t=typeof e==`string`&&Array.isArray(i)&&/^\d+$/.test(e)?Number.parseInt(e,10):e;i=i[t]}return i===void 0?n:i}function d(e){return f(e)}function f(e){if(e!==null){if(typeof e!=`object`||!e)return e;if(Array.isArray(e))return e.map(f);if(c(e)){let t={};for(let n in e)t[n]=f(e[n]);return t}return e}}function p(e,t){return e==null?e:Object.assign(e,t)}function m(e){return(e.split(`.`).pop()||e).replace(/([a-z])([A-Z])/g,`$1 $2`).split(/[-_|�\s]+/).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `)}const h=`àáãäâèéëêìíïîòóöôùúüûñç·/_,:;`,g=`aaaaaeeeeiiiioooouuuunc------`,_=e=>{if(typeof e!=`string`)throw TypeError(`Input must be a string`);let t=e.trim().toLowerCase(),n={};for(let e=0;e<29;e++)n[h.charAt(e)]=`aaaaaeeeeiiiioooouuuunc------`.charAt(e);return t=t.replace(RegExp(`[${h}]`,`g`),e=>n[e]||e),t.replace(/[^a-z0-9 -]/g,``).replace(/\s+/g,`-`).replace(/-+/g,`-`).replace(/^-+/,``).replace(/-+$/,``)||``},v=(e=1e3,t)=>new Promise(n=>{if(t?.aborted)return n();let r=setTimeout(()=>{a(),n()},e);function i(){clearTimeout(r),a(),n()}function a(){t?.removeEventListener(`abort`,i)}t&&t.addEventListener(`abort`,i,{once:!0})});function y(e,t=100,n){if(typeof e!=`function`)throw TypeError(`Expected the first parameter to be a function, got \`${typeof e}\`.`);if(t<0)throw RangeError("`wait` must not be negative.");let r=n?.immediate??!1,i,a,o,s;function c(){return s=e.apply(o,a),a=void 0,o=void 0,s}let l=function(...e){return a=e,o=this,i===void 0&&r&&(s=c.call(this)),i!==void 0&&clearTimeout(i),i=setTimeout(c.bind(this),t),s};return Object.defineProperty(l,`isPending`,{get(){return i!==void 0}}),l}function b(e,t=100,n){if(typeof e!=`function`)throw TypeError(`Expected the first parameter to be a function, got \`${typeof e}\`.`);if(t<0)throw RangeError("`wait` must not be negative.");let r=n?.leading??!0,i=n?.trailing??!0,a,o,s,c,l;function u(){c=Date.now(),l=e.apply(s,o),o=void 0,s=void 0}function d(){a=void 0,i&&o&&u()}let f=function(...e){let n=c?Date.now()-c:1/0;return o=e,s=this,n>=t?r?u():a=setTimeout(d,t):!a&&i&&(a=setTimeout(d,t-n)),l};return Object.defineProperty(f,`isPending`,{get(){return a!==void 0}}),f}function x(e,...t){let n=t.length===1&&Array.isArray(t[0])?t[0]:t,r=0;return e.replace(/%s/g,()=>{let e=n[r++];return e===void 0?``:String(e)})}function S(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function C(e,t={}){if(!e)return``;let{lowercase:n=!0,removeAccents:r=!0,removeNonAlphanumeric:i=!0}=t,a=e.normalize(`NFC`);return r&&(a=a.normalize(`NFD`).replace(/\p{M}/gu,``)),i&&(a=a.replace(/^[^\p{L}\p{N}]*|[^\p{L}\p{N}]*$/gu,``)),n&&(a=a.toLocaleLowerCase()),a}function w(e,...t){return typeof e==`function`?e(...t):e}async function T(e,{interval:t=5e3,timeout:n=300*1e3,jitter:r=!0,signal:i}={}){let a=Date.now(),o=i?.aborted??!1,s=()=>{o=!0};i?.addEventListener(`abort`,s,{once:!0});try{for(let s=0;;s++){if(o)throw Error(`Polling aborted`);let s=await e();if(s)return s;if(Date.now()-a>=n)throw Error(`Polling timed out`,{cause:`Polling timed out after ${n}ms`});await v(r?t+(Math.random()-.5)*t*.2:t,i)}}catch(e){throw e}finally{i?.removeEventListener(`abort`,s)}}async function E(e,t={}){let{concurrency:n=1/0,timeout:r=1/0,signal:i,retry:a=0,retryDelay:o=0,throwOnFirstError:s=!1,ignoreErrors:c=!1}=t,l=Array.isArray(e),u={};l?e.forEach((e,t)=>{u[t.toString()]=e}):Object.entries(e).forEach(([e,t])=>{u[e]=t});let d=Object.keys(u);if(d.length===0)return{results:l?[]:{},errors:[],succeeded:0,failed:0,duration:0};let f=Date.now(),p=[],m=[],h=0,g=0,_=0,y=!1,b=s?null:void 0,x=async e=>{let t=0;for(;t<=a&&!y;)try{let t=u[e],n=await(typeof t==`function`?t():t);p.push([e,n]),g++;return}catch(e){if(t===a){let t=e instanceof Error?e:Error(String(e));m.push(t),_++,!c&&s&&!b&&(b=t,y=!0);return}t++,o>0&&await v(o,i)}},S=Array.from({length:Math.min(n,d.length)},async()=>{for(;!y;){let e=h++;if(e>=d.length)return;if(i?.aborted){y=!0;return}await x(d[e])}}),C=Promise.all(S);if(r===1/0?await C:await Promise.race([C,v(r,i).then(()=>{throw y=!0,Error(`Concurrence timed out after ${r}ms`)})]),b&&s)throw b;return l?{results:p.sort((e,t)=>Number(e[0])-Number(t[0])).map(([,e])=>e),errors:m,succeeded:g,failed:_,duration:Date.now()-f}:{results:Object.fromEntries(p),errors:m,succeeded:g,failed:_,duration:Date.now()-f}}function D(e,t={}){let{retry:n=0,delay:r=0}=t,i=Date.now(),a=async t=>{try{await e();let t=Date.now()-i;console.log(`⚡[schedule.ts] Completed in ${t}ms`)}catch(e){if(console.log(`⚡[schedule.ts] err:`,e),t>0)console.log(`⚡[schedule.ts] Retrying in ${r}ms...`),setTimeout(()=>a(t-1),r);else{let e=Date.now()-i;console.log(`⚡[schedule.ts] Failed after ${e}ms`)}}};setTimeout(()=>a(n),0)}function O(e){if(e instanceof Promise)return e.then(e=>[null,e]).catch(e=>[e,null]);try{return[null,e()]}catch(t){return console.log(`\x1b[31m🛡 [shield]\x1b[0m ${e.name} failed →`,t),[t,null]}}exports.convertToNormalCase=m,exports.convertToSlug=_,exports.debounce=y,exports.deepmerge=l,exports.escapeRegExp=S,exports.extendProps=p,exports.extract=u,exports.hydrate=d,exports.isArray=a,exports.isBoolean=n,exports.isFalsy=e,exports.isFiniteNumber=i,exports.isFunction=o,exports.isNullish=t,exports.isPlainObject=c,exports.isPrimitive=s,exports.isString=r,exports.normalizeText=C,exports.poll=T,exports.printf=x,exports.schedule=D,exports.shield=O,exports.sleep=v,exports.throttle=b,exports.unwrap=w,exports.withConcurrency=E;
|
package/dist/index.d.cts
CHANGED
|
@@ -518,6 +518,33 @@ type NestedKeyOf<ObjectType extends object, IgnoreKeys extends string = never> =
|
|
|
518
518
|
* ```
|
|
519
519
|
*/
|
|
520
520
|
type Without<T, U$1> = { [P in Exclude<keyof T, keyof U$1>]?: never };
|
|
521
|
+
/**
|
|
522
|
+
* Represents a value that can be either a direct value or a function that returns that value.
|
|
523
|
+
*
|
|
524
|
+
* This is useful for allowing consumers to provide either a static value or a computed value
|
|
525
|
+
* via a function, commonly used for lazy evaluation or context-dependent values.
|
|
526
|
+
*
|
|
527
|
+
* @template T - The type of the value
|
|
528
|
+
* @template A - The tuple type of arguments the function accepts (defaults to empty array)
|
|
529
|
+
* @returns Either the value directly or a function that returns the value
|
|
530
|
+
*
|
|
531
|
+
* @example
|
|
532
|
+
* ```ts
|
|
533
|
+
* type ConfigValue = MaybeFunction<string, [string]>;
|
|
534
|
+
* const directValue: ConfigValue = 'hello';
|
|
535
|
+
* const computedValue: ConfigValue = (name) => `Hello, ${name}`;
|
|
536
|
+
*
|
|
537
|
+
* function getValue<T, A extends unknown[]>(
|
|
538
|
+
* maybeFn: MaybeFunction<T, A>,
|
|
539
|
+
* ...args: A
|
|
540
|
+
* ): T {
|
|
541
|
+
* return typeof maybeFn === 'function' ? maybeFn(...args) : maybeFn;
|
|
542
|
+
* }
|
|
543
|
+
*
|
|
544
|
+
* const result = getValue(computedValue, 'World'); // 'Hello, World'
|
|
545
|
+
* ```
|
|
546
|
+
*/
|
|
547
|
+
type MaybeFunction<T, A extends unknown[] = []> = T | ((...args: A) => T);
|
|
521
548
|
//#endregion
|
|
522
549
|
//#region src/types/gates.d.ts
|
|
523
550
|
type BUFFER<T> = T;
|
|
@@ -775,20 +802,97 @@ declare const isPrimitive: (val: unknown) => val is Primitive;
|
|
|
775
802
|
declare function isPlainObject(value: unknown): value is Record<string, any>;
|
|
776
803
|
//#endregion
|
|
777
804
|
//#region src/functions/extract.d.ts
|
|
805
|
+
/**
|
|
806
|
+
* Type representing a path split into segments
|
|
807
|
+
* @template P - The original path string type
|
|
808
|
+
*/
|
|
778
809
|
type SplitPath<P$1 extends string> = P$1 extends `${infer First}.${infer Rest}` ? [First, ...SplitPath<Rest>] : [P$1];
|
|
810
|
+
/**
|
|
811
|
+
* Recursive type to resolve nested object types based on path
|
|
812
|
+
* @template T - Current object type
|
|
813
|
+
* @template K - Array of path segments
|
|
814
|
+
*/
|
|
779
815
|
type GetValue<T, K$1 extends Array<string | number>> = K$1 extends [infer First, ...infer Rest] ? First extends keyof T ? GetValue<T[First], Rest extends Array<string | number> ? Rest : []> : First extends `${number}` ? T extends any[] ? GetValue<T[number], Rest extends Array<string | number> ? Rest : []> : undefined : undefined : T;
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
816
|
+
/**
|
|
817
|
+
* Get a nested value from an object using dot notation path
|
|
818
|
+
* @template T - Object type
|
|
819
|
+
* @template P - Valid path string type constrained by object structure
|
|
820
|
+
* @template D - Default value type
|
|
821
|
+
* @param obj - Source object
|
|
822
|
+
* @param path - Dot-separated path string (constrained to valid paths)
|
|
823
|
+
* @param defaultValue - Fallback value if path not found
|
|
824
|
+
* @returns Value at path or default value
|
|
825
|
+
*
|
|
826
|
+
* @example
|
|
827
|
+
* // use as const for better type safety for arrays
|
|
828
|
+
* extract({a: [{b: 1}]} as const, 'a.0.b', 2) // 1
|
|
829
|
+
* extract({a: {b: 1}}, 'a.b', 2) // 1
|
|
830
|
+
*/
|
|
831
|
+
declare function extract<const T extends object, P$1 extends NestedKeyOf<T>, D>(obj: T, path: P$1, defaultValue: D): Exclude<GetValue<T, SplitPath<P$1>>, undefined> | D;
|
|
832
|
+
/**
|
|
833
|
+
* Get a nested value from an object using dot notation path
|
|
834
|
+
* @template T - Object type
|
|
835
|
+
* @template P - Valid path string type constrained by object structure
|
|
836
|
+
* @param obj - Source object
|
|
837
|
+
* @param path - Dot-separated path string (constrained to valid paths)
|
|
838
|
+
* @returns Value at path or undefined
|
|
839
|
+
*
|
|
840
|
+
* @example
|
|
841
|
+
* extract({a: [{b: 1}]}, 'a.0.b') // 1
|
|
842
|
+
*/
|
|
843
|
+
declare function extract<const T extends object, P$1 extends NestedKeyOf<T>>(obj: T, path: P$1): GetValue<T, SplitPath<P$1>> | undefined;
|
|
844
|
+
/**
|
|
845
|
+
* Get multiple nested values from an object using dot notation paths
|
|
846
|
+
* @template T - Object type
|
|
847
|
+
* @template P - Array of path strings
|
|
848
|
+
* @template D - Default value type
|
|
849
|
+
* @param obj - Source object
|
|
850
|
+
* @param paths - Array of dot-separated path strings
|
|
851
|
+
* @param defaultValue - Fallback value if any path not found
|
|
852
|
+
* @returns Array of values at paths or default values
|
|
853
|
+
*
|
|
854
|
+
* @example
|
|
855
|
+
* extract({a: [{b: 1}, {b: 2}]}, ['a.0.b', 'a.1.b'], 0) // [1, 2]
|
|
856
|
+
*/
|
|
857
|
+
declare function extract<const T extends object, const P$1 extends readonly string[], D>(obj: T, paths: P$1, defaultValue: D): { readonly [K in keyof P$1]: GetValue<T, SplitPath<P$1[K]>> | D };
|
|
858
|
+
/**
|
|
859
|
+
* Get multiple nested values from an object using dot notation paths
|
|
860
|
+
* @template T - Object type
|
|
861
|
+
* @template P - Array of path strings
|
|
862
|
+
* @param obj - Source object
|
|
863
|
+
* @param paths - Array of dot-separated path strings
|
|
864
|
+
* @returns Array of values at paths or undefined
|
|
865
|
+
*
|
|
866
|
+
* @example
|
|
867
|
+
* extract({a: [{b: 1}, {b: 2}]}, ['a.0.b', 'a.1.b']) // [1, 2]
|
|
868
|
+
*/
|
|
869
|
+
declare function extract<const T extends object, const P$1 extends readonly string[]>(obj: T, paths: P$1): { readonly [K in keyof P$1]: GetValue<T, SplitPath<P$1[K]>> | undefined };
|
|
870
|
+
/**
|
|
871
|
+
* Get multiple nested values from an object using dot notation paths mapped to keys
|
|
872
|
+
* @template T - Object type
|
|
873
|
+
* @template P - Record mapping keys to path strings
|
|
874
|
+
* @template D - Default value type
|
|
875
|
+
* @param obj - Source object
|
|
876
|
+
* @param paths - Record with keys as output keys and values as dot-separated path strings
|
|
877
|
+
* @param defaultValue - Fallback value if any path not found
|
|
878
|
+
* @returns Object with the same keys as paths, values at paths or default values
|
|
879
|
+
*
|
|
880
|
+
* @example
|
|
881
|
+
* extract({a: [{b: 1}, {b: 2}]}, {first: 'a.0.b', second: 'a.1.b'}, 0) // {first: 1, second: 2}
|
|
882
|
+
*/
|
|
883
|
+
declare function extract<const T extends object, const P$1 extends Record<string, string>, D>(obj: T, paths: P$1, defaultValue: D): { readonly [K in keyof P$1]: GetValue<T, SplitPath<P$1[K]>> | D };
|
|
884
|
+
/**
|
|
885
|
+
* Get multiple nested values from an object using dot notation paths mapped to keys
|
|
886
|
+
* @template T - Object type
|
|
887
|
+
* @template P - Record mapping keys to path strings
|
|
888
|
+
* @param obj - Source object
|
|
889
|
+
* @param paths - Record with keys as output keys and values as dot-separated path strings
|
|
890
|
+
* @returns Object with the same keys as paths, values at paths or undefined
|
|
891
|
+
*
|
|
892
|
+
* @example
|
|
893
|
+
* extract({a: [{b: 1}, {b: 2}]}, {first: 'a.0.b', second: 'a.1.b'}) // {first: 1, second: 2}
|
|
894
|
+
*/
|
|
895
|
+
declare function extract<const T extends object, const P$1 extends Record<string, string>>(obj: T, paths: P$1): { readonly [K in keyof P$1]: GetValue<T, SplitPath<P$1[K]>> | undefined };
|
|
792
896
|
//#endregion
|
|
793
897
|
//#region src/functions/hydrate.d.ts
|
|
794
898
|
type Hydrate<T> = T extends null ? undefined : T extends (infer U)[] ? Hydrate<U>[] : T extends object ? { [K in keyof T]: Hydrate<T[K]> } : T;
|
|
@@ -1331,5 +1435,34 @@ declare function normalizeText(str?: string | null, options?: {
|
|
|
1331
1435
|
removeAccents?: boolean;
|
|
1332
1436
|
removeNonAlphanumeric?: boolean;
|
|
1333
1437
|
}): string;
|
|
1438
|
+
/**
|
|
1439
|
+
* Unwraps a value that may be either a direct value or a function that returns that value.
|
|
1440
|
+
*
|
|
1441
|
+
* If the value is a function, it will be called with the provided arguments and its return
|
|
1442
|
+
* value will be returned. If the value is not a function, it will be returned as-is.
|
|
1443
|
+
*
|
|
1444
|
+
* This is useful for handling configuration options that can be either static values
|
|
1445
|
+
* or computed values based on context.
|
|
1446
|
+
*
|
|
1447
|
+
* @typeParam T - The type of the value
|
|
1448
|
+
* @typeParam A - The tuple type of arguments the function accepts (defaults to empty array)
|
|
1449
|
+
*
|
|
1450
|
+
* @param value - Either a direct value or a function that returns the value
|
|
1451
|
+
* @param args - Arguments to pass if the value is a function
|
|
1452
|
+
* @returns The unwrapped value
|
|
1453
|
+
*
|
|
1454
|
+
* @example
|
|
1455
|
+
* ```ts
|
|
1456
|
+
* // Direct value
|
|
1457
|
+
* const direct = unwrap('hello'); // 'hello'
|
|
1458
|
+
*
|
|
1459
|
+
* // Function value
|
|
1460
|
+
* const computed = unwrap((name: string) => `Hello, ${name}`, 'World'); // 'Hello, World'
|
|
1461
|
+
*
|
|
1462
|
+
* // No arguments needed
|
|
1463
|
+
* const lazy = unwrap(() => expensiveComputation()); // result of expensiveComputation()
|
|
1464
|
+
* ```
|
|
1465
|
+
*/
|
|
1466
|
+
declare function unwrap<T, A extends unknown[] = []>(value: MaybeFunction<T, A>, ...args: A): T;
|
|
1334
1467
|
//#endregion
|
|
1335
|
-
export { AND, AllOrNone, BUFFER, ConcurrenceOptions, ConcurrenceResult, DeepMergeOptions, DeepPartial, DeepReadonly, DeepRequired, Diff,
|
|
1468
|
+
export { AND, AllOrNone, BUFFER, ConcurrenceOptions, ConcurrenceResult, DeepMergeOptions, DeepPartial, DeepReadonly, DeepRequired, Diff, Falsy, IMPLIES, Intersection, Keys, KeysOfType, Maybe, MaybeFunction, Merge, Mutable, NAND, NOR, NOT, NestedKeyOf, Never, Nullable, Nullish, OR, OmitByType, OneOf, Optional, Prettify, Primitive, RequiredKeys, ScheduleOpts, SelectivePartial, SelectiveRequired, Substract, Task, TwoOf, Values, Without, XNOR, XNOR_Binary, XOR, XOR_Binary, convertToNormalCase, convertToSlug, debounce, deepmerge, escapeRegExp, extendProps, extract, hydrate, isArray, isBoolean, isFalsy, isFiniteNumber, isFunction, isNullish, isPlainObject, isPrimitive, isString, normalizeText, poll, printf, schedule, shield, sleep, throttle, unwrap, withConcurrency };
|
package/dist/index.d.ts
CHANGED
|
@@ -518,6 +518,33 @@ type NestedKeyOf<ObjectType extends object, IgnoreKeys extends string = never> =
|
|
|
518
518
|
* ```
|
|
519
519
|
*/
|
|
520
520
|
type Without<T, U$1> = { [P in Exclude<keyof T, keyof U$1>]?: never };
|
|
521
|
+
/**
|
|
522
|
+
* Represents a value that can be either a direct value or a function that returns that value.
|
|
523
|
+
*
|
|
524
|
+
* This is useful for allowing consumers to provide either a static value or a computed value
|
|
525
|
+
* via a function, commonly used for lazy evaluation or context-dependent values.
|
|
526
|
+
*
|
|
527
|
+
* @template T - The type of the value
|
|
528
|
+
* @template A - The tuple type of arguments the function accepts (defaults to empty array)
|
|
529
|
+
* @returns Either the value directly or a function that returns the value
|
|
530
|
+
*
|
|
531
|
+
* @example
|
|
532
|
+
* ```ts
|
|
533
|
+
* type ConfigValue = MaybeFunction<string, [string]>;
|
|
534
|
+
* const directValue: ConfigValue = 'hello';
|
|
535
|
+
* const computedValue: ConfigValue = (name) => `Hello, ${name}`;
|
|
536
|
+
*
|
|
537
|
+
* function getValue<T, A extends unknown[]>(
|
|
538
|
+
* maybeFn: MaybeFunction<T, A>,
|
|
539
|
+
* ...args: A
|
|
540
|
+
* ): T {
|
|
541
|
+
* return typeof maybeFn === 'function' ? maybeFn(...args) : maybeFn;
|
|
542
|
+
* }
|
|
543
|
+
*
|
|
544
|
+
* const result = getValue(computedValue, 'World'); // 'Hello, World'
|
|
545
|
+
* ```
|
|
546
|
+
*/
|
|
547
|
+
type MaybeFunction<T, A extends unknown[] = []> = T | ((...args: A) => T);
|
|
521
548
|
//#endregion
|
|
522
549
|
//#region src/types/gates.d.ts
|
|
523
550
|
type BUFFER<T> = T;
|
|
@@ -775,20 +802,97 @@ declare const isPrimitive: (val: unknown) => val is Primitive;
|
|
|
775
802
|
declare function isPlainObject(value: unknown): value is Record<string, any>;
|
|
776
803
|
//#endregion
|
|
777
804
|
//#region src/functions/extract.d.ts
|
|
805
|
+
/**
|
|
806
|
+
* Type representing a path split into segments
|
|
807
|
+
* @template P - The original path string type
|
|
808
|
+
*/
|
|
778
809
|
type SplitPath<P$1 extends string> = P$1 extends `${infer First}.${infer Rest}` ? [First, ...SplitPath<Rest>] : [P$1];
|
|
810
|
+
/**
|
|
811
|
+
* Recursive type to resolve nested object types based on path
|
|
812
|
+
* @template T - Current object type
|
|
813
|
+
* @template K - Array of path segments
|
|
814
|
+
*/
|
|
779
815
|
type GetValue<T, K$1 extends Array<string | number>> = K$1 extends [infer First, ...infer Rest] ? First extends keyof T ? GetValue<T[First], Rest extends Array<string | number> ? Rest : []> : First extends `${number}` ? T extends any[] ? GetValue<T[number], Rest extends Array<string | number> ? Rest : []> : undefined : undefined : T;
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
816
|
+
/**
|
|
817
|
+
* Get a nested value from an object using dot notation path
|
|
818
|
+
* @template T - Object type
|
|
819
|
+
* @template P - Valid path string type constrained by object structure
|
|
820
|
+
* @template D - Default value type
|
|
821
|
+
* @param obj - Source object
|
|
822
|
+
* @param path - Dot-separated path string (constrained to valid paths)
|
|
823
|
+
* @param defaultValue - Fallback value if path not found
|
|
824
|
+
* @returns Value at path or default value
|
|
825
|
+
*
|
|
826
|
+
* @example
|
|
827
|
+
* // use as const for better type safety for arrays
|
|
828
|
+
* extract({a: [{b: 1}]} as const, 'a.0.b', 2) // 1
|
|
829
|
+
* extract({a: {b: 1}}, 'a.b', 2) // 1
|
|
830
|
+
*/
|
|
831
|
+
declare function extract<const T extends object, P$1 extends NestedKeyOf<T>, D>(obj: T, path: P$1, defaultValue: D): Exclude<GetValue<T, SplitPath<P$1>>, undefined> | D;
|
|
832
|
+
/**
|
|
833
|
+
* Get a nested value from an object using dot notation path
|
|
834
|
+
* @template T - Object type
|
|
835
|
+
* @template P - Valid path string type constrained by object structure
|
|
836
|
+
* @param obj - Source object
|
|
837
|
+
* @param path - Dot-separated path string (constrained to valid paths)
|
|
838
|
+
* @returns Value at path or undefined
|
|
839
|
+
*
|
|
840
|
+
* @example
|
|
841
|
+
* extract({a: [{b: 1}]}, 'a.0.b') // 1
|
|
842
|
+
*/
|
|
843
|
+
declare function extract<const T extends object, P$1 extends NestedKeyOf<T>>(obj: T, path: P$1): GetValue<T, SplitPath<P$1>> | undefined;
|
|
844
|
+
/**
|
|
845
|
+
* Get multiple nested values from an object using dot notation paths
|
|
846
|
+
* @template T - Object type
|
|
847
|
+
* @template P - Array of path strings
|
|
848
|
+
* @template D - Default value type
|
|
849
|
+
* @param obj - Source object
|
|
850
|
+
* @param paths - Array of dot-separated path strings
|
|
851
|
+
* @param defaultValue - Fallback value if any path not found
|
|
852
|
+
* @returns Array of values at paths or default values
|
|
853
|
+
*
|
|
854
|
+
* @example
|
|
855
|
+
* extract({a: [{b: 1}, {b: 2}]}, ['a.0.b', 'a.1.b'], 0) // [1, 2]
|
|
856
|
+
*/
|
|
857
|
+
declare function extract<const T extends object, const P$1 extends readonly string[], D>(obj: T, paths: P$1, defaultValue: D): { readonly [K in keyof P$1]: GetValue<T, SplitPath<P$1[K]>> | D };
|
|
858
|
+
/**
|
|
859
|
+
* Get multiple nested values from an object using dot notation paths
|
|
860
|
+
* @template T - Object type
|
|
861
|
+
* @template P - Array of path strings
|
|
862
|
+
* @param obj - Source object
|
|
863
|
+
* @param paths - Array of dot-separated path strings
|
|
864
|
+
* @returns Array of values at paths or undefined
|
|
865
|
+
*
|
|
866
|
+
* @example
|
|
867
|
+
* extract({a: [{b: 1}, {b: 2}]}, ['a.0.b', 'a.1.b']) // [1, 2]
|
|
868
|
+
*/
|
|
869
|
+
declare function extract<const T extends object, const P$1 extends readonly string[]>(obj: T, paths: P$1): { readonly [K in keyof P$1]: GetValue<T, SplitPath<P$1[K]>> | undefined };
|
|
870
|
+
/**
|
|
871
|
+
* Get multiple nested values from an object using dot notation paths mapped to keys
|
|
872
|
+
* @template T - Object type
|
|
873
|
+
* @template P - Record mapping keys to path strings
|
|
874
|
+
* @template D - Default value type
|
|
875
|
+
* @param obj - Source object
|
|
876
|
+
* @param paths - Record with keys as output keys and values as dot-separated path strings
|
|
877
|
+
* @param defaultValue - Fallback value if any path not found
|
|
878
|
+
* @returns Object with the same keys as paths, values at paths or default values
|
|
879
|
+
*
|
|
880
|
+
* @example
|
|
881
|
+
* extract({a: [{b: 1}, {b: 2}]}, {first: 'a.0.b', second: 'a.1.b'}, 0) // {first: 1, second: 2}
|
|
882
|
+
*/
|
|
883
|
+
declare function extract<const T extends object, const P$1 extends Record<string, string>, D>(obj: T, paths: P$1, defaultValue: D): { readonly [K in keyof P$1]: GetValue<T, SplitPath<P$1[K]>> | D };
|
|
884
|
+
/**
|
|
885
|
+
* Get multiple nested values from an object using dot notation paths mapped to keys
|
|
886
|
+
* @template T - Object type
|
|
887
|
+
* @template P - Record mapping keys to path strings
|
|
888
|
+
* @param obj - Source object
|
|
889
|
+
* @param paths - Record with keys as output keys and values as dot-separated path strings
|
|
890
|
+
* @returns Object with the same keys as paths, values at paths or undefined
|
|
891
|
+
*
|
|
892
|
+
* @example
|
|
893
|
+
* extract({a: [{b: 1}, {b: 2}]}, {first: 'a.0.b', second: 'a.1.b'}) // {first: 1, second: 2}
|
|
894
|
+
*/
|
|
895
|
+
declare function extract<const T extends object, const P$1 extends Record<string, string>>(obj: T, paths: P$1): { readonly [K in keyof P$1]: GetValue<T, SplitPath<P$1[K]>> | undefined };
|
|
792
896
|
//#endregion
|
|
793
897
|
//#region src/functions/hydrate.d.ts
|
|
794
898
|
type Hydrate<T> = T extends null ? undefined : T extends (infer U)[] ? Hydrate<U>[] : T extends object ? { [K in keyof T]: Hydrate<T[K]> } : T;
|
|
@@ -1331,5 +1435,34 @@ declare function normalizeText(str?: string | null, options?: {
|
|
|
1331
1435
|
removeAccents?: boolean;
|
|
1332
1436
|
removeNonAlphanumeric?: boolean;
|
|
1333
1437
|
}): string;
|
|
1438
|
+
/**
|
|
1439
|
+
* Unwraps a value that may be either a direct value or a function that returns that value.
|
|
1440
|
+
*
|
|
1441
|
+
* If the value is a function, it will be called with the provided arguments and its return
|
|
1442
|
+
* value will be returned. If the value is not a function, it will be returned as-is.
|
|
1443
|
+
*
|
|
1444
|
+
* This is useful for handling configuration options that can be either static values
|
|
1445
|
+
* or computed values based on context.
|
|
1446
|
+
*
|
|
1447
|
+
* @typeParam T - The type of the value
|
|
1448
|
+
* @typeParam A - The tuple type of arguments the function accepts (defaults to empty array)
|
|
1449
|
+
*
|
|
1450
|
+
* @param value - Either a direct value or a function that returns the value
|
|
1451
|
+
* @param args - Arguments to pass if the value is a function
|
|
1452
|
+
* @returns The unwrapped value
|
|
1453
|
+
*
|
|
1454
|
+
* @example
|
|
1455
|
+
* ```ts
|
|
1456
|
+
* // Direct value
|
|
1457
|
+
* const direct = unwrap('hello'); // 'hello'
|
|
1458
|
+
*
|
|
1459
|
+
* // Function value
|
|
1460
|
+
* const computed = unwrap((name: string) => `Hello, ${name}`, 'World'); // 'Hello, World'
|
|
1461
|
+
*
|
|
1462
|
+
* // No arguments needed
|
|
1463
|
+
* const lazy = unwrap(() => expensiveComputation()); // result of expensiveComputation()
|
|
1464
|
+
* ```
|
|
1465
|
+
*/
|
|
1466
|
+
declare function unwrap<T, A extends unknown[] = []>(value: MaybeFunction<T, A>, ...args: A): T;
|
|
1334
1467
|
//#endregion
|
|
1335
|
-
export { AND, AllOrNone, BUFFER, ConcurrenceOptions, ConcurrenceResult, DeepMergeOptions, DeepPartial, DeepReadonly, DeepRequired, Diff,
|
|
1468
|
+
export { AND, AllOrNone, BUFFER, ConcurrenceOptions, ConcurrenceResult, DeepMergeOptions, DeepPartial, DeepReadonly, DeepRequired, Diff, Falsy, IMPLIES, Intersection, Keys, KeysOfType, Maybe, MaybeFunction, Merge, Mutable, NAND, NOR, NOT, NestedKeyOf, Never, Nullable, Nullish, OR, OmitByType, OneOf, Optional, Prettify, Primitive, RequiredKeys, ScheduleOpts, SelectivePartial, SelectiveRequired, Substract, Task, TwoOf, Values, Without, XNOR, XNOR_Binary, XOR, XOR_Binary, convertToNormalCase, convertToSlug, debounce, deepmerge, escapeRegExp, extendProps, extract, hydrate, isArray, isBoolean, isFalsy, isFiniteNumber, isFunction, isNullish, isPlainObject, isPrimitive, isString, normalizeText, poll, printf, schedule, shield, sleep, throttle, unwrap, withConcurrency };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=e=>!e,t=e=>e==null,n=e=>typeof e==`boolean`,r=e=>typeof e==`string`,i=e=>{if(typeof e==`number`)return Number.isFinite(e);if(typeof e==`string`){let t=Number(e);return Number.isFinite(t)}return!1},a=e=>Array.isArray(e),o=e=>typeof e==`function`,s=e=>{if(e==null)return!0;switch(typeof e){case`string`:case`number`:case`bigint`:case`boolean`:case`symbol`:return!0;default:return!1}};function c(e){if(typeof e!=`object`||!e||Object.prototype.toString.call(e)!==`[object Object]`)return!1;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype}function l(e,...t){let n,r={},i=t[t.length-1];i&&typeof i==`object`&&!Array.isArray(i)&&(i.arrayMerge!==void 0||i.clone!==void 0||i.customMerge!==void 0||i.functionMerge!==void 0||i.maxDepth!==void 0)?(r={...r,...i},n=t.slice(0,-1)):n=t;let{arrayMerge:a=`replace`,clone:o=!0,functionMerge:s=`replace`,maxDepth:l=100,customMerge:u}=r,d=new WeakMap;return f(e,n,0);function f(e,t,n){if(n>=l)return console.warn(`[deepmerge] Maximum depth ${l} exceeded. Returning target as-is.`),e;if(!c(e)&&!Array.isArray(e)){for(let n of t)if(n!==void 0){if(u){let t=u(``,e,n);if(t!==void 0)return t}return typeof e==`function`&&typeof n==`function`&&s===`compose`?(...t)=>{e(...t),n(...t)}:n}return e}let r=o?Array.isArray(e)?[...e]:{...e}:e;for(let e of t)if(e!=null&&!d.has(e))if(d.set(e,r),Array.isArray(r)&&Array.isArray(e))r=p(r,e,a);else if(c(r)&&c(e)){let t=new Set([...Object.keys(r),...Object.keys(e),...Object.getOwnPropertySymbols(r),...Object.getOwnPropertySymbols(e)]);for(let i of t){let t=r[i],o=e[i];u&&u(i,t,o)!==void 0?r[i]=u(i,t,o):typeof t==`function`&&typeof o==`function`?s===`compose`?r[i]=(...e)=>{t(...e),o(...e)}:r[i]=o:c(t)&&c(o)?r[i]=f(t,[o],n+1):Array.isArray(t)&&Array.isArray(o)?r[i]=p(t,o,a):o!==void 0&&(r[i]=o)}}else r=e;return r}function p(e,t,n){if(typeof n==`function`)return n(e,t);switch(n){case`concat`:return[...e,...t];case`merge`:let n=Math.max(e.length,t.length),r=[];for(let i=0;i<n;i++)i<e.length&&i<t.length?c(e[i])&&c(t[i])?r[i]=f(e[i],[t[i]],0):r[i]=t[i]:i<e.length?r[i]=e[i]:r[i]=t[i];return r;case`replace`:default:return[...t]}}}function u(e,t,n){
|
|
1
|
+
const e=e=>!e,t=e=>e==null,n=e=>typeof e==`boolean`,r=e=>typeof e==`string`,i=e=>{if(typeof e==`number`)return Number.isFinite(e);if(typeof e==`string`){let t=Number(e);return Number.isFinite(t)}return!1},a=e=>Array.isArray(e),o=e=>typeof e==`function`,s=e=>{if(e==null)return!0;switch(typeof e){case`string`:case`number`:case`bigint`:case`boolean`:case`symbol`:return!0;default:return!1}};function c(e){if(typeof e!=`object`||!e||Object.prototype.toString.call(e)!==`[object Object]`)return!1;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype}function l(e,...t){let n,r={},i=t[t.length-1];i&&typeof i==`object`&&!Array.isArray(i)&&(i.arrayMerge!==void 0||i.clone!==void 0||i.customMerge!==void 0||i.functionMerge!==void 0||i.maxDepth!==void 0)?(r={...r,...i},n=t.slice(0,-1)):n=t;let{arrayMerge:a=`replace`,clone:o=!0,functionMerge:s=`replace`,maxDepth:l=100,customMerge:u}=r,d=new WeakMap;return f(e,n,0);function f(e,t,n){if(n>=l)return console.warn(`[deepmerge] Maximum depth ${l} exceeded. Returning target as-is.`),e;if(!c(e)&&!Array.isArray(e)){for(let n of t)if(n!==void 0){if(u){let t=u(``,e,n);if(t!==void 0)return t}return typeof e==`function`&&typeof n==`function`&&s===`compose`?(...t)=>{e(...t),n(...t)}:n}return e}let r=o?Array.isArray(e)?[...e]:{...e}:e;for(let e of t)if(e!=null&&!d.has(e))if(d.set(e,r),Array.isArray(r)&&Array.isArray(e))r=p(r,e,a);else if(c(r)&&c(e)){let t=new Set([...Object.keys(r),...Object.keys(e),...Object.getOwnPropertySymbols(r),...Object.getOwnPropertySymbols(e)]);for(let i of t){let t=r[i],o=e[i];u&&u(i,t,o)!==void 0?r[i]=u(i,t,o):typeof t==`function`&&typeof o==`function`?s===`compose`?r[i]=(...e)=>{t(...e),o(...e)}:r[i]=o:c(t)&&c(o)?r[i]=f(t,[o],n+1):Array.isArray(t)&&Array.isArray(o)?r[i]=p(t,o,a):o!==void 0&&(r[i]=o)}}else r=e;return r}function p(e,t,n){if(typeof n==`function`)return n(e,t);switch(n){case`concat`:return[...e,...t];case`merge`:let n=Math.max(e.length,t.length),r=[];for(let i=0;i<n;i++)i<e.length&&i<t.length?c(e[i])&&c(t[i])?r[i]=f(e[i],[t[i]],0):r[i]=t[i]:i<e.length?r[i]=e[i]:r[i]=t[i];return r;case`replace`:default:return[...t]}}}function u(e,t,n){if(Array.isArray(t))return t.map(t=>u(e,t,n));if(typeof t==`object`&&t&&!Array.isArray(t)){let r={};for(let i in t)t.hasOwnProperty(i)&&(r[i]=u(e,t[i],n));return r}if(typeof t!=`string`)return n;let r=(()=>t===``?[]:t.split(`.`).filter(e=>e!==``))(),i=e;for(let e of r){if(i==null)return n;let t=typeof e==`string`&&Array.isArray(i)&&/^\d+$/.test(e)?Number.parseInt(e,10):e;i=i[t]}return i===void 0?n:i}function d(e){return f(e)}function f(e){if(e!==null){if(typeof e!=`object`||!e)return e;if(Array.isArray(e))return e.map(f);if(c(e)){let t={};for(let n in e)t[n]=f(e[n]);return t}return e}}function p(e,t){return e==null?e:Object.assign(e,t)}function m(e){return(e.split(`.`).pop()||e).replace(/([a-z])([A-Z])/g,`$1 $2`).split(/[-_|�\s]+/).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `)}const h=`àáãäâèéëêìíïîòóöôùúüûñç·/_,:;`,g=e=>{if(typeof e!=`string`)throw TypeError(`Input must be a string`);let t=e.trim().toLowerCase(),n={};for(let e=0;e<29;e++)n[h.charAt(e)]=`aaaaaeeeeiiiioooouuuunc------`.charAt(e);return t=t.replace(RegExp(`[${h}]`,`g`),e=>n[e]||e),t.replace(/[^a-z0-9 -]/g,``).replace(/\s+/g,`-`).replace(/-+/g,`-`).replace(/^-+/,``).replace(/-+$/,``)||``},_=(e=1e3,t)=>new Promise(n=>{if(t?.aborted)return n();let r=setTimeout(()=>{a(),n()},e);function i(){clearTimeout(r),a(),n()}function a(){t?.removeEventListener(`abort`,i)}t&&t.addEventListener(`abort`,i,{once:!0})});function v(e,t=100,n){if(typeof e!=`function`)throw TypeError(`Expected the first parameter to be a function, got \`${typeof e}\`.`);if(t<0)throw RangeError("`wait` must not be negative.");let r=n?.immediate??!1,i,a,o,s;function c(){return s=e.apply(o,a),a=void 0,o=void 0,s}let l=function(...e){return a=e,o=this,i===void 0&&r&&(s=c.call(this)),i!==void 0&&clearTimeout(i),i=setTimeout(c.bind(this),t),s};return Object.defineProperty(l,`isPending`,{get(){return i!==void 0}}),l}function y(e,t=100,n){if(typeof e!=`function`)throw TypeError(`Expected the first parameter to be a function, got \`${typeof e}\`.`);if(t<0)throw RangeError("`wait` must not be negative.");let r=n?.leading??!0,i=n?.trailing??!0,a,o,s,c,l;function u(){c=Date.now(),l=e.apply(s,o),o=void 0,s=void 0}function d(){a=void 0,i&&o&&u()}let f=function(...e){let n=c?Date.now()-c:1/0;return o=e,s=this,n>=t?r?u():a=setTimeout(d,t):!a&&i&&(a=setTimeout(d,t-n)),l};return Object.defineProperty(f,`isPending`,{get(){return a!==void 0}}),f}function b(e,...t){let n=t.length===1&&Array.isArray(t[0])?t[0]:t,r=0;return e.replace(/%s/g,()=>{let e=n[r++];return e===void 0?``:String(e)})}function x(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function S(e,t={}){if(!e)return``;let{lowercase:n=!0,removeAccents:r=!0,removeNonAlphanumeric:i=!0}=t,a=e.normalize(`NFC`);return r&&(a=a.normalize(`NFD`).replace(/\p{M}/gu,``)),i&&(a=a.replace(/^[^\p{L}\p{N}]*|[^\p{L}\p{N}]*$/gu,``)),n&&(a=a.toLocaleLowerCase()),a}function C(e,...t){return typeof e==`function`?e(...t):e}async function w(e,{interval:t=5e3,timeout:n=300*1e3,jitter:r=!0,signal:i}={}){let a=Date.now(),o=i?.aborted??!1,s=()=>{o=!0};i?.addEventListener(`abort`,s,{once:!0});try{for(let s=0;;s++){if(o)throw Error(`Polling aborted`);let s=await e();if(s)return s;if(Date.now()-a>=n)throw Error(`Polling timed out`,{cause:`Polling timed out after ${n}ms`});await _(r?t+(Math.random()-.5)*t*.2:t,i)}}catch(e){throw e}finally{i?.removeEventListener(`abort`,s)}}async function T(e,t={}){let{concurrency:n=1/0,timeout:r=1/0,signal:i,retry:a=0,retryDelay:o=0,throwOnFirstError:s=!1,ignoreErrors:c=!1}=t,l=Array.isArray(e),u={};l?e.forEach((e,t)=>{u[t.toString()]=e}):Object.entries(e).forEach(([e,t])=>{u[e]=t});let d=Object.keys(u);if(d.length===0)return{results:l?[]:{},errors:[],succeeded:0,failed:0,duration:0};let f=Date.now(),p=[],m=[],h=0,g=0,v=0,y=!1,b=s?null:void 0,x=async e=>{let t=0;for(;t<=a&&!y;)try{let t=u[e],n=await(typeof t==`function`?t():t);p.push([e,n]),g++;return}catch(e){if(t===a){let t=e instanceof Error?e:Error(String(e));m.push(t),v++,!c&&s&&!b&&(b=t,y=!0);return}t++,o>0&&await _(o,i)}},S=Array.from({length:Math.min(n,d.length)},async()=>{for(;!y;){let e=h++;if(e>=d.length)return;if(i?.aborted){y=!0;return}await x(d[e])}}),C=Promise.all(S);if(r===1/0?await C:await Promise.race([C,_(r,i).then(()=>{throw y=!0,Error(`Concurrence timed out after ${r}ms`)})]),b&&s)throw b;return l?{results:p.sort((e,t)=>Number(e[0])-Number(t[0])).map(([,e])=>e),errors:m,succeeded:g,failed:v,duration:Date.now()-f}:{results:Object.fromEntries(p),errors:m,succeeded:g,failed:v,duration:Date.now()-f}}function E(e,t={}){let{retry:n=0,delay:r=0}=t,i=Date.now(),a=async t=>{try{await e();let t=Date.now()-i;console.log(`⚡[schedule.ts] Completed in ${t}ms`)}catch(e){if(console.log(`⚡[schedule.ts] err:`,e),t>0)console.log(`⚡[schedule.ts] Retrying in ${r}ms...`),setTimeout(()=>a(t-1),r);else{let e=Date.now()-i;console.log(`⚡[schedule.ts] Failed after ${e}ms`)}}};setTimeout(()=>a(n),0)}function D(e){if(e instanceof Promise)return e.then(e=>[null,e]).catch(e=>[e,null]);try{return[null,e()]}catch(t){return console.log(`\x1b[31m🛡 [shield]\x1b[0m ${e.name} failed →`,t),[t,null]}}export{m as convertToNormalCase,g as convertToSlug,v as debounce,l as deepmerge,x as escapeRegExp,p as extendProps,u as extract,d as hydrate,a as isArray,n as isBoolean,e as isFalsy,i as isFiniteNumber,o as isFunction,t as isNullish,c as isPlainObject,s as isPrimitive,r as isString,S as normalizeText,w as poll,b as printf,E as schedule,D as shield,_ as sleep,y as throttle,C as unwrap,T as withConcurrency};
|