Skip to content

Commit aba932a

Browse files
authored
Create synthetic exports symbol for commonjs module (#42655)
* Commonjs module:create synthetic exports symbol Previously, the `module` identifier in commonjs modules got a synthetic type with a single property `exports`. The exports property reused the file's symbol, which, for a module file, gives the correct exported properties. However, the name of this symbol was still the filename of the file, not `exports`. This PR creates a synthetic symbol for `exports` by copying in a similar way to esModuleInterop's `default` symbol in `resolveESModuleSymbol` (although the intent there is to strip off signatures from the symbol). * correct parent of synthetic symbol
1 parent 79ed041 commit aba932a

File tree

229 files changed

+875
-852
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

229 files changed

+875
-852
lines changed

src/compiler/checker.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8768,8 +8768,15 @@ namespace ts {
87688768
}
87698769
if (symbol.flags & SymbolFlags.ModuleExports) {
87708770
const fileSymbol = getSymbolOfNode(getSourceFileOfNode(symbol.valueDeclaration));
8771+
const result = createSymbol(fileSymbol.flags, "exports" as __String);
8772+
result.declarations = fileSymbol.declarations ? fileSymbol.declarations.slice() : [];
8773+
result.parent = symbol;
8774+
result.target = fileSymbol;
8775+
if (fileSymbol.valueDeclaration) result.valueDeclaration = fileSymbol.valueDeclaration;
8776+
if (fileSymbol.members) result.members = new Map(fileSymbol.members);
8777+
if (fileSymbol.exports) result.exports = new Map(fileSymbol.exports);
87718778
const members = createSymbolTable();
8772-
members.set("exports" as __String, fileSymbol);
8779+
members.set("exports" as __String, result);
87738780
return createAnonymousType(symbol, members, emptyArray, emptyArray, undefined, undefined);
87748781
}
87758782
// Handle catch clause variables

tests/baselines/reference/binderUninitializedModuleExportsAssignment.symbols

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ var loop2 = loop1;
88
>loop1 : Symbol(loop1, Decl(loop.js, 0, 3))
99

1010
module.exports = loop2;
11-
>module.exports : Symbol("tests/cases/conformance/salsa/loop", Decl(loop.js, 0, 0))
11+
>module.exports : Symbol(module.exports, Decl(loop.js, 0, 0))
1212
>module : Symbol(export=, Decl(loop.js, 1, 18))
1313
>exports : Symbol(export=, Decl(loop.js, 1, 18))
1414
>loop2 : Symbol(loop2, Decl(loop.js, 1, 3))

tests/baselines/reference/binderUninitializedModuleExportsAssignment.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ var loop2 = loop1;
1010
module.exports = loop2;
1111
>module.exports = loop2 : any
1212
>module.exports : any
13-
>module : { "\"tests/cases/conformance/salsa/loop\"": any; }
13+
>module : { exports: any; }
1414
>exports : any
1515
>loop2 : any
1616

tests/baselines/reference/callbackCrossModule.symbols

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* @return {any} I don't even know what this should return
55
*/
66
module.exports = C
7-
>module.exports : Symbol("tests/cases/conformance/jsdoc/mod1", Decl(mod1.js, 0, 0))
7+
>module.exports : Symbol(module.exports, Decl(mod1.js, 0, 0))
88
>module : Symbol(export=, Decl(mod1.js, 0, 0))
99
>exports : Symbol(export=, Decl(mod1.js, 0, 0))
1010
>C : Symbol(C, Decl(mod1.js, 4, 18))

tests/baselines/reference/callbackCrossModule.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
module.exports = C
77
>module.exports = C : typeof C
88
>module.exports : typeof C
9-
>module : { "\"tests/cases/conformance/jsdoc/mod1\"": typeof C; }
9+
>module : { exports: typeof C; }
1010
>exports : typeof C
1111
>C : typeof C
1212

tests/baselines/reference/checkExportsObjectAssignProperty.symbols

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -202,9 +202,9 @@ Object.defineProperty(module.exports, "thing", { value: "yes", writable: true })
202202
>Object.defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
203203
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
204204
>defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
205-
>module.exports : Symbol("tests/cases/conformance/jsdoc/mod2", Decl(mod2.js, 0, 0))
205+
>module.exports : Symbol(module.exports, Decl(mod2.js, 0, 0))
206206
>module : Symbol(module, Decl(mod2.js, 0, 22))
207-
>exports : Symbol("tests/cases/conformance/jsdoc/mod2", Decl(mod2.js, 0, 0))
207+
>exports : Symbol(module.exports, Decl(mod2.js, 0, 0))
208208
>"thing" : Symbol(thing, Decl(mod2.js, 0, 0))
209209
>value : Symbol(value, Decl(mod2.js, 0, 48))
210210
>writable : Symbol(writable, Decl(mod2.js, 0, 62))
@@ -213,9 +213,9 @@ Object.defineProperty(module.exports, "readonlyProp", { value: "Smith", writable
213213
>Object.defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
214214
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
215215
>defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
216-
>module.exports : Symbol("tests/cases/conformance/jsdoc/mod2", Decl(mod2.js, 0, 0))
216+
>module.exports : Symbol(module.exports, Decl(mod2.js, 0, 0))
217217
>module : Symbol(module, Decl(mod2.js, 0, 22))
218-
>exports : Symbol("tests/cases/conformance/jsdoc/mod2", Decl(mod2.js, 0, 0))
218+
>exports : Symbol(module.exports, Decl(mod2.js, 0, 0))
219219
>"readonlyProp" : Symbol(readonlyProp, Decl(mod2.js, 0, 81))
220220
>value : Symbol(value, Decl(mod2.js, 1, 55))
221221
>writable : Symbol(writable, Decl(mod2.js, 1, 71))
@@ -224,9 +224,9 @@ Object.defineProperty(module.exports, "rwAccessors", { get() { return 98122 }, s
224224
>Object.defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
225225
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
226226
>defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
227-
>module.exports : Symbol("tests/cases/conformance/jsdoc/mod2", Decl(mod2.js, 0, 0))
227+
>module.exports : Symbol(module.exports, Decl(mod2.js, 0, 0))
228228
>module : Symbol(module, Decl(mod2.js, 0, 22))
229-
>exports : Symbol("tests/cases/conformance/jsdoc/mod2", Decl(mod2.js, 0, 0))
229+
>exports : Symbol(module.exports, Decl(mod2.js, 0, 0))
230230
>"rwAccessors" : Symbol(rwAccessors, Decl(mod2.js, 1, 91))
231231
>get : Symbol(get, Decl(mod2.js, 2, 54))
232232
>set : Symbol(set, Decl(mod2.js, 2, 78))
@@ -236,19 +236,19 @@ Object.defineProperty(module.exports, "readonlyAccessor", { get() { return 21.75
236236
>Object.defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
237237
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
238238
>defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
239-
>module.exports : Symbol("tests/cases/conformance/jsdoc/mod2", Decl(mod2.js, 0, 0))
239+
>module.exports : Symbol(module.exports, Decl(mod2.js, 0, 0))
240240
>module : Symbol(module, Decl(mod2.js, 0, 22))
241-
>exports : Symbol("tests/cases/conformance/jsdoc/mod2", Decl(mod2.js, 0, 0))
241+
>exports : Symbol(module.exports, Decl(mod2.js, 0, 0))
242242
>"readonlyAccessor" : Symbol(readonlyAccessor, Decl(mod2.js, 2, 104))
243243
>get : Symbol(get, Decl(mod2.js, 3, 59))
244244

245245
Object.defineProperty(module.exports, "setonlyAccessor", {
246246
>Object.defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
247247
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
248248
>defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
249-
>module.exports : Symbol("tests/cases/conformance/jsdoc/mod2", Decl(mod2.js, 0, 0))
249+
>module.exports : Symbol(module.exports, Decl(mod2.js, 0, 0))
250250
>module : Symbol(module, Decl(mod2.js, 0, 22))
251-
>exports : Symbol("tests/cases/conformance/jsdoc/mod2", Decl(mod2.js, 0, 0))
251+
>exports : Symbol(module.exports, Decl(mod2.js, 0, 0))
252252
>"setonlyAccessor" : Symbol(setonlyAccessor, Decl(mod2.js, 3, 86))
253253

254254
/** @param {string} str */

tests/baselines/reference/checkExportsObjectAssignProperty.types

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -255,9 +255,9 @@ Object.defineProperty(module.exports, "thing", { value: "yes", writable: true })
255255
>Object.defineProperty : (o: any, p: PropertyKey, attributes: PropertyDescriptor & ThisType<any>) => any
256256
>Object : ObjectConstructor
257257
>defineProperty : (o: any, p: PropertyKey, attributes: PropertyDescriptor & ThisType<any>) => any
258-
>module.exports : typeof import("tests/cases/conformance/jsdoc/mod2")
259-
>module : { "\"tests/cases/conformance/jsdoc/mod2\"": typeof import("tests/cases/conformance/jsdoc/mod2"); }
260-
>exports : typeof import("tests/cases/conformance/jsdoc/mod2")
258+
>module.exports : typeof module.exports
259+
>module : { exports: typeof module.exports; }
260+
>exports : typeof module.exports
261261
>"thing" : "thing"
262262
>{ value: "yes", writable: true } : { value: string; writable: true; }
263263
>value : string
@@ -270,9 +270,9 @@ Object.defineProperty(module.exports, "readonlyProp", { value: "Smith", writable
270270
>Object.defineProperty : (o: any, p: PropertyKey, attributes: PropertyDescriptor & ThisType<any>) => any
271271
>Object : ObjectConstructor
272272
>defineProperty : (o: any, p: PropertyKey, attributes: PropertyDescriptor & ThisType<any>) => any
273-
>module.exports : typeof import("tests/cases/conformance/jsdoc/mod2")
274-
>module : { "\"tests/cases/conformance/jsdoc/mod2\"": typeof import("tests/cases/conformance/jsdoc/mod2"); }
275-
>exports : typeof import("tests/cases/conformance/jsdoc/mod2")
273+
>module.exports : typeof module.exports
274+
>module : { exports: typeof module.exports; }
275+
>exports : typeof module.exports
276276
>"readonlyProp" : "readonlyProp"
277277
>{ value: "Smith", writable: false } : { value: string; writable: false; }
278278
>value : string
@@ -285,9 +285,9 @@ Object.defineProperty(module.exports, "rwAccessors", { get() { return 98122 }, s
285285
>Object.defineProperty : (o: any, p: PropertyKey, attributes: PropertyDescriptor & ThisType<any>) => any
286286
>Object : ObjectConstructor
287287
>defineProperty : (o: any, p: PropertyKey, attributes: PropertyDescriptor & ThisType<any>) => any
288-
>module.exports : typeof import("tests/cases/conformance/jsdoc/mod2")
289-
>module : { "\"tests/cases/conformance/jsdoc/mod2\"": typeof import("tests/cases/conformance/jsdoc/mod2"); }
290-
>exports : typeof import("tests/cases/conformance/jsdoc/mod2")
288+
>module.exports : typeof module.exports
289+
>module : { exports: typeof module.exports; }
290+
>exports : typeof module.exports
291291
>"rwAccessors" : "rwAccessors"
292292
>{ get() { return 98122 }, set(_) { /*ignore*/ } } : { get(): number; set(_: any): void; }
293293
>get : () => number
@@ -300,9 +300,9 @@ Object.defineProperty(module.exports, "readonlyAccessor", { get() { return 21.75
300300
>Object.defineProperty : (o: any, p: PropertyKey, attributes: PropertyDescriptor & ThisType<any>) => any
301301
>Object : ObjectConstructor
302302
>defineProperty : (o: any, p: PropertyKey, attributes: PropertyDescriptor & ThisType<any>) => any
303-
>module.exports : typeof import("tests/cases/conformance/jsdoc/mod2")
304-
>module : { "\"tests/cases/conformance/jsdoc/mod2\"": typeof import("tests/cases/conformance/jsdoc/mod2"); }
305-
>exports : typeof import("tests/cases/conformance/jsdoc/mod2")
303+
>module.exports : typeof module.exports
304+
>module : { exports: typeof module.exports; }
305+
>exports : typeof module.exports
306306
>"readonlyAccessor" : "readonlyAccessor"
307307
>{ get() { return 21.75 } } : { get(): number; }
308308
>get : () => number
@@ -313,9 +313,9 @@ Object.defineProperty(module.exports, "setonlyAccessor", {
313313
>Object.defineProperty : (o: any, p: PropertyKey, attributes: PropertyDescriptor & ThisType<any>) => any
314314
>Object : ObjectConstructor
315315
>defineProperty : (o: any, p: PropertyKey, attributes: PropertyDescriptor & ThisType<any>) => any
316-
>module.exports : typeof import("tests/cases/conformance/jsdoc/mod2")
317-
>module : { "\"tests/cases/conformance/jsdoc/mod2\"": typeof import("tests/cases/conformance/jsdoc/mod2"); }
318-
>exports : typeof import("tests/cases/conformance/jsdoc/mod2")
316+
>module.exports : typeof module.exports
317+
>module : { exports: typeof module.exports; }
318+
>exports : typeof module.exports
319319
>"setonlyAccessor" : "setonlyAccessor"
320320
>{ /** @param {string} str */ set(str) { this.rwAccessors = Number(str) }} : { set(str: string): void; }
321321

tests/baselines/reference/checkExportsObjectAssignPrototypeProperty.symbols

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ Object.defineProperty(Person.prototype, "setonlyAccessor", {
170170
}
171171
});
172172
module.exports = Person;
173-
>module.exports : Symbol("tests/cases/conformance/jsdoc/mod1", Decl(mod1.js, 0, 0))
173+
>module.exports : Symbol(module.exports, Decl(mod1.js, 0, 0))
174174
>module : Symbol(export=, Decl(mod1.js, 19, 3))
175175
>exports : Symbol(export=, Decl(mod1.js, 19, 3))
176176
>Person : Symbol(Person, Decl(mod1.js, 0, 0))

tests/baselines/reference/checkExportsObjectAssignPrototypeProperty.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ Object.defineProperty(Person.prototype, "setonlyAccessor", {
214214
module.exports = Person;
215215
>module.exports = Person : typeof Person
216216
>module.exports : typeof Person
217-
>module : { "\"tests/cases/conformance/jsdoc/mod1\"": typeof Person; }
217+
>module : { exports: typeof Person; }
218218
>exports : typeof Person
219219
>Person : typeof Person
220220

tests/baselines/reference/checkJsTypeDefNoUnusedLocalMarked.symbols

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export = Foo;
2222
/** @typedef {(foo: Foo) => string} FooFun */
2323

2424
module.exports = /** @type {FooFun} */(void 0);
25-
>module.exports : Symbol("tests/cases/compiler/something", Decl(something.js, 0, 0))
25+
>module.exports : Symbol(module.exports, Decl(something.js, 0, 0))
2626
>module : Symbol(export=, Decl(something.js, 0, 0))
2727
>exports : Symbol(export=, Decl(something.js, 0, 0))
2828

0 commit comments

Comments
 (0)