(p: string)
| 24 | |
| 25 | const ROOT = "/"; |
| 26 | function norm(p: string): string { |
| 27 | // POSIX-like normalization; treat relative as from ROOT |
| 28 | const parts = (p.startsWith("/") ? p : ROOT + p).split("/").filter(Boolean); |
| 29 | const stack: string[] = []; |
| 30 | for (const part of parts) { |
| 31 | if (part === ".") continue; |
| 32 | if (part === "..") { stack.pop(); continue; } |
| 33 | stack.push(part); |
| 34 | } |
| 35 | return ROOT + stack.join("/"); |
| 36 | } |
| 37 | function parentDir(p: string): string { |
| 38 | if (p === ROOT) return ROOT; |
| 39 | const idx = p.lastIndexOf("/"); |
no test coverage detected