| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 | 
							- /*
 
- 	MIT License http://www.opensource.org/licenses/mit-license.php
 
- 	Author Tobias Koppers @sokra
 
- */
 
- "use strict";
 
- function globToRegExp(glob) {
 
- 	// * [^\\\/]*
 
- 	// /**/ /.+/
 
- 	// ^* \./.+ (concord special)
 
- 	// ? [^\\\/]
 
- 	// [!...] [^...]
 
- 	// [^...] [^...]
 
- 	// / [\\\/]
 
- 	// {...,...} (...|...)
 
- 	// ?(...|...) (...|...)?
 
- 	// +(...|...) (...|...)+
 
- 	// *(...|...) (...|...)*
 
- 	// @(...|...) (...|...)
 
- 	if (/^\(.+\)$/.test(glob)) {
 
- 		// allow to pass an RegExp in brackets
 
- 		return new RegExp(glob.substr(1, glob.length - 2));
 
- 	}
 
- 	const tokens = tokenize(glob);
 
- 	const process = createRoot();
 
- 	const regExpStr = tokens.map(process).join("");
 
- 	return new RegExp("^" + regExpStr + "$");
 
- }
 
- const SIMPLE_TOKENS = {
 
- 	"@(": "one",
 
- 	"?(": "zero-one",
 
- 	"+(": "one-many",
 
- 	"*(": "zero-many",
 
- 	"|": "segment-sep",
 
- 	"/**/": "any-path-segments",
 
- 	"**": "any-path",
 
- 	"*": "any-path-segment",
 
- 	"?": "any-char",
 
- 	"{": "or",
 
- 	"/": "path-sep",
 
- 	",": "comma",
 
- 	")": "closing-segment",
 
- 	"}": "closing-or"
 
- };
 
- function tokenize(glob) {
 
- 	return glob
 
- 		.split(
 
- 			/([@?+*]\(|\/\*\*\/|\*\*|[?*]|\[[!^]?(?:[^\]\\]|\\.)+\]|\{|,|\/|[|)}])/g
 
- 		)
 
- 		.map(item => {
 
- 			if (!item) return null;
 
- 			const t = SIMPLE_TOKENS[item];
 
- 			if (t) {
 
- 				return {
 
- 					type: t
 
- 				};
 
- 			}
 
- 			if (item[0] === "[") {
 
- 				if (item[1] === "^" || item[1] === "!") {
 
- 					return {
 
- 						type: "inverted-char-set",
 
- 						value: item.substr(2, item.length - 3)
 
- 					};
 
- 				} else {
 
- 					return {
 
- 						type: "char-set",
 
- 						value: item.substr(1, item.length - 2)
 
- 					};
 
- 				}
 
- 			}
 
- 			return {
 
- 				type: "string",
 
- 				value: item
 
- 			};
 
- 		})
 
- 		.filter(Boolean)
 
- 		.concat({
 
- 			type: "end"
 
- 		});
 
- }
 
- function createRoot() {
 
- 	const inOr = [];
 
- 	const process = createSeqment();
 
- 	let initial = true;
 
- 	return function(token) {
 
- 		switch (token.type) {
 
- 			case "or":
 
- 				inOr.push(initial);
 
- 				return "(";
 
- 			case "comma":
 
- 				if (inOr.length) {
 
- 					initial = inOr[inOr.length - 1];
 
- 					return "|";
 
- 				} else {
 
- 					return process(
 
- 						{
 
- 							type: "string",
 
- 							value: ","
 
- 						},
 
- 						initial
 
- 					);
 
- 				}
 
- 			case "closing-or":
 
- 				if (inOr.length === 0) throw new Error("Unmatched '}'");
 
- 				inOr.pop();
 
- 				return ")";
 
- 			case "end":
 
- 				if (inOr.length) throw new Error("Unmatched '{'");
 
- 				return process(token, initial);
 
- 			default: {
 
- 				const result = process(token, initial);
 
- 				initial = false;
 
- 				return result;
 
- 			}
 
- 		}
 
- 	};
 
- }
 
- function createSeqment() {
 
- 	const inSeqment = [];
 
- 	const process = createSimple();
 
- 	return function(token, initial) {
 
- 		switch (token.type) {
 
- 			case "one":
 
- 			case "one-many":
 
- 			case "zero-many":
 
- 			case "zero-one":
 
- 				inSeqment.push(token.type);
 
- 				return "(";
 
- 			case "segment-sep":
 
- 				if (inSeqment.length) {
 
- 					return "|";
 
- 				} else {
 
- 					return process(
 
- 						{
 
- 							type: "string",
 
- 							value: "|"
 
- 						},
 
- 						initial
 
- 					);
 
- 				}
 
- 			case "closing-segment": {
 
- 				const segment = inSeqment.pop();
 
- 				switch (segment) {
 
- 					case "one":
 
- 						return ")";
 
- 					case "one-many":
 
- 						return ")+";
 
- 					case "zero-many":
 
- 						return ")*";
 
- 					case "zero-one":
 
- 						return ")?";
 
- 				}
 
- 				throw new Error("Unexcepted segment " + segment);
 
- 			}
 
- 			case "end":
 
- 				if (inSeqment.length > 0) {
 
- 					throw new Error("Unmatched segment, missing ')'");
 
- 				}
 
- 				return process(token, initial);
 
- 			default:
 
- 				return process(token, initial);
 
- 		}
 
- 	};
 
- }
 
- function createSimple() {
 
- 	return function(token, initial) {
 
- 		switch (token.type) {
 
- 			case "path-sep":
 
- 				return "[\\\\/]+";
 
- 			case "any-path-segments":
 
- 				return "[\\\\/]+(?:(.+)[\\\\/]+)?";
 
- 			case "any-path":
 
- 				return "(.*)";
 
- 			case "any-path-segment":
 
- 				if (initial) {
 
- 					return "\\.[\\\\/]+(?:.*[\\\\/]+)?([^\\\\/]+)";
 
- 				} else {
 
- 					return "([^\\\\/]*)";
 
- 				}
 
- 			case "any-char":
 
- 				return "[^\\\\/]";
 
- 			case "inverted-char-set":
 
- 				return "[^" + token.value + "]";
 
- 			case "char-set":
 
- 				return "[" + token.value + "]";
 
- 			case "string":
 
- 				return token.value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
 
- 			case "end":
 
- 				return "";
 
- 			default:
 
- 				throw new Error("Unsupported token '" + token.type + "'");
 
- 		}
 
- 	};
 
- }
 
- exports.globToRegExp = globToRegExp;
 
 
  |