From 2caa9fed293530ab1e3899d68b7ad9643f2be2c6 Mon Sep 17 00:00:00 2001 From: Kyle Hensel Date: Tue, 7 Oct 2025 19:16:49 +1100 Subject: [PATCH 1/2] =?UTF-8?q?chore:=20add=20test=20cases=20for=20type-re?= =?UTF-8?q?=C3=ABxport?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/prefer-export-from.js | 16 ++++ test/snapshots/prefer-export-from.js.md | 92 ++++++++++++++++++++++ test/snapshots/prefer-export-from.js.snap | Bin 4803 -> 4951 bytes 3 files changed, 108 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 951019443d..36ee913991 100644 --- a/test/snapshots/prefer-export-from.js.md +++ b/test/snapshots/prefer-export-from.js.md @@ -2158,6 +2158,98 @@ Generated by [AVA](https://avajs.dev). 3 | export {bar, foo} 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 };␊ + ` + +> Error 1/1 + + `␊ + Message:␊ + 1 | import type * as X from 'foo';␊ + > 2 | export { X };␊ + | ^ Use \`export…from\` to re-export \`X\`.␊ + ␊ + Output:␊ + 1 |␊ + 2 |␊ + 3 | export * as X from 'foo';␊ + ` + +## invalid(27): import * as X from 'foo'; export type { X }; + +> Input + + `␊ + 1 | import * as X from 'foo';␊ + 2 | export type { X };␊ + ` + +> Error 1/1 + + `␊ + Message:␊ + 1 | import * as X from 'foo';␊ + > 2 | export type { X };␊ + | ^ Use \`export…from\` to re-export \`X\`.␊ + ␊ + Output:␊ + 1 |␊ + 2 |␊ + 3 | export * as X from 'foo';␊ + ` + +## invalid(28): import type * as X from 'foo'; export type { X }; + +> Input + + `␊ + 1 | import type * as X from 'foo';␊ + 2 | export type { X };␊ + ` + +> Error 1/1 + + `␊ + Message:␊ + 1 | import type * as X from 'foo';␊ + > 2 | export type { X };␊ + | ^ Use \`export…from\` to re-export \`X\`.␊ + ␊ + Output:␊ + 1 |␊ + 2 |␊ + 3 | export * as X from 'foo';␊ + ` + +## invalid(29): import * as X from 'foo'; export { X }; + +> Input + + `␊ + 1 | import * as X from 'foo';␊ + 2 | export { X };␊ + ` + +> Error 1/1 + + `␊ + Message:␊ + 1 | import * as X from 'foo';␊ + > 2 | export { X };␊ + | ^ Use \`export…from\` to re-export \`X\`.␊ + ␊ + Output:␊ + 1 |␊ + 2 |␊ + 3 | export * as X from 'foo';␊ + ` + ## 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 9677a555af623ca73c3fb9f3dd8aef974f7db1d8..a4093a01856d4efa0e968fa7a5f3956824c5bcdb 100644 GIT binary patch literal 4951 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 From 8d6b1daf8690452dfb8cc5c87114b4e8ee8c2a1e Mon Sep 17 00:00:00 2001 From: Kyle Hensel Date: Tue, 2 Dec 2025 14:09:04 +1100 Subject: [PATCH 2/2] `prefer-export-from`: type-import removed when using namespace import --- rules/prefer-export-from.js | 7 ++++--- test/snapshots/prefer-export-from.js.md | 10 +++++----- test/snapshots/prefer-export-from.js.snap | Bin 4951 -> 4959 bytes 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/rules/prefer-export-from.js b/rules/prefer-export-from.js index a8779c8407..f90c3a863b 100644 --- a/rules/prefer-export-from.js +++ b/rules/prefer-export-from.js @@ -86,14 +86,14 @@ function getFixFunction({ if (imported.name === NAMESPACE_SPECIFIER_NAME) { yield fixer.insertTextAfter( program, - `\nexport * as ${exported.text} ${getSourceAndAssertionsText(importDeclaration, context)}`, + `\nexport ${shouldExportAsType ? 'type ' : ''}* as ${exported.text} ${getSourceAndAssertionsText(importDeclaration, context)}`, ); } 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}`; } @@ -116,7 +116,8 @@ function getFixFunction({ } } - if (imported.variable.references.length === 1) { + const importHasSideEffects = exported.isTypeExport && !imported.isTypeImport; + if (imported.variable.references.length === 1 && !importHasSideEffects) { yield removeImportOrExport(imported.node, fixer, context); } diff --git a/test/snapshots/prefer-export-from.js.md b/test/snapshots/prefer-export-from.js.md index 36ee913991..301101dcf5 100644 --- a/test/snapshots/prefer-export-from.js.md +++ b/test/snapshots/prefer-export-from.js.md @@ -1871,7 +1871,7 @@ Generated by [AVA](https://avajs.dev). | ^^^ Use \`export…from\` to re-export \`foo\`.␊ ␊ Output:␊ - 1 |␊ + 1 | import { foo } from 'foo';␊ 2 |␊ 3 | export {type foo} from 'foo';␊ ` @@ -2178,7 +2178,7 @@ Generated by [AVA](https://avajs.dev). Output:␊ 1 |␊ 2 |␊ - 3 | export * as X from 'foo';␊ + 3 | export type * as X from 'foo';␊ ` ## invalid(27): import * as X from 'foo'; export type { X }; @@ -2199,9 +2199,9 @@ Generated by [AVA](https://avajs.dev). | ^ Use \`export…from\` to re-export \`X\`.␊ ␊ Output:␊ - 1 |␊ + 1 | import * as X from 'foo';␊ 2 |␊ - 3 | export * as X from 'foo';␊ + 3 | export type * as X from 'foo';␊ ` ## invalid(28): import type * as X from 'foo'; export type { X }; @@ -2224,7 +2224,7 @@ Generated by [AVA](https://avajs.dev). Output:␊ 1 |␊ 2 |␊ - 3 | export * as X from 'foo';␊ + 3 | export type * as X from 'foo';␊ ` ## invalid(29): import * as X from 'foo'; export { X }; diff --git a/test/snapshots/prefer-export-from.js.snap b/test/snapshots/prefer-export-from.js.snap index a4093a01856d4efa0e968fa7a5f3956824c5bcdb..8ff4d90af6a796f78dc4ba8ee13e8e5bc65b4a8e 100644 GIT binary patch literal 4959 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

cDB&U44# z0u*@3Ce7vWp!Z3x5cVpz8I_1d;j2C7w|4?k9OI>pq&A+j+jjxx{9Bsc(rTVexos8O zVd^EdCHv10jT{nN8d;1+9|1J_z;Z}y=>|F`wWglaoZW6Xx*bM_@Co#OywoG)os|rBvq~mQ{MIcOvHjhl71 z;%Xf$?QQ!8`LN!AZ+qBoT;pEFO8Z~9ZRVQC%hP@aqeo_v(f5!m8Olz7~yGw2Y#qd|wAiw6%@YK=~8AUPK7JUUyS dI@I_<;vH)^EigxKcpH<9`Y++Pg8)d|001@qLG%Cs literal 4951 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