[ts/checkProjects] validate extends of all ts projects (#145176)

Fixes https://github.com/elastic/kibana/issues/145129

In order to make our TS setup in the repo far more efficient we needed
to make it a little more complicated than it used to be. This includes a
few rules that all tsconfig files need to follow which were currently
assumed to be true, but with this PR will now be validated:

1. No tsconfig.json files are allowed to extend the `tsconfig.json`
file. This file is used to produce types for the root of the repo, and
include the `package.json` file in a project so it can be referenced in
projects directly. Files which violate this rule were updated to point
to the root `tsconfig.base.json` file.
2. Every tsconfig.json file must extend the `tsconfig.base.json` file,
either directly or indirectly.
This commit is contained in:
Spencer 2022-11-16 08:57:51 -07:00 committed by GitHub
parent 2a69211f6e
commit 12aeaa8101
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 28 additions and 4 deletions

View file

@ -1,5 +1,5 @@
{
"extends": "../../tsconfig.json",
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"outDir": "./target",
"skipLibCheck": true

View file

@ -1,5 +1,5 @@
{
"extends": "../../tsconfig.json",
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"outDir": "./target/types"
},

View file

@ -1,5 +1,5 @@
{
"extends": "../../tsconfig.json",
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"outDir": "./target/types"
},

View file

@ -1,5 +1,5 @@
{
"extends": "../../tsconfig.json",
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"outDir": "./target",
"skipLibCheck": true

View file

@ -174,4 +174,8 @@ export class Project {
? [this.tsConfigPath, ...this.baseProject.getConfigPaths()]
: [this.tsConfigPath];
}
public getProjectsDeep(): Project[] {
return this.baseProject ? [this, ...this.baseProject.getProjectsDeep()] : [this];
}
}

View file

@ -12,6 +12,7 @@ import { run } from '@kbn/dev-cli-runner';
import { asyncMapWithLimit } from '@kbn/std';
import { createFailError } from '@kbn/dev-cli-errors';
import { getRepoFiles } from '@kbn/get-repo-files';
import { REPO_ROOT } from '@kbn/utils';
import globby from 'globby';
import { File } from '../file';
@ -37,6 +38,25 @@ export async function runCheckTsProjectsCli() {
const stats = new Stats();
let failed = false;
const everyProjectDeep = new Set(PROJECTS.flatMap((p) => p.getProjectsDeep()));
for (const proj of everyProjectDeep) {
const [, ...baseConfigRels] = proj.getConfigPaths().map((p) => Path.relative(REPO_ROOT, p));
const configRel = Path.relative(REPO_ROOT, proj.tsConfigPath);
if (baseConfigRels[0] === 'tsconfig.json') {
failed = true;
log.error(
`[${configRel}]: This tsconfig extends the root tsconfig.json file and shouldn't. The root tsconfig.json file is not a valid base config, you probably want to point to the tsconfig.base.json file.`
);
}
if (configRel !== 'tsconfig.base.json' && !baseConfigRels.includes('tsconfig.base.json')) {
failed = true;
log.error(
`[${configRel}]: This tsconfig does not extend the tsconfig.base.json file either directly or indirectly. The TS config setup for the repo expects every tsconfig file to extend this base config file.`
);
}
}
const pathsAndProjects = await asyncMapWithLimit(PROJECTS, 5, async (proj) => {
const paths = await globby(proj.getIncludePatterns(), {
ignore: proj.getExcludePatterns(),