import { splitPathAndPosition } from "./terminal-links"; function normalizePathSeparators(path: string): string { return path.replaceAll("\\", "/"); } function canonicalizeWindowsDrivePath(path: string): string { return /^\/[A-Za-z]:\//.test(path) ? path.slice(1) : path; } function trimTrailingPathSeparators(path: string): string { return path.replace(/[\\/]+$/, ""); } function basenameOfPath(path: string): string { const separatorIndex = Math.max(path.lastIndexOf("/"), path.lastIndexOf("\\")); return separatorIndex >= 0 ? path.slice(separatorIndex + 1) : path; } function stripRelativePrefixes(path: string): string { return path.replace(/^\.\/+/, "").replace(/^\/+/, ""); } export function formatWorkspaceRelativePath( pathWithPosition: string, workspaceRoot: string | undefined, ): string { const { path, line, column } = splitPathAndPosition(pathWithPosition); const normalizedPath = canonicalizeWindowsDrivePath(normalizePathSeparators(path)); let displayPath = normalizedPath; if (workspaceRoot) { const normalizedWorkspaceRoot = canonicalizeWindowsDrivePath( normalizePathSeparators(trimTrailingPathSeparators(workspaceRoot)), ); const workspaceLabel = basenameOfPath(normalizedWorkspaceRoot); const pathForCompare = normalizedPath.toLowerCase(); const workspaceForCompare = normalizedWorkspaceRoot.toLowerCase(); const workspaceWithSeparator = `${workspaceForCompare}/`; const workspaceLabelWithSeparator = `${workspaceLabel.toLowerCase()}/`; if (pathForCompare === workspaceForCompare) { displayPath = workspaceLabel; } else if (pathForCompare.startsWith(workspaceWithSeparator)) { const relativeSuffix = normalizedPath.slice(normalizedWorkspaceRoot.length + 1); displayPath = `${workspaceLabel}/${relativeSuffix}`; } else if (!normalizedPath.startsWith("/")) { const relativePath = stripRelativePrefixes(normalizedPath); displayPath = pathForCompare.startsWith(workspaceLabelWithSeparator) ? normalizedPath : `${workspaceLabel}/${relativePath}`; } } if (!line) return displayPath; return `${displayPath}:${line}${column ? `:${column}` : ""}`; }