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