79 lines
2.0 KiB
TypeScript
79 lines
2.0 KiB
TypeScript
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;
|
|
}
|