Skip to content

Commit 8ecb311

Browse files
committed
Rudimentary project support?
1 parent 7b644f0 commit 8ecb311

File tree

6 files changed

+50
-19
lines changed

6 files changed

+50
-19
lines changed

src/cli/tsconfig.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,14 @@ export function parseConfigFileWithSystem(
4141
commandLineOptions?: CompilerOptions,
4242
system = ts.sys
4343
): ParsedCommandLine {
44+
if (!system.fileExists(configFileName)) {
45+
return {
46+
options: {},
47+
fileNames: [configFileName],
48+
errors: [cliDiagnostics.theSpecifiedPathDoesNotExist(configFileName)],
49+
};
50+
}
51+
4452
const parsedConfigFile = ts.parseJsonSourceFileConfigFileContent(
4553
ts.readJsonConfigFile(configFileName, system.readFile),
4654
system,

src/transpilation/index.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,10 @@ export function transpileFiles(
1919
writeFile?: ts.WriteFileCallback
2020
): EmitResult {
2121
const program = ts.createProgram(rootNames, options);
22-
const preEmitDiagnostics = ts.getPreEmitDiagnostics(program);
2322
const { diagnostics: transpileDiagnostics, emitSkipped } = new Transpiler().emit({ program, writeFile });
24-
const diagnostics = ts.sortAndDeduplicateDiagnostics([...preEmitDiagnostics, ...transpileDiagnostics]);
23+
const diagnostics = ts.sortAndDeduplicateDiagnostics(transpileDiagnostics);
2524

26-
return { diagnostics: [...diagnostics], emitSkipped };
25+
return { diagnostics, emitSkipped };
2726
}
2827

2928
export function transpileProject(
@@ -96,10 +95,9 @@ export function transpileVirtualProject(
9695
options: CompilerOptions = {}
9796
): TranspileVirtualProjectResult {
9897
const program = createVirtualProgram(files, options);
99-
const preEmitDiagnostics = ts.getPreEmitDiagnostics(program);
10098
const collector = createEmitOutputCollector();
10199
const { diagnostics: transpileDiagnostics } = new Transpiler().emit({ program, writeFile: collector.writeFile });
102-
const diagnostics = ts.sortAndDeduplicateDiagnostics([...preEmitDiagnostics, ...transpileDiagnostics]);
100+
const diagnostics = ts.sortAndDeduplicateDiagnostics(transpileDiagnostics);
103101

104102
return { diagnostics: [...diagnostics], transpiledFiles: collector.files };
105103
}

src/transpilation/transpile.ts

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { Plugin } from "./plugins";
88
import { getTransformers } from "./transformers";
99
import { EmitHost, ProcessedFile } from "./utils";
1010
import * as performance from "../measure-performance";
11+
import { parseConfigFileWithSystem } from "../cli/tsconfig";
1112

1213
export interface TranspileOptions {
1314
program: ts.Program;
@@ -30,13 +31,38 @@ export function getProgramTranspileResult(
3031

3132
const options = program.getCompilerOptions() as CompilerOptions;
3233

33-
if (options.tstlVerbose) {
34-
console.log("Parsing project settings");
35-
}
34+
if (options.tstlVerbose) console.log("Parsing project settings");
3635

3736
const diagnostics = validateOptions(options);
37+
3838
let transpiledFiles: ProcessedFile[] = [];
3939

40+
if (options.build) {
41+
for (const projectReferences of options.projectReferences ?? [])
42+
{
43+
if (options.tstlVerbose) console.log(`Build mode: Checking reference ${projectReferences.path}`);
44+
45+
const tsConfigPath = path.join(projectReferences.path, "tsconfig.json");
46+
// Parse reference path but stay in build mode
47+
const parseResult = parseConfigFileWithSystem(tsConfigPath, { build: true });
48+
diagnostics.push(...parseResult.errors);
49+
50+
if (parseResult.errors.length === 0) {
51+
const referenceProgram = ts.createProgram(parseResult.fileNames, parseResult.options);
52+
const referencePreEmitDiagnostics = ts.getPreEmitDiagnostics(referenceProgram);
53+
const { diagnostics: referenceDiagnostics, transpiledFiles: referenceFiles } = getProgramTranspileResult(emitHost, writeFileResult, { program: referenceProgram });
54+
diagnostics.push(...referencePreEmitDiagnostics, ...referenceDiagnostics);
55+
56+
if (projectReferences.prepend)
57+
{
58+
transpiledFiles.push(...referenceFiles);
59+
}
60+
}
61+
}
62+
}
63+
64+
diagnostics.push(...ts.getPreEmitDiagnostics(program));
65+
4066
if (options.noEmitOnError) {
4167
const preEmitDiagnostics = [
4268
...diagnostics,

src/typescript-internal.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ declare module "typescript" {
2020
build?: boolean;
2121
configFile?: TsConfigSourceFile;
2222
configFilePath?: string;
23-
projectReferences?: string[];
23+
projectReferences?: ProjectReference[];
2424
}
2525

2626
interface TypeChecker {
Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
1-
import * as util from "../util";
21
import * as path from "path";
2+
import * as tstl from "../../src";
33

44
test("should transpile all projects with --build", () => {
55
const solutionDir = path.join(__dirname, "project-references", "project-references");
6-
const projectDir= path.join(solutionDir, "project1");
7-
const { transpiledFiles } = util
8-
.testProject(path.join(solutionDir, "tsconfig.json"))
9-
.setMainFileName(path.join(projectDir, "index.ts"))
10-
.setOptions({ build: true })
11-
.expectToHaveNoDiagnostics()
12-
.getLuaResult();
6+
const projectDir= path.join(solutionDir, "mainproject");
137

14-
console.log(transpiledFiles);
8+
const { diagnostics } = tstl.transpileProject(path.join(projectDir, "tsconfig.json"), {build: true});
9+
10+
expect(diagnostics).toHaveLength(0);
11+
// expect(transpiledFiles.some(f => f.outPath === path.join(solutionDir, "dist", "main.lua"))).toBe(true);
1512
});

test/util.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -583,7 +583,9 @@ class ExpressionTestBuilder extends AccessorTestBuilder {
583583
class ProjectTestBuilder extends ModuleTestBuilder {
584584
constructor(private tsConfig: string) {
585585
super("");
586-
this.setOptions({ configFilePath: this.tsConfig, ...tstl.parseConfigFileWithSystem(this.tsConfig) });
586+
const options = { configFilePath: this.tsConfig };
587+
Object.assign(options, tstl.parseConfigFileWithSystem(this.tsConfig));
588+
this.setOptions(options);
587589
}
588590

589591
@memoize

0 commit comments

Comments
 (0)