From d59e64f8ea26d767c4fc9c81886c82377ca05b96 Mon Sep 17 00:00:00 2001 From: Ivan Gabaldon Date: Sat, 17 Aug 2024 14:09:04 +0200 Subject: [PATCH] enable ssr, improve server --- bun.lockb | Bin 184424 -> 184432 bytes package.json | 7 +- src/components/modals/settings/Settings.tsx | 4 +- src/pages/(editor)/+config.ts | 2 +- src/server/index.ts | 70 +++++++++++--------- vite.config.ts | 3 +- 6 files changed, 47 insertions(+), 39 deletions(-) diff --git a/bun.lockb b/bun.lockb index 9e9d6a594bb1ccc16b4006450f5b11cff78304e8..69edde9734f76dbf5e85eac68f219627720554e2 100755 GIT binary patch delta 13044 zcmeHucUV=&*7u$b2RQ;N3dr$*fQntDdZfrf6dN{dh=O`RM5H&nf-M$|N+voQ#S&wp z#u6p*Ts0=v#71I61JSEQ6EzwYjn`PB?{9XY+-vUpJ>PTR_xb+#c$~e~npv}EwV6Hp z%y?&`&7+MrE4(}kjqUt1qA&b$<2QZ5?dv`k*A^}vnsablM(%>v3p=l$RDNU6pt~f0 za&k(dfWIkDg3v+`3K|180vrRV1MCBce+B+{H~_W)Yz&y=EC}@hCj#04TA;om;0s4V z&;ovl&b<8&AgANAO$muPf-tt3T)zddfgqR)o&n(uX^GiMiN1os(18m~&gqntnh`Jj zq?bD^L_Jq*f+;6A3kqi^=H(<$m?k8-2tpIow{;Z+TfkgEuE-RHpJtN75jlxzlM}Ns zTtY^6Iy&bhXHVu<=Vs)ZQj>FX)3Vc&)8L19JmtX>ObNVMupzQ?n_B~xxLR6h2%{d_ z>-j&$3W6O*IS0tyQ5q)*O#v4HaxJ!xk?R)$a<`@d!jJ+p+Tp2!O$vM;kjvQ$Ic))_ z0CMXmK!K#h^qgtw34(LHEKdsv>wF8iZ%nB;}RGE<*zs7%*KPXc}lfFrO;CK1zWh zO8uf4a=$hT-DsvvHv-KKS_hi@?UkZvyIHc_o1nR3`#?7o5|Dt3g=YbI$E6BgFY%QA0SWgKpJD`mOpW>?9YUpoZM-di9#Sk z#QoWBo-Cz}g)IFu(0tmYDfQmqeNQ6qQf2VYvf z&il1t=nUuJ7s(5UO&D_XY;)NY-tg}MQPbj@6^E2;bXnAZe$=xqJ?CmIo^+%Y9YV!5 zPIOdYsP-is5(=LP)Wg>x1~#RmfsYn>rfAOHFCBpioioOq+EK6=ylqQ2_g$ z=?4JM0J?^fZdB)GBs*w~mr+}V5CoyKNKMTRqysHSOET4UHfl?dq&?B1p_^J6v^-{< zuO9U<8ni*6{6P`w;bzdLgW_6&v!g+~15_7KmbB8#puG<&1e8cUIvYq^TJCKm)2YtK zsNLxz^ATFv(Lip}H9kg-KPE^RjcXN5=24xmQF{usQR-dU(x9=%vecEv`G;5n8AOYH zgEh;64Un*_3Kn9Cc_3F!uEvf5iV9BR9mxwMM!++YV1`t*1Z*Pjq4I(DIqXS{Gk=C=oCsEsV>kc z_VJ_@9YeJ%JYhe)VIf82Bq$yOc-CkTUwP6GI)#dXt!YKqP|ZZVFM?@Y^I&mDYx+Tl z(2~_b^S!iD;3k3~XsBsP2cBKp&ar~f2ep<`^xx1m$wm@R%kjKLb(4(5kH$sQOh&3%oOFGr17|Ay@22TgN2G7Z~JjJNlI}Y0!dTmm$Ce$QFYf`Y*5RbRK+~3!L z>?%(+YClF@wM@-pP+|01N-*)IYtoEl5-m?NYPKgJ10`9nfrWF7gwZwWM$P-<1z|9~ z)-qUo3s_IchE4qq+O~OyE-NU+9bf+RC7Sepb) z(XWF+vj$Wsy_OcNxdLn)je{-e*h7qzH2DVDC<$}NeqlUs)qW0)&kYUFaqR<8JpU~? zrD>Hc2xF*gO0Z@wuwD}XNsfU-q?>vgGz}&R!U&0DJg{`h$_unS$4GWkU9M648n1h9 zg-9#C4cd@Yc`Qq5u1yBT+pMH{_&F#(*Q|JckWd@gN=uu zRJSSJpdAmYyUL;60*d?7ikgNR$X!}K*{Erk0sqkA@L=s|V9E%Q1`Pw1Nw4JuYwKkq z9#Su?0Gen}k_X9F8Z*_XdB$5gpQd+~AjC@8W?3Xq|x}=tDjjtS~mk3 zLd)}w+HI%{ku>lKHfVnaC2PR>{jf0#khKHzI~wdx0qzc`>r zPlNV-USB=t&!7|wyBV}D`L)_KX`rCzybx<3;niIpf|An;F4eRsfJ)qWO(w7aTHG;M zy9F3`tn7v=P<-)`!lQ|pBM5<M^x1DQr+78tc( zp-!G`+_ArdQVh>GU@6hP!ssV+qzkFyXz4j5LAbrr1%B<_7I5P&F(66;MGEC(m8`Lis&_ z)d#s40gA6>mOQUDQ$QgI#$fG1V7!l3%J-+dUgF~U61Y@$b3MLp*e?VXh&Cb!LOm2a zTIAY>zb)+JvE@_WA$40y&@%k3eXN(gtJZ6h?iy~{4NNK>4IJRN?LunBc@83S%{HLI; zdEYj$9zA4u`qJKS+UIvIT58i`z6Tu=)d`b}2(KHy1~kw)N26)mqjuD_ERqD$GP5(>tIXFGZ5>bj^uqy8472{qsa5 z=|TH`6HWVkV@G#>6G2hd)5Unk(n>tzXyEtJWDG6B zb1c1!=Q!H^Tr@G!HF(C;Dm)Wt-}BLAJl%w6B7KhM1R8ZAnk3O}cuu6`Vl+M;V(^?q z_u!dAyTc#Wm+a^Xcqffk!dHI-6>&V0WYD7Hu%yh6J_VIUO_yNFW$1e(lH|~KN25zl zUjEYV`*q-hrs-C5^v~FclVI-PtW81<| zXD!ujXWDRyfpdS#VmP;8T>xSSv+qHMve=teSr@+;siR{U5Jt^n7&js9UaiiE-QY{cU>9+`ql~B3-z% zQ`x%GU6x(T5;xpf;C*?X^~igk*J6*(WbgKcdZE|5fsKRR8)7$er`#qQ*bvER^7wx9oI?ZhNxYNoFKWG*8tfAMj z+UhM%`Teubo0F;k@!dA(w)|4DZ2La5WIZfP@r3q8_) zU|7PcYiqQd3oVzJ3`-yG>*arR;nZ&)NBv^3z5Mj!pF+Q~yz1;7tEk7*;Y4lq?o@u- zs(;y#>#?6*IZ(OCF01`u-L=ab_I#&vPHGVTOI-U&1tX$bJxkTu&ZkosFK{#D{5Z+Q z^Pu^o&%WRDN=T@B-HiRl)ob6$Cw_6f`0l30N5^))e`96rz?Mr~k3IeIc8_y*_v;_- z{c~)>pqAUF-nEM~-F94PGJQ^0%sCfe*>afcx1|%l{V+mNkEi3ewbko-XYqH3Vz;hv znO=Ct<@**kC$uAW_gE%AUYEH(!#Hckk#$Z_3J>{I=}wP{sVwsQw3q9$tFz0uRN4Et z3r{}Yd&5!-b8#d|s>i$s5i1+{$fm>*zZRN3qKJ)1H@Z4tyJ>0eKb%}89AoE(5^LR= zR`L&%eDk87eb{>9$4lO=hs0;oGgLOm~qOTJTroI+S9R`6&3j5bzNp;8Q`s2Z69yU;{6bUK+kd%wmTw zlACsXcefa>=9{#9w(}BMsO1~IxhMs!TNxRvnE`Yj+f+uDlU%dUWwMai^P!ug(*?lu zC5I|_B^;$EN)MC>lwK&kQTp-UxFdlKLcwNU7>L3<4@QY%Mdf64{xG22 zcD`j!N8#?{xyJS8kdMoC;d9ESY)%DvNqVqZKav@a+)WN}FH91e05(PmH``ss z>h8nq^q{#5xJz^jpFN;63ja#tu4x9G*Yz;3yhe@@l5LK;PL5fUJI2&vu42V=BQg_o&|ewoA@{4a%_Jp*6e(Tw6J0=?vTc8!UNKR1wA0m z*wTl1g#CjwCEhIaA#q_{ULY3??7&0fF1~PNS055*y?Vf@{uVBhF+N`2UfwW{RXrd& zy?QdL{)i3+Z?6E(;Loz2lBO2^LLX*)NOWWjvjK2ck6hJX=cNw*UI8rZ5$OU2xzuF! zd{zA^zGhhU1XlgAUh3Y3kEb4e7LI>^&zBXauA{{ls`_FY>EvUMuRE@-2p;a-Pm<>A z<%c-3PF2K@e8@}ydiB(H__+ITUaT9+LrN3d?^CLF%#X!g}r257@l-6G|mc0ANTd07*oS zgZa@@@*$Bebuw>zMmE(Wcg&G*h^GY)_O7m?GhwVy6q8gQt%dl+8g+l#h-=9mw#HT* zfF8GP#b8md9@u{Vym`fng7tsHpaw5rL{XT_x-}Gadi7+twY!tSZRYT6Dua)3j%9&? z{KN_yiXF5MW985+Vsn~^jv8+-gYZ79v=<%SII5l(+rAeu%zpk4y+zU$r?pNXV$l|7(v>z z<&DK)BI}|5Yds_@n_Bn@ia6O))~|`!1s;M-9g$dciYWG76R{b2!0t9dR!A=N(`S#D z59uO~B_x!#d6ErP1HAmW8w%J42XPMgJRFfJiadEFy?U}fru>oDz>Uoo%Le)*#6#I3 z*(51Iih)y@jgxApqlU9d4KgZ8{+HVM>|Nev75l_V{DRa89dTzxP0{AXd~~7%`?{&9 zA>r(NGm!@z^JFNyj^+UM@cf<5`}VIoe{QZw{Jnf7%hY4~|-4O^y-C$fGH~zU#`D0OyNWJ-ehAr-z#>$4fxa> z5g!g3*00Z(9v@45QueiBJ2_tnb89O)S)yYUtK=1l>?H@&SXx_vWvsIsj8boI+-^15 z=~;ZmW|4$;lT%*3+i^4d%D$O{Y@gJ$Tx7G*Rj*zO>2xmr`P%Fg!)r9C&-Q?Uc(OB` zPrZclTDSMu=PmBFudzIVz2SUP92~3yxhtg%<Q>S4pvf{{_E&^_2SPVzs#baZw5v{2*%)n zkmtU>6;96TWA^-7Htgo(xY?s61}V*ybwyH7UQpC&SeL5JSKC?Y@+Yq%PR+4>d+T75 z8P2RoUix@!;HCeIWI&opot5zYCuArKNGOZs%Y>X(^A20v9{-`^c;zPxwin)?* zI=ysgFysK{OJG@=_>Wz#C-|)0%!5q{U%U>HvcSW|m6~HU@5a*MK+(On@9K(G>`;QOXd(5IUS8^2st%&CSFj>X^*R|@Z57|1Df>LVdP8yCoT#Xw ze+D#qyF=aX+baQR90pM1rpZFCY9ql*Tp%h<@ZVRtBI~FHfqs?_eQz23|hC_(^WG0b0yr z-MT=Ydihely=Mt|1}`5>iceS;7|2(w5MYpcdsDsrSHq{??^N#x*0iWMK-C+BH7)MU z4m!A~S4PzGJQPM5oz>bVhqTTG60p2;po^f!Bb?7S2QGZI%f44-wE4u6I!TTOL9h;#WHXFR# zVOH5ybn1#ws`o!zd0aVi#=JXU(G@M~4biwcKbKvL|MY{JmRGEEpy-qe9`#mf-(_|U zLd#Q{)$pkIPTN?;E~+U08iy590MJLhnX1{Bl;uBT%zHI0>fKd#@4|$c7CSE2wD__; zf$&!!b_PJNUO8>}gspN5{eC0o>&o*|$YXE75TM>sJ>R7y{Oj)?kEvl$Z?PWQ(Z}c# z-E~7v%U5hb5QZo>Ck2T`gsd_@4;BwOy83zLCQZ*yG$rJA%E<*xOHNM;?dI);&&jU7 zY{(F?cM$(?0n$y~#GFoP8RPR(6Fa3QPEE`Xi_cC@P0h&5?VOyJnUS5FlaZI5kk~2B zl-VgKFO%1>qeDc0_G7%*kZm-HE!g>WqAOb(FIuzhCUGNg=*`07#UeJUk7&cj3>D9_ zhvURvX47yn$A)Q!i``jYlNil94-+r5RWn6B3ozk(a$h{K2T|g9X3mu{D|6cf(IbHP zFw$G}Fi%=7dbG9Y*P?U6a;7A7PRPhh&rQr`>kf;}+2A9h3;W@)*qI$ZEIKo{qoS2X zQhFXsIfjqNMn}XZEaQmSnw1`gO72I*#%$#gu_JRkE?RNYj?h}&7-F)>!^ z&q|Mq{n&xSVgr_cT$9?B;yRXfR2i+^Q|8B`G8U5z(Mj5vfv)Ednt{qp^-UcG2V} zYAivF#C8>pu}87vvxI1FEU`vojF3bMO1!d;h%ed*?f|*IF}c)~q(OXYW0a zOPk&)ZMx9MbHTLLleV53)1k+X-3v!-)LSik5-+sg$@cCv+taG$2Kzo&$_C#hMNNqy zXa%A8p`#2Zre~xI_*pm$LUYvT0yY6m1#AkKpPo07w-@9TBxa`P7i8sSrDvgszl+S5 zpPDr>HBS&~on(1)b#i?bARi|wFEKeaUl97cO7;H5^MSmDhVKD6Lsn{DTB<(~bl?M~ z=XPIe#^OH0kppPZd6I48;S ztN>wve=#>bF*9FynJ8N{2ha{3AHXnfLGrl7%nS%9N|7y?K+Br6D_R9E-a0-%HJ^Ln zK4|XaQ-JP((P^@p-2hvF{sQ%$fcuPc3??UL^4JPX#|c79)XxCq<`;qwc~a~Jh;S8` zz>KzlmoNseUkz0-Zc*`5Al$yYfIO(-fL!gxfIOSpWC;Qirg#n@_lq4M4?sIaiSs)H zas#}<&+A`j$_gasrDhgjut%VIJGY%H5Dmx`atC}%FcXTG(CVh{MM>c0;pz>@?Z`!9 z^6+#jl-21ATC!)NtdC++&hF>>kkEob^im z(8-eAqT+2pxWIX6-~t1t$OBCR%?D0V>W3)MsMODzD)(!v&^FU#+6FW?XccJgw^xdy z?cbB-{s5XQ_7!LwAsGp%Sa=eUcbu!x)zf8xqZB%^NT$P}us!&G1kD4{675{^)M9x6 z3((xsuK;<12hlid_oB4-Wq&5;=NC-QO%=K$L_EyxXUJ08naR?(gXYsFQ>pg_A0K7- zOxcei3Tz9=rCS4Xa~^*n2yTFv0XcmDkZZ9K5LOK=UZ_+|1LW%F0dfV#0`dWo^iuvE z`$*24eSo~4Pp>4HoRXd=tum)+_*>3J+tA9V%U=MsfJ~w10CKNqrj9Kbmy?qbIZqzV z0Laz#QfO<1e)X}OwLbxJtu6p^=NGM_)(XYohjJ)6+#7YkDMl-_=FFFk$jYEwdX^u|^9uWs7z zFml#~z(pTqWq-PRWb${%tLEN}Y&ZRb`zZsLX)*G3>C&c`v`rd5jwRq#{ zCj$n>Z*FFqv8nsg+-Tj?bvFW|Cda$33F*7}^`;hOJ#ETMTg-loZp`)7l*3m>8sE|= zzHp=?gG0rBPIP3aP|?MiUhNzzPI0EL-l5uEa7-wCLTF-VgZ3FHUr-|T^fPEf;KU$M zW^{dPgSG%vfZS#>h#Ot#%I=}!Qx`fiD3r9N)!rtulh3lH{6B2JH?|Cb_qlLGuJu z5OwPsVvhA`Fpc*&Y9;}Tl&~XpSaVDSxo%7ywgp&(#P>tHbo3 zYHLazwzUrXwGK1kj@XZ0H-wl=2-oR!9p>Q08+qL*V0~zOK!~}Fpz6mutYd4b5p_8# zChlxaS9*tvzqh7WyN42gx+2IVrnaFgkrGGS(5nENwsa&iV{lu#5@1e@N9e0lH( zKH4GNf0%ZN$JkEPcBa+}x3K=GG^aesf6x`_CK67oalJ)#<4q7BH{PV(J6aIlmYj_c z6H8i+mMp5vFp(oP4p)1+0@p%Xong|HB?v+uy*}Qk>5<5T5Mo_|X+vCX!C8vrL*z$w)LwRxPle93v*WBHN^)DS|MBUiUI; zZvpEK*)ZvCgSK6&n(90m$AAh&n;EU?Z6IrCb&g4M6LldpKE$ZekCkL*8Od0>BG;r@ z4my-x&oXK*0ZZVTYqGFK7$IqJ1lULkbH{cdMY5|L7*Bl-Phsr?P&~acnvX%_l`aUQ zsau9oQv$57#DA1y;1KEh-Uf~JctIF0aU=uFmaMCy)%hl}h3X1S+FIPrx%S}pHE4~Q z@>qxzCU_wz-ew_9vvN>;Dp~LeNqW$@LX(zdVc9?(k!(Llt5N5ReMMKPZhf{vn+z&k z<4AouEQ&QzLN`JKl%z%mYj&??=h%INX7z% zabhQ7y{Mx;1I2Sv@+x^stEZW?<8XiEF|&|jyc?83;^#})V^FfsYD@-A=oCQ+w3;3U5=EmH!bD$bz|NJ zC0hs?T76N&woFiR8_&T{K=rKa_YjnvTkxyKvlx1D4`_0L1=2O|hgbpO&Xry97!+T4 z57C@Y7_ImF@)T%J6WtAD5{;W_((Xr{Jn6WDe*vX9 zpvZuwME41U5{ny9z8?!aC1Z>xzNB&FjQdv#INxP^~$3P<&2GF2G6_H^-#8 zg1Y{EJ<@v2!5WBGbBb)zCV=9mSX0lI2JKQ%^|$a#pn@e%p2N0t$*A1}jQ7z>dH;;pOI$o}f_{2sQR|8pyX-B`~BXCGh%@{>3G{pP(xLjnqNU-x3e(Be4!x3(KQQ7Tm|v0{7M@&^FKI|`>%mh|Br{c{K3}c_HWlXIW{lbx+=5T^AUZ!EV>kKx9hBtt@b?n zbjSU2_hwlaLVx?I;GXd5>w?JJv&c=`=4=0cW4`u_<6ZhNR^B1i;{I~Gf=j$70HpdzXEcr5)IRMznbGMMfLHSUBpbvqG( zT|oMYSn6`pnw|zVlUS8HT(YK1;qiQ0eJHm4*ri%i*!R~8ifgxqoQ)V%Ho?5|?jnl^>&7J&JkNOj z=*XbU;%q1T-6vK*db{fQ@T8!xpFikdQQ39x0P7;dofNl^kAK|a!JP_?GwIX8(p*}C zKWCf5NG#dNNH~c?ojE4OCT7=5B5XlyW@WrZG0a#M?Y<(Gpwo!*6Yt{VW8RcUsoWR34E2 zdEa3{BOlHQt@%0ZcI?9JCSz9z|8+{Y+l5cRo46qRWLb3b>6MGeJ`vm8dpX)Yn_cfu zT#BBhtqqTHe&F6}%i6I;ee=Ja{#$Br-i5Mz9?4Z=dado=l$h!pfA`y@t=!Q*bzJM= zr&>*Lo#gjzaAERfo0O7-Y0grT%jQ=CSAXWNL*@-!dT_S0*z4GX+^8~YSH5|w&8gH? zN2|^!JiL5nnAfPaYo@+esM}io;CQqhThOl8ZR6eNdA6nA<*i$M_bl>0n>PUJz4#&E z$fhov7g~L5{~xz+P03jG+N;C#l8poA-t#C8JH2^?;k(fGU#;p8{31y_bjjR;dHp;y z{MDcq_8~9kHJQ64{H&s$74$mXP(91;C#Kir{u;A>lk zi-AEIFYV5+>%4RO?>fsne;r+Lbj#FM!2$ZtYr9oeChQN_tn3(klJyt}^~{UXr~L5A z(Q%&|U4Gi&9Ogc!MW4sJ0+-m2-Vyty<=~(ZS1)<>JJq5?>Z1ck?}SWyQYWRy@`fPTF_pN{mfUae3?O$14^q@`}{=~*{(YxPrz zzY|{9G0!NnK&n>1aQx_kw}BO?&LF(LA}EGjBXynCPYxa0;2k38(#u@MBS$~u%%6uuqA1EugT3g0Rgu>I%BEo*)g{RnRV0B|PTdV$Q+76ZjjU-*#qxJbrm zN`QXE)?XwG$dn4dOJo+Y!!wi65}nQgR-tsSIDQ#A6=9o=xAoF972n-UYZIq=Z1LzU zjhhEJ0fpO=jgp0ui82hOCrUU<4;1X}h1d950OI+OKW7MGC?=Fp6l}5ihMYh52?J1i z@#m&KKzgI}Md^pqA0-0iZImG>gHQ&e@Xk>v(I^?Lu$qiYQ|y zo?Jiff9^|eGuIIht^yu*1w0Z_qb(l-(%Ye-(f|E23_b8D=i_;nRFunEtJvsr+!i_HTkImIdg*gi<|QNQh}Z?VyNHL|oV#AN&PTB9zC%vG=VkK7FCY4Jm|4TB&}W8%4Z}P(=+}t%+1xw-yjZj zUUk(N<1$bZ>hFVRfMT}jG3iR?vLgV2>KD_Pgr8skzA*7u@PW(64@v4O57Fb7gJmad z1IMAo;N!dn@YDCK-xCNr$)<8@2wVDuMCuciap$HiDcg7T_)U@c!&Gv6J@UJF<&su@ZaHQRC}l5Gbp$6CK?-s(zGhwz$tQ zyAQ7P6G=xnf&X?fYg-JXe&uyrG%!24l)hWfFpGtQfn>5#9L!=-4gj0j0-35COktD8 zbg)3m2!f=Fvzfo(#q8|RX(H8RmsQiF_2lK-i82AjvbEM=cNiC>XM zp(E~Wku%!7nV(K{U-i)@bi|JNwFP?{X44u#q2$hF zH6yT(xqHFZIqXT7I?MY3_G_wg6P1dNSd}jrD&!{b}&`Qkb|LLH%NX zc-zj6i7SQ#*9S0{;oj=h5e7?EQg_;e4-HRXgyh#|}0O9yYN5KF`l2J}LX!vaOuY$lTkDPUh%1gw^nh6!waP zNi3^9z&zH)9Y(Fsmp^O&)Ow=Ri=?Zch}b2_DX$)&xRrN#*R;XSeyMLc$KFF%y?XM( z`)u~hRe48Z>NU`^GBA+V>?G$?PkQ{J+i`ejtNR`6El*;vIiC~<2aE39l~RWC>5BK~ zQkptg;Qs0hd}GZk~|+kI|MGq^@mP6c|V@%iy5lq;&9*wi|z* z&vjY*Pjj{t^W-@zo6H8cQfIRR%ju|2T<#WZN#qgr|7bzITcxCPu#jf5;#(bazt^HYy~Zf!VMpFi>n zLu}Z6u2RG0gl}B2mMFRPrUeBrqSo`}We?lS!Jh}bF0pxF_3ELlXG@+|eYCO6OG+~( z^7XeY2ez)mKTM2<12|YTPIKuVtK7o^Sa?V1(=Ztur>SylRKoTKKBYyD5N1CXc6Gk; zB}$nwb!JIgE7~=b)_5FcN;Xa%rBc4_DAU6n(_-;ZmkX6*HC(~S6Zj5hKfUe$| z4Hao@zC5O0Jp_2N+0u{8=DN5`Nzv5@gG;gNmj=Tueq=7^k(H1FScWze8ba*898Vumftpz?uu-A zD}Y<M_8ClBlSmwSl&8c1U9fH=Y&JO{uY$)w6_i-D_&Ynyh~BzamuDTc27i z-w~GeHCk?IddcF=UEgGi8X#rvG<0Y~cJ4IX<{D>55L?6Nn-Z=@*6P)htaD!UaWK2w zX_jr>9!A==N0Ky_h0VKOJ^DEH=d{zao8NCG5wM2w7V3(kSkCbo2KqNSl(EnwVVRonHW$m7bjz z+QZiekCQ?EtY(hr#{QBdCb9ETVn5rkq`dUZ%$&l4F6mjhIe7(adbH@pMn{Vs+4^YF zrDJNocUDeHVP>j#X6mHWys?S-1=2a%{G7tP9a| zxCGJ!dnrDYegvV&qEDmDdek1l{{f~%US@t2(lGz*) z11hE-5fjYtgm>+j_>|?nBYLoh$Hl-pOv~1sfS_R~(4e+Tb)6fKrjr=qw-d0bo&|O7 z8;}c6!k+q8ke2N6F;T3K diff --git a/package.json b/package.json index 27207c8..16e43f6 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,8 @@ "postbuild:compress": "bun run ./scripts/compress.ts", "start": "bun run start:server", "start:dev": "bun vite", - "start:server": "bun run build:standalone && NODE_ENV=production bun run --cwd=./dist/ ./server/index.js" + "start:force": "bun run build && bun run start:server", + "start:server": "NODE_ENV=production bun run --cwd=./dist/ ./server/index.js" }, "dependencies": { "@swc/core": "~1.7.11", @@ -44,13 +45,13 @@ "typescript": "~5.5.4", "vike": "~0.4.184", "vike-node": "~0.1.14", - "vike-react": "~0.5.2", + "vike-react": "~0.5.3", "vite": "~5.4.1", "zustand": "~4.5.5" }, "devDependencies": { "@biomejs/biome": "~1.8.3", - "lefthook": "~1.7.12", + "lefthook": "~1.7.13", "sort-package-json": "~2.10.0" }, "trustedDependencies": [ diff --git a/src/components/modals/settings/Settings.tsx b/src/components/modals/settings/Settings.tsx index e30ab37..8a2a3e1 100644 --- a/src/components/modals/settings/Settings.tsx +++ b/src/components/modals/settings/Settings.tsx @@ -1,5 +1,7 @@ -import ThemeSection from '@x-component/modals/settings/ThemeSection'; import { themeStore } from '@x-util/store'; +import { clientOnly } from 'vike-react/clientOnly'; + +const ThemeSection = clientOnly(() => import('@x-component/modals/settings/ThemeSection')); export default function () { const { getTheme } = themeStore(); diff --git a/src/pages/(editor)/+config.ts b/src/pages/(editor)/+config.ts index 0774a5f..2b012b3 100644 --- a/src/pages/(editor)/+config.ts +++ b/src/pages/(editor)/+config.ts @@ -5,5 +5,5 @@ export default { title: siteManifest.siteTitle, description: siteManifest.description, clientRouting: false, - ssr: false + ssr: true } satisfies Config; diff --git a/src/server/index.ts b/src/server/index.ts index 3a282be..8b50240 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -4,69 +4,73 @@ import { renderPage } from 'vike/server'; import { logger } from './logger.ts'; import { loadMemory, memory } from './memory.ts'; -const encodings = { - br: '.br', - zstd: '.zst', - gzip: '.gz' +type Encoding = 'br' | 'zstd' | 'gzip'; + +const encodings: Record = { + br: { extension: '.br', weight: 0 }, + zstd: { extension: '.zst', weight: 1 }, + gzip: { extension: '.gz', weight: 2 } }; const port = process.env.PORT ? Number.parseInt(process.env.PORT, 10) : 3000; logger.set(2); -const staticDirectory = 'client/'; +const staticDirectory = ['client/']; -logger.info(`Preloading memory from: "${staticDirectory}"`); -await loadMemory(staticDirectory); +for (const directory of staticDirectory) { + logger.info(`Preloading memory from: "${directory}"`); + await loadMemory(directory); +} logger.info(`Listening on http://localhost:${port}`); // TODO: 103 Early Hints -> https://github.com/oven-sh/bun/issues/8690 export default { async fetch(req) { - const url = new URL(req.url); + const reqURL = new URL(req.url); // Static files - if (Object.hasOwn(memory, url.pathname)) { - const acceptEncoding = req.headers.get('Accept-Encoding'); - let selectedEncoding: keyof typeof encodings | undefined; - - if (acceptEncoding) { - for (const encoding of acceptEncoding.split(',').map((encoding) => encoding.trim())) { - for (const [availableEncoding, extension] of Object.entries(encodings)) { - if (availableEncoding !== encoding) continue; - - if (Object.hasOwn(memory, url.pathname + extension)) { - selectedEncoding = availableEncoding as keyof typeof encodings; - break; - } - } - } - } - + if (Object.hasOwn(memory, reqURL.pathname)) { const headers: HeadersInit = { - 'Content-Type': mime.getType(url.pathname) || 'application/octet-stream' + 'Content-Type': mime.getType(reqURL.pathname) || 'application/octet-stream' }; - if (selectedEncoding) { - headers['Content-Encoding'] = selectedEncoding; + const acceptEncodings = + req.headers + .get('Accept-Encoding') + ?.split(',') + .map((encoding) => encoding.trim()) + .filter((encoding): encoding is Encoding => Object.hasOwn(encodings, encoding)) + .sort((a, b) => encodings[a].weight - encodings[b].weight) || []; + + for (const acceptEncoding of acceptEncodings) { + if (!Object.hasOwn(encodings, acceptEncoding)) continue; + + const extension = encodings[acceptEncoding as keyof typeof encodings].extension; + + if (Object.hasOwn(memory, reqURL.pathname + extension)) { + headers['Content-Encoding'] = acceptEncoding; + reqURL.pathname += extension; + break; + } } - if (url.pathname.startsWith('/assets/')) { + if (reqURL.pathname.startsWith('/assets/')) { headers['Cache-Control'] = 'public, max-age=31536000, immutable'; } else { headers['Cache-Control'] = 'public, max-age=3600, no-transform'; } - logger.debug(req.method, url.pathname + (selectedEncoding ? encodings[selectedEncoding] : '')); + logger.debug(req.method, reqURL.pathname); - return new Response(memory[url.pathname + (selectedEncoding ? encodings[selectedEncoding] : '')], { + return new Response(memory[reqURL.pathname], { headers: headers }); } // Dynamic pages - const pageContext = await renderPage({ urlOriginal: url.href }); + const pageContext = await renderPage({ urlOriginal: reqURL.href }); const response = pageContext.httpResponse; if (!response) { @@ -77,7 +81,7 @@ export default { response.pipe(writable); - logger.debug(req.method, url.pathname); + logger.debug(req.method, reqURL.pathname); return new Response(readable, { status: response.statusCode, diff --git a/vite.config.ts b/vite.config.ts index 2ab1b22..31a851b 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -10,7 +10,8 @@ export default { target: 'es2022', rollupOptions: { external: ['bun'] - } + }, + reportCompressedSize: false }, resolve: { alias: {