index.js
1 'use strict'; 2 3 var isWindows = process.platform === 'win32'; 4 5 // Regex to split a windows path into into [dir, root, basename, name, ext] 6 var splitWindowsRe = 7 /^(((?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?[\\\/]?)(?:[^\\\/]*[\\\/])*)((\.{1,2}|[^\\\/]+?|)(\.[^.\/\\]*|))[\\\/]*$/; 8 9 var win32 = {}; 10 11 function win32SplitPath(filename) { 12 return splitWindowsRe.exec(filename).slice(1); 13 } 14 15 win32.parse = function(pathString) { 16 if (typeof pathString !== 'string') { 17 throw new TypeError( 18 "Parameter 'pathString' must be a string, not " + typeof pathString 19 ); 20 } 21 var allParts = win32SplitPath(pathString); 22 if (!allParts || allParts.length !== 5) { 23 throw new TypeError("Invalid path '" + pathString + "'"); 24 } 25 return { 26 root: allParts[1], 27 dir: allParts[0] === allParts[1] ? allParts[0] : allParts[0].slice(0, -1), 28 base: allParts[2], 29 ext: allParts[4], 30 name: allParts[3] 31 }; 32 }; 33 34 35 36 // Split a filename into [dir, root, basename, name, ext], unix version 37 // 'root' is just a slash, or nothing. 38 var splitPathRe = 39 /^((\/?)(?:[^\/]*\/)*)((\.{1,2}|[^\/]+?|)(\.[^.\/]*|))[\/]*$/; 40 var posix = {}; 41 42 43 function posixSplitPath(filename) { 44 return splitPathRe.exec(filename).slice(1); 45 } 46 47 48 posix.parse = function(pathString) { 49 if (typeof pathString !== 'string') { 50 throw new TypeError( 51 "Parameter 'pathString' must be a string, not " + typeof pathString 52 ); 53 } 54 var allParts = posixSplitPath(pathString); 55 if (!allParts || allParts.length !== 5) { 56 throw new TypeError("Invalid path '" + pathString + "'"); 57 } 58 59 return { 60 root: allParts[1], 61 dir: allParts[0].slice(0, -1), 62 base: allParts[2], 63 ext: allParts[4], 64 name: allParts[3], 65 }; 66 }; 67 68 69 if (isWindows) 70 module.exports = win32.parse; 71 else /* posix */ 72 module.exports = posix.parse; 73 74 module.exports.posix = posix.parse; 75 module.exports.win32 = win32.parse;