From c720ad6ffb54f4e7039f0d2010966dc209b74582 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Mon, 28 Mar 2022 18:23:20 +0300 Subject: [PATCH] fix(48166): skip checking module.exports in a truthiness call expression (#48337) --- src/compiler/checker.ts | 1 + .../truthinessCallExpressionCoercion4.symbols | 17 ++++++++++++++ .../truthinessCallExpressionCoercion4.types | 22 +++++++++++++++++++ .../truthinessCallExpressionCoercion4.ts | 11 ++++++++++ 4 files changed, 51 insertions(+) create mode 100644 tests/baselines/reference/truthinessCallExpressionCoercion4.symbols create mode 100644 tests/baselines/reference/truthinessCallExpressionCoercion4.types create mode 100644 tests/cases/compiler/truthinessCallExpressionCoercion4.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 6c956a90378..4fdc647fb2f 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -37679,6 +37679,7 @@ namespace ts { (condExpr.operatorToken.kind === SyntaxKind.BarBarToken || condExpr.operatorToken.kind === SyntaxKind.AmpersandAmpersandToken) ? condExpr.right : condExpr; + if (isModuleExportsAccessExpression(location)) return; const type = checkTruthinessExpression(location); const isPropertyExpressionCast = isPropertyAccessExpression(location) && isTypeAssertion(location.expression); if (getFalsyFlags(type) || isPropertyExpressionCast) return; diff --git a/tests/baselines/reference/truthinessCallExpressionCoercion4.symbols b/tests/baselines/reference/truthinessCallExpressionCoercion4.symbols new file mode 100644 index 00000000000..da41aefd1a3 --- /dev/null +++ b/tests/baselines/reference/truthinessCallExpressionCoercion4.symbols @@ -0,0 +1,17 @@ +=== tests/cases/compiler/a.js === +function fn() {} +>fn : Symbol(fn, Decl(a.js, 0, 0)) + +if (typeof module === 'object' && module.exports) { +>module : Symbol(module, Decl(a.js, 2, 51)) +>module.exports : Symbol(module.exports, Decl(a.js, 0, 0)) +>module : Symbol(module, Decl(a.js, 2, 51)) +>exports : Symbol(module.exports, Decl(a.js, 0, 0)) + + module.exports = fn; +>module.exports : Symbol(module.exports, Decl(a.js, 0, 0)) +>module : Symbol(export=, Decl(a.js, 2, 51)) +>exports : Symbol(export=, Decl(a.js, 2, 51)) +>fn : Symbol(fn, Decl(a.js, 0, 0)) +} + diff --git a/tests/baselines/reference/truthinessCallExpressionCoercion4.types b/tests/baselines/reference/truthinessCallExpressionCoercion4.types new file mode 100644 index 00000000000..d9a0f16b912 --- /dev/null +++ b/tests/baselines/reference/truthinessCallExpressionCoercion4.types @@ -0,0 +1,22 @@ +=== tests/cases/compiler/a.js === +function fn() {} +>fn : () => void + +if (typeof module === 'object' && module.exports) { +>typeof module === 'object' && module.exports : false | (() => void) +>typeof module === 'object' : boolean +>typeof module : "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function" +>module : { exports: () => void; } +>'object' : "object" +>module.exports : () => void +>module : { exports: () => void; } +>exports : () => void + + module.exports = fn; +>module.exports = fn : () => void +>module.exports : () => void +>module : { exports: () => void; } +>exports : () => void +>fn : () => void +} + diff --git a/tests/cases/compiler/truthinessCallExpressionCoercion4.ts b/tests/cases/compiler/truthinessCallExpressionCoercion4.ts new file mode 100644 index 00000000000..f585d7b78d1 --- /dev/null +++ b/tests/cases/compiler/truthinessCallExpressionCoercion4.ts @@ -0,0 +1,11 @@ +// @checkJs: true +// @allowJs: true +// @strict: true +// @noEmit: true +// @filename: a.js + +function fn() {} + +if (typeof module === 'object' && module.exports) { + module.exports = fn; +}