You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
3.5 KiB
150 lines
3.5 KiB
/*! |
|
* is-glob <https://github.com/jonschlinkert/is-glob> |
|
* |
|
* Copyright (c) 2014-2017, Jon Schlinkert. |
|
* Released under the MIT License. |
|
*/ |
|
|
|
var isExtglob = require('is-extglob'); |
|
var chars = { '{': '}', '(': ')', '[': ']'}; |
|
var strictCheck = function(str) { |
|
if (str[0] === '!') { |
|
return true; |
|
} |
|
var index = 0; |
|
var pipeIndex = -2; |
|
var closeSquareIndex = -2; |
|
var closeCurlyIndex = -2; |
|
var closeParenIndex = -2; |
|
var backSlashIndex = -2; |
|
while (index < str.length) { |
|
if (str[index] === '*') { |
|
return true; |
|
} |
|
|
|
if (str[index + 1] === '?' && /[\].+)]/.test(str[index])) { |
|
return true; |
|
} |
|
|
|
if (closeSquareIndex !== -1 && str[index] === '[' && str[index + 1] !== ']') { |
|
if (closeSquareIndex < index) { |
|
closeSquareIndex = str.indexOf(']', index); |
|
} |
|
if (closeSquareIndex > index) { |
|
if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) { |
|
return true; |
|
} |
|
backSlashIndex = str.indexOf('\\', index); |
|
if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) { |
|
return true; |
|
} |
|
} |
|
} |
|
|
|
if (closeCurlyIndex !== -1 && str[index] === '{' && str[index + 1] !== '}') { |
|
closeCurlyIndex = str.indexOf('}', index); |
|
if (closeCurlyIndex > index) { |
|
backSlashIndex = str.indexOf('\\', index); |
|
if (backSlashIndex === -1 || backSlashIndex > closeCurlyIndex) { |
|
return true; |
|
} |
|
} |
|
} |
|
|
|
if (closeParenIndex !== -1 && str[index] === '(' && str[index + 1] === '?' && /[:!=]/.test(str[index + 2]) && str[index + 3] !== ')') { |
|
closeParenIndex = str.indexOf(')', index); |
|
if (closeParenIndex > index) { |
|
backSlashIndex = str.indexOf('\\', index); |
|
if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) { |
|
return true; |
|
} |
|
} |
|
} |
|
|
|
if (pipeIndex !== -1 && str[index] === '(' && str[index + 1] !== '|') { |
|
if (pipeIndex < index) { |
|
pipeIndex = str.indexOf('|', index); |
|
} |
|
if (pipeIndex !== -1 && str[pipeIndex + 1] !== ')') { |
|
closeParenIndex = str.indexOf(')', pipeIndex); |
|
if (closeParenIndex > pipeIndex) { |
|
backSlashIndex = str.indexOf('\\', pipeIndex); |
|
if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) { |
|
return true; |
|
} |
|
} |
|
} |
|
} |
|
|
|
if (str[index] === '\\') { |
|
var open = str[index + 1]; |
|
index += 2; |
|
var close = chars[open]; |
|
|
|
if (close) { |
|
var n = str.indexOf(close, index); |
|
if (n !== -1) { |
|
index = n + 1; |
|
} |
|
} |
|
|
|
if (str[index] === '!') { |
|
return true; |
|
} |
|
} else { |
|
index++; |
|
} |
|
} |
|
return false; |
|
}; |
|
|
|
var relaxedCheck = function(str) { |
|
if (str[0] === '!') { |
|
return true; |
|
} |
|
var index = 0; |
|
while (index < str.length) { |
|
if (/[*?{}()[\]]/.test(str[index])) { |
|
return true; |
|
} |
|
|
|
if (str[index] === '\\') { |
|
var open = str[index + 1]; |
|
index += 2; |
|
var close = chars[open]; |
|
|
|
if (close) { |
|
var n = str.indexOf(close, index); |
|
if (n !== -1) { |
|
index = n + 1; |
|
} |
|
} |
|
|
|
if (str[index] === '!') { |
|
return true; |
|
} |
|
} else { |
|
index++; |
|
} |
|
} |
|
return false; |
|
}; |
|
|
|
module.exports = function isGlob(str, options) { |
|
if (typeof str !== 'string' || str === '') { |
|
return false; |
|
} |
|
|
|
if (isExtglob(str)) { |
|
return true; |
|
} |
|
|
|
var check = strictCheck; |
|
|
|
// optionally relax check |
|
if (options && options.strict === false) { |
|
check = relaxedCheck; |
|
} |
|
|
|
return check(str); |
|
};
|
|
|