glob-escape
Version:
Escape glob patterns
219 lines (190 loc) • 6.68 kB
JavaScript
;
/* global describe:false, it:false */
var chai = require('chai');
var assert = chai.assert;
var expect = chai.expect;
var esc = require('./index.js');
var minimatch = require('minimatch');
var shouldMatch = function(file, pattern) {
var matches = minimatch(file, pattern)
if (!matches) {
var msg = '"' + pattern + '" doesn\'t match "' + file + '"';
assert.fail(matches, true, msg);
}
};
var shouldNotMatch = function(file, pattern) {
var matches = minimatch(file, pattern)
if (matches) {
var msg = '"' + pattern + '" matches "' + file + '"'
fail(matches, false, msg);
}
};
describe('escapeGlob', function() {
it('should fail if pattern is not a string or array', function() {
expect(esc).to.throw(Error);
expect(esc.bind(null)).to.throw(Error);
expect(esc.bind(0)).to.throw(Error);
expect(esc.bind({})).to.throw(Error);
expect(esc.bind(/regex/)).to.throw(Error);
});
it('should escape *', function() {
shouldMatch('f*', esc('f*'));
shouldMatch('f', 'f*');
shouldNotMatch('f', esc('f*'));
shouldMatch('f*.txt', 'f*');
shouldNotMatch('f*.txt', esc('f*'));
shouldMatch('file.txt', 'f*');
shouldNotMatch('file.txt', esc('f*'));
shouldMatch('f*ile*', esc('f*ile*'));
shouldMatch('f*ile', 'f*ile*');
shouldNotMatch('f*ile', esc('f*ile*'));
shouldMatch('f*ile*.txt', 'f*ile*');
shouldNotMatch('f*ile*.txt', esc('f*ile*'));
shouldMatch('f*ile.txt', 'f*ile*');
shouldNotMatch('f*ile.txt', esc('f*ile*'));
});
it('should escape **', function() {
shouldMatch('**/f', esc('**/f'));
shouldMatch('f', '**/f');
shouldNotMatch('f', esc('**/f'));
shouldMatch('dir/f', '**/f');
shouldNotMatch('dir/f', esc('**/f'));
shouldMatch('dir/**/f', 'dir/**/f');
shouldMatch('dir/f', 'dir/**/f');
shouldNotMatch('dir/f', esc('dir/**/f'));
shouldMatch('dir/dir/f', 'dir/**/f');
shouldNotMatch('dir/dir/f', esc('dir/**/f'));
shouldMatch('**/dir/**/f', '**/dir/**/f');
shouldMatch('dir/f', '**/dir/**/f');
shouldNotMatch('dir/f', esc('**/dir/**/f'));
shouldMatch('dir/dir/f', '**/dir/**/f');
shouldNotMatch('dir/dir/f', esc('**/dir/**/f'));
shouldMatch('dir/dir/f', '**/dir/**/f');
shouldNotMatch('dir/dir/dir/f', esc('**/dir/**/f'));
});
it('should escape ?', function() {
shouldMatch('f?', esc('f?'));
shouldMatch('fa', 'f?');
shouldNotMatch('fa', esc('f?'));
shouldMatch('f?l?', esc('f?l?'));
shouldMatch('file', 'f?l?');
shouldNotMatch('file', esc('f?l?'));
});
it('should escape { }', function() {
shouldMatch('f{a,b}{a,b}', esc('f{a,b}{a,b}'));
shouldMatch('faa', 'f{a,b}{a,b}');
shouldNotMatch('faa', esc('f{a,b}{a,b}'));
shouldMatch('fab', 'f{a,b}{a,b}');
shouldNotMatch('fab', esc('f{a,b}{a,b}'));
shouldMatch('fba', 'f{a,b}{a,b}');
shouldNotMatch('fba', esc('f{a,b}{a,b}'));
shouldMatch('fbb', 'f{a,b}{a,b}');
shouldNotMatch('fbb', esc('f{a,b}{a,b}'));
shouldMatch('f{1..3}', esc('f{1..3}'));
shouldMatch('f1', 'f{1..3}');
shouldNotMatch('f1', esc('f{1..3}'));
shouldMatch('f2', 'f{1..3}');
shouldNotMatch('f2', esc('f{1..3}'));
shouldMatch('f3', 'f{1..3}');
shouldNotMatch('f3', esc('f{1..3}'));
});
it('should escape [ ]', function() {
shouldMatch('f[ab][ab]', esc('f[ab][ab]'));
shouldMatch('faa', 'f[ab][ab]');
shouldNotMatch('faa', esc('f[ab][ab]'));
shouldMatch('fab', 'f[ab][ab]');
shouldNotMatch('fab', esc('f[ab][ab]'));
shouldMatch('fba', 'f[ab][ab]');
shouldNotMatch('fba', esc('f[ab][ab]'));
shouldMatch('fbb', 'f[ab][ab]');
shouldNotMatch('fbb', esc('f[ab][ab]'));
});
it('should escape !( | )', function() {
shouldMatch('f!(a|b)!(a|b)', esc('f!(a|b)!(a|b)'));
shouldMatch('fcc', 'f!(a|b)!(a|b)');
shouldNotMatch('fcc', esc('f!(a|b)!(a|b)'));
});
it('should escape ?( | )', function() {
shouldMatch('f?(a|b)?(a|b)', esc('f?(a|b)?(a|b)'));
shouldMatch('fa', 'f?(a|b)?(a|b)');
shouldNotMatch('fa', esc('f?(a|b)?(a|b)'));
shouldMatch('fb', 'f?(a|b)?(a|b)');
shouldNotMatch('fb', esc('f?(a|b)?(a|b)'));
shouldMatch('faa', 'f?(a|b)?(a|b)');
shouldNotMatch('faa', esc('f?(a|b)?(a|b)'));
shouldMatch('fab', 'f?(a|b)?(a|b)');
shouldNotMatch('fab', esc('f?(a|b)?(a|b)'));
shouldMatch('fba', 'f?(a|b)?(a|b)');
shouldNotMatch('fba', esc('f?(a|b)?(a|b)'));
shouldMatch('fbb', 'f?(a|b)?(a|b)');
shouldNotMatch('fbb', esc('f?(a|b)?(a|b)'));
});
it('should escape +( | )', function() {
shouldMatch('f+(a|b)', esc('f+(a|b)'));
shouldMatch('fa', 'f+(a|b)');
shouldNotMatch('fa', esc('f+(a|b)'));
shouldMatch('fb', 'f+(a|b)');
shouldNotMatch('fb', esc('f+(a|b)'));
shouldMatch('faa', 'f+(a|b)');
shouldNotMatch('faa', esc('f+(a|b)'));
shouldMatch('fab', 'f+(a|b)');
shouldNotMatch('fab', esc('f+(a|b)'));
shouldMatch('fba', 'f+(a|b)');
shouldNotMatch('fba', esc('f+(a|b)'));
shouldMatch('fbb', 'f+(a|b)');
shouldNotMatch('fbb', esc('f+(a|b)'));
});
it('should escape *( | )', function() {
shouldMatch('f*(a|b)', esc('f*(a|b)'));
shouldMatch('f', 'f*(a|b)');
shouldNotMatch('f', esc('f*(a|b)'));
shouldMatch('fa', 'f*(a|b)');
shouldNotMatch('fa', esc('f*(a|b)'));
shouldMatch('fb', 'f*(a|b)');
shouldNotMatch('fb', esc('f*(a|b)'));
shouldMatch('faa', 'f*(a|b)');
shouldNotMatch('faa', esc('f*(a|b)'));
shouldMatch('fab', 'f*(a|b)');
shouldNotMatch('fab', esc('f*(a|b)'));
shouldMatch('fba', 'f*(a|b)');
shouldNotMatch('fba', esc('f*(a|b)'));
shouldMatch('fbb', 'f*(a|b)');
shouldNotMatch('fbb', esc('f*(a|b)'));
});
it('should escape @( | )', function() {
shouldMatch('f@(ab|ba)', esc('f@(ab|ba)'));
shouldMatch('fab', 'f@(ab|ba)');
shouldNotMatch('fab', esc('f@(ab|ba)'));
shouldMatch('fba', 'f@(ab|ba)');
shouldNotMatch('fbb', esc('f@(ab|ba)'));
});
it('should escape !', function() {
shouldMatch('!f', esc('!f'));
shouldMatch('x', '!f');
shouldNotMatch('x', esc('!f'));
});
it('should escape \\', function() {
shouldMatch('f\\x', esc('f\\x'));
shouldMatch('fx', 'f\\x');
shouldNotMatch('fx', esc('f\\x'));
});
it('should escape arrays', function() {
var pattern = [
'f*',
'f*ile*',
'f?l?',
'**/f',
'dir/**/f',
'**/dir/**/f',
'f{a,b}{a,b}',
'f{1..3}',
'f[ab][ab]',
'f!(a|b)!(a|b)',
'f?(a|b)?(a|b)',
'f+(a|b)',
'f*(a|b)',
'f@(ab|ba)'
];
expect(esc(pattern)).to.eql(pattern.map(esc));
});
});