43 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			43 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict'; | ||
|  | 
 | ||
|  | var isGlob = require('is-glob'); | ||
|  | var pathPosixDirname = require('path').posix.dirname; | ||
|  | var isWin32 = require('os').platform() === 'win32'; | ||
|  | 
 | ||
|  | var slash = '/'; | ||
|  | var backslash = /\\/g; | ||
|  | var enclosure = /[\{\[].*[\}\]]$/; | ||
|  | var globby = /(^|[^\\])([\{\[]|\([^\)]+$)/; | ||
|  | var escaped = /\\([\!\*\?\|\[\]\(\)\{\}])/g; | ||
|  | 
 | ||
|  | /** | ||
|  |  * @param {string} str | ||
|  |  * @param {Object} opts | ||
|  |  * @param {boolean} [opts.flipBackslashes=true] | ||
|  |  * @returns {string} | ||
|  |  */ | ||
|  | module.exports = function globParent(str, opts) { | ||
|  |   var options = Object.assign({ flipBackslashes: true }, opts); | ||
|  | 
 | ||
|  |   // flip windows path separators
 | ||
|  |   if (options.flipBackslashes && isWin32 && str.indexOf(slash) < 0) { | ||
|  |     str = str.replace(backslash, slash); | ||
|  |   } | ||
|  | 
 | ||
|  |   // special case for strings ending in enclosure containing path separator
 | ||
|  |   if (enclosure.test(str)) { | ||
|  |     str += slash; | ||
|  |   } | ||
|  | 
 | ||
|  |   // preserves full path in case of trailing path separator
 | ||
|  |   str += 'a'; | ||
|  | 
 | ||
|  |   // remove path parts that are globby
 | ||
|  |   do { | ||
|  |     str = pathPosixDirname(str); | ||
|  |   } while (isGlob(str) || globby.test(str)); | ||
|  | 
 | ||
|  |   // remove escape chars and return result
 | ||
|  |   return str.replace(escaped, '$1'); | ||
|  | }; |