3 var isGlob = require('is-glob');
4 var pathPosixDirname = require('path').posix.dirname;
5 var isWin32 = require('os').platform() === 'win32';
9 var enclosure = /[\{\[].*[\}\]]$/;
10 var globby = /(^|[^\\])([\{\[]|\([^\)]+$)/;
11 var escaped = /\\([\!\*\?\|\[\]\(\)\{\}])/g;
15 * @param {Object} opts
16 * @param {boolean} [opts.flipBackslashes=true]
19 module.exports = function globParent(str, opts) {
20 var options = Object.assign({ flipBackslashes: true }, opts);
22 // flip windows path separators
23 if (options.flipBackslashes && isWin32 && str.indexOf(slash) < 0) {
24 str = str.replace(backslash, slash);
27 // special case for strings ending in enclosure containing path separator
28 if (enclosure.test(str)) {
32 // preserves full path in case of trailing path separator
35 // remove path parts that are globby
37 str = pathPosixDirname(str);
38 } while (isGlob(str) || globby.test(str));
40 // remove escape chars and return result
41 return str.replace(escaped, '$1');