@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,10 @@
1
+ export type DetectedEncoding = 'utf-8' | 'utf-16le' | 'utf-16be';
2
+ export interface EncodingDetectionResult {
3
+ encoding: DetectedEncoding;
4
+ bomLength: number;
5
+ }
6
+ /**
7
+ * Checks for byte-order marks (BOM) in the initial chunk.
8
+ */
9
+ export declare function detectEncoding(buffer: Uint8Array, length: number): EncodingDetectionResult;
10
+ //# sourceMappingURL=encoding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/core/encoding.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,CAAC;AAEjE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,uBAAuB,CAW1F"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Checks for byte-order marks (BOM) in the initial chunk.
3
+ */
4
+ export function detectEncoding(buffer, length) {
5
+ if (length >= 3 && buffer[0] === 0xef && buffer[1] === 0xbb && buffer[2] === 0xbf) {
6
+ return { encoding: 'utf-8', bomLength: 3 };
7
+ }
8
+ if (length >= 2 && buffer[0] === 0xff && buffer[1] === 0xfe) {
9
+ return { encoding: 'utf-16le', bomLength: 2 };
10
+ }
11
+ if (length >= 2 && buffer[0] === 0xfe && buffer[1] === 0xff) {
12
+ return { encoding: 'utf-16be', bomLength: 2 };
13
+ }
14
+ return { encoding: 'utf-8', bomLength: 0 };
15
+ }
16
+ //# sourceMappingURL=encoding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../src/core/encoding.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAkB,EAAE,MAAc;IAC/D,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAClF,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAC7C,CAAC;IACD,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC5D,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAChD,CAAC;IACD,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC5D,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAChD,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { Readable } from 'node:stream';
2
+ export interface LineItem {
3
+ text: string;
4
+ lineNum: number;
5
+ byteOffset: number;
6
+ hasNewline: boolean;
7
+ delimiterBytes: number;
8
+ }
9
+ export interface LineReaderOptions {
10
+ nullData?: boolean;
11
+ initialChunk?: Buffer;
12
+ unixByteOffsets?: boolean;
13
+ }
14
+ /**
15
+ * Streams lines from a Node.js Readable stream with zero-based byte offsets.
16
+ * Supports standard LF/CRLF, Unix-style byte offset calculation, and null-delimited (-z) streams.
17
+ */
18
+ export declare function readLines(stream: Readable, options?: LineReaderOptions): AsyncGenerator<LineItem, void, undefined>;
19
+ //# sourceMappingURL=line-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"line-reader.d.ts","sourceRoot":"","sources":["../../src/core/line-reader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAuB,SAAS,CAC9B,MAAM,EAAE,QAAQ,EAChB,OAAO,GAAE,iBAAsB,GAC9B,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CA2E3C"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Streams lines from a Node.js Readable stream with zero-based byte offsets.
3
+ * Supports standard LF/CRLF, Unix-style byte offset calculation, and null-delimited (-z) streams.
4
+ */
5
+ export async function* readLines(stream, options = {}) {
6
+ const nullData = Boolean(options.nullData);
7
+ const delimiterByte = nullData ? 0x00 : 0x0a; // '\0' or '\n'
8
+ let lineNum = 1;
9
+ let currentByteOffset = 0;
10
+ let currentUnixByteOffset = 0;
11
+ let remainder = Buffer.alloc(0);
12
+ const processChunk = function* (chunk) {
13
+ const combined = remainder.length > 0 ? Buffer.concat([remainder, chunk]) : chunk;
14
+ let searchStart = 0;
15
+ while (searchStart < combined.length) {
16
+ const delimIndex = combined.indexOf(delimiterByte, searchStart);
17
+ if (delimIndex === -1) {
18
+ break;
19
+ }
20
+ // Found delimiter
21
+ let textBytes = combined.subarray(searchStart, delimIndex);
22
+ let delimBytes = 1;
23
+ // In newline mode, strip trailing \r if \r\n
24
+ if (!nullData && textBytes.length > 0 && textBytes[textBytes.length - 1] === 0x0d) {
25
+ textBytes = textBytes.subarray(0, textBytes.length - 1);
26
+ delimBytes = 2; // \r + \n
27
+ }
28
+ const text = textBytes.toString('utf8');
29
+ const item = {
30
+ text,
31
+ lineNum: lineNum++,
32
+ byteOffset: options.unixByteOffsets ? currentUnixByteOffset : currentByteOffset,
33
+ hasNewline: true,
34
+ delimiterBytes: delimBytes,
35
+ };
36
+ const lineTotalBytes = delimIndex - searchStart + 1;
37
+ currentByteOffset += lineTotalBytes;
38
+ currentUnixByteOffset += textBytes.length + (delimBytes === 2 ? 1 : delimBytes);
39
+ searchStart = delimIndex + 1;
40
+ yield item;
41
+ }
42
+ remainder = combined.subarray(searchStart);
43
+ };
44
+ // If an initial chunk was provided (e.g. from binary peek), process it first
45
+ if (options.initialChunk && options.initialChunk.length > 0) {
46
+ yield* processChunk(options.initialChunk);
47
+ }
48
+ for await (const chunk of stream) {
49
+ const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
50
+ yield* processChunk(buf);
51
+ }
52
+ // Handle final line without newline if remainder has content
53
+ if (remainder.length > 0) {
54
+ let textBytes = remainder;
55
+ // Strip trailing \r if present
56
+ if (!nullData && textBytes.length > 0 && textBytes[textBytes.length - 1] === 0x0d) {
57
+ textBytes = textBytes.subarray(0, textBytes.length - 1);
58
+ }
59
+ const text = textBytes.toString('utf8');
60
+ yield {
61
+ text,
62
+ lineNum: lineNum++,
63
+ byteOffset: options.unixByteOffsets ? currentUnixByteOffset : currentByteOffset,
64
+ hasNewline: false,
65
+ delimiterBytes: 0,
66
+ };
67
+ }
68
+ }
69
+ //# sourceMappingURL=line-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"line-reader.js","sourceRoot":"","sources":["../../src/core/line-reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { type PCRE2 } from 'pcre2-wasm';
2
+ import type { CliOptions } from '../cli/args.js';
3
+ export interface MatchRange {
4
+ start: number;
5
+ end: number;
6
+ text: string;
7
+ }
8
+ export interface Matcher {
9
+ test(line: string): boolean;
10
+ findMatches(line: string): MatchRange[];
11
+ }
12
+ export declare function turkishCaseFold(s: string): string;
13
+ /**
14
+ * Matcher for -F (fixed-strings)
15
+ */
16
+ export declare class FixedMatcher implements Matcher {
17
+ private patterns;
18
+ private ignoreCase;
19
+ private invertMatch;
20
+ private wordRegexp;
21
+ private lineRegexp;
22
+ private hasEmptyPattern;
23
+ constructor(options: CliOptions);
24
+ test(line: string): boolean;
25
+ private rawTest;
26
+ findMatches(line: string): MatchRange[];
27
+ }
28
+ /**
29
+ * Matcher for -G (BRE) and -E (ERE)
30
+ */
31
+ export declare class RegexMatcher implements Matcher {
32
+ private regexes;
33
+ private invertMatch;
34
+ private hasEmptyPattern;
35
+ constructor(options: CliOptions);
36
+ test(line: string): boolean;
37
+ private rawTest;
38
+ findMatches(line: string): MatchRange[];
39
+ }
40
+ /**
41
+ * Matcher for -P (PCRE2 using pcre2-wasm)
42
+ */
43
+ export declare class PcreMatcher implements Matcher {
44
+ private pcre2;
45
+ private patterns;
46
+ private invertMatch;
47
+ private hasEmptyPattern;
48
+ private flags;
49
+ constructor(pcre2: PCRE2, options: CliOptions);
50
+ test(line: string): boolean;
51
+ private rawTest;
52
+ findMatches(line: string): MatchRange[];
53
+ }
54
+ /**
55
+ * Creates the appropriate Matcher based on CliOptions.
56
+ */
57
+ export declare function createMatcher(options: CliOptions): Promise<Matcher>;
58
+ //# sourceMappingURL=matcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matcher.d.ts","sourceRoot":"","sources":["../../src/core/matcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAE5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGjD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAAC;CACzC;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAKjD;AAaD;;GAEG;AACH,qBAAa,YAAa,YAAW,OAAO;IAC1C,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,eAAe,CAAU;gBAErB,OAAO,EAAE,UAAU;IAS/B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAK3B,OAAO,CAAC,OAAO;IAkCf,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE;CAoDxC;AAED;;GAEG;AACH,qBAAa,YAAa,YAAW,OAAO;IAC1C,OAAO,CAAC,OAAO,CAAW;IAC1B,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,eAAe,CAAU;gBAErB,OAAO,EAAE,UAAU;IAoC/B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAK3B,OAAO,CAAC,OAAO;IAaf,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE;CA2BxC;AAED;;GAEG;AACH,qBAAa,WAAY,YAAW,OAAO;IACzC,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,KAAK,CAAS;gBAEV,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU;IAwC7C,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAK3B,OAAO,CAAC,OAAO;IAgBf,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE;CA2BxC;AAqCD;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAUzE"}
@@ -0,0 +1,342 @@
1
+ import { createPCRE2, FLAGS } from 'pcre2-wasm';
2
+ import { RegexSyntaxError } from '../errors/errors.js';
3
+ import { convertBreToJsRegex, convertEreToJsRegex, applyPatternConstraints } from './patterns.js';
4
+ export function turkishCaseFold(s) {
5
+ return s
6
+ .replace(/\u0130/g, 'i')
7
+ .replace(/I/g, '\u0131')
8
+ .toLowerCase();
9
+ }
10
+ function isWordChar(char) {
11
+ if (!char)
12
+ return false;
13
+ return /^[a-zA-Z0-9_]$/.test(char);
14
+ }
15
+ function passesWordBoundary(line, start, end) {
16
+ const prevChar = start > 0 ? line[start - 1] : undefined;
17
+ const nextChar = end < line.length ? line[end] : undefined;
18
+ return !isWordChar(prevChar) && !isWordChar(nextChar);
19
+ }
20
+ /**
21
+ * Matcher for -F (fixed-strings)
22
+ */
23
+ export class FixedMatcher {
24
+ patterns;
25
+ ignoreCase;
26
+ invertMatch;
27
+ wordRegexp;
28
+ lineRegexp;
29
+ hasEmptyPattern;
30
+ constructor(options) {
31
+ this.patterns = options.patterns;
32
+ this.ignoreCase = options.ignoreCase;
33
+ this.invertMatch = options.invertMatch;
34
+ this.wordRegexp = options.wordRegexp;
35
+ this.lineRegexp = options.lineRegexp;
36
+ this.hasEmptyPattern = options.patterns.some(p => p.length === 0);
37
+ }
38
+ test(line) {
39
+ const rawMatch = this.rawTest(line);
40
+ return this.invertMatch ? !rawMatch : rawMatch;
41
+ }
42
+ rawTest(line) {
43
+ if (this.hasEmptyPattern) {
44
+ if (this.lineRegexp) {
45
+ return line.length === 0;
46
+ }
47
+ return true;
48
+ }
49
+ if (this.lineRegexp) {
50
+ for (const pat of this.patterns) {
51
+ if (this.ignoreCase) {
52
+ if (turkishCaseFold(line) === turkishCaseFold(pat))
53
+ return true;
54
+ }
55
+ else {
56
+ if (line === pat)
57
+ return true;
58
+ }
59
+ }
60
+ return false;
61
+ }
62
+ if (this.wordRegexp) {
63
+ return this.findMatches(line).length > 0;
64
+ }
65
+ // Substring match
66
+ const searchTarget = this.ignoreCase ? turkishCaseFold(line) : line;
67
+ for (const pat of this.patterns) {
68
+ const searchPat = this.ignoreCase ? turkishCaseFold(pat) : pat;
69
+ if (searchTarget.includes(searchPat)) {
70
+ return true;
71
+ }
72
+ }
73
+ return false;
74
+ }
75
+ findMatches(line) {
76
+ if (this.invertMatch) {
77
+ return [];
78
+ }
79
+ const ranges = [];
80
+ if (this.hasEmptyPattern) {
81
+ if (this.lineRegexp) {
82
+ if (line.length === 0) {
83
+ return [{ start: 0, end: 0, text: '' }];
84
+ }
85
+ }
86
+ else {
87
+ return [{ start: 0, end: 0, text: '' }];
88
+ }
89
+ }
90
+ if (this.lineRegexp) {
91
+ for (const pat of this.patterns) {
92
+ const matches = this.ignoreCase
93
+ ? turkishCaseFold(line) === turkishCaseFold(pat)
94
+ : line === pat;
95
+ if (matches) {
96
+ return [{ start: 0, end: line.length, text: line }];
97
+ }
98
+ }
99
+ return [];
100
+ }
101
+ const searchTarget = this.ignoreCase ? turkishCaseFold(line) : line;
102
+ for (const pat of this.patterns) {
103
+ if (pat.length === 0)
104
+ continue;
105
+ const searchPat = this.ignoreCase ? turkishCaseFold(pat) : pat;
106
+ let pos = 0;
107
+ while (pos <= searchTarget.length - searchPat.length) {
108
+ const found = searchTarget.indexOf(searchPat, pos);
109
+ if (found === -1)
110
+ break;
111
+ const end = found + searchPat.length;
112
+ if (!this.wordRegexp || passesWordBoundary(line, found, end)) {
113
+ ranges.push({
114
+ start: found,
115
+ end,
116
+ text: line.slice(found, end),
117
+ });
118
+ }
119
+ pos = found + 1; // permit overlapping scan then deduplicate
120
+ }
121
+ }
122
+ return mergeAndDeduplicateRanges(ranges);
123
+ }
124
+ }
125
+ /**
126
+ * Matcher for -G (BRE) and -E (ERE)
127
+ */
128
+ export class RegexMatcher {
129
+ regexes;
130
+ invertMatch;
131
+ hasEmptyPattern;
132
+ constructor(options) {
133
+ this.invertMatch = options.invertMatch;
134
+ this.hasEmptyPattern = options.patterns.some(p => p.length === 0);
135
+ this.regexes = [];
136
+ const flags = options.ignoreCase ? 'giu' : 'gu';
137
+ for (const rawPat of options.patterns) {
138
+ let converted;
139
+ if (options.regexMode === 'basic') {
140
+ converted = convertBreToJsRegex(rawPat);
141
+ }
142
+ else {
143
+ converted = convertEreToJsRegex(rawPat);
144
+ }
145
+ if (options.ignoreCase) {
146
+ // Expand Turkish dotted/dotless I
147
+ converted = converted
148
+ .replace(/(?<!\\)i/g, '(?:i|\u0130)')
149
+ .replace(/(?<!\\)\u0130/g, '(?:\u0130|i)')
150
+ .replace(/(?<!\\)I/g, '(?:I|\u0131)')
151
+ .replace(/(?<!\\)\u0131/g, '(?:\u0131|I)');
152
+ }
153
+ const patternStr = applyPatternConstraints(converted, options.wordRegexp, options.lineRegexp);
154
+ try {
155
+ const re = new RegExp(patternStr, flags);
156
+ this.regexes.push(re);
157
+ }
158
+ catch (err) {
159
+ const msg = err instanceof Error ? err.message : String(err);
160
+ throw new RegexSyntaxError(`invalid regular expression '${rawPat}': ${msg}`);
161
+ }
162
+ }
163
+ }
164
+ test(line) {
165
+ const rawMatch = this.rawTest(line);
166
+ return this.invertMatch ? !rawMatch : rawMatch;
167
+ }
168
+ rawTest(line) {
169
+ if (this.hasEmptyPattern) {
170
+ return true;
171
+ }
172
+ for (const re of this.regexes) {
173
+ re.lastIndex = 0;
174
+ if (re.test(line)) {
175
+ return true;
176
+ }
177
+ }
178
+ return false;
179
+ }
180
+ findMatches(line) {
181
+ if (this.invertMatch) {
182
+ return [];
183
+ }
184
+ if (this.hasEmptyPattern) {
185
+ return [{ start: 0, end: 0, text: '' }];
186
+ }
187
+ const ranges = [];
188
+ for (const re of this.regexes) {
189
+ re.lastIndex = 0;
190
+ let m;
191
+ while ((m = re.exec(line)) !== null) {
192
+ ranges.push({
193
+ start: m.index,
194
+ end: m.index + m[0].length,
195
+ text: m[0],
196
+ });
197
+ if (m[0].length === 0) {
198
+ re.lastIndex++; // advance past empty match to avoid infinite loop
199
+ }
200
+ }
201
+ }
202
+ return mergeAndDeduplicateRanges(ranges);
203
+ }
204
+ }
205
+ /**
206
+ * Matcher for -P (PCRE2 using pcre2-wasm)
207
+ */
208
+ export class PcreMatcher {
209
+ pcre2;
210
+ patterns;
211
+ invertMatch;
212
+ hasEmptyPattern;
213
+ flags;
214
+ constructor(pcre2, options) {
215
+ this.pcre2 = pcre2;
216
+ this.invertMatch = options.invertMatch;
217
+ this.hasEmptyPattern = options.patterns.some(p => p.length === 0);
218
+ let flagMask = FLAGS.UTF | FLAGS.UCP;
219
+ if (options.ignoreCase) {
220
+ flagMask |= FLAGS.CASELESS;
221
+ }
222
+ this.flags = flagMask;
223
+ this.patterns = [];
224
+ for (const rawPat of options.patterns) {
225
+ let pat = rawPat;
226
+ if (options.ignoreCase) {
227
+ pat = pat
228
+ .replace(/(?<!\\)i/g, '(?:i|\u0130)')
229
+ .replace(/(?<!\\)\u0130/g, '(?:\u0130|i)')
230
+ .replace(/(?<!\\)I/g, '(?:I|\u0131)')
231
+ .replace(/(?<!\\)\u0131/g, '(?:\u0131|I)');
232
+ }
233
+ if (options.wordRegexp) {
234
+ pat = `(?:\\b|(?<=\\W)|^)(?:${pat})(?:\\b|(?=\\W)|$)`;
235
+ }
236
+ if (options.lineRegexp) {
237
+ pat = `^(?:${pat})$`;
238
+ }
239
+ // Verify compilation
240
+ try {
241
+ const compiled = this.pcre2.compile(pat, this.flags);
242
+ compiled.destroy();
243
+ }
244
+ catch (err) {
245
+ const msg = err instanceof Error ? err.message : String(err);
246
+ throw new RegexSyntaxError(`invalid Perl regular expression '${rawPat}': ${msg}`);
247
+ }
248
+ this.patterns.push(pat);
249
+ }
250
+ }
251
+ test(line) {
252
+ const rawMatch = this.rawTest(line);
253
+ return this.invertMatch ? !rawMatch : rawMatch;
254
+ }
255
+ rawTest(line) {
256
+ if (this.hasEmptyPattern) {
257
+ return true;
258
+ }
259
+ for (const pat of this.patterns) {
260
+ try {
261
+ if (this.pcre2.test(pat, line, this.flags, { matchLimit: 1_000_000, depthLimit: 10_000 })) {
262
+ return true;
263
+ }
264
+ }
265
+ catch {
266
+ return false;
267
+ }
268
+ }
269
+ return false;
270
+ }
271
+ findMatches(line) {
272
+ if (this.invertMatch) {
273
+ return [];
274
+ }
275
+ if (this.hasEmptyPattern) {
276
+ return [{ start: 0, end: 0, text: '' }];
277
+ }
278
+ const ranges = [];
279
+ for (const pat of this.patterns) {
280
+ try {
281
+ const matches = this.pcre2.matchAll(pat, line, this.flags);
282
+ for (const m of matches) {
283
+ ranges.push({
284
+ start: m.index,
285
+ end: m.index + m.match.length,
286
+ text: m.match,
287
+ });
288
+ }
289
+ }
290
+ catch {
291
+ // matchLimit or regex evaluation error
292
+ }
293
+ }
294
+ return mergeAndDeduplicateRanges(ranges);
295
+ }
296
+ }
297
+ /**
298
+ * Merges overlapping and duplicate match ranges in ascending start position.
299
+ */
300
+ function mergeAndDeduplicateRanges(ranges) {
301
+ if (ranges.length <= 1) {
302
+ return ranges;
303
+ }
304
+ // Sort by start position ascending, then end descending (prefer longer matches)
305
+ ranges.sort((a, b) => a.start - b.start || b.end - a.end);
306
+ const result = [];
307
+ let current = ranges[0];
308
+ for (let i = 1; i < ranges.length; i++) {
309
+ const next = ranges[i];
310
+ if (next.start < current.end) {
311
+ // Overlapping match: extend current if next ends later
312
+ if (next.end > current.end) {
313
+ current = {
314
+ start: current.start,
315
+ end: next.end,
316
+ text: current.text + next.text.slice(current.end - next.start),
317
+ };
318
+ }
319
+ }
320
+ else {
321
+ result.push(current);
322
+ current = next;
323
+ }
324
+ }
325
+ result.push(current);
326
+ return result;
327
+ }
328
+ /**
329
+ * Creates the appropriate Matcher based on CliOptions.
330
+ */
331
+ export async function createMatcher(options) {
332
+ if (options.regexMode === 'fixed') {
333
+ return new FixedMatcher(options);
334
+ }
335
+ if (options.regexMode === 'pcre') {
336
+ const pcre2 = await createPCRE2();
337
+ return new PcreMatcher(pcre2, options);
338
+ }
339
+ // 'basic' (BRE) or 'extended' (ERE)
340
+ return new RegexMatcher(options);
341
+ }
342
+ //# sourceMappingURL=matcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matcher.js","sourceRoot":"","sources":["../../src/core/matcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAc,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAalG,MAAM,UAAU,eAAe,CAAC,CAAS;IACvC,OAAO,CAAC;SACL,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,WAAW,EAAE,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CAAC,IAAwB;IAC1C,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,OAAO,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY,EAAE,KAAa,EAAE,GAAW;IAClE,MAAM,QAAQ,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACzD,MAAM,QAAQ,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3D,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,YAAY;IACf,QAAQ,CAAW;IACnB,UAAU,CAAU;IACpB,WAAW,CAAU;IACrB,UAAU,CAAU;IACpB,UAAU,CAAU;IACpB,eAAe,CAAU;IAEjC,YAAY,OAAmB;QAC7B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,CAAC,IAAY;QACf,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IACjD,CAAC;IAEO,OAAO,CAAC,IAAY;QAC1B,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;YAC3B,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBACpB,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,eAAe,CAAC,GAAG,CAAC;wBAAE,OAAO,IAAI,CAAC;gBAClE,CAAC;qBAAM,CAAC;oBACN,IAAI,IAAI,KAAK,GAAG;wBAAE,OAAO,IAAI,CAAC;gBAChC,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3C,CAAC;QAED,kBAAkB;QAClB,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACpE,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC/D,IAAI,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBACrC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,WAAW,CAAC,IAAY;QACtB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,MAAM,GAAiB,EAAE,CAAC;QAEhC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACtB,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU;oBAC7B,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,eAAe,CAAC,GAAG,CAAC;oBAChD,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC;gBACjB,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEpE,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC/D,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,OAAO,GAAG,IAAI,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;gBACrD,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;gBACnD,IAAI,KAAK,KAAK,CAAC,CAAC;oBAAE,MAAM;gBACxB,MAAM,GAAG,GAAG,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC;gBACrC,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;oBAC7D,MAAM,CAAC,IAAI,CAAC;wBACV,KAAK,EAAE,KAAK;wBACZ,GAAG;wBACH,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;qBAC7B,CAAC,CAAC;gBACL,CAAC;gBACD,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,2CAA2C;YAC9D,CAAC;QACH,CAAC;QAED,OAAO,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,YAAY;IACf,OAAO,CAAW;IAClB,WAAW,CAAU;IACrB,eAAe,CAAU;IAEjC,YAAY,OAAmB;QAC7B,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAElB,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QAEhD,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,SAAiB,CAAC;YACtB,IAAI,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;gBAClC,SAAS,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,SAAS,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAC1C,CAAC;YAED,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,kCAAkC;gBAClC,SAAS,GAAG,SAAS;qBAClB,OAAO,CAAC,WAAW,EAAE,cAAc,CAAC;qBACpC,OAAO,CAAC,gBAAgB,EAAE,cAAc,CAAC;qBACzC,OAAO,CAAC,WAAW,EAAE,cAAc,CAAC;qBACpC,OAAO,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;YAC/C,CAAC;YAED,MAAM,UAAU,GAAG,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;YAE9F,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;gBACzC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxB,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,MAAM,IAAI,gBAAgB,CAAC,+BAA+B,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAY;QACf,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IACjD,CAAC;IAEO,OAAO,CAAC,IAAY;QAC1B,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC9B,EAAE,CAAC,SAAS,GAAG,CAAC,CAAC;YACjB,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClB,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,WAAW,CAAC,IAAY;QACtB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC9B,EAAE,CAAC,SAAS,GAAG,CAAC,CAAC;YACjB,IAAI,CAAyB,CAAC;YAC9B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBACpC,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,GAAG,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM;oBAC1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;iBACX,CAAC,CAAC;gBACH,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACtB,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,kDAAkD;gBACpE,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,WAAW;IACd,KAAK,CAAQ;IACb,QAAQ,CAAW;IACnB,WAAW,CAAU;IACrB,eAAe,CAAU;IACzB,KAAK,CAAS;IAEtB,YAAY,KAAY,EAAE,OAAmB;QAC3C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;QAElE,IAAI,QAAQ,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;QACrC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QAEtB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,GAAG,GAAG,MAAM,CAAC;YACjB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,GAAG,GAAG,GAAG;qBACN,OAAO,CAAC,WAAW,EAAE,cAAc,CAAC;qBACpC,OAAO,CAAC,gBAAgB,EAAE,cAAc,CAAC;qBACzC,OAAO,CAAC,WAAW,EAAE,cAAc,CAAC;qBACpC,OAAO,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;YAC/C,CAAC;YACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,GAAG,GAAG,wBAAwB,GAAG,oBAAoB,CAAC;YACxD,CAAC;YACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,GAAG,GAAG,OAAO,GAAG,IAAI,CAAC;YACvB,CAAC;YAED,qBAAqB;YACrB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrD,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,MAAM,IAAI,gBAAgB,CAAC,oCAAoC,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC;YACpF,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAY;QACf,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IACjD,CAAC;IAEO,OAAO,CAAC,IAAY;QAC1B,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;oBAC1F,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,WAAW,CAAC,IAAY;QACtB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC3D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACxB,MAAM,CAAC,IAAI,CAAC;wBACV,KAAK,EAAE,CAAC,CAAC,KAAK;wBACd,GAAG,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM;wBAC7B,IAAI,EAAE,CAAC,CAAC,KAAK;qBACd,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,uCAAuC;YACzC,CAAC;QACH,CAAC;QAED,OAAO,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;CACF;AAED;;GAEG;AACH,SAAS,yBAAyB,CAAC,MAAoB;IACrD,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,gFAAgF;IAChF,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAE1D,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,OAAO,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;IAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QACxB,IAAI,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAC7B,uDAAuD;YACvD,IAAI,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;gBAC3B,OAAO,GAAG;oBACR,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,IAAI,EAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC;iBAC/D,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAErB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAmB;IACrD,IAAI,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;QAClC,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;QAClC,OAAO,IAAI,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IACD,oCAAoC;IACpC,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Computes exact byte offset of a match within a UTF-8 line string.
3
+ */
4
+ export declare function getMatchByteOffset(lineByteOffset: number, lineText: string, matchCharIndex: number): number;
5
+ //# sourceMappingURL=offsets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offsets.d.ts","sourceRoot":"","sources":["../../src/core/offsets.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,GACrB,MAAM,CAMR"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Computes exact byte offset of a match within a UTF-8 line string.
3
+ */
4
+ export function getMatchByteOffset(lineByteOffset, lineText, matchCharIndex) {
5
+ if (matchCharIndex <= 0) {
6
+ return lineByteOffset;
7
+ }
8
+ const prefix = lineText.slice(0, matchCharIndex);
9
+ return lineByteOffset + Buffer.byteLength(prefix, 'utf8');
10
+ }
11
+ //# sourceMappingURL=offsets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offsets.js","sourceRoot":"","sources":["../../src/core/offsets.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,cAAsB,EACtB,QAAgB,EAChB,cAAsB;IAEtB,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;IACjD,OAAO,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Converts GNU Basic Regular Expression (BRE) to JS RegExp pattern.
3
+ */
4
+ export declare function convertBreToJsRegex(bre: string): string;
5
+ /**
6
+ * Converts GNU Extended Regular Expression (ERE) to JS RegExp pattern.
7
+ */
8
+ export declare function convertEreToJsRegex(ere: string): string;
9
+ /**
10
+ * Escapes a literal string for inclusion in a RegExp pattern.
11
+ */
12
+ export declare function escapeRegex(str: string): string;
13
+ /**
14
+ * Applies -w (word) and -x (line) constraints to a regex pattern string.
15
+ */
16
+ export declare function applyPatternConstraints(patternStr: string, wordRegexp: boolean, lineRegexp: boolean): string;
17
+ //# sourceMappingURL=patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../src/core/patterns.ts"],"names":[],"mappings":"AA0BA;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAyHvD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA+DvD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,OAAO,EACnB,UAAU,EAAE,OAAO,GAClB,MAAM,CASR"}