From 38a81cbccc53f8e050bf18c6c99266cb9a0eefcb Mon Sep 17 00:00:00 2001 From: Magnus Dahl Eide Date: Mon, 8 Sep 2025 19:37:27 +0200 Subject: [PATCH 1/3] fix: Respect trailing slash config for _next/image route in worker --- .changeset/evil-rabbits-relax.md | 5 +++++ packages/cloudflare/src/cli/build/open-next/compile-init.ts | 2 ++ packages/cloudflare/src/cli/templates/init.ts | 3 +++ packages/cloudflare/src/cli/templates/worker.ts | 5 ++++- 4 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 .changeset/evil-rabbits-relax.md diff --git a/.changeset/evil-rabbits-relax.md b/.changeset/evil-rabbits-relax.md new file mode 100644 index 00000000..7eeaa752 --- /dev/null +++ b/.changeset/evil-rabbits-relax.md @@ -0,0 +1,5 @@ +--- +"@opennextjs/cloudflare": patch +--- + +fix: Respect trailing slash config for \_next/image route in worker diff --git a/packages/cloudflare/src/cli/build/open-next/compile-init.ts b/packages/cloudflare/src/cli/build/open-next/compile-init.ts index 5dc2f9fa..6ccf4ffd 100644 --- a/packages/cloudflare/src/cli/build/open-next/compile-init.ts +++ b/packages/cloudflare/src/cli/build/open-next/compile-init.ts @@ -17,6 +17,7 @@ export async function compileInit(options: BuildOptions, wranglerConfig: Unstabl const nextConfig = loadConfig(path.join(options.appBuildOutputPath, ".next")); const basePath = nextConfig.basePath ?? ""; const deploymentId = nextConfig.deploymentId ?? ""; + const trailingSlash = nextConfig.trailingSlash ?? false; await build({ entryPoints: [initPath], @@ -31,6 +32,7 @@ export async function compileInit(options: BuildOptions, wranglerConfig: Unstabl __NEXT_BASE_PATH__: JSON.stringify(basePath), __ASSETS_RUN_WORKER_FIRST__: JSON.stringify(wranglerConfig.assets?.run_worker_first ?? false), __DEPLOYMENT_ID__: JSON.stringify(deploymentId), + __TRAILING_SLASH__: JSON.stringify(trailingSlash), }, }); } diff --git a/packages/cloudflare/src/cli/templates/init.ts b/packages/cloudflare/src/cli/templates/init.ts index 49ac9fff..fc0a1d11 100644 --- a/packages/cloudflare/src/cli/templates/init.ts +++ b/packages/cloudflare/src/cli/templates/init.ts @@ -97,6 +97,7 @@ function initRuntime() { __BUILD_TIMESTAMP_MS__, __NEXT_BASE_PATH__, __ASSETS_RUN_WORKER_FIRST__, + __TRAILING_SLASH__, // The external middleware will use the convertTo function of the `edge` converter // by default it will try to fetch the request, but since we are running everything in the same worker // we need to use the request as is. @@ -155,4 +156,6 @@ declare global { var __ASSETS_RUN_WORKER_FIRST__: boolean | string[] | undefined; // Deployment ID var __DEPLOYMENT_ID__: string; + // Next trailingSlash config + var __TRAILING_SLASH__: boolean; } diff --git a/packages/cloudflare/src/cli/templates/worker.ts b/packages/cloudflare/src/cli/templates/worker.ts index 892b957f..6d2c3fdf 100644 --- a/packages/cloudflare/src/cli/templates/worker.ts +++ b/packages/cloudflare/src/cli/templates/worker.ts @@ -39,7 +39,10 @@ export default { } // Fallback for the Next default image loader. - if (url.pathname === `${globalThis.__NEXT_BASE_PATH__}/_next/image`) { + if ( + url.pathname === + `${globalThis.__NEXT_BASE_PATH__}/_next/image${globalThis.__TRAILING_SLASH__ ? "/" : ""}` + ) { const imageUrl = url.searchParams.get("url") ?? ""; return await fetchImage(env.ASSETS, imageUrl, ctx); } From 8726aaa3a1c0a8609a9967c6a934cb9e79df8c0a Mon Sep 17 00:00:00 2001 From: Magnus Dahl Eide Date: Tue, 9 Sep 2025 11:12:13 +0200 Subject: [PATCH 2/3] add e2e --- .../app/api/signal/revalidate/route.ts | 2 +- examples/playground15/app/image/page.tsx | 11 +++++++++++ examples/playground15/e2e/image.test.ts | 10 ++++++++++ .../{next.config.mjs => next.config.ts} | 5 +++-- examples/playground15/public/tomine.webp | Bin 0 -> 8634 bytes 5 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 examples/playground15/app/image/page.tsx create mode 100644 examples/playground15/e2e/image.test.ts rename examples/playground15/{next.config.mjs => next.config.ts} (81%) create mode 100644 examples/playground15/public/tomine.webp diff --git a/examples/playground15/app/api/signal/revalidate/route.ts b/examples/playground15/app/api/signal/revalidate/route.ts index 18128538..fc4de326 100644 --- a/examples/playground15/app/api/signal/revalidate/route.ts +++ b/examples/playground15/app/api/signal/revalidate/route.ts @@ -3,7 +3,7 @@ import { revalidatePath } from "next/cache"; export const dynamic = "force-dynamic"; export async function GET() { - revalidatePath("/signal"); + revalidatePath("/signal/"); return new Response("ok"); } diff --git a/examples/playground15/app/image/page.tsx b/examples/playground15/app/image/page.tsx new file mode 100644 index 00000000..7613f59c --- /dev/null +++ b/examples/playground15/app/image/page.tsx @@ -0,0 +1,11 @@ +import Image from "next/image"; + +import tomineImg from "../../public/tomine.webp"; + +export default function Page() { + return ( +
+ Picture of Tomine +
+ ); +} diff --git a/examples/playground15/e2e/image.test.ts b/examples/playground15/e2e/image.test.ts new file mode 100644 index 00000000..46ed08c2 --- /dev/null +++ b/examples/playground15/e2e/image.test.ts @@ -0,0 +1,10 @@ +import { test, expect } from "@playwright/test"; + +test.describe("next/image with trailing slash", () => { + test("next/image with trailing slash", async ({ page }) => { + await page.goto("/image"); + await expect(page.getByAltText("Picture of Tomine")).toBeVisible(); + // The trailing slash should only be there if trailingSlash is enabled in next.config.ts + expect(await page.getAttribute("img", "src")).toMatch(/^\/_next\/image\//); + }); +}); diff --git a/examples/playground15/next.config.mjs b/examples/playground15/next.config.ts similarity index 81% rename from examples/playground15/next.config.mjs rename to examples/playground15/next.config.ts index 0d2f9dfd..5a9fdb88 100644 --- a/examples/playground15/next.config.mjs +++ b/examples/playground15/next.config.ts @@ -1,9 +1,9 @@ import { initOpenNextCloudflareForDev, getDeploymentId } from "@opennextjs/cloudflare"; +import { NextConfig } from "next"; initOpenNextCloudflareForDev(); -/** @type {import('next').NextConfig} */ -const nextConfig = { +const nextConfig: NextConfig = { typescript: { ignoreBuildErrors: true }, eslint: { ignoreDuringBuilds: true }, experimental: { @@ -11,6 +11,7 @@ const nextConfig = { serverSourceMaps: true, }, deploymentId: getDeploymentId(), + trailingSlash: true, }; export default nextConfig; diff --git a/examples/playground15/public/tomine.webp b/examples/playground15/public/tomine.webp new file mode 100644 index 0000000000000000000000000000000000000000..7b994ae37ee2a7bf4437d696b9891de3606194a2 GIT binary patch literal 8634 zcmV;rAw}L&Nk&GpApihZMM6+kP&go_ApihyEdiYYDjfnH0zQ#OoJu9HEGDNl3Hjg> z31@CC-8;?nI+P>Mmnd1U`4v`Ak$C$p{S!?+p{(N-*gv+;K@TKU^KUy$L^30$Ap2Z-9F|B04>n039lMAk!N*VAg zJ>`tc5K8?4^taFB$+i`5pM~(mMGNsuY@i`l6=9+qBc2>$Z%SXtYRCX}A+Qqczj1v6 z(#ZLMyU7x86;P8E|BaNNgh{X02jm@iCsYE*I4cS>mbtEt*+34FD41SBPHP_%1i#kP zk)-d(Q>5_l%?%tWnjn=Crf5WE^^MD#G#xyxizf_lckna`V}&LNhxE=w9!h8Wb!!S9 zUMJkPtvX^095PJyu71b4ghySz$Ccmg;9Y@HM+n~d5>H{J+K>^Bi|#t`r9h~ofZD~t z!2B&9g_xO>W$F@d0uQAgwKJAGX0q#}EMqyM z4Rwm3!ZS2SD^{gI<>N6~nB)$^3=lT3Hy}*gfJ9G^ge^VbU^Ikr+JT3judb-%9au&B z*iI`;R|v@W3PtN4b1cB7;5Tkk-z$-98@2$Z){VXSrv@BYo1mwZye4faep?HU-44c) zk`0AK|F*D;@o4wv?mM2<;Va*WP{ys$N^sBl=K4%vojLV&GitKPBSYjvM)mq8*_hki zGusR2FF?~T;v=-_%H`*LG?s|X1T--<&z?h71r0)8;|3O(z}OzxU0r~Cx&xMfiY>Aj z2+*~hM0B}*o3u5CuLW-lA`WQ3!WzOw&^HT9U|9}HXqS7Mq+)cnW+o5RW{g=Zvl@Hz zkmQr#bsKKS=a#ci-0Qm%k^EeR97ZJ*FXadq+L`jY6#;aKX-FwLEV>w91I!0oBF!cD zZy9XSHdBNN=~abi@&cRQuQw0&zno+&b`FoG){v_gh(%D%`uenyr}jp2PGP7oWXYf^ zE;e;rF;HykOm0qwmwLJ*Pv4Eiz;Xr{%PJqd<|Yx&*A=cxLjKcvMc7DpIQ7j_o00YE z!zaW40rwf74o~qJ`+B!jz-<5%kKaLN4D5zG1wSBVR+(^Au%4wEN-|458O^?(gYuMV zExk52US`!te54_a8ivT51EjHqkFz#OHZoEd9Fh!|vMo!cMP>yK{t4XQJP7d3mf!Sm ziSwLyk6EtxS+ST4Kx#$vCjhgotCNVl12Z&aHCUscI6pH6tir=S{_%F3&+h?~Fw2%W;EnGmTUa5Lscz-e72)b>tteR1U6cu3BM+>WaFB2AR7dV zf_EEogdYQ~*YbFfm;*g4Z7vtUa-l`H4MToIQ|^GtboL%TqCADm50+B<3srD|*3kjZ zkOT04e5Q)81t3EDd#yi4kq0JG^MLMJm3K=Z#@N9+;(`79Z#vP9iyB<7L*Vw|d*X#e zV*EF+%*lVC4K!xou362(w=rBv_c=kf%Tc=Ky06CI8=4%|oshcGPrlo3jl$thP>%M( zZ9WO;L3;LtV|p3mhq0-6M+@yS#xIPYuBDYrbiDneX@?eyrh?E%8wZLsm)K8`ZDs@b z;Spa$Sx#08Vwuuy!R`O(a@TTOs74h{fr5S6QG{~ZI-VO2I+cdk?BgVYS!u-(Y9BEX zZ*km_ra_q2TK&*{p8Wxty!Buu{;ox9t_C;07J?@?q))S|i*_-5>pA2Z zcLE-F;{>@^mqEOk_w7F(PNk!T1>pS|h4a~j#=>5K+Q29*HJ_G9%;V!=)0wb?k&I1# zgtJwh3whgk(%L5REn1{9*1XqnP>F6$L|W*Fx07SalrXPt!n^vWpu;_N9x(PvaX~fF zR>xnG*tibP9=fqC3sz!#;v4LA)}s8mz4|?ctWo?F{oYTfk{zLco$D6}G5?m2(nn}Ou2 zZP$%JJ1C=jWnAgQ5egtJFgM*)mX4gX*?k*?7Own%wpwmvIjECv0mr!An@_FR#P^8) zyUOB>cJ|d(A6#AyVCgI>U4FSKX4HtBYyIZD;}f3sabiJWR#jGfvd`MrzH*Vgo-+7|ykCsHt)w7U``pSvHYF<|Za2pAEg@t8)zHgp z!}D<&_L0tz;*X7MfZod?Lv?g{DwCA2%SN(CTfP@=R@us%AN~2dntirg2pFacpOWN` zXN$(1n-=^mQxF_ISac%+W~GGfaST<`Z;hlPK-pIF$yrH{`l;b+r!Q9TyyaTd$W!#h z5v#rXBv+~I16M=m3mEKYgwfkeqKYIR@f8km%J@QHj)CxrRrD6U54VTTDmEAH^T5Kt zs|bMLk99oilB|&&X1kEc%y1dot8qQ-RiT4NTWnK-wicN!M*$**jlr@Q{R^|+b#nQs zlGGVipFZTw_P}2X45V<$K8fcGuXg;=p{UjBl^5Nfz+;WE!%x{Gz#G1|XKK0j$(936 zh~9A+<&jwaHX1_;U@)Gg=XK0GGwoKbAG+q(qA#XT>33#*XpN^9?uWcVx7usZ(Meua z3LNy%<3g?kD}v;mFC5}Q;GJ~IE(2aH!x2pnM#nCSqG%X2KJ4@ToH-9hXwsHL_cKsC z<|43>8VmK>PLbLKo1wI>@g(q^MkA8Dmy(9y{R=Mw|IWMW_)x zKmFO_nF!FxAKJP?k4E#tw~pcgT@JkFnEk_r?Hfo14ha4%fNn`K*aFP}&HM3vc^1d< zbv^T zqG5KY*+BkSiGF*wFR|klOYC{Q(woNWS3UrXQpj|ov#XZzQB8fF=xFTnCAZeu8S={E z-_Ji70J%V*10f^NU@sFoay;O$cA}F^*UdiR*Pic{W9L=T5g@Ad24 z9|ep+kR%A)FVglaq!>L6Di5h0ORx+nx+7Hd)K68-aPOf|OVR$8KQ4}K@7m|``k9F7 zNDmg!@V($~!1Me7txbpg;%*K{(8!k#b{oNr4Qk5ttT%x-A~#zz7l0oWgUUsmnLgR+ zf9cCmIjQ+P7BpovB5(nXBu&Xzy3RlV5eyIk$@SEF_Z;08%zkjzwHx)9AXG>TYWDTo zv6ex_KX@rfoTX-TwX2Ok{l$LK8YK|Lc4(}Fm@Hsn3W{&COgM31Hoh~! zKg>Z}w;k~Ss^Lj*s5dtHZD95ZK*mFBK9)I?A(HUHw&K@F%uhM~cKw+(=Vd_wQ*v2h zjp#1|4x&ufyo~9Cl7TKw7U!f_3??j{i2xr&yXXKJU=$_H5$G~_r+7;c6RDH^LQK;e zP~QB&JyWgI`BY3iIw|h!PqXhr3?fk(r;AK}I{-l5HJxZ@Em-#o?6uLeS7@htX3g9x zJTH|cwc}1cU%?)Dz6<~WLV*&UcMi0$1^5T9 zWH{yJ2X~P^K8Tv!SpIsoEXa2IX+mAfUwQd!r%IZf2h$Dne;5Dxx+#NkoS}bVY(c#U z9bXn!)YN(A$43M+@dg4OKks0?uneFEV&9ejM7Kc=*?DjO(LylPNSH_D4VYtnfB*n` zUUTrWkohOctvJ<|5u=#*go+sT2Am$DNtJTHD0vSG*WDw}AGOwxsMk;{Lw9MwZgp(+ zoVLy=PV9I@fi1MYN8BEC%pe)pgGZg_e9It-rjF(Rq|F{rJ7y-3>HIhB`pbx6!gT5z zXFXbRLa;{zTS4p?F*liu3juHjsM1MEVp~0$?I?XPSsn=gdH=Vun@7K7q)TE3rkeS~cl z5KAnk1k|L?T~RItM-YMjGq2X~HdO_I3|7hl0lbdl9FUQ_T$MZ@u8wn|{SS=j%V}gK zBzah_$hlRPbg+*f#K{ajy>@bqSz@P!c6l@wK-=Z9X;gdlx<)5~lRTR7qPq0jb18xm60GWM3hGTHhEW9Z)isM~O3jIOu6kCZp<>3ye+ z+|o~C<%8OJ*O^%pqWscQ*%(yWd;Ff>t7>y?0!!}EHN77e9+A3ZQA8*|kyC4P)@xyL zm!`}bwSdV7 z#dHm2i;)qX8J2MGKVpEi*QA6~PA8SyP>UrSm}}6U+ZJ)<%q|5<^Xe(exaye~edSV; z%kWv9UCi<4hielI2LQoOdef>(r}D?gv=PmGk~EhKcPudO;dOKV*l?350sBam^~Eiz zqL`Ff5CLdNKSgmZpolQ64W$1d4B}zBeR$3-Es=FLh#Hj^rJ?!V(*gt0Q=L}x?qtn^ zqKc6sxx_(3JbT$PkZ*S58j2{s)|CF>`R@qEV#9y#1z1K}v$4%cR_76s`Rri6dr0RI zK`3l~e3Zs0l3mf^zHaeR!0DFo>*^K;@d$p6sJQbOCZo1sK`$FhU;yE5ZXI(-4Gv$1 z1P!h(@u0+=#GLj}6{&1mFpH>KLlT8kl|8$OkP9_f2W{;m1Yai*b~DL4t>)uWR;8Q1 z&M?*Fr)rSw1umZ3CgbE4?>wO3RwhTO2tW6G>^^ja89qNxSGv+9CvOKG1J(B^Ijrlclb7gW9b7|S#yB7{xn*4kW zx76G`wpjUGOMtr^Z`|>3WRyB1>BP?2vOhn9jBZC-aVxnltxn0yFci!xQtzYE#1N?o z+C*OwRv{N8S~~U3?X|rEw7KQqd5U)LQ-riReu4c!oK_U#hNnCmH$X^rcw9U(w_94{ zt@oINm_jGO*U_L$V*H)}D0e=*Mx9=M^4c|N9OU{k^~~l``*DV{&v>ynh~`yg9-mYB zf43@yt47*pIYO3+$~Ls3Layz-u_-Ls`4y)#qhjL6zKeY7RVmq};D=^&=cTWQ*O0vdYbSI{uQM1xEg~fTUuTdX1OVRS zRODGoZ|tPmw?y(c+zR#aqI~{7o59ii)N&IF<$S;kph7DR6Ps@tvNuh$7AwpKp#h_> zToxr9m9ap-3g7JuB)3*n`eUjt<)uY#tgCc`N{H}e zY0mtG85MVv_By2JQSw63urnRW@d0&c`N@Xw1!8tF*JuuBH40%usBDpX!Ns;>)ASvp zKMmBBo0wwx?rzycidv**c2@ivC?V3FLshEDFF4nXM5*ZDoVLI@XU*|vq&ov&;~&~` zEtj{hpNX%QoLn_57zQu=nBM%>pNpW@j61{X0r@WbJdkCXwbZMW>eAclr_E<>G}t=M zR~Ouc`E^O=vD9{Y*j-2AEeJJa2CL{|r?Zs5>x~ZuoOM`qc7d>is)SkfM+u&8Zc#cC zW}s_-qR|>!6)c*QjEnR`*FfM!I2ah{z31MLz)1lr#5mkiU^J-SCn0dtA0n}XDMOr9 zO>TFgbNp`qfUUT>$hL-;Rqb(chj34dXp;d-q|2{ODnX&q|HH54^H8wvA<46AZ?2ol z9fZhpCrlQr)Uu!WdnmZB>b99;GqWTj0Z(oqpb?PqAP15B)c}nz=|&Z-DLT;eN0sOd z<&_|Pq8+u$r)zrn-+~x4R@Or*D*NGXfPH{|D{x!c1*{grc=IfzR3v5|&v?8tO-9JC zx@1e5%#|OZ;lTC>D?hUBQeacp44AujzRS5hIJ{NY?VG%M)gZF?iq5tX(Uv+U^`cDu zQBamK_gNmxIMizAxnxi!%@LSY=uJ&bC2(U*Ci2<`$+-l9uz)UWf9}~b* zTP{aI6i}W+{*e9I`Ve#UO@#h@G(1ZuYn@FeJu z3GY{=&)`XZzIO3hz(&hcGNO~~FKrDbD+iitvm#*SJD{62+So8jxQ?LxO_H}>%*(O3 zy55*ls+WgPVe*;yQX5e+#bTJf#ML{hKjkFF{pPiyI70ZuhaUrhCl{crKt$XZYu;YX zj)g+~7OPyi5YiJMTCB|oaxAiMgPHkx=7VA2;=isuL>V*5ov4hb;Go-;8CgP$<*EeC zCQ2LS4^Wo=cV9l07)|JUNt5SY#z2P=Ml@M&#_&rqwt>;lal25LB9{q$p%wB*8MYqe zR^F=H#s7<`99Z9!SCz&J{}0^MtATEk^%Bi?%hP+_ST?dK*5%EqC&+lesjpGdlFqwSw<`Pi4+qQ09+`OWypLX((WL7i zi|e!XqTIieM&E`UW@5Qp3?>K!{_)Ko{ol%P73X<)c!pXi-NEI1k-sMR#h9`K(Zs6E z*^%h6rBy`hkljQ`_1VTNRZ3kzOY<&r7Ywvz6*Rc45z4`-yN8&MGhmWvP*!WtpOxbG z7BB6rlDhs3QqI-|#eOf;5J#lN?rCMpLOm zjFCZvoRw!EnwjS27X4m#=d0UqW=8LFHI>lHZ{S>R2+rMY#@y^_o){PxB-6cUQsa|> z*$)8M8F)emGT1W3=S2(Qlyt-A*K)=`g38&uI$C9g1$t*>f~<-3OHsXcnG$5 z63VwhTaeLzKmR#=v~tmpxW2z1FjT6kHJ9$%Cb*>5{MItG$>rZOrx%0bM!b*?iZdrX zq_k1Y8kX$Bz8ynA^Ii#z>Wz`G^zY6;AzlT8@tJ#5u^Hq$org=_hsCw1HF`(u` z{g8L8>&@sZ+AC=DXc&RO*7!^RT&$h(79oMYfJ>*5@$-g?AI`UX8t}%{{ zEm&5zodEhfeT8AgRLZVWRdBG5gEQ~P6!4(3F|?o9-7YiJ6bW+-qQpDv=y@&8FXnR$>k3mdu7 z%LjoQAwCf&wa5b~i7bD$BtN0^r@3s>@ zWC>=nu#dqbD)eWXyZq|-iL?|)8n_xwTGr5OuiTC_sUgRldJ>kcS0i;;zmzl)PjtC6 zL`eud?4;9lbiOFoxrRXaO zh!n+7NL>J1Ii`<=-GBHx9HES(_qeEKcuaAjVHDwEEQrqV^VYm$2}32ewY0~fKrXZI$vR#JbTwRJu+UE#(LhDwb<_SL0W4PCd1KCup@XGA zg0$%rGN%4acZ7&Z%O_%HyUQ^n$4fkI45Khhcc-q8z-U}R_&_wuPj|3sntkf-Xm7v? zoR<2;xV(xrv zkzgj8vLyEa8@I*K^IoFofs3eQpoUBT>Ie?yE%mN!-1*$7yONo|dJatR9&se6VN4|- zuuQ!UFY_=y+_PP1kCyOn$#_OQLbu`1cZ}a@B4udotsd|nPiV??4fCOHvw&d$2mbe0 zc!-jeP*>Sby;fUMgJTRkfa>krP*vAExv< z_+=UqW;^YV%71^iNVe#iqfqh4v%E5fEOy?#tCT;v@H#{)B<=I%uFUvph_Ma_8&1Jw zI@HFaa*Zl=`O#2Zzoidti>8JhlwXsbi3rBojcpIvYi9 z0^xFW7nEXs+R_4s5;KS(n?G*&8>kxDK~cE=1iw+P&e)mF z$5z0!2h93iLP?U(L|0gN>JuJAx_f9-or>yH!OG#q4B7(~+@neqp?3O8zJo(I=q-v( z?M(9>ZcB8USS>bE!34qca*`nb@6v|OJbG9)sS3^7$Ox}gH7rU|## zq!gcx#zO@iMaFggxota&xJ;Tm6$wztzVLv?5#l<)PhDpFK1FW&>)!mN`&&@k>+zQN ziABo|U2wcsIGl;Q-4z|biOu3KsdHy52j4@N32lNYj9g-!uIi?kZrARZ?A!+*ZQj1O z#jU-xfZr*}t0Jye`pxw@f{qL*x^VT0vYH=kk zY4O041!9q>jJWUlPP}d`&%x|ZY6l@kJl=qXWVT`kO5e_K3CUDYAFl2oK;&^MKFkAf<_Nr1$w+0oPkhNM-7Fj@TA-8$ zt4CWxq#x5oFj|M00X0g;GMd$i<%nvr@}={yEW#&#-vL+Mw`@Cxb_m29Ih13zUZ(@P zuB>X};f%iO+8}xT_DL>vaM!0Ubm{I0hyL%0HZ8; zb*y$<)A`Q;>|g|9uS+xL88dX+k04ERfS@tgfC7(cc9(8~NVK{s8TwmOsUonuCajWq z+;@^Z%F?6T(yUe%AG|=soGV5;4W*pO)VZvZT*)xln)#oIn2OU1+Sh%iD}$`v@QlV# zA(TLnA3GX5C5XWwUA1#TP4R}GA~{T^Z-2GD$+Qyds49kK<{Q7&|GZK&*a*GO#DMT+ MmZ(v70;|9P0Aa?;NdN!< literal 0 HcmV?d00001 From 8f9c4567952024434fac1073d33bcaddd8eea8c4 Mon Sep 17 00:00:00 2001 From: Magnus Dahl Eide Date: Tue, 9 Sep 2025 11:50:08 +0200 Subject: [PATCH 3/3] fix e2e:dev --- examples/playground15/e2e/base.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/playground15/e2e/base.spec.ts b/examples/playground15/e2e/base.spec.ts index f67b1504..be2435c6 100644 --- a/examples/playground15/e2e/base.spec.ts +++ b/examples/playground15/e2e/base.spec.ts @@ -46,9 +46,9 @@ test.describe("playground/base", () => { }); test("returns correct information about the request from a route handler", async ({ page, baseURL }) => { - const res = await page.request.get("/api/request"); + const res = await page.request.get("/api/request/"); // Next.js can fall back to `localhost:3000` or `n` if it doesn't get the host - neither of these are expected. - const expectedURL = `${baseURL}/api/request`; + const expectedURL = `${baseURL}/api/request/`; await expect(res.json()).resolves.toEqual({ nextUrl: expectedURL, url: expectedURL }); });