52 lines
1.1 KiB
TypeScript
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;
|
|
}
|
|
}
|