Use control flow to type CommonJS exports (#42751)

* Allow redeclaring CommonJS alias with initial undefined

This allows us to read our own output, plus the times when people
manually write exactly the same pattern.

Fixes #40555

* Use control flow to type commonjs exports

1. Could probably use a *lot* more tests.
2. getTypeOfAlias redoes some work from resolveAlias because it needs to
not resolve the alias completely, just to its export.

* fix lint, improve jsdoc

* Add tests, improve+fix control flow

1. Update the module.exports test to match the exports ones.
2. Add a test of evolving commonjs type.
3. Add a test of assignment as last statement.

(1) exposed a bug that required a better synthetic reference. (3)
exposed a bug that was most easily fixed by giving source files a
`endFlowNode` like functions and setting it in the binder.

* fix lint
This commit is contained in:
Nathan Shively-Sanders
2021-04-06 17:07:35 -07:00
committed by GitHub
parent eebb89533b
commit dd1ef88d01
16 changed files with 450 additions and 31 deletions
+1
View File
@@ -683,6 +683,7 @@ namespace ts {
}
if (node.kind === SyntaxKind.SourceFile) {
node.flags |= emitFlags;
(node as SourceFile).endFlowNode = currentFlow;
}
if (currentReturnTarget) {
+37 -8
View File
@@ -2473,7 +2473,7 @@ namespace ts {
}
function getDeclarationOfAliasSymbol(symbol: Symbol): Declaration | undefined {
return symbol.declarations?.find(isAliasSymbolDeclaration);
return symbol.declarations && findLast<Declaration>(symbol.declarations, isAliasSymbolDeclaration);
}
/**
@@ -8449,6 +8449,23 @@ namespace ts {
};
}
/** Create a synthetic property access flow node after the last statement of the file */
function getFlowTypeFromCommonJSExport(symbol: Symbol) {
const file = getSourceFileOfNode(symbol.declarations![0]);
const accessName = unescapeLeadingUnderscores(symbol.escapedName);
const areAllModuleExports = symbol.declarations!.every(d => isInJSFile(d) && isAccessExpression(d) && isModuleExportsAccessExpression(d.expression));
const reference = areAllModuleExports
? factory.createPropertyAccessExpression(factory.createPropertyAccessExpression(factory.createIdentifier("module"), factory.createIdentifier("exports")), accessName)
: factory.createPropertyAccessExpression(factory.createIdentifier("exports"), accessName);
if (areAllModuleExports) {
setParent((reference.expression as PropertyAccessExpression).expression, reference.expression);
}
setParent(reference.expression, reference);
setParent(reference, file);
reference.flowNode = file.endFlowNode;
return getFlowTypeOfReference(reference, autoType, undefinedType);
}
function getFlowTypeInConstructor(symbol: Symbol, constructor: ConstructorDeclaration) {
const accessName = startsWith(symbol.escapedName as string, "__#")
? factory.createPrivateIdentifier((symbol.escapedName as string).split("@")[1])
@@ -9186,14 +9203,15 @@ namespace ts {
const links = getSymbolLinks(symbol);
if (!links.type) {
const targetSymbol = resolveAlias(symbol);
const exportSymbol = symbol.declarations && getTargetOfAliasDeclaration(getDeclarationOfAliasSymbol(symbol)!, /*dontResolveAlias*/ true);
// It only makes sense to get the type of a value symbol. If the result of resolving
// the alias is not a value, then it has no type. To get the type associated with a
// type symbol, call getDeclaredTypeOfSymbol.
// This check is important because without it, a call to getTypeOfSymbol could end
// up recursively calling getTypeOfAlias, causing a stack overflow.
links.type = targetSymbol.flags & SymbolFlags.Value
? getTypeOfSymbol(targetSymbol)
links.type = exportSymbol?.declarations && isDuplicatedCommonJSExport(exportSymbol.declarations) && symbol.declarations!.length ? getFlowTypeFromCommonJSExport(exportSymbol)
: isDuplicatedCommonJSExport(symbol.declarations) ? autoType
: targetSymbol.flags & SymbolFlags.Value ? getTypeOfSymbol(targetSymbol)
: errorType;
}
return links.type;
@@ -27133,7 +27151,10 @@ namespace ts {
// accessor, or optional method.
const assignmentKind = getAssignmentTargetKind(node);
if (assignmentKind === AssignmentKind.Definite ||
prop && !(prop.flags & (SymbolFlags.Variable | SymbolFlags.Property | SymbolFlags.Accessor)) && !(prop.flags & SymbolFlags.Method && propType.flags & TypeFlags.Union)) {
prop &&
!(prop.flags & (SymbolFlags.Variable | SymbolFlags.Property | SymbolFlags.Accessor))
&& !(prop.flags & SymbolFlags.Method && propType.flags & TypeFlags.Union)
&& !isDuplicatedCommonJSExport(prop.declarations)) {
return propType;
}
if (propType === autoType) {
@@ -38154,9 +38175,11 @@ namespace ts {
return;
}
if (exportedDeclarationsCount > 1) {
for (const declaration of declarations!) {
if (isNotOverload(declaration)) {
diagnostics.add(createDiagnosticForNode(declaration, Diagnostics.Cannot_redeclare_exported_variable_0, unescapeLeadingUnderscores(id)));
if (!isDuplicatedCommonJSExport(declarations)) {
for (const declaration of declarations!) {
if (isNotOverload(declaration)) {
diagnostics.add(createDiagnosticForNode(declaration, Diagnostics.Cannot_redeclare_exported_variable_0, unescapeLeadingUnderscores(id)));
}
}
}
}
@@ -38166,6 +38189,12 @@ namespace ts {
}
}
function isDuplicatedCommonJSExport(declarations: Declaration[] | undefined) {
return declarations
&& declarations.length > 1
&& declarations.every(d => isInJSFile(d) && isAccessExpression(d) && (isExportsIdentifier(d.expression) || isModuleExportsAccessExpression(d.expression)));
}
function checkSourceElement(node: Node | undefined): void {
if (node) {
const saveCurrentNode = currentNode;
+1
View File
@@ -3545,6 +3545,7 @@ namespace ts {
/* @internal */ localJsxFragmentFactory?: EntityName;
/* @internal */ exportedModulesFromDeclarationEmit?: ExportedModulesFromDeclarationEmit;
/* @internal */ endFlowNode?: FlowNode;
}
/* @internal */
@@ -1,16 +1,16 @@
tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js(1,1): error TS2323: Cannot redeclare exported variable 'apply'.
tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js(3,1): error TS2322: Type '() => void' is not assignable to type 'undefined'.
tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js(3,1): error TS2323: Cannot redeclare exported variable 'apply'.
tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js(3,1): error TS2722: Cannot invoke an object which is possibly 'undefined'.
==== tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js (3 errors) ====
==== tests/cases/conformance/salsa/test.js (0 errors) ====
const { apply } = require('./moduleExportAliasDuplicateAlias')
apply()
==== tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js (1 errors) ====
exports.apply = undefined;
~~~~~~~~~~~~~
!!! error TS2323: Cannot redeclare exported variable 'apply'.
function a() { }
exports.apply()
~~~~~~~~~~~~~
!!! error TS2722: Cannot invoke an object which is possibly 'undefined'.
exports.apply = a;
~~~~~~~~~~~~~
!!! error TS2322: Type '() => void' is not assignable to type 'undefined'.
~~~~~~~~~~~~~
!!! error TS2323: Cannot redeclare exported variable 'apply'.
exports.apply()
@@ -1,14 +1,32 @@
//// [tests/cases/conformance/salsa/moduleExportDuplicateAlias.ts] ////
//// [moduleExportAliasDuplicateAlias.js]
exports.apply = undefined;
function a() { }
exports.apply()
exports.apply = a;
exports.apply()
//// [test.js]
const { apply } = require('./moduleExportAliasDuplicateAlias')
apply()
//// [moduleExportAliasDuplicateAlias.js]
"use strict";
exports.apply = undefined;
function a() { }
exports.apply();
exports.apply = a;
exports.apply();
//// [test.js]
"use strict";
var apply = require('./moduleExportAliasDuplicateAlias').apply;
apply();
//// [moduleExportAliasDuplicateAlias.d.ts]
export { undefined as apply };
export { a as apply };
declare function a(): void;
//// [test.d.ts]
export {};
@@ -1,16 +1,35 @@
=== tests/cases/conformance/salsa/test.js ===
const { apply } = require('./moduleExportAliasDuplicateAlias')
>apply : Symbol(apply, Decl(test.js, 0, 7))
>require : Symbol(require)
>'./moduleExportAliasDuplicateAlias' : Symbol("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias", Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
apply()
>apply : Symbol(apply, Decl(test.js, 0, 7))
=== tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js ===
exports.apply = undefined;
>exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16))
>exports : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16))
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16))
>undefined : Symbol(apply)
>exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 2, 15))
>exports : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 2, 15))
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 2, 15))
>undefined : Symbol(undefined)
function a() { }
>a : Symbol(a, Decl(moduleExportAliasDuplicateAlias.js, 0, 26))
exports.apply()
>exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 2, 15))
>exports : Symbol("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias", Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 2, 15))
exports.apply = a;
>exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16))
>exports : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16))
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16))
>exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 2, 15))
>exports : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 2, 15))
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 2, 15))
>a : Symbol(a, Decl(moduleExportAliasDuplicateAlias.js, 0, 26))
exports.apply()
>exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 2, 15))
>exports : Symbol("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias", Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 2, 15))
@@ -1,18 +1,41 @@
=== tests/cases/conformance/salsa/test.js ===
const { apply } = require('./moduleExportAliasDuplicateAlias')
>apply : () => void
>require('./moduleExportAliasDuplicateAlias') : typeof import("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias")
>require : any
>'./moduleExportAliasDuplicateAlias' : "./moduleExportAliasDuplicateAlias"
apply()
>apply() : void
>apply : () => void
=== tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js ===
exports.apply = undefined;
>exports.apply = undefined : undefined
>exports.apply : undefined
>exports.apply : any
>exports : typeof import("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias")
>apply : undefined
>apply : any
>undefined : undefined
function a() { }
>a : () => void
exports.apply = a;
>exports.apply = a : () => void
exports.apply()
>exports.apply() : any
>exports.apply : undefined
>exports : typeof import("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias")
>apply : undefined
exports.apply = a;
>exports.apply = a : () => void
>exports.apply : any
>exports : typeof import("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias")
>apply : any
>a : () => void
exports.apply()
>exports.apply() : void
>exports.apply : () => void
>exports : typeof import("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias")
>apply : () => void
@@ -0,0 +1,32 @@
//// [tests/cases/conformance/salsa/moduleExportDuplicateAlias2.ts] ////
//// [moduleExportAliasDuplicateAlias.js]
module.exports.apply = undefined;
function a() { }
module.exports.apply = a;
module.exports.apply = a;
module.exports.apply()
//// [test.js]
const { apply } = require('./moduleExportAliasDuplicateAlias')
apply()
//// [moduleExportAliasDuplicateAlias.js]
"use strict";
module.exports.apply = undefined;
function a() { }
module.exports.apply = a;
module.exports.apply = a;
module.exports.apply();
//// [test.js]
"use strict";
var apply = require('./moduleExportAliasDuplicateAlias').apply;
apply();
//// [moduleExportAliasDuplicateAlias.d.ts]
export { a as apply };
declare function a(): void;
//// [test.d.ts]
export {};
@@ -0,0 +1,44 @@
=== tests/cases/conformance/salsa/test.js ===
const { apply } = require('./moduleExportAliasDuplicateAlias')
>apply : Symbol(apply, Decl(test.js, 0, 7))
>require : Symbol(require)
>'./moduleExportAliasDuplicateAlias' : Symbol("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias", Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
apply()
>apply : Symbol(apply, Decl(test.js, 0, 7))
=== tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js ===
module.exports.apply = undefined;
>module.exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16), Decl(moduleExportAliasDuplicateAlias.js, 2, 25))
>module.exports : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16), Decl(moduleExportAliasDuplicateAlias.js, 2, 25))
>module : Symbol(module, Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
>exports : Symbol(module.exports, Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16), Decl(moduleExportAliasDuplicateAlias.js, 2, 25))
>undefined : Symbol(undefined)
function a() { }
>a : Symbol(a, Decl(moduleExportAliasDuplicateAlias.js, 0, 33))
module.exports.apply = a;
>module.exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16), Decl(moduleExportAliasDuplicateAlias.js, 2, 25))
>module.exports : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16), Decl(moduleExportAliasDuplicateAlias.js, 2, 25))
>module : Symbol(module, Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
>exports : Symbol(module.exports, Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16), Decl(moduleExportAliasDuplicateAlias.js, 2, 25))
>a : Symbol(a, Decl(moduleExportAliasDuplicateAlias.js, 0, 33))
module.exports.apply = a;
>module.exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16), Decl(moduleExportAliasDuplicateAlias.js, 2, 25))
>module.exports : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16), Decl(moduleExportAliasDuplicateAlias.js, 2, 25))
>module : Symbol(module, Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
>exports : Symbol(module.exports, Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16), Decl(moduleExportAliasDuplicateAlias.js, 2, 25))
>a : Symbol(a, Decl(moduleExportAliasDuplicateAlias.js, 0, 33))
module.exports.apply()
>module.exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16), Decl(moduleExportAliasDuplicateAlias.js, 2, 25))
>module.exports : Symbol(module.exports, Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
>module : Symbol(module, Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
>exports : Symbol(module.exports, Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16), Decl(moduleExportAliasDuplicateAlias.js, 2, 25))
@@ -0,0 +1,50 @@
=== tests/cases/conformance/salsa/test.js ===
const { apply } = require('./moduleExportAliasDuplicateAlias')
>apply : () => void
>require('./moduleExportAliasDuplicateAlias') : typeof import("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias")
>require : any
>'./moduleExportAliasDuplicateAlias' : "./moduleExportAliasDuplicateAlias"
apply()
>apply() : void
>apply : () => void
=== tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js ===
module.exports.apply = undefined;
>module.exports.apply = undefined : undefined
>module.exports.apply : any
>module.exports : typeof module.exports
>module : { exports: typeof module.exports; }
>exports : typeof module.exports
>apply : any
>undefined : undefined
function a() { }
>a : () => void
module.exports.apply = a;
>module.exports.apply = a : () => void
>module.exports.apply : any
>module.exports : typeof module.exports
>module : { exports: typeof module.exports; }
>exports : typeof module.exports
>apply : any
>a : () => void
module.exports.apply = a;
>module.exports.apply = a : () => void
>module.exports.apply : any
>module.exports : typeof module.exports
>module : { exports: typeof module.exports; }
>exports : typeof module.exports
>apply : any
>a : () => void
module.exports.apply()
>module.exports.apply() : void
>module.exports.apply : () => void
>module.exports : typeof module.exports
>module : { exports: typeof module.exports; }
>exports : typeof module.exports
>apply : () => void
@@ -0,0 +1,39 @@
//// [tests/cases/conformance/salsa/moduleExportDuplicateAlias3.ts] ////
//// [moduleExportAliasDuplicateAlias.js]
exports.apply = undefined;
exports.apply = undefined;
function a() { }
exports.apply = a;
exports.apply()
exports.apply = 'ok'
var OK = exports.apply.toUpperCase()
exports.apply = 1
//// [test.js]
const { apply } = require('./moduleExportAliasDuplicateAlias')
const result = apply.toFixed()
//// [moduleExportAliasDuplicateAlias.js]
"use strict";
exports.apply = undefined;
exports.apply = undefined;
function a() { }
exports.apply = a;
exports.apply();
exports.apply = 'ok';
var OK = exports.apply.toUpperCase();
exports.apply = 1;
//// [test.js]
"use strict";
var apply = require('./moduleExportAliasDuplicateAlias').apply;
var result = apply.toFixed();
//// [moduleExportAliasDuplicateAlias.d.ts]
export var apply: string | number | typeof a | undefined;
export { a as apply };
declare function a(): void;
//// [test.d.ts]
export {};
@@ -0,0 +1,57 @@
=== tests/cases/conformance/salsa/test.js ===
const { apply } = require('./moduleExportAliasDuplicateAlias')
>apply : Symbol(apply, Decl(test.js, 0, 7))
>require : Symbol(require)
>'./moduleExportAliasDuplicateAlias' : Symbol("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias", Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
const result = apply.toFixed()
>result : Symbol(result, Decl(test.js, 1, 5))
>apply.toFixed : Symbol(Number.toFixed, Decl(lib.es5.d.ts, --, --))
>apply : Symbol(apply, Decl(test.js, 0, 7))
>toFixed : Symbol(Number.toFixed, Decl(lib.es5.d.ts, --, --))
=== tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js ===
exports.apply = undefined;
>exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 0, 26), Decl(moduleExportAliasDuplicateAlias.js, 2, 16), Decl(moduleExportAliasDuplicateAlias.js, 4, 15), Decl(moduleExportAliasDuplicateAlias.js, 6, 36))
>exports : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 0, 26), Decl(moduleExportAliasDuplicateAlias.js, 2, 16), Decl(moduleExportAliasDuplicateAlias.js, 4, 15), Decl(moduleExportAliasDuplicateAlias.js, 6, 36))
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 0, 26), Decl(moduleExportAliasDuplicateAlias.js, 2, 16), Decl(moduleExportAliasDuplicateAlias.js, 4, 15), Decl(moduleExportAliasDuplicateAlias.js, 6, 36))
>undefined : Symbol(undefined)
exports.apply = undefined;
>exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 0, 26), Decl(moduleExportAliasDuplicateAlias.js, 2, 16), Decl(moduleExportAliasDuplicateAlias.js, 4, 15), Decl(moduleExportAliasDuplicateAlias.js, 6, 36))
>exports : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 0, 26), Decl(moduleExportAliasDuplicateAlias.js, 2, 16), Decl(moduleExportAliasDuplicateAlias.js, 4, 15), Decl(moduleExportAliasDuplicateAlias.js, 6, 36))
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 0, 26), Decl(moduleExportAliasDuplicateAlias.js, 2, 16), Decl(moduleExportAliasDuplicateAlias.js, 4, 15), Decl(moduleExportAliasDuplicateAlias.js, 6, 36))
>undefined : Symbol(undefined)
function a() { }
>a : Symbol(a, Decl(moduleExportAliasDuplicateAlias.js, 1, 26))
exports.apply = a;
>exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 0, 26), Decl(moduleExportAliasDuplicateAlias.js, 2, 16), Decl(moduleExportAliasDuplicateAlias.js, 4, 15), Decl(moduleExportAliasDuplicateAlias.js, 6, 36))
>exports : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 0, 26), Decl(moduleExportAliasDuplicateAlias.js, 2, 16), Decl(moduleExportAliasDuplicateAlias.js, 4, 15), Decl(moduleExportAliasDuplicateAlias.js, 6, 36))
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 0, 26), Decl(moduleExportAliasDuplicateAlias.js, 2, 16), Decl(moduleExportAliasDuplicateAlias.js, 4, 15), Decl(moduleExportAliasDuplicateAlias.js, 6, 36))
>a : Symbol(a, Decl(moduleExportAliasDuplicateAlias.js, 1, 26))
exports.apply()
>exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 0, 26), Decl(moduleExportAliasDuplicateAlias.js, 2, 16), Decl(moduleExportAliasDuplicateAlias.js, 4, 15), Decl(moduleExportAliasDuplicateAlias.js, 6, 36))
>exports : Symbol("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias", Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 0, 26), Decl(moduleExportAliasDuplicateAlias.js, 2, 16), Decl(moduleExportAliasDuplicateAlias.js, 4, 15), Decl(moduleExportAliasDuplicateAlias.js, 6, 36))
exports.apply = 'ok'
>exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 0, 26), Decl(moduleExportAliasDuplicateAlias.js, 2, 16), Decl(moduleExportAliasDuplicateAlias.js, 4, 15), Decl(moduleExportAliasDuplicateAlias.js, 6, 36))
>exports : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 0, 26), Decl(moduleExportAliasDuplicateAlias.js, 2, 16), Decl(moduleExportAliasDuplicateAlias.js, 4, 15), Decl(moduleExportAliasDuplicateAlias.js, 6, 36))
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 0, 26), Decl(moduleExportAliasDuplicateAlias.js, 2, 16), Decl(moduleExportAliasDuplicateAlias.js, 4, 15), Decl(moduleExportAliasDuplicateAlias.js, 6, 36))
var OK = exports.apply.toUpperCase()
>OK : Symbol(OK, Decl(moduleExportAliasDuplicateAlias.js, 6, 3))
>exports.apply.toUpperCase : Symbol(String.toUpperCase, Decl(lib.es5.d.ts, --, --))
>exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 0, 26), Decl(moduleExportAliasDuplicateAlias.js, 2, 16), Decl(moduleExportAliasDuplicateAlias.js, 4, 15), Decl(moduleExportAliasDuplicateAlias.js, 6, 36))
>exports : Symbol("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias", Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 0, 26), Decl(moduleExportAliasDuplicateAlias.js, 2, 16), Decl(moduleExportAliasDuplicateAlias.js, 4, 15), Decl(moduleExportAliasDuplicateAlias.js, 6, 36))
>toUpperCase : Symbol(String.toUpperCase, Decl(lib.es5.d.ts, --, --))
exports.apply = 1
>exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 0, 26), Decl(moduleExportAliasDuplicateAlias.js, 2, 16), Decl(moduleExportAliasDuplicateAlias.js, 4, 15), Decl(moduleExportAliasDuplicateAlias.js, 6, 36))
>exports : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 0, 26), Decl(moduleExportAliasDuplicateAlias.js, 2, 16), Decl(moduleExportAliasDuplicateAlias.js, 4, 15), Decl(moduleExportAliasDuplicateAlias.js, 6, 36))
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 0, 26), Decl(moduleExportAliasDuplicateAlias.js, 2, 16), Decl(moduleExportAliasDuplicateAlias.js, 4, 15), Decl(moduleExportAliasDuplicateAlias.js, 6, 36))
@@ -0,0 +1,68 @@
=== tests/cases/conformance/salsa/test.js ===
const { apply } = require('./moduleExportAliasDuplicateAlias')
>apply : number
>require('./moduleExportAliasDuplicateAlias') : typeof import("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias")
>require : any
>'./moduleExportAliasDuplicateAlias' : "./moduleExportAliasDuplicateAlias"
const result = apply.toFixed()
>result : string
>apply.toFixed() : string
>apply.toFixed : (fractionDigits?: number | undefined) => string
>apply : number
>toFixed : (fractionDigits?: number | undefined) => string
=== tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js ===
exports.apply = undefined;
>exports.apply = undefined : undefined
>exports.apply : string | number | (() => void) | undefined
>exports : typeof import("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias")
>apply : string | number | (() => void) | undefined
>undefined : undefined
exports.apply = undefined;
>exports.apply = undefined : undefined
>exports.apply : string | number | (() => void) | undefined
>exports : typeof import("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias")
>apply : string | number | (() => void) | undefined
>undefined : undefined
function a() { }
>a : () => void
exports.apply = a;
>exports.apply = a : () => void
>exports.apply : string | number | (() => void) | undefined
>exports : typeof import("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias")
>apply : string | number | (() => void) | undefined
>a : () => void
exports.apply()
>exports.apply() : void
>exports.apply : () => void
>exports : typeof import("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias")
>apply : () => void
exports.apply = 'ok'
>exports.apply = 'ok' : "ok"
>exports.apply : string | number | (() => void) | undefined
>exports : typeof import("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias")
>apply : string | number | (() => void) | undefined
>'ok' : "ok"
var OK = exports.apply.toUpperCase()
>OK : string
>exports.apply.toUpperCase() : string
>exports.apply.toUpperCase : () => string
>exports.apply : string
>exports : typeof import("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias")
>apply : string
>toUpperCase : () => string
exports.apply = 1
>exports.apply = 1 : 1
>exports.apply : string | number | (() => void) | undefined
>exports : typeof import("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias")
>apply : string | number | (() => void) | undefined
>1 : 1
@@ -1,7 +1,14 @@
// @checkJs: true
// @strict: true
// @declaration: true
// @filename: moduleExportAliasDuplicateAlias.js
// @outdir: out
// @filename: moduleExportAliasDuplicateAlias.js
exports.apply = undefined;
function a() { }
exports.apply()
exports.apply = a;
exports.apply()
// @filename: test.js
const { apply } = require('./moduleExportAliasDuplicateAlias')
apply()
@@ -0,0 +1,14 @@
// @checkJs: true
// @strict: true
// @declaration: true
// @outdir: out
// @filename: moduleExportAliasDuplicateAlias.js
module.exports.apply = undefined;
function a() { }
module.exports.apply = a;
module.exports.apply = a;
module.exports.apply()
// @filename: test.js
const { apply } = require('./moduleExportAliasDuplicateAlias')
apply()
@@ -0,0 +1,17 @@
// @checkJs: true
// @strict: true
// @declaration: true
// @filename: moduleExportAliasDuplicateAlias.js
// @outdir: out
exports.apply = undefined;
exports.apply = undefined;
function a() { }
exports.apply = a;
exports.apply()
exports.apply = 'ok'
var OK = exports.apply.toUpperCase()
exports.apply = 1
// @filename: test.js
const { apply } = require('./moduleExportAliasDuplicateAlias')
const result = apply.toFixed()