Skip to content

Commit dd1ef88

Browse files
authored
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
1 parent eebb895 commit dd1ef88

16 files changed

+450
-31
lines changed

src/compiler/binder.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,7 @@ namespace ts {
683683
}
684684
if (node.kind === SyntaxKind.SourceFile) {
685685
node.flags |= emitFlags;
686+
(node as SourceFile).endFlowNode = currentFlow;
686687
}
687688

688689
if (currentReturnTarget) {

src/compiler/checker.ts

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2473,7 +2473,7 @@ namespace ts {
24732473
}
24742474

24752475
function getDeclarationOfAliasSymbol(symbol: Symbol): Declaration | undefined {
2476-
return symbol.declarations?.find(isAliasSymbolDeclaration);
2476+
return symbol.declarations && findLast<Declaration>(symbol.declarations, isAliasSymbolDeclaration);
24772477
}
24782478

24792479
/**
@@ -8449,6 +8449,23 @@ namespace ts {
84498449
};
84508450
}
84518451

8452+
/** Create a synthetic property access flow node after the last statement of the file */
8453+
function getFlowTypeFromCommonJSExport(symbol: Symbol) {
8454+
const file = getSourceFileOfNode(symbol.declarations![0]);
8455+
const accessName = unescapeLeadingUnderscores(symbol.escapedName);
8456+
const areAllModuleExports = symbol.declarations!.every(d => isInJSFile(d) && isAccessExpression(d) && isModuleExportsAccessExpression(d.expression));
8457+
const reference = areAllModuleExports
8458+
? factory.createPropertyAccessExpression(factory.createPropertyAccessExpression(factory.createIdentifier("module"), factory.createIdentifier("exports")), accessName)
8459+
: factory.createPropertyAccessExpression(factory.createIdentifier("exports"), accessName);
8460+
if (areAllModuleExports) {
8461+
setParent((reference.expression as PropertyAccessExpression).expression, reference.expression);
8462+
}
8463+
setParent(reference.expression, reference);
8464+
setParent(reference, file);
8465+
reference.flowNode = file.endFlowNode;
8466+
return getFlowTypeOfReference(reference, autoType, undefinedType);
8467+
}
8468+
84528469
function getFlowTypeInConstructor(symbol: Symbol, constructor: ConstructorDeclaration) {
84538470
const accessName = startsWith(symbol.escapedName as string, "__#")
84548471
? factory.createPrivateIdentifier((symbol.escapedName as string).split("@")[1])
@@ -9186,14 +9203,15 @@ namespace ts {
91869203
const links = getSymbolLinks(symbol);
91879204
if (!links.type) {
91889205
const targetSymbol = resolveAlias(symbol);
9189-
9206+
const exportSymbol = symbol.declarations && getTargetOfAliasDeclaration(getDeclarationOfAliasSymbol(symbol)!, /*dontResolveAlias*/ true);
91909207
// It only makes sense to get the type of a value symbol. If the result of resolving
91919208
// the alias is not a value, then it has no type. To get the type associated with a
91929209
// type symbol, call getDeclaredTypeOfSymbol.
91939210
// This check is important because without it, a call to getTypeOfSymbol could end
91949211
// up recursively calling getTypeOfAlias, causing a stack overflow.
9195-
links.type = targetSymbol.flags & SymbolFlags.Value
9196-
? getTypeOfSymbol(targetSymbol)
9212+
links.type = exportSymbol?.declarations && isDuplicatedCommonJSExport(exportSymbol.declarations) && symbol.declarations!.length ? getFlowTypeFromCommonJSExport(exportSymbol)
9213+
: isDuplicatedCommonJSExport(symbol.declarations) ? autoType
9214+
: targetSymbol.flags & SymbolFlags.Value ? getTypeOfSymbol(targetSymbol)
91979215
: errorType;
91989216
}
91999217
return links.type;
@@ -27133,7 +27151,10 @@ namespace ts {
2713327151
// accessor, or optional method.
2713427152
const assignmentKind = getAssignmentTargetKind(node);
2713527153
if (assignmentKind === AssignmentKind.Definite ||
27136-
prop && !(prop.flags & (SymbolFlags.Variable | SymbolFlags.Property | SymbolFlags.Accessor)) && !(prop.flags & SymbolFlags.Method && propType.flags & TypeFlags.Union)) {
27154+
prop &&
27155+
!(prop.flags & (SymbolFlags.Variable | SymbolFlags.Property | SymbolFlags.Accessor))
27156+
&& !(prop.flags & SymbolFlags.Method && propType.flags & TypeFlags.Union)
27157+
&& !isDuplicatedCommonJSExport(prop.declarations)) {
2713727158
return propType;
2713827159
}
2713927160
if (propType === autoType) {
@@ -38154,9 +38175,11 @@ namespace ts {
3815438175
return;
3815538176
}
3815638177
if (exportedDeclarationsCount > 1) {
38157-
for (const declaration of declarations!) {
38158-
if (isNotOverload(declaration)) {
38159-
diagnostics.add(createDiagnosticForNode(declaration, Diagnostics.Cannot_redeclare_exported_variable_0, unescapeLeadingUnderscores(id)));
38178+
if (!isDuplicatedCommonJSExport(declarations)) {
38179+
for (const declaration of declarations!) {
38180+
if (isNotOverload(declaration)) {
38181+
diagnostics.add(createDiagnosticForNode(declaration, Diagnostics.Cannot_redeclare_exported_variable_0, unescapeLeadingUnderscores(id)));
38182+
}
3816038183
}
3816138184
}
3816238185
}
@@ -38166,6 +38189,12 @@ namespace ts {
3816638189
}
3816738190
}
3816838191

38192+
function isDuplicatedCommonJSExport(declarations: Declaration[] | undefined) {
38193+
return declarations
38194+
&& declarations.length > 1
38195+
&& declarations.every(d => isInJSFile(d) && isAccessExpression(d) && (isExportsIdentifier(d.expression) || isModuleExportsAccessExpression(d.expression)));
38196+
}
38197+
3816938198
function checkSourceElement(node: Node | undefined): void {
3817038199
if (node) {
3817138200
const saveCurrentNode = currentNode;

src/compiler/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3545,6 +3545,7 @@ namespace ts {
35453545
/* @internal */ localJsxFragmentFactory?: EntityName;
35463546

35473547
/* @internal */ exportedModulesFromDeclarationEmit?: ExportedModulesFromDeclarationEmit;
3548+
/* @internal */ endFlowNode?: FlowNode;
35483549
}
35493550

35503551
/* @internal */
Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js(1,1): error TS2323: Cannot redeclare exported variable 'apply'.
2-
tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js(3,1): error TS2322: Type '() => void' is not assignable to type 'undefined'.
3-
tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js(3,1): error TS2323: Cannot redeclare exported variable 'apply'.
1+
tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js(3,1): error TS2722: Cannot invoke an object which is possibly 'undefined'.
42

53

6-
==== tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js (3 errors) ====
4+
==== tests/cases/conformance/salsa/test.js (0 errors) ====
5+
const { apply } = require('./moduleExportAliasDuplicateAlias')
6+
apply()
7+
8+
==== tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js (1 errors) ====
79
exports.apply = undefined;
8-
~~~~~~~~~~~~~
9-
!!! error TS2323: Cannot redeclare exported variable 'apply'.
1010
function a() { }
11-
exports.apply = a;
11+
exports.apply()
1212
~~~~~~~~~~~~~
13-
!!! error TS2322: Type '() => void' is not assignable to type 'undefined'.
14-
~~~~~~~~~~~~~
15-
!!! error TS2323: Cannot redeclare exported variable 'apply'.
13+
!!! error TS2722: Cannot invoke an object which is possibly 'undefined'.
14+
exports.apply = a;
15+
exports.apply()
1616

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,32 @@
1+
//// [tests/cases/conformance/salsa/moduleExportDuplicateAlias.ts] ////
2+
13
//// [moduleExportAliasDuplicateAlias.js]
24
exports.apply = undefined;
35
function a() { }
6+
exports.apply()
47
exports.apply = a;
8+
exports.apply()
9+
10+
//// [test.js]
11+
const { apply } = require('./moduleExportAliasDuplicateAlias')
12+
apply()
513

614

715
//// [moduleExportAliasDuplicateAlias.js]
16+
"use strict";
817
exports.apply = undefined;
918
function a() { }
19+
exports.apply();
1020
exports.apply = a;
21+
exports.apply();
22+
//// [test.js]
23+
"use strict";
24+
var apply = require('./moduleExportAliasDuplicateAlias').apply;
25+
apply();
1126

1227

1328
//// [moduleExportAliasDuplicateAlias.d.ts]
14-
export { undefined as apply };
29+
export { a as apply };
30+
declare function a(): void;
31+
//// [test.d.ts]
32+
export {};
Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,35 @@
1+
=== tests/cases/conformance/salsa/test.js ===
2+
const { apply } = require('./moduleExportAliasDuplicateAlias')
3+
>apply : Symbol(apply, Decl(test.js, 0, 7))
4+
>require : Symbol(require)
5+
>'./moduleExportAliasDuplicateAlias' : Symbol("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias", Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
6+
7+
apply()
8+
>apply : Symbol(apply, Decl(test.js, 0, 7))
9+
110
=== tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js ===
211
exports.apply = undefined;
3-
>exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16))
4-
>exports : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16))
5-
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16))
6-
>undefined : Symbol(apply)
12+
>exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 2, 15))
13+
>exports : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 2, 15))
14+
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 2, 15))
15+
>undefined : Symbol(undefined)
716

