53 lines
1.5 KiB
TypeScript
53 lines
1.5 KiB
TypeScript
import type { SpawnSyncOptionsWithStringEncoding } from "node:child_process";
|
|
|
|
export const PNPM_SCRIPT_TIMEOUT_MS = 60_000;
|
|
export const PNPM_SCRIPT_MAX_OUTPUT_BYTES = 16 * 1024 * 1024;
|
|
|
|
type BoundedPnpmScriptInvocation = Readonly<{
|
|
command: string;
|
|
arguments: readonly string[];
|
|
options: SpawnSyncOptionsWithStringEncoding;
|
|
}>;
|
|
|
|
type PnpmScriptResult = Readonly<{
|
|
status: number | null;
|
|
signal: NodeJS.Signals | null;
|
|
error?: Error;
|
|
}>;
|
|
|
|
export function createBoundedPnpmScriptInvocation(input: Readonly<{
|
|
nodePath: string;
|
|
pnpmCli: string;
|
|
script: string;
|
|
environment: NodeJS.ProcessEnv;
|
|
}>): BoundedPnpmScriptInvocation {
|
|
return Object.freeze({
|
|
command: input.nodePath,
|
|
arguments: Object.freeze([input.pnpmCli, "run", input.script]),
|
|
options: Object.freeze({
|
|
encoding: "utf8",
|
|
env: input.environment,
|
|
killSignal: "SIGTERM",
|
|
maxBuffer: PNPM_SCRIPT_MAX_OUTPUT_BYTES,
|
|
timeout: PNPM_SCRIPT_TIMEOUT_MS,
|
|
}),
|
|
});
|
|
}
|
|
|
|
export function formatPnpmScriptFailure(
|
|
script: string,
|
|
result: PnpmScriptResult,
|
|
): string {
|
|
const code =
|
|
result.error && "code" in result.error &&
|
|
typeof result.error.code === "string"
|
|
? result.error.code
|
|
: null;
|
|
const message = result.error?.message.trim().replace(/\s+/g, " ") ?? null;
|
|
const error =
|
|
result.error === undefined
|
|
? "none"
|
|
: `${code ?? result.error.name}: ${message || "no message"}`;
|
|
return `${script} failed: exit=${String(result.status)}, signal=${result.signal ?? "none"}, error=${error}`;
|
|
}
|