Skip to content

Commit c8ba166

Browse files
committed
Merge pull request #4911 from Microsoft/liftDtsOnlyRestriction
extend the list of extensions for module file names in node_modules f…
2 parents 8a05134 + 4ccf630 commit c8ba166

File tree

3 files changed

+42
-26
lines changed

3 files changed

+42
-26
lines changed

src/compiler/core.ts

+6
Original file line numberDiff line numberDiff line change
@@ -722,6 +722,12 @@ namespace ts {
722722
* List of supported extensions in order of file resolution precedence.
723723
*/
724724
export const supportedExtensions = [".ts", ".tsx", ".d.ts"];
725+
/**
726+
* List of extensions that will be used to look for external modules.
727+
* This list is kept separate from supportedExtensions to for cases when we'll allow to include .js files in compilation,
728+
* but still would like to load only TypeScript files as modules
729+
*/
730+
export const moduleFileExtensions = supportedExtensions;
725731

726732
const extensionsToRemove = [".d.ts", ".ts", ".js", ".tsx", ".jsx"];
727733
export function removeFileExtension(path: string): string {

src/compiler/program.ts

+9-14
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,13 @@ namespace ts {
5353
if (getRootLength(moduleName) !== 0 || nameStartsWithDotSlashOrDotDotSlash(moduleName)) {
5454
let failedLookupLocations: string[] = [];
5555
let candidate = normalizePath(combinePaths(containingDirectory, moduleName));
56-
let resolvedFileName = loadNodeModuleFromFile(candidate, /* loadOnlyDts */ false, failedLookupLocations, host);
56+
let resolvedFileName = loadNodeModuleFromFile(candidate, failedLookupLocations, host);
5757

5858
if (resolvedFileName) {
5959
return { resolvedModule: { resolvedFileName }, failedLookupLocations };
6060
}
6161

62-
resolvedFileName = loadNodeModuleFromDirectory(candidate, /* loadOnlyDts */ false, failedLookupLocations, host);
62+
resolvedFileName = loadNodeModuleFromDirectory(candidate, failedLookupLocations, host);
6363
return resolvedFileName
6464
? { resolvedModule: { resolvedFileName }, failedLookupLocations }
6565
: { resolvedModule: undefined, failedLookupLocations };
@@ -69,13 +69,8 @@ namespace ts {
6969
}
7070
}
7171

72-
function loadNodeModuleFromFile(candidate: string, loadOnlyDts: boolean, failedLookupLocation: string[], host: ModuleResolutionHost): string {
73-
if (loadOnlyDts) {
74-
return tryLoad(".d.ts");
75-
}
76-
else {
77-
return forEach(supportedExtensions, tryLoad);
78-
}
72+
function loadNodeModuleFromFile(candidate: string, failedLookupLocation: string[], host: ModuleResolutionHost): string {
73+
return forEach(moduleFileExtensions, tryLoad);
7974

8075
function tryLoad(ext: string): string {
8176
let fileName = fileExtensionIs(candidate, ext) ? candidate : candidate + ext;
@@ -89,7 +84,7 @@ namespace ts {
8984
}
9085
}
9186

92-
function loadNodeModuleFromDirectory(candidate: string, loadOnlyDts: boolean, failedLookupLocation: string[], host: ModuleResolutionHost): string {
87+
function loadNodeModuleFromDirectory(candidate: string, failedLookupLocation: string[], host: ModuleResolutionHost): string {
9388
let packageJsonPath = combinePaths(candidate, "package.json");
9489
if (host.fileExists(packageJsonPath)) {
9590

@@ -105,7 +100,7 @@ namespace ts {
105100
}
106101

107102
if (jsonContent.typings) {
108-
let result = loadNodeModuleFromFile(normalizePath(combinePaths(candidate, jsonContent.typings)), loadOnlyDts, failedLookupLocation, host);
103+
let result = loadNodeModuleFromFile(normalizePath(combinePaths(candidate, jsonContent.typings)), failedLookupLocation, host);
109104
if (result) {
110105
return result;
111106
}
@@ -116,7 +111,7 @@ namespace ts {
116111
failedLookupLocation.push(packageJsonPath);
117112
}
118113

119-
return loadNodeModuleFromFile(combinePaths(candidate, "index"), loadOnlyDts, failedLookupLocation, host);
114+
return loadNodeModuleFromFile(combinePaths(candidate, "index"), failedLookupLocation, host);
120115
}
121116

122117
function loadModuleFromNodeModules(moduleName: string, directory: string, host: ModuleResolutionHost): ResolvedModuleWithFailedLookupLocations {
@@ -127,12 +122,12 @@ namespace ts {
127122
if (baseName !== "node_modules") {
128123
let nodeModulesFolder = combinePaths(directory, "node_modules");
129124
let candidate = normalizePath(combinePaths(nodeModulesFolder, moduleName));
130-
let result = loadNodeModuleFromFile(candidate, /* loadOnlyDts */ true, failedLookupLocations, host);
125+
let result = loadNodeModuleFromFile(candidate, failedLookupLocations, host);
131126
if (result) {
132127
return { resolvedModule: { resolvedFileName: result, isExternalLibraryImport: true }, failedLookupLocations };
133128
}
134129

135-
result = loadNodeModuleFromDirectory(candidate, /* loadOnlyDts */ true, failedLookupLocations, host);
130+
result = loadNodeModuleFromDirectory(candidate, failedLookupLocations, host);
136131
if (result) {
137132
return { resolvedModule: { resolvedFileName: result, isExternalLibraryImport: true }, failedLookupLocations };
138133
}

tests/cases/unittests/moduleResolution.ts

+27-12
Original file line numberDiff line numberDiff line change
@@ -114,23 +114,22 @@ module ts {
114114
let containingFile = { name: "/a/b/c/d/e.ts" };
115115
let moduleFile = { name: "/a/b/node_modules/foo.ts" };
116116
let resolution = nodeModuleNameResolver("foo", containingFile.name, createModuleResolutionHost(containingFile, moduleFile));
117-
assert.equal(resolution.resolvedModule, undefined);
117+
assert.equal(resolution.resolvedModule.resolvedFileName, moduleFile.name);
118118
assert.deepEqual(resolution.failedLookupLocations, [
119+
"/a/b/c/d/node_modules/foo.ts",
120+
"/a/b/c/d/node_modules/foo.tsx",
119121
"/a/b/c/d/node_modules/foo.d.ts",
120122
"/a/b/c/d/node_modules/foo/package.json",
123+
"/a/b/c/d/node_modules/foo/index.ts",
124+
"/a/b/c/d/node_modules/foo/index.tsx",
121125
"/a/b/c/d/node_modules/foo/index.d.ts",
126+
"/a/b/c/node_modules/foo.ts",
127+
"/a/b/c/node_modules/foo.tsx",
122128
"/a/b/c/node_modules/foo.d.ts",
123129
"/a/b/c/node_modules/foo/package.json",
124-
"/a/b/c/node_modules/foo/index.d.ts",
125-
"/a/b/node_modules/foo.d.ts",
126-
"/a/b/node_modules/foo/package.json",
127-
"/a/b/node_modules/foo/index.d.ts",
128-
"/a/node_modules/foo.d.ts",
129-
"/a/node_modules/foo/package.json",
130-
"/a/node_modules/foo/index.d.ts",
131-
"/node_modules/foo.d.ts",
132-
"/node_modules/foo/package.json",
133-
"/node_modules/foo/index.d.ts"
130+
"/a/b/c/node_modules/foo/index.ts",
131+
"/a/b/c/node_modules/foo/index.tsx",
132+
"/a/b/c/node_modules/foo/index.d.ts"
134133
])
135134
});
136135

@@ -149,17 +148,33 @@ module ts {
149148
assert.equal(resolution.resolvedModule.resolvedFileName, moduleFile.name);
150149
assert.equal(resolution.resolvedModule.isExternalLibraryImport, true);
151150
assert.deepEqual(resolution.failedLookupLocations, [
151+
"/a/node_modules/b/c/node_modules/d/node_modules/foo.ts",
152+
"/a/node_modules/b/c/node_modules/d/node_modules/foo.tsx",
152153
"/a/node_modules/b/c/node_modules/d/node_modules/foo.d.ts",
153154
"/a/node_modules/b/c/node_modules/d/node_modules/foo/package.json",
155+
"/a/node_modules/b/c/node_modules/d/node_modules/foo/index.ts",
156+
"/a/node_modules/b/c/node_modules/d/node_modules/foo/index.tsx",
154157
"/a/node_modules/b/c/node_modules/d/node_modules/foo/index.d.ts",
158+
"/a/node_modules/b/c/node_modules/foo.ts",
159+
"/a/node_modules/b/c/node_modules/foo.tsx",
155160
"/a/node_modules/b/c/node_modules/foo.d.ts",
156161
"/a/node_modules/b/c/node_modules/foo/package.json",
162+
"/a/node_modules/b/c/node_modules/foo/index.ts",
163+
"/a/node_modules/b/c/node_modules/foo/index.tsx",
157164
"/a/node_modules/b/c/node_modules/foo/index.d.ts",
165+
"/a/node_modules/b/node_modules/foo.ts",
166+
"/a/node_modules/b/node_modules/foo.tsx",
158167
"/a/node_modules/b/node_modules/foo.d.ts",
159168
"/a/node_modules/b/node_modules/foo/package.json",
169+
"/a/node_modules/b/node_modules/foo/index.ts",
170+
"/a/node_modules/b/node_modules/foo/index.tsx",
160171
"/a/node_modules/b/node_modules/foo/index.d.ts",
172+
"/a/node_modules/foo.ts",
173+
"/a/node_modules/foo.tsx",
161174
"/a/node_modules/foo.d.ts",
162-
"/a/node_modules/foo/package.json"
175+
"/a/node_modules/foo/package.json",
176+
"/a/node_modules/foo/index.ts",
177+
"/a/node_modules/foo/index.tsx"
163178
]);
164179
});
165180
});

0 commit comments

Comments
 (0)