@@ -270,77 +270,67 @@ const win32 = {
270
270
const code = path . charCodeAt ( 0 ) ;
271
271
272
272
// Try to match a root
273
- if ( len > 1 ) {
274
- if ( isPathSeparator ( code ) ) {
275
- // Possible UNC root
276
-
277
- // If we started with a separator, we know we at least have an absolute
278
- // path of some kind (UNC or otherwise)
279
- isAbsolute = true ;
273
+ if ( len === 1 ) {
274
+ // `path` contains just a single char, exit early to avoid
275
+ // unnecessary work
276
+ return isPosixPathSeparator ( code ) ? '\\' : path ;
277
+ }
278
+ if ( isPathSeparator ( code ) ) {
279
+ // Possible UNC root
280
280
281
- if ( isPathSeparator ( path . charCodeAt ( 1 ) ) ) {
282
- // Matched double path separator at beginning
283
- var j = 2 ;
284
- var last = j ;
285
- // Match 1 or more non-path separators
286
- for ( ; j < len ; ++ j ) {
287
- if ( isPathSeparator ( path . charCodeAt ( j ) ) )
288
- break ;
281
+ // If we started with a separator, we know we at least have an absolute
282
+ // path of some kind (UNC or otherwise)
283
+ isAbsolute = true ;
284
+
285
+ if ( isPathSeparator ( path . charCodeAt ( 1 ) ) ) {
286
+ // Matched double path separator at beginning
287
+ let j = 2 ;
288
+ let last = j ;
289
+ // Match 1 or more non-path separators
290
+ while ( j < len && ! isPathSeparator ( path . charCodeAt ( j ) ) ) {
291
+ j ++ ;
292
+ }
293
+ if ( j < len && j !== last ) {
294
+ const firstPart = path . slice ( last , j ) ;
295
+ // Matched!
296
+ last = j ;
297
+ // Match 1 or more path separators
298
+ while ( j < len && isPathSeparator ( path . charCodeAt ( j ) ) ) {
299
+ j ++ ;
289
300
}
290
301
if ( j < len && j !== last ) {
291
- const firstPart = path . slice ( last , j ) ;
292
302
// Matched!
293
303
last = j ;
294
- // Match 1 or more path separators
295
- for ( ; j < len ; ++ j ) {
296
- if ( ! isPathSeparator ( path . charCodeAt ( j ) ) )
297
- break ;
304
+ // Match 1 or more non-path separators
305
+ while ( j < len && ! isPathSeparator ( path . charCodeAt ( j ) ) ) {
306
+ j ++ ;
298
307
}
299
- if ( j < len && j !== last ) {
300
- // Matched!
301
- last = j ;
302
- // Match 1 or more non-path separators
303
- for ( ; j < len ; ++ j ) {
304
- if ( isPathSeparator ( path . charCodeAt ( j ) ) )
305
- break ;
306
- }
307
- if ( j === len ) {
308
- // We matched a UNC root only
309
- // Return the normalized version of the UNC root since there
310
- // is nothing left to process
311
-
312
- return '\\\\' + firstPart + '\\' + path . slice ( last ) + '\\' ;
313
- } else if ( j !== last ) {
314
- // We matched a UNC root with leftovers
315
-
316
- device = '\\\\' + firstPart + '\\' + path . slice ( last , j ) ;
317
- rootEnd = j ;
318
- }
308
+ if ( j === len ) {
309
+ // We matched a UNC root only
310
+ // Return the normalized version of the UNC root since there
311
+ // is nothing left to process
312
+ return `\\\\${ firstPart } \\${ path . slice ( last ) } \\` ;
319
313
}
320
- }
321
- } else {
322
- rootEnd = 1 ;
323
- }
324
- } else if ( isWindowsDeviceRoot ( code ) ) {
325
- // Possible device root
326
-
327
- if ( path . charCodeAt ( 1 ) === CHAR_COLON ) {
328
- device = path . slice ( 0 , 2 ) ;
329
- rootEnd = 2 ;
330
- if ( len > 2 ) {
331
- if ( isPathSeparator ( path . charCodeAt ( 2 ) ) ) {
332
- // Treat separator following drive name as an absolute path
333
- // indicator
334
- isAbsolute = true ;
335
- rootEnd = 3 ;
314
+ if ( j !== last ) {
315
+ // We matched a UNC root with leftovers
316
+ device = `\\\\${ firstPart } \\${ path . slice ( last , j ) } ` ;
317
+ rootEnd = j ;
336
318
}
337
319
}
338
320
}
321
+ } else {
322
+ rootEnd = 1 ;
323
+ }
324
+ } else if ( isWindowsDeviceRoot ( code ) && path . charCodeAt ( 1 ) === CHAR_COLON ) {
325
+ // Possible device root
326
+ device = path . slice ( 0 , 2 ) ;
327
+ rootEnd = 2 ;
328
+ if ( len > 2 && isPathSeparator ( path . charCodeAt ( 2 ) ) ) {
329
+ // Treat separator following drive name as an absolute path
330
+ // indicator
331
+ isAbsolute = true ;
332
+ rootEnd = 3 ;
339
333
}
340
- } else if ( isPathSeparator ( code ) ) {
341
- // `path` contains just a path separator, exit early to avoid unnecessary
342
- // work
343
- return '\\' ;
344
334
}
345
335
346
336
let tail = rootEnd < len ?
@@ -592,75 +582,66 @@ const win32 = {
592
582
const len = path . length ;
593
583
if ( len === 0 )
594
584
return '.' ;
595
- var rootEnd = - 1 ;
596
- var end = - 1 ;
597
- var matchedSlash = true ;
598
- var offset = 0 ;
585
+ let rootEnd = - 1 ;
586
+ let offset = 0 ;
599
587
const code = path . charCodeAt ( 0 ) ;
600
588
589
+ if ( len === 1 ) {
590
+ // `path` contains just a path separator, exit early to avoid
591
+ // unnecessary work or a dot.
592
+ return isPathSeparator ( code ) ? path : '.' ;
593
+ }
594
+
601
595
// Try to match a root
602
- if ( len > 1 ) {
603
- if ( isPathSeparator ( code ) ) {
604
- // Possible UNC root
605
-
606
- rootEnd = offset = 1 ;
607
-
608
- if ( isPathSeparator ( path . charCodeAt ( 1 ) ) ) {
609
- // Matched double path separator at beginning
610
- var j = 2 ;
611
- var last = j ;
612
- // Match 1 or more non-path separators
613
- for ( ; j < len ; ++ j ) {
614
- if ( isPathSeparator ( path . charCodeAt ( j ) ) )
615
- break ;
596
+ if ( isPathSeparator ( code ) ) {
597
+ // Possible UNC root
598
+
599
+ rootEnd = offset = 1 ;
600
+
601
+ if ( isPathSeparator ( path . charCodeAt ( 1 ) ) ) {
602
+ // Matched double path separator at beginning
603
+ let j = 2 ;
604
+ let last = j ;
605
+ // Match 1 or more non-path separators
606
+ while ( j < len && ! isPathSeparator ( path . charCodeAt ( j ) ) ) {
607
+ j ++ ;
608
+ }
609
+ if ( j < len && j !== last ) {
610
+ // Matched!
611
+ last = j ;
612
+ // Match 1 or more path separators
613
+ while ( j < len && isPathSeparator ( path . charCodeAt ( j ) ) ) {
614
+ j ++ ;
616
615
}
617
616
if ( j < len && j !== last ) {
618
617
// Matched!
619
618
last = j ;
620
- // Match 1 or more path separators
621
- for ( ; j < len ; ++ j ) {
622
- if ( ! isPathSeparator ( path . charCodeAt ( j ) ) )
623
- break ;
619
+ // Match 1 or more non-path separators
620
+ while ( j < len && ! isPathSeparator ( path . charCodeAt ( j ) ) ) {
621
+ j ++ ;
624
622
}
625
- if ( j < len && j !== last ) {
626
- // Matched!
627
- last = j ;
628
- // Match 1 or more non-path separators
629
- for ( ; j < len ; ++ j ) {
630
- if ( isPathSeparator ( path . charCodeAt ( j ) ) )
631
- break ;
632
- }
633
- if ( j === len ) {
634
- // We matched a UNC root only
635
- return path ;
636
- }
637
- if ( j !== last ) {
638
- // We matched a UNC root with leftovers
623
+ if ( j === len ) {
624
+ // We matched a UNC root only
625
+ return path ;
626
+ }
627
+ if ( j !== last ) {
628
+ // We matched a UNC root with leftovers
639
629
640
- // Offset by 1 to include the separator after the UNC root to
641
- // treat it as a "normal root" on top of a (UNC) root
642
- rootEnd = offset = j + 1 ;
643
- }
630
+ // Offset by 1 to include the separator after the UNC root to
631
+ // treat it as a "normal root" on top of a (UNC) root
632
+ rootEnd = offset = j + 1 ;
644
633
}
645
634
}
646
635
}
647
- } else if ( isWindowsDeviceRoot ( code ) ) {
648
- // Possible device root
649
-
650
- if ( path . charCodeAt ( 1 ) === CHAR_COLON ) {
651
- rootEnd = offset = 2 ;
652
- if ( len > 2 ) {
653
- if ( isPathSeparator ( path . charCodeAt ( 2 ) ) )
654
- rootEnd = offset = 3 ;
655
- }
656
- }
657
636
}
658
- } else if ( isPathSeparator ( code ) ) {
659
- // `path` contains just a path separator, exit early to avoid
660
- // unnecessary work
661
- return path ;
637
+ // Possible device root
638
+ } else if ( isWindowsDeviceRoot ( code ) && path . charCodeAt ( 1 ) === CHAR_COLON ) {
639
+ rootEnd = len > 2 && isPathSeparator ( path . charCodeAt ( 2 ) ) ? 3 : 2 ;
640
+ offset = rootEnd ;
662
641
}
663
642
643
+ let end = - 1 ;
644
+ let matchedSlash = true ;
664
645
for ( var i = len - 1 ; i >= offset ; -- i ) {
665
646
if ( isPathSeparator ( path . charCodeAt ( i ) ) ) {
666
647
if ( ! matchedSlash ) {
@@ -843,79 +824,71 @@ const win32 = {
843
824
var rootEnd = 0 ;
844
825
let code = path . charCodeAt ( 0 ) ;
845
826
846
- // Try to match a root
847
- if ( len > 1 ) {
827
+ if ( len === 1 ) {
848
828
if ( isPathSeparator ( code ) ) {
849
- // Possible UNC root
829
+ // `path` contains just a path separator, exit early to avoid
830
+ // unnecessary work
831
+ ret . root = ret . dir = path ;
832
+ return ret ;
833
+ }
834
+ return ret ;
835
+ }
836
+ // Try to match a root
837
+ if ( isPathSeparator ( code ) ) {
838
+ // Possible UNC root
850
839
851
- rootEnd = 1 ;
852
- if ( isPathSeparator ( path . charCodeAt ( 1 ) ) ) {
853
- // Matched double path separator at beginning
854
- var j = 2 ;
855
- var last = j ;
856
- // Match 1 or more non-path separators
857
- for ( ; j < len ; ++ j ) {
858
- if ( isPathSeparator ( path . charCodeAt ( j ) ) )
859
- break ;
840
+ rootEnd = 1 ;
841
+ if ( isPathSeparator ( path . charCodeAt ( 1 ) ) ) {
842
+ // Matched double path separator at beginning
843
+ let j = 2 ;
844
+ let last = j ;
845
+ // Match 1 or more non-path separators
846
+ while ( j < len && ! isPathSeparator ( path . charCodeAt ( j ) ) ) {
847
+ j ++ ;
848
+ }
849
+ if ( j < len && j !== last ) {
850
+ // Matched!
851
+ last = j ;
852
+ // Match 1 or more path separators
853
+ while ( j < len && isPathSeparator ( path . charCodeAt ( j ) ) ) {
854
+ j ++ ;
860
855
}
861
856
if ( j < len && j !== last ) {
862
857
// Matched!
863
858
last = j ;
864
- // Match 1 or more path separators
865
- for ( ; j < len ; ++ j ) {
866
- if ( ! isPathSeparator ( path . charCodeAt ( j ) ) )
867
- break ;
859
+ // Match 1 or more non-path separators
860
+ while ( j < len && ! isPathSeparator ( path . charCodeAt ( j ) ) ) {
861
+ j ++ ;
868
862
}
869
- if ( j < len && j !== last ) {
870
- // Matched!
871
- last = j ;
872
- // Match 1 or more non-path separators
873
- for ( ; j < len ; ++ j ) {
874
- if ( isPathSeparator ( path . charCodeAt ( j ) ) )
875
- break ;
876
- }
877
- if ( j === len ) {
878
- // We matched a UNC root only
879
-
880
- rootEnd = j ;
881
- } else if ( j !== last ) {
882
- // We matched a UNC root with leftovers
883
-
884
- rootEnd = j + 1 ;
885
- }
863
+ if ( j === len ) {
864
+ // We matched a UNC root only
865
+ rootEnd = j ;
866
+ } else if ( j !== last ) {
867
+ // We matched a UNC root with leftovers
868
+ rootEnd = j + 1 ;
886
869
}
887
870
}
888
871
}
889
- } else if ( isWindowsDeviceRoot ( code ) ) {
890
- // Possible device root
891
-
892
- if ( path . charCodeAt ( 1 ) === CHAR_COLON ) {
893
- rootEnd = 2 ;
894
- if ( len > 2 ) {
895
- if ( isPathSeparator ( path . charCodeAt ( 2 ) ) ) {
896
- if ( len === 3 ) {
897
- // `path` contains just a drive root, exit early to avoid
898
- // unnecessary work
899
- ret . root = ret . dir = path ;
900
- return ret ;
901
- }
902
- rootEnd = 3 ;
903
- }
904
- } else {
905
- // `path` contains just a drive root, exit early to avoid
906
- // unnecessary work
907
- ret . root = ret . dir = path ;
908
- return ret ;
909
- }
872
+ }
873
+ } else if ( isWindowsDeviceRoot ( code ) && path . charCodeAt ( 1 ) === CHAR_COLON ) {
874
+ // Possible device root
875
+ if ( len <= 2 ) {
876
+ // `path` contains just a drive root, exit early to avoid
877
+ // unnecessary work
878
+ ret . root = ret . dir = path ;
879
+ return ret ;
880
+ }
881
+ rootEnd = 2 ;
882
+ if ( isPathSeparator ( path . charCodeAt ( 2 ) ) ) {
883
+ if ( len === 3 ) {
884
+ // `path` contains just a drive root, exit early to avoid
885
+ // unnecessary work
886
+ ret . root = ret . dir = path ;
887
+ return ret ;
910
888
}
889
+ rootEnd = 3 ;
911
890
}
912
- } else if ( isPathSeparator ( code ) ) {
913
- // `path` contains just a path separator, exit early to avoid
914
- // unnecessary work
915
- ret . root = ret . dir = path ;
916
- return ret ;
917
891
}
918
-
919
892
if ( rootEnd > 0 )
920
893
ret . root = path . slice ( 0 , rootEnd ) ;
921
894
0 commit comments