This repository has been archived on 2026-08-23. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
pi-web/src/server/diagnostics/nodePtyNativeModule.ts
T

55 lines
1.6 KiB
TypeScript

import { createRequire } from "node:module";
export const NODE_PTY_GLOBAL_REINSTALL_COMMAND = "npm install -g @jmfederico/pi-web --allow-scripts=node-pty";
const doctorLabel = "node-pty native module loadable";
const requireFromHere = createRequire(import.meta.url);
type LoadNodePty = () => unknown;
export interface NodePtyNativeModuleCheckOptions {
load?: LoadNodePty;
}
export type NodePtyNativeModuleCheck =
| { status: "ok" }
| { status: "load-failed"; message: string };
export interface FormattedNodePtyNativeModuleCheck {
ok: boolean;
lines: string[];
}
export function checkNodePtyNativeModule(options: NodePtyNativeModuleCheckOptions = {}): NodePtyNativeModuleCheck {
try {
(options.load ?? loadNodePty)();
return { status: "ok" };
} catch (error) {
return { status: "load-failed", message: errorMessage(error) };
}
}
export function formatNodePtyNativeModuleCheck(check: NodePtyNativeModuleCheck): FormattedNodePtyNativeModuleCheck {
if (check.status === "ok") return { ok: true, lines: [`✓ ${doctorLabel}`] };
return {
ok: false,
lines: [
`✗ ${doctorLabel}`,
` Could not load node-pty: ${check.message}`,
" npm may have skipped node-pty's required install script.",
" For a global npm installation, reinstall PI WEB with:",
` ${NODE_PTY_GLOBAL_REINSTALL_COMMAND}`,
" Then run `pi-web doctor` again.",
],
};
}
function loadNodePty(): unknown {
return requireFromHere("node-pty");
}
function errorMessage(error: unknown): string {
const message = error instanceof Error ? error.message : String(error);
return message.replaceAll(/\s+/g, " ").trim();
}