From 988785147ce7cc76f90037242532d4be838d5e41 Mon Sep 17 00:00:00 2001 From: dusk Date: Tue, 1 Oct 2024 23:24:41 +0900 Subject: [PATCH] feat: check if client bot or not when counting visits --- bun.lockb | Bin 151816 -> 154232 bytes package.json | 3 ++- src/routes/+layout.server.ts | 33 +++++++++++++++++++-------------- tsconfig.json | 6 +++++- 4 files changed, 26 insertions(+), 16 deletions(-) mode change 100644 => 100755 bun.lockb diff --git a/bun.lockb b/bun.lockb old mode 100644 new mode 100755 index 7192bccf844a0b87bf6bb0d43f894508825673bb..212876d008e0ff86f1df7abc36f5edf5bce9f726 GIT binary patch delta 29115 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 SoV&K<=;)>=(nPe8P5FPISC=LL delta 27957 zcmeHwd3=r6+V-;^*<^JON}+OwB#7R>wbnr&#AuWdw=gY{L$yv>$%r;uY1jF-D~aaZS~1F z#)%7zQ+%3R-1^k`$D&4`U+UK6^M_YApME&XXjojQV#6ivN;+R@KW^9XNLiw1!qnIX z1rH0ELL}*3>);$)u2qVFqOv3vo`$Rr*&Ws{kYSLHkgXxBK<+|(O~`4Q{VK@X;PW7> zLIyxmy1aB-lFgbZ4NJ16T2YqOpytyZ(k&VWx!DFG&1XSWA;ch~LGi)RGFM!ZS($HPhs3P0rTjBuM;MI82iXnvB$>39<&_TWPYM zChax(8zL$GB?bj;D*PJFrXHLQS+@WIYfh>yJy(({p?|2w&(U8bCu#gwje8*#O|?|( zuyo`lxr38kWlcImqB9E-|}6eOifhb*8uco7CPr8Yt~ zfm{wrdRvb7kkpL9l0OEX63l}h)1lBdBt0YBDoN8co@7f;^v=taY)DM;gEX1xotlwg z$wh5aZE3b#X;4!&ege`_L+&?4|5L_8ts{n^L6WtZYLJv_$<3w307I&=H776EmYRb( zkdS6gaH$jGKHiiMsU7Scl1cLt}iPqYrs8-n<> z9P~duA&8)wzng4Jz#5ZmIo9FGR~ph%tw3liZIW7Ylf6;fgk($VP{hB0o_Z?TlH-j^ z5BU|G^4a69+B^HG6}6-&?UUw$*F*dVkW`Vpf^3_2N{%FD=B1BF$Vjw$p(4~ZNtT@4 zEEJG!&C9VRjgYGOsx7<>NiAySr&jC;IN8_ITJ{^(GJ=J7A*pB2LsI-He>Htdj`s*l zTB>Bp9+GLv&aoEkM+9Xk1*r1ZHfqg32B%3w6TpJ5-;0c>#!-Rlvg(e>MgC!#R-irv zZ-A4Z7=w7s-$HM2@^9YYRL)~GiYlf}%7U_4nPW{GX3a*Iqrkx60|kmaWX@$69<&swF2G^G}+Cnt33h z1rn7l9D{X9HEs+}1?OUU4o0nS12ndyO{xRB4M_#UX<2g;Bq;@)CZRnfrBnJDY5IfH z5JYJ9CQW8rb23s3hFPWDaJ8#aAgP4|ASq)^s*HEjC23VBbx5jf@tHIs@I33N4vDXp zVG~HIV0}o+=iM%9Iwy_m6-!9Y7-~zjWM^9~i3RAE%-lEB0$)Iqhq9!PNVDW7BKW{oeO7{mYD9HXvu{KOSF1t zTNC&7R{L;wjGE6zNXo~)pOW5O_%#%iQBFp70{O;0h#-SB^kJGUCpX8Eo=EFzQk>e< zY+G8kB}rXpG>D!0s}&CJ&(|7#3dU$=IhI6nfKpnvjf8XnsDW&c4N!ZC#x&bHTyh?$ z7QY_xwGj`8oSSR2W~U{hXNLdFIR^3ixhON+mXik0_rV~wx|*LUkQN{#ax_QdRXN^UlVrvveTE_GA*6Z;wMXL#R?&*U&be@o^u2w4SgCU>H8`Y=Yj2LH?;(d z+LDT1SO-oc_yr_YEDsq`!r&olLfS7Vej7OT5T=N7K+*j~77Qqz1(Ie)2gH-z9&{|N z4xFBp6VWgnE0f%idr6Agr9)G#dD)2E08W$g(-fXxxoJU*G&Ooxs+xWcBz1%}C(YZM zK8y~8mef3}l#qdCjyf+yJk<|5DeYRBp>}|CrYduiE!hZ4*(i(ZIS|qrG6It7mz1O0 z1%SgZ78HJ!r8>-dP}GCLcyJsg3M+zB2Fc*?orMn|sUv$rxet=wg56#lclx0gf|xp|eNzJJYWW3H@lgi=E zlcX+SvSJwtM%h;4;jY2P<6xAoGA{wEZIC2?u!=m~E!db1)(Ol`Vc&oaRv1;Tc14K} z6O^ZWu%RbdN8a8w%Ib=q^5FWz#_qvmKeSQdy9{D z4>LYSC{)#Z1RL7hBMoogr=1-F!F-Ern7qrL7dJJ@9!6dYF~rD2o0$xsU~;_8+cyg{ z+(sx)33bKZ9l$A~aA5^}@ojDWM{SEC{u;!%R~n^AH-MM4m^;s)WLETzy9g z%_|GNL`Y3Bpt>Hr2_dxtwVZHHr4;f|CtmDolD~4|`7KTIBM5hsA*hBVwd12b!sNml zycGIvHF#(%lVLknPA}fRRhXeF)<}dB>R%T6sx0(NS;&O7*i*5ah){PWbfhfgf)%Ff z;>$uy%0dsyLLqPgs$F4OXfHxt)w>FJL4q*!G?=q zq5OHhFu7Sn9vWmazTdE{aF1Z)4lr6YixG{|J=3U8lH!)e%nP#0ynK0_!7 zhIV|cYp~p|F)s}^8HP7jmVRKEyuLBd4>1{UlLA)i0`zL4rcwPtE*Qlj2hU)`T4IXV zcz{p{^s1FtQ#DNmW!c%lD2=4B#bD%L(9u}JPr;}ckslfo*i2oLcAV7nwpy&u=d&S#?w@}wUd=D}j2}T}5Nh*Kef`^(+#^+GBf>P!T zCe2%_HLgU}F-`#^Mf^?nhuld8oTdKGK?(b~4EgeR*hSlOfs{9nYV;hshuM@?t3N zLeY^trX1$SL%W!aWBnwlgOYg(`eHj+I2h(Y{a^z_gQ68z6XUNerVpT?epe^VEwEk+ zLkAe%XhTK8uNy}qM9o#3v<^&5Lmh((6H^B^0<04iU=#?2mgRgDEEudRO+MK^kQa9| z8Iv$QXz3$c^v&u(9@^bxdCk4Qs28C}t4)a0Hmz zl(8Yf@|Lzd-)u6-(1h~#?qP;@2n8t1JRc!i0F{&pv$JpnZeK{ zs3u0*SO7*7$e>KMEnw8!>hgP`rBkO`2(rf@X%jXDEE-Jpo!h|PDq~gKzuGN*z^HV^ zt;rv?=fw?7^1k*w^evO|GZYx024#wzG0Xs2^suAruKcx(r2b1fvS5O?VDQ zU9GY(L{JW}#9AE>M!74~T;9`#m-aOoWmK1XPMr$vz|^q`Zx?JF_Xk!CMg=LBhH98% z*o*6j8R8HM;akGOUD7?+7zIXc#4Lu(m;@Hew{#CPUPg#Yge!qn!w9us zRF8dLW9sa#{if~{!n*_;hlA1lQoH;R7?rPXLsc-HsCSVI7Ft&@8V>bzI!AegXwtB07ro4>leH zBV%>N)QF>r`Mgt@+%t~nTTJq2al9DfcpNXan2eSBtE(EL(Iwc>8?3wH*=Hf7&O`EK zXTWH-U?aw7kLqu$409BItvi_N<>;h83XHsj>Vww5%}Wz-=7EwjQ%@IO19*O-$aQ;c!%dh9DauvLsX0Br4U`?d1$gpZf4>65aTVp z7-E-&mnP%DVo`e%izGVO5Q6-ADd(~GDTK^19N5!N4CbXalWa)fp(!RqOoC!%2{W!j zs4uMG`rrm@B=XV}xWPnqUs79l7K}Ou^R`v6T*u0bhnnO;R$e;PWIScn*Efa^AMh&W-^W+qAqom+%8x?I)s;|ndCajJTx6= z-(-AFK>{qe_+aCGFx89FP(jjO>zm3D>0Io}3D8r5gYLsNNZmdSWGRo_l%N(H3pBT7Cx z6^u%NkH#vSm&QZ0O@<3l_EdalvvlfWI@b33=qePzmKBgd;l6 z2kQ{(tLQ4_;)@JAyctpu>Zj;-AT&hLHP6%Y%R}gGMRx?DNHynS^udzS79gbR4wvbC z-qq9QBlI?XKsKC2XrPk9e>i=zrL-I&wWe1P>PM&RvY`9=u5QiBGKO2#+rh^a0arpx<>M*!5UZ6PU7X%YGwy@yO5uS4sIRkYs@L z1S$ZH0U2ltFaRGml!qj7FHPd}fx=rr(nGQ$0EZ$~0)hd`4^vCY4~{{x$GJy&ARFp| zGD!tsjVX^J`RGw~3W(xpqa^Q01W!kx3V>}+c}Ug(;7XL|e^4sr|F<%x_FJ?H{h6$T zIE=dTyk4s1{|AQuRYw2Kc&+?DtpK%fBv2W6AD|g98E6E24bVf926i+!o3R`6j1Uj09joH=pjk^ zYXIr51N8hS(g?eIinS^!{e6v-q9|=8u$@&*0i;W;CWS2Y8U9K zH(enOeC60W1+~F~!6>$^mg-eW*6lU@pGivB0r6zl8IpRWt7iYIBvm)ONOsraAqx~m z4^8n`k_s|wc7GFH1Iv}Fv^^n;k@a!5fnw?IyM1NuQzVGYSx(jPf9<0>d>qQZsl}Qv4X`DT>n3Lz494H2znT z>?UY-B&i~S|IifwiKMRk81_}U+jw=eoC`)7e4)vCnw$?w#VyqMB1kH3F(f@CX;!a* ztPZ(Z)03p&7LC6uX@-?(dPtldH3dcN)*?t!a1UP8uLm^!pGm6FAuXOH1rKZTh^8mW z_;WOutWRj#S0(9BX?l{>tREmre*u!BF4F72kdBDI13RkqLoMAekkpNjX`xVtziSas zAgS5UAnAEklHCibEB(>aG)7R1T zuS!zY)$}CE@iv5{d>d)9u@?WTqzZab|5rmG7?Nrlsu})INUC@TE#FRBz9h*v_S1NQ z9w13Ij?-j+O}?!elBDUX z<9~H3|NAtqooD_&jsJZb|Ns9q?)Zn(IG_1hE;oE(=KZEQ@_}ENSp~lIi&$6^6OxAxZhW? z{3h76ugt72zXCR6jw63#v6(FvRKxbFU7kFXUk(*QyzzRGrk6IFK%2B%bIfw-Yxh>yjyaom9eZ9x8d#0 zN6bV^7NT7%&8#)Q@;O?v$dNZ$WoCXnYZY1ob`q=&_xw7R1@IAg2lAtM2l3{sV_7gC zi+2b=i+5Y@w{Q&?!uqq{RWTvHkNheOY!c;+4@-4oyXzbgRfbSFM26R_Q2Z*r#% zv8)%j;r$jb!8?-I-5ATFcoyEh`98e+aL?jc)|ZdKJDMNGJBByk6w6}ySiJl3vv|jG zzs<3%Kc9s6+x!aN19;mlv1}lpiuWLX3-5P$_|{k!&u8Lo;Scd1%zJE$WeI%#Hq5Rf zM{d||W>y}x9kUDUTd*OVm0)&laOBn!GqdqEU@jZck{xC?lv{S7C1AV3(zw%3j7hO0 z&)aEc8N39{YZJy~mzibptX&uru#;dp+;evju;IJ0vJRQqC){=j?c0MH2sV}1J&g8&jXrE_F`p$3EuoD+6VU0Q8Sy#&w|a^hxQ#av(NdYV`$%gv=3|!Z+jf=1DkW) z%)a2az?OWE_MI@Z`F!RHwC@1g2lgfJaT4u2i1wW{vqk(V*aonHr_5|IUwR7dJB0R~ zHnXKX?ljtW810*8X3O~+u)Sc;XUuFRx12%yj$kywzUEG6(Y~V?&9i2I*D2Qw?;N5O7_1)evvjeP8RwC@D`2iPX=cLD7?3IB1y z%(n0=U{Ao_xM*hE_|%JN-zi7FXpWhc@LOR0PNTJ#%xov0c?s=1gVuuW<~=T>ePAmu zo7s2#DOmDZwDyXb?c+vt9HyKQDa@|m~Mz8}#( zuTf^B;Nn$7`_*D3+T@hceoeB zhyR2o-ZRVhC0-2bbpvg@Z<>wOr;MW-b1oWUVvzOd5 z9ZkK9i8S3TGsbI(7~bz^%$*sulU?~0ZM}z4e?&Xk)JJG5*yBfLxf0_J(_?t@eM~wL zfrQyJ(AEc-W;4ukWyTxML|Z{G%rwi6jJKGDwmw9SW|`$`jGqJb`UP|AbF=Kkc<5}j z6?D#QGpotNA7em&#pHTSo7zLLkVlR@`ZwCt=KqEP1vC6kn_ATG7|_RXeqi-Edx8P| z4bJZgZE9=4o`5+&HDg<|JVh&iM=QZRxl<_y^a*NSYR1-90%rddP5!4Dn_JdD(MYh9 zV9mJaGYn`cmdi6UHn^i;F8{=Gd2YrQH}*LuEZB80Z|?U36ZRRJ^g`L>z`UNL<6hDx zH}xeZEZAePHq*kf8BBcPIBgL#v%qN&!9rd-if9HJEao%to8Sf+yse0mS?shK%u#$x zJWQ|(ELL=9P*^KK(O#?}#S>CE+diP%wnuP6njZ=ofK~hKO+>w zD?u^M2*q3C3Mstop?JdqiYPJF0g5xEcua~uBD^vb6OB+TstiT6cu0y62PmSeKoKkE zSHbHhDGZKK#EB?JC}vcK;#*R@Em&13x>te1S`~_cVht&tkixkd6z>R2H7J%iLb00^ z7U5JKihfn0$g2)Tf+!({eKjbWI6+|*Sx!)FAjL^i3=y6+ph&I`#e^DA*u+sNSc+&~ z6Jn?s3nBJ8A^LhvM5hVATF|G9NhC7F6%v`EtusWHm`WmB+#-=9!fQk1ikT$x#6t)X z;*5-<>mZ|d#r!(Z4;N2Kj1W;S5cy&$iIIZUg%~B`NQ@S1NQ@E2dJqM|LZVP?Br#Sv z)rS}-Y$V(DKM*Knq>^G-OZA^k6+%{5Q&4vEl*knApT!2ZLE#kHnu&R>nVneTisK;) z6h~Sj%QYcdY40%+;mx`j+I2vtR7Ok1XqPwZC)W$7%65_seS7?&B&Fh_x<9j*uS5x$ z_$X;2pfHT+t(nHE9j5Q_(Tt{B7_nv{J(tPk{v?Esvq+=yeDqG&%z5{yi^}FO3FeM#X1nd zqjPF;O+|x$kO2eY^amyCM0#?ybo7zz6Gfwb150_)mq9lvfM*yarK9iUCaSsuX#@fk zroX>5SCvw}rlT*R+h{ua>Xw4^7tKHfs1l>hdPH0v8bdt3gDsdfGJ2{mo?CI?`b;vvUMUr&v;Gegm93eQNJIi z7Sk`B8frRfIb}mV+DQLaV3MY+1*H{Xs=x=D&Kco<0#tzyH64AIwi97`CTlwSRg(VA z_(z(~1v>rPar&;AlGFtyy@YZ9sG*& z%{dkJnWl3`cr?P4$23jX0AZQ~l*e>cS6RAAeTk>b2O?$)YbZ`kVz~wMH6+~*(hl$f zngcC>mOv}O8=!w3>kIe+{y-amz6Y%b)Cb&w1^|6$O5dkC0X2Y{0R4rh8bDvn(wDl_ zGzQ2(1sTI-hX76QkARPXPlW9w)<8`Dh_x$N489at1}q0w04sq@$mlX~6}Sdm2W|i~ z{pqXh)4&T#RD`ZGz8S;)Wx3y)UDJ#0+<2J1ZDv=aWMV`k|zQUfkr@6pcz0* zrv=awXa)EHzJMR#5706S0O2PB?OO8{~Sp2259-va-s31v7=Se zQO1-FN8kuDqi>Jf0>=9Z(4{0#@X=1L)y9;e?hk%~|+Qx!_$H??1a0lVLz|X*&Koy`p&=v>CmQ82XFvj zqMQS0kGBUZqRJ8)s+=P1AS=8QrjrF78gxnF+5jbV1}X!3+FA(L0Gxp8KsBHWKxwN2 zj<1ACR}-N8>XId`6>1S}TlGcwr>s%5Hw6Lml;km60L=j!p=JOLKofulftFN5z!UHQ z8UVCAl2@grNF&-B=pk&Mvd#q|2-0BEilmiEE0k6$`MwCi3?u;CfTch`fa1Ocwg8KP z%>a!H*^dO40J{Dwgeh(zKxyU!GXMchr~aOXz{kKO;5~p`7-d2`#&94H$OW>2EFcpg zw`Bzq0jk_!ARc%J7zFeI1_E&aRX7TG3+M&V`7;tS8i+;tio5CyLWz275yZ)$KQI7z z8?XTJzz`q_NCs>`3Xlq90BJxvkORC63vB3MlcwhqX z4`3oN8K72w2z&s11WW}!0j2<-0iOaKpkAcjqaK?FQ18qJW&zY2Gl9>6xxgHt;0wGK z0F;Of76CL~#8&|;fp}m!K;y5EE!k0c8L$GNUfKjufknVZU^VbHKoz7R-T+YC8eko; zmfHOd0^b7bfq0-8&h}`}><9J%dx71+4qz9s6Zj6;18ARIUQ!$tavV4cP+`Om0SAEtz+vDB za11yNQ2a%JT1~xh9*74{(768q)CbTV%F%=>MBx{}bKoX$1GoxY0WJgAfuDdMfomGS z2YDZ$p}Gs)25tegqV50`|1I@r#-#(EAdnq0CfN=$C*{cJtqi=EWsLyLct6LRJqzf zeV`st7oc*QLN)>10R8CI7~zJ1ClCi44@f$Wk-m`z%EJq20ki^I0<>9CIsQNZ&<5}Y zpes<6ejpS{lbs6hfN&P136kbgJIFAA=Hg0#esx0g^G$?l>!#I7+c?>VXmJ##jv${z z@gsm7fb_KOpM`w+vOt~YlqqFKcmt7LfX+ZCfQIupKnY1t2U0o+bp^Ts6i;c)fH%T) zwuk~E0rJXkL6$)33#^aE;~+;CAcBs;u>cKG3=j=achy52Rgc2t8i-Sv&I*Y@0x%e` z0P%pH$3TRe0d#DmV>Jy0rP1@GBOTcc01Bwk@jw!w8;nCZ85jc4!DTc+Jv0iE4mSA! z9cG3Dbim04vH?1>r33E*c>o>V=wL+0xinxXkOJ6%RA4*pLX<#1>rqCOA!SSjP(idU z(8+2dWFh2OfV%lTNOBu`4@G_k1)lE5#o$>im_8uUQ#5ZD+b+w~n3%nYxwy`QQB`Dg z`r&}$3QM;wmDwPFA73Ag;VLEuEP%x>SYS~V*13=nGCM0F2o`Nri_=U@frZ>!7QPE% zNgtsdVL2qs{_9a06WYQuNVV)Pi;Mr6rIwdoKgv7)OO&D2w@fav6RSwC)l%MOC$4_U z{N+E^DM@xPh#3o6gkDFvyJ0#tTff6|eDo*Dk1I9bfvN_mRn;q?7}jNK(?sDSR-u=a) z-u@VA?ENpxW9B)CDoao^{mRhbW-CMd|9PZqxy3~X(GeCw z`X!@%FK(Ovk4Izcm0NgJR{pkA*r8HXQuf4siRCeED~pdQcm3khYFCf?wR-mbvvP~< z%3{Y7^w0$-QT+%;@do5ll%`+EdGX@5Im`XGw6$Zt)Kh`j0x$(@U~btqwp$WVG3}@F zn0htEAWExW@>z0y>XMpuy8T{mp3l! z$sNlr^b1aZcrU4|-}G}O7W&<-%e&eJW_M^d zyF7;15)sQ$GyS&Lqw}k~?eeP7E!@7-+;t%e+i3hL<((eil^)vUaH}=vBrS-l(ewYjH>U?-~ zu95Tnr9XB+jIWQ4()3&TKA+im>zjP>Bcup{tMkWx z=`J3vg1;K(E(Uy!rcQ7d!@fq!Y3^bf$$9SLBBZN+>1?eJ&s~i^uzQhGUzCbdzPo6( z8kQH`Mf_@%rQc`UK)yOC>fXIf#nO+;(nsxAcd-hV@^g1lxEr!k1925Oxav3R_Ghzy z==%E?lrj*tM2jnX2;ViZaQ0CC8eh1*>W!t{)+JIOBWLmr?jB+cS$M&sI>vSQ#>c^i z&>qWSL3>${o`;L8J1iVv5i;HTGtZqh_Q`CFuR7ne7pAu-8kI%`(D2Ol5j)7Tny>in zTQpz4_V&ZX&(>@{x9^h7Xbdn)(q&&UXg%_7emzBN!#^#zZ+5CYc0T(RF5Cd227;- zCh?4n^*f2@zQ3vSlIK;wf-#+8(aB9r!gnhTkV!o;kE%HE^Y)V$r7KlYCZm3Ruy4lU znN#bG4n&M!pfYw5CNYN6>K6{Xwy6=)4pfN{5#fg*G$Jox#y@xVro})Ie?>3~ZvIF(gZ}!!%>O@-F+E7}>ZldE3 zlvb^q$lU=Squ+XbJ1Svh2JiP@{)YP`K(lZu<(iNB0wv@@d$np2SH_7E#}q5%D(futcB^=G{qjoWu6#d@h=c#OUX2UM$V4)3BL4>*+J}DiU zyrbV|*tL_Pse|25zkAuO;gv?)jSXocP|Yyc7Q%u)4JO9z+%dP>JcGUqT($4Nl4V3%c5L6^-$3*vGyVTAp4$^=8Gy34u^Hnc3!eVCnaxZgf{5(ea!*HQX zEKaakVc$G;KR2at?uJ^*_D!2oqgXK+mUaGh_o&5MBTZw`;3RW)=z}2IfP2ZsxxMHT z{TlMk`%YM|4DqFp5ak_@X-qR_Oq>|74}N`8oLIJx71Eig)qc!^;Qne=3^%3)rO#MZ zr95q?{vv)qPIboyhzBPyc+LYw?eEzjhwJ#0pBGAREl)py#e#}_Fi6b!9^Tw)5C^`8 zC!Rh?`Q}QsaB)@sw<<^wFm8%x*x{0al??f^1f7BALA2K{S~ zAQxJR0r)Z@Uj3}UaCpmZt@~c6h8XRyRM=A84n`Sj(>cBPAUbEbMc5xw?E((5Q2iVq^qS)!=A8b2yLjD+K7zLQDu>yuApK`x88Z%7 z8#6INpqBWf5zai4ek*#LPZRP>=FG$Ai}*x!j*mzb=MQ6$^n27t`};K5QL{orq{S?y zT}=Ob%d?K6#S!Ko`TD%{E7k9WSuFefd(nX(e}|#|(=S~wa@l?U$dMP<5ThJrL+~>- zu>!g3f7SW7HdJRVlGJ0IenGo2qurj{QL{GTb6Aj%Ut3gBU-SBv?R#$ptjJq^5$?AI zPW$v&lGS}}=1$A~DX|~#QF;c>3V&Kn7Nd@0e6&xabVOQx6yq}?S)4zLztbrvC>ME; zO}HGxygO}Em)EB$BH|dTy&**ulGOdCpKnQuICKmP^ZOK0>p1f_)EaVgSiG znPLj0tA028(oONVzZ{n|jQ&2;rVV`(+m_W$Di{Xs$x;so z_a;s}Z{ICzTzMt*E9Xbv9sHomdrKFT$2`aq&!~`!*=pLchvjB{-jhd{Thz-IzGslT zcJFQwepyO*J zhSD$6uT<-uS|e|D`Wi8G9Ko6n&lm3J{&#mtTCqs0eLxiB&#@YYBl-CDN}1g?3h?!c zC%SLOas2TgPrnml$2m4kz7;G&e_-zNw)UdGCi5Xfr*>7hg&(3vE{t97QFk_Y6{H_q zC%Wp(S^*cAfL90K-S(Y69fpOTo_Ipd*DJE<*bi(p6Jsy3`ojAbt5g*B6Z^~{zWR{` z6dk_92FO)%M`T)aT3d7If59Q<-)FUpI^JX7RTA+*awReRDhm(~JQ1q;8-6hN`;Yj6 z_7peSt|;O+Hl&Vmur0l{@_!ss3;5w0Ya_OY%aw{wI?9LfTkwncCHMn_T)XIGeYvGU z+%U@ZMZ|ShXT7KFYZNaovpS1?TgXPS*bWh2Tw+y(!xa`H9$sQ~#r6xRvgae_S~Twx zew!=st|C&dF!v(gHu9THT)fCSik6q~8h?r5W9((tLM&^Fe7?NG4v7_4S*bYpBXbiU z)`ZS-jm3x$V&wYMFS3e7qXXm?O&pRV)vs)ZM~XFZa?|Sd4>Va?y;1wlV>%qpI(2FB K0g=^^P5EDDJ?Sd| diff --git a/package.json b/package.json index 95c4d5a..88064aa 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,8 @@ "@std/toml": "npm:@jsr/std__toml", "base64url": "^3.0.1", "rehype-autolink-headings": "^7.1.0", - "rehype-slug": "^6.0.0" + "rehype-slug": "^6.0.0", + "typescript-svelte-plugin": "^0.3.42" }, "trustedDependencies": [ "@sveltejs/kit", diff --git a/src/routes/+layout.server.ts b/src/routes/+layout.server.ts index 595c0a3..dded3e0 100644 --- a/src/routes/+layout.server.ts +++ b/src/routes/+layout.server.ts @@ -7,26 +7,31 @@ export const ssr = true; export const prerender = 'auto'; export const trailingSlash = 'always'; -export async function load({ cookies, url, setHeaders }) { - setHeaders({ 'Cache-Control': 'no-cache' }) +export async function load({ request, cookies, url, setHeaders }) { + setHeaders({ 'Cache-Control': 'no-cache' }) + let currentVisitCount = get(visitCount) + // check whether the request is from a bot or not (this doesnt need to be accurate we just want to filter out honest bots) + const ua = request.headers.get('user-agent') + const isBot = ua ? ua.toLowerCase().match(/(bot|crawl|spider|walk)/) !== null : true + if (!isBot) { const scopedCookies = scopeCookies(cookies, '/') // parse the last visit timestamp from cookies if it exists const visitedTimestamp = parseInt(scopedCookies.get('visitedTimestamp') || "0") // get unix timestamp const currentTime = new Date().getTime() const timeSinceVisit = currentTime - visitedTimestamp - let currentVisitCount = get(visitCount) // check if this is the first time a client is visiting or if an hour has passed since they last visited if (visitedTimestamp === 0 || timeSinceVisit > 1000 * 60 * 60 * 24) { - // increment current and write to the store - currentVisitCount += 1; visitCount.set(currentVisitCount) - // update the cookie with the current timestamp - scopedCookies.set('visitedTimestamp', currentTime.toString()) - // write the visit count to a file so we can load it later again - writeFileSync(visitCountFile, currentVisitCount.toString()) + // increment current and write to the store + currentVisitCount += 1; visitCount.set(currentVisitCount) + // update the cookie with the current timestamp + scopedCookies.set('visitedTimestamp', currentTime.toString()) + // write the visit count to a file so we can load it later again + writeFileSync(visitCountFile, currentVisitCount.toString()) } - return { - route: url.pathname, - visitCount: currentVisitCount, - } -} \ No newline at end of file + } + return { + route: url.pathname, + visitCount: currentVisitCount, + } +} diff --git a/tsconfig.json b/tsconfig.json index 4791850..ab699ba 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,7 +10,11 @@ "sourceMap": true, "strict": true, "moduleResolution": "bundler", - "allowImportingTsExtensions": true + "allowImportingTsExtensions": true, + "plugins": [{ + "name": "typescript-svelte-plugin", + "enabled": true + }] } // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias // except $lib which is handled by https://kit.svelte.dev/docs/configuration#files