toLogicalPath function
Converts a path string to a project-relative, '/'-separated logical path.
Binds: FR-106, FR-108.
Implementation
String toLogicalPath(String pathStr) {
// Fold separators: convert backslashes to forward slashes.
final normalizedSep = pathStr.replaceAll('\\', '/');
if (p.posix.isAbsolute(normalizedSep) ||
RegExp(r'^[A-Za-z]:($|/)').hasMatch(normalizedSep)) {
throw ArgumentError.value(pathStr, 'pathStr', 'must be project-relative');
}
// Normalize . and .. using posix path context.
final canonical = p.posix.normalize(normalizedSep);
if (canonical == '..' || canonical.startsWith('../')) {
throw ArgumentError.value(
pathStr,
'pathStr',
'must stay inside the project root',
);
}
// If canonical is '.' or empty, represent it as empty string (root of project).
if (canonical == '.') {
return '';
}
return canonical;
}