Skip to content

Commit 4037f3a

Browse files
authored
Actually transform KindCommonJSExport in declaration emit (#1962)
1 parent ca68e0b commit 4037f3a

File tree

62 files changed

+438
-333
lines changed

Some content is hidden

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

62 files changed

+438
-333
lines changed

internal/transformers/declarations/transform.go

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,8 @@ func (tx *DeclarationTransformer) visit(node *ast.Node) *ast.Node {
120120
ast.KindJSImportDeclaration,
121121
ast.KindExportDeclaration,
122122
ast.KindJSExportAssignment,
123-
ast.KindExportAssignment:
123+
ast.KindExportAssignment,
124+
ast.KindCommonJSExport:
124125
return tx.visitDeclarationStatements(node)
125126
// statements we elide
126127
case ast.KindBreakStatement,
@@ -924,6 +925,80 @@ func (tx *DeclarationTransformer) visitDeclarationStatements(input *ast.Node) *a
924925
tx.rewriteModuleSpecifier(input, input.AsExportDeclaration().ModuleSpecifier),
925926
tx.tryGetResolutionModeOverride(input.AsExportDeclaration().Attributes),
926927
)
928+
case ast.KindCommonJSExport:
929+
if ast.IsSourceFile(input.Parent) {
930+
tx.resultHasExternalModuleIndicator = true
931+
}
932+
tx.resultHasScopeMarker = true
933+
name := input.AsCommonJSExport().Name()
934+
if ast.IsIdentifier(name) {
935+
if name.AsIdentifier().Text == "default" {
936+
// const _default: Type; export default _default;
937+
newId := tx.Factory().NewUniqueNameEx("_default", printer.AutoGenerateOptions{Flags: printer.GeneratedIdentifierFlagsOptimistic})
938+
tx.state.getSymbolAccessibilityDiagnostic = func(_ printer.SymbolAccessibilityResult) *SymbolAccessibilityDiagnostic {
939+
return &SymbolAccessibilityDiagnostic{
940+
diagnosticMessage: diagnostics.Default_export_of_the_module_has_or_is_using_private_name_0,
941+
errorNode: input,
942+
}
943+
}
944+
tx.tracker.PushErrorFallbackNode(input)
945+
type_ := tx.ensureType(input, false)
946+
varDecl := tx.Factory().NewVariableDeclaration(newId, nil, type_, nil)
947+
tx.tracker.PopErrorFallbackNode()
948+
var modList *ast.ModifierList
949+
if tx.needsDeclare {
950+
modList = tx.Factory().NewModifierList([]*ast.Node{tx.Factory().NewModifier(ast.KindDeclareKeyword)})
951+
} else {
952+
modList = tx.Factory().NewModifierList([]*ast.Node{})
953+
}
954+
statement := tx.Factory().NewVariableStatement(modList, tx.Factory().NewVariableDeclarationList(ast.NodeFlagsConst, tx.Factory().NewNodeList([]*ast.Node{varDecl})))
955+
956+
assignment := tx.Factory().NewExportAssignment(input.Modifiers(), false, nil, newId)
957+
// Remove comments from the export declaration and copy them onto the synthetic _default declaration
958+
tx.preserveJsDoc(statement, input)
959+
tx.removeAllComments(assignment)
960+
return tx.Factory().NewSyntaxList([]*ast.Node{statement, assignment})
961+
} else {
962+
// export var name: Type
963+
tx.tracker.PushErrorFallbackNode(input)
964+
type_ := tx.ensureType(input, false)
965+
varDecl := tx.Factory().NewVariableDeclaration(name, nil, type_, nil)
966+
tx.tracker.PopErrorFallbackNode()
967+
var modList *ast.ModifierList
968+
if tx.needsDeclare {
969+
modList = tx.Factory().NewModifierList([]*ast.Node{tx.Factory().NewModifier(ast.KindExportKeyword), tx.Factory().NewModifier(ast.KindDeclareKeyword)})
970+
} else {
971+
modList = tx.Factory().NewModifierList([]*ast.Node{tx.Factory().NewModifier(ast.KindExportKeyword)})
972+
}
973+
return tx.Factory().NewVariableStatement(modList, tx.Factory().NewVariableDeclarationList(ast.NodeFlagsNone, tx.Factory().NewNodeList([]*ast.Node{varDecl})))
974+
}
975+
} else {
976+
// const _exported: Type; export {_exported as "name"};
977+
newId := tx.Factory().NewUniqueNameEx("_exported", printer.AutoGenerateOptions{Flags: printer.GeneratedIdentifierFlagsOptimistic})
978+
tx.state.getSymbolAccessibilityDiagnostic = func(_ printer.SymbolAccessibilityResult) *SymbolAccessibilityDiagnostic {
979+
return &SymbolAccessibilityDiagnostic{
980+
diagnosticMessage: diagnostics.Default_export_of_the_module_has_or_is_using_private_name_0,
981+
errorNode: input,
982+
}
983+
}
984+
tx.tracker.PushErrorFallbackNode(input)
985+
type_ := tx.ensureType(input, false)
986+
varDecl := tx.Factory().NewVariableDeclaration(newId, nil, type_, nil)
987+
tx.tracker.PopErrorFallbackNode()
988+
var modList *ast.ModifierList
989+
if tx.needsDeclare {
990+
modList = tx.Factory().NewModifierList([]*ast.Node{tx.Factory().NewModifier(ast.KindDeclareKeyword)})
991+
} else {
992+
modList = tx.Factory().NewModifierList([]*ast.Node{})
993+
}
994+
statement := tx.Factory().NewVariableStatement(modList, tx.Factory().NewVariableDeclarationList(ast.NodeFlagsConst, tx.Factory().NewNodeList([]*ast.Node{varDecl})))
995+
996+
assignment := tx.Factory().NewExportDeclaration(nil, false, tx.Factory().NewNamedExports(tx.Factory().NewNodeList([]*ast.Node{tx.Factory().NewExportSpecifier(false, newId, name)})), nil, nil)
997+
// Remove comments from the export declaration and copy them onto the synthetic _default declaration
998+
tx.preserveJsDoc(statement, input)
999+
tx.removeAllComments(assignment)
1000+
return tx.Factory().NewSyntaxList([]*ast.Node{statement, assignment})
1001+
}
9271002
case ast.KindExportAssignment, ast.KindJSExportAssignment:
9281003
if ast.IsSourceFile(input.Parent) {
9291004
tx.resultHasExternalModuleIndicator = true

internal/transformers/declarations/util.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ func hasInferredType(node *ast.Node) bool {
6464
ast.KindPropertyAssignment,
6565
ast.KindShorthandPropertyAssignment,
6666
ast.KindJSDocParameterTag,
67-
ast.KindJSDocPropertyTag:
67+
ast.KindJSDocPropertyTag,
68+
ast.KindCommonJSExport:
6869
return true
6970
default:
7071
// assertType<never>(node); // !!!
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
//// [tests/cases/compiler/jsDeclarationExportDefaultAssignmentCrash.ts] ////
2+
3+
//// [index.js]
4+
exports.default = () => {
5+
return 1234;
6+
}
7+
8+
9+
//// [index.js]
10+
"use strict";
11+
Object.defineProperty(exports, "__esModule", { value: true });
12+
export var default = () => {
13+
return 1234;
14+
};
15+
exports.default = () => {
16+
return 1234;
17+
};
18+
19+
20+
//// [index.d.ts]
21+
declare const _default: () => number;
22+
export default _default;
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
//// [tests/cases/compiler/jsDeclarationExportDefaultAssignmentCrash.ts] ////
2+
3+
=== index.js ===
4+
exports.default = () => {
5+
>exports.default : Symbol(default, Decl(index.js, 0, 0))
6+
>exports : Symbol("index", Decl(index.js, 0, 0))
7+
>default : Symbol(default, Decl(index.js, 0, 0))
8+
9+
return 1234;
10+
}
11+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//// [tests/cases/compiler/jsDeclarationExportDefaultAssignmentCrash.ts] ////
2+
3+
=== index.js ===
4+
exports.default = () => {
5+
>exports.default = () => { return 1234;} : () => number
6+
>exports.default : () => number
7+
>exports : typeof import("index")
8+
>default : () => number
9+
>() => { return 1234;} : () => number
10+
11+
return 1234;
12+
>1234 : 1234
13+
}
14+

testdata/baselines/reference/submodule/compiler/jsExportAssignmentNonMutableLocation.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,4 @@ declare const _default: {
1717
customSymbol: symbol;
1818
};
1919
export = _default;
20-
export var customSymbol2 = Symbol("custom");
20+
export declare var customSymbol2: symbol;

testdata/baselines/reference/submodule/compiler/jsExportAssignmentNonMutableLocation.js.diff

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@
1010
+ customSymbol: symbol;
1111
+};
1212
+export = _default;
13-
+export var customSymbol2 = Symbol("custom");
13+
+export declare var customSymbol2: symbol;

testdata/baselines/reference/submodule/compiler/modulePreserve4.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ export {}; // Silly test harness
198198

199199
//// [a.d.ts]
200200
export declare const x = 0;
201-
export var y = 0;
201+
export declare var y: number;
202202
//// [b.d.ts]
203203
declare const _default: number;
204204
export default _default;
@@ -217,16 +217,15 @@ export = _default;
217217
declare const _default: number;
218218
export default _default;
219219
//// [g.d.ts]
220-
export var default = 0;
221-
export {};
220+
declare const _default: number;
221+
export default _default;
222222
//// [main1.d.ts]
223223
export {};
224224
//// [main2.d.mts]
225225
export {};
226226
//// [main3.d.cts]
227227
export {};
228228
//// [main4.d.cts]
229-
export var x = require("./g");
230-
export {};
229+
export declare var x: typeof import("./g");
231230
//// [dummy.d.ts]
232231
export {};

testdata/baselines/reference/submodule/compiler/modulePreserve4.js.diff

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
//// [a.d.ts]
3131
-export const x: 0;
3232
+export declare const x = 0;
33-
+export var y = 0;
33+
+export declare var y: number;
3434
//// [b.d.ts]
3535
-declare const _default: 0;
3636
+declare const _default: number;
@@ -50,18 +50,15 @@
5050
export default _default;
5151
//// [g.d.ts]
5252
-declare const _default: 0;
53-
-export default _default;
54-
+export var default = 0;
55-
+export {};
53+
+declare const _default: number;
54+
export default _default;
5655
//// [main1.d.ts]
5756
export {};
58-
//// [main2.d.mts]
5957
@@= skipped -15, +15 lines =@@
6058
//// [main3.d.cts]
6159
export {};
6260
//// [main4.d.cts]
6361
-export const x: typeof import("./g");
64-
+export var x = require("./g");
65-
+export {};
62+
+export declare var x: typeof import("./g");
6663
//// [dummy.d.ts]
6764
export {};

testdata/baselines/reference/submodule/conformance/assignmentToVoidZero1.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ exports.y = 2;
2121

2222

2323
//// [assignmentToVoidZero1.d.ts]
24-
export var y = exports.x = void 0;
25-
export var x = 1;
26-
export var y = 2;
27-
export {};
24+
export declare var y: undefined;
25+
export declare var x: number;
26+
export declare var y: undefined;

0 commit comments

Comments
 (0)