From 586d29e474c1d059f9678ad6c8ecb8b61dfefbd2 Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 9 Dec 2024 17:47:08 +0100 Subject: [PATCH] chore: initial docs chore: add scripts --- .gitignore | 1 + bun.lockb | Bin 172582 -> 228890 bytes docs/.vitepress/config.ts | 32 +++ docs/index.md | 29 ++ docs/install.md | 592 ++++++++++++++++++++++++++++++++++++++ docs/intro.md | 281 ++++++++++++++++++ package.json | 6 +- 7 files changed, 940 insertions(+), 1 deletion(-) create mode 100644 docs/.vitepress/config.ts create mode 100644 docs/index.md create mode 100644 docs/install.md create mode 100644 docs/intro.md diff --git a/.gitignore b/.gitignore index 95f9ee9..f6a33e1 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ lib-cov logs node_modules temp +docs/.vitepress/cache diff --git a/bun.lockb b/bun.lockb index 0d46eaa514caa9224ccdf8e73a6e9153420680e2..0d9d806de5ae0cc37e58101ea2167112e1d04dd4 100755 GIT binary patch delta 69928 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%0A4x|AFHe@eX z(nyQR-as-yE7k-c2G9Y~KqR0AdH^&Z(E_G3&=w#AsprxCM+DFkpoMEVpaGf#jevSU zU7!w78=%^)1=OTJ*cXh8Aix_?1LR46gtXy7Yehf67w`cno@ffI12upUfHDjNLV@}~ z1E3+$7@+&zCIBtpegmk@w?atDKBl3ewZtH12S8q)(bBsUKzCbY$?pIyO1lB%jVOQ= zBX5uw$ntoAtc(MwxsY+OKuVPFQXB~v1}K3bh)|Xx z1xX>QHUlsWpaNtCsXdJah(8+m10Y@+!Vv(;jsiwf{g1)LIDqP%7;^#2;3#ke*aw6I z)R6ZAyMbN6PGAaP0ww`ez@G>ykBPu!APblZWCB}&WxzCm0keUbG&Ib>#dKg6;EGJ< zAe;}(lW0O4E2V1+HvsE_b-+eo6R;HsrTX6n zYzKA#dw~7GVc-yO5I6vM0Hhr8NC~O}aywN+IzU#F*OGxVz-izVa1uBH5TAH*oP2Fh z7gvCbz?!a>qKQYH;3Y5s z2m+o1B=-XN1bhU@VPsGngw%_}sad?k1r_ub;cI{ry#XlUDuAl>1MnW848j5OIysUu z`;PD{K+2PsWW~SWn)0Chz5yG6wZJW;(IET@RHJ4=8B)fSDTf(=5)f$0DgfGAildGr z|EO@1AqC{Bu&g%n;7fq2io8McX}|%X{ZiUDr9D*IPmM>Ow5Lj;9!LP}LHCkqipRB45FjEq0g9tcN&&PP zOBs=@l-Nv@9K{h|F2ot~aiD37fa2W|lAIet+RP<6SK38Z;exc13n~Me5>bIJfLy4o zj7-Y~YUQ{gpBMx za=)bqX&aOjB1LFB6w1V!wXxL9Qd7!|5~WHBX_JMlrMMtmlXcMm^=WGL)KF_6J_ML1 zZIFcTXDbeIAB+PaR|wPI@U$VbyNs>dof^ORqa|W7a2^aRl0GmnBaG*|1$YO0`-^LM zTX2R%e{Jt~M1NG_JVqK9aL#rP=x`-|WI1sBy#2lXe1+96rFpV=Uht~F>y{Qd{zl|y z2lX7m+By1`mNQKfTUo_IRpLAH^1b|Zloaavx99(-2y-S=xZu| zz-0TW+j&mN7#tei$-m(>_w}3^IOjKoQv{8QIIHJ34Au_1Jx$@zNJH98f7Pzt+SmUq zQ8>L(GWlb!S4Op}BXp4tToqw4hGXiq^tiV20PBC2cB}>6u^VRJW>c&Agv*PQlTT zpvE2Muu|``w*3G|_bjYKNCc!S1&7q9a?L{1xk2a|$w{NVy@!XwT%Bt-brn7ON& zx2ci=ZT{71dDn(~+OK;{xANuoUmgqf0=xsft7Gsf$ksjK9NVA^qp?J=}7K}{t3sTy{7g{)>+l~kXp1zKhq>3V?S@GY2otWSjAKO>l^${H+XE5>q-q~ zf>Ruv#T9PFan09tR5(&{YbB?ixXfE#K8)BZ{_m#67l)A|f!_X9H}dgCJI^`|`WAef z1&*(`Kk1mW!+{fm{u>y;eml=OQE!Xap+Dj`qxShn$8GbyqFx~W3|f)X`eFSs_LJh$ zEjX$D;?t0--W+W}vAQGnDx6eZib0oxHQmt8KbLxPVd&sAUeFkm7OPD`hTBd>UEE`R zbPc7Ui5S22m>y_soaEDae1*+*YB+Fn5K|H{I}uV#9=tWpa5UtSKeEHXL}S)baHxfq zo?5Nnjn&_uC@TD0Ll8T>VRX|Un--TJ$g@39xI)If8^wMM57ZfM-rO^LrT;D*ITzd- zgw>kF(Qm80EU-Yr1BLTI;yj$1`euH;4?7gjCyBG~{-k9kOE>u_ag4~WFwCcdg2PX4 znLl|`e%MjUOfKR}u}BI8I-___aPBtW!7>CC+}U7fmWW=0g?E zB8l_&u$abvQ?Kn)I9nx7l@gT#xUu)<=Qo<2dQxIVmiktxxSPWVCDCn(W2*Jcv*-93 zqZH0NiF5QrhTFhJ?Mw>C1`UTM{W)cPw_kW1)mh=Vf>R2d)^*QTRk<4Nmny6PiDg^5 z;o~`L`W#U>%_Pps#`>-)^(xL%INc>qe2)b`FHhPQrf|~0DUE{8&9`$sSm|*~h0_pq zO3k-!H{N#V#g{g>cn+=FJJ^bapT{Gm2(YnRm$Ad4REe&CP9K_|Lr=#%j_wK$wihxs z|9tkQu*-2Tg)<5qH*g|mym%2h@7xcCvs6lR*?-5+@ozeC3g-YgWs#;p>iOvS({Itb zgmR21=#G@#Mz8!`eIJb|sU)IiLIs7q8ql(s-NZTa`zHz~3>;5z zK6RTuIB?eSp9&`$98%#yn3v7_1`Q7q$0*u56s+=Kbv@R*QN!kg(86UeECI(Ioaz-< zhxmUz+gRZomeNcfqUtob&-+RW=ZREM+namlk9;@8Md8?>nK&c2dIck5Qbrw%Mw65a z@&F4v0~xOUTXOdYUdm7s)dhzZqC+)vdp%uVI9%a$1c$1q_}z1U)xMqhrf^cF+(xC$ ztaxKoGh2o81__*yCZl;d_vgEe#-??Z$!9hH&Df3}D zM2$#U@nUeq;!NBi&AzOaIgZGUY_*-GIk2FhdoOBtVj6F7$e>-G`;5NLh7TX1uySZ; zq1-GaqS?(;f2V-$=fc4}I&*c>I+vBTTu|P*$)-B|YHQiDY@I#tWc-A-LYCRg-{^mV zYuyjtppJtQQ*^PqbQEk?^ZS4$jWUjdgZUe4SgQhPt)%3HH?e;EDi1FTPN3-9E)wV2 z;InJHp8GN!9RGji7*SB(`u}=2@!#A0tH~SC!f8!0%sKYt@rvDDpj-_jEDHEH=UUWa zj!MkC=4H3%Pywcvg|{(=WmLHHt@!sUcQbG%umoR-eJI7d7;QboQM7O0ft}LEe<&#U zPN)e_aM0N@<`2GJuF2s1cHmHpMSj)6p?R*z)9!5s)G2yL;WU#tv5|I>Cm;6T0gj)T zsEd?a%WZQuxm;?i2M2dL-c%DwV9`L{we5r8MMq9N0!vz~j*zl@FkxKujQag)p^H@r zsnEZ#J~awA$(%!v^nl(GXQVXfPNgw)Q6KEwi!1N%KeUIEn-4hDX^v#9yfkh7Vjpk< z%8A+K?YpO*tVe0y$?hY@J(>hIIJ;@~mGmsgUKQrc8;fCJqY*x#SO3?2Hg-6n6jm7= ztQ0bwi)VH#+H;Ihm{?W-I2e^PUepUZmTtXSi!{{2VN_#q?7%7S=2G(e#=_1Dr%#MN zo^I5ZSAEdbvCY_z;E?yMkqBKXqXh4y8im9(j0|u0XWaXOmG?tL@|7%c1rq4!8G%D5 zdel0zufi`9yd=rb@nW~_@Y2#sFSZ88{}M0D$zh|4Y-d5pb*;$O6h@d*k+mvm5e}=w zCKlpd*eeo3B4G^3+vlm;$VhEuyw2wHsy-bae|s!gizb1c$~2uiT9=@o+PlGW?Uos+ z+^W^YeF+06wsGbD8@J2C$QuX=8f(t#;*S=r^$~4S;84rcrt6aoaBIlA?-P$4oBoj& zrXcZ)PSK{NA$(Tb{o}agOcOZ5V2wNFl&GX=)J6QRe1?0CFP0Y;vq6+5Ce5IuoAwWC z-MME;PalAT`xg4umy}%TaVEX)nm8ThMmrk#<=g{M5^0c#TF|x2#riL3e|R7`!IT0| zUnI`svOT&KEACzg95j6Tb(c7`B5FVTP&xHAIFdnnaA^Kn_}j}NH>xim>R?2(6BDI^ zMFVRKW0xAM>P(`7r0j-)Lk+Uk$m(OKb(@h1j$~2Z712p84jUh1tyfHUIeE>2Yk?Rl zI{Tfr@$D8nE&(hWN%GDvkJ>}!ZADsA?*74#&41^&;g(FU@uQLoF%hRLq?AaYUWxvN zn=Gpb-r``qewc%?!qDWKwZNh+7g!akPf3n~Lt+}IY&0C0!wZS9B~`;JE-9%OHOB{g z=VxAc+lV%Of^bub0X#vUno2$_>=WUea@cktI5gV9<+Xi8<#u*>b1FJ2HWnOdf(r+S zywPw>xLuRi+ZY`RR^$eLzMCRwsD3FP6bPVgWVg-t_L^{;4J>*)ZsYxPdYe) z+HBlWtTQXa8@AxyT(i02vpPvMo01x6UwVVOZ=5#OYFLTou;{11q5P*`@g=pum@}UC6@fYafiuZNv-SG zT`74soed9C$Mi2=&MIwJL>b%4s9vEvvB1H411|63)e=(JJrd9yRm z&rMv{K zl6lrMZT9&3JO>Sg?ZH73=TeQ=dqXQ3w>MK*Q^BIi^y&R61sd#JiOEz>v|r;mrD@o>|F zTU83n1uXJL+Hd!Q5{|m97u+rAT@4(X`rJB)*6p$JL3xE!Pf9aBZD7K)l+iDg+#v0W(Jnzw)ck2yvZ z^sBr7v)=zZYDWa4{C{`Q|5ibHlw-7#YvTXqg7PQ_t7$wZ|39el|D`H2O1(1g2K2vF zP#)#r{IcA-|KBYrk8+H;_R9b7+Jf=F@BNXr#Bt&I#C0nk7rL3E%mfzWnJ}E$af2aC z<9yDUK;cMfj5G-T*NK8_3nyMPj(Cr3(jlhgX+?#+mCKt$vqve*>BG)EeXx0lITyZQ zUAFTu7tY(&WrdI65rlJHR+mE0x-8`g;#Kw7-XnNoV5%psHtW3IyZ*RcP#osF>R2gY z?Qs(& z+avW3W)|Vr4lA*&Q1(00@&`j%pQD_=>a--;?!vS3{gdoEL9&K0ty|fLv2Vv9sS0B^ zDMh6))&sOEF-+9BGdJt+#vkVXiMq&*Mmp@)=Wcq4JK_+i?N6>;;!3V|anBcazx zvQ74iec03!Ak!N#mlMc(R1?+$v}#fl(XdLdZ@x5?enrm|u#h4r&1}L3UqK2<3Dpuv zQgc6H^SDCu7ROIQQo0M@(1e|(ymmu^mPCuE&Ut3--UAB=SDu&8-^<~}sNF$5+R8o?&O%RfGx)4ec@qp1|(>ajApR`99qfL*j%e?IomP+fFo5*i`H4*XE_x| z+L0Z6Z66kMj+>zhX(MJf=Z_r?mVGaVmB(NV&a@V9(1xk-w1$sp!-CJFiXOIMJt^GM zmd!zYunPT*`bxVV&whTHsQrM#q}6`}@}wR(ut3+Db;d1D1V=Iwz4zI9F2?K|{RQqh zAAqkFUF06gs(={m*MAqo!FYo z&;ux z2*pDIoJ0c04!I7k`^D?%_E*cn!4U@H*mh^LkXGf@UEHibdh+xWmsZ`pAraz@AqvMg zyR);DdpAfpB9HM2(Gv>=pTUY4j`5=#5Cb^09PPb)_?|OE%e(^z8-SGd&+e@3Ris@C z2^ut3tnPTm4Xdx9)5n3Hze#K;qjx@J+EV>>2Y)oZ+~*@8HsbU+NwrB z%MNV~4z!}my4{2AzJ`YQ6%yo`L9Z_EU)3!CMxlJ6Hj8Ol(Z5lCX{~6TU9Bg57Vh3s zQjida^$J=R3W?wlNKpA@-mG?RGN>(WD%Zf1&H&tDfEc>IOgVo6_mdQs{(w zhJaNkaA*Q6W!=fOh3l|mJXgb;c3$z|JCbFf8>`YFL8Eu)kskePZ2mygI8+M8NIMid zQ10`j^50$abezBZUOhoVXh#;$xunNjLYK#qds8IyzJWmlv&q04u>1@yB$^et&G`pAMvMMU-}b(`b*!fAy zbK^1NlRu~t$#ISWAQNBKgT}Jt; zvDne3;jw+hi56PBO-CRpb{DIuajg6uE?hNMFG~0Z5F3`2swW#q5=VQA z5($;dMy{9=*^>57AYz3xvc1^5J1C`Yyg0;8n-Y5P;?|B%$OF4sG)0MZ0-sro00P5FsA-AxgPhnB0)^?iQDIS6@DXF=)13{&r;#wHrXHu~&SG}hw2QV0)^&AQK3DO|FTI7)&(d!LKRt^G^OX)%Qh zi+{k)2>!RK5Ve1}rr)FvcYD*0e*hiX!a2qq^??kNA3`OpL>5sfs^G+4Jwyk?2hJ)y z;;NKS=qHYIhJ0d`{HNnT{{M1D$vGeE_89#vk5fEoN8*_nC;kh^2I4ppFVj*={(pKN zO36XWkxjY5xv)}Caf2iEdcK*Kg+E1E_xiKFUpYrM;3*eD!|ds&@QEz+=K!X92BB#K zSnxBns=SB)wFB7jXIvG2-vGAm8RyQA9LUZiMXP;-#HO*YM6LJT!zYV-%Q(J+Lx`A$ z-O*p<1%d;o8!WuPm?3||YFpck0c-7+eX`@mf@23+oY(sH3i?3L#OKiG1>$MgjCjAP z#RV7Bu)y0?u{tiUXFzQx7Q9C)KNT1O)*{{n+p1xN_@T$+K~-Yu@a z4idEFM;<=l(D2f(!^sHUv%yWlq5B`SshUPM?gjK{WMoT_2j9xbu2DG4$cnv0bI#Rj z;Uq)!5H|58I@6FL;v(d0n{LimZ;rW%y#2+KR}35)j^l#5FY&4NJQEyg5xs8^yNR@X z>7ne?OO#e=D60lx?=?BHw8U3L2pamepnabNI|iEYmd-VhF#zWihA8@Q|2NU@^(hgQ8Cpl(|P z0@9McFF3Sjs<}42>%-r|QWeh4k*o#M^3O-ISqN2mOG*-a+tHcxu!4^q&CXK7_|fdi z8)&^`3@iH<8RRnENHrr)H&xl7w_Gh_$MK>u2d=jCvoDrHTj6vj53ZCyX_hqYO!2{^ z!WlR?asj5*gbAX30h6Qp@0&dj^VAT;(E4KrLRuR=t)B8DC#A?R`R{I?^7Y_kCsd5%<$9erJ);DTq5lPC!!1H&wTa;FNto(Zn z7}C-!*bYk++Frji>hIL`Esom=%45}prTQfCUg_}sW<$PCE%v9NqOh>6GKo!ikKDs1 zvHkC{?7{NQ?gRR57*do(Ug_`Zc-Y?WR1GPl6BMF^Z+<^3@d~>Vli8{d@P28NxP4u) z#elxam0w_cU%sKh40f9&d>}!t`jqv$SNmph9*Q0fOw8dU%55)6EO@(MNwp{6zX(gv zK$_%2v@DV&a#?&xbFjSlfIioGv=VWwbmB9nFuQ!9=S^W%^5IL72d88X=AD_(1Fj&8 z{=@~U0y0Hc`_)_IHE@_cooJx;fN@_`+|fD^55O|n=}%~LQtqmzNaO}v`0IZRoHjZD z_plf~g#L*6O7&ThWGy~(F2Pw-#Q}0`^py2GuN}j|Dxoc)j3W|fPqmrXYPEA}E;vP4 zmt*BP=QB)pt}6}>PZJK#?D#N(hG^>gP^vj&&pvbEx#Uhh3Bnqw$TYFtjx1Pt&Tk7h z&>n!;zeB5q^n6_*{W9_5+m_Z14}n z=NQ)b=sD~G#UnG9p9sn)Jl1w`8}WJP&CgVdYA^Hr>?ErKGML-3m-8E?bi2Geq@)mQoS!e@CTr8E zyEt0LT&=gEojT;c9rp@ZJ1K_Bnn)T1&x0A|QSx%v8%Hl~XoT%7xx?o=@X>9qd~c{a z&`a#Wz3NOE)%(JAx(}i|6iA4hQvSSjSIggD%qEuN9oD@Kvvm$Fun2=-hmuJ#rj`s6tyrM{0M(F`09r2TMsOUqs!xcfEd zE*^|=;x8^`du>o{GA$jTVasr8hTpJ^xzoWJ`IL=(x<(e3<7HY5{r^Kce{-Q-SFn>s zkpJKn?3Dw;ocYW7%H?F|`{z{pmvRrUWbVjUmG@z(TPs-)%X34=SFvX$d4JWDRie{d zG!Lti(c;7m#c>5!GhfnK@{OwOYH=^7!jnH#S?&dBJtb9O&}ufABxUVoS4&o_B9M~y z<`(siu5W8Rw@gVXYbE(bl>kW^xC+b6tiY+27HAT2K)vNNAEbKk(OQ>oq?#AQ{f z&qE#DLW@zYN{jfg4a|;CsI}X`RCLm;ae3Cz4xgo#J#lUW^Tt6_b6XZ$ltRlT%AtJX zO`=(;66koc6Y^41YNouTjH=RRafWTYa%lX>^ux5pCaEi{BdaSntsHJw<$Xl2*JidA zU4oa(lsc8%0nCO=O;45gm?P^VAJ&s~k(zmM-re-S?Ep@y^^zwVrL=Wh(y`W1Wh*|L zgX?Z#dmT|rc{w_dc&Z)8g2HZMP6^oox*sf9P9yi;TQhejtw8Fbo|s5l?I9%VuGG=%D-k`nbX{nR}TNr^rNeL`})PEB!! zP~kvVPlFFWO0F{#sVUk-LrhXi0^S@lM;hskD?_O8zYo3A7@gENQLRr6CB2YCa(r5> zK2ePWXQ6;kw60HTQc}D@txeVo5r#NziY}Tiak5e@PrAk@!F91I+EhIhib;w}GpM0J za)LflFWMs(R!k^OouEyP>#0o-VCP)Ne%q2t!PisGlyS5BMp%#Asa#JE!7Z>;D?BOF?mXn@W*Hk{m^wi!vBeSXc+X z3S(XP(v0iJyR+Xr@WoiUj=WRJ0JExQc{ZsfM7nn1ZCPAL-ld8tg2S`Ac%NjvsHH>0 zNKMh{)P1$_y-+ntX(>@UI3!uk&eh_}vV|RSXGg_kUGK>6;90K@d}(_jlLT$7K1z+m z`ovgvt~#$`XS(pExEkz17rqhamsRa|-i~V~m}}uUm})`gG*e~?Ek|%U9p=-cHS{B^ z-Cc$Aa{^5nnVDiff}Rz!l}H&`6iK9otf%zOA0(tJFzHY*n!emwgnsfHwMR%%pcYX^z6mk*L~nX_quiH4LxsPsVyhs1aQ1QHZC<0-a+2yhEjf_ ze(;b*e$iUN*ldxpKC+70qJ3l~v&V`W#U~{t##-bn#-`{EQGI@iP0%MBf&+E&)UZ|6 zy4G>co*A*3y++=ML}0fa56+=NAE3atpj7F6ECLNhcA3sm01LaQ+g z3si2xvWL+-AZ$V9CMMq6(3lsOVKG zSB1z;RB8yKWeTB)dgjnoloVCPb#8*@;SY+MuX7U=RTFbGU*|0-dQ=q5=Fbqbj^^>2 zTrZE^LXP6V9<4W|`q0cHz5~weQ+bt9_}er{AjYZ1R~Ch7KwLM86L_e|mZdCvP!5(w zonuhSp3JfZGT8^A8xd~~8_#A8trPMlYq+VeQ z<*UufDQgmli%~>KLkkJYK35To7AzTOX`5JtFbvX)SGGd(zvO*UNFH4CGBY`;uMRJZ z1P5YGoR^F+#^l0PTDfRoPqXutR-KFXa?PN*=IR*g40)+SJaU>a71hYzB1D5_38fik zj~7}c^J~GEtDaYK6rNjZL@S8{vM08%Nl9uEsU*yybaqcEX|u;G$^EjIt5kuKREblP z)ykesbcwlMm9#k+N(N1G%OFSN$(cjn(lx%V^lnff>W)h99N*7mh5xtz9t7O$6udL7j#la%CoXkumqdM6$$~kZ;x#Z;J znT1(#sT(R;k2X(cwd1s|9wY*9c|2(jNmuf_{gs=Rm6 z$3QP}s#A68sn{LRNw;-zT0^RN^Fo)1y$PKfyCAV?DQOAXoQ$5@K3YRmiat4&-5JTd zHl&X)VNXL!rf{LgFL4$sne$htCaIaWGw)i)T#~o|Q2Pj>kcP(KN^YblvZVlbw0H(* zv0O+?)U${lyepeKgD=SV>AZh6bACCjMix0@)HT@aMBcMWHl=h12`Y*9Cqb(==&*f*mKlwV zdg;)hsjh`g`o>|G!jPpKc(Pl9!A4GBr?ufioQv0d(iL^Z@ zZkbW)Uy2a-da&omyfgXoY%l%-+cqIzLh@G!t8vPf zo^#N?jkM88l@OYi7^_Y8fveJ@Qq!=Dsg8lNR4 zf`gM1StjGFmKR?5M}a~JU8Ke#k_p)D)yC?C{mhElqRc5I5usxINjcVh76t{MS^OZn zD#Cs;{+oE!eHLHJ#$5Uk^e1OUL1d^9>HxN{B6?PB-P^E@KpE0;d4xZzH%~gV?7b=K9-&w=%XXmy>$KhXybeKO~v;Ws1glHDJV1^ z+w|zliLp9$long-hJJ}r>OR`i@%m_OY7+Ky_1M-nXyesUct>8ZqdN?@?xdJl0#p(& zER><0clv~bI!2!^?7~{m@RONs5Wet{O+t(kwrpF-awtN+#H2*ub`<)ecx+Og66NhD z>=@IIxzxev@q&0VKrQU;;xT0~yJO^CLuL0!+sfkDE__8o=-w!YOiR$EYGJ)r>h67Y zk?P3!G#wsYuytjniPy~{HZ=}9W~0@<%+8Z9?<$uk=Lk9ZQtij~rDGIc(2=iMOR&K5 z=?DZZNwx4T09i+c)k~i$?5lS*3nRudEl4G8vMwb?7e)0SnUt0og*is2?S=jAw3K*5 z8kqDXD7z+N-3mo`nTs&je2y3@h^>p~J=hF4-nW`LOXy?1R?`bl!f+Lpl-v)?!+xo8 z^!x#HhO3)J1kz*^pjD8tZR#X_@BjkR6-GcD;0k8;y?757vq4m-VxHPBP#oC4`0!0_ z>7x$dQy>j^rR6U`AX>h}bAq6${df-t;kyxF2qA6u;FA%|z6gD;U5J@bb98wZ*Kk*TVl!lhJ z!lJj7{J>FM>{4O$>`>6BTDB*XVD&Vh!s*!zO}ff6OyPkMJ*#ppNso>oD1I$MjUmB5 zNZ7tG=8%Srkjf%IZG3D}yk6_0O-oIpQ6pZ5he9+IgyzbjN3Xh6wZxMG@gXFA$03;X z#K#=`Xnp4!T25Rd2xW=|<7uNPjRl&49x1ViTG$oLmJzhfMx*J_%Ugo^62k|7RTwKR zwKfuq!&LMcv$irLQ5)YcRUc)@$)NcS9XoqIMp>I*#4!+H9MHz=`wL6S9O=}(({w5Q z)c8tdEU7_{i?e5pH5=`|nPZ`;C}@s>GPDk&=Z@w$+)zMEJZ80sK}iN$Uq+@R^~G~e zb$VP%F5DO$J`EJ95WYH}DT`V+|{ z$BVR*z{i|GDNWEaTS-EUlBiZLi7X7ymee9%$-vVh1Id>{BI#NY^fC(y6(Q6EBozX^ z7{e)j6~SM8BsKyFOFoi%05xkN=Pyw}$|Y6K zqUH4>iWF80c?`SK5-nSX;(F~r=qgRXQm2)NIX0;i@7huB$=PzvJpsA-zY!CBCm0f( zeVC^Va>QWu13#OOC#2%f)Ti_jj+JCRapu=qXB~Irt?gK)V4NqY@5^^*?s~px)_q@I zRhUiggu80oBo)Z=uEl@MpXDFQ#}>=F*n-#CFy9V*2R5=J4vKW|h&wf$B^e=JP3^*m zuw(;YEUS4}et9+4!4Em(=FW~S8N=H%(-?jl>oNt)gyivvdo>m}d>6*@&Do?`SeY89 zAg}G?_=fE4c-|!|V>~~DXVWM04y@Tk-jp?e5c$$Qv0;xU zYKqaQxoR|~N0VqY?{Js%Yn}O$#Q2s-!4|St*IR*-odD1-&Bl92B%cj>(QsaONmVDRlAyE{akG zvIvs-X(>6m*+GiZyquvIK+^7%lsS-2FM>^ zTowFL6lQs|oI8venW~U%Pw#-{tkA%Br1T&mIX-P1YKQ?~R5-YrqEv_M4#^rF)wGfd z83m`|9UUBjc(S6yP+(EG1CnOpwH2iXq(3C9`2>=DdUgsbR+NN5j2DhMb&PTe$(iF) z663Rza-0*K8M!$D2s?+kiIk5Z=|){h)K{r6CC6`UTILw#yt}sCHB{|cUpwoX)TxE1 zQEW_JdR7*yzX-kTOiD^j$!4=z*_r8CxjD*P4UPP9Y0f-mob%MOZQcckQH&F1rmHS}Ug7Mu^sa7{!$9qA9*9I`tk9ZVUU zk(rH&A;VXgl#-F?mzSlSYHj4dCS{giT4q9gK`vTNOG!`3RbKNm4D6_g;~V2|G?q zZuBGyl0CRDp|A?Rtgk4V1{TM29gb@ zWhTbwBrD1==v)eBD9zACOS^DL4nY7U=ZYs}O-R!L6*?wp;b)OXJsTZ{%!Xt;D;oO%b#hKGV>a(Map4d7X1+PPI0{e52Y~Xp=(b25ToZN(*9A#4{BXSw> z8JQ`GiZT@Wj6_;z!~RY)!@gNT7sKPLlDG|>o?U{h3wgS$F&9v&GY1>@`{3ErF`1cZ zW8!n1k9*qP;7_6+59IHKWT=-#8x3EEXd>hlE{)$l@(<>;}iX|#*H=g zi#=rpF^1h6C6^ z3j_KZJv<%Ju&M3HIzKNE&nl^29Rw~fHEP)FC`->Q(2F(tpR-=B<*q%a?-ft z6%8}yQnoWG9{wofpw~tI2uL=V0eeo?tl@GwVk0V`$L1CrhYWY<*G4D`Yzya&G(r|7 z`DxJU$aqxF5avQ>`E+OYSZ9!;xQ;f4A}Ky6mp0kXyquJzNy-B7T$ZtLi{*fjt%8Z%19W8 zEj`%KcYiN8$Ol)K@#H6o|uy0nUI^ElHvTNsWC~-a#x|#!M5X!j-4q0!7I?FeLWTavGmKAtIvOx=EbI37y#>uB6BpbMfhUwUq35o(= z3Qs^XGUq264VFM>2LiEVaMCI$tc?VFd@tXSUqjM?cct6|$p#lgvf|5Aj5%-w4f#NK zKyr3Zo@VrH^2C%}ULf|GZbahWknYI81j*HP8+M#ifzUm;{sRjYB@l!s2#)c$(x4)A zj@1L`Y+wYWC!{wTWQAvo4E;DHC)doGa!etq_kca?8~nUc-VZuES_hIH{9`IsS7#(n z&N4#u_&OjVGmn>2x0@(R8{}VslACk>t&Z`C%|-ROF3^!ID8 zdRKaMAjC|K$4B zfxe!u7Hw{gXxH2OCk`G}N!T_;>m}^X{focbl%s?$qY^-Rs9+dU#^xk^PrX9jwr_*XYdNZQgEiE#=DS z;DK|3znQCDZ4y>3eca?b6Alb{H?;d7n?JkPXr1QXbab?(*694UrSp{c&>51D9?A& zqYthcu=3=q=h|pXn|iqh7cFfZapAbPwy$Yl*Ot9!JzVipw+qXgC9883t)#cZc0y5< z9*Ci;?eAz;8(K8qJ`Q!3MN5Tv#iEr!SX8YP!met*eI4plRZH#bu)eA)O0agz9%1_x zsrIO$g0|nsZgaRON*8EWEilq6vL3cd>5MG zCOcFIbDSPowDF_ET%mN*>!;x=Xc5pch4nQ;7W1YW2V+$CJFuN@Tt2+#uQD-_d=D`=z#y$g+P!7J3@hOL0LyXe!PD>U}T@Not-=|3!A zhsH=^bfDdlF_5ThieUb!;`Q z6k>lh&3A;u_D40NS$)FT0;?NUV_dr1)r9I==?I6aRo8q+I@Gh(wN!|Q)wPn54qIDn zDs&JXL)cQDXzRi(HMG=G4)tmctz?wLRtwvp5gkO$)=g>_J=*!uxO-OAz5N1Ouu)|z zyR|B|zusDUc!VtpsV9-y2rb&MLS$}0W3T4IJH z&$o`E_(L<+Nn9PRbd19$K(cB$mmB5^#TctQee9~Eu2$;nuuZ_;%QuIS@ zhkCf4R^oKnO2IRX@NJac=272pUtiI-LD1Ni?uV+?*GiHcws%1qO|rihoJQFQOyEwq z)QlB91zNCP^?o?FS8A}tcJxgH%{SSh*7DF&lO48h9*PnG%ktWOr(K=lp_PJs86-og zSFK)!Ws1WVg_9k}OwsN{+tt~gS}Dk{K}PCiU?01!QA5K7!-HLEXhW?e)nS_ll3pV; zsdn2LXbcplV^_P?iYxFSeLJ-y#dV2c=xevlf+l;4VR#*y(Npdwzeo+i#eUezODjop zSciFG6t&&hmtRGSku#>quh6(y(HuMqZLF1~JJh_!S}DZI#+q-2L#^0EOU-cDVwxBs zbJgy2wyO)8Xr;*es=4Ny>9Fl>VK|MhqsbpyXeA&A`WRCS{R*|))SBc_ZyMwT;o93oWft(7JK;*k&WeGOE7f-jEuWJ9_f~8f!PU{4i7& z0<9v)%Q^vCZ|&By_O3`Uv_=5ju}yKtVZf({xk6zUJiy+!7Fu6j<3jrZ8rLbJfrZuz zNk$*144j-Zp)ndpq_#mb<{oSL85-vvb`SK!(Uy~7w=+VW+*T`@?67?XVz{2o(6zQBL1=@f?=5~7uaI&4|!V@JIV*UWxsgP>s=McUQ! zp<2mQhuSMtE1l}F%|YDgH0C3g!MmaQtXAxgmmC}z1+6zsj1$@J$9e2Yd32GXGJ4q! z8vCU;WLpMJ&R5j(E;JM^timz3s^PlhVG(M(aIK`kVJik zuo|g9kcuX!cIcp$c6O+fI%vM$4)yg8TB^6h_OQd_3DL~1_Kea>y&cx&aIBqn3l|m* zFkbABu@#T)sFk#ESkHru({{Irur^0r^=8y@oiyK84s};2EfwPTPFkstL-p;f`L=Xe z=in}(zn0!CLcP>kD|y~wvtw-86?6?-&qcucUPk+W6-jp4TcGpJ0|g`&``$M z7H!QCBF;AB6c`7MQPNLk*5%MJ_rfF8v)#1P*$%Z*cg=SW&KunoWi+hH>08*B&;~#Y z)0g^sta=WGQQviF2(>X?tbQ2q4w_$4ge?y#tPo=~)K`0GrE?v&-#~H&VHB}{wZ&X9 z2JB9X-Ifjw(~E1oQ&>4>X}9`B*gRs)rOyQ^pmBy-wEg|;)@#tlaOK!KBkC*+9^1ui zXlw=>V|yf@l`L}DW`H!p!i&5&p$*ilMsaH_>K(10&CVmmMWOG7 zHb*~W!Jt}PNY8;LCpVfr56uWV&rxpuwUQ+cb!307bcw@y4ppE-7{s6fTIy1VnlV5t zS?aJIz?gC1F&o>5xkAD8V}CI9qu@=jw!3$PnmbS{S>~`^0KwfCp};z~Vy9sMjk7>! zXzZ?$HwBupPjm0s56uV~hvyq;45)EV@WhN{9{PiGP#kJOI?8w4l(vW?2@zX)*5jLp|;y6Ld}fRd{;Wum*ccl2$!K+$x4T{=TO8)zxbSw zRH#{(?HDwSGN%GIA-7@1pyC{ZX|fU;2DFh$7rnjWo6+ zL)#7wqrkfh1LJ$y_fF7gfkDD>E`w%FzVV34322N1{KhCel;wi-v&h;c zEp?;A_C=CeoY(Qy$C{@kUI!#V>!dftljy;*TI!1q>klBiX?`OkY=Oz<861;Yosq2h zZgSYpg5;24-r^M9CFSw9W4EhCDO%|!+*GA#zMCDk8mVQr47F#fR>wA7bysv2iR+PK)d01XR(Qx$z{k!I}9`ovW?r)jC-4(oN0`emrCY5L<$ z5_5L~G!Ba~WJjTKCL3Ch45L%JrmoJ=O1I)v3zDG;{LF(!&-A+(>rc>P z^^YkcrYZ^=XAKC`0cc&I83VC&ni=fCF=4LL%}8-=FN4Mb*EetV(R9r>(qS81V9aj) z;|aC6Kr6LlPXPJE{V|1#GGA{laBi3@6rTR{9og1?hN6V)8XL%i#`$WT4^BXne!YBP_rk1+bp?)}1E7|L?m4Cj>EVCv;!*+|CzwJmp z@z-@$*#M7(hSiN=abUiJCU+)ik+Y5ZjMLd7XvVyv<#A}3KIjZr*3db|zGz&hzX~l3 zdB!^XagLVya=QXo1z&vtJj%+7&}-=Iv!#l>S~8!~0@RkWj+AvFc~F)IJOLNL3!r^t zePS93J);@YJpP-sBEKa-2U-EFsI`=Skg9g;<+|}m@Fq>q4WxqOS(3H11t>!R9%ZEs zxi=&f>%m0RkFt{WjRELjf|QA}eI*eD4@$-{i3$!%7QjhIKgvosFu9VahH7To;#6ihq4g6xmwIol;WNoQGEel96uZ}dJ%9B`0B9sZ-KE zMCz0lj(?~mo+TNHaG76LvZ4sdQ_{{MbxN+aZj$c-N&6T`{3x;fC8dh?mEIs2lKwJ- zk_84rvIiriJ_?dMeIg`}|0ZeT#4kFQEbX5q_4S`B4b!DzSxG8G@|0X1xsY^l0wf(Y zCov`Y8IU~6N>W9Vr(|-b9)BaD7n}vQI`mc2K+p;YC6mQcFDu!@wUVb~Bwvs^CH2ix zFDpsCWMTaEgyH#CS)fD~C@a~J`2Z*-P4-ATN+$P8xli(xbl@N)BlD`1hh_d@Gjt?q z@S4n^WP@)?y{sg46u&6nlKIb)tnawAdt1sAQl6CM3d}@V$-Gn2psXbI4t}vmXCdj} zd1?17$*lKeJ|!pbN03|{UqGU~_Sx&6`WRe;&bd?y$%B%~AEdkq$?|s~S^gd*JNPFg z4@xEU8jtn+fEDcvf((`qYZ1^R~Z;||V zNFJ2cAP+;bM{h`;lKL?zPfB?jlJ&j|Ne9lEJvt{1-iNG!jL#t1@K=yLC|U4pNK)V8 z7c2OVij-{dd&%<=apwOZJk*Xtg zN+#>!7x{)#HicxxEtvU~B;|`=^r5wpUtlI^tM{0_=22Gue|NJqN>RMf7<<|n;6X{} zno+^=-z0n95@3)1xmiLG1_BJ;KQ~K-h{8WNO9%pwe{Pokxmo(>W~uB=lYZh)#d(Lj zWjfD4Pf1c4lBfLVW{DB{=Vs}jn!#_7m|9`z%a>31#*6!0B zajKdnM!Wl|oA9h|iLtndlX{R=k{SsQv)F|RiC)6j2GuP(ytK+pfuO{}j2 zy{7n{y3b`d(W@@>+M=He^o!89P_HZQ)P+9xikleZ4!xdu(H(l&S8l>u4|)U9uO9Rp z&|jhMDJ=D&7hiP~&ic?BiT%(mUc%M@qOpjlXd;eKG!@l7AexC3iss@tg}12Z3DH7~ zr|=PHC|Zif4IzBRB#Ktz1B%w7Wg`ebF@wTiT%u?r0=*yt#5{^Xag8EKgg1t0E0$3N zi|;8yM8_uZ^x_TlvDMLThiB0}_Q2GL&ZpokQf<`51sl%j*! zPZ1?--Vhx{JVhsQgrc*k-U6bFNTKK|j#G3K^?V?@i}4iE;tWL((YPhNIsB8GnAH;A z#E1{5C*O7xA->Rii5b4o-S4=G@2K|?fvupQhQ6{D^nT(R_57dRMAz2P2Z&{@q5J&e zCTd%u4-((EwhZ9ka4UngWnT@k3=tjuU@-Srbl(pKL&Y8HVZULZ{Vg%-bBfsHZyBuJ z0AXzdVuT|4w*gW7JBFIXC`G6NAfo@kSO(7)0`)h)ghubVYnf!u

MCRzpKi~utO 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 diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts new file mode 100644 index 0000000..6b244f6 --- /dev/null +++ b/docs/.vitepress/config.ts @@ -0,0 +1,32 @@ +import { defineConfig } from 'vitepress' + +// https://vitepress.dev/reference/site-config +export default defineConfig({ + title: 'ts-collect', + description: 'A simple, fast, and secure TLS certificate manager for your projects.', + cleanUrls: true, + + themeConfig: { + // https://vitepress.dev/reference/default-theme-config + nav: [ + { text: 'Docs', link: '/intro' }, + { text: 'Changelog', link: 'https://github.com/stacksjs/tlsx/releases' }, + ], + + sidebar: [ + { + text: 'Get Started', + items: [ + { text: 'Introduction', link: '/intro' }, + { text: 'Install', link: '/install' }, + ], + }, + ], + + socialLinks: [ + { icon: 'github', link: 'https://github.com/stacksjs/ts-collect' }, + { icon: 'bluesky', link: 'https://bsky.app/profile/chrisbreuer.dev' }, + { icon: 'twitter', link: 'https://twitter.com/stacksjs' }, + ], + }, +}) diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..e7caf05 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,29 @@ +--- +layout: home + +hero: + name: "ts-collect" + text: "A TypeScript Collection Library" + tagline: "Powerful, yet lightweight, Laravel-like Collections written for TypeScript" + actions: + - theme: brand + text: Documentation + link: /intro + - theme: alt + text: View on GitHub + link: https://github.com/stacksjs/ts-collect + +features: + - title: Familiar API + icon: πŸ‘ͺ + details: "Laravel-like API for working with collections in TypeScript." + - title: Lightweight + icon: πŸš€ + details: "Small footprint and performance optimized." + - title: Powerful + icon: πŸ’ͺ + details: "Rich set of methods for working with collections." + - title: Fully Typed + icon: πŸ—οΈ + details: "Written in and for TypeScript, with full type support." +--- diff --git a/docs/install.md b/docs/install.md new file mode 100644 index 0000000..22c2e75 --- /dev/null +++ b/docs/install.md @@ -0,0 +1,592 @@ +# Install + +```bash +bun install ts-collect +``` + +## Usage + +### Basic Collection Operations + +```typescript +import { collect } from 'ts-collect' + +// Create a collection +const collection = collect([1, 2, 3, 4, 5]) + +// Basic operations with chaining +const result = collection + .map(n => n * 2) // [2, 4, 6, 8, 10] + .filter(n => n > 5) // [6, 8, 10] + .take(2) // [6, 8] + .toArray() + +// Unique values with custom key +const users = collect([ + { id: 1, role: 'admin' }, + { id: 2, role: 'user' }, + { id: 3, role: 'admin' } +]) +const uniqueRoles = users.unique('role') // [{ id: 1, role: 'admin' }, { id: 2, role: 'user' }] + +// Chunk data into smaller arrays +const chunks = collection.chunk(2) // [[1, 2], [3, 4], [5]] + +// Find elements +const first = collection.first() // 1 +const last = collection.last() // 5 +const secondItem = collection.nth(1) // 2 + +// all() - Get all items as array +const items = collection.all() // [1, 2, 3, 4, 5] + +// average/avg - Calculate average of items +collection.average() // 3 +collection.avg() // 3 + +// chunk - Split collection into smaller collections +collection.chunk(2) // [[1, 2], [3, 4], [5]] + +// collapse - Flatten a collection of arrays +const nested = collect([[1, 2], [3, 4], [5]]) +nested.collapse() // [1, 2, 3, 4, 5] + +// combine - Create collection by combining arrays +const keys = collect(['name', 'age']) +const values = ['John', 25] +keys.combine(values) // { name: 'John', age: 25 } + +// contains/containsOneItem - Check for item existence +collection.contains(3) // true +collection.containsOneItem() // false + +// countBy - Count occurrences by value +const items = collect(['apple', 'banana', 'apple', 'orange']) +items.countBy() // Map { 'apple' => 2, 'banana' => 1, 'orange' => 1 } + +// diff/diffAssoc/diffKeys - Find differences between collections +const col1 = collect([1, 2, 3]) +const col2 = collect([2, 3, 4]) +col1.diff(col2) // [1] + +// dd/dump - Dump collection and die or just dump +collection.dump() // Console logs items +collection.dd() // Console logs and exits + +// each/eachSpread - Iterate over items +collection.each(item => console.log(item)) +collection.eachSpread((a, b) => console.log(a, b)) // For array items + +// except/only - Get all items except/only specified keys +const user = collect({ id: 1, name: 'John', age: 25 }) +user.except('age') // { id: 1, name: 'John' } +user.only('name', 'age') // { name: 'John', age: 25 } + +// firstOrFail - Get first item or throw +collection.firstOrFail() // 1 or throws if empty + +// firstWhere - Get first item matching criteria +const users = collect([ + { id: 1, name: 'John' }, + { id: 2, name: 'Jane' } +]) +users.firstWhere('name', 'Jane') // { id: 2, name: 'Jane' } + +// flip - Swap keys and values +const flipped = collect({ name: 'John' }).flip() // { John: 'name' } + +// forget - Remove an item by key +const array = collect(['a', 'b', 'c']) +array.forget(1) // ['a', 'c'] + +// has/get - Check key existence / Get value +const item = collect({ name: 'John' }) +item.has('name') // true +item.get('name') // 'John' + +// mapInto - Map items into new class instances +class User { + name: string = '' + greet() { return `Hello ${this.name}` } +} +collect([{ name: 'John' }]) + .mapInto(User) + .first() + .greet() // "Hello John" + +// prepend/push/put - Add items +collection.prepend(0) // [0, 1, 2, 3, 4, 5] +collection.push(6) // [1, 2, 3, 4, 5, 6] +collection.put('key', 'value') // Adds/updates key-value + +// random - Get random item(s) +collection.random() // Random item +collection.random(2) // Array of 2 random items + +// skip/skipUntil/skipWhile - Skip items +collection.skip(2) // [3, 4, 5] +collection.skipUntil(3) // [3, 4, 5] +collection.skipWhile(n => n < 3) // [3, 4, 5] + +// sole - Get only item in single-item collection +collect([1]).sole() // 1 (throws if not exactly one item) + +// take/takeUntil/takeWhile - Take items +collection.take(2) // [1, 2] +collection.takeUntil(3) // [1, 2] +collection.takeWhile(n => n < 3) // [1, 2] + +// when/unless - Conditional execution +collection + .when(true, col => col.take(3)) + .unless(false, col => col.take(2)) + +// wrap/unwrap - Wrap/unwrap value in collection +collect().wrap([1, 2, 3]) // Collection([1, 2, 3]) +collection.unwrap() // [1, 2, 3] +``` + +### Working with Objects + +```typescript +interface User { + id: number + name: string + role: string +} + +const users: User[] = [ + { id: 1, name: 'John', role: 'admin' }, + { id: 2, name: 'Jane', role: 'user' }, + { id: 3, name: 'Bob', role: 'user' } +] + +const collection = collect(users) + +// Group by a key +const byRole = collection.groupBy('role') +// Map { 'admin' => [{ id: 1, ... }], 'user' => [{ id: 2, ... }, { id: 3, ... }] } + +// Pluck specific values +const names = collection.pluck('name') +// ['John', 'Jane', 'Bob'] + +// Find where +const admins = collection.where('role', 'admin') +// [{ id: 1, name: 'John', role: 'admin' }] +``` + +### Advanced Array & Object Operations + +```typescript +interface User { + id: number + name: string + role: string + department: string + salary: number + joinedAt: Date +} + +const users: User[] = [ + { + id: 1, + name: 'John', + role: 'admin', + department: 'IT', + salary: 80000, + joinedAt: new Date('2023-01-15') + }, + { + id: 2, + name: 'Jane', + role: 'manager', + department: 'Sales', + salary: 90000, + joinedAt: new Date('2023-03-20') + }, + { + id: 3, + name: 'Bob', + role: 'developer', + department: 'IT', + salary: 75000, + joinedAt: new Date('2023-06-10') + } +] + +const collection = collect(users) + +// Complex grouping by multiple fields +const groupedUsers = collection.groupByMultiple('department', 'role') +// Map { +// 'IT::admin' => [{ id: 1, ... }], +// 'Sales::manager' => [{ id: 2, ... }], +// 'IT::developer' => [{ id: 3, ... }] +// } + +// Advanced filtering combinations +const seniorITStaff = collection + .where('department', 'IT') + .filter((user) => { + const monthsEmployed = (new Date().getTime() - user.joinedAt.getTime()) / (1000 * 60 * 60 * 24 * 30) + return monthsEmployed > 6 + }) + .whereBetween('salary', 70000, 85000) + .toArray() + +// Sort by multiple fields +const sorted = collection + .sortBy('department') + .sortBy('salary', 'desc') + .toArray() + +// Transform data structure +const transformed = collection.transform<{ fullName: string, info: string }>({ + fullName: user => user.name, + info: user => `${user.role} in ${user.department}` +}) + +// Pagination +const page = collection.paginate(2, 1) // 2 items per page, first page +// { +// data: [...], +// total: 3, +// perPage: 2, +// currentPage: 1, +// lastPage: 2, +// hasMorePages: true +// } +``` + +### Advanced Filtering & Pattern Matching + +```typescript +interface Product { + id: number + name: string + description: string + price: number + categories: string[] + inStock: boolean +} + +const products = collect([ + { + id: 1, + name: 'Premium Laptop', + description: 'High-performance laptop with 16GB RAM', + price: 1299.99, + categories: ['electronics', 'computers'], + inStock: true + }, + // ... more products +]) + +// Fuzzy search +const searchResults = products.fuzzyMatch('name', 'laptop', 0.8) + +// Regular expression matching +const matched = products.whereRegex('description', /\d+GB/) + +// Complex conditional filtering +const filtered = products + .when(true, collection => + collection.filter(p => p.price > 1000)) + .unless(false, collection => + collection.filter(p => p.inStock)) + +// Pattern matching with whereLike +const pattern = products.whereLike('name', '%Laptop%') +``` + +### Statistical Operations + +```typescript +const numbers = collect([1, 2, 3, 4, 5, 6]) + +numbers.sum() // 21 +numbers.avg() // 3.5 +numbers.median() // 3.5 +numbers.min() // 1 +numbers.max() // 6 +numbers.standardDeviation() // { population: 1.707825127659933, sample: 1.8708286933869707 } +``` + +### Time Series Data + +```typescript +const timeData = [ + { date: '2024-01-01', value: 100 }, + { date: '2024-01-02', value: 150 }, + { date: '2024-01-03', value: 120 } +] + +const series = collect(timeData).timeSeries({ + dateField: 'date', + valueField: 'value', + interval: 'day' +}) + +// Calculate moving average +const movingAvg = series.movingAverage({ window: 2 }) +``` + +### Lazy Evaluation + +```typescript +const huge = collect(Array.from({ length: 1000000 }, (_, i) => i)) + +// Operations are deferred until needed +const result = huge + .lazy() + .filter(n => n % 2 === 0) + .map(n => n * 2) + .take(5) + .toArray() +``` + +### Async Operations & Batch Processing + +```typescript +// Process large datasets in batches +const largeDataset = collect(Array.from({ length: 10000 }, (_, i) => ({ + id: i, + data: `Data ${i}` +}))) + +// Parallel processing with batches +await largeDataset.parallel( + async (batch) => { + const processed = await processItems(batch) + return processed + }, + { chunks: 4, maxConcurrency: 2 } +) + +// Async mapping +const asyncMapped = await largeDataset + .mapAsync(async (item) => { + const result = await fetchDataForItem(item) + return { ...item, ...result } + }) + +// Batch processing with cursor +for await (const batch of largeDataset.cursor(100)) { + await processBatch(batch) +} +``` + +### Data Validation & Sanitization + +```typescript +interface UserData { + email: string + age: number + username: string +} + +const userData = collect([ + { email: 'john@example.com', age: 25, username: 'john_doe' }, + { email: 'invalid-email', age: -5, username: 'admin' } +]) + +// Validate data +const validationResult = await userData.validate({ + email: [ + email => /^[^@]+@[^@][^.@]*\.[^@]+$/.test(email), + email => email.length <= 255 + ], + age: [ + age => age >= 0, + age => age <= 120 + ], + username: [ + username => username.length >= 3, + username => /^\w+$/.test(username) + ] +}) + +// Sanitize data +const sanitized = userData.sanitize({ + email: email => email.toLowerCase().trim(), + age: age => Math.max(0, Math.min(120, age)), + username: username => username.toLowerCase().replace(/\W/g, '') +}) +``` + +### Data Analysis & Statistics + +```typescript +interface SalesData { + product: string + revenue: number + cost: number + date: string + region: string +} + +const sales: SalesData[] = [ + { product: 'A', revenue: 100, cost: 50, date: '2024-01-01', region: 'North' }, + { product: 'B', revenue: 200, cost: 80, date: '2024-01-01', region: 'South' }, + { product: 'A', revenue: 150, cost: 60, date: '2024-01-02', region: 'North' }, + { product: 'B', revenue: 180, cost: 75, date: '2024-01-02', region: 'South' }, +] + +const salesCollection = collect(sales) + +// Advanced statistical analysis +const stats = salesCollection + .describe('revenue') // Get statistical summary + .pluck('revenue') + .pipe(numbers => ({ + sum: numbers.sum(), + average: numbers.avg(), + median: numbers.median(), + stdDev: numbers.standardDeviation(), + variance: numbers.variance() + })) + +// Pivot table analysis +const pivotData = salesCollection.pivotTable( + 'product', // rows + 'region', // columns + 'revenue', // values + 'sum' // aggregation method +) + +// Time series analysis with moving averages +const timeSeries = salesCollection + .timeSeries({ + dateField: 'date', + valueField: 'revenue', + interval: 'day' + }) + .movingAverage({ window: 2, centered: true }) + +// Correlation analysis +const correlation = salesCollection.correlate('revenue', 'cost') + +// Detect anomalies in revenue +const anomalies = salesCollection.detectAnomalies({ + method: 'zscore', + threshold: 2, + features: ['revenue'] +}) +``` + +### Performance Optimization + +```typescript +// Cache expensive operations +const cached = collection + .map(expensiveOperation) + .cache(60000) // Cache for 60 seconds + +// Lazy evaluation for large datasets +const lazy = collection + .lazy() + .filter(predicate) + .map(transform) + .take(10) + +// Optimize queries with indexing +const indexed = collection + .index(['id', 'category']) + .where('category', 'electronics') + .where('id', 123) + +// Profile performance +const metrics = await collection.profile() +// { time: 123, memory: 456 } + +// Instrumentation +collection + .instrument(stats => console.log('Operation stats:', stats)) + .map(transform) + .filter(predicate) +``` + +### Advanced Serialization + +```typescript +// Export to different formats +const json = collection.toJSON({ pretty: true }) +const csv = collection.toCsv() +const xml = collection.toXml() + +// SQL generation +const sql = collection.toSQL('users') + +// GraphQL query generation +const graphql = collection.toGraphQL('User') + +// Elasticsearch bulk format +const elastic = collection.toElastic('users') + +// Pandas DataFrame generation +const pandas = collection.toPandas() +``` + +### Type Safety + +```typescript +interface Product { + id: number + name: string + price: number +} + +// Collection is fully typed +const products = collect([ + { id: 1, name: 'Widget', price: 9.99 } +]) + +// TypeScript will catch errors +products.where('invalid', 'value') // Type error! +``` + +For more detailed documentation and examples, please visit our documentation site. + +## Testing + +```bash +bun test +``` + +## Changelog + +Please see our [releases](https://github.com/stackjs/ts-collect/releases) page for more information on what has changed recently. + +## Contributing + +Please see [CONTRIBUTING](.github/CONTRIBUTING.md) for details. + +## Community + +For help, discussion about best practices, or any other conversation that would benefit from being searchable: + +[Discussions on GitHub](https://github.com/stacksjs/ts-starter/discussions) + +For casual chit-chat with others using this package: + +[Join the Stacks Discord Server](https://discord.gg/stacksjs) + +## Postcardware + +Stacks OSS will always stay open-sourced, and we will always love to receive postcards from wherever Stacks is used! _And we also publish them on our website. Thank you, Spatie._ + +Our address: Stacks.js, 12665 Village Ln #2306, Playa Vista, CA 90094, United States 🌎 + +## Sponsors + +We would like to extend our thanks to the following sponsors for funding Stacks development. If you are interested in becoming a sponsor, please reach out to us. + +- [JetBrains](https://www.jetbrains.com/) +- [The Solana Foundation](https://solana.com/) + +## πŸ“„ License + +The MIT License (MIT). Please see [LICENSE](LICENSE.md) for more information. + +Made with πŸ’™ diff --git a/docs/intro.md b/docs/intro.md new file mode 100644 index 0000000..2cdb757 --- /dev/null +++ b/docs/intro.md @@ -0,0 +1,281 @@ +# Introduction + +> `ts-collect`, a powerful, fully-typed collections library for TypeScript, combining Laravel's collection elegance with advanced data processing capabilities. Features lazy evaluation, statistical analysis, machine learning operations, and comprehensive data manipulation toolsβ€”all with zero dependencies. + +## Features + +- Lightweight & Dependency-free +- Fully typed +- Laravel-inspired APIs + +### Core Operations (Laravel Collection API) + +- [x] Standard operations (map, filter, reduce) +- [x] FlatMap and MapSpread operations +- [x] Element access (first, firstOrFail, last, nth) +- [x] Subset operations (take, skip, slice) +- [x] Unique value handling +- [x] Chunk operations +- [x] Tap and Pipe utilities +- [x] Collection conversion (toArray, toMap, toSet) +- [x] Collection inspection (count, isEmpty, isNotEmpty) +- [x] Combine and collapse operations +- [x] Contains checks (contains, containsOneItem) +- [x] Each iterations (each, eachSpread) +- [x] Only and except operations +- [x] Forget and random selection +- [x] Push, prepend, and put operations +- [x] Skip and take variants (skipUntil, skipWhile, takeUntil, takeWhile) +- [x] Sole item retrieval +- [x] Conditional execution (when, unless) +- [x] Wrap and unwrap operations + +### Advanced Array & Object Operations + +- [x] GroupBy with multiple key support +- [x] Value extraction (pluck) +- [x] Where clause variations + - Basic where operations (where, whereIn, whereNotIn) + - Range checks (whereBetween, whereNotBetween) + - Null handling (whereNull, whereNotNull) + - Pattern matching (whereLike, whereRegex) + - Type checks (whereInstanceOf) +- [x] Comprehensive sorting + - Basic sort operations + - Key-based sorting (sortBy, sortByDesc) + - Key sorting (sortKeys, sortKeysDesc) +- [x] Pagination & Cursor iteration +- [x] Data partitioning +- [x] Set operations (union, intersect, diff, symmetricDiff) +- [x] Advanced products (cartesianProduct) +- [x] Recursive operations (mergeRecursive, replaceRecursive) + +### Advanced Transformations + +- [x] Group transformations (mapToGroups) +- [x] Array handling (mapSpread, mapWithKeys) +- [x] Conditional mapping (mapUntil, mapOption) +- [x] Data restructuring (transform) +- [x] Type system integration (cast, mapInto) +- [x] Property operations (pick, omit) +- [x] Fuzzy matching algorithms +- [x] Key-value transformations (flip, undot) + +### Statistical Operations + +- [x] Basic statistics + - Sum and averages + - Median and mode + - Range (min, max) + - Products +- [x] Advanced statistics + - Standard deviation + - Variance analysis + - Percentile calculations + - Correlation coefficients + - Entropy measures + - Z-score computations + - Distribution analysis (kurtosis, skewness) + - Covariance calculations + +### Time Series Analysis + +- [x] Series conversion and formatting +- [x] Moving average calculations +- [x] Trend detection and analysis +- [x] Seasonality identification +- [x] Time-based forecasting +- [x] Temporal grouping operations +- [x] Time-based aggregations +- [x] Interval handling + +### Machine Learning Operations + +- [x] Clustering algorithms + - K-means implementation + - Cluster analysis tools +- [x] Regression analysis + - Linear regression + - Multi-variable regression +- [x] Classification tools + - K-nearest neighbors (KNN) + - Naive Bayes classifier +- [x] Anomaly detection systems +- [x] Data preparation + - Normalization + - Outlier handling + - Feature scaling + +### Async & Performance Optimization + +- [x] Asynchronous operations + - Async mapping + - Async filtering + - Async reduction +- [x] Parallel processing capabilities +- [x] Batch processing systems +- [x] Lazy evaluation strategies +- [x] Caching mechanisms +- [x] Performance tools + - Profiling utilities + - Memory optimization + - Index management + - Operation monitoring + +### Data Validation & Quality + +- [x] Validation framework + - Schema validation + - Custom rules + - Async validation +- [x] Data sanitization tools +- [x] Quality metrics +- [x] Constraint management +- [x] Error handling +- [x] Type enforcement + +### Text Processing + +- [x] String manipulation + - Join operations + - Implode functionality + - Case transformation +- [x] URL slug generation +- [x] Text analysis + - Word frequency + - N-gram generation + - Sentiment analysis +- [x] Pattern matching +- [x] String normalization + +### Serialization & Export + +- [x] Multiple format support + - JSON serialization + - CSV generation + - XML export +- [x] Query generation + - SQL queries + - GraphQL operations +- [x] Integration formats + - Elasticsearch bulk + - Pandas DataFrame +- [x] Custom formatting options + +### Streaming & I/O + +- [x] Stream operations + - Stream creation + - Stream consumption +- [x] Batch streaming +- [x] Memory-efficient processing +- [x] Buffered operations + +### Advanced Mathematical Operations + +- [x] Signal processing + - Fast Fourier Transform (FFT) + - Signal interpolation + - Convolution operations +- [x] Calculus operations + - Differentiation + - Integration +- [x] Numerical methods +- [x] Mathematical optimizations + +### Special Data Types Support + +- [x] Geographic calculations + - Distance computations + - Coordinate handling +- [x] Financial operations + - Money formatting + - Currency handling +- [x] DateTime operations + - Formatting + - Timezone handling +- [x] Complex number support + - Basic operations + - Advanced computations + +### Versioning & History + +- [x] Version management + - Version tracking + - History storage +- [x] Change tracking + - Diff generation + - Change detection +- [x] History operations + - Rollback support + - Version comparison + +### Development Tools + +- [x] Development aids + - Playground environment + - Debugging utilities +- [x] Analysis tools + - Pipeline visualization + - Performance benchmarking +- [x] Development modes + - Debug mode + - Strict mode + +### Utility Features + +- [x] System configuration + - Configuration management + - Environment handling +- [x] Internationalization + - Locale support + - Timezone management +- [x] Error handling + - Error modes + - Exception handling +- [x] Resource management + - Memory tracking + - Resource cleanup + +## Testing + +```bash +bun test +``` + +## Changelog + +Please see our [releases](https://github.com/stackjs/ts-collect/releases) page for more information on what has changed recently. + +## Contributing + +Please see [CONTRIBUTING](.github/CONTRIBUTING.md) for details. + +## Community + +For help, discussion about best practices, or any other conversation that would benefit from being searchable: + +[Discussions on GitHub](https://github.com/stacksjs/ts-starter/discussions) + +For casual chit-chat with others using this package: + +[Join the Stacks Discord Server](https://discord.gg/stacksjs) + +## Postcardware + +Stacks OSS will always stay open-sourced, and we will always love to receive postcards from wherever Stacks is used! _And we also publish them on our website. Thank you, Spatie._ + +Our address: Stacks.js, 12665 Village Ln #2306, Playa Vista, CA 90094, United States 🌎 + +## Sponsors + +We would like to extend our thanks to the following sponsors for funding Stacks development. If you are interested in becoming a sponsor, please reach out to us. + +- [JetBrains](https://www.jetbrains.com/) +- [The Solana Foundation](https://solana.com/) + +## πŸ“„ License + +The MIT License (MIT). Please see [LICENSE](LICENSE.md) for more information. + +Made with πŸ’™ diff --git a/package.json b/package.json index b900604..f96b687 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,9 @@ "prepublishOnly": "bun --bun run build", "release": "bun run changelog && bunx bumpp package.json --all", "test": "bun test", + "docs:dev": "bun --bun vitepress dev docs", + "docs:build": "bun --bun vitepress build docs", + "docs:preview": "bun --bun vitepress preview docs", "typecheck": "bun --bun tsc --noEmit" }, "devDependencies": { @@ -45,7 +48,8 @@ "changelogen": "^0.5.7", "lint-staged": "^15.2.10", "simple-git-hooks": "^2.11.1", - "typescript": "^5.7.2" + "typescript": "^5.7.2", + "vitepress": "^1.5.0" }, "simple-git-hooks": { "pre-commit": "bun lint-staged"