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.
		
		
		
		
		
			
		
			
				
					
					
						
							143 lines
						
					
					
						
							3.5 KiB
						
					
					
				
			
		
		
	
	
							143 lines
						
					
					
						
							3.5 KiB
						
					
					
				'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;
 | 
						|
 |