mirror of
				https://scm.univ-tours.fr/22107988t/rappaurio-sae501_502.git
				synced 2025-11-04 15:05:23 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			234 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			234 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import { Minimatch } from 'minimatch';
 | 
						|
import { PathScurry, PathScurryDarwin, PathScurryPosix, PathScurryWin32, } from 'path-scurry';
 | 
						|
import { fileURLToPath } from 'url';
 | 
						|
import { Pattern } from './pattern.js';
 | 
						|
import { GlobStream, GlobWalker } from './walker.js';
 | 
						|
// if no process global, just call it linux.
 | 
						|
// so we default to case-sensitive, / separators
 | 
						|
const defaultPlatform = typeof process === 'object' &&
 | 
						|
    process &&
 | 
						|
    typeof process.platform === 'string'
 | 
						|
    ? process.platform
 | 
						|
    : 'linux';
 | 
						|
/**
 | 
						|
 * An object that can perform glob pattern traversals.
 | 
						|
 */
 | 
						|
export class Glob {
 | 
						|
    absolute;
 | 
						|
    cwd;
 | 
						|
    root;
 | 
						|
    dot;
 | 
						|
    dotRelative;
 | 
						|
    follow;
 | 
						|
    ignore;
 | 
						|
    magicalBraces;
 | 
						|
    mark;
 | 
						|
    matchBase;
 | 
						|
    maxDepth;
 | 
						|
    nobrace;
 | 
						|
    nocase;
 | 
						|
    nodir;
 | 
						|
    noext;
 | 
						|
    noglobstar;
 | 
						|
    pattern;
 | 
						|
    platform;
 | 
						|
    realpath;
 | 
						|
    scurry;
 | 
						|
    stat;
 | 
						|
    signal;
 | 
						|
    windowsPathsNoEscape;
 | 
						|
    withFileTypes;
 | 
						|
    /**
 | 
						|
     * The options provided to the constructor.
 | 
						|
     */
 | 
						|
    opts;
 | 
						|
    /**
 | 
						|
     * An array of parsed immutable {@link Pattern} objects.
 | 
						|
     */
 | 
						|
    patterns;
 | 
						|
    /**
 | 
						|
     * All options are stored as properties on the `Glob` object.
 | 
						|
     *
 | 
						|
     * See {@link GlobOptions} for full options descriptions.
 | 
						|
     *
 | 
						|
     * Note that a previous `Glob` object can be passed as the
 | 
						|
     * `GlobOptions` to another `Glob` instantiation to re-use settings
 | 
						|
     * and caches with a new pattern.
 | 
						|
     *
 | 
						|
     * Traversal functions can be called multiple times to run the walk
 | 
						|
     * again.
 | 
						|
     */
 | 
						|
    constructor(pattern, opts) {
 | 
						|
        /* c8 ignore start */
 | 
						|
        if (!opts)
 | 
						|
            throw new TypeError('glob options required');
 | 
						|
        /* c8 ignore stop */
 | 
						|
        this.withFileTypes = !!opts.withFileTypes;
 | 
						|
        this.signal = opts.signal;
 | 
						|
        this.follow = !!opts.follow;
 | 
						|
        this.dot = !!opts.dot;
 | 
						|
        this.dotRelative = !!opts.dotRelative;
 | 
						|
        this.nodir = !!opts.nodir;
 | 
						|
        this.mark = !!opts.mark;
 | 
						|
        if (!opts.cwd) {
 | 
						|
            this.cwd = '';
 | 
						|
        }
 | 
						|
        else if (opts.cwd instanceof URL || opts.cwd.startsWith('file://')) {
 | 
						|
            opts.cwd = fileURLToPath(opts.cwd);
 | 
						|
        }
 | 
						|
        this.cwd = opts.cwd || '';
 | 
						|
        this.root = opts.root;
 | 
						|
        this.magicalBraces = !!opts.magicalBraces;
 | 
						|
        this.nobrace = !!opts.nobrace;
 | 
						|
        this.noext = !!opts.noext;
 | 
						|
        this.realpath = !!opts.realpath;
 | 
						|
        this.absolute = opts.absolute;
 | 
						|
        this.noglobstar = !!opts.noglobstar;
 | 
						|
        this.matchBase = !!opts.matchBase;
 | 
						|
        this.maxDepth =
 | 
						|
            typeof opts.maxDepth === 'number' ? opts.maxDepth : Infinity;
 | 
						|
        this.stat = !!opts.stat;
 | 
						|
        this.ignore = opts.ignore;
 | 
						|
        if (this.withFileTypes && this.absolute !== undefined) {
 | 
						|
            throw new Error('cannot set absolute and withFileTypes:true');
 | 
						|
        }
 | 
						|
        if (typeof pattern === 'string') {
 | 
						|
            pattern = [pattern];
 | 
						|
        }
 | 
						|
        this.windowsPathsNoEscape =
 | 
						|
            !!opts.windowsPathsNoEscape ||
 | 
						|
                opts.allowWindowsEscape === false;
 | 
						|
        if (this.windowsPathsNoEscape) {
 | 
						|
            pattern = pattern.map(p => p.replace(/\\/g, '/'));
 | 
						|
        }
 | 
						|
        if (this.matchBase) {
 | 
						|
            if (opts.noglobstar) {
 | 
						|
                throw new TypeError('base matching requires globstar');
 | 
						|
            }
 | 
						|
            pattern = pattern.map(p => (p.includes('/') ? p : `./**/${p}`));
 | 
						|
        }
 | 
						|
        this.pattern = pattern;
 | 
						|
        this.platform = opts.platform || defaultPlatform;
 | 
						|
        this.opts = { ...opts, platform: this.platform };
 | 
						|
        if (opts.scurry) {
 | 
						|
            this.scurry = opts.scurry;
 | 
						|
            if (opts.nocase !== undefined &&
 | 
						|
                opts.nocase !== opts.scurry.nocase) {
 | 
						|
                throw new Error('nocase option contradicts provided scurry option');
 | 
						|
            }
 | 
						|
        }
 | 
						|
        else {
 | 
						|
            const Scurry = opts.platform === 'win32'
 | 
						|
                ? PathScurryWin32
 | 
						|
                : opts.platform === 'darwin'
 | 
						|
                    ? PathScurryDarwin
 | 
						|
                    : opts.platform
 | 
						|
                        ? PathScurryPosix
 | 
						|
                        : PathScurry;
 | 
						|
            this.scurry = new Scurry(this.cwd, {
 | 
						|
                nocase: opts.nocase,
 | 
						|
                fs: opts.fs,
 | 
						|
            });
 | 
						|
        }
 | 
						|
        this.nocase = this.scurry.nocase;
 | 
						|
        // If you do nocase:true on a case-sensitive file system, then
 | 
						|
        // we need to use regexps instead of strings for non-magic
 | 
						|
        // path portions, because statting `aBc` won't return results
 | 
						|
        // for the file `AbC` for example.
 | 
						|
        const nocaseMagicOnly = this.platform === 'darwin' || this.platform === 'win32';
 | 
						|
        const mmo = {
 | 
						|
            // default nocase based on platform
 | 
						|
            ...opts,
 | 
						|
            dot: this.dot,
 | 
						|
            matchBase: this.matchBase,
 | 
						|
            nobrace: this.nobrace,
 | 
						|
            nocase: this.nocase,
 | 
						|
            nocaseMagicOnly,
 | 
						|
            nocomment: true,
 | 
						|
            noext: this.noext,
 | 
						|
            nonegate: true,
 | 
						|
            optimizationLevel: 2,
 | 
						|
            platform: this.platform,
 | 
						|
            windowsPathsNoEscape: this.windowsPathsNoEscape,
 | 
						|
            debug: !!this.opts.debug,
 | 
						|
        };
 | 
						|
        const mms = this.pattern.map(p => new Minimatch(p, mmo));
 | 
						|
        const [matchSet, globParts] = mms.reduce((set, m) => {
 | 
						|
            set[0].push(...m.set);
 | 
						|
            set[1].push(...m.globParts);
 | 
						|
            return set;
 | 
						|
        }, [[], []]);
 | 
						|
        this.patterns = matchSet.map((set, i) => {
 | 
						|
            return new Pattern(set, globParts[i], 0, this.platform);
 | 
						|
        });
 | 
						|
    }
 | 
						|
    async walk() {
 | 
						|
        // Walkers always return array of Path objects, so we just have to
 | 
						|
        // coerce them into the right shape.  It will have already called
 | 
						|
        // realpath() if the option was set to do so, so we know that's cached.
 | 
						|
        // start out knowing the cwd, at least
 | 
						|
        return [
 | 
						|
            ...(await new GlobWalker(this.patterns, this.scurry.cwd, {
 | 
						|
                ...this.opts,
 | 
						|
                maxDepth: this.maxDepth !== Infinity
 | 
						|
                    ? this.maxDepth + this.scurry.cwd.depth()
 | 
						|
                    : Infinity,
 | 
						|
                platform: this.platform,
 | 
						|
                nocase: this.nocase,
 | 
						|
            }).walk()),
 | 
						|
        ];
 | 
						|
    }
 | 
						|
    walkSync() {
 | 
						|
        return [
 | 
						|
            ...new GlobWalker(this.patterns, this.scurry.cwd, {
 | 
						|
                ...this.opts,
 | 
						|
                maxDepth: this.maxDepth !== Infinity
 | 
						|
                    ? this.maxDepth + this.scurry.cwd.depth()
 | 
						|
                    : Infinity,
 | 
						|
                platform: this.platform,
 | 
						|
                nocase: this.nocase,
 | 
						|
            }).walkSync(),
 | 
						|
        ];
 | 
						|
    }
 | 
						|
    stream() {
 | 
						|
        return new GlobStream(this.patterns, this.scurry.cwd, {
 | 
						|
            ...this.opts,
 | 
						|
            maxDepth: this.maxDepth !== Infinity
 | 
						|
                ? this.maxDepth + this.scurry.cwd.depth()
 | 
						|
                : Infinity,
 | 
						|
            platform: this.platform,
 | 
						|
            nocase: this.nocase,
 | 
						|
        }).stream();
 | 
						|
    }
 | 
						|
    streamSync() {
 | 
						|
        return new GlobStream(this.patterns, this.scurry.cwd, {
 | 
						|
            ...this.opts,
 | 
						|
            maxDepth: this.maxDepth !== Infinity
 | 
						|
                ? this.maxDepth + this.scurry.cwd.depth()
 | 
						|
                : Infinity,
 | 
						|
            platform: this.platform,
 | 
						|
            nocase: this.nocase,
 | 
						|
        }).streamSync();
 | 
						|
    }
 | 
						|
    /**
 | 
						|
     * Default sync iteration function. Returns a Generator that
 | 
						|
     * iterates over the results.
 | 
						|
     */
 | 
						|
    iterateSync() {
 | 
						|
        return this.streamSync()[Symbol.iterator]();
 | 
						|
    }
 | 
						|
    [Symbol.iterator]() {
 | 
						|
        return this.iterateSync();
 | 
						|
    }
 | 
						|
    /**
 | 
						|
     * Default async iteration function. Returns an AsyncGenerator that
 | 
						|
     * iterates over the results.
 | 
						|
     */
 | 
						|
    iterate() {
 | 
						|
        return this.stream()[Symbol.asyncIterator]();
 | 
						|
    }
 | 
						|
    [Symbol.asyncIterator]() {
 | 
						|
        return this.iterate();
 | 
						|
    }
 | 
						|
}
 | 
						|
//# sourceMappingURL=glob.js.map
 |