Skip to content

Commit 73233d7

Browse files
authored
Merge pull request #33503 from microsoft/moreApisForBuild
Add output file names api for supporting ts-loader
2 parents 5e06bea + e430f2a commit 73233d7

File tree

7 files changed

+71
-35
lines changed

7 files changed

+71
-35
lines changed

src/compiler/builder.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ namespace ts {
257257

258258
function convertToDiagnostics(diagnostics: readonly ReusableDiagnostic[], newProgram: Program, getCanonicalFileName: GetCanonicalFileName): readonly Diagnostic[] {
259259
if (!diagnostics.length) return emptyArray;
260-
const buildInfoDirectory = getDirectoryPath(getNormalizedAbsolutePath(getOutputPathForBuildInfo(newProgram.getCompilerOptions())!, newProgram.getCurrentDirectory()));
260+
const buildInfoDirectory = getDirectoryPath(getNormalizedAbsolutePath(getTsBuildInfoEmitOutputFilePath(newProgram.getCompilerOptions())!, newProgram.getCurrentDirectory()));
261261
return diagnostics.map(diagnostic => {
262262
const result: Diagnostic = convertToDiagnosticRelatedInformation(diagnostic, newProgram, toPath);
263263
result.reportsUnnecessary = diagnostic.reportsUnnecessary;
@@ -656,7 +656,7 @@ namespace ts {
656656
function getProgramBuildInfo(state: Readonly<ReusableBuilderProgramState>, getCanonicalFileName: GetCanonicalFileName): ProgramBuildInfo | undefined {
657657
if (state.compilerOptions.outFile || state.compilerOptions.out) return undefined;
658658
const currentDirectory = Debug.assertDefined(state.program).getCurrentDirectory();
659-
const buildInfoDirectory = getDirectoryPath(getNormalizedAbsolutePath(getOutputPathForBuildInfo(state.compilerOptions)!, currentDirectory));
659+
const buildInfoDirectory = getDirectoryPath(getNormalizedAbsolutePath(getTsBuildInfoEmitOutputFilePath(state.compilerOptions)!, currentDirectory));
660660
const fileInfos: MapLike<BuilderState.FileInfo> = {};
661661
state.fileInfos.forEach((value, key) => {
662662
const signature = state.currentAffectedFilesSignatures && state.currentAffectedFilesSignatures.get(key);

src/compiler/emitter.ts

Lines changed: 61 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,13 @@ namespace ts {
4545
}
4646
}
4747
if (includeBuildInfo) {
48-
const buildInfoPath = getOutputPathForBuildInfo(host.getCompilerOptions());
48+
const buildInfoPath = getTsBuildInfoEmitOutputFilePath(host.getCompilerOptions());
4949
if (buildInfoPath) return action({ buildInfoPath }, /*sourceFileOrBundle*/ undefined);
5050
}
5151
}
5252
}
5353

54-
/*@internal*/
55-
export function getOutputPathForBuildInfo(options: CompilerOptions) {
54+
export function getTsBuildInfoEmitOutputFilePath(options: CompilerOptions) {
5655
const configFile = options.configFilePath;
5756
if (!isIncrementalCompilation(options)) return undefined;
5857
if (options.tsBuildInfoFile) return options.tsBuildInfoFile;
@@ -80,7 +79,7 @@ namespace ts {
8079
const sourceMapFilePath = jsFilePath && getSourceMapFilePath(jsFilePath, options);
8180
const declarationFilePath = (forceDtsPaths || getEmitDeclarations(options)) ? removeFileExtension(outPath) + Extension.Dts : undefined;
8281
const declarationMapPath = declarationFilePath && getAreDeclarationMapsEnabled(options) ? declarationFilePath + ".map" : undefined;
83-
const buildInfoPath = getOutputPathForBuildInfo(options);
82+
const buildInfoPath = getTsBuildInfoEmitOutputFilePath(options);
8483
return { jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath, buildInfoPath };
8584
}
8685

@@ -170,38 +169,71 @@ namespace ts {
170169
undefined;
171170
}
172171

172+
function createAddOutput() {
173+
let outputs: string[] | undefined;
174+
return { addOutput, getOutputs };
175+
function addOutput(path: string | undefined) {
176+
if (path) {
177+
(outputs || (outputs = [])).push(path);
178+
}
179+
}
180+
function getOutputs(): readonly string[] {
181+
return outputs || emptyArray;
182+
}
183+
}
184+
185+
function getSingleOutputFileNames(configFile: ParsedCommandLine, addOutput: ReturnType<typeof createAddOutput>["addOutput"]) {
186+
const { jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath, buildInfoPath } = getOutputPathsForBundle(configFile.options, /*forceDtsPaths*/ false);
187+
addOutput(jsFilePath);
188+
addOutput(sourceMapFilePath);
189+
addOutput(declarationFilePath);
190+
addOutput(declarationMapPath);
191+
addOutput(buildInfoPath);
192+
}
193+
194+
function getOwnOutputFileNames(configFile: ParsedCommandLine, inputFileName: string, ignoreCase: boolean, addOutput: ReturnType<typeof createAddOutput>["addOutput"]) {
195+
if (fileExtensionIs(inputFileName, Extension.Dts)) return;
196+
const js = getOutputJSFileName(inputFileName, configFile, ignoreCase);
197+
addOutput(js);
198+
if (fileExtensionIs(inputFileName, Extension.Json)) return;
199+
if (js && configFile.options.sourceMap) {
200+
addOutput(`${js}.map`);
201+
}
202+
if (getEmitDeclarations(configFile.options) && hasTSFileExtension(inputFileName)) {
203+
const dts = getOutputDeclarationFileName(inputFileName, configFile, ignoreCase);
204+
addOutput(dts);
205+
if (configFile.options.declarationMap) {
206+
addOutput(`${dts}.map`);
207+
}
208+
}
209+
}
210+
173211
/*@internal*/
174212
export function getAllProjectOutputs(configFile: ParsedCommandLine, ignoreCase: boolean): readonly string[] {
175-
let outputs: string[] | undefined;
176-
const addOutput = (path: string | undefined) => path && (outputs || (outputs = [])).push(path);
213+
const { addOutput, getOutputs } = createAddOutput();
177214
if (configFile.options.outFile || configFile.options.out) {
178-
const { jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath, buildInfoPath } = getOutputPathsForBundle(configFile.options, /*forceDtsPaths*/ false);
179-
addOutput(jsFilePath);
180-
addOutput(sourceMapFilePath);
181-
addOutput(declarationFilePath);
182-
addOutput(declarationMapPath);
183-
addOutput(buildInfoPath);
215+
getSingleOutputFileNames(configFile, addOutput);
184216
}
185217
else {
186218
for (const inputFileName of configFile.fileNames) {
187-
if (fileExtensionIs(inputFileName, Extension.Dts)) continue;
188-
const js = getOutputJSFileName(inputFileName, configFile, ignoreCase);
189-
addOutput(js);
190-
if (fileExtensionIs(inputFileName, Extension.Json)) continue;
191-
if (js && configFile.options.sourceMap) {
192-
addOutput(`${js}.map`);
193-
}
194-
if (getEmitDeclarations(configFile.options) && hasTSFileExtension(inputFileName)) {
195-
const dts = getOutputDeclarationFileName(inputFileName, configFile, ignoreCase);
196-
addOutput(dts);
197-
if (configFile.options.declarationMap) {
198-
addOutput(`${dts}.map`);
199-
}
200-
}
219+
getOwnOutputFileNames(configFile, inputFileName, ignoreCase, addOutput);
201220
}
202-
addOutput(getOutputPathForBuildInfo(configFile.options));
221+
addOutput(getTsBuildInfoEmitOutputFilePath(configFile.options));
222+
}
223+
return getOutputs();
224+
}
225+
226+
export function getOutputFileNames(commandLine: ParsedCommandLine, inputFileName: string, ignoreCase: boolean): readonly string[] {
227+
inputFileName = normalizePath(inputFileName);
228+
Debug.assert(contains(commandLine.fileNames, inputFileName), `Expected fileName to be present in command line`);
229+
const { addOutput, getOutputs } = createAddOutput();
230+
if (commandLine.options.outFile || commandLine.options.out) {
231+
getSingleOutputFileNames(commandLine, addOutput);
232+
}
233+
else {
234+
getOwnOutputFileNames(commandLine, inputFileName, ignoreCase, addOutput);
203235
}
204-
return outputs || emptyArray;
236+
return getOutputs();
205237
}
206238

207239
/*@internal*/
@@ -220,7 +252,7 @@ namespace ts {
220252
return getOutputDeclarationFileName(inputFileName, configFile, ignoreCase);
221253
}
222254
}
223-
const buildInfoPath = getOutputPathForBuildInfo(configFile.options);
255+
const buildInfoPath = getTsBuildInfoEmitOutputFilePath(configFile.options);
224256
if (buildInfoPath) return buildInfoPath;
225257
return Debug.fail(`project ${configFile.options.configFilePath} expected to have at least one output`);
226258
}

src/compiler/program.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3108,7 +3108,7 @@ namespace ts {
31083108
}
31093109

31103110
function verifyProjectReferences() {
3111-
const buildInfoPath = !options.noEmit && !options.suppressOutputPathCheck ? getOutputPathForBuildInfo(options) : undefined;
3111+
const buildInfoPath = !options.noEmit && !options.suppressOutputPathCheck ? getTsBuildInfoEmitOutputFilePath(options) : undefined;
31123112
forEachProjectReference(projectReferences, resolvedProjectReferences, (resolvedRef, index, parent) => {
31133113
const ref = (parent ? parent.commandLine.projectReferences : projectReferences)![index];
31143114
const parentFile = parent && parent.sourceFile as JsonSourceFile;
@@ -3135,7 +3135,7 @@ namespace ts {
31353135
createDiagnosticForReference(parentFile, index, Diagnostics.Cannot_prepend_project_0_because_it_does_not_have_outFile_set, ref.path);
31363136
}
31373137
}
3138-
if (!parent && buildInfoPath && buildInfoPath === getOutputPathForBuildInfo(options)) {
3138+
if (!parent && buildInfoPath && buildInfoPath === getTsBuildInfoEmitOutputFilePath(options)) {
31393139
createDiagnosticForReference(parentFile, index, Diagnostics.Cannot_write_file_0_because_it_will_overwrite_tsbuildinfo_file_generated_by_referenced_project_1, buildInfoPath, ref.path);
31403140
hasEmitBlockingDiagnostics.set(toPath(buildInfoPath), true);
31413141
}

src/compiler/tsbuild.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1621,7 +1621,7 @@ namespace ts {
16211621

16221622
if (!state.buildInfoChecked.has(resolvedPath)) {
16231623
state.buildInfoChecked.set(resolvedPath, true);
1624-
const buildInfoPath = getOutputPathForBuildInfo(project.options);
1624+
const buildInfoPath = getTsBuildInfoEmitOutputFilePath(project.options);
16251625
if (buildInfoPath) {
16261626
const value = state.readFileWithCache(buildInfoPath);
16271627
const buildInfo = value && getBuildInfo(value);

src/compiler/watch.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ namespace ts {
447447
}
448448
export function readBuilderProgram(compilerOptions: CompilerOptions, host: ReadBuildProgramHost) {
449449
if (compilerOptions.out || compilerOptions.outFile) return undefined;
450-
const buildInfoPath = getOutputPathForBuildInfo(compilerOptions);
450+
const buildInfoPath = getTsBuildInfoEmitOutputFilePath(compilerOptions);
451451
if (!buildInfoPath) return undefined;
452452
const content = host.readFile(buildInfoPath);
453453
if (!content) return undefined;

tests/baselines/reference/api/tsserverlibrary.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4289,6 +4289,8 @@ declare namespace ts {
42894289
function visitEachChild<T extends Node>(node: T | undefined, visitor: Visitor, context: TransformationContext, nodesVisitor?: typeof visitNodes, tokenVisitor?: Visitor): T | undefined;
42904290
}
42914291
declare namespace ts {
4292+
function getTsBuildInfoEmitOutputFilePath(options: CompilerOptions): string | undefined;
4293+
function getOutputFileNames(commandLine: ParsedCommandLine, inputFileName: string, ignoreCase: boolean): readonly string[];
42924294
function createPrinter(printerOptions?: PrinterOptions, handlers?: PrintHandlers): Printer;
42934295
}
42944296
declare namespace ts {

tests/baselines/reference/api/typescript.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4289,6 +4289,8 @@ declare namespace ts {
42894289
function visitEachChild<T extends Node>(node: T | undefined, visitor: Visitor, context: TransformationContext, nodesVisitor?: typeof visitNodes, tokenVisitor?: Visitor): T | undefined;
42904290
}
42914291
declare namespace ts {
4292+
function getTsBuildInfoEmitOutputFilePath(options: CompilerOptions): string | undefined;
4293+
function getOutputFileNames(commandLine: ParsedCommandLine, inputFileName: string, ignoreCase: boolean): readonly string[];
42924294
function createPrinter(printerOptions?: PrinterOptions, handlers?: PrintHandlers): Printer;
42934295
}
42944296
declare namespace ts {

0 commit comments

Comments
 (0)