Don't use "composite": true in tsc (until it supports cycles) (#13242)

* [ts] Don't use project references

* Commit `tsconfig.json` so it's ready-to-go

* Remove `clean-tsconfig` task

* Fix dts generation

* Add comment

* `yarn`

* Review

* Fix regexp
This commit is contained in:
Nicolò Ribaudo
2021-05-03 20:47:53 +02:00
committed by GitHub
parent 07440424d9
commit 175a51f94e
9 changed files with 145 additions and 132 deletions

View File

@@ -1,10 +1,6 @@
import path from "path";
import fs from "fs";
import { createRequire } from "module";
import { fileURLToPath } from "url";
import globby from "globby";
const require = createRequire(import.meta.url);
const root = path.resolve(
path.dirname(fileURLToPath(import.meta.url)),
@@ -18,15 +14,9 @@ function getTsPkgs(subRoot) {
.map(name => ({
name: name.replace(/^babel-/, "@babel/"),
dir: path.resolve(root, subRoot, name),
relative: `./${subRoot}/${name}`,
}))
.filter(({ dir }) => {
try {
fs.statSync(path.join(dir, "src", "index.ts"));
return true;
} catch {
return false;
}
});
.filter(({ dir }) => fs.existsSync(path.join(dir, "src", "index.ts")));
}
const tsPkgs = [
@@ -35,83 +25,20 @@ const tsPkgs = [
...getTsPkgs("codemods"),
];
function sourceDeps(packageDir) {
const files = globby.sync(`src/**/*.ts`, {
cwd: packageDir,
onlyFiles: true,
dot: true,
ignore: ["**/node_modules/**"],
});
const result = new Set();
for (const file of files) {
const filename = path.join(packageDir, file);
const source = fs.readFileSync(filename, { encoding: "utf8" });
for (const [importSource] of source.matchAll(
/(?<=from\s*")@babel\/[^"/]+/g
)) {
result.add(importSource);
}
}
return result;
}
for (const { dir } of tsPkgs) {
const pkg = require(`${dir}/package.json`);
try {
const tsconfig = require(`${dir}/tsconfig.json`);
// Don't overwrite manually written configs
if (!tsconfig.generated) continue;
} catch {}
const deps = new Set([
...(pkg.dependencies ? Object.keys(pkg.dependencies) : []),
...(pkg.peerDependencies ? Object.keys(pkg.peerDependencies) : []),
// todo(flow->ts): update dependencies in package.json if dependency declared incorrectly
...sourceDeps(dir),
]);
const references = [];
for (const dep of deps) {
if (!dep.startsWith("@babel/")) continue;
for (const { name, dir: depDir } of tsPkgs) {
if (name === dep) {
references.push({ path: path.relative(dir, depDir) });
break;
}
}
}
fs.writeFileSync(
path.resolve(dir, "tsconfig.json"),
fs.writeFileSync(
path.resolve(root, `tsconfig.json`),
"/* This file is automatically generated by scripts/generators/tconfig.js */\n" +
JSON.stringify(
{
generated: true,
extends: "../../tsconfig.base.json",
extends: "./tsconfig.base.json",
include: tsPkgs.map(({ relative }) => `${relative}/src/**/*.ts`),
compilerOptions: {
outDir: "./lib",
rootDir: "./src",
paths: Object.fromEntries(
tsPkgs.map(({ name, relative }) => [name, [`${relative}/src`]])
),
},
include: ["./src/**/*"],
references,
},
null,
2
)
);
}
fs.writeFileSync(
path.resolve(root, `tsconfig.json`),
JSON.stringify(
{
files: [],
references: tsPkgs.map(({ dir }) => ({
path: path.relative(root, dir),
})),
},
null,
2
)
);