Skip to content

Commit f405f67

Browse files
committed
Refactor
1 parent 1ff2963 commit f405f67

6 files changed

Lines changed: 154 additions & 156 deletions

File tree

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,24 @@ import { CompilerOptions, isBundleEnabled } from "../CompilerOptions";
55
import { escapeString } from "../LuaPrinter";
66
import { assert, normalizeSlashes } from "../utils";
77
import { couldNotFindBundleEntryPoint } from "./diagnostics";
8-
import { Chunk, EmitHost, getConfigDirectory, Module } from "./utils";
8+
import { Module } from "./module";
9+
import { Transpilation } from "./transpiler";
10+
import { getConfigDirectory } from "./utils";
11+
12+
export interface Chunk {
13+
outputPath: string;
14+
code: string;
15+
sourceMap?: string;
16+
sourceFiles?: ts.SourceFile[];
17+
}
18+
19+
export function modulesToChunks(transpilation: Transpilation, modules: Module[]): Chunk[] {
20+
return modules.map(module => {
21+
const moduleId = transpilation.getModuleId(module);
22+
const outputPath = normalizeSlashes(path.resolve(transpilation.outDir, `${moduleId.replace(/\./g, "/")}.lua`));
23+
return { outputPath, code: module.code, sourceMap: module.sourceMap, sourceFiles: module.sourceFiles };
24+
});
25+
}
926

1027
// Override `require` to read from ____modules table.
1128
const requireOverride = `
@@ -29,41 +46,33 @@ local function require(file)
2946
end
3047
`;
3148