817
function a() { }
918
>a : Symbol(a, Decl(moduleExportAliasDuplicateAlias.js, 0, 26))
1019

20+
exports.apply()
21+
>exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 2, 15))
22+
>exports : Symbol("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias", Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
23+
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 2, 15))
24+
1125
exports.apply = a;
12-
>exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16))
13-
>exports : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16))
14-
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16))
26+
>exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 2, 15))
27+
>exports : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 2, 15))
28+
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 2, 15))
1529
>a : Symbol(a, Decl(moduleExportAliasDuplicateAlias.js, 0, 26))
1630

31+
exports.apply()
32+
>exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 2, 15))
33+
>exports : Symbol("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias", Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
34+
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 2, 15))
35+
Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,41 @@
1+
=== tests/cases/conformance/salsa/test.js ===
2+
const { apply } = require('./moduleExportAliasDuplicateAlias')
3+
>apply : () => void
4+
>require('./moduleExportAliasDuplicateAlias') : typeof import("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias")
5+
>require : any
6+
>'./moduleExportAliasDuplicateAlias' : "./moduleExportAliasDuplicateAlias"
7+
8+
apply()
9+
>apply() : void
10+
>apply : () => void
11+
112
=== tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js ===
213
exports.apply = undefined;
314
>exports.apply = undefined : undefined
4-
>exports.apply : undefined
15+
>exports.apply : any
516
>exports : typeof import("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias")
6-
>apply : undefined
17+
>apply : any
718
>undefined : undefined
819

