'use strict'; var path = require('path'); var isNegated = require('is-negated-glob'); var isAbsolute = require('is-absolute'); module.exports = function(glob, options) { // default options var opts = options || {}; // ensure cwd is absolute var cwd = path.resolve(opts.cwd ? opts.cwd : process.cwd()); cwd = unixify(cwd); var rootDir = opts.root; // if `options.root` is defined, ensure it's absolute if (rootDir) { rootDir = unixify(rootDir); if (process.platform === 'win32' || !isAbsolute(rootDir)) { rootDir = unixify(path.resolve(rootDir)); } } // trim starting ./ from glob patterns if (glob.slice(0, 2) === './') { glob = glob.slice(2); } // when the glob pattern is only a . use an empty string if (glob.length === 1 && glob === '.') { glob = ''; } // store last character before glob is modified var suffix = glob.slice(-1); // check to see if glob is negated (and not a leading negated-extglob) var ing = isNegated(glob); glob = ing.pattern; // make glob absolute if (rootDir && glob.charAt(0) === '/') { glob = join(rootDir, glob); } else if (!isAbsolute(glob) || glob.slice(0, 1) === '\\') { glob = join(cwd, glob); } // if glob had a trailing `/`, re-add it now in case it was removed if (suffix === '/' && glob.slice(-1) !== '/') { glob += '/'; } // re-add leading `!` if it was removed return ing.negated ? '!' + glob : glob; }; function unixify(filepath) { return filepath.replace(/\\/g, '/'); } function join(dir, glob) { if (dir.charAt(dir.length - 1) === '/') { dir = dir.slice(0, -1); } if (glob.charAt(0) === '/') { glob = glob.slice(1); } if (!glob) return dir; return dir + '/' + glob; }