

















@@ -19,6 +19,7 @@ const CORE_SHARD = {
1919name: "core",
2020args: ["--tsconfig", "config/tsconfig/oxlint.core.json", "src", "ui", "packages"],
2121};
22+const CORE_SPLIT_TARGETS = ["src", "ui", "packages"];
2223const EXTENSIONS_SHARD = {
2324name: "extensions",
2425args: ["--tsconfig", EXTENSION_TS_CONFIG, EXTENSIONS_DIR],
@@ -33,11 +34,20 @@ export function createOxlintShards({
3334 env = process.env,
3435 platform = process.platform,
3536 readDir = fs.readdirSync,
37+ splitCore = false,
3638} = {}) {
39+const coreShards = splitCore ? createCoreOxlintShards() : [CORE_SHARD];
3740const extensionShards =
3841platform === "win32" ? createWindowsExtensionShards({ cwd, env, readDir }) : [EXTENSIONS_SHARD];
394240-return [CORE_SHARD, ...extensionShards, SCRIPTS_SHARD];
43+return [...coreShards, ...extensionShards, SCRIPTS_SHARD];
44+}
45+46+export function createCoreOxlintShards() {
47+return CORE_SPLIT_TARGETS.map((target) => ({
48+name: `core:${target}`,
49+args: ["--tsconfig", "config/tsconfig/oxlint.core.json", target],
50+}));
4151}
42524353export function createWindowsExtensionShards({
@@ -143,13 +153,14 @@ function listExtensionEntries({ cwd, readDir }) {
143153144154export async function main(extraArgs = process.argv.slice(2), runtimeEnv = process.env) {
145155const runner = path.resolve("scripts", "run-oxlint.mjs");
156+const shardArgs = parseShardRunnerArgs(extraArgs);
146157const env = resolveLocalHeavyCheckEnv(runtimeEnv);
147-const hasMetadataOnlyFlag = extraArgs.some((arg) =>
158+const hasMetadataOnlyFlag = shardArgs.oxlintArgs.some((arg) =>
148159["--help", "-h", "--version", "-V", "--rules", "--print-config", "--init"].includes(arg),
149160);
150161const shouldAcquireParentLock =
151162!hasMetadataOnlyFlag ||
152-shouldAcquireLocalHeavyCheckLockForOxlint(extraArgs, {
163+shouldAcquireLocalHeavyCheckLockForOxlint(shardArgs.oxlintArgs, {
153164cwd: process.cwd(),
154165 env,
155166});
@@ -168,7 +179,9 @@ export async function main(extraArgs = process.argv.slice(2), runtimeEnv = proce
168179cwd: process.cwd(),
169180 env,
170181platform: process.platform,
182+splitCore: shardArgs.splitCore,
171183});
184+const selectedShards = filterOxlintShards(shards, shardArgs.only);
172185173186try {
174187const prepareResult = spawnSync(
@@ -186,13 +199,24 @@ export async function main(extraArgs = process.argv.slice(2), runtimeEnv = proce
186199if ((prepareResult.status ?? 1) !== 0) {
187200process.exitCode = prepareResult.status ?? 1;
188201} else {
189-const runSerial = shouldRunOxlintShardsSerial({
190- env,
191-platform: process.platform,
192-});
202+const runSerial =
203+shardArgs.splitCore ||
204+shouldRunOxlintShardsSerial({
205+ env,
206+platform: process.platform,
207+});
193208const results = runSerial
194- ? await runShardsSerial({ entries: shards, env, extraArgs, runner })
195- : await Promise.all(shards.map((shard) => runShard({ env, extraArgs, runner, shard })));
209+ ? await runShardsSerial({
210+entries: selectedShards,
211+ env,
212+extraArgs: shardArgs.oxlintArgs,
213+ runner,
214+})
215+ : await Promise.all(
216+selectedShards.map((shard) =>
217+runShard({ env, extraArgs: shardArgs.oxlintArgs, runner, shard }),
218+),
219+);
196220process.exitCode = results.find((status) => status !== 0) ?? 0;
197221}
198222} finally {
@@ -216,6 +240,46 @@ function resolveHostResources(hostResources) {
216240};
217241}
218242243+export function parseShardRunnerArgs(args) {
244+const only = new Set();
245+const oxlintArgs = [];
246+let splitCore = false;
247+248+for (let index = 0; index < args.length; index += 1) {
249+const arg = args[index];
250+if (arg === "--split-core") {
251+splitCore = true;
252+continue;
253+}
254+if (arg === "--only") {
255+const value = args[index + 1];
256+if (value) {
257+only.add(value);
258+index += 1;
259+}
260+continue;
261+}
262+if (arg.startsWith("--only=")) {
263+const value = arg.slice("--only=".length);
264+if (value) {
265+only.add(value);
266+}
267+continue;
268+}
269+oxlintArgs.push(arg);
270+}
271+272+return { only, oxlintArgs, splitCore };
273+}
274+275+export function filterOxlintShards(shards, only) {
276+if (only.size === 0) {
277+return shards;
278+}
279+280+return shards.filter((shard) => only.has(shard.name) || only.has(shard.name.split(":")[0]));
281+}
282+219283async function runShardsSerial({ entries, env, extraArgs, runner }) {
220284const results = [];
221285for (const shard of entries) {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。