920
function a() { }
1021
>a : () => void
1122

12-
exports.apply = a;
13-
>exports.apply = a : () => void
23+
exports.apply()
24+
>exports.apply() : any
1425
>exports.apply : undefined
1526
>exports : typeof import("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias")
1627
>apply : undefined
28+
29+
exports.apply = a;
30+
>exports.apply = a : () => void
31+
>exports.apply : any
32+
>exports : typeof import("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias")
33+
>apply : any
1734
>a : () => void
1835

36+
exports.apply()
37+
>exports.apply() : void
38+
>exports.apply : () => void
39+
>exports : typeof import("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias")
40+
>apply : () => void
41+
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//// [tests/cases/conformance/salsa/moduleExportDuplicateAlias2.ts] ////
2+
3+
//// [moduleExportAliasDuplicateAlias.js]
4+
module.exports.apply = undefined;
5+
function a() { }
6+
module.exports.apply = a;
7+
module.exports.apply = a;
8+
module.exports.apply()
9+
10+
//// [test.js]
11+
const { apply } = require('./moduleExportAliasDuplicateAlias')
12+
apply()
13+
14+
15+
//// [moduleExportAliasDuplicateAlias.js]
16+
"use strict";
17+
module.exports.apply = undefined;
18+
function a() { }
19+
module.exports.apply = a;
20+
module.exports.apply = a;
21+
module.exports.apply();
22+
//// [test.js]
23+
"use strict";
24+
var apply = require('./moduleExportAliasDuplicateAlias').apply;
25+
apply();
26+
27+
28+
//// [moduleExportAliasDuplicateAlias.d.ts]
29+
export { a as apply };
30+
declare function a(): void;
31+
//// [test.d.ts]
32+
export {};
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
=== tests/cases/conformance/salsa/test.js ===
2+
const { apply } = require('./moduleExportAliasDuplicateAlias')
3+
>apply : Symbol(apply, Decl(test.js, 0, 7))
4+
>require : Symbol(require)
5+
>'./moduleExportAliasDuplicateAlias' : Symbol("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias", Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
6+
7+
apply()
8+
>apply : Symbol(apply, Decl(test.js, 0, 7))
9+
10+
=== tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js ===
11+
module.exports.apply = undefined;
12+
>module.exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16), Decl(moduleExportAliasDuplicateAlias.js, 2, 25))
13+
>module.exports : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16), Decl(moduleExportAliasDuplicateAlias.js, 2, 25))
14+
>module : Symbol(module, Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
15+
>exports : Symbol(module.exports, Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
16+
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16), Decl(moduleExportAliasDuplicateAlias.js, 2, 25))
17+
>undefined : Symbol(undefined)
18+
19+
function a() { }
20+
>a : Symbol(a, Decl(moduleExportAliasDuplicateAlias.js, 0, 33))
21+
22+
module.exports.apply = a;
23+
>module.exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16), Decl(moduleExportAliasDuplicateAlias.js, 2, 25))
24+
>module.exports : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16), Decl(moduleExportAliasDuplicateAlias.js, 2, 25))
25+
>module : Symbol(module, Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
26+
>exports : Symbol(module.exports, Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
27+
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16), Decl(moduleExportAliasDuplicateAlias.js, 2, 25))
28+
>a : Symbol(a, Decl(moduleExportAliasDuplicateAlias.js, 0, 33))
29+
30+
module.exports.apply = a;
31+
>module.exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16), Decl(moduleExportAliasDuplicateAlias.js, 2, 25))
32+
>module.exports : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16), Decl(moduleExportAliasDuplicateAlias.js, 2, 25))
33+
>module : Symbol(module, Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
34+
>exports : Symbol(module.exports, Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
35+
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16), Decl(moduleExportAliasDuplicateAlias.js, 2, 25))
36+
>a : Symbol(a, Decl(moduleExportAliasDuplicateAlias.js, 0, 33))
37+
38+
module.exports.apply()
39+
>module.exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16), Decl(moduleExportAliasDuplicateAlias.js, 2, 25))
40+
>module.exports : Symbol(module.exports, Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
41+
>module : Symbol(module, Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
42+
>exports : Symbol(module.exports, Decl(moduleExportAliasDuplicateAlias.js, 0, 0))
43+
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16), Decl(moduleExportAliasDuplicateAlias.js, 2, 25))
44+
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
=== tests/cases/conformance/salsa/test.js ===
2+
const { apply } = require('./moduleExportAliasDuplicateAlias')
3+
>apply : () => void
4+
>require('./moduleExportAliasDuplicateAlias') : typeof import("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias")
5+
>require : any
6+
>'./moduleExportAliasDuplicateAlias' : "./moduleExportAliasDuplicateAlias"
7+
8+
apply()
9+
>apply() : void
10+
>apply : () => void
11+
12+
=== tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js ===
13+
module.exports.apply = undefined;
14+
>module.exports.apply = undefined : undefined
15+
>module.exports.apply : any
16+
>module.exports : typeof module.exports
17+
>module : { exports: typeof module.exports; }
18+
>exports : typeof module.exports
19+
>apply : any
20+
>undefined : undefined
21+
22+
function a() { }
23+
>a : () => void
24+
25+
module.exports.apply = a;
26+
>module.exports.apply = a : () => void
27+
>module.exports.apply : any
28+
>module.exports : typeof module.exports
29+
>module : { exports: typeof module.exports; }
30+
>exports : typeof module.exports
31+
>apply : any
32+
>a : () => void
33+
34+
module.exports.apply = a;
35+
>module.exports.apply = a : () => void
36+
>module.exports.apply : any
37+
>module.exports : typeof module.exports
38+
>module : { exports: typeof module.exports; }
39+
>exports : typeof module.exports
40+
>apply : any
41+
>a : () => void
42+
43+
module.exports.apply()
44+
>module.exports.apply() : void
45+
>module.exports.apply : () => void
46+
>module.exports : typeof module.exports
47+
>module : { exports: typeof module.exports; }
48+
>exports : typeof module.exports
49+
>apply : () => void
50+

0 commit comments

Comments
 (0)