60 lines
1.6 KiB
TypeScript
60 lines
1.6 KiB
TypeScript
import { existsSync } from "node:fs";
|
|
|
|
export interface SessionCwdIssue {
|
|
sessionFile?: string;
|
|
sessionCwd: string;
|
|
fallbackCwd: string;
|
|
}
|
|
|
|
interface SessionCwdSource {
|
|
getCwd(): string;
|
|
getSessionFile(): string | undefined;
|
|
}
|
|
|
|
export function getMissingSessionCwdIssue(
|
|
sessionManager: SessionCwdSource,
|
|
fallbackCwd: string,
|
|
): SessionCwdIssue | undefined {
|
|
const sessionFile = sessionManager.getSessionFile();
|
|
if (!sessionFile) {
|
|
return undefined;
|
|
}
|
|
|
|
const sessionCwd = sessionManager.getCwd();
|
|
if (!sessionCwd || existsSync(sessionCwd)) {
|
|
return undefined;
|
|
}
|
|
|
|
return {
|
|
sessionFile,
|
|
sessionCwd,
|
|
fallbackCwd,
|
|
};
|
|
}
|
|
|
|
export function formatMissingSessionCwdError(issue: SessionCwdIssue): string {
|
|
const sessionFile = issue.sessionFile ? `\nSession file: ${issue.sessionFile}` : "";
|
|
return `Stored session working directory does not exist: ${issue.sessionCwd}${sessionFile}\nCurrent working directory: ${issue.fallbackCwd}`;
|
|
}
|
|
|
|
export function formatMissingSessionCwdPrompt(issue: SessionCwdIssue): string {
|
|
return `cwd from session file does not exist\n${issue.sessionCwd}\n\ncontinue in current cwd\n${issue.fallbackCwd}`;
|
|
}
|
|
|
|
export class MissingSessionCwdError extends Error {
|
|
readonly issue: SessionCwdIssue;
|
|
|
|
constructor(issue: SessionCwdIssue) {
|
|
super(formatMissingSessionCwdError(issue));
|
|
this.name = "MissingSessionCwdError";
|
|
this.issue = issue;
|
|
}
|
|
}
|
|
|
|
export function assertSessionCwdExists(sessionManager: SessionCwdSource, fallbackCwd: string): void {
|
|
const issue = getMissingSessionCwdIssue(sessionManager, fallbackCwd);
|
|
if (issue) {
|
|
throw new MissingSessionCwdError(issue);
|
|
}
|
|
}
|