(parts)
| 1372 | }); |
| 1373 | } |
| 1374 | levelTwoFileOptimize(parts) { |
| 1375 | if (!Array.isArray(parts)) { |
| 1376 | parts = this.slashSplit(parts); |
| 1377 | } |
| 1378 | let didSomething = false; |
| 1379 | do { |
| 1380 | didSomething = false; |
| 1381 | if (!this.preserveMultipleSlashes) { |
| 1382 | for (let i = 1; i < parts.length - 1; i++) { |
| 1383 | const p = parts[i]; |
| 1384 | if (i === 1 && p === "" && parts[0] === "") |
| 1385 | continue; |
| 1386 | if (p === "." || p === "") { |
| 1387 | didSomething = true; |
| 1388 | parts.splice(i, 1); |
| 1389 | i--; |
| 1390 | } |
| 1391 | } |
| 1392 | if (parts[0] === "." && parts.length === 2 && (parts[1] === "." || parts[1] === "")) { |
| 1393 | didSomething = true; |
| 1394 | parts.pop(); |
| 1395 | } |
| 1396 | } |
| 1397 | let dd = 0; |
| 1398 | while (-1 !== (dd = parts.indexOf("..", dd + 1))) { |
| 1399 | const p = parts[dd - 1]; |
| 1400 | if (p && p !== "." && p !== ".." && p !== "**" && !(this.isWindows && /^[a-z]:$/i.test(p))) { |
| 1401 | didSomething = true; |
| 1402 | parts.splice(dd - 1, 2); |
| 1403 | dd -= 2; |
| 1404 | } |
| 1405 | } |
| 1406 | } while (didSomething); |
| 1407 | return parts.length === 0 ? [""] : parts; |
| 1408 | } |
| 1409 | // First phase: single-pattern processing |
| 1410 | // <pre> is 1 or more portions |
| 1411 | // <rest> is 1 or more portions |
no test coverage detected