HEX
Server: Apache
System: Linux pdx1-shared-a1-38 6.6.104-grsec-jammy+ #3 SMP Tue Sep 16 00:28:11 UTC 2025 x86_64
User: mmickelson (3396398)
PHP: 8.1.31
Disabled: NONE
Upload Files
File: //usr/share/nodejs/fast-glob/out/utils/pattern.spec.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const assert = require("assert");
const util = require("./pattern");
describe('Utils → Pattern', () => {
    describe('.isStaticPattern', () => {
        it('should return true for static pattern', () => {
            const actual = util.isStaticPattern('dir');
            assert.ok(actual);
        });
        it('should return false for dynamic pattern', () => {
            const actual = util.isStaticPattern('*');
            assert.ok(!actual);
        });
    });
    describe('.isDynamicPattern', () => {
        describe('Without options', () => {
            it('should return false for an empty string', () => {
                assert.ok(!util.isDynamicPattern(''));
            });
            it('should return true for patterns that include the escape symbol', () => {
                assert.ok(util.isDynamicPattern('\\'));
            });
            it('should return true for everything when the `caseSensitiveMatch` option is disabled', () => {
                assert.ok(util.isDynamicPattern('abc', { caseSensitiveMatch: false }));
            });
            it('should return true for patterns that include common glob symbols', () => {
                assert.ok(util.isDynamicPattern('*'));
                assert.ok(util.isDynamicPattern('abc/*'));
                assert.ok(util.isDynamicPattern('?'));
                assert.ok(util.isDynamicPattern('abc/?'));
                assert.ok(util.isDynamicPattern('!abc'));
            });
            it('should return true for patterns that include regex group symbols', () => {
                assert.ok(util.isDynamicPattern('(a|)'));
                assert.ok(util.isDynamicPattern('(a|b)'));
                assert.ok(util.isDynamicPattern('abc/(a|b)'));
            });
            it('should return true for patterns that include regex character class symbols', () => {
                assert.ok(util.isDynamicPattern('[abc]'));
                assert.ok(util.isDynamicPattern('abc/[abc]'));
                assert.ok(util.isDynamicPattern('[^abc]'));
                assert.ok(util.isDynamicPattern('abc/[^abc]'));
                assert.ok(util.isDynamicPattern('[1-3]'));
                assert.ok(util.isDynamicPattern('abc/[1-3]'));
                assert.ok(util.isDynamicPattern('[[:alpha:][:digit:]]'));
                assert.ok(util.isDynamicPattern('abc/[[:alpha:][:digit:]]'));
            });
            it('should return true for patterns that include glob extension symbols', () => {
                assert.ok(util.isDynamicPattern('@()'));
                assert.ok(util.isDynamicPattern('@(a)'));
                assert.ok(util.isDynamicPattern('@(a|b)'));
                assert.ok(util.isDynamicPattern('abc/!(a|b)'));
                assert.ok(util.isDynamicPattern('*(a|b)'));
                assert.ok(util.isDynamicPattern('?(a|b)'));
                assert.ok(util.isDynamicPattern('+(a|b)'));
            });
            it('should return false for glob extension when the `extglob` option is disabled', () => {
                assert.ok(!util.isDynamicPattern('@()', { extglob: false }));
                assert.ok(!util.isDynamicPattern('@(a)', { extglob: false }));
                assert.ok(!util.isDynamicPattern('@(a|b)', { extglob: false }));
                assert.ok(!util.isDynamicPattern('abc/!(a|b)', { extglob: false }));
                assert.ok(util.isDynamicPattern('*(a|b)', { extglob: true }));
                assert.ok(util.isDynamicPattern('?(a|b)', { extglob: true }));
                assert.ok(!util.isDynamicPattern('+(a|b)', { extglob: false }));
            });
            it('should return true for patterns that include brace expansions symbols', () => {
                assert.ok(util.isDynamicPattern('{,}'));
                assert.ok(util.isDynamicPattern('{a,}'));
                assert.ok(util.isDynamicPattern('{,b}'));
                assert.ok(util.isDynamicPattern('{a,b}'));
                assert.ok(util.isDynamicPattern('{1..3}'));
            });
            it('should return false for brace extension when the `braceExpansion` option is disabled', () => {
                assert.ok(!util.isDynamicPattern('{,}', { braceExpansion: false }));
                assert.ok(!util.isDynamicPattern('{a,}', { braceExpansion: false }));
                assert.ok(!util.isDynamicPattern('{,b}', { braceExpansion: false }));
                assert.ok(!util.isDynamicPattern('{a,b}', { braceExpansion: false }));
                assert.ok(!util.isDynamicPattern('{1..3}', { braceExpansion: false }));
            });
            it('should return false for "!" symbols when a symbol is not specified first in the string', () => {
                assert.ok(!util.isDynamicPattern('abc!'));
            });
            it('should return false for a completely static pattern', () => {
                assert.ok(!util.isDynamicPattern(''));
                assert.ok(!util.isDynamicPattern('.'));
                assert.ok(!util.isDynamicPattern('abc'));
                assert.ok(!util.isDynamicPattern('~abc'));
                assert.ok(!util.isDynamicPattern('~/abc'));
                assert.ok(!util.isDynamicPattern('+~/abc'));
                assert.ok(!util.isDynamicPattern('@.(abc)'));
                assert.ok(!util.isDynamicPattern('(a b)'));
                assert.ok(!util.isDynamicPattern('(a b)'));
                assert.ok(!util.isDynamicPattern('[abc'));
            });
            it('should return false for unfinished regex character class', () => {
                assert.ok(!util.isDynamicPattern('['));
                assert.ok(!util.isDynamicPattern('[abc'));
            });
            it('should return false for unfinished regex group', () => {
                assert.ok(!util.isDynamicPattern('(a|b'));
                assert.ok(!util.isDynamicPattern('abc/(a|b'));
            });
            it('should return false for unfinished glob extension', () => {
                assert.ok(!util.isDynamicPattern('@('));
                assert.ok(!util.isDynamicPattern('@(a'));
                assert.ok(!util.isDynamicPattern('@(a|'));
                assert.ok(!util.isDynamicPattern('@(a|b'));
            });
            it('should return false for unfinished brace expansions', () => {
                assert.ok(!util.isDynamicPattern('{'));
                assert.ok(!util.isDynamicPattern('{a'));
                assert.ok(!util.isDynamicPattern('{,'));
                assert.ok(!util.isDynamicPattern('{a,'));
                assert.ok(!util.isDynamicPattern('{a,b'));
            });
        });
        describe('With options', () => {
            it('should return true for patterns that include "*?" symbols even when the "extglob" option is disabled', () => {
                assert.ok(util.isDynamicPattern('*(a|b)', { extglob: false }));
                assert.ok(util.isDynamicPattern('?(a|b)', { extglob: false }));
            });
            it('should return true when the "caseSensitiveMatch" option is enabled', () => {
                assert.ok(util.isDynamicPattern('a', { caseSensitiveMatch: false }));
            });
            it('should return false for glob extension when the "extglob" option is disabled', () => {
                assert.ok(!util.isDynamicPattern('@(a|b)', { extglob: false }));
                assert.ok(!util.isDynamicPattern('abc/!(a|b)', { extglob: false }));
                assert.ok(!util.isDynamicPattern('+(a|b)', { extglob: false }));
            });
            it('should return false for brace expansions when the "braceExpansion" option is disabled', () => {
                assert.ok(!util.isDynamicPattern('{a,b}', { braceExpansion: false }));
                assert.ok(!util.isDynamicPattern('{1..3}', { braceExpansion: false }));
            });
        });
    });
    describe('.convertToPositivePattern', () => {
        it('should returns converted positive pattern', () => {
            const expected = '*.js';
            const actual = util.convertToPositivePattern('!*.js');
            assert.strictEqual(actual, expected);
        });
        it('should returns pattern without changes', () => {
            const expected = '*.js';
            const actual = util.convertToPositivePattern('*.js');
            assert.strictEqual(actual, expected);
        });
    });
    describe('.convertToNegativePattern', () => {
        it('should returns converted negative pattern', () => {
            const expected = '!*.js';
            const actual = util.convertToNegativePattern('*.js');
            assert.strictEqual(actual, expected);
        });
    });
    describe('.isNegativePattern', () => {
        it('should returns true', () => {
            const actual = util.isNegativePattern('!*.md');
            assert.ok(actual);
        });
        it('should returns false', () => {
            const actual = util.isNegativePattern('*.md');
            assert.ok(!actual);
        });
        it('should returns false for extglob', () => {
            const actual = util.isNegativePattern('!(a|b|c)');
            assert.ok(!actual);
        });
    });
    describe('.isPositivePattern', () => {
        it('should returns true', () => {
            const actual = util.isPositivePattern('*.md');
            assert.ok(actual);
        });
        it('should returns false', () => {
            const actual = util.isPositivePattern('!*.md');
            assert.ok(!actual);
        });
    });
    describe('.getNegativePatterns', () => {
        it('should returns only negative patterns', () => {
            const expected = ['!*.spec.js'];
            const actual = util.getNegativePatterns(['*.js', '!*.spec.js', '*.ts']);
            assert.deepStrictEqual(actual, expected);
        });
        it('should returns empty array', () => {
            const expected = [];
            const actual = util.getNegativePatterns(['*.js', '*.ts']);
            assert.deepStrictEqual(actual, expected);
        });
    });
    describe('.getPositivePatterns', () => {
        it('should returns only positive patterns', () => {
            const expected = ['*.js', '*.ts'];
            const actual = util.getPositivePatterns(['*.js', '!*.spec.js', '*.ts']);
            assert.deepStrictEqual(actual, expected);
        });
        it('should returns empty array', () => {
            const expected = [];
            const actual = util.getPositivePatterns(['!*.js', '!*.ts']);
            assert.deepStrictEqual(actual, expected);
        });
    });
    describe('.getBaseDirectory', () => {
        it('should returns base directory', () => {
            const expected = 'root';
            const actual = util.getBaseDirectory('root/*.js');
            assert.strictEqual(actual, expected);
        });
        it('should returns base directory without slash transformation', () => {
            const expected = '.';
            const actual = util.getBaseDirectory('file-\\(suffix\\).md');
            assert.strictEqual(actual, expected);
        });
    });
    describe('.hasGlobStar', () => {
        it('should returns true for pattern that includes globstar', () => {
            const actual = util.hasGlobStar('**/*.js');
            assert.ok(actual);
        });
        it('should returns false for pattern that has no globstar', () => {
            const actual = util.hasGlobStar('*.js');
            assert.ok(!actual);
        });
    });
    describe('.endsWithSlashGlobStar', () => {
        it('should returns true for pattern that ends with slash and globstar', () => {
            const actual = util.endsWithSlashGlobStar('name/**');
            assert.ok(actual);
        });
        it('should returns false for pattern that has no slash, but ends with globstar', () => {
            const actual = util.endsWithSlashGlobStar('**');
            assert.ok(!actual);
        });
        it('should returns false for pattern that does not ends with globstar', () => {
            const actual = util.endsWithSlashGlobStar('name/**/*');
            assert.ok(!actual);
        });
    });
    describe('.isAffectDepthOfReadingPattern', () => {
        it('should return true for pattern that ends with slash and globstar', () => {
            const actual = util.isAffectDepthOfReadingPattern('name/**');
            assert.ok(actual);
        });
        it('should return true for pattern when the last partial of the pattern is static pattern', () => {
            const actual = util.isAffectDepthOfReadingPattern('**/name');
            assert.ok(actual);
        });
        it('should return false', () => {
            const actual = util.isAffectDepthOfReadingPattern('**/name/*');
            assert.ok(!actual);
        });
    });
    describe('.expandPatternsWithBraceExpansion', () => {
        it('should return an array of expanded patterns with brace expansion', () => {
            const expected = ['a/b/d', 'a/c/d', 'a/*', 'a/b/c'];
            const actual = util.expandPatternsWithBraceExpansion(['a/{b,c}/d', 'a/{*,b/c}']);
            assert.deepStrictEqual(actual, expected);
        });
    });
    describe('.expandBraceExpansion', () => {
        it('should return an array of expanded patterns with brace expansion without dupes', () => {
            const expected = ['a/b', 'a/c/d', 'a/c'];
            const actual = util.expandBraceExpansion('a/{b,c/d,{b,c}}');
            assert.deepStrictEqual(actual, expected);
        });
    });
    describe('.getPatternParts', () => {
        it('should return an array with a single item when the pattern is an empty string', () => {
            const expected = [''];
            const actual = util.getPatternParts('', {});
            assert.deepStrictEqual(actual, expected);
        });
        it('should return an array with a single item (micromatch/picomatch#58)', () => {
            const expected = ['a*'];
            const actual = util.getPatternParts('a*', {});
            assert.deepStrictEqual(actual, expected);
        });
        it('should return the correct set of parts for the pattern with a forward slash (micromatch/picomatch#58)', () => {
            const expected = ['', 'lib', '*'];
            const actual = util.getPatternParts('/lib/*', {});
            assert.deepStrictEqual(actual, expected);
        });
        it('should return an array of pattern parts', () => {
            const expected = ['a', '*', 'b', '**', 'c'];
            const actual = util.getPatternParts('a/*/b/**/c', {});
            assert.deepStrictEqual(actual, expected);
        });
    });
    describe('.makeRe', () => {
        it('should return regexp for provided pattern', () => {
            const actual = util.makeRe('*.js', {});
            assert.ok(actual instanceof RegExp);
        });
    });
    describe('.convertPatternsToRe', () => {
        it('should return regexps for provided patterns', () => {
            const [actual] = util.convertPatternsToRe(['*.js'], {});
            assert.ok(actual instanceof RegExp);
        });
    });
    describe('.matchAny', () => {
        it('should return true', () => {
            const actual = util.matchAny('fixtures/nested/file.txt', [/fixture/, /fixtures\/nested\/file/]);
            assert.ok(actual);
        });
        it('should return false', () => {
            const actual = util.matchAny('fixtures/directory', [/fixtures\/file/]);
            assert.ok(!actual);
        });
    });
});