@@ -403,7 +403,7 @@ var require_ast = __commonJS({ |
403 | 403 | var unescape_js_12 = require_unescape(); |
404 | 404 | var types = /* @__PURE__ */ new Set(["!", "?", "+", "*", "@"]); |
405 | 405 | var isExtglobType = (c) => types.has(c); |
406 | | - var startNoTraversal = "(?!\\.\\.?(?:$|/))"; |
| 406 | + var startNoTraversal = "(?!(?:^|/)\\.\\.?(?:$|/))"; |
407 | 407 | var startNoDot = "(?!\\.)"; |
408 | 408 | var addPatternStart = /* @__PURE__ */ new Set(["[", "."]); |
409 | 409 | var justDots = /* @__PURE__ */ new Set(["..", "."]); |
@@ -412,10 +412,11 @@ var require_ast = __commonJS({ |
412 | 412 | var qmark2 = "[^/]"; |
413 | 413 | var star2 = qmark2 + "*?"; |
414 | 414 | var starNoEmpty = qmark2 + "+?"; |
415 | | - var _root, _hasMagic, _uflag, _parts, _parent, _parentIndex, _negs, _filledNegs, _options, _toString, _emptyExt, _fillNegs, fillNegs_fn, _parseAST, parseAST_fn, _parseGlob, parseGlob_fn; |
| 415 | + var _root, _hasMagic, _uflag, _parts, _parent, _parentIndex, _negs, _filledNegs, _options, _toString, _emptyExt, _fillNegs, fillNegs_fn, _parseAST, parseAST_fn, _partsToRegExp, partsToRegExp_fn, _parseGlob, parseGlob_fn; |
416 | 416 | var _AST = class { |
417 | 417 | constructor(type, parent, options = {}) { |
418 | 418 | __privateAdd(this, _fillNegs); |
| 419 | + __privateAdd(this, _partsToRegExp); |
419 | 420 | __publicField(this, "type"); |
420 | 421 | __privateAdd(this, _root, void 0); |
421 | 422 | __privateAdd(this, _hasMagic, void 0); |
@@ -614,14 +615,15 @@ var require_ast = __commonJS({ |
614 | 615 | // - Since the start for a join is eg /(?!\.) and the start for a part |
615 | 616 | // is ^(?!\.), we can just prepend (?!\.) to the pattern (either root |
616 | 617 | // or start or whatever) and prepend ^ or / at the Regexp construction. |
617 | | - toRegExpSource() { |
| 618 | + toRegExpSource(allowDot) { |
| 619 | + const dot = allowDot ?? !!__privateGet(this, _options).dot; |
618 | 620 | if (__privateGet(this, _root) === this) |
619 | 621 | __privateMethod(this, _fillNegs, fillNegs_fn).call(this); |
620 | 622 | if (!this.type) { |
621 | 623 | const noEmpty = this.isStart() && this.isEnd(); |
622 | 624 | const src = __privateGet(this, _parts).map((p) => { |
623 | 625 | var _a; |
624 | | - const [re, _, hasMagic, uflag] = typeof p === "string" ? __privateMethod(_a = _AST, _parseGlob, parseGlob_fn).call(_a, p, __privateGet(this, _hasMagic), noEmpty) : p.toRegExpSource(); |
| 626 | + const [re, _, hasMagic, uflag] = typeof p === "string" ? __privateMethod(_a = _AST, _parseGlob, parseGlob_fn).call(_a, p, __privateGet(this, _hasMagic), noEmpty) : p.toRegExpSource(allowDot); |
625 | 627 | __privateSet(this, _hasMagic, __privateGet(this, _hasMagic) || hasMagic); |
626 | 628 | __privateSet(this, _uflag, __privateGet(this, _uflag) || uflag); |
627 | 629 | return re; |
@@ -634,11 +636,11 @@ var require_ast = __commonJS({ |
634 | 636 | const aps = addPatternStart; |
635 | 637 | const needNoTrav = ( |
636 | 638 | // dots are allowed, and the pattern starts with [ or . |
637 | | - __privateGet(this, _options).dot && aps.has(src.charAt(0)) || // the pattern starts with \., and then [ or . |
| 639 | + dot && aps.has(src.charAt(0)) || // the pattern starts with \., and then [ or . |
638 | 640 | src.startsWith("\\.") && aps.has(src.charAt(2)) || // the pattern starts with \.\., and then [ or . |
639 | 641 | src.startsWith("\\.\\.") && aps.has(src.charAt(4)) |
640 | 642 | ); |
641 | | - const needNoDot = !__privateGet(this, _options).dot && aps.has(src.charAt(0)); |
| 643 | + const needNoDot = !dot && !allowDot && aps.has(src.charAt(0)); |
642 | 644 | start2 = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : ""; |
643 | 645 | } |
644 | 646 | } |
@@ -655,30 +657,31 @@ var require_ast = __commonJS({ |
655 | 657 | __privateGet(this, _uflag) |
656 | 658 | ]; |
657 | 659 | } |
| 660 | + const repeated = this.type === "*" || this.type === "+"; |
658 | 661 | const start = this.type === "!" ? "(?:(?!(?:" : "(?:"; |
659 | | - const body = __privateGet(this, _parts).map((p) => { |
660 | | - if (typeof p === "string") { |
661 | | - throw new Error("string type in extglob ast??"); |
662 | | - } |
663 | | - const [re, _, _hasMagic2, uflag] = p.toRegExpSource(); |
664 | | - __privateSet(this, _uflag, __privateGet(this, _uflag) || uflag); |
665 | | - return re; |
666 | | - }).filter((p) => !(this.isStart() && this.isEnd()) || !!p).join("|"); |
| 662 | + let body = __privateMethod(this, _partsToRegExp, partsToRegExp_fn).call(this, dot); |
667 | 663 | if (this.isStart() && this.isEnd() && !body && this.type !== "!") { |
668 | 664 | const s = this.toString(); |
669 | 665 | __privateSet(this, _parts, [s]); |
670 | 666 | this.type = null; |
671 | 667 | __privateSet(this, _hasMagic, void 0); |
672 | 668 | return [s, (0, unescape_js_12.unescape)(this.toString()), false, false]; |
673 | 669 | } |
| 670 | + let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot ? "" : __privateMethod(this, _partsToRegExp, partsToRegExp_fn).call(this, true); |
| 671 | + if (bodyDotAllowed === body) { |
| 672 | + bodyDotAllowed = ""; |
| 673 | + } |
| 674 | + if (bodyDotAllowed) { |
| 675 | + body = `(?:${body})(?:${bodyDotAllowed})*?`; |
| 676 | + } |
674 | 677 | let final = ""; |
675 | 678 | if (this.type === "!" && __privateGet(this, _emptyExt)) { |
676 | | - final = (this.isStart() && !__privateGet(this, _options).dot ? startNoDot : "") + starNoEmpty; |
| 679 | + final = (this.isStart() && !dot ? startNoDot : "") + starNoEmpty; |
677 | 680 | } else { |
678 | 681 | const close = this.type === "!" ? ( |
679 | 682 | // !() must match something,but !(x) can match '' |
680 | | - "))" + (this.isStart() && !__privateGet(this, _options).dot ? startNoDot : "") + star2 + ")" |
681 | | - ) : this.type === "@" ? ")" : `)${this.type}`; |
| 683 | + "))" + (this.isStart() && !dot && !allowDot ? startNoDot : "") + star2 + ")" |
| 684 | + ) : this.type === "@" ? ")" : this.type === "?" ? ")?" : this.type === "+" && bodyDotAllowed ? ")" : this.type === "*" && bodyDotAllowed ? `)?` : `)${this.type}`; |
682 | 685 | final = start + body + close; |
683 | 686 | } |
684 | 687 | return [ |
@@ -836,6 +839,17 @@ var require_ast = __commonJS({ |
836 | 839 | __privateSet(ast, _parts, [str.substring(pos - 1)]); |
837 | 840 | return i; |
838 | 841 | }; |
| 842 | + _partsToRegExp = new WeakSet(); |
| 843 | + partsToRegExp_fn = function(dot) { |
| 844 | + return __privateGet(this, _parts).map((p) => { |
| 845 | + if (typeof p === "string") { |
| 846 | + throw new Error("string type in extglob ast??"); |
| 847 | + } |
| 848 | + const [re, _, _hasMagic2, uflag] = p.toRegExpSource(dot); |
| 849 | + __privateSet(this, _uflag, __privateGet(this, _uflag) || uflag); |
| 850 | + return re; |
| 851 | + }).filter((p) => !(this.isStart() && this.isEnd()) || !!p).join("|"); |
| 852 | + }; |
839 | 853 | _parseGlob = new WeakSet(); |
840 | 854 | parseGlob_fn = function(glob, hasMagic, noEmpty = false) { |
841 | 855 | let escaping = false; |
|