opusdev/vector-similarity-api
1
1'use strict';2 3var isGlob = require('is-glob');4var pathPosixDirname = require('path').posix.dirname;5var isWin32 = require('os').platform() === 'win32';6 7var slash = '/';8var backslash = /\\/g;9var enclosure = /[\{\[].*[\}\]]$/;10var globby = /(^|[^\\])([\{\[]|\([^\)]+$)/;11var escaped = /\\([\!\*\?\|\[\]\(\)\{\}])/g;12 13/**14 * @param {string} str15 * @param {Object} opts16 * @param {boolean} [opts.flipBackslashes=true]17 * @returns {string}18 */19module.exports = function globParent(str, opts) {20 var options = Object.assign({ flipBackslashes: true }, opts);21 22 // flip windows path separators23 if (options.flipBackslashes && isWin32 && str.indexOf(slash) < 0) {24 str = str.replace(backslash, slash);25 }26 27 // special case for strings ending in enclosure containing path separator28 if (enclosure.test(str)) {29 str += slash;30 }31 32 // preserves full path in case of trailing path separator33 str += 'a';34 35 // remove path parts that are globby36 do {37 str = pathPosixDirname(str);38 } while (isGlob(str) || globby.test(str));39 40 // remove escape chars and return result41 return str.replace(escaped, '$1');42};43 