32-
export function getBundleChunk(
33-
program: ts.Program,
34-
emitHost: EmitHost,
35-
modules: Module[],
36-
createModuleId: (file: Module) => string
37-
): [ts.Diagnostic[], Chunk] {
38-
const diagnostics: ts.Diagnostic[] = [];
39-
40-
const options = program.getCompilerOptions() as CompilerOptions;
49+
export function modulesToBundleChunks(transpilation: Transpilation, modules: Module[]): Chunk[] {
50+
const options = transpilation.program.getCompilerOptions() as CompilerOptions;
4151
assert(isBundleEnabled(options));
42-
const projectDirectory = getConfigDirectory(options, emitHost);
52+
const projectDirectory = getConfigDirectory(options, transpilation.emitHost);
4353
const outputPath = normalizeSlashes(path.resolve(projectDirectory, options.luaBundle));
4454

4555
// Resolve project settings relative to project file.
4656
const entryFileName = normalizeSlashes(path.resolve(projectDirectory, options.luaBundleEntry));
47-
const entryModule = modules.find(m => m.fileName === entryFileName);
57+
const entryModule = modules.find(m => m.request === entryFileName);
4858
if (entryModule === undefined) {
49-
diagnostics.push(couldNotFindBundleEntryPoint(options.luaBundleEntry));
50-
return [diagnostics, { outputPath, code: "" }];
59+
transpilation.diagnostics.push(couldNotFindBundleEntryPoint(options.luaBundleEntry));
60+
return [{ outputPath, code: "" }];
5161
}
5262

5363
// For each file: ["<module path>"] = function() <lua content> end,
54-
const moduleTableEntries = modules.map(f => moduleSourceNode(f, escapeString(createModuleId(f))));
64+
const moduleTableEntries = modules.map(m => moduleSourceNode(m, escapeString(transpilation.getModuleId(m))));
5565

5666
// Create ____modules table containing all entries from moduleTableEntries
5767
const moduleTable = createModuleTableNode(moduleTableEntries);
5868

5969
// return require("<entry module path>")
60-
const bootstrap = `return require(${escapeString(createModuleId(entryModule))})\n`;
70+
const bootstrap = `return require(${escapeString(transpilation.getModuleId(entryModule))})\n`;
6171

6272
const bundleNode = joinSourceChunks([requireOverride, moduleTable, bootstrap]);
6373
const { code, map } = bundleNode.toStringWithSourceMap();
6474

6575
return [
66-
diagnostics,
6776
{
6877
outputPath,
6978
code,
@@ -73,8 +82,8 @@ export function getBundleChunk(
7382
];
7483
}
7584

76-
function moduleSourceNode({ code, sourceMapNode }: Module, modulePath: string): SourceNode {
77-
return joinSourceChunks([`[${modulePath}] = function()\n`, sourceMapNode ?? code, "\nend,\n"]);
85+
function moduleSourceNode(module: Module, modulePath: string): SourceNode {
86+
return joinSourceChunks([`[${modulePath}] = function()\n`, module.sourceMapNode ?? module.code, "\nend,\n"]);
7887
}
7988

8089
function createModuleTableNode(fileChunks: SourceChunk[]): SourceNode {

src/transpilation/macro.ts

Lines changed: 0 additions & 28 deletions
This file was deleted.

src/transpilation/module.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import { SourceNode } from "source-map";
2+
import * as ts from "typescript";
3+
import { escapeString, unescapeLuaString } from "../LuaPrinter";
4+
5+
export interface Module {
6+
request: string;
7+
isBuilt: boolean;
8+
code: string;
9+
sourceMap?: string;
10+
sourceMapNode?: SourceNode;
11+
sourceFiles?: ts.SourceFile[];
12+
}
13+
14+
export type ModuleDependencyResolver = (request: string) => string | { error: string };
15+
16+
export function buildModule(module: Module, dependencyResolver: ModuleDependencyResolver) {
17+
if (module.isBuilt) return;
18+
module.isBuilt = true;
19+
20+
if (module.sourceMapNode) {
21+
replaceResolveMacroSourceNodes(module.sourceMapNode, dependencyResolver);
22+
const { code, map } = module.sourceMapNode.toStringWithSourceMap();
23+
module.code = code;
24+
module.sourceMap = JSON.stringify(map.toJSON());
25+
} else {
26+
module.code = replaceResolveMacroInSource(module.code, dependencyResolver);
27+
}
28+
}
29+
30+
function replaceResolveMacroSourceNodes(rootNode: SourceNode, replacer: ModuleDependencyResolver) {
31+
function walkSourceNode(node: SourceNode, parent: SourceNode) {
32+
for (const child of node.children) {
33+
if ((child as any) === "__TS__Resolve") {
34+
parent.children = [replaceResolveMacroInSource(parent.toString(), replacer) as any];
35+
} else if (typeof child === "object") {
36+
walkSourceNode(child, node);
37+
}
38+
}
39+
}
40+
41+
walkSourceNode(rootNode, rootNode);
42+
}
43+
44+
function replaceResolveMacroInSource(source: string, replacer: ModuleDependencyResolver) {
45+
return source.replace(/__TS__Resolve\((".*?")\)/, (_, match) => {
46+
const request = unescapeLuaString(match);
47+
const replacement = replacer(request);
48+
return typeof replacement === "string"
49+
? escapeString(replacement)
50+
: `--[[ ${request} ]] error(${escapeString(replacement.error)})`;
51+
});
52+
}

src/transpilation/transpile/index.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import { CompilerOptions, validateOptions } from "../../CompilerOptions";
44
import { createPrinter } from "../../LuaPrinter";
55
import { createVisitorMap, transformSourceFile } from "../../transformation";
66
import { assert, isNonNull } from "../../utils";
7-
import { EmitHost, Module } from "../utils";
7+
import { Module } from "../module";
8+
import { EmitHost } from "../utils";
89
import { getPlugins, Plugin } from "./plugins";
910
import { getTransformers } from "./transformers";
1011

@@ -17,16 +18,11 @@ export interface TranspileOptions {
1718
plugins?: Plugin[];
1819
}
1920

20-
export interface TranspileResult {
21-
diagnostics: ts.Diagnostic[];
22-
modules: Module[];
23-
}
24-
2521
export function emitProgramModules(
2622
emitHost: EmitHost,
2723
writeFileResult: ts.WriteFileCallback,
2824
{ program, sourceFiles: targetSourceFiles, customTransformers = {}, plugins: customPlugins = [] }: TranspileOptions
29-
): TranspileResult {
25+
) {
3026
const options = program.getCompilerOptions() as CompilerOptions;
3127

3228
const diagnostics = validateOptions(options);
@@ -82,7 +78,12 @@ export function emitProgramModules(
8278
fileName = path.resolve(currentDirectory, sourceFile.fileName);
8379
}
8480

85-
modules.push({ sourceFiles: [sourceFile], fileName, luaAst, ...printResult });
81+
modules.push({
82+
sourceFiles: [sourceFile],
83+
request: fileName,
84+
isBuilt: false,
85+
...printResult,
86+
});
8687
}
8788
};
8889

0 commit comments

Comments
 (0)