toLogicalPath function

String toLogicalPath(
  1. String pathStr
)

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;
}