94 lines
2.5 KiB
JavaScript
94 lines
2.5 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var isWindows = process.platform === 'win32';
|
||
|
|
||
|
// Regex to split a windows path into three parts: [*, device, slash,
|
||
|
// tail] windows-only
|
||
|
var splitDeviceRe =
|
||
|
/^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/;
|
||
|
|
||
|
// Regex to split the tail part of the above into [*, dir, basename, ext]
|
||
|
var splitTailRe =
|
||
|
/^([\s\S]*?)((?:\.{1,2}|[^\\\/]+?|)(\.[^.\/\\]*|))(?:[\\\/]*)$/;
|
||
|
|
||
|
var win32 = {};
|
||
|
|
||
|
// Function to split a filename into [root, dir, basename, ext]
|
||
|
function win32SplitPath(filename) {
|
||
|
// Separate device+slash from tail
|
||
|
var result = splitDeviceRe.exec(filename),
|
||
|
device = (result[1] || '') + (result[2] || ''),
|
||
|
tail = result[3] || '';
|
||
|
// Split the tail into dir, basename and extension
|
||
|
var result2 = splitTailRe.exec(tail),
|
||
|
dir = result2[1],
|
||
|
basename = result2[2],
|
||
|
ext = result2[3];
|
||
|
return [device, dir, basename, ext];
|
||
|
}
|
||
|
|
||
|
win32.parse = function(pathString) {
|
||
|
if (typeof pathString !== 'string') {
|
||
|
throw new TypeError(
|
||
|
"Parameter 'pathString' must be a string, not " + typeof pathString
|
||
|
);
|
||
|
}
|
||
|
var allParts = win32SplitPath(pathString);
|
||
|
if (!allParts || allParts.length !== 4) {
|
||
|
throw new TypeError("Invalid path '" + pathString + "'");
|
||
|
}
|
||
|
return {
|
||
|
root: allParts[0],
|
||
|
dir: allParts[0] + allParts[1].slice(0, -1),
|
||
|
base: allParts[2],
|
||
|
ext: allParts[3],
|
||
|
name: allParts[2].slice(0, allParts[2].length - allParts[3].length)
|
||
|
};
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
// Split a filename into [root, dir, basename, ext], unix version
|
||
|
// 'root' is just a slash, or nothing.
|
||
|
var splitPathRe =
|
||
|
/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
|
||
|
var posix = {};
|
||
|
|
||
|
|
||
|
function posixSplitPath(filename) {
|
||
|
return splitPathRe.exec(filename).slice(1);
|
||
|
}
|
||
|
|
||
|
|
||
|
posix.parse = function(pathString) {
|
||
|
if (typeof pathString !== 'string') {
|
||
|
throw new TypeError(
|
||
|
"Parameter 'pathString' must be a string, not " + typeof pathString
|
||
|
);
|
||
|
}
|
||
|
var allParts = posixSplitPath(pathString);
|
||
|
if (!allParts || allParts.length !== 4) {
|
||
|
throw new TypeError("Invalid path '" + pathString + "'");
|
||
|
}
|
||
|
allParts[1] = allParts[1] || '';
|
||
|
allParts[2] = allParts[2] || '';
|
||
|
allParts[3] = allParts[3] || '';
|
||
|
|
||
|
return {
|
||
|
root: allParts[0],
|
||
|
dir: allParts[0] + allParts[1].slice(0, -1),
|
||
|
base: allParts[2],
|
||
|
ext: allParts[3],
|
||
|
name: allParts[2].slice(0, allParts[2].length - allParts[3].length)
|
||
|
};
|
||
|
};
|
||
|
|
||
|
|
||
|
if (isWindows)
|
||
|
module.exports = win32.parse;
|
||
|
else /* posix */
|
||
|
module.exports = posix.parse;
|
||
|
|
||
|
module.exports.posix = posix.parse;
|
||
|
module.exports.win32 = win32.parse;
|