From 816f21c235aba40240982161ed677a176f0a368b Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Wed, 4 Jun 2025 10:23:03 -0700 Subject: [PATCH 1/3] Fix helpers emit for .cjs files in ESM module mode --- src/compiler/factory/utilities.ts | 7 +++--- src/compiler/moduleSpecifiers.ts | 2 +- .../ctsFileInEsnextHelpers.errors.txt | 9 +++++++ .../reference/ctsFileInEsnextHelpers.js | 24 +++++++++++++++++++ .../reference/ctsFileInEsnextHelpers.symbols | 8 +++++++ .../reference/ctsFileInEsnextHelpers.types | 13 ++++++++++ .../cases/compiler/ctsFileInEsnextHelpers.ts | 8 +++++++ 7 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 tests/baselines/reference/ctsFileInEsnextHelpers.errors.txt create mode 100644 tests/baselines/reference/ctsFileInEsnextHelpers.js create mode 100644 tests/baselines/reference/ctsFileInEsnextHelpers.symbols create mode 100644 tests/baselines/reference/ctsFileInEsnextHelpers.types create mode 100644 tests/cases/compiler/ctsFileInEsnextHelpers.ts diff --git a/src/compiler/factory/utilities.ts b/src/compiler/factory/utilities.ts index 80df86fd3ceae..bdc90e40e9eb1 100644 --- a/src/compiler/factory/utilities.ts +++ b/src/compiler/factory/utilities.ts @@ -700,9 +700,10 @@ export function createExternalHelpersImportDeclarationIfNeeded(nodeFactory: Node const impliedModuleKind = getImpliedNodeFormatForEmitWorker(sourceFile, compilerOptions); const helpers = getImportedHelpers(sourceFile); if ( - (moduleKind >= ModuleKind.ES2015 && moduleKind <= ModuleKind.ESNext) || - impliedModuleKind === ModuleKind.ESNext || - impliedModuleKind === undefined && moduleKind === ModuleKind.Preserve + impliedModuleKind !== ModuleKind.CommonJS && + ((moduleKind >= ModuleKind.ES2015 && moduleKind <= ModuleKind.ESNext) || + impliedModuleKind === ModuleKind.ESNext || + impliedModuleKind === undefined && moduleKind === ModuleKind.Preserve) ) { // When we emit as an ES module, generate an `import` declaration that uses named imports for helpers. // If we cannot determine the implied module kind under `module: preserve` we assume ESM. diff --git a/src/compiler/moduleSpecifiers.ts b/src/compiler/moduleSpecifiers.ts index eacba122e496c..fb72ef09e8e44 100644 --- a/src/compiler/moduleSpecifiers.ts +++ b/src/compiler/moduleSpecifiers.ts @@ -513,7 +513,7 @@ function computeModuleSpecifiers( info, compilerOptions, host, - options.overrideImportMode || importingSourceFile.impliedNodeFormat, + options.overrideImportMode, preferences, /*pathsOnly*/ modulePath.isRedirect || !!specifier, ); diff --git a/tests/baselines/reference/ctsFileInEsnextHelpers.errors.txt b/tests/baselines/reference/ctsFileInEsnextHelpers.errors.txt new file mode 100644 index 0000000000000..b43c66af41996 --- /dev/null +++ b/tests/baselines/reference/ctsFileInEsnextHelpers.errors.txt @@ -0,0 +1,9 @@ +notmodule.cts(1,23): error TS2354: This syntax requires an imported helper but module 'tslib' cannot be found. + + +==== notmodule.cts (1 errors) ==== + export async function foo() { + ~~~ +!!! error TS2354: This syntax requires an imported helper but module 'tslib' cannot be found. + await 0; + } \ No newline at end of file diff --git a/tests/baselines/reference/ctsFileInEsnextHelpers.js b/tests/baselines/reference/ctsFileInEsnextHelpers.js new file mode 100644 index 0000000000000..e08d213dfff57 --- /dev/null +++ b/tests/baselines/reference/ctsFileInEsnextHelpers.js @@ -0,0 +1,24 @@ +//// [tests/cases/compiler/ctsFileInEsnextHelpers.ts] //// + +//// [notmodule.cts] +export async function foo() { + await 0; +} + +//// [notmodule.cjs] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.foo = foo; +var tslib_1 = require("tslib"); +function foo() { + return tslib_1.__awaiter(this, void 0, void 0, function () { + return tslib_1.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, 0]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }); +} diff --git a/tests/baselines/reference/ctsFileInEsnextHelpers.symbols b/tests/baselines/reference/ctsFileInEsnextHelpers.symbols new file mode 100644 index 0000000000000..bdb34b92c52b8 --- /dev/null +++ b/tests/baselines/reference/ctsFileInEsnextHelpers.symbols @@ -0,0 +1,8 @@ +//// [tests/cases/compiler/ctsFileInEsnextHelpers.ts] //// + +=== notmodule.cts === +export async function foo() { +>foo : Symbol(foo, Decl(notmodule.cts, 0, 0)) + + await 0; +} diff --git a/tests/baselines/reference/ctsFileInEsnextHelpers.types b/tests/baselines/reference/ctsFileInEsnextHelpers.types new file mode 100644 index 0000000000000..4a9bb9edc9469 --- /dev/null +++ b/tests/baselines/reference/ctsFileInEsnextHelpers.types @@ -0,0 +1,13 @@ +//// [tests/cases/compiler/ctsFileInEsnextHelpers.ts] //// + +=== notmodule.cts === +export async function foo() { +>foo : () => Promise +> : ^^^^^^^^^^^^^^^^^^^ + + await 0; +>await 0 : 0 +> : ^ +>0 : 0 +> : ^ +} diff --git a/tests/cases/compiler/ctsFileInEsnextHelpers.ts b/tests/cases/compiler/ctsFileInEsnextHelpers.ts new file mode 100644 index 0000000000000..6708f6266b5b3 --- /dev/null +++ b/tests/cases/compiler/ctsFileInEsnextHelpers.ts @@ -0,0 +1,8 @@ +// @module: es2015 +// @importHelpers: true +// @noTypesAndSymbols: true + +// @Filename: notmodule.cts +export async function foo() { + await 0; +} \ No newline at end of file From d051b6355a6d894aa367a869872ae620469a58b1 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Wed, 4 Jun 2025 10:37:20 -0700 Subject: [PATCH 2/3] Revert accidental change --- src/compiler/moduleSpecifiers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/moduleSpecifiers.ts b/src/compiler/moduleSpecifiers.ts index fb72ef09e8e44..eacba122e496c 100644 --- a/src/compiler/moduleSpecifiers.ts +++ b/src/compiler/moduleSpecifiers.ts @@ -513,7 +513,7 @@ function computeModuleSpecifiers( info, compilerOptions, host, - options.overrideImportMode, + options.overrideImportMode || importingSourceFile.impliedNodeFormat, preferences, /*pathsOnly*/ modulePath.isRedirect || !!specifier, ); From 81e4f598b35dddc9c454bf7fbeb7b57114a9a87f Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Thu, 5 Jun 2025 07:47:49 -0700 Subject: [PATCH 3/3] Delete unused baselines --- .../reference/ctsFileInEsnextHelpers.symbols | 8 -------- .../reference/ctsFileInEsnextHelpers.types | 13 ------------- 2 files changed, 21 deletions(-) delete mode 100644 tests/baselines/reference/ctsFileInEsnextHelpers.symbols delete mode 100644 tests/baselines/reference/ctsFileInEsnextHelpers.types diff --git a/tests/baselines/reference/ctsFileInEsnextHelpers.symbols b/tests/baselines/reference/ctsFileInEsnextHelpers.symbols deleted file mode 100644 index bdb34b92c52b8..0000000000000 --- a/tests/baselines/reference/ctsFileInEsnextHelpers.symbols +++ /dev/null @@ -1,8 +0,0 @@ -//// [tests/cases/compiler/ctsFileInEsnextHelpers.ts] //// - -=== notmodule.cts === -export async function foo() { ->foo : Symbol(foo, Decl(notmodule.cts, 0, 0)) - - await 0; -} diff --git a/tests/baselines/reference/ctsFileInEsnextHelpers.types b/tests/baselines/reference/ctsFileInEsnextHelpers.types deleted file mode 100644 index 4a9bb9edc9469..0000000000000 --- a/tests/baselines/reference/ctsFileInEsnextHelpers.types +++ /dev/null @@ -1,13 +0,0 @@ -//// [tests/cases/compiler/ctsFileInEsnextHelpers.ts] //// - -=== notmodule.cts === -export async function foo() { ->foo : () => Promise -> : ^^^^^^^^^^^^^^^^^^^ - - await 0; ->await 0 : 0 -> : ^ ->0 : 0 -> : ^ -}