From 40225c0ef8a3c1e9adec5caa37c43578054b8f74 Mon Sep 17 00:00:00 2001 From: Tom Date: Fri, 27 Aug 2021 06:03:25 -0600 Subject: [PATCH 1/2] support for global $vararg in bundles fixes #1048 To emulate normal Lua functionality, the entry point receives the global vararg and sub-modules receive their own name when evaluating `$vararg` (`...`). --- src/transpilation/bundle.ts | 9 ++++---- test/unit/language-extensions/vararg.spec.ts | 24 ++++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/transpilation/bundle.ts b/src/transpilation/bundle.ts index 78e03a7a6..02eb73e30 100644 --- a/src/transpilation/bundle.ts +++ b/src/transpilation/bundle.ts @@ -16,12 +16,13 @@ const requireOverride = ` local ____modules = {} local ____moduleCache = {} local ____originalRequire = require -local function require(file) +local function require(file, ...) if ____moduleCache[file] then return ____moduleCache[file].value end if ____modules[file] then - ____moduleCache[file] = { value = ____modules[file]() } + local module = ____modules[file] + ____moduleCache[file] = { value = (select("#", ...) > 0) and module(...) or module(file) } return ____moduleCache[file].value else if ____originalRequire then @@ -55,7 +56,7 @@ export function getBundleResult(program: ts.Program, files: ProcessedFile[]): [t const moduleTable = createModuleTableNode(moduleTableEntries); // return require("") - const entryPoint = `return require(${createModulePath(entryModule, program)})\n`; + const entryPoint = `return require(${createModulePath(entryModule, program)}, ...)\n`; const sourceChunks = [requireOverride, moduleTable, entryPoint]; @@ -78,7 +79,7 @@ export function getBundleResult(program: ts.Program, files: ProcessedFile[]): [t } function moduleSourceNode({ code, sourceMapNode }: ProcessedFile, modulePath: string): SourceNode { - const tableEntryHead = `[${modulePath}] = function() `; + const tableEntryHead = `[${modulePath}] = function(...) `; const tableEntryTail = " end,\n"; return joinSourceChunks([tableEntryHead, sourceMapNode ?? code, tableEntryTail]); diff --git a/test/unit/language-extensions/vararg.spec.ts b/test/unit/language-extensions/vararg.spec.ts index 18872c161..171ca807c 100644 --- a/test/unit/language-extensions/vararg.spec.ts +++ b/test/unit/language-extensions/vararg.spec.ts @@ -6,6 +6,7 @@ test.each([ 'let result: string; { result = [...$vararg].join(""); }', 'let result: string; if (true) { result = [...$vararg].join(""); }', 'let result: string; do { result = [...$vararg].join(""); } while (false);', + 'function foo(...args: unknown[]) { return args.join(""); } const result = foo(...$vararg);', ])("$vararg valid use (%p)", statement => { util.testModule` ${statement} @@ -30,3 +31,26 @@ test.each([ .withLanguageExtensions() .expectDiagnosticsToMatchSnapshot([invalidVarargUse.code]); }); + +test("$vararg in bundle entry point", () => { + util.testModule` + export const result = [...$vararg].join(""); + ` + .setMainFileName("src/main.ts") + .setOptions({ rootDir: "src", luaBundle: "bundle.lua", luaBundleEntry: "src/main.ts" }) + .withLanguageExtensions() + .setLuaFactory(code => `return (function(...) ${code} end)("A", "B", "C", "D")`) + .expectToEqual({ result: "ABCD" }); +}); + +test("$vararg in bundle sub-module", () => { + util.testModule` + export { result } from "./module"; + ` + .setMainFileName("src/main.ts") + .addExtraFile("src/module.ts", 'export const result = [...$vararg].join("")') + .setOptions({ rootDir: "src", luaBundle: "bundle.lua", luaBundleEntry: "src/main.ts" }) + .withLanguageExtensions() + .setLuaFactory(code => `return (function(...) ${code} end)()`) + .expectToEqual({ result: "module" }); +}); From 9243814ea3c6da6a85f243dc26e471c58901aae0 Mon Sep 17 00:00:00 2001 From: Tom Date: Fri, 27 Aug 2021 07:12:08 -0600 Subject: [PATCH 2/2] using dummy vararg when wrapping bundle tests to prevent lua error --- test/unit/language-extensions/vararg.spec.ts | 1 - test/util.ts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/test/unit/language-extensions/vararg.spec.ts b/test/unit/language-extensions/vararg.spec.ts index 171ca807c..d5aa9fc69 100644 --- a/test/unit/language-extensions/vararg.spec.ts +++ b/test/unit/language-extensions/vararg.spec.ts @@ -51,6 +51,5 @@ test("$vararg in bundle sub-module", () => { .addExtraFile("src/module.ts", 'export const result = [...$vararg].join("")') .setOptions({ rootDir: "src", luaBundle: "bundle.lua", luaBundleEntry: "src/main.ts" }) .withLanguageExtensions() - .setLuaFactory(code => `return (function(...) ${code} end)()`) .expectToEqual({ result: "module" }); }); diff --git a/test/util.ts b/test/util.ts index 4398b1098..532ba944f 100644 --- a/test/util.ts +++ b/test/util.ts @@ -529,7 +529,7 @@ class AccessorTestBuilder extends TestBuilder { protected accessor = ""; protected getLuaCodeWithWrapper(code: string) { - return `return (function()\n${code}\nend)()${this.accessor}`; + return `return (function(...)\n${code}\nend)()${this.accessor}`; } @memoize