70 lines
1.7 KiB
JavaScript
70 lines
1.7 KiB
JavaScript
'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;
|
|
}
|