Files
feynman/src/system/open-url.ts
2026-03-25 10:04:45 -07:00

52 lines
1.1 KiB
TypeScript

import { spawn } from "node:child_process";
import { resolveExecutable } from "./executables.js";
type ResolveExecutableFn = (name: string, fallbackPaths?: string[]) => string | undefined;
type OpenUrlCommand = {
command: string;
args: string[];
};
export function getOpenUrlCommand(
url: string,
platform = process.platform,
resolveCommand: ResolveExecutableFn = resolveExecutable,
): OpenUrlCommand | undefined {
if (platform === "win32") {
return {
command: "cmd",
args: ["/c", "start", "", url],
};
}
if (platform === "darwin") {
const command = resolveCommand("open");
return command ? { command, args: [url] } : undefined;
}
const command = resolveCommand("xdg-open");
return command ? { command, args: [url] } : undefined;
}
export function openUrl(url: string): boolean {
const command = getOpenUrlCommand(url);
if (!command) {
return false;
}
try {
const child = spawn(command.command, command.args, {
detached: true,
stdio: "ignore",
windowsHide: true,
});
child.on("error", () => {});
child.unref();
return true;
} catch {
return false;
}
}