From 56a046ddf49beb3d241ae1de60107d7864b14dd3 Mon Sep 17 00:00:00 2001 From: Andy Date: Thu, 30 Nov 2017 08:41:15 -0800 Subject: [PATCH] installTypesForPackage refactor: Trigger even if resolved to a ".js" file (#20353) * installTypesForPackage refactor: Trigger even if resolved to a ".js" file * Use `extensionIsTypeScript` --- .../refactors/installTypesForPackage.ts | 14 +++++++-- .../refactorInstallTypesForPackage_js.ts | 29 +++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 tests/cases/fourslash/refactorInstallTypesForPackage_js.ts diff --git a/src/services/refactors/installTypesForPackage.ts b/src/services/refactors/installTypesForPackage.ts index fbefbbcf4e8..236ca32c799 100644 --- a/src/services/refactors/installTypesForPackage.ts +++ b/src/services/refactors/installTypesForPackage.ts @@ -46,9 +46,19 @@ namespace ts.refactor.installTypesForPackage { function getAction(context: RefactorContext): CodeAction | undefined { const { file, startPosition } = context; const node = getTokenAtPosition(file, startPosition, /*includeJsDocComment*/ false); - if (isStringLiteral(node) && isModuleIdentifier(node) && getResolvedModule(file, node.text) === undefined) { - return codefix.tryGetCodeActionForInstallPackageTypes(context.host, file.fileName, node.text); + if (!isStringLiteral(node) || !isModuleIdentifier(node)) { + return undefined; } + + const resolvedTo = getResolvedModule(file, node.text); + // Still offer to install types if it resolved to e.g. a ".js" file. + // `tryGetCodeActionForInstallPackageTypes` will verify that we're looking for a valid package name, + // so the fix won't trigger for imports of ".js" files that couldn't be better replaced by typings. + if (resolvedTo && extensionIsTypeScript(resolvedTo.extension)) { + return undefined; + } + + return codefix.tryGetCodeActionForInstallPackageTypes(context.host, file.fileName, node.text); } function isModuleIdentifier(node: StringLiteral): boolean { diff --git a/tests/cases/fourslash/refactorInstallTypesForPackage_js.ts b/tests/cases/fourslash/refactorInstallTypesForPackage_js.ts new file mode 100644 index 00000000000..1cce0d33526 --- /dev/null +++ b/tests/cases/fourslash/refactorInstallTypesForPackage_js.ts @@ -0,0 +1,29 @@ +/// + +// @allowJs: true + +// @Filename: /node_modules/abs/index.js +////not read + +// @Filename: /a.js +////import abs = require("/*a*/abs/*b*/"); + +test.setTypesRegistry({ "abs": undefined }); + +goTo.select("a", "b"); +verify.refactor({ + name: "Install missing types package", + actionName: "install", + refactors: [ + { + name: "Install missing types package", + description: "Install missing types package", + actions: [ + { + description: "Install '@types/abs'", + name: "install", + } + ] + } + ], +});