diff --git a/internal/transformers/tstransforms/importelision.go b/internal/transformers/tstransforms/importelision.go index 7b23343d4a7..e31d009ad06 100644 --- a/internal/transformers/tstransforms/importelision.go +++ b/internal/transformers/tstransforms/importelision.go @@ -40,17 +40,15 @@ func (tx *ImportElisionTransformer) visit(node *ast.Node) *ast.Node { } return tx.Visitor().VisitEachChild(node) case ast.KindImportDeclaration: - if !tx.isElisionBlocked(node) { - n := node.AsImportDeclaration() - // Do not elide a side-effect only import declaration. - // import "foo"; - if n.ImportClause != nil { - importClause := tx.Visitor().VisitNode(n.ImportClause) - if importClause == nil { - return nil - } - return tx.Factory().UpdateImportDeclaration(n, n.Modifiers(), importClause, n.ModuleSpecifier, tx.Visitor().VisitNode(n.Attributes)) + n := node.AsImportDeclaration() + // Do not elide a side-effect only import declaration. + // import "foo"; + if n.ImportClause != nil { + importClause := tx.Visitor().VisitNode(n.ImportClause) + if importClause == nil { + return nil } + return tx.Factory().UpdateImportDeclaration(n, n.Modifiers(), importClause, n.ModuleSpecifier, tx.Visitor().VisitNode(n.Attributes)) } return tx.Visitor().VisitEachChild(node) case ast.KindImportClause: @@ -77,7 +75,7 @@ func (tx *ImportElisionTransformer) visit(node *ast.Node) *ast.Node { } return tx.Factory().UpdateNamedImports(n, elements) case ast.KindImportSpecifier: - if !tx.shouldEmitAliasDeclaration(node) { + if node.IsTypeOnly() || !tx.shouldEmitAliasDeclaration(node) { // elide type-only or unused imports return nil } diff --git a/testdata/baselines/reference/submodule/conformance/importSpecifiers1.js b/testdata/baselines/reference/submodule/conformance/importSpecifiers1.js index 46f834fbebe..71db89bcbb4 100644 --- a/testdata/baselines/reference/submodule/conformance/importSpecifiers1.js +++ b/testdata/baselines/reference/submodule/conformance/importSpecifiers1.js @@ -62,7 +62,7 @@ type; // Error (cannot resolve name) as; // Error (used in emitting position) export {}; //// [d.js] -import "./mod.js"; // Error +export {}; //// [e.js] import { type as type } from "./mod.js"; type; diff --git a/testdata/baselines/reference/submodule/conformance/importSpecifiers1.js.diff b/testdata/baselines/reference/submodule/conformance/importSpecifiers1.js.diff deleted file mode 100644 index 3031ffe9e73..00000000000 --- a/testdata/baselines/reference/submodule/conformance/importSpecifiers1.js.diff +++ /dev/null @@ -1,11 +0,0 @@ ---- old.importSpecifiers1.js -+++ new.importSpecifiers1.js -@@= skipped -61, +61 lines =@@ - as; // Error (used in emitting position) - export {}; - //// [d.js] --export {}; -+import "./mod.js"; // Error - //// [e.js] - import { type as type } from "./mod.js"; - type; \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=node16).js b/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=node16).js index 9d1ac266495..988072b042c 100644 --- a/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=node16).js +++ b/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=node16).js @@ -30,8 +30,6 @@ export interface LocalInterface extends RequireInterface, ImportInterface {} //// [index.js] "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -// not exclusively type-only -require("pkg"); //// [index.d.ts] diff --git a/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=node16).js.diff b/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=node16).js.diff deleted file mode 100644 index d8de5a5e71b..00000000000 --- a/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=node16).js.diff +++ /dev/null @@ -1,11 +0,0 @@ ---- old.nodeModulesImportAttributesModeDeclarationEmitErrors(module=node16).js -+++ new.nodeModulesImportAttributesModeDeclarationEmitErrors(module=node16).js -@@= skipped -29, +29 lines =@@ - //// [index.js] - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); -+// not exclusively type-only -+require("pkg"); - - - //// [index.d.ts] \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=node18).js b/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=node18).js index 9d1ac266495..988072b042c 100644 --- a/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=node18).js +++ b/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=node18).js @@ -30,8 +30,6 @@ export interface LocalInterface extends RequireInterface, ImportInterface {} //// [index.js] "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -// not exclusively type-only -require("pkg"); //// [index.d.ts] diff --git a/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=node18).js.diff b/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=node18).js.diff deleted file mode 100644 index b59663c1020..00000000000 --- a/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=node18).js.diff +++ /dev/null @@ -1,11 +0,0 @@ ---- old.nodeModulesImportAttributesModeDeclarationEmitErrors(module=node18).js -+++ new.nodeModulesImportAttributesModeDeclarationEmitErrors(module=node18).js -@@= skipped -29, +29 lines =@@ - //// [index.js] - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); -+// not exclusively type-only -+require("pkg"); - - - //// [index.d.ts] \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=node20).js b/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=node20).js index 9d1ac266495..988072b042c 100644 --- a/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=node20).js +++ b/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=node20).js @@ -30,8 +30,6 @@ export interface LocalInterface extends RequireInterface, ImportInterface {} //// [index.js] "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -// not exclusively type-only -require("pkg"); //// [index.d.ts] diff --git a/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=node20).js.diff b/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=node20).js.diff deleted file mode 100644 index ebc4ffa1db2..00000000000 --- a/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=node20).js.diff +++ /dev/null @@ -1,11 +0,0 @@ ---- old.nodeModulesImportAttributesModeDeclarationEmitErrors(module=node20).js -+++ new.nodeModulesImportAttributesModeDeclarationEmitErrors(module=node20).js -@@= skipped -29, +29 lines =@@ - //// [index.js] - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); -+// not exclusively type-only -+require("pkg"); - - - //// [index.d.ts] \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=nodenext).js b/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=nodenext).js index 9d1ac266495..988072b042c 100644 --- a/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=nodenext).js +++ b/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=nodenext).js @@ -30,8 +30,6 @@ export interface LocalInterface extends RequireInterface, ImportInterface {} //// [index.js] "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -// not exclusively type-only -require("pkg"); //// [index.d.ts] diff --git a/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=nodenext).js.diff b/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=nodenext).js.diff deleted file mode 100644 index f07a514c7ec..00000000000 --- a/testdata/baselines/reference/submodule/conformance/nodeModulesImportAttributesModeDeclarationEmitErrors(module=nodenext).js.diff +++ /dev/null @@ -1,11 +0,0 @@ ---- old.nodeModulesImportAttributesModeDeclarationEmitErrors(module=nodenext).js -+++ new.nodeModulesImportAttributesModeDeclarationEmitErrors(module=nodenext).js -@@= skipped -29, +29 lines =@@ - //// [index.js] - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); -+// not exclusively type-only -+require("pkg"); - - - //// [index.d.ts] \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=node16).js b/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=node16).js index d036a9af601..3b2af2656d0 100644 --- a/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=node16).js +++ b/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=node16).js @@ -30,8 +30,6 @@ export interface LocalInterface extends RequireInterface, ImportInterface {} //// [index.js] "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -// not exclusively type-only -require("pkg"); //// [index.d.ts] diff --git a/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=node16).js.diff b/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=node16).js.diff deleted file mode 100644 index fe0234b6b8b..00000000000 --- a/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=node16).js.diff +++ /dev/null @@ -1,11 +0,0 @@ ---- old.nodeModulesImportModeDeclarationEmitErrors1(module=node16).js -+++ new.nodeModulesImportModeDeclarationEmitErrors1(module=node16).js -@@= skipped -29, +29 lines =@@ - //// [index.js] - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); -+// not exclusively type-only -+require("pkg"); - - - //// [index.d.ts] \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=node18).js b/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=node18).js index d036a9af601..3b2af2656d0 100644 --- a/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=node18).js +++ b/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=node18).js @@ -30,8 +30,6 @@ export interface LocalInterface extends RequireInterface, ImportInterface {} //// [index.js] "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -// not exclusively type-only -require("pkg"); //// [index.d.ts] diff --git a/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=node18).js.diff b/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=node18).js.diff deleted file mode 100644 index 28700d7fd14..00000000000 --- a/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=node18).js.diff +++ /dev/null @@ -1,11 +0,0 @@ ---- old.nodeModulesImportModeDeclarationEmitErrors1(module=node18).js -+++ new.nodeModulesImportModeDeclarationEmitErrors1(module=node18).js -@@= skipped -29, +29 lines =@@ - //// [index.js] - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); -+// not exclusively type-only -+require("pkg"); - - - //// [index.d.ts] \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=node20).js b/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=node20).js index d036a9af601..3b2af2656d0 100644 --- a/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=node20).js +++ b/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=node20).js @@ -30,8 +30,6 @@ export interface LocalInterface extends RequireInterface, ImportInterface {} //// [index.js] "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -// not exclusively type-only -require("pkg"); //// [index.d.ts] diff --git a/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=node20).js.diff b/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=node20).js.diff deleted file mode 100644 index f7b38f460c0..00000000000 --- a/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=node20).js.diff +++ /dev/null @@ -1,11 +0,0 @@ ---- old.nodeModulesImportModeDeclarationEmitErrors1(module=node20).js -+++ new.nodeModulesImportModeDeclarationEmitErrors1(module=node20).js -@@= skipped -29, +29 lines =@@ - //// [index.js] - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); -+// not exclusively type-only -+require("pkg"); - - - //// [index.d.ts] \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=nodenext).js b/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=nodenext).js index d036a9af601..3b2af2656d0 100644 --- a/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=nodenext).js +++ b/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=nodenext).js @@ -30,8 +30,6 @@ export interface LocalInterface extends RequireInterface, ImportInterface {} //// [index.js] "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -// not exclusively type-only -require("pkg"); //// [index.d.ts] diff --git a/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=nodenext).js.diff b/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=nodenext).js.diff deleted file mode 100644 index 4b93d9af954..00000000000 --- a/testdata/baselines/reference/submodule/conformance/nodeModulesImportModeDeclarationEmitErrors1(module=nodenext).js.diff +++ /dev/null @@ -1,11 +0,0 @@ ---- old.nodeModulesImportModeDeclarationEmitErrors1(module=nodenext).js -+++ new.nodeModulesImportModeDeclarationEmitErrors1(module=nodenext).js -@@= skipped -29, +29 lines =@@ - //// [index.js] - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); -+// not exclusively type-only -+require("pkg"); - - - //// [index.d.ts] \ No newline at end of file