-
Notifications
You must be signed in to change notification settings - Fork 13.1k
Have module resolution be independend of --allowJs and --jsx flags #11704
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
b557211
7c53a1d
1d201c1
df20cf3
dc99355
07bb258
9130fbd
718d57f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -3287,19 +3287,42 @@ namespace ts { | |
| getDirectories?(path: string): string[]; | ||
| } | ||
|
|
||
| /** | ||
| * Represents the result of module resolution. | ||
| * Module resolution will pick up tsx/jsx/js files even if '--jsx' and '--allowJs' are turned off. | ||
| * The Program will then filter results based on these flags. | ||
| * | ||
| * At least one of `resolvedTsFileName` or `resolvedJsFileName` must be defined, | ||
| * else resolution should just return `undefined` instead of a ResolvedModule. | ||
| */ | ||
| export interface ResolvedModule { | ||
| /** | ||
| * This should always be set to `resolvedTsFileName || resolvedJsFileName`. | ||
| * Present for backwards compatibility. | ||
| */ | ||
| resolvedFileName: string; | ||
| /* | ||
| * Denotes if 'resolvedFileName' is isExternalLibraryImport and thus should be proper external module: | ||
| /** TypeScript (.d.ts, .ts, .tsx) file that the module was resolved to. This will be preferred over a JS file. */ | ||
| resolvedTsFileName: string | undefined; | ||
| /** JavaScript (or .jsx) file that the module was resolved to. This should be returned even if '--allowJs' (or '--jsx') is disabled. */ | ||
| resolvedJsFileName: string | undefined; | ||
| /** | ||
| * Denotes if 'resolvedFileName' is isExternalLibraryImport and thus should be a proper external module: | ||
| * - be a .d.ts file | ||
| * - use top level imports\exports | ||
| * - don't use tripleslash references | ||
| */ | ||
| isExternalLibraryImport?: boolean; | ||
| isExternalLibraryImport: boolean; | ||
|
||
| } | ||
|
|
||
| /** | ||
| * For backwards compatibility, a host may choose not to return `resolvedTsFileName` and `resolvedJsFileName` from a result ResolvedModule, | ||
| * in which case they will be inferred from the file extension. | ||
| * Prefer to return a full ResolvedModule. | ||
| */ | ||
| export type ResolvedModuleFromHost = { resolvedFileName: string; isExternalLibraryImport: boolean } | ResolvedModule; | ||
|
||
|
|
||
| export interface ResolvedModuleWithFailedLookupLocations { | ||
| resolvedModule: ResolvedModule; | ||
| resolvedModule: ResolvedModule | undefined; | ||
| failedLookupLocations: string[]; | ||
| } | ||
|
|
||
|
|
@@ -3335,7 +3358,7 @@ namespace ts { | |
| * If resolveModuleNames is implemented then implementation for members from ModuleResolutionHost can be just | ||
| * 'throw new Error("NotImplemented")' | ||
| */ | ||
| resolveModuleNames?(moduleNames: string[], containingFile: string): ResolvedModule[]; | ||
| resolveModuleNames?(moduleNames: string[], containingFile: string): ResolvedModuleFromHost[]; | ||
| /** | ||
| * This method is a companion for 'resolveModuleNames' and is used to resolve 'types' references to actual type declaration files | ||
| */ | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -118,6 +118,29 @@ namespace ts { | |
| sourceFile.resolvedModules[moduleNameText] = resolvedModule; | ||
| } | ||
|
|
||
| /** Host may have omitted resolvedTsFileName and resolvedJsFileName, in which case we should infer them from the file extension of resolvedFileName. */ | ||
| export function convertResolvedModuleFromHost(resolved: ResolvedModuleFromHost | undefined): ResolvedModule | undefined { | ||
| if (resolved === undefined) { | ||
| return undefined; | ||
| } | ||
| // `resolvedTsFileName` and `resolvedJsFileName` should be present as properties even if undefined. | ||
| else if ("resolvedTsFileName" in resolved) { | ||
|
||
| const { resolvedFileName, resolvedTsFileName, resolvedJsFileName } = resolved as ResolvedModule; | ||
| Debug.assert(resolvedFileName === (resolvedTsFileName || resolvedJsFileName)); | ||
| return resolved as ResolvedModule; | ||
| } | ||
| else { | ||
| const { resolvedFileName, isExternalLibraryImport } = resolved; | ||
| if (fileExtensionIsAny(resolvedFileName, supportedTypeScriptExtensions)) { | ||
| return { resolvedFileName, resolvedTsFileName: resolvedFileName, resolvedJsFileName: undefined, isExternalLibraryImport }; | ||
| } | ||
| else { | ||
| Debug.assert(fileExtensionIsAny(resolvedFileName, supportedJavascriptExtensions)); | ||
| return { resolvedFileName, resolvedTsFileName: undefined, resolvedJsFileName: resolvedFileName, isExternalLibraryImport }; | ||
| } | ||
| } | ||
| } | ||
|
|
||
| export function setResolvedTypeReferenceDirective(sourceFile: SourceFile, typeReferenceDirectiveName: string, resolvedTypeReferenceDirective: ResolvedTypeReferenceDirective): void { | ||
| if (!sourceFile.resolvedTypeReferenceDirectiveNames) { | ||
| sourceFile.resolvedTypeReferenceDirectiveNames = createMap<ResolvedTypeReferenceDirective>(); | ||
|
|
@@ -127,8 +150,13 @@ namespace ts { | |
| } | ||
|
|
||
| /* @internal */ | ||
| /** | ||
| * Considers two ResolvedModules equal if they have the same `resolvedFileName`. | ||
| * Thus `{ ts: foo, js: bar }` is equal to `{ ts: foo, js: baz }` because `ts` is preferred. | ||
| */ | ||
| export function moduleResolutionIsEqualTo(oldResolution: ResolvedModule, newResolution: ResolvedModule): boolean { | ||
| return oldResolution.resolvedFileName === newResolution.resolvedFileName && oldResolution.isExternalLibraryImport === newResolution.isExternalLibraryImport; | ||
| return oldResolution.isExternalLibraryImport === newResolution.isExternalLibraryImport && | ||
| oldResolution.resolvedFileName === newResolution.resolvedFileName; | ||
| } | ||
|
|
||
| /* @internal */ | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit. i would rather we just use
module.resolvedTsFileName || module.resolvedJsFileNamefor the module, and have this function just to report errors. this avoids the complexity of checking if the return type is string or not.