From a9629b825bc37fdfdeb613734b43357b058d2a1a Mon Sep 17 00:00:00 2001 From: Jesse Wierzbinski Date: Wed, 8 May 2024 01:16:16 -1000 Subject: [PATCH] fix(api): :art: Do wizardry on qs middleware to also work on multipart formData --- bun.lockb | Bin 272164 -> 272508 bytes package.json | 7 +- .../v1/accounts/update_credentials/index.ts | 17 ++--- utils/api.ts | 71 +++++++++++++++--- 4 files changed, 71 insertions(+), 24 deletions(-) diff --git a/bun.lockb b/bun.lockb index 5e3dbe4dc3498af21c1d8cf4bd0629cea5e8dddc..858989ad4cc27400f4e428164beb3da5a7218108 100755 GIT binary patch delta 37589 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 U%I-=XPci0AM=dd`w&%A01-x;VGynhq delta 37281 zcmeIb33yJ|*FJpClRV@gk!XmBhB`+eVaeLa`;+4XmW{??PUtG6dI=V8-l{n&u7s9LS1Fn|^vo z*4tj1_6WFFfHZ3!uq?1O%q$0-2-QH~U|>aHB;ik<^cv&(_6089m61$YlgzMJAN z1F0Vgq<(o|Fz^og8Unlkq(KLP^iM|8=m|-1>3$TVpC>1#rlw?MWokR1fPdM;(o)mt z@=Yj(y0Y&B(TVKtXqEZn5%xd`C#uBy^Szo|KuyaMDJBXY&Jr zmbnVYCWoes$&A&y1W7Z%k4;NU)ndW3*0l6QtJc4ZE4`}Jv*W5MoQlB6%5H=N`xOLa zMZ-oWrj9~YHt!8N4bg%0)2|pk#@h!NWy;Ickmb|HBxRBcc z1E~*rQt0rZnjd(!msgY6K+D!@NriR_p9j)!nd#Au*(FaDphtYoYMyoU*UgTejr5ny z$)4@?4dzbIke*u`$dLa#L*76>4H=u5IWlxq(&S}|Uj*bpJ`H63(}6TJ-HdPs7-PfK z#4&q1L-aA`IA@)#>50RV5N?a2 zq~0kY%QuXc^(Bs(JUTIR*vMA3H4R?Lz6LohZW1GHs0Z}rSZzdtrhb7{2(vAF2M}SM zy#YvZ2j!$Ba!KpPZF4rbkmb`&t6Ito(`s?CFm{Hhf-Ha5fGB1pYX98vH^t ziF1{KV}SJi5FkC#OEvUFT1FDbytB%00c5=?Y3WJBYo=sqhvH?Fehj2#TNJJWvInNw zq-03eY;bT`b~=#eMXTyFl2V5!r6(m>olZ@f+_jbTM`}{yFgAO%rEG3^+UW6_DXAG{ zTg!YMNHcdKpZGqI<}U+cerAtM8gl15vk~%nt#w zqOo%FYtv0XuaKsNP5DQtR1{66-1+Ye44Yu}K-tI!UwawdAjBNZQcxBWPZC zwU$IepJ8xQ)nhG{h|h1q!>Nw!Q|2bGfUNsnWOR+rK$Hv{m42$L^yP0F_dL&47hHUf?SRt5fq`sj?*@srZVz?`9}CK zHEyI-O9ZlbnH1S<2zXYTnl>EafIerWjloK%`6JC{Cnt`^cxc+lCuDcLN6C6_g6AF~ zDLp+cJv3>OeQG}kIn7ywQl)@T0?}SpcKm4BkbRD`1IG@eg^AK1f49e~jPlh{;Q%yH z26#P9;sqc>WZGC+e`jTYz4=QUmYOm`%hI$7>2mwUoeM2Y#~{-aBY>=sr<0+RH7z66 za)j0wat=s$AU)Jl@zFpw*d6s?|C0Uvc)1XbnINaqw?NkWC6EI<6j%oBXP<;3D?9*X zMhjFxd}ESa*cSoIgHKM&q{p?oQ>0-&K$felcpXRsT2GbvO@TDfK8fB$C)mL=z(;_~ zrosQL;E>9AV!Et=8I&d<%#dT=8~F^)IA9QPJIb*~Yk)NHP4tGmQ1VE0g!PQb zKpJ!1UU%i3U z?gC^;wN!jvAO|iQNPlEKCG)E&Jx|q2dQxUOEY;4A(=?prv(L|w^}3(7%4cQIMS>03 zG4A_}G}GRtG(tWNsv!$x??Xk{d1fzsR?4pc>FBMHmjk{Iq`s;6yah6U+k9!L??PGs zYRLT%n%Tc7!N3<~#ilCYWy+8}g@SBg5-<>0dXXHMX+X;m$T={*UXXi}nJ7;~cE2Py zHKV{+06zeFm4Ri1yb$<#G3sMzc7Z|&aJ8za4UhwM7ZoxB+U3ZG_CwB!Z-B1^Y^d}a zzbsEP2j)q={!3*;^-*ti=nYMqn8A7H4W6sUHI%Cg^ap0Kp_6E+8t@>{2lzIS4ZI9w z{?kA|;20o1Fl>daxC4*|Hio^m^I4i!2Z<4?pc_cODv$+#pDUxb^E&DJufVg1TNIi=8l3T_>_7&1#>yO^ zH*nzwxyoc@rjHpvTGRSNP6OHj88Z#Dke~-TY?Kz&1G3?=K*}FO#q9CPw`IXSKsL|_ z@|x6B`Jb(qde?z8$RG8xp~>T9Jxz5v%Q|h5({CP-2Kw=&KQb{>v$qB<&6edt{KQtN z_T;;ARv$FSl?zFjohJ+7q-Py%!E;T(x?}N^pj`(1=%mqUDN~Y?YP~OO2?A2DERgvl z6URJ}f)cepkn#%Vm2x3j7r>Q9ZUjtYbR=aA9iNgqT>Jh*>HFhAc6|rXAGkrua}+;E z*`>Vh`Pdm8kk&+4CI`(8Ar|SyAXd>8I*Idgy<| zGec1E-?--gjAzVi{&7v-J1S@LG9YK*Q$WUP8jwEj4dfEz2GRv}RKDNl#Paj~&EM*s z*TO=|&0T)3!*n>|9k^tNU~nA=zY zc`L{rR%KtC`C)Foq8Zr8tq(F2@Vnd0Y2Sdm46t6cj1H;|Mbi_ap6w$4=4x2gQ zZv7E6A2|y!Df%HtTJeLK5aBjjVSqbX+KFK<{dqG#!tGp(ncBrX6A|aUjZ`-))d~w~ zJEnAD=102qFU`Oxx3gqfP3uLe(I2T{Rz20iUCxid^|j;`d^Ih(Kt3IuRkLvbss07> znuyOHmVPEugA3%x3*f9<{o% z$V_m#jbq@OLaziJW|YQMYYfiQa$id`FxKtNf-KSu4vo`4G;?CzdTBEszx~X>CT{&@ zGXcNH%pCm2oB8;iZ3Z@VJHJObMVrClaYiKs9LG>Mt2J~P1Hi>gF4ko%0mrtH2kwgk zj)UQ2=ES*;(Fo6Omc|8WTmsiu>W8}wcO|&N;%NC?aN&|`=yGlY2bYG$!P>y)Zs%x( ze=GA$WSqXy%xUg6z5yQ%ZBO$;eU}kXS<_;{IV|p3a55;EcN|=#rOBan2D6@JadAd_ zq}s^#LS0^S6(=Kj!6L&80y+|Lh4})p@rKx09hDhUeq%> z;%vlOQPNC|a5T5sr*%o-+{i0s!e`Fcz#&Xyg1R^=Yoqh2V(N|mZ0FWXnF;OOMvqzr z3kX_S4vu4tdf~<&%)s_;=XD2GFX4AXk1~6-_j2CVv3MyKE5`^kzrEXdtG0Bj!?NIO zaEM^|#ix#pk`m?xcp@I0j6b;Bm;{b~k&(JiX~JjiT>2?9r=wf6WZ=P3dYBp5 z#chnJFJ)LkLtW10;Ns~#udk6}$--grH3Pf4jTQ}LD>8!igX4s;Rym_WLpdy-j3=WP zI1Y;pis!(wZ8?Cuz_kEp1%=@VEt2Qe6ddykS~jLYLdVHgwt#D8m8C20fMX0xdm<6s z42+VT;?5j!7>MvVuTPnRyr536`;fFNDlvLAlJ&|~UIa&bJF;nJs>36HvsO_0e_i7uDn8zDJ_#nMLsd=VRoUt1zMz(CW zB&=jZI8k8*Y7dT`!%7k9a?S?VhJ$0AM2by2tQl54N_N_ce`5$Z4jiUEhI~0VImJ2Q zFN0%S*6GrSfg0Uf(i-|SaIxmH@Hl;qnb6zqxEpOQ=^gLv5Tj{P=Ca;#&Z$U6TdD0x zMKEPtLuvr3kPBN!SpKNRVPy2BW?)~pQN|^g3?IgXa|k$Vaynl|DxMDTI)N1WQ#dw; z7hFiAt(e3F$VqS;(;%Z~t&_8{1xb#c4;|wb&_vVluSg9&z_u=^!8G&xxpglyu)o_# zMvr?VM>8+DUB-vtSPz^9i#^Qz{%(Ds892bLzhWi~fD_`(B?ID(F0h6n2enwMV*}mJ zi4N>2^-sd5ggD%z@Er>M}k7$8x9{XVx#>yy1c2Ts~Z9|X0Rd6w7pzGhCc+js^t&NZyz;nwzZq}%x?WG&2r z1LBPC9qqcSb#m!1n)xH$`d%|I#clkK9Qp#Y9B27Xn96OqdoW%=iu2lP!+8?PR@R7D z>MZ>uM|==CX(dPMg@QcJ_s_x6W^4rFW6gw7Zlfc@LD`7doo?ojay$3oB=(4mUElGB znULx>Lb}RIF~q2}J2=i{YxQ&Fb~P*Yk2k7xlMy0UmPOq)ZH%SDb{##6a$~`z7vx=h zD6dCPO&eQ~_c6H40&WS~90?8)kMp|YF*%-?H$z=U3vgT}(E3Q1kq%BR2hFjo0Ednj zE&%#3X2MvvaiW(T0c(Xbd>@x(tj)U70UV=6#^W4t=$?!~;|p*ICajDc`HEOC0OD zG(g&d7O+H&GV>?8v4Ibq&y;1*crtKh|rIJYB#a%PfYD zN7$q9&m)WN$v*4_$38$YE4Jid8JQyDTXjX(+sv8bHlBhUr&sJ(bK#(O!6}2WKHM}D zrnRpYf#II1L%c2B%K+ z!21c=SL-51PdD?S@hW7}0(iq&WfYcLGq`D-b0ktjt*zKWq~zE$q8+KS4y$i^3o~Jk z+gJ`6>#$}Hw(0qhwI6L;L*LB=r|iIZYzEf``dH8sT*j~9R6Jv^-3Y5^4|7@bI3o)w z#xjQBvO4Wz0{PcP(HqYPbT9BY_cY?=og($g!47-9d1) zL+G5&A?eVR36Mnb5Y}^`3Q4xlGL)y zc6K9YE=!0rK1QlHwB$y%!sLSbVdY40jgaSU*&IE^9su?r6P)ZFx%VE*`wbk2154C% zv0hVUF>Ew2Q|5zfiY%-vkuJx9sn(UZbDF)Y=Y;7Fj%Or!`LrHfffw}~W}t~>bh@lx zUi!Qbjv7`dIPOn3Pnq#X>aB%A}*+G@<4C8J*s_lMwEv*dmO$92@=oH4VZY2Er6hZNl{wRVH!$^^Sd$9g>} z&6Zhh!LcbUxaiVsaGYo|Z->f5v>?vzgKL32c`|7JRM7^W1;=vGOpf(ZjI>^#BO5?5 ztaWa1oMBi^v7)D&IZNHf70BfHa~5}gS~i1~23}nZj^<&dM5KHHj?Ks!UiX=zx1_Sc zu@*TtAAn3}dOe3tT&k%N-ZX zhj5(5GAjd|%%V%)FUVtP)m|iLr={sM!F4l(Uu))t1op`6Pp??7m*jc@XP`tDxHfj( z&P(7%n#(3(Prlf`i$}wkf@2s;!|MzCgq54@GUk9Qu+DiB+#sGLbnGl%b30eQ%*Ff6 zs%D-@^fs5h7H161DcaNZ;0g>dj3u^lY<3_x&O>ykWvmyNAq6&gFD+WhL~w=n9RW97 zY9cVAUXe>KhH9wGITBnyb6{>WFC=7jXvtZ9nPnz!Go&LmRJI8Vz5vIllCJk%Uc@@* zaB#TLe7%_$5^`8+^c`>o{xF_eVcWvIE8w_#%Ie%JZ9g*aBXA=M@|x!stz{*+c;u;V z2RKd?ERmVk_G-P`7_`csomgM>EoR`GZo_z0UR_wNIi|j9_FL=rf-Kf5TMbu;q>d?I;grPnzbm`Xt^$qZf*XIw;z)53}ZXZ_W9|CMs5K&q!Xa6_E) zGE#%BQtj8^rni-P4XK`1>KCN?Sg9^+H7(6bZA0pDtE}%Ewk!)NS<6|ZMpMrixK2)e z%LC43;F7KKp6i)n+oO;gX4&(~o0^tk$;xiP5^c$PBNb=W^cGU>&#*7b;>SxOh|F?^34F{KKHGdN+>6n(AXb8=G z2B{SD%v;Sok&tSSzGJ60BQ?xwpu%SR{shL;ITW1bYdz0Q$irrOi@l(6>01Jh@dqPu zN%6HA_#PjwB)sQ#4%`YobJ@^1=Srkv%`^RQPYfxZ7Bt>h!TtP%_uWSPyLNq8&7CiR z!>OWEoN-*qaiKK@SIHl^jqZ8&#S>0*`T{fm1GoOM8Mw`DINsB=`l#2sC^H&@z{=2a&wdxy; zlq|azDXI5Mfh_(LRi9(_CuYCyZZGgn;SFp(af0|&an@#2k1zxGy7dWW!d|y=agQ8E zY!Q3AjL5zAS(O{SDd0My4(pm1&*c*KxeeDoIg;{@Vg@+rb8Ig3O=jSJxAO{QZO!2Q zan7*)>;+Tfk?LrrK0-?7dK|E2U67J`CQ>r@WI=AVgX}G98H1FpB@Zc_PiMjQKYJ@F2XRl%bwqbPbp)*D2{J}Up8 zkOn6xz2dL}^3qg(AwD7-7>f)xG>!`9najy|h7tNjfI0k1#Vm@Z@&^Zz4NX_bOqRjT47;5ZO9bZtExx=^U)K*72Vpt;4!&ITdTI zbpT6Q4P$x5Xn0=@F&m!n%A)E{5S!Soa1W42QDi$S&nu zQi&Y5Gm0;Q4DMnx3gli$eFx%rUA3eV+3+2AbR>fh(}S>&E`Lb zL{R#GKRAj*8t*{GtlNV>=DZ&R5WMrgsuM_iyeU)2q>rU@=Eo58-d7dPn%87_`$I}A zD*&m08Z17L3=Sfbl@wnbvV3Lav-j1NUUA5*8Y&-XEXiFU1pCzAuoX1cm){z7B^239G;W=HejgX4e}5iL7RbQcqO5L?(yg zClELlNWJMwJ_AT|W&-KxXMjA4L*3kPs*(BQDX$dPFi(|Oq)HS;ie6Iruc-Y09n{Ux z(;-=vQQP~dg?4UNwGo;85I?kLhvGk`5C@UTo%mt?ZpD8>A&%mZS$mY;UZn>tXH~FY z35dGs{dI_SN;s&bM8^D4#TSQ+o-dJ4bG}lT4`h*3{87mKua*3ak{3ma&LY0o-|{ox z{Mt8*(ejPb{}#yd->Y&&CNC+x3}pTf6e?u$s^W>vzXqh}x{?!_yn!F)-%@g*27U`ofL6ujSr7=NSfBewW0SX5y`C!El0rDW0 z298qlR3$Hp6!E``@%Sgy`L=SJQY3N_o1pljsGHYr2blM6dx7fme%I@J&kL9Uu=PlUo%3PsrhW4|;6yeWgz%{{fKUumji>c$YJYmflke_ksAQ zJy574le`Cz74Uy&GS12<-W!O2nlFA>ae2j81X4c`$nrrdzpBcwq4H~HDM1||EpGs1 zfl!5wfE?b&KzgQ`lE*7~TgA5r;-A(@@m&;l1Jba^6!rzuumr_t4MKtkkr{&(4gqqf zkOIU%EmdI}kOq!Zd?t{FPf|Ed<<9`JKD&dnz~i6x6n?1xtmLz_=PAWOWW_JY3~eEh z6}+hAiMpu?qqgY@#xXB1Q2^PNZH7#S_W50`laMpydBCTAShj zor3>Y8~PjltpC_jRKTA02hz0zRE0#!2Pqt)D#k{wnx?n6L9+EGpIj zTtHruTh&SE2SX`a_2>T%(r>d=J%2^|s-+_OyA|*6@IbSR5k=QSSoaWigYGBk~DLM8rkFQt>R|6~1oYXU+MG zx-K46bTq@?zVOVO^sT<%Lw`E25KAUP#D zDH9kjMqk(KINz&>JIhp0rn)g^^4QVzU%2qTq5olI;oZnmDEMri-%Wj@!rF)yU&k=-mU#aNckZ*h;=LnZdZV<%YS#V>Fjw<-mUC=#=oY%H zJaH(%;pIGxm*xx>sG;YDH*&1;E!sLAwnac3!MwF8R7~mx{az0SBkt=b}7XXN|85s@nWTQBr6#oeCTSG9;svqI4uHc9(-GTBQ$nx!7S@+K2F#wr=T zvQ^2(DOowlo`;Nfrz;u%mWuW^h)0GJ`Xl`gh%U-hvhrfwQpY3Bd2eqf;VA@gi zS;rKm&Jo}fAs*JlU|^uwi7K-A$_*co@|dpFF_*NDkfsl3C>dW-c|+;hZsH)~Jq_!~ zMjo@PfH~kPAEo$|l2wQ7E^49w=O|eXr0v)4 zo>sD&knxEJ`~M7N^i3@gpR4g$uJrg6Emg@@I2uU{@vK1`t%NI;B9=RiPyKl0Dp@_D zFN4$SLv$WC(E+cjtOiJ5U~h4}reu5qcTwrtkHJGBD~J4QKt2g)5iF3}3=oesN(Rdc zUddRiWZ{tAvY$3^G-zG~=z9>4H9u+EC6!>aLv*Nc@*=VHiDn0u#d<^*C zL2QhV;%OjOYU}k6*0I?UD}|hzwV^;EpV3nhS=Rd?EU;C{o>_(jjv;HspyiGy^hd;j z<&M0TJiAT?O#w{>O#@8_%>eP)8{f#`BPqTSnGKo-;^WM_pg%zO#m*IufKX4UI6);q zB|*H%4+C-XM}eY2F`&kvSm9jhs9|tww+0y^VkKq~XSEZ=SATATmV;J+R)SW6UIVQG ztp&XSS_fJW;w*nl%v|Yc(3Y=?%?B+2y$CWv&w}=$+m8c#gZhBnpcbH(pjM#PplDDG z$R%#AbOh+NgpunAdb~0u!JsOj5KvW6HP9Z^xC6wOM&AT&0KEm;2;$1I3B>nimw{G- zazWXkexLzja;~Fu+dfG41+@XS1+@n8B|N;QsMQ3`1kD1?20aOS3N#1wG>Fe6`+-^s zW0j+SWD_Ktg5p5UL3~&n3*zHsZ;%g&kC-Q;2|j{8Gz<5~4#b_EtlR%R}T>plMW3M^_ zvUsi-3F5hcYd>Gz83gJHdKAIQjtP$y7F(8rLy0^&{K z{hD|S`dLRHKMFbq`W$o|G!XfGQ?fsZuUPW6OTG=-2E;$A91hBdUKp?uh%dc<44&)e zyP#J=GeNUJvq4XS(m;=b9s~6PJq~(C$I?3xW5>tKZjhho`8w7>ydhw{OE?8Oe5-)# zEZ0>oqiLYApeCSZAif;&0K^lN4sw7zKu%BzP)X2!o<64F&N<8@}sefPMpU zIlcnA>VXpnUlHMZD3d|FW5d^pxYluPdmF?BpX>HK&^dJe0_aQ73D88yc*5q%I32`u zZ6=5(`_Z8OAifpW8^qVv8h`>pl|VtD$~%bNK*1os*?AJ=0dj!Kf_y-?V8C}Eo{KJlc>W25d^hkD(1)M}phcjUxYer# zOTL3bIZ#zpTpe^8X}&Ug2TH$zcyhW2dIYksK^`dMf}R&B7yJegcTwCRZ3e9XwE{JR z-bc{6g1iyH4j}F#9)Kv@n}wf`KwF^vJ_x&SEB!ifHE0cJEr?r+aqv(I=u;32Z$xG1 zffqsC;*A0I0F?tVe>=(zLAgZGP|z^Ya8MFx1SlCKK3?mHeIgSzW`GvJ|8qeTW3n0#&-?hA5Z#dSK7h`ugDpyzp3H~vzwf*!kj(c6j z@*R%adHZ)bGIh~=r=uJ$Zc=tSlJ&OY*iJ{FK1^ICOb`u9cm(QCi;!K8z@Wvb!Vf2> zn0u4oD>G^MdWSy96&4Wj!_y`q0>!|zM8H zB@|-jLIKwn*%34Hn;#steS)I|*B5_C76WmGk?pf)cJSd=<}Ayw*sySHEW~^k<$_fX z3T<-QPhaBq$4w~2hBXdz$xV5AZ%ti1n2! zeB>x`9hFsp#83F`K`$zc287z8?Hph&3G-KRHCn}6)frq@v)`oQ{HiwjWD9~bw# zc?61SdmWX6?7wGv!l%iYa^*XBgmPq9Bz&qh6r1)sqJnr*FN@k-H*fjJ$|Oy$8Deo z|Inp!2y1-jBNM55ffQUuc|p>TO08f`Dzl zB6>nWe_M>&@8}w2e;}scD7|K6=y$mye!<{V(d@HO#N}_%`&s!DAJbwk(uA;wyZJZc+U7jE9#1QC>o?bQSR$WjX zlHL1<{!0g;s?bBIQH|CnF%^SW+5WiCvA*k$cD%jfJB$L|hLOKtUc7zCQ8C8;oA-Cd zES}|GYIO~0SkoFC4}>|R%e%sF{cb*ge!41)wZl)`XGByI%RU3t5D|v~;i5A^3HOLB za6$IRZh|Y{&swVoZ4q_IAHK3@$*qfvg6k(V!$y+#UMRI`u?@Y zUt5>+X}@7GH8QLT!`)lVKZY2#zpgWG^%-qKoxqWnf;F)A_jnvryx)DUy6<@8G?qi& zRGdN4;#Liw6A%+v20lk`a0&qww`xQ%G{QAq45pq`7cYJew*-j|6n!A}eGc!G5r2H{ z=o%wG(W7P0j4OHagT^bm!4$3)h#=lI;Mr!uo!3`>5bVJin4Pbla4gj~RLRe+P5}tVABzjD=#cn>utk(V z?}&<7))E&$7<1kCmAQ4^yxYezGXjf+_C9hL4Q)>B&iQsnMY&VLw8E7xo=2dDqe7fV ztaTL+&V$p%5emzSs0(nrQjx+S`}0H(PBePVaXBX*jWAN+RaL5>u*XFVR$1Y?h&rZ= zr@#gIx0Rt^waV}c9cM3k!BZ|#u%n-dxQ!-Ph-(+oar+ZRZ59T9SijlJi>)<}9ntEF zYTsC)koFB`LwpD8E_Svvxzng~r5jxE*W;VR5*)q7t#43YnkfA(>YEKcPWb2S3!f(&oyR3-&1ULve<&e|=ZLhvbDNm;Qs}bgQZyt*3 zSHzlc9Z`-yJBY8p#VTB?qul+CPkHNj`?l?VDr_o1l>H7()qw(cXdfQh+RiJdUH?Lb z#>k0_E_u!rtQwhp*3c82`-y^i_uPwcB zv|CK8TEo{k3U)r-MZ_hP8YnsgiaWVrk)Wd|i7e_h6FHaQ@0#M$C5)z8?0*t5mmOUl z_q&KEFFQu)r^MCEsLTH3((j8q#QA-)dbdMoV6X#oM93BN-2O(>@ZC?nyYZ!ir95@c zN4oi9H|u{zWLJw=@a$ekuNj3oK4LVA2HBr|>icNs;l0z39xqfFDRQsCz)*1mdir%? z{DAJ;UnKH+wspyKudZs2AZ1gCGwZ@68J^7l0sX;+#8s3UEb3fEDf>GNA&!fKdS1Ui z7Nwe?6wb8c#eC?+*xz*Ovp%`bvHst1f<QJ_fvVzD{!X_BwRYM$|M|8%S2Vyr zI>`RqRHe|k#SPZBJdcX7!RLVN5`%xl6gu2XE$qjCtT`pkHvtOjOe}Ze7^?d}qfg=D z0_p?z2TJL=qS3WNFUfNlc21kFL8XS!TjT0)k|=%45h(t==7_P_frHR^cbb z4eBit<9-EH7Bzl_P4*YQF0XyA?1>X4xNfKrQF_ceb`);z`FyYOFGVcx}HRuUJ;MT+vjqdWF@zBi*geC*(%SiuCT{0rmQdz(3IL z2+@_0E@l$yimiWOPjf&7--F6Y;kpOm_hJ;dprI4wMr2Bh1{b43dzDrlf@x#K3Mj%}QgLJxlCnmJv#si5Ow0dHA#X;^#ntF@~|Dusw}%}4Bn z0wR4L_3SURMg982fQ|avlF(C2j?!x?PE)V-ROw#-F=Zm7a(_#Lp4zxB6J;Mj!T!S9 z>>ft-Ny{hlju59zfkk?6G4KJLxJ)dBy8eV%&r*Nie5g1_1^WYS;U4oc7p5li-W*RR zi0=)uzL9Bq4j#(9BUj_L<5CE^@d>!qn4fk9Pf$x}!3(&Bi1|3e>I z##!#F`_e{eMZa{wBT8@i(tZ4P5fM5>y~Q|BluSfP?z7+f_T44(t2eUe3D)cBcX ziX7czsop@uI6P+Ro5c+e+}S(o@OW3Zsun9fJi1A7S3OHK_e2X;)m`Px?5dv^-cB_1 z_fxBeXz4^x?N7H&*wu6HwcPEU&ho~f zm23R`*=rHKM_Nw8?Eu^f7iUnn?koIwyI8Fua>)<_N_bR`u|Etq>HS|^&ZZsZjXtYV z`%`go?UKLPzp30V%N}cYsFs{a`(*ggSy1ikMcdo!Y2*1nUMX0WQ5#+W>s{n@cw zaZ8RibJjavm{V1B^@8i|@08t1uID?Y-E=HkcF_@HCKRx}38@cQBj$$yc8Vhq#@L@f z>-LFpwa=wsY#r@V_6O4D-P(F`)yDn-g*oNKisoq0{?c0Vr^`MmarPbDAZAgX79JBl z4K$G`^u~ZmBA4yHELKpsRaA=y91z`^cV65;UXcBfw>zKoSTtdPbxEvtm)@dUDd;s8 zafDtXjfKaEG;&XiWvC=!%TfK#Gu8Nf9$zahX|lx+d1F9uTBMVz5H7G{`bn{q;Fv5mfvmfF6UCPI8Yy4u2GH0h@szE}$Ek0G9! zT<+?gH!JcC#MK`=?1yVq1E7RI3!U?&jMy0cm$swqMrCXT+224Mp8U;*HLtJ#*{UC> z1-{o{4XLWC=vYP-#DW@q)dA&HYrqQHQE{SbD{4_eNVF51{NXogdyxH=#(kk5T=;0_ zUT*$WAQtVht!_u2GE5Qy&__>sDqT{jA$!diuUSZVc>roYeDvxB!7RQ)(=T3ftw1QHB5w7Dja(mO|rjB z#ns9MIYBjZ<;|1E?{40o{`8Bz3Tu#t1Xx|}1@ z*=NP!Ak_Vs=#C~9S1z2EQi6A8Qz{n*{zH}&1l7X}jB;Huel7?BwUQQ0fpJyPgc5EO z7|tS`wG_z(MpWRkp;mgOu3Gy{tf*1oBDI#-b5|`1Rs?a+j+tCAY^s(l@dsCphhj)q zbw1n?D;(7V_SbG$raly}cBj-i(HJ)wNU&KikbhgJB!^`{_D>FGV_A$@95@7YbigRc(4?w1-0zA z6FVaj4)w$XZp$7jiKn_fw}(?Ki1LUI+Vi%2v*gEjOO?|*kH%wAdm5b- z=b}(TP4xd@vOGMI`iuMA;XFLZYO?%0tpDUyxi;$mv+JB%(jK&`|^j+R}Y^n z<-YPCBJ;lu$*8{s%0FFe{-2MY;x6j`zr55Ici|Oee|y>2j)%^Kbm}+$zRADB#u*FDODpVoO}n6mwI#37@+1@!&=%=n>+ZmLAD?eA~Gd zrgo}GY6W2@kwcg#4inT<4J@orqT?VvGKW6pMx;JCh6e!I|mPV%WqQ)*nqyQ;iJWq&FA?Aaa5)<=HWgl`)~ zG~wG6EySh{Ft(TY6cA*8X}jX@zehZJuyInM-VAZ8vxk3EtBn19?(kMi2IrM1>nPN+ zzu@g1(B{hWw%-Jrwc0>dAC%;qPZ?-nN#OUt}6)uXIP|)v)rPQ;(8NR+<%D{AY zomUF=Ld4E4wjuVH#_N}>8>P?vCbv+_{uX)akW~*(EPTIZVa^Z{+zAcXA1}YOIP<4m z_nmEp3UfqHDBwTsjiR3Y@$;SEEnNFZK>J?{^>&DbU2Q|`Po{hM#W#3QUv#KY%l@c( z<1UBZ&3$ppl){`H;u;%}A0^ka%lmZfH*DlrO|6mUy(z7_sMeWR^n2w4rNzG4Eu#j$ z)z%6i+!~I6LRx3kV1Kpz+aEuu^l{buGQzA|c-G+hm%#fN;aV^8A(e|AVN1apVctF| z-35BZj-;ixUAU=G>_}P))<~*W?}&L+E_OIAWotNjE9x}$iXApfZ-^+{6$-@;o26h4 zn`$*j45V_gV`nK_V;86&7wf54>=;>km&CcQ7y`ee@|DgvPgRK7d8gYkzFO$wTM$|u z5sKF}gY2)Um;G5R4v9aqvQVM7NQ44jO_)kO`z!43&^NrEI926Fq24mFk$Ufm1KqGR z$+tjDb>N?p#8J1qsM_751(*>cvAah|MD(M0vl#Qb<{kg?!y12keIR(gzq#=A`%5an z@~rPsYX^(kJ=+*|)niV?*`4PCY#O=y~gUdQ?4}_h%JPe`l%7)$!&u zj_?|ya!t=_qD4*54y7k?(Z*4?mM8yTW2L+eH9e2(rTW&A;+3_iTT{GM+q08#Sqa0% z!kV6yMQ|O@8vXefF!^So{f4pqx-jbuf;<#h0cgMB+XH-g@Z%KP@8D)WI{vZDwrz%w VtSuW}R2z@5mOE;RkL!4D|6j^4jC241 diff --git a/package.json b/package.json index 04fc7b21..2fd6337d 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,7 @@ }, "devDependencies": { "@biomejs/biome": "^1.7.0", + "@types/cli-progress": "^3.11.5", "@types/cli-table": "^0.3.4", "@types/html-to-text": "^9.0.4", "@types/ioredis": "^5.0.0", @@ -81,12 +82,12 @@ "@types/markdown-it-container": "^2.0.10", "@types/mime-types": "^2.1.4", "@types/pg": "^8.11.5", + "@types/qs": "^6.9.15", "bun-types": "latest", "drizzle-kit": "^0.20.14", + "oclif": "^4.10.4", "ts-prune": "^0.10.3", - "typescript": "latest", - "@types/cli-progress": "^3.11.5", - "oclif": "^4.10.4" + "typescript": "latest" }, "peerDependencies": { "typescript": "^5.3.2" diff --git a/server/api/api/v1/accounts/update_credentials/index.ts b/server/api/api/v1/accounts/update_credentials/index.ts index 4053b11c..56f4b5e3 100644 --- a/server/api/api/v1/accounts/update_credentials/index.ts +++ b/server/api/api/v1/accounts/update_credentials/index.ts @@ -1,4 +1,4 @@ -import { applyConfig, auth, handleZodError } from "@api"; +import { applyConfig, auth, handleZodError, qs } from "@api"; import { zValidator } from "@hono/zod-validator"; import { errorResponse, jsonResponse } from "@response"; import { sanitizeHtml, sanitizedHtmlStrip } from "@sanitization"; @@ -96,6 +96,7 @@ export default (app: Hono) => app.on( meta.allowedMethods, meta.route, + qs(), zValidator("form", schemas.form, handleZodError), auth(meta.auth), async (context) => { @@ -116,8 +117,6 @@ export default (app: Hono) => const self = user.getUser(); - const sanitizedNote = await sanitizeHtml(note ?? ""); - const sanitizedDisplayName = await sanitizedHtmlStrip( display_name ?? "", ); @@ -154,18 +153,14 @@ export default (app: Hono) => if (note && self.source) { // Check if bio doesnt match filters - if ( - config.filters.bio.some((filter) => - sanitizedNote.match(filter), - ) - ) { + if (config.filters.bio.some((filter) => note.match(filter))) { return errorResponse("Bio contains blocked words", 422); } - self.source.note = sanitizedNote; + self.source.note = note; self.note = await contentToHtml({ "text/markdown": { - content: sanitizedNote, + content: note, }, }); } @@ -270,7 +265,7 @@ export default (app: Hono) => // Parse emojis const displaynameEmojis = await parseEmojis(sanitizedDisplayName); - const noteEmojis = await parseEmojis(sanitizedNote); + const noteEmojis = await parseEmojis(self.note); self.emojis = [...displaynameEmojis, ...noteEmojis, ...fieldEmojis]; diff --git a/utils/api.ts b/utils/api.ts index ebd87632..ce04c3be 100644 --- a/utils/api.ts +++ b/utils/api.ts @@ -107,19 +107,70 @@ export const auth = (authData: APIRouteMetadata["auth"]) => }; }); +/** + * Middleware to magically unfuck forms + * Add it to random Hono routes and hope it works + * @returns + */ export const qs = () => { return createMiddleware(async (context, next) => { - const parsed = parse(await context.req.text(), { - parseArrays: true, - interpretNumericEntities: true, - }); + const contentType = context.req.header("content-type"); - context.req.parseBody = () => - Promise.resolve(parsed as T); - // @ts-ignore Very bad hack - context.req.formData = () => Promise.resolve(parsed); - // @ts-ignore I'm so sorry for this - context.req.bodyCache.formData = parsed; + if (contentType?.includes("multipart/form-data")) { + // Get it as a query format to pass on to qs, then insert back files + const formData = await context.req.formData(); + const urlparams = new URLSearchParams(); + const files = new Map(); + for (const [key, value] of [...formData.entries()]) { + if (Array.isArray(value)) { + for (const val of value) { + urlparams.append(key, val); + } + } else if (!(value instanceof File)) { + urlparams.append(key, String(value)); + } else { + if (!files.has(key)) { + files.set(key, value); + } + } + } + + const parsed = parse(urlparams.toString(), { + parseArrays: true, + interpretNumericEntities: true, + }); + + // @ts-ignore Very bad hack + context.req.parseBody = () => + Promise.resolve({ + ...parsed, + ...Object.fromEntries(files), + } as T); + + context.req.formData = () => + // @ts-ignore I'm so sorry for this + Promise.resolve({ + ...parsed, + ...Object.fromEntries(files), + }); + // @ts-ignore I'm so sorry for this + context.req.bodyCache.formData = { + ...parsed, + ...Object.fromEntries(files), + }; + } else if (contentType?.includes("application/x-www-form-urlencoded")) { + const parsed = parse(await context.req.text(), { + parseArrays: true, + interpretNumericEntities: true, + }); + + context.req.parseBody = () => + Promise.resolve(parsed as T); + // @ts-ignore Very bad hack + context.req.formData = () => Promise.resolve(parsed); + // @ts-ignore I'm so sorry for this + context.req.bodyCache.formData = parsed; + } await next(); }); };