Skip to content

Commit e1a3dfd

Browse files
committed
Improve terminology
1 parent 6afdc45 commit e1a3dfd

5 files changed

Lines changed: 61 additions & 64 deletions

File tree

src/transpilation/bundle.ts

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { CompilerOptions, isBundleEnabled } from "../CompilerOptions";
55
import { escapeString } from "../LuaPrinter";
66
import { assert, normalizeSlashes } from "../utils";
77
import { couldNotFindBundleEntryPoint } from "./diagnostics";
8-
import { EmitFile, EmitHost, ProcessedFile } from "./utils";
8+
import { Chunk, EmitHost, getConfigDirectory, Module } from "./utils";
99

1010
// Override `require` to read from ____modules table.
1111
const requireOverride = `
@@ -29,41 +29,37 @@ local function require(file)
2929
end
3030
`;
3131

32-
export function getBundleResult(
32+
export function getBundleChunk(
3333
program: ts.Program,
3434
emitHost: EmitHost,
35-
files: ProcessedFile[],
36-
createModuleId: (file: ProcessedFile) => string
37-
): [ts.Diagnostic[], EmitFile] {
35+
modules: Module[],
36+
createModuleId: (file: Module) => string
37+
): [ts.Diagnostic[], Chunk] {
3838
const diagnostics: ts.Diagnostic[] = [];
3939

4040
const options = program.getCompilerOptions() as CompilerOptions;
4141
assert(isBundleEnabled(options));
42-
const bundleFile = options.luaBundle;
43-
const entryModule = options.luaBundleEntry;
44-
const projectRootDir = options.configFilePath
45-
? path.dirname(options.configFilePath)
46-
: emitHost.getCurrentDirectory();
47-
const outputPath = normalizeSlashes(path.resolve(projectRootDir, bundleFile));
42+
const projectDirectory = getConfigDirectory(options, emitHost);
43+
const outputPath = normalizeSlashes(path.resolve(projectDirectory, options.luaBundle));
4844

4945
// Resolve project settings relative to project file.
50-
const resolvedEntryModule = path.resolve(projectRootDir, entryModule);
51-
const entryFile = files.find(f => f.fileName === resolvedEntryModule);
52-
if (entryFile === undefined) {
53-
diagnostics.push(couldNotFindBundleEntryPoint(entryModule));
46+
const entryFileName = normalizeSlashes(path.resolve(projectDirectory, options.luaBundleEntry));
47+
const entryModule = modules.find(m => m.fileName === entryFileName);
48+
if (entryModule === undefined) {
49+
diagnostics.push(couldNotFindBundleEntryPoint(options.luaBundleEntry));
5450
return [diagnostics, { outputPath, code: "" }];
5551
}
5652

5753
// For each file: ["<module path>"] = function() <lua content> end,
58-
const moduleTableEntries = files.map(f => moduleSourceNode(f, escapeString(createModuleId(f))));
54+
const moduleTableEntries = modules.map(f => moduleSourceNode(f, escapeString(createModuleId(f))));
5955

6056
// Create ____modules table containing all entries from moduleTableEntries
6157
const moduleTable = createModuleTableNode(moduleTableEntries);
6258

6359
// return require("<entry module path>")
64-
const entryPoint = `return require(${escapeString(createModuleId(entryFile))})\n`;
60+
const bootstrap = `return require(${escapeString(createModuleId(entryModule))})\n`;
6561

66-
const bundleNode = joinSourceChunks([requireOverride, moduleTable, entryPoint]);
62+
const bundleNode = joinSourceChunks([requireOverride, moduleTable, bootstrap]);
6763
const { code, map } = bundleNode.toStringWithSourceMap();
6864

6965
return [
@@ -72,12 +68,12 @@ export function getBundleResult(
7268
outputPath,
7369
code,
7470
sourceMap: map.toString(),
75-
sourceFiles: files.flatMap(x => x.sourceFiles ?? []),
71+
sourceFiles: modules.flatMap(x => x.sourceFiles ?? []),
7672
},
7773
];
7874
}
7975

80-
function moduleSourceNode({ code, sourceMapNode }: ProcessedFile, modulePath: string): SourceNode {
76+
function moduleSourceNode({ code, sourceMapNode }: Module, modulePath: string): SourceNode {
8177
return joinSourceChunks([`[${modulePath}] = function()\n`, sourceMapNode ?? code, "\nend,\n"]);
8278
}
8379

src/transpilation/macro.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { SourceNode } from "source-map";
22
import { escapeString, unescapeLuaString } from "../LuaPrinter";
33

4-
export type ResolveMacroReplacer = (request: string) => string | { error: string };
4+
export type MacroDependencyResolver = (request: string) => string | { error: string };
55

6-
export function replaceResolveMacroSourceNodes(rootNode: SourceNode, replacer: ResolveMacroReplacer) {
6+
export function replaceResolveMacroSourceNodes(rootNode: SourceNode, replacer: MacroDependencyResolver) {
77
function walkSourceNode(node: SourceNode, parent: SourceNode) {
88
for (const child of node.children) {
99
if ((child as any) === "__TS__Resolve") {
@@ -17,7 +17,7 @@ export function replaceResolveMacroSourceNodes(rootNode: SourceNode, replacer: R
1717
walkSourceNode(rootNode, rootNode);
1818
}
1919

20-
export function replaceResolveMacroInSource(source: string, replacer: ResolveMacroReplacer) {
20+
export function replaceResolveMacroInSource(source: string, replacer: MacroDependencyResolver) {
2121
return source.replace(/__TS__Resolve\((".*?")\)/, (_, match) => {
2222
const request = unescapeLuaString(match);
2323
const replacement = replacer(request);

src/transpilation/transpile/index.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ 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";
78
import { getPlugins, Plugin } from "./plugins";
89
import { getTransformers } from "./transformers";
9-
import { EmitHost, ProcessedFile } from "../utils";
1010

1111
export { Plugin };
1212

@@ -19,18 +19,18 @@ export interface TranspileOptions {
1919

2020
export interface TranspileResult {
2121
diagnostics: ts.Diagnostic[];
22-
transpiledFiles: ProcessedFile[];
22+
modules: Module[];
2323
}
2424

25-
export function getProgramTranspileResult(
25+
export function emitProgramModules(
2626
emitHost: EmitHost,
2727
writeFileResult: ts.WriteFileCallback,
2828
{ program, sourceFiles: targetSourceFiles, customTransformers = {}, plugins: customPlugins = [] }: TranspileOptions
2929
): TranspileResult {
3030
const options = program.getCompilerOptions() as CompilerOptions;
3131

3232
const diagnostics = validateOptions(options);
33-
let transpiledFiles: ProcessedFile[] = [];
33+
let modules: Module[] = [];
3434

3535
if (options.noEmitOnError) {
3636
const preEmitDiagnostics = [
@@ -54,7 +54,7 @@ export function getProgramTranspileResult(
5454
}
5555

5656
if (preEmitDiagnostics.length > 0) {
57-
return { diagnostics: preEmitDiagnostics, transpiledFiles };
57+
return { diagnostics: preEmitDiagnostics, modules };
5858
}
5959
}
6060

@@ -82,7 +82,7 @@ export function getProgramTranspileResult(
8282
fileName = path.resolve(currentDirectory, sourceFile.fileName);
8383
}
8484

85-
transpiledFiles.push({ sourceFiles: [sourceFile], fileName, luaAst, ...printResult });
85+
modules.push({ sourceFiles: [sourceFile], fileName, luaAst, ...printResult });
8686
}
8787
};
8888

@@ -121,8 +121,8 @@ export function getProgramTranspileResult(
121121
options.noEmit = oldNoEmit;
122122

123123
if (options.noEmit || (options.noEmitOnError && diagnostics.length > 0)) {
124-
transpiledFiles = [];
124+
modules = [];
125125
}
126126

127-
return { diagnostics, transpiledFiles };
127+
return { diagnostics, modules };
128128
}

src/transpilation/transpiler.ts

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ import * as ts from "typescript";
55
import { CompilerOptions, isBundleEnabled, LuaTarget } from "../CompilerOptions";
66
import { getLuaLibBundle } from "../LuaLib";
77
import { assert, cast, isNonNull, normalizeSlashes, trimExtension } from "../utils";
8-
import { getBundleResult } from "./bundle";
8+
import { getBundleChunk } from "./bundle";
99
import { createResolutionErrorDiagnostic } from "./diagnostics";
10-
import { replaceResolveMacroInSource, replaceResolveMacroSourceNodes, ResolveMacroReplacer } from "./macro";
11-
import { getProgramTranspileResult, TranspileOptions } from "./transpile";
12-
import { EmitFile, EmitHost, ProcessedFile } from "./utils";
10+
import { replaceResolveMacroInSource, replaceResolveMacroSourceNodes, MacroDependencyResolver } from "./macro";
11+
import { emitProgramModules, TranspileOptions } from "./transpile";
12+
import { Chunk, EmitHost, Module } from "./utils";
1313

1414
export interface TranspilerOptions {
1515
emitHost?: EmitHost;
@@ -32,8 +32,8 @@ export class Transpiler {
3232

3333
public emit(emitOptions: EmitOptions): EmitResult {
3434
const { program, writeFile = this.emitHost.writeFile } = emitOptions;
35-
const { diagnostics, transpiledFiles } = getProgramTranspileResult(this.emitHost, writeFile, emitOptions);
36-
const emitPlan = this.getEmitPlan(program, diagnostics, transpiledFiles);
35+
const { diagnostics, modules } = emitProgramModules(this.emitHost, writeFile, emitOptions);
36+
const emitPlan = this.getEmitPlan(program, diagnostics, modules);
3737

3838
const options = program.getCompilerOptions();
3939
const emitBOM = options.emitBOM ?? false;
@@ -47,7 +47,7 @@ export class Transpiler {
4747
return { diagnostics, emitSkipped: emitPlan.length === 0 };
4848
}
4949

50-
private getEmitPlan(program: ts.Program, diagnostics: ts.Diagnostic[], transpiledFiles: ProcessedFile[]) {
50+
private getEmitPlan(program: ts.Program, diagnostics: ts.Diagnostic[], transpiledFiles: Module[]) {
5151
const transpilation = new Transpilation(this.emitHost, program);
5252
const emitPlan = transpilation.emit(transpiledFiles);
5353
diagnostics.push(...transpilation.diagnostics);
@@ -58,7 +58,7 @@ export class Transpiler {
5858
class Transpilation {
5959
public readonly diagnostics: ts.Diagnostic[] = [];
6060
private seenFiles = new Set<string>();
61-
private files: ProcessedFile[] = [];
61+
private modules: Module[] = [];
6262

6363
private options = this.program.getCompilerOptions() as CompilerOptions;
6464
private rootDir: string;
@@ -75,39 +75,39 @@ class Transpilation {
7575
this.outDir = this.options.outDir ?? this.rootDir;
7676
}
7777

78-
public emit(transpiledFiles: ProcessedFile[]): EmitFile[] {
79-
transpiledFiles.forEach(file => this.seenFiles.add(file.fileName));
80-
transpiledFiles.forEach(file => this.handleProcessedFile(file));
78+
public emit(programModules: Module[]): Chunk[] {
79+
programModules.forEach(file => this.seenFiles.add(file.fileName));
80+
programModules.forEach(file => this.addModule(file));
8181

82-
const lualibRequired = this.files.some(f => f.code.includes('require("lualib_bundle")'));
82+
const lualibRequired = this.modules.some(f => f.code.includes('require("lualib_bundle")'));
8383
if (lualibRequired) {
8484
const fileName = normalizeSlashes(path.resolve(this.rootDir, "lualib_bundle.lua"));
85-
this.files.unshift({ fileName, code: getLuaLibBundle(this.emitHost) });
85+
this.modules.unshift({ fileName, code: getLuaLibBundle(this.emitHost) });
8686
}
8787

8888
if (isBundleEnabled(this.options)) {
89-
const [bundleDiagnostics, bundleFile] = getBundleResult(this.program, this.emitHost, this.files, file =>
89+
const [bundleDiagnostics, bundleChunk] = getBundleChunk(this.program, this.emitHost, this.modules, file =>
9090
this.createModuleId(file.fileName)
9191
);
9292
this.diagnostics.push(...bundleDiagnostics);
93-
return [bundleFile];
93+
return [bundleChunk];
9494
} else {
95-
return this.files.map(file => ({
95+
return this.modules.map(file => ({
9696
...file,
9797
outputPath: this.moduleIdToOutputPath(this.createModuleId(file.fileName)),
9898
}));
9999
}
100100
}
101101

102-
private handleProcessedFile(file: ProcessedFile) {
103-
const replacer: ResolveMacroReplacer = (request: string) => {
102+
private addModule(module: Module) {
103+
const dependencyResolver: MacroDependencyResolver = (request: string) => {
104104
let resolvedPath: string;
105105
try {
106-
const result = this.resolver.resolveSync({}, path.dirname(file.fileName), request);
106+
const result = this.resolver.resolveSync({}, path.dirname(module.fileName), request);
107107
assert(typeof result === "string");
108108
resolvedPath = result;
109109
} catch (error) {
110-
this.diagnostics.push(createResolutionErrorDiagnostic(error.message, request, file.fileName));
110+
this.diagnostics.push(createResolutionErrorDiagnostic(error.message, request, module.fileName));
111111
return { error: error.message };
112112
}
113113

@@ -117,11 +117,11 @@ class Transpilation {
117117
resolvedPath.endsWith(".json")
118118
) {
119119
const message = `Resolved source file '${resolvedPath}' is not a part of the project.`;
120-
this.diagnostics.push(createResolutionErrorDiagnostic(message, request, file.fileName));
120+
this.diagnostics.push(createResolutionErrorDiagnostic(message, request, module.fileName));
121121
return { error: message };
122122
} else {
123123
this.seenFiles.add(resolvedPath);
124-
this.handleProcessedFile({
124+
this.addModule({
125125
fileName: resolvedPath,
126126
code: cast(this.emitHost.readFile(resolvedPath), isNonNull),
127127
// TODO: Load source map files
@@ -132,16 +132,16 @@ class Transpilation {
132132
return this.createModuleId(resolvedPath);
133133
};
134134

135-
if (file.sourceMapNode) {
136-
replaceResolveMacroSourceNodes(file.sourceMapNode, replacer);
137-
const { code, map } = file.sourceMapNode.toStringWithSourceMap();
138-
file.code = code;
139-
file.sourceMap = JSON.stringify(map.toJSON());
135+
if (module.sourceMapNode) {
136+
replaceResolveMacroSourceNodes(module.sourceMapNode, dependencyResolver);
137+
const { code, map } = module.sourceMapNode.toStringWithSourceMap();
138+
module.code = code;
139+
module.sourceMap = JSON.stringify(map.toJSON());
140140
} else {
141-
file.code = replaceResolveMacroInSource(file.code, replacer);
141+
module.code = replaceResolveMacroInSource(module.code, dependencyResolver);
142142
}
143143

144-
this.files.push(file);
144+
this.modules.push(module);
145145
}
146146

147147
private readonly scriptExtensions = [".ts", ".tsx", ".js", ".jsx"];

src/transpilation/utils.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,21 @@ interface BaseFile {
1818
sourceFiles?: ts.SourceFile[];
1919
}
2020

21-
export interface ProcessedFile extends BaseFile {
21+
export interface Module extends BaseFile {
2222
/** Absolute source file path. */
2323
fileName: string;
2424
luaAst?: lua.Block;
2525
/** @internal */
2626
sourceMapNode?: SourceNode;
2727
}
2828

29-
export interface EmitFile extends BaseFile {
29+
export interface Chunk extends BaseFile {
3030
outputPath: string;
3131
}
3232

33-
export const getConfigDirectory = (options: ts.CompilerOptions) =>
34-
options.configFilePath ? path.dirname(options.configFilePath) : process.cwd();
33+
// TODO: Require emit host
34+
export const getConfigDirectory = (options: ts.CompilerOptions, emitHost?: EmitHost) =>
35+
options.configFilePath ? path.dirname(options.configFilePath) : emitHost?.getCurrentDirectory() ?? process.cwd();
3536

3637
export function resolvePlugin(
3738
kind: string,

0 commit comments

Comments
 (0)