summaryrefslogtreecommitdiffstats
path: root/node_modules/enhanced-resolve/lib/globToRegExp.js
diff options
context:
space:
mode:
authorGravatar Piotr Russ <mail@pruss.it> 2020-11-16 00:10:28 +0100
committerGravatar Piotr Russ <mail@pruss.it> 2020-11-16 00:10:28 +0100
commite06ec920f7a5d784e674c4c4b4e6d1da3dc7391d (patch)
tree55713f725f77b44ebfec86e4eec3ce33e71458ca /node_modules/enhanced-resolve/lib/globToRegExp.js
downloadwebsite_creator-e06ec920f7a5d784e674c4c4b4e6d1da3dc7391d.tar.gz
website_creator-e06ec920f7a5d784e674c4c4b4e6d1da3dc7391d.tar.bz2
website_creator-e06ec920f7a5d784e674c4c4b4e6d1da3dc7391d.zip
api, login, auth
Diffstat (limited to 'node_modules/enhanced-resolve/lib/globToRegExp.js')
-rw-r--r--node_modules/enhanced-resolve/lib/globToRegExp.js201
1 files changed, 201 insertions, 0 deletions
diff --git a/node_modules/enhanced-resolve/lib/globToRegExp.js b/node_modules/enhanced-resolve/lib/globToRegExp.js
new file mode 100644
index 0000000..480b64c
--- /dev/null
+++ b/node_modules/enhanced-resolve/lib/globToRegExp.js
@@ -0,0 +1,201 @@
+/*
+ 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;