From e20d013a4f5f4dfbf4ca51e7858b0b2f7543ba9b Mon Sep 17 00:00:00 2001 From: Prashant Sridharan <914007+CoolAssPuppy@users.noreply.github.com> Date: Tue, 30 Sep 2025 12:25:03 +0100 Subject: [PATCH 1/9] Added new Lovable blog post to support their launch (#39099) --- .../_blog/2025-09-29-lovable-cloud-launch.mdx | 41 ++++++++++++++++++ .../blog/2025-09-lovable-cloud-launch/og.png | Bin 0 -> 24796 bytes 2 files changed, 41 insertions(+) create mode 100644 apps/www/_blog/2025-09-29-lovable-cloud-launch.mdx create mode 100644 apps/www/public/images/blog/2025-09-lovable-cloud-launch/og.png diff --git a/apps/www/_blog/2025-09-29-lovable-cloud-launch.mdx b/apps/www/_blog/2025-09-29-lovable-cloud-launch.mdx new file mode 100644 index 0000000000000..9babccea5f648 --- /dev/null +++ b/apps/www/_blog/2025-09-29-lovable-cloud-launch.mdx @@ -0,0 +1,41 @@ +--- +title: 'Lovable Cloud + Supabase: The Default Platform for AI Builders' +description: Lovable Cloud makes building with AI agents easier than ever, with every project powered by Supabase behind the scenes. +author: wenbo +image: 2025-09-lovable-cloud-launch/og.png +thumb: 2025-09-lovable-cloud-launch/og.png +categories: + - product + - lovable + - ai +date: 2025-09-29:08:00 +toc_depth: 2 +--- + +Yesterday, Lovable announced [**Lovable Cloud**,](https://lovable.dev/cloud) making building with AI agents easier than ever. Every project created in Lovable Cloud is powered by Supabase behind the scenes. That means every AI builder using Lovable is already using Supabase, whether or not they realize it. + +Lovable's mission is to abstract away the backend so developers can focus on ideas and execution. Supabase's mission is to provide the most complete Postgres development platform in the world. Together, these two approaches are changing how people build software. + +## Why this matters + +Supabase has become the default choice for AI builders. Whether it's Lovable Cloud or the next breakthrough product, the pattern is the same: when speed and scale both matter, Supabase is the foundation. + +- **Build fast.** AI-assisted development requires instant setup and minimal friction. Supabase delivers that with a fully managed Postgres Database, integrated Auth, Storage, Edge Functions, and Realtime APIs. +- **Scale with confidence.** AI builders can't afford to stall at prototype stage. Supabase scales from weekend projects to millions of users, with Row Level Security, point-in-time recovery, read replicas, and enterprise compliance baked in. +- **Stay open and flexible.** Supabase is just Postgres. That means builders aren't locked into proprietary query languages or one-way migrations. They can extend their stack with Foreign Data Wrappers, pgvector, and the broader Postgres ecosystem. + +## Lovable Cloud, powered by Supabase + +Lovable focuses on simplicity: give developers a clean interface to build AI-powered applications without worrying about infrastructure. Supabase provides that infrastructure. The thousands of projects Lovable launches every day run on Supabase because we provide the security, reliability, and developer experience they need. + +- **For developers,** Lovable Cloud offers a polished, AI-first interface. Underneath, Supabase ensures every project has a proven, scalable backend. +- **For enterprises,** this partnership proves that Supabase is trusted by the fastest-moving innovators. Lovable's growth shows the demand for AI-native development, and Supabase is the platform making it possible. + +Supabase is the open-source Postgres development platform trusted by over 4.5 million developers worldwide. Every day, more than 40,000 new databases are launched on Supabase. AI builders like Lovable and Bolt aren't choosing Supabase by accident. They're choosing it because the combination of speed, reliability, and scale is unmatched. Lovable Cloud is another proof point: when the next generation of developer tools launches, Supabase is the default platform that powers them. + +## Start building + +Whether you're building with Lovable or directly on Supabase, the foundation is the same: a complete Postgres development platform that lets you move fast without compromise. + +- [Get started with Supabase →](https://supabase.com/dashboard) +- [Try Lovable Cloud today →](https://lovable.dev/cloud) diff --git a/apps/www/public/images/blog/2025-09-lovable-cloud-launch/og.png b/apps/www/public/images/blog/2025-09-lovable-cloud-launch/og.png new file mode 100644 index 0000000000000000000000000000000000000000..cbf20539bb587072b55081fcbd868b5fce8f66dd GIT binary patch literal 24796 zcmeFZ`9DA(p=ZM&UHN=_s9M5c-*gI&z&_95tJ3=;^GoH zed@#oE-qe#i;HLHCLZ)RyoMeJ(7$kc6tHC!_-gv9z`j8Fx zn4FA1ToI~K6@H-bmS#berzw=^xHNzFGOXhkomQvX%^ND3Py=GddoncQh0>-eP3vpLN9J!s*Abo?M=R z8u|3*d`)fWSR`3r7uGtOXW(RR@-WB9V}GVwzNV7V(Xd>7!>r@s+In8F&gr+>D!Dp) z_ocaz4q2Wtj?X^oXL3B|jkb20@!fRwGZx39_L8nVJZzJrZ)$ZS_QcV!yklD+L;rlk ztr|L4^Yl;T8f;U11l_%RSH~#ekfvj_mdl+}Pu^zwyEemh(Dcq zYwk?evB}p^yKEe5Z<=aj^3Y2E<{6{lh||dm_w8TnpUc-(i#K`n_JDGt&ZRgF$Jd6J zvX0$~()R{UNmq}AywEsuPuuzR0j=lyMC&6VX~%A68-h-zX`!a6sfNx0rm3g(eIK2? z_gwq5t64^_{<%jc54_DXv<-YCj|AK_O}8{j^gAA%W$2V^h)X&V`Br_mgO2B;Bfc-y z4AQkNcikc88W0V%UHp#(dl=k$XyAJNNNAY0Tio%8@Z*tzC*zLl`yAKtu+s6kp?@>> zh@ZKRySqt(i|%z;&&FTdJSQxL%*n#an{FT;!eh^tE)q&9^E(@fA#beB?n_; z&C5rXWPDCNwy>~JIdDEp_uO7{{oO|DK003V`}TO4rVyg-)DkXV)4q27`gKK5bM4(b z52m;2J3E#!z&+9*mlI= zsEv)yEoFsJl@l)y?sHL*xpQLk>kA^@23yR{&Aq(5RFCVtmB_t}x`e>>Q$$}bE+I+I zH-;{{Zzh~8gP%)pij_?`Sbp=2-MP=3 z;so9A^YI&Rj{0%xe$+nGP3oI#o=aRjV!WsSRK&iIe&7}H2HXMVkB!)`__)96<<1%v z3x*4UbtRz##JqM}wiV-d!AAIdHg#J{XeDW#;7a4nr#2YG@vzc<@jU7u{AkYcDnF zf7AYN6aHrj|8s}`VZ#4_@qf|befYL35M@7F>3 z?;o1F-aZ$7EFoq^n>MZq`xbm!ksEG@aIHX>-O_-+E_2#Gn<_XSsIatXI?{E^4xWmN zU>u~5^O6h#2Cs=+B+D(-pA6622_7}@Du_%^#(0EmM|62XPnxW}w=;D-63?DqcsHxD z4E``*3_m=vI&fCHMtrS5h(9zhr)_kQ{$@8FLmpW*pthicsDer#F&@`#*u`JinUSQm zjn~9W&i%9_hIXFOhwwrqb{7|362e6}o1go7qON@At(B4g^7?iO(P_zZUs=}3VWOlA zGE~P0rg4$E;IF(`%O_a!1snEdHTgLmI4s=oxE4B#f$`sR3=kHPECkSavuWeeK;NXD z!vf3w>CLGxN;zaP7iXIC;`%1An+wkm*K1Vr0J($PWAs;3EWv4HWrnG&ADM7pegc;|Z!JP*)*S%1=4G(r&r$iiP+-w9r& z{)6mxSBGp)txgks=pK%^vm4O%3|Y2rSnR{gk_Akr`j^l*p8c7 zi7M(1LoecNd_Ul~HcltL+_hr@ymUH#zCO2&M?Ge)*`P+CwAIKo<{Kl9X`>W+3pJ~UzIyx@iTZt*k$^+R6; z;7(t1pHXGchHNNY45d{LxWt7#(y-U|${mXl30BKJ@$YoXs!Jh?e7D15E~Eo7>fgK^ z0KLI*m8l)@m!6PVoQt_M;THz4Ms2~6r(Yl2hWNZW>|H>yVO;#Z@z`tLa%sxN=b}3g zFfZm3v=rVI8kDzjZ0TU~Qk?%zkILyM`ypo@SQzXMe(UT)=CN*6u+I-InX64-BZpDP zmp2?NQ!JF$8mnJMeL}h zzwJAGanJoDN=Rpi+|8*D5l{kMxHB*^ncY+Y;ex*!Sg-X;>uK!wTQ*z6lIQNe$R&%g zq6w@-y~q*6qWVzm7HSd~osaxgC26)|{6NFn=N3HhIQNbKY5el}uWj=aAK)RQNnW5` zB?&_pL?jS(v9Gr!zw*I8Hg4tPU9~x%Ufh>l<0WS#nw*!;s1PcSyZTZR)RETV0=7fO zkn@{8TOZ$ok{#_BdBlSvnfHHf1N*{Hy;ofja*Tor;9r97fF8zdsJWx_){1fT`y4&J z4x_f<38#hFcfJ7Go^ny0;m8~fJ2kJQp>;L95?^Du)E&q_xnbd-kxlM+SJif*^ku@B z;e_r2wkY$w@aT=q+CSxEsM&Sr_-5CRIM>OPE~)mkVI0zujo($K{>fEo+)p|jO1u=f z`jDR8J3XSD9`n))XcxrWI9FI)*)i{MA(jg-2KNdSUnTceX*NB(Yb<) zO0HBELiSLTbbIGMW68gs<{f&S9iv=#$m@4;Tg7k8FC}oft#jlmWAd@eh8BI%N?Vo$ zw#`G?UjBOjxy0A`(jHY1YuC+V6L!!lNcy*rQR@KNY>MUivBza&%J*@McN=bvR;p>Y zv~i~8^>Wmck4Nz(qoyC-`AM@;-0%C%l*OS6D4~p>{9~8LLh~L){-92l!`CmW4&@~| zhBow!XEf!Yj>l_@`lfG|@}4w@lFrw1mZ0c_LEldk#2$K#AxDs(jvO0oP3fD^6f+!q zPxxlpm@z3Pumid9-MHpab@+_)hJ#G&pI7g>i*+M#k5S-&6d_8QjAe;Tl+_*b{J=~4 zq=fyS8)Bb%8UP8MpnGA&*So;zHg8UNMFgui%8` zA!7__xLWq?WGnB0aE>~iENtDV$+pFZX5N~8%0BjPBaj=v@vEZYE_30gi}Qx`Rl3fV zY-ytU#e>8cdN5Ux8-6MM;(EWJh1QvDlC@jGg$sT)DG2VRwuFldj^!_6GIOirjTH)>Mz+cPyf8b^IF$E&hqnLS z_CI~tc-XThijofnCNI5P4Sz6#-_W41+32|tohm%wO@!k>hDivQnfpXhtY$t19MpulN3Em$dyFA#BQ}DaGV_I3Nc{ z@~eATFjgEv80>ea4EZV z<}DvML38hc5=M(oJaZ=gNQWy+;IBruC>bb4gXI^sqslCT_yD!b!$^sBO%v^`+L(K-1K7SIhRZ`E3@3 zz68jbsdduMnb+0mQ*c-ZX=jh~ydNrw!SZ zk%XdhQ=3yCO((84i`$p~JAjjmE5oVk*6ZE56O!95-$;H}sbBZxgOQXOHLfx4g9w6} zbO_QpFw?542q`)c^}1VIT29(XobXIfb=OQH|TTEPr_$ zd*ZXxo-L;cJis2H_&Gn^%Y~OFED&7ZnQ7$s)TC#o51itUzGX(A4|9nf!NAqY?@>0cu#-(i#S*1LCCL?66g_o?9Te(b`>eao=4VZ0^3(nIwVXrW%YjPygv!Mx$oLRR&X8(~1@|MxhaLww zQ+;Y=BQwvmUvX|QrOJMZz-^fPO{)*E^s?#yfw%fH=W`O?3_~sI@A*Nmh>?io1#{Kh zgDHRA3k)SLlx%Jm9I}*r!k}*P&cHZ z7ljK`6TVfPHnEMpEB_4LcM=_I5Ns{RERPro(4g4KKO&7rTTcCzp`C?{6ZdkXC@lq6 z9J*Xr+%;bQlQDC$+Uf0cNa8#t!drI4Qz!@OX_r$-W~W>?;YsU5l2;b$oG6VCVJ~ye)1oe zLv8(3_x3#wj4>AbJPyxGmNM9^GO%gJL>xU$Me{BB@B4gJ60(Q)xj1hrxOz&%dve$- z64&?H4P{xM*KC?pkk(x4quD%%ESu903R61A_+~rKa-o(eNE1BUpf_ei8nU8&bqbxc z5mDWplVG7=vYW|)m){pyvD+=WK;ArVe= z;K$b{-TY9o(ERq<^+dtR6J4%{OJlyj)kD(TMoYyF2A>%uP@o!a@aEf0Uy(yl8tQKF zaGI`*;^sfLj}L!`zR&S;ZhA)k;DzVPJH_2QhLSXa0fOW=;D5(8KWk& zBZ`515aU4AHe@&?IK)Sri*A=<5SO_5WE-}s`&x+qmI{2}O{F^MvaYS>YT0VSuLp~x zH@b)=`%PxV>)$5-cvQa${y`JgnH2>aIho6_X5#2y+E%!^x%o5?^VhRmMXCW=o}d{# z12qc4cXXsn54^nEJ0Tgx2M5F|{v_RV9$1w^jbbEfq_)+X4}Rnb8Jodeu#48e_nhkH z*0Jbl#n8jj)Tln(1b*1nG^vW-w#Vf52zwO3}D2e7SxzVa2(Yi!O>>LoQfKgwo@y)uA@e)!^M_-d>GpHl`0UTl{W)?SM|l zn~8&;CFq1-mMFJHNizZIWKC}YZG}OPSJ#yWN}J6J??M`EC}!KOTQ>`3%x&y7AbOa1852;fgu@Ku=lxj&Bgsp+jz|4i{H z>Of#u?H=j66V@}vLa>Uh4W(ywQ=e4D+mY<8@Ea-k`g^8}hY&jMz`Ht1qwZee0?YP_ zJ2I$InWZDu?r&&$-H=LA3WH@CUwp)r1ezkPL|XTw>Q~^K5yfq=jV!?-<-iUISEu>{ z%e=zN{Af7Q?RBZ2AN)=vr_V<20v}gE#D5f16>KYo7#`c!{C?9Z%s8658dkQZ-x@iX zse-S&9e%Aw*fU>~{z|&DGyUm%G{4#{1)YwtT0E9FxMm1jf*Gt=0eS;ZrE*#yn^y9f zsSc;7Z=Jt-K6do#ct-wXaIo(_0dXqgGUJBpr7wukOwV5O?C%}gLUL>G#p@XE{Thk0 z`=(i?zgsQ6??rMpbF{7bG`t`5N@nyU?f>NOZMuMDNZV+#z2Q^~`M^#h` z{Df_ul{k3VV}OwM8cmIv4!VF%sut9I^wL4pvC*WAJe{27i45Og8EvzbB1-Y9+)>Mt zjKbCST9^N~EoxJ^Xy?fU{T{8~r_&vUsXd*d1o3~F#@-nR`Ce`hGhQh=_e#u>SC>)e zDhfe9Y)4M6`RRA&=ii1r-S~kL0ThpvgY4^1a&wMHP^{6mEcLelL2i$5M(RCk`Weof zad?#s{6m(&Bh_?pQfS{zF)1;}+vcgq>wnk~sN-89KVE#b>k}M_(HT+*{e2R-9odT^ zTShPh;M3a(lRuvHI&&e_hik4yY6yTkxM5MqvxH_ddZtJVDL=BuHK>ixV;e*fLwcgE ze5p<`IL3+&d?}pI%FVqIgAZvAqAG7fdZMfjK`~+yUj6mQZO?y~MAAoSf@S2@vhR1- zWG;#k#64^m1wTbtZH6d3WRzG^;|jKC9xB}E#Sn=1u-_T0IT2R8By?|37NiL^Kfr<& z7+`}M2NXmkqt%^g=UW77iwLs32`IP6;FYM#y!88`5QU%o0*epY?P6Rpks2g^;HHceluJ!g5kjj*C_JC!gQ2%vctJ!znxex4@E|_isP)yy_hQJ})EUOt z77{li8<8x6v_w;|$PgFZ+7kcyCI&$BR3Sh?9#)A+<^>IDJxOBdSQG;I;Azr{2!`sv zv7^Tj7cTq`D4XWKC4%BiKhSZhZ=tQK7A;P&Ti(f0Z9;#r#0(dI6o#>XM2m&3MFu5X zRPxUz^8j<`033(=$YP z4quPw->7h4m%q2GGMY_` zw6@SdiLAkmtkC(Tj>0ao0O^bj&Nr4I6NIjPMkh)wu!eHj3k2;OWEskJHt;IpN!ucML z!i^G}nw-(pqjVnpW+5~{S@FS_3^kMt2SvdhLDL-@`Xa#1BU>YJL6ok32JwnwhaxX5 zfdRNVC);z5R(!Uc2dDxzCOS5H? zxvd9LRCM3u|359j@5l|LI<6fe3K8h|LHDVeg>~Z^AAgSnKS?|shd|2`Z_ol|X#EZ( zF8GJh`aWK~!zJeqNXKEKW}yRrW491;5d-jY7UMa3?>Y!oD4}NgmcM=dl~GFp;v)^d z0D>ng#-1f_rdP-Vp0;qo8ZbjlpMo?qC{MLWFdDe9_ z`v3+Oq%)~;(qIASbMY;GyDJ`X44=aXwPtAU!Z^59z@OSOkrMt{3jV{5|LfjiAP;W` z2Zu3$SA-Q2nQWOAMAX;*EQO25<09C?Sa3t*5B?O!3NcDFudR!OM)B7;3A_*Lx-#c$k|%_mtLjq zh^Qu%UFhqtR&N@uF>E5}>u`#J)-*==z+_(h271KV-{(rC^^G>;xmjr)A)b?hWDzh} z)Grnb=5diX!PlE)1wkxlw!YrrPN+r`!&;z6vE%bZj$LjiFEZ3 z?EJw&8o&H%PnY2=rBDO_EmQ=U=Tg9kY(bPK=ZT2GFF7YPiRK9W+mHrw*At`PhQs`V zv(&hTe~eKK@Vy6x<|J50I4@A?GXN+KcGG1$En0KyDIgZ=F1*W)@)|2%z!QXUoI||0 zAs2ydta{10`QQs7rpJs$<&;&;1)m8hS0p`5 zt_gR11d0J7ghSCB09VEWE0U9)W#h?jC7_zMw%p6d_z5NTLH)DORvVNIRk1*}>NPHc zRRn6S#kL|_VNs>tY;Pw1JdSF!wwm#!>2~5hTF``Ln;>f;OUVpw%5HaZrY(20L@HWt z;1;G9Y^`fgYthqL6l zl8(A=!@VJQOB#aOBHs*zKfA})_J~au$1lo{<9Nve|HYUO=cwZWsFVM(5d}Lo;{B`N z>+B7QddS{GbTXKVO+4gOp|<+xI{FC5!tJ04wM76?hbZW_w8wAe2CBm5mwu(5YY1x6 zJ3&BUgC*b+gF4QMZSZh*)`YSEAcS;c08udEQiRnIYM#zClnin+e~L*L%^zyI9SbHt zCKMH4nLu+(nmZSuNzK~?E>NnBd7u&Ymkxe2SX$c*J_R=!((bWeD;cO+5cpM=9JxF~ zc|kWM{XK@oKT^$&7K_^@==YpSV4?`E1&8Ou2bH8lM73!lPEr-c*vbtWss6@6ifeN* z1z>SQ(CW|kipRA4)alhLs~IxxJ|My9+Vb`3MTku$7wmqC^oA zC;+ac#%~jB<%ZefP&UuhM=j)1K+l?m<8+kt_H;s#+>Pn5m5BvV98YO* zFZr0a4~zvP(BLl&9^&CA|KY$-6i%&3l!7kyo7!gj_ANG7i+Tt}=vD=s-U*>h5KC1K zMvvoZ*m8Y9EL%M|78l0`ZDA!vrT*yoq%4})QbosRTF@paSq!-&2K?qYAP*3t!hFFD zTyTxWIey<9>73ajC}k@SMNkYmeVk#L93CF>D*AAr<=^tPpA6#tT<4!32zmQSSNUDD zM8SNXI!K$H#^42zJ0hf^+f{R!Q{UIVjqBYQNLV@g)xWml5-qMV==Y1elUd=ic-=?N zFPtBUir6Kts4W>l`H5U)eNgN-KbVesLDp*G+qzXc`en3I!ueWyY!tXecU&EkHkxp& zTL=~lUwj`vt0g~=46IK$u22RR*#pb@CI;i56W25E8r~cT&6;^K5c(@|>iczwXhslc zeL61IXJojqRho4}oVaqk?qf&jd|>ZSv=M=ZDYOQ2oR3vyTg8iKF}~cl77PCNK5V6{ z0gu7|9rq7k_-(YxJjsg}XIVJP#^DG>u;di&{3Z8fN+P>(%s>obnxOR<#`eSDfOQas zJwmb$mkD&HE*lV`Miv=e8x+dc6YJCBV*R!VU#=bKafNjFW5SoCLW+i4gQuZOn@A58 zy<%>rZ4?zl#%RVOfLwqy_ykFlw}WM2D3a~Nia4MnCoHwsjC(tgSdYLN5t^J#QD^e-;HU`(kuZ_CJ6;&TAH2Z@@>_8C;*C zl7B^ff(z>qepzAFkq)HSSE-hKqE-AbKT@u(2#!i~V%;);=!rNRi#;efqL91mo zj8d=1k#w;613( zjKE2WiHO{g46J&#{4PYPaynegZPpHDTU3Z`hU+#~XpyMrHFFWH;ij>8=d)MSvH_$& z$XwNW7f~r|)!T9E5GaO$lQ1a78y~%0B?M$hPR@(JsG{~PXVN0rMjK-hRG-Emzgkd= z_<(px$F4^8!}#!HvBkwEqjh?1elZtHD?|ifue0Ub5SY!#dVLm(u|7O3C+@Z5kD$j+ zXzj)x($f#>Q0TC8;n{{BG^jgVF}^}{Ib9fd%!XXIQq@&6$+dKY+RVRwr`_qgyagpr zbVEV0K((f4d1wfKGT&sAkTkeW2-YuxH2{}KxW~?E$t9KQcCkQlt*#C)>yP97*skN8 zVaG8nTiaj^KA0PCIN0wNIl`Jhj0RFM$HjX83a6T{Qusvpc~|vGDR5?LEBRbtY?R#X*mueLK^(MKp7fiQF4-t zWxf)U0*$&|p_-Y*Lt;1^4>X=^FXk@e&KtgK)nN6@>Rqia`>Uk|TMf91aR1}((fnkV z2BH7okMluGUtoXCG3BcjPR5bo{Rn=<%!IUu9YL zQ*rIp;lqqwM42Lq61k$R)qBAW3ZjOq;!5&ii-R+X&7YO$#wD{B%PPD69gi&hOmx$6 z#Nk<(;H4ETu!(6o$vOniZrCn|&(JrP9XIsCF4rbPSf`qmzQT}^lB^x^I62%Xq4-(G zZr1d)^pgLn78-`)8`Yn+A;FMHRy#{H!RPDxEDJV`HRL9%68W;|>tZMhJN*2Jp zc*_Q>ca_TxO8s-OS~blq+-nZ2;S*+B1kJj$-XB_^Dr=8CBSN8d4g&#qZx;qJaIIfU3RD%N#u$etxoTlx!lyP*WO?B^Xq*e(%M_MXUvVjv3DLm zRzW|l*zxAepW>JPB-cq!CSzE2+lrE2)q}9VqEpSX%A_)0o&J{c{yF96bd%D>#>}Ac zT)hiTQ77>j`q7WBmNg>^?K{Lb*-N5UwyFrY`zlP+*C{u94Z=Ba`gg!O2wAr@2wO z*H`?(R8+`lY2G!NJziF=2)YQ^3^C4+ru=F;Z!)pzg<#OYO27Zb2uASkLhk(g)`in$ z4cr`qfsmlECkJX@zxb7Y=c(mnm_<3d#0{5f!Nwr63UD3VT3Echc>S;@E8Ap;-`5u= zvBYL00l;JjyY`{7H5u|_$60R={!`T7{-3+e^~uWh;XySZ%V!~^zD5^X(+W;t17jxu z4Dr$~n;C^Zr3Z1ZTdw0=ovU@{bNnp+Iq6~0XdVmvww$a*AHN9&`m$Pf{@`xB-;BXs z!g-cTvkyyUv?=&OP~z&%A|Gk%ljO^Zp<{Z|q1R4QJNdw9K31*Cf-peirt6HXKN-IF zX+dB?ITDw|9-KY_5J=p-6 zR(SalDDAK~DKrrJ!kmelD*n8DvX!ZIja+-9`SZX5qX)IRrQ`430e8rc&o1A^MB)jr&|_6K1DUS0qHTqIHgcyPRk+_RY6FmI*`x7;7}v zrYDLBfR$W$EZ|#%rc6(Qv(A=V^TJF|d5NNz#y~ops6!@PW*SS|Z+V5jSx%;!5l?=5 z-SXijaWkBU-`SUp)3HE3L%J3T<$@Z=&_sU|r|!kVz{OpM|9nTeAPz$g`+nDO_#sYC zy3#4TRpQ<2FRGQl;=UA=552>m)oWY5tYnudiBrwLR&XCcmn0o_cr!B8%!?MXnft-I z?xiQeb^o`h@Rb+ai)&X$)S9kT&|#q+#mCCdR{eVU<*ZN`U*pAC;6t8WLG9Ya6o$E( z8*R^c7Vv>11#XLdISUj2ZP8j;__oJ>BzD9l5-e0$c`nQ$fDzMWe=}JGDF3EA_R@Fz z+cV+-GnSl6o(f$F9+>3^4%kIl?WLMVGwjqLKM-P1p-w}sobX=P+{ucTB94|%(_auV z#9cPh4t@-)W6T(9d%r&8E*bLhK$pFLpH5e%Z@Zs#rou)`lk(RV8~af21CU}4!i8>> z-M@`e7lH@I2Lu-KBK#Hxwib0>sX53+PsPQui^zs9<$_@q)0O0cs`1Kl-vT|Q)sae8 zLGV;?A^KhC8g}pE*t46R6;@u$uYT4#uBSN}Q{AG&k_?>RF7j3#hy@%4-^Eog z_a@f@pi3zi*)D>jN*fO_e{atg=VFD4<4an6nkxtCT6^r#7oV~CBt2r1x6qHi|qKUSXftUvGJ5&0SvbrELawyE20S2EI$p<;6iL-ts`)}AZrVZ zGQaRbLs_U#J}KECMbWA6M$@*b@}CdX2Cm<&`MBIFB2LUg>$|mE*MlZ2vSM=u&EVzE z{F8aM-fQ#uWr9|n$<_{mBSzdDn_*)CR)*r)ijAP~e-T0~8xYA9Y#q z5yEe}fA94s5v|_qZu^)bSrv!XS$4DUAL7m@Lw+kMUUh5p-|JK^p6+s3shBdhvkx3e z#vA_Uu!q6VPcBNr%VoN~vVj9R`Xm0!XzVzKGN1~Mj}fnC`aQnqcXw5xFQ6$wtN;3Y z^hdzY?3Dh1-`QGr<2MUd^%pvQy*E0uBP~znefJi7E{IfW+S$iA^!d;))Y0N<{kZ`N zPAt|{LzYA9Q8HUI!J|s#%a4GA4d-?pXA=E;x5WE#Cf|3Z@A|8Uey>EB6Ei<=%~~YA zVoQvvhCpbarw$ISgh|R(|l(3O~!p2 ztx9|MUWxo;xz`H3YWir(Hue+uQ>@E+ef;Za?%ZgV1=Vm``XN1zUp@`sd-1#gYqIQg z#TBeepKphOR-a@XZY0&OEurgFii2;PMwz2;)zX?qmz^&wzpFQ>W=R}Uj3;~ehk1>S z-I}cSx!S-`DO-KJfhI5CxH#{774dnnDg4#OKP(Pia5Q!@zM|;bC+YWibyMZ)n{D3c zj||nizaQvob$@3(xC^+8hrDV=nH~joh7O>8@I+vjL-0gYlzxm+^2G;W|3%6?OL$2Cp< zbgWgEqi^UZ%FJvJ3rn6IPI-tYI!yHV(F-ET-}QHhOGPK^=i`thPTS;F4@9wtM27wW zln`3JIfycvwS@uscs8T3f0m&gpNFn{eTLPhcD5cpq-WBUL*p%(RktPtyR6IlZhiMO z8aDzzCmiQO%PDA+1K0sadC1n<%I`pIs4Mto4^xRbg}E1e}DUJvVFbPI~3qbzfaElod7qH{AO)AwJH?Vt@y}& z`xge_#LXaEGE4FvE(xdh&Tu+XEJWo`$wK&qTr{a1cdKQ8&ePp>c44NS?3|}b=WuHI zPKCE*3eojal0tTfmtyc?ff&w=egeR{hDf4ZtH45B1m!eUur0{eJ(EpICA=pw_Gf9> z$dnQa+Vw`NXIs@?0AmySSH^ZZF|c}S-(-9#_|b7MN0ZwT*+R$+HOVbk6^zO0<-b{9 zvm0VqgnW*dD29`PpkzfOiNdJxOs{CakNfYQxVXcqC-CDgJ%734*{J77$o5qy^5S_4 zCToLV^gAN0sHEUb1jUQi^3+HEtH44_gkM9vQ}On9wKJt5nEhd30ePPG*)pJ2!s7nX#HAOKtnog#wkyD9N`B|gkx#Pn*46Kt?Z-M`!%j87bi{20h*wt`GFPA8xYKC$ znq{DW{2m|hDDPI(=(7U7Xh8iCq8f$h#l(QkNmxYNg$s;duACr&b|IGbt*PcXyxoUP! zZ>oBB?&svq$|GTR*ITjDPXlRbodt)E7pT^P)ys1^{!{&-WrZF{9JS^CZd5|a)a4;R z3-=g4`i$d(>|puX)Q9l)lJ#+&4xQucq1`f4woO>02YNr-za;9}xB9%R{LwD-Kp<>8 z+EexLyYZTl<3CUnyx^6{k6Mf{f+{30Zh@boXMv(TFB}uRu~Qtci9gR$Um7buq*_H- zSKNsQ9c1z!R2@3ViqcDr6{^vlZH?~`ZeE^iYhE7j56Ysopqe8=9<&qdp3Fx#7%}|z zAJ>^OyAK{D#u8uHro@70o9v}7;U4>q-SC(5wc|~O3wFZ|c@g9c@3ZASH7h5=6E~xh zow}Jrr~n>5hL!{J_6;#iiVTk!?gnqS8I^BeGV`10`G?`c<0I$>@4LjJaC z+0w~Y$~QxL(bgvGl>oEk1RO#54*!^epZ_RJvA@;eY;t>t^qThQ zy(44=CoUp z`FAlo?t%7D>JO8}*;ECdf(JUYtv}z(Uv&r>Jt{pA@~N%3R!|xYolzD7w1YT{p`~gY+r==?{$xFI0ybU-5&196gV_6_#$ed$oq zlHnvrxuuT^@`0~c@9T}8;<37C^@q{6%Nniw{(dj|J@nh8(2{oxww|d2?y&f7wL;dqdeITsls* zq|-fHFgK|6QTX-MzfBvozu`OUwr@!M9an4~8h;)wy8L!dNV4cAOk8$*q6#Tm$d(HMUuyg{#XH~`9D%lk-7FS{gp7wOQ{~-`HE4p z9o}6KRbm}h=%vO@zmJ~05V9LdUxL~I5qN4ZN^Q5cbKqUWcS=C1{7ScrqPw%{bJKT0 z%%k21fSSSQi7iD?E8|k=sImz2njxs3g{o6Xhd;k-Fpbn89z<%>P%N&;P2#x8>k72t z11SVL{NrNCG}lY&lRKtC%#vr$NYMLj!&zF}Z+Et(Dd->qPl{QF#$R{k{^K zv@yg9zD(2%8R44)*=x(EqMZTo5m8=66L0_H$#0R4plHTX3_!A0>R+)~v$M;lCY{Ff zd2C1dvnkbGDoTT>h)k{=4O%SKq*@PKoWWMR;jBjsqskgg)7AD>`=CNA{85RnU**51YWEgG@zjYQ$h zIUlBD$;3@eDQYn{p%C)i&x@Bk!znlm!Y=5ZUieRzA;^!4&910&E~6;Y)CYJu?bi?u ziWAz=^5F>GTri;ed5+M+f!1TkMbaSs*GS6eMl^X)p0(ueu9#jx09B}_{HTyK9ShwM zMJWe5gM_HH6l!~D+i5#ma^vVd#>dPU{7~9?UV;|2g@>G017q-&soGpzJKQ<{F97nC zi@p%^N(QM%KcPfz!J^H<2_85s8ke{m>gL2IbLu!Z%#rBbN<4+u&mx@@c0)uAz>m~R zzu-bA9Tx-tqW3`XMyT?IGngA*j~YQk1=`RO2L~n4aLWVNM&TULHYU20Xj{998!m-3 zD3I}Y9MThkGZ>TM2viP&E*;#cj+mSXHEJbeI0_>^LN|pAk3K;jY_?zF+_^%PJdgN1 zcB+{nUeq{;4(Ik-VYIbfw3VPB1;v=Fe2r-;EO6aZrH3=QdEuO(R1VL3U?^oNsf`<*fZ$gD$5a(G z7lMBkOvcZ?mz#<^eDE_KjDIRBY!eTFkEOue^M`F^I1-J$A5@BFsOh|foMbnaI=mIW zj-C+^b_3OCrQ68NkDYr|dKWS;#iHJW3O>0#s#U;I%6QqkfNOYH&vqLqp(7y~<8e*( z+s9qtcKZwx(}sp;lwr+AIoWC)P1ak8`TD+9{MaaOn;Kh?DG_h=ycu06|CcNpuj^4i<@nwQU#fbdTTDkpL074_?EG!(7b7u5*3&8p_z2vs*k0Mi zVw=xWf)=Z<&X#+Kf}c^Bqs+Odk(KUBMH21|Sh z2;3B&^sj#LTEIiKC%W-898_aib|IdYWUlEPjCN1=F)xX95Ik53^OhPIunNYOXmLe;y znObv=sk{4YlygIRn4N$^WTAne~R;&sVeQ2_HA!e$ORH7uatm7oa zKrgJFzb{|S$3eQXlvtWzvmg!aQ*Z;GH@q6!?$LS;JYiZKx7WN0i!Td^w?9jJ@cE0XL2bq&UI`o?Ty zplnV~yA`U?n)a>BCqgnsn$6z8$&gsZy9YJF%OkYn2Lf$+GJjLr(`=pu_FUN^o_@nu zdgb#K&Nf}}-|lyI`-y=WRBRX$>nwVi7k(oI6r+;GZR_8$WSIz!aWhzhSk$FS6hfur zt-mjF_}rXI(&M`>A9f(_j~`RaNBt!gLY?3Dl%j^`MU}OnrrQ^EnPjei*y|CAi%7P+ zbh*!30&No}*W^_BQ56-9saY)FbmXstm29Q7A^RoRdp=MdtQL7`rVR&;7M+nymA^=dhl)pD$Szcitc zfDEC?tVdN2u&>_=y9mONR)*Y!)lp$mg~O$u`8+Pz;284Z0+cZBt`XL^iyw9oCTYY) zIAcL$wb!zu?PmfoxiWd#zl`%v&h^GueEO`v|LO-D=r`)%d;^d%Lm4pvuaH|%t##;INx`@cK^_>4EY>m-9T zNi3AsQZ$W$u)Z$T|0D4A)?uOzf;4p}4dAi0s$5MBt=IJC76pjtkYHZ5t>jn2W)u&& z;2(=Y!;^Y7*GPGTB5K16e|N}UsTxJY6&hZqV=hMPq{VJ5Y=%Ktyh;{d$xS!x>fDAV z^Rwhv3v+)L-z;(i?d943r}%d~r4fQpd(I1sZ}DjVtIXvA>meV|8v!O~;N)*;Xc=C) z?7k>b$SDyDqMr?-S7LsTmzQMZKWO*$w~iK)9onWK1YSn(2RLEPVn42*uPncGqxnU6 z2&1ym)n(D?|3;=9c$Rhot{65Xx)^0RY|m#~4JQjR<(z3f3Opo5X0K~O;fJO%Lg5Tm z&_t5c>aJD2BnP$yyo9Zp+j0+0S<;qnd8lO+Nr6GghgQAos3Fd{>I3EaDLqL)eg7`J z?;VWa%Nc03dMvM5tKy^}e8tFiM@)$tKHjbHgDuHg^?V~_-k_GNt0^^*p(^g-#5?Vn z?s&cQwFsaP9w-K$jY#IE*W{QSJ~|j60PZhxVQMZv9t6gsJ&HX4O@LnWEE=lX*lQ7D z(>JYD{HDuA-5~~w**Lx|p0$TVa84tw`i*KAM+$^B=REeGiP1~@nXH6daH5QA&0QL- zZ@FD{LBw%Sn=IP!-GZutiq-n!_wGwA8g}0DG?_M^P?eQmV6LQ>7Fu?Lju!!oz{$*6 zh1DFbY4Q2Fkn0t$E##tH*UC;v(VxW!Yok;KKjw5fZGT|nC;cK9CCy)9rEZGl8&)64 zMVnw~wgR;lkrfTWCY#HFPKkLewUm)oh@C=di*6zs(q&91W-gFZ-wWaUyFmrE5v+5jXHhGdRx!oGWEKxDgx?y z-2p@9)&E_{3#}SHryqQfb*&|)aVfci9j@td$vrTvrj$W|Ix@NP z{$Xx%fDu{cOlwEsnf!rSVg{hZEG>jj#*?Sd{*)=auhsm23+yv_b-AULbYE-a&v?r` zC6>XCXQKD@R##8FD_2f(MAhWjEmyZ#+6G?aL788+gKT@nz>)PZfJ_0TyGFZ!y`!Um zwKO2jG&VCMlP%-p>9e!+FMoTK6UnY>Wa-*JCuETMd#Jek3hhnr;hO5uu)rHZ?tXs% zUpr_2&-B{B@k)psbvj9&OLZq3CxnVkcO_-WQJc-el;`EyDi7O;a+iZtQ%qL9LX50w z*5+ZUvowa2r(!tKS!?sK+JsHE`@8$T`y1|G{QiA?AFk{5x?Z2p^}XKjd*|O=8N4z$ z$P$Z5426(8cqtAJR=T6=-j~rL2Za5&3*cBm3?RY(SHHHIx#P<0{?Oyi4vPl#Kq-**P*Y z@?9B?auH5W4h$S__Kk_-DU;_S1ryl+(u>0OSO(%|FleN8dKt86xzP&D4a7B1(Jzpc zFan*^;MTGItJfyHwRp@gh;B|!a_#a4CRoa}^OW)k(xJ$HLJPijIfjX7Q^clH=WIde5XMxn)0{GxuTI`sM8$~YS|vLW zEfY#P>$9yI7fWVv1GH|H=Wg(0GcBMg1A4&GWlsz@+^E~f9X)Fe%Bw4kCXE`+Euk*D zrS~)+C)(_3$jpwoMpEVGL+Pq>l_6&suWY&S^fcf-@}wm{qN#t~Bs^^`BDRiDr@ zzpsu1K;0h9%qff_!d$;S<5XR2E5|31mrMDcQ%^2nN;xj2azlM}ZwtX%*q0gH86HFW zWZQNom7O?xnfY*76K>6EuMcKLv|jdGjgnD7eb{ip+V-=0AAfi*kN2}KDi{T zxqbZGu06NhjB1LnS(#0*Lb#V{!t;8>B_@!vZ^Fz2%_#b%ftP zwJB9VcDZt_%HNaeb|qbBnK)@)_inB#_5D5 zyz$yC?lWruHd~k#;b8%Mj7#_dHCn6}IE{wX53)z4 zjaD=wP2b}wG^ldqekJFwXa9{ZxC4@BXSWJ;O|;1yJ0bV?ZLj~BOzB}vyZ3jc_r*6i zk+4nSWgG!aT-3Y#2oaT@VgF#skZu;^PkHc3TJm`G=<`#58^GP;hitC)J{PfaH(^d- z-#UqA_J|D-D0*j;ZzKBrl=I+hsmdRpLt0SG&3Yv%XJ+c>3;+bd)YGXTYgf|otsaVD z=uV#}JM8xFOf@uUoFXg?t+DWnNlh_8^)Js%vfT|N9oxeatctCdOY8&l8q(YE{Ug~> zFU70)$YDKNU9xf}h zpZe%jtC>)IM(IAJm`bN(Pzy1#V(u|TWvubz@nk#nX2cZk&0um@vsg~-$j}?e)DyJFmhdTM~6x6 zz?b0-NG+friOm)(+vyESZ*)O8SD%yN;tPQu(ImBvQU}ps_V5c{qRyu?6sB&(fW7WR z{t<2HkvnTOy=vI4FtUwTfLjB?YlTK7>P8?gM&lH37qzJgMhk=2q2~SM>R>k*%B$Bd7$)9k}GVz?&>emSI+Edyz|d*eLQTogWlnvD6z z#&5={zx80ja{f~JyCV+&laL?;8SJPRwhM==D_%o5mh+-d$JTbeiZm%hd>Tv)z@Uho zkTEC5{N4N4hy?^E2n5pV9>HYgy*G0$_J;%mRu&v+6)wB*>!=?+&* zoll2hdnn}J_y*$R9s00z{KPq4P4mD=)KQ3iBO4j@jfRvcEDVTOgjlm^iEs-2j7`t8 zRjWpMlpms;&Bz++w}1vM3~Oiy3d)!8%E!k$XfI@nQmjM_6BJSh{41~aR=|Kk1XM8N zkTH3i$-GaAabr5fZcx~4vL9LD5e#p|!v!g%pe81(+6~yLBWZ)AEm4b;&GUbOyoR>% zWr>c#OHXvP5us3S7*;r1yxqKZ;JG&OKPGOY+4W%*~#T~vkTYOq43G(f1K)ax-M z!e>^uv$JLyf+7`v$s93??OkLP^jBuAI(})@&^G7>IE3(XR}zW+yrCQ3rMd8DB#U{x zrx1;z>qM2PL4p*ORc4lR?uN`aLBd2*y7K6R{G}$4UvKZ^c*;KTCEE1_=mKgS-=$KQ z#cyeI4xZDkU!8el%muo?-h0g21o*p0wLpsV%`Xp2tWbn*)7Q5sjhLUryx!nA9&AlCgFdo1l%wJ$;0knlhI~`mW@0K;r zmuLmG4cD3?TNA8)4Xu&|85tO1aO-H^S)`?IT6M%wB473ffqNmNqgpbv^(Fgu_s}h9 z2miQ5seC73opkI@lQ}WQz=HhoM2b*ADZ*L|MK*q?I^ETHmrOul9xJ6oqs^Q&wA$s; zb@Z)ST$9YEV?~3x;sRX}qOMqBSJb#Ge&7{J@`@>XMVI}5c7`+NqkqG;6V9EYez6lt r3sU1;x(@%yY5@IY9b11#*Q{?V(2l?Eu=JLM*;D^B_ literal 0 HcmV?d00001 From d0484e8c021badadd4087432d491aa51badfdc95 Mon Sep 17 00:00:00 2001 From: Charis <26616127+charislam@users.noreply.github.com> Date: Tue, 30 Sep 2025 07:54:07 -0400 Subject: [PATCH 2/9] fix: prepare docs for typedoc update (#39084) We're dropping some information from newer versions of Typedoc spec (compared to older ones). Fixed this. --- apps/docs/features/docs/Reference.typeSpec.ts | 34 ++- .../Reference.typeSpec.test.ts.snap | 254 +++++++++++++++++- 2 files changed, 273 insertions(+), 15 deletions(-) diff --git a/apps/docs/features/docs/Reference.typeSpec.ts b/apps/docs/features/docs/Reference.typeSpec.ts index c076ff43ca227..98298bcf2b93a 100644 --- a/apps/docs/features/docs/Reference.typeSpec.ts +++ b/apps/docs/features/docs/Reference.typeSpec.ts @@ -156,6 +156,15 @@ export interface CustomTypePropertyType { type: TypeDetails | undefined } +// The meaning of kind flags from `typedoc`: +// https://github.com/TypeStrong/typedoc/blob/2953b0148253589448176881a7acb46090f941bd/src/lib/output/themes/default/assets/typedoc/Application.ts#L36 +const KIND_MODULE = 2 +const KIND_CLASS = 128 +const KIND_INTERFACE = 256 +const KIND_CONSTRUCTOR = 512 +const KIND_METHOD = 2048 +const KIND_TYPE_LITERAL = 65536 + /** * * New versions of `typedoc` added the variant property, so this is a quick and @@ -205,7 +214,7 @@ function normalizeComment(original: TypedocComment | Comment | undefined): Comme return original } - let comment: Comment = {} + const comment: Comment = {} if ('summary' in original) { comment.shortText = original.summary.map((part) => part.text).join('') @@ -218,13 +227,6 @@ function normalizeComment(original: TypedocComment | Comment | undefined): Comme return comment } -// The meaning of kind flags from `typedoc`: -// https://github.com/TypeStrong/typedoc/blob/2953b0148253589448176881a7acb46090f941bd/src/lib/output/themes/default/assets/typedoc/Application.ts#L36 -const KIND_CLASS = 128 -const KIND_CONSTRUCTOR = 512 -const KIND_METHOD = 2048 -const KIND_TYPE_LITERAL = 65536 - export function parseTypeSpec() { const modules = (typeSpec.children ?? []).map(parseMod) return modules as Array @@ -294,7 +296,7 @@ function parseModInternal( node.children?.forEach((child: any) => parseModInternal(child, map, updatedPath, res)) return case 'declaration': - if (node.kind === KIND_CLASS) { + if (node.kind === KIND_CLASS || node.kind === KIND_MODULE) { updatedPath = [...currentPath, node.name] node.children?.forEach((child: any) => parseModInternal(child, map, updatedPath, res)) } else if (node.kind === KIND_CONSTRUCTOR) { @@ -540,6 +542,8 @@ function parseReferenceType(type: any, map: Map) { if (maybeType) { return maybeType + } else if (isNewTypedoc(referenced) && referenced.kind === KIND_INTERFACE) { + return parseInterface(referenced, map) } else if (isNewTypedoc(referenced) && referenced.kind === KIND_CLASS) { // Class is too complicated to display here, just return its name return { @@ -673,7 +677,9 @@ function parseTypeLiteral(type: any, map: Map): TypeDetails | undef const name = nameOrAnonymous(type) if ('children' in type.declaration) { - const properties = type.declaration.children.map((child: any) => parseTypeInternals(child, map)) + const properties = type.declaration.children + .map((child: any) => parseTypeInternals(child, map)) + .filter(Boolean) return { name, type: 'object', @@ -725,7 +731,9 @@ function parseTypeOperatorType(type: any, map: Map) { } function parseInterface(type: any, map: Map): CustomObjectType { - const properties = (type.children ?? []).map((child) => parseTypeInternals(child, map)) + const properties = (type.children ?? []) + .map((child) => parseTypeInternals(child, map)) + .filter(Boolean) return { type: 'object', @@ -766,6 +774,10 @@ function parseTypeInternals(elem: any, map: Map) { function parseInternalProperty(elem: any, map: Map) { const name = nameOrAnonymous(elem) + if (!elem.type) { + return undefined + } + const type = parseType(elem.type, map) const res = { diff --git a/apps/docs/features/docs/__snapshots__/Reference.typeSpec.test.ts.snap b/apps/docs/features/docs/__snapshots__/Reference.typeSpec.test.ts.snap index 534f8f547c727..0eeee322f79b3 100644 --- a/apps/docs/features/docs/__snapshots__/Reference.typeSpec.test.ts.snap +++ b/apps/docs/features/docs/__snapshots__/Reference.typeSpec.test.ts.snap @@ -29616,8 +29616,9 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "transport", "type": { - "type": "nameOnly", - "name": "WebSocketLikeConstructor" + "type": "object", + "name": "WebSocketLikeConstructor", + "properties": [] }, "isOptional": true }, @@ -30241,8 +30242,253 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` ], "ret": { "type": { - "type": "nameOnly", - "name": "WebSocketLike" + "type": "object", + "name": "WebSocketLike", + "properties": [ + { + "name": "binaryType", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "bufferedAmount", + "type": { + "type": "intrinsic", + "name": "number" + }, + "isOptional": true + }, + { + "name": "CLOSED", + "type": { + "type": "intrinsic", + "name": "number" + } + }, + { + "name": "CLOSING", + "type": { + "type": "intrinsic", + "name": "number" + } + }, + { + "name": "CONNECTING", + "type": { + "type": "intrinsic", + "name": "number" + } + }, + { + "name": "dispatchEvent", + "type": { + "type": "function", + "params": [ + { + "name": "event", + "type": { + "type": "nameOnly", + "name": "Event" + } + } + ], + "ret": { + "type": { + "type": "intrinsic", + "name": "boolean" + } + } + }, + "isOptional": true + }, + { + "name": "extensions", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "onclose", + "type": { + "type": "union", + "subTypes": [ + { + "type": "literal", + "value": null + }, + { + "type": "function", + "params": [ + { + "name": "this", + "type": { + "type": "intrinsic", + "name": "any" + } + }, + { + "name": "ev", + "type": { + "type": "nameOnly", + "name": "CloseEvent" + } + } + ], + "ret": { + "type": { + "type": "intrinsic", + "name": "any" + } + } + } + ] + } + }, + { + "name": "onerror", + "type": { + "type": "union", + "subTypes": [ + { + "type": "literal", + "value": null + }, + { + "type": "function", + "params": [ + { + "name": "this", + "type": { + "type": "intrinsic", + "name": "any" + } + }, + { + "name": "ev", + "type": { + "type": "nameOnly", + "name": "Event" + } + } + ], + "ret": { + "type": { + "type": "intrinsic", + "name": "any" + } + } + } + ] + } + }, + { + "name": "onmessage", + "type": { + "type": "union", + "subTypes": [ + { + "type": "literal", + "value": null + }, + { + "type": "function", + "params": [ + { + "name": "this", + "type": { + "type": "intrinsic", + "name": "any" + } + }, + { + "name": "ev", + "type": { + "type": "nameOnly", + "name": "MessageEvent" + } + } + ], + "ret": { + "type": { + "type": "intrinsic", + "name": "any" + } + } + } + ] + } + }, + { + "name": "onopen", + "type": { + "type": "union", + "subTypes": [ + { + "type": "literal", + "value": null + }, + { + "type": "function", + "params": [ + { + "name": "this", + "type": { + "type": "intrinsic", + "name": "any" + } + }, + { + "name": "ev", + "type": { + "type": "nameOnly", + "name": "Event" + } + } + ], + "ret": { + "type": { + "type": "intrinsic", + "name": "any" + } + } + } + ] + } + }, + { + "name": "OPEN", + "type": { + "type": "intrinsic", + "name": "number" + } + }, + { + "name": "protocol", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "readyState", + "type": { + "type": "intrinsic", + "name": "number" + } + }, + { + "name": "url", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } } }, From 2bd6be9370b87ec3a4f9bfd067d446c46987c6a4 Mon Sep 17 00:00:00 2001 From: Chris Chinchilla Date: Tue, 30 Sep 2025 14:14:03 +0200 Subject: [PATCH 3/9] docs: Fix order of feature flags (#39114) * Fix order of feature flags * Update apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts Co-authored-by: Charis <26616127+charislam@users.noreply.github.com> --------- Co-authored-by: Charis <26616127+charislam@users.noreply.github.com> --- .../Navigation/NavigationMenu/NavigationMenu.constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index 74a142f1bd7a7..f07e11812c6db 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -41,13 +41,13 @@ const { 'docs:compliance', 'docs:contribution', 'docs:fdw', - 'docs:self-hosting', 'docs:framework_quickstarts', 'docs:full_platform', 'docs:local_development', 'docs:mobile_tutorials', 'docs:pgtap', 'docs:production_checklist', + 'docs:self-hosting', 'docs:web_apps', 'integrations:partners', 'sdk:csharp', From c04eec64684f9321409434e6094a4e36db141f4c Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Tue, 30 Sep 2025 20:14:25 +0800 Subject: [PATCH 4/9] Add region code to region selection in project and replica creation (#39071) * Add region code to region selection in project and replica creation * Tiny --- .../ProjectCreation/RegionSelector.tsx | 17 +++++++++++------ .../DeployNewReplicaPanel.tsx | 5 ++++- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/apps/studio/components/interfaces/ProjectCreation/RegionSelector.tsx b/apps/studio/components/interfaces/ProjectCreation/RegionSelector.tsx index 7e4eaeedc4dde..9dbc26c80f05a 100644 --- a/apps/studio/components/interfaces/ProjectCreation/RegionSelector.tsx +++ b/apps/studio/components/interfaces/ProjectCreation/RegionSelector.tsx @@ -148,23 +148,28 @@ export const RegionSelector = ({ value={value.name} className="w-full [&>:nth-child(2)]:w-full" > -
+
region icon - {value.name} +
+ {value.name} + + {value.code} + +
-
- {recommendedSpecificRegions.has(value.code) && ( + {recommendedSpecificRegions.has(value.code) && ( +
Recommended - )} -
+
+ )}
) diff --git a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/DeployNewReplicaPanel.tsx b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/DeployNewReplicaPanel.tsx index d43bd7b0c20dd..e6f55fac5b269 100644 --- a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/DeployNewReplicaPanel.tsx +++ b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/DeployNewReplicaPanel.tsx @@ -447,7 +447,10 @@ const DeployNewReplicaPanel = ({ /> )} > - {region.name} +

