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:
@@ -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
|
||||
)
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user