This commit is contained in:
jonschlinkert 2015-03-04 16:46:48 -05:00
parent 6f478f9e37
commit 7f2f5a143b
3 changed files with 68 additions and 112 deletions

View File

@ -1,12 +1,13 @@
/*!
* parse-glob <https://github.com/jonschlinkert/parse-glob>
*
* Copyright (c) 2015 Jon Schlinkert.
* Licensed under the MIT license.
* Copyright (c) 2015, Jon Schlinkert.
* Licensed under the MIT License.
*/
'use strict';
var findBase = require('glob-base');
var pathRe = require('glob-path-regex');
var isGlob = require('is-glob');
@ -32,8 +33,8 @@ module.exports = function (pattern, getbase) {
function parseGlob(pattern, getbase) {
var glob = pattern;
var path = {};
var tok = {path: {}, is: {}, match: {}};
var path = {};
// store original pattern
tok.original = pattern;
@ -41,9 +42,9 @@ function parseGlob(pattern, getbase) {
path.whole = tok.pattern;
// Boolean values
tok.is.glob = isGlob(glob);
tok.is.negated = glob.charAt(0) === '!';
tok.is.globstar = glob.indexOf('**') !== -1;
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) {
@ -93,7 +94,6 @@ function parseGlob(pattern, getbase) {
}
path.ext = path.extname.split('.').slice(-1)[0];
// remove any escaping that was applied for braces
if (braces) {
path = unscapeBraces(path);
@ -106,7 +106,7 @@ function parseGlob(pattern, getbase) {
// get the `base` from glob pattern
if (getbase) {
var segs = findBase(tok);
var segs = findBase(tok.pattern);
tok.pattern = segs.pattern;
tok.base = segs.base;
@ -159,44 +159,6 @@ function unscapeBraces(path) {
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.
@ -240,10 +202,3 @@ function unescape(str) {
str = str.split('__ESC_DOT__').join('.');
return str;
}
function trim(str, ch) {
if (str.slice(-ch.length)[0] === ch) {
return str.slice(0, str.length - ch.length);
}
return str;
}

View File

@ -1,7 +1,7 @@
{
"name": "parse-glob",
"description": "Parse a glob pattern into an object of tokens.",
"version": "2.0.1",
"version": "2.1.0",
"homepage": "https://github.com/jonschlinkert/parse-glob",
"author": {
"name": "Jon Schlinkert",
@ -29,11 +29,12 @@
"test": "mocha"
},
"dependencies": {
"glob-base": "^0.1.0",
"glob-path-regex": "^1.0.0",
"is-glob": "^1.1.0"
},
"devDependencies": {
"lodash": "^3.3.1",
"mocha": "*"
},
"keywords": []
}
}

112
test.js
View File

@ -1,8 +1,8 @@
/**
/*!
* parse-glob <https://github.com/jonschlinkert/parse-glob>
*
* Copyright (c) 2015 Jon Schlinkert.
* Licensed under the MIT license.
* Copyright (c) 2015, Jon Schlinkert.
* Licensed under the MIT License.
*/
'use strict';
@ -65,70 +65,70 @@ describe('`is` object:', function () {
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('.*').base, '.');
assert.equal(getBase('.*').pattern, '.*');
assert.equal(getBase('./*').base, '.');
assert.equal(getBase('./*').pattern, '*');
assert.equal(getBase('*').base, '');
assert.equal(getBase('*').base, '.');
assert.equal(getBase('*').pattern, '*');
assert.equal(getBase('**').base, '');
assert.equal(getBase('**').base, '.');
assert.equal(getBase('**').pattern, '**');
assert.equal(getBase('**/*.md').base, '');
assert.equal(getBase('**/*.md').base, '.');
assert.equal(getBase('**/*.md').pattern, '**/*.md');
assert.equal(getBase('**/*.min.js').base, '');
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').base, '.');
assert.equal(getBase('**/*foo.js').pattern, '**/*foo.js');
assert.equal(getBase('**/.*').base, '');
assert.equal(getBase('**/.*').base, '.');
assert.equal(getBase('**/.*').pattern, '**/.*');
assert.equal(getBase('**/d').base, '');
assert.equal(getBase('**/d').base, '.');
assert.equal(getBase('**/d').pattern, '**/d');
assert.equal(getBase('*.*').base, '');
assert.equal(getBase('*.*').base, '.');
assert.equal(getBase('*.*').pattern, '*.*');
assert.equal(getBase('*.js').base, '');
assert.equal(getBase('*.js').base, '.');
assert.equal(getBase('*.js').pattern, '*.js');
assert.equal(getBase('*.md').base, '');
assert.equal(getBase('*.md').base, '.');
assert.equal(getBase('*.md').pattern, '*.md');
assert.equal(getBase('*.min.js').base, '');
assert.equal(getBase('*.min.js').base, '.');
assert.equal(getBase('*.min.js').pattern, '*.min.js');
assert.equal(getBase('*/*').base, '');
assert.equal(getBase('*/*').base, '.');
assert.equal(getBase('*/*').pattern, '*/*');
assert.equal(getBase('*/*/*/*').base, '');
assert.equal(getBase('*/*/*/*').base, '.');
assert.equal(getBase('*/*/*/*').pattern, '*/*/*/*');
assert.equal(getBase('*/*/*/e').base, '');
assert.equal(getBase('*/*/*/e').base, '.');
assert.equal(getBase('*/*/*/e').pattern, '*/*/*/e');
assert.equal(getBase('*/b/*/e').base, '');
assert.equal(getBase('*/b/*/e').base, '.');
assert.equal(getBase('*/b/*/e').pattern, '*/b/*/e');
assert.equal(getBase('*b').base, '');
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').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').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').base, './node_modules');
assert.equal(getBase('./node_modules/*-glob/**/*.js').pattern, '*-glob/**/*.js');
assert.equal(getBase('a/b/{c,/.gitignore}').base, 'a/b');
@ -152,14 +152,14 @@ describe('should get a base path:', 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*').base, '');
assert.equal(getBase('.a*').base, '.');
assert.equal(getBase('.a*').pattern, '.a*');
assert.equal(getBase('.b*').base, '');
assert.equal(getBase('.b*').base, '.');
assert.equal(getBase('.b*').pattern, '.b*');
assert.equal(getBase('/*').base, '');
assert.equal(getBase('/*').pattern, '/*');
assert.equal(getBase('/*').base, '/');
assert.equal(getBase('/*').pattern, '*');
assert.equal(getBase('a/***').base, 'a');
assert.equal(getBase('a/***').pattern, '***');
@ -225,46 +225,46 @@ describe('should get a base path:', function () {
});
it('negation pattern:', function () {
assert.equal(getBase('!*.min.js').base, '');
assert.equal(getBase('!*.min.js').base, '.');
assert.equal(getBase('!*.min.js').pattern, '!*.min.js');
assert.equal(getBase('!foo').base, '');
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').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').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').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,/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(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/}').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}/').base, '/a/b');
assert.equal(getBase('/a/b/{c,d}/').pattern, '{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}/*.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, '');
assert.equal(getBase('/a/b/{c,d}/*.min.js').pattern, '/a/b/{c,d}/*.min.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, '');
assert.equal(getBase('/a/b/{c,d}/e.f.g/').pattern, '/a/b/{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('{.,*}').base, '');
assert.equal(getBase('{.,*}').base, '.');
assert.equal(getBase('{.,*}').pattern, '{.,*}');
});
@ -337,19 +337,19 @@ describe('should get a base path:', function () {
});
it('character classes:', function () {
assert.equal(getBase('[a-c]b*').base, '');
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]').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').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').base, '.');
assert.equal(getBase('[a-j]*[^c]bc').pattern, '[a-j]*[^c]bc');
assert.equal(getBase('[ab][ab]').base, '');
assert.equal(getBase('[ab][ab]').base, '.');
assert.equal(getBase('[ab][ab]').pattern, '[ab][ab]');
assert.equal(getBase('foo/[a-b].min.js').base, 'foo');
@ -357,25 +357,25 @@ describe('should get a base path:', function () {
});
it('qmarks:', function () {
assert.equal(getBase('?').base, '');
assert.equal(getBase('?').base, '.');
assert.equal(getBase('?').pattern, '?');
assert.equal(getBase('?/?').base, '');
assert.equal(getBase('?/?').base, '.');
assert.equal(getBase('?/?').pattern, '?/?');
assert.equal(getBase('??').base, '');
assert.equal(getBase('??').base, '.');
assert.equal(getBase('??').pattern, '??');
assert.equal(getBase('???').base, '');
assert.equal(getBase('???').base, '.');
assert.equal(getBase('???').pattern, '???');
assert.equal(getBase('?a').base, '');
assert.equal(getBase('?a').base, '.');
assert.equal(getBase('?a').pattern, '?a');
assert.equal(getBase('?b').base, '');
assert.equal(getBase('?b').base, '.');
assert.equal(getBase('?b').pattern, '?b');
assert.equal(getBase('a?b').base, '');
assert.equal(getBase('a?b').base, '.');
assert.equal(getBase('a?b').pattern, 'a?b');
assert.equal(getBase('a/?/c.js').base, 'a');