mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-06 23:51:38 +00:00
refactor(cli): share windows argv normalization
This commit is contained in:
78
src/cli/windows-argv.ts
Normal file
78
src/cli/windows-argv.ts
Normal file
@@ -0,0 +1,78 @@
|
||||
import fs from "node:fs";
|
||||
import path from "node:path";
|
||||
|
||||
export function normalizeWindowsArgv(argv: string[]): string[] {
|
||||
if (process.platform !== "win32") {
|
||||
return argv;
|
||||
}
|
||||
if (argv.length < 2) {
|
||||
return argv;
|
||||
}
|
||||
|
||||
const stripControlChars = (value: string): string => {
|
||||
let out = "";
|
||||
for (let i = 0; i < value.length; i += 1) {
|
||||
const code = value.charCodeAt(i);
|
||||
if (code >= 32 && code !== 127) {
|
||||
out += value[i];
|
||||
}
|
||||
}
|
||||
return out;
|
||||
};
|
||||
|
||||
const normalizeArg = (value: string): string =>
|
||||
stripControlChars(value)
|
||||
.replace(/^['"]+|['"]+$/g, "")
|
||||
.trim();
|
||||
const normalizeCandidate = (value: string): string =>
|
||||
normalizeArg(value).replace(/^\\\\\\?\\/, "");
|
||||
|
||||
const execPath = normalizeCandidate(process.execPath);
|
||||
const execPathLower = execPath.toLowerCase();
|
||||
const execBase = path.basename(execPath).toLowerCase();
|
||||
const isExecPath = (value: string | undefined): boolean => {
|
||||
if (!value) {
|
||||
return false;
|
||||
}
|
||||
const normalized = normalizeCandidate(value);
|
||||
if (!normalized) {
|
||||
return false;
|
||||
}
|
||||
const lower = normalized.toLowerCase();
|
||||
return (
|
||||
lower === execPathLower ||
|
||||
path.basename(lower) === execBase ||
|
||||
lower.endsWith("\\node.exe") ||
|
||||
lower.endsWith("/node.exe") ||
|
||||
lower.includes("node.exe") ||
|
||||
(path.basename(lower) === "node.exe" && fs.existsSync(normalized))
|
||||
);
|
||||
};
|
||||
|
||||
const next = [...argv];
|
||||
for (let i = 1; i <= 3 && i < next.length; ) {
|
||||
if (isExecPath(next[i])) {
|
||||
next.splice(i, 1);
|
||||
continue;
|
||||
}
|
||||
i += 1;
|
||||
}
|
||||
const filtered = next.filter((arg, index) => index === 0 || !isExecPath(arg));
|
||||
if (filtered.length < 3) {
|
||||
return filtered;
|
||||
}
|
||||
const cleaned = [...filtered];
|
||||
for (let i = 2; i < cleaned.length; ) {
|
||||
const arg = cleaned[i];
|
||||
if (!arg || arg.startsWith("-")) {
|
||||
i += 1;
|
||||
continue;
|
||||
}
|
||||
if (isExecPath(arg)) {
|
||||
cleaned.splice(i, 1);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return cleaned;
|
||||
}
|
||||
Reference in New Issue
Block a user