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}` : ""}`;}
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}` : ""}`;
}