From e5426d02198b76e3f003c2ec1d9e9d38f9197446 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Tue, 14 Mar 2023 11:04:50 -0400 Subject: [PATCH 1/3] fix: also respect compilerOptions.moduleResolution for ending preferences --- src/compiler/utilities.ts | 4 +- ...wFile_importFileExtensionsNonTypeModule.ts | 67 +++++++++++++++++++ ...NewFile_importFileExtensionsTypeModule.ts} | 0 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 tests/cases/fourslash/moveToNewFile_importFileExtensionsNonTypeModule.ts rename tests/cases/fourslash/{moveToNewFile_importFileExtensions.ts => moveToNewFile_importFileExtensionsTypeModule.ts} (100%) diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 159aedabbf228..61618debafa89 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -9139,7 +9139,9 @@ export function usesExtensionsOnImports({ imports }: SourceFile, hasExtension: ( /** @internal */ export function getModuleSpecifierEndingPreference(preference: UserPreferences["importModuleSpecifierEnding"], resolutionMode: ResolutionMode, compilerOptions: CompilerOptions, sourceFile: SourceFile): ModuleSpecifierEnding { - if (preference === "js" || resolutionMode === ModuleKind.ESNext) { + if (preference === "js" || + resolutionMode === ModuleKind.ESNext || + [ModuleResolutionKind.Node16, ModuleResolutionKind.NodeNext].includes(compilerOptions.moduleResolution!)) { // Extensions are explicitly requested or required. Now choose between .js and .ts. if (!shouldAllowImportingTsExtension(compilerOptions)) { return ModuleSpecifierEnding.JsExtension; diff --git a/tests/cases/fourslash/moveToNewFile_importFileExtensionsNonTypeModule.ts b/tests/cases/fourslash/moveToNewFile_importFileExtensionsNonTypeModule.ts new file mode 100644 index 0000000000000..5c2d28899636e --- /dev/null +++ b/tests/cases/fourslash/moveToNewFile_importFileExtensionsNonTypeModule.ts @@ -0,0 +1,67 @@ +/// + +// @Filename: /tsconfig.json +////{ +//// "compilerOptions": { +//// "moduleResolution": "Node16", +//// } +////} + +// @Filename: /src/main.ts +////[|export function someLibFn(): string { +//// return main(); +////}|] +//// +////function main(): string { +//// return "hello world!"; +////} +////console.log(someLibFn()); + +// @Filename: /other.ts +////import { someLibFn } from "./src/main.js"; +//// +////function someOtherFn(): string { +//// return someLibFn(); +////} + +// @Filename: /act/action.ts +////import { someLibFn } from "../src/main.js"; +//// +////function doAction(): string { +//// return someLibFn(); +////} + + +verify.moveToNewFile({ + newFileContents: { + "/src/main.ts": +`import { someLibFn } from "./someLibFn.js"; + +export function main(): string { + return "hello world!"; +} +console.log(someLibFn());`, + + "/src/someLibFn.ts": +`import { main } from "./main.js"; + +export function someLibFn(): string { + return main(); +} +`, + + "/other.ts": +`import { someLibFn } from "./src/someLibFn.js"; + +function someOtherFn(): string { + return someLibFn(); +}`, + + "/act/action.ts": +`import { someLibFn } from "../src/someLibFn.js"; + +function doAction(): string { + return someLibFn(); +}`, + } +}); \ No newline at end of file diff --git a/tests/cases/fourslash/moveToNewFile_importFileExtensions.ts b/tests/cases/fourslash/moveToNewFile_importFileExtensionsTypeModule.ts similarity index 100% rename from tests/cases/fourslash/moveToNewFile_importFileExtensions.ts rename to tests/cases/fourslash/moveToNewFile_importFileExtensionsTypeModule.ts From 2e797c8b5695e4ee61965ddfd65224f22c090735 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Tue, 28 Mar 2023 16:58:20 -0400 Subject: [PATCH 2/3] Trim away compilerOptions preference --- src/compiler/utilities.ts | 4 +--- ...oveToNewFile_importFileExtensionsNonTypeModule.ts | 12 ++++++------ 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 61618debafa89..159aedabbf228 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -9139,9 +9139,7 @@ export function usesExtensionsOnImports({ imports }: SourceFile, hasExtension: ( /** @internal */ export function getModuleSpecifierEndingPreference(preference: UserPreferences["importModuleSpecifierEnding"], resolutionMode: ResolutionMode, compilerOptions: CompilerOptions, sourceFile: SourceFile): ModuleSpecifierEnding { - if (preference === "js" || - resolutionMode === ModuleKind.ESNext || - [ModuleResolutionKind.Node16, ModuleResolutionKind.NodeNext].includes(compilerOptions.moduleResolution!)) { + if (preference === "js" || resolutionMode === ModuleKind.ESNext) { // Extensions are explicitly requested or required. Now choose between .js and .ts. if (!shouldAllowImportingTsExtension(compilerOptions)) { return ModuleSpecifierEnding.JsExtension; diff --git a/tests/cases/fourslash/moveToNewFile_importFileExtensionsNonTypeModule.ts b/tests/cases/fourslash/moveToNewFile_importFileExtensionsNonTypeModule.ts index 5c2d28899636e..a6ea5f8562e7f 100644 --- a/tests/cases/fourslash/moveToNewFile_importFileExtensionsNonTypeModule.ts +++ b/tests/cases/fourslash/moveToNewFile_importFileExtensionsNonTypeModule.ts @@ -18,14 +18,14 @@ ////console.log(someLibFn()); // @Filename: /other.ts -////import { someLibFn } from "./src/main.js"; +////import { someLibFn } from "./src/main"; //// ////function someOtherFn(): string { //// return someLibFn(); ////} // @Filename: /act/action.ts -////import { someLibFn } from "../src/main.js"; +////import { someLibFn } from "../src/main"; //// ////function doAction(): string { //// return someLibFn(); @@ -35,7 +35,7 @@ verify.moveToNewFile({ newFileContents: { "/src/main.ts": -`import { someLibFn } from "./someLibFn.js"; +`import { someLibFn } from "./someLibFn"; export function main(): string { return "hello world!"; @@ -43,7 +43,7 @@ export function main(): string { console.log(someLibFn());`, "/src/someLibFn.ts": -`import { main } from "./main.js"; +`import { main } from "./main"; export function someLibFn(): string { return main(); @@ -51,14 +51,14 @@ export function someLibFn(): string { `, "/other.ts": -`import { someLibFn } from "./src/someLibFn.js"; +`import { someLibFn } from "./src/someLibFn"; function someOtherFn(): string { return someLibFn(); }`, "/act/action.ts": -`import { someLibFn } from "../src/someLibFn.js"; +`import { someLibFn } from "../src/someLibFn"; function doAction(): string { return someLibFn(); From 3505fb94c164e01d4d761df0247b34760f63e57b Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Tue, 28 Mar 2023 17:07:46 -0400 Subject: [PATCH 3/3] Add passing test case... --- ...ExtensionsNonTypeModuleExistingJsImport.ts | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 tests/cases/fourslash/moveToNewFile_importFileExtensionsNonTypeModuleExistingJsImport.ts diff --git a/tests/cases/fourslash/moveToNewFile_importFileExtensionsNonTypeModuleExistingJsImport.ts b/tests/cases/fourslash/moveToNewFile_importFileExtensionsNonTypeModuleExistingJsImport.ts new file mode 100644 index 0000000000000..6c43a02feef01 --- /dev/null +++ b/tests/cases/fourslash/moveToNewFile_importFileExtensionsNonTypeModuleExistingJsImport.ts @@ -0,0 +1,67 @@ +/// + +// @Filename: /src/main.ts +////import { message } from "./message.js"; +//// +////[|export function someLibFn(): string { +//// return main(); +////}|] +//// +////function main(): string { +//// return message; +////} +////console.log(someLibFn()); + +// @Filename: /message.ts +////export const message = "hello world"; + +// @Filename: /other.ts +////import { someLibFn } from "./src/main.js"; +//// +////function someOtherFn(): string { +//// return someLibFn(); +////} + +// @Filename: /act/action.ts +////import { someLibFn } from "../src/main.js"; +//// +////function doAction(): string { +//// return someLibFn(); +////} + + +verify.moveToNewFile({ + newFileContents: { + "/src/main.ts": +`import { message } from "./message.js"; +import { someLibFn } from "./someLibFn.js"; + +export function main(): string { + return message; +} +console.log(someLibFn());`, + + "/src/someLibFn.ts": +`import { main } from "./main.js"; + + +export function someLibFn(): string { + return main(); +} +`, + + "/other.ts": +`import { someLibFn } from "./src/someLibFn.js"; + +function someOtherFn(): string { + return someLibFn(); +}`, + + "/act/action.ts": +`import { someLibFn } from "../src/someLibFn.js"; + +function doAction(): string { + return someLibFn(); +}`, + } +}); \ No newline at end of file