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
index.js1114 linesDownload Raw Back to esm
1import { expand } from 'brace-expansion';2import { assertValidPattern } from './assert-valid-pattern.js';3import { AST } from './ast.js';4import { escape } from './escape.js';5import { unescape } from './unescape.js';6export const minimatch = (p, pattern, options = {}) => {7    assertValidPattern(pattern);8    // shortcut: comments match nothing.9    if (!options.nocomment && pattern.charAt(0) === '#') {10        return false;11    }12    return new Minimatch(pattern, options).match(p);13};14// Optimized checking for the most common glob patterns.15const starDotExtRE = /^\*+([^+@!?*[(]*)$/;16const starDotExtTest = (ext) => (f) => !f.startsWith('.') && f.endsWith(ext);17const starDotExtTestDot = (ext) => (f) => f.endsWith(ext);18const starDotExtTestNocase = (ext) => {19    ext = ext.toLowerCase();20    return (f) => !f.startsWith('.') && f.toLowerCase().endsWith(ext);21};22const starDotExtTestNocaseDot = (ext) => {23    ext = ext.toLowerCase();24    return (f) => f.toLowerCase().endsWith(ext);25};26const starDotStarRE = /^\*+\.\*+$/;27const starDotStarTest = (f) => !f.startsWith('.') && f.includes('.');28const starDotStarTestDot = (f) => f !== '.' && f !== '..' && f.includes('.');29const dotStarRE = /^\.\*+$/;30const dotStarTest = (f) => f !== '.' && f !== '..' && f.startsWith('.');31const starRE = /^\*+$/;32const starTest = (f) => f.length !== 0 && !f.startsWith('.');33const starTestDot = (f) => f.length !== 0 && f !== '.' && f !== '..';34const qmarksRE = /^\?+([^+@!?*[(]*)?$/;35const qmarksTestNocase = ([$0, ext = '']) => {36    const noext = qmarksTestNoExt([$0]);37    if (!ext)38        return noext;39    ext = ext.toLowerCase();40    return (f) => noext(f) && f.toLowerCase().endsWith(ext);41};42const qmarksTestNocaseDot = ([$0, ext = '']) => {43    const noext = qmarksTestNoExtDot([$0]);44    if (!ext)45        return noext;46    ext = ext.toLowerCase();47    return (f) => noext(f) && f.toLowerCase().endsWith(ext);48};49const qmarksTestDot = ([$0, ext = '']) => {50    const noext = qmarksTestNoExtDot([$0]);51    return !ext ? noext : (f) => noext(f) && f.endsWith(ext);52};53const qmarksTest = ([$0, ext = '']) => {54    const noext = qmarksTestNoExt([$0]);55    return !ext ? noext : (f) => noext(f) && f.endsWith(ext);56};57const qmarksTestNoExt = ([$0]) => {58    const len = $0.length;59    return (f) => f.length === len && !f.startsWith('.');60};61const qmarksTestNoExtDot = ([$0]) => {62    const len = $0.length;63    return (f) => f.length === len && f !== '.' && f !== '..';64};65/* c8 ignore start */66const defaultPlatform = (typeof process === 'object' && process ?67    (typeof process.env === 'object' &&68        process.env &&69        process.env.__MINIMATCH_TESTING_PLATFORM__) ||70        process.platform71    : 'posix');72const path = {73    win32: { sep: '\\' },74    posix: { sep: '/' },75};76/* c8 ignore stop */77export const sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep;78minimatch.sep = sep;79export const GLOBSTAR = Symbol('globstar **');80minimatch.GLOBSTAR = GLOBSTAR;81// any single thing other than /82// don't need to escape / when using new RegExp()83const qmark = '[^/]';84// * => any number of characters85const star = qmark + '*?';86// ** when dots are allowed.  Anything goes, except .. and .87// not (^ or / followed by one or two dots followed by $ or /),88// followed by anything, any number of times.89const twoStarDot = '(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?';90// not a ^ or / followed by a dot,91// followed by anything, any number of times.92const twoStarNoDot = '(?:(?!(?:\\/|^)\\.).)*?';93export const filter = (pattern, options = {}) => (p) => minimatch(p, pattern, options);94minimatch.filter = filter;95const ext = (a, b = {}) => Object.assign({}, a, b);96export const defaults = (def) => {97    if (!def || typeof def !== 'object' || !Object.keys(def).length) {98        return minimatch;99    }100    const orig = minimatch;101    const m = (p, pattern, options = {}) => orig(p, pattern, ext(def, options));102    return Object.assign(m, {103        Minimatch: class Minimatch extends orig.Minimatch {104            constructor(pattern, options = {}) {105                super(pattern, ext(def, options));106            }107            static defaults(options) {108                return orig.defaults(ext(def, options)).Minimatch;109            }110        },111        AST: class AST extends orig.AST {112            /* c8 ignore start */113            constructor(type, parent, options = {}) {114                super(type, parent, ext(def, options));115            }116            /* c8 ignore stop */117            static fromGlob(pattern, options = {}) {118                return orig.AST.fromGlob(pattern, ext(def, options));119            }120        },121        unescape: (s, options = {}) => orig.unescape(s, ext(def, options)),122        escape: (s, options = {}) => orig.escape(s, ext(def, options)),123        filter: (pattern, options = {}) => orig.filter(pattern, ext(def, options)),124        defaults: (options) => orig.defaults(ext(def, options)),125        makeRe: (pattern, options = {}) => orig.makeRe(pattern, ext(def, options)),126        braceExpand: (pattern, options = {}) => orig.braceExpand(pattern, ext(def, options)),127        match: (list, pattern, options = {}) => orig.match(list, pattern, ext(def, options)),128        sep: orig.sep,129        GLOBSTAR: GLOBSTAR,130    });131};132minimatch.defaults = defaults;133// Brace expansion:134// a{b,c}d -> abd acd135// a{b,}c -> abc ac136// a{0..3}d -> a0d a1d a2d a3d137// a{b,c{d,e}f}g -> abg acdfg acefg138// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg139//140// Invalid sets are not expanded.141// a{2..}b -> a{2..}b142// a{b}c -> a{b}c143export const braceExpand = (pattern, options = {}) => {144    assertValidPattern(pattern);145    // Thanks to Yeting Li <https://github.com/yetingli> for146    // improving this regexp to avoid a ReDOS vulnerability.147    if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {148        // shortcut. no need to expand.149        return [pattern];150    }151    return expand(pattern, { max: options.braceExpandMax });152};153minimatch.braceExpand = braceExpand;154// parse a component of the expanded set.155// At this point, no pattern may contain "/" in it156// so we're going to return a 2d array, where each entry is the full157// pattern, split on '/', and then turned into a regular expression.158// A regexp is made at the end which joins each array with an159// escaped /, and another full one which joins each regexp with |.160//161// Following the lead of Bash 4.1, note that "**" only has special meaning162// when it is the *only* thing in a path portion.  Otherwise, any series163// of * is equivalent to a single *.  Globstar behavior is enabled by164// default, and can be disabled by setting options.noglobstar.165export const makeRe = (pattern, options = {}) => new Minimatch(pattern, options).makeRe();166minimatch.makeRe = makeRe;167export const match = (list, pattern, options = {}) => {168    const mm = new Minimatch(pattern, options);169    list = list.filter(f => mm.match(f));170    if (mm.options.nonull && !list.length) {171        list.push(pattern);172    }173    return list;174};175minimatch.match = match;176// replace stuff like \* with *177const globMagic = /[?*]|[+@!]\(.*?\)|\[|\]/;178const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');179export class Minimatch {180    options;181    set;182    pattern;183    windowsPathsNoEscape;184    nonegate;185    negate;186    comment;187    empty;188    preserveMultipleSlashes;189    partial;190    globSet;191    globParts;192    nocase;193    isWindows;194    platform;195    windowsNoMagicRoot;196    maxGlobstarRecursion;197    regexp;198    constructor(pattern, options = {}) {199        assertValidPattern(pattern);200        options = options || {};201        this.options = options;202        this.maxGlobstarRecursion = options.maxGlobstarRecursion ?? 200;203        this.pattern = pattern;204        this.platform = options.platform || defaultPlatform;205        this.isWindows = this.platform === 'win32';206        // avoid the annoying deprecation flag lol207        const awe = ('allowWindow' + 'sEscape');208        this.windowsPathsNoEscape =209            !!options.windowsPathsNoEscape || options[awe] === false;210        if (this.windowsPathsNoEscape) {211            this.pattern = this.pattern.replace(/\\/g, '/');212        }213        this.preserveMultipleSlashes = !!options.preserveMultipleSlashes;214        this.regexp = null;215        this.negate = false;216        this.nonegate = !!options.nonegate;217        this.comment = false;218        this.empty = false;219        this.partial = !!options.partial;220        this.nocase = !!this.options.nocase;221        this.windowsNoMagicRoot =222            options.windowsNoMagicRoot !== undefined ?223                options.windowsNoMagicRoot224                : !!(this.isWindows && this.nocase);225        this.globSet = [];226        this.globParts = [];227        this.set = [];228        // make the set of regexps etc.229        this.make();230    }231    hasMagic() {232        if (this.options.magicalBraces && this.set.length > 1) {233            return true;234        }235        for (const pattern of this.set) {236            for (const part of pattern) {237                if (typeof part !== 'string')238                    return true;239            }240        }241        return false;242    }243    debug(..._) { }244    make() {245        const pattern = this.pattern;246        const options = this.options;247        // empty patterns and comments match nothing.248        if (!options.nocomment && pattern.charAt(0) === '#') {249            this.comment = true;250            return;251        }252        if (!pattern) {253            this.empty = true;254            return;255        }256        // step 1: figure out negation, etc.257        this.parseNegate();258        // step 2: expand braces259        this.globSet = [...new Set(this.braceExpand())];260        if (options.debug) {261            //oxlint-disable-next-line no-console262            this.debug = (...args) => console.error(...args);263        }264        this.debug(this.pattern, this.globSet);265        // step 3: now we have a set, so turn each one into a series of266        // path-portion matching patterns.267        // These will be regexps, except in the case of "**", which is268        // set to the GLOBSTAR object for globstar behavior,269        // and will not contain any / characters270        //271        // First, we preprocess to make the glob pattern sets a bit simpler272        // and deduped.  There are some perf-killing patterns that can cause273        // problems with a glob walk, but we can simplify them down a bit.274        const rawGlobParts = this.globSet.map(s => this.slashSplit(s));275        this.globParts = this.preprocess(rawGlobParts);276        this.debug(this.pattern, this.globParts);277        // glob --> regexps278        let set = this.globParts.map((s, _, __) => {279            if (this.isWindows && this.windowsNoMagicRoot) {280                // check if it's a drive or unc path.281                const isUNC = s[0] === '' &&282                    s[1] === '' &&283                    (s[2] === '?' || !globMagic.test(s[2])) &&284                    !globMagic.test(s[3]);285                const isDrive = /^[a-z]:/i.test(s[0]);286                if (isUNC) {287                    return [288                        ...s.slice(0, 4),289                        ...s.slice(4).map(ss => this.parse(ss)),290                    ];291                }292                else if (isDrive) {293                    return [s[0], ...s.slice(1).map(ss => this.parse(ss))];294                }295            }296            return s.map(ss => this.parse(ss));297        });298        this.debug(this.pattern, set);299        // filter out everything that didn't compile properly.300        this.set = set.filter(s => s.indexOf(false) === -1);301        // do not treat the ? in UNC paths as magic302        if (this.isWindows) {303            for (let i = 0; i < this.set.length; i++) {304                const p = this.set[i];305                if (p[0] === '' &&306                    p[1] === '' &&307                    this.globParts[i][2] === '?' &&308                    typeof p[3] === 'string' &&309                    /^[a-z]:$/i.test(p[3])) {310                    p[2] = '?';311                }312            }313        }314        this.debug(this.pattern, this.set);315    }316    // various transforms to equivalent pattern sets that are317    // faster to process in a filesystem walk.  The goal is to318    // eliminate what we can, and push all ** patterns as far319    // to the right as possible, even if it increases the number320    // of patterns that we have to process.321    preprocess(globParts) {322        // if we're not in globstar mode, then turn ** into *323        if (this.options.noglobstar) {324            for (const partset of globParts) {325                for (let j = 0; j < partset.length; j++) {326                    if (partset[j] === '**') {327                        partset[j] = '*';328                    }329                }330            }331        }332        const { optimizationLevel = 1 } = this.options;333        if (optimizationLevel >= 2) {334            // aggressive optimization for the purpose of fs walking335            globParts = this.firstPhasePreProcess(globParts);336            globParts = this.secondPhasePreProcess(globParts);337        }338        else if (optimizationLevel >= 1) {339            // just basic optimizations to remove some .. parts340            globParts = this.levelOneOptimize(globParts);341        }342        else {343            // just collapse multiple ** portions into one344            globParts = this.adjascentGlobstarOptimize(globParts);345        }346        return globParts;347    }348    // just get rid of adjascent ** portions349    adjascentGlobstarOptimize(globParts) {350        return globParts.map(parts => {351            let gs = -1;352            while (-1 !== (gs = parts.indexOf('**', gs + 1))) {353                let i = gs;354                while (parts[i + 1] === '**') {355                    i++;356                }357                if (i !== gs) {358                    parts.splice(gs, i - gs);359                }360            }361            return parts;362        });363    }364    // get rid of adjascent ** and resolve .. portions365    levelOneOptimize(globParts) {366        return globParts.map(parts => {367            parts = parts.reduce((set, part) => {368                const prev = set[set.length - 1];369                if (part === '**' && prev === '**') {370                    return set;371                }372                if (part === '..') {373                    if (prev && prev !== '..' && prev !== '.' && prev !== '**') {374                        set.pop();375                        return set;376                    }377                }378                set.push(part);379                return set;380            }, []);381            return parts.length === 0 ? [''] : parts;382        });383    }384    levelTwoFileOptimize(parts) {385        if (!Array.isArray(parts)) {386            parts = this.slashSplit(parts);387        }388        let didSomething = false;389        do {390            didSomething = false;391            // <pre>/<e>/<rest> -> <pre>/<rest>392            if (!this.preserveMultipleSlashes) {393                for (let i = 1; i < parts.length - 1; i++) {394                    const p = parts[i];395                    // don't squeeze out UNC patterns396                    if (i === 1 && p === '' && parts[0] === '')397                        continue;398                    if (p === '.' || p === '') {399                        didSomething = true;400                        parts.splice(i, 1);401                        i--;402                    }403                }404                if (parts[0] === '.' &&405                    parts.length === 2 &&406                    (parts[1] === '.' || parts[1] === '')) {407                    didSomething = true;408                    parts.pop();409                }410            }411            // <pre>/<p>/../<rest> -> <pre>/<rest>412            let dd = 0;413            while (-1 !== (dd = parts.indexOf('..', dd + 1))) {414                const p = parts[dd - 1];415                if (p &&416                    p !== '.' &&417                    p !== '..' &&418                    p !== '**' &&419                    !(this.isWindows && /^[a-z]:$/i.test(p))) {420                    didSomething = true;421                    parts.splice(dd - 1, 2);422                    dd -= 2;423                }424            }425        } while (didSomething);426        return parts.length === 0 ? [''] : parts;427    }428    // First phase: single-pattern processing429    // <pre> is 1 or more portions430    // <rest> is 1 or more portions431    // <p> is any portion other than ., .., '', or **432    // <e> is . or ''433    //434    // **/.. is *brutal* for filesystem walking performance, because435    // it effectively resets the recursive walk each time it occurs,436    // and ** cannot be reduced out by a .. pattern part like a regexp437    // or most strings (other than .., ., and '') can be.438    //439    // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}440    // <pre>/<e>/<rest> -> <pre>/<rest>441    // <pre>/<p>/../<rest> -> <pre>/<rest>442    // **/**/<rest> -> **/<rest>443    //444    // **/*/<rest> -> */**/<rest> <== not valid because ** doesn't follow445    // this WOULD be allowed if ** did follow symlinks, or * didn't446    firstPhasePreProcess(globParts) {447        let didSomething = false;448        do {449            didSomething = false;450            // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}451            for (let parts of globParts) {452                let gs = -1;453                while (-1 !== (gs = parts.indexOf('**', gs + 1))) {454                    let gss = gs;455                    while (parts[gss + 1] === '**') {456                        // <pre>/**/**/<rest> -> <pre>/**/<rest>457                        gss++;458                    }459                    // eg, if gs is 2 and gss is 4, that means we have 3 **460                    // parts, and can remove 2 of them.461                    if (gss > gs) {462                        parts.splice(gs + 1, gss - gs);463                    }464                    let next = parts[gs + 1];465                    const p = parts[gs + 2];466                    const p2 = parts[gs + 3];467                    if (next !== '..')468                        continue;469                    if (!p ||470                        p === '.' ||471                        p === '..' ||472                        !p2 ||473                        p2 === '.' ||474                        p2 === '..') {475                        continue;476                    }477                    didSomething = true;478                    // edit parts in place, and push the new one479                    parts.splice(gs, 1);480                    const other = parts.slice(0);481                    other[gs] = '**';482                    globParts.push(other);483                    gs--;484                }485                // <pre>/<e>/<rest> -> <pre>/<rest>486                if (!this.preserveMultipleSlashes) {487                    for (let i = 1; i < parts.length - 1; i++) {488                        const p = parts[i];489                        // don't squeeze out UNC patterns490                        if (i === 1 && p === '' && parts[0] === '')491                            continue;492                        if (p === '.' || p === '') {493                            didSomething = true;494                            parts.splice(i, 1);495                            i--;496                        }497                    }498                    if (parts[0] === '.' &&499                        parts.length === 2 &&500                        (parts[1] === '.' || parts[1] === '')) {501                        didSomething = true;502                        parts.pop();503                    }504                }505                // <pre>/<p>/../<rest> -> <pre>/<rest>506                let dd = 0;507                while (-1 !== (dd = parts.indexOf('..', dd + 1))) {508                    const p = parts[dd - 1];509                    if (p && p !== '.' && p !== '..' && p !== '**') {510                        didSomething = true;511                        const needDot = dd === 1 && parts[dd + 1] === '**';512                        const splin = needDot ? ['.'] : [];513                        parts.splice(dd - 1, 2, ...splin);514                        if (parts.length === 0)515                            parts.push('');516                        dd -= 2;517                    }518                }519            }520        } while (didSomething);521        return globParts;522    }523    // second phase: multi-pattern dedupes524    // {<pre>/*/<rest>,<pre>/<p>/<rest>} -> <pre>/*/<rest>525    // {<pre>/<rest>,<pre>/<rest>} -> <pre>/<rest>526    // {<pre>/**/<rest>,<pre>/<rest>} -> <pre>/**/<rest>527    //528    // {<pre>/**/<rest>,<pre>/**/<p>/<rest>} -> <pre>/**/<rest>529    // ^-- not valid because ** doens't follow symlinks530    secondPhasePreProcess(globParts) {531        for (let i = 0; i < globParts.length - 1; i++) {532            for (let j = i + 1; j < globParts.length; j++) {533                const matched = this.partsMatch(globParts[i], globParts[j], !this.preserveMultipleSlashes);534                if (matched) {535                    globParts[i] = [];536                    globParts[j] = matched;537                    break;538                }539            }540        }541        return globParts.filter(gs => gs.length);542    }543    partsMatch(a, b, emptyGSMatch = false) {544        let ai = 0;545        let bi = 0;546        let result = [];547        let which = '';548        while (ai < a.length && bi < b.length) {549            if (a[ai] === b[bi]) {550                result.push(which === 'b' ? b[bi] : a[ai]);551                ai++;552                bi++;553            }554            else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {555                result.push(a[ai]);556                ai++;557            }558            else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {559                result.push(b[bi]);560                bi++;561            }562            else if (a[ai] === '*' &&563                b[bi] &&564                (this.options.dot || !b[bi].startsWith('.')) &&565                b[bi] !== '**') {566                if (which === 'b')567                    return false;568                which = 'a';569                result.push(a[ai]);570                ai++;571                bi++;572            }573            else if (b[bi] === '*' &&574                a[ai] &&575                (this.options.dot || !a[ai].startsWith('.')) &&576                a[ai] !== '**') {577                if (which === 'a')578                    return false;579                which = 'b';580                result.push(b[bi]);581                ai++;582                bi++;583            }584            else {585                return false;586            }587        }588        // if we fall out of the loop, it means they two are identical589        // as long as their lengths match590        return a.length === b.length && result;591    }592    parseNegate() {593        if (this.nonegate)594            return;595        const pattern = this.pattern;596        let negate = false;597        let negateOffset = 0;598        for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {599            negate = !negate;600            negateOffset++;601        }602        if (negateOffset)603            this.pattern = pattern.slice(negateOffset);604        this.negate = negate;605    }606    // set partial to true to test if, for example,607    // "/a/b" matches the start of "/*/b/*/d"608    // Partial means, if you run out of file before you run609    // out of pattern, then that's fine, as long as all610    // the parts match.611    matchOne(file, pattern, partial = false) {612        let fileStartIndex = 0;613        let patternStartIndex = 0;614        // UNC paths like //?/X:/... can match X:/... and vice versa615        // Drive letters in absolute drive or unc paths are always compared616        // case-insensitively.617        if (this.isWindows) {618            const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0]);619            const fileUNC = !fileDrive &&620                file[0] === '' &&621                file[1] === '' &&622                file[2] === '?' &&623                /^[a-z]:$/i.test(file[3]);624            const patternDrive = typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0]);625            const patternUNC = !patternDrive &&626                pattern[0] === '' &&627                pattern[1] === '' &&628                pattern[2] === '?' &&629                typeof pattern[3] === 'string' &&630                /^[a-z]:$/i.test(pattern[3]);631            const fdi = fileUNC ? 3632                : fileDrive ? 0633                    : undefined;634            const pdi = patternUNC ? 3635                : patternDrive ? 0636                    : undefined;637            if (typeof fdi === 'number' && typeof pdi === 'number') {638                const [fd, pd] = [639                    file[fdi],640                    pattern[pdi],641                ];642                // start matching at the drive letter index of each643                if (fd.toLowerCase() === pd.toLowerCase()) {644                    pattern[pdi] = fd;645                    patternStartIndex = pdi;646                    fileStartIndex = fdi;647                }648            }649        }650        // resolve and reduce . and .. portions in the file as well.651        // don't need to do the second phase, because it's only one string[]652        const { optimizationLevel = 1 } = this.options;653        if (optimizationLevel >= 2) {654            file = this.levelTwoFileOptimize(file);655        }656        if (pattern.includes(GLOBSTAR)) {657            return this.#matchGlobstar(file, pattern, partial, fileStartIndex, patternStartIndex);658        }659        return this.#matchOne(file, pattern, partial, fileStartIndex, patternStartIndex);660    }661    #matchGlobstar(file, pattern, partial, fileIndex, patternIndex) {662        // split the pattern into head, tail, and middle of ** delimited parts663        const firstgs = pattern.indexOf(GLOBSTAR, patternIndex);664        const lastgs = pattern.lastIndexOf(GLOBSTAR);665        // split the pattern up into globstar-delimited sections666        // the tail has to be at the end, and the others just have667        // to be found in order from the head.668        const [head, body, tail] = partial ?669            [670                pattern.slice(patternIndex, firstgs),671                pattern.slice(firstgs + 1),672                [],673            ]674            : [675                pattern.slice(patternIndex, firstgs),676                pattern.slice(firstgs + 1, lastgs),677                pattern.slice(lastgs + 1),678            ];679        // check the head, from the current file/pattern index.680        if (head.length) {681            const fileHead = file.slice(fileIndex, fileIndex + head.length);682            if (!this.#matchOne(fileHead, head, partial, 0, 0)) {683                return false;684            }685            fileIndex += head.length;686            patternIndex += head.length;687        }688        // now we know the head matches!689        // if the last portion is not empty, it MUST match the end690        // check the tail691        let fileTailMatch = 0;692        if (tail.length) {693            // if head + tail > file, then we cannot possibly match694            if (tail.length + fileIndex > file.length)695                return false;696            // try to match the tail697            let tailStart = file.length - tail.length;698            if (this.#matchOne(file, tail, partial, tailStart, 0)) {699                fileTailMatch = tail.length;700            }701            else {702                // affordance for stuff like a/**/* matching a/b/703                // if the last file portion is '', and there's more to the pattern704                // then try without the '' bit.705                if (file[file.length - 1] !== '' ||706                    fileIndex + tail.length === file.length) {707                    return false;708                }709                tailStart--;710                if (!this.#matchOne(file, tail, partial, tailStart, 0)) {711                    return false;712                }713                fileTailMatch = tail.length + 1;714            }715        }716        // now we know the tail matches!717        // the middle is zero or more portions wrapped in **, possibly718        // containing more ** sections.719        // so a/**/b/**/c/**/d has become **/b/**/c/**720        // if it's empty, it means a/**/b, just verify we have no bad dots721        // if there's no tail, so it ends on /**, then we must have *something*722        // after the head, or it's not a matc723        if (!body.length) {724            let sawSome = !!fileTailMatch;725            for (let i = fileIndex; i < file.length - fileTailMatch; i++) {726                const f = String(file[i]);727                sawSome = true;728                if (f === '.' ||729                    f === '..' ||730                    (!this.options.dot && f.startsWith('.'))) {731                    return false;732                }733            }734            // in partial mode, we just need to get past all file parts735            return partial || sawSome;736        }737        // now we know that there's one or more body sections, which can738        // be matched anywhere from the 0 index (because the head was pruned)739        // through to the length-fileTailMatch index.740        // split the body up into sections, and note the minimum index it can741        // be found at (start with the length of all previous segments)742        // [section, before, after]743        const bodySegments = [[[], 0]];744        let currentBody = bodySegments[0];745        let nonGsParts = 0;746        const nonGsPartsSums = [0];747        for (const b of body) {748            if (b === GLOBSTAR) {749                nonGsPartsSums.push(nonGsParts);750                currentBody = [[], 0];751                bodySegments.push(currentBody);752            }753            else {754                currentBody[0].push(b);755                nonGsParts++;756            }757        }758        let i = bodySegments.length - 1;759        const fileLength = file.length - fileTailMatch;760        for (const b of bodySegments) {761            b[1] = fileLength - (nonGsPartsSums[i--] + b[0].length);762        }763        return !!this.#matchGlobStarBodySections(file, bodySegments, fileIndex, 0, partial, 0, !!fileTailMatch);764    }765    // return false for "nope, not matching"766    // return null for "not matching, cannot keep trying"767    #matchGlobStarBodySections(file, 768    // pattern section, last possible position for it769    bodySegments, fileIndex, bodyIndex, partial, globStarDepth, sawTail) {770        // take the first body segment, and walk from fileIndex to its "after"771        // value at the end772        // If it doesn't match at that position, we increment, until we hit773        // that final possible position, and give up.774        // If it does match, then advance and try to rest.775        // If any of them fail we keep walking forward.776        // this is still a bit recursively painful, but it's more constrained777        // than previous implementations, because we never test something that778        // can't possibly be a valid matching condition.779        const bs = bodySegments[bodyIndex];780        if (!bs) {781            // just make sure that there's no bad dots782            for (let i = fileIndex; i < file.length; i++) {783                sawTail = true;784                const f = file[i];785                if (f === '.' ||786                    f === '..' ||787                    (!this.options.dot && f.startsWith('.'))) {788                    return false;789                }790            }791            return sawTail;792        }793        // have a non-globstar body section to test794        const [body, after] = bs;795        while (fileIndex <= after) {796            const m = this.#matchOne(file.slice(0, fileIndex + body.length), body, partial, fileIndex, 0);797            // if limit exceeded, no match. intentional false negative,798            // acceptable break in correctness for security.799            if (m && globStarDepth < this.maxGlobstarRecursion) {800                // match! see if the rest match. if so, we're done!801                const sub = this.#matchGlobStarBodySections(file, bodySegments, fileIndex + body.length, bodyIndex + 1, partial, globStarDepth + 1, sawTail);802                if (sub !== false) {803                    return sub;804                }805            }806            const f = file[fileIndex];807            if (f === '.' ||808                f === '..' ||809                (!this.options.dot && f.startsWith('.'))) {810                return false;811            }812            fileIndex++;813        }814        // walked off. no point continuing815        return partial || null;816    }817    #matchOne(file, pattern, partial, fileIndex, patternIndex) {818        let fi;819        let pi;820        let pl;821        let fl;822        for (fi = fileIndex,823            pi = patternIndex,824            fl = file.length,825            pl = pattern.length; fi < fl && pi < pl; fi++, pi++) {826            this.debug('matchOne loop');827            let p = pattern[pi];828            let f = file[fi];829            this.debug(pattern, p, f);830            // should be impossible.831            // some invalid regexp stuff in the set.832            /* c8 ignore start */833            if (p === false || p === GLOBSTAR) {834                return false;835            }836            /* c8 ignore stop */837            // something other than **838            // non-magic patterns just have to match exactly839            // patterns with magic have been turned into regexps.840            let hit;841            if (typeof p === 'string') {842                hit = f === p;843                this.debug('string match', p, f, hit);844            }845            else {846                hit = p.test(f);847                this.debug('pattern match', p, f, hit);848            }849            if (!hit)850                return false;851        }852        // Note: ending in / means that we'll get a final ""853        // at the end of the pattern.  This can only match a854        // corresponding "" at the end of the file.855        // If the file ends in /, then it can only match a856        // a pattern that ends in /, unless the pattern just857        // doesn't have any more for it. But, a/b/ should *not*858        // match "a/b/*", even though "" matches against the859        // [^/]*? pattern, except in partial mode, where it might860        // simply not be reached yet.861        // However, a/b/ should still satisfy a/*862        // now either we fell off the end of the pattern, or we're done.863        if (fi === fl && pi === pl) {864            // ran out of pattern and filename at the same time.865            // an exact hit!866            return true;867        }868        else if (fi === fl) {869            // ran out of file, but still had pattern left.870            // this is ok if we're doing the match as part of871            // a glob fs traversal.872            return partial;873        }874        else if (pi === pl) {875            // ran out of pattern, still have file left.876            // this is only acceptable if we're on the very last877            // empty segment of a file with a trailing slash.878            // a/* should match a/b/879            return fi === fl - 1 && file[fi] === '';880            /* c8 ignore start */881        }882        else {883            // should be unreachable.884            throw new Error('wtf?');885        }886        /* c8 ignore stop */887    }888    braceExpand() {889        return braceExpand(this.pattern, this.options);890    }891    parse(pattern) {892        assertValidPattern(pattern);893        const options = this.options;894        // shortcuts895        if (pattern === '**')896            return GLOBSTAR;897        if (pattern === '')898            return '';899        // far and away, the most common glob pattern parts are900        // *, *.*, and *.<ext>  Add a fast check method for those.901        let m;902        let fastTest = null;903        if ((m = pattern.match(starRE))) {904            fastTest = options.dot ? starTestDot : starTest;905        }906        else if ((m = pattern.match(starDotExtRE))) {907            fastTest = (options.nocase ?908                options.dot ?909                    starDotExtTestNocaseDot910                    : starDotExtTestNocase911                : options.dot ? starDotExtTestDot912                    : starDotExtTest)(m[1]);913        }914        else if ((m = pattern.match(qmarksRE))) {915            fastTest = (options.nocase ?916                options.dot ?917                    qmarksTestNocaseDot918                    : qmarksTestNocase919                : options.dot ? qmarksTestDot920                    : qmarksTest)(m);921        }922        else if ((m = pattern.match(starDotStarRE))) {923            fastTest = options.dot ? starDotStarTestDot : starDotStarTest;924        }925        else if ((m = pattern.match(dotStarRE))) {926            fastTest = dotStarTest;927        }928        const re = AST.fromGlob(pattern, this.options).toMMPattern();929        if (fastTest && typeof re === 'object') {930            // Avoids overriding in frozen environments931            Reflect.defineProperty(re, 'test', { value: fastTest });932        }933        return re;934    }935    makeRe() {936        if (this.regexp || this.regexp === false)937            return this.regexp;938        // at this point, this.set is a 2d array of partial939        // pattern strings, or "**".940        //941        // It's better to use .match().  This function shouldn't942        // be used, really, but it's pretty convenient sometimes,943        // when you just want to work with a regex.944        const set = this.set;945        if (!set.length) {946            this.regexp = false;947            return this.regexp;948        }949        const options = this.options;950        const twoStar = options.noglobstar ? star951            : options.dot ? twoStarDot952                : twoStarNoDot;953        const flags = new Set(options.nocase ? ['i'] : []);954        // regexpify non-globstar patterns955        // if ** is only item, then we just do one twoStar956        // if ** is first, and there are more, prepend (\/|twoStar\/)? to next957        // if ** is last, append (\/twoStar|) to previous958        // if ** is in the middle, append (\/|\/twoStar\/) to previous959        // then filter out GLOBSTAR symbols960        let re = set961            .map(pattern => {962            const pp = pattern.map(p => {963                if (p instanceof RegExp) {964                    for (const f of p.flags.split(''))965                        flags.add(f);966                }967                return (typeof p === 'string' ? regExpEscape(p)968                    : p === GLOBSTAR ? GLOBSTAR969                        : p._src);970            });971            pp.forEach((p, i) => {972                const next = pp[i + 1];973                const prev = pp[i - 1];974                if (p !== GLOBSTAR || prev === GLOBSTAR) {975                    return;976                }977                if (prev === undefined) {978                    if (next !== undefined && next !== GLOBSTAR) {979                        pp[i + 1] = '(?:\\/|' + twoStar + '\\/)?' + next;980                    }981                    else {982                        pp[i] = twoStar;983                    }984                }985                else if (next === undefined) {986                    pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + ')?';987                }988                else if (next !== GLOBSTAR) {989                    pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + '\\/)' + next;990                    pp[i + 1] = GLOBSTAR;991                }992            });993            const filtered = pp.filter(p => p !== GLOBSTAR);994            // For partial matches, we need to make the pattern match995            // any prefix of the full path. We do this by generating996            // alternative patterns that match progressively longer prefixes.997            if (this.partial && filtered.length >= 1) {998                const prefixes = [];999                for (let i = 1; i <= filtered.length; i++) {1000                    prefixes.push(filtered.slice(0, i).join('/'));1001                }1002                return '(?:' + prefixes.join('|') + ')';1003            }1004            return filtered.join('/');1005        })1006            .join('|');1007        // need to wrap in parens if we had more than one thing with |,1008        // otherwise only the first will be anchored to ^ and the last to $1009        const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', ''];1010        // must match entire pattern1011        // ending in a * or ** will make it less strict.1012        re = '^' + open + re + close + '$';1013        // In partial mode, '/' should always match as it's a valid prefix for any pattern1014        if (this.partial) {1015            re = '^(?:\\/|' + open + re.slice(1, -1) + close + ')$';1016        }1017        // can match anything, as long as it's not this.1018        if (this.negate)1019            re = '^(?!' + re + ').+$';1020        try {1021            this.regexp = new RegExp(re, [...flags].join(''));1022            /* c8 ignore start */1023        }1024        catch {1025            // should be impossible1026            this.regexp = false;1027        }1028        /* c8 ignore stop */1029        return this.regexp;1030    }1031    slashSplit(p) {1032        // if p starts with // on windows, we preserve that1033        // so that UNC paths aren't broken.  Otherwise, any number of1034        // / characters are coalesced into one, unless1035        // preserveMultipleSlashes is set to true.1036        if (this.preserveMultipleSlashes) {1037            return p.split('/');1038        }1039        else if (this.isWindows && /^\/\/[^/]+/.test(p)) {1040            // add an extra '' for the one we lose1041            return ['', ...p.split(/\/+/)];1042        }1043        else {1044            return p.split(/\/+/);1045        }1046    }1047    match(f, partial = this.partial) {1048        this.debug('match', f, this.pattern);1049        // short-circuit in the case of busted things.1050        // comments, etc.1051        if (this.comment) {1052            return false;1053        }1054        if (this.empty) {1055            return f === '';1056        }1057        if (f === '/' && partial) {1058            return true;1059        }1060        const options = this.options;1061        // windows: need to use /, not \1062        if (this.isWindows) {1063            f = f.split('\\').join('/');1064        }1065        // treat the test path as a set of pathparts.1066        const ff = this.slashSplit(f);1067        this.debug(this.pattern, 'split', ff);1068        // just ONE of the pattern sets in this.set needs to match1069        // in order for it to be valid.  If negating, then just one1070        // match means that we have failed.1071        // Either way, return on the first hit.1072        const set = this.set;1073        this.debug(this.pattern, 'set', set);1074        // Find the basename of the path by looking for the last non-empty segment1075        let filename = ff[ff.length - 1];1076        if (!filename) {1077            for (let i = ff.length - 2; !filename && i >= 0; i--) {1078                filename = ff[i];1079            }1080        }1081        for (const pattern of set) {1082            let file = ff;1083            if (options.matchBase && pattern.length === 1) {1084                file = [filename];1085            }1086            const hit = this.matchOne(file, pattern, partial);1087            if (hit) {1088                if (options.flipNegate) {1089                    return true;1090                }1091                return !this.negate;1092            }1093        }1094        // didn't get any hits.  this is success if it's a negative1095        // pattern, failure otherwise.1096        if (options.flipNegate) {1097            return false;1098        }1099        return this.negate;1100    }1101    static defaults(def) {1102        return minimatch.defaults(def).Minimatch;1103    }1104}1105/* c8 ignore start */1106export { AST } from './ast.js';1107export { escape } from './escape.js';1108export { unescape } from './unescape.js';1109/* c8 ignore stop */1110minimatch.AST = AST;1111minimatch.Minimatch = Minimatch;1112minimatch.escape = escape;1113minimatch.unescape = unescape;1114//# sourceMappingURL=index.js.map
Brunobkr/llama.cpp_AlgMor24_github · Team Ai