refactor: share script budget number parsing · openclaw/openclaw@150673a
vincentkoc
·
2026-05-30
·
via Recent Commits to openclaw:main
| Original file line number | Diff line number | Diff line change |
|---|
|
| 1 | +export function parseBudgetNumber(raw, label) { |
| 2 | +const value = raw?.trim(); |
| 3 | +if (!value) { |
| 4 | +return null; |
| 5 | +} |
| 6 | +const parsed = Number(value); |
| 7 | +if (!Number.isFinite(parsed) || parsed < 0) { |
| 8 | +throw new Error(`${label} must be a non-negative number`); |
| 9 | +} |
| 10 | +return parsed; |
| 11 | +} |
| 12 | + |
| 13 | +export function readBudgetEnvNumber(name, env = process.env) { |
| 14 | +return parseBudgetNumber(env[name], name); |
| 15 | +} |
| 16 | + |
| 17 | +export function budgetFloatFlag(flag, key) { |
| 18 | +return { |
| 19 | +consume(argv, index) { |
| 20 | +if (argv[index] !== flag) { |
| 21 | +return null; |
| 22 | +} |
| 23 | +return { |
| 24 | +nextIndex: index + 1, |
| 25 | +apply(target) { |
| 26 | +const parsed = parseBudgetNumber(argv[index + 1], flag); |
| 27 | +if (parsed === null) { |
| 28 | +throw new Error(`${flag} requires a value`); |
| 29 | +} |
| 30 | +target[key] = parsed; |
| 31 | +}, |
| 32 | +}; |
| 33 | +}, |
| 34 | +}; |
| 35 | +} |
| Original file line number | Diff line number | Diff line change |
|---|
|
1 | 1 | import { spawnSync } from "node:child_process"; |
2 | 2 | import fs from "node:fs"; |
3 | 3 | import { booleanFlag, intFlag, parseFlagArgs, stringFlag } from "./lib/arg-utils.mjs"; |
| 4 | +import { budgetFloatFlag, readBudgetEnvNumber } from "./lib/budget-number-args.mjs"; |
4 | 5 | import { readJsonFile } from "./test-report-utils.mjs"; |
5 | 6 | |
6 | 7 | const CLI_STARTUP_BENCH_FIXTURE_PATH = "test/fixtures/cli-startup-bench.json"; |
@@ -13,42 +14,6 @@ function formatMb(value) {
|
13 | 14 | return `${value.toFixed(1)}MB`; |
14 | 15 | } |
15 | 16 | |
16 | | -function parseBudgetNumber(raw, label) { |
17 | | -const value = raw?.trim(); |
18 | | -if (!value) { |
19 | | -return null; |
20 | | -} |
21 | | -const parsed = Number(value); |
22 | | -if (!Number.isFinite(parsed) || parsed < 0) { |
23 | | -throw new Error(`${label} must be a non-negative number`); |
24 | | -} |
25 | | -return parsed; |
26 | | -} |
27 | | - |
28 | | -function readBudgetEnvNumber(name) { |
29 | | -return parseBudgetNumber(process.env[name], name); |
30 | | -} |
31 | | - |
32 | | -function budgetFloatFlag(flag, key) { |
33 | | -return { |
34 | | -consume(argv, index) { |
35 | | -if (argv[index] !== flag) { |
36 | | -return null; |
37 | | -} |
38 | | -return { |
39 | | -nextIndex: index + 1, |
40 | | -apply(target) { |
41 | | -const parsed = parseBudgetNumber(argv[index + 1], flag); |
42 | | -if (parsed === null) { |
43 | | -throw new Error(`${flag} requires a value`); |
44 | | -} |
45 | | -target[key] = parsed; |
46 | | -}, |
47 | | -}; |
48 | | -}, |
49 | | -}; |
50 | | -} |
51 | | - |
52 | 17 | if (process.argv.slice(2).includes("--help")) { |
53 | 18 | console.log( |
54 | 19 | [ |
|
| Original file line number | Diff line number | Diff line change |
|---|
|
1 | 1 | import { pathToFileURL } from "node:url"; |
2 | 2 | import { parseFlagArgs, stringFlag } from "./lib/arg-utils.mjs"; |
| 3 | +import { |
| 4 | +budgetFloatFlag, |
| 5 | +parseBudgetNumber, |
| 6 | +readBudgetEnvNumber, |
| 7 | +} from "./lib/budget-number-args.mjs"; |
3 | 8 | import { formatMs } from "./lib/vitest-report-cli-utils.mjs"; |
4 | 9 | import { readJsonFile, runVitestJsonReport } from "./test-report-utils.mjs"; |
5 | 10 | |
6 | | -function parseBudgetNumber(raw, label) { |
7 | | -const value = raw?.trim(); |
8 | | -if (!value) { |
9 | | -return null; |
10 | | -} |
11 | | -const parsed = Number(value); |
12 | | -if (!Number.isFinite(parsed) || parsed < 0) { |
13 | | -throw new Error(`${label} must be a non-negative number`); |
14 | | -} |
15 | | -return parsed; |
16 | | -} |
17 | | - |
18 | | -function readBudgetEnvNumber(name, env) { |
19 | | -return parseBudgetNumber(env[name], name); |
20 | | -} |
21 | | - |
22 | | -function budgetFloatFlag(flag, key) { |
23 | | -return { |
24 | | -consume(argv, index) { |
25 | | -if (argv[index] !== flag) { |
26 | | -return null; |
27 | | -} |
28 | | -return { |
29 | | -nextIndex: index + 1, |
30 | | -apply(target) { |
31 | | -const parsed = parseBudgetNumber(argv[index + 1], flag); |
32 | | -if (parsed === null) { |
33 | | -throw new Error(`${flag} requires a value`); |
34 | | -} |
35 | | -target[key] = parsed; |
36 | | -}, |
37 | | -}; |
38 | | -}, |
39 | | -}; |
40 | | -} |
41 | | - |
42 | 11 | function parseArgs(argv, env = process.env) { |
43 | 12 | return parseFlagArgs( |
44 | 13 | argv, |
@@ -71,7 +40,7 @@ function main() {
|
71 | 40 | config: opts.config, |
72 | 41 | prefix: "openclaw-vitest-perf", |
73 | 42 | }); |
74 | | -const elapsedMs = Number(process.hrtime.bigint() - startedAt) / 1_000_000; |
| 43 | +const elapsedMs = Number.parseFloat(String(process.hrtime.bigint() - startedAt)) / 1_000_000; |
75 | 44 | |
76 | 45 | let totalFileDurationMs = 0; |
77 | 46 | let fileCount = 0; |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。