@descent-vtt/spec-guard 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/engine.js ADDED
@@ -0,0 +1,539 @@
1
+ /**
2
+ * Search engines.
3
+ *
4
+ * Primary: native `ripgrep`, consumed as newline-delimited JSON. ripgrep is
5
+ * multi-threaded, gitignore-aware and binary-skipping, which is why spec-guard
6
+ * reaches for it before doing anything clever itself.
7
+ *
8
+ * Fallback: a pure-JS walker with identical assertion semantics, used when `rg`
9
+ * is not on PATH (or when `--engine js` is passed). Nothing about spec-guard's
10
+ * behaviour depends on ripgrep being installed - only its speed does.
11
+ *
12
+ * Both engines expose a batch API. Scanning a tree costs the same whether you
13
+ * look for one symbol or twenty, so assertions that share a target set and
14
+ * flags are answered by a single pass. Measured on a 2,000 file / 5 MB tree,
15
+ * eight assertions cost ~280ms as eight ripgrep passes and ~90ms as one.
16
+ */
17
+ import { spawn } from 'node:child_process';
18
+ import { promises as fs } from 'node:fs';
19
+ import path from 'node:path';
20
+ import { createGlobMatcher, toPosix, walkFiles } from './glob.js';
21
+ /** Files larger than this are skipped by both engines, keeping them in sync. */
22
+ export const MAX_FILE_SIZE = 20 * 1024 * 1024;
23
+ /** Hard cap on collected locations; the reporter only ever shows a handful. */
24
+ const MAX_COLLECTED_MATCHES = 500;
25
+ /** Longest line snippet echoed back to the terminal. */
26
+ const MAX_SNIPPET_LENGTH = 200;
27
+ export function escapeRegExp(value) {
28
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
29
+ }
30
+ function truncate(value) {
31
+ const trimmed = value.replace(/\r?\n$/, '');
32
+ return trimmed.length > MAX_SNIPPET_LENGTH ? `${trimmed.slice(0, MAX_SNIPPET_LENGTH)}…` : trimmed;
33
+ }
34
+ function sortLocations(locations) {
35
+ return locations.sort((a, b) => (a.file === b.file ? a.line - b.line : a.file < b.file ? -1 : 1));
36
+ }
37
+ function emptyTally() {
38
+ return { count: 0, locations: [] };
39
+ }
40
+ /**
41
+ * True when no two of these literals can ever match overlapping text, which is
42
+ * exactly when merging them into one ripgrep alternation is safe.
43
+ *
44
+ * Two ways an alternation loses a match that separate passes would find:
45
+ * containment - ["Primary", "PrimaryButton"] on "PrimaryButton"; and
46
+ * dovetailing - ["abc", "cd"] on "abcd", where the scan resumes past "cd".
47
+ * Rejecting both leaves batching indistinguishable from separate passes.
48
+ */
49
+ export function canBatchLiterals(patterns) {
50
+ for (const a of patterns) {
51
+ for (const b of patterns) {
52
+ if (a === b)
53
+ continue;
54
+ if (a.includes(b) || b.includes(a))
55
+ return false;
56
+ for (let offset = 1; offset < a.length; offset++) {
57
+ if (b.startsWith(a.slice(offset)))
58
+ return false;
59
+ }
60
+ }
61
+ }
62
+ return true;
63
+ }
64
+ /** Requests that may share one pass: same root, same targets, same options. */
65
+ function sharesOnePass(requests) {
66
+ const [first] = requests;
67
+ /* c8 ignore next -- runSearches never passes an empty list here */
68
+ if (!first)
69
+ return false;
70
+ return requests.every((request) => request.root === first.root &&
71
+ request.targets.length === first.targets.length &&
72
+ request.targets.every((target, index) => target === first.targets[index]) &&
73
+ request.options.regex === first.options.regex &&
74
+ request.options.word === first.options.word &&
75
+ request.options.ignoreCase === first.options.ignoreCase &&
76
+ request.options.globs.length === first.options.globs.length &&
77
+ request.options.globs.every((glob, index) => glob === first.options.globs[index]) &&
78
+ request.options.excludeFiles === first.options.excludeFiles);
79
+ }
80
+ /** Runs requests through the batch API when the engine has one. */
81
+ export async function runSearches(engine, requests) {
82
+ if (requests.length === 0)
83
+ return [];
84
+ if (requests.length === 1 || !engine.searchBatch || !sharesOnePass(requests)) {
85
+ return Promise.all(requests.map((request) => engine.search(request)));
86
+ }
87
+ return engine.searchBatch(requests);
88
+ }
89
+ /* ------------------------------------------------------------------ ripgrep */
90
+ /** Resolved once per process: the ripgrep binary to use, or null if absent. */
91
+ let ripgrepProbe;
92
+ export function resetRipgrepProbe() {
93
+ ripgrepProbe = undefined;
94
+ }
95
+ /** Locates a usable `rg` binary. `SPEC_GUARD_RG` overrides PATH lookup. */
96
+ export function findRipgrep() {
97
+ ripgrepProbe ??= new Promise((resolve) => {
98
+ const binary = process.env.SPEC_GUARD_RG || 'rg';
99
+ let child;
100
+ try {
101
+ child = spawn(binary, ['--version'], { stdio: 'ignore', windowsHide: true });
102
+ }
103
+ catch {
104
+ /* c8 ignore next 3 -- spawn only throws synchronously on bad arguments */
105
+ resolve(null);
106
+ return;
107
+ }
108
+ child.once('error', () => resolve(null));
109
+ child.once('close', (code) => resolve(code === 0 ? binary : null));
110
+ });
111
+ return ripgrepProbe;
112
+ }
113
+ function decodeText(value) {
114
+ if (typeof value?.text === 'string')
115
+ return value.text;
116
+ // ripgrep base64-encodes paths and lines that are not valid UTF-8.
117
+ /* c8 ignore next 2 -- needs a non-UTF-8 path on disk to reach */
118
+ if (typeof value?.bytes === 'string')
119
+ return Buffer.from(value.bytes, 'base64').toString('utf8');
120
+ return '';
121
+ }
122
+ /** Builds the argv for one ripgrep pass over `patterns`. */
123
+ export function buildRipgrepArgs(request, patterns = [request.symbol]) {
124
+ const { options } = request;
125
+ const args = ['--json', '--no-config', '--no-messages', `--max-filesize=${MAX_FILE_SIZE}`];
126
+ if (!options.regex)
127
+ args.push('--fixed-strings');
128
+ if (options.word)
129
+ args.push('--word-regexp');
130
+ if (options.ignoreCase)
131
+ args.push('--ignore-case');
132
+ for (const glob of options.globs)
133
+ args.push('--glob', glob);
134
+ for (const pattern of patterns)
135
+ args.push('--regexp', pattern);
136
+ args.push('--');
137
+ args.push(...(request.targets.length > 0 ? request.targets : ['.']));
138
+ return args;
139
+ }
140
+ /** Signals that a batched pass could not be attributed and must be re-run. */
141
+ class UnattributableBatch extends Error {
142
+ }
143
+ class RipgrepEngine {
144
+ binary;
145
+ name = 'ripgrep';
146
+ constructor(binary) {
147
+ this.binary = binary;
148
+ }
149
+ async search(request) {
150
+ const tallies = await this.run(request, [request.symbol]);
151
+ return this.toResult(tallies.get(request.symbol));
152
+ }
153
+ async searchBatch(requests) {
154
+ const [first] = requests;
155
+ if (!first)
156
+ return [];
157
+ const patterns = [...new Set(requests.map((request) => request.symbol))];
158
+ const batchable = patterns.length > 1 && !first.options.regex && !first.options.ignoreCase && canBatchLiterals(patterns);
159
+ if (!batchable) {
160
+ return Promise.all(requests.map((request) => this.search(request)));
161
+ }
162
+ try {
163
+ const tallies = await this.run(first, patterns);
164
+ return requests.map((request) => this.toResult(tallies.get(request.symbol)));
165
+ /* c8 ignore next 4 */
166
+ }
167
+ catch (error) {
168
+ if (!(error instanceof UnattributableBatch))
169
+ throw error;
170
+ return Promise.all(requests.map((request) => this.search(request)));
171
+ }
172
+ }
173
+ toResult(tally) {
174
+ const resolved = tally ?? emptyTally();
175
+ return { count: resolved.count, matches: sortLocations(resolved.locations), engine: this.name };
176
+ }
177
+ /** One ripgrep pass; returns a tally per pattern. */
178
+ run(request, patterns) {
179
+ return new Promise((resolve, reject) => {
180
+ const child = spawn(this.binary, buildRipgrepArgs(request, patterns), {
181
+ cwd: request.root,
182
+ windowsHide: true,
183
+ stdio: ['ignore', 'pipe', 'pipe'],
184
+ });
185
+ const single = patterns.length === 1 ? patterns[0] : null;
186
+ const tallies = new Map(patterns.map((pattern) => [pattern, emptyTally()]));
187
+ let pending = '';
188
+ let stderr = '';
189
+ let failure = null;
190
+ const handleEvent = (line) => {
191
+ if (line.length === 0 || failure)
192
+ return;
193
+ let event;
194
+ try {
195
+ event = JSON.parse(line);
196
+ }
197
+ catch {
198
+ /* c8 ignore next -- ripgrep only ever emits valid JSON lines */
199
+ return;
200
+ }
201
+ if (event.type !== 'match' || !event.data)
202
+ return;
203
+ const data = event.data;
204
+ const submatches = data.submatches ?? [];
205
+ if (submatches.length === 0)
206
+ return;
207
+ // ripgrep echoes the path as given ("./src/a.ts" when the target is
208
+ // "."); normalise so both engines report the same relative path.
209
+ const absolute = path.resolve(request.root, decodeText(data.path));
210
+ if (request.options.excludeFiles.has(absolute))
211
+ return;
212
+ const file = toPosix(path.relative(request.root, absolute));
213
+ const lineNumber = data.line_number ?? 0;
214
+ const text = truncate(decodeText(data.lines));
215
+ for (const submatch of submatches) {
216
+ // With --fixed-strings and no --ignore-case the matched text is the
217
+ // pattern verbatim, which is what makes attribution exact.
218
+ const pattern = single ?? decodeText(submatch.match);
219
+ const tally = tallies.get(pattern);
220
+ /* c8 ignore next 4 -- belt and braces: --fixed-strings guarantees a hit */
221
+ if (!tally) {
222
+ failure = new UnattributableBatch(`ripgrep reported an unexpected match: ${pattern}`);
223
+ return;
224
+ }
225
+ tally.count += 1;
226
+ const last = tally.locations.at(-1);
227
+ if (last && last.file === file && last.line === lineNumber) {
228
+ last.count += 1;
229
+ }
230
+ else if (tally.locations.length < MAX_COLLECTED_MATCHES) {
231
+ tally.locations.push({ file, line: lineNumber, column: (submatch.start ?? 0) + 1, text, count: 1 });
232
+ }
233
+ }
234
+ };
235
+ child.stdout.setEncoding('utf8');
236
+ child.stdout.on('data', (chunk) => {
237
+ pending += chunk;
238
+ let newline = pending.indexOf('\n');
239
+ while (newline !== -1) {
240
+ handleEvent(pending.slice(0, newline));
241
+ pending = pending.slice(newline + 1);
242
+ newline = pending.indexOf('\n');
243
+ }
244
+ });
245
+ child.stderr.setEncoding('utf8');
246
+ child.stderr.on('data', (chunk) => {
247
+ stderr += chunk;
248
+ });
249
+ child.once('error', reject);
250
+ child.once('close', (code) => {
251
+ handleEvent(pending);
252
+ if (failure) {
253
+ reject(failure);
254
+ return;
255
+ }
256
+ // 0 = matches, 1 = no matches, 2 = an actual failure.
257
+ if (code !== 0 && code !== 1) {
258
+ reject(new Error(`ripgrep exited with code ${code}${stderr ? `: ${stderr.trim()}` : ''}`));
259
+ return;
260
+ }
261
+ resolve(tallies);
262
+ });
263
+ });
264
+ }
265
+ }
266
+ /* --------------------------------------------------------------- javascript */
267
+ /** Builds the matching RegExp shared by the JS engine. */
268
+ export function buildJsRegExp(symbol, options) {
269
+ const flags = `g${options.ignoreCase ? 'i' : ''}`;
270
+ if (options.regex) {
271
+ const source = options.word ? `(?<![A-Za-z0-9_])(?:${symbol})(?![A-Za-z0-9_])` : symbol;
272
+ return new RegExp(source, flags);
273
+ }
274
+ const escaped = escapeRegExp(symbol);
275
+ const source = options.word ? `(?<![\\p{L}\\p{N}_])(?:${escaped})(?![\\p{L}\\p{N}_])` : escaped;
276
+ return new RegExp(source, `${flags}u`);
277
+ }
278
+ function isProbablyBinary(buffer) {
279
+ const limit = Math.min(buffer.length, 8192);
280
+ for (let index = 0; index < limit; index++) {
281
+ if (buffer[index] === 0)
282
+ return true;
283
+ }
284
+ return false;
285
+ }
286
+ class JavaScriptEngine {
287
+ name = 'javascript';
288
+ async search(request) {
289
+ const [result] = await this.searchBatch([request]);
290
+ return result;
291
+ }
292
+ /**
293
+ * Batching here is unconditionally safe: every pattern is scanned
294
+ * independently over the same file contents, so the answers are identical to
295
+ * separate passes - only the file reads are shared.
296
+ */
297
+ async searchBatch(requests) {
298
+ const [first] = requests;
299
+ if (!first)
300
+ return [];
301
+ const files = await this.collectFiles(first);
302
+ const patterns = [...new Set(requests.map((request) => request.symbol))];
303
+ const regexps = new Map(patterns.map((pattern) => [pattern, buildJsRegExp(pattern, first.options)]));
304
+ const tallies = new Map(patterns.map((pattern) => [pattern, emptyTally()]));
305
+ const concurrency = Math.min(16, Math.max(1, files.length));
306
+ let cursor = 0;
307
+ const perFile = new Map();
308
+ const worker = async () => {
309
+ while (cursor < files.length) {
310
+ const file = files[cursor++];
311
+ /* c8 ignore next -- cursor is bounded by files.length */
312
+ if (!file)
313
+ return;
314
+ const buffer = await fs.readFile(file.absolutePath).catch(() => null);
315
+ if (!buffer || isProbablyBinary(buffer))
316
+ continue;
317
+ const content = buffer.toString('utf8');
318
+ const scanned = new Map();
319
+ for (const [pattern, regexp] of regexps) {
320
+ scanned.set(pattern, scanContent(content, file.relativePath, regexp));
321
+ }
322
+ perFile.set(file.relativePath, scanned);
323
+ }
324
+ };
325
+ await Promise.all(Array.from({ length: concurrency }, worker));
326
+ // Merge in walk order so snippets come out sorted by path, like ripgrep's.
327
+ for (const file of files) {
328
+ const scanned = perFile.get(file.relativePath);
329
+ if (!scanned)
330
+ continue;
331
+ for (const [pattern, tally] of scanned) {
332
+ const total = tallies.get(pattern);
333
+ total.count += tally.count;
334
+ for (const location of tally.locations) {
335
+ if (total.locations.length < MAX_COLLECTED_MATCHES)
336
+ total.locations.push(location);
337
+ }
338
+ }
339
+ }
340
+ return requests.map((request) => {
341
+ const tally = tallies.get(request.symbol) ?? emptyTally();
342
+ return { count: tally.count, matches: tally.locations, engine: this.name };
343
+ });
344
+ }
345
+ /** Every file a request should look at, sorted by relative path. */
346
+ async collectFiles(request) {
347
+ const matcher = createGlobMatcher(request.options.globs);
348
+ const found = new Map();
349
+ for (const target of request.targets.length > 0 ? request.targets : ['.']) {
350
+ const absoluteTarget = path.resolve(request.root, target);
351
+ const stats = await fs.stat(absoluteTarget).catch(() => null);
352
+ if (!stats)
353
+ continue;
354
+ if (stats.isFile()) {
355
+ const relativePath = toPosix(path.relative(request.root, absoluteTarget));
356
+ if (stats.size <= MAX_FILE_SIZE && matcher(relativePath)) {
357
+ found.set(absoluteTarget, { absolutePath: absoluteTarget, relativePath });
358
+ }
359
+ continue;
360
+ }
361
+ for await (const file of walkFiles(absoluteTarget)) {
362
+ if (file.size > MAX_FILE_SIZE)
363
+ continue;
364
+ const relativePath = toPosix(path.relative(request.root, file.absolutePath));
365
+ if (!matcher(relativePath))
366
+ continue;
367
+ found.set(file.absolutePath, { absolutePath: file.absolutePath, relativePath });
368
+ }
369
+ }
370
+ for (const excluded of request.options.excludeFiles)
371
+ found.delete(excluded);
372
+ return [...found.values()].sort((a, b) => (a.relativePath < b.relativePath ? -1 : 1));
373
+ }
374
+ }
375
+ /** Counts matches in one file and records per-line snippets. */
376
+ export function scanContent(content, relativePath, regexp) {
377
+ regexp.lastIndex = 0;
378
+ let count = 0;
379
+ const byLine = new Map();
380
+ // Lazily built line index: only paid for when the file actually matches.
381
+ let lineStarts = null;
382
+ const lineOf = (index) => {
383
+ if (!lineStarts) {
384
+ lineStarts = [0];
385
+ for (let i = 0; i < content.length; i++) {
386
+ if (content[i] === '\n')
387
+ lineStarts.push(i + 1);
388
+ }
389
+ }
390
+ let low = 0;
391
+ let high = lineStarts.length - 1;
392
+ while (low < high) {
393
+ const mid = (low + high + 1) >> 1;
394
+ if (lineStarts[mid] <= index)
395
+ low = mid;
396
+ else
397
+ high = mid - 1;
398
+ }
399
+ return { line: low + 1, column: index - lineStarts[low] + 1 };
400
+ };
401
+ let match;
402
+ while ((match = regexp.exec(content)) !== null) {
403
+ count += 1;
404
+ const { line, column } = lineOf(match.index);
405
+ const existing = byLine.get(line);
406
+ if (existing) {
407
+ existing.count += 1;
408
+ }
409
+ else if (byLine.size < MAX_COLLECTED_MATCHES) {
410
+ const start = content.lastIndexOf('\n', match.index - 1) + 1;
411
+ const end = content.indexOf('\n', match.index);
412
+ byLine.set(line, {
413
+ file: relativePath,
414
+ line,
415
+ column,
416
+ text: truncate(content.slice(start, end === -1 ? content.length : end)),
417
+ count: 1,
418
+ });
419
+ }
420
+ if (match[0].length === 0)
421
+ regexp.lastIndex += 1;
422
+ }
423
+ return { count, locations: [...byLine.values()].sort((a, b) => a.line - b.line) };
424
+ }
425
+ export const javascriptEngine = new JavaScriptEngine();
426
+ /** Spawn failures that mean "this binary is not installed", not "search failed". */
427
+ const MISSING_BINARY_CODES = new Set(['ENOENT', 'EACCES', 'EPERM', 'EINVAL', 'UNKNOWN']);
428
+ function isMissingBinary(error) {
429
+ const code = error?.code;
430
+ return typeof code === 'string' && MISSING_BINARY_CODES.has(code);
431
+ }
432
+ /**
433
+ * Tries ripgrep on the first search and remembers the answer.
434
+ *
435
+ * Probing with `rg --version` up front would be simpler, but a process spawn
436
+ * costs ~27ms on Windows - as much as a whole search - and that probe sits on
437
+ * the critical path of every run. Discovering ripgrep's absence from the first
438
+ * real search is free.
439
+ */
440
+ class AutoEngine {
441
+ mode = 'unknown';
442
+ ripgrep = new RipgrepEngine(process.env.SPEC_GUARD_RG || 'rg');
443
+ get name() {
444
+ return this.mode === 'javascript' ? 'javascript' : 'ripgrep';
445
+ }
446
+ async search(request) {
447
+ const [result] = await this.searchBatch([request]);
448
+ return result;
449
+ }
450
+ async searchBatch(requests) {
451
+ if (this.mode !== 'javascript') {
452
+ try {
453
+ const results = await this.ripgrep.searchBatch(requests);
454
+ this.mode = 'ripgrep';
455
+ return results;
456
+ }
457
+ catch (error) {
458
+ if (!isMissingBinary(error))
459
+ throw error;
460
+ this.mode = 'javascript';
461
+ }
462
+ }
463
+ return javascriptEngine.searchBatch(requests);
464
+ }
465
+ }
466
+ /** Resolves the engine to use, honouring an explicit preference. */
467
+ export async function resolveEngine(preference = 'auto') {
468
+ if (preference === 'javascript')
469
+ return javascriptEngine;
470
+ if (preference === 'ripgrep') {
471
+ const binary = await findRipgrep();
472
+ if (!binary) {
473
+ throw new Error('ripgrep (rg) was requested with --engine rg but is not available on PATH.');
474
+ }
475
+ return new RipgrepEngine(binary);
476
+ }
477
+ return new AutoEngine();
478
+ }
479
+ /**
480
+ * Wraps an engine with a de-duplicating cache plus an automatic fallback to the
481
+ * JS engine, so a ripgrep hiccup degrades to "slower" instead of "broken".
482
+ */
483
+ export function createCachedEngine(engine) {
484
+ const cache = new Map();
485
+ const fallbacks = [];
486
+ const keyOf = (request) => JSON.stringify([
487
+ request.root,
488
+ request.symbol,
489
+ request.targets,
490
+ request.options.regex,
491
+ request.options.word,
492
+ request.options.ignoreCase,
493
+ request.options.globs,
494
+ [...request.options.excludeFiles].sort(),
495
+ ]);
496
+ const recordFallback = (error) => {
497
+ fallbacks.push(error instanceof Error ? error.message : String(error));
498
+ };
499
+ return {
500
+ // A getter, not a snapshot: the auto engine only learns which backend it is
501
+ // using once the first search has run.
502
+ get name() {
503
+ return engine.name;
504
+ },
505
+ fallbacks,
506
+ search(request) {
507
+ const key = keyOf(request);
508
+ let result = cache.get(key);
509
+ if (!result) {
510
+ result = engine.search(request).catch(async (error) => {
511
+ if (engine === javascriptEngine)
512
+ throw error;
513
+ recordFallback(error);
514
+ return javascriptEngine.search(request);
515
+ });
516
+ cache.set(key, result);
517
+ }
518
+ return result;
519
+ },
520
+ async searchBatch(requests) {
521
+ const keys = requests.map(keyOf);
522
+ const missing = requests.filter((_, index) => !cache.has(keys[index]));
523
+ const uncached = [...new Map(missing.map((request) => [keyOf(request), request])).values()];
524
+ if (uncached.length > 0) {
525
+ const pending = runSearches(engine, uncached).catch(async (error) => {
526
+ if (engine === javascriptEngine)
527
+ throw error;
528
+ recordFallback(error);
529
+ return runSearches(javascriptEngine, uncached);
530
+ });
531
+ uncached.forEach((request, index) => {
532
+ cache.set(keyOf(request), pending.then((results) => results[index]));
533
+ });
534
+ }
535
+ return Promise.all(keys.map((key) => cache.get(key)));
536
+ },
537
+ };
538
+ }
539
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
package/dist/glob.d.ts ADDED
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Dependency-free glob matching and directory walking.
3
+ *
4
+ * Windows shells do not expand globs, so `spec-guard "docs/**\/*.md"` must
5
+ * behave identically on every platform. spec-guard therefore always expands
6
+ * patterns itself instead of trusting the shell.
7
+ */
8
+ /** Directories never worth searching. Mirrors ripgrep's practical defaults. */
9
+ export declare const DEFAULT_IGNORED_DIRECTORIES: ReadonlySet<string>;
10
+ /** True when the pattern contains glob metacharacters. */
11
+ export declare function isGlob(pattern: string): boolean;
12
+ /** Normalises Windows separators so every internal path uses `/`. */
13
+ export declare function toPosix(value: string): string;
14
+ /**
15
+ * Converts a glob to an anchored RegExp.
16
+ * Supports `*`, `**`, `?`, `[...]` and `{a,b}` - the subset every developer
17
+ * already knows from .gitignore and ripgrep.
18
+ */
19
+ export declare function globToRegExp(pattern: string, options?: {
20
+ ignoreCase?: boolean;
21
+ }): RegExp;
22
+ /**
23
+ * Builds a predicate over root-relative POSIX paths.
24
+ *
25
+ * Following ripgrep's `-g` semantics, a pattern without a `/` is matched
26
+ * against the file's basename (`*.ts` matches `src/deep/a.ts`), while a pattern
27
+ * containing `/` is matched against the whole relative path.
28
+ */
29
+ export declare function createGlobMatcher(patterns: readonly string[]): (relativePath: string) => boolean;
30
+ export interface WalkOptions {
31
+ /** Directory names to skip entirely. */
32
+ ignoredDirectories?: ReadonlySet<string>;
33
+ /** Include dotfiles and dot-directories. */
34
+ includeHidden?: boolean;
35
+ /** Follow symbolic links (off by default - cycles are not worth the risk). */
36
+ followSymlinks?: boolean;
37
+ }
38
+ export interface WalkedFile {
39
+ absolutePath: string;
40
+ /** Path relative to the walk root, POSIX separators. */
41
+ relativePath: string;
42
+ size: number;
43
+ }
44
+ /**
45
+ * Depth-first directory walk yielding regular files.
46
+ * Emits nothing when `root` is missing or is not a directory.
47
+ */
48
+ export declare function walkFiles(root: string, options?: WalkOptions): AsyncGenerator<WalkedFile>;
49
+ /** Longest leading directory of a glob that contains no metacharacters. */
50
+ export declare function globBase(pattern: string): {
51
+ base: string;
52
+ rest: string;
53
+ };
54
+ /**
55
+ * Expands CLI spec patterns into a sorted, de-duplicated list of absolute file
56
+ * paths. Plain paths are taken literally; a directory expands to the Markdown
57
+ * files it contains.
58
+ */
59
+ export declare function expandSpecPatterns(patterns: readonly string[], root: string, defaultExtensions?: readonly string[]): Promise<string[]>;
60
+ //# sourceMappingURL=glob.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../src/glob.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,+EAA+E;AAC/E,eAAO,MAAM,2BAA2B,EAAE,WAAW,CAAC,MAAM,CAkB1D,CAAC;AAIH,0DAA0D;AAC1D,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED,qEAAqE;AACrE,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7C;AAID;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,CAiE5F;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAchG;AAED,MAAM,WAAW,WAAW;IAC1B,wCAAwC;IACxC,kBAAkB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,4CAA4C;IAC5C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,8EAA8E;IAC9E,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAuB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,cAAc,CAAC,UAAU,CAAC,CAqDpG;AAED,2EAA2E;AAC3E,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAUxE;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,IAAI,EAAE,MAAM,EACZ,iBAAiB,GAAE,SAAS,MAAM,EAAiC,GAClE,OAAO,CAAC,MAAM,EAAE,CAAC,CAoCnB"}