@sergenkabakci/grept 0.0.0-stage → 1.0.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.
Files changed (100) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +169 -2
  3. package/bin/grept.js +2 -0
  4. package/dist/cli/args.d.ts +50 -0
  5. package/dist/cli/args.d.ts.map +1 -0
  6. package/dist/cli/args.js +501 -0
  7. package/dist/cli/args.js.map +1 -0
  8. package/dist/cli/help.d.ts +2 -0
  9. package/dist/cli/help.d.ts.map +1 -0
  10. package/dist/cli/help.js +76 -0
  11. package/dist/cli/help.js.map +1 -0
  12. package/dist/cli/version.d.ts +3 -0
  13. package/dist/cli/version.d.ts.map +1 -0
  14. package/dist/cli/version.js +11 -0
  15. package/dist/cli/version.js.map +1 -0
  16. package/dist/core/binary.d.ts +6 -0
  17. package/dist/core/binary.d.ts.map +1 -0
  18. package/dist/core/binary.js +14 -0
  19. package/dist/core/binary.js.map +1 -0
  20. package/dist/core/encoding.d.ts +10 -0
  21. package/dist/core/encoding.d.ts.map +1 -0
  22. package/dist/core/encoding.js +16 -0
  23. package/dist/core/encoding.js.map +1 -0
  24. package/dist/core/line-reader.d.ts +19 -0
  25. package/dist/core/line-reader.d.ts.map +1 -0
  26. package/dist/core/line-reader.js +69 -0
  27. package/dist/core/line-reader.js.map +1 -0
  28. package/dist/core/matcher.d.ts +58 -0
  29. package/dist/core/matcher.d.ts.map +1 -0
  30. package/dist/core/matcher.js +342 -0
  31. package/dist/core/matcher.js.map +1 -0
  32. package/dist/core/offsets.d.ts +5 -0
  33. package/dist/core/offsets.d.ts.map +1 -0
  34. package/dist/core/offsets.js +11 -0
  35. package/dist/core/offsets.js.map +1 -0
  36. package/dist/core/patterns.d.ts +17 -0
  37. package/dist/core/patterns.d.ts.map +1 -0
  38. package/dist/core/patterns.js +223 -0
  39. package/dist/core/patterns.js.map +1 -0
  40. package/dist/core/search.d.ts +5 -0
  41. package/dist/core/search.d.ts.map +1 -0
  42. package/dist/core/search.js +249 -0
  43. package/dist/core/search.js.map +1 -0
  44. package/dist/errors/errors.d.ts +17 -0
  45. package/dist/errors/errors.d.ts.map +1 -0
  46. package/dist/errors/errors.js +32 -0
  47. package/dist/errors/errors.js.map +1 -0
  48. package/dist/errors/exit-codes.d.ts +7 -0
  49. package/dist/errors/exit-codes.d.ts.map +1 -0
  50. package/dist/errors/exit-codes.js +6 -0
  51. package/dist/errors/exit-codes.js.map +1 -0
  52. package/dist/filesystem/discover.d.ts +10 -0
  53. package/dist/filesystem/discover.d.ts.map +1 -0
  54. package/dist/filesystem/discover.js +110 -0
  55. package/dist/filesystem/discover.js.map +1 -0
  56. package/dist/filesystem/glob.d.ts +9 -0
  57. package/dist/filesystem/glob.d.ts.map +1 -0
  58. package/dist/filesystem/glob.js +61 -0
  59. package/dist/filesystem/glob.js.map +1 -0
  60. package/dist/filesystem/reparse-points.d.ts +10 -0
  61. package/dist/filesystem/reparse-points.d.ts.map +1 -0
  62. package/dist/filesystem/reparse-points.js +28 -0
  63. package/dist/filesystem/reparse-points.js.map +1 -0
  64. package/dist/filesystem/traversal.d.ts +15 -0
  65. package/dist/filesystem/traversal.d.ts.map +1 -0
  66. package/dist/filesystem/traversal.js +88 -0
  67. package/dist/filesystem/traversal.js.map +1 -0
  68. package/dist/index.d.ts +9 -0
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +50 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/output/color.d.ts +11 -0
  73. package/dist/output/color.d.ts.map +1 -0
  74. package/dist/output/color.js +25 -0
  75. package/dist/output/color.js.map +1 -0
  76. package/dist/output/context.d.ts +21 -0
  77. package/dist/output/context.d.ts.map +1 -0
  78. package/dist/output/context.js +78 -0
  79. package/dist/output/context.js.map +1 -0
  80. package/dist/output/formatter.d.ts +24 -0
  81. package/dist/output/formatter.d.ts.map +1 -0
  82. package/dist/output/formatter.js +112 -0
  83. package/dist/output/formatter.js.map +1 -0
  84. package/dist/output/writer.d.ts +10 -0
  85. package/dist/output/writer.d.ts.map +1 -0
  86. package/dist/output/writer.js +62 -0
  87. package/dist/output/writer.js.map +1 -0
  88. package/dist/utils/terminal.d.ts +7 -0
  89. package/dist/utils/terminal.d.ts.map +1 -0
  90. package/dist/utils/terminal.js +21 -0
  91. package/dist/utils/terminal.js.map +1 -0
  92. package/dist/utils/windows-paths.d.ts +21 -0
  93. package/dist/utils/windows-paths.d.ts.map +1 -0
  94. package/dist/utils/windows-paths.js +47 -0
  95. package/dist/utils/windows-paths.js.map +1 -0
  96. package/docs/COMPATIBILITY.md +118 -0
  97. package/docs/PERFORMANCE.md +58 -0
  98. package/docs/REGEX.md +99 -0
  99. package/docs/WINDOWS.md +46 -0
  100. package/package.json +65 -4
