diff --git a/package-lock.json b/package-lock.json index 422ce67e9..164ef86fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5084,9 +5084,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "node_modules/ms": { @@ -10320,9 +10320,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "ms": { diff --git a/src/transformation/builtins/promise.ts b/src/transformation/builtins/promise.ts index cd30aa718..11d80d45c 100644 --- a/src/transformation/builtins/promise.ts +++ b/src/transformation/builtins/promise.ts @@ -44,7 +44,7 @@ export function transformPromiseConstructorCall( } } -function createStaticPromiseFunctionAccessor(functionName: string, node: ts.Node) { +export function createStaticPromiseFunctionAccessor(functionName: string, node: ts.Node) { return lua.createTableIndexExpression( lua.createIdentifier("__TS__Promise"), lua.createStringLiteral(functionName), diff --git a/src/transformation/visitors/call.ts b/src/transformation/visitors/call.ts index b59b3889e..58eb29eab 100644 --- a/src/transformation/visitors/call.ts +++ b/src/transformation/visitors/call.ts @@ -15,6 +15,7 @@ import { moveToPrecedingTemp, transformExpressionList } from "./expression-list" import { transformInPrecedingStatementScope } from "../utils/preceding-statements"; import { getOptionalContinuationData, transformOptionalChain } from "./optional-chaining"; import { transformLanguageExtensionCallExpression } from "./language-extensions"; +import { transformImportExpression } from "./modules/import"; export type PropertyCallExpression = ts.CallExpression & { expression: ts.PropertyAccessExpression }; @@ -210,6 +211,10 @@ function transformElementCall(context: TransformationContext, node: ts.CallExpre } export const transformCallExpression: FunctionVisitor = (node, context) => { + if (node.expression.kind === ts.SyntaxKind.ImportKeyword) { + return transformImportExpression(node, context); + } + if (ts.isOptionalChain(node)) { return transformOptionalChain(context, node); } diff --git a/src/transformation/visitors/modules/import.ts b/src/transformation/visitors/modules/import.ts index a9a53f4e4..7a320d558 100644 --- a/src/transformation/visitors/modules/import.ts +++ b/src/transformation/visitors/modules/import.ts @@ -1,10 +1,12 @@ import * as path from "path"; import * as ts from "typescript"; import * as lua from "../../../LuaAST"; +import { createStaticPromiseFunctionAccessor } from "../../builtins/promise"; import { FunctionVisitor, TransformationContext } from "../../context"; import { AnnotationKind, getSymbolAnnotations } from "../../utils/annotations"; import { createDefaultExportStringLiteral } from "../../utils/export"; import { createHoistableVariableDeclarationStatement } from "../../utils/lua-ast"; +import { importLuaLibFeature, LuaLibFeature } from "../../utils/lualib"; import { createSafeName } from "../../utils/safe-names"; import { peekScope } from "../../utils/scope"; import { transformIdentifier } from "../identifier"; @@ -161,3 +163,10 @@ export const transformImportEqualsDeclaration: FunctionVisitor = (node, context) => { + importLuaLibFeature(context, LuaLibFeature.Promise); + + const importPath = node.arguments.map(a => context.transformExpression(a)); + return lua.createCallExpression(createStaticPromiseFunctionAccessor("resolve", node), importPath, node); +}; diff --git a/test/cli/run.ts b/test/cli/run.ts index cee7e19b2..652e03095 100644 --- a/test/cli/run.ts +++ b/test/cli/run.ts @@ -1,7 +1,7 @@ import { ChildProcess, fork } from "child_process"; import * as path from "path"; -jest.setTimeout(20000); +jest.setTimeout(30000); const cliPath = path.join(__dirname, "../../src/tstl.ts"); diff --git a/test/unit/modules/modules.spec.ts b/test/unit/modules/modules.spec.ts index ffdc36ce9..73f7c5be1 100644 --- a/test/unit/modules/modules.spec.ts +++ b/test/unit/modules/modules.spec.ts @@ -280,3 +280,14 @@ test("namespace export with unsafe Lua name", () => { .addExtraFile("module.ts", moduleFile) .expectToMatchJsResult(); }); + +test("import expression", () => { + util.testModule` + let result; + import("./module").then(m => { result = m.foo(); }); + export { result }; + ` + .addExtraFile("module.ts", 'export function foo() { return "foo"; }') + .setOptions({ module: ts.ModuleKind.ESNext }) + .expectToMatchJsResult(); +});