diff --git a/index.js b/index.js index 5f0f94a..00388f8 100644 --- a/index.js +++ b/index.js @@ -11,7 +11,15 @@ var pathRe = require('glob-path-regex'); var isGlob = require('is-glob'); /** - * Parse a glob pattern into sections + * Expose `parseGlob` and cache results in memory + */ + +module.exports = function (pattern, getbase) { + return globCache(parseGlob, pattern, getbase); +}; + +/** + * Parse a glob pattern into tokens. * * When no paths or '**' are in the glob, we use a * different strategy for parsing the filename, since @@ -22,95 +30,200 @@ var isGlob = require('is-glob'); * - `(**|*.js)` */ -module.exports = function parseGlob(pattern) { +function parseGlob(pattern, getbase) { var glob = pattern; - var tok = {}; + var path = {}; + var tok = {path: {}, is: {}, match: {}}; // store original pattern tok.original = pattern; tok.pattern = pattern; - + path.whole = tok.pattern; // is the pattern actually a glob? - tok.isGlob = isGlob(glob); + tok.is.glob = isGlob(glob); // is it a negation pattern? - tok.isNegated = glob.charAt(0) === '!'; + tok.is.negated = glob.charAt(0) === '!'; // does the pattern contain braces? var braces = glob.indexOf('{') !== -1; - if (braces) { + if (tok.is.glob && braces) { + tok.is.braces = true; glob = glob.substr(0, braces) + escape(glob.substr(braces)); } // does the pattern contain a globstar (`**`)? - tok.globstar = glob.indexOf('**') !== -1; - if (glob.indexOf('/') === -1 && !tok.globstar) { - tok.dirname = ''; - tok.filename = tok.original; - tok.globstar = false; + tok.is.globstar = glob.indexOf('**') !== -1; + + // if there is no `/` and no `**`, this means our + // pattern can only match file names + if (glob.indexOf('/') === -1 && !tok.is.globstar) { + path.dirname = ''; + path.filename = tok.original; + tok.is.globstar = false; var basename = /^([^.]*)/.exec(glob); if (basename) { - tok.basename = basename[0] ? unescape(basename[0]) : ''; - tok.extname = glob.substr(tok.basename.length); + path.basename = basename[0] ? unescape(basename[0]) : ''; + path.extname = glob.substr(path.basename.length); } else { - tok.basename = tok.original; - tok.extname = ''; + path.basename = tok.original; + path.extname = ''; } - tok.ext = tok.extname.split('.').slice(-1)[0]; + path.ext = path.extname.split('.').slice(-1)[0]; + + // we either have a `/` or `**` } else { var m = pathRe().exec(glob) || []; - tok.dirname = m[1]; - tok.filename = glob.substr(tok.dirname.length); + path.dirname = m[1]; + path.filename = glob.substr(path.dirname.length); - var dot = tok.filename.indexOf('.', 1); + // does the filename have a `.`? + var dot = path.filename.indexOf('.', 1); if (dot !== -1) { - tok.basename = tok.filename.substr(0, dot); - tok.extname = tok.filename.substr(dot); - tok.ext = tok.extname.substr(tok.extname.indexOf('.', 1)); - } else if (tok.filename.charAt(0) === '.') { - tok.basename = ''; - tok.extname = tok.filename; + path.basename = path.filename.substr(0, dot); + path.extname = path.filename.substr(dot); + path.ext = path.extname.substr(path.extname.indexOf('.', 1)); + } else if (path.filename.charAt(0) === '.') { + path.basename = ''; + path.extname = path.filename; } else { - tok.basename = tok.filename; - tok.extname = ''; + path.basename = path.filename; + path.extname = ''; } - tok.ext = tok.extname.split('.').slice(-1)[0]; + path.ext = path.extname.split('.').slice(-1)[0]; + + // remove any escaping that was applied for braces if (braces) { - tok = unscapeBraces(tok); + path = unscapeBraces(path); } } - tok.dotfiles = tok.filename.charAt(0) === '.'; - tok = dotdirs(tok); - console.log(tok) + tok.is.dotfile = path.filename.charAt(0) === '.'; + tok = matchesDotdirs(tok, path); + tok.path = path; - tok.parsed = true; - return tok; -}; + // get the `base` from glob pattern + if (getbase) { + var segs = findBase(tok); + tok.pattern = segs.pattern; + tok.base = segs.base; -function dotdirs(tok) { - tok.dotdirs = false; - if (tok.dirname.indexOf('/.') !== -1) { - tok.dotdirs = true; + if (tok.is.glob === false) { + tok.base = tok.path.dirname; + tok.pattern = tok.path.filename; + } } - if (tok.dirname.charAt(0) === '.' && tok.dirname.charAt(1) !== '/') { - tok.dotdirs = true; + + return tok; +} + +/** + * Updates the tokens to reflect if the pattern + * matches dot-directories + * + * @param {Object} `tok` The tokens object + * @param {Object} `path` The path object + * @return {Object} + */ + +function matchesDotdirs(tok, path) { + tok.is.dotdir = false; + if (path.dirname.indexOf('/.') !== -1) { + tok.is.dotdir = true; + } + if (path.dirname.charAt(0) === '.' && path.dirname.charAt(1) !== '/') { + tok.is.dotdir = true; } return tok; } -function unscapeBraces(tok) { - tok.dirname = tok.dirname ? unescape(tok.dirname) : ''; - tok.filename = tok.filename ? unescape(tok.filename) : ''; - tok.basename = tok.basename ? unescape(tok.basename) : ''; - tok.extname = tok.extname ? unescape(tok.extname) : ''; - tok.ext = tok.ext ? unescape(tok.ext) : ''; - return tok; +/** + * Unescape brace patterns in each segment on the + * `path` object. + * + * TODO: this can be reduced by only escaping/unescaping + * segments that need to be escaped based on whether + * or not the pattern has a directory in it. + * + * @param {Object} `path` + * @return {Object} + */ + +function unscapeBraces(path) { + path.dirname = path.dirname ? unescape(path.dirname) : ''; + path.filename = path.filename ? unescape(path.filename) : ''; + path.basename = path.basename ? unescape(path.basename) : ''; + path.extname = path.extname ? unescape(path.extname) : ''; + path.ext = path.ext ? unescape(path.ext) : ''; + return path; } +/** + * Extract the `base` path from a glob + * pattern. + * + * @param {Object} `tok` The tokens object + * @return {Object} + */ + +function findBase(tok) { + var glob = tok.pattern; + var res = {base: '', pattern: glob}; + + var segs = glob.split('/'); + var len = segs.length, i = 0; + var base = []; + + while (len--) { + var seg = segs[i++]; + + if (!seg || isGlob(seg)) { + break; + } + base.push(seg); + } + + if (i === 0) { return null; } + + var num = (segs.length - base.length); + var end = base.join('/'); + if (end.indexOf('./') === 0) { + end = end.slice(2); + } + + res.base = end; + res.pattern = segs.slice(-num).join('/'); + return res; +} + +/** + * Cache the glob string to avoid parsing the same + * pattern more than once. + * + * @param {Function} fn + * @param {String} pattern + * @param {Options} options + * @return {RegExp} + */ + +function globCache(fn, pattern, getbase) { + var key = pattern + (getbase || ''); + return cache[key] || (cache[key] = fn(pattern, getbase)); +} + +/** + * Expose the glob `cache` + */ + +var cache = module.exports.cache = {}; + +/** + * Escape/unescape utils + */ + function escape(str) { return str.replace(/.*\{([^}]*?)}.*$/g, function (match, inner) { if (!inner) { return match; } @@ -131,8 +244,8 @@ function unescape(str) { } function trim(str, ch) { - if (str.slice(-1) === ch) { - return str[str.length - ch.length]; + if (str.slice(-ch.length)[0] === ch) { + return str.slice(0, str.length - ch.length); } return str; } diff --git a/test.js b/test.js index 48bc46a..afa0bbd 100644 --- a/test.js +++ b/test.js @@ -10,520 +10,1035 @@ var assert = require('assert'); var parse = require('./'); -it('should detect when the pattern is a glob pattern:', function () { - assert.equal(parse('a.min.js').isGlob, false); - assert.equal(parse('*.min.js').isGlob, true); - assert.equal(parse('foo/{a,b}.min.js').isGlob, true); - assert.equal(parse('foo/(a|b).min.js').isGlob, true); - assert.equal(parse('foo/[a-b].min.js').isGlob, true); - assert.equal(parse('!foo').isGlob, true); +function getBase(glob) { + return parse(glob, true); +} + +console.log(parse('a/b/d/e')) + + +describe('`is` object:', function () { + it('should detect when the pattern is a glob pattern:', function () { + assert.equal(parse('a.min.js').is.glob, false); + assert.equal(parse('*.min.js').is.glob, true); + assert.equal(parse('foo/{a,b}.min.js').is.glob, true); + assert.equal(parse('foo/(a|b).min.js').is.glob, true); + assert.equal(parse('foo/[a-b].min.js').is.glob, true); + assert.equal(parse('!foo').is.glob, true); + }); + + it('should detect when a pattern is negated:', function () { + assert.equal(parse('a.min.js').is.negated, false); + assert.equal(parse('!*.min.js').is.negated, true); + assert.equal(parse('!foo/{a,b}.min.js').is.negated, true); + assert.equal(parse('!foo/(a|b).min.js').is.negated, true); + assert.equal(parse('!foo/[a-b].min.js').is.negated, true); + assert.equal(parse('foo').is.negated, false); + }); + + it('should detect when a pattern has a globstar:', function () { + assert.equal(parse('**').is.globstar, true); + assert.equal(parse('**/*.min.js').is.globstar, true); + assert.equal(parse('**/*foo.js').is.globstar, true); + }); + + it('should detect when a pattern does not have a globstar:', function () { + assert.equal(parse('*/*').is.globstar, false); + assert.equal(parse('a.min.js').is.globstar, false); + assert.equal(parse('!*.min.js').is.globstar, false); + assert.equal(parse('!foo/{a,b}.min.js').is.globstar, false); + assert.equal(parse('!foo/(a|b).min.js').is.globstar, false); + assert.equal(parse('!foo/[a-b].min.js').is.globstar, false); + assert.equal(parse('foo').is.globstar, false); + }); + + it('should detect when `dotdir` are defined:', function () { + assert.equal(parse('a/b/.git/').is.dotdir, true); + assert.equal(parse('a/b/git/').is.dotdir, false); + assert.equal(parse('a/b/.git/').is.dotfile, false); + }); + + it('should detect when `dotfile` are defined:', function () { + assert.equal(parse('a/b/.gitignore').is.dotfile, true); + assert.equal(parse('a/b/.git').is.dotfile, true); + assert.equal(parse('a/b/.gitignore').is.dotdir, false); + assert.equal(parse('a/b/.git').is.dotdir, false); + }); }); -it('should detect when a pattern is negated:', function () { - assert.equal(parse('a.min.js').isNegated, false); - assert.equal(parse('!*.min.js').isNegated, true); - assert.equal(parse('!foo/{a,b}.min.js').isNegated, true); - assert.equal(parse('!foo/(a|b).min.js').isNegated, true); - assert.equal(parse('!foo/[a-b].min.js').isNegated, true); - assert.equal(parse('foo').isNegated, false); +describe('should get a base path:', function () { + it('should extract a base path from a glob pattern:', function () { + assert.equal(getBase('.*').base, ''); + assert.equal(getBase('.*').pattern, '.*'); + + assert.equal(getBase('./*').base, '.'); + assert.equal(getBase('./*').pattern, '*'); + + assert.equal(getBase('*').base, ''); + assert.equal(getBase('*').pattern, '*'); + + assert.equal(getBase('**').base, ''); + assert.equal(getBase('**').pattern, '**'); + + assert.equal(getBase('**/*.md').base, ''); + assert.equal(getBase('**/*.md').pattern, '**/*.md'); + + assert.equal(getBase('**/*.min.js').base, ''); + assert.equal(getBase('**/*.min.js').pattern, '**/*.min.js'); + + assert.equal(getBase('**/*foo.js').base, ''); + assert.equal(getBase('**/*foo.js').pattern, '**/*foo.js'); + + assert.equal(getBase('**/.*').base, ''); + assert.equal(getBase('**/.*').pattern, '**/.*'); + + assert.equal(getBase('**/d').base, ''); + assert.equal(getBase('**/d').pattern, '**/d'); + + assert.equal(getBase('*.*').base, ''); + assert.equal(getBase('*.*').pattern, '*.*'); + + assert.equal(getBase('*.js').base, ''); + assert.equal(getBase('*.js').pattern, '*.js'); + + assert.equal(getBase('*.md').base, ''); + assert.equal(getBase('*.md').pattern, '*.md'); + + assert.equal(getBase('*.min.js').base, ''); + assert.equal(getBase('*.min.js').pattern, '*.min.js'); + + assert.equal(getBase('*/*').base, ''); + assert.equal(getBase('*/*').pattern, '*/*'); + + assert.equal(getBase('*/*/*/*').base, ''); + assert.equal(getBase('*/*/*/*').pattern, '*/*/*/*'); + + assert.equal(getBase('*/*/*/e').base, ''); + assert.equal(getBase('*/*/*/e').pattern, '*/*/*/e'); + + assert.equal(getBase('*/b/*/e').base, ''); + assert.equal(getBase('*/b/*/e').pattern, '*/b/*/e'); + + assert.equal(getBase('*b').base, ''); + assert.equal(getBase('*b').pattern, '*b'); + + assert.equal(getBase('./a/**/j/**/z/*.md').base, 'a'); + assert.equal(getBase('./a/**/j/**/z/*.md').pattern, '**/j/**/z/*.md'); + + assert.equal(getBase('./a/**/z/*.md').base, 'a'); + assert.equal(getBase('./a/**/z/*.md').pattern, '**/z/*.md'); + + assert.equal(getBase('./{a/b/{c,/foo.js}/e.f.g}').base, '.'); + assert.equal(getBase('./{a/b/{c,/foo.js}/e.f.g}').pattern, '{a/b/{c,/foo.js}/e.f.g}'); + + assert.equal(getBase('./node_modules/*-glob/**/*.js').base, 'node_modules'); + assert.equal(getBase('./node_modules/*-glob/**/*.js').pattern, '*-glob/**/*.js'); + + assert.equal(getBase('a/b/{c,/.gitignore}').base, 'a/b'); + assert.equal(getBase('a/b/{c,/.gitignore}').pattern, '{c,/.gitignore}'); + + assert.equal(getBase('a/b/.{foo,bar}').base, 'a/b'); + assert.equal(getBase('a/b/.{foo,bar}').pattern, '.{foo,bar}'); + + assert.equal(getBase('a/b/*.{foo,bar}').base, 'a/b'); + assert.equal(getBase('a/b/*.{foo,bar}').pattern, '*.{foo,bar}'); + + assert.equal(getBase('a/**/b/*.{foo,bar}').base, 'a'); + assert.equal(getBase('a/**/b/*.{foo,bar}').pattern, '**/b/*.{foo,bar}'); + + assert.equal(getBase('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').base, 'a/b'); + assert.equal(getBase('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').pattern, '{c,.gitignore,{a,b}}/{a,b}/abc.foo.js'); + + assert.equal(getBase('a/b/{c,d}/').base, 'a/b'); + assert.equal(getBase('a/b/{c,d}/').pattern, '{c,d}/'); + + assert.equal(getBase('a/b/{c,d}/e/f.g').base, 'a/b'); + assert.equal(getBase('a/b/{c,d}/e/f.g').pattern, '{c,d}/e/f.g'); + + assert.equal(getBase('.a*').base, ''); + assert.equal(getBase('.a*').pattern, '.a*'); + + assert.equal(getBase('.b*').base, ''); + assert.equal(getBase('.b*').pattern, '.b*'); + + assert.equal(getBase('/*').base, ''); + assert.equal(getBase('/*').pattern, '/*'); + + assert.equal(getBase('a/***').base, 'a'); + assert.equal(getBase('a/***').pattern, '***'); + + assert.equal(getBase('a/**/b/*.{foo,bar}').base, 'a'); + assert.equal(getBase('a/**/b/*.{foo,bar}').pattern, '**/b/*.{foo,bar}'); + + assert.equal(getBase('a/**/c/*').base, 'a'); + assert.equal(getBase('a/**/c/*').pattern, '**/c/*'); + + assert.equal(getBase('a/**/c/*.md').base, 'a'); + assert.equal(getBase('a/**/c/*.md').pattern, '**/c/*.md'); + + assert.equal(getBase('a/**/e').base, 'a'); + assert.equal(getBase('a/**/e').pattern, '**/e'); + + assert.equal(getBase('a/**/j/**/z/*.md').base, 'a'); + assert.equal(getBase('a/**/j/**/z/*.md').pattern, '**/j/**/z/*.md'); + + assert.equal(getBase('a/**/z/*.md').base, 'a'); + assert.equal(getBase('a/**/z/*.md').pattern, '**/z/*.md'); + + assert.equal(getBase('a/**c*').base, 'a'); + assert.equal(getBase('a/**c*').pattern, '**c*'); + + assert.equal(getBase('a/**c/*').base, 'a'); + assert.equal(getBase('a/**c/*').pattern, '**c/*'); + + assert.equal(getBase('a/*/*/e').base, 'a'); + assert.equal(getBase('a/*/*/e').pattern, '*/*/e'); + + assert.equal(getBase('a/*/c/*.md').base, 'a'); + assert.equal(getBase('a/*/c/*.md').pattern, '*/c/*.md'); + + assert.equal(getBase('a/b/**/c{d,e}/**/xyz.md').base, 'a/b'); + assert.equal(getBase('a/b/**/c{d,e}/**/xyz.md').pattern, '**/c{d,e}/**/xyz.md'); + + assert.equal(getBase('a/b/**/e').base, 'a/b'); + assert.equal(getBase('a/b/**/e').pattern, '**/e'); + + assert.equal(getBase('a/b/*.{foo,bar}').base, 'a/b'); + assert.equal(getBase('a/b/*.{foo,bar}').pattern, '*.{foo,bar}'); + + assert.equal(getBase('a/b/*/e').base, 'a/b'); + assert.equal(getBase('a/b/*/e').pattern, '*/e'); + + assert.equal(getBase('a/b/c/*').base, 'a/b/c'); + assert.equal(getBase('a/b/c/*').pattern, '*'); + + assert.equal(getBase('a/b/c/*.md').base, 'a/b/c'); + assert.equal(getBase('a/b/c/*.md').pattern, '*.md'); + + assert.equal(getBase('a/b/c/.*.md').base, 'a/b/c'); + assert.equal(getBase('a/b/c/.*.md').pattern, '.*.md'); + + assert.equal(getBase('b/*/*/*').base, 'b'); + assert.equal(getBase('b/*/*/*').pattern, '*/*/*'); + }); + + it('file extensions:', function () { + assert.equal(getBase('.md').base, ''); + assert.equal(getBase('.md').pattern, '.md'); + }); + + it('negation pattern:', function () { + assert.equal(getBase('!*.min.js').base, ''); + assert.equal(getBase('!*.min.js').pattern, '!*.min.js'); + + assert.equal(getBase('!foo').base, ''); + assert.equal(getBase('!foo').pattern, '!foo'); + + assert.equal(getBase('a/b/c/!foo').base, 'a/b/c'); + assert.equal(getBase('a/b/c/!foo').pattern, '!foo'); + + assert.equal(getBase('!foo/(a|b).min.js').base, ''); + assert.equal(getBase('!foo/(a|b).min.js').pattern, '!foo/(a|b).min.js'); + + assert.equal(getBase('!foo/[a-b].min.js').base, ''); + assert.equal(getBase('!foo/[a-b].min.js').pattern, '!foo/[a-b].min.js'); + + assert.equal(getBase('!foo/{a,b}.min.js').base, ''); + assert.equal(getBase('!foo/{a,b}.min.js').pattern, '!foo/{a,b}.min.js'); + }); + + describe('braces:', function () { + it('should know when a base cannot be extracted:', function () { + assert.equal(getBase('/a/b/{c,/foo.js}/e.f.g/').base, ''); + assert.equal(getBase('/a/b/{c,/foo.js}/e.f.g/').pattern, '/a/b/{c,/foo.js}/e.f.g/'); + + assert.equal(getBase('{a/b/c.js,/a/b/{c,/foo.js}/e.f.g/}').base, ''); + assert.equal(getBase('{a/b/c.js,/a/b/{c,/foo.js}/e.f.g/}').pattern, '{a/b/c.js,/a/b/{c,/foo.js}/e.f.g/}'); + + assert.equal(getBase('/a/b/{c,d}/').base, ''); + assert.equal(getBase('/a/b/{c,d}/').pattern, '/a/b/{c,d}/'); + + assert.equal(getBase('/a/b/{c,d}/*.js').base, ''); + assert.equal(getBase('/a/b/{c,d}/*.js').pattern, '/a/b/{c,d}/*.js'); + + assert.equal(getBase('/a/b/{c,d}/*.min.js').base, ''); + assert.equal(getBase('/a/b/{c,d}/*.min.js').pattern, '/a/b/{c,d}/*.min.js'); + + assert.equal(getBase('/a/b/{c,d}/e.f.g/').base, ''); + assert.equal(getBase('/a/b/{c,d}/e.f.g/').pattern, '/a/b/{c,d}/e.f.g/'); + + assert.equal(getBase('{.,*}').base, ''); + assert.equal(getBase('{.,*}').pattern, '{.,*}'); + }); + + it('should work when the filename has braces:', function () { + assert.equal(getBase('a/b/.{c,.gitignore}').base, 'a/b'); + assert.equal(getBase('a/b/.{c,.gitignore}').pattern, '.{c,.gitignore}'); + + assert.equal(getBase('a/b/.{c,/.gitignore}').base, 'a/b'); + assert.equal(getBase('a/b/.{c,/.gitignore}').pattern, '.{c,/.gitignore}'); + + assert.equal(getBase('a/b/.{foo,bar}').base, 'a/b'); + assert.equal(getBase('a/b/.{foo,bar}').pattern, '.{foo,bar}'); + + assert.equal(getBase('a/b/{c,.gitignore}').base, 'a/b'); + assert.equal(getBase('a/b/{c,.gitignore}').pattern, '{c,.gitignore}'); + + assert.equal(getBase('a/b/{c,/.gitignore}').base, 'a/b'); + assert.equal(getBase('a/b/{c,/.gitignore}').pattern, '{c,/.gitignore}'); + + assert.equal(getBase('a/b/{c,/gitignore}').base, 'a/b'); + assert.equal(getBase('a/b/{c,/gitignore}').pattern, '{c,/gitignore}'); + + assert.equal(getBase('a/b/{c,d}').base, 'a/b'); + assert.equal(getBase('a/b/{c,d}').pattern, '{c,d}'); + }); + + it('should work when the dirname has braces:', function () { + assert.equal(getBase('a/b/{c,./d}/e/f.g').base, 'a/b'); + assert.equal(getBase('a/b/{c,./d}/e/f.g').pattern, '{c,./d}/e/f.g'); + + assert.equal(getBase('a/b/{c,./d}/e/f.min.g').base, 'a/b'); + assert.equal(getBase('a/b/{c,./d}/e/f.min.g').pattern, '{c,./d}/e/f.min.g'); + + assert.equal(getBase('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').base, 'a/b'); + assert.equal(getBase('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').pattern, '{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js'); + + assert.equal(getBase('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').base, 'a/b'); + assert.equal(getBase('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').pattern, '{c,.gitignore,{a,b}}/{a,b}/*.foo.js'); + + assert.equal(getBase('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').base, 'a/b'); + assert.equal(getBase('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').pattern, '{c,.gitignore,{a,b}}/{a,b}/abc.foo.js'); + + assert.equal(getBase('a/b/{c,/d}/e/f.g').base, 'a/b'); + assert.equal(getBase('a/b/{c,/d}/e/f.g').pattern, '{c,/d}/e/f.g'); + + assert.equal(getBase('a/b/{c,/d}/e/f.min.g').base, 'a/b'); + assert.equal(getBase('a/b/{c,/d}/e/f.min.g').pattern, '{c,/d}/e/f.min.g'); + + assert.equal(getBase('a/b/{c,d}/').base, 'a/b'); + assert.equal(getBase('a/b/{c,d}/').pattern, '{c,d}/'); + + assert.equal(getBase('a/b/{c,d}/*.js').base, 'a/b'); + assert.equal(getBase('a/b/{c,d}/*.js').pattern, '{c,d}/*.js'); + + assert.equal(getBase('a/b/{c,d}/*.min.js').base, 'a/b'); + assert.equal(getBase('a/b/{c,d}/*.min.js').pattern, '{c,d}/*.min.js'); + + assert.equal(getBase('a/b/{c,d}/e.f.g/').base, 'a/b'); + assert.equal(getBase('a/b/{c,d}/e.f.g/').pattern, '{c,d}/e.f.g/'); + + assert.equal(getBase('a/b/{c,d}/e/f.g').base, 'a/b'); + assert.equal(getBase('a/b/{c,d}/e/f.g').pattern, '{c,d}/e/f.g'); + + assert.equal(getBase('a/b/{c,d}/e/f.min.g').base, 'a/b'); + assert.equal(getBase('a/b/{c,d}/e/f.min.g').pattern, '{c,d}/e/f.min.g'); + + assert.equal(getBase('foo/{a,b}.min.js').base, 'foo'); + assert.equal(getBase('foo/{a,b}.min.js').pattern, '{a,b}.min.js'); + }); + }); + + it('character classes:', function () { + assert.equal(getBase('[a-c]b*').base, ''); + assert.equal(getBase('[a-c]b*').pattern, '[a-c]b*'); + + assert.equal(getBase('[a-j]*[^c]').base, ''); + assert.equal(getBase('[a-j]*[^c]').pattern, '[a-j]*[^c]'); + + assert.equal(getBase('[a-j]*[^c]b/c').base, ''); + assert.equal(getBase('[a-j]*[^c]b/c').pattern, '[a-j]*[^c]b/c'); + + assert.equal(getBase('[a-j]*[^c]bc').base, ''); + assert.equal(getBase('[a-j]*[^c]bc').pattern, '[a-j]*[^c]bc'); + + assert.equal(getBase('[ab][ab]').base, ''); + assert.equal(getBase('[ab][ab]').pattern, '[ab][ab]'); + + assert.equal(getBase('foo/[a-b].min.js').base, 'foo'); + assert.equal(getBase('foo/[a-b].min.js').pattern, '[a-b].min.js'); + }); + + it('qmarks:', function () { + assert.equal(getBase('?').base, ''); + assert.equal(getBase('?').pattern, '?'); + + assert.equal(getBase('?/?').base, ''); + assert.equal(getBase('?/?').pattern, '?/?'); + + assert.equal(getBase('??').base, ''); + assert.equal(getBase('??').pattern, '??'); + + assert.equal(getBase('???').base, ''); + assert.equal(getBase('???').pattern, '???'); + + assert.equal(getBase('?a').base, ''); + assert.equal(getBase('?a').pattern, '?a'); + + assert.equal(getBase('?b').base, ''); + assert.equal(getBase('?b').pattern, '?b'); + + assert.equal(getBase('a?b').base, ''); + assert.equal(getBase('a?b').pattern, 'a?b'); + + assert.equal(getBase('a/?/c.js').base, 'a'); + assert.equal(getBase('a/?/c.js').pattern, '?/c.js'); + + assert.equal(getBase('a/?/c.md').base, 'a'); + assert.equal(getBase('a/?/c.md').pattern, '?/c.md'); + + assert.equal(getBase('a/?/c/?/*/f.js').base, 'a'); + assert.equal(getBase('a/?/c/?/*/f.js').pattern, '?/c/?/*/f.js'); + + assert.equal(getBase('a/?/c/?/*/f.md').base, 'a'); + assert.equal(getBase('a/?/c/?/*/f.md').pattern, '?/c/?/*/f.md'); + + assert.equal(getBase('a/?/c/?/e.js').base, 'a'); + assert.equal(getBase('a/?/c/?/e.js').pattern, '?/c/?/e.js'); + + assert.equal(getBase('a/?/c/?/e.md').base, 'a'); + assert.equal(getBase('a/?/c/?/e.md').pattern, '?/c/?/e.md'); + + assert.equal(getBase('a/?/c/???/e.js').base, 'a'); + assert.equal(getBase('a/?/c/???/e.js').pattern, '?/c/???/e.js'); + + assert.equal(getBase('a/?/c/???/e.md').base, 'a'); + assert.equal(getBase('a/?/c/???/e.md').pattern, '?/c/???/e.md'); + + assert.equal(getBase('a/??/c.js').base, 'a'); + assert.equal(getBase('a/??/c.js').pattern, '??/c.js'); + + assert.equal(getBase('a/??/c.md').base, 'a'); + assert.equal(getBase('a/??/c.md').pattern, '??/c.md'); + + assert.equal(getBase('a/???/c.js').base, 'a'); + assert.equal(getBase('a/???/c.js').pattern, '???/c.js'); + + assert.equal(getBase('a/???/c.md').base, 'a'); + assert.equal(getBase('a/???/c.md').pattern, '???/c.md'); + + assert.equal(getBase('a/????/c.js').base, 'a'); + assert.equal(getBase('a/????/c.js').pattern, '????/c.js'); + }); + + it('non-glob pattern:', function () { + assert.equal(getBase('').base, ''); + assert.equal(getBase('').pattern, ''); + + assert.equal(getBase('.').base, ''); + assert.equal(getBase('.').pattern, '.'); + + assert.equal(getBase('a').base, ''); + assert.equal(getBase('a').pattern, 'a'); + + assert.equal(getBase('.a').base, ''); + assert.equal(getBase('.a').pattern, '.a'); + + assert.equal(getBase('/a').base, '/'); + assert.equal(getBase('/a').pattern, 'a'); + + assert.equal(getBase('/a/b/c').base, '/a/b/'); + assert.equal(getBase('/a/b/c').pattern, 'c'); + + assert.equal(getBase('/a/b/c/').base, '/a/b/c/'); + assert.equal(getBase('/a/b/c/').pattern, ''); + + assert.equal(getBase('a/b/c/').base, 'a/b/c/'); + assert.equal(getBase('a/b/c/').pattern, ''); + + assert.equal(getBase('a.min.js').base, ''); + assert.equal(getBase('a.min.js').pattern, 'a.min.js'); + + assert.equal(getBase('a/.x.md').base, 'a/'); + assert.equal(getBase('a/.x.md').pattern, '.x.md'); + + assert.equal(getBase('a/b/.gitignore').base, 'a/b/'); + assert.equal(getBase('a/b/.gitignore').pattern, '.gitignore'); + + assert.equal(getBase('a/b/c/d.md').base, 'a/b/c/'); + assert.equal(getBase('a/b/c/d.md').pattern, 'd.md'); + + assert.equal(getBase('a/b/c/d.e.f/g.min.js').base, 'a/b/c/d.e.f/'); + assert.equal(getBase('a/b/c/d.e.f/g.min.js').pattern, 'g.min.js'); + + assert.equal(getBase('a/b/.git').base, 'a/b/'); + assert.equal(getBase('a/b/.git').pattern, '.git'); + + assert.equal(getBase('a/b/.git/').base, 'a/b/.git/'); + assert.equal(getBase('a/b/.git/').pattern, ''); + + assert.equal(getBase('a/b/.gitignore').base, 'a/b/'); + assert.equal(getBase('a/b/.gitignore').pattern, '.gitignore'); + + assert.equal(getBase('a/b/c').base, 'a/b/'); + assert.equal(getBase('a/b/c').pattern, 'c'); + + assert.equal(getBase('a/b/c.d/e.md').base, 'a/b/c.d/'); + assert.equal(getBase('a/b/c.d/e.md').pattern, 'e.md'); + + assert.equal(getBase('a/b/c.md').base, 'a/b/'); + assert.equal(getBase('a/b/c.md').pattern, 'c.md'); + + assert.equal(getBase('a/b/c.min.js').base, 'a/b/'); + assert.equal(getBase('a/b/c.min.js').pattern, 'c.min.js'); + + assert.equal(getBase('a/b/c/').base, 'a/b/c/'); + assert.equal(getBase('a/b/c/').pattern, ''); + + assert.equal(getBase('a/b/c/d.e.f/g.min.js').base, 'a/b/c/d.e.f/'); + assert.equal(getBase('a/b/c/d.e.f/g.min.js').pattern, 'g.min.js'); + + assert.equal(getBase('a/b/c/d.md').base, 'a/b/c/'); + assert.equal(getBase('a/b/c/d.md').pattern, 'd.md'); + + assert.equal(getBase('a/b/git/').base, 'a/b/git/'); + assert.equal(getBase('a/b/git/').pattern, ''); + + assert.equal(getBase('aa').base, ''); + assert.equal(getBase('aa').pattern, 'aa'); + + assert.equal(getBase('ab').base, ''); + assert.equal(getBase('ab').pattern, 'ab'); + + assert.equal(getBase('bb').base, ''); + assert.equal(getBase('bb').pattern, 'bb'); + + assert.equal(getBase('c.md').base, ''); + assert.equal(getBase('c.md').pattern, 'c.md'); + + assert.equal(getBase('foo').base, ''); + assert.equal(getBase('foo').pattern, 'foo'); + }); }); -it('should get a filename from a complex pattern:', function () { - assert.equal(parse('*.min.js').dirname, ''); - assert.equal(parse('/a/b/c').dirname, '/a/b/'); - assert.equal(parse('/a/b/c/').dirname, '/a/b/c/'); - assert.equal(parse('/a/b/{c,d}/').dirname, '/a/b/{c,d}/'); - assert.equal(parse('/a/b/{c,d}/*.js').dirname, '/a/b/{c,d}/'); - assert.equal(parse('/a/b/{c,d}/*.min.js').dirname, '/a/b/{c,d}/'); - assert.equal(parse('/a/b/{c,d}/e.f.g/').dirname, '/a/b/{c,d}/e.f.g/'); - assert.equal(parse('/a/b/{c,/foo.js}/e.f.g/').dirname, '/a/b/{c,/foo.js}/e.f.g/'); - assert.equal(parse('./{a/b/{c,/foo.js}/e.f.g}').dirname, './{a/b/{c,/foo.js}/e.f.g}'); - assert.equal(parse('[a-c]b*').dirname, ''); - assert.equal(parse('[a-j]*[^c]').dirname, ''); - assert.equal(parse('[a-j]*[^c]b/c').dirname, '[a-j]*[^c]b/'); - assert.equal(parse('[a-j]*[^c]bc').dirname, ''); - assert.equal(parse('a/b/{c,./d}/e/f.g').dirname, 'a/b/{c,./d}/e/'); - assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').dirname, 'a/b/{c,.gitignore,{a,./b}}/{a,b}/'); - assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').dirname, 'a/b/{c,.gitignore,{a,b}}/{a,b}/'); - assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').dirname, 'a/b/{c,.gitignore,{a,b}}/{a,b}/'); - assert.equal(parse('a/b/{c,.gitignore}').dirname, 'a/b/'); - assert.equal(parse('a/b/{c,/.gitignore}').dirname, 'a/b/'); - assert.equal(parse('a/b/{c,/d}/e/f.g').dirname, 'a/b/{c,/d}/e/'); - assert.equal(parse('a/b/{c,/gitignore}').dirname, 'a/b/'); - assert.equal(parse('a/b/{c,d}').dirname, 'a/b/'); - assert.equal(parse('a/b/{c,d}/').dirname, 'a/b/{c,d}/'); - assert.equal(parse('a/b/{c,d}/*.js').dirname, 'a/b/{c,d}/'); - assert.equal(parse('a/b/{c,d}/*.min.js').dirname, 'a/b/{c,d}/'); - assert.equal(parse('a/b/{c,d}/e.f.g/').dirname, 'a/b/{c,d}/e.f.g/'); - assert.equal(parse('a/b/{c,d}/e/f.g').dirname, 'a/b/{c,d}/e/'); - assert.equal(parse('a').dirname, ''); - assert.equal(parse('a/**/b/*.{foo,bar}').dirname, 'a/**/b/'); - assert.equal(parse('a/b/*.{foo,bar}').dirname, 'a/b/'); - assert.equal(parse('a/b/.gitignore').dirname, 'a/b/'); - assert.equal(parse('a/b/.{c,.gitignore}').dirname, 'a/b/'); - assert.equal(parse('a/b/.{c,/.gitignore}').dirname, 'a/b/'); - assert.equal(parse('a/b/.{foo,bar}').dirname, 'a/b/'); - assert.equal(parse('a/b/c').dirname, 'a/b/'); - assert.equal(parse('a/b/c.d/e.md').dirname, 'a/b/c.d/'); - assert.equal(parse('a/b/c.md').dirname, 'a/b/'); - assert.equal(parse('a/b/c.min.js').dirname, 'a/b/'); - assert.equal(parse('a/b/c/').dirname, 'a/b/c/'); - assert.equal(parse('a/b/c/d.e.f/g.min.js').dirname, 'a/b/c/d.e.f/'); - assert.equal(parse('a/b/c/d.md').dirname, 'a/b/c/'); - assert.equal(parse('c.md').dirname, ''); +describe('path parts:', function () { + describe('complex patterns:', function () { + it('should get a dirname:', function () { + assert.equal(parse('*.min.js').path.dirname, ''); + assert.equal(parse('/a/b/c').path.dirname, '/a/b/'); + assert.equal(parse('/a/b/c/').path.dirname, '/a/b/c/'); + assert.equal(parse('/a/b/{c,d}/').path.dirname, '/a/b/{c,d}/'); + assert.equal(parse('/a/b/{c,d}/*.js').path.dirname, '/a/b/{c,d}/'); + assert.equal(parse('/a/b/{c,d}/*.min.js').path.dirname, '/a/b/{c,d}/'); + assert.equal(parse('/a/b/{c,d}/e.f.g/').path.dirname, '/a/b/{c,d}/e.f.g/'); + assert.equal(parse('/a/b/{c,/foo.js}/e.f.g/').path.dirname, '/a/b/{c,/foo.js}/e.f.g/'); + assert.equal(parse('./{a/b/{c,/foo.js}/e.f.g}').path.dirname, './{a/b/{c,/foo.js}/e.f.g}'); + assert.equal(parse('[a-c]b*').path.dirname, ''); + assert.equal(parse('[a-j]*[^c]').path.dirname, ''); + assert.equal(parse('[a-j]*[^c]b/c').path.dirname, '[a-j]*[^c]b/'); + assert.equal(parse('[a-j]*[^c]bc').path.dirname, ''); + assert.equal(parse('a/b/{c,./d}/e/f.g').path.dirname, 'a/b/{c,./d}/e/'); + assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').path.dirname, 'a/b/{c,.gitignore,{a,./b}}/{a,b}/'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').path.dirname, 'a/b/{c,.gitignore,{a,b}}/{a,b}/'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').path.dirname, 'a/b/{c,.gitignore,{a,b}}/{a,b}/'); + assert.equal(parse('a/b/{c,.gitignore}').path.dirname, 'a/b/'); + assert.equal(parse('a/b/{c,/.gitignore}').path.dirname, 'a/b/'); + assert.equal(parse('a/b/{c,/d}/e/f.g').path.dirname, 'a/b/{c,/d}/e/'); + assert.equal(parse('a/b/{c,/gitignore}').path.dirname, 'a/b/'); + assert.equal(parse('a/b/{c,d}').path.dirname, 'a/b/'); + assert.equal(parse('a/b/{c,d}/').path.dirname, 'a/b/{c,d}/'); + assert.equal(parse('a/b/{c,d}/*.js').path.dirname, 'a/b/{c,d}/'); + assert.equal(parse('a/b/{c,d}/*.min.js').path.dirname, 'a/b/{c,d}/'); + assert.equal(parse('a/b/{c,d}/e.f.g/').path.dirname, 'a/b/{c,d}/e.f.g/'); + assert.equal(parse('a/b/{c,d}/e/f.g').path.dirname, 'a/b/{c,d}/e/'); + assert.equal(parse('a').path.dirname, ''); + assert.equal(parse('a/**/b/*.{foo,bar}').path.dirname, 'a/**/b/'); + assert.equal(parse('a/b/*.{foo,bar}').path.dirname, 'a/b/'); + assert.equal(parse('a/b/.gitignore').path.dirname, 'a/b/'); + assert.equal(parse('a/b/.{c,.gitignore}').path.dirname, 'a/b/'); + assert.equal(parse('a/b/.{c,/.gitignore}').path.dirname, 'a/b/'); + assert.equal(parse('a/b/.{foo,bar}').path.dirname, 'a/b/'); + assert.equal(parse('a/b/c').path.dirname, 'a/b/'); + assert.equal(parse('a/b/c.d/e.md').path.dirname, 'a/b/c.d/'); + assert.equal(parse('a/b/c.md').path.dirname, 'a/b/'); + assert.equal(parse('a/b/c.min.js').path.dirname, 'a/b/'); + assert.equal(parse('a/b/c/').path.dirname, 'a/b/c/'); + assert.equal(parse('a/b/c/d.e.f/g.min.js').path.dirname, 'a/b/c/d.e.f/'); + assert.equal(parse('a/b/c/d.md').path.dirname, 'a/b/c/'); + assert.equal(parse('c.md').path.dirname, ''); + }); + + it('should get a filename:', function () { + assert.equal(parse('*.min.js').path.filename, '*.min.js'); + assert.equal(parse('/a/b/{c,d}/').path.filename, ''); + assert.equal(parse('/a/b/{c,d}/*.js').path.filename, '*.js'); + assert.equal(parse('/a/b/{c,d}/*.min.js').path.filename, '*.min.js'); + assert.equal(parse('/a/b/{c,d}/e.f.g/').path.filename, ''); + assert.equal(parse('[a-j]*[^c]').path.filename, '[a-j]*[^c]'); + assert.equal(parse('[a-j]*[^c]bc').path.filename, '[a-j]*[^c]bc'); + assert.equal(parse('a/**/b/*.{foo,bar}').path.filename, '*.{foo,bar}'); + assert.equal(parse('a/b/*.{foo,bar}').path.filename, '*.{foo,bar}'); + assert.equal(parse('a/b/.{c,.gitignore}').path.filename, '.{c,.gitignore}'); + assert.equal(parse('a/b/.{c,/.gitignore}').path.filename, '.{c,/.gitignore}'); + assert.equal(parse('a/b/.{foo,bar}').path.filename, '.{foo,bar}'); + assert.equal(parse('a/b/{c,./d}/e/f.g').path.filename, 'f.g'); + assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').path.filename, 'abc.foo.js'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').path.filename, '*.foo.js'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').path.filename, 'abc.foo.js'); + assert.equal(parse('a/b/{c,.gitignore}').path.filename, '{c,.gitignore}'); + assert.equal(parse('a/b/{c,/.gitignore}').path.filename, '{c,/.gitignore}'); + assert.equal(parse('a/b/{c,/d}/e/f.g').path.filename, 'f.g'); + assert.equal(parse('a/b/{c,/gitignore}').path.filename, '{c,/gitignore}'); + assert.equal(parse('a/b/{c,d}').path.filename, '{c,d}'); + assert.equal(parse('a/b/{c,d}/').path.filename, ''); + assert.equal(parse('a/b/{c,d}/*.js').path.filename, '*.js'); + assert.equal(parse('a/b/{c,d}/*.min.js').path.filename, '*.min.js'); + assert.equal(parse('a/b/{c,d}/e.f.g/').path.filename, ''); + assert.equal(parse('a/b/{c,d}/e/f.g').path.filename, 'f.g'); + }); + + it('should get a basename:', function () { + assert.equal(parse('*.min.js').path.basename, '*'); + assert.equal(parse('/a/b/c').path.basename, 'c'); + assert.equal(parse('/a/b/c/').path.basename, ''); + assert.equal(parse('/a/b/{c,d}/').path.basename, ''); + assert.equal(parse('/a/b/{c,d}/*.js').path.basename, '*'); + assert.equal(parse('/a/b/{c,d}/*.min.js').path.basename, '*'); + assert.equal(parse('/a/b/{c,d}/e.f.g/').path.basename, ''); + assert.equal(parse('[a-c]b*').path.basename, '[a-c]b*'); + assert.equal(parse('a').path.basename, 'a'); + assert.equal(parse('a/**/b/*.{foo,bar}').path.basename, '*'); + assert.equal(parse('a/b/*.{foo,bar}').path.basename, '*'); + assert.equal(parse('a/b/.gitignore').path.basename, ''); + assert.equal(parse('a/b/.{c,.gitignore}').path.basename, ''); + assert.equal(parse('a/b/.{c,/.gitignore}').path.basename, ''); + assert.equal(parse('a/b/.{foo,bar}').path.basename, ''); + assert.equal(parse('a/b/c').path.basename, 'c'); + assert.equal(parse('a/b/c.d/e.md').path.basename, 'e'); + assert.equal(parse('a/b/c.md').path.basename, 'c'); + assert.equal(parse('a/b/c.min.js').path.basename, 'c'); + assert.equal(parse('a/b/c/').path.basename, ''); + assert.equal(parse('a/b/c/d.e.f/g.min.js').path.basename, 'g'); + assert.equal(parse('a/b/c/d.md').path.basename, 'd'); + assert.equal(parse('a/b/{c,./d}/e/f.g').path.basename, 'f'); + assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').path.basename, 'abc'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').path.basename, '*'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').path.basename, 'abc'); + assert.equal(parse('a/b/{c,.gitignore}').path.basename, '{c,.gitignore}'); + assert.equal(parse('a/b/{c,/.gitignore}').path.basename, '{c,/.gitignore}'); + assert.equal(parse('a/b/{c,/d}/e/f.g').path.basename, 'f'); + assert.equal(parse('a/b/{c,/gitignore}').path.basename, '{c,/gitignore}'); + assert.equal(parse('a/b/{c,d}').path.basename, '{c,d}'); + assert.equal(parse('a/b/{c,d}/').path.basename, ''); + assert.equal(parse('a/b/{c,d}/*.js').path.basename, '*'); + assert.equal(parse('a/b/{c,d}/*.min.js').path.basename, '*'); + assert.equal(parse('a/b/{c,d}/e.f.g/').path.basename, ''); + assert.equal(parse('a/b/{c,d}/e/f.g').path.basename, 'f'); + assert.equal(parse('c.md').path.basename, 'c'); + }); + + it('should get an extname:', function () { + assert.equal(parse('*.min.js').path.extname, '.min.js'); + assert.equal(parse('/a/b/c').path.extname, ''); + assert.equal(parse('/a/b/c/').path.extname, ''); + assert.equal(parse('/a/b/{c,d}/').path.extname, ''); + assert.equal(parse('/a/b/{c,d}/*.js').path.extname, '.js'); + assert.equal(parse('/a/b/{c,d}/*.min.js').path.extname, '.min.js'); + assert.equal(parse('/a/b/{c,d}/e.f.g/').path.extname, ''); + assert.equal(parse('[a-c]b*').path.extname, ''); + assert.equal(parse('[a-j]*[^c]bc').path.extname, ''); + assert.equal(parse('a').path.extname, ''); + assert.equal(parse('a/**/b/*.{foo,bar}').path.extname, '.{foo,bar}'); + assert.equal(parse('a/b/*.{foo,bar}').path.extname, '.{foo,bar}'); + assert.equal(parse('a/b/.gitignore').path.extname, '.gitignore'); + assert.equal(parse('a/b/.{c,.gitignore}').path.extname, '.{c,.gitignore}'); + assert.equal(parse('a/b/.{c,/.gitignore}').path.extname, '.{c,/.gitignore}'); + assert.equal(parse('a/b/.{foo,bar}').path.extname, '.{foo,bar}'); + assert.equal(parse('a/b/c').path.extname, ''); + assert.equal(parse('a/b/c.d/e.md').path.extname, '.md'); + assert.equal(parse('a/b/c.md').path.extname, '.md'); + assert.equal(parse('a/b/c.min.js').path.extname, '.min.js'); + assert.equal(parse('a/b/c/').path.extname, ''); + assert.equal(parse('a/b/c/d.e.f/g.min.js').path.extname, '.min.js'); + assert.equal(parse('a/b/c/d.md').path.extname, '.md'); + assert.equal(parse('a/b/{c,./d}/e/f.g').path.extname, '.g'); + assert.equal(parse('a/b/{c,./d}/e/f.min.g').path.extname, '.min.g'); + assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').path.extname, '.foo.js'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').path.extname, '.foo.js'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').path.extname, '.foo.js'); + assert.equal(parse('a/b/{c,.gitignore}').path.extname, ''); + assert.equal(parse('a/b/{c,/.gitignore}').path.extname, ''); + assert.equal(parse('a/b/{c,/d}/e/f.g').path.extname, '.g'); + assert.equal(parse('a/b/{c,/d}/e/f.min.g').path.extname, '.min.g'); + assert.equal(parse('a/b/{c,/gitignore}').path.extname, ''); + assert.equal(parse('a/b/{c,d}').path.extname, ''); + assert.equal(parse('a/b/{c,d}/').path.extname, ''); + assert.equal(parse('a/b/{c,d}/*.js').path.extname, '.js'); + assert.equal(parse('a/b/{c,d}/*.min.js').path.extname, '.min.js'); + assert.equal(parse('a/b/{c,d}/e.f.g/').path.extname, ''); + assert.equal(parse('a/b/{c,d}/e/f.g').path.extname, '.g'); + assert.equal(parse('a/b/{c,d}/e/f.min.g').path.extname, '.min.g'); + assert.equal(parse('c.md').path.extname, '.md'); + }); + }); + + describe('should parse a glob:', function () { + it('ending with a brace pattern:', function () { + assert.equal(parse('a/b/{c,d}').pattern, 'a/b/{c,d}'); + assert.equal(parse('a/b/{c,d}').path.dirname, 'a/b/'); + assert.equal(parse('a/b/{c,d}').path.filename, '{c,d}'); + assert.equal(parse('a/b/{c,d}').path.basename, '{c,d}'); + assert.equal(parse('a/b/{c,d}').path.extname, ''); + assert.equal(parse('a/b/{c,d}').path.ext, ''); + }); + + it('with a brace pattern in the dirname:', function () { + assert.equal(parse('a/b/{c,d}/*.js').pattern, 'a/b/{c,d}/*.js'); + assert.equal(parse('a/b/{c,d}/*.js').path.dirname, 'a/b/{c,d}/'); + assert.equal(parse('a/b/{c,d}/*.js').path.filename, '*.js'); + assert.equal(parse('a/b/{c,d}/*.js').path.basename, '*'); + assert.equal(parse('a/b/{c,d}/*.js').path.extname, '.js'); + assert.equal(parse('a/b/{c,d}/*.js').path.ext, 'js'); + + assert.equal(parse('a/b/{c,d}/').pattern, 'a/b/{c,d}/'); + assert.equal(parse('a/b/{c,d}/').path.dirname, 'a/b/{c,d}/'); + assert.equal(parse('a/b/{c,d}/').path.filename, ''); + assert.equal(parse('a/b/{c,d}/').path.basename, ''); + assert.equal(parse('a/b/{c,d}/').path.extname, ''); + assert.equal(parse('a/b/{c,d}/').path.ext, ''); + + assert.equal(parse('a/b/{c,d}/e.f.g/').pattern, 'a/b/{c,d}/e.f.g/'); + assert.equal(parse('a/b/{c,d}/e.f.g/').path.dirname, 'a/b/{c,d}/e.f.g/'); + assert.equal(parse('a/b/{c,d}/e.f.g/').path.filename, ''); + assert.equal(parse('a/b/{c,d}/e.f.g/').path.basename, ''); + assert.equal(parse('a/b/{c,d}/e.f.g/').path.extname, ''); + assert.equal(parse('a/b/{c,d}/e.f.g/').path.ext, ''); + + assert.equal(parse('/a/b/{c,d}/e.f.g/').pattern, '/a/b/{c,d}/e.f.g/'); + assert.equal(parse('/a/b/{c,d}/e.f.g/').path.dirname, '/a/b/{c,d}/e.f.g/'); + assert.equal(parse('/a/b/{c,d}/e.f.g/').path.filename, ''); + assert.equal(parse('/a/b/{c,d}/e.f.g/').path.basename, ''); + assert.equal(parse('/a/b/{c,d}/e.f.g/').path.extname, ''); + assert.equal(parse('/a/b/{c,d}/e.f.g/').path.ext, ''); + + assert.equal(parse('a/b/{c,d}/*.min.js').pattern, 'a/b/{c,d}/*.min.js'); + assert.equal(parse('a/b/{c,d}/*.min.js').path.dirname, 'a/b/{c,d}/'); + assert.equal(parse('a/b/{c,d}/*.min.js').path.filename, '*.min.js'); + assert.equal(parse('a/b/{c,d}/*.min.js').path.basename, '*'); + assert.equal(parse('a/b/{c,d}/*.min.js').path.extname, '.min.js'); + assert.equal(parse('a/b/{c,d}/*.min.js').path.ext, 'js'); + + assert.equal(parse('*.min.js').pattern, '*.min.js'); + assert.equal(parse('*.min.js').path.dirname, ''); + assert.equal(parse('*.min.js').path.filename, '*.min.js'); + assert.equal(parse('*.min.js').path.basename, '*'); + assert.equal(parse('*.min.js').path.extname, '.min.js'); + assert.equal(parse('*.min.js').path.ext, 'js'); + + assert.equal(parse('a/b/{c,d}/*.min.js').path.extname, '.min.js'); + assert.equal(parse('a/b/{c,d}/*.min.js').path.ext, 'js'); + + assert.equal(parse('[a-j]*[^c]').pattern, '[a-j]*[^c]'); + assert.equal(parse('[a-j]*[^c]').path.dirname, ''); + assert.equal(parse('[a-j]*[^c]').path.filename, '[a-j]*[^c]'); + assert.equal(parse('[a-j]*[^c]b/c').pattern, '[a-j]*[^c]b/c'); + assert.equal(parse('[a-j]*[^c]b/c').path.dirname, '[a-j]*[^c]b/'); + assert.equal(parse('[a-j]*[^c]bc').pattern, '[a-j]*[^c]bc'); + assert.equal(parse('[a-j]*[^c]bc').path.dirname, ''); + assert.equal(parse('[a-j]*[^c]bc').path.filename, '[a-j]*[^c]bc'); + }); + + it('ending with a slash:', function () { + assert.equal(parse('a/b/{c,d}/').pattern, 'a/b/{c,d}/'); + assert.equal(parse('a/b/{c,d}/').path.dirname, 'a/b/{c,d}/'); + assert.equal(parse('a/b/{c,d}/').path.filename, ''); + assert.equal(parse('a/b/{c,d}/').path.basename, ''); + assert.equal(parse('a/b/{c,d}/').path.extname, ''); + }); + + it('beginning with a slash:', function () { + assert.equal(parse('/a/b/{c,d}/').pattern, '/a/b/{c,d}/'); + assert.equal(parse('/a/b/{c,d}/').path.dirname, '/a/b/{c,d}/'); + assert.equal(parse('/a/b/{c,d}/').path.filename, ''); + assert.equal(parse('/a/b/{c,d}/').path.basename, ''); + assert.equal(parse('/a/b/{c,d}/').path.extname, ''); + }); + + it('with a brace pattern in the dirname:', function () { + assert.equal(parse('a/b/{c,d}/e/f.g').pattern, 'a/b/{c,d}/e/f.g'); + assert.equal(parse('a/b/{c,d}/e/f.g').path.dirname, 'a/b/{c,d}/e/'); + assert.equal(parse('a/b/{c,d}/e/f.g').path.filename, 'f.g'); + assert.equal(parse('a/b/{c,d}/e/f.g').path.basename, 'f'); + assert.equal(parse('a/b/{c,d}/e/f.g').path.extname, '.g'); + assert.equal(parse('a/b/{c,d}/e/f.min.g').path.extname, '.min.g'); + assert.equal(parse('a/b/{c,d}/e/f.g').path.ext, 'g'); + + assert.equal(parse('a/b/{c,./d}/e/f.g').pattern, 'a/b/{c,./d}/e/f.g'); + assert.equal(parse('a/b/{c,./d}/e/f.g').path.dirname, 'a/b/{c,./d}/e/'); + assert.equal(parse('a/b/{c,./d}/e/f.g').path.filename, 'f.g'); + assert.equal(parse('a/b/{c,./d}/e/f.g').path.basename, 'f'); + assert.equal(parse('a/b/{c,./d}/e/f.g').path.extname, '.g'); + assert.equal(parse('a/b/{c,./d}/e/f.min.g').path.extname, '.min.g'); + assert.equal(parse('a/b/{c,./d}/e/f.g').path.ext, 'g'); + + assert.equal(parse('a/b/{c,/d}/e/f.g').pattern, 'a/b/{c,/d}/e/f.g'); + assert.equal(parse('a/b/{c,/d}/e/f.g').path.dirname, 'a/b/{c,/d}/e/'); + assert.equal(parse('a/b/{c,/d}/e/f.g').path.filename, 'f.g'); + assert.equal(parse('a/b/{c,/d}/e/f.g').path.basename, 'f'); + assert.equal(parse('a/b/{c,/d}/e/f.g').path.extname, '.g'); + assert.equal(parse('a/b/{c,/d}/e/f.min.g').path.extname, '.min.g'); + assert.equal(parse('a/b/{c,/d}/e/f.g').path.ext, 'g'); + }); + }); + + describe('when the glob pattern has braces:', function () { + it('should track the original pattern', function () { + assert.equal(parse('/a/b/{c,d}/*.js').original, '/a/b/{c,d}/*.js'); + assert.equal(parse('/a/b/{c,d}/*.js').original, '/a/b/{c,d}/*.js'); + }); + + it('should extract the dirname', function () { + assert.equal(parse('/a/b/{c,d}/*.js').path.dirname, '/a/b/{c,d}/'); + assert.equal(parse('/a/b/{c,d}/*.min.js').path.dirname, '/a/b/{c,d}/'); + }); + + it('should extract the filename', function () { + assert.equal(parse('/a/b/{c,d}/*.js').path.filename, '*.js'); + assert.equal(parse('/a/b/{c,d}/*.min.js').path.filename, '*.min.js'); + }); + + it('should extract the basename', function () { + assert.equal(parse('/a/b/{c,d}/*.js').path.basename, '*'); + assert.equal(parse('/a/b/{c,d}/*.min.js').path.basename, '*'); + }); + + it('should extract extname', function () { + assert.equal(parse('/a/b/{c,d}/*.js').path.extname, '.js'); + assert.equal(parse('/a/b/{c,d}/*.min.js').path.extname, '.min.js'); + }); + + it('should extract ext', function () { + assert.equal(parse('/a/b/{c,d}/*.js').path.ext, 'js'); + assert.equal(parse('/a/b/{c,d}/*.js').path.ext, 'js'); + }); + }); + + it('should match when the filename starts with a star:', function () { + assert.equal(parse('a/b/*.{foo,bar}').pattern, 'a/b/*.{foo,bar}'); + assert.equal(parse('a/b/*.{foo,bar}').path.dirname, 'a/b/'); + assert.equal(parse('a/b/*.{foo,bar}').path.filename, '*.{foo,bar}'); + assert.equal(parse('a/b/*.{foo,bar}').path.basename, '*'); + assert.equal(parse('a/b/*.{foo,bar}').path.extname, '.{foo,bar}'); + assert.equal(parse('a/b/*.{foo,bar}').path.ext, '{foo,bar}'); + }); + + it('should match with globstars:', function () { + assert.equal(parse('a/**/b/*.{foo,bar}').pattern, 'a/**/b/*.{foo,bar}'); + assert.equal(parse('a/**/b/*.{foo,bar}').path.dirname, 'a/**/b/'); + assert.equal(parse('a/**/b/*.{foo,bar}').path.filename, '*.{foo,bar}'); + assert.equal(parse('a/**/b/*.{foo,bar}').path.basename, '*'); + assert.equal(parse('a/**/b/*.{foo,bar}').path.extname, '.{foo,bar}'); + assert.equal(parse('a/**/b/*.{foo,bar}').path.ext, '{foo,bar}'); + }); + + it('should match complex patterns:', function () { + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').pattern, 'a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').path.dirname, 'a/b/{c,.gitignore,{a,b}}/{a,b}/'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').path.filename, 'abc.foo.js'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').path.basename, 'abc'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').path.extname, '.foo.js'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').path.ext, 'js'); + + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').pattern, 'a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').path.dirname, 'a/b/{c,.gitignore,{a,b}}/{a,b}/'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').path.filename, '*.foo.js'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').path.basename, '*'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').path.extname, '.foo.js'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').path.ext, 'js'); + + assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').pattern, 'a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js'); + assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').path.dirname, 'a/b/{c,.gitignore,{a,./b}}/{a,b}/'); + assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').path.filename, 'abc.foo.js'); + assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').path.basename, 'abc'); + assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').path.extname, '.foo.js'); + assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').path.ext, 'js'); + }); + + it('should match a path with an extension:', function () { + assert.equal(parse('a/b/c.md').pattern, 'a/b/c.md'); + assert.equal(parse('a/b/c.md').path.dirname, 'a/b/'); + assert.equal(parse('a/b/c.md').path.filename, 'c.md'); + assert.equal(parse('a/b/c.md').path.basename, 'c'); + assert.equal(parse('a/b/c.md').path.extname, '.md'); + assert.equal(parse('a/b/c.md').path.ext, 'md'); + assert.equal(parse('c.md').pattern, 'c.md'); + assert.equal(parse('c.md').path.dirname, ''); + assert.equal(parse('c.md').path.filename, 'c.md'); + assert.equal(parse('c.md').path.basename, 'c'); + assert.equal(parse('c.md').path.extname, '.md'); + assert.equal(parse('c.md').path.ext, 'md'); + }); + + it('should match a path with multiple extensions:', function () { + assert.equal(parse('a/b/c.min.js').pattern, 'a/b/c.min.js'); + assert.equal(parse('a/b/c.min.js').path.dirname, 'a/b/'); + assert.equal(parse('a/b/c.min.js').path.filename, 'c.min.js'); + assert.equal(parse('a/b/c.min.js').path.basename, 'c'); + assert.equal(parse('a/b/c.min.js').path.extname, '.min.js'); + assert.equal(parse('a/b/c.min.js').path.ext, 'js'); + }); + + it('should work with paths that have dots in the dirname:', function () { + assert.equal(parse('a/b/c/d.e.f/g.min.js').pattern, 'a/b/c/d.e.f/g.min.js'); + assert.equal(parse('a/b/c/d.e.f/g.min.js').path.dirname, 'a/b/c/d.e.f/'); + assert.equal(parse('a/b/c/d.e.f/g.min.js').path.filename, 'g.min.js'); + assert.equal(parse('a/b/c/d.e.f/g.min.js').path.basename, 'g'); + assert.equal(parse('a/b/c/d.e.f/g.min.js').path.extname, '.min.js'); + assert.equal(parse('a/b/c/d.e.f/g.min.js').path.ext, 'js'); + }); + + it('should match a path without an extension:', function () { + assert.equal(parse('a').pattern, 'a'); + assert.equal(parse('a').path.dirname, ''); + assert.equal(parse('a').path.filename, 'a'); + assert.equal(parse('a').path.basename, 'a'); + assert.equal(parse('a').path.extname, ''); + }); + + it('should match a file path ending with an extension:', function () { + assert.equal(parse('a/b/c/d.md').pattern, 'a/b/c/d.md'); + assert.equal(parse('a/b/c/d.md').path.dirname, 'a/b/c/'); + assert.equal(parse('a/b/c/d.md').path.filename, 'd.md'); + assert.equal(parse('a/b/c/d.md').path.basename, 'd'); + assert.equal(parse('a/b/c/d.md').path.extname, '.md'); + assert.equal(parse('a/b/c/d.md').path.ext, 'md'); + + assert.equal(parse('a/b/c.d/e.md').pattern, 'a/b/c.d/e.md'); + assert.equal(parse('a/b/c.d/e.md').path.dirname, 'a/b/c.d/'); + assert.equal(parse('a/b/c.d/e.md').path.filename, 'e.md'); + assert.equal(parse('a/b/c.d/e.md').path.basename, 'e'); + assert.equal(parse('a/b/c.d/e.md').path.extname, '.md'); + assert.equal(parse('a/b/c.d/e.md').path.ext, 'md'); + }); + + describe('trailing and leading slashs:', function () { + it('should work without a trailing slash:', function () { + assert.equal(parse('a/b/c').pattern, 'a/b/c'); + assert.equal(parse('a/b/c').path.dirname, 'a/b/'); + assert.equal(parse('a/b/c').path.filename, 'c'); + assert.equal(parse('a/b/c').path.basename, 'c'); + assert.equal(parse('a/b/c').path.extname, ''); + }); + + it('should work with a trailing slash:', function () { + assert.equal(parse('a/b/c/').pattern, 'a/b/c/'); + assert.equal(parse('a/b/c/').path.dirname, 'a/b/c/'); + assert.equal(parse('a/b/c/').path.filename, ''); + assert.equal(parse('a/b/c/').path.basename, ''); + assert.equal(parse('a/b/c/').path.extname, ''); + }); + + it('should work with a leading slash:', function () { + assert.equal(parse('/a/b/c').pattern, '/a/b/c'); + assert.equal(parse('/a/b/c').path.dirname, '/a/b/'); + assert.equal(parse('/a/b/c').path.filename, 'c'); + assert.equal(parse('/a/b/c').path.basename, 'c'); + assert.equal(parse('/a/b/c').path.extname, ''); + }); + + it('should work with both trailing and leading slashes:', function () { + assert.equal(parse('/a/b/c/').pattern, '/a/b/c/'); + assert.equal(parse('/a/b/c/').path.dirname, '/a/b/c/'); + assert.equal(parse('/a/b/c/').path.filename, ''); + assert.equal(parse('/a/b/c/').path.basename, ''); + assert.equal(parse('/a/b/c/').path.extname, ''); + }); + }); + + + describe('dotfile and dotdir:', function () { + it('should know when the file is dotfile:', function () { + assert.equal(parse('a/b/.gitignore').path.dirname, 'a/b/'); + assert.equal(parse('a/b/.gitignore').path.filename, '.gitignore'); + assert.equal(parse('a/b/.gitignore').path.basename, ''); + assert.equal(parse('a/b/.gitignore').path.extname, '.gitignore'); + assert.equal(parse('a/b/.gitignore').path.ext, 'gitignore'); + }); + }); + + + it('should match character classes:', function () { + assert.equal(parse('[a-c]b*').pattern, '[a-c]b*'); + assert.equal(parse('[a-j]*[^c]').pattern, '[a-j]*[^c]'); + assert.equal(parse('[a-j]*[^c]').path.dirname, ''); + assert.equal(parse('[a-j]*[^c]').path.filename, '[a-j]*[^c]'); + assert.equal(parse('[a-j]*[^c]b/c').pattern, '[a-j]*[^c]b/c'); + assert.equal(parse('[a-j]*[^c]bc').pattern, '[a-j]*[^c]bc'); + }); + + it('should work when a character class has trailing word characters:', function () { + assert.equal(parse('[a-c]b*').pattern, '[a-c]b*'); + assert.equal(parse('[a-c]b*').path.dirname, ''); + assert.equal(parse('[a-c]b*').path.filename, '[a-c]b*'); + assert.equal(parse('[a-c]b*').path.basename, '[a-c]b*'); + assert.equal(parse('[a-c]b*').path.extname, ''); + assert.equal(parse('[a-j]*[^c]bc').path.dirname, ''); + assert.equal(parse('[a-j]*[^c]bc').path.filename, '[a-j]*[^c]bc'); + assert.equal(parse('[a-j]*[^c]bc').path.basename, '[a-j]*[^c]bc'); + assert.equal(parse('[a-j]*[^c]bc').path.extname, ''); + }); }); -it('should get a filename from a complex pattern:', function () { - assert.equal(parse('*.min.js').filename, '*.min.js'); - assert.equal(parse('/a/b/{c,d}/').filename, ''); - assert.equal(parse('/a/b/{c,d}/*.js').filename, '*.js'); - assert.equal(parse('/a/b/{c,d}/*.min.js').filename, '*.min.js'); - assert.equal(parse('/a/b/{c,d}/e.f.g/').filename, ''); - assert.equal(parse('[a-j]*[^c]').filename, '[a-j]*[^c]'); - assert.equal(parse('[a-j]*[^c]bc').filename, '[a-j]*[^c]bc'); - assert.equal(parse('a/**/b/*.{foo,bar}').filename, '*.{foo,bar}'); - assert.equal(parse('a/b/*.{foo,bar}').filename, '*.{foo,bar}'); - assert.equal(parse('a/b/.{c,.gitignore}').filename, '.{c,.gitignore}'); - assert.equal(parse('a/b/.{c,/.gitignore}').filename, '.{c,/.gitignore}'); - assert.equal(parse('a/b/.{foo,bar}').filename, '.{foo,bar}'); - assert.equal(parse('a/b/{c,./d}/e/f.g').filename, 'f.g'); - assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').filename, 'abc.foo.js'); - assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').filename, '*.foo.js'); - assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').filename, 'abc.foo.js'); - assert.equal(parse('a/b/{c,.gitignore}').filename, '{c,.gitignore}'); - assert.equal(parse('a/b/{c,/.gitignore}').filename, '{c,/.gitignore}'); - assert.equal(parse('a/b/{c,/d}/e/f.g').filename, 'f.g'); - assert.equal(parse('a/b/{c,/gitignore}').filename, '{c,/gitignore}'); - assert.equal(parse('a/b/{c,d}').filename, '{c,d}'); - assert.equal(parse('a/b/{c,d}/').filename, ''); - assert.equal(parse('a/b/{c,d}/*.js').filename, '*.js'); - assert.equal(parse('a/b/{c,d}/*.min.js').filename, '*.min.js'); - assert.equal(parse('a/b/{c,d}/e.f.g/').filename, ''); - assert.equal(parse('a/b/{c,d}/e/f.g').filename, 'f.g'); -}); - -it('should get a basename from a complex pattern:', function () { - assert.equal(parse('*.min.js').basename, '*'); - assert.equal(parse('/a/b/c').basename, 'c'); - assert.equal(parse('/a/b/c/').basename, ''); - assert.equal(parse('/a/b/{c,d}/').basename, ''); - assert.equal(parse('/a/b/{c,d}/*.js').basename, '*'); - assert.equal(parse('/a/b/{c,d}/*.min.js').basename, '*'); - assert.equal(parse('/a/b/{c,d}/e.f.g/').basename, ''); - assert.equal(parse('[a-c]b*').basename, '[a-c]b*'); - assert.equal(parse('a').basename, 'a'); - assert.equal(parse('a/**/b/*.{foo,bar}').basename, '*'); - assert.equal(parse('a/b/*.{foo,bar}').basename, '*'); - assert.equal(parse('a/b/.gitignore').basename, ''); - assert.equal(parse('a/b/.{c,.gitignore}').basename, ''); - assert.equal(parse('a/b/.{c,/.gitignore}').basename, ''); - assert.equal(parse('a/b/.{foo,bar}').basename, ''); - assert.equal(parse('a/b/c').basename, 'c'); - assert.equal(parse('a/b/c.d/e.md').basename, 'e'); - assert.equal(parse('a/b/c.md').basename, 'c'); - assert.equal(parse('a/b/c.min.js').basename, 'c'); - assert.equal(parse('a/b/c/').basename, ''); - assert.equal(parse('a/b/c/d.e.f/g.min.js').basename, 'g'); - assert.equal(parse('a/b/c/d.md').basename, 'd'); - assert.equal(parse('a/b/{c,./d}/e/f.g').basename, 'f'); - assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').basename, 'abc'); - assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').basename, '*'); - assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').basename, 'abc'); - assert.equal(parse('a/b/{c,.gitignore}').basename, '{c,.gitignore}'); - assert.equal(parse('a/b/{c,/.gitignore}').basename, '{c,/.gitignore}'); - assert.equal(parse('a/b/{c,/d}/e/f.g').basename, 'f'); - assert.equal(parse('a/b/{c,/gitignore}').basename, '{c,/gitignore}'); - assert.equal(parse('a/b/{c,d}').basename, '{c,d}'); - assert.equal(parse('a/b/{c,d}/').basename, ''); - assert.equal(parse('a/b/{c,d}/*.js').basename, '*'); - assert.equal(parse('a/b/{c,d}/*.min.js').basename, '*'); - assert.equal(parse('a/b/{c,d}/e.f.g/').basename, ''); - assert.equal(parse('a/b/{c,d}/e/f.g').basename, 'f'); - assert.equal(parse('c.md').basename, 'c'); -}); - -it('should get an extname from a complex pattern:', function () { - assert.equal(parse('*.min.js').extname, '.min.js'); - assert.equal(parse('/a/b/c').extname, ''); - assert.equal(parse('/a/b/c/').extname, ''); - assert.equal(parse('/a/b/{c,d}/').extname, ''); - assert.equal(parse('/a/b/{c,d}/*.js').extname, '.js'); - assert.equal(parse('/a/b/{c,d}/*.min.js').extname, '.min.js'); - assert.equal(parse('/a/b/{c,d}/e.f.g/').extname, ''); - assert.equal(parse('[a-c]b*').extname, ''); - assert.equal(parse('[a-j]*[^c]bc').extname, ''); - assert.equal(parse('a').extname, ''); - assert.equal(parse('a/**/b/*.{foo,bar}').extname, '.{foo,bar}'); - assert.equal(parse('a/b/*.{foo,bar}').extname, '.{foo,bar}'); - assert.equal(parse('a/b/.gitignore').extname, '.gitignore'); - assert.equal(parse('a/b/.{c,.gitignore}').extname, '.{c,.gitignore}'); - assert.equal(parse('a/b/.{c,/.gitignore}').extname, '.{c,/.gitignore}'); - assert.equal(parse('a/b/.{foo,bar}').extname, '.{foo,bar}'); - assert.equal(parse('a/b/c').extname, ''); - assert.equal(parse('a/b/c.d/e.md').extname, '.md'); - assert.equal(parse('a/b/c.md').extname, '.md'); - assert.equal(parse('a/b/c.min.js').extname, '.min.js'); - assert.equal(parse('a/b/c/').extname, ''); - assert.equal(parse('a/b/c/d.e.f/g.min.js').extname, '.min.js'); - assert.equal(parse('a/b/c/d.md').extname, '.md'); - assert.equal(parse('a/b/{c,./d}/e/f.g').extname, '.g'); - assert.equal(parse('a/b/{c,./d}/e/f.min.g').extname, '.min.g'); - assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').extname, '.foo.js'); - assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').extname, '.foo.js'); - assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').extname, '.foo.js'); - assert.equal(parse('a/b/{c,.gitignore}').extname, ''); - assert.equal(parse('a/b/{c,/.gitignore}').extname, ''); - assert.equal(parse('a/b/{c,/d}/e/f.g').extname, '.g'); - assert.equal(parse('a/b/{c,/d}/e/f.min.g').extname, '.min.g'); - assert.equal(parse('a/b/{c,/gitignore}').extname, ''); - assert.equal(parse('a/b/{c,d}').extname, ''); - assert.equal(parse('a/b/{c,d}/').extname, ''); - assert.equal(parse('a/b/{c,d}/*.js').extname, '.js'); - assert.equal(parse('a/b/{c,d}/*.min.js').extname, '.min.js'); - assert.equal(parse('a/b/{c,d}/e.f.g/').extname, ''); - assert.equal(parse('a/b/{c,d}/e/f.g').extname, '.g'); - assert.equal(parse('a/b/{c,d}/e/f.min.g').extname, '.min.g'); - assert.equal(parse('c.md').extname, '.md'); -}); - - -it('should parse path ending with a brace pattern:', function () { - assert.equal(parse('a/b/{c,d}').pattern, 'a/b/{c,d}'); - assert.equal(parse('a/b/{c,d}').dirname, 'a/b/'); - assert.equal(parse('a/b/{c,d}').filename, '{c,d}'); - assert.equal(parse('a/b/{c,d}').basename, '{c,d}'); - assert.equal(parse('a/b/{c,d}').extname, ''); - assert.equal(parse('a/b/{c,d}').ext, ''); -}); - -it('should parse a path with a brace pattern in the dirname:', function () { - assert.equal(parse('a/b/{c,d}/*.js').pattern, 'a/b/{c,d}/*.js'); - assert.equal(parse('a/b/{c,d}/*.js').dirname, 'a/b/{c,d}/'); - assert.equal(parse('a/b/{c,d}/*.js').filename, '*.js'); - assert.equal(parse('a/b/{c,d}/*.js').basename, '*'); - assert.equal(parse('a/b/{c,d}/*.js').extname, '.js'); - assert.equal(parse('a/b/{c,d}/*.js').ext, 'js'); - - assert.equal(parse('a/b/{c,d}/').pattern, 'a/b/{c,d}/'); - assert.equal(parse('a/b/{c,d}/').dirname, 'a/b/{c,d}/'); - assert.equal(parse('a/b/{c,d}/').filename, ''); - assert.equal(parse('a/b/{c,d}/').basename, ''); - assert.equal(parse('a/b/{c,d}/').extname, ''); - assert.equal(parse('a/b/{c,d}/').ext, ''); - - assert.equal(parse('a/b/{c,d}/e.f.g/').pattern, 'a/b/{c,d}/e.f.g/'); - assert.equal(parse('a/b/{c,d}/e.f.g/').dirname, 'a/b/{c,d}/e.f.g/'); - assert.equal(parse('a/b/{c,d}/e.f.g/').filename, ''); - assert.equal(parse('a/b/{c,d}/e.f.g/').basename, ''); - assert.equal(parse('a/b/{c,d}/e.f.g/').extname, ''); - assert.equal(parse('a/b/{c,d}/e.f.g/').ext, ''); - - assert.equal(parse('/a/b/{c,d}/e.f.g/').pattern, '/a/b/{c,d}/e.f.g/'); - assert.equal(parse('/a/b/{c,d}/e.f.g/').dirname, '/a/b/{c,d}/e.f.g/'); - assert.equal(parse('/a/b/{c,d}/e.f.g/').filename, ''); - assert.equal(parse('/a/b/{c,d}/e.f.g/').basename, ''); - assert.equal(parse('/a/b/{c,d}/e.f.g/').extname, ''); - assert.equal(parse('/a/b/{c,d}/e.f.g/').ext, ''); - - assert.equal(parse('a/b/{c,d}/*.min.js').pattern, 'a/b/{c,d}/*.min.js'); - assert.equal(parse('a/b/{c,d}/*.min.js').dirname, 'a/b/{c,d}/'); - assert.equal(parse('a/b/{c,d}/*.min.js').filename, '*.min.js'); - assert.equal(parse('a/b/{c,d}/*.min.js').basename, '*'); - assert.equal(parse('a/b/{c,d}/*.min.js').extname, '.min.js'); - assert.equal(parse('a/b/{c,d}/*.min.js').ext, 'js'); - - assert.equal(parse('*.min.js').pattern, '*.min.js'); - assert.equal(parse('*.min.js').dirname, ''); - assert.equal(parse('*.min.js').filename, '*.min.js'); - assert.equal(parse('*.min.js').basename, '*'); - assert.equal(parse('*.min.js').extname, '.min.js'); - assert.equal(parse('*.min.js').ext, 'js'); - - assert.equal(parse('a/b/{c,d}/*.min.js').extname, '.min.js'); - assert.equal(parse('a/b/{c,d}/*.min.js').ext, 'js'); - - assert.equal(parse('[a-j]*[^c]').pattern, '[a-j]*[^c]'); - assert.equal(parse('[a-j]*[^c]').dirname, ''); - assert.equal(parse('[a-j]*[^c]').filename, '[a-j]*[^c]'); - assert.equal(parse('[a-j]*[^c]b/c').pattern, '[a-j]*[^c]b/c'); - assert.equal(parse('[a-j]*[^c]b/c').dirname, '[a-j]*[^c]b/'); - assert.equal(parse('[a-j]*[^c]bc').pattern, '[a-j]*[^c]bc'); - assert.equal(parse('[a-j]*[^c]bc').dirname, ''); - assert.equal(parse('[a-j]*[^c]bc').filename, '[a-j]*[^c]bc'); -}); - -it('should detect when `dotdirs` are defined:', function () { - assert.equal(parse('a/b/.git/').dotdirs, true); - assert.equal(parse('a/b/git/').dotdirs, false); - assert.equal(parse('a/b/.git/').dotfiles, false); -}); - -it('should detect when `dotfiles` are defined:', function () { - assert.equal(parse('a/b/.gitignore').dotfiles, true); - assert.equal(parse('a/b/.git').dotfiles, true); - assert.equal(parse('a/b/.gitignore').dotdirs, false); - assert.equal(parse('a/b/.git').dotdirs, false); -}); - -it('should match a glob path ending with a slash:', function () { - assert.equal(parse('a/b/{c,d}/').pattern, 'a/b/{c,d}/'); - assert.equal(parse('a/b/{c,d}/').dirname, 'a/b/{c,d}/'); - assert.equal(parse('a/b/{c,d}/').filename, ''); - assert.equal(parse('a/b/{c,d}/').basename, ''); - assert.equal(parse('a/b/{c,d}/').extname, ''); -}); - -it('should match a glob path beginning with a slash:', function () { - assert.equal(parse('/a/b/{c,d}/').pattern, '/a/b/{c,d}/'); - assert.equal(parse('/a/b/{c,d}/').dirname, '/a/b/{c,d}/'); - assert.equal(parse('/a/b/{c,d}/').filename, ''); - assert.equal(parse('/a/b/{c,d}/').basename, ''); - assert.equal(parse('/a/b/{c,d}/').extname, ''); -}); - -it('should match a filename glob:', function () { - assert.equal(parse('/a/b/{c,d}/*.js').pattern, '/a/b/{c,d}/*.js'); - assert.equal(parse('/a/b/{c,d}/*.js').dirname, '/a/b/{c,d}/'); - assert.equal(parse('/a/b/{c,d}/*.js').filename, '*.js'); - assert.equal(parse('/a/b/{c,d}/*.js').basename, '*'); - assert.equal(parse('/a/b/{c,d}/*.js').extname, '.js'); - assert.equal(parse('/a/b/{c,d}/*.js').ext, 'js'); - - assert.equal(parse('/a/b/{c,d}/*.min.js').pattern, '/a/b/{c,d}/*.min.js'); - assert.equal(parse('/a/b/{c,d}/*.min.js').dirname, '/a/b/{c,d}/'); - assert.equal(parse('/a/b/{c,d}/*.min.js').filename, '*.min.js'); - assert.equal(parse('/a/b/{c,d}/*.min.js').basename, '*'); - assert.equal(parse('/a/b/{c,d}/*.min.js').extname, '.min.js'); - assert.equal(parse('/a/b/{c,d}/*.js').ext, 'js'); -}); - -it('should match a glob path with a brace pattern:', function () { - assert.equal(parse('a/b/{c,d}/e/f.g').pattern, 'a/b/{c,d}/e/f.g'); - assert.equal(parse('a/b/{c,d}/e/f.g').dirname, 'a/b/{c,d}/e/'); - assert.equal(parse('a/b/{c,d}/e/f.g').filename, 'f.g'); - assert.equal(parse('a/b/{c,d}/e/f.g').basename, 'f'); - assert.equal(parse('a/b/{c,d}/e/f.g').extname, '.g'); - assert.equal(parse('a/b/{c,d}/e/f.min.g').extname, '.min.g'); - assert.equal(parse('a/b/{c,d}/e/f.g').ext, 'g'); - - assert.equal(parse('a/b/{c,./d}/e/f.g').pattern, 'a/b/{c,./d}/e/f.g'); - assert.equal(parse('a/b/{c,./d}/e/f.g').dirname, 'a/b/{c,./d}/e/'); - assert.equal(parse('a/b/{c,./d}/e/f.g').filename, 'f.g'); - assert.equal(parse('a/b/{c,./d}/e/f.g').basename, 'f'); - assert.equal(parse('a/b/{c,./d}/e/f.g').extname, '.g'); - assert.equal(parse('a/b/{c,./d}/e/f.min.g').extname, '.min.g'); - assert.equal(parse('a/b/{c,./d}/e/f.g').ext, 'g'); - - assert.equal(parse('a/b/{c,/d}/e/f.g').pattern, 'a/b/{c,/d}/e/f.g'); - assert.equal(parse('a/b/{c,/d}/e/f.g').dirname, 'a/b/{c,/d}/e/'); - assert.equal(parse('a/b/{c,/d}/e/f.g').filename, 'f.g'); - assert.equal(parse('a/b/{c,/d}/e/f.g').basename, 'f'); - assert.equal(parse('a/b/{c,/d}/e/f.g').extname, '.g'); - assert.equal(parse('a/b/{c,/d}/e/f.min.g').extname, '.min.g'); - assert.equal(parse('a/b/{c,/d}/e/f.g').ext, 'g'); -}); - -it('should work when brace patterns have dots and slashes:', function () { - assert.equal(parse('a/b/{c,/.gitignore}').pattern, 'a/b/{c,/.gitignore}'); - assert.equal(parse('a/b/{c,/.gitignore}').dirname, 'a/b/'); - assert.equal(parse('a/b/{c,/.gitignore}').filename, '{c,/.gitignore}'); - assert.equal(parse('a/b/{c,/.gitignore}').basename, '{c,/.gitignore}'); - assert.equal(parse('a/b/{c,/.gitignore}').extname, ''); - - assert.equal(parse('a/b/{c,/gitignore}').pattern, 'a/b/{c,/gitignore}'); - assert.equal(parse('a/b/{c,/gitignore}').dirname, 'a/b/'); - assert.equal(parse('a/b/{c,/gitignore}').filename, '{c,/gitignore}'); - assert.equal(parse('a/b/{c,/gitignore}').basename, '{c,/gitignore}'); - assert.equal(parse('a/b/{c,/gitignore}').extname, ''); - - assert.equal(parse('a/b/{c,.gitignore}').pattern, 'a/b/{c,.gitignore}'); - assert.equal(parse('a/b/{c,.gitignore}').dirname, 'a/b/'); - assert.equal(parse('a/b/{c,.gitignore}').filename, '{c,.gitignore}'); - assert.equal(parse('a/b/{c,.gitignore}').basename, '{c,.gitignore}'); - assert.equal(parse('a/b/{c,.gitignore}').extname, ''); -}); - -it('should work when brace patterns have a leading dot:', function () { - assert.equal(parse('a/b/.{foo,bar}').pattern, 'a/b/.{foo,bar}'); - assert.equal(parse('a/b/.{foo,bar}').dirname, 'a/b/'); - assert.equal(parse('a/b/.{foo,bar}').filename, '.{foo,bar}'); - assert.equal(parse('a/b/.{foo,bar}').basename, ''); - assert.equal(parse('a/b/.{foo,bar}').extname, '.{foo,bar}'); - assert.equal(parse('a/b/.{foo,bar}').ext, '{foo,bar}'); - - assert.equal(parse('a/b/.{c,/.gitignore}').pattern, 'a/b/.{c,/.gitignore}'); - assert.equal(parse('a/b/.{c,/.gitignore}').dirname, 'a/b/'); - assert.equal(parse('a/b/.{c,/.gitignore}').filename, '.{c,/.gitignore}'); - assert.equal(parse('a/b/.{c,/.gitignore}').basename, ''); - assert.equal(parse('a/b/.{c,/.gitignore}').extname, '.{c,/.gitignore}'); - - assert.equal(parse('a/b/.{c,.gitignore}').pattern, 'a/b/.{c,.gitignore}'); - assert.equal(parse('a/b/.{c,.gitignore}').dirname, 'a/b/'); - assert.equal(parse('a/b/.{c,.gitignore}').filename, '.{c,.gitignore}'); - assert.equal(parse('a/b/.{c,.gitignore}').basename, ''); - assert.equal(parse('a/b/.{c,.gitignore}').extname, '.{c,.gitignore}'); - assert.equal(parse('a/b/.{c,.gitignore}').ext, '{c,.gitignore}'); -}); - -it('should match when the filename starts with a star:', function () { - assert.equal(parse('a/b/*.{foo,bar}').pattern, 'a/b/*.{foo,bar}'); - assert.equal(parse('a/b/*.{foo,bar}').dirname, 'a/b/'); - assert.equal(parse('a/b/*.{foo,bar}').filename, '*.{foo,bar}'); - assert.equal(parse('a/b/*.{foo,bar}').basename, '*'); - assert.equal(parse('a/b/*.{foo,bar}').extname, '.{foo,bar}'); - assert.equal(parse('a/b/*.{foo,bar}').ext, '{foo,bar}'); -}); - -it('should match with globstars:', function () { - assert.equal(parse('a/**/b/*.{foo,bar}').pattern, 'a/**/b/*.{foo,bar}'); - assert.equal(parse('a/**/b/*.{foo,bar}').dirname, 'a/**/b/'); - assert.equal(parse('a/**/b/*.{foo,bar}').filename, '*.{foo,bar}'); - assert.equal(parse('a/**/b/*.{foo,bar}').basename, '*'); - assert.equal(parse('a/**/b/*.{foo,bar}').extname, '.{foo,bar}'); - assert.equal(parse('a/**/b/*.{foo,bar}').ext, '{foo,bar}'); -}); - -it('should match complex patterns:', function () { - assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').pattern, 'a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js'); - assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').dirname, 'a/b/{c,.gitignore,{a,b}}/{a,b}/'); - assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').filename, 'abc.foo.js'); - assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').basename, 'abc'); - assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').extname, '.foo.js'); - assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').ext, 'js'); - - assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').pattern, 'a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js'); - assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').dirname, 'a/b/{c,.gitignore,{a,b}}/{a,b}/'); - assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').filename, '*.foo.js'); - assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').basename, '*'); - assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').extname, '.foo.js'); - assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').ext, 'js'); - - assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').pattern, 'a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js'); - assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').dirname, 'a/b/{c,.gitignore,{a,./b}}/{a,b}/'); - assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').filename, 'abc.foo.js'); - assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').basename, 'abc'); - assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').extname, '.foo.js'); - assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').ext, 'js'); -}); - -it('should match a path with an extension:', function () { - assert.equal(parse('a/b/c.md').pattern, 'a/b/c.md'); - assert.equal(parse('a/b/c.md').dirname, 'a/b/'); - assert.equal(parse('a/b/c.md').filename, 'c.md'); - assert.equal(parse('a/b/c.md').basename, 'c'); - assert.equal(parse('a/b/c.md').extname, '.md'); - assert.equal(parse('a/b/c.md').ext, 'md'); - assert.equal(parse('c.md').pattern, 'c.md'); - assert.equal(parse('c.md').dirname, ''); - assert.equal(parse('c.md').filename, 'c.md'); - assert.equal(parse('c.md').basename, 'c'); - assert.equal(parse('c.md').extname, '.md'); - assert.equal(parse('c.md').ext, 'md'); -}); - -it('should match a path with multiple extensions:', function () { - assert.equal(parse('a/b/c.min.js').pattern, 'a/b/c.min.js'); - assert.equal(parse('a/b/c.min.js').dirname, 'a/b/'); - assert.equal(parse('a/b/c.min.js').filename, 'c.min.js'); - assert.equal(parse('a/b/c.min.js').basename, 'c'); - assert.equal(parse('a/b/c.min.js').extname, '.min.js'); - assert.equal(parse('a/b/c.min.js').ext, 'js'); -}); - -it('should work with paths that have dots in the dirname:', function () { - assert.equal(parse('a/b/c/d.e.f/g.min.js').pattern, 'a/b/c/d.e.f/g.min.js'); - assert.equal(parse('a/b/c/d.e.f/g.min.js').dirname, 'a/b/c/d.e.f/'); - assert.equal(parse('a/b/c/d.e.f/g.min.js').filename, 'g.min.js'); - assert.equal(parse('a/b/c/d.e.f/g.min.js').basename, 'g'); - assert.equal(parse('a/b/c/d.e.f/g.min.js').extname, '.min.js'); - assert.equal(parse('a/b/c/d.e.f/g.min.js').ext, 'js'); -}); - -it('should match a path without an extension:', function () { - assert.equal(parse('a').pattern, 'a'); - assert.equal(parse('a').dirname, ''); - assert.equal(parse('a').filename, 'a'); - assert.equal(parse('a').basename, 'a'); - assert.equal(parse('a').extname, ''); -}); - -it('should match a file path ending with an extension:', function () { - assert.equal(parse('a/b/c/d.md').pattern, 'a/b/c/d.md'); - assert.equal(parse('a/b/c/d.md').dirname, 'a/b/c/'); - assert.equal(parse('a/b/c/d.md').filename, 'd.md'); - assert.equal(parse('a/b/c/d.md').basename, 'd'); - assert.equal(parse('a/b/c/d.md').extname, '.md'); - assert.equal(parse('a/b/c/d.md').ext, 'md'); -}); - -it('should match a file path ending with an extension:', function () { - assert.equal(parse('a/b/c.d/e.md').pattern, 'a/b/c.d/e.md'); - assert.equal(parse('a/b/c.d/e.md').dirname, 'a/b/c.d/'); - assert.equal(parse('a/b/c.d/e.md').filename, 'e.md'); - assert.equal(parse('a/b/c.d/e.md').basename, 'e'); - assert.equal(parse('a/b/c.d/e.md').extname, '.md'); - assert.equal(parse('a/b/c.d/e.md').ext, 'md'); -}); - -it('should match a file path without a trailing slash:', function () { - assert.equal(parse('a/b/c').pattern, 'a/b/c'); - assert.equal(parse('a/b/c').dirname, 'a/b/'); - assert.equal(parse('a/b/c').filename, 'c'); - assert.equal(parse('a/b/c').basename, 'c'); - assert.equal(parse('a/b/c').extname, ''); -}); - -it('should match a file path with a trailing slash:', function () { - assert.equal(parse('a/b/c/').pattern, 'a/b/c/'); - assert.equal(parse('a/b/c/').dirname, 'a/b/c/'); - assert.equal(parse('a/b/c/').filename, ''); - assert.equal(parse('a/b/c/').basename, ''); - assert.equal(parse('a/b/c/').extname, ''); -}); - -it('should match a file path with a leading slash:', function () { - assert.equal(parse('/a/b/c').pattern, '/a/b/c'); - assert.equal(parse('/a/b/c').dirname, '/a/b/'); - assert.equal(parse('/a/b/c').filename, 'c'); - assert.equal(parse('/a/b/c').basename, 'c'); - assert.equal(parse('/a/b/c').extname, ''); -}); - -it('should match a file path with trailing and leading slashes:', function () { - assert.equal(parse('/a/b/c/').pattern, '/a/b/c/'); - assert.equal(parse('/a/b/c/').dirname, '/a/b/c/'); - assert.equal(parse('/a/b/c/').filename, ''); - assert.equal(parse('/a/b/c/').basename, ''); - assert.equal(parse('/a/b/c/').extname, ''); -}); - - -it('should match a path with a dotfile:', function () { - assert.equal(parse('a/b/.gitignore').dirname, 'a/b/'); - assert.equal(parse('a/b/.gitignore').filename, '.gitignore'); - assert.equal(parse('a/b/.gitignore').basename, ''); - assert.equal(parse('a/b/.gitignore').extname, '.gitignore'); - assert.equal(parse('a/b/.gitignore').ext, 'gitignore'); -}); - - -it('should match character classes:', function () { - assert.equal(parse('[a-c]b*').pattern, '[a-c]b*'); - assert.equal(parse('[a-j]*[^c]').pattern, '[a-j]*[^c]'); - assert.equal(parse('[a-j]*[^c]').dirname, ''); - assert.equal(parse('[a-j]*[^c]').filename, '[a-j]*[^c]'); - assert.equal(parse('[a-j]*[^c]b/c').pattern, '[a-j]*[^c]b/c'); - assert.equal(parse('[a-j]*[^c]bc').pattern, '[a-j]*[^c]bc'); -}); - -it('should work when a character class has trailing word characters:', function () { - assert.equal(parse('[a-c]b*').pattern, '[a-c]b*'); - assert.equal(parse('[a-c]b*').dirname, ''); - assert.equal(parse('[a-c]b*').filename, '[a-c]b*'); - assert.equal(parse('[a-c]b*').basename, '[a-c]b*'); - assert.equal(parse('[a-c]b*').extname, ''); - assert.equal(parse('[a-j]*[^c]bc').dirname, ''); - assert.equal(parse('[a-j]*[^c]bc').filename, '[a-j]*[^c]bc'); - assert.equal(parse('[a-j]*[^c]bc').basename, '[a-j]*[^c]bc'); - assert.equal(parse('[a-j]*[^c]bc').extname, ''); +describe('when the glob has brace patterns:', function () { + it('should extract the `base` from the glob:', function () { + assert.equal(getBase('a/b/{c,/.gitignore}').base, 'a/b'); + assert.equal(getBase('a/b/{c,/.gitignore}').pattern, '{c,/.gitignore}'); + + assert.equal(getBase('a/b/{c,/gitignore}').base, 'a/b'); + assert.equal(getBase('a/b/{c,/gitignore}').pattern, '{c,/gitignore}'); + + assert.equal(getBase('a/b/{c,.gitignore}').base, 'a/b'); + assert.equal(getBase('a/b/{c,.gitignore}').pattern, '{c,.gitignore}'); + }); + + it('should work when the brace pattern has dots and slashes:', function () { + assert.equal(parse('a/b/{c,/.gitignore}').pattern, 'a/b/{c,/.gitignore}'); + assert.equal(parse('a/b/{c,/.gitignore}').path.dirname, 'a/b/'); + assert.equal(parse('a/b/{c,/.gitignore}').path.filename, '{c,/.gitignore}'); + assert.equal(parse('a/b/{c,/.gitignore}').path.basename, '{c,/.gitignore}'); + assert.equal(parse('a/b/{c,/.gitignore}').path.extname, ''); + + assert.equal(parse('a/b/{c,/gitignore}').pattern, 'a/b/{c,/gitignore}'); + assert.equal(parse('a/b/{c,/gitignore}').path.dirname, 'a/b/'); + assert.equal(parse('a/b/{c,/gitignore}').path.filename, '{c,/gitignore}'); + assert.equal(parse('a/b/{c,/gitignore}').path.basename, '{c,/gitignore}'); + assert.equal(parse('a/b/{c,/gitignore}').path.extname, ''); + + assert.equal(parse('a/b/{c,.gitignore}').pattern, 'a/b/{c,.gitignore}'); + assert.equal(parse('a/b/{c,.gitignore}').path.dirname, 'a/b/'); + assert.equal(parse('a/b/{c,.gitignore}').path.filename, '{c,.gitignore}'); + assert.equal(parse('a/b/{c,.gitignore}').path.basename, '{c,.gitignore}'); + assert.equal(parse('a/b/{c,.gitignore}').path.extname, ''); + }); + + it('should work when the brace pattern has a leading dot in the dirname:', function () { + assert.equal(parse('a/b/.{foo,bar}/foo.js').pattern, 'a/b/.{foo,bar}/foo.js'); + assert.equal(parse('a/b/.{foo,bar}/foo.js').path.dirname, 'a/b/.{foo,bar}/'); + assert.equal(parse('a/b/.{foo,bar}/foo.js').path.filename, 'foo.js'); + assert.equal(parse('a/b/.{foo,bar}/foo.js').path.basename, 'foo'); + assert.equal(parse('a/b/.{foo,bar}/foo.js').path.extname, '.js'); + assert.equal(parse('a/b/.{foo,bar}/foo.js').path.ext, 'js'); + }); + + it('should work when the brace pattern has a leading dot in the filename:', function () { + assert.equal(parse('a/b/.{foo,bar}').pattern, 'a/b/.{foo,bar}'); + assert.equal(parse('a/b/.{foo,bar}').path.dirname, 'a/b/'); + assert.equal(parse('a/b/.{foo,bar}').path.filename, '.{foo,bar}'); + assert.equal(parse('a/b/.{foo,bar}').path.basename, ''); + assert.equal(parse('a/b/.{foo,bar}').path.extname, '.{foo,bar}'); + assert.equal(parse('a/b/.{foo,bar}').path.ext, '{foo,bar}'); + + assert.equal(parse('a/b/.{c,/.gitignore}').pattern, 'a/b/.{c,/.gitignore}'); + assert.equal(parse('a/b/.{c,/.gitignore}').path.dirname, 'a/b/'); + assert.equal(parse('a/b/.{c,/.gitignore}').path.filename, '.{c,/.gitignore}'); + assert.equal(parse('a/b/.{c,/.gitignore}').path.basename, ''); + assert.equal(parse('a/b/.{c,/.gitignore}').path.extname, '.{c,/.gitignore}'); + + assert.equal(parse('a/b/.{c,.gitignore}').pattern, 'a/b/.{c,.gitignore}'); + assert.equal(parse('a/b/.{c,.gitignore}').path.dirname, 'a/b/'); + assert.equal(parse('a/b/.{c,.gitignore}').path.filename, '.{c,.gitignore}'); + assert.equal(parse('a/b/.{c,.gitignore}').path.basename, ''); + assert.equal(parse('a/b/.{c,.gitignore}').path.extname, '.{c,.gitignore}'); + assert.equal(parse('a/b/.{c,.gitignore}').path.ext, '{c,.gitignore}'); + }); });