@@ -2,17 +2,12 @@ import * as ts from "typescript";
22import * as lua from "../../../LuaAST" ;
33import { assert } from "../../../utils" ;
44import { FunctionVisitor , TransformationContext } from "../../context" ;
5- import {
6- createDefaultExportExpression ,
7- createDefaultExportStringLiteral ,
8- createExportedIdentifier ,
9- } from "../../utils/export" ;
5+ import { createDefaultExportExpression , createDefaultExportStringLiteral } from "../../utils/export" ;
106import { createExportsIdentifier } from "../../utils/lua-ast" ;
11- import { ScopeType } from "../../utils/scope" ;
12- import { transformScopeBlock } from "../block" ;
13- import { transformIdentifier } from "../identifier" ;
14- import { createShorthandIdentifier } from "../literal" ;
7+ import { createShorthandIdentifier , transformPropertyName } from "../literal" ;
158import { createModuleRequire } from "./import" ;
9+ import { createSafeName } from "../../utils/safe-names" ;
10+ import * as path from "path" ;
1611
1712export const transformExportAssignment : FunctionVisitor < ts . ExportAssignment > = ( node , context ) => {
1813 if ( ! context . resolver . isValueAliasDeclaration ( node ) ) {
@@ -101,20 +96,37 @@ function transformExportAll(context: TransformationContext, node: ts.ExportDecla
10196}
10297
10398const isDefaultExportSpecifier = ( node : ts . ExportSpecifier ) =>
104- ( node . name && ts . identifierToKeywordKind ( node . name ) === ts . SyntaxKind . DefaultKeyword ) ||
105- ( node . propertyName && ts . identifierToKeywordKind ( node . propertyName ) === ts . SyntaxKind . DefaultKeyword ) ;
99+ ( node . name &&
100+ ts . isIdentifier ( node . name ) &&
101+ ts . identifierToKeywordKind ( node . name ) === ts . SyntaxKind . DefaultKeyword ) ||
102+ ( node . propertyName &&
103+ ts . isIdentifier ( node . propertyName ) &&
104+ ts . identifierToKeywordKind ( node . propertyName ) === ts . SyntaxKind . DefaultKeyword ) ;
106105
107106function transformExportSpecifier ( context : TransformationContext , node : ts . ExportSpecifier ) : lua . AssignmentStatement {
108- const exportedSymbol = context . checker . getExportSpecifierLocalTargetSymbol ( node ) ;
109- const exportedIdentifier = node . propertyName ? node . propertyName : node . name ;
110- const exportedExpression = createShorthandIdentifier ( context , exportedSymbol , exportedIdentifier ) ;
107+ const exportedName = node . name ;
108+ const exportedValue = node . propertyName ?? node . name ;
109+ let rhs : lua . Expression ;
110+ if ( ts . isIdentifier ( exportedValue ) ) {
111+ const exportedSymbol = context . checker . getExportSpecifierLocalTargetSymbol ( node ) ;
112+ rhs = createShorthandIdentifier ( context , exportedSymbol , exportedValue ) ;
113+ } else {
114+ rhs = lua . createStringLiteral ( exportedName . text , exportedValue ) ;
115+ }
111116
112- const isDefault = isDefaultExportSpecifier ( node ) ;
113- const exportAssignmentLeftHandSide = isDefault
114- ? createDefaultExportExpression ( node )
115- : createExportedIdentifier ( context , transformIdentifier ( context , node . name ) ) ;
117+ if ( isDefaultExportSpecifier ( node ) ) {
118+ const lhs = createDefaultExportExpression ( node ) ;
119+ return lua . createAssignmentStatement ( lhs , rhs , node ) ;
120+ } else {
121+ const exportsTable = createExportsIdentifier ( ) ;
122+ const lhs = lua . createTableIndexExpression (
123+ exportsTable ,
124+ lua . createStringLiteral ( exportedName . text ) ,
125+ exportedName
126+ ) ;
116127
117- return lua . createAssignmentStatement ( exportAssignmentLeftHandSide , exportedExpression , node ) ;
128+ return lua . createAssignmentStatement ( lhs , rhs , node ) ;
129+ }
118130}
119131
120132function transformExportSpecifiersFrom (
@@ -123,32 +135,32 @@ function transformExportSpecifiersFrom(
123135 moduleSpecifier : ts . Expression ,
124136 exportSpecifiers : ts . ExportSpecifier [ ]
125137) : lua . Statement {
126- // First transpile as import clause
127- const importClause = ts . factory . createImportClause (
128- false ,
129- undefined ,
130- ts . factory . createNamedImports (
131- exportSpecifiers . map ( s => ts . factory . createImportSpecifier ( statement . isTypeOnly , s . propertyName , s . name ) )
132- )
133- ) ;
138+ const result : lua . Statement [ ] = [ ] ;
134139
135- const importDeclaration = ts . factory . createImportDeclaration ( statement . modifiers , importClause , moduleSpecifier ) ;
140+ const importPath = ts . isStringLiteral ( moduleSpecifier ) ? moduleSpecifier . text . replace ( / " / g , "" ) : "module" ;
136141
137- // Wrap in block to prevent imports from hoisting out of `do` statement
138- const [ block ] = transformScopeBlock ( context , ts . factory . createBlock ( [ importDeclaration ] ) , ScopeType . Block ) ;
139- const result = block . statements ;
142+ // Create the require statement to extract values.
143+ // local ____module = require("module")
144+ const importUniqueName = lua . createIdentifier ( createSafeName ( path . basename ( importPath ) ) ) ;
145+ const requireCall = createModuleRequire ( context , moduleSpecifier ) ;
146+ result . push ( lua . createVariableDeclarationStatement ( importUniqueName , requireCall , statement ) ) ;
140147
141- // Now the module is imported, add the imports to the export table
142148 for ( const specifier of exportSpecifiers ) {
143- result . push (
144- lua . createAssignmentStatement (
145- createExportedIdentifier ( context , transformIdentifier ( context , specifier . name ) ) ,
146- transformIdentifier ( context , specifier . name )
147- )
149+ // Assign to exports table
150+ const exportsTable = createExportsIdentifier ( ) ;
151+ const exportedName = specifier . name ;
152+ const exportedNameTransformed = transformPropertyName ( context , exportedName ) ;
153+ const lhs = lua . createTableIndexExpression ( exportsTable , exportedNameTransformed , exportedName ) ;
154+
155+ const exportedValue = specifier . propertyName ?? specifier . name ;
156+ const rhs = lua . createTableIndexExpression (
157+ lua . cloneIdentifier ( importUniqueName ) ,
158+ transformPropertyName ( context , exportedValue ) ,
159+ specifier
148160 ) ;
161+ result . push ( lua . createAssignmentStatement ( lhs , rhs , specifier ) ) ;
149162 }
150163
151- // Wrap this in a DoStatement to prevent polluting the scope.
152164 return lua . createDoStatement ( result , statement ) ;
153165}
154166
0 commit comments