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