Skip to content

Commit 56a046d

Browse files
author
Andy
authored
installTypesForPackage refactor: Trigger even if resolved to a ".js" file (microsoft#20353)
* installTypesForPackage refactor: Trigger even if resolved to a ".js" file * Use `extensionIsTypeScript`
1 parent cdd3cd4 commit 56a046d

2 files changed

Lines changed: 41 additions & 2 deletions

File tree

src/services/refactors/installTypesForPackage.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,19 @@ namespace ts.refactor.installTypesForPackage {
4646
function getAction(context: RefactorContext): CodeAction | undefined {
4747
const { file, startPosition } = context;
4848
const node = getTokenAtPosition(file, startPosition, /*includeJsDocComment*/ false);
49-
if (isStringLiteral(node) && isModuleIdentifier(node) && getResolvedModule(file, node.text) === undefined) {
50-
return codefix.tryGetCodeActionForInstallPackageTypes(context.host, file.fileName, node.text);
49+
if (!isStringLiteral(node) || !isModuleIdentifier(node)) {
50+
return undefined;
5151
}
52+
53+
const resolvedTo = getResolvedModule(file, node.text);
54+
// Still offer to install types if it resolved to e.g. a ".js" file.
55+
// `tryGetCodeActionForInstallPackageTypes` will verify that we're looking for a valid package name,
56+
// so the fix won't trigger for imports of ".js" files that couldn't be better replaced by typings.
57+
if (resolvedTo && extensionIsTypeScript(resolvedTo.extension)) {
58+
return undefined;
59+
}
60+
61+
return codefix.tryGetCodeActionForInstallPackageTypes(context.host, file.fileName, node.text);
5262
}
5363

5464
function isModuleIdentifier(node: StringLiteral): boolean {
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
// @allowJs: true
4+
5+
// @Filename: /node_modules/abs/index.js
6+
////not read
7+
8+
// @Filename: /a.js
9+
////import abs = require("/*a*/abs/*b*/");
10+
11+
test.setTypesRegistry({ "abs": undefined });
12+
13+
goTo.select("a", "b");
14+
verify.refactor({
15+
name: "Install missing types package",
16+
actionName: "install",
17+
refactors: [
18+
{
19+
name: "Install missing types package",
20+
description: "Install missing types package",
21+
actions: [
22+
{
23+
description: "Install '@types/abs'",
24+
name: "install",
25+
}
26+
]
27+
}
28+
],
29+
});

0 commit comments

Comments
 (0)