+ {region.name} + {region.region} +

))} From 15fe10affaf18482f4ec8d24d96e580f50a9fa83 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Tue, 30 Sep 2025 20:23:47 +0800 Subject: [PATCH 5/9] Flatten table editor grid context menu copy action (#39116) --- .../grid/components/menu/RowContextMenu.tsx | 33 ++++++++----------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/apps/studio/components/grid/components/menu/RowContextMenu.tsx b/apps/studio/components/grid/components/menu/RowContextMenu.tsx index d336e2002d9d2..1e90055e4e2ac 100644 --- a/apps/studio/components/grid/components/menu/RowContextMenu.tsx +++ b/apps/studio/components/grid/components/menu/RowContextMenu.tsx @@ -1,12 +1,12 @@ -import { ChevronRight, Clipboard, Edit, Trash } from 'lucide-react' +import { Clipboard, Edit, Trash } from 'lucide-react' import { useCallback } from 'react' -import { Item, ItemParams, Menu, Separator, Submenu } from 'react-contexify' +import { Item, ItemParams, Menu } from 'react-contexify' import { toast } from 'sonner' import type { SupaRow } from 'components/grid/types' import { useTableEditorStateSnapshot } from 'state/table-editor' import { useTableEditorTableStateSnapshot } from 'state/table-editor-table' -import { copyToClipboard } from 'ui' +import { copyToClipboard, DialogSectionSeparator } from 'ui' import { ROW_CONTEXT_MENU_ID } from '.' import { formatClipboardValue } from '../../utils/common' @@ -67,27 +67,20 @@ const RowContextMenu = ({ rows }: RowContextMenuProps) => { return ( - - - Copy -
- } - arrow={} - > - - Copy cell - - - Copy row - - + + + Copy cell + + + + Copy row + + - +