40 lines
1.2 KiB
TypeScript
40 lines
1.2 KiB
TypeScript
|
|
interface NodeError extends Error {
|
||
|
|
code?: string
|
||
|
|
}
|
||
|
|
|
||
|
|
function isPermissionError(err: unknown): boolean {
|
||
|
|
const nodeErr = err as NodeError
|
||
|
|
return nodeErr?.code === "EACCES" || nodeErr?.code === "EPERM"
|
||
|
|
}
|
||
|
|
|
||
|
|
function isFileNotFoundError(err: unknown): boolean {
|
||
|
|
const nodeErr = err as NodeError
|
||
|
|
return nodeErr?.code === "ENOENT"
|
||
|
|
}
|
||
|
|
|
||
|
|
export function formatErrorWithSuggestion(err: unknown, context: string): string {
|
||
|
|
if (isPermissionError(err)) {
|
||
|
|
return `Permission denied: Cannot ${context}. Try running with elevated permissions or check file ownership.`
|
||
|
|
}
|
||
|
|
|
||
|
|
if (isFileNotFoundError(err)) {
|
||
|
|
return `File not found while trying to ${context}. The file may have been deleted or moved.`
|
||
|
|
}
|
||
|
|
|
||
|
|
if (err instanceof SyntaxError) {
|
||
|
|
return `JSON syntax error while trying to ${context}: ${err.message}. Check for missing commas, brackets, or invalid characters.`
|
||
|
|
}
|
||
|
|
|
||
|
|
const message = err instanceof Error ? err.message : String(err)
|
||
|
|
|
||
|
|
if (message.includes("ENOSPC")) {
|
||
|
|
return `Disk full: Cannot ${context}. Free up disk space and try again.`
|
||
|
|
}
|
||
|
|
|
||
|
|
if (message.includes("EROFS")) {
|
||
|
|
return `Read-only filesystem: Cannot ${context}. Check if the filesystem is mounted read-only.`
|
||
|
|
}
|
||
|
|
|
||
|
|
return `Failed to ${context}: ${message}`
|
||
|
|
}
|