find files

This commit is contained in:
seb
2026-09-23 07:23:03 +02:00
parent e416ca09c1
commit 917d3d455c
8 changed files with 328 additions and 57 deletions

61
test/glob.test.js Normal file
View File

@@ -0,0 +1,61 @@
'use strict';
/**
* Tests for the glob helpers in src/glob.js, shared by ripgrep and find_files.
*
* Run with: node --test
* (or) node --test test/glob.test.js
*/
import test from 'node:test';
import assert from 'node:assert/strict';
import { escapeRegExp, globToRegExp, makeGlobMatcher } from '../src/glob.js';
test('escapeRegExp: escapes regex metacharacters', () => {
assert.equal(escapeRegExp('a.b*c'), 'a\\.b\\*c');
assert.ok(new RegExp(escapeRegExp('a.b')).test('a.b'));
assert.ok(!new RegExp(escapeRegExp('a.b')).test('axb'));
});
test('globToRegExp: * stays within a path segment', () => {
const rx = globToRegExp('*.js');
assert.ok(rx.test('a.js'));
assert.ok(!rx.test('src/a.js'));
});
test('globToRegExp: ** crosses path separators', () => {
const rx = globToRegExp('src/**/*.js');
assert.ok(rx.test('src/a/b/c.js'));
// "**/" also matches zero directories.
assert.ok(rx.test('src/a.js'));
});
test('globToRegExp: ? matches a single non-slash char', () => {
const rx = globToRegExp('a?c');
assert.ok(rx.test('abc'));
assert.ok(!rx.test('ac'));
assert.ok(!rx.test('a/c'));
});
test('makeGlobMatcher: slashless glob also matches the basename', () => {
const m = makeGlobMatcher('*.js');
assert.ok(m('src/a.js', 'a.js'));
assert.ok(!m('src/a.ts', 'a.ts'));
});
test('makeGlobMatcher: glob with a slash matches the whole path', () => {
const m = makeGlobMatcher('src/**/*.js');
assert.ok(m('src/tools/a.js', 'a.js'));
assert.ok(!m('test/a.js', 'a.js'));
});
test('makeGlobMatcher: ignores a trailing slash on directories', () => {
const m = makeGlobMatcher('node_modules');
assert.ok(m('node_modules/', 'node_modules'));
});
test('makeGlobMatcher: ignoreCase makes matching case-insensitive', () => {
assert.ok(makeGlobMatcher('*.JS', { ignoreCase: true })('a.js', 'a.js'));
assert.ok(!makeGlobMatcher('*.JS')('a.js', 'a.js'));
});