Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions src/transpilation/bundle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -55,7 +56,7 @@ export function getBundleResult(program: ts.Program, files: ProcessedFile[]): [t
const moduleTable = createModuleTableNode(moduleTableEntries);

// return require("<entry module path>")
const entryPoint = `return require(${createModulePath(entryModule, program)})\n`;
const entryPoint = `return require(${createModulePath(entryModule, program)}, ...)\n`;

const sourceChunks = [requireOverride, moduleTable, entryPoint];

Expand All @@ -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]);
Expand Down
23 changes: 23 additions & 0 deletions test/unit/language-extensions/vararg.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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}
Expand All @@ -30,3 +31,25 @@ 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()
.expectToEqual({ result: "module" });
});
2 changes: 1 addition & 1 deletion test/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down