@andrewcaires/utils.js 0.4.13 → 0.4.15

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.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @andrewcaires/utils.js v0.4.13
2
+ * @andrewcaires/utils.js v0.4.15
3
3
  * JavaScript utility library for web and nodejs development
4
4
  * (c) 2025 Andrew Caires
5
5
  * @license: MIT
6
6
  */
7
- "use strict";const t=(t,e,s)=>Math.max(e,Math.min(s,t)),e=(t,e)=>Math.floor(Math.random()*(e-t+1)+t),s=t=>{for(let s=t.length-1;s>0;s--){const r=e(0,s);[t[s],t[r]]=[t[r],t[s]]}return t},r={},n=t=>null==t?"null":r[r.toString.call(t)]||"object";["Array","AsyncFunction","Boolean","Date","Function","Map","Number","Object","RegExp","Set","String"].forEach(t=>r["[object "+t+"]"]=t.toLowerCase());const a=t=>"array"==n(t),i=t=>"boolean"==n(t),o=t=>"null"!=n(t),u=t=>"number"==n(t),l=t=>u(t)&&!!(t%1),h=t=>"function"==typeof t,c=t=>u(t)&&!(t%1),p=t=>"object"==n(t),v=t=>p(t)&&t.constructor===Object,x=["boolean","number","string"],m=t=>"string"==typeof t,d=t=>void 0===t,g=[1,"1",!0,"true"],f=t=>-1!=g.indexOf(t),y=(t,e,s)=>{for(let r=0;r<t.length&&!1!==e.call(s,t[r],r,t);r++);return t},S=(t,e,s)=>{let r="";const n=Object.keys(t);for(let a=0;a<n.length&&(r=n[a],!1!==e.call(s,t[r],r,t));a++);return t},E=(t,e,s)=>Object.fromEntries(Object.entries(t).map(([r,n])=>[r,e.call(s,n,r,t)])),b=t=>parseInt(t??"0",16)||0,w=t=>t.replace(/^#/,"").match(/.{1,2}/g)?.map(b)||[],T=t=>("0"+t.toString(16)).slice(-2),C=(t,e,s)=>"#"+T(t)+T(e)+T(s),I=(e,s)=>{const r=w(e);s=t(s,0,1);const[n,a,i]=r.map(t=>Math.round(t*s));return C(n,a,i)},M=(e,s)=>{const r=w(e);s=t(s,0,1);const[n,a,i]=r.map(t=>Math.round(t+(255-t)*s));return C(n,a,i)},D={50:.95,100:.9,200:.75,300:.6,400:.3,500:0,600:-.1,700:-.25,800:-.4,900:-.55,950:-.71},R=(t,e,s,r,n)=>0===t?0:e===s?(r-n)/t%6:e===r?(n-s)/t+2:e===n?(s-r)/t+4:0,A=(t,e)=>0===t?0:t/(1-Math.abs(2*e-1));class O{constructor(t){this.key=this.shuffle(O.dictionary,t,!1)}encrypt(t){return this.shuffle(t,this.key,!1)}decrypt(t){return this.shuffle(t,this.key,!0)}index(t,e,s){return[O.dictionary.indexOf(t[s]),O.dictionary.indexOf(e[s%e.length])]}result(t,e,s){return O.dictionary[(s?t-e+O.dictionary.length:t+e)%O.dictionary.length]}shuffle(t,e,s){let r="";for(let n=0;n<t.length;n++){const[a,i]=this.index(t,e,n);r+=-1===a||-1===i?t[n]:this.result(a,i,s)}return r}static hex(t){let e=0;for(let s=0;s<t.length;s++)e=16777619*(e^t.charCodeAt(s));return(e>>>0).toString(16).padStart(8,"0")}}O.dictionary="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";const k=(t=64)=>Array(Math.ceil(t/2)).fill(0).map(()=>e(0,255).toString(16).padStart(2,"0")).join("").slice(0,t),j=t=>("0"+t.toString()).slice(-2),N={"%y":(t,e)=>j(e?t.getUTCFullYear():t.getFullYear()),"%Y":(t,e)=>(e?t.getUTCFullYear():t.getFullYear()).toString(),"%m":(t,e)=>j((e?t.getUTCMonth():t.getMonth())+1),"%d":(t,e)=>j(e?t.getUTCDate():t.getDate()),"%H":(t,e)=>j(e?t.getUTCHours():t.getHours()),"%M":(t,e)=>j(e?t.getUTCMinutes():t.getMinutes()),"%S":(t,e)=>j(e?t.getUTCSeconds():t.getSeconds())},U=(t,e,s)=>(e=e??new Date,t.replace(/%[yYmdHMS]/g,t=>N[t]?N[t](e,s):t.slice(1))),Y=t=>{const e=new Date(t);return e.getTime()==e.getTime()&&t==e.toISOString().slice(0,10)},L=36e5,P=24*L,F={ms:1,s:1e3,m:6e4,h:L,d:P,w:7*P,y:315576e5},$=["y","d","h","m","s","ms"];const q=t=>0==(t?.length??0),H=["",0,"0",null,!1,void 0],X=t=>-1==H.indexOf(t),K=()=>{},_=(t,e,s)=>e(t.toLowerCase().replace(/\W+/g," ")).replace(/\s/g,s??""),Q=(t,e)=>_(t,t=>t.replace(/\s(\w)/g,t=>t.toUpperCase()),e),B=Q,J=/&(amp|apos|lt|gt|nbsp|quot);/g,V={amp:"&",apos:"'",lt:"<",gt:">",nbsp:" ",quot:'"'},z=t=>/^[\d]$/.test(t),Z=t=>/^[A-Za-z]$/.test(t),W=t=>/^[^\w]$/.test(t),G=t=>s(t.split("")).join("");class tt{constructor(){this.hasSpace=!1,this._space=" ",this.hasNumbers=!1,this._numbers="0123456789",this.hasSymbols=!1,this._symbols="!@#$%^&*()<>.<~:;?+=-_",this.hasUpper=!1,this._upper="ABCDEFGHIJKLMNOPQRSTUVWXYZ",this.hasLower=!1,this._lower="abcdefghijklmnopqrstuvwxyz",this.hasChars=!1,this._chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"}chars(){return this.hasChars=!0,this}static chars(){return(new tt).chars()}lower(){return this.hasLower=!0,this}static lower(){return(new tt).lower()}make(t){let s="";this.hasSpace&&(s+=this._space),this.hasNumbers&&(s+=this._numbers),this.hasSymbols&&(s+=this._symbols),this.hasUpper&&!this.hasChars&&(s+=this._upper),this.hasLower&&!this.hasChars&&(s+=this._lower),this.hasChars&&(s+=this._chars);let r="";if(t&&s.length){s=G(s);for(let n=0;n<t;n++)r+=s.charAt(e(0,s.length-1))}return r}numbers(){return this.hasNumbers=!0,this}static numbers(){return(new tt).numbers()}space(){return this.hasSpace=!0,this}static space(){return(new tt).space()}symbols(){return this.hasSymbols=!0,this}static symbols(){return(new tt).symbols()}upper(){return this.hasUpper=!0,this}static upper(){return(new tt).upper()}}const et=t=>t.split("").reverse().join(""),st=(t,e)=>_(t,t=>t.replace(/(\w)(\w*)/g,(t,e,s)=>e.toUpperCase()+s),e),rt=(t,e)=>e(t.value)?t.value:(t=>(t.maskIndex--,""))(t),nt={"#":t=>t.value,0:t=>rt(t,z),9:t=>rt(t,z),A:t=>rt(t,Z),Z:t=>rt(t,Z),L:t=>rt(t,Z).toLowerCase(),U:t=>rt(t,Z).toUpperCase(),S:t=>rt(t,W)},at=t=>{t.maskIndex++,t.textIndex++;const{mask:e,maskIndex:s,text:r,textIndex:n}=t;t.key=e[s],t.value=r[n];const{key:a,value:i}=t;return d(a)||d(i)?"":(t=>nt[t.key]?nt[t.key](t):(t.key!=t.value&&t.textIndex--,t.key))(t)+at(t)},it=(t,e)=>at({mask:t,maskIndex:-1,text:e,textIndex:-1,key:"",value:""}),ot=(t,e)=>et(it(et(t),et(e))),ut=(t,e)=>t.reduce((t,s)=>({...t,[s]:e[s]}),{}),lt=t=>t instanceof Date?new Date(t.getTime()):a(t)?t.map(t=>lt(t)):p(t)?E(t,t=>lt(t)):t,ht=(t,...e)=>{if(!e.length)return t;const s=e.shift();if(v(t)&&v(s))for(const e in s)v(s[e])?(t[e]||(t={...t,[e]:{}}),t[e]=ht(t[e],s[e])):t={...t,[e]:s[e]};return ht(t,...e)};class ct{}var pt,vt,xt,mt,dt,gt,ft,yt,St;ct.DESCRIPTION=Symbol("DESCRIPTION"),ct.ERROR=Symbol("ERROR"),ct.EXAMPLE=Symbol("EXAMPLE"),ct.INDEXES=Symbol("INDEXES"),ct.KEYS=Symbol("KEYS"),ct.LIST=Symbol("LIST"),ct.NAME=Symbol("NAME"),ct.REQUIRED=Symbol("REQUIRED"),ct.SOURCE=Symbol("SOURCE"),ct.TYPE=Symbol("TYPE");class Et{constructor(t){this[pt]="",this[vt]="",this[xt]=null,this[mt]="",this[dt]="any",this[gt]=!1,this.rules=[],this.custom=[],this[ct.TYPE]=t}description(t){return this[ct.DESCRIPTION]=t,this}example(t){return this[ct.EXAMPLE]=t,this}empty(t){const e=t;return this.unshift(({value:t})=>{const s=o(t);return{break:!o(e)&&!s,value:s?t:h(e)?e():e}})}equal(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t==n?{value:t}:this.invalid(`.equal(${n})`,e)})}error(t){return m(t)&&(this[ct.ERROR]=t),this}filter(...t){const e=t;return this.unshift(({value:t})=>{const s=-1==e.indexOf(t);return{break:!s,value:s?t:void 0}})}fn(t){return h(t)?t:()=>t}from(t){return this[ct.SOURCE]=t,this}invalid(t,e){return t=`[${this[ct.TYPE]}]${t}`,{error:this[ct.ERROR]?this[ct.ERROR]:this[ct.NAME]?this[ct.NAME]+":"+t:t,message:e}}model(){return this.toString()}parse(){return this.unshift(({value:t})=>({value:t}))}push(t){return this.rules.push(t),this}required(t){return this[ct.REQUIRED]=!0,this.unshift(({value:e})=>o(e)?{value:e}:this.invalid(".required",t))}test(t){return!m(this.validate(t).error)}async testAsync(t){return!m((await this.validateAsync(t)).error)}toString(){return this[ct.TYPE]}unshift(t){return this.rules.unshift(t),this}validate(t,e){if(this.custom.length)return this.invalid("[async]");let s={value:t};for(let t=0;t<this.rules.length;t++){if(s=this.rules[t]({value:s.value,context:e}),s.error?.length)return{error:s.error,...s.message?{message:s.message}:{}};if(s.break)return{value:s.value}}return{value:s.value}}async validateAsync(t,e){let s=this.validate(t,e);if(s.error)return{error:s.error};for(let t=0;t<this.custom.length;t++){if(s=await this.custom[t]({value:s.value}),s.error)return{error:s.error};if(s.break)return{value:s.value}}return{value:s.value}}}pt=ct.NAME,vt=ct.DESCRIPTION,xt=ct.EXAMPLE,ct.SOURCE,mt=ct.ERROR,dt=ct.TYPE,gt=ct.REQUIRED;class bt extends Et{constructor(t){super("array"),this[ft]=[],this.push(({value:e})=>a(e)?{value:e}:this.invalid("",t))}between(t,e,s){return this.min(t,s),this.max(e,s)}items(t,e){const s=t;return s&&this[ct.INDEXES].push(s),s?this.push(({value:t})=>{const r=[];s[ct.NAME]="";for(let n=0;n<t.length;n++){const{error:a,value:i}=s.validate(t[n],t);if(a)return this.invalid("< "+a+"["+n+"] >",e);r[n]=i}return{value:r}}):this}length(t,e){const s=t;return this.push(({value:t})=>t.length==s?{value:t}:this.invalid(".length("+s+")",e))}max(t,e){const s=t;return this.push(({value:t})=>t.length<=s?{value:t}:this.invalid(".max("+s+")",e))}min(t,e){const s=t;return this.push(({value:t})=>t.length>=s?{value:t}:this.invalid(".min("+s+")",e))}model(){return this[ct.INDEXES].length?this[ct.INDEXES].map(t=>t.model()):this[ct.TYPE]}toString(){return this[ct.INDEXES].length?JSON.stringify(this.model(),null,4):this[ct.TYPE]}}ft=ct.INDEXES;class wt extends Et{constructor(t){super("boolean"),this.push(({value:e})=>i(e)?{value:e}:this.invalid("",t))}parse(){return this.unshift(({value:t})=>({value:o(t)?f(t):t}))}}class Tt extends Et{constructor(t){super("date"),this.push(({value:e})=>m(e)&&Y(e)||!isNaN(new Date(e).getTime())?{value:e}:this.invalid("",t))}format(t){const e=t;return this.push(({value:t})=>({value:U(e,new Date(t))}))}parse(){return this.unshift(({value:t})=>({value:new Date(t)}))}}class Ct extends Et{constructor(t){super("enum"),this[yt]=[],this.push(({value:e})=>o(e)?{value:e}:this.invalid(`('${this[ct.LIST].join("', '")}')`,t))}list(t,e){const s=t;return s&&this[ct.LIST].push(...s),s?this.push(({value:t})=>-1!=this[ct.LIST].indexOf(t)?{value:t}:this.invalid(`('${this[ct.LIST].join("', '")}')`,e)):this}toString(){return`${this[ct.TYPE]}('${this[ct.LIST].join("', '")}')`}}yt=ct.LIST;class It extends Et{constructor(t){super("number"),this.push(({value:e})=>u(e)?{value:e}:this.invalid("",t))}between(t,e,s){return this.min(t,s),this.max(e,s)}float(t){return this.push(({value:e})=>l(e)?{value:e}:this.invalid(".float",t))}integer(t){return this.push(({value:e})=>c(e)?{value:e}:this.invalid(".integer",t))}max(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t<=n?{value:t}:this.invalid(`.max(${n})`,e)})}min(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t>=n?{value:t}:this.invalid(`.min(${n})`,e)})}parse(){return this.unshift(({value:t})=>({value:o(t)?parseFloat(t.toString()):t}))}}class Mt extends Et{constructor(t){super("object"),this[St]={},this.push(({value:e})=>p(e)?{value:e}:this.invalid("",t))}keys(t,e){const s=t;return s&&(this[ct.KEYS]={...this[ct.KEYS],...s}),s?this.push(({value:t})=>{const r=[],n={};return Object.keys(s).forEach(a=>{const i=s[a];i[ct.NAME]=i[ct.SOURCE]??a;const{error:u,message:l,value:h}=i.validate(t[i[ct.NAME]],n);!e&&l&&(e=l),u&&r.push(u),o(h)&&(n[a]=h)}),r.length?this.invalid("{ "+r.join(", ")+" }",e):{value:n}}):this}model(){const t={},e=Object.keys(this[ct.KEYS]);return e.length&&e.forEach(e=>t[e]=this[ct.KEYS][e].model()),e.length?t:this[ct.TYPE]}parse(t){return this.unshift(({value:e})=>{if(!p(e))try{e=JSON.parse(e)}catch(e){return this.invalid("",t)}return{value:e}})}toString(){return Object.keys(this[ct.KEYS]).length?JSON.stringify(this.model(),null,4):this[ct.TYPE]}}St=ct.KEYS;class Dt extends Et{constructor(t){super("string"),this.push(({value:e})=>m(e)?{value:e}:this.invalid("",t))}between(t,e,s){return this.min(t,s),this.max(e,s)}email(t){const e=/^[\w-\\.]+@([\w-]+\.)+[\w-]{2,4}$/i;return this.push(({value:s})=>e.test(s)?{value:s}:this.invalid(".email",t))}length(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t.length==n?{value:t}:this.invalid(`.length(${n})`,e)})}lowerCase(){return this.push(({value:t})=>({value:t.toLowerCase()}))}lowerCamelCase(){return this.push(({value:t})=>({value:Q(t)}))}max(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t.length<=n?{value:t}:this.invalid(`.max(${n})`,e)})}mask(t){const e=this.fn(t);return this.push(({value:t,context:s})=>({value:it(e({value:t,context:s}),t)}))}min(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t.length>=n?{value:t}:this.invalid(`.min(${n})`,e)})}parse(){return this.unshift(({value:t})=>({value:p(t)?JSON.stringify(t):o(t)?t.toString():t}))}required(t){return this[ct.REQUIRED]=!0,this.push(({value:e})=>e.length?{value:e}:this.invalid(".required",t))}regex(t,e){return this.push(({value:s})=>t.test(s)?{value:s}:this.invalid(".regex",e))}replace(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>({value:t.replace(s({value:t,context:r}),e)}))}trim(){return this.push(({value:t})=>({value:t.trim()}))}upperCase(){return this.push(({value:t})=>({value:t.toUpperCase()}))}upperCamelCase(){return this.push(({value:t})=>({value:st(t)}))}}class Rt{static array(t,e){return new bt(e).items(t)}static boolean(t){return new wt(t)}static date(t){return new Tt(t)}static enum(t,e){return new Ct(e).list(t)}static number(t){return new It(t)}static object(t,e){return new Mt(e).keys(t)}static ref(t,e){return({context:s})=>s&&o(s[t])?s[t]:e}static string(t){return new Dt(t)}test(t,...e){return!m(Rt.validate(t,...e).error)}async testAsync(t,...e){return!m((await Rt.validateAsync(t,...e)).error)}static validate(t,...e){let s={value:t};for(let t=0;t<e.length;t++)if(s=e[t].validate(s.value),s.error)return{value:s.value,error:s.error};return{value:s.value}}static async validateAsync(t,...e){let s={value:t};for(let t=0;t<e.length;t++)if(s=await e[t].validateAsync(s.value),s.error)return{value:s.value,error:s.error};return{value:s.value}}}exports.AsyncQueue=class{constructor(){this.running=!1,this.queue=[]}push(t){return new Promise((e,s)=>{this.queue.push(async()=>{try{const s=await t();e(s)}catch(t){s(t)}}),this.run()})}async run(){if(!this.running){for(this.running=!0;this.queue.length>0;){const t=this.queue.shift();t&&await t()}this.running=!1}}},exports.EventEmitter=class{constructor(){this.events=new Map}on(t,e){const s=this.events.get(t);return s?s.push(e):this.events.set(t,[e]),{dispose:()=>this.off(t,e)}}once(t,e){const s=r=>{e(r),this.off(t,s)};return this.on(t,s),{dispose:()=>this.off(t,s)}}off(t,e){const s=this.events.get(t);if(e){if(s){const t=s.indexOf(e);t>=0&&s.splice(t,1)}}else this.events.set(t,[])}emit(t,e){const s=this.events.get(t);s&&s.forEach(t=>t(e))}},exports.Hash=O,exports.RandomString=tt,exports.Validation=Rt,exports.ValidationBase=Et,exports.ValidationKeys=ct,exports.allowed=ut,exports.cache=()=>{const t=[],e=[];return s=>{let r=t.indexOf(s);return-1==r&&(t.push(s),e.push({}),r=e.length-1),e[r]}},exports.camelCase=B,exports.chunkArray=(t,e)=>{const s=[];for(let r=0;r<t.length;r+=e)s.push(t.slice(r,r+e));return s},exports.clamp=t,exports.clone=lt,exports.colorPalette=(t,e)=>E(e??D,e=>0==e?t:e>0?M(t,e):I(t,1- -1*e)),exports.compareArray=(t,e)=>t.length===e.length&&t.every((t,s)=>t===e[s]),exports.countArray=t=>{const e={};return t.forEach(t=>{const s=t.toString();e[s]=(e[s]||0)+1}),e},exports.cutText=(t,e)=>{if(t.length>e){const s=t.substring(0,e).split(" ");return s.pop(),s.join(" ")+"..."}return t},exports.dateFormat=U,exports.dateRange=(t,e)=>{const s=new Date(t),r=[];for(;t<e;)s.setDate(s.getDate()+1),r.push(new Date(s));return r},exports.debounce=(t,e)=>{let s;const r=()=>{s&&clearTimeout(s)};return{cancel:r,run(...n){r(),s=setTimeout(()=>t(...n),e)}}},exports.decodeHTML=t=>t.replace(J,(t,e)=>V[e]).replace(/&#(\d+);/gi,(t,e)=>String.fromCharCode(parseInt(e,10))),exports.denied=(t,e)=>ut(Object.keys(e).filter(e=>-1==t.indexOf(e)),e),exports.each=(t,e,s)=>a(t)?y(t,e,s):p(t)?S(t,e,s):t,exports.encodeHTML=t=>t.replace(/[^0-9A-Za-z ]/g,t=>"&#"+t.charCodeAt(0)+";"),exports.firstDayDate=t=>new Date(t.getFullYear(),t.getMonth(),1,t.getHours(),t.getMinutes(),t.getSeconds()),exports.forEachAsync=async(t,e,s)=>{await Promise.allSettled(t.map((r,n)=>e.call(s,r,n,t)?.catch(K))).catch(K)},exports.forEachIndex=y,exports.forEachKey=S,exports.forEachPage=async t=>{let e=!0;const s=()=>e=!0;let r=1;for(;e;)e=!1,await(t(r,s)?.catch(K)),r+=1},exports.forEachSeries=async(t,e,s)=>{for(let r=0;r<t.length;r++)await(e.call(s,t[r],r,t)?.catch(K))},exports.forLoop=(t,e,s)=>{for(let r=1;r<=t&&!1!==e.call(s,r,t);r++);return t},exports.hexToRgb=w,exports.hslToRgb=(t,e,s)=>{t/=60;const r=(1-Math.abs(2*s-1))*e,n=r*(1-Math.abs(t%2-1));let a=[0,0,0];t<=1?a=[r,n,0]:t<=2?a=[n,r,0]:t<=3?a=[0,r,n]:t<=4?a=[0,n,r]:t<=5?a=[n,0,r]:t<=6&&(a=[r,0,n]);const i=s-.5*r;return[Math.round(255*(a[0]+i)),Math.round(255*(a[1]+i)),Math.round(255*(a[2]+i))]},exports.inArray=(t,e)=>-1!=e.indexOf(t),exports.includesArray=(t,e)=>t.every(t=>e.includes(t)),exports.isArray=a,exports.isBoolean=i,exports.isCharacter=t=>/^[\w]$/.test(t),exports.isDate=t=>"date"==n(t),exports.isDef=o,exports.isDigit=z,exports.isEmpty=q,exports.isFalse=t=>!X(t),exports.isFloat=l,exports.isFunction=h,exports.isInteger=c,exports.isLetter=Z,exports.isMap=t=>"map"==n(t),exports.isNotEmpty=t=>!q(t),exports.isNull=t=>null===t,exports.isNumber=u,exports.isObject=p,exports.isPlainObject=v,exports.isRegExp=t=>"regexp"==n(t),exports.isScalar=t=>-1!=x.indexOf(n(t)),exports.isSet=t=>"set"==n(t),exports.isSpecialChar=W,exports.isString=m,exports.isSymbol=t=>"symbol"==typeof t,exports.isTrue=X,exports.isUndefined=d,exports.isValidDate=Y,exports.lastDayDate=t=>new Date(t.getFullYear(),t.getMonth()+1,0,t.getHours(),t.getMinutes(),t.getSeconds()),exports.lerp=(e,s,r)=>e+(s-e)*t(r,0,1),exports.loop=(t,e)=>{let s=!1;const r=async()=>{s&&(await t(),setTimeout(r,e))};return{start(){s||(s=!0,r())},stop(){s=!1}}},exports.lowerCamelCase=Q,exports.map=E,exports.mask=it,exports.maskMoney=(t,e,s)=>(s++,e=parseInt((e||"0").replace(/\D/g,"")).toString(),ot(t,e.length<s?("0".repeat(s)+e).slice(-1*s):e)),exports.maskReverse=ot,exports.maskTest=(t,e)=>t.length==it(t,e).length,exports.merge=ht,exports.msToString=t=>{const e=[];return $.forEach(s=>{const r=F[s],n=(t-t%r)/r;n&&(t-=n*r,e.push(n.toString()+s))}),e.join(" ")},exports.noop=K,exports.parseMs=t=>{const e=/(-?(?:\d+)?\.?\d+) *(ms|s|m|h|d|w|y)/gm;let s,r=0;for(;null!==(s=e.exec(t));)s.index===e.lastIndex&&e.lastIndex++,r+=parseFloat(s[1])*F[s[2]]||0;return r},exports.parseSize=t=>{if(u(t))return t+"px";const e=(t=>/(-?(?:\d+)?\.?\d+) *(px|%|cm|mm|in|pt|pc|en|ex|ch|rem|vw|vh|vmin|vmax)*/g.exec(t))(t);return e?parseFloat(e[1])+(e[2]||"px"):"0px"},exports.random=e,exports.randomCase=t=>t.split("").map(t=>Math.random()<.5?t.toUpperCase():t.toLowerCase()).join(""),exports.randomElement=t=>t.length?t[e(0,t.length-1)]:null,exports.rangeArray=(t,e,s=1)=>Array.from({length:(e-t)/s+1},(e,r)=>t+r*s),exports.rgbToHex=C,exports.rgbToHsl=(t,e,s)=>{const[r,n,a]=((...t)=>t.map(t=>t/255))(t,e,s),i=Math.max(r,n,a),o=Math.min(r,n,a),u=i-o,l=(o+i)/2;return[60*R(u,i,r,n,a),A(u,l),l]},exports.shadeColor=I,exports.shuffleArray=s,exports.shuffleString=G,exports.sleep=t=>new Promise(e=>setTimeout(e,t)),exports.stringReverse=et,exports.tintColor=M,exports.toArray=t=>a(t)?t:o(t)?[t]:[],exports.toBool=f,exports.type=n,exports.uniqueArray=t=>t.filter((t,e,s)=>s.indexOf(t)===e),exports.uniqueID=k,exports.upperCamelCase=st,exports.uuidv1=()=>{const t=1e4*(Date.now()+122192928e5),s=(4294967295&t)>>>0,r=(t/4294967296&65535)>>>0,n=(t/281474976710656&4095)>>>0,a=e(0,s),i=(t,e)=>t.toString(16).padStart(e,"0");return[i(s,8),i(r,4),i(4096|n,4),i(a>>8&63|128,2)+i(255&a,2),k(12)].join("-")},exports.uuidv1ToTimestamp=t=>{const e=t.replace(/-/g,""),s=parseInt(e.slice(0,8),16),r=parseInt(e.slice(8,12),16),n=(4095&parseInt(e.slice(12,16),16))*Math.pow(2,48)+r*Math.pow(2,32)+s;return Math.floor((n-122192928e9)/1e4)},exports.uuidv4=()=>{const t=[];t.push(...Array(16).fill(0).map(()=>e(0,255))),t[6]=15&t[6]|64;const s=t.map(t=>t.toString(16).padStart(2,"0")).join("");return[s.slice(0,8),s.slice(8,12),s.slice(12,16),s.slice(16,20),s.slice(20)].join("-")},exports.uuidv7=()=>{const t=Date.now(),s=[];s[0]=t/2**40&255,s[1]=t/2**32&255,s[2]=t>>>24&255,s[3]=t>>>16&255,s[4]=t>>>8&255,s[5]=255&t,s.push(...Array(10).fill(0).map(()=>e(0,255))),s[6]=15&s[6]|112,s[8]=63&s[8]|128;const r=s.map(t=>t.toString(16).padStart(2,"0")).join("");return[r.slice(0,8),r.slice(8,12),r.slice(12,16),r.slice(16,20),r.slice(20)].join("-")},exports.uuidv7ToTimestamp=t=>parseInt(t.replace(/-/g,"").slice(0,12),16),exports.uuidv8=t=>{const s=Date.now(),r=[];r[0]=s/2**40&255,r[1]=s/2**32&255,r[2]=s>>>24&255,r[3]=s>>>16&255,r[4]=s>>>8&255,r[5]=255&s,r.push(...Array(8).fill(0).map(()=>e(0,255))),r[6]=15&r[6]|128,r[8]=63&r[8]|128;const n=r.map(t=>t.toString(16).padStart(2,"0")).join("");return[n.slice(0,8),n.slice(8,12),n.slice(12,16),O.hex(t??"").slice(4),n.slice(16)].join("-")};
7
+ "use strict";const t=(t,e,s)=>Math.max(e,Math.min(s,t)),e=(t,e)=>Math.floor(Math.random()*(e-t+1)+t),s=t=>{for(let s=t.length-1;s>0;s--){const r=e(0,s);[t[s],t[r]]=[t[r],t[s]]}return t},r={},n=t=>null==t?"null":r[r.toString.call(t)]||"object";["Array","AsyncFunction","Boolean","Date","Function","Map","Number","Object","RegExp","Set","String"].forEach(t=>r["[object "+t+"]"]=t.toLowerCase());const i=t=>"array"==n(t),a=t=>"boolean"==n(t),o=t=>"null"!=n(t),l=t=>"number"==n(t),u=t=>l(t)&&!!(t%1),h=t=>"function"==typeof t,c=t=>l(t)&&!(t%1),p=t=>"object"==n(t),v=t=>p(t)&&t.constructor===Object,x=["boolean","number","string"],m=t=>"string"==typeof t,d=t=>void 0===t,g=[1,"1",!0,"true"],f=t=>-1!=g.indexOf(t),y=(t,e,s)=>{for(let r=0;r<t.length&&!1!==e.call(s,t[r],r,t);r++);return t},S=(t,e,s)=>{let r="";const n=Object.keys(t);for(let i=0;i<n.length&&(r=n[i],!1!==e.call(s,t[r],r,t));i++);return t},E=(t,e,s)=>Object.fromEntries(Object.entries(t).map(([r,n])=>[r,e.call(s,n,r,t)])),w=t=>parseInt(t??"0",16)||0,b=t=>t.replace(/^#/,"").match(/.{1,2}/g)?.map(w)||[],T=t=>("0"+t.toString(16)).slice(-2),I=(t,e,s)=>"#"+T(t)+T(e)+T(s),C=(e,s)=>{const r=b(e);s=t(s,0,1);const[n,i,a]=r.map(t=>Math.round(t*s));return I(n,i,a)},M=(e,s)=>{const r=b(e);s=t(s,0,1);const[n,i,a]=r.map(t=>Math.round(t+(255-t)*s));return I(n,i,a)},D={50:.95,100:.9,200:.75,300:.6,400:.3,500:0,600:-.1,700:-.25,800:-.4,900:-.55,950:-.71},O=(t,e,s,r,n)=>0===t?0:e===s?(r-n)/t%6:e===r?(n-s)/t+2:e===n?(s-r)/t+4:0,R=(t,e)=>0===t?0:t/(1-Math.abs(2*e-1));class A{constructor(t){this.key=this.shuffle(A.dictionary,t,!1)}encrypt(t){return this.shuffle(t,this.key,!1)}decrypt(t){return this.shuffle(t,this.key,!0)}index(t,e,s){return[A.dictionary.indexOf(t[s]),A.dictionary.indexOf(e[s%e.length])]}result(t,e,s){return A.dictionary[(s?t-e+A.dictionary.length:t+e)%A.dictionary.length]}shuffle(t,e,s){let r="";for(let n=0;n<t.length;n++){const[i,a]=this.index(t,e,n);r+=-1===i||-1===a?t[n]:this.result(i,a,s)}return r}static hex(t){let e=0;for(let s=0;s<t.length;s++)e=16777619*(e^t.charCodeAt(s));return(e>>>0).toString(16).padStart(8,"0")}}A.dictionary="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";const k=(t=64)=>Array(Math.ceil(t/2)).fill(0).map(()=>e(0,255).toString(16).padStart(2,"0")).join("").slice(0,t),j=t=>("0"+t.toString()).slice(-2),N={"%y":(t,e)=>j(e?t.getUTCFullYear():t.getFullYear()),"%Y":(t,e)=>(e?t.getUTCFullYear():t.getFullYear()).toString(),"%m":(t,e)=>j((e?t.getUTCMonth():t.getMonth())+1),"%d":(t,e)=>j(e?t.getUTCDate():t.getDate()),"%H":(t,e)=>j(e?t.getUTCHours():t.getHours()),"%M":(t,e)=>j(e?t.getUTCMinutes():t.getMinutes()),"%S":(t,e)=>j(e?t.getUTCSeconds():t.getSeconds())},Y=(t,e,s)=>(e=e??new Date,t.replace(/%[yYmdHMS]/g,t=>N[t]?N[t](e,s):t.slice(1))),U=36e5,L=24*U,P={ms:1,s:1e3,m:6e4,h:U,d:L,w:7*L,y:315576e5},$=t=>{const e=/(-?(?:\d+)?\.?\d+)\s*(ms|s|m|h|d|w|y)/gm;let s,r=0;for(;null!==(s=e.exec(t));)s.index===e.lastIndex&&e.lastIndex++,r+=parseFloat(s[1])*P[s[2]]||0;return r},F=t=>{const e=new Date(t);return e.getTime()==e.getTime()&&t==e.toISOString().slice(0,10)},q=t=>new Date(t.getFullYear(),t.getMonth()+1,0,t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()),H=(t,e)=>/^([\d]{4})-([\d]{2})-([\d]{2})$/.test(t)?F(t)?new Date(`${t} ${e}`):null:/^([\d]{4})-([\d]{2})$/.test(t)&&F(t=`${t}-01`)?new Date(`${t} ${e}`):null,X=["y","d","h","m","s","ms"];const K=t=>0==(t?.length??0),_=["",0,"0",null,!1,void 0],Q=t=>-1==_.indexOf(t),B=()=>{},J=(t,e,s)=>e(t.toLowerCase().replace(/\W+/g," ")).replace(/\s/g,s??""),V=(t,e)=>J(t,t=>t.replace(/\s(\w)/g,t=>t.toUpperCase()),e),z=V,Z=/&(amp|apos|lt|gt|nbsp|quot);/g,W={amp:"&",apos:"'",lt:"<",gt:">",nbsp:" ",quot:'"'},G=t=>/^[\d]$/.test(t),tt=t=>/^[A-Za-z]$/.test(t),et=t=>/^[^\w]$/.test(t),st=t=>s(t.split("")).join("");class rt{constructor(){this.hasSpace=!1,this._space=" ",this.hasNumbers=!1,this._numbers="0123456789",this.hasSymbols=!1,this._symbols="!@#$%^&*()<>.<~:;?+=-_",this.hasUpper=!1,this._upper="ABCDEFGHIJKLMNOPQRSTUVWXYZ",this.hasLower=!1,this._lower="abcdefghijklmnopqrstuvwxyz",this.hasChars=!1,this._chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"}chars(){return this.hasChars=!0,this}static chars(){return(new rt).chars()}lower(){return this.hasLower=!0,this}static lower(){return(new rt).lower()}make(t){let s="";this.hasSpace&&(s+=this._space),this.hasNumbers&&(s+=this._numbers),this.hasSymbols&&(s+=this._symbols),this.hasUpper&&!this.hasChars&&(s+=this._upper),this.hasLower&&!this.hasChars&&(s+=this._lower),this.hasChars&&(s+=this._chars);let r="";if(t&&s.length){s=st(s);for(let n=0;n<t;n++)r+=s.charAt(e(0,s.length-1))}return r}numbers(){return this.hasNumbers=!0,this}static numbers(){return(new rt).numbers()}space(){return this.hasSpace=!0,this}static space(){return(new rt).space()}symbols(){return this.hasSymbols=!0,this}static symbols(){return(new rt).symbols()}upper(){return this.hasUpper=!0,this}static upper(){return(new rt).upper()}}const nt=t=>t.split("").reverse().join(""),it=(t,e)=>J(t,t=>t.replace(/(\w)(\w*)/g,(t,e,s)=>e.toUpperCase()+s),e),at=(t,e)=>e(t.value)?t.value:(t=>(t.maskIndex--,""))(t),ot={"#":t=>t.value,0:t=>at(t,G),9:t=>at(t,G),A:t=>at(t,tt),Z:t=>at(t,tt),L:t=>at(t,tt).toLowerCase(),U:t=>at(t,tt).toUpperCase(),S:t=>at(t,et)},lt=t=>{t.maskIndex++,t.textIndex++;const{mask:e,maskIndex:s,text:r,textIndex:n}=t;t.key=e[s],t.value=r[n];const{key:i,value:a}=t;return d(i)||d(a)?"":(t=>ot[t.key]?ot[t.key](t):(t.key!=t.value&&t.textIndex--,t.key))(t)+lt(t)},ut=(t,e)=>lt({mask:t,maskIndex:-1,text:e,textIndex:-1,key:"",value:""}),ht=(t,e)=>nt(ut(nt(t),nt(e))),ct=(t,e)=>t.reduce((t,s)=>({...t,[s]:e[s]}),{}),pt=t=>t instanceof Date?new Date(t.getTime()):i(t)?t.map(t=>pt(t)):p(t)?E(t,t=>pt(t)):t,vt=(t,...e)=>{if(!e.length)return t;const s=e.shift();if(v(t)&&v(s))for(const e in s)v(s[e])?(t[e]||(t={...t,[e]:{}}),t[e]=vt(t[e],s[e])):t={...t,[e]:s[e]};return vt(t,...e)};class xt{}var mt,dt,gt,ft,yt,St,Et,wt,bt;xt.DESCRIPTION=Symbol("DESCRIPTION"),xt.ERROR=Symbol("ERROR"),xt.EXAMPLE=Symbol("EXAMPLE"),xt.INDEXES=Symbol("INDEXES"),xt.KEYS=Symbol("KEYS"),xt.LIST=Symbol("LIST"),xt.NAME=Symbol("NAME"),xt.REQUIRED=Symbol("REQUIRED"),xt.SOURCE=Symbol("SOURCE"),xt.TYPE=Symbol("TYPE");class Tt{constructor(t){this[mt]="",this[dt]="",this[gt]=null,this[ft]="",this[yt]="any",this[St]=!1,this.rules=[],this.custom=[],this[xt.TYPE]=t}description(t){return this[xt.DESCRIPTION]=t,this}example(t){return this[xt.EXAMPLE]=t,this}empty(t){const e=t;return this.unshift(({value:t})=>{const s=o(t);return{break:!o(e)&&!s,value:s?t:h(e)?e():e}})}equal(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t==n?{value:t}:this.invalid(`.equal(${n})`,e)})}error(t){return m(t)&&(this[xt.ERROR]=t),this}filter(...t){const e=t;return this.unshift(({value:t})=>{const s=-1==e.indexOf(t);return{break:!s,value:s?t:void 0}})}fn(t){return h(t)?t:()=>t}from(t){return this[xt.SOURCE]=t,this}invalid(t,e){return t=`[${this[xt.TYPE]}]${t}`,{error:this[xt.ERROR]?this[xt.ERROR]:this[xt.NAME]?this[xt.NAME]+":"+t:t,message:e}}model(){return this.toString()}parse(){return this.unshift(({value:t})=>({value:t}))}push(t){return this.rules.push(t),this}required(t){return this[xt.REQUIRED]=!0,this.unshift(({value:e})=>o(e)?{value:e}:this.invalid(".required",t))}test(t){return!m(this.validate(t).error)}async testAsync(t){return!m((await this.validateAsync(t)).error)}toString(){return this[xt.TYPE]}unshift(t){return this.rules.unshift(t),this}validate(t,e){if(this.custom.length)return this.invalid("[async]");let s={value:t};for(let t=0;t<this.rules.length;t++){if(s=this.rules[t]({value:s.value,context:e}),s.error?.length)return{error:s.error,...s.message?{message:s.message}:{}};if(s.break)return{value:s.value}}return{value:s.value}}async validateAsync(t,e){let s=this.validate(t,e);if(s.error)return{error:s.error};for(let t=0;t<this.custom.length;t++){if(s=await this.custom[t]({value:s.value}),s.error)return{error:s.error};if(s.break)return{value:s.value}}return{value:s.value}}}mt=xt.NAME,dt=xt.DESCRIPTION,gt=xt.EXAMPLE,xt.SOURCE,ft=xt.ERROR,yt=xt.TYPE,St=xt.REQUIRED;class It extends Tt{constructor(t){super("array"),this[Et]=[],this.push(({value:e})=>i(e)?{value:e}:this.invalid("",t))}between(t,e,s){return this.min(t,s),this.max(e,s)}items(t,e){const s=t;return s&&this[xt.INDEXES].push(s),s?this.push(({value:t})=>{const r=[];s[xt.NAME]="";for(let n=0;n<t.length;n++){const{error:i,value:a}=s.validate(t[n],t);if(i)return this.invalid("< "+i+"["+n+"] >",e);r[n]=a}return{value:r}}):this}length(t,e){const s=t;return this.push(({value:t})=>t.length==s?{value:t}:this.invalid(".length("+s+")",e))}max(t,e){const s=t;return this.push(({value:t})=>t.length<=s?{value:t}:this.invalid(".max("+s+")",e))}min(t,e){const s=t;return this.push(({value:t})=>t.length>=s?{value:t}:this.invalid(".min("+s+")",e))}model(){return this[xt.INDEXES].length?this[xt.INDEXES].map(t=>t.model()):this[xt.TYPE]}toString(){return this[xt.INDEXES].length?JSON.stringify(this.model(),null,4):this[xt.TYPE]}}Et=xt.INDEXES;class Ct extends Tt{constructor(t){super("boolean"),this.push(({value:e})=>a(e)?{value:e}:this.invalid("",t))}parse(){return this.unshift(({value:t})=>({value:o(t)?f(t):t}))}}class Mt extends Tt{constructor(t){super("date"),this.push(({value:e})=>m(e)&&F(e)||!isNaN(new Date(e).getTime())?{value:e}:this.invalid("",t))}format(t){const e=t;return this.push(({value:t})=>({value:Y(e,new Date(t))}))}parse(){return this.unshift(({value:t})=>({value:new Date(t)}))}}class Dt extends Tt{constructor(t){super("enum"),this[wt]=[],this.push(({value:e})=>o(e)?{value:e}:this.invalid(`('${this[xt.LIST].join("', '")}')`,t))}list(t,e){const s=t;return s&&this[xt.LIST].push(...s),s?this.push(({value:t})=>-1!=this[xt.LIST].indexOf(t)?{value:t}:this.invalid(`('${this[xt.LIST].join("', '")}')`,e)):this}toString(){return`${this[xt.TYPE]}('${this[xt.LIST].join("', '")}')`}}wt=xt.LIST;class Ot extends Tt{constructor(t){super("number"),this.push(({value:e})=>l(e)?{value:e}:this.invalid("",t))}between(t,e,s){return this.min(t,s),this.max(e,s)}float(t){return this.push(({value:e})=>u(e)?{value:e}:this.invalid(".float",t))}integer(t){return this.push(({value:e})=>c(e)?{value:e}:this.invalid(".integer",t))}max(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t<=n?{value:t}:this.invalid(`.max(${n})`,e)})}min(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t>=n?{value:t}:this.invalid(`.min(${n})`,e)})}parse(){return this.unshift(({value:t})=>({value:o(t)?parseFloat(t.toString()):t}))}}class Rt extends Tt{constructor(t){super("object"),this[bt]={},this.push(({value:e})=>p(e)?{value:e}:this.invalid("",t))}keys(t,e){const s=t;return s&&(this[xt.KEYS]={...this[xt.KEYS],...s}),s?this.push(({value:t})=>{const r=[],n={};return Object.keys(s).forEach(i=>{const a=s[i];a[xt.NAME]=a[xt.SOURCE]??i;const{error:l,message:u,value:h}=a.validate(t[a[xt.NAME]],n);!e&&u&&(e=u),l&&r.push(l),o(h)&&(n[i]=h)}),r.length?this.invalid("{ "+r.join(", ")+" }",e):{value:n}}):this}model(){const t={},e=Object.keys(this[xt.KEYS]);return e.length&&e.forEach(e=>t[e]=this[xt.KEYS][e].model()),e.length?t:this[xt.TYPE]}parse(t){return this.unshift(({value:e})=>{if(!p(e))try{e=JSON.parse(e)}catch(e){return this.invalid("",t)}return{value:e}})}toString(){return Object.keys(this[xt.KEYS]).length?JSON.stringify(this.model(),null,4):this[xt.TYPE]}}bt=xt.KEYS;class At extends Tt{constructor(t){super("string"),this.push(({value:e})=>m(e)?{value:e}:this.invalid("",t))}between(t,e,s){return this.min(t,s),this.max(e,s)}email(t){const e=/^[\w-\\.]+@([\w-]+\.)+[\w-]{2,4}$/i;return this.push(({value:s})=>e.test(s)?{value:s}:this.invalid(".email",t))}length(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t.length==n?{value:t}:this.invalid(`.length(${n})`,e)})}lowerCase(){return this.push(({value:t})=>({value:t.toLowerCase()}))}lowerCamelCase(){return this.push(({value:t})=>({value:V(t)}))}max(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t.length<=n?{value:t}:this.invalid(`.max(${n})`,e)})}mask(t){const e=this.fn(t);return this.push(({value:t,context:s})=>({value:ut(e({value:t,context:s}),t)}))}min(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t.length>=n?{value:t}:this.invalid(`.min(${n})`,e)})}parse(){return this.unshift(({value:t})=>({value:p(t)?JSON.stringify(t):o(t)?t.toString():t}))}required(t){return this[xt.REQUIRED]=!0,this.push(({value:e})=>e.length?{value:e}:this.invalid(".required",t))}regex(t,e){return this.push(({value:s})=>t.test(s)?{value:s}:this.invalid(".regex",e))}replace(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>({value:t.replace(s({value:t,context:r}),e)}))}trim(){return this.push(({value:t})=>({value:t.trim()}))}upperCase(){return this.push(({value:t})=>({value:t.toUpperCase()}))}upperCamelCase(){return this.push(({value:t})=>({value:it(t)}))}}class kt{static array(t,e){return new It(e).items(t)}static boolean(t){return new Ct(t)}static date(t){return new Mt(t)}static enum(t,e){return new Dt(e).list(t)}static number(t){return new Ot(t)}static object(t,e){return new Rt(e).keys(t)}static ref(t,e){return({context:s})=>s&&o(s[t])?s[t]:e}static string(t){return new At(t)}test(t,...e){return!m(kt.validate(t,...e).error)}async testAsync(t,...e){return!m((await kt.validateAsync(t,...e)).error)}static validate(t,...e){let s={value:t};for(let t=0;t<e.length;t++)if(s=e[t].validate(s.value),s.error)return{value:s.value,error:s.error};return{value:s.value}}static async validateAsync(t,...e){let s={value:t};for(let t=0;t<e.length;t++)if(s=await e[t].validateAsync(s.value),s.error)return{value:s.value,error:s.error};return{value:s.value}}}exports.AsyncQueue=class{constructor(){this.running=!1,this.queue=[]}push(t){return new Promise((e,s)=>{this.queue.push(async()=>{try{const s=await t();e(s)}catch(t){s(t)}}),this.run()})}async run(){if(!this.running){for(this.running=!0;this.queue.length>0;){const t=this.queue.shift();t&&await t()}this.running=!1}}},exports.EventEmitter=class{constructor(){this.events=new Map}on(t,e){const s=this.events.get(t);return s?s.push(e):this.events.set(t,[e]),{dispose:()=>this.off(t,e)}}once(t,e){const s=r=>{e(r),this.off(t,s)};return this.on(t,s),{dispose:()=>this.off(t,s)}}off(t,e){const s=this.events.get(t);if(e){if(s){const t=s.indexOf(e);t>=0&&s.splice(t,1)}}else this.events.set(t,[])}emit(t,e){const s=this.events.get(t);s&&s.forEach(t=>t(e))}},exports.Hash=A,exports.RandomString=rt,exports.Validation=kt,exports.ValidationBase=Tt,exports.ValidationKeys=xt,exports.allowed=ct,exports.cache=()=>{const t=[],e=[];return s=>{let r=t.indexOf(s);return-1==r&&(t.push(s),e.push({}),r=e.length-1),e[r]}},exports.camelCase=z,exports.chunkArray=(t,e)=>{const s=[];for(let r=0;r<t.length;r+=e)s.push(t.slice(r,r+e));return s},exports.clamp=t,exports.clone=pt,exports.colorPalette=(t,e)=>E(e??D,e=>0==e?t:e>0?M(t,e):C(t,1- -1*e)),exports.compareArray=(t,e)=>t.length===e.length&&t.every((t,s)=>t===e[s]),exports.countArray=t=>{const e={};return t.forEach(t=>{const s=t.toString();e[s]=(e[s]||0)+1}),e},exports.cutText=(t,e)=>{if(t.length>e){const s=t.substring(0,e).split(" ");return s.pop(),s.join(" ")+"..."}return t},exports.dateFormat=Y,exports.dateInterval=(t,e,s)=>{const r=new Date(t);s=s??$("1d");const n=[];for(;r<e;)r.setTime(r.getTime()+s),n.push(new Date(r));return n},exports.dateRange=(t,e)=>{const s=t??Y("%Y-%m"),r=H(s,"00:00:00");if(!r||!F(r.toISOString().slice(0,10)))return[null,null];const n=e||s;let i=H(n,"23:59:59");return i&&F(i.toISOString().slice(0,10))?(7==n.length&&(i=q(i)),r>i?[null,null]:[r,i]):[r,null]},exports.debounce=(t,e)=>{let s;const r=()=>{s&&clearTimeout(s)};return{cancel:r,run(...n){r(),s=setTimeout(()=>t(...n),e)}}},exports.decodeHTML=t=>t.replace(Z,(t,e)=>W[e]).replace(/&#(\d+);/gi,(t,e)=>String.fromCharCode(parseInt(e,10))),exports.denied=(t,e)=>ct(Object.keys(e).filter(e=>-1==t.indexOf(e)),e),exports.each=(t,e,s)=>i(t)?y(t,e,s):p(t)?S(t,e,s):t,exports.encodeHTML=t=>t.replace(/[^0-9A-Za-z ]/g,t=>"&#"+t.charCodeAt(0)+";"),exports.firstDayDate=t=>new Date(t.getFullYear(),t.getMonth(),1,t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()),exports.forEachAsync=async(t,e,s)=>{await Promise.allSettled(t.map((r,n)=>e.call(s,r,n,t)?.catch(B))).catch(B)},exports.forEachIndex=y,exports.forEachKey=S,exports.forEachPage=async t=>{let e=!0;const s=()=>e=!0;let r=1;for(;e;)e=!1,await(t(r,s)?.catch(B)),r+=1},exports.forEachSeries=async(t,e,s)=>{for(let r=0;r<t.length;r++)await(e.call(s,t[r],r,t)?.catch(B))},exports.forLoop=(t,e,s)=>{for(let r=1;r<=t&&!1!==e.call(s,r,t);r++);return t},exports.hexToRgb=b,exports.hslToRgb=(t,e,s)=>{t/=60;const r=(1-Math.abs(2*s-1))*e,n=r*(1-Math.abs(t%2-1));let i=[0,0,0];t<=1?i=[r,n,0]:t<=2?i=[n,r,0]:t<=3?i=[0,r,n]:t<=4?i=[0,n,r]:t<=5?i=[n,0,r]:t<=6&&(i=[r,0,n]);const a=s-.5*r;return[Math.round(255*(i[0]+a)),Math.round(255*(i[1]+a)),Math.round(255*(i[2]+a))]},exports.inArray=(t,e)=>-1!=e.indexOf(t),exports.includesArray=(t,e)=>t.every(t=>e.includes(t)),exports.isArray=i,exports.isBoolean=a,exports.isCharacter=t=>/^[\w]$/.test(t),exports.isDate=t=>"date"==n(t),exports.isDef=o,exports.isDigit=G,exports.isEmpty=K,exports.isFalse=t=>!Q(t),exports.isFloat=u,exports.isFunction=h,exports.isInteger=c,exports.isLetter=tt,exports.isMap=t=>"map"==n(t),exports.isNotEmpty=t=>!K(t),exports.isNull=t=>null===t,exports.isNumber=l,exports.isObject=p,exports.isPlainObject=v,exports.isRegExp=t=>"regexp"==n(t),exports.isScalar=t=>-1!=x.indexOf(n(t)),exports.isSet=t=>"set"==n(t),exports.isSpecialChar=et,exports.isString=m,exports.isSymbol=t=>"symbol"==typeof t,exports.isTrue=Q,exports.isUndefined=d,exports.isValidDate=F,exports.lastDayDate=q,exports.lerp=(e,s,r)=>e+(s-e)*t(r,0,1),exports.loop=(t,e)=>{let s=!1;const r=async()=>{s&&(await t(),setTimeout(r,e))};return{start(){s||(s=!0,r())},stop(){s=!1}}},exports.lowerCamelCase=V,exports.map=E,exports.mask=ut,exports.maskMoney=(t,e,s)=>(s++,e=parseInt((e||"0").replace(/\D/g,"")).toString(),ht(t,e.length<s?("0".repeat(s)+e).slice(-1*s):e)),exports.maskReverse=ht,exports.maskTest=(t,e)=>t.length==ut(t,e).length,exports.merge=vt,exports.msToString=t=>{const e=[];return X.forEach(s=>{const r=P[s],n=(t-t%r)/r;n&&(t-=n*r,e.push(n.toString()+s))}),e.join(" ")},exports.noop=B,exports.parseMs=$,exports.parseSize=t=>{if(l(t))return t+"px";const e=(t=>/(-?(?:\d+)?\.?\d+) *(px|%|cm|mm|in|pt|pc|en|ex|ch|rem|vw|vh|vmin|vmax)*/g.exec(t))(t);return e?parseFloat(e[1])+(e[2]||"px"):"0px"},exports.random=e,exports.randomCase=t=>t.split("").map(t=>Math.random()<.5?t.toUpperCase():t.toLowerCase()).join(""),exports.randomElement=t=>t.length?t[e(0,t.length-1)]:null,exports.rangeArray=(t,e,s=1)=>Array.from({length:(e-t)/s+1},(e,r)=>t+r*s),exports.rgbToHex=I,exports.rgbToHsl=(t,e,s)=>{const[r,n,i]=((...t)=>t.map(t=>t/255))(t,e,s),a=Math.max(r,n,i),o=Math.min(r,n,i),l=a-o,u=(o+a)/2;return[60*O(l,a,r,n,i),R(l,u),u]},exports.shadeColor=C,exports.shuffleArray=s,exports.shuffleString=st,exports.sleep=t=>new Promise(e=>setTimeout(e,t)),exports.stringReverse=nt,exports.tintColor=M,exports.toArray=t=>i(t)?t:o(t)?[t]:[],exports.toBool=f,exports.type=n,exports.uniqueArray=t=>t.filter((t,e,s)=>s.indexOf(t)===e),exports.uniqueID=k,exports.upperCamelCase=it,exports.uuidv1=()=>{const t=1e4*(Date.now()+122192928e5),s=(4294967295&t)>>>0,r=(t/4294967296&65535)>>>0,n=(t/281474976710656&4095)>>>0,i=e(0,s),a=(t,e)=>t.toString(16).padStart(e,"0");return[a(s,8),a(r,4),a(4096|n,4),a(i>>8&63|128,2)+a(255&i,2),k(12)].join("-")},exports.uuidv1ToTimestamp=t=>{const e=t.replace(/-/g,""),s=parseInt(e.slice(0,8),16),r=parseInt(e.slice(8,12),16),n=(4095&parseInt(e.slice(12,16),16))*Math.pow(2,48)+r*Math.pow(2,32)+s;return Math.floor((n-122192928e9)/1e4)},exports.uuidv4=()=>{const t=[];t.push(...Array(16).fill(0).map(()=>e(0,255))),t[6]=15&t[6]|64;const s=t.map(t=>t.toString(16).padStart(2,"0")).join("");return[s.slice(0,8),s.slice(8,12),s.slice(12,16),s.slice(16,20),s.slice(20)].join("-")},exports.uuidv7=()=>{const t=Date.now(),s=[];s[0]=t/2**40&255,s[1]=t/2**32&255,s[2]=t>>>24&255,s[3]=t>>>16&255,s[4]=t>>>8&255,s[5]=255&t,s.push(...Array(10).fill(0).map(()=>e(0,255))),s[6]=15&s[6]|112,s[8]=63&s[8]|128;const r=s.map(t=>t.toString(16).padStart(2,"0")).join("");return[r.slice(0,8),r.slice(8,12),r.slice(12,16),r.slice(16,20),r.slice(20)].join("-")},exports.uuidv7ToTimestamp=t=>parseInt(t.replace(/-/g,"").slice(0,12),16),exports.uuidv8=t=>{const s=Date.now(),r=[];r[0]=s/2**40&255,r[1]=s/2**32&255,r[2]=s>>>24&255,r[3]=s>>>16&255,r[4]=s>>>8&255,r[5]=255&s,r.push(...Array(8).fill(0).map(()=>e(0,255))),r[6]=15&r[6]|128,r[8]=63&r[8]|128;const n=r.map(t=>t.toString(16).padStart(2,"0")).join("");return[n.slice(0,8),n.slice(8,12),n.slice(12,16),A.hex(t??"").slice(4),n.slice(16)].join("-")};
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @andrewcaires/utils.js v0.4.13
2
+ * @andrewcaires/utils.js v0.4.15
3
3
  * JavaScript utility library for web and nodejs development
4
4
  * (c) 2025 Andrew Caires
5
5
  * @license: MIT
@@ -18,37 +18,48 @@ declare const isDef: <T = any>(test: any) => test is T;
18
18
 
19
19
  declare const isFloat: (test: any) => test is number;
20
20
 
21
+ type TypeAnyConstructor<T = any> = new (...args: Array<any>) => T;
21
22
  type TypeAnyFunction<T = any> = (...args: Array<any>) => T;
23
+ /** @deprecated don't use this anymore */
22
24
  type TypeCallbackFunction<T = any> = (...args: Array<any>) => T;
23
25
  type TypeArray<T> = Array<T>;
26
+ type TypeAnyArray = TypeArray<any>;
27
+ /** @deprecated don't use this anymore */
24
28
  type TypeArrayAny = TypeArray<any>;
25
29
  type TypeArrayString = TypeArray<string>;
26
30
  type TypeArrayNumber = TypeArray<number>;
27
- type TypeArrayFunction = TypeArray<TypeCallbackFunction>;
31
+ type TypeArrayFunction = TypeArray<TypeAnyFunction>;
28
32
  type TypeKey = number | string | symbol;
29
33
  type TypeNullable<T> = T | null;
34
+ type TypeUndefined<T> = T | undefined;
35
+ type TypeSatisfies<T> = T | null | undefined;
30
36
  type TypeScalar = boolean | number | string;
31
37
  type TypeObject<T, K extends keyof any = string> = {
32
38
  [P in K]: T;
33
39
  };
40
+ type TypeAnyObject = TypeObject<any>;
41
+ /** @deprecated don't use this anymore */
34
42
  type TypeObjectAny = TypeObject<any>;
35
43
  type TypeObjectBoolean = TypeObject<boolean>;
36
- type TypeObjectFunction = TypeObject<TypeCallbackFunction>;
44
+ type TypeObjectFunction = TypeObject<TypeAnyFunction>;
37
45
  type TypeObjectNumber = TypeObject<number>;
38
46
  type TypeObjectNullable<T, K = void> = {
39
47
  [P in keyof T]?: P extends K ? T[P] : TypeNullable<T[P]>;
40
48
  };
49
+ type typeObjectSatisfies<T, K = void> = {
50
+ [P in keyof T]?: P extends K ? T[P] : TypeSatisfies<T[P]>;
51
+ };
41
52
  type TypeObjectString = TypeObject<string>;
42
53
  type TypeObjectKeys<T, F = any> = {
43
54
  [K in keyof T]: T[K] extends F ? K : never;
44
55
  }[keyof T];
45
- type TypeObjectKeysFunction<T> = TypeObjectKeys<T, TypeCallbackFunction>;
56
+ type TypeObjectKeysFunction<T> = TypeObjectKeys<T, TypeAnyFunction>;
46
57
  type TypeCallback<T, K, O, R> = (value: T, key: K, object: O) => R;
47
58
  type TypeCallbackArray<T> = TypeCallback<T, number, TypeArray<T>, any>;
48
59
  type TypeCallbackMap<T> = TypeCallback<T, number, TypeArray<T>, T>;
49
60
  type TypeCallbackObject<T> = TypeCallback<T, string, TypeObject<T>, any>;
50
61
 
51
- declare const isFunction: (test: any) => test is TypeCallbackFunction;
62
+ declare const isFunction: (test: any) => test is TypeAnyFunction;
52
63
 
53
64
  declare const isInteger: (test: any) => test is number;
54
65
 
@@ -58,9 +69,9 @@ declare const isNull: (test: any) => test is null;
58
69
 
59
70
  declare const isNumber: (test: any) => test is number;
60
71
 
61
- declare const isObject: (test: any) => test is TypeObjectAny;
72
+ declare const isObject: (test: any) => test is TypeAnyObject;
62
73
 
63
- declare const isPlainObject: (test: any) => test is TypeObjectAny;
74
+ declare const isPlainObject: (test: any) => test is TypeAnyObject;
64
75
 
65
76
  declare const isRegExp: (test: any) => test is RegExp;
66
77
 
@@ -140,7 +151,9 @@ declare const uuidv8: (hash?: string) => string;
140
151
 
141
152
  declare const dateFormat: (format: string, date?: Date, utc?: boolean) => string;
142
153
 
143
- declare const dateRange: (start: Date, end: Date) => Array<Date>;
154
+ declare const dateInterval: (start: Date, end: Date, interval?: number) => Array<Date>;
155
+
156
+ declare const dateRange: (start?: string, end?: string) => [Date | null, Date | null];
144
157
 
145
158
  declare const firstDayDate: (date: Date) => Date;
146
159
 
@@ -153,11 +166,11 @@ declare const msToString: (ms: number) => string;
153
166
  declare const parseMs: (str: string) => number;
154
167
 
155
168
  interface IDebounceCallbacks {
156
- cancel: TypeCallbackFunction;
157
- run: TypeCallbackFunction;
169
+ cancel: TypeAnyFunction;
170
+ run: TypeAnyFunction;
158
171
  }
159
172
 
160
- declare const debounce: (callback: TypeCallbackFunction, ms: number) => IDebounceCallbacks;
173
+ declare const debounce: (callback: TypeAnyFunction, ms: number) => IDebounceCallbacks;
161
174
 
162
175
  type EventCallback = (data?: any) => void;
163
176
 
@@ -177,11 +190,11 @@ declare class EventEmitter {
177
190
  type EventList = Array<EventCallback>;
178
191
 
179
192
  interface ILoopCallbacks {
180
- start: TypeCallbackFunction;
181
- stop: TypeCallbackFunction;
193
+ start: TypeAnyFunction;
194
+ stop: TypeAnyFunction;
182
195
  }
183
196
 
184
- declare const loop: (callback: TypeCallbackFunction, ms: number) => ILoopCallbacks;
197
+ declare const loop: (callback: TypeAnyFunction, ms: number) => ILoopCallbacks;
185
198
 
186
199
  declare const isEmpty: (test: string | Array<any>) => boolean;
187
200
 
@@ -223,13 +236,13 @@ declare const lerp: (value1: number, value2: number, amount: number) => number;
223
236
 
224
237
  declare const random: (min: number, max: number) => number;
225
238
 
226
- declare const allowed: (allowed: Array<string>, target: TypeObjectAny) => TypeObjectAny;
239
+ declare const allowed: (allowed: Array<string>, target: TypeAnyObject) => TypeAnyObject;
227
240
 
228
241
  declare const clone: <T>(value: T) => T;
229
242
 
230
- declare const denied: (denied: Array<string>, target: TypeObjectAny) => TypeObjectAny;
243
+ declare const denied: (denied: Array<string>, target: TypeAnyObject) => TypeAnyObject;
231
244
 
232
- declare const merge: (target: TypeObjectAny, ...sources: Array<TypeObjectAny>) => TypeObjectAny;
245
+ declare const merge: (target: TypeAnyObject, ...sources: Array<TypeAnyObject>) => TypeAnyObject;
233
246
 
234
247
  type AsyncQueueTask<T = any> = () => Promise<T>;
235
248
 
@@ -244,7 +257,7 @@ type ForEachCallback<T> = TypeCallback<T, number, Array<T>, void | Promise<void>
244
257
 
245
258
  declare const forEachAsync: <T>(array: Array<T>, callback: ForEachCallback<T>, thisArg?: any) => Promise<void>;
246
259
 
247
- type forEachPageCallback = (index: number, next: TypeCallbackFunction) => void | Promise<void>;
260
+ type forEachPageCallback = (index: number, next: TypeAnyFunction) => void | Promise<void>;
248
261
 
249
262
  declare const forEachPage: (callback: forEachPageCallback) => Promise<void>;
250
263
 
@@ -323,6 +336,8 @@ declare class ValidationKeys {
323
336
  static readonly TYPE: unique symbol;
324
337
  }
325
338
 
339
+ type ValidationFunction<T> = (value: IValidationInput) => T;
340
+
326
341
  declare class ValidationBase<T = any> {
327
342
  [ValidationKeys.NAME]: string;
328
343
  [ValidationKeys.DESCRIPTION]: string;
@@ -336,14 +351,14 @@ declare class ValidationBase<T = any> {
336
351
  constructor(type: string);
337
352
  description(value: string): this;
338
353
  example(value: T): this;
339
- empty(value?: T | TypeCallbackFunction<T>): this;
340
- equal(value: T | IValidationFunction<T>, message?: string): this;
354
+ empty(value?: T | TypeAnyFunction<T>): this;
355
+ equal(value: T | ValidationFunction<T>, message?: string): this;
341
356
  error(value?: string): this;
342
357
  filter(...values: Array<T>): this;
343
- protected fn<T = any>(value: T | TypeCallbackFunction<T>): TypeCallbackFunction<T>;
358
+ protected fn<T = any>(value: T | TypeAnyFunction<T>): TypeAnyFunction<T>;
344
359
  from(value: string): this;
345
360
  protected invalid(error: string, message?: string): IValidationOutput<T>;
346
- model(): string | TypeObjectAny | Array<string | TypeObjectAny>;
361
+ model(): string | TypeAnyObject | Array<string | TypeAnyObject>;
347
362
  parse(): this;
348
363
  push(callback: ValidationCallback<T>): this;
349
364
  required(message?: string): this;
@@ -368,8 +383,6 @@ interface IValidationInput<T = any> extends IValidationOutput<T> {
368
383
  value: T;
369
384
  }
370
385
 
371
- type IValidationFunction<T> = (value: IValidationInput) => T;
372
-
373
386
  declare class ValidationArray extends ValidationBase<Array<any>> {
374
387
  private [ValidationKeys.INDEXES];
375
388
  constructor(message?: string);
@@ -378,7 +391,7 @@ declare class ValidationArray extends ValidationBase<Array<any>> {
378
391
  length(value: number, message?: string): this;
379
392
  max(value: number, message?: string): this;
380
393
  min(value: number, message?: string): this;
381
- model(): string | TypeObjectAny | Array<string | TypeObjectAny>;
394
+ model(): string | TypeAnyObject | Array<string | TypeAnyObject>;
382
395
  toString(): string;
383
396
  }
384
397
 
@@ -402,37 +415,37 @@ declare class ValidationEnum extends ValidationBase<string> {
402
415
 
403
416
  declare class ValidationNumber extends ValidationBase<number> {
404
417
  constructor(message?: string);
405
- between(min: number | TypeCallbackFunction, max: number | TypeCallbackFunction, message?: string): this;
418
+ between(min: number | TypeAnyFunction, max: number | TypeAnyFunction, message?: string): this;
406
419
  float(message?: string): this;
407
420
  integer(message?: string): this;
408
- max(value: number | TypeCallbackFunction, message?: string): this;
409
- min(value: number | TypeCallbackFunction, message?: string): this;
421
+ max(value: number | TypeAnyFunction, message?: string): this;
422
+ min(value: number | TypeAnyFunction, message?: string): this;
410
423
  parse(): this;
411
424
  }
412
425
 
413
- declare class ValidationObject extends ValidationBase<TypeObjectAny> {
426
+ declare class ValidationObject extends ValidationBase<TypeAnyObject> {
414
427
  private [ValidationKeys.KEYS];
415
428
  constructor(message?: string);
416
429
  keys(value?: TypeObject<ValidationBase>, message?: string): this;
417
- model(): string | TypeObjectAny | Array<string | TypeObjectAny>;
430
+ model(): string | TypeAnyObject | Array<string | TypeAnyObject>;
418
431
  parse(message?: string): this;
419
432
  toString(): string;
420
433
  }
421
434
 
422
435
  declare class ValidationString extends ValidationBase<string> {
423
436
  constructor(message?: string);
424
- between<T extends number>(min: T | IValidationFunction<T>, max: number | IValidationFunction<T>, message?: string): this;
437
+ between<T extends number>(min: T | ValidationFunction<T>, max: number | ValidationFunction<T>, message?: string): this;
425
438
  email(message?: string): this;
426
- length<T extends number>(value: T | IValidationFunction<T>, message?: string): this;
439
+ length<T extends number>(value: T | ValidationFunction<T>, message?: string): this;
427
440
  lowerCase(): this;
428
441
  lowerCamelCase(): this;
429
- max<T extends number>(value: T | IValidationFunction<T>, message?: string): this;
430
- mask<T extends string>(value: T | IValidationFunction<T>): this;
431
- min<T extends number>(value: T | IValidationFunction<T>, message?: string): this;
442
+ max<T extends number>(value: T | ValidationFunction<T>, message?: string): this;
443
+ mask<T extends string>(value: T | ValidationFunction<T>): this;
444
+ min<T extends number>(value: T | ValidationFunction<T>, message?: string): this;
432
445
  parse(): this;
433
446
  required(message?: string): this;
434
447
  regex(regex: RegExp, message?: string): this;
435
- replace<T extends string>(value: T | RegExp | IValidationFunction<T>, text: string): this;
448
+ replace<T extends string>(value: T | RegExp | ValidationFunction<T>, text: string): this;
436
449
  trim(): this;
437
450
  upperCase(): this;
438
451
  upperCamelCase(): this;
@@ -445,7 +458,7 @@ declare class Validation {
445
458
  static enum(value?: Array<any>, message?: string): ValidationEnum;
446
459
  static number(message?: string): ValidationNumber;
447
460
  static object(value?: TypeObject<ValidationBase>, message?: string): ValidationObject;
448
- static ref(ref: string | number, value?: any): TypeCallbackFunction;
461
+ static ref(ref: string | number, value?: any): TypeAnyFunction;
449
462
  static string(message?: string): ValidationString;
450
463
  test(value?: any, ...rules: Array<ValidationBase>): boolean;
451
464
  testAsync(value?: any, ...rules: Array<ValidationBase>): Promise<boolean>;
@@ -455,5 +468,5 @@ declare class Validation {
455
468
 
456
469
  type ValidationCallbackAsync<T = any> = (value: IValidationInput<T>) => Promise<IValidationOutput<T>>;
457
470
 
458
- export { AsyncQueue, EventEmitter, Hash, RandomString, Validation, ValidationBase, ValidationKeys, allowed, cache, camelCase, chunkArray, clamp, clone, colorPalette, compareArray, countArray, cutText, dateFormat, dateRange, debounce, decodeHTML, denied, each, encodeHTML, firstDayDate, forEachAsync, forEachIndex, forEachKey, forEachPage, forEachSeries, forLoop, hexToRgb, hslToRgb, inArray, includesArray, isArray, isBoolean, isCharacter, isDate, isDef, isDigit, isEmpty, isFalse, isFloat, isFunction, isInteger, isLetter, isMap, isNotEmpty, isNull, isNumber, isObject, isPlainObject, isRegExp, isScalar, isSet, isSpecialChar, isString, isSymbol, isTrue, isUndefined, isValidDate, lastDayDate, lerp, loop, lowerCamelCase, map, mask, maskMoney, maskReverse, maskTest, merge, msToString, noop, parseMs, parseSize, random, randomCase, randomElement, rangeArray, rgbToHex, rgbToHsl, shadeColor, shuffleArray, shuffleString, sleep, stringReverse, tintColor, toArray, toBool, type, uniqueArray, uniqueID, upperCamelCase, uuidv1, uuidv1ToTimestamp, uuidv4, uuidv7, uuidv7ToTimestamp, uuidv8 };
459
- export type { AsyncQueueTask, CacheCallback, EachCallback, EachValue, EventCallback, EventList, ForEachCallback, IDebounceCallbacks, IEventDisposable, ILoopCallbacks, IValidationFunction, IValidationInput, IValidationOutput, TypeAnyFunction, TypeArray, TypeArrayAny, TypeArrayFunction, TypeArrayNumber, TypeArrayString, TypeCallback, TypeCallbackArray, TypeCallbackFunction, TypeCallbackMap, TypeCallbackObject, TypeKey, TypeNullable, TypeObject, TypeObjectAny, TypeObjectBoolean, TypeObjectFunction, TypeObjectKeys, TypeObjectKeysFunction, TypeObjectNullable, TypeObjectNumber, TypeObjectString, TypeScalar, ValidationCallback, ValidationCallbackAsync, forEachPageCallback };
471
+ export { AsyncQueue, EventEmitter, Hash, RandomString, Validation, ValidationBase, ValidationKeys, allowed, cache, camelCase, chunkArray, clamp, clone, colorPalette, compareArray, countArray, cutText, dateFormat, dateInterval, dateRange, debounce, decodeHTML, denied, each, encodeHTML, firstDayDate, forEachAsync, forEachIndex, forEachKey, forEachPage, forEachSeries, forLoop, hexToRgb, hslToRgb, inArray, includesArray, isArray, isBoolean, isCharacter, isDate, isDef, isDigit, isEmpty, isFalse, isFloat, isFunction, isInteger, isLetter, isMap, isNotEmpty, isNull, isNumber, isObject, isPlainObject, isRegExp, isScalar, isSet, isSpecialChar, isString, isSymbol, isTrue, isUndefined, isValidDate, lastDayDate, lerp, loop, lowerCamelCase, map, mask, maskMoney, maskReverse, maskTest, merge, msToString, noop, parseMs, parseSize, random, randomCase, randomElement, rangeArray, rgbToHex, rgbToHsl, shadeColor, shuffleArray, shuffleString, sleep, stringReverse, tintColor, toArray, toBool, type, uniqueArray, uniqueID, upperCamelCase, uuidv1, uuidv1ToTimestamp, uuidv4, uuidv7, uuidv7ToTimestamp, uuidv8 };
472
+ export type { AsyncQueueTask, CacheCallback, EachCallback, EachValue, EventCallback, EventList, ForEachCallback, IDebounceCallbacks, IEventDisposable, ILoopCallbacks, IValidationInput, IValidationOutput, TypeAnyArray, TypeAnyConstructor, TypeAnyFunction, TypeAnyObject, TypeArray, TypeArrayAny, TypeArrayFunction, TypeArrayNumber, TypeArrayString, TypeCallback, TypeCallbackArray, TypeCallbackFunction, TypeCallbackMap, TypeCallbackObject, TypeKey, TypeNullable, TypeObject, TypeObjectAny, TypeObjectBoolean, TypeObjectFunction, TypeObjectKeys, TypeObjectKeysFunction, TypeObjectNullable, TypeObjectNumber, TypeObjectString, TypeSatisfies, TypeScalar, TypeUndefined, ValidationCallback, ValidationCallbackAsync, ValidationFunction, forEachPageCallback, typeObjectSatisfies };
package/dist/index.esm.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @andrewcaires/utils.js v0.4.13
2
+ * @andrewcaires/utils.js v0.4.15
3
3
  * JavaScript utility library for web and nodejs development
4
4
  * (c) 2025 Andrew Caires
5
5
  * @license: MIT
6
6
  */
7
- const t=(t,e)=>{const s=[];for(let r=0;r<t.length;r+=e)s.push(t.slice(r,r+e));return s},e=(t,e)=>t.length===e.length&&t.every((t,s)=>t===e[s]),s=t=>{const e={};return t.forEach(t=>{const s=t.toString();e[s]=(e[s]||0)+1}),e},r=(t,e)=>-1!=e.indexOf(t),n=(t,e)=>t.every(t=>e.includes(t)),i=(t,e,s)=>Math.max(e,Math.min(s,t)),a=(t,e,s)=>t+(e-t)*i(s,0,1),u=(t,e)=>Math.floor(Math.random()*(e-t+1)+t),l=t=>t.length?t[u(0,t.length-1)]:null,h=(t,e,s=1)=>Array.from({length:(e-t)/s+1},(e,r)=>t+r*s),o=t=>{for(let e=t.length-1;e>0;e--){const s=u(0,e);[t[e],t[s]]=[t[s],t[e]]}return t},c={},p=t=>null==t?"null":c[c.toString.call(t)]||"object";["Array","AsyncFunction","Boolean","Date","Function","Map","Number","Object","RegExp","Set","String"].forEach(t=>c["[object "+t+"]"]=t.toLowerCase());const v=t=>"array"==p(t),m=t=>"boolean"==p(t),g=t=>"date"==p(t),d=t=>"null"!=p(t),f=t=>"number"==p(t),S=t=>f(t)&&!!(t%1),y=t=>"function"==typeof t,x=t=>f(t)&&!(t%1),E=t=>"map"==p(t),w=t=>null===t,b=t=>"object"==p(t),I=t=>b(t)&&t.constructor===Object,M=t=>"regexp"==p(t),C=["boolean","number","string"],O=t=>-1!=C.indexOf(p(t)),R=t=>"set"==p(t),T=t=>"string"==typeof t,D=t=>"symbol"==typeof t,A=t=>void 0===t,j=t=>v(t)?t:d(t)?[t]:[],k=t=>t.filter((t,e,s)=>s.indexOf(t)===e),N=[1,"1",!0,"true"],Y=t=>-1!=N.indexOf(t),U=()=>{const t=[],e=[];return s=>{let r=t.indexOf(s);return-1==r&&(t.push(s),e.push({}),r=e.length-1),e[r]}},P=(t,e,s)=>{for(let r=0;r<t.length&&!1!==e.call(s,t[r],r,t);r++);return t},L=(t,e,s)=>{let r="";const n=Object.keys(t);for(let i=0;i<n.length&&(r=n[i],!1!==e.call(s,t[r],r,t));i++);return t},$=(t,e,s)=>v(t)?P(t,e,s):b(t)?L(t,e,s):t,q=(t,e,s)=>{for(let r=1;r<=t&&!1!==e.call(s,r,t);r++);return t},F=(t,e,s)=>Object.fromEntries(Object.entries(t).map(([r,n])=>[r,e.call(s,n,r,t)])),X=t=>parseInt(t??"0",16)||0,_=t=>t.replace(/^#/,"").match(/.{1,2}/g)?.map(X)||[],K=t=>("0"+t.toString(16)).slice(-2),H=(t,e,s)=>"#"+K(t)+K(e)+K(s),Q=(t,e)=>{const s=_(t);e=i(e,0,1);const[r,n,a]=s.map(t=>Math.round(t*e));return H(r,n,a)},J=(t,e)=>{const s=_(t);e=i(e,0,1);const[r,n,a]=s.map(t=>Math.round(t+(255-t)*e));return H(r,n,a)},Z={50:.95,100:.9,200:.75,300:.6,400:.3,500:0,600:-.1,700:-.25,800:-.4,900:-.55,950:-.71},z=(t,e)=>F(e??Z,e=>0==e?t:e>0?J(t,e):Q(t,1- -1*e)),B=(t,e,s)=>{t/=60;const r=(1-Math.abs(2*s-1))*e,n=r*(1-Math.abs(t%2-1));let i=[0,0,0];t<=1?i=[r,n,0]:t<=2?i=[n,r,0]:t<=3?i=[0,r,n]:t<=4?i=[0,n,r]:t<=5?i=[n,0,r]:t<=6&&(i=[r,0,n]);const a=s-.5*r;return[Math.round(255*(i[0]+a)),Math.round(255*(i[1]+a)),Math.round(255*(i[2]+a))]},W=(t,e,s,r,n)=>0===t?0:e===s?(r-n)/t%6:e===r?(n-s)/t+2:e===n?(s-r)/t+4:0,G=(t,e)=>0===t?0:t/(1-Math.abs(2*e-1)),V=(t,e,s)=>{const[r,n,i]=((...t)=>t.map(t=>t/255))(t,e,s),a=Math.max(r,n,i),u=Math.min(r,n,i),l=a-u,h=(u+a)/2;return[60*W(l,a,r,n,i),G(l,h),h]};class tt{constructor(t){this.key=this.shuffle(tt.dictionary,t,!1)}encrypt(t){return this.shuffle(t,this.key,!1)}decrypt(t){return this.shuffle(t,this.key,!0)}index(t,e,s){return[tt.dictionary.indexOf(t[s]),tt.dictionary.indexOf(e[s%e.length])]}result(t,e,s){return tt.dictionary[(s?t-e+tt.dictionary.length:t+e)%tt.dictionary.length]}shuffle(t,e,s){let r="";for(let n=0;n<t.length;n++){const[i,a]=this.index(t,e,n);r+=-1===i||-1===a?t[n]:this.result(i,a,s)}return r}static hex(t){let e=0;for(let s=0;s<t.length;s++)e=16777619*(e^t.charCodeAt(s));return(e>>>0).toString(16).padStart(8,"0")}}tt.dictionary="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";const et=(t=64)=>Array(Math.ceil(t/2)).fill(0).map(()=>u(0,255).toString(16).padStart(2,"0")).join("").slice(0,t),st=()=>{const t=1e4*(Date.now()+122192928e5),e=(4294967295&t)>>>0,s=(t/4294967296&65535)>>>0,r=(t/281474976710656&4095)>>>0,n=u(0,e),i=(t,e)=>t.toString(16).padStart(e,"0");return[i(e,8),i(s,4),i(4096|r,4),i(n>>8&63|128,2)+i(255&n,2),et(12)].join("-")},rt=t=>{const e=t.replace(/-/g,""),s=parseInt(e.slice(0,8),16),r=parseInt(e.slice(8,12),16),n=(4095&parseInt(e.slice(12,16),16))*Math.pow(2,48)+r*Math.pow(2,32)+s;return Math.floor((n-122192928e9)/1e4)},nt=()=>{const t=[];t.push(...Array(16).fill(0).map(()=>u(0,255))),t[6]=15&t[6]|64;const e=t.map(t=>t.toString(16).padStart(2,"0")).join("");return[e.slice(0,8),e.slice(8,12),e.slice(12,16),e.slice(16,20),e.slice(20)].join("-")},it=()=>{const t=Date.now(),e=[];e[0]=t/2**40&255,e[1]=t/2**32&255,e[2]=t>>>24&255,e[3]=t>>>16&255,e[4]=t>>>8&255,e[5]=255&t,e.push(...Array(10).fill(0).map(()=>u(0,255))),e[6]=15&e[6]|112,e[8]=63&e[8]|128;const s=e.map(t=>t.toString(16).padStart(2,"0")).join("");return[s.slice(0,8),s.slice(8,12),s.slice(12,16),s.slice(16,20),s.slice(20)].join("-")},at=t=>parseInt(t.replace(/-/g,"").slice(0,12),16),ut=t=>{const e=Date.now(),s=[];s[0]=e/2**40&255,s[1]=e/2**32&255,s[2]=e>>>24&255,s[3]=e>>>16&255,s[4]=e>>>8&255,s[5]=255&e,s.push(...Array(8).fill(0).map(()=>u(0,255))),s[6]=15&s[6]|128,s[8]=63&s[8]|128;const r=s.map(t=>t.toString(16).padStart(2,"0")).join("");return[r.slice(0,8),r.slice(8,12),r.slice(12,16),tt.hex(t??"").slice(4),r.slice(16)].join("-")},lt=t=>("0"+t.toString()).slice(-2),ht={"%y":(t,e)=>lt(e?t.getUTCFullYear():t.getFullYear()),"%Y":(t,e)=>(e?t.getUTCFullYear():t.getFullYear()).toString(),"%m":(t,e)=>lt((e?t.getUTCMonth():t.getMonth())+1),"%d":(t,e)=>lt(e?t.getUTCDate():t.getDate()),"%H":(t,e)=>lt(e?t.getUTCHours():t.getHours()),"%M":(t,e)=>lt(e?t.getUTCMinutes():t.getMinutes()),"%S":(t,e)=>lt(e?t.getUTCSeconds():t.getSeconds())},ot=(t,e,s)=>(e=e??new Date,t.replace(/%[yYmdHMS]/g,t=>ht[t]?ht[t](e,s):t.slice(1))),ct=(t,e)=>{const s=new Date(t),r=[];for(;t<e;)s.setDate(s.getDate()+1),r.push(new Date(s));return r},pt=t=>new Date(t.getFullYear(),t.getMonth(),1,t.getHours(),t.getMinutes(),t.getSeconds()),vt=t=>{const e=new Date(t);return e.getTime()==e.getTime()&&t==e.toISOString().slice(0,10)},mt=t=>new Date(t.getFullYear(),t.getMonth()+1,0,t.getHours(),t.getMinutes(),t.getSeconds()),gt=36e5,dt=24*gt,ft={ms:1,s:1e3,m:6e4,h:gt,d:dt,w:7*dt,y:315576e5},St=["y","d","h","m","s","ms"],yt=t=>{const e=[];return St.forEach(s=>{const r=ft[s],n=(t-t%r)/r;n&&(t-=n*r,e.push(n.toString()+s))}),e.join(" ")},xt=t=>{const e=/(-?(?:\d+)?\.?\d+) *(ms|s|m|h|d|w|y)/gm;let s,r=0;for(;null!==(s=e.exec(t));)s.index===e.lastIndex&&e.lastIndex++,r+=parseFloat(s[1])*ft[s[2]]||0;return r},Et=(t,e)=>{let s;const r=()=>{s&&clearTimeout(s)};return{cancel:r,run(...n){r(),s=setTimeout(()=>t(...n),e)}}};class wt{constructor(){this.events=new Map}on(t,e){const s=this.events.get(t);return s?s.push(e):this.events.set(t,[e]),{dispose:()=>this.off(t,e)}}once(t,e){const s=r=>{e(r),this.off(t,s)};return this.on(t,s),{dispose:()=>this.off(t,s)}}off(t,e){const s=this.events.get(t);if(e){if(s){const t=s.indexOf(e);t>=0&&s.splice(t,1)}}else this.events.set(t,[])}emit(t,e){const s=this.events.get(t);s&&s.forEach(t=>t(e))}}const bt=(t,e)=>{let s=!1;const r=async()=>{s&&(await t(),setTimeout(r,e))};return{start(){s||(s=!0,r())},stop(){s=!1}}},It=t=>0==(t?.length??0),Mt=["",0,"0",null,!1,void 0],Ct=t=>-1==Mt.indexOf(t),Ot=t=>!Ct(t),Rt=t=>!It(t),Tt=()=>{},Dt=(t,e,s)=>e(t.toLowerCase().replace(/\W+/g," ")).replace(/\s/g,s??""),At=(t,e)=>Dt(t,t=>t.replace(/\s(\w)/g,t=>t.toUpperCase()),e),jt=At,kt=(t,e)=>{if(t.length>e){const s=t.substring(0,e).split(" ");return s.pop(),s.join(" ")+"..."}return t},Nt=/&(amp|apos|lt|gt|nbsp|quot);/g,Yt={amp:"&",apos:"'",lt:"<",gt:">",nbsp:" ",quot:'"'},Ut=t=>t.replace(Nt,(t,e)=>Yt[e]).replace(/&#(\d+);/gi,(t,e)=>String.fromCharCode(parseInt(e,10))),Pt=t=>t.replace(/[^0-9A-Za-z ]/g,t=>"&#"+t.charCodeAt(0)+";"),Lt=t=>/^[\w]$/.test(t),$t=t=>/^[\d]$/.test(t),qt=t=>/^[A-Za-z]$/.test(t),Ft=t=>/^[^\w]$/.test(t),Xt=t=>{if(f(t))return t+"px";const e=(t=>/(-?(?:\d+)?\.?\d+) *(px|%|cm|mm|in|pt|pc|en|ex|ch|rem|vw|vh|vmin|vmax)*/g.exec(t))(t);return e?parseFloat(e[1])+(e[2]||"px"):"0px"},_t=t=>t.split("").map(t=>Math.random()<.5?t.toUpperCase():t.toLowerCase()).join(""),Kt=t=>o(t.split("")).join("");class Ht{constructor(){this.hasSpace=!1,this._space=" ",this.hasNumbers=!1,this._numbers="0123456789",this.hasSymbols=!1,this._symbols="!@#$%^&*()<>.<~:;?+=-_",this.hasUpper=!1,this._upper="ABCDEFGHIJKLMNOPQRSTUVWXYZ",this.hasLower=!1,this._lower="abcdefghijklmnopqrstuvwxyz",this.hasChars=!1,this._chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"}chars(){return this.hasChars=!0,this}static chars(){return(new Ht).chars()}lower(){return this.hasLower=!0,this}static lower(){return(new Ht).lower()}make(t){let e="";this.hasSpace&&(e+=this._space),this.hasNumbers&&(e+=this._numbers),this.hasSymbols&&(e+=this._symbols),this.hasUpper&&!this.hasChars&&(e+=this._upper),this.hasLower&&!this.hasChars&&(e+=this._lower),this.hasChars&&(e+=this._chars);let s="";if(t&&e.length){e=Kt(e);for(let r=0;r<t;r++)s+=e.charAt(u(0,e.length-1))}return s}numbers(){return this.hasNumbers=!0,this}static numbers(){return(new Ht).numbers()}space(){return this.hasSpace=!0,this}static space(){return(new Ht).space()}symbols(){return this.hasSymbols=!0,this}static symbols(){return(new Ht).symbols()}upper(){return this.hasUpper=!0,this}static upper(){return(new Ht).upper()}}const Qt=t=>t.split("").reverse().join(""),Jt=(t,e)=>Dt(t,t=>t.replace(/(\w)(\w*)/g,(t,e,s)=>e.toUpperCase()+s),e),Zt=(t,e)=>e(t.value)?t.value:(t=>(t.maskIndex--,""))(t),zt={"#":t=>t.value,0:t=>Zt(t,$t),9:t=>Zt(t,$t),A:t=>Zt(t,qt),Z:t=>Zt(t,qt),L:t=>Zt(t,qt).toLowerCase(),U:t=>Zt(t,qt).toUpperCase(),S:t=>Zt(t,Ft)},Bt=t=>{t.maskIndex++,t.textIndex++;const{mask:e,maskIndex:s,text:r,textIndex:n}=t;t.key=e[s],t.value=r[n];const{key:i,value:a}=t;return A(i)||A(a)?"":(t=>zt[t.key]?zt[t.key](t):(t.key!=t.value&&t.textIndex--,t.key))(t)+Bt(t)},Wt=(t,e)=>Bt({mask:t,maskIndex:-1,text:e,textIndex:-1,key:"",value:""}),Gt=(t,e)=>Qt(Wt(Qt(t),Qt(e))),Vt=(t,e,s)=>(s++,e=parseInt((e||"0").replace(/\D/g,"")).toString(),Gt(t,e.length<s?("0".repeat(s)+e).slice(-1*s):e)),te=(t,e)=>t.length==Wt(t,e).length,ee=(t,e)=>t.reduce((t,s)=>({...t,[s]:e[s]}),{}),se=t=>t instanceof Date?new Date(t.getTime()):v(t)?t.map(t=>se(t)):b(t)?F(t,t=>se(t)):t,re=(t,e)=>ee(Object.keys(e).filter(e=>-1==t.indexOf(e)),e),ne=(t,...e)=>{if(!e.length)return t;const s=e.shift();if(I(t)&&I(s))for(const e in s)I(s[e])?(t[e]||(t={...t,[e]:{}}),t[e]=ne(t[e],s[e])):t={...t,[e]:s[e]};return ne(t,...e)};class ie{constructor(){this.running=!1,this.queue=[]}push(t){return new Promise((e,s)=>{this.queue.push(async()=>{try{const s=await t();e(s)}catch(t){s(t)}}),this.run()})}async run(){if(!this.running){for(this.running=!0;this.queue.length>0;){const t=this.queue.shift();t&&await t()}this.running=!1}}}const ae=async(t,e,s)=>{await Promise.allSettled(t.map((r,n)=>e.call(s,r,n,t)?.catch(Tt))).catch(Tt)},ue=async t=>{let e=!0;const s=()=>e=!0;let r=1;for(;e;)e=!1,await(t(r,s)?.catch(Tt)),r+=1},le=async(t,e,s)=>{for(let r=0;r<t.length;r++)await(e.call(s,t[r],r,t)?.catch(Tt))},he=t=>new Promise(e=>setTimeout(e,t));class oe{}var ce,pe,ve,me,ge,de,fe,Se,ye;oe.DESCRIPTION=Symbol("DESCRIPTION"),oe.ERROR=Symbol("ERROR"),oe.EXAMPLE=Symbol("EXAMPLE"),oe.INDEXES=Symbol("INDEXES"),oe.KEYS=Symbol("KEYS"),oe.LIST=Symbol("LIST"),oe.NAME=Symbol("NAME"),oe.REQUIRED=Symbol("REQUIRED"),oe.SOURCE=Symbol("SOURCE"),oe.TYPE=Symbol("TYPE");class xe{constructor(t){this[ce]="",this[pe]="",this[ve]=null,this[me]="",this[ge]="any",this[de]=!1,this.rules=[],this.custom=[],this[oe.TYPE]=t}description(t){return this[oe.DESCRIPTION]=t,this}example(t){return this[oe.EXAMPLE]=t,this}empty(t){const e=t;return this.unshift(({value:t})=>{const s=d(t);return{break:!d(e)&&!s,value:s?t:y(e)?e():e}})}equal(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t==n?{value:t}:this.invalid(`.equal(${n})`,e)})}error(t){return T(t)&&(this[oe.ERROR]=t),this}filter(...t){const e=t;return this.unshift(({value:t})=>{const s=-1==e.indexOf(t);return{break:!s,value:s?t:void 0}})}fn(t){return y(t)?t:()=>t}from(t){return this[oe.SOURCE]=t,this}invalid(t,e){return t=`[${this[oe.TYPE]}]${t}`,{error:this[oe.ERROR]?this[oe.ERROR]:this[oe.NAME]?this[oe.NAME]+":"+t:t,message:e}}model(){return this.toString()}parse(){return this.unshift(({value:t})=>({value:t}))}push(t){return this.rules.push(t),this}required(t){return this[oe.REQUIRED]=!0,this.unshift(({value:e})=>d(e)?{value:e}:this.invalid(".required",t))}test(t){return!T(this.validate(t).error)}async testAsync(t){return!T((await this.validateAsync(t)).error)}toString(){return this[oe.TYPE]}unshift(t){return this.rules.unshift(t),this}validate(t,e){if(this.custom.length)return this.invalid("[async]");let s={value:t};for(let t=0;t<this.rules.length;t++){if(s=this.rules[t]({value:s.value,context:e}),s.error?.length)return{error:s.error,...s.message?{message:s.message}:{}};if(s.break)return{value:s.value}}return{value:s.value}}async validateAsync(t,e){let s=this.validate(t,e);if(s.error)return{error:s.error};for(let t=0;t<this.custom.length;t++){if(s=await this.custom[t]({value:s.value}),s.error)return{error:s.error};if(s.break)return{value:s.value}}return{value:s.value}}}ce=oe.NAME,pe=oe.DESCRIPTION,ve=oe.EXAMPLE,oe.SOURCE,me=oe.ERROR,ge=oe.TYPE,de=oe.REQUIRED;class Ee extends xe{constructor(t){super("array"),this[fe]=[],this.push(({value:e})=>v(e)?{value:e}:this.invalid("",t))}between(t,e,s){return this.min(t,s),this.max(e,s)}items(t,e){const s=t;return s&&this[oe.INDEXES].push(s),s?this.push(({value:t})=>{const r=[];s[oe.NAME]="";for(let n=0;n<t.length;n++){const{error:i,value:a}=s.validate(t[n],t);if(i)return this.invalid("< "+i+"["+n+"] >",e);r[n]=a}return{value:r}}):this}length(t,e){const s=t;return this.push(({value:t})=>t.length==s?{value:t}:this.invalid(".length("+s+")",e))}max(t,e){const s=t;return this.push(({value:t})=>t.length<=s?{value:t}:this.invalid(".max("+s+")",e))}min(t,e){const s=t;return this.push(({value:t})=>t.length>=s?{value:t}:this.invalid(".min("+s+")",e))}model(){return this[oe.INDEXES].length?this[oe.INDEXES].map(t=>t.model()):this[oe.TYPE]}toString(){return this[oe.INDEXES].length?JSON.stringify(this.model(),null,4):this[oe.TYPE]}}fe=oe.INDEXES;class we extends xe{constructor(t){super("boolean"),this.push(({value:e})=>m(e)?{value:e}:this.invalid("",t))}parse(){return this.unshift(({value:t})=>({value:d(t)?Y(t):t}))}}class be extends xe{constructor(t){super("date"),this.push(({value:e})=>T(e)&&vt(e)||!isNaN(new Date(e).getTime())?{value:e}:this.invalid("",t))}format(t){const e=t;return this.push(({value:t})=>({value:ot(e,new Date(t))}))}parse(){return this.unshift(({value:t})=>({value:new Date(t)}))}}class Ie extends xe{constructor(t){super("enum"),this[Se]=[],this.push(({value:e})=>d(e)?{value:e}:this.invalid(`('${this[oe.LIST].join("', '")}')`,t))}list(t,e){const s=t;return s&&this[oe.LIST].push(...s),s?this.push(({value:t})=>-1!=this[oe.LIST].indexOf(t)?{value:t}:this.invalid(`('${this[oe.LIST].join("', '")}')`,e)):this}toString(){return`${this[oe.TYPE]}('${this[oe.LIST].join("', '")}')`}}Se=oe.LIST;class Me extends xe{constructor(t){super("number"),this.push(({value:e})=>f(e)?{value:e}:this.invalid("",t))}between(t,e,s){return this.min(t,s),this.max(e,s)}float(t){return this.push(({value:e})=>S(e)?{value:e}:this.invalid(".float",t))}integer(t){return this.push(({value:e})=>x(e)?{value:e}:this.invalid(".integer",t))}max(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t<=n?{value:t}:this.invalid(`.max(${n})`,e)})}min(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t>=n?{value:t}:this.invalid(`.min(${n})`,e)})}parse(){return this.unshift(({value:t})=>({value:d(t)?parseFloat(t.toString()):t}))}}class Ce extends xe{constructor(t){super("object"),this[ye]={},this.push(({value:e})=>b(e)?{value:e}:this.invalid("",t))}keys(t,e){const s=t;return s&&(this[oe.KEYS]={...this[oe.KEYS],...s}),s?this.push(({value:t})=>{const r=[],n={};return Object.keys(s).forEach(i=>{const a=s[i];a[oe.NAME]=a[oe.SOURCE]??i;const{error:u,message:l,value:h}=a.validate(t[a[oe.NAME]],n);!e&&l&&(e=l),u&&r.push(u),d(h)&&(n[i]=h)}),r.length?this.invalid("{ "+r.join(", ")+" }",e):{value:n}}):this}model(){const t={},e=Object.keys(this[oe.KEYS]);return e.length&&e.forEach(e=>t[e]=this[oe.KEYS][e].model()),e.length?t:this[oe.TYPE]}parse(t){return this.unshift(({value:e})=>{if(!b(e))try{e=JSON.parse(e)}catch(e){return this.invalid("",t)}return{value:e}})}toString(){return Object.keys(this[oe.KEYS]).length?JSON.stringify(this.model(),null,4):this[oe.TYPE]}}ye=oe.KEYS;class Oe extends xe{constructor(t){super("string"),this.push(({value:e})=>T(e)?{value:e}:this.invalid("",t))}between(t,e,s){return this.min(t,s),this.max(e,s)}email(t){const e=/^[\w-\\.]+@([\w-]+\.)+[\w-]{2,4}$/i;return this.push(({value:s})=>e.test(s)?{value:s}:this.invalid(".email",t))}length(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t.length==n?{value:t}:this.invalid(`.length(${n})`,e)})}lowerCase(){return this.push(({value:t})=>({value:t.toLowerCase()}))}lowerCamelCase(){return this.push(({value:t})=>({value:At(t)}))}max(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t.length<=n?{value:t}:this.invalid(`.max(${n})`,e)})}mask(t){const e=this.fn(t);return this.push(({value:t,context:s})=>({value:Wt(e({value:t,context:s}),t)}))}min(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t.length>=n?{value:t}:this.invalid(`.min(${n})`,e)})}parse(){return this.unshift(({value:t})=>({value:b(t)?JSON.stringify(t):d(t)?t.toString():t}))}required(t){return this[oe.REQUIRED]=!0,this.push(({value:e})=>e.length?{value:e}:this.invalid(".required",t))}regex(t,e){return this.push(({value:s})=>t.test(s)?{value:s}:this.invalid(".regex",e))}replace(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>({value:t.replace(s({value:t,context:r}),e)}))}trim(){return this.push(({value:t})=>({value:t.trim()}))}upperCase(){return this.push(({value:t})=>({value:t.toUpperCase()}))}upperCamelCase(){return this.push(({value:t})=>({value:Jt(t)}))}}class Re{static array(t,e){return new Ee(e).items(t)}static boolean(t){return new we(t)}static date(t){return new be(t)}static enum(t,e){return new Ie(e).list(t)}static number(t){return new Me(t)}static object(t,e){return new Ce(e).keys(t)}static ref(t,e){return({context:s})=>s&&d(s[t])?s[t]:e}static string(t){return new Oe(t)}test(t,...e){return!T(Re.validate(t,...e).error)}async testAsync(t,...e){return!T((await Re.validateAsync(t,...e)).error)}static validate(t,...e){let s={value:t};for(let t=0;t<e.length;t++)if(s=e[t].validate(s.value),s.error)return{value:s.value,error:s.error};return{value:s.value}}static async validateAsync(t,...e){let s={value:t};for(let t=0;t<e.length;t++)if(s=await e[t].validateAsync(s.value),s.error)return{value:s.value,error:s.error};return{value:s.value}}}export{ie as AsyncQueue,wt as EventEmitter,tt as Hash,Ht as RandomString,Re as Validation,xe as ValidationBase,oe as ValidationKeys,ee as allowed,U as cache,jt as camelCase,t as chunkArray,i as clamp,se as clone,z as colorPalette,e as compareArray,s as countArray,kt as cutText,ot as dateFormat,ct as dateRange,Et as debounce,Ut as decodeHTML,re as denied,$ as each,Pt as encodeHTML,pt as firstDayDate,ae as forEachAsync,P as forEachIndex,L as forEachKey,ue as forEachPage,le as forEachSeries,q as forLoop,_ as hexToRgb,B as hslToRgb,r as inArray,n as includesArray,v as isArray,m as isBoolean,Lt as isCharacter,g as isDate,d as isDef,$t as isDigit,It as isEmpty,Ot as isFalse,S as isFloat,y as isFunction,x as isInteger,qt as isLetter,E as isMap,Rt as isNotEmpty,w as isNull,f as isNumber,b as isObject,I as isPlainObject,M as isRegExp,O as isScalar,R as isSet,Ft as isSpecialChar,T as isString,D as isSymbol,Ct as isTrue,A as isUndefined,vt as isValidDate,mt as lastDayDate,a as lerp,bt as loop,At as lowerCamelCase,F as map,Wt as mask,Vt as maskMoney,Gt as maskReverse,te as maskTest,ne as merge,yt as msToString,Tt as noop,xt as parseMs,Xt as parseSize,u as random,_t as randomCase,l as randomElement,h as rangeArray,H as rgbToHex,V as rgbToHsl,Q as shadeColor,o as shuffleArray,Kt as shuffleString,he as sleep,Qt as stringReverse,J as tintColor,j as toArray,Y as toBool,p as type,k as uniqueArray,et as uniqueID,Jt as upperCamelCase,st as uuidv1,rt as uuidv1ToTimestamp,nt as uuidv4,it as uuidv7,at as uuidv7ToTimestamp,ut as uuidv8};
7
+ const t=(t,e)=>{const s=[];for(let r=0;r<t.length;r+=e)s.push(t.slice(r,r+e));return s},e=(t,e)=>t.length===e.length&&t.every((t,s)=>t===e[s]),s=t=>{const e={};return t.forEach(t=>{const s=t.toString();e[s]=(e[s]||0)+1}),e},r=(t,e)=>-1!=e.indexOf(t),n=(t,e)=>t.every(t=>e.includes(t)),i=(t,e,s)=>Math.max(e,Math.min(s,t)),a=(t,e,s)=>t+(e-t)*i(s,0,1),l=(t,e)=>Math.floor(Math.random()*(e-t+1)+t),u=t=>t.length?t[l(0,t.length-1)]:null,h=(t,e,s=1)=>Array.from({length:(e-t)/s+1},(e,r)=>t+r*s),o=t=>{for(let e=t.length-1;e>0;e--){const s=l(0,e);[t[e],t[s]]=[t[s],t[e]]}return t},c={},p=t=>null==t?"null":c[c.toString.call(t)]||"object";["Array","AsyncFunction","Boolean","Date","Function","Map","Number","Object","RegExp","Set","String"].forEach(t=>c["[object "+t+"]"]=t.toLowerCase());const v=t=>"array"==p(t),g=t=>"boolean"==p(t),m=t=>"date"==p(t),d=t=>"null"!=p(t),f=t=>"number"==p(t),S=t=>f(t)&&!!(t%1),y=t=>"function"==typeof t,x=t=>f(t)&&!(t%1),E=t=>"map"==p(t),w=t=>null===t,b=t=>"object"==p(t),I=t=>b(t)&&t.constructor===Object,M=t=>"regexp"==p(t),O=["boolean","number","string"],C=t=>-1!=O.indexOf(p(t)),T=t=>"set"==p(t),R=t=>"string"==typeof t,D=t=>"symbol"==typeof t,A=t=>void 0===t,j=t=>v(t)?t:d(t)?[t]:[],k=t=>t.filter((t,e,s)=>s.indexOf(t)===e),N=[1,"1",!0,"true"],Y=t=>-1!=N.indexOf(t),U=()=>{const t=[],e=[];return s=>{let r=t.indexOf(s);return-1==r&&(t.push(s),e.push({}),r=e.length-1),e[r]}},P=(t,e,s)=>{for(let r=0;r<t.length&&!1!==e.call(s,t[r],r,t);r++);return t},$=(t,e,s)=>{let r="";const n=Object.keys(t);for(let i=0;i<n.length&&(r=n[i],!1!==e.call(s,t[r],r,t));i++);return t},L=(t,e,s)=>v(t)?P(t,e,s):b(t)?$(t,e,s):t,q=(t,e,s)=>{for(let r=1;r<=t&&!1!==e.call(s,r,t);r++);return t},F=(t,e,s)=>Object.fromEntries(Object.entries(t).map(([r,n])=>[r,e.call(s,n,r,t)])),X=t=>parseInt(t??"0",16)||0,_=t=>t.replace(/^#/,"").match(/.{1,2}/g)?.map(X)||[],K=t=>("0"+t.toString(16)).slice(-2),H=(t,e,s)=>"#"+K(t)+K(e)+K(s),Q=(t,e)=>{const s=_(t);e=i(e,0,1);const[r,n,a]=s.map(t=>Math.round(t*e));return H(r,n,a)},J=(t,e)=>{const s=_(t);e=i(e,0,1);const[r,n,a]=s.map(t=>Math.round(t+(255-t)*e));return H(r,n,a)},Z={50:.95,100:.9,200:.75,300:.6,400:.3,500:0,600:-.1,700:-.25,800:-.4,900:-.55,950:-.71},z=(t,e)=>F(e??Z,e=>0==e?t:e>0?J(t,e):Q(t,1- -1*e)),B=(t,e,s)=>{t/=60;const r=(1-Math.abs(2*s-1))*e,n=r*(1-Math.abs(t%2-1));let i=[0,0,0];t<=1?i=[r,n,0]:t<=2?i=[n,r,0]:t<=3?i=[0,r,n]:t<=4?i=[0,n,r]:t<=5?i=[n,0,r]:t<=6&&(i=[r,0,n]);const a=s-.5*r;return[Math.round(255*(i[0]+a)),Math.round(255*(i[1]+a)),Math.round(255*(i[2]+a))]},W=(t,e,s,r,n)=>0===t?0:e===s?(r-n)/t%6:e===r?(n-s)/t+2:e===n?(s-r)/t+4:0,G=(t,e)=>0===t?0:t/(1-Math.abs(2*e-1)),V=(t,e,s)=>{const[r,n,i]=((...t)=>t.map(t=>t/255))(t,e,s),a=Math.max(r,n,i),l=Math.min(r,n,i),u=a-l,h=(l+a)/2;return[60*W(u,a,r,n,i),G(u,h),h]};class tt{constructor(t){this.key=this.shuffle(tt.dictionary,t,!1)}encrypt(t){return this.shuffle(t,this.key,!1)}decrypt(t){return this.shuffle(t,this.key,!0)}index(t,e,s){return[tt.dictionary.indexOf(t[s]),tt.dictionary.indexOf(e[s%e.length])]}result(t,e,s){return tt.dictionary[(s?t-e+tt.dictionary.length:t+e)%tt.dictionary.length]}shuffle(t,e,s){let r="";for(let n=0;n<t.length;n++){const[i,a]=this.index(t,e,n);r+=-1===i||-1===a?t[n]:this.result(i,a,s)}return r}static hex(t){let e=0;for(let s=0;s<t.length;s++)e=16777619*(e^t.charCodeAt(s));return(e>>>0).toString(16).padStart(8,"0")}}tt.dictionary="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";const et=(t=64)=>Array(Math.ceil(t/2)).fill(0).map(()=>l(0,255).toString(16).padStart(2,"0")).join("").slice(0,t),st=()=>{const t=1e4*(Date.now()+122192928e5),e=(4294967295&t)>>>0,s=(t/4294967296&65535)>>>0,r=(t/281474976710656&4095)>>>0,n=l(0,e),i=(t,e)=>t.toString(16).padStart(e,"0");return[i(e,8),i(s,4),i(4096|r,4),i(n>>8&63|128,2)+i(255&n,2),et(12)].join("-")},rt=t=>{const e=t.replace(/-/g,""),s=parseInt(e.slice(0,8),16),r=parseInt(e.slice(8,12),16),n=(4095&parseInt(e.slice(12,16),16))*Math.pow(2,48)+r*Math.pow(2,32)+s;return Math.floor((n-122192928e9)/1e4)},nt=()=>{const t=[];t.push(...Array(16).fill(0).map(()=>l(0,255))),t[6]=15&t[6]|64;const e=t.map(t=>t.toString(16).padStart(2,"0")).join("");return[e.slice(0,8),e.slice(8,12),e.slice(12,16),e.slice(16,20),e.slice(20)].join("-")},it=()=>{const t=Date.now(),e=[];e[0]=t/2**40&255,e[1]=t/2**32&255,e[2]=t>>>24&255,e[3]=t>>>16&255,e[4]=t>>>8&255,e[5]=255&t,e.push(...Array(10).fill(0).map(()=>l(0,255))),e[6]=15&e[6]|112,e[8]=63&e[8]|128;const s=e.map(t=>t.toString(16).padStart(2,"0")).join("");return[s.slice(0,8),s.slice(8,12),s.slice(12,16),s.slice(16,20),s.slice(20)].join("-")},at=t=>parseInt(t.replace(/-/g,"").slice(0,12),16),lt=t=>{const e=Date.now(),s=[];s[0]=e/2**40&255,s[1]=e/2**32&255,s[2]=e>>>24&255,s[3]=e>>>16&255,s[4]=e>>>8&255,s[5]=255&e,s.push(...Array(8).fill(0).map(()=>l(0,255))),s[6]=15&s[6]|128,s[8]=63&s[8]|128;const r=s.map(t=>t.toString(16).padStart(2,"0")).join("");return[r.slice(0,8),r.slice(8,12),r.slice(12,16),tt.hex(t??"").slice(4),r.slice(16)].join("-")},ut=t=>("0"+t.toString()).slice(-2),ht={"%y":(t,e)=>ut(e?t.getUTCFullYear():t.getFullYear()),"%Y":(t,e)=>(e?t.getUTCFullYear():t.getFullYear()).toString(),"%m":(t,e)=>ut((e?t.getUTCMonth():t.getMonth())+1),"%d":(t,e)=>ut(e?t.getUTCDate():t.getDate()),"%H":(t,e)=>ut(e?t.getUTCHours():t.getHours()),"%M":(t,e)=>ut(e?t.getUTCMinutes():t.getMinutes()),"%S":(t,e)=>ut(e?t.getUTCSeconds():t.getSeconds())},ot=(t,e,s)=>(e=e??new Date,t.replace(/%[yYmdHMS]/g,t=>ht[t]?ht[t](e,s):t.slice(1))),ct=36e5,pt=24*ct,vt={ms:1,s:1e3,m:6e4,h:ct,d:pt,w:7*pt,y:315576e5},gt=t=>{const e=/(-?(?:\d+)?\.?\d+)\s*(ms|s|m|h|d|w|y)/gm;let s,r=0;for(;null!==(s=e.exec(t));)s.index===e.lastIndex&&e.lastIndex++,r+=parseFloat(s[1])*vt[s[2]]||0;return r},mt=(t,e,s)=>{const r=new Date(t);s=s??gt("1d");const n=[];for(;r<e;)r.setTime(r.getTime()+s),n.push(new Date(r));return n},dt=t=>{const e=new Date(t);return e.getTime()==e.getTime()&&t==e.toISOString().slice(0,10)},ft=t=>new Date(t.getFullYear(),t.getMonth()+1,0,t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()),St=(t,e)=>/^([\d]{4})-([\d]{2})-([\d]{2})$/.test(t)?dt(t)?new Date(`${t} ${e}`):null:/^([\d]{4})-([\d]{2})$/.test(t)&&dt(t=`${t}-01`)?new Date(`${t} ${e}`):null,yt=(t,e)=>{const s=t??ot("%Y-%m"),r=St(s,"00:00:00");if(!r||!dt(r.toISOString().slice(0,10)))return[null,null];const n=e||s;let i=St(n,"23:59:59");return i&&dt(i.toISOString().slice(0,10))?(7==n.length&&(i=ft(i)),r>i?[null,null]:[r,i]):[r,null]},xt=t=>new Date(t.getFullYear(),t.getMonth(),1,t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()),Et=["y","d","h","m","s","ms"],wt=t=>{const e=[];return Et.forEach(s=>{const r=vt[s],n=(t-t%r)/r;n&&(t-=n*r,e.push(n.toString()+s))}),e.join(" ")},bt=(t,e)=>{let s;const r=()=>{s&&clearTimeout(s)};return{cancel:r,run(...n){r(),s=setTimeout(()=>t(...n),e)}}};class It{constructor(){this.events=new Map}on(t,e){const s=this.events.get(t);return s?s.push(e):this.events.set(t,[e]),{dispose:()=>this.off(t,e)}}once(t,e){const s=r=>{e(r),this.off(t,s)};return this.on(t,s),{dispose:()=>this.off(t,s)}}off(t,e){const s=this.events.get(t);if(e){if(s){const t=s.indexOf(e);t>=0&&s.splice(t,1)}}else this.events.set(t,[])}emit(t,e){const s=this.events.get(t);s&&s.forEach(t=>t(e))}}const Mt=(t,e)=>{let s=!1;const r=async()=>{s&&(await t(),setTimeout(r,e))};return{start(){s||(s=!0,r())},stop(){s=!1}}},Ot=t=>0==(t?.length??0),Ct=["",0,"0",null,!1,void 0],Tt=t=>-1==Ct.indexOf(t),Rt=t=>!Tt(t),Dt=t=>!Ot(t),At=()=>{},jt=(t,e,s)=>e(t.toLowerCase().replace(/\W+/g," ")).replace(/\s/g,s??""),kt=(t,e)=>jt(t,t=>t.replace(/\s(\w)/g,t=>t.toUpperCase()),e),Nt=kt,Yt=(t,e)=>{if(t.length>e){const s=t.substring(0,e).split(" ");return s.pop(),s.join(" ")+"..."}return t},Ut=/&(amp|apos|lt|gt|nbsp|quot);/g,Pt={amp:"&",apos:"'",lt:"<",gt:">",nbsp:" ",quot:'"'},$t=t=>t.replace(Ut,(t,e)=>Pt[e]).replace(/&#(\d+);/gi,(t,e)=>String.fromCharCode(parseInt(e,10))),Lt=t=>t.replace(/[^0-9A-Za-z ]/g,t=>"&#"+t.charCodeAt(0)+";"),qt=t=>/^[\w]$/.test(t),Ft=t=>/^[\d]$/.test(t),Xt=t=>/^[A-Za-z]$/.test(t),_t=t=>/^[^\w]$/.test(t),Kt=t=>{if(f(t))return t+"px";const e=(t=>/(-?(?:\d+)?\.?\d+) *(px|%|cm|mm|in|pt|pc|en|ex|ch|rem|vw|vh|vmin|vmax)*/g.exec(t))(t);return e?parseFloat(e[1])+(e[2]||"px"):"0px"},Ht=t=>t.split("").map(t=>Math.random()<.5?t.toUpperCase():t.toLowerCase()).join(""),Qt=t=>o(t.split("")).join("");class Jt{constructor(){this.hasSpace=!1,this._space=" ",this.hasNumbers=!1,this._numbers="0123456789",this.hasSymbols=!1,this._symbols="!@#$%^&*()<>.<~:;?+=-_",this.hasUpper=!1,this._upper="ABCDEFGHIJKLMNOPQRSTUVWXYZ",this.hasLower=!1,this._lower="abcdefghijklmnopqrstuvwxyz",this.hasChars=!1,this._chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"}chars(){return this.hasChars=!0,this}static chars(){return(new Jt).chars()}lower(){return this.hasLower=!0,this}static lower(){return(new Jt).lower()}make(t){let e="";this.hasSpace&&(e+=this._space),this.hasNumbers&&(e+=this._numbers),this.hasSymbols&&(e+=this._symbols),this.hasUpper&&!this.hasChars&&(e+=this._upper),this.hasLower&&!this.hasChars&&(e+=this._lower),this.hasChars&&(e+=this._chars);let s="";if(t&&e.length){e=Qt(e);for(let r=0;r<t;r++)s+=e.charAt(l(0,e.length-1))}return s}numbers(){return this.hasNumbers=!0,this}static numbers(){return(new Jt).numbers()}space(){return this.hasSpace=!0,this}static space(){return(new Jt).space()}symbols(){return this.hasSymbols=!0,this}static symbols(){return(new Jt).symbols()}upper(){return this.hasUpper=!0,this}static upper(){return(new Jt).upper()}}const Zt=t=>t.split("").reverse().join(""),zt=(t,e)=>jt(t,t=>t.replace(/(\w)(\w*)/g,(t,e,s)=>e.toUpperCase()+s),e),Bt=(t,e)=>e(t.value)?t.value:(t=>(t.maskIndex--,""))(t),Wt={"#":t=>t.value,0:t=>Bt(t,Ft),9:t=>Bt(t,Ft),A:t=>Bt(t,Xt),Z:t=>Bt(t,Xt),L:t=>Bt(t,Xt).toLowerCase(),U:t=>Bt(t,Xt).toUpperCase(),S:t=>Bt(t,_t)},Gt=t=>{t.maskIndex++,t.textIndex++;const{mask:e,maskIndex:s,text:r,textIndex:n}=t;t.key=e[s],t.value=r[n];const{key:i,value:a}=t;return A(i)||A(a)?"":(t=>Wt[t.key]?Wt[t.key](t):(t.key!=t.value&&t.textIndex--,t.key))(t)+Gt(t)},Vt=(t,e)=>Gt({mask:t,maskIndex:-1,text:e,textIndex:-1,key:"",value:""}),te=(t,e)=>Zt(Vt(Zt(t),Zt(e))),ee=(t,e,s)=>(s++,e=parseInt((e||"0").replace(/\D/g,"")).toString(),te(t,e.length<s?("0".repeat(s)+e).slice(-1*s):e)),se=(t,e)=>t.length==Vt(t,e).length,re=(t,e)=>t.reduce((t,s)=>({...t,[s]:e[s]}),{}),ne=t=>t instanceof Date?new Date(t.getTime()):v(t)?t.map(t=>ne(t)):b(t)?F(t,t=>ne(t)):t,ie=(t,e)=>re(Object.keys(e).filter(e=>-1==t.indexOf(e)),e),ae=(t,...e)=>{if(!e.length)return t;const s=e.shift();if(I(t)&&I(s))for(const e in s)I(s[e])?(t[e]||(t={...t,[e]:{}}),t[e]=ae(t[e],s[e])):t={...t,[e]:s[e]};return ae(t,...e)};class le{constructor(){this.running=!1,this.queue=[]}push(t){return new Promise((e,s)=>{this.queue.push(async()=>{try{const s=await t();e(s)}catch(t){s(t)}}),this.run()})}async run(){if(!this.running){for(this.running=!0;this.queue.length>0;){const t=this.queue.shift();t&&await t()}this.running=!1}}}const ue=async(t,e,s)=>{await Promise.allSettled(t.map((r,n)=>e.call(s,r,n,t)?.catch(At))).catch(At)},he=async t=>{let e=!0;const s=()=>e=!0;let r=1;for(;e;)e=!1,await(t(r,s)?.catch(At)),r+=1},oe=async(t,e,s)=>{for(let r=0;r<t.length;r++)await(e.call(s,t[r],r,t)?.catch(At))},ce=t=>new Promise(e=>setTimeout(e,t));class pe{}var ve,ge,me,de,fe,Se,ye,xe,Ee;pe.DESCRIPTION=Symbol("DESCRIPTION"),pe.ERROR=Symbol("ERROR"),pe.EXAMPLE=Symbol("EXAMPLE"),pe.INDEXES=Symbol("INDEXES"),pe.KEYS=Symbol("KEYS"),pe.LIST=Symbol("LIST"),pe.NAME=Symbol("NAME"),pe.REQUIRED=Symbol("REQUIRED"),pe.SOURCE=Symbol("SOURCE"),pe.TYPE=Symbol("TYPE");class we{constructor(t){this[ve]="",this[ge]="",this[me]=null,this[de]="",this[fe]="any",this[Se]=!1,this.rules=[],this.custom=[],this[pe.TYPE]=t}description(t){return this[pe.DESCRIPTION]=t,this}example(t){return this[pe.EXAMPLE]=t,this}empty(t){const e=t;return this.unshift(({value:t})=>{const s=d(t);return{break:!d(e)&&!s,value:s?t:y(e)?e():e}})}equal(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t==n?{value:t}:this.invalid(`.equal(${n})`,e)})}error(t){return R(t)&&(this[pe.ERROR]=t),this}filter(...t){const e=t;return this.unshift(({value:t})=>{const s=-1==e.indexOf(t);return{break:!s,value:s?t:void 0}})}fn(t){return y(t)?t:()=>t}from(t){return this[pe.SOURCE]=t,this}invalid(t,e){return t=`[${this[pe.TYPE]}]${t}`,{error:this[pe.ERROR]?this[pe.ERROR]:this[pe.NAME]?this[pe.NAME]+":"+t:t,message:e}}model(){return this.toString()}parse(){return this.unshift(({value:t})=>({value:t}))}push(t){return this.rules.push(t),this}required(t){return this[pe.REQUIRED]=!0,this.unshift(({value:e})=>d(e)?{value:e}:this.invalid(".required",t))}test(t){return!R(this.validate(t).error)}async testAsync(t){return!R((await this.validateAsync(t)).error)}toString(){return this[pe.TYPE]}unshift(t){return this.rules.unshift(t),this}validate(t,e){if(this.custom.length)return this.invalid("[async]");let s={value:t};for(let t=0;t<this.rules.length;t++){if(s=this.rules[t]({value:s.value,context:e}),s.error?.length)return{error:s.error,...s.message?{message:s.message}:{}};if(s.break)return{value:s.value}}return{value:s.value}}async validateAsync(t,e){let s=this.validate(t,e);if(s.error)return{error:s.error};for(let t=0;t<this.custom.length;t++){if(s=await this.custom[t]({value:s.value}),s.error)return{error:s.error};if(s.break)return{value:s.value}}return{value:s.value}}}ve=pe.NAME,ge=pe.DESCRIPTION,me=pe.EXAMPLE,pe.SOURCE,de=pe.ERROR,fe=pe.TYPE,Se=pe.REQUIRED;class be extends we{constructor(t){super("array"),this[ye]=[],this.push(({value:e})=>v(e)?{value:e}:this.invalid("",t))}between(t,e,s){return this.min(t,s),this.max(e,s)}items(t,e){const s=t;return s&&this[pe.INDEXES].push(s),s?this.push(({value:t})=>{const r=[];s[pe.NAME]="";for(let n=0;n<t.length;n++){const{error:i,value:a}=s.validate(t[n],t);if(i)return this.invalid("< "+i+"["+n+"] >",e);r[n]=a}return{value:r}}):this}length(t,e){const s=t;return this.push(({value:t})=>t.length==s?{value:t}:this.invalid(".length("+s+")",e))}max(t,e){const s=t;return this.push(({value:t})=>t.length<=s?{value:t}:this.invalid(".max("+s+")",e))}min(t,e){const s=t;return this.push(({value:t})=>t.length>=s?{value:t}:this.invalid(".min("+s+")",e))}model(){return this[pe.INDEXES].length?this[pe.INDEXES].map(t=>t.model()):this[pe.TYPE]}toString(){return this[pe.INDEXES].length?JSON.stringify(this.model(),null,4):this[pe.TYPE]}}ye=pe.INDEXES;class Ie extends we{constructor(t){super("boolean"),this.push(({value:e})=>g(e)?{value:e}:this.invalid("",t))}parse(){return this.unshift(({value:t})=>({value:d(t)?Y(t):t}))}}class Me extends we{constructor(t){super("date"),this.push(({value:e})=>R(e)&&dt(e)||!isNaN(new Date(e).getTime())?{value:e}:this.invalid("",t))}format(t){const e=t;return this.push(({value:t})=>({value:ot(e,new Date(t))}))}parse(){return this.unshift(({value:t})=>({value:new Date(t)}))}}class Oe extends we{constructor(t){super("enum"),this[xe]=[],this.push(({value:e})=>d(e)?{value:e}:this.invalid(`('${this[pe.LIST].join("', '")}')`,t))}list(t,e){const s=t;return s&&this[pe.LIST].push(...s),s?this.push(({value:t})=>-1!=this[pe.LIST].indexOf(t)?{value:t}:this.invalid(`('${this[pe.LIST].join("', '")}')`,e)):this}toString(){return`${this[pe.TYPE]}('${this[pe.LIST].join("', '")}')`}}xe=pe.LIST;class Ce extends we{constructor(t){super("number"),this.push(({value:e})=>f(e)?{value:e}:this.invalid("",t))}between(t,e,s){return this.min(t,s),this.max(e,s)}float(t){return this.push(({value:e})=>S(e)?{value:e}:this.invalid(".float",t))}integer(t){return this.push(({value:e})=>x(e)?{value:e}:this.invalid(".integer",t))}max(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t<=n?{value:t}:this.invalid(`.max(${n})`,e)})}min(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t>=n?{value:t}:this.invalid(`.min(${n})`,e)})}parse(){return this.unshift(({value:t})=>({value:d(t)?parseFloat(t.toString()):t}))}}class Te extends we{constructor(t){super("object"),this[Ee]={},this.push(({value:e})=>b(e)?{value:e}:this.invalid("",t))}keys(t,e){const s=t;return s&&(this[pe.KEYS]={...this[pe.KEYS],...s}),s?this.push(({value:t})=>{const r=[],n={};return Object.keys(s).forEach(i=>{const a=s[i];a[pe.NAME]=a[pe.SOURCE]??i;const{error:l,message:u,value:h}=a.validate(t[a[pe.NAME]],n);!e&&u&&(e=u),l&&r.push(l),d(h)&&(n[i]=h)}),r.length?this.invalid("{ "+r.join(", ")+" }",e):{value:n}}):this}model(){const t={},e=Object.keys(this[pe.KEYS]);return e.length&&e.forEach(e=>t[e]=this[pe.KEYS][e].model()),e.length?t:this[pe.TYPE]}parse(t){return this.unshift(({value:e})=>{if(!b(e))try{e=JSON.parse(e)}catch(e){return this.invalid("",t)}return{value:e}})}toString(){return Object.keys(this[pe.KEYS]).length?JSON.stringify(this.model(),null,4):this[pe.TYPE]}}Ee=pe.KEYS;class Re extends we{constructor(t){super("string"),this.push(({value:e})=>R(e)?{value:e}:this.invalid("",t))}between(t,e,s){return this.min(t,s),this.max(e,s)}email(t){const e=/^[\w-\\.]+@([\w-]+\.)+[\w-]{2,4}$/i;return this.push(({value:s})=>e.test(s)?{value:s}:this.invalid(".email",t))}length(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t.length==n?{value:t}:this.invalid(`.length(${n})`,e)})}lowerCase(){return this.push(({value:t})=>({value:t.toLowerCase()}))}lowerCamelCase(){return this.push(({value:t})=>({value:kt(t)}))}max(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t.length<=n?{value:t}:this.invalid(`.max(${n})`,e)})}mask(t){const e=this.fn(t);return this.push(({value:t,context:s})=>({value:Vt(e({value:t,context:s}),t)}))}min(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t.length>=n?{value:t}:this.invalid(`.min(${n})`,e)})}parse(){return this.unshift(({value:t})=>({value:b(t)?JSON.stringify(t):d(t)?t.toString():t}))}required(t){return this[pe.REQUIRED]=!0,this.push(({value:e})=>e.length?{value:e}:this.invalid(".required",t))}regex(t,e){return this.push(({value:s})=>t.test(s)?{value:s}:this.invalid(".regex",e))}replace(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>({value:t.replace(s({value:t,context:r}),e)}))}trim(){return this.push(({value:t})=>({value:t.trim()}))}upperCase(){return this.push(({value:t})=>({value:t.toUpperCase()}))}upperCamelCase(){return this.push(({value:t})=>({value:zt(t)}))}}class De{static array(t,e){return new be(e).items(t)}static boolean(t){return new Ie(t)}static date(t){return new Me(t)}static enum(t,e){return new Oe(e).list(t)}static number(t){return new Ce(t)}static object(t,e){return new Te(e).keys(t)}static ref(t,e){return({context:s})=>s&&d(s[t])?s[t]:e}static string(t){return new Re(t)}test(t,...e){return!R(De.validate(t,...e).error)}async testAsync(t,...e){return!R((await De.validateAsync(t,...e)).error)}static validate(t,...e){let s={value:t};for(let t=0;t<e.length;t++)if(s=e[t].validate(s.value),s.error)return{value:s.value,error:s.error};return{value:s.value}}static async validateAsync(t,...e){let s={value:t};for(let t=0;t<e.length;t++)if(s=await e[t].validateAsync(s.value),s.error)return{value:s.value,error:s.error};return{value:s.value}}}export{le as AsyncQueue,It as EventEmitter,tt as Hash,Jt as RandomString,De as Validation,we as ValidationBase,pe as ValidationKeys,re as allowed,U as cache,Nt as camelCase,t as chunkArray,i as clamp,ne as clone,z as colorPalette,e as compareArray,s as countArray,Yt as cutText,ot as dateFormat,mt as dateInterval,yt as dateRange,bt as debounce,$t as decodeHTML,ie as denied,L as each,Lt as encodeHTML,xt as firstDayDate,ue as forEachAsync,P as forEachIndex,$ as forEachKey,he as forEachPage,oe as forEachSeries,q as forLoop,_ as hexToRgb,B as hslToRgb,r as inArray,n as includesArray,v as isArray,g as isBoolean,qt as isCharacter,m as isDate,d as isDef,Ft as isDigit,Ot as isEmpty,Rt as isFalse,S as isFloat,y as isFunction,x as isInteger,Xt as isLetter,E as isMap,Dt as isNotEmpty,w as isNull,f as isNumber,b as isObject,I as isPlainObject,M as isRegExp,C as isScalar,T as isSet,_t as isSpecialChar,R as isString,D as isSymbol,Tt as isTrue,A as isUndefined,dt as isValidDate,ft as lastDayDate,a as lerp,Mt as loop,kt as lowerCamelCase,F as map,Vt as mask,ee as maskMoney,te as maskReverse,se as maskTest,ae as merge,wt as msToString,At as noop,gt as parseMs,Kt as parseSize,l as random,Ht as randomCase,u as randomElement,h as rangeArray,H as rgbToHex,V as rgbToHsl,Q as shadeColor,o as shuffleArray,Qt as shuffleString,ce as sleep,Zt as stringReverse,J as tintColor,j as toArray,Y as toBool,p as type,k as uniqueArray,et as uniqueID,zt as upperCamelCase,st as uuidv1,rt as uuidv1ToTimestamp,nt as uuidv4,it as uuidv7,at as uuidv7ToTimestamp,lt as uuidv8};
package/dist/index.min.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @andrewcaires/utils.js v0.4.13
2
+ * @andrewcaires/utils.js v0.4.15
3
3
  * JavaScript utility library for web and nodejs development
4
4
  * (c) 2025 Andrew Caires
5
5
  * @license: MIT
6
6
  */
7
- var UtilsJS=function(t){"use strict";const e=(t,e,s)=>Math.max(e,Math.min(s,t)),s=(t,e)=>Math.floor(Math.random()*(e-t+1)+t),r=t=>{for(let e=t.length-1;e>0;e--){const r=s(0,e);[t[e],t[r]]=[t[r],t[e]]}return t},n={},a=t=>null==t?"null":n[n.toString.call(t)]||"object";["Array","AsyncFunction","Boolean","Date","Function","Map","Number","Object","RegExp","Set","String"].forEach(t=>n["[object "+t+"]"]=t.toLowerCase());const i=t=>"array"==a(t),u=t=>"boolean"==a(t),l=t=>"null"!=a(t),h=t=>"number"==a(t),o=t=>h(t)&&!!(t%1),c=t=>"function"==typeof t,p=t=>h(t)&&!(t%1),v=t=>"object"==a(t),m=t=>v(t)&&t.constructor===Object,d=["boolean","number","string"],g=t=>"string"==typeof t,f=t=>void 0===t,y=[1,"1",!0,"true"],S=t=>-1!=y.indexOf(t),E=(t,e,s)=>{for(let r=0;r<t.length&&!1!==e.call(s,t[r],r,t);r++);return t},x=(t,e,s)=>{let r="";const n=Object.keys(t);for(let a=0;a<n.length&&(r=n[a],!1!==e.call(s,t[r],r,t));a++);return t},b=(t,e,s)=>Object.fromEntries(Object.entries(t).map(([r,n])=>[r,e.call(s,n,r,t)])),w=t=>parseInt(t??"0",16)||0,T=t=>t.replace(/^#/,"").match(/.{1,2}/g)?.map(w)||[],C=t=>("0"+t.toString(16)).slice(-2),I=(t,e,s)=>"#"+C(t)+C(e)+C(s),M=(t,s)=>{const r=T(t);s=e(s,0,1);const[n,a,i]=r.map(t=>Math.round(t*s));return I(n,a,i)},D=(t,s)=>{const r=T(t);s=e(s,0,1);const[n,a,i]=r.map(t=>Math.round(t+(255-t)*s));return I(n,a,i)},R={50:.95,100:.9,200:.75,300:.6,400:.3,500:0,600:-.1,700:-.25,800:-.4,900:-.55,950:-.71},A=(t,e,s,r,n)=>0===t?0:e===s?(r-n)/t%6:e===r?(n-s)/t+2:e===n?(s-r)/t+4:0,O=(t,e)=>0===t?0:t/(1-Math.abs(2*e-1));class k{constructor(t){this.key=this.shuffle(k.dictionary,t,!1)}encrypt(t){return this.shuffle(t,this.key,!1)}decrypt(t){return this.shuffle(t,this.key,!0)}index(t,e,s){return[k.dictionary.indexOf(t[s]),k.dictionary.indexOf(e[s%e.length])]}result(t,e,s){return k.dictionary[(s?t-e+k.dictionary.length:t+e)%k.dictionary.length]}shuffle(t,e,s){let r="";for(let n=0;n<t.length;n++){const[a,i]=this.index(t,e,n);r+=-1===a||-1===i?t[n]:this.result(a,i,s)}return r}static hex(t){let e=0;for(let s=0;s<t.length;s++)e=16777619*(e^t.charCodeAt(s));return(e>>>0).toString(16).padStart(8,"0")}}k.dictionary="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";const j=(t=64)=>Array(Math.ceil(t/2)).fill(0).map(()=>s(0,255).toString(16).padStart(2,"0")).join("").slice(0,t),N=t=>("0"+t.toString()).slice(-2),U={"%y":(t,e)=>N(e?t.getUTCFullYear():t.getFullYear()),"%Y":(t,e)=>(e?t.getUTCFullYear():t.getFullYear()).toString(),"%m":(t,e)=>N((e?t.getUTCMonth():t.getMonth())+1),"%d":(t,e)=>N(e?t.getUTCDate():t.getDate()),"%H":(t,e)=>N(e?t.getUTCHours():t.getHours()),"%M":(t,e)=>N(e?t.getUTCMinutes():t.getMinutes()),"%S":(t,e)=>N(e?t.getUTCSeconds():t.getSeconds())},Y=(t,e,s)=>(e=e??new Date,t.replace(/%[yYmdHMS]/g,t=>U[t]?U[t](e,s):t.slice(1))),L=t=>{const e=new Date(t);return e.getTime()==e.getTime()&&t==e.toISOString().slice(0,10)},P=36e5,F=24*P,$={ms:1,s:1e3,m:6e4,h:P,d:F,w:7*F,y:315576e5},q=["y","d","h","m","s","ms"];const H=t=>0==(t?.length??0),X=["",0,"0",null,!1,void 0],K=t=>-1==X.indexOf(t),_=()=>{},Q=(t,e,s)=>e(t.toLowerCase().replace(/\W+/g," ")).replace(/\s/g,s??""),J=(t,e)=>Q(t,t=>t.replace(/\s(\w)/g,t=>t.toUpperCase()),e),B=J,V=/&(amp|apos|lt|gt|nbsp|quot);/g,z={amp:"&",apos:"'",lt:"<",gt:">",nbsp:" ",quot:'"'},Z=t=>/^[\d]$/.test(t),W=t=>/^[A-Za-z]$/.test(t),G=t=>/^[^\w]$/.test(t),tt=t=>r(t.split("")).join("");class et{constructor(){this.hasSpace=!1,this._space=" ",this.hasNumbers=!1,this._numbers="0123456789",this.hasSymbols=!1,this._symbols="!@#$%^&*()<>.<~:;?+=-_",this.hasUpper=!1,this._upper="ABCDEFGHIJKLMNOPQRSTUVWXYZ",this.hasLower=!1,this._lower="abcdefghijklmnopqrstuvwxyz",this.hasChars=!1,this._chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"}chars(){return this.hasChars=!0,this}static chars(){return(new et).chars()}lower(){return this.hasLower=!0,this}static lower(){return(new et).lower()}make(t){let e="";this.hasSpace&&(e+=this._space),this.hasNumbers&&(e+=this._numbers),this.hasSymbols&&(e+=this._symbols),this.hasUpper&&!this.hasChars&&(e+=this._upper),this.hasLower&&!this.hasChars&&(e+=this._lower),this.hasChars&&(e+=this._chars);let r="";if(t&&e.length){e=tt(e);for(let n=0;n<t;n++)r+=e.charAt(s(0,e.length-1))}return r}numbers(){return this.hasNumbers=!0,this}static numbers(){return(new et).numbers()}space(){return this.hasSpace=!0,this}static space(){return(new et).space()}symbols(){return this.hasSymbols=!0,this}static symbols(){return(new et).symbols()}upper(){return this.hasUpper=!0,this}static upper(){return(new et).upper()}}const st=t=>t.split("").reverse().join(""),rt=(t,e)=>Q(t,t=>t.replace(/(\w)(\w*)/g,(t,e,s)=>e.toUpperCase()+s),e),nt=(t,e)=>e(t.value)?t.value:(t=>(t.maskIndex--,""))(t),at={"#":t=>t.value,0:t=>nt(t,Z),9:t=>nt(t,Z),A:t=>nt(t,W),Z:t=>nt(t,W),L:t=>nt(t,W).toLowerCase(),U:t=>nt(t,W).toUpperCase(),S:t=>nt(t,G)},it=t=>{t.maskIndex++,t.textIndex++;const{mask:e,maskIndex:s,text:r,textIndex:n}=t;t.key=e[s],t.value=r[n];const{key:a,value:i}=t;return f(a)||f(i)?"":(t=>at[t.key]?at[t.key](t):(t.key!=t.value&&t.textIndex--,t.key))(t)+it(t)},ut=(t,e)=>it({mask:t,maskIndex:-1,text:e,textIndex:-1,key:"",value:""}),lt=(t,e)=>st(ut(st(t),st(e))),ht=(t,e)=>t.reduce((t,s)=>({...t,[s]:e[s]}),{}),ot=t=>t instanceof Date?new Date(t.getTime()):i(t)?t.map(t=>ot(t)):v(t)?b(t,t=>ot(t)):t,ct=(t,...e)=>{if(!e.length)return t;const s=e.shift();if(m(t)&&m(s))for(const e in s)m(s[e])?(t[e]||(t={...t,[e]:{}}),t[e]=ct(t[e],s[e])):t={...t,[e]:s[e]};return ct(t,...e)};class pt{}var vt,mt,dt,gt,ft,yt,St,Et,xt;pt.DESCRIPTION=Symbol("DESCRIPTION"),pt.ERROR=Symbol("ERROR"),pt.EXAMPLE=Symbol("EXAMPLE"),pt.INDEXES=Symbol("INDEXES"),pt.KEYS=Symbol("KEYS"),pt.LIST=Symbol("LIST"),pt.NAME=Symbol("NAME"),pt.REQUIRED=Symbol("REQUIRED"),pt.SOURCE=Symbol("SOURCE"),pt.TYPE=Symbol("TYPE");class bt{constructor(t){this[vt]="",this[mt]="",this[dt]=null,this[gt]="",this[ft]="any",this[yt]=!1,this.rules=[],this.custom=[],this[pt.TYPE]=t}description(t){return this[pt.DESCRIPTION]=t,this}example(t){return this[pt.EXAMPLE]=t,this}empty(t){const e=t;return this.unshift(({value:t})=>{const s=l(t);return{break:!l(e)&&!s,value:s?t:c(e)?e():e}})}equal(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t==n?{value:t}:this.invalid(`.equal(${n})`,e)})}error(t){return g(t)&&(this[pt.ERROR]=t),this}filter(...t){const e=t;return this.unshift(({value:t})=>{const s=-1==e.indexOf(t);return{break:!s,value:s?t:void 0}})}fn(t){return c(t)?t:()=>t}from(t){return this[pt.SOURCE]=t,this}invalid(t,e){return t=`[${this[pt.TYPE]}]${t}`,{error:this[pt.ERROR]?this[pt.ERROR]:this[pt.NAME]?this[pt.NAME]+":"+t:t,message:e}}model(){return this.toString()}parse(){return this.unshift(({value:t})=>({value:t}))}push(t){return this.rules.push(t),this}required(t){return this[pt.REQUIRED]=!0,this.unshift(({value:e})=>l(e)?{value:e}:this.invalid(".required",t))}test(t){return!g(this.validate(t).error)}async testAsync(t){return!g((await this.validateAsync(t)).error)}toString(){return this[pt.TYPE]}unshift(t){return this.rules.unshift(t),this}validate(t,e){if(this.custom.length)return this.invalid("[async]");let s={value:t};for(let t=0;t<this.rules.length;t++){if(s=this.rules[t]({value:s.value,context:e}),s.error?.length)return{error:s.error,...s.message?{message:s.message}:{}};if(s.break)return{value:s.value}}return{value:s.value}}async validateAsync(t,e){let s=this.validate(t,e);if(s.error)return{error:s.error};for(let t=0;t<this.custom.length;t++){if(s=await this.custom[t]({value:s.value}),s.error)return{error:s.error};if(s.break)return{value:s.value}}return{value:s.value}}}vt=pt.NAME,mt=pt.DESCRIPTION,dt=pt.EXAMPLE,pt.SOURCE,gt=pt.ERROR,ft=pt.TYPE,yt=pt.REQUIRED;class wt extends bt{constructor(t){super("array"),this[St]=[],this.push(({value:e})=>i(e)?{value:e}:this.invalid("",t))}between(t,e,s){return this.min(t,s),this.max(e,s)}items(t,e){const s=t;return s&&this[pt.INDEXES].push(s),s?this.push(({value:t})=>{const r=[];s[pt.NAME]="";for(let n=0;n<t.length;n++){const{error:a,value:i}=s.validate(t[n],t);if(a)return this.invalid("< "+a+"["+n+"] >",e);r[n]=i}return{value:r}}):this}length(t,e){const s=t;return this.push(({value:t})=>t.length==s?{value:t}:this.invalid(".length("+s+")",e))}max(t,e){const s=t;return this.push(({value:t})=>t.length<=s?{value:t}:this.invalid(".max("+s+")",e))}min(t,e){const s=t;return this.push(({value:t})=>t.length>=s?{value:t}:this.invalid(".min("+s+")",e))}model(){return this[pt.INDEXES].length?this[pt.INDEXES].map(t=>t.model()):this[pt.TYPE]}toString(){return this[pt.INDEXES].length?JSON.stringify(this.model(),null,4):this[pt.TYPE]}}St=pt.INDEXES;class Tt extends bt{constructor(t){super("boolean"),this.push(({value:e})=>u(e)?{value:e}:this.invalid("",t))}parse(){return this.unshift(({value:t})=>({value:l(t)?S(t):t}))}}class Ct extends bt{constructor(t){super("date"),this.push(({value:e})=>g(e)&&L(e)||!isNaN(new Date(e).getTime())?{value:e}:this.invalid("",t))}format(t){const e=t;return this.push(({value:t})=>({value:Y(e,new Date(t))}))}parse(){return this.unshift(({value:t})=>({value:new Date(t)}))}}class It extends bt{constructor(t){super("enum"),this[Et]=[],this.push(({value:e})=>l(e)?{value:e}:this.invalid(`('${this[pt.LIST].join("', '")}')`,t))}list(t,e){const s=t;return s&&this[pt.LIST].push(...s),s?this.push(({value:t})=>-1!=this[pt.LIST].indexOf(t)?{value:t}:this.invalid(`('${this[pt.LIST].join("', '")}')`,e)):this}toString(){return`${this[pt.TYPE]}('${this[pt.LIST].join("', '")}')`}}Et=pt.LIST;class Mt extends bt{constructor(t){super("number"),this.push(({value:e})=>h(e)?{value:e}:this.invalid("",t))}between(t,e,s){return this.min(t,s),this.max(e,s)}float(t){return this.push(({value:e})=>o(e)?{value:e}:this.invalid(".float",t))}integer(t){return this.push(({value:e})=>p(e)?{value:e}:this.invalid(".integer",t))}max(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t<=n?{value:t}:this.invalid(`.max(${n})`,e)})}min(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t>=n?{value:t}:this.invalid(`.min(${n})`,e)})}parse(){return this.unshift(({value:t})=>({value:l(t)?parseFloat(t.toString()):t}))}}class Dt extends bt{constructor(t){super("object"),this[xt]={},this.push(({value:e})=>v(e)?{value:e}:this.invalid("",t))}keys(t,e){const s=t;return s&&(this[pt.KEYS]={...this[pt.KEYS],...s}),s?this.push(({value:t})=>{const r=[],n={};return Object.keys(s).forEach(a=>{const i=s[a];i[pt.NAME]=i[pt.SOURCE]??a;const{error:u,message:h,value:o}=i.validate(t[i[pt.NAME]],n);!e&&h&&(e=h),u&&r.push(u),l(o)&&(n[a]=o)}),r.length?this.invalid("{ "+r.join(", ")+" }",e):{value:n}}):this}model(){const t={},e=Object.keys(this[pt.KEYS]);return e.length&&e.forEach(e=>t[e]=this[pt.KEYS][e].model()),e.length?t:this[pt.TYPE]}parse(t){return this.unshift(({value:e})=>{if(!v(e))try{e=JSON.parse(e)}catch(e){return this.invalid("",t)}return{value:e}})}toString(){return Object.keys(this[pt.KEYS]).length?JSON.stringify(this.model(),null,4):this[pt.TYPE]}}xt=pt.KEYS;class Rt extends bt{constructor(t){super("string"),this.push(({value:e})=>g(e)?{value:e}:this.invalid("",t))}between(t,e,s){return this.min(t,s),this.max(e,s)}email(t){const e=/^[\w-\\.]+@([\w-]+\.)+[\w-]{2,4}$/i;return this.push(({value:s})=>e.test(s)?{value:s}:this.invalid(".email",t))}length(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t.length==n?{value:t}:this.invalid(`.length(${n})`,e)})}lowerCase(){return this.push(({value:t})=>({value:t.toLowerCase()}))}lowerCamelCase(){return this.push(({value:t})=>({value:J(t)}))}max(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t.length<=n?{value:t}:this.invalid(`.max(${n})`,e)})}mask(t){const e=this.fn(t);return this.push(({value:t,context:s})=>({value:ut(e({value:t,context:s}),t)}))}min(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t.length>=n?{value:t}:this.invalid(`.min(${n})`,e)})}parse(){return this.unshift(({value:t})=>({value:v(t)?JSON.stringify(t):l(t)?t.toString():t}))}required(t){return this[pt.REQUIRED]=!0,this.push(({value:e})=>e.length?{value:e}:this.invalid(".required",t))}regex(t,e){return this.push(({value:s})=>t.test(s)?{value:s}:this.invalid(".regex",e))}replace(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>({value:t.replace(s({value:t,context:r}),e)}))}trim(){return this.push(({value:t})=>({value:t.trim()}))}upperCase(){return this.push(({value:t})=>({value:t.toUpperCase()}))}upperCamelCase(){return this.push(({value:t})=>({value:rt(t)}))}}class At{static array(t,e){return new wt(e).items(t)}static boolean(t){return new Tt(t)}static date(t){return new Ct(t)}static enum(t,e){return new It(e).list(t)}static number(t){return new Mt(t)}static object(t,e){return new Dt(e).keys(t)}static ref(t,e){return({context:s})=>s&&l(s[t])?s[t]:e}static string(t){return new Rt(t)}test(t,...e){return!g(At.validate(t,...e).error)}async testAsync(t,...e){return!g((await At.validateAsync(t,...e)).error)}static validate(t,...e){let s={value:t};for(let t=0;t<e.length;t++)if(s=e[t].validate(s.value),s.error)return{value:s.value,error:s.error};return{value:s.value}}static async validateAsync(t,...e){let s={value:t};for(let t=0;t<e.length;t++)if(s=await e[t].validateAsync(s.value),s.error)return{value:s.value,error:s.error};return{value:s.value}}}return t.AsyncQueue=class{constructor(){this.running=!1,this.queue=[]}push(t){return new Promise((e,s)=>{this.queue.push(async()=>{try{const s=await t();e(s)}catch(t){s(t)}}),this.run()})}async run(){if(!this.running){for(this.running=!0;this.queue.length>0;){const t=this.queue.shift();t&&await t()}this.running=!1}}},t.EventEmitter=class{constructor(){this.events=new Map}on(t,e){const s=this.events.get(t);return s?s.push(e):this.events.set(t,[e]),{dispose:()=>this.off(t,e)}}once(t,e){const s=r=>{e(r),this.off(t,s)};return this.on(t,s),{dispose:()=>this.off(t,s)}}off(t,e){const s=this.events.get(t);if(e){if(s){const t=s.indexOf(e);t>=0&&s.splice(t,1)}}else this.events.set(t,[])}emit(t,e){const s=this.events.get(t);s&&s.forEach(t=>t(e))}},t.Hash=k,t.RandomString=et,t.Validation=At,t.ValidationBase=bt,t.ValidationKeys=pt,t.allowed=ht,t.cache=()=>{const t=[],e=[];return s=>{let r=t.indexOf(s);return-1==r&&(t.push(s),e.push({}),r=e.length-1),e[r]}},t.camelCase=B,t.chunkArray=(t,e)=>{const s=[];for(let r=0;r<t.length;r+=e)s.push(t.slice(r,r+e));return s},t.clamp=e,t.clone=ot,t.colorPalette=(t,e)=>b(e??R,e=>0==e?t:e>0?D(t,e):M(t,1- -1*e)),t.compareArray=(t,e)=>t.length===e.length&&t.every((t,s)=>t===e[s]),t.countArray=t=>{const e={};return t.forEach(t=>{const s=t.toString();e[s]=(e[s]||0)+1}),e},t.cutText=(t,e)=>{if(t.length>e){const s=t.substring(0,e).split(" ");return s.pop(),s.join(" ")+"..."}return t},t.dateFormat=Y,t.dateRange=(t,e)=>{const s=new Date(t),r=[];for(;t<e;)s.setDate(s.getDate()+1),r.push(new Date(s));return r},t.debounce=(t,e)=>{let s;const r=()=>{s&&clearTimeout(s)};return{cancel:r,run(...n){r(),s=setTimeout(()=>t(...n),e)}}},t.decodeHTML=t=>t.replace(V,(t,e)=>z[e]).replace(/&#(\d+);/gi,(t,e)=>String.fromCharCode(parseInt(e,10))),t.denied=(t,e)=>ht(Object.keys(e).filter(e=>-1==t.indexOf(e)),e),t.each=(t,e,s)=>i(t)?E(t,e,s):v(t)?x(t,e,s):t,t.encodeHTML=t=>t.replace(/[^0-9A-Za-z ]/g,t=>"&#"+t.charCodeAt(0)+";"),t.firstDayDate=t=>new Date(t.getFullYear(),t.getMonth(),1,t.getHours(),t.getMinutes(),t.getSeconds()),t.forEachAsync=async(t,e,s)=>{await Promise.allSettled(t.map((r,n)=>e.call(s,r,n,t)?.catch(_))).catch(_)},t.forEachIndex=E,t.forEachKey=x,t.forEachPage=async t=>{let e=!0;const s=()=>e=!0;let r=1;for(;e;)e=!1,await(t(r,s)?.catch(_)),r+=1},t.forEachSeries=async(t,e,s)=>{for(let r=0;r<t.length;r++)await(e.call(s,t[r],r,t)?.catch(_))},t.forLoop=(t,e,s)=>{for(let r=1;r<=t&&!1!==e.call(s,r,t);r++);return t},t.hexToRgb=T,t.hslToRgb=(t,e,s)=>{t/=60;const r=(1-Math.abs(2*s-1))*e,n=r*(1-Math.abs(t%2-1));let a=[0,0,0];t<=1?a=[r,n,0]:t<=2?a=[n,r,0]:t<=3?a=[0,r,n]:t<=4?a=[0,n,r]:t<=5?a=[n,0,r]:t<=6&&(a=[r,0,n]);const i=s-.5*r;return[Math.round(255*(a[0]+i)),Math.round(255*(a[1]+i)),Math.round(255*(a[2]+i))]},t.inArray=(t,e)=>-1!=e.indexOf(t),t.includesArray=(t,e)=>t.every(t=>e.includes(t)),t.isArray=i,t.isBoolean=u,t.isCharacter=t=>/^[\w]$/.test(t),t.isDate=t=>"date"==a(t),t.isDef=l,t.isDigit=Z,t.isEmpty=H,t.isFalse=t=>!K(t),t.isFloat=o,t.isFunction=c,t.isInteger=p,t.isLetter=W,t.isMap=t=>"map"==a(t),t.isNotEmpty=t=>!H(t),t.isNull=t=>null===t,t.isNumber=h,t.isObject=v,t.isPlainObject=m,t.isRegExp=t=>"regexp"==a(t),t.isScalar=t=>-1!=d.indexOf(a(t)),t.isSet=t=>"set"==a(t),t.isSpecialChar=G,t.isString=g,t.isSymbol=t=>"symbol"==typeof t,t.isTrue=K,t.isUndefined=f,t.isValidDate=L,t.lastDayDate=t=>new Date(t.getFullYear(),t.getMonth()+1,0,t.getHours(),t.getMinutes(),t.getSeconds()),t.lerp=(t,s,r)=>t+(s-t)*e(r,0,1),t.loop=(t,e)=>{let s=!1;const r=async()=>{s&&(await t(),setTimeout(r,e))};return{start(){s||(s=!0,r())},stop(){s=!1}}},t.lowerCamelCase=J,t.map=b,t.mask=ut,t.maskMoney=(t,e,s)=>(s++,e=parseInt((e||"0").replace(/\D/g,"")).toString(),lt(t,e.length<s?("0".repeat(s)+e).slice(-1*s):e)),t.maskReverse=lt,t.maskTest=(t,e)=>t.length==ut(t,e).length,t.merge=ct,t.msToString=t=>{const e=[];return q.forEach(s=>{const r=$[s],n=(t-t%r)/r;n&&(t-=n*r,e.push(n.toString()+s))}),e.join(" ")},t.noop=_,t.parseMs=t=>{const e=/(-?(?:\d+)?\.?\d+) *(ms|s|m|h|d|w|y)/gm;let s,r=0;for(;null!==(s=e.exec(t));)s.index===e.lastIndex&&e.lastIndex++,r+=parseFloat(s[1])*$[s[2]]||0;return r},t.parseSize=t=>{if(h(t))return t+"px";const e=(t=>/(-?(?:\d+)?\.?\d+) *(px|%|cm|mm|in|pt|pc|en|ex|ch|rem|vw|vh|vmin|vmax)*/g.exec(t))(t);return e?parseFloat(e[1])+(e[2]||"px"):"0px"},t.random=s,t.randomCase=t=>t.split("").map(t=>Math.random()<.5?t.toUpperCase():t.toLowerCase()).join(""),t.randomElement=t=>t.length?t[s(0,t.length-1)]:null,t.rangeArray=(t,e,s=1)=>Array.from({length:(e-t)/s+1},(e,r)=>t+r*s),t.rgbToHex=I,t.rgbToHsl=(t,e,s)=>{const[r,n,a]=((...t)=>t.map(t=>t/255))(t,e,s),i=Math.max(r,n,a),u=Math.min(r,n,a),l=i-u,h=(u+i)/2;return[60*A(l,i,r,n,a),O(l,h),h]},t.shadeColor=M,t.shuffleArray=r,t.shuffleString=tt,t.sleep=t=>new Promise(e=>setTimeout(e,t)),t.stringReverse=st,t.tintColor=D,t.toArray=t=>i(t)?t:l(t)?[t]:[],t.toBool=S,t.type=a,t.uniqueArray=t=>t.filter((t,e,s)=>s.indexOf(t)===e),t.uniqueID=j,t.upperCamelCase=rt,t.uuidv1=()=>{const t=1e4*(Date.now()+122192928e5),e=(4294967295&t)>>>0,r=(t/4294967296&65535)>>>0,n=(t/281474976710656&4095)>>>0,a=s(0,e),i=(t,e)=>t.toString(16).padStart(e,"0");return[i(e,8),i(r,4),i(4096|n,4),i(a>>8&63|128,2)+i(255&a,2),j(12)].join("-")},t.uuidv1ToTimestamp=t=>{const e=t.replace(/-/g,""),s=parseInt(e.slice(0,8),16),r=parseInt(e.slice(8,12),16),n=(4095&parseInt(e.slice(12,16),16))*Math.pow(2,48)+r*Math.pow(2,32)+s;return Math.floor((n-122192928e9)/1e4)},t.uuidv4=()=>{const t=[];t.push(...Array(16).fill(0).map(()=>s(0,255))),t[6]=15&t[6]|64;const e=t.map(t=>t.toString(16).padStart(2,"0")).join("");return[e.slice(0,8),e.slice(8,12),e.slice(12,16),e.slice(16,20),e.slice(20)].join("-")},t.uuidv7=()=>{const t=Date.now(),e=[];e[0]=t/2**40&255,e[1]=t/2**32&255,e[2]=t>>>24&255,e[3]=t>>>16&255,e[4]=t>>>8&255,e[5]=255&t,e.push(...Array(10).fill(0).map(()=>s(0,255))),e[6]=15&e[6]|112,e[8]=63&e[8]|128;const r=e.map(t=>t.toString(16).padStart(2,"0")).join("");return[r.slice(0,8),r.slice(8,12),r.slice(12,16),r.slice(16,20),r.slice(20)].join("-")},t.uuidv7ToTimestamp=t=>parseInt(t.replace(/-/g,"").slice(0,12),16),t.uuidv8=t=>{const e=Date.now(),r=[];r[0]=e/2**40&255,r[1]=e/2**32&255,r[2]=e>>>24&255,r[3]=e>>>16&255,r[4]=e>>>8&255,r[5]=255&e,r.push(...Array(8).fill(0).map(()=>s(0,255))),r[6]=15&r[6]|128,r[8]=63&r[8]|128;const n=r.map(t=>t.toString(16).padStart(2,"0")).join("");return[n.slice(0,8),n.slice(8,12),n.slice(12,16),k.hex(t??"").slice(4),n.slice(16)].join("-")},t}({});
7
+ var UtilsJS=function(t){"use strict";const e=(t,e,s)=>Math.max(e,Math.min(s,t)),s=(t,e)=>Math.floor(Math.random()*(e-t+1)+t),r=t=>{for(let e=t.length-1;e>0;e--){const r=s(0,e);[t[e],t[r]]=[t[r],t[e]]}return t},n={},i=t=>null==t?"null":n[n.toString.call(t)]||"object";["Array","AsyncFunction","Boolean","Date","Function","Map","Number","Object","RegExp","Set","String"].forEach(t=>n["[object "+t+"]"]=t.toLowerCase());const a=t=>"array"==i(t),l=t=>"boolean"==i(t),u=t=>"null"!=i(t),o=t=>"number"==i(t),h=t=>o(t)&&!!(t%1),c=t=>"function"==typeof t,p=t=>o(t)&&!(t%1),v=t=>"object"==i(t),m=t=>v(t)&&t.constructor===Object,d=["boolean","number","string"],g=t=>"string"==typeof t,f=t=>void 0===t,y=[1,"1",!0,"true"],S=t=>-1!=y.indexOf(t),E=(t,e,s)=>{for(let r=0;r<t.length&&!1!==e.call(s,t[r],r,t);r++);return t},x=(t,e,s)=>{let r="";const n=Object.keys(t);for(let i=0;i<n.length&&(r=n[i],!1!==e.call(s,t[r],r,t));i++);return t},w=(t,e,s)=>Object.fromEntries(Object.entries(t).map(([r,n])=>[r,e.call(s,n,r,t)])),b=t=>parseInt(t??"0",16)||0,T=t=>t.replace(/^#/,"").match(/.{1,2}/g)?.map(b)||[],I=t=>("0"+t.toString(16)).slice(-2),C=(t,e,s)=>"#"+I(t)+I(e)+I(s),M=(t,s)=>{const r=T(t);s=e(s,0,1);const[n,i,a]=r.map(t=>Math.round(t*s));return C(n,i,a)},D=(t,s)=>{const r=T(t);s=e(s,0,1);const[n,i,a]=r.map(t=>Math.round(t+(255-t)*s));return C(n,i,a)},O={50:.95,100:.9,200:.75,300:.6,400:.3,500:0,600:-.1,700:-.25,800:-.4,900:-.55,950:-.71},R=(t,e,s,r,n)=>0===t?0:e===s?(r-n)/t%6:e===r?(n-s)/t+2:e===n?(s-r)/t+4:0,A=(t,e)=>0===t?0:t/(1-Math.abs(2*e-1));class k{constructor(t){this.key=this.shuffle(k.dictionary,t,!1)}encrypt(t){return this.shuffle(t,this.key,!1)}decrypt(t){return this.shuffle(t,this.key,!0)}index(t,e,s){return[k.dictionary.indexOf(t[s]),k.dictionary.indexOf(e[s%e.length])]}result(t,e,s){return k.dictionary[(s?t-e+k.dictionary.length:t+e)%k.dictionary.length]}shuffle(t,e,s){let r="";for(let n=0;n<t.length;n++){const[i,a]=this.index(t,e,n);r+=-1===i||-1===a?t[n]:this.result(i,a,s)}return r}static hex(t){let e=0;for(let s=0;s<t.length;s++)e=16777619*(e^t.charCodeAt(s));return(e>>>0).toString(16).padStart(8,"0")}}k.dictionary="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";const j=(t=64)=>Array(Math.ceil(t/2)).fill(0).map(()=>s(0,255).toString(16).padStart(2,"0")).join("").slice(0,t),N=t=>("0"+t.toString()).slice(-2),U={"%y":(t,e)=>N(e?t.getUTCFullYear():t.getFullYear()),"%Y":(t,e)=>(e?t.getUTCFullYear():t.getFullYear()).toString(),"%m":(t,e)=>N((e?t.getUTCMonth():t.getMonth())+1),"%d":(t,e)=>N(e?t.getUTCDate():t.getDate()),"%H":(t,e)=>N(e?t.getUTCHours():t.getHours()),"%M":(t,e)=>N(e?t.getUTCMinutes():t.getMinutes()),"%S":(t,e)=>N(e?t.getUTCSeconds():t.getSeconds())},Y=(t,e,s)=>(e=e??new Date,t.replace(/%[yYmdHMS]/g,t=>U[t]?U[t](e,s):t.slice(1))),L=36e5,P=24*L,$={ms:1,s:1e3,m:6e4,h:L,d:P,w:7*P,y:315576e5},F=t=>{const e=/(-?(?:\d+)?\.?\d+)\s*(ms|s|m|h|d|w|y)/gm;let s,r=0;for(;null!==(s=e.exec(t));)s.index===e.lastIndex&&e.lastIndex++,r+=parseFloat(s[1])*$[s[2]]||0;return r},q=t=>{const e=new Date(t);return e.getTime()==e.getTime()&&t==e.toISOString().slice(0,10)},H=t=>new Date(t.getFullYear(),t.getMonth()+1,0,t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()),X=(t,e)=>/^([\d]{4})-([\d]{2})-([\d]{2})$/.test(t)?q(t)?new Date(`${t} ${e}`):null:/^([\d]{4})-([\d]{2})$/.test(t)&&q(t=`${t}-01`)?new Date(`${t} ${e}`):null,K=["y","d","h","m","s","ms"];const _=t=>0==(t?.length??0),Q=["",0,"0",null,!1,void 0],J=t=>-1==Q.indexOf(t),B=()=>{},V=(t,e,s)=>e(t.toLowerCase().replace(/\W+/g," ")).replace(/\s/g,s??""),z=(t,e)=>V(t,t=>t.replace(/\s(\w)/g,t=>t.toUpperCase()),e),Z=z,W=/&(amp|apos|lt|gt|nbsp|quot);/g,G={amp:"&",apos:"'",lt:"<",gt:">",nbsp:" ",quot:'"'},tt=t=>/^[\d]$/.test(t),et=t=>/^[A-Za-z]$/.test(t),st=t=>/^[^\w]$/.test(t),rt=t=>r(t.split("")).join("");class nt{constructor(){this.hasSpace=!1,this._space=" ",this.hasNumbers=!1,this._numbers="0123456789",this.hasSymbols=!1,this._symbols="!@#$%^&*()<>.<~:;?+=-_",this.hasUpper=!1,this._upper="ABCDEFGHIJKLMNOPQRSTUVWXYZ",this.hasLower=!1,this._lower="abcdefghijklmnopqrstuvwxyz",this.hasChars=!1,this._chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"}chars(){return this.hasChars=!0,this}static chars(){return(new nt).chars()}lower(){return this.hasLower=!0,this}static lower(){return(new nt).lower()}make(t){let e="";this.hasSpace&&(e+=this._space),this.hasNumbers&&(e+=this._numbers),this.hasSymbols&&(e+=this._symbols),this.hasUpper&&!this.hasChars&&(e+=this._upper),this.hasLower&&!this.hasChars&&(e+=this._lower),this.hasChars&&(e+=this._chars);let r="";if(t&&e.length){e=rt(e);for(let n=0;n<t;n++)r+=e.charAt(s(0,e.length-1))}return r}numbers(){return this.hasNumbers=!0,this}static numbers(){return(new nt).numbers()}space(){return this.hasSpace=!0,this}static space(){return(new nt).space()}symbols(){return this.hasSymbols=!0,this}static symbols(){return(new nt).symbols()}upper(){return this.hasUpper=!0,this}static upper(){return(new nt).upper()}}const it=t=>t.split("").reverse().join(""),at=(t,e)=>V(t,t=>t.replace(/(\w)(\w*)/g,(t,e,s)=>e.toUpperCase()+s),e),lt=(t,e)=>e(t.value)?t.value:(t=>(t.maskIndex--,""))(t),ut={"#":t=>t.value,0:t=>lt(t,tt),9:t=>lt(t,tt),A:t=>lt(t,et),Z:t=>lt(t,et),L:t=>lt(t,et).toLowerCase(),U:t=>lt(t,et).toUpperCase(),S:t=>lt(t,st)},ot=t=>{t.maskIndex++,t.textIndex++;const{mask:e,maskIndex:s,text:r,textIndex:n}=t;t.key=e[s],t.value=r[n];const{key:i,value:a}=t;return f(i)||f(a)?"":(t=>ut[t.key]?ut[t.key](t):(t.key!=t.value&&t.textIndex--,t.key))(t)+ot(t)},ht=(t,e)=>ot({mask:t,maskIndex:-1,text:e,textIndex:-1,key:"",value:""}),ct=(t,e)=>it(ht(it(t),it(e))),pt=(t,e)=>t.reduce((t,s)=>({...t,[s]:e[s]}),{}),vt=t=>t instanceof Date?new Date(t.getTime()):a(t)?t.map(t=>vt(t)):v(t)?w(t,t=>vt(t)):t,mt=(t,...e)=>{if(!e.length)return t;const s=e.shift();if(m(t)&&m(s))for(const e in s)m(s[e])?(t[e]||(t={...t,[e]:{}}),t[e]=mt(t[e],s[e])):t={...t,[e]:s[e]};return mt(t,...e)};class dt{}var gt,ft,yt,St,Et,xt,wt,bt,Tt;dt.DESCRIPTION=Symbol("DESCRIPTION"),dt.ERROR=Symbol("ERROR"),dt.EXAMPLE=Symbol("EXAMPLE"),dt.INDEXES=Symbol("INDEXES"),dt.KEYS=Symbol("KEYS"),dt.LIST=Symbol("LIST"),dt.NAME=Symbol("NAME"),dt.REQUIRED=Symbol("REQUIRED"),dt.SOURCE=Symbol("SOURCE"),dt.TYPE=Symbol("TYPE");class It{constructor(t){this[gt]="",this[ft]="",this[yt]=null,this[St]="",this[Et]="any",this[xt]=!1,this.rules=[],this.custom=[],this[dt.TYPE]=t}description(t){return this[dt.DESCRIPTION]=t,this}example(t){return this[dt.EXAMPLE]=t,this}empty(t){const e=t;return this.unshift(({value:t})=>{const s=u(t);return{break:!u(e)&&!s,value:s?t:c(e)?e():e}})}equal(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t==n?{value:t}:this.invalid(`.equal(${n})`,e)})}error(t){return g(t)&&(this[dt.ERROR]=t),this}filter(...t){const e=t;return this.unshift(({value:t})=>{const s=-1==e.indexOf(t);return{break:!s,value:s?t:void 0}})}fn(t){return c(t)?t:()=>t}from(t){return this[dt.SOURCE]=t,this}invalid(t,e){return t=`[${this[dt.TYPE]}]${t}`,{error:this[dt.ERROR]?this[dt.ERROR]:this[dt.NAME]?this[dt.NAME]+":"+t:t,message:e}}model(){return this.toString()}parse(){return this.unshift(({value:t})=>({value:t}))}push(t){return this.rules.push(t),this}required(t){return this[dt.REQUIRED]=!0,this.unshift(({value:e})=>u(e)?{value:e}:this.invalid(".required",t))}test(t){return!g(this.validate(t).error)}async testAsync(t){return!g((await this.validateAsync(t)).error)}toString(){return this[dt.TYPE]}unshift(t){return this.rules.unshift(t),this}validate(t,e){if(this.custom.length)return this.invalid("[async]");let s={value:t};for(let t=0;t<this.rules.length;t++){if(s=this.rules[t]({value:s.value,context:e}),s.error?.length)return{error:s.error,...s.message?{message:s.message}:{}};if(s.break)return{value:s.value}}return{value:s.value}}async validateAsync(t,e){let s=this.validate(t,e);if(s.error)return{error:s.error};for(let t=0;t<this.custom.length;t++){if(s=await this.custom[t]({value:s.value}),s.error)return{error:s.error};if(s.break)return{value:s.value}}return{value:s.value}}}gt=dt.NAME,ft=dt.DESCRIPTION,yt=dt.EXAMPLE,dt.SOURCE,St=dt.ERROR,Et=dt.TYPE,xt=dt.REQUIRED;class Ct extends It{constructor(t){super("array"),this[wt]=[],this.push(({value:e})=>a(e)?{value:e}:this.invalid("",t))}between(t,e,s){return this.min(t,s),this.max(e,s)}items(t,e){const s=t;return s&&this[dt.INDEXES].push(s),s?this.push(({value:t})=>{const r=[];s[dt.NAME]="";for(let n=0;n<t.length;n++){const{error:i,value:a}=s.validate(t[n],t);if(i)return this.invalid("< "+i+"["+n+"] >",e);r[n]=a}return{value:r}}):this}length(t,e){const s=t;return this.push(({value:t})=>t.length==s?{value:t}:this.invalid(".length("+s+")",e))}max(t,e){const s=t;return this.push(({value:t})=>t.length<=s?{value:t}:this.invalid(".max("+s+")",e))}min(t,e){const s=t;return this.push(({value:t})=>t.length>=s?{value:t}:this.invalid(".min("+s+")",e))}model(){return this[dt.INDEXES].length?this[dt.INDEXES].map(t=>t.model()):this[dt.TYPE]}toString(){return this[dt.INDEXES].length?JSON.stringify(this.model(),null,4):this[dt.TYPE]}}wt=dt.INDEXES;class Mt extends It{constructor(t){super("boolean"),this.push(({value:e})=>l(e)?{value:e}:this.invalid("",t))}parse(){return this.unshift(({value:t})=>({value:u(t)?S(t):t}))}}class Dt extends It{constructor(t){super("date"),this.push(({value:e})=>g(e)&&q(e)||!isNaN(new Date(e).getTime())?{value:e}:this.invalid("",t))}format(t){const e=t;return this.push(({value:t})=>({value:Y(e,new Date(t))}))}parse(){return this.unshift(({value:t})=>({value:new Date(t)}))}}class Ot extends It{constructor(t){super("enum"),this[bt]=[],this.push(({value:e})=>u(e)?{value:e}:this.invalid(`('${this[dt.LIST].join("', '")}')`,t))}list(t,e){const s=t;return s&&this[dt.LIST].push(...s),s?this.push(({value:t})=>-1!=this[dt.LIST].indexOf(t)?{value:t}:this.invalid(`('${this[dt.LIST].join("', '")}')`,e)):this}toString(){return`${this[dt.TYPE]}('${this[dt.LIST].join("', '")}')`}}bt=dt.LIST;class Rt extends It{constructor(t){super("number"),this.push(({value:e})=>o(e)?{value:e}:this.invalid("",t))}between(t,e,s){return this.min(t,s),this.max(e,s)}float(t){return this.push(({value:e})=>h(e)?{value:e}:this.invalid(".float",t))}integer(t){return this.push(({value:e})=>p(e)?{value:e}:this.invalid(".integer",t))}max(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t<=n?{value:t}:this.invalid(`.max(${n})`,e)})}min(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t>=n?{value:t}:this.invalid(`.min(${n})`,e)})}parse(){return this.unshift(({value:t})=>({value:u(t)?parseFloat(t.toString()):t}))}}class At extends It{constructor(t){super("object"),this[Tt]={},this.push(({value:e})=>v(e)?{value:e}:this.invalid("",t))}keys(t,e){const s=t;return s&&(this[dt.KEYS]={...this[dt.KEYS],...s}),s?this.push(({value:t})=>{const r=[],n={};return Object.keys(s).forEach(i=>{const a=s[i];a[dt.NAME]=a[dt.SOURCE]??i;const{error:l,message:o,value:h}=a.validate(t[a[dt.NAME]],n);!e&&o&&(e=o),l&&r.push(l),u(h)&&(n[i]=h)}),r.length?this.invalid("{ "+r.join(", ")+" }",e):{value:n}}):this}model(){const t={},e=Object.keys(this[dt.KEYS]);return e.length&&e.forEach(e=>t[e]=this[dt.KEYS][e].model()),e.length?t:this[dt.TYPE]}parse(t){return this.unshift(({value:e})=>{if(!v(e))try{e=JSON.parse(e)}catch(e){return this.invalid("",t)}return{value:e}})}toString(){return Object.keys(this[dt.KEYS]).length?JSON.stringify(this.model(),null,4):this[dt.TYPE]}}Tt=dt.KEYS;class kt extends It{constructor(t){super("string"),this.push(({value:e})=>g(e)?{value:e}:this.invalid("",t))}between(t,e,s){return this.min(t,s),this.max(e,s)}email(t){const e=/^[\w-\\.]+@([\w-]+\.)+[\w-]{2,4}$/i;return this.push(({value:s})=>e.test(s)?{value:s}:this.invalid(".email",t))}length(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t.length==n?{value:t}:this.invalid(`.length(${n})`,e)})}lowerCase(){return this.push(({value:t})=>({value:t.toLowerCase()}))}lowerCamelCase(){return this.push(({value:t})=>({value:z(t)}))}max(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t.length<=n?{value:t}:this.invalid(`.max(${n})`,e)})}mask(t){const e=this.fn(t);return this.push(({value:t,context:s})=>({value:ht(e({value:t,context:s}),t)}))}min(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>{const n=s({value:t,context:r});return t.length>=n?{value:t}:this.invalid(`.min(${n})`,e)})}parse(){return this.unshift(({value:t})=>({value:v(t)?JSON.stringify(t):u(t)?t.toString():t}))}required(t){return this[dt.REQUIRED]=!0,this.push(({value:e})=>e.length?{value:e}:this.invalid(".required",t))}regex(t,e){return this.push(({value:s})=>t.test(s)?{value:s}:this.invalid(".regex",e))}replace(t,e){const s=this.fn(t);return this.push(({value:t,context:r})=>({value:t.replace(s({value:t,context:r}),e)}))}trim(){return this.push(({value:t})=>({value:t.trim()}))}upperCase(){return this.push(({value:t})=>({value:t.toUpperCase()}))}upperCamelCase(){return this.push(({value:t})=>({value:at(t)}))}}class jt{static array(t,e){return new Ct(e).items(t)}static boolean(t){return new Mt(t)}static date(t){return new Dt(t)}static enum(t,e){return new Ot(e).list(t)}static number(t){return new Rt(t)}static object(t,e){return new At(e).keys(t)}static ref(t,e){return({context:s})=>s&&u(s[t])?s[t]:e}static string(t){return new kt(t)}test(t,...e){return!g(jt.validate(t,...e).error)}async testAsync(t,...e){return!g((await jt.validateAsync(t,...e)).error)}static validate(t,...e){let s={value:t};for(let t=0;t<e.length;t++)if(s=e[t].validate(s.value),s.error)return{value:s.value,error:s.error};return{value:s.value}}static async validateAsync(t,...e){let s={value:t};for(let t=0;t<e.length;t++)if(s=await e[t].validateAsync(s.value),s.error)return{value:s.value,error:s.error};return{value:s.value}}}return t.AsyncQueue=class{constructor(){this.running=!1,this.queue=[]}push(t){return new Promise((e,s)=>{this.queue.push(async()=>{try{const s=await t();e(s)}catch(t){s(t)}}),this.run()})}async run(){if(!this.running){for(this.running=!0;this.queue.length>0;){const t=this.queue.shift();t&&await t()}this.running=!1}}},t.EventEmitter=class{constructor(){this.events=new Map}on(t,e){const s=this.events.get(t);return s?s.push(e):this.events.set(t,[e]),{dispose:()=>this.off(t,e)}}once(t,e){const s=r=>{e(r),this.off(t,s)};return this.on(t,s),{dispose:()=>this.off(t,s)}}off(t,e){const s=this.events.get(t);if(e){if(s){const t=s.indexOf(e);t>=0&&s.splice(t,1)}}else this.events.set(t,[])}emit(t,e){const s=this.events.get(t);s&&s.forEach(t=>t(e))}},t.Hash=k,t.RandomString=nt,t.Validation=jt,t.ValidationBase=It,t.ValidationKeys=dt,t.allowed=pt,t.cache=()=>{const t=[],e=[];return s=>{let r=t.indexOf(s);return-1==r&&(t.push(s),e.push({}),r=e.length-1),e[r]}},t.camelCase=Z,t.chunkArray=(t,e)=>{const s=[];for(let r=0;r<t.length;r+=e)s.push(t.slice(r,r+e));return s},t.clamp=e,t.clone=vt,t.colorPalette=(t,e)=>w(e??O,e=>0==e?t:e>0?D(t,e):M(t,1- -1*e)),t.compareArray=(t,e)=>t.length===e.length&&t.every((t,s)=>t===e[s]),t.countArray=t=>{const e={};return t.forEach(t=>{const s=t.toString();e[s]=(e[s]||0)+1}),e},t.cutText=(t,e)=>{if(t.length>e){const s=t.substring(0,e).split(" ");return s.pop(),s.join(" ")+"..."}return t},t.dateFormat=Y,t.dateInterval=(t,e,s)=>{const r=new Date(t);s=s??F("1d");const n=[];for(;r<e;)r.setTime(r.getTime()+s),n.push(new Date(r));return n},t.dateRange=(t,e)=>{const s=t??Y("%Y-%m"),r=X(s,"00:00:00");if(!r||!q(r.toISOString().slice(0,10)))return[null,null];const n=e||s;let i=X(n,"23:59:59");return i&&q(i.toISOString().slice(0,10))?(7==n.length&&(i=H(i)),r>i?[null,null]:[r,i]):[r,null]},t.debounce=(t,e)=>{let s;const r=()=>{s&&clearTimeout(s)};return{cancel:r,run(...n){r(),s=setTimeout(()=>t(...n),e)}}},t.decodeHTML=t=>t.replace(W,(t,e)=>G[e]).replace(/&#(\d+);/gi,(t,e)=>String.fromCharCode(parseInt(e,10))),t.denied=(t,e)=>pt(Object.keys(e).filter(e=>-1==t.indexOf(e)),e),t.each=(t,e,s)=>a(t)?E(t,e,s):v(t)?x(t,e,s):t,t.encodeHTML=t=>t.replace(/[^0-9A-Za-z ]/g,t=>"&#"+t.charCodeAt(0)+";"),t.firstDayDate=t=>new Date(t.getFullYear(),t.getMonth(),1,t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()),t.forEachAsync=async(t,e,s)=>{await Promise.allSettled(t.map((r,n)=>e.call(s,r,n,t)?.catch(B))).catch(B)},t.forEachIndex=E,t.forEachKey=x,t.forEachPage=async t=>{let e=!0;const s=()=>e=!0;let r=1;for(;e;)e=!1,await(t(r,s)?.catch(B)),r+=1},t.forEachSeries=async(t,e,s)=>{for(let r=0;r<t.length;r++)await(e.call(s,t[r],r,t)?.catch(B))},t.forLoop=(t,e,s)=>{for(let r=1;r<=t&&!1!==e.call(s,r,t);r++);return t},t.hexToRgb=T,t.hslToRgb=(t,e,s)=>{t/=60;const r=(1-Math.abs(2*s-1))*e,n=r*(1-Math.abs(t%2-1));let i=[0,0,0];t<=1?i=[r,n,0]:t<=2?i=[n,r,0]:t<=3?i=[0,r,n]:t<=4?i=[0,n,r]:t<=5?i=[n,0,r]:t<=6&&(i=[r,0,n]);const a=s-.5*r;return[Math.round(255*(i[0]+a)),Math.round(255*(i[1]+a)),Math.round(255*(i[2]+a))]},t.inArray=(t,e)=>-1!=e.indexOf(t),t.includesArray=(t,e)=>t.every(t=>e.includes(t)),t.isArray=a,t.isBoolean=l,t.isCharacter=t=>/^[\w]$/.test(t),t.isDate=t=>"date"==i(t),t.isDef=u,t.isDigit=tt,t.isEmpty=_,t.isFalse=t=>!J(t),t.isFloat=h,t.isFunction=c,t.isInteger=p,t.isLetter=et,t.isMap=t=>"map"==i(t),t.isNotEmpty=t=>!_(t),t.isNull=t=>null===t,t.isNumber=o,t.isObject=v,t.isPlainObject=m,t.isRegExp=t=>"regexp"==i(t),t.isScalar=t=>-1!=d.indexOf(i(t)),t.isSet=t=>"set"==i(t),t.isSpecialChar=st,t.isString=g,t.isSymbol=t=>"symbol"==typeof t,t.isTrue=J,t.isUndefined=f,t.isValidDate=q,t.lastDayDate=H,t.lerp=(t,s,r)=>t+(s-t)*e(r,0,1),t.loop=(t,e)=>{let s=!1;const r=async()=>{s&&(await t(),setTimeout(r,e))};return{start(){s||(s=!0,r())},stop(){s=!1}}},t.lowerCamelCase=z,t.map=w,t.mask=ht,t.maskMoney=(t,e,s)=>(s++,e=parseInt((e||"0").replace(/\D/g,"")).toString(),ct(t,e.length<s?("0".repeat(s)+e).slice(-1*s):e)),t.maskReverse=ct,t.maskTest=(t,e)=>t.length==ht(t,e).length,t.merge=mt,t.msToString=t=>{const e=[];return K.forEach(s=>{const r=$[s],n=(t-t%r)/r;n&&(t-=n*r,e.push(n.toString()+s))}),e.join(" ")},t.noop=B,t.parseMs=F,t.parseSize=t=>{if(o(t))return t+"px";const e=(t=>/(-?(?:\d+)?\.?\d+) *(px|%|cm|mm|in|pt|pc|en|ex|ch|rem|vw|vh|vmin|vmax)*/g.exec(t))(t);return e?parseFloat(e[1])+(e[2]||"px"):"0px"},t.random=s,t.randomCase=t=>t.split("").map(t=>Math.random()<.5?t.toUpperCase():t.toLowerCase()).join(""),t.randomElement=t=>t.length?t[s(0,t.length-1)]:null,t.rangeArray=(t,e,s=1)=>Array.from({length:(e-t)/s+1},(e,r)=>t+r*s),t.rgbToHex=C,t.rgbToHsl=(t,e,s)=>{const[r,n,i]=((...t)=>t.map(t=>t/255))(t,e,s),a=Math.max(r,n,i),l=Math.min(r,n,i),u=a-l,o=(l+a)/2;return[60*R(u,a,r,n,i),A(u,o),o]},t.shadeColor=M,t.shuffleArray=r,t.shuffleString=rt,t.sleep=t=>new Promise(e=>setTimeout(e,t)),t.stringReverse=it,t.tintColor=D,t.toArray=t=>a(t)?t:u(t)?[t]:[],t.toBool=S,t.type=i,t.uniqueArray=t=>t.filter((t,e,s)=>s.indexOf(t)===e),t.uniqueID=j,t.upperCamelCase=at,t.uuidv1=()=>{const t=1e4*(Date.now()+122192928e5),e=(4294967295&t)>>>0,r=(t/4294967296&65535)>>>0,n=(t/281474976710656&4095)>>>0,i=s(0,e),a=(t,e)=>t.toString(16).padStart(e,"0");return[a(e,8),a(r,4),a(4096|n,4),a(i>>8&63|128,2)+a(255&i,2),j(12)].join("-")},t.uuidv1ToTimestamp=t=>{const e=t.replace(/-/g,""),s=parseInt(e.slice(0,8),16),r=parseInt(e.slice(8,12),16),n=(4095&parseInt(e.slice(12,16),16))*Math.pow(2,48)+r*Math.pow(2,32)+s;return Math.floor((n-122192928e9)/1e4)},t.uuidv4=()=>{const t=[];t.push(...Array(16).fill(0).map(()=>s(0,255))),t[6]=15&t[6]|64;const e=t.map(t=>t.toString(16).padStart(2,"0")).join("");return[e.slice(0,8),e.slice(8,12),e.slice(12,16),e.slice(16,20),e.slice(20)].join("-")},t.uuidv7=()=>{const t=Date.now(),e=[];e[0]=t/2**40&255,e[1]=t/2**32&255,e[2]=t>>>24&255,e[3]=t>>>16&255,e[4]=t>>>8&255,e[5]=255&t,e.push(...Array(10).fill(0).map(()=>s(0,255))),e[6]=15&e[6]|112,e[8]=63&e[8]|128;const r=e.map(t=>t.toString(16).padStart(2,"0")).join("");return[r.slice(0,8),r.slice(8,12),r.slice(12,16),r.slice(16,20),r.slice(20)].join("-")},t.uuidv7ToTimestamp=t=>parseInt(t.replace(/-/g,"").slice(0,12),16),t.uuidv8=t=>{const e=Date.now(),r=[];r[0]=e/2**40&255,r[1]=e/2**32&255,r[2]=e>>>24&255,r[3]=e>>>16&255,r[4]=e>>>8&255,r[5]=255&e,r.push(...Array(8).fill(0).map(()=>s(0,255))),r[6]=15&r[6]|128,r[8]=63&r[8]|128;const n=r.map(t=>t.toString(16).padStart(2,"0")).join("");return[n.slice(0,8),n.slice(8,12),n.slice(12,16),k.hex(t??"").slice(4),n.slice(16)].join("-")},t}({});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andrewcaires/utils.js",
3
- "version": "0.4.13",
3
+ "version": "0.4.15",
4
4
  "description": "JavaScript utility library for web and nodejs development",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs.js",
@@ -47,12 +47,12 @@
47
47
  "@rollup/plugin-commonjs": "^28.0.6",
48
48
  "@rollup/plugin-terser": "^0.4.4",
49
49
  "@rollup/plugin-typescript": "^12.1.4",
50
- "@types/node": "^24.3.0",
51
- "eslint": "^9.33.0",
52
- "rollup": "^4.46.4",
50
+ "@types/node": "^24.5.2",
51
+ "eslint": "^9.35.0",
52
+ "rollup": "^4.50.2",
53
53
  "rollup-plugin-dts": "^6.2.3",
54
54
  "tslib": "^2.8.1",
55
- "tsx": "^4.20.4",
56
- "typescript-eslint": "^8.40.0"
55
+ "tsx": "^4.20.5",
56
+ "typescript-eslint": "^8.44.0"
57
57
  }
58
58
  }