diff --git a/index.js b/index.js index 35c8ee8..98edf0c 100644 --- a/index.js +++ b/index.js @@ -1,12 +1,13 @@ /*! * 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; -} diff --git a/package.json b/package.json index b389a74..c587d67 100644 --- a/package.json +++ b/package.json @@ -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": [] + } } diff --git a/test.js b/test.js index b52177b..e2b0f36 100644 --- a/test.js +++ b/test.js @@ -1,8 +1,8 @@ -/** +/*! * 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');