From 86bcc49befe6ff50bb06ab47dd4b3ecf83ca1436 Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Wed, 15 May 2024 00:27:55 -0700 Subject: [PATCH] node:http: allow setting response.statusCode and statusMessage [v2] (#11082) --- src/js/node/http.ts | 7 ++ test/bun.lockb | Bin 299438 -> 315702 bytes .../with-assets/{image.png => img.png} | Bin test/cli/install/bun-link.test.ts | 20 ++---- test/cli/install/bun-workspaces.test.ts | 47 ++----------- test/harness.ts | 21 ++++++ test/js/bun/util/filesystem_router.test.ts | 2 +- test/js/third_party/_fixtures/msw.ts | 26 +++++++ test/js/third_party/_fixtures/st.ts | 18 +++++ test/js/third_party/_fixtures/stripe.ts | 8 +++ test/js/third_party/msw.test.ts | 7 ++ test/js/third_party/st.test.ts | 50 ++------------ test/js/third_party/stripe.test.ts | 64 ++++-------------- test/package.json | 10 ++- 14 files changed, 124 insertions(+), 156 deletions(-) rename test/bundler/fixtures/with-assets/{image.png => img.png} (100%) create mode 100644 test/js/third_party/_fixtures/msw.ts create mode 100644 test/js/third_party/_fixtures/st.ts create mode 100644 test/js/third_party/_fixtures/stripe.ts create mode 100644 test/js/third_party/msw.test.ts diff --git a/src/js/node/http.ts b/src/js/node/http.ts index bdd5e88f1a..bbf36a7976 100644 --- a/src/js/node/http.ts +++ b/src/js/node/http.ts @@ -818,12 +818,19 @@ Object.defineProperty(IncomingMessage.prototype, "statusCode", { get() { return this[reqSymbol].status; }, + set(v) { + if (!(v in STATUS_CODES)) return; + this[reqSymbol].status = v; + }, }); Object.defineProperty(IncomingMessage.prototype, "statusMessage", { get() { return STATUS_CODES[this[reqSymbol].status]; }, + set(v) { + //noop + }, }); Object.defineProperty(IncomingMessage.prototype, "httpVersion", { diff --git a/test/bun.lockb b/test/bun.lockb index 83e8ffb24ace853806c42e48bcd900687836271f..edfce7c97cfc9d3114227ce3ea278fc4743a6e57 100755 GIT binary patch delta 39736 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 BLYV*n delta 30620 zcmeI5cbpYP+Wq_Xoq@UJ9EYex$!P{g20?OCP@<#(MnG~Bi~}l)qNFPnAgCa?ph(66 z$tYP_5m168$rw>olJNVU?z%9$KiA#&v+w&K4QI~toO&vBb#-;!p1#u`&dIsxog5P@ zlzDQ}&Tzppu^9#&Z}Uv{c}MOlKJxp*Ulu5FeSgPFPjxKu_Zo#KMLF6sPHI=g?dmQa zxiQP6xAUcp80$E>9B0%xmn1ko;5gafbg%e)=w-)=#s3YKo^hPx`2 z3!&G1)p4@Jm0UDn~ z?}c*{e-ErSHkjg-n=)$H(0+Zo6PS~Pd?btsJ5Evf3S0p00T+i)!@1x_usY@Muo_wh zE)1`>en#uhgBAbdWIz53xDftwxCs0voZCrpM!kfQ7vX7Gz0+f0zkx$&(8@O)Clh{P zrsHIRAA*%WWMIF3!`Zc5Z~6sZp5<3?7*++F;r#GiSPgp))(-T5RdIdGC6(R)A-xs8 zr2_5Q=Ws!|h#d}th79aKXxLEa=Q)0t_wAQFTn!vFq|ea)NshDdop6C1g;Vy<^^WSO zLA?eg4IN5yukyp57?eD8<2=8|M-EFK(35P-@j3dV=E2%8W109q1BS&r+bKu;i9cxI zzzL2A2O7#VPl|zRP=|hc9|2_ly zs8OvK`c)4}9ya6&^yDE!%J(39U33kKs<4_=!gBHeQu_?(wVPN~)o78Q9!t6gcnqwj z^+@7h?_}r7Vmqi>F7fxlSRPcqf09OHj-~!+9s;WmdcoS)^JL5hZ%*_J?$vLg#-#K6 zGC#e^Bfh>5Uls3N?#FM1RnE33UvEsGWOBk;a%D)VztV4OhG@TtPspk&J}Tw=r|2V9 zeT=HLZ`a=Ui+VWK_T9i9eL0HG3H(f?_fh-Vo@?pHXKvxg)hAu$7N@+NaDJF3ri|+U z#L&V0s<6Kw`E5&Q`O<2C7K!X@zkvgKso<07ItZ_>@f+4NdBEV|$&Pc8G*$4@I>#vo zKVrE&Tme5|{e5d4r#${VxT4dEGZ~{OLVqe4*t5IScawjD^rYq5OOSf0O{?>r=wi;6aV0i{UrQYp28_lZLxz1W`{@Zq%oP{A<0QShL!I# zw8>WA{}k4K_2`|{uP?=|#mRzCHZR|mZGLm=Z1?@{Ly~$V)AJwVtC`nf#kbtyr}s}D z(kr=&)6DsSj5>mShL-onOU<2rhNI}}ut$@I4jW7*Lz0IN?epjp&U(^ygi?0-M|2mg zsde|ZaJ{@|QaHQ4_Dr{2dA~ma=CvGvHQ}Aw=Xc{SI6wX}%QIk2pwGja&j!M|;C5Dj zg>qG0sYCu@NpJb=LC;SawG*Qd0gK>RcpQ8e+z-~o)xvT`SQA?gSn-z+_zgV-OMjY* z)M5Q?h53&Aao3Oe<$etpC4C)S1bz!HteN;}3{}__R>2M60&poWfRRUm8Zd!VenAL~8UQP<6P%+w#>JCL#ZaL3}s+d^wv4Q zz)R=C7xEX*umney;M05z+TiRQhnSHgTbGV;$#S->V(xZW|jeP(3j^__E_X7(UV{A@mSd z9g;JIlj7n+lkpnkMTKX#hzsT6c>3OnX>p-0cx^}vhKtpX3oW;4>B1*!$3+(!=Qz#7 zh1w*9`e124W5P)zu z>5(M%I^RTxv(n2@EiTjpuP$CNoYaUO!K>|i_r`^;;;Gx+@a&E8F_Zj~-EgsHaiQLL zN}|Z_aiO_*mAq`UJ$fHrU9Tf^PxiZlmd3@oO(ussu1t(heqH_Cd1XTMQmmGqbrY+h zEcf9l;f^0BMu(?RTXHK*_MW~EtJf_(!Pw$MFJW;m z*!XYo9`xd?Omm#BxAaMPzJB5#^!uhq%6S#*Rym=wc%37;L-l7kPEy2+o`>h}&@Wi6 zz1kYQ;deg6q-k9A^LSOlN2(=6Z^F7SJnPAXP}Z6Lk!Qd(igUZn3?EvP7@CQwQA7vV zj0;tM({Vc9^2Xt{zvZ3$hqT&nQSq&`33#1+@Avo^oSwIm9(dbvy4>|5EW zycgc>$SrucD=)-!+%{5*J9JLCy=avbf30U>LvNXE(%Jar>-oN=f!>Fqs7u^Cc zF;@l3EdN0yFC)%^O){FM$3xlVQq}Dz0Q8?AST?xG( z$)c*7ObP5rh7TO4 zDxMRbJt!_z8_zbD<2)R%DQQe#%)%S+{H|7+!9~6oRGHCj@M?xTZ%7D@$I`grwCE5Q zeMnK^S@jb_g%|s?uy;U0?eR1&I8W%X`FL@7IlQ*VEMZo`^C!^`c48-6GN?+`wb5%B>Gi(;Un!6LMO3Q0XsS}E>vQL9~GnV8QOWv(*-MPC36Om-s~P~ zji;uBys3L4o;sBsVyx`5Y3aNvKgWmuMbIBr9r0{OQ06r2`6uL;cse2d3uJ~=zb)Q5 z6iUX^LG)X;7*D&%#evK0_jqa8+0q}7~Zg3-s+8x(;JVeuO($}@@E-;EpQ62J87I)kH>}DZT2t98NGq~ zI-d5>Ul|?8tK^lbQ##wnj&naA`^y;Uhxd>l$?3TPPm$C>kN$|K(ZWfDSMQU^fY-=; z9gizh+l0_QtO`VVLqFQ(qd*1ks8+(NcS|3OcYnBZhlJ2BtOWEzVI8M*Tm9DfURylP zdYqaM#7E)ORu=cj)^NwuiEiO-;X?=N1h$0>9IO+w%|E`3$a+i<+i$HjYQ#l1#;c{H z7J3fL9}_1&ijT2Dbc$x89sbTS8RE6Wt3}0rhfTs$HU!%75oz_xYIuftQ?uM z?#I*6We74{Qt;}8J5Njq?ZK+*mq1k1uE^yy727F1)2(!t?T(~Ai{ftTH$3B~#L!B_c&`snu-N~8Z}`x~ zM7P+!aDkr_qnqv5qOZ`;3DNJ|vaVr0=xNQqWTE0&3$WUH*3Da1o3FHxRNe(xtv%}+ z7F~hX=zvWPy@6H7KZcBuMu+?b9-{zn{y%u3!)enV!+YdbzAbniZh3{j_Lr!BDP!=u z-by?558nMp{N<$|`8M9|GOyvaxs~t1qiG{Qz|&}DI++^hoD35yjtak)?0IQPAi;X_vw-HfNg z1+FEAZk+Nf_h*w@r_*@RkIM_ss+AC0hE(= z7IohLutVoQ8y|ynKbe`3UXOFfo)6EsnHV~Ss1eEB!!onLg((FBiJ?vxI3*CXhG!G` z_Jt`k0*UV73sVjSYL%(tc$YyZJ-X_ZXn`7lG<~#ror5ZT|_Yobf>AOmH02*9~NEB4;Ad_Ghg0NnYw-vuj$! z21=!<52o61vD!KVsP0)n+h4J&dlRT{=K^hF>GR~UiRHg5hb;}K+!EA~`9KxF@2Nh= zU@r$sUkTK})gT(I2inBaH_KrYEB+J9TP<&gwTV^FE?uwGGA=IOCYH}d#M{!cbS@uG z&>SfgD3V|4%;4T8R(<bEW4q6M9=(4xyZ~dRkWg(^ePD zKV$trVSnr@A!z*M%m2yx;$k2>!Ro$Tmh&nzTUwTs&+2di zFF=B{{5C-xH0z>iUpnNwa5KUcY_eFUem|x9s#rZO=Rwz9b8Y_x`{VGxDByqG0FBq? zw&BeK)UQ2!zzSlS4_ZGhE91j9y^T#5>qO~neX-0gmb+SAEVG;SZ*k9m7Si}KldLaR zLlv)?y|2~NvZQ|e5cjv~VrHCT%=Dd#G1K!STXxc&K{mi+vo1YDp(L_F)(*X8lf^pY z=UV^2VHGitAL4iUp`o`>j?XFHRIb>)Jk=eGI(jFptvri)cyVap|4ejlI> zDrw`y@=IARZFRBqGS(NXq2;YF&V^ss`gL9ESB82B((2oU|Auu`8c~j}5f8#Dzm+Xl zEb}4jKcp*=0v@)4SbiJJZDH*}M_2`ShPC|_E2OK96DwbLSmpMxdW1_vjK5^_S_u|b zI-&a6{9={Y-}++t17JymtS**0#QI{z4YmG%!n#U66B#NP-u6FXWl=|~Bc6lRfah&F zV(r*i>;G%+>+i`cHc%|{Req?z*Q_qqAb;KZX<2botS**6)%t0fm2Bof-awRD2YLNI z+eV4C8*{BMR{t!rzF6iGe&`~-239R=C0drh&ia4F3fU0pcMNYJerz*})sU^$7pvfH zmbY6yEo&fuYIU*teUFX*0#?#Ks~?oZc2K9N?88<_%c}5etEXjMlTM+lg7dKAF4(xV zEd5(_C4Fz>ez5$bM7AF_ay%mq%e=@Bb^SG11zm@=hhDc>R-CJDvMe*&`e|8G3_ny( z$fifw3@XD&=vO8XlceG^ldNL1+Ay*9Gne(nO3!0`vBqN|Sj88H)$GzXJuL@J|7@J- zq&k&JRoRbcox=}cwW9Klp_$AB6*Ar`zzLn zn_!EXXye6N)lG%f&S^G%x=k0W{2A6y%hKP_P|=3rO?L0v41cp3#431!_0zHnc+bYa z59`!gZ2cvcms(y1YfH;o2d$3`l?^sy~%!^ZD|mHw&q zcf;Dm>al&Wq^~qoWE|3uf5B?N*EU_Of{$1}3ajFiF#nx1{80QkIse4UciyIdYuUV= zE08Ni)9tS|M_N{n->jaNrT=dAw5)0BhSmQE><SUYEH`!ZI)2i7K5 zzH*k!TdrW!)3V|!rr3Z=HbAV3s#v|M)y2}QTfK(W)3RpX=2rhtIpseM{6C6I`O6mT zL~YL=X{S2zLtWMx)>!E!@xNw{f7*gn;ZR%f|0QcjhEY#Q;L3tw!b{N zbJMz;#uZyymUQQ)we1+)#MXlF&Q0sIH?Os7xO3B*PPlW^x`)OB+nt-%bcAM#e|@vs z>nGCh+_csQhdVc|bvIjQ&z+mry4cp#$De;<^-co1k`itDU$M%mW8>gEH?8Rpwtsn7 z+jiA|lCDFM_GY!pm9H-U=bP0L|ISTo+d+43TBp5vts!&gruChh*8krv;yX93@7%Ob zbJJSS+c^L0H?31UR0~ASG09&Anwj}u1~Qv8kbRf{qwEqgB{{e)eCBvCH2T9n&l{}IY#`iSzHO`?1z|4&eUGgwr>><|?+ z#V$gz<_S?Dvqx0el=&GdVn&OKnuDTZrt&XPar3h1E^|V3x2bsvDq$vxN}BVcQl{>& zP-!z=RK{Esl{HO%gYGf2Mdi#DQF+tqcMeYcCH8dX?{s2C6S$0UPD1i!gvw^AglWGb zX|3Ii?M*o4(`zpd|33W~78wmNXAxyb}aKAYrVY`F|HxU|`NjDKj zUPt&$#fy`6pxy=Gird-55fNRT^GVv40lh>1cNlOCb7*&|_TGCjht5_*}s84*gyAk52%(8pYqa6m$vObC6=>`Vw_LkQ8C5&D}} znGxbMAgq)y&;+s|oRg581!1sRDq&higxpyXhMJ_T2#qr#Y>_bBWY30hS;Fva2qVlU z3G*`}l*o?ogc+P2p?wyF{Suxs#d09TWJMU01K}C7N5U!z)pH`Gn9(^AdS^p8En&2& zoC_gec7)nR5S}+L7jfGKUN9#_V@%DW(2Hi0=p}PrG}hED2EA;iL*_tEvi?zwtm90R z;s|4NA$(9A;WcwbLVRw7&UYb9FbnQNI42?V-3XIRhr1D`E-CBh32B@1Jk5Dw8+dBEjCv~OH8W@&{DGiGSiBY zHFHI>E;k)2qOUMZMJr9H67-=-5~Z5eqE#k)WoWhOBl^f}60I@$t3YebV9`3WL$ux$ zs|sx}Plz^}J)%vfOf_h;87=zQ929+GDp!ZLn3qLc%?Z&qQ?mxN-AoegFy|q2pp5o1 zj;8K1)8i1vmPPnO!e^#QJVN|E2rFwM{M`g46gE7xomA8<{9+VDZw3=to4%}()Q*A!2Lzjn=&;v=s4LVVOUW$VDl zT=SgxxN8oHPq?PaeegG~c}0BEHQ$I&xu#ZK__S*#i_f^`g7~a!>eYkKxn_p=ylZ|I zUvN#+`{8e0Ge`WLYp#mFcTMa1@DHwePyC~6+y?MZuIVVg=$d7)nHERaCj4RgCig|k(QO0D#S+bQ5a_D<^fC*ARZ{Cnp6e@aJ7!w1TGPmGLexPa#( zOxx!1iWWFCByCyX5a3=@2p%FOAeemCCz_Vo<&?Q^7+GMR7h3D)Je ziZ^ch8_jb*ppp8lt7kT}MSQj0`vwQBXM+{PjRO6>8*f`|HQgmGWHmiItT^3aE@`!; zR@2jGrKIV%n#-)H2QkV^WLu7=3iM1^1qo~)+BiKZQqfcRMuye&+vLhtTV*vpxZKh{ z@Uhxz+OalP`v}c@@=%XcuBWN^-jmMaEMT9S&!(rFWo89>(p(K&Z?$aLPb&kP9&T2g zdg^Bdv2C2Q&42IV)>y0Q>1b7) z7i2(F_wKNozAu^4#_hD4zR&iP3Q_;>!ce-twKdr8@oqGw7X(AC_Bn#gSTNjbdhA+x zb<9UtO^;s7EDWBo+J37QL3_$-U!v)$Y^NxA+KLBkU@^2&R?{=w{CA3j=g~Ay^!T=t z?*bEToF3hlc{iABwIgW!cS?Y%Ry$@j4a$_u{LmmfVKZw~25jIrHn22WwAJ)HxXdyj zoz+fTjg#AnvDz7{-GlZh(00~p<*@bi5nGCL4w3)f$gcrwB$bh}s!~1Ws!hk=dn%uAMLILB__HT^Uru*sTkVp~ zT%EW%R{PazYVahh{bsc|w6N8Fw^}?}2{aAl%U08~R$27qsU8-*V#Qk6+0ZmPC&9EsQ_;J*V`hAWX(-9oAS}m(Rf_5BRr;vWXqqt7s8yk18)jFf4TCKL# zx}Ytzntm6gyj{WKfOq}#e*q-18_>M1?LGpPCkbfYR!`h-Gk3>+6itJyzSVkQcSh47 zYhbmW*dI}_##lqEC1dN+5RI`$dh(n+-VF5`tYg^32KK@}2XqXZTCF#BU7$nL%xZnG z>shV2)gHswQ|9XO7FO$v{dcRigjH`p>UZ{7@j)BdAMFdPwX&K9)?TZ%hLw3B&`o+B z!iR0#Anfn3bqMv94|dcU3@%{n5Vp125bRUfDLRIc?|ux$*0o++}poQTt;1bYRU0wt)fwACa@Cq0Q zv{)Pu^qa}yU<4Qmo&ZmRr@&A!7z_bDK{9w0^a8y>AD!QiVe|$4Kz}d*3Xdv4=rq(dqAa)vlv8kdPyuKT z&kOQ_0-zv>1tE|TM1yodS3#{#w7SuPbO_KQbXdT&ObFKK`~voi;3Y5?ybQ*J2|#PX zNkHqr*TEE^b>B}MrHkMfa0&bhegnUQE8r@)2CkbU3Bjthbve=;r^}5lFS?v)n$fhP zX+*PzX7#S18|V&tfSw@Pw755zH?!tp&AXas8=JxR21^yzwWBJi2C9QN5D)ZJ`vk{q zjt`bid7H+*1N04WeOp^!9nV8Y=-IVvK;O!!4D|I4edVJp&=Ro#(6TTm$OZI$6n%#! z1oWkuPrw$i6>J0B!5d&Em<8ShZwL9Hre)t8Fc-`NGr&YJ353BEFu{zj#kutiW>?S+ zXtLF{tqQ0LDgixLR2VJ-N`g`#Cx`)hf<&uLtt7RO)3UV?_#6AU0K5m@2U^r00p9>E z+Vn|tDll5RPQjP}CIS6j^yk4C@FI8#lm6p$KbRB?LkM-3B-cCffi``D+vQY zD^LXF1DhEQ?}ER9gap;4Ls4%mMFEzxUT%3_J}?2a~{LFcCZlUI4nD>Jp@D z<6-bMI0BA>W8gSA0lonz!53gJ_zY|X+dv&q3tXg;KZ9RDN;Sroz8zE%=<7!MYEmIk z1Y`qQfEHmH!KWPa&%iEl6dVIuJ1qmL;3KdOECh?d-@ttEJg85_-CkV>AE_K|OFk=tc!yK}Ap*45js29XyQP6f^_#@!tdUz)RpM zFbbRjXTd43AM69W!Qa8>U_00Wc7n^gckwIu4g3zO)6L~TQBaD8oThg+g7u&WxEDA; zA8$&KuJ2B3xzh{u1?@n4pruVC&;&FE%|Q#$5W;0rQu0Gq)h;2Gkz?AeFCAAAK4fGuDkI1CPgLjrNFDO>kxbPwin9sm3k zngQspz&P+4xJ;lH;WfaI_#MfVfee|!dHiQ!{l%1D$u}8P2Gu}y@BsQJRuJg( z*Yh;KHqb|+njit_BTiv(mulKL?%w8brE6l>_$x z23uk8a;FnpQ(j(hoy-@&N$_=Qp@zW`8B?^LI0Oy=t%r|-^%Q;#K9a_d=-;5}uhSd{ z_D1ndUA@i%ExwfZG<*suzhZTooda6uL}Jh26QAN`h!m=Tt0Y_jmw{%n@4>e~SD^3U zOF&l}U3Ih|(!%IRpevDL#F_=gnhDiYS}5hD19AXe!Lq~IKvtczSuiviWCS6Q9z=s6 z$OJNg7?2J`0T0(1kpX;5QWSFi>^-Bky!4Yd5x6;4;Rdf+}Vl)`lts*5d-*p2WtXSW4yz{8*^ zcn~}QT7vRA{>?C&0425n&4CINq&);wQ7fRcpbQl%Z2;&Gx`D1hv0Xr<@Q&CjSB-B6 z+Jg?@5uh1Or?B^jdir8$F76IgND_z?7*A!%_&q@{z}fAcDbcW|#?0_zHce+xAMD;h z_Vc9m!&aH<#bNN{U^r0ugTSy9e(01L3=aiEtgm3{5gv`NSoOfO;2H2VcnUlThEw4v z_+>B_yaZkZW55gGc`zAF0^>mB)HT!F2D6&C+XkakCLq5G#)H?uJyfp~aw2vZybh*< zl4#FS-Dn_tI@&a#BHvUDn*14HCeVcc20RO7!F~(YC!eM8`(Qr!nI^YfRDjuunBAg8^C(74y*-hz(-&;SOrpDPRkE5 zR)Q5^xogI^2$tkGwtLzI3zktw97H|Bk!Vm zy!F&qYt%XQnU|w_1zJH}KfOeyLbBV+s!*2HiappM&u1!Kej(IB}>zld2dHV-o+JL@XEN; zRkMD1JLR6&O+WI+MqcMN=-tFs&pq|+Tel-xy>8xC3mZ%^A1$T3A}zLi@E7}Nd*N2E z*k1aJe)K!qtX;--Q*wE*N{z_dwASRxlcV#5>CZ(4s`;bL ziM(%X<<0MY&QM@yiQ6gZXPNPoQNw#h7pGmiVPEv@xBD0Oc0~PIT;xevULvYXQL*72KdiLd4RBuTjBpms zHOG}>&0KSJ1@po7xu)^TVDs3$bG>WdsP{g+{=nkId-x-xUC5v;$LE?QM7U<2xv`RV z&f_C3v;L?ipT~weJ@w_YoXU0}M_wg%y5$cGzIgM5V^f&VHqJB6Kcp7>HmXrG9^CVD z$K6viaNNHh%v? zHnK81sDZHy&E2axv?aKoqJ~ZRXkGIUV?!;yc|h}^6M2!?^wNd*t|_vjg3fo&J?_xe zU1(k$+Fb&sm?w?<57U9SK zyK?iHt80QSYuNXYjq2Q`X~y!~o_XbV!y+#xd-&Za7ZrZG^jvSJye69^=GnFMcH|Xh z(O)$S44YGZ)a|^HmzBl5e1H05@64%9ik*aqEH$65Wv4z_Hgz4X-nYyYSQo6H;m9)Y zH>ab1UuJr*3zm(oyWD$_VN~RGY(vvce5S{=S|i=Sk!5Dlx?oXv>vHqCO4z&HTv!*Z zlI!smey?1<`c&`D?O&hg2D+{=mDUG~=6Zt^^?lC{A8&p$>)X+8;KdcDr&89D!lG(a zTHzgMt}7(u9>|mD!>%2%aF5gt(izfjmZ1UidCNY@>ciZXKzPD-f%W% z`IZF_jQ+0n?UYB>nWHK_@=mn;OLBei$+8knEJz`gFg8t>ZM$Pxtq+!?ZH~^woT@`A{%Zt zd3JF9d+1|7vgGFIz|ONLD!PHPx|Fe1{lt8_gUGR;m@|qTvV{*alzCVGD_vi#+q8>n zujyTcp4wt&?xe5bs9g-5CR0k+-E4ndKg@mSe?Pug|N*RfsoBhX-?+oSy^} z+}+#E+q>BN$cxT4lzZb)LYsU|z22`x~wwZk@^~yFA^C?_sySevMazx&#R{NKY zOLu0g-kTg+xo}Qj-);sG;kMjiUQv#kJI#9e>vx(1pE8l`=9XnP_GDbo*O#t6wBwi? z(AejMc2ahk`#vLb*RIr#p9L=kO^*4&9A;y$U`&n3tIsYrY1#R`Om&{u^|We*s@$ND zyc}&o%_)Og=l_}OS0v^6edfD8G&S-%wKqRF+V5(&HuG*rEZb*_e!;+rynwAxfw#`T zzouy6+YymhwAKCM*vB&;dH0FiDLex>KzSoCb?e`n_#>gzM_ z%($I$=zv*E-q^_d)^cUdH}JuwWhzC{72dkZ$#Ky9q|zgAXnS?e%36b$jwx_EBJvKm zGTkRXR%%nQ;q8=u2TkH$@{)K26y+fG&b4ECuA}cBx*d`Jkl9FtTk4QGw3owM>X^y0kJ=g>^QWlq6UKjBDqD|> zT1Ql_P>o-sL|y{->X{;)7gR4g{dUUJ$4n>k#`^D#<25m*`!tD~z3SuJ5$lebi7Gwv zrnxg)S4>DPu(AK`i0jlFOG~TGUGZYWHUnzhPRV!N93`)N@ua!DkCp~bnR5H#MyE`- z{gmmwERLKd$~69FI zOEt&7IO2OIUhkUAWbht&vy=DcFK1pE`|JJRdnw*LwdRz$PTttvMCb(g+m4oTvz)2R zZC>g`o7wFAGFUDq<{WoID8Vf16)X@Nd6(UW<6XXK zG4Q_bwcrJi@8 { version: "0.0.1", }), ); - var { stdout, stderr, exited } = spawn({ - cmd: [bunExe(), "install"], - cwd: link_dir, - stdout: "pipe", - stdin: "pipe", - stderr: "pipe", - env, - }); - expect(stderr).toBeDefined(); - var err = await new Response(stderr).text(); + let { out, err } = await runBunInstall(env, link_dir); expect(err.replace(/^(.*?) v[^\n]+/, "$1").split(/\r?\n/)).toEqual(["bun install", " Saved lockfile", ""]); - expect(stdout).toBeDefined(); - var out = await new Response(stdout).text(); expect(out.replace(/\s*\[[0-9\.]+ms\]\s*$/, "").split(/\r?\n/)).toEqual([ "", ` + boba@workspace:packages/boba`, @@ -75,16 +64,15 @@ it("should link and unlink workspace package", async () => { "", " 2 packages installed", ]); - expect(await exited).toBe(0); - ({ stdout, stderr, exited } = spawn({ + let { stdout, stderr, exited } = spawn({ cmd: [bunExe(), "link"], cwd: join(link_dir, "packages", "moo"), stdout: "pipe", stdin: "pipe", stderr: "pipe", env, - })); + }); expect(stderr).toBeDefined(); err = await new Response(stderr).text(); diff --git a/test/cli/install/bun-workspaces.test.ts b/test/cli/install/bun-workspaces.test.ts index f8e02cf4fa..3f9c5910c5 100644 --- a/test/cli/install/bun-workspaces.test.ts +++ b/test/cli/install/bun-workspaces.test.ts @@ -1,5 +1,5 @@ import { spawnSync } from "bun"; -import { bunExe, bunEnv as env, tmpdirSync, toMatchNodeModulesAt } from "harness"; +import { bunExe, bunEnv as env, runBunInstall, tmpdirSync, toMatchNodeModulesAt } from "harness"; import { join } from "path"; import { writeFileSync, mkdirSync, rmSync } from "fs"; import { beforeEach, test, expect } from "bun:test"; @@ -27,7 +27,7 @@ cache = false ); }); -test("dependency on workspace without version in package.json", () => { +test("dependency on workspace without version in package.json", async () => { writeFileSync( join(packageDir, "package.json"), JSON.stringify({ @@ -77,19 +77,10 @@ test("dependency on workspace without version in package.json", () => { }), ); - const { stdout, exitCode } = spawnSync({ - cmd: [bunExe(), "install"], - cwd: packageDir, - stderr: "inherit", - stdout: "pipe", - env, - }); - + const { out } = await runBunInstall(env, packageDir); const lockfile = parseLockfile(packageDir); expect(lockfile).toMatchNodeModulesAt(packageDir); expect(lockfile).toMatchSnapshot(`version: ${version}`); - - const out = stdout.toString(); expect(out.replace(/\s*\[[0-9\.]+m?s\]\s*$/, "").split(/\r?\n/)).toEqual([ "", " + bar@workspace:packages/bar", @@ -97,9 +88,6 @@ test("dependency on workspace without version in package.json", () => { "", " 2 packages installed", ]); - - expect(exitCode).toBe(0); - rmSync(join(packageDir, "node_modules"), { recursive: true, force: true }); rmSync(join(packageDir, "bun.lockb"), { recursive: true, force: true }); } @@ -118,19 +106,10 @@ test("dependency on workspace without version in package.json", () => { }), ); - const { exitCode, stdout } = spawnSync({ - cmd: [bunExe(), "install"], - cwd: packageDir, - stderr: "inherit", - stdout: "pipe", - env, - }); - + const { out } = await runBunInstall(env, packageDir); const lockfile = parseLockfile(packageDir); expect(lockfile).toMatchNodeModulesAt(packageDir); expect(lockfile).toMatchSnapshot(`version: ${version}`); - - const out = stdout.toString(); expect(out.replace(/\s*\[[0-9\.]+m?s\]\s*$/, "").split(/\r?\n/)).toEqual([ "", " + bar@workspace:packages/bar", @@ -138,16 +117,13 @@ test("dependency on workspace without version in package.json", () => { "", " 3 packages installed", ]); - - expect(exitCode).toBe(0); - rmSync(join(packageDir, "node_modules"), { recursive: true, force: true }); rmSync(join(packageDir, "packages", "bar", "node_modules"), { recursive: true, force: true }); rmSync(join(packageDir, "bun.lockb"), { recursive: true, force: true }); } }, 20_000); -test("dependency on same name as workspace and dist-tag", () => { +test("dependency on same name as workspace and dist-tag", async () => { writeFileSync( join(packageDir, "package.json"), JSON.stringify({ @@ -177,19 +153,10 @@ test("dependency on same name as workspace and dist-tag", () => { }), ); - const { stdout, exitCode } = spawnSync({ - cmd: [bunExe(), "install"], - cwd: packageDir, - stderr: "inherit", - stdout: "pipe", - env, - }); - + const { out } = await runBunInstall(env, packageDir); const lockfile = parseLockfile(packageDir); expect(lockfile).toMatchSnapshot("with version"); expect(lockfile).toMatchNodeModulesAt(packageDir); - - const out = stdout.toString(); expect(out.replace(/\s*\[[0-9\.]+m?s\]\s*$/, "").split(/\r?\n/)).toEqual([ "", " + bar@workspace:packages/bar", @@ -197,6 +164,4 @@ test("dependency on same name as workspace and dist-tag", () => { "", " 3 packages installed", ]); - - expect(exitCode).toBe(0); }); diff --git a/test/harness.ts b/test/harness.ts index 48f5ad2bed..bcca18648b 100644 --- a/test/harness.ts +++ b/test/harness.ts @@ -763,3 +763,24 @@ export function mergeWindowEnvs(envs: Record[]) { export function tmpdirSync(pattern: string = "bun.test.") { return fs.mkdtempSync(join(fs.realpathSync(os.tmpdir()), pattern)); } + +export async function runBunInstall(env: NodeJS.ProcessEnv, cwd: string) { + const { stdout, stderr, exited } = Bun.spawn({ + cmd: [bunExe(), "install"], + cwd, + stdout: "pipe", + stdin: "ignore", + stderr: "pipe", + env, + }); + expect(stdout).toBeDefined(); + expect(stderr).toBeDefined(); + let err = await new Response(stderr).text(); + expect(err).not.toContain("panic:"); + expect(err).not.toContain("error:"); + expect(err).not.toContain("warn:"); + expect(err).toContain("Saved lockfile"); + let out = await new Response(stdout).text(); + expect(await exited).toBe(0); + return { out, err, exited }; +} diff --git a/test/js/bun/util/filesystem_router.test.ts b/test/js/bun/util/filesystem_router.test.ts index 09a644d210..bd0074fbd3 100644 --- a/test/js/bun/util/filesystem_router.test.ts +++ b/test/js/bun/util/filesystem_router.test.ts @@ -16,7 +16,7 @@ function createTree(basedir: string, paths: string[]) { } var count = 0; function make(files: string[]) { - const dir = tmpdirSync(); + const dir = tmpdirSync().replaceAll("\\", "/"); rmSync(dir, { recursive: true, force: true, diff --git a/test/js/third_party/_fixtures/msw.ts b/test/js/third_party/_fixtures/msw.ts new file mode 100644 index 0000000000..97e0bdc195 --- /dev/null +++ b/test/js/third_party/_fixtures/msw.ts @@ -0,0 +1,26 @@ +import axios from "axios"; +import { http, passthrough, HttpResponse } from "msw"; +import { setupServer } from "msw/node"; + +const server = setupServer( + ...[ + http.get("http://localhost/", () => { + // return passthrough() + return HttpResponse.json({ results: [{}, {}] }); + }), + ], +); +server.listen({ + onUnhandledRequest: "warn", +}); + +axios + .get("http://localhost/?page=2") + .then(function (response) { + // handle success + console.log(response.data.results.length); + }) + .catch(function (error) { + // handle error + console.log(error?.message); + }); diff --git a/test/js/third_party/_fixtures/st.ts b/test/js/third_party/_fixtures/st.ts new file mode 100644 index 0000000000..8b4d96c4ca --- /dev/null +++ b/test/js/third_party/_fixtures/st.ts @@ -0,0 +1,18 @@ +import { createServer } from "node:http"; +import st from "st"; + +function listen(server): Promise { + return new Promise((resolve, reject) => { + server.listen({ port: 0 }, (err, hostname, port) => { + if (err) { + reject(err); + } else { + resolve(new URL("http://" + hostname + ":" + port)); + } + }); + }); +} +await using server = createServer(st(process.cwd())); +const url = await listen(server); +const res = await fetch(new URL("/st.ts", url)); +console.log(await res.text()); diff --git a/test/js/third_party/_fixtures/stripe.ts b/test/js/third_party/_fixtures/stripe.ts new file mode 100644 index 0000000000..f9fa5ba48e --- /dev/null +++ b/test/js/third_party/_fixtures/stripe.ts @@ -0,0 +1,8 @@ +const Stripe = require("stripe"); +const stripe = Stripe(process.env.STRIPE_ACCESS_TOKEN); + +await stripe.charges + .retrieve(process.env.STRIPE_CHARGE_ID, { stripeAccount: process.env.STRIPE_ACCOUNT_ID }) + .then(x => { + console.log(x); + }); diff --git a/test/js/third_party/msw.test.ts b/test/js/third_party/msw.test.ts new file mode 100644 index 0000000000..2867ffdbbc --- /dev/null +++ b/test/js/third_party/msw.test.ts @@ -0,0 +1,7 @@ +import "harness"; +import { expect, it } from "bun:test"; +import * as path from "node:path"; + +it("works", async () => { + expect([path.join(import.meta.dirname, "_fixtures", "msw.ts")]).toRun("2\n"); +}); diff --git a/test/js/third_party/st.test.ts b/test/js/third_party/st.test.ts index f77b4e552e..418a126c74 100644 --- a/test/js/third_party/st.test.ts +++ b/test/js/third_party/st.test.ts @@ -1,60 +1,22 @@ import { bunExe } from "bun:harness"; -import { bunEnv, tmpdirSync } from "harness"; +import { bunEnv } from "harness"; import { expect, it } from "bun:test"; import * as path from "node:path"; it("works", async () => { - const package_dir = tmpdirSync(); - + const fixture_path = path.join(import.meta.dirname, "_fixtures", "st.ts"); + const fixture_data = await Bun.file(fixture_path).text(); let { stdout, stderr, exited } = Bun.spawn({ - cmd: [bunExe(), "add", "st@3.0.0"], - cwd: package_dir, + cmd: [bunExe(), "run", fixture_path], + cwd: path.dirname(fixture_path), stdout: "pipe", stdin: "ignore", stderr: "pipe", env: bunEnv, }); - let err = await new Response(stderr).text(); - expect(err).not.toContain("panic:"); - expect(err).not.toContain("error:"); - expect(err).not.toContain("warn:"); - let out = await new Response(stdout).text(); - expect(await exited).toBe(0); - - const fixture_path = path.join(package_dir, "index.ts"); - const fixture_data = ` - import { createServer } from "node:http"; - import st from "st"; - - function listen(server): Promise { - return new Promise((resolve, reject) => { - server.listen({ port: 0 }, (err, hostname, port) => { - if (err) { - reject(err); - } else { - resolve(new URL("http://"+hostname+":"+port)); - } - }); - }); - } - await using server = createServer(st(process.cwd())); - const url = await listen(server); - const res = await fetch(new URL("/index.ts", url)); - console.log(await res.text()); - `; - await Bun.write(fixture_path, fixture_data); - - ({ stdout, stderr, exited } = Bun.spawn({ - cmd: [bunExe(), "run", fixture_path], - cwd: package_dir, - stdout: "pipe", - stdin: "ignore", - stderr: "pipe", - env: bunEnv, - })); // err = await new Response(stderr).text(); // expect(err).toBeEmpty(); - out = await new Response(stdout).text(); + let out = await new Response(stdout).text(); expect(out).toEqual(fixture_data + "\n"); expect(await exited).toBe(0); }); diff --git a/test/js/third_party/stripe.test.ts b/test/js/third_party/stripe.test.ts index 4c400afe54..5954ffd8c1 100644 --- a/test/js/third_party/stripe.test.ts +++ b/test/js/third_party/stripe.test.ts @@ -1,64 +1,26 @@ import { bunExe } from "bun:harness"; -import { bunEnv, tmpdirSync } from "harness"; +import { bunEnv, runBunInstall, tmpdirSync } from "harness"; import * as path from "node:path"; import { expect, it } from "bun:test"; it.skipIf(!process.env.TEST_INFO_STRIPE)("should be able to query a charge", async () => { - const package_dir = tmpdirSync(); - - await Bun.write( - path.join(package_dir, "package.json"), - JSON.stringify({ - "dependencies": { - "stripe": "^15.4.0", - }, - }), - ); - - let { stdout, stderr } = Bun.spawn({ - cmd: [bunExe(), "install"], - cwd: package_dir, - stdout: "pipe", - stdin: "ignore", - stderr: "pipe", - env: bunEnv, - }); - let err = await new Response(stderr).text(); - expect(err).not.toContain("panic:"); - expect(err).not.toContain("error:"); - expect(err).not.toContain("warn:"); - let out = await new Response(stdout).text(); - - // prettier-ignore const [access_token, charge_id, account_id] = process.env.TEST_INFO_STRIPE?.split(","); - const fixture_path = path.join(package_dir, "index.js"); - await Bun.write( - fixture_path, - String.raw` - const Stripe = require("stripe"); - const stripe = Stripe("${access_token}"); - - await stripe.charges - .retrieve("${charge_id}", { - stripeAccount: "${account_id}", - }) - .then((x) => { - console.log(x); - }); - `, - ); - - ({ stdout, stderr } = Bun.spawn({ - cmd: [bunExe(), "run", fixture_path], - cwd: package_dir, + let { stdout, stderr } = Bun.spawn({ + cmd: [bunExe(), "run", path.join(import.meta.dirname, "_fixtures", "stripe.ts")], + cwd: import.meta.dirname, stdout: "pipe", stdin: "ignore", stderr: "pipe", - env: bunEnv, - })); - out = await new Response(stdout).text(); + env: { + ...bunEnv, + STRIPE_ACCESS_TOKEN: access_token, + STRIPE_CHARGE_ID: charge_id, + STRIPE_ACCOUNT_ID: account_id, + }, + }); + let out = await new Response(stdout).text(); expect(out).toBeEmpty(); - err = await new Response(stderr).text(); + let err = await new Response(stderr).text(); expect(err).toContain(`error: No such charge: '${charge_id}'\n`); }); diff --git a/test/package.json b/test/package.json index 92737a6434..ab6737fde3 100644 --- a/test/package.json +++ b/test/package.json @@ -15,6 +15,7 @@ "@resvg/resvg-js": "2.4.1", "@swc/core": "1.3.38", "@types/ws": "8.5.10", + "axios": "1.6.8", "body-parser": "1.20.2", "comlink": "4.4.1", "dedent": "0.7.0", @@ -29,11 +30,12 @@ "lodash": "4.17.21", "mongodb": "6.0.0", "msgpackr-extract": "3.0.2", + "msw": "2.3.0", "mysql2": "3.7.0", "node-gyp": "10.0.1", "nodemailer": "6.9.3", - "pg-connection-string": "2.6.1", "pg": "8.11.1", + "pg-connection-string": "2.6.1", "postgres": "3.3.5", "prisma": "5.1.1", "prompts": "2.4.2", @@ -41,17 +43,19 @@ "rollup": "4.4.1", "sharp": "0.33.0", "sinon": "6.0.0", - "socket.io-client": "4.7.1", "socket.io": "4.7.1", + "socket.io-client": "4.7.1", + "st": "3.0.0", "string-width": "7.0.0", + "stripe": "15.4.0", "supertest": "6.3.3", "svelte": "3.55.1", "typescript": "5.0.2", "undici": "5.20.0", "verdaccio": "5.27.0", "vitest": "0.32.2", - "webpack-cli": "4.7.2", "webpack": "5.88.0", + "webpack-cli": "4.7.2", "yargs": "17.7.2" }, "private": true,