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
1 change: 1 addition & 0 deletions src/transpilation/resolve.ts
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ function resolveFileDependencies(file: ProcessedFile, context: ResolutionContext
for (const required of findRequiredPaths(file.code)) {
// Do no resolve lualib
if (required === "lualib_bundle") {
dependencies.push({ fileName: "lualib_bundle", code: "" });
continue;
}

Expand Down
15 changes: 9 additions & 6 deletions src/transpilation/transpiler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,21 +73,24 @@ export class Transpiler {
console.log("Constructing emit plan");
}

const lualibRequired = files.some(f => f.code.includes('require("lualib_bundle")'));
// Resolve imported modules and modify output Lua requires
const resolutionResult = resolveDependencies(program, files, this.emitHost);
diagnostics.push(...resolutionResult.diagnostics);

const lualibRequired = resolutionResult.resolvedFiles.some(f => f.fileName === "lualib_bundle");
if (lualibRequired) {
// Remove lualib placeholders from resolution result
resolutionResult.resolvedFiles = resolutionResult.resolvedFiles.filter(f => f.fileName !== "lualib_bundle");

if (options.tstlVerbose) {
console.log("Including lualib bundle");
}

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

// Resolve imported modules and modify output Lua requires
const resolutionResult = resolveDependencies(program, files, this.emitHost);
diagnostics.push(...resolutionResult.diagnostics);

let emitPlan: EmitFile[];
if (isBundleEnabled(options)) {
const [bundleDiagnostics, bundleFile] = getBundleResult(program, resolutionResult.resolvedFiles);
Expand Down
30 changes: 30 additions & 0 deletions test/transpile/module-resolution.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,7 @@ test("module resolution uses baseURL to resolve imported files", () => {

export const fooResult = foo();
export const barResult = bar();
export const bazResult = baz();
`
.addExtraFile(
"myproject/mydeps/dep1.ts",
Expand Down Expand Up @@ -423,5 +424,34 @@ test("module resolution uses baseURL to resolve imported files", () => {
.expectToEqual({
fooResult: "foo",
barResult: "bar",
bazResult: "baz",
});
});

// https://github.com/TypeScriptToLua/TypeScriptToLua/issues/1071
test("includes lualib_bundle when external lua requests it", () => {
util.testModule`
export { foo } from "./lualibuser";
`
.addExtraFile(
"lualibuser.d.ts",
`
export const foo: string[];
`
)
.addExtraFile(
"lualibuser.lua",
`
require("lualib_bundle")

local result = {}
__TS__ArrayPush(result, "foo")
__TS__ArrayPush(result, "bar")

return { foo = result }
`
)
.expectToEqual({
foo: ["foo", "bar"],
});
});
15 changes: 13 additions & 2 deletions test/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import * as ts from "typescript";
import * as vm from "vm";
import * as tstl from "../src";
import { createEmitOutputCollector } from "../src/transpilation/output-collector";
import { getEmitOutDir, transpileProject } from "../src";
import { EmitHost, getEmitOutDir, transpileProject } from "../src";
import { formatPathToLuaPath, normalizeSlashes } from "../src/utils";

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

private getEmitHost(): EmitHost {
return {
fileExists: (path: string) => normalizeSlashes(path) in this.extraFiles,
directoryExists: (path: string) =>
Object.keys(this.extraFiles).some(f => f.startsWith(normalizeSlashes(path))),
getCurrentDirectory: () => ".",
readFile: (path: string) => this.extraFiles[normalizeSlashes(path)] ?? ts.sys.readFile(path),
writeFile() {},
};
}

@memoize
public getLuaResult(): tstl.TranspileVirtualProjectResult {
const program = this.getProgram();
const collector = createEmitOutputCollector();
const { diagnostics: transpileDiagnostics } = new tstl.Transpiler().emit({
const { diagnostics: transpileDiagnostics } = new tstl.Transpiler({ emitHost: this.getEmitHost() }).emit({
program,
customTransformers: this.customTransformers,
writeFile: collector.writeFile,
Expand Down