From 44e239489cd9a2231da4424d6e7350a9f97b8680 Mon Sep 17 00:00:00 2001 From: Kyle Hensel Date: Tue, 7 Oct 2025 19:16:49 +1100 Subject: [PATCH 1/2] chore: add failing test cases --- test/prefer-export-from.js | 16 ++++ test/snapshots/prefer-export-from.js.md | 100 ++++++++++++++++++++++ test/snapshots/prefer-export-from.js.snap | Bin 4818 -> 4959 bytes 3 files changed, 116 insertions(+) diff --git a/test/prefer-export-from.js b/test/prefer-export-from.js index c5aa7a8f24..e6419d2588 100644 --- a/test/prefer-export-from.js +++ b/test/prefer-export-from.js @@ -474,6 +474,22 @@ test.snapshot({ export {foo}; export {bar} from './foo.json' assert { type: 'unknown' }; `, + outdent` + import type * as X from 'foo'; + export { X }; + `, + outdent` + import * as X from 'foo'; + export type { X }; + `, + outdent` + import type * as X from 'foo'; + export type { X }; + `, + outdent` + import * as X from 'foo'; + export { X }; + `, ], }); diff --git a/test/snapshots/prefer-export-from.js.md b/test/snapshots/prefer-export-from.js.md index 7034b94b51..0897a439d2 100644 --- a/test/snapshots/prefer-export-from.js.md +++ b/test/snapshots/prefer-export-from.js.md @@ -2227,6 +2227,106 @@ Generated by [AVA](https://avajs.dev). 3 | export {bar} from './foo.json' assert { type: 'unknown' };␊ ` +## invalid(26): import type * as X from 'foo'; export { X }; + +> Input + + `␊ + 1 | import type * as X from 'foo';␊ + 2 | export { X };␊ + ` + +> Output + + `␊ + 1 |␊ + 2 |␊ + 3 | export * as X from 'foo';␊ + ` + +> Error 1/1 + + `␊ + 1 | import type * as X from 'foo';␊ + > 2 | export { X };␊ + | ^ Use \`export…from\` to re-export \`X\`.␊ + ` + +## invalid(27): import * as X from 'foo'; export type { X }; + +> Input + + `␊ + 1 | import * as X from 'foo';␊ + 2 | export type { X };␊ + ` + +> Output + + `␊ + 1 |␊ + 2 |␊ + 3 | export * as X from 'foo';␊ + ` + +> Error 1/1 + + `␊ + 1 | import * as X from 'foo';␊ + > 2 | export type { X };␊ + | ^ Use \`export…from\` to re-export \`X\`.␊ + ` + +## invalid(28): import type * as X from 'foo'; export type { X }; + +> Input + + `␊ + 1 | import type * as X from 'foo';␊ + 2 | export type { X };␊ + ` + +> Output + + `␊ + 1 |␊ + 2 |␊ + 3 | export * as X from 'foo';␊ + ` + +> Error 1/1 + + `␊ + 1 | import type * as X from 'foo';␊ + > 2 | export type { X };␊ + | ^ Use \`export…from\` to re-export \`X\`.␊ + ` + +## invalid(29): import * as X from 'foo'; export { X }; + +> Input + + `␊ + 1 | import * as X from 'foo';␊ + 2 | export { X };␊ + ` + +> Output + + `␊ + 1 |␊ + 2 |␊ + 3 | export * as X from 'foo';␊ + ` + +> Error 1/1 + + `␊ + 1 | import * as X from 'foo';␊ + > 2 | export { X };␊ + | ^ Use \`export…from\` to re-export \`X\`.␊ + ` + ## invalid(1): import json from './foo.json' with { type: 'json' }; export default json; > Input diff --git a/test/snapshots/prefer-export-from.js.snap b/test/snapshots/prefer-export-from.js.snap index 9e9b1ac4870056c43502bf47e6c1972390b5cde3..139e7fd21101f07926f21135b4ca09198045843c 100644 GIT binary patch literal 4959 zcmV-l6QJxtRzV~N@ zzxF~7aUY8a00000000B+T}_Z&RTa)?S(a1ff`wHsT)awI6~$pP-93}ZOi1%*_$L9v zgb5^JdS-f(A(MWS?w%y1Glfcm{D^|00`d==|4GJvADo3h|7~=au_wVwAcq9(P z`w}2tW!i8v0A^nn#OPBF@hafQbD8j?UkSz54-$$G5{eEbUWh3%#i0cFW^}$% z54Hydeb`_GNMp90iEw!f;PN^fmoD9KgK)lJZadD6{u55z{vj~(36Dm0ZRjdE90Xg4 zkU0`JB>rLKL3@V+V8vNOUaTl{q4FAGvqWAvX({fwPlJy8grAOMa=gs9)O&_w-+9Ge z=Y0-z-luZyJT^_rCYI(jN|ZL2;!$F|m{J}~VM5ieWGfON>y3$#3y_@{|l)64_lSXx*qp3{P+Y;EonIqx&w=j0 z)(&n$A_n<|K<2mxa?z{~^H%`o&sbtk*}|O(^phMvF5sVH!7o0=^JEaXe0>vG^_nlM3>1e+w~)9fNt?8EoxMXJ z2PXd4gNf-Z9086FqfXhlI|qbE7UN#}BBS6#Lnr|LPjAf z5sSp6Tmef^t_GvWg;+6ww~fuo74W2l+;-nmH;&a91%2UrAK=xO&;mzc6EaIzP`DP? zoeIR5v{L}8I_)q*&b7k5J5KweQ9;z^CLHR+K;V8TP%T2e$A#FQWS*%qEGG6m(J_`^ zzjs^X%+nTCMc0;AKz|W<$eJC8CT$mLDj>e%8US5bsl1bQ-o^W ze-Xg2hwKw}G0KPnbs%?9iUK-G-hzR_2^!M=L5K<03d)R2<;zkSqU=}-!(QFd`DHs# zO8nAr+dL*rqDDs~Qglj!G0LE4wv<(@+#ty6P(?9*JPG*m4J=KUn<=CAN(5lQz7&R? zJe${3)FHYF8#=V+EA@4n3uNrD<3dU*Mg(-m3=Isa*6djD7+}G@eP)5GkJ1#lQcysi zvF1@ggMS6!u-gm%TJZM*p;r*#`#}C-fc!oEMxF=z6#{m7#+o@0kf`e?FfB#^4d}B# z=H*oAcgOrY0Q0Z(J?3*D7mF0d#LTtFVSgR~a2@QD%tm}P*{~b&lR08rBgg$agF5Jo zyAg_0hCE=5_vE4ZY=(ONp_lne9qij@f&35v`R@LK%pcQ5a4(HnAUvXhm<;Y#5RYgv zz5>YHZiX@1yh%LI8Dv!7G|HCgsdOfBm z$<2Eyxfq}i0zmI_U4luN;dv=0T8x~10x10T%oMg$yhtnx_Q=TF)ScRkHxjRnT9MJ@ zsEm+=k#Q%Gb-uxgnYdXkE1w1+f7AKkOwS&A?cL@4Oia*cf$k4wrhEF&Y0)D=R562H zO6^Wh>~F@7U_c{Au>E$YIkQ$QVHk%;=uLNq)YU0~QTK5G|9vR@x^@vljL_Tg?3cP? z+H$u2d(|7dp#8?d1aVIb;%?C_$FfF$bYEC29xwEZduLdbFwhUp9OS(|DHa#$6T-Ns z90Q(mDD5f9vk}@Az{r|HI;=5Llz)Qm`-?;OVF`fI>2kxZ|JG2X4o3V9^ub%1QV2Om z;+oGD>AMVMyL(3<-UW95wI8lS+)R+|nsVaIgSd~aq+3czekaXVCJV8V_LtbOOy0mn zEGrOlrH<`M$Kp;E$iH3{cgWQQ5R-^`TNq}(52*G4XT3phdRb+3rGM9-}mQhMBig21U5tQZn0Hn_ z09bja)gm6LqZD?X88{~x$hxTtn~jP;jFTbVMP_RN#)DQDnaOi}3BuuO7_R9Pa`1s& zpVs{bP~#QD%cf9$$_%@MoNmr+iCcBY42VQb2RU(!o}_1XHa?HUn`!2=keJt&OG}h% zI*m{=z61K_?Ogh&%;=xI*t#m%s=3X7bn{Xej^5l*Q8xWOm!f9??#J~A^h8lGfL~dK zMPl(=Lr7URO1(b<>iw2MJ!8WMDJ~upOw+t7z-8KbN7t(LTg>@JW>43F)wphqwHcmREbB%z_&s*LC*br0gJHTe*! zKYD2e_Jv-G`x3m-hu6!*EpX$>wY!ee*d`BI!crI--vXy>9QVPt2)A3{gg|z!Nl!x% z7NB=(b}Ud1M_vY@a|MiBOknKpu}K4n?(H)LFxtT5a(xXU3WJS|8(h?!_Z?|Bl8sNA zVAMUO-aQGAyBmE;9}_KEj3?X_8)Qw6YjA-}SwLohb~AqoICls*x0AlPYyh2fM9h8vf{aAW2eMpE1`>^71!hOy>O z78Gb^nL_V(gGE* zfd*M7v;m2&I3G1pkg%<>aox8zHa1ql!6kRqQ*xBR_M|!8=+#O#rG@wf0P$lO#40;f z@Fwig>~UcN9XH6iNPHrBk@%)4`?X4B>5Ih4rn$+iK^;Ph!+^aLwB0gNKj)-&qGXC0 zT|;V;T0U~RI+A~m2?%A^lDg!U4`Pn>l#Rm0j2>PpM6nT~#s4YcqW{l|le!g;2$B%meKDQEmh(>&~@BuwNt)A081qM>N z40{7G>{W_k=-`rDm|=D-LBVk=3aTjIcM2+fF;fcCF^nmCuqo);v1tm5&6$a{t%&H# z@i6(lMb3ntgVD)`v;!L0XHV?mvDYX!c+oeAE3GV3R;G`7<(D#vP_@M}RHZ0so=s&F zs?xq9ITJtKG6+?QanMBcpoc2AjwM3Xq+_V!GcMauWkN0f6ii|i?ELF}5wDENBKC@J zrN{z!R@EMkDAu$m!RpCBTb0`mYH zilXN28kOQ1g0J06T;MGpXaJ-45)UL+4_rl-U=GEZP-KJLNGEEC-!`#@j_3UQmra?#<=bF?uddLVu)ezUVzpYF|=g0Roh^c zyI{O*g84l5axhNI6lszBMPk%;gMQs1MHig)(8p3j+?L1X=CuB%*(HpdP}Z0bP}>Zh zck9n%&jFia3BS?bynY-&u}Y6LvjG-rTwc5ec=6&O@q*uN#NF-5_k~HX zNeSxy=p+^n=rC-vxSZrUX+K}Y~BaVNn^A~^H_o>Bnp67Tr{4|v!& z0C>QnfA49XF*gr(1lY)f2O3}_56%dlR?7U>w@4HDMcd$JoIlX#N1s)tp4(VA(FJ3~ zi+~Z2Z*a2~Ezr8ws!B9ZMVh$kv?yP{Vo8!#`vWWrECGyWk*gn^I1i8|M$v0ROD{7HQC;ANUiKU!;X&wyKG$GMFNRPL z%Gz6xmSdq^k zUv3_%b?o@CB1eb1daR%C0C1h;Rgp?<-ZRznuK;UaW>(K? zy9cRuu489{y_C*M`~C3Bp>S3sgYb&|EDTvT>qL4WTwjW2on6E`1)66HV7>`|fxhaO z`bp~H%J?uc5FAXp#XA2oMy*J^V)tTmzr_kad3O|uujT^>9R&wMuXPk^+4U_Zc7=65T7 z>zPH`WrS4fX(aP^9}J09=BdZ&7!Qxi-hf?WWAON~`~oNGqpN_p^HKyfehwLb958Qh zL@yyFywUpgnOwi};7>DHO0V{(erl{N_*jhDp6$m((eKPe$IIYnBiI(KQKhWVK_c{A_(Gm zexH+1xYX8b4G0V0G^$O(TSUW(2llpmYwoB2o1g0*<=&lS3FoiGu z4w&|{yiHU8`SPvZ$o*E@S&;5?8pk5?1>2Pm zm0b_XFlR1w{lplXOk5}yL@XIxja*>Ws)fyV@9zvF#oBLPR-=F6aa??hOx&XP0h`N` z0(Vbh9_-pXbPC{qWXRf#vdRoRax!3!+n5_29zMtO-|+6Wg9odPc2~4%Gac+czT8|m d)Yd>!YLw9<2%wU0;(aEw_kU`AK}V<7004!wh714z literal 4818 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 From 43459159840868c3dbdb66c944c473e812cf8629 Mon Sep 17 00:00:00 2001 From: Kyle Hensel Date: Fri, 10 Oct 2025 19:48:31 +1100 Subject: [PATCH 2/2] `prefer-export-from`: type-import removed when using namespace import --- rules/prefer-export-from.js | 5 +++-- test/snapshots/prefer-export-from.js.md | 4 ++-- test/snapshots/prefer-export-from.js.snap | Bin 4959 -> 4971 bytes 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/rules/prefer-export-from.js b/rules/prefer-export-from.js index d92d62a220..35c1a62916 100644 --- a/rules/prefer-export-from.js +++ b/rules/prefer-export-from.js @@ -83,16 +83,17 @@ function getFixFunction({ /** @param {import('eslint').Rule.RuleFixer} fixer */ return function * (fixer) { if (imported.name === NAMESPACE_SPECIFIER_NAME) { + const maybeType = imported.isTypeImport ? 'type ' : ''; yield fixer.insertTextAfter( program, - `\nexport * as ${exported.text} ${getSourceAndAssertionsText(importDeclaration, sourceCode)}`, + `\nexport ${maybeType}* as ${exported.text} ${getSourceAndAssertionsText(importDeclaration, sourceCode)}`, ); } else { let specifierText = exported.name === imported.name ? exported.text : `${imported.text} as ${exported.text}`; - // Add an inline type specifier if the value is a type and the export deceleration is a value deceleration + // Add an inline type specifier if the value is a type and the export declaration is a value declaration if (shouldExportAsType && (!exportDeclaration || exportDeclaration.exportKind !== 'type')) { specifierText = `type ${specifierText}`; } diff --git a/test/snapshots/prefer-export-from.js.md b/test/snapshots/prefer-export-from.js.md index 0897a439d2..082fabcc3f 100644 --- a/test/snapshots/prefer-export-from.js.md +++ b/test/snapshots/prefer-export-from.js.md @@ -2241,7 +2241,7 @@ Generated by [AVA](https://avajs.dev). `␊ 1 |␊ 2 |␊ - 3 | export * as X from 'foo';␊ + 3 | export type * as X from 'foo';␊ ` > Error 1/1 @@ -2291,7 +2291,7 @@ Generated by [AVA](https://avajs.dev). `␊ 1 |␊ 2 |␊ - 3 | export * as X from 'foo';␊ + 3 | export type * as X from 'foo';␊ ` > Error 1/1 diff --git a/test/snapshots/prefer-export-from.js.snap b/test/snapshots/prefer-export-from.js.snap index 139e7fd21101f07926f21135b4ca09198045843c..83f41d0bc1a655fb25fa367b67d73e354f9c0b79 100644 GIT binary patch delta 897 zcmV-{1AhG9ChI0LK~_N^Q*L2!b7*gLAa*kf0|3gKBtarD4O42B=)(mpyZ?XiKd_$! z7p+7#1;0bQ_ZP7;`VW6UAGBT6Y_dY+V9?$Q8a>KWxQr+)Pwg{soh3$_9w_ov>nI-4 zVuS@KIy@3BW1wsUZJ(pbA@q2h2JIcw>WVFqVR(1}rHs9+s__&OnX7=c=UKRm2A)iO zhCDvb@|moG8pj?!HIHWKQWe*6^7EOKpuH6{pUEbC%^-(~6`6ni@#W?r>)IN9r@=~~ zVP%cp-(p%>D>T6{ejcPCkMinjMf?4$s;@&15mQwk%?)Kqy$HbB!>=+q)F29KHYqH0 zFrR+25RzLlUB?a*E3$Q{tH(tK{|d0?Wo8|%wtJAO=sI>f*h>+u zwBHY}970n( z1z_g$&Tkp}eSn#TM9SOfE8ndsfxMW>^(znlG=rt|YJW;zCckLnN{0dK_8aya6#IYW zMK1%!eb;}~i&8zOyahW4?|BK>^0cYjo85%m z+QfG=WnMd?9;wi`vut}%uRt!2wF5Lbsh{^|yA*#tOJM3!jPA;y08{wV?|^AP%iA>d zpD*9qjofslodxMWtZ^(NU$9;IR9^go@&e%Aj8%QA5t@q+5idF7KGeoIR@wEq40Gl} z*H4VG$;5?XLBx{5)yP#=tyQmp;@Wi|R29>>ME$iyvrGqAZVDRB2B=E1JL zL#IUm{zrza%_ytPz#}IE=D3Zy(c$59JpT>vUORZO+Gux0n>N$I?&HhNg+px(B&9|f XJ%Ru#`6k|HGJF3Axg%jBvDN?p)wsSD delta 885 zcmV-*1B(3XCf_D9K~_N^Q*L2!b7*gLAa*kf0|3Cj$2e)|8}1~djAZ)pnNz`og0&fD zc7Ht8yTA5A4so$E`VW8K2HHMHGhEGTlh<28dq;V?mJwa$S$zhiv&2Bt!$ZDh9fcxV zhp@my2SuXgJn%RT+B>Gz6xmSdq^kUv3_X-US>fy@xHNV>dq$gnSa$ky2YlNpW zDZMy}?v2Ai(CT2gars~^tXF3m)x|xP`f_D{rP|my9W?7})!`smAKo7|cW~Egb2+Rv zq6YVX1}{ys7r$K|JPyx%HuFz_w0~efz)|LRD}C#kMcRL5gjDKjB=dJ442e|csmJLU z50A>;fL&u_@c6O(0w?LCtAM!kQUo-94jF$OFmG=}FCito(fak}UjSx4@BD(X-)EOu zNTj@tzUbYG639E5T)*<*Pcv9bulA?p74nNFu5=i%Zogr_L9zc=Ui30x+;>gADAjYy zyRUQbo|k`sEl-erl{ zN_*jhDp6$m((eKPe$IIYnBiI(KQKhWVK_c{A_(GmexH+1xYX8b4 zG0V0G^$O(TSUW(2llpmYwoB2o1g0*<=&lS3Fol0F{SKJ+v%F1H|M~K*-N^k`+F6k9 za~j7Y@&((K59Gz~CNBW)%~;i^8lk!P5b=H^?n7;iW0hSG$uMUwbp6B_n@n6N7DOx= zT#Z~{)vATfcJJ>DBgNWpURI-j;c;Aii%i_2_W_&Bk^*;6Vjk?;J9G-*e`LtojIzoM zJaRcQV2<0E8yy}#$MfIt?zMvltBrP7v}rRP>^{ESTsYL$KvHUy(IW_;l5gUDCbRc{ LYJEXRr`7-ffDXR^