Skip to content

Commit e94b7d8

Browse files
committed
Check extended tsconfig time with oldest output time to report not upto date
1 parent 8cef0c5 commit e94b7d8

File tree

2 files changed

+49
-8
lines changed

2 files changed

+49
-8
lines changed

src/compiler/tsbuild.ts

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -794,14 +794,12 @@ namespace ts {
794794
}
795795
else {
796796
// Check tsconfig time
797-
const tsconfigTime = host.getModifiedTime(project.options.configFilePath!) || missingFileModifiedTime;
798-
if (oldestOutputFileTime < tsconfigTime) {
799-
return {
800-
type: UpToDateStatusType.OutOfDateWithSelf,
801-
outOfDateOutputFileName: oldestOutputFileName,
802-
newerInputFileName: project.options.configFilePath!
803-
};
804-
}
797+
const configStatus = checkConfigFileUpToDateStatus(project.options.configFilePath!, oldestOutputFileTime, oldestOutputFileName);
798+
if (configStatus) return configStatus;
799+
800+
// Check extended config time
801+
const extendedConfigStatus = forEach(project.options.configFile!.extendedSourceFiles || emptyArray, configFile => checkConfigFileUpToDateStatus(configFile, oldestOutputFileTime, oldestOutputFileName));
802+
if (extendedConfigStatus) return extendedConfigStatus;
805803
}
806804

807805
if (!buildInfoChecked.hasKey(project.options.configFilePath as ResolvedConfigFileName)) {
@@ -839,6 +837,18 @@ namespace ts {
839837
};
840838
}
841839

840+
function checkConfigFileUpToDateStatus(configFile: string, oldestOutputFileTime: Date, oldestOutputFileName: string): Status.OutOfDateWithSelf | undefined {
841+
// Check tsconfig time
842+
const tsconfigTime = host.getModifiedTime(configFile) || missingFileModifiedTime;
843+
if (oldestOutputFileTime < tsconfigTime) {
844+
return {
845+
type: UpToDateStatusType.OutOfDateWithSelf,
846+
outOfDateOutputFileName: oldestOutputFileName,
847+
newerInputFileName: configFile
848+
};
849+
}
850+
}
851+
842852
function invalidateProject(configFileName: string, reloadLevel?: ConfigFileProgramReloadLevel) {
843853
invalidateResolvedProject(resolveProjectName(configFileName), reloadLevel);
844854
}

src/testRunner/unittests/tsbuild/sample.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,37 @@ namespace ts {
282282
[Diagnostics.Updating_unchanged_output_timestamps_of_project_0, "/src/tests/tsconfig.json"]
283283
);
284284
});
285+
286+
it("rebuilds when extended config file changes", () => {
287+
const fs = projFs.shadow();
288+
fs.writeFileSync("/src/tests/tsconfig.base.json", JSON.stringify({ compilerOptions: { target: "es3" } }));
289+
replaceText(fs, "/src/tests/tsconfig.json", `"references": [`, `"extends": "./tsconfig.base.json", "references": [`);
290+
const host = new fakes.SolutionBuilderHost(fs);
291+
const builder = createSolutionBuilder(host, ["/src/tests"], { verbose: true });
292+
builder.buildAllProjects();
293+
host.assertDiagnosticMessages(
294+
getExpectedDiagnosticForProjectsInBuild("src/core/tsconfig.json", "src/logic/tsconfig.json", "src/tests/tsconfig.json"),
295+
[Diagnostics.Project_0_is_out_of_date_because_output_file_1_does_not_exist, "src/core/tsconfig.json", "src/core/anotherModule.js"],
296+
[Diagnostics.Building_project_0, "/src/core/tsconfig.json"],
297+
[Diagnostics.Project_0_is_out_of_date_because_output_file_1_does_not_exist, "src/logic/tsconfig.json", "src/logic/index.js"],
298+
[Diagnostics.Building_project_0, "/src/logic/tsconfig.json"],
299+
[Diagnostics.Project_0_is_out_of_date_because_output_file_1_does_not_exist, "src/tests/tsconfig.json", "src/tests/index.js"],
300+
[Diagnostics.Building_project_0, "/src/tests/tsconfig.json"]
301+
);
302+
host.clearDiagnostics();
303+
tick();
304+
builder.resetBuildContext();
305+
fs.writeFileSync("/src/tests/tsconfig.base.json", JSON.stringify({ compilerOptions: {} }));
306+
builder.buildAllProjects();
307+
host.assertDiagnosticMessages(
308+
getExpectedDiagnosticForProjectsInBuild("src/core/tsconfig.json", "src/logic/tsconfig.json", "src/tests/tsconfig.json"),
309+
[Diagnostics.Project_0_is_up_to_date_because_newest_input_1_is_older_than_oldest_output_2, "src/core/tsconfig.json", "src/core/anotherModule.ts", "src/core/anotherModule.js"],
310+
[Diagnostics.Project_0_is_up_to_date_because_newest_input_1_is_older_than_oldest_output_2, "src/logic/tsconfig.json", "src/logic/index.ts", "src/logic/index.js"],
311+
[Diagnostics.Project_0_is_out_of_date_because_oldest_output_1_is_older_than_newest_input_2, "src/tests/tsconfig.json", "src/tests/index.js", "src/tests/tsconfig.base.json"],
312+
[Diagnostics.Building_project_0, "/src/tests/tsconfig.json"],
313+
[Diagnostics.Updating_unchanged_output_timestamps_of_project_0, "/src/tests/tsconfig.json"]
314+
);
315+
});
285316
});
286317

287318
describe("downstream-blocked compilations", () => {

0 commit comments

Comments
 (0)