Files
babel/Makefile.source.ts
Huáng JùnliàngandGitHub 8a9df06e70 Bump typescript-eslint to 8.59.2 (#17984)
* chore: bump typescript-eslint

* chore(eslint) ignore args starting from _

Ref: https://typescript-eslint.io/rules/no-unused-vars#what-benefits-does-this-rule-have-over-typescript

* fix eslint errors

* reduce chunksize to 16
2026-05-11 09:41:49 -04:00

561 lines
13 KiB
TypeScript

/* eslint-disable @typescript-eslint/dot-notation */
import "shelljs/make.js";
import path from "node:path";
import mod from "node:module";
import {
readFileSync,
writeFileSync,
readdirSync,
existsSync,
mkdirSync,
} from "node:fs";
import { execaSync } from "execa";
mod.enableCompileCache?.();
const shell = global as any as typeof import("shelljs");
const target = new Proxy((global as any).target, {
set: function (obj, prop, value, receiver) {
return Reflect.set(obj, prop, value, receiver);
},
get: function (obj, prop, receiver) {
console.log(`make ${prop as string}`);
return Reflect.get(obj, prop, receiver);
},
});
const SOURCES = ["packages", "codemods", "eslint"];
const YARN_PATH = shell.which("yarn")!.stdout;
const NODE_PATH = process.execPath; // `yarn node` is so slow on Windows
shell.config.verbose = true;
function exec(
executable: string,
args: string[],
cwd?: string,
inheritStdio = true,
noExit = false
): string {
console.log(
`${executable
.replaceAll(YARN_PATH, "yarn")
.replaceAll(NODE_PATH, "node")} ${args.join(" ")}`
);
try {
return execaSync(executable, args, {
stdio: inheritStdio ? "inherit" : undefined,
cwd: cwd && path.resolve(cwd),
env: process.env,
}).stdout!;
} catch (error: any) {
if (inheritStdio && error.exitCode !== 0) {
console.error(
new Error(
`\ncommand: ${executable} ${args.join(" ")}\ncode: ${error.exitCode}`
)
);
if (!noExit) {
// eslint-disable-next-line n/no-process-exit
process.exit(error.exitCode);
}
}
throw error;
}
}
function yarn(
args: string[],
cwd?: string,
inheritStdio?: boolean,
noExit?: boolean
) {
return exec(YARN_PATH, args, cwd, inheritStdio, noExit);
}
function node(args: string[], cwd?: string, inheritStdio?: boolean) {
return exec(NODE_PATH, args, cwd, inheritStdio);
}
function env(fun: () => void, env: NodeJS.ProcessEnv) {
const envBak = process.env;
process.env = { ...envBak, ...env };
fun();
process.env = envBak;
}
/**
* CLEAN
*/
target["clean-all"] = function () {
shell.rm("-rf", ["package-lock.json", ".changelog"]);
SOURCES.forEach(source => {
shell.rm("-rf", `${source}/*/test/tmp`);
shell.rm("-rf", `${source}/*/package-lock.json`);
});
target["clean"]();
target["clean-lib"]();
target["clean-node-modules"]();
target["clean-ts"]();
};
target["clean-node-modules"] = function () {
shell.rm("-rf", "node_modules");
SOURCES.forEach(source => {
shell.rm("-rf", `${source}/*/node_modules`);
});
};
target["clean"] = function () {
target["test-clean"]();
shell.rm("-rf", [
".npmrc",
"coverage",
"packages/*/npm-debug*",
"node_modules/.cache",
]);
};
target["test-clean"] = function () {
SOURCES.forEach(source => {
shell.rm("-rf", `${source}/*/test/tmp`);
shell.rm("-rf", `${source}/*/test-fixtures.json`);
});
};
target["clean-lib"] = function () {
shell.rm(
"-rf",
SOURCES.map(source => `${source}/*/lib`)
);
};
target["clean-runtime-helpers"] = function () {
shell.rm("-rf", [
"packages/babel-runtime/helpers/**/*.js",
"packages/babel-runtime-corejs2/helpers/**/*.js",
"packages/babel-runtime-corejs3/helpers/**/*.js",
"packages/babel-runtime/helpers/**/*.mjs",
"packages/babel-runtime-corejs2/helpers/**/*.mjs",
"packages/babel-runtime-corejs3/helpers/**/*.mjs",
"packages/babel-runtime-corejs2/core-js",
"packages/babel-runtime-corejs3/core-js",
"packages/babel-runtime-corejs3/core-js-stable",
]);
};
target["bootstrap-only"] = function () {
target["clean-all"]();
yarn(["install"]);
};
target["bootstrap"] = function () {
target["bootstrap-only"]();
target["generate-tsconfig"]();
target["build"]();
};
target["build"] = function () {
target["build-no-bundle"]();
if (process.env.BABEL_COVERAGE !== "true") {
target["build-standalone"]();
}
};
target["build-standalone"] = function () {
yarn(["gulp", "build-babel-standalone"]);
};
target["build-bundle"] = function () {
target["clean"]();
target["clean-lib"]();
target["bundle-babel-parser-dts"]();
yarn(["gulp", "build"]);
target["build-dist"]();
};
target["build-no-bundle"] = function () {
target["clean"]();
target["clean-lib"]();
target["bundle-babel-parser-dts"]();
env(
() => {
yarn(["gulp", "build-dev"]);
},
{ BABEL_ENV: "development" }
);
target["build-dist"]();
};
target["build-flow-typings"] = function () {
writeFileSync(
"packages/babel-types/lib/index.js.flow",
node(["packages/babel-types/scripts/generators/flow.ts"], undefined, false)
);
};
target["build-dist"] = function () {
target["build-plugin-transform-runtime-dist"]();
};
target["build-plugin-transform-runtime-dist"] = function () {
node(["scripts/build-dist.ts"], "packages/babel-plugin-transform-runtime");
};
target["prepublish"] = function () {
target["bootstrap-only"]();
env(
() => {
target["prepublish-build"]();
target["test"]();
},
{
IS_PUBLISH: "true",
}
);
};
target["prepublish-build"] = function () {
target["clean-lib"]();
target["clean-runtime-helpers"]();
node(["scripts/generators/npm-ignore.ts"]);
env(
() => {
target["build-bundle"]();
},
{
NODE_ENV: "production",
BABEL_ENV: "production",
STRIP_BABEL_VERSION_FLAG: "true",
IS_PUBLISH: "true",
}
);
env(
() => {
target["prepublish-build-standalone"]();
target["clone-license"]();
target["prepublish-prepare-dts"]();
target["build-flow-typings"]();
},
{
NODE_ENV: "production",
STRIP_BABEL_VERSION_FLAG: "true",
}
);
};
target["prepublish-build-standalone"] = function () {
env(
() => {
target["build-standalone"]();
},
{
BABEL_ENV: "production",
IS_PUBLISH: "true",
}
);
};
target["prepublish-prepare-dts"] = function () {
target["clean-ts"]();
target["tscheck"]();
target["prepublish-prepare-dts-no-clean"]();
};
target["bundle-babel-parser-dts"] = function () {
target["tscheck-babel-parser"]();
yarn(["gulp", "bundle-babel-parser-dts"]);
};
target["prepublish-prepare-dts-no-clean"] = function () {
yarn(["gulp", "bundle-dts"]);
target["build-typescript-legacy-typings"]();
yarn(["tsc", "-p", "tsconfig.dts-bundles.json"]);
};
target["tscheck"] = function () {
target["generate-tsconfig"]();
node(["scripts/parallel-tsc/tsc.ts", "."]);
target["tscheck-helpers"]();
};
target["tscheck-babel-parser"] = function () {
node(["scripts/parallel-tsc/tsc.ts", "./packages/babel-parser"]);
};
target["tscheck-helpers"] = function () {
yarn(["tsc", "-p", "./packages/babel-helpers/src/helpers/tsconfig.json"]);
};
target["clean-ts"] = function () {
// ts doesn't generate declaration files after we remove the output directory manually when incremental==true
shell.rm("-rf", "tsconfig.tsbuildinfo");
shell.rm("-rf", "*/*/tsconfig.tsbuildinfo");
shell.rm("-rf", "dts");
};
target["generate-tsconfig"] = function () {
node(["scripts/generators/tsconfig.ts"]);
node(["scripts/generators/archived-libs-typings.ts"]);
};
target["generate-type-helpers"] = function () {
yarn(["gulp", "generate-type-helpers"]);
};
target["build-typescript-legacy-typings"] = function () {
writeFileSync(
"packages/babel-types/lib/index-legacy.d.ts",
node(
["packages/babel-types/scripts/generators/typescript-legacy.ts"],
undefined,
false
)
);
};
target["clone-license"] = function () {
node(["scripts/clone-license.ts"]);
};
/**
* DEV
*/
function eslint(...extraArgs: string[]) {
const eslintArgs = [
"--format",
"codeframe",
"--concurrency",
"auto",
"--flag",
"unstable_native_nodejs_ts_config",
...extraArgs.filter(Boolean),
];
const packagesPackages = readdirSync("packages").filter(n =>
existsSync(`packages/${n}/package.json`)
);
const chunks = [];
// Linting everything at the same time needs too much memory and crashes
// Do it in batches packages
for (let i = 0, chunkSize = 16; i < packagesPackages.length; i += chunkSize) {
if (packagesPackages.length - i === 1) {
// Only one package remaining
chunks.push([`packages/${packagesPackages[i]}/**/*`]);
} else {
chunks.push([
`packages/{${packagesPackages.slice(i, i + chunkSize)}}/**/*`,
]);
}
}
const rest = [
"eslint",
"codemods",
"scripts",
"benchmark",
"*.{js,cjs,mjs,ts}",
];
chunks.push(rest);
if (process.env.ESLINT_GO_BRRRR) {
// Run in a single process with workers. Needs a lot of memory (23GiB).
env(() => yarn(["eslint", "packages", ...rest, ...eslintArgs]), {
BABEL_ENV: "test",
NODE_OPTIONS: "--max-old-space-size=8192",
});
} else {
let err = null;
for (const chunk of chunks) {
try {
env(
() =>
yarn(
["eslint", ...chunk, ...eslintArgs],
undefined,
undefined,
true
),
{ BABEL_ENV: "test" }
);
} catch (e: any) {
err = e;
}
}
// eslint-disable-next-line n/no-process-exit
if (err) process.exit(err.exitCode);
}
}
target["lint"] = function () {
env(() => target["tscheck"](), { TSCHECK_SILENT: "true" });
eslint();
yarn(["tstyche"]);
target["lint-prettier"]();
};
target["lint-ci"] = function () {
target["tscheck"]();
eslint();
yarn(["tstyche"]);
target["lint-prettier"]();
target["prepublish-prepare-dts-no-clean"]();
};
target["lint-prettier"] = function () {
yarn(["prettier", ".", "--check"]);
};
target["fix"] = function () {
target["fix-js"]();
target["fix-prettier"]();
};
target["fix-js"] = function () {
env(() => target["tscheck"](), { TSCHECK_SILENT: "true" });
eslint("--fix");
};
target["fix-prettier"] = function () {
yarn(["prettier", ".", "--write"]);
};
target["watch"] = function () {
target["build-no-bundle"]();
env(
() => {
yarn(["gulp", "watch"]);
},
{
BABEL_ENV: "development",
WATCH_SKIP_BUILD: "true",
}
);
};
target["test"] = function () {
target["lint"]();
target["test-only"]();
};
target["test-only"] = function (args = []) {
yarn(["jest", ...args]);
};
target["test-cov"] = function () {
target["build"]();
env(
() => {
yarn(["c8", "jest"]);
},
{
BABEL_ENV: "test",
BABEL_COVERAGE: "true",
}
);
};
function bootstrapParserTests(
name: string,
repoURL: string,
subPaths: string[]
) {
function getParserTestsCommit(id: string): string {
const content = readFileSync("./Makefile", "utf8");
const commit = new RegExp(`${id}_COMMIT = (\\w{40})`).exec(content)![1];
if (!commit) throw new Error(`Could not find ${id}_COMMIT in Makefile`);
return commit;
}
const dir = "./build/" + name.toLowerCase();
shell.rm("-rf", dir);
console.log("mkdir -p build");
mkdirSync("build", { recursive: true });
exec("git", [
"clone",
"--filter=blob:none",
"--sparse",
"--depth",
"1",
"--revision=" + getParserTestsCommit(name),
repoURL,
dir,
]);
exec("git", ["sparse-checkout", "set", ...subPaths], dir);
}
target["bootstrap-test262"] = function () {
bootstrapParserTests("TEST262", "https://github.com/tc39/test262.git", [
"test",
"harness",
]);
};
target["bootstrap-typescript"] = function () {
bootstrapParserTests(
"TYPESCRIPT",
"https://github.com/microsoft/TypeScript.git",
["tests"]
);
};
target["bootstrap-flow"] = function () {
bootstrapParserTests("FLOW", "https://github.com/facebook/flow.git", [
"src/parser/test/flow",
]);
};
/**
* PUBLISH
*/
target["new-version-checklist"] = function () {
// eslint-disable-next-line no-constant-condition
if (0) {
console.log(
`
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!! !!!!!!
!!!!!! Write any important message here, and change the !!!!!!
!!!!!! if (0) above to if (1) !!!!!!
!!!!!! !!!!!!
!!!!!! !!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
`.trim()
);
// eslint-disable-next-line n/no-process-exit
process.exit(1);
}
};
target["new-version"] = function () {
target["new-version-checklist"]();
exec("git", ["pull", "--rebase"]);
yarn(["release-tool", "version", "-f", "@babel/standalone"]);
};