Team Ai
Datasetpublic

Brunobkr/llama.cpp_AlgMor24_github

ΩFFFΣLLIa • llama.cpp • AlgMor24 ██████╗ ███████╗███████╗███████╗██╗ ██╗ ██╗ █████╗ ██╔═══██╗██╔════╝██╔════╝██╔════╝██║ ██║ ██║██╔══██╗ ██║ ██║█████╗ █████╗ █████╗ ██║ ██║ ██║███████║ ██║ ██║██╔══╝ ██╔══╝ ██╔══╝ ██║ ██║ ██║██╔══██║ ╚██████╔╝██║ ██║ ███████╗███████╗███████╗██║██║ ██║ ╚═════╝ ╚═╝ ╚═╝ ╚══════╝╚══════╝╚══════╝╚═╝╚═╝ ╚═╝ High-Performance LLM / VLM Inference & Autonomous Agentic Ecosystem… See the full description on the dataset page: https://huggingface.co/datasets/Brunobkr/llama.cpp_AlgMor24_github.

sourceHugging Faceupdated 2mo agoView on Hugging Face
0likes3.1kdownloads
ast.js845 linesDownload Raw Back to commonjs
1"use strict";2// parse a single path portion3var _a;4Object.defineProperty(exports, "__esModule", { value: true });5exports.AST = void 0;6const brace_expressions_js_1 = require("./brace-expressions.js");7const unescape_js_1 = require("./unescape.js");8const types = new Set(['!', '?', '+', '*', '@']);9const isExtglobType = (c) => types.has(c);10const isExtglobAST = (c) => isExtglobType(c.type);11// Map of which extglob types can adopt the children of a nested extglob12//13// anything but ! can adopt a matching type:14// +(a|+(b|c)|d) => +(a|b|c|d)15// *(a|*(b|c)|d) => *(a|b|c|d)16// @(a|@(b|c)|d) => @(a|b|c|d)17// ?(a|?(b|c)|d) => ?(a|b|c|d)18//19// * can adopt anything, because 0 or repetition is allowed20// *(a|?(b|c)|d) => *(a|b|c|d)21// *(a|+(b|c)|d) => *(a|b|c|d)22// *(a|@(b|c)|d) => *(a|b|c|d)23//24// + can adopt @, because 1 or repetition is allowed25// +(a|@(b|c)|d) => +(a|b|c|d)26//27// + and @ CANNOT adopt *, because 0 would be allowed28// +(a|*(b|c)|d) => would match "", on *(b|c)29// @(a|*(b|c)|d) => would match "", on *(b|c)30//31// + and @ CANNOT adopt ?, because 0 would be allowed32// +(a|?(b|c)|d) => would match "", on ?(b|c)33// @(a|?(b|c)|d) => would match "", on ?(b|c)34//35// ? can adopt @, because 0 or 1 is allowed36// ?(a|@(b|c)|d) => ?(a|b|c|d)37//38// ? and @ CANNOT adopt * or +, because >1 would be allowed39// ?(a|*(b|c)|d) => would match bbb on *(b|c)40// @(a|*(b|c)|d) => would match bbb on *(b|c)41// ?(a|+(b|c)|d) => would match bbb on +(b|c)42// @(a|+(b|c)|d) => would match bbb on +(b|c)43//44// ! CANNOT adopt ! (nothing else can either)45// !(a|!(b|c)|d) => !(a|b|c|d) would fail to match on b (not not b|c)46//47// ! can adopt @48// !(a|@(b|c)|d) => !(a|b|c|d)49//50// ! CANNOT adopt *51// !(a|*(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed52//53// ! CANNOT adopt +54// !(a|+(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed55//56// ! CANNOT adopt ?57// x!(a|?(b|c)|d) => x!(a|b|c|d) would fail to match "x"58const adoptionMap = new Map([59    ['!', ['@']],60    ['?', ['?', '@']],61    ['@', ['@']],62    ['*', ['*', '+', '?', '@']],63    ['+', ['+', '@']],64]);65// nested extglobs that can be adopted in, but with the addition of66// a blank '' element.67const adoptionWithSpaceMap = new Map([68    ['!', ['?']],69    ['@', ['?']],70    ['+', ['?', '*']],71]);72// union of the previous two maps73const adoptionAnyMap = new Map([74    ['!', ['?', '@']],75    ['?', ['?', '@']],76    ['@', ['?', '@']],77    ['*', ['*', '+', '?', '@']],78    ['+', ['+', '@', '?', '*']],79]);80// Extglobs that can take over their parent if they are the only child81// the key is parent, value maps child to resulting extglob parent type82// '@' is omitted because it's a special case. An `@` extglob with a single83// member can always be usurped by that subpattern.84const usurpMap = new Map([85    ['!', new Map([['!', '@']])],86    [87        '?',88        new Map([89            ['*', '*'],90            ['+', '*'],91        ]),92    ],93    [94        '@',95        new Map([96            ['!', '!'],97            ['?', '?'],98            ['@', '@'],99            ['*', '*'],100            ['+', '+'],101        ]),102    ],103    [104        '+',105        new Map([106            ['?', '*'],107            ['*', '*'],108        ]),109    ],110]);111// Patterns that get prepended to bind to the start of either the112// entire string, or just a single path portion, to prevent dots113// and/or traversal patterns, when needed.114// Exts don't need the ^ or / bit, because the root binds that already.115const startNoTraversal = '(?!(?:^|/)\\.\\.?(?:$|/))';116const startNoDot = '(?!\\.)';117// characters that indicate a start of pattern needs the "no dots" bit,118// because a dot *might* be matched. ( is not in the list, because in119// the case of a child extglob, it will handle the prevention itself.120const addPatternStart = new Set(['[', '.']);121// cases where traversal is A-OK, no dot prevention needed122const justDots = new Set(['..', '.']);123const reSpecials = new Set('().*{}+?[]^$\\!');124const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');125// any single thing other than /126const qmark = '[^/]';127// * => any number of characters128const star = qmark + '*?';129// use + when we need to ensure that *something* matches, because the * is130// the only thing in the path portion.131const starNoEmpty = qmark + '+?';132// remove the \ chars that we added if we end up doing a nonmagic compare133// const deslash = (s: string) => s.replace(/\\(.)/g, '$1')134let ID = 0;135class AST {136    type;137    #root;138    #hasMagic;139    #uflag = false;140    #parts = [];141    #parent;142    #parentIndex;143    #negs;144    #filledNegs = false;145    #options;146    #toString;147    // set to true if it's an extglob with no children148    // (which really means one child of '')149    #emptyExt = false;150    id = ++ID;151    get depth() {152        return (this.#parent?.depth ?? -1) + 1;153    }154    [Symbol.for('nodejs.util.inspect.custom')]() {155        return {156            '@@type': 'AST',157            id: this.id,158            type: this.type,159            root: this.#root.id,160            parent: this.#parent?.id,161            depth: this.depth,162            partsLength: this.#parts.length,163            parts: this.#parts,164        };165    }166    constructor(type, parent, options = {}) {167        this.type = type;168        // extglobs are inherently magical169        if (type)170            this.#hasMagic = true;171        this.#parent = parent;172        this.#root = this.#parent ? this.#parent.#root : this;173        this.#options = this.#root === this ? options : this.#root.#options;174        this.#negs = this.#root === this ? [] : this.#root.#negs;175        if (type === '!' && !this.#root.#filledNegs)176            this.#negs.push(this);177        this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0;178    }179    get hasMagic() {180        /* c8 ignore start */181        if (this.#hasMagic !== undefined)182            return this.#hasMagic;183        /* c8 ignore stop */184        for (const p of this.#parts) {185            if (typeof p === 'string')186                continue;187            if (p.type || p.hasMagic)188                return (this.#hasMagic = true);189        }190        // note: will be undefined until we generate the regexp src and find out191        return this.#hasMagic;192    }193    // reconstructs the pattern194    toString() {195        return (this.#toString !== undefined ? this.#toString196            : !this.type ?197                (this.#toString = this.#parts.map(p => String(p)).join(''))198                : (this.#toString =199                    this.type +200                        '(' +201                        this.#parts.map(p => String(p)).join('|') +202                        ')'));203    }204    #fillNegs() {205        /* c8 ignore start */206        if (this !== this.#root)207            throw new Error('should only call on root');208        if (this.#filledNegs)209            return this;210        /* c8 ignore stop */211        // call toString() once to fill this out212        this.toString();213        this.#filledNegs = true;214        let n;215        while ((n = this.#negs.pop())) {216            if (n.type !== '!')217                continue;218            // walk up the tree, appending everthing that comes AFTER parentIndex219            let p = n;220            let pp = p.#parent;221            while (pp) {222                for (let i = p.#parentIndex + 1; !pp.type && i < pp.#parts.length; i++) {223                    for (const part of n.#parts) {224                        /* c8 ignore start */225                        if (typeof part === 'string') {226                            throw new Error('string part in extglob AST??');227                        }228                        /* c8 ignore stop */229                        part.copyIn(pp.#parts[i]);230                    }231                }232                p = pp;233                pp = p.#parent;234            }235        }236        return this;237    }238    push(...parts) {239        for (const p of parts) {240            if (p === '')241                continue;242            /* c8 ignore start */243            if (typeof p !== 'string' &&244                !(p instanceof _a && p.#parent === this)) {245                throw new Error('invalid part: ' + p);246            }247            /* c8 ignore stop */248            this.#parts.push(p);249        }250    }251    toJSON() {252        const ret = this.type === null ?253            this.#parts254                .slice()255                .map(p => (typeof p === 'string' ? p : p.toJSON()))256            : [this.type, ...this.#parts.map(p => p.toJSON())];257        if (this.isStart() && !this.type)258            ret.unshift([]);259        if (this.isEnd() &&260            (this === this.#root ||261                (this.#root.#filledNegs && this.#parent?.type === '!'))) {262            ret.push({});263        }264        return ret;265    }266    isStart() {267        if (this.#root === this)268            return true;269        // if (this.type) return !!this.#parent?.isStart()270        if (!this.#parent?.isStart())271            return false;272        if (this.#parentIndex === 0)273            return true;274        // if everything AHEAD of this is a negation, then it's still the "start"275        const p = this.#parent;276        for (let i = 0; i < this.#parentIndex; i++) {277            const pp = p.#parts[i];278            if (!(pp instanceof _a && pp.type === '!')) {279                return false;280            }281        }282        return true;283    }284    isEnd() {285        if (this.#root === this)286            return true;287        if (this.#parent?.type === '!')288            return true;289        if (!this.#parent?.isEnd())290            return false;291        if (!this.type)292            return this.#parent?.isEnd();293        // if not root, it'll always have a parent294        /* c8 ignore start */295        const pl = this.#parent ? this.#parent.#parts.length : 0;296        /* c8 ignore stop */297        return this.#parentIndex === pl - 1;298    }299    copyIn(part) {300        if (typeof part === 'string')301            this.push(part);302        else303            this.push(part.clone(this));304    }305    clone(parent) {306        const c = new _a(this.type, parent);307        for (const p of this.#parts) {308            c.copyIn(p);309        }310        return c;311    }312    static #parseAST(str, ast, pos, opt, extDepth) {313        const maxDepth = opt.maxExtglobRecursion ?? 2;314        let escaping = false;315        let inBrace = false;316        let braceStart = -1;317        let braceNeg = false;318        if (ast.type === null) {319            // outside of a extglob, append until we find a start320            let i = pos;321            let acc = '';322            while (i < str.length) {323                const c = str.charAt(i++);324                // still accumulate escapes at this point, but we do ignore325                // starts that are escaped326                if (escaping || c === '\\') {327                    escaping = !escaping;328                    acc += c;329                    continue;330                }331                if (inBrace) {332                    if (i === braceStart + 1) {333                        if (c === '^' || c === '!') {334                            braceNeg = true;335                        }336                    }337                    else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {338                        inBrace = false;339                    }340                    acc += c;341                    continue;342                }343                else if (c === '[') {344                    inBrace = true;345                    braceStart = i;346                    braceNeg = false;347                    acc += c;348                    continue;349                }350                // we don't have to check for adoption here, because that's351                // done at the other recursion point.352                const doRecurse = !opt.noext &&353                    isExtglobType(c) &&354                    str.charAt(i) === '(' &&355                    extDepth <= maxDepth;356                if (doRecurse) {357                    ast.push(acc);358                    acc = '';359                    const ext = new _a(c, ast);360                    i = _a.#parseAST(str, ext, i, opt, extDepth + 1);361                    ast.push(ext);362                    continue;363                }364                acc += c;365            }366            ast.push(acc);367            return i;368        }369        // some kind of extglob, pos is at the (370        // find the next | or )371        let i = pos + 1;372        let part = new _a(null, ast);373        const parts = [];374        let acc = '';375        while (i < str.length) {376            const c = str.charAt(i++);377            // still accumulate escapes at this point, but we do ignore378            // starts that are escaped379            if (escaping || c === '\\') {380                escaping = !escaping;381                acc += c;382                continue;383            }384            if (inBrace) {385                if (i === braceStart + 1) {386                    if (c === '^' || c === '!') {387                        braceNeg = true;388                    }389                }390                else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {391                    inBrace = false;392                }393                acc += c;394                continue;395            }396            else if (c === '[') {397                inBrace = true;398                braceStart = i;399                braceNeg = false;400                acc += c;401                continue;402            }403            const doRecurse = !opt.noext &&404                isExtglobType(c) &&405                str.charAt(i) === '(' &&406                /* c8 ignore start - the maxDepth is sufficient here */407                (extDepth <= maxDepth || (ast && ast.#canAdoptType(c)));408            /* c8 ignore stop */409            if (doRecurse) {410                const depthAdd = ast && ast.#canAdoptType(c) ? 0 : 1;411                part.push(acc);412                acc = '';413                const ext = new _a(c, part);414                part.push(ext);415                i = _a.#parseAST(str, ext, i, opt, extDepth + depthAdd);416                continue;417            }418            if (c === '|') {419                part.push(acc);420                acc = '';421                parts.push(part);422                part = new _a(null, ast);423                continue;424            }425            if (c === ')') {426                if (acc === '' && ast.#parts.length === 0) {427                    ast.#emptyExt = true;428                }429                part.push(acc);430                acc = '';431                ast.push(...parts, part);432                return i;433            }434            acc += c;435        }436        // unfinished extglob437        // if we got here, it was a malformed extglob! not an extglob, but438        // maybe something else in there.439        ast.type = null;440        ast.#hasMagic = undefined;441        ast.#parts = [str.substring(pos - 1)];442        return i;443    }444    #canAdoptWithSpace(child) {445        return this.#canAdopt(child, adoptionWithSpaceMap);446    }447    #canAdopt(child, map = adoptionMap) {448        if (!child ||449            typeof child !== 'object' ||450            child.type !== null ||451            child.#parts.length !== 1 ||452            this.type === null) {453            return false;454        }455        const gc = child.#parts[0];456        if (!gc || typeof gc !== 'object' || gc.type === null) {457            return false;458        }459        return this.#canAdoptType(gc.type, map);460    }461    #canAdoptType(c, map = adoptionAnyMap) {462        return !!map.get(this.type)?.includes(c);463    }464    #adoptWithSpace(child, index) {465        const gc = child.#parts[0];466        const blank = new _a(null, gc, this.options);467        blank.#parts.push('');468        gc.push(blank);469        this.#adopt(child, index);470    }471    #adopt(child, index) {472        const gc = child.#parts[0];473        this.#parts.splice(index, 1, ...gc.#parts);474        for (const p of gc.#parts) {475            if (typeof p === 'object')476                p.#parent = this;477        }478        this.#toString = undefined;479    }480    #canUsurpType(c) {481        const m = usurpMap.get(this.type);482        return !!m?.has(c);483    }484    #canUsurp(child) {485        if (!child ||486            typeof child !== 'object' ||487            child.type !== null ||488            child.#parts.length !== 1 ||489            this.type === null ||490            this.#parts.length !== 1) {491            return false;492        }493        const gc = child.#parts[0];494        if (!gc || typeof gc !== 'object' || gc.type === null) {495            return false;496        }497        return this.#canUsurpType(gc.type);498    }499    #usurp(child) {500        const m = usurpMap.get(this.type);501        const gc = child.#parts[0];502        const nt = m?.get(gc.type);503        /* c8 ignore start - impossible */504        if (!nt)505            return false;506        /* c8 ignore stop */507        this.#parts = gc.#parts;508        for (const p of this.#parts) {509            if (typeof p === 'object') {510                p.#parent = this;511            }512        }513        this.type = nt;514        this.#toString = undefined;515        this.#emptyExt = false;516    }517    static fromGlob(pattern, options = {}) {518        const ast = new _a(null, undefined, options);519        _a.#parseAST(pattern, ast, 0, options, 0);520        return ast;521    }522    // returns the regular expression if there's magic, or the unescaped523    // string if not.524    toMMPattern() {525        // should only be called on root526        /* c8 ignore start */527        if (this !== this.#root)528            return this.#root.toMMPattern();529        /* c8 ignore stop */530        const glob = this.toString();531        const [re, body, hasMagic, uflag] = this.toRegExpSource();532        // if we're in nocase mode, and not nocaseMagicOnly, then we do533        // still need a regular expression if we have to case-insensitively534        // match capital/lowercase characters.535        const anyMagic = hasMagic ||536            this.#hasMagic ||537            (this.#options.nocase &&538                !this.#options.nocaseMagicOnly &&539                glob.toUpperCase() !== glob.toLowerCase());540        if (!anyMagic) {541            return body;542        }543        const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '');544        return Object.assign(new RegExp(`^${re}$`, flags), {545            _src: re,546            _glob: glob,547        });548    }549    get options() {550        return this.#options;551    }552    // returns the string match, the regexp source, whether there's magic553    // in the regexp (so a regular expression is required) and whether or554    // not the uflag is needed for the regular expression (for posix classes)555    // TODO: instead of injecting the start/end at this point, just return556    // the BODY of the regexp, along with the start/end portions suitable557    // for binding the start/end in either a joined full-path makeRe context558    // (where we bind to (^|/), or a standalone matchPart context (where559    // we bind to ^, and not /).  Otherwise slashes get duped!560    //561    // In part-matching mode, the start is:562    // - if not isStart: nothing563    // - if traversal possible, but not allowed: ^(?!\.\.?$)564    // - if dots allowed or not possible: ^565    // - if dots possible and not allowed: ^(?!\.)566    // end is:567    // - if not isEnd(): nothing568    // - else: $569    //570    // In full-path matching mode, we put the slash at the START of the571    // pattern, so start is:572    // - if first pattern: same as part-matching mode573    // - if not isStart(): nothing574    // - if traversal possible, but not allowed: /(?!\.\.?(?:$|/))575    // - if dots allowed or not possible: /576    // - if dots possible and not allowed: /(?!\.)577    // end is:578    // - if last pattern, same as part-matching mode579    // - else nothing580    //581    // Always put the (?:$|/) on negated tails, though, because that has to be582    // there to bind the end of the negated pattern portion, and it's easier to583    // just stick it in now rather than try to inject it later in the middle of584    // the pattern.585    //586    // We can just always return the same end, and leave it up to the caller587    // to know whether it's going to be used joined or in parts.588    // And, if the start is adjusted slightly, can do the same there:589    // - if not isStart: nothing590    // - if traversal possible, but not allowed: (?:/|^)(?!\.\.?$)591    // - if dots allowed or not possible: (?:/|^)592    // - if dots possible and not allowed: (?:/|^)(?!\.)593    //594    // But it's better to have a simpler binding without a conditional, for595    // performance, so probably better to return both start options.596    //597    // Then the caller just ignores the end if it's not the first pattern,598    // and the start always gets applied.599    //600    // But that's always going to be $ if it's the ending pattern, or nothing,601    // so the caller can just attach $ at the end of the pattern when building.602    //603    // So the todo is:604    // - better detect what kind of start is needed605    // - return both flavors of starting pattern606    // - attach $ at the end of the pattern when creating the actual RegExp607    //608    // Ah, but wait, no, that all only applies to the root when the first pattern609    // is not an extglob. If the first pattern IS an extglob, then we need all610    // that dot prevention biz to live in the extglob portions, because eg611    // +(*|.x*) can match .xy but not .yx.612    //613    // So, return the two flavors if it's #root and the first child is not an614    // AST, otherwise leave it to the child AST to handle it, and there,615    // use the (?:^|/) style of start binding.616    //617    // Even simplified further:618    // - Since the start for a join is eg /(?!\.) and the start for a part619    // is ^(?!\.), we can just prepend (?!\.) to the pattern (either root620    // or start or whatever) and prepend ^ or / at the Regexp construction.621    toRegExpSource(allowDot) {622        const dot = allowDot ?? !!this.#options.dot;623        if (this.#root === this) {624            this.#flatten();625            this.#fillNegs();626        }627        if (!isExtglobAST(this)) {628            const noEmpty = this.isStart() &&629                this.isEnd() &&630                !this.#parts.some(s => typeof s !== 'string');631            const src = this.#parts632                .map(p => {633                const [re, _, hasMagic, uflag] = typeof p === 'string' ?634                    _a.#parseGlob(p, this.#hasMagic, noEmpty)635                    : p.toRegExpSource(allowDot);636                this.#hasMagic = this.#hasMagic || hasMagic;637                this.#uflag = this.#uflag || uflag;638                return re;639            })640                .join('');641            let start = '';642            if (this.isStart()) {643                if (typeof this.#parts[0] === 'string') {644                    // this is the string that will match the start of the pattern,645                    // so we need to protect against dots and such.646                    // '.' and '..' cannot match unless the pattern is that exactly,647                    // even if it starts with . or dot:true is set.648                    const dotTravAllowed = this.#parts.length === 1 && justDots.has(this.#parts[0]);649                    if (!dotTravAllowed) {650                        const aps = addPatternStart;651                        // check if we have a possibility of matching . or ..,652                        // and prevent that.653                        const needNoTrav = 654                        // dots are allowed, and the pattern starts with [ or .655                        (dot && aps.has(src.charAt(0))) ||656                            // the pattern starts with \., and then [ or .657                            (src.startsWith('\\.') && aps.has(src.charAt(2))) ||658                            // the pattern starts with \.\., and then [ or .659                            (src.startsWith('\\.\\.') && aps.has(src.charAt(4)));660                        // no need to prevent dots if it can't match a dot, or if a661                        // sub-pattern will be preventing it anyway.662                        const needNoDot = !dot && !allowDot && aps.has(src.charAt(0));663                        start =664                            needNoTrav ? startNoTraversal665                                : needNoDot ? startNoDot666                                    : '';667                    }668                }669            }670            // append the "end of path portion" pattern to negation tails671            let end = '';672            if (this.isEnd() &&673                this.#root.#filledNegs &&674                this.#parent?.type === '!') {675                end = '(?:$|\\/)';676            }677            const final = start + src + end;678            return [679                final,680                (0, unescape_js_1.unescape)(src),681                (this.#hasMagic = !!this.#hasMagic),682                this.#uflag,683            ];684        }685        // We need to calculate the body *twice* if it's a repeat pattern686        // at the start, once in nodot mode, then again in dot mode, so a687        // pattern like *(?) can match 'x.y'688        const repeated = this.type === '*' || this.type === '+';689        // some kind of extglob690        const start = this.type === '!' ? '(?:(?!(?:' : '(?:';691        let body = this.#partsToRegExp(dot);692        if (this.isStart() && this.isEnd() && !body && this.type !== '!') {693            // invalid extglob, has to at least be *something* present, if it's694            // the entire path portion.695            const s = this.toString();696            const me = this;697            me.#parts = [s];698            me.type = null;699            me.#hasMagic = undefined;700            return [s, (0, unescape_js_1.unescape)(this.toString()), false, false];701        }702        let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot ?703            ''704            : this.#partsToRegExp(true);705        if (bodyDotAllowed === body) {706            bodyDotAllowed = '';707        }708        if (bodyDotAllowed) {709            body = `(?:${body})(?:${bodyDotAllowed})*?`;710        }711        // an empty !() is exactly equivalent to a starNoEmpty712        let final = '';713        if (this.type === '!' && this.#emptyExt) {714            final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty;715        }716        else {717            const close = this.type === '!' ?718                // !() must match something,but !(x) can match ''719                '))' +720                    (this.isStart() && !dot && !allowDot ? startNoDot : '') +721                    star +722                    ')'723                : this.type === '@' ? ')'724                    : this.type === '?' ? ')?'725                        : this.type === '+' && bodyDotAllowed ? ')'726                            : this.type === '*' && bodyDotAllowed ? `)?`727                                : `)${this.type}`;728            final = start + body + close;729        }730        return [731            final,732            (0, unescape_js_1.unescape)(body),733            (this.#hasMagic = !!this.#hasMagic),734            this.#uflag,735        ];736    }737    #flatten() {738        if (!isExtglobAST(this)) {739            for (const p of this.#parts) {740                if (typeof p === 'object') {741                    p.#flatten();742                }743            }744        }745        else {746            // do up to 10 passes to flatten as much as possible747            let iterations = 0;748            let done = false;749            do {750                done = true;751                for (let i = 0; i < this.#parts.length; i++) {752                    const c = this.#parts[i];753                    if (typeof c === 'object') {754                        c.#flatten();755                        if (this.#canAdopt(c)) {756                            done = false;757                            this.#adopt(c, i);758                        }759                        else if (this.#canAdoptWithSpace(c)) {760                            done = false;761                            this.#adoptWithSpace(c, i);762                        }763                        else if (this.#canUsurp(c)) {764                            done = false;765                            this.#usurp(c);766                        }767                    }768                }769            } while (!done && ++iterations < 10);770        }771        this.#toString = undefined;772    }773    #partsToRegExp(dot) {774        return this.#parts775            .map(p => {776            // extglob ASTs should only contain parent ASTs777            /* c8 ignore start */778            if (typeof p === 'string') {779                throw new Error('string type in extglob ast??');780            }781            /* c8 ignore stop */782            // can ignore hasMagic, because extglobs are already always magic783            const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot);784            this.#uflag = this.#uflag || uflag;785            return re;786        })787            .filter(p => !(this.isStart() && this.isEnd()) || !!p)788            .join('|');789    }790    static #parseGlob(glob, hasMagic, noEmpty = false) {791        let escaping = false;792        let re = '';793        let uflag = false;794        // multiple stars that aren't globstars coalesce into one *795        let inStar = false;796        for (let i = 0; i < glob.length; i++) {797            const c = glob.charAt(i);798            if (escaping) {799                escaping = false;800                re += (reSpecials.has(c) ? '\\' : '') + c;801                continue;802            }803            if (c === '*') {804                if (inStar)805                    continue;806                inStar = true;807                re += noEmpty && /^[*]+$/.test(glob) ? starNoEmpty : star;808                hasMagic = true;809                continue;810            }811            else {812                inStar = false;813            }814            if (c === '\\') {815                if (i === glob.length - 1) {816                    re += '\\\\';817                }818                else {819                    escaping = true;820                }821                continue;822            }823            if (c === '[') {824                const [src, needUflag, consumed, magic] = (0, brace_expressions_js_1.parseClass)(glob, i);825                if (consumed) {826                    re += src;827                    uflag = uflag || needUflag;828                    i += consumed - 1;829                    hasMagic = hasMagic || magic;830                    continue;831                }832            }833            if (c === '?') {834                re += qmark;835                hasMagic = true;836                continue;837            }838            re += regExpEscape(c);839        }840        return [re, (0, unescape_js_1.unescape)(glob), !!hasMagic, uflag];841    }842}843exports.AST = AST;844_a = AST;845//# sourceMappingURL=ast.js.map
Brunobkr/llama.cpp_AlgMor24_github · Team Ai