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');
							 | 
						||
| 
								 | 
							
								};
							 |