Files
openclaw/scripts/run-oxlint-shards.mjs
2026-05-15 21:21:17 +01:00

103 lines
2.7 KiB
JavaScript

import { spawn, spawnSync } from "node:child_process";
import path from "node:path";
import {
acquireLocalHeavyCheckLockSync,
resolveLocalHeavyCheckEnv,
shouldAcquireLocalHeavyCheckLockForOxlint,
} from "./lib/local-heavy-check-runtime.mjs";
const extraArgs = process.argv.slice(2);
const runner = path.resolve("scripts", "run-oxlint.mjs");
const env = resolveLocalHeavyCheckEnv(process.env);
const hasMetadataOnlyFlag = extraArgs.some((arg) =>
["--help", "-h", "--version", "-V", "--rules", "--print-config", "--init"].includes(arg),
);
const shouldAcquireParentLock =
!hasMetadataOnlyFlag ||
shouldAcquireLocalHeavyCheckLockForOxlint(extraArgs, {
cwd: process.cwd(),
env,
});
const releaseLock =
env.OPENCLAW_OXLINT_SKIP_LOCK === "1"
? () => {}
: shouldAcquireParentLock
? acquireLocalHeavyCheckLockSync({
cwd: process.cwd(),
env,
toolName: "oxlint shards",
})
: () => {};
const shards = [
{
name: "core",
args: ["--tsconfig", "config/tsconfig/oxlint.core.json", "src", "ui", "packages"],
},
{
name: "extensions",
args: ["--tsconfig", "config/tsconfig/oxlint.extensions.json", "extensions"],
},
{
name: "scripts",
args: ["--tsconfig", "config/tsconfig/oxlint.scripts.json", "scripts"],
},
];
try {
const prepareResult = spawnSync(
process.execPath,
[path.resolve("scripts", "prepare-extension-package-boundary-artifacts.mjs")],
{
stdio: "inherit",
env,
},
);
if (prepareResult.error) {
throw prepareResult.error;
}
if ((prepareResult.status ?? 1) !== 0) {
process.exitCode = prepareResult.status ?? 1;
} else {
const runSerial = env.OPENCLAW_OXLINT_SHARDS_SERIAL === "1";
const results = runSerial
? await runShardsSerial(shards)
: await Promise.all(shards.map((shard) => runShard(shard)));
process.exitCode = results.find((status) => status !== 0) ?? 0;
}
} finally {
releaseLock();
}
async function runShardsSerial(entries) {
const results = [];
for (const shard of entries) {
results.push(await runShard(shard));
}
return results;
}
async function runShard(shard) {
console.error(`[oxlint:${shard.name}] starting`);
const child = spawn(process.execPath, [runner, ...shard.args, ...extraArgs], {
stdio: "inherit",
env: {
...env,
OPENCLAW_OXLINT_SKIP_LOCK: "1",
OPENCLAW_OXLINT_SKIP_PREPARE: "1",
},
});
return await new Promise((resolve) => {
child.once("error", (error) => {
console.error(error);
resolve(1);
});
child.once("close", (status) => {
console.error(`[oxlint:${shard.name}] finished`);
resolve(status ?? 1);
});
});
}