Skip to content

Commit 8a330e4

Browse files
authored
Fix lualib bundle not being included when external code requires it (#1074)
* Fix lualib bundle not being included when external code requires it * fix prettier
1 parent d39de69 commit 8a330e4

4 files changed

Lines changed: 53 additions & 8 deletions

File tree

src/transpilation/resolve.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ function resolveFileDependencies(file: ProcessedFile, context: ResolutionContext
129129
for (const required of findRequiredPaths(file.code)) {
130130
// Do no resolve lualib
131131
if (required === "lualib_bundle") {
132+
dependencies.push({ fileName: "lualib_bundle", code: "" });
132133
continue;
133134
}
134135

src/transpilation/transpiler.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,21 +73,24 @@ export class Transpiler {
7373
console.log("Constructing emit plan");
7474
}
7575

76-
const lualibRequired = files.some(f => f.code.includes('require("lualib_bundle")'));
76+
// Resolve imported modules and modify output Lua requires
77+
const resolutionResult = resolveDependencies(program, files, this.emitHost);
78+
diagnostics.push(...resolutionResult.diagnostics);
79+
80+
const lualibRequired = resolutionResult.resolvedFiles.some(f => f.fileName === "lualib_bundle");
7781
if (lualibRequired) {
82+
// Remove lualib placeholders from resolution result
83+
resolutionResult.resolvedFiles = resolutionResult.resolvedFiles.filter(f => f.fileName !== "lualib_bundle");
84+
7885
if (options.tstlVerbose) {
7986
console.log("Including lualib bundle");
8087
}
8188

8289
// Add lualib bundle to source dir 'virtually', will be moved to correct output dir in emitPlan
8390
const fileName = normalizeSlashes(path.resolve(getSourceDir(program), "lualib_bundle.lua"));
84-
files.unshift({ fileName, code: getLuaLibBundle(this.emitHost) });
91+
resolutionResult.resolvedFiles.unshift({ fileName, code: getLuaLibBundle(this.emitHost) });
8592
}
8693

87-
// Resolve imported modules and modify output Lua requires
88-
const resolutionResult = resolveDependencies(program, files, this.emitHost);
89-
diagnostics.push(...resolutionResult.diagnostics);
90-
9194
let emitPlan: EmitFile[];
9295
if (isBundleEnabled(options)) {
9396
const [bundleDiagnostics, bundleFile] = getBundleResult(program, resolutionResult.resolvedFiles);

test/transpile/module-resolution.spec.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,7 @@ test("module resolution uses baseURL to resolve imported files", () => {
394394
395395
export const fooResult = foo();
396396
export const barResult = bar();
397+
export const bazResult = baz();
397398
`
398399
.addExtraFile(
399400
"myproject/mydeps/dep1.ts",
@@ -423,5 +424,34 @@ test("module resolution uses baseURL to resolve imported files", () => {
423424
.expectToEqual({
424425
fooResult: "foo",
425426
barResult: "bar",
427+
bazResult: "baz",
428+
});
429+
});
430+
431+
// https://github.com/TypeScriptToLua/TypeScriptToLua/issues/1071
432+
test("includes lualib_bundle when external lua requests it", () => {
433+
util.testModule`
434+
export { foo } from "./lualibuser";
435+
`
436+
.addExtraFile(
437+
"lualibuser.d.ts",
438+
`
439+
export const foo: string[];
440+
`
441+
)
442+
.addExtraFile(
443+
"lualibuser.lua",
444+
`
445+
require("lualib_bundle")
446+
447+
local result = {}
448+
__TS__ArrayPush(result, "foo")
449+
__TS__ArrayPush(result, "bar")
450+
451+
return { foo = result }
452+
`
453+
)
454+
.expectToEqual({
455+
foo: ["foo", "bar"],
426456
});
427457
});

test/util.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import * as ts from "typescript";
99
import * as vm from "vm";
1010
import * as tstl from "../src";
1111
import { createEmitOutputCollector } from "../src/transpilation/output-collector";
12-
import { getEmitOutDir, transpileProject } from "../src";
12+
import { EmitHost, getEmitOutDir, transpileProject } from "../src";
1313
import { formatPathToLuaPath, normalizeSlashes } from "../src/utils";
1414

1515
const jsonLib = fs.readFileSync(path.join(__dirname, "json.lua"), "utf8");
@@ -190,11 +190,22 @@ export abstract class TestBuilder {
190190
);
191191
}
192192

193+
private getEmitHost(): EmitHost {
194+
return {
195+
fileExists: (path: string) => normalizeSlashes(path) in this.extraFiles,
196+
directoryExists: (path: string) =>
197+
Object.keys(this.extraFiles).some(f => f.startsWith(normalizeSlashes(path))),
198+
getCurrentDirectory: () => ".",
199+
readFile: (path: string) => this.extraFiles[normalizeSlashes(path)] ?? ts.sys.readFile(path),
200+
writeFile() {},
201+
};
202+
}
203+
193204
@memoize
194205
public getLuaResult(): tstl.TranspileVirtualProjectResult {
195206
const program = this.getProgram();
196207
const collector = createEmitOutputCollector();
197-
const { diagnostics: transpileDiagnostics } = new tstl.Transpiler().emit({
208+
const { diagnostics: transpileDiagnostics } = new tstl.Transpiler({ emitHost: this.getEmitHost() }).emit({
198209
program,
199210
customTransformers: this.customTransformers,
200211
writeFile: collector.writeFile,

0 commit comments

Comments
 (0)