From d43f7b9bc7169e0a529a5ca2c0f3abec33fcbc19 Mon Sep 17 00:00:00 2001 From: jake champion Date: Mon, 10 Nov 2025 17:47:00 +0000 Subject: [PATCH 1/3] Moves vendor import map addition to earlier in bundling process Reorders the code to add vendor import maps before bundle generation starts. This ensures the import map is properly initialized with vendor dependencies before any bundling logic executes, preventing potential issues with missing dependencies during the bundling process. --- packages/edge-bundler/node/bundler.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/edge-bundler/node/bundler.ts b/packages/edge-bundler/node/bundler.ts index 49abb0175c..804fd182ba 100644 --- a/packages/edge-bundler/node/bundler.ts +++ b/packages/edge-bundler/node/bundler.ts @@ -123,6 +123,10 @@ export const bundle = async ( vendorDirectory, }) + if (vendor) { + importMap.add(vendor.importMap) + } + const bundles: Bundle[] = [] if (featureFlags.edge_bundler_generate_tarball || featureFlags.edge_bundler_dry_run_generate_tarball) { @@ -156,10 +160,6 @@ export const bundle = async ( } } - if (vendor) { - importMap.add(vendor.importMap) - } - bundles.push( await bundleESZIP({ basePath, From 9f03b905a5cd2dcb3ac6477fac6024118a8181a9 Mon Sep 17 00:00:00 2001 From: jake champion Date: Tue, 11 Nov 2025 09:20:16 +0000 Subject: [PATCH 2/3] fix: add '--node-modules-dir=manual' option to deno run command --- packages/edge-bundler/node/formats/tarball.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/edge-bundler/node/formats/tarball.ts b/packages/edge-bundler/node/formats/tarball.ts index e0e6ed6c68..155bda6f59 100644 --- a/packages/edge-bundler/node/formats/tarball.ts +++ b/packages/edge-bundler/node/formats/tarball.ts @@ -88,6 +88,7 @@ export const bundle = async ({ '--quiet', '--code-splitting', '--allow-import', + '--node-modules-dir=manual', '--outdir', bundleDir.path, ...functions.map((func) => func.path), From f7ad34513a5c28fbd17ef024bce856e7524f31eb Mon Sep 17 00:00:00 2001 From: jake champion Date: Tue, 11 Nov 2025 09:26:23 +0000 Subject: [PATCH 3/3] snappysnaps --- .../edge_functions/snapshots/tests.js.md | 10 +-- .../edge_functions/snapshots/tests.js.snap | Bin 3155 -> 3178 bytes .../build/tests/install/snapshots/tests.js.md | 67 ------------------ .../tests/install/snapshots/tests.js.snap | Bin 2742 -> 2665 bytes 4 files changed, 5 insertions(+), 72 deletions(-) diff --git a/packages/build/tests/edge_functions/snapshots/tests.js.md b/packages/build/tests/edge_functions/snapshots/tests.js.md index dd91154bf1..71bc248dd0 100644 --- a/packages/build/tests/edge_functions/snapshots/tests.js.md +++ b/packages/build/tests/edge_functions/snapshots/tests.js.md @@ -1,4 +1,4 @@ -# Snapshot report for `packages/build/tests/edge_functions/tests.js` +# Snapshot report for `tests/edge_functions/tests.js` The actual snapshot is saved in `tests.js.snap`. @@ -1279,7 +1279,7 @@ Generated by [AVA](https://avajs.dev). ────────────────────────────────────────────────────────────────␊ ␊ Error message␊ - Error: Command failed with exit code 1: deno bundle --import-map BASE64_STRING --quiet --code-splitting --allow-import --outdir /external/path packages/build/tests/edge_functions/fixtures/functions_invalid/netlify/edge-functions/functions-1.ts␊ + Error: Command failed with exit code 1: deno bundle --import-map BASE64_STRING --quiet --code-splitting --allow-import --node-modules-dir=manual --outdir /external/path packages/build/tests/edge_functions/fixtures/functions_invalid/netlify/edge-functions/functions-1.ts␊ STACK TRACE␊ ␊ export async () => ␊ @@ -1292,9 +1292,9 @@ Generated by [AVA](https://avajs.dev). ␊ Error properties␊ {␊ - shortMessage: 'Command failed with exit code 1: deno bundle --import-map BASE64_STRING --quiet --code-splitting --allow-import --outdir /external/path packages/build/tests/edge_functions/fixtures/functions_invalid/netlify/edge-functions/functions-1.ts',␊ - command: 'deno bundle --import-map BASE64_STRING --quiet --code-splitting --allow-import --outdir /external/path packages/build/tests/edge_functions/fixtures/functions_invalid/netlify/edge-functions/functions-1.ts',␊ - escapedCommand: 'deno bundle --import-map "BASE64_STRING" --quiet --code-splitting --allow-import --outdir "/external/path" "packages/build/tests/edge_functions/fixtures/functions_invalid/netlify/edge-functions/functions-1.ts"',␊ + shortMessage: 'Command failed with exit code 1: deno bundle --import-map BASE64_STRING --quiet --code-splitting --allow-import --node-modules-dir=manual --outdir /external/path packages/build/tests/edge_functions/fixtures/functions_invalid/netlify/edge-functions/functions-1.ts',␊ + command: 'deno bundle --import-map BASE64_STRING --quiet --code-splitting --allow-import --node-modules-dir=manual --outdir /external/path packages/build/tests/edge_functions/fixtures/functions_invalid/netlify/edge-functions/functions-1.ts',␊ + escapedCommand: 'deno bundle --import-map "BASE64_STRING" --quiet --code-splitting --allow-import "--node-modules-dir=manual" --outdir "/external/path" "packages/build/tests/edge_functions/fixtures/functions_invalid/netlify/edge-functions/functions-1.ts"',␊ exitCode: 1,␊ signal: undefined,␊ signalDescription: undefined,␊ diff --git a/packages/build/tests/edge_functions/snapshots/tests.js.snap b/packages/build/tests/edge_functions/snapshots/tests.js.snap index 0b7962688422fa850000a14aa9dd150e48b105e6..3bd1091cef46033958599ef709f06e625cf426ef 100644 GIT binary patch literal 3178 zcmV-w43+aiRzVr00000000B+UF~n=Mj0>A7j;!3A;I@YR;A5BynEM{f?V|_O>!k_dUv|y zD5zYw6MJ@d?(7+NW}FvJhu|X!J|OX-s0dLcgoMO5#NUJZ4j_eJ+07U4tn*~@>Wn(3GxzZTIh$zlyYgn}zgxK^$0t@pM& zH}Bor+~2up_>r^c*dLG~Dlo2S#Zjf zeXPg>oUw7l&6Vo{N3IJcCFb<#gp-7YB#uuel+~YCDDSseR@Y8>ZJnfk#N;@Im7ml@ zNk~Q$f~jRT0|%XkYeuZD23#(aP)_LG5lYX7;1xh`Lb45DK*bx!%T@7y=K3%;S2|z{ zSdR;7TI#}t1DOJq(vWo-jV5T~zbl&fchp4G#H$oc)Wmbbg|lPRusUmY%#6};GHgz8 zUFGuo4syA*v$ucd;-!C7bntVW4qNVYSSlIUortOPu3Z{7gp*+lPMFr@5tVPj$H_5g z9P51AY`HIgPBWGIMyAD(`jGmN`esX*Ha*rCNfXW(49?(HGh+0<8~wYSYm z-KUT#D*a*&?XVM0puK-qXz$NRd&{N0!LE*p;5n(U+L$B#J@q5nI~HPd%ac0SS!)V| z2KZ3!_ix~UcP8vziSP|)B4j+5q$iRf)_$XbSP>E|qc={3w}dJ8%N=k;6cln7KxS7X zROUKV3mI=}u%FC$QwFq1dG&zrN_n@PDDOb%{-6K^!lTI~$f%k?ga572;D3+?SA_;m zFp&!{B;vJl;VW28E;E*Md?T_?cob6wUBco_QaI{UJ_NZ6{)BY|f2lC&?{OW$sxTqvksFgoY+jCp>Hd(J(sKYjCB|7 zlzBTUkzhu7cTdGAfPCo^PDEdY9KxZ)^00RuI=nUH(Id$;Rge(Qx@OT^XtJ7X1zLd8 zk;t@JoBWCG!JpU#$yASX>5G4?aOrPeL@u3U2w`auOszwMoL>)w;TK6$p_u6&cZJY% z>#U_j0Cl1?O?E}^CW~nRKWKnm?sz-Z1(O#G2zHs$_hcN{PwfYa#gyw^#(UHhJ9nfA zsZ#W^68J@wPp2=uh}x-$>9oSB0mBhUeqY{qy`U&ZBg#dGC8qlABqUwLJ+|}a{e+~g z2P$8ug1R}8FY49JT@jKP4s!-F<4t{%Qf2r%OMNZ;h-ezXkG6lZv9-Oq^TEb$XJ@N% z&(6B`VsSuXU}jZX9NV#oX<&pct>t~#F0bwiIWqbs8k!5py&)Ve zt(v15Rw`ZqkGx_q;RPQ(@`zGYdx2NQrbX4yS?aBOT_F=ladvr4 zFYtz!_tw3XXfyEi0`KFt;I#er%ig+2kHa{NXw)e_HBH>N$M(IztBzIeg;Jq(CnRB? zb_UnHzh3_)5Ab#;T4* zDx+~gU7RTduDZA}wrsC5Vpq_koJ#xJrXyCY-McACLXU)es9@vH&ICn#qoRoGsEDhg zh<2e~w+vscgN0$Uj%sKx(F#S9m}Q`2l6UoU;$`4wZ9|Sj^1!^*sEP?n%Q$FLrDe!d z2PbeMG6{o(#6^!Qv$+dXGA2xR?f9(fG+1LUxS18_&R@ED;X4%(d;SF!u~ibWGK7m# zv+?#(*4(lLWo-`7YFXAlAU?m$Uf+zCV;1U)WW9PG89nPF!_Vz^yeIwxHA%3`rBI${ zOGM|_nrI>qNF1XbUEL8_`U}p{j_z`8Xh$~>X3k%}awIymqnkYjOQ$-tqq{5{+R>dG zK(wQ~P`K-^q|uIU)(9+JUeJ#2vTbNbcV7I^j_xAScDAE)6dAOmn=t@O*BG>;yIdRE z(anpSvmKoy*P$KVd~rbQohuYfwBDHsF0`YoIoZ&T?g@A~+tIl`j72-T1w{%q@d^bK zHSwHq;q2Hntk8~bf#5pZ(K*N^+R@Dw0`z3U$*`Fc2JPtT!LiP#&1gqAPXv(qkosmy z7__6C6F6r(x*^x09o?dWu|i)8!DaHznsLJLDB_ zcV*Pj-J{%@rZ1%aAP-{zO^lzlyjZu`6fal`p!qc2HB})=X|#Fv&3l!*_ndFvn|lA= z5P(q^5AZGm1Fr<(nCVUHCUs-IaB%8z5(hANHOT4RTU3RTrP{vnc=QNs1r|WFIry7O z8I0avonD<60aWlx@WVFu;Cls)HQT&7{9_{FjT~{B`YIod05d{{W#2q9sd>ITEt<;P z&8@idJ(?vnx^1Fni@|&+Q=5c`)E;_j_d^yBcQpVWKb`)fr>BR|U$pju3;jj$$>Mo) z28~TebeVf5wbZi|q`im|g z94n%T=r6i58yd0A1seK`Ug~WIf6*~vLVwXEhi;Wb4E;q{b3<913pDf>okN1rU$p*2 QJWHOx0u2(xyZPb(0M2bJsQ>@~ literal 3155 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 diff --git a/packages/build/tests/install/snapshots/tests.js.md b/packages/build/tests/install/snapshots/tests.js.md index 5612a85c38..ceb36508bc 100644 --- a/packages/build/tests/install/snapshots/tests.js.md +++ b/packages/build/tests/install/snapshots/tests.js.md @@ -1159,70 +1159,3 @@ Generated by [AVA](https://avajs.dev). ␊ (Netlify Build completed in 1ms)␊ Build step duration: Netlify Build completed in 1ms` - -## In integration dev mode, install local plugins and install the integration when forcing build - -> Snapshot 1 - - `␊ - Netlify Build ␊ - ────────────────────────────────────────────────────────────────␊ - ␊ - > Version␊ - @netlify/build 1.0.0␊ - ␊ - > Flags␊ - context: dev␊ - debug: true␊ - repositoryRoot: packages/build/tests/install/fixtures/local_missing_integration␊ - testOpts:␊ - pluginsListUrl: test␊ - silentLingeringProcesses: true␊ - ␊ - > Current directory␊ - packages/build/tests/install/fixtures/local_missing_integration␊ - ␊ - > Config file␊ - packages/build/tests/install/fixtures/local_missing_integration/netlify.toml␊ - ␊ - > Resolved config␊ - build:␊ - publish: packages/build/tests/install/fixtures/local_missing_integration␊ - publishOrigin: default␊ - ␊ - > Context␊ - dev␊ - ␊ - > Installing extensions␊ - - functions-injection␊ - ␊ - > Loading extensions␊ - - functions-injection␊ - ␊ - functions-injection-buildhooks (onPreBuild event) ␊ - ────────────────────────────────────────────────────────────────␊ - ␊ - Hello from onPreBuild␊ - ␊ - (functions-injection-buildhooks onPreBuild completed in 1ms)␊ - Build step duration: functions-injection-buildhooks onPreBuild completed in 1ms␊ - ␊ - Functions bundling ␊ - ────────────────────────────────────────────────────────────────␊ - ␊ - Packaging Functions generated by functions-injection extension:␊ - - my_unique_prefix_2_function-with-external-dependencies-directory␊ - - my_unique_prefix_2_function-with-external-dependencies-directory-multifile␊ - - my_unique_prefix_2_function-with-external-dependencies.ts␊ - - my_unique_prefix_2_function-with-local-dependencies.ts␊ - - my_unique_prefix_2_function-with-no-dependencies.ts␊ - ␊ - ␊ - (Functions bundling completed in 1ms)␊ - Build step duration: Functions bundling completed in 1ms␊ - ␊ - Netlify Build Complete ␊ - ────────────────────────────────────────────────────────────────␊ - ␊ - (Netlify Build completed in 1ms)␊ - Build step duration: Netlify Build completed in 1ms` diff --git a/packages/build/tests/install/snapshots/tests.js.snap b/packages/build/tests/install/snapshots/tests.js.snap index 652d900c0329b4e71ccb770af9316f940e039ce7..f205564e3d7f8f4dd0d9c77964e6cadb9fc14c2e 100644 GIT binary patch literal 2665 zcmV-v3YPUjRzV8@(3sy$<^BEe^XFA#1>95^CzM;y2U2P6(i95`@CoKW@uvOQzB+uiOs zW%VJkyI#L~uipFpUU$EmH^aWm2Cu{~e~l%PF24NUqks-1VN}>asF28Y!NESJ4yFTw z1yC#`c8H+J7h@*HFWxu~lIZLAzx?)%n>WJOmNKL71|ven6C&g@?%Lt6 z;SYkin93)FjxZ;5bjsNP3xP$fgLNN{0?sj&;1G@nN*4phyqtxW|*x1hsm@Hi0-DN ztE@6R+$Eoi6TcL{ayW#^@^ zEbCx_8CP`T3L~u_|JXC!q;75!`=%NEBvEEfjuH>Al&56&s)VZ~Q)m!hF(_J9tQSU6 zwP*}>*5aEgvGZVAEq_7e7^v?psOBdcVvbBTUpr!^!P%p}*9_d$Raz50H6fK^=&S`R zK~jA>4Z>4X|C{=M`(7yL!NSbNl>PNNr%LK_cO~lbHR2RpHbAaBUBF>pYaE6e4zooL zGew+kg2c3xKCMmBm{6hRBp4G7k1#Hht{apyOR{Kr8@{IoOVny3gc>cuyp{fz(GSwh{Kz z8;}|aP-M>M;80VK zYH{fEwQ&dz!b%;BFbZ$a!_uw4X|VLCTLzZ41xxMNOU;6(RI8FOmB^_Du5zYa1-7DV zwZ7l7j>Cz1SO_#y z0ehIjO=3uS^qq!^Z3uxtEif;kpIJ^W3B=e9Y;S=)gS{)1Ee2h5`PZW59Idb6wO$A5>Lvjgn zOoWP`zKgx&cGns9*hI~5$^w4f#i;|xanzY|jP*H47Jlb*_7V@|zWTy%yLf`#St&|c zjGPXfD^-XH#|@ECIU&4+KtuIU!Q4RU(MhxnC=H!JeJ`1D3mAu%x}(=htQgK=-i0*! zp`TC)4^bzPe3;E?$Xu6QsQ*QHqUIG2Y~?d@%U1q;{yfH<7ca6z51$se9SAXh7$Tw; zO2|U)MxkfN09PnWrp+;Me0FwnX2TH+Tqj&GJOYs15>}Ug*I^~$j?Xv59q)jL=u{iA zfKFPkG&=dy*}|acX9x1|*65`2S3^0ardnBInHN?MyPUCX({h1k5W_Q-9MvbApzZI}$5$*!znHKYujv zQ#<@LW|NH)TWeIkp~li}G&bBI5ysNY-Kn)CcVdZM4-pz>+p7@lKID1~^07SAXAo+! zNbD1aoa{#36(>FjmvDp(y2EDAysDXFXXE~E=ZBVcFlUD1?HWZy7;vl<9DlGXI8LwK z&|&ZI8cP1zpk(bR*`#e8%52_H`IZgKH)=3gX|S?n^c$?)j@>KW@VF3GUa@1q-hVZu z{I@~M5=gnBJpmfF6F|xS|2n$XOr?vn{|D^%x zUk#AfUUJ4>YR1jkM42^FGag_7`{-Y*%+n!_5EP zG?-cY!%WtTPizKk=JZ+j(Pk>4+9#ZO!|gbJmIT1lC^@udN2rzui8)2?bzM6<5Y+R{ zI$5s)@qET*Y+5@#_4)DHS?|k}htHlI_nw}d_a2=*d;0K&4M&KoQA0wVv}0pGX@=O3 zrC}#>L*am#T@nDNNn)3XxXSaV$pVT$bL$9_43?e}B`(!Nkz}aorxB4Kj-~X4-R+Ku z90&c*fTiyxL`ru?M8-q81R_MB@(e5+){V~0Ot0cbMrrk{F>x`t@tR(+D(9E*kIxT} zzJT+y!=vL&q|cd;xs0geH!uiq{_QXF+djPBbPvg{rJsaXe7qX3;7q;5do8)x`#>WX z@0o&pgXE$sJ-=PUUlC5PGe-uJU)BWq+yvhG=qno-W`DwXOFiG|eABa&IL zGH5i_XMJJV?CMir-1Qcq5xnneiMX|3PGI({u&uJ)9z=otse>nX(oL`;=v5&&ioiRv zDaw+p(vMK=z=WVB;Ct)$8u)v^wj7^ZlMy1qcu&%3ancZ4bCNSUcWU1Z%X0KyJmZ`une`B{K_KF33H z*}KKF4X-x5rVT#RVim`X!3ZAIxx^b46m%b&AIO7b%5F2wChWIud Xh9Me;xbsWA3WoT9y)^d|d71zKI_VV2 literal 2742 zcmV;n3Q6@rRzVD^PJTo z&LF6DZXb&X00000000B+T~CkO#uax{bRF}SZ}6Z3-F0J0vC$$Zkr;N?Ys84-U2NA4 z0@n~m;z$~soMC2$+7%K5>37H%aBl^A=&?ZWMGw8UJrwAnKo33iUi4JV@V~@e{h>(F z@(4WG66f*Fd-LA!_ej3k*TcTc1~0{Tzs8bC7hnA7VL%6xFe+>yR7m8y;9wt92h#z; z0w@*|J48_Ai!qbpSFarhN%ZBrpMU?_^=s<$y&qhA@148vT2HWa$#4pv1jKb<)sOYh z@4kJb56ij>zrb7&MlFDQG_*#yudQ*r^FikWb;d&%jf4f@;C?W&LGl1w037>F5Xt!T zlrd?8j|MN%2#auZS7ISWH*!yRNG@c+vFJL4TL9|EV_yo}QfBnsU__{ROoV*OU0eUE ze-OmQR6ZtjggK$36V3)$2rMEUth;a+aE_@2hj2Vlx>&G+B1!4tx^jEKIBrFTmiR(x?{nq^ z`ZUX0P5>M*dctuSq2dX0HJW(6F05! zdm*t8PQZ~GZbNy&mX+jU=m*r%6M4Hb=!uR7HSg3EL(aUcKa()Epq+f*CDg$eofpEg ztb+nGF6qQ2Mp`pCcNqQt7J2C)Z-FIkd-b50kKD=fkr7oP6Q#(`3&E)3D8#`)nS*;C za{?EOd2X`zpBy*&$DZLPb#s%*H_hNDu`+9NlxTRRJSDYPC0r$*LWB5PNNr%LK_dnxMjCE^rZHbAaBE#NS(avX*l4zooL zGew+kg2c3xKCMmB7_C)l9;2kxL}Vf}R?KAdgbbBw%wed^)?HBAgNDj9_NbQ1beE?x zgu>yY0wVK=9Fh60Au=V1jDvlbO&>WndyD70q{97s*e(4fW~h6Zij1*JV`Xi#I1YH85VGBn6x>P1o}i}_GMT`UAJUn(~d zTJS!{og5+hp?RO9_B%VuJB%W?84sosZPsKn@%TzfOvYrDaF=8fDP_5oNf;b5IMmdm zS{(XxZ5)CFU8!TCqwwZDEZz894wn9O!@$zEV5uE>saf!pXjKxXVmY|3Y)$OI6w8jf(kIh6tZwD; zD0ZOi@o@E*D3bcM9pu?0)ExSsRPJy)R}UO^K+0)f9G@d0uSWA`oeF!c!J$oDN0$4 zoDQ5RRfy2zhDfNKpf4fNQ2kRdH&A+XVl4wowG*iC#WQXJV>9>#}q8zYtHt21MASmj zEaY|=dUgbGD`m-~IR=hSPmfP+IAnqA=mo<=0Ld(2b@{g)R$}h>Y(w1f7I=tGb0Z4q zr1dgKCx1Cx7_9o)fjqo5I;s5CP)?astt_$33af`*&RDi-xgci{!!s9$sNtCcbpH9T<$N9iy~onuAZN zI%{H6BA`-S%37@wOiHI=@Mv++7(8n1Q7s<5AHA9!0!&<{XYWPWS8TVj_m>>}{L#Qq z?eNo>O*Tqwtx@%c8Vk44*l>e{j-{EqQ)@}?L=w9mB2;JF%Mk1?WO@v;u{_gfptUFx z`D3VV zgPFBI%w)aj#Ad)|MxS*bZ6*?`eZrYF+>YaCNdPW{CYr z8g@cAtQ;`2O9J2|PV5p9S9$&@jZXH3K!ID$L#HD&D;tUo3G$Qi-v6Q~ByWJ6y z~+K!gZXo`FTfy5X6r=~djwFs*(uCN2gyTGIuqa()T_{OtbW zXK;3U|L`ak>2u~|E<@`0H4OC4zx^V=?Zc~0_mJ#b`iXhPhs*H_&eTi1SCWgp_j2Uo z9aE5RkX&@7=eKM4E5gZj=Ey+&%bFmcnZO$#Jzi<__Fjm^m8-X6>AC{}qgU^2>FRBu zc3mLD6t9&QulJV#8IK5&X`>}H7aQ|%bA6_kHE^?~zL3aq%_wK{DwXOFiGY(VEbe98+)Mo1^N}1k5T>uvb`uDG zh5Y)!{c4w7nksTItyW9^=_l2CD}75GamE>jAvWeP4Dn4k z3_~;wap#wKl??IuBbuXt4xZ?SyIGnTzuT>L;*Eb%JL6`@YO*ub_sSl^p)7}jT4-_9@bDp=qD0kztrNN=P70I4Wc