Skip to content

Commit f5d013c

Browse files
fix: reject malformed CODEMAP_PARSE_WORKERS values (#121)
Require a full decimal-integer string before applying the worker-count override.
1 parent 17dcbd1 commit f5d013c

3 files changed

Lines changed: 44 additions & 4 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"codemap": patch
3+
---
4+
5+
Reject malformed `CODEMAP_PARSE_WORKERS` values (e.g. `2abc`, `1.5`) instead of silently truncating with `parseInt`.

src/worker-pool.test.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { describe, expect, test } from "bun:test";
2+
3+
import { parseParseWorkerCountOverride } from "./worker-pool";
4+
5+
describe("parseParseWorkerCountOverride", () => {
6+
test("accepts valid decimal integers", () => {
7+
expect(parseParseWorkerCountOverride("2")).toBe(2);
8+
expect(parseParseWorkerCountOverride("32")).toBe(32);
9+
expect(parseParseWorkerCountOverride("999")).toBe(32);
10+
});
11+
12+
test("rejects malformed or non-positive values", () => {
13+
expect(parseParseWorkerCountOverride("2abc")).toBeNull();
14+
expect(parseParseWorkerCountOverride("1.5")).toBeNull();
15+
expect(parseParseWorkerCountOverride("0")).toBeNull();
16+
expect(parseParseWorkerCountOverride("-1")).toBeNull();
17+
expect(parseParseWorkerCountOverride(" 2")).toBeNull();
18+
});
19+
20+
test("treats unset or empty as no override", () => {
21+
expect(parseParseWorkerCountOverride(undefined)).toBeNull();
22+
expect(parseParseWorkerCountOverride("")).toBeNull();
23+
});
24+
});

src/worker-pool.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,25 @@ const WORKER_URL_NODE = new URL(
2020
import.meta.url,
2121
);
2222

23+
const PARSE_WORKER_COUNT_RE = /^\d+$/;
24+
25+
/** Returns clamped override [1, 32], or `null` when unset/empty/invalid. */
26+
export function parseParseWorkerCountOverride(
27+
env: string | undefined,
28+
): number | null {
29+
if (env === undefined || env === "") return null;
30+
if (!PARSE_WORKER_COUNT_RE.test(env)) return null;
31+
const parsed = Number(env);
32+
if (!Number.isSafeInteger(parsed) || parsed < 1) return null;
33+
return Math.min(parsed, 32);
34+
}
35+
2336
// Override via `CODEMAP_PARSE_WORKERS` (clamped [1, 32]); default formula unchanged when unset.
2437
function resolveWorkerCount(): number {
2538
const env = process.env.CODEMAP_PARSE_WORKERS;
39+
const override = parseParseWorkerCountOverride(env);
40+
if (override !== null) return override;
2641
if (env !== undefined && env !== "") {
27-
const parsed = Number.parseInt(env, 10);
28-
if (Number.isFinite(parsed) && parsed >= 1) {
29-
return Math.min(parsed, 32);
30-
}
3142
console.error(
3243
`[worker-pool] ignoring invalid CODEMAP_PARSE_WORKERS=${JSON.stringify(env)} (expected positive integer ≤32)`,
3344
);

0 commit comments

Comments
 (0)