You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					144 lines
				
				3.5 KiB
			
		
		
			
		
	
	
					144 lines
				
				3.5 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var path = require('path');
							 | 
						||
| 
								 | 
							
								var inspect = require('util').inspect;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function assertPath(path) {
							 | 
						||
| 
								 | 
							
								  if (typeof path !== 'string') {
							 | 
						||
| 
								 | 
							
								    throw new TypeError('Path must be a string. Received ' + inspect(path));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function posix(path) {
							 | 
						||
| 
								 | 
							
								  assertPath(path);
							 | 
						||
| 
								 | 
							
								  if (path.length === 0)
							 | 
						||
| 
								 | 
							
								    return '.';
							 | 
						||
| 
								 | 
							
								  var code = path.charCodeAt(0);
							 | 
						||
| 
								 | 
							
								  var hasRoot = (code === 47/*/*/);
							 | 
						||
| 
								 | 
							
								  var end = -1;
							 | 
						||
| 
								 | 
							
								  var matchedSlash = true;
							 | 
						||
| 
								 | 
							
								  for (var i = path.length - 1; i >= 1; --i) {
							 | 
						||
| 
								 | 
							
								    code = path.charCodeAt(i);
							 | 
						||
| 
								 | 
							
								    if (code === 47/*/*/) {
							 | 
						||
| 
								 | 
							
								      if (!matchedSlash) {
							 | 
						||
| 
								 | 
							
								        end = i;
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      // We saw the first non-path separator
							 | 
						||
| 
								 | 
							
								      matchedSlash = false;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (end === -1)
							 | 
						||
| 
								 | 
							
								    return hasRoot ? '/' : '.';
							 | 
						||
| 
								 | 
							
								  if (hasRoot && end === 1)
							 | 
						||
| 
								 | 
							
								    return '//';
							 | 
						||
| 
								 | 
							
								  return path.slice(0, end);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function win32(path) {
							 | 
						||
| 
								 | 
							
								  assertPath(path);
							 | 
						||
| 
								 | 
							
								  var len = path.length;
							 | 
						||
| 
								 | 
							
								  if (len === 0)
							 | 
						||
| 
								 | 
							
								    return '.';
							 | 
						||
| 
								 | 
							
								  var rootEnd = -1;
							 | 
						||
| 
								 | 
							
								  var end = -1;
							 | 
						||
| 
								 | 
							
								  var matchedSlash = true;
							 | 
						||
| 
								 | 
							
								  var offset = 0;
							 | 
						||
| 
								 | 
							
								  var code = path.charCodeAt(0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Try to match a root
							 | 
						||
| 
								 | 
							
								  if (len > 1) {
							 | 
						||
| 
								 | 
							
								    if (code === 47/*/*/ || code === 92/*\*/) {
							 | 
						||
| 
								 | 
							
								      // Possible UNC root
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      rootEnd = offset = 1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      code = path.charCodeAt(1);
							 | 
						||
| 
								 | 
							
								      if (code === 47/*/*/ || code === 92/*\*/) {
							 | 
						||
| 
								 | 
							
								        // Matched double path separator at beginning
							 | 
						||
| 
								 | 
							
								        var j = 2;
							 | 
						||
| 
								 | 
							
								        var last = j;
							 | 
						||
| 
								 | 
							
								        // Match 1 or more non-path separators
							 | 
						||
| 
								 | 
							
								        for (; j < len; ++j) {
							 | 
						||
| 
								 | 
							
								          code = path.charCodeAt(j);
							 | 
						||
| 
								 | 
							
								          if (code === 47/*/*/ || code === 92/*\*/)
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if (j < len && j !== last) {
							 | 
						||
| 
								 | 
							
								          // Matched!
							 | 
						||
| 
								 | 
							
								          last = j;
							 | 
						||
| 
								 | 
							
								          // Match 1 or more path separators
							 | 
						||
| 
								 | 
							
								          for (; j < len; ++j) {
							 | 
						||
| 
								 | 
							
								            code = path.charCodeAt(j);
							 | 
						||
| 
								 | 
							
								            if (code !== 47/*/*/ && code !== 92/*\*/)
							 | 
						||
| 
								 | 
							
								              break;
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								          if (j < len && j !== last) {
							 | 
						||
| 
								 | 
							
								            // Matched!
							 | 
						||
| 
								 | 
							
								            last = j;
							 | 
						||
| 
								 | 
							
								            // Match 1 or more non-path separators
							 | 
						||
| 
								 | 
							
								            for (; j < len; ++j) {
							 | 
						||
| 
								 | 
							
								              code = path.charCodeAt(j);
							 | 
						||
| 
								 | 
							
								              if (code === 47/*/*/ || code === 92/*\*/)
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            if (j === len) {
							 | 
						||
| 
								 | 
							
								              // We matched a UNC root only
							 | 
						||
| 
								 | 
							
								              return path;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            if (j !== last) {
							 | 
						||
| 
								 | 
							
								              // We matched a UNC root with leftovers
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								              // Offset by 1 to include the separator after the UNC root to
							 | 
						||
| 
								 | 
							
								              // treat it as a "normal root" on top of a (UNC) root
							 | 
						||
| 
								 | 
							
								              rootEnd = offset = j + 1;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    } else if ((code >= 65/*A*/ && code <= 90/*Z*/) ||
							 | 
						||
| 
								 | 
							
								               (code >= 97/*a*/ && code <= 122/*z*/)) {
							 | 
						||
| 
								 | 
							
								      // Possible device root
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      code = path.charCodeAt(1);
							 | 
						||
| 
								 | 
							
								      if (path.charCodeAt(1) === 58/*:*/) {
							 | 
						||
| 
								 | 
							
								        rootEnd = offset = 2;
							 | 
						||
| 
								 | 
							
								        if (len > 2) {
							 | 
						||
| 
								 | 
							
								          code = path.charCodeAt(2);
							 | 
						||
| 
								 | 
							
								          if (code === 47/*/*/ || code === 92/*\*/)
							 | 
						||
| 
								 | 
							
								            rootEnd = offset = 3;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  } else if (code === 47/*/*/ || code === 92/*\*/) {
							 | 
						||
| 
								 | 
							
								    return path[0];
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for (var i = len - 1; i >= offset; --i) {
							 | 
						||
| 
								 | 
							
								    code = path.charCodeAt(i);
							 | 
						||
| 
								 | 
							
								    if (code === 47/*/*/ || code === 92/*\*/) {
							 | 
						||
| 
								 | 
							
								      if (!matchedSlash) {
							 | 
						||
| 
								 | 
							
								        end = i;
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      // We saw the first non-path separator
							 | 
						||
| 
								 | 
							
								      matchedSlash = false;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (end === -1) {
							 | 
						||
| 
								 | 
							
								    if (rootEnd === -1)
							 | 
						||
| 
								 | 
							
								      return '.';
							 | 
						||
| 
								 | 
							
								    else
							 | 
						||
| 
								 | 
							
								      end = rootEnd;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return path.slice(0, end);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = process.platform === 'win32' ? win32 : posix;
							 | 
						||
| 
								 | 
							
								module.exports.posix = posix;
							 | 
						||
| 
								 | 
							
								module.exports.win32 = win32;
							 |