@@ -0,0 +1,110 @@
1
+ import fs from 'node:fs';
2
+ import fsp from 'node:fs/promises';
3
+ import { traverseDirectory } from './traversal.js';
4
+ import { ReparseCycleTracker } from './reparse-points.js';
5
+ import { normalizeWindowsPath } from '../utils/windows-paths.js';
6
+ export async function* discoverTargets(options) {
7
+ // Load extra exclude globs from --exclude-from files
8
+ for (const exFile of options.excludeFrom) {
9
+ try {
10
+ const content = fs.readFileSync(exFile, 'utf8');
11
+ for (const line of content.split(/\r?\n/)) {
12
+ const trimmed = line.trim();
13
+ if (trimmed && !trimmed.startsWith('#')) {
14
+ options.excludes.push(trimmed);
15
+ }
16
+ }
17
+ }
18
+ catch (err) {
19
+ const msg = err instanceof Error ? err.message : String(err);
20
+ yield {
21
+ isStdin: false,
22
+ filePath: exFile,
23
+ displayPath: exFile,
24
+ isError: true,
25
+ errorMessage: `cannot open exclude-from file '${exFile}': ${msg}`,
26
+ };
27
+ return;
28
+ }
29
+ }
30
+ const targets = options.targets.length > 0 ? options.targets : options.recursive ? ['.'] : ['-'];
31
+ const visitedFiles = new Set();
32
+ const cycleTracker = new ReparseCycleTracker();
33
+ for (const target of targets) {
34
+ if (target === '-') {
35
+ yield {
36
+ isStdin: true,
37
+ filePath: '-',
38
+ displayPath: options.label ?? '(standard input)',
39
+ };
40
+ continue;
41
+ }
42
+ let stats;
43
+ try {
44
+ stats = await fsp.stat(target);
45
+ }
46
+ catch (err) {
47
+ const msg = err instanceof Error ? err.message : String(err);
48
+ yield {
49
+ isStdin: false,
50
+ filePath: target,
51
+ displayPath: target,
52
+ isError: true,
53
+ errorMessage: msg,
54
+ };
55
+ continue;
56
+ }
57
+ if (stats.isDirectory()) {
58
+ if (options.directories === 'skip') {
59
+ continue;
60
+ }
61
+ if (!options.recursive && options.directories === 'read') {
62
+ yield {
63
+ isStdin: false,
64
+ filePath: target,
65
+ displayPath: target,
66
+ isError: true,
67
+ errorMessage: 'Is a directory',
68
+ };
69
+ continue;
70
+ }
71
+ // Recurse directory
72
+ await cycleTracker.markAndCheck(target);
73
+ for await (const item of traverseDirectory(target, options, cycleTracker)) {
74
+ if ('message' in item) {
75
+ yield {
76
+ isStdin: false,
77
+ filePath: item.filePath,
78
+ displayPath: item.filePath,
79
+ isError: true,
80
+ errorMessage: item.message,
81
+ };
82
+ }
83
+ else {
84
+ const norm = normalizeWindowsPath(item.filePath).toLowerCase();
85
+ if (!visitedFiles.has(norm)) {
86
+ visitedFiles.add(norm);
87
+ yield {
88
+ isStdin: false,
89
+ filePath: item.filePath,
90
+ displayPath: item.displayPath,
91
+ };
92
+ }
93
+ }
94
+ }
95
+ }
96
+ else {
97
+ // Regular file or device
98
+ const norm = normalizeWindowsPath(target).toLowerCase();
99
+ if (!visitedFiles.has(norm)) {
100
+ visitedFiles.add(norm);
101
+ yield {
102
+ isStdin: false,
103
+ filePath: target,
104
+ displayPath: target,
105
+ };
106
+ }
107
+ }
108
+ }
109
+ }
110
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/filesystem/discover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Converts a glob pattern (e.g. *.ts, test_??, app.*) to a case-insensitive RegExp.
3
+ */
4
+ export declare function globToRegex(glob: string): RegExp;
5
+ /**
6
+ * Checks if a basename or relative path matches any glob in the pattern list.
7
+ */
8
+ export declare function matchesAnyGlob(name: string, globs: string[]): boolean;
9
+ //# sourceMappingURL=glob.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/filesystem/glob.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA2ChD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CASrE"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Converts a glob pattern (e.g. *.ts, test_??, app.*) to a case-insensitive RegExp.
3
+ */
4
+ export function globToRegex(glob) {
5
+ let regexStr = '^';
6
+ let i = 0;
7
+ const len = glob.length;
8
+ while (i < len) {
9
+ const c = glob[i];
10
+ if (c === '*') {
11
+ if (i + 1 < len && glob[i + 1] === '*') {
12
+ regexStr += '.*';
13
+ i += 2;
14
+ continue;
15
+ }
16
+ regexStr += '[^/\\\\]*';
17
+ i++;
18
+ continue;
19
+ }
20
+ if (c === '?') {
21
+ regexStr += '[^/\\\\]';
22
+ i++;
23
+ continue;
24
+ }
25
+ if (c === '[') {
26
+ const closeIdx = glob.indexOf(']', i + 1);
27
+ if (closeIdx !== -1) {
28
+ const inner = glob.slice(i + 1, closeIdx);
29
+ regexStr += `[${inner}]`;
30
+ i = closeIdx + 1;
31
+ continue;
32
+ }
33
+ }
34
+ // Escape regex characters
35
+ if (/[.+^${}()|[\]\\]/.test(c)) {
36
+ regexStr += `\\${c}`;
37
+ }
38
+ else {
39
+ regexStr += c;
40
+ }
41
+ i++;
42
+ }
43
+ regexStr += '$';
44
+ // Windows filenames are case-insensitive
45
+ return new RegExp(regexStr, 'i');
46
+ }
47
+ /**
48
+ * Checks if a basename or relative path matches any glob in the pattern list.
49
+ */
50
+ export function matchesAnyGlob(name, globs) {
51
+ for (const g of globs) {
52
+ if (!g)
53
+ continue;
54
+ const re = globToRegex(g);
55
+ if (re.test(name)) {
56
+ return true;
57
+ }
58
+ }
59
+ return false;
60
+ }
61
+ //# sourceMappingURL=glob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/filesystem/glob.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,IAAI,QAAQ,GAAG,GAAG,CAAC;IACnB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;IAExB,OAAO,CAAC,GAAG,GAAG,EAAE,CAAC;QACf,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACvC,QAAQ,IAAI,IAAI,CAAC;gBACjB,CAAC,IAAI,CAAC,CAAC;gBACP,SAAS;YACX,CAAC;YACD,QAAQ,IAAI,WAAW,CAAC;YACxB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACd,QAAQ,IAAI,UAAU,CAAC;YACvB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACd,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1C,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;gBACpB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAC1C,QAAQ,IAAI,IAAI,KAAK,GAAG,CAAC;gBACzB,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;gBACjB,SAAS;YACX,CAAC;QACH,CAAC;QACD,0BAA0B;QAC1B,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,QAAQ,IAAI,KAAK,CAAC,EAAE,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,QAAQ,IAAI,CAAC,CAAC;QAChB,CAAC;QACD,CAAC,EAAE,CAAC;IACN,CAAC;IAED,QAAQ,IAAI,GAAG,CAAC;IAChB,yCAAyC;IACzC,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,KAAe;IAC1D,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare class ReparseCycleTracker {
2
+ private visitedRealPaths;
3
+ /**
4
+ * Returns true if path has not been visited yet and marks it visited.
5
+ * Returns false if cycle or duplicate visited.
6
+ */
7
+ markAndCheck(path: string): Promise<boolean>;
8
+ clear(): void;
9
+ }
10
+ //# sourceMappingURL=reparse-points.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reparse-points.d.ts","sourceRoot":"","sources":["../../src/filesystem/reparse-points.ts"],"names":[],"mappings":"AAGA,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,gBAAgB,CAAqB;IAE7C;;;OAGG;IACU,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAelD,KAAK,IAAI,IAAI;CAGrB"}
@@ -0,0 +1,28 @@
1
+ import fs from 'node:fs/promises';
2
+ import { normalizeWindowsPath } from '../utils/windows-paths.js';
3
+ export class ReparseCycleTracker {
4
+ visitedRealPaths = new Set();
5
+ /**
6
+ * Returns true if path has not been visited yet and marks it visited.
7
+ * Returns false if cycle or duplicate visited.
8
+ */
9
+ async markAndCheck(path) {
10
+ try {
11
+ const real = await fs.realpath(path);
12
+ const key = normalizeWindowsPath(real).toLowerCase();
13
+ if (this.visitedRealPaths.has(key)) {
14
+ return false; // already visited, cycle or duplicate
15
+ }
16
+ this.visitedRealPaths.add(key);
17
+ return true;
18
+ }
19
+ catch {
20
+ // If realpath fails (e.g. broken symlink), treat as unvisitable
21
+ return false;
22
+ }
23
+ }
24
+ clear() {
25
+ this.visitedRealPaths.clear();
26
+ }
27
+ }
28
+ //# sourceMappingURL=reparse-points.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reparse-points.js","sourceRoot":"","sources":["../../src/filesystem/reparse-points.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,MAAM,OAAO,mBAAmB;IACtB,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE7C;;;OAGG;IACI,KAAK,CAAC,YAAY,CAAC,IAAY;QACpC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,GAAG,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YACrD,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnC,OAAO,KAAK,CAAC,CAAC,sCAAsC;YACtD,CAAC;YACD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,gEAAgE;YAChE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;IAChC,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ import type { CliOptions } from '../cli/args.js';
2
+ import { ReparseCycleTracker } from './reparse-points.js';
3
+ export interface DiscoveredFile {
4
+ filePath: string;
5
+ displayPath: string;
6
+ }
7
+ export interface TraversalError {
8
+ filePath: string;
9
+ message: string;
10
+ }
11
+ /**
12
+ * Traverses a directory recursively, applying glob filters, depth limits, and cycle detection.
13
+ */
14
+ export declare function traverseDirectory(rootDir: string, options: CliOptions, cycleTracker: ReparseCycleTracker, currentDepth?: number): AsyncGenerator<DiscoveredFile | TraversalError, void, undefined>;
15
+ //# sourceMappingURL=traversal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traversal.d.ts","sourceRoot":"","sources":["../../src/filesystem/traversal.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAuB,iBAAiB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,UAAU,EACnB,YAAY,EAAE,mBAAmB,EACjC,YAAY,SAAI,GACf,cAAc,CAAC,cAAc,GAAG,cAAc,EAAE,IAAI,EAAE,SAAS,CAAC,CAoElE"}
@@ -0,0 +1,88 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { matchesAnyGlob } from './glob.js';
4
+ /**
5
+ * Traverses a directory recursively, applying glob filters, depth limits, and cycle detection.
6
+ */
7
+ export async function* traverseDirectory(rootDir, options, cycleTracker, currentDepth = 0) {
8
+ if (options.maxDepth !== undefined && currentDepth > options.maxDepth) {
9
+ return;
10
+ }
11
+ let entries;
12
+ try {
13
+ entries = await fs.readdir(rootDir, { withFileTypes: true });
14
+ }
15
+ catch (err) {
16
+ const msg = err instanceof Error ? err.message : String(err);
17
+ yield { filePath: rootDir, message: msg };
18
+ return;
19
+ }
20
+ // Combine excludeDirs with default exclude policy unless explicitly overridden
21
+ const effectiveExcludeDirs = [...options.excludeDirs];
22
+ if (!options.excludeDirs.some(d => d === 'node_modules')) {
23
+ effectiveExcludeDirs.push('node_modules');
24
+ }
25
+ if (!options.excludeDirs.some(d => d === '.git')) {
26
+ effectiveExcludeDirs.push('.git');
27
+ }
28
+ for (const entry of entries) {
29
+ const fullPath = path.join(rootDir, entry.name);
30
+ if (entry.isDirectory() || entry.isSymbolicLink()) {
31
+ // Check if directory matches exclude-dir
32
+ if (matchesAnyGlob(entry.name, effectiveExcludeDirs)) {
33
+ continue;
34
+ }
35
+ // Hidden directories (starting with '.') skipped by default unless included
36
+ if (entry.name.startsWith('.') && !options.includes.length) {
37
+ if (!options.excludeDirs.includes(entry.name)) {
38
+ continue;
39
+ }
40
+ }
41
+ let isDir = entry.isDirectory();
42
+ if (entry.isSymbolicLink()) {
43
+ if (!options.dereferenceRecursive) {
44
+ // -r does NOT follow directory symlinks/junctions
45
+ continue;
46
+ }
47
+ try {
48
+ const stat = await fs.stat(fullPath);
49
+ isDir = stat.isDirectory();
50
+ }
51
+ catch {
52
+ // Broken symlink
53
+ continue;
54
+ }
55
+ }
56
+ if (isDir) {
57
+ // Check cycle
58
+ const ok = await cycleTracker.markAndCheck(fullPath);
59
+ if (!ok) {
60
+ continue; // Cycle or duplicate
61
+ }
62
+ yield* traverseDirectory(fullPath, options, cycleTracker, currentDepth + 1);
63
+ }
64
+ else {
65
+ // Symlink pointing to regular file
66
+ yield* processFileEntry(fullPath, entry.name, options);
67
+ }
68
+ }
69
+ else if (entry.isFile()) {
70
+ yield* processFileEntry(fullPath, entry.name, options);
71
+ }
72
+ }
73
+ }
74
+ function* processFileEntry(fullPath, fileName, options) {
75
+ // Check exclude globs
76
+ if (options.excludes.length > 0 && matchesAnyGlob(fileName, options.excludes)) {
77
+ return;
78
+ }
79
+ // Check include globs
80
+ if (options.includes.length > 0 && !matchesAnyGlob(fileName, options.includes)) {
81
+ return;
82
+ }
83
+ yield {
84
+ filePath: fullPath,
85
+ displayPath: fullPath,
86
+ };
87
+ }
88
+ //# sourceMappingURL=traversal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traversal.js","sourceRoot":"","sources":["../../src/filesystem/traversal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAa3C;;GAEG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,iBAAiB,CACtC,OAAe,EACf,OAAmB,EACnB,YAAiC,EACjC,YAAY,GAAG,CAAC;IAEhB,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,YAAY,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtE,OAAO;IACT,CAAC;IAED,IAAI,OAAmC,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QAC1C,OAAO;IACT,CAAC;IAED,+EAA+E;IAC/E,MAAM,oBAAoB,GAAG,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACtD,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,cAAc,CAAC,EAAE,CAAC;QACzD,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,EAAE,CAAC;QACjD,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAEhD,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;YAClD,yCAAyC;YACzC,IAAI,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,CAAC;gBACrD,SAAS;YACX,CAAC;YACD,4EAA4E;YAC5E,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC3D,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC9C,SAAS;gBACX,CAAC;YACH,CAAC;YAED,IAAI,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YAChC,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;gBAC3B,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;oBAClC,kDAAkD;oBAClD,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACrC,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC7B,CAAC;gBAAC,MAAM,CAAC;oBACP,iBAAiB;oBACjB,SAAS;gBACX,CAAC;YACH,CAAC;YAED,IAAI,KAAK,EAAE,CAAC;gBACV,cAAc;gBACd,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBACrD,IAAI,CAAC,EAAE,EAAE,CAAC;oBACR,SAAS,CAAC,qBAAqB;gBACjC,CAAC;gBACD,KAAK,CAAC,CAAC,iBAAiB,CAAC,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC;YAC9E,CAAC;iBAAM,CAAC;gBACN,mCAAmC;gBACnC,KAAK,CAAC,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1B,KAAK,CAAC,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;AACH,CAAC;AAED,QAAQ,CAAC,CAAC,gBAAgB,CACxB,QAAgB,EAChB,QAAgB,EAChB,OAAmB;IAEnB,sBAAsB;IACtB,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9E,OAAO;IACT,CAAC;IAED,sBAAsB;IACtB,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/E,OAAO;IACT,CAAC;IAED,MAAM;QACJ,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,QAAQ;KACtB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ export * from './cli/args.js';
2
+ export * from './cli/help.js';
3
+ export * from './cli/version.js';
4
+ export * from './core/search.js';
5
+ export * from './core/matcher.js';
6
+ export * from './errors/errors.js';
7
+ export * from './errors/exit-codes.js';
8
+ export declare function main(argv?: string[]): Promise<number>;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AAEvC,wBAAsB,IAAI,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBlF"}
package/dist/index.js ADDED
@@ -0,0 +1,50 @@
1
+ import { parseArgs } from './cli/args.js';
2
+ import { getHelpString } from './cli/help.js';
3
+ import { getVersionString } from './cli/version.js';
4
+ import { runSearch } from './core/search.js';
5
+ import { GreptError } from './errors/errors.js';
6
+ import { ExitCode } from './errors/exit-codes.js';
7
+ export * from './cli/args.js';
8
+ export * from './cli/help.js';
9
+ export * from './cli/version.js';
10
+ export * from './core/search.js';
11
+ export * from './core/matcher.js';
12
+ export * from './errors/errors.js';
13
+ export * from './errors/exit-codes.js';
14
+ export async function main(argv = process.argv.slice(2)) {
15
+ try {
16
+ const options = parseArgs(argv);
17
+ if (options.help) {
18
+ process.stdout.write(getHelpString() + '\n');
19
+ return ExitCode.MATCH_FOUND;
20
+ }
21
+ if (options.version) {
22
+ process.stdout.write(getVersionString() + '\n');
23
+ return ExitCode.MATCH_FOUND;
24
+ }
25
+ const code = await runSearch(options);
26
+ return code;
27
+ }
28
+ catch (err) {
29
+ if (err instanceof GreptError) {
30
+ process.stderr.write(`${err.message}\n`);
31
+ return err.exitCode;
32
+ }
33
+ const message = err instanceof Error ? err.message : String(err);
34
+ process.stderr.write(`grept: ${message}\n`);
35
+ return ExitCode.ERROR;
36
+ }
37
+ }
38
+ // Only invoke automatically when run as main executable
39
+ const isMainModule = process.argv[1] &&
40
+ (process.argv[1].endsWith('grept.js') ||
41
+ process.argv[1].endsWith('dist/index.js') ||
42
+ process.argv[1].endsWith('dist\\index.js') ||
43
+ process.argv[1].endsWith('src/index.ts') ||
44
+ process.argv[1].endsWith('src\\index.ts'));
45
+ if (isMainModule) {
46
+ main().then(code => {
47
+ process.exit(code);
48
+ });
49
+ }
50
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AAEvC,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAiB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAEhC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,CAAC;YAC7C,OAAO,QAAQ,CAAC,WAAW,CAAC;QAC9B,CAAC;QAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC,CAAC;YAChD,OAAO,QAAQ,CAAC,WAAW,CAAC;QAC9B,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;YAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;YACzC,OAAO,GAAG,CAAC,QAAQ,CAAC;QACtB,CAAC;QACD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,IAAI,CAAC,CAAC;QAC5C,OAAO,QAAQ,CAAC,KAAK,CAAC;IACxB,CAAC;AACH,CAAC;AAED,wDAAwD;AACxD,MAAM,YAAY,GAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACf,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;AAE/C,IAAI,YAAY,EAAE,CAAC;IACjB,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACjB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare class AnsiColors {
2
+ private enabled;
3
+ constructor(enabled: boolean);
4
+ filename(text: string): string;
5
+ lineNumber(text: string): string;
6
+ byteOffset(text: string): string;
7
+ separator(text: string): string;
8
+ matchedText(text: string): string;
9
+ groupSeparator(text: string): string;
10
+ }
11
+ //# sourceMappingURL=color.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../../src/output/color.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAU;gBAEb,OAAO,EAAE,OAAO;IAI5B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI9B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIhC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIhC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI/B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIjC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAGrC"}
@@ -0,0 +1,25 @@
1
+ export class AnsiColors {
2
+ enabled;
3
+ constructor(enabled) {
4
+ this.enabled = enabled;
5
+ }
6
+ filename(text) {
7
+ return this.enabled ? `\x1b[35m${text}\x1b[0m` : text;
8
+ }
9
+ lineNumber(text) {
10
+ return this.enabled ? `\x1b[32m${text}\x1b[0m` : text;
11
+ }
12
+ byteOffset(text) {
13
+ return this.enabled ? `\x1b[32m${text}\x1b[0m` : text;
14
+ }
15
+ separator(text) {
16
+ return this.enabled ? `\x1b[36m${text}\x1b[0m` : text;
17
+ }
18
+ matchedText(text) {
19
+ return this.enabled ? `\x1b[1;31m\x1b[K${text}\x1b[m\x1b[K` : text;
20
+ }
21
+ groupSeparator(text) {
22
+ return this.enabled ? `\x1b[36m${text}\x1b[0m` : text;
23
+ }
24
+ }
25
+ //# sourceMappingURL=color.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color.js","sourceRoot":"","sources":["../../src/output/color.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAU;IACb,OAAO,CAAU;IAEzB,YAAY,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,QAAQ,CAAC,IAAY;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,CAAC;IAED,UAAU,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,CAAC;IAED,UAAU,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,CAAC;IAED,WAAW,CAAC,IAAY;QACtB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,IAAI,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC;IACrE,CAAC;IAED,cAAc,CAAC,IAAY;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ import type { LineItem } from '../core/line-reader.js';
2
+ export interface ContextLine {
3
+ item: LineItem;
4
+ isMatch: boolean;
5
+ needsGroupSeparatorBefore: boolean;
6
+ }
7
+ export declare class ContextManager {
8
+ private beforeCount;
9
+ private afterCount;
10
+ private beforeBuffer;
11
+ private afterRemaining;
12
+ private lastPrintedLineNum;
13
+ private hasPrintedAnyGroup;
14
+ constructor(beforeCount: number, afterCount: number);
15
+ /**
16
+ * Processes a line. Yields lines that should be emitted to output.
17
+ */
18
+ processLine(item: LineItem, isMatch: boolean): Generator<ContextLine, void, undefined>;
19
+ reset(): void;
20
+ }
21
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/output/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEvD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,yBAAyB,EAAE,OAAO,CAAC;CACpC;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,kBAAkB,CAAS;gBAEvB,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAKnD;;OAEG;IACF,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC;IAiEvF,KAAK,IAAI,IAAI;CAMd"}
@@ -0,0 +1,78 @@
1
+ export class ContextManager {
2
+ beforeCount;
3
+ afterCount;
4
+ beforeBuffer = [];
5
+ afterRemaining = 0;
6
+ lastPrintedLineNum = 0;
7
+ hasPrintedAnyGroup = false;
8
+ constructor(beforeCount, afterCount) {
9
+ this.beforeCount = beforeCount;
10
+ this.afterCount = afterCount;
11
+ }
12
+ /**
13
+ * Processes a line. Yields lines that should be emitted to output.
14
+ */
15
+ *processLine(item, isMatch) {
16
+ if (isMatch) {
17
+ // Check before context
18
+ const beforeToPrint = [];
19
+ for (const b of this.beforeBuffer) {
20
+ if (b.lineNum > this.lastPrintedLineNum) {
21
+ beforeToPrint.push(b);
22
+ }
23
+ }
24
+ const firstLineNum = beforeToPrint.length > 0 ? beforeToPrint[0].lineNum : item.lineNum;
25
+ const needsSeparator = this.hasPrintedAnyGroup && firstLineNum > this.lastPrintedLineNum + 1;
26
+ // Yield before context lines
27
+ for (let i = 0; i < beforeToPrint.length; i++) {
28
+ const b = beforeToPrint[i];
29
+ yield {
30
+ item: b,
31
+ isMatch: false,
32
+ needsGroupSeparatorBefore: i === 0 ? needsSeparator : false,
33
+ };
34
+ this.lastPrintedLineNum = b.lineNum;
35
+ }
36
+ // Yield match line
37
+ const matchNeedsSeparator = beforeToPrint.length === 0 &&
38
+ this.hasPrintedAnyGroup &&
39
+ item.lineNum > this.lastPrintedLineNum + 1;
40
+ yield {
41
+ item,
42
+ isMatch: true,
43
+ needsGroupSeparatorBefore: matchNeedsSeparator,
44
+ };
45
+ this.lastPrintedLineNum = item.lineNum;
46
+ this.hasPrintedAnyGroup = true;
47
+ this.afterRemaining = this.afterCount;
48
+ this.beforeBuffer = [];
49
+ return;
50
+ }
51
+ // Not a match
52
+ if (this.afterRemaining > 0) {
53
+ this.afterRemaining--;
54
+ if (item.lineNum > this.lastPrintedLineNum) {
55
+ yield {
56
+ item,
57
+ isMatch: false,
58
+ needsGroupSeparatorBefore: false,
59
+ };
60
+ this.lastPrintedLineNum = item.lineNum;
61
+ }
62
+ }
63
+ // Store in circular beforeBuffer
64
+ if (this.beforeCount > 0) {
65
+ if (this.beforeBuffer.length >= this.beforeCount) {
66
+ this.beforeBuffer.shift();
67
+ }
68
+ this.beforeBuffer.push(item);
69
+ }
70
+ }
71
+ reset() {
72
+ this.beforeBuffer = [];
73
+ this.afterRemaining = 0;
74
+ this.lastPrintedLineNum = 0;
75
+ this.hasPrintedAnyGroup = false;
76
+ }
77
+ }
78
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/output/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { CliOptions } from '../cli/args.js';
2
+ import type { MatchRange } from '../core/matcher.js';
3
+ import { AnsiColors } from './color.js';
4
+ export declare class OutputFormatter {
5
+ private options;
6
+ private colors;
7
+ constructor(options: CliOptions, colors: AnsiColors);
8
+ /**
9
+ * Formats a normal matching or context line.
10
+ */
11
+ formatLine(displayPath: string, showFilename: boolean, lineNum: number, byteOffset: number, text: string, isContext: boolean, matchRanges: MatchRange[]): string;
12
+ /**
13
+ * Formats only-matching (-o) output lines.
14
+ */
15
+ formatOnlyMatching(displayPath: string, showFilename: boolean, lineNum: number, lineByteOffset: number, lineText: string, matches: MatchRange[]): string[];
16
+ /**
17
+ * Highlights match ranges inside text using ANSI sequences.
18
+ */
19
+ private highlightMatches;
20
+ formatBinaryMatch(displayPath: string): string;
21
+ formatCount(displayPath: string, showFilename: boolean, count: number): string;
22
+ formatGroupSeparator(): string | null;
23
+ }
24
+ //# sourceMappingURL=formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/output/formatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxC,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,MAAM,CAAa;gBAEf,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU;IAKnD;;OAEG;IACH,UAAU,CACR,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,OAAO,EACrB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,OAAO,EAClB,WAAW,EAAE,UAAU,EAAE,GACxB,MAAM;IAoCT;;OAEG;IACH,kBAAkB,CAChB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,OAAO,EACrB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,UAAU,EAAE,GACpB,MAAM,EAAE;IAqCX;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAmBxB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAI9C,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAU9E,oBAAoB,IAAI,MAAM,GAAG,IAAI;CAItC"}