From 918723a276a873c0e0690781b13147e20931ef7a Mon Sep 17 00:00:00 2001 From: jonschlinkert Date: Sun, 8 Mar 2015 22:00:27 -0400 Subject: [PATCH] update tests for changes --- browser.js | 437 ++++++++---------- test.js | 1274 ++++++++++++++++++++++++++-------------------------- 2 files changed, 833 insertions(+), 878 deletions(-) diff --git a/browser.js b/browser.js index 4172202..efe7d9b 100644 --- a/browser.js +++ b/browser.js @@ -8,17 +8,16 @@ 'use strict'; -var findBase = require('glob-base'); -var pathRe = require('glob-path-regex'); var isGlob = require('is-glob'); +var findBase = require('glob-base'); +var extglob = require('is-extglob'); +var dotfile = require('is-dotfile'); /** - * Expose `parseGlob` and cache results in memory + * Expose `cache` */ -module.exports = function (pattern, getbase) { - return globCache(parseGlob, pattern, getbase); -}; +var cache = module.exports.cache = {}; /** * Parse a glob pattern into tokens. @@ -32,179 +31,239 @@ module.exports = function (pattern, getbase) { * - `(**|*.js)` */ -function parseGlob(pattern, getbase) { - var glob = pattern; - var tok = {path: {}, is: {}, match: {}}; - var path = {}; - - // store original pattern - tok.original = pattern; - tok.pattern = pattern; - path.whole = tok.pattern; - - // Boolean values - tok.is.glob = isGlob(glob); - tok.is.negated = glob.charAt(0) === '!'; - tok.is.globstar = glob.indexOf('**') !== -1; - - var braces = glob.indexOf('{') !== -1; - if (tok.is.glob && braces) { - tok.is.braces = true; - glob = glob.substr(0, braces) + escape(glob.substr(braces)); +module.exports = function parseGlob(glob) { + if (cache.hasOwnProperty(glob)) { + return cache[glob]; + } + + var tok = {}; + tok.orig = glob; + tok.is = {}; + + // unescape dots and slashes in braces/brackets + glob = escape(glob); + + var parsed = findBase(glob); + tok.is.glob = parsed.isGlob; + + tok.glob = parsed.glob; + tok.base = parsed.base; + var segs = /([^\/]*)$/.exec(glob); + + tok.path = {}; + tok.path.dirname = ''; + tok.path.basename = segs[1] || ''; + tok.path.dirname = glob.split(tok.path.basename).join('') || ''; + var basename = (tok.path.basename || '').split('.') || ''; + tok.path.filename = basename[0] || ''; + tok.path.extname = basename.slice(1).join('.') || ''; + tok.path.ext = ''; + + if (isGlob(tok.path.dirname) && !tok.path.basename) { + if (!/\/$/.test(tok.glob)) { + tok.path.basename = tok.glob; + } + tok.path.dirname = tok.base; } - // 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) { - path.basename = basename[0] || ''; - path.extname = glob.substr(path.basename.length); - } else { - path.basename = tok.original; - path.extname = ''; - } - - path.ext = path.extname.split('.').slice(-1)[0]; - if (braces) { - path.basename = unescape(path.basename); - } - - // we either have a `/` or `**` - } else { - var m = pathRe().exec(glob) || []; - path.dirname = m[1]; - path.filename = glob.substr(path.dirname.length); - - // does the filename have a `.`? - var dot = path.filename.indexOf('.', 1); - if (dot !== -1) { - 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 { - path.basename = path.filename; - path.extname = ''; - } - - path.ext = path.extname.split('.').slice(-1)[0]; - // remove any escaping that was applied for braces - if (braces) { - path = unscapeBraces(path); - } + tok.path.dirname = ''; + tok.path.basename = tok.orig; } - tok.is.dotfile = path.filename.charAt(0) === '.'; - tok = matchesDotdirs(tok, path); - tok.path = path; - - // get the `base` from glob pattern - if (getbase) { - var segs = findBase(tok.pattern); - tok.pattern = segs.pattern; - tok.base = segs.base; - - if (tok.is.glob === false) { - tok.base = tok.path.dirname; - tok.pattern = tok.path.filename; - } + var dot = tok.path.basename.indexOf('.'); + if (dot !== -1) { + tok.path.filename = tok.path.basename.slice(0, dot); + tok.path.extname = tok.path.basename.slice(dot); } - return tok; + + if (tok.path.extname.charAt(0) === '.') { + var exts = tok.path.extname.split('.'); + tok.path.ext = exts[exts.length - 1]; + } + + // unescape dots and slashes in braces/brackets + tok.glob = unescape(tok.glob); + tok.path.dirname = unescape(tok.path.dirname); + tok.path.basename = unescape(tok.path.basename); + tok.path.filename = unescape(tok.path.filename); + tok.path.extname = unescape(tok.path.extname); + + // Booleans + var is = (glob && tok.is.glob); + tok.is.negated = glob && glob.charAt(0) === '!'; + tok.is.extglob = glob && extglob(glob); + tok.is.braces = has(is, glob, '{'); + tok.is.brackets = has(is, glob, '[:'); + tok.is.globstar = has(is, glob, '**'); + tok.is.dotfile = dotfile(tok.path.basename); + tok.is.dotdir = dotdir(tok.path.dirname); + return (cache[glob] = tok); } /** - * Updates the tokens to reflect if the pattern - * matches dot-directories + * Returns true if the glob 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; +function dotdir(base) { + if (base.indexOf('/.') !== -1) { + return true; } - if (path.dirname.charAt(0) === '.' && path.dirname.charAt(1) !== '/') { - tok.is.dotdir = true; + if (base.charAt(0) === '.' && base.charAt(1) !== '/') { + return true; } - return tok; + return false; } /** - * Unescape brace patterns in each segment on the - * `path` object. + * Returns true if the pattern has the given `ch`aracter(s) * - * 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` + * @param {Object} `glob` The glob pattern. + * @param {Object} `ch` The character to test for * @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; +function has(is, glob, ch) { + return is && glob.indexOf(ch) !== -1; } -/** - * 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; } - return match.split(inner).join(esc(inner)); + var re = /\{([^{}]*?)}|\(([^()]*?)\)|\[([^\[\]]*?)\]/g; + return str.replace(re, function (outter, inner) { + if (!inner) { return outter; } + return outter.split(inner).join(esc(inner)); }); } function esc(str) { - str = str.split('/').join('__ESC_SLASH__'); - str = str.split('.').join('__ESC_DOT__'); + str = str.split('/').join('__SLASH__'); + str = str.split('.').join('__DOT__'); return str; } function unescape(str) { - str = str.split('__ESC_SLASH__').join('/'); - str = str.split('__ESC_DOT__').join('.'); + str = str.split('__SLASH__').join('/'); + str = str.split('__DOT__').join('.'); return str; } -},{"glob-base":4,"glob-path-regex":7,"is-glob":8}],2:[function(require,module,exports){ +},{"glob-base":2,"is-dotfile":5,"is-extglob":6,"is-glob":7}],2:[function(require,module,exports){ +/*! + * glob-base + * + * Copyright (c) 2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + +'use strict'; + +var path = require('path'); +var parent = require('glob-parent'); + +module.exports = function globBase(pattern) { + if (typeof pattern !== 'string') { + throw new TypeError('glob-base expects a string.'); + } + + var res = {}; + res.base = parent(pattern); + res.isGlob = res.base !== pattern; + + if (res.base !== '.') { + res.glob = pattern.substr(res.base.length); + if (res.glob.charAt(0) === '/') { + res.glob = res.glob.substr(1); + } + } else { + res.glob = pattern; + } + + if (!res.isGlob) { + res.base = dirname(pattern); + res.glob = res.base !== '.' + ? pattern.substr(res.base.length) + : pattern; + } + + if (res.glob.substr(0, 2) === './') { + res.glob = res.glob.substr(2); + } + if (res.glob.charAt(0) === '/') { + res.glob = res.glob.substr(1); + } + return res; +}; + +function dirname(glob) { + if (glob.slice(-1) === '/') return glob; + return path.dirname(glob); +} + +},{"glob-parent":3,"path":8}],3:[function(require,module,exports){ +'use strict'; + +var path = require('path'); +var isglob = require('is-glob'); + +module.exports = function globParent(str) { + while (isglob(str)) str = path.dirname(str); + return str; +}; + +},{"is-glob":4,"path":8}],4:[function(require,module,exports){ +/*! + * is-glob + * + * Copyright (c) 2014-2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + +module.exports = function isGlob(str) { + return typeof str === 'string' + && /[!*{}?(|)[\]]/.test(str); +}; + +},{}],5:[function(require,module,exports){ +/*! + * is-dotfile + * + * Copyright (c) 2015 Jon Schlinkert, contributors. + * Licensed under the MIT license. + */ + +module.exports = function(str) { + if (str.charCodeAt(0) === 46 /* . */ && str.indexOf('/', 1) === -1) { + return true; + } + + var last = str.lastIndexOf('/'); + return last !== -1 ? str.charCodeAt(last + 1) === 46 /* . */ : false; +}; + +},{}],6:[function(require,module,exports){ +/*! + * is-extglob + * + * Copyright (c) 2014-2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + +module.exports = function isExtglob(str) { + return typeof str === 'string' + && /[@?!+*]\(/.test(str); +}; + +},{}],7:[function(require,module,exports){ +arguments[4][4][0].apply(exports,arguments) +},{"dup":4}],8:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // @@ -432,7 +491,7 @@ var substr = 'ab'.substr(-1) === 'b' ; }).call(this,require('_process')) -},{"_process":3}],3:[function(require,module,exports){ +},{"_process":9}],9:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; @@ -492,106 +551,4 @@ process.chdir = function (dir) { }; process.umask = function() { return 0; }; -},{}],4:[function(require,module,exports){ -/*! - * glob-base - * - * Copyright (c) 2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - -'use strict'; - -var path = require('path'); -var isGlob = require('is-glob'); -var parent = require('glob-parent'); - -module.exports = function globBase(glob) { - if (typeof glob !== 'string') { - throw new TypeError('glob-base expects a string.'); - } - - var res = {}; - res.base = parent(glob); - - if (res.base !== '.') { - res.pattern = glob.substr(res.base.length); - if (res.pattern.charAt(0) === '/') { - res.pattern = res.pattern.substr(1); - } - } else { - res.pattern = glob; - } - - if (res.base === glob) { - res.base = dirname(glob); - res.pattern = res.base === '.' ? glob : glob.substr(res.base.length); - } - - if (res.pattern.substr(0, 2) === './') { - res.pattern = res.pattern.substr(2); - } - - if (res.pattern.charAt(0) === '/') { - res.pattern = res.pattern.substr(1); - } - return res; -} - -function dirname(glob) { - if (glob[glob.length - 1] === '/') { - return glob; - } - return path.dirname(glob); -} - -},{"glob-parent":5,"is-glob":6,"path":2}],5:[function(require,module,exports){ -'use strict'; - -var path = require('path'); -var isglob = require('is-glob'); - -module.exports = function globParent(str) { - while (isglob(str)) str = path.dirname(str); - return str; -}; - -},{"is-glob":6,"path":2}],6:[function(require,module,exports){ -/*! - * is-glob - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - -module.exports = function isGlob(str) { - return typeof str === 'string' - && /[!*{}?(|)[\]]/.test(str); -}; - -},{}],7:[function(require,module,exports){ -/*! - * glob-path-regex - * - * Copyright (c) 2014-2015 Jon Schlinkert. - * Licensed under the MIT license. - */ - -module.exports = function globPathRegex() { - return /^(.*?)(([\w*]*|[.\\*]*\{[^}]*\})((\.([\w*]*))*))$/; -}; - -},{}],8:[function(require,module,exports){ -/*! - * is-glob - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License - */ - -module.exports = function isGlob(str) { - return typeof str === 'string' - && /[!*{}?(|)[\]]/.test(str); -}; - },{}]},{},[1]); diff --git a/test.js b/test.js index e2b0f36..1bc1086 100644 --- a/test.js +++ b/test.js @@ -10,11 +10,15 @@ var assert = require('assert'); var parse = require('./'); -function getBase(glob) { - return parse(glob, true); -} - describe('`is` object:', function () { + it('should detect when special characters are in a pattern:', function () { + assert.equal(parse('!**{}[:[@()').is.negated, true); + assert.equal(parse('!**{}[:[@()').is.glob, true); + assert.equal(parse('!**{}[:[@()').is.extglob, true); + assert.equal(parse('!**{}[:[@()').is.brackets, true); + assert.equal(parse('!**{}[:[@()').is.braces, true); + }); + 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); @@ -37,10 +41,8 @@ describe('`is` object:', 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.js').is.globstar, true); 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); @@ -49,579 +51,563 @@ describe('`is` object:', function () { 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 has brace patterns:', function () { + assert.equal(parse('a/b/c').is.braces, false); + assert.equal(parse('**/*.{js,min.js}').is.braces, true); + assert.equal(parse('**/*{bar,foo}.js').is.braces, true); }); }); 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(parse('.*').base, '.'); + assert.equal(parse('.*').glob, '.*'); - assert.equal(getBase('./*').base, '.'); - assert.equal(getBase('./*').pattern, '*'); + assert.equal(parse('./*').base, '.'); + assert.equal(parse('./*').glob, '*'); - assert.equal(getBase('*').base, '.'); - assert.equal(getBase('*').pattern, '*'); + assert.equal(parse('*').base, '.'); + assert.equal(parse('*').glob, '*'); - assert.equal(getBase('**').base, '.'); - assert.equal(getBase('**').pattern, '**'); + assert.equal(parse('**').base, '.'); + assert.equal(parse('**').glob, '**'); - assert.equal(getBase('**/*.md').base, '.'); - assert.equal(getBase('**/*.md').pattern, '**/*.md'); + assert.equal(parse('**/*.md').base, '.'); + assert.equal(parse('**/*.md').glob, '**/*.md'); - assert.equal(getBase('**/*.min.js').base, '.'); - assert.equal(getBase('**/*.min.js').pattern, '**/*.min.js'); + assert.equal(parse('**/*.min.js').base, '.'); + assert.equal(parse('**/*.min.js').glob, '**/*.min.js'); - assert.equal(getBase('**/*foo.js').base, '.'); - assert.equal(getBase('**/*foo.js').pattern, '**/*foo.js'); + assert.equal(parse('**/*foo.js').base, '.'); + assert.equal(parse('**/*foo.js').glob, '**/*foo.js'); - assert.equal(getBase('**/.*').base, '.'); - assert.equal(getBase('**/.*').pattern, '**/.*'); + assert.equal(parse('**/.*').base, '.'); + assert.equal(parse('**/.*').glob, '**/.*'); - assert.equal(getBase('**/d').base, '.'); - assert.equal(getBase('**/d').pattern, '**/d'); + assert.equal(parse('**/d').base, '.'); + assert.equal(parse('**/d').glob, '**/d'); - assert.equal(getBase('*.*').base, '.'); - assert.equal(getBase('*.*').pattern, '*.*'); + assert.equal(parse('*.*').base, '.'); + assert.equal(parse('*.*').glob, '*.*'); - assert.equal(getBase('*.js').base, '.'); - assert.equal(getBase('*.js').pattern, '*.js'); + assert.equal(parse('*.js').base, '.'); + assert.equal(parse('*.js').glob, '*.js'); - assert.equal(getBase('*.md').base, '.'); - assert.equal(getBase('*.md').pattern, '*.md'); + assert.equal(parse('*.md').base, '.'); + assert.equal(parse('*.md').glob, '*.md'); - assert.equal(getBase('*.min.js').base, '.'); - assert.equal(getBase('*.min.js').pattern, '*.min.js'); + assert.equal(parse('*.min.js').base, '.'); + assert.equal(parse('*.min.js').glob, '*.min.js'); - assert.equal(getBase('*/*').base, '.'); - assert.equal(getBase('*/*').pattern, '*/*'); + assert.equal(parse('*/*').base, '.'); + assert.equal(parse('*/*').glob, '*/*'); - assert.equal(getBase('*/*/*/*').base, '.'); - assert.equal(getBase('*/*/*/*').pattern, '*/*/*/*'); + assert.equal(parse('*/*/*/*').base, '.'); + assert.equal(parse('*/*/*/*').glob, '*/*/*/*'); - assert.equal(getBase('*/*/*/e').base, '.'); - assert.equal(getBase('*/*/*/e').pattern, '*/*/*/e'); + assert.equal(parse('*/*/*/e').base, '.'); + assert.equal(parse('*/*/*/e').glob, '*/*/*/e'); - assert.equal(getBase('*/b/*/e').base, '.'); - assert.equal(getBase('*/b/*/e').pattern, '*/b/*/e'); + assert.equal(parse('*/b/*/e').base, '.'); + assert.equal(parse('*/b/*/e').glob, '*/b/*/e'); - assert.equal(getBase('*b').base, '.'); - assert.equal(getBase('*b').pattern, '*b'); + assert.equal(parse('*b').base, '.'); + assert.equal(parse('*b').glob, '*b'); - assert.equal(getBase('./a/**/j/**/z/*.md').base, './a'); - assert.equal(getBase('./a/**/j/**/z/*.md').pattern, '**/j/**/z/*.md'); + assert.equal(parse('./a/**/j/**/z/*.md').base, './a'); + assert.equal(parse('./a/**/j/**/z/*.md').glob, '**/j/**/z/*.md'); - assert.equal(getBase('./a/**/z/*.md').base, './a'); - assert.equal(getBase('./a/**/z/*.md').pattern, '**/z/*.md'); + assert.equal(parse('./a/**/z/*.md').base, './a'); + assert.equal(parse('./a/**/z/*.md').glob, '**/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(parse('./{a/b/{c,/foo.js}/e.f.g}').base, '.'); + assert.equal(parse('./{a/b/{c,/foo.js}/e.f.g}').glob, '{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(parse('./node_modules/*-glob/**/*.js').base, './node_modules'); + assert.equal(parse('./node_modules/*-glob/**/*.js').glob, '*-glob/**/*.js'); - assert.equal(getBase('a/b/{c,/.gitignore}').base, 'a/b'); - assert.equal(getBase('a/b/{c,/.gitignore}').pattern, '{c,/.gitignore}'); + assert.equal(parse('a/b/{c,/.gitignore}').base, 'a/b'); + assert.equal(parse('a/b/{c,/.gitignore}').glob, '{c,/.gitignore}'); - assert.equal(getBase('a/b/.{foo,bar}').base, 'a/b'); - assert.equal(getBase('a/b/.{foo,bar}').pattern, '.{foo,bar}'); + assert.equal(parse('a/b/.{foo,bar}').base, 'a/b'); + assert.equal(parse('a/b/.{foo,bar}').glob, '.{foo,bar}'); - assert.equal(getBase('a/b/*.{foo,bar}').base, 'a/b'); - assert.equal(getBase('a/b/*.{foo,bar}').pattern, '*.{foo,bar}'); + assert.equal(parse('a/b/*.{foo,bar}').base, 'a/b'); + assert.equal(parse('a/b/*.{foo,bar}').glob, '*.{foo,bar}'); - assert.equal(getBase('a/**/b/*.{foo,bar}').base, 'a'); - assert.equal(getBase('a/**/b/*.{foo,bar}').pattern, '**/b/*.{foo,bar}'); + assert.equal(parse('a/**/b/*.{foo,bar}').base, 'a'); + assert.equal(parse('a/**/b/*.{foo,bar}').glob, '**/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(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').base, 'a/b'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').glob, '{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(parse('a/b/{c,d}/').base, 'a/b'); + assert.equal(parse('a/b/{c,d}/').glob, '{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(parse('a/b/{c,d}/e/f.g').base, 'a/b'); + assert.equal(parse('a/b/{c,d}/e/f.g').glob, '{c,d}/e/f.g'); - assert.equal(getBase('.a*').base, '.'); - assert.equal(getBase('.a*').pattern, '.a*'); + assert.equal(parse('.a*').base, '.'); + assert.equal(parse('.a*').glob, '.a*'); - assert.equal(getBase('.b*').base, '.'); - assert.equal(getBase('.b*').pattern, '.b*'); + assert.equal(parse('.b*').base, '.'); + assert.equal(parse('.b*').glob, '.b*'); - assert.equal(getBase('/*').base, '/'); - assert.equal(getBase('/*').pattern, '*'); + assert.equal(parse('/*').base, '/'); + assert.equal(parse('/*').glob, '*'); - assert.equal(getBase('a/***').base, 'a'); - assert.equal(getBase('a/***').pattern, '***'); + assert.equal(parse('a/***').base, 'a'); + assert.equal(parse('a/***').glob, '***'); - assert.equal(getBase('a/**/b/*.{foo,bar}').base, 'a'); - assert.equal(getBase('a/**/b/*.{foo,bar}').pattern, '**/b/*.{foo,bar}'); + assert.equal(parse('a/**/b/*.{foo,bar}').base, 'a'); + assert.equal(parse('a/**/b/*.{foo,bar}').glob, '**/b/*.{foo,bar}'); - assert.equal(getBase('a/**/c/*').base, 'a'); - assert.equal(getBase('a/**/c/*').pattern, '**/c/*'); + assert.equal(parse('a/**/c/*').base, 'a'); + assert.equal(parse('a/**/c/*').glob, '**/c/*'); - assert.equal(getBase('a/**/c/*.md').base, 'a'); - assert.equal(getBase('a/**/c/*.md').pattern, '**/c/*.md'); + assert.equal(parse('a/**/c/*.md').base, 'a'); + assert.equal(parse('a/**/c/*.md').glob, '**/c/*.md'); - assert.equal(getBase('a/**/e').base, 'a'); - assert.equal(getBase('a/**/e').pattern, '**/e'); + assert.equal(parse('a/**/e').base, 'a'); + assert.equal(parse('a/**/e').glob, '**/e'); - assert.equal(getBase('a/**/j/**/z/*.md').base, 'a'); - assert.equal(getBase('a/**/j/**/z/*.md').pattern, '**/j/**/z/*.md'); + assert.equal(parse('a/**/j/**/z/*.md').base, 'a'); + assert.equal(parse('a/**/j/**/z/*.md').glob, '**/j/**/z/*.md'); - assert.equal(getBase('a/**/z/*.md').base, 'a'); - assert.equal(getBase('a/**/z/*.md').pattern, '**/z/*.md'); + assert.equal(parse('a/**/z/*.md').base, 'a'); + assert.equal(parse('a/**/z/*.md').glob, '**/z/*.md'); - assert.equal(getBase('a/**c*').base, 'a'); - assert.equal(getBase('a/**c*').pattern, '**c*'); + assert.equal(parse('a/**c*').base, 'a'); + assert.equal(parse('a/**c*').glob, '**c*'); - assert.equal(getBase('a/**c/*').base, 'a'); - assert.equal(getBase('a/**c/*').pattern, '**c/*'); + assert.equal(parse('a/**c/*').base, 'a'); + assert.equal(parse('a/**c/*').glob, '**c/*'); - assert.equal(getBase('a/*/*/e').base, 'a'); - assert.equal(getBase('a/*/*/e').pattern, '*/*/e'); + assert.equal(parse('a/*/*/e').base, 'a'); + assert.equal(parse('a/*/*/e').glob, '*/*/e'); - assert.equal(getBase('a/*/c/*.md').base, 'a'); - assert.equal(getBase('a/*/c/*.md').pattern, '*/c/*.md'); + assert.equal(parse('a/*/c/*.md').base, 'a'); + assert.equal(parse('a/*/c/*.md').glob, '*/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(parse('a/b/**/c{d,e}/**/xyz.md').base, 'a/b'); + assert.equal(parse('a/b/**/c{d,e}/**/xyz.md').glob, '**/c{d,e}/**/xyz.md'); - assert.equal(getBase('a/b/**/e').base, 'a/b'); - assert.equal(getBase('a/b/**/e').pattern, '**/e'); + assert.equal(parse('a/b/**/e').base, 'a/b'); + assert.equal(parse('a/b/**/e').glob, '**/e'); - assert.equal(getBase('a/b/*.{foo,bar}').base, 'a/b'); - assert.equal(getBase('a/b/*.{foo,bar}').pattern, '*.{foo,bar}'); + assert.equal(parse('a/b/*.{foo,bar}').base, 'a/b'); + assert.equal(parse('a/b/*.{foo,bar}').glob, '*.{foo,bar}'); - assert.equal(getBase('a/b/*/e').base, 'a/b'); - assert.equal(getBase('a/b/*/e').pattern, '*/e'); + assert.equal(parse('a/b/*/e').base, 'a/b'); + assert.equal(parse('a/b/*/e').glob, '*/e'); - assert.equal(getBase('a/b/c/*').base, 'a/b/c'); - assert.equal(getBase('a/b/c/*').pattern, '*'); + assert.equal(parse('a/b/c/*').base, 'a/b/c'); + assert.equal(parse('a/b/c/*').glob, '*'); - assert.equal(getBase('a/b/c/*.md').base, 'a/b/c'); - assert.equal(getBase('a/b/c/*.md').pattern, '*.md'); + assert.equal(parse('a/b/c/*.md').base, 'a/b/c'); + assert.equal(parse('a/b/c/*.md').glob, '*.md'); - assert.equal(getBase('a/b/c/.*.md').base, 'a/b/c'); - assert.equal(getBase('a/b/c/.*.md').pattern, '.*.md'); + assert.equal(parse('a/b/c/.*.md').base, 'a/b/c'); + assert.equal(parse('a/b/c/.*.md').glob, '.*.md'); - assert.equal(getBase('b/*/*/*').base, 'b'); - assert.equal(getBase('b/*/*/*').pattern, '*/*/*'); + assert.equal(parse('b/*/*/*').base, 'b'); + assert.equal(parse('b/*/*/*').glob, '*/*/*'); }); it('file extensions:', function () { - assert.equal(getBase('.md').base, ''); - assert.equal(getBase('.md').pattern, '.md'); + assert.equal(parse('.md').base, '.'); + assert.equal(parse('.md').glob, '.md'); }); it('negation pattern:', function () { - assert.equal(getBase('!*.min.js').base, '.'); - assert.equal(getBase('!*.min.js').pattern, '!*.min.js'); + assert.equal(parse('!*.min.js').base, '.'); + assert.equal(parse('!*.min.js').glob, '!*.min.js'); - assert.equal(getBase('!foo').base, '.'); - assert.equal(getBase('!foo').pattern, '!foo'); + assert.equal(parse('!foo').base, '.'); + assert.equal(parse('!foo').glob, '!foo'); - assert.equal(getBase('a/b/c/!foo').base, 'a/b/c'); - assert.equal(getBase('a/b/c/!foo').pattern, '!foo'); + assert.equal(parse('a/b/c/!foo').base, 'a/b/c'); + assert.equal(parse('a/b/c/!foo').glob, '!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(parse('!foo/(a|b).min.js').base, '.'); + assert.equal(parse('!foo/(a|b).min.js').glob, '!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(parse('!foo/[a-b].min.js').base, '.'); + assert.equal(parse('!foo/[a-b].min.js').glob, '!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(parse('!foo/{a,b}.min.js').base, '.'); + assert.equal(parse('!foo/{a,b}.min.js').glob, '!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, '/a/b'); - assert.equal(getBase('/a/b/{c,/foo.js}/e.f.g/').pattern, '{c,/foo.js}/e.f.g/'); + assert.equal(parse('/a/b/{c,/foo.js}/e.f.g/').base, '/a/b'); + assert.equal(parse('/a/b/{c,/foo.js}/e.f.g/').glob, '{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(parse('{a/b/c.js,/a/b/{c,/foo.js}/e.f.g/}').base, '.'); + assert.equal(parse('{a/b/c.js,/a/b/{c,/foo.js}/e.f.g/}').glob, '{a/b/c.js,/a/b/{c,/foo.js}/e.f.g/}'); - assert.equal(getBase('/a/b/{c,d}/').base, '/a/b'); - assert.equal(getBase('/a/b/{c,d}/').pattern, '{c,d}/'); + assert.equal(parse('/a/b/{c,d}/').base, '/a/b'); + assert.equal(parse('/a/b/{c,d}/').glob, '{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(parse('/a/b/{c,d}/*.js').base, '/a/b'); + assert.equal(parse('/a/b/{c,d}/*.js').glob, '{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(parse('/a/b/{c,d}/*.min.js').base, '/a/b'); + assert.equal(parse('/a/b/{c,d}/*.min.js').glob, '{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(parse('/a/b/{c,d}/e.f.g/').base, '/a/b'); + assert.equal(parse('/a/b/{c,d}/e.f.g/').glob, '{c,d}/e.f.g/'); - assert.equal(getBase('{.,*}').base, '.'); - assert.equal(getBase('{.,*}').pattern, '{.,*}'); + assert.equal(parse('{.,*}').base, '.'); + assert.equal(parse('{.,*}').glob, '{.,*}'); }); - 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}'); + it('should work when the basename has braces:', function () { + assert.equal(parse('a/b/.{c,.gitignore}').base, 'a/b'); + assert.equal(parse('a/b/.{c,.gitignore}').glob, '.{c,.gitignore}'); - assert.equal(getBase('a/b/.{c,/.gitignore}').base, 'a/b'); - assert.equal(getBase('a/b/.{c,/.gitignore}').pattern, '.{c,/.gitignore}'); + assert.equal(parse('a/b/.{c,/.gitignore}').base, 'a/b'); + assert.equal(parse('a/b/.{c,/.gitignore}').glob, '.{c,/.gitignore}'); - assert.equal(getBase('a/b/.{foo,bar}').base, 'a/b'); - assert.equal(getBase('a/b/.{foo,bar}').pattern, '.{foo,bar}'); + assert.equal(parse('a/b/.{foo,bar}').base, 'a/b'); + assert.equal(parse('a/b/.{foo,bar}').glob, '.{foo,bar}'); - assert.equal(getBase('a/b/{c,.gitignore}').base, 'a/b'); - assert.equal(getBase('a/b/{c,.gitignore}').pattern, '{c,.gitignore}'); + assert.equal(parse('a/b/{c,.gitignore}').base, 'a/b'); + assert.equal(parse('a/b/{c,.gitignore}').glob, '{c,.gitignore}'); - assert.equal(getBase('a/b/{c,/.gitignore}').base, 'a/b'); - assert.equal(getBase('a/b/{c,/.gitignore}').pattern, '{c,/.gitignore}'); + assert.equal(parse('a/b/{c,/.gitignore}').base, 'a/b'); + assert.equal(parse('a/b/{c,/.gitignore}').glob, '{c,/.gitignore}'); - assert.equal(getBase('a/b/{c,/gitignore}').base, 'a/b'); - assert.equal(getBase('a/b/{c,/gitignore}').pattern, '{c,/gitignore}'); + assert.equal(parse('a/b/{c,/gitignore}').base, 'a/b'); + assert.equal(parse('a/b/{c,/gitignore}').glob, '{c,/gitignore}'); - assert.equal(getBase('a/b/{c,d}').base, 'a/b'); - assert.equal(getBase('a/b/{c,d}').pattern, '{c,d}'); + assert.equal(parse('a/b/{c,d}').base, 'a/b'); + assert.equal(parse('a/b/{c,d}').glob, '{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(parse('a/b/{c,./d}/e/f.g').base, 'a/b'); + assert.equal(parse('a/b/{c,./d}/e/f.g').glob, '{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(parse('a/b/{c,./d}/e/f.min.g').base, 'a/b'); + assert.equal(parse('a/b/{c,./d}/e/f.min.g').glob, '{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(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').base, 'a/b'); + assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').glob, '{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(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').base, 'a/b'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').glob, '{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(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').base, 'a/b'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').glob, '{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(parse('a/b/{c,/d}/e/f.g').base, 'a/b'); + assert.equal(parse('a/b/{c,/d}/e/f.g').glob, '{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(parse('a/b/{c,/d}/e/f.min.g').base, 'a/b'); + assert.equal(parse('a/b/{c,/d}/e/f.min.g').glob, '{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(parse('a/b/{c,d}/').base, 'a/b'); + assert.equal(parse('a/b/{c,d}/').glob, '{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(parse('a/b/{c,d}/*.js').base, 'a/b'); + assert.equal(parse('a/b/{c,d}/*.js').glob, '{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(parse('a/b/{c,d}/*.min.js').base, 'a/b'); + assert.equal(parse('a/b/{c,d}/*.min.js').glob, '{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(parse('a/b/{c,d}/e.f.g/').base, 'a/b'); + assert.equal(parse('a/b/{c,d}/e.f.g/').glob, '{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(parse('a/b/{c,d}/e/f.g').base, 'a/b'); + assert.equal(parse('a/b/{c,d}/e/f.g').glob, '{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(parse('a/b/{c,d}/e/f.min.g').base, 'a/b'); + assert.equal(parse('a/b/{c,d}/e/f.min.g').glob, '{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'); + assert.equal(parse('foo/{a,b}.min.js').base, 'foo'); + assert.equal(parse('foo/{a,b}.min.js').glob, '{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(parse('[a-c]b*').base, '.'); + assert.equal(parse('[a-c]b*').glob, '[a-c]b*'); - assert.equal(getBase('[a-j]*[^c]').base, '.'); - assert.equal(getBase('[a-j]*[^c]').pattern, '[a-j]*[^c]'); + assert.equal(parse('[a-j]*[^c]').base, '.'); + assert.equal(parse('[a-j]*[^c]').glob, '[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(parse('[a-j]*[^c]b/c').base, '.'); + assert.equal(parse('[a-j]*[^c]b/c').glob, '[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(parse('[a-j]*[^c]bc').base, '.'); + assert.equal(parse('[a-j]*[^c]bc').glob, '[a-j]*[^c]bc'); - assert.equal(getBase('[ab][ab]').base, '.'); - assert.equal(getBase('[ab][ab]').pattern, '[ab][ab]'); + assert.equal(parse('[ab][ab]').base, '.'); + assert.equal(parse('[ab][ab]').glob, '[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'); + assert.equal(parse('foo/[a-b].min.js').base, 'foo'); + assert.equal(parse('foo/[a-b].min.js').glob, '[a-b].min.js'); }); it('qmarks:', function () { - assert.equal(getBase('?').base, '.'); - assert.equal(getBase('?').pattern, '?'); + assert.equal(parse('?').base, '.'); + assert.equal(parse('?').glob, '?'); - assert.equal(getBase('?/?').base, '.'); - assert.equal(getBase('?/?').pattern, '?/?'); + assert.equal(parse('?/?').base, '.'); + assert.equal(parse('?/?').glob, '?/?'); - assert.equal(getBase('??').base, '.'); - assert.equal(getBase('??').pattern, '??'); + assert.equal(parse('??').base, '.'); + assert.equal(parse('??').glob, '??'); - assert.equal(getBase('???').base, '.'); - assert.equal(getBase('???').pattern, '???'); + assert.equal(parse('???').base, '.'); + assert.equal(parse('???').glob, '???'); - assert.equal(getBase('?a').base, '.'); - assert.equal(getBase('?a').pattern, '?a'); + assert.equal(parse('?a').base, '.'); + assert.equal(parse('?a').glob, '?a'); - assert.equal(getBase('?b').base, '.'); - assert.equal(getBase('?b').pattern, '?b'); + assert.equal(parse('?b').base, '.'); + assert.equal(parse('?b').glob, '?b'); - assert.equal(getBase('a?b').base, '.'); - assert.equal(getBase('a?b').pattern, 'a?b'); + assert.equal(parse('a?b').base, '.'); + assert.equal(parse('a?b').glob, 'a?b'); - assert.equal(getBase('a/?/c.js').base, 'a'); - assert.equal(getBase('a/?/c.js').pattern, '?/c.js'); + assert.equal(parse('a/?/c.js').base, 'a'); + assert.equal(parse('a/?/c.js').glob, '?/c.js'); - assert.equal(getBase('a/?/c.md').base, 'a'); - assert.equal(getBase('a/?/c.md').pattern, '?/c.md'); + assert.equal(parse('a/?/c.md').base, 'a'); + assert.equal(parse('a/?/c.md').glob, '?/c.md'); - assert.equal(getBase('a/?/c/?/*/f.js').base, 'a'); - assert.equal(getBase('a/?/c/?/*/f.js').pattern, '?/c/?/*/f.js'); + assert.equal(parse('a/?/c/?/*/f.js').base, 'a'); + assert.equal(parse('a/?/c/?/*/f.js').glob, '?/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(parse('a/?/c/?/*/f.md').base, 'a'); + assert.equal(parse('a/?/c/?/*/f.md').glob, '?/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(parse('a/?/c/?/e.js').base, 'a'); + assert.equal(parse('a/?/c/?/e.js').glob, '?/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(parse('a/?/c/?/e.md').base, 'a'); + assert.equal(parse('a/?/c/?/e.md').glob, '?/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(parse('a/?/c/???/e.js').base, 'a'); + assert.equal(parse('a/?/c/???/e.js').glob, '?/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(parse('a/?/c/???/e.md').base, 'a'); + assert.equal(parse('a/?/c/???/e.md').glob, '?/c/???/e.md'); - assert.equal(getBase('a/??/c.js').base, 'a'); - assert.equal(getBase('a/??/c.js').pattern, '??/c.js'); + assert.equal(parse('a/??/c.js').base, 'a'); + assert.equal(parse('a/??/c.js').glob, '??/c.js'); - assert.equal(getBase('a/??/c.md').base, 'a'); - assert.equal(getBase('a/??/c.md').pattern, '??/c.md'); + assert.equal(parse('a/??/c.md').base, 'a'); + assert.equal(parse('a/??/c.md').glob, '??/c.md'); - assert.equal(getBase('a/???/c.js').base, 'a'); - assert.equal(getBase('a/???/c.js').pattern, '???/c.js'); + assert.equal(parse('a/???/c.js').base, 'a'); + assert.equal(parse('a/???/c.js').glob, '???/c.js'); - assert.equal(getBase('a/???/c.md').base, 'a'); - assert.equal(getBase('a/???/c.md').pattern, '???/c.md'); + assert.equal(parse('a/???/c.md').base, 'a'); + assert.equal(parse('a/???/c.md').glob, '???/c.md'); - assert.equal(getBase('a/????/c.js').base, 'a'); - assert.equal(getBase('a/????/c.js').pattern, '????/c.js'); + assert.equal(parse('a/????/c.js').base, 'a'); + assert.equal(parse('a/????/c.js').glob, '????/c.js'); }); it('non-glob pattern:', function () { - assert.equal(getBase('').base, ''); - assert.equal(getBase('').pattern, ''); + assert.equal(parse('').base, '.'); + assert.equal(parse('').glob, ''); - assert.equal(getBase('.').base, ''); - assert.equal(getBase('.').pattern, '.'); + assert.equal(parse('.').base, '.'); + assert.equal(parse('.').glob, '.'); - assert.equal(getBase('a').base, ''); - assert.equal(getBase('a').pattern, 'a'); + assert.equal(parse('a').base, '.'); + assert.equal(parse('a').glob, 'a'); - assert.equal(getBase('.a').base, ''); - assert.equal(getBase('.a').pattern, '.a'); + assert.equal(parse('.a').base, '.'); + assert.equal(parse('.a').glob, '.a'); - assert.equal(getBase('/a').base, '/'); - assert.equal(getBase('/a').pattern, 'a'); + assert.equal(parse('/a').base, '/'); + assert.equal(parse('/a').glob, 'a'); - assert.equal(getBase('/a/b/c').base, '/a/b/'); - assert.equal(getBase('/a/b/c').pattern, 'c'); + assert.equal(parse('/a/b/c').base, '/a/b'); + assert.equal(parse('/a/b/c').glob, 'c'); - assert.equal(getBase('/a/b/c/').base, '/a/b/c/'); - assert.equal(getBase('/a/b/c/').pattern, ''); + assert.equal(parse('/a/b/c/').base, '/a/b/c/'); + assert.equal(parse('/a/b/c/').glob, ''); - assert.equal(getBase('a/b/c/').base, 'a/b/c/'); - assert.equal(getBase('a/b/c/').pattern, ''); + assert.equal(parse('a/b/c/').base, 'a/b/c/'); + assert.equal(parse('a/b/c/').glob, ''); - assert.equal(getBase('a.min.js').base, ''); - assert.equal(getBase('a.min.js').pattern, 'a.min.js'); + assert.equal(parse('a.min.js').base, '.'); + assert.equal(parse('a.min.js').glob, 'a.min.js'); - assert.equal(getBase('a/.x.md').base, 'a/'); - assert.equal(getBase('a/.x.md').pattern, '.x.md'); + assert.equal(parse('a/.x.md').base, 'a'); + assert.equal(parse('a/.x.md').glob, '.x.md'); - assert.equal(getBase('a/b/.gitignore').base, 'a/b/'); - assert.equal(getBase('a/b/.gitignore').pattern, '.gitignore'); + assert.equal(parse('a/b/.gitignore').base, 'a/b'); + assert.equal(parse('a/b/.gitignore').glob, '.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(parse('a/b/c/d.md').base, 'a/b/c'); + assert.equal(parse('a/b/c/d.md').glob, '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(parse('a/b/c/d.e.f/g.min.js').base, 'a/b/c/d.e.f'); + assert.equal(parse('a/b/c/d.e.f/g.min.js').glob, 'g.min.js'); - assert.equal(getBase('a/b/.git').base, 'a/b/'); - assert.equal(getBase('a/b/.git').pattern, '.git'); + assert.equal(parse('a/b/.git').base, 'a/b'); + assert.equal(parse('a/b/.git').glob, '.git'); - assert.equal(getBase('a/b/.git/').base, 'a/b/.git/'); - assert.equal(getBase('a/b/.git/').pattern, ''); + assert.equal(parse('a/b/.git/').base, 'a/b/.git/'); + assert.equal(parse('a/b/.git/').glob, ''); - assert.equal(getBase('a/b/.gitignore').base, 'a/b/'); - assert.equal(getBase('a/b/.gitignore').pattern, '.gitignore'); + assert.equal(parse('a/b/.gitignore').base, 'a/b'); + assert.equal(parse('a/b/.gitignore').glob, '.gitignore'); - assert.equal(getBase('a/b/c').base, 'a/b/'); - assert.equal(getBase('a/b/c').pattern, 'c'); + assert.equal(parse('a/b/c').base, 'a/b'); + assert.equal(parse('a/b/c').glob, '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(parse('a/b/c.d/e.md').base, 'a/b/c.d'); + assert.equal(parse('a/b/c.d/e.md').glob, 'e.md'); - assert.equal(getBase('a/b/c.md').base, 'a/b/'); - assert.equal(getBase('a/b/c.md').pattern, 'c.md'); + assert.equal(parse('a/b/c.md').base, 'a/b'); + assert.equal(parse('a/b/c.md').glob, '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(parse('a/b/c.min.js').base, 'a/b'); + assert.equal(parse('a/b/c.min.js').glob, 'c.min.js'); - assert.equal(getBase('a/b/c/').base, 'a/b/c/'); - assert.equal(getBase('a/b/c/').pattern, ''); + assert.equal(parse('a/b/c/').base, 'a/b/c/'); + assert.equal(parse('a/b/c/').glob, ''); - 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(parse('a/b/c/d.e.f/g.min.js').base, 'a/b/c/d.e.f'); + assert.equal(parse('a/b/c/d.e.f/g.min.js').glob, '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(parse('a/b/c/d.md').base, 'a/b/c'); + assert.equal(parse('a/b/c/d.md').glob, 'd.md'); - assert.equal(getBase('a/b/git/').base, 'a/b/git/'); - assert.equal(getBase('a/b/git/').pattern, ''); + assert.equal(parse('a/b/git/').base, 'a/b/git/'); + assert.equal(parse('a/b/git/').glob, ''); - assert.equal(getBase('aa').base, ''); - assert.equal(getBase('aa').pattern, 'aa'); + assert.equal(parse('aa').base, '.'); + assert.equal(parse('aa').glob, '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'); + assert.equal(parse('c.md').base, '.'); + assert.equal(parse('c.md').glob, 'c.md'); }); }); 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'); + assert.equal(parse('*.min.js').base, '.'); + assert.equal(parse('/a/b/c').base, '/a/b'); + assert.equal(parse('/a/b/c/').base, '/a/b/c/'); + assert.equal(parse('/a/b/{c,d}/').base, '/a/b'); + assert.equal(parse('/a/b/{c,d}/*.js').base, '/a/b'); + assert.equal(parse('/a/b/{c,d}/*.min.js').base, '/a/b'); + assert.equal(parse('/a/b/{c,d}/e.f.g/').base, '/a/b'); + assert.equal(parse('/a/b/{c,/foo.js}/e.f.g/').base, '/a/b'); + assert.equal(parse('./{a/b/{c,/foo.js}/e.f.g}').base, '.'); + assert.equal(parse('[a-c]b*').base, '.'); + assert.equal(parse('[a-j]*[^c]').base, '.'); + assert.equal(parse('[a-j]*[^c]b/c').base, '.'); + assert.equal(parse('[a-j]*[^c]bc').base, '.'); + assert.equal(parse('a/b/{c,./d}/e/f.g').base, 'a/b'); + assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').base, 'a/b'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').base, 'a/b'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').base, 'a/b'); + assert.equal(parse('a/b/{c,.gitignore}').base, 'a/b'); + assert.equal(parse('a/b/{c,/.gitignore}').base, 'a/b'); + assert.equal(parse('a/b/{c,/d}/e/f.g').base, 'a/b'); + assert.equal(parse('a/b/{c,/gitignore}').base, 'a/b'); + assert.equal(parse('a/b/{c,d}').base, 'a/b'); + assert.equal(parse('a/b/{c,d}/').base, 'a/b'); + assert.equal(parse('a/b/{c,d}/*.js').base, 'a/b'); + assert.equal(parse('a/b/{c,d}/*.min.js').base, 'a/b'); + assert.equal(parse('a/b/{c,d}/e.f.g/').base, 'a/b'); + assert.equal(parse('a/b/{c,d}/e/f.g').base, 'a/b'); + assert.equal(parse('a').base, '.'); + assert.equal(parse('a/**/b/*.{foo,bar}').base, 'a'); + assert.equal(parse('a/b/*.{foo,bar}').base, 'a/b'); + assert.equal(parse('a/b/.gitignore').base, 'a/b'); + assert.equal(parse('a/b/.{c,.gitignore}').base, 'a/b'); + assert.equal(parse('a/b/.{c,/.gitignore}').base, 'a/b'); + assert.equal(parse('a/b/.{foo,bar}').base, 'a/b'); + assert.equal(parse('a/b/c').base, 'a/b'); + assert.equal(parse('a/b/c.d/e.md').base, 'a/b/c.d'); + assert.equal(parse('a/b/c.md').base, 'a/b'); + assert.equal(parse('a/b/c.min.js').base, 'a/b'); + assert.equal(parse('a/b/c/').base, 'a/b/c/'); + assert.equal(parse('a/b/c/d.e.f/g.min.js').base, 'a/b/c/d.e.f'); + assert.equal(parse('a/b/c/d.md').base, 'a/b/c'); + assert.equal(parse('c.md').base, '.'); }); 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('*.min.js').path.basename, '*.min.js'); 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}/*.js').path.basename, '*.js'); + assert.equal(parse('/a/b/{c,d}/*.min.js').path.basename, '*.min.js'); 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-j]*[^c]').path.basename, '[a-j]*[^c]'); + assert.equal(parse('[a-j]*[^c]bc').path.basename, '[a-j]*[^c]bc'); + assert.equal(parse('a/**/b/*.{foo,bar}').path.basename, '*.{foo,bar}'); + assert.equal(parse('a/b/*.{foo,bar}').path.basename, '*.{foo,bar}'); + 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/.{foo,bar}').path.basename, '.{foo,bar}'); + assert.equal(parse('a/b/{c,./d}/e/f.g').path.basename, 'f.g'); + assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').path.basename, 'abc.foo.js'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').path.basename, '*.foo.js'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').path.basename, 'abc.foo.js'); 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,/d}/e/f.g').path.basename, 'f.g'); 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}/*.js').path.basename, '*.js'); + assert.equal(parse('a/b/{c,d}/*.min.js').path.basename, '*.min.js'); 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'); + assert.equal(parse('a/b/{c,d}/e/f.g').path.basename, 'f.g'); + }); + + it('should get a filename:', function () { + assert.equal(parse('*.min.js').path.filename, '*'); + assert.equal(parse('/a/b/c').path.filename, 'c'); + assert.equal(parse('/a/b/c/').path.filename, ''); + assert.equal(parse('/a/b/{c,d}/').path.filename, ''); + assert.equal(parse('/a/b/{c,d}/*.js').path.filename, '*'); + assert.equal(parse('/a/b/{c,d}/*.min.js').path.filename, '*'); + assert.equal(parse('/a/b/{c,d}/e.f.g/').path.filename, ''); + assert.equal(parse('[a-c]b*').path.filename, '[a-c]b*'); + assert.equal(parse('a').path.filename, 'a'); + assert.equal(parse('a/**/b/*.{foo,bar}').path.filename, '*'); + assert.equal(parse('a/b/*.{foo,bar}').path.filename, '*'); + assert.equal(parse('a/b/.gitignore').path.filename, ''); + assert.equal(parse('a/b/.{c,.gitignore}').path.filename, ''); + assert.equal(parse('a/b/.{c,/.gitignore}').path.filename, ''); + assert.equal(parse('a/b/.{foo,bar}').path.filename, ''); + assert.equal(parse('a/b/c').path.filename, 'c'); + assert.equal(parse('a/b/c.d/e.md').path.filename, 'e'); + assert.equal(parse('a/b/c.md').path.filename, 'c'); + assert.equal(parse('a/b/c.min.js').path.filename, 'c'); + assert.equal(parse('a/b/c/').path.filename, ''); + assert.equal(parse('a/b/c/d.e.f/g.min.js').path.filename, 'g'); + assert.equal(parse('a/b/c/d.md').path.filename, 'd'); + assert.equal(parse('a/b/{c,./d}/e/f.g').path.filename, 'f'); + assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').path.filename, 'abc'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').path.filename, '*'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').path.filename, 'abc'); + 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'); + 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, '*'); + assert.equal(parse('a/b/{c,d}/*.min.js').path.filename, '*'); + 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'); + assert.equal(parse('c.md').path.filename, 'c'); }); it('should get an extname:', function () { @@ -667,111 +653,224 @@ describe('path parts:', function () { assert.equal(parse('a/b/{c,d}/e/f.min.g').path.extname, '.min.g'); assert.equal(parse('c.md').path.extname, '.md'); }); + + it('should match a path with an extension:', function () { + assert.equal(parse('a/b/c.md').glob, 'c.md'); + assert.equal(parse('a/b/c.md').base, 'a/b'); + assert.equal(parse('a/b/c.md').path.basename, 'c.md'); + assert.equal(parse('a/b/c.md').path.filename, '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').glob, 'c.md'); + assert.equal(parse('c.md').base, '.'); + assert.equal(parse('c.md').path.basename, 'c.md'); + assert.equal(parse('c.md').path.filename, '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').glob, 'c.min.js'); + assert.equal(parse('a/b/c.min.js').base, 'a/b'); + assert.equal(parse('a/b/c.min.js').path.basename, 'c.min.js'); + assert.equal(parse('a/b/c.min.js').path.filename, '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').glob, 'g.min.js'); + assert.equal(parse('a/b/c/d.e.f/g.min.js').base, 'a/b/c/d.e.f'); + assert.equal(parse('a/b/c/d.e.f/g.min.js').path.basename, 'g.min.js'); + assert.equal(parse('a/b/c/d.e.f/g.min.js').path.filename, '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').glob, 'a'); + assert.equal(parse('a').base, '.'); + 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').glob, 'd.md'); + assert.equal(parse('a/b/c/d.md').base, 'a/b/c'); + assert.equal(parse('a/b/c/d.md').path.basename, 'd.md'); + assert.equal(parse('a/b/c/d.md').path.filename, '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').glob, 'e.md'); + assert.equal(parse('a/b/c.d/e.md').base, 'a/b/c.d'); + assert.equal(parse('a/b/c.d/e.md').path.basename, 'e.md'); + assert.equal(parse('a/b/c.d/e.md').path.filename, '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('glob characters:', function () { + it('should match when the basename starts with a star:', function () { + assert.equal(parse('a/b/*.{foo,bar}').glob, '*.{foo,bar}'); + assert.equal(parse('a/b/*.{foo,bar}').base, 'a/b'); + assert.equal(parse('a/b/*.{foo,bar}').path.basename, '*.{foo,bar}'); + assert.equal(parse('a/b/*.{foo,bar}').path.filename, '*'); + 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}').glob, '**/b/*.{foo,bar}'); + assert.equal(parse('a/**/b/*.{foo,bar}').base, 'a'); + assert.equal(parse('a/**/b/*.{foo,bar}').path.basename, '*.{foo,bar}'); + assert.equal(parse('a/**/b/*.{foo,bar}').path.filename, '*'); + 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').glob, '{c,.gitignore,{a,b}}/{a,b}/abc.foo.js'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').base, 'a/b'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').path.basename, 'abc.foo.js'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/abc.foo.js').path.filename, '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').glob, '{c,.gitignore,{a,b}}/{a,b}/*.foo.js'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').base, 'a/b'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').path.basename, '*.foo.js'); + assert.equal(parse('a/b/{c,.gitignore,{a,b}}/{a,b}/*.foo.js').path.filename, '*'); + 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').glob, '{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js'); + assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').base, 'a/b'); + assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').path.basename, 'abc.foo.js'); + assert.equal(parse('a/b/{c,.gitignore,{a,./b}}/{a,b}/abc.foo.js').path.filename, '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'); + }); }); 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}').glob, '{c,d}'); + assert.equal(parse('a/b/{c,d}').base, 'a/b'); assert.equal(parse('a/b/{c,d}').path.basename, '{c,d}'); + assert.equal(parse('a/b/{c,d}').path.filename, '{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').orig, 'a/b/{c,d}/*.js'); + assert.equal(parse('a/b/{c,d}/*.js').glob, '{c,d}/*.js'); + assert.equal(parse('a/b/{c,d}/*.js').base, 'a/b'); + assert.equal(parse('a/b/{c,d}/*.js').path.basename, '*.js'); + assert.equal(parse('a/b/{c,d}/*.js').path.filename, '*'); 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}/').orig, 'a/b/{c,d}/'); + assert.equal(parse('a/b/{c,d}/').glob, '{c,d}/'); + assert.equal(parse('a/b/{c,d}/').base, 'a/b'); assert.equal(parse('a/b/{c,d}/').path.basename, ''); + assert.equal(parse('a/b/{c,d}/').path.filename, ''); 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/').orig, 'a/b/{c,d}/e.f.g/'); + assert.equal(parse('a/b/{c,d}/e.f.g/').glob, '{c,d}/e.f.g/'); + assert.equal(parse('a/b/{c,d}/e.f.g/').base, 'a/b'); assert.equal(parse('a/b/{c,d}/e.f.g/').path.basename, ''); + assert.equal(parse('a/b/{c,d}/e.f.g/').path.filename, ''); 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/').orig, '/a/b/{c,d}/e.f.g/'); + assert.equal(parse('/a/b/{c,d}/e.f.g/').glob, '{c,d}/e.f.g/'); + assert.equal(parse('/a/b/{c,d}/e.f.g/').base, '/a/b'); assert.equal(parse('/a/b/{c,d}/e.f.g/').path.basename, ''); + assert.equal(parse('/a/b/{c,d}/e.f.g/').path.filename, ''); 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').orig, 'a/b/{c,d}/*.min.js'); + assert.equal(parse('a/b/{c,d}/*.min.js').glob, '{c,d}/*.min.js'); + assert.equal(parse('a/b/{c,d}/*.min.js').base, 'a/b'); + assert.equal(parse('a/b/{c,d}/*.min.js').path.basename, '*.min.js'); + assert.equal(parse('a/b/{c,d}/*.min.js').path.filename, '*'); 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').orig, '*.min.js'); + assert.equal(parse('*.min.js').glob, '*.min.js'); + assert.equal(parse('*.min.js').base, '.'); + assert.equal(parse('*.min.js').path.basename, '*.min.js'); + assert.equal(parse('*.min.js').path.filename, '*'); 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]').glob, '[a-j]*[^c]'); + assert.equal(parse('[a-j]*[^c]').base, '.'); 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'); + assert.equal(parse('[a-j]*[^c]').path.basename, '[a-j]*[^c]'); + assert.equal(parse('[a-j]*[^c]b/c').glob, '[a-j]*[^c]b/c'); + assert.equal(parse('[a-j]*[^c]b/c').base, '.'); + assert.equal(parse('[a-j]*[^c]bc').glob, '[a-j]*[^c]bc'); + assert.equal(parse('[a-j]*[^c]bc').base, '.'); + assert.equal(parse('[a-j]*[^c]bc').path.basename, '[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}/').orig, 'a/b/{c,d}/'); + assert.equal(parse('a/b/{c,d}/').glob, '{c,d}/'); + assert.equal(parse('a/b/{c,d}/').base, 'a/b'); assert.equal(parse('a/b/{c,d}/').path.basename, ''); + assert.equal(parse('a/b/{c,d}/').path.filename, ''); 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}/').orig, '/a/b/{c,d}/'); + assert.equal(parse('/a/b/{c,d}/').glob, '{c,d}/'); + assert.equal(parse('/a/b/{c,d}/').base, '/a/b'); assert.equal(parse('/a/b/{c,d}/').path.basename, ''); + assert.equal(parse('/a/b/{c,d}/').path.filename, ''); 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').orig, 'a/b/{c,d}/e/f.g'); + assert.equal(parse('a/b/{c,d}/e/f.g').glob, '{c,d}/e/f.g'); + assert.equal(parse('a/b/{c,d}/e/f.g').base, 'a/b'); + assert.equal(parse('a/b/{c,d}/e/f.g').path.basename, 'f.g'); + assert.equal(parse('a/b/{c,d}/e/f.g').path.filename, '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').orig, 'a/b/{c,./d}/e/f.g'); + assert.equal(parse('a/b/{c,./d}/e/f.g').glob, '{c,./d}/e/f.g'); + assert.equal(parse('a/b/{c,./d}/e/f.g').base, 'a/b'); + assert.equal(parse('a/b/{c,./d}/e/f.g').path.basename, 'f.g'); + assert.equal(parse('a/b/{c,./d}/e/f.g').path.filename, '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').orig, 'a/b/{c,/d}/e/f.g'); + assert.equal(parse('a/b/{c,/d}/e/f.g').glob, '{c,/d}/e/f.g'); + assert.equal(parse('a/b/{c,/d}/e/f.g').base, 'a/b'); + assert.equal(parse('a/b/{c,/d}/e/f.g').path.basename, 'f.g'); + assert.equal(parse('a/b/{c,/d}/e/f.g').path.filename, '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'); @@ -780,23 +879,24 @@ describe('path parts:', function () { 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'); + assert.equal(parse('/a/b/{c,d}/*.js').orig, '/a/b/{c,d}/*.js'); + assert.equal(parse('/a/b/{c,d}/*.js').orig, '/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'); + assert.equal(parse('/a/b/{c,d}/*.js').base, '/a/b'); + assert.equal(parse('/a/b/{c,d}/*.min.js').base, '/a/b'); + assert.equal(parse('/a/b/{c,d}/*.min.js').glob, '{c,d}/*.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, '*'); + assert.equal(parse('/a/b/{c,d}/*.js').path.basename, '*.js'); + assert.equal(parse('/a/b/{c,d}/*.min.js').path.basename, '*.min.js'); + }); + + it('should extract the filename', function () { + assert.equal(parse('/a/b/{c,d}/*.js').path.filename, '*'); + assert.equal(parse('/a/b/{c,d}/*.min.js').path.filename, '*'); }); it('should extract extname', function () { @@ -810,232 +910,130 @@ describe('path parts:', function () { }); }); - 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').glob, 'c'); + assert.equal(parse('a/b/c').base, '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/').glob, ''); + assert.equal(parse('a/b/c/').base, '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').glob, 'c'); + assert.equal(parse('/a/b/c').base, '/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/').glob, ''); + assert.equal(parse('/a/b/c/').base, '/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'); + describe('dotfiles:', function () { + it('should know when the file is a dotfile:', function () { + assert.equal(parse('a/b/.gitignore').is.dotfile, true); + 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 work brace patterns:', function () { + assert.equal(parse('a/b/.{foo,bar}').orig, 'a/b/.{foo,bar}'); + assert.equal(parse('a/b/.{foo,bar}').glob, '.{foo,bar}'); + assert.equal(parse('a/b/.{foo,bar}').base, 'a/b'); + assert.equal(parse('a/b/.{c,/.gitignore}').orig, 'a/b/.{c,/.gitignore}'); + assert.equal(parse('a/b/.{c,/.gitignore}').glob, '.{c,/.gitignore}'); + assert.equal(parse('a/b/.{c,/.gitignore}').base, 'a/b'); + assert.equal(parse('a/b/.{c,.gitignore}').orig, 'a/b/.{c,.gitignore}'); + assert.equal(parse('a/b/.{c,.gitignore}').glob, '.{c,.gitignore}'); + assert.equal(parse('a/b/.{c,.gitignore}').base, 'a/b'); + }); + }); + + describe('dotdirs:', function () { + it('should know when the file is a dot-directory:', function () { + assert.equal(parse('a/b/.git/config').is.dotdir, true); + 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 work with braces in the dirname:', function () { + // assert.equal(parse('a/b/.{foo,bar}/foo.js').is.dotdir, true); + assert.equal(parse('a/b/.{foo,bar}/foo.js').orig, 'a/b/.{foo,bar}/foo.js'); + assert.equal(parse('a/b/.{foo,bar}/foo.js').glob, '.{foo,bar}/foo.js'); + assert.equal(parse('a/b/.{foo,bar}/foo.js').base, 'a/b'); + }); }); }); 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'); + assert.equal(parse('[a-c]b*').glob, '[a-c]b*'); + assert.equal(parse('[a-j]*[^c]').glob, '[a-j]*[^c]'); + assert.equal(parse('[a-j]*[^c]').base, '.'); + assert.equal(parse('[a-j]*[^c]b/c').glob, '[a-j]*[^c]b/c'); + assert.equal(parse('[a-j]*[^c]bc').glob, '[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, ''); + assert.equal(parse('[a-c]b*').glob, '[a-c]b*'); + assert.equal(parse('[a-c]b*').base, '.'); + assert.equal(parse('[a-j]*[^c]bc').base, '.'); }); }); 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(parse('a/b/{c,/.gitignore}').base, 'a/b'); + assert.equal(parse('a/b/{c,/.gitignore}').glob, '{c,/.gitignore}'); + assert.equal(parse('a/b/{c,/.gitignore}').orig, 'a/b/{c,/.gitignore}'); - assert.equal(getBase('a/b/{c,/gitignore}').base, 'a/b'); - assert.equal(getBase('a/b/{c,/gitignore}').pattern, '{c,/gitignore}'); + assert.equal(parse('a/b/{c,/gitignore}').base, 'a/b'); + assert.equal(parse('a/b/{c,/gitignore}').glob, '{c,/gitignore}'); - assert.equal(getBase('a/b/{c,.gitignore}').base, 'a/b'); - assert.equal(getBase('a/b/{c,.gitignore}').pattern, '{c,.gitignore}'); + assert.equal(parse('a/b/{c,.gitignore}').base, 'a/b'); + assert.equal(parse('a/b/{c,.gitignore}').glob, '{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}').orig, 'a/b/{c,/.gitignore}'); + assert.equal(parse('a/b/{c,/.gitignore}').glob, '{c,/.gitignore}'); + assert.equal(parse('a/b/{c,/.gitignore}').base, 'a/b'); assert.equal(parse('a/b/{c,/.gitignore}').path.basename, '{c,/.gitignore}'); + assert.equal(parse('a/b/{c,/.gitignore}').path.filename, '{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}').orig, 'a/b/{c,/gitignore}'); + assert.equal(parse('a/b/{c,/gitignore}').glob, '{c,/gitignore}'); + assert.equal(parse('a/b/{c,/gitignore}').base, 'a/b'); assert.equal(parse('a/b/{c,/gitignore}').path.basename, '{c,/gitignore}'); + assert.equal(parse('a/b/{c,/gitignore}').path.filename, '{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}').orig, 'a/b/{c,.gitignore}'); + assert.equal(parse('a/b/{c,.gitignore}').glob, '{c,.gitignore}'); + assert.equal(parse('a/b/{c,.gitignore}').base, 'a/b'); assert.equal(parse('a/b/{c,.gitignore}').path.basename, '{c,.gitignore}'); + assert.equal(parse('a/b/{c,.gitignore}').path.filename, '{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}'); + parse('a/b/c/**/*.{yml,json}') }); });