log-search 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 (232) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +226 -0
  3. package/bin/log-search.js +45 -0
  4. package/dist/cli/commands/clear.d.ts +9 -0
  5. package/dist/cli/commands/clear.d.ts.map +1 -0
  6. package/dist/cli/commands/clear.js +116 -0
  7. package/dist/cli/commands/clear.js.map +1 -0
  8. package/dist/cli/commands/index.d.ts +8 -0
  9. package/dist/cli/commands/index.d.ts.map +1 -0
  10. package/dist/cli/commands/index.js +118 -0
  11. package/dist/cli/commands/index.js.map +1 -0
  12. package/dist/cli/commands/info.d.ts +8 -0
  13. package/dist/cli/commands/info.d.ts.map +1 -0
  14. package/dist/cli/commands/info.js +96 -0
  15. package/dist/cli/commands/info.js.map +1 -0
  16. package/dist/cli/commands/search.d.ts +9 -0
  17. package/dist/cli/commands/search.d.ts.map +1 -0
  18. package/dist/cli/commands/search.js +178 -0
  19. package/dist/cli/commands/search.js.map +1 -0
  20. package/dist/cli/commands/watch.d.ts +8 -0
  21. package/dist/cli/commands/watch.d.ts.map +1 -0
  22. package/dist/cli/commands/watch.js +141 -0
  23. package/dist/cli/commands/watch.js.map +1 -0
  24. package/dist/cli/main.d.ts +6 -0
  25. package/dist/cli/main.d.ts.map +1 -0
  26. package/dist/cli/main.js +57 -0
  27. package/dist/cli/main.js.map +1 -0
  28. package/dist/cli/output/colorizer.d.ts +36 -0
  29. package/dist/cli/output/colorizer.d.ts.map +1 -0
  30. package/dist/cli/output/colorizer.js +101 -0
  31. package/dist/cli/output/colorizer.js.map +1 -0
  32. package/dist/cli/output/formatter.d.ts +31 -0
  33. package/dist/cli/output/formatter.d.ts.map +1 -0
  34. package/dist/cli/output/formatter.js +146 -0
  35. package/dist/cli/output/formatter.js.map +1 -0
  36. package/dist/cli/output/table.d.ts +12 -0
  37. package/dist/cli/output/table.d.ts.map +1 -0
  38. package/dist/cli/output/table.js +48 -0
  39. package/dist/cli/output/table.js.map +1 -0
  40. package/dist/core/indexer/ChunkProcessor.d.ts +21 -0
  41. package/dist/core/indexer/ChunkProcessor.d.ts.map +1 -0
  42. package/dist/core/indexer/ChunkProcessor.js +105 -0
  43. package/dist/core/indexer/ChunkProcessor.js.map +1 -0
  44. package/dist/core/indexer/IndexBuilder.d.ts +47 -0
  45. package/dist/core/indexer/IndexBuilder.d.ts.map +1 -0
  46. package/dist/core/indexer/IndexBuilder.js +274 -0
  47. package/dist/core/indexer/IndexBuilder.js.map +1 -0
  48. package/dist/core/indexer/IndexSerializer.d.ts +30 -0
  49. package/dist/core/indexer/IndexSerializer.d.ts.map +1 -0
  50. package/dist/core/indexer/IndexSerializer.js +142 -0
  51. package/dist/core/indexer/IndexSerializer.js.map +1 -0
  52. package/dist/core/indexer/OffsetMapper.d.ts +55 -0
  53. package/dist/core/indexer/OffsetMapper.d.ts.map +1 -0
  54. package/dist/core/indexer/OffsetMapper.js +94 -0
  55. package/dist/core/indexer/OffsetMapper.js.map +1 -0
  56. package/dist/core/indexer/TokenExtractor.d.ts +27 -0
  57. package/dist/core/indexer/TokenExtractor.d.ts.map +1 -0
  58. package/dist/core/indexer/TokenExtractor.js +92 -0
  59. package/dist/core/indexer/TokenExtractor.js.map +1 -0
  60. package/dist/core/searcher/IndexSearcher.d.ts +37 -0
  61. package/dist/core/searcher/IndexSearcher.d.ts.map +1 -0
  62. package/dist/core/searcher/IndexSearcher.js +360 -0
  63. package/dist/core/searcher/IndexSearcher.js.map +1 -0
  64. package/dist/core/searcher/RankEngine.d.ts +29 -0
  65. package/dist/core/searcher/RankEngine.d.ts.map +1 -0
  66. package/dist/core/searcher/RankEngine.js +90 -0
  67. package/dist/core/searcher/RankEngine.js.map +1 -0
  68. package/dist/core/searcher/ResultFetcher.d.ts +37 -0
  69. package/dist/core/searcher/ResultFetcher.d.ts.map +1 -0
  70. package/dist/core/searcher/ResultFetcher.js +118 -0
  71. package/dist/core/searcher/ResultFetcher.js.map +1 -0
  72. package/dist/core/streaming/ChunkSplitter.d.ts +25 -0
  73. package/dist/core/streaming/ChunkSplitter.d.ts.map +1 -0
  74. package/dist/core/streaming/ChunkSplitter.js +71 -0
  75. package/dist/core/streaming/ChunkSplitter.js.map +1 -0
  76. package/dist/core/streaming/FileStreamer.d.ts +39 -0
  77. package/dist/core/streaming/FileStreamer.d.ts.map +1 -0
  78. package/dist/core/streaming/FileStreamer.js +138 -0
  79. package/dist/core/streaming/FileStreamer.js.map +1 -0
  80. package/dist/core/streaming/LineBuffer.d.ts +26 -0
  81. package/dist/core/streaming/LineBuffer.d.ts.map +1 -0
  82. package/dist/core/streaming/LineBuffer.js +52 -0
  83. package/dist/core/streaming/LineBuffer.js.map +1 -0
  84. package/dist/core/workers/IndexWorker.d.ts +8 -0
  85. package/dist/core/workers/IndexWorker.d.ts.map +1 -0
  86. package/dist/core/workers/IndexWorker.js +41 -0
  87. package/dist/core/workers/IndexWorker.js.map +1 -0
  88. package/dist/core/workers/SearchWorker.d.ts +7 -0
  89. package/dist/core/workers/SearchWorker.d.ts.map +1 -0
  90. package/dist/core/workers/SearchWorker.js +63 -0
  91. package/dist/core/workers/SearchWorker.js.map +1 -0
  92. package/dist/core/workers/WorkerPool.d.ts +30 -0
  93. package/dist/core/workers/WorkerPool.d.ts.map +1 -0
  94. package/dist/core/workers/WorkerPool.js +132 -0
  95. package/dist/core/workers/WorkerPool.js.map +1 -0
  96. package/dist/formats/LogFormatDetector.d.ts +22 -0
  97. package/dist/formats/LogFormatDetector.d.ts.map +1 -0
  98. package/dist/formats/LogFormatDetector.js +123 -0
  99. package/dist/formats/LogFormatDetector.js.map +1 -0
  100. package/dist/formats/parsers/ApacheParser.d.ts +10 -0
  101. package/dist/formats/parsers/ApacheParser.d.ts.map +1 -0
  102. package/dist/formats/parsers/ApacheParser.js +54 -0
  103. package/dist/formats/parsers/ApacheParser.js.map +1 -0
  104. package/dist/formats/parsers/GenericParser.d.ts +11 -0
  105. package/dist/formats/parsers/GenericParser.d.ts.map +1 -0
  106. package/dist/formats/parsers/GenericParser.js +61 -0
  107. package/dist/formats/parsers/GenericParser.js.map +1 -0
  108. package/dist/formats/parsers/JsonParser.d.ts +12 -0
  109. package/dist/formats/parsers/JsonParser.d.ts.map +1 -0
  110. package/dist/formats/parsers/JsonParser.js +92 -0
  111. package/dist/formats/parsers/JsonParser.js.map +1 -0
  112. package/dist/formats/parsers/NginxParser.d.ts +15 -0
  113. package/dist/formats/parsers/NginxParser.d.ts.map +1 -0
  114. package/dist/formats/parsers/NginxParser.js +78 -0
  115. package/dist/formats/parsers/NginxParser.js.map +1 -0
  116. package/dist/formats/parsers/SyslogParser.d.ts +10 -0
  117. package/dist/formats/parsers/SyslogParser.d.ts.map +1 -0
  118. package/dist/formats/parsers/SyslogParser.js +73 -0
  119. package/dist/formats/parsers/SyslogParser.js.map +1 -0
  120. package/dist/formats/schemas/LogSchema.d.ts +70 -0
  121. package/dist/formats/schemas/LogSchema.d.ts.map +1 -0
  122. package/dist/formats/schemas/LogSchema.js +7 -0
  123. package/dist/formats/schemas/LogSchema.js.map +1 -0
  124. package/dist/index-store/CacheManager.d.ts +45 -0
  125. package/dist/index-store/CacheManager.d.ts.map +1 -0
  126. package/dist/index-store/CacheManager.js +84 -0
  127. package/dist/index-store/CacheManager.js.map +1 -0
  128. package/dist/index-store/FileWatcher.d.ts +39 -0
  129. package/dist/index-store/FileWatcher.d.ts.map +1 -0
  130. package/dist/index-store/FileWatcher.js +121 -0
  131. package/dist/index-store/FileWatcher.js.map +1 -0
  132. package/dist/index-store/IncrementalUpdater.d.ts +19 -0
  133. package/dist/index-store/IncrementalUpdater.d.ts.map +1 -0
  134. package/dist/index-store/IncrementalUpdater.js +62 -0
  135. package/dist/index-store/IncrementalUpdater.js.map +1 -0
  136. package/dist/index-store/IndexStore.d.ts +66 -0
  137. package/dist/index-store/IndexStore.d.ts.map +1 -0
  138. package/dist/index-store/IndexStore.js +183 -0
  139. package/dist/index-store/IndexStore.js.map +1 -0
  140. package/dist/index.d.ts +47 -0
  141. package/dist/index.d.ts.map +1 -0
  142. package/dist/index.js +99 -0
  143. package/dist/index.js.map +1 -0
  144. package/dist/pro/alerts/AlertEngine.d.ts +35 -0
  145. package/dist/pro/alerts/AlertEngine.d.ts.map +1 -0
  146. package/dist/pro/alerts/AlertEngine.js +162 -0
  147. package/dist/pro/alerts/AlertEngine.js.map +1 -0
  148. package/dist/pro/alerts/Notifier.d.ts +23 -0
  149. package/dist/pro/alerts/Notifier.d.ts.map +1 -0
  150. package/dist/pro/alerts/Notifier.js +173 -0
  151. package/dist/pro/alerts/Notifier.js.map +1 -0
  152. package/dist/pro/alerts/RuleParser.d.ts +32 -0
  153. package/dist/pro/alerts/RuleParser.d.ts.map +1 -0
  154. package/dist/pro/alerts/RuleParser.js +86 -0
  155. package/dist/pro/alerts/RuleParser.js.map +1 -0
  156. package/dist/pro/auth/LicenseValidator.d.ts +29 -0
  157. package/dist/pro/auth/LicenseValidator.d.ts.map +1 -0
  158. package/dist/pro/auth/LicenseValidator.js +122 -0
  159. package/dist/pro/auth/LicenseValidator.js.map +1 -0
  160. package/dist/pro/auth/TokenManager.d.ts +27 -0
  161. package/dist/pro/auth/TokenManager.d.ts.map +1 -0
  162. package/dist/pro/auth/TokenManager.js +98 -0
  163. package/dist/pro/auth/TokenManager.js.map +1 -0
  164. package/dist/pro/webui/UIServer.d.ts +34 -0
  165. package/dist/pro/webui/UIServer.d.ts.map +1 -0
  166. package/dist/pro/webui/UIServer.js +353 -0
  167. package/dist/pro/webui/UIServer.js.map +1 -0
  168. package/dist/query/QueryEngine.d.ts +34 -0
  169. package/dist/query/QueryEngine.d.ts.map +1 -0
  170. package/dist/query/QueryEngine.js +187 -0
  171. package/dist/query/QueryEngine.js.map +1 -0
  172. package/dist/query/operators/AndOperator.d.ts +18 -0
  173. package/dist/query/operators/AndOperator.d.ts.map +1 -0
  174. package/dist/query/operators/AndOperator.js +55 -0
  175. package/dist/query/operators/AndOperator.js.map +1 -0
  176. package/dist/query/operators/NotOperator.d.ts +19 -0
  177. package/dist/query/operators/NotOperator.d.ts.map +1 -0
  178. package/dist/query/operators/NotOperator.js +43 -0
  179. package/dist/query/operators/NotOperator.js.map +1 -0
  180. package/dist/query/operators/OrOperator.d.ts +17 -0
  181. package/dist/query/operators/OrOperator.d.ts.map +1 -0
  182. package/dist/query/operators/OrOperator.js +54 -0
  183. package/dist/query/operators/OrOperator.js.map +1 -0
  184. package/dist/query/operators/RangeOperator.d.ts +23 -0
  185. package/dist/query/operators/RangeOperator.d.ts.map +1 -0
  186. package/dist/query/operators/RangeOperator.js +63 -0
  187. package/dist/query/operators/RangeOperator.js.map +1 -0
  188. package/dist/query/regex/FuzzyMatcher.d.ts +29 -0
  189. package/dist/query/regex/FuzzyMatcher.d.ts.map +1 -0
  190. package/dist/query/regex/FuzzyMatcher.js +89 -0
  191. package/dist/query/regex/FuzzyMatcher.js.map +1 -0
  192. package/dist/query/regex/RegexMatcher.d.ts +31 -0
  193. package/dist/query/regex/RegexMatcher.d.ts.map +1 -0
  194. package/dist/query/regex/RegexMatcher.js +73 -0
  195. package/dist/query/regex/RegexMatcher.js.map +1 -0
  196. package/dist/types/ConfigTypes.d.ts +78 -0
  197. package/dist/types/ConfigTypes.d.ts.map +1 -0
  198. package/dist/types/ConfigTypes.js +7 -0
  199. package/dist/types/ConfigTypes.js.map +1 -0
  200. package/dist/types/IndexTypes.d.ts +86 -0
  201. package/dist/types/IndexTypes.d.ts.map +1 -0
  202. package/dist/types/IndexTypes.js +7 -0
  203. package/dist/types/IndexTypes.js.map +1 -0
  204. package/dist/types/SearchTypes.d.ts +102 -0
  205. package/dist/types/SearchTypes.d.ts.map +1 -0
  206. package/dist/types/SearchTypes.js +7 -0
  207. package/dist/types/SearchTypes.js.map +1 -0
  208. package/dist/types/index.d.ts +8 -0
  209. package/dist/types/index.d.ts.map +1 -0
  210. package/dist/types/index.js +24 -0
  211. package/dist/types/index.js.map +1 -0
  212. package/dist/utils/fs-helpers.d.ts +9 -0
  213. package/dist/utils/fs-helpers.d.ts.map +1 -0
  214. package/dist/utils/fs-helpers.js +76 -0
  215. package/dist/utils/fs-helpers.js.map +1 -0
  216. package/dist/utils/hash.d.ts +7 -0
  217. package/dist/utils/hash.d.ts.map +1 -0
  218. package/dist/utils/hash.js +49 -0
  219. package/dist/utils/hash.js.map +1 -0
  220. package/dist/utils/logger.d.ts +19 -0
  221. package/dist/utils/logger.d.ts.map +1 -0
  222. package/dist/utils/logger.js +41 -0
  223. package/dist/utils/logger.js.map +1 -0
  224. package/dist/utils/performance.d.ts +14 -0
  225. package/dist/utils/performance.d.ts.map +1 -0
  226. package/dist/utils/performance.js +32 -0
  227. package/dist/utils/performance.js.map +1 -0
  228. package/dist/utils/progress.d.ts +7 -0
  229. package/dist/utils/progress.d.ts.map +1 -0
  230. package/dist/utils/progress.js +22 -0
  231. package/dist/utils/progress.js.map +1 -0
  232. package/package.json +105 -0
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ /**
3
+ * JsonParser.ts
4
+ * Parses JSON-structured log lines (e.g., Bunyan, Pino, Winston JSON format).
5
+ * Extracts common fields: timestamp, level, message, and all other fields.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.JsonParser = void 0;
9
+ // Common timestamp field names
10
+ const TS_FIELDS = ['timestamp', 'time', '@timestamp', 'ts', 'date', 'datetime'];
11
+ // Common level field names
12
+ const LEVEL_FIELDS = ['level', 'severity', 'log.level', 'logLevel'];
13
+ // Common message field names
14
+ const MSG_FIELDS = ['message', 'msg', 'text', 'body', 'content'];
15
+ class JsonParser {
16
+ parse(line, lineNumber, byteOffset) {
17
+ const trimmed = line.trim();
18
+ if (!trimmed.startsWith('{'))
19
+ return null;
20
+ let parsed;
21
+ try {
22
+ parsed = JSON.parse(trimmed);
23
+ }
24
+ catch {
25
+ return null;
26
+ }
27
+ // Extract timestamp
28
+ let timestamp;
29
+ for (const field of TS_FIELDS) {
30
+ const val = parsed[field];
31
+ if (val) {
32
+ const d = new Date(val);
33
+ if (!isNaN(d.getTime())) {
34
+ timestamp = d;
35
+ break;
36
+ }
37
+ }
38
+ }
39
+ // Extract level
40
+ let level;
41
+ for (const field of LEVEL_FIELDS) {
42
+ const val = parsed[field];
43
+ if (typeof val === 'string') {
44
+ level = val.toUpperCase();
45
+ break;
46
+ }
47
+ else if (typeof val === 'number') {
48
+ // Bunyan level numbers
49
+ level = this.bunyanLevelToString(val);
50
+ break;
51
+ }
52
+ }
53
+ // Extract message
54
+ let message;
55
+ for (const field of MSG_FIELDS) {
56
+ const val = parsed[field];
57
+ if (typeof val === 'string') {
58
+ message = val;
59
+ break;
60
+ }
61
+ }
62
+ return {
63
+ raw: line,
64
+ lineNumber,
65
+ byteOffset,
66
+ format: 'json',
67
+ timestamp,
68
+ level,
69
+ message,
70
+ ...parsed,
71
+ };
72
+ }
73
+ bunyanLevelToString(level) {
74
+ if (level <= 10)
75
+ return 'TRACE';
76
+ if (level <= 20)
77
+ return 'DEBUG';
78
+ if (level <= 30)
79
+ return 'INFO';
80
+ if (level <= 40)
81
+ return 'WARN';
82
+ if (level <= 50)
83
+ return 'ERROR';
84
+ return 'FATAL';
85
+ }
86
+ static test(line) {
87
+ const t = line.trim();
88
+ return t.startsWith('{') && t.endsWith('}');
89
+ }
90
+ }
91
+ exports.JsonParser = JsonParser;
92
+ //# sourceMappingURL=JsonParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JsonParser.js","sourceRoot":"","sources":["../../../src/formats/parsers/JsonParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * NginxParser.ts
3
+ * Parses Nginx combined/common access log format.
4
+ * Example: 127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /index.html HTTP/1.1" 200 2326
5
+ */
6
+ import type { NginxLogEntry } from '../schemas/LogSchema';
7
+ export declare class NginxParser {
8
+ parse(line: string, lineNumber?: number, byteOffset?: number): NginxLogEntry | null;
9
+ private statusToLevel;
10
+ /**
11
+ * Test if a line looks like Nginx format.
12
+ */
13
+ static test(line: string): boolean;
14
+ }
15
+ //# sourceMappingURL=NginxParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NginxParser.d.ts","sourceRoot":"","sources":["../../../src/formats/parsers/NginxParser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAW1D,qBAAa,WAAW;IACtB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAiDnF,OAAO,CAAC,aAAa;IAMrB;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAGnC"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ /**
3
+ * NginxParser.ts
4
+ * Parses Nginx combined/common access log format.
5
+ * Example: 127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /index.html HTTP/1.1" 200 2326
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.NginxParser = void 0;
9
+ // Nginx combined log format pattern
10
+ const NGINX_PATTERN = /^(\S+)\s+(\S+)\s+(\S+)\s+\[([^\]]+)\]\s+"([^"]*?)"\s+(\d+)\s+(\d+)(?:\s+"([^"]*?)"\s+"([^"]*?)")?/;
11
+ const MONTHS = {
12
+ Jan: 0, Feb: 1, Mar: 2, Apr: 3, May: 4, Jun: 5,
13
+ Jul: 6, Aug: 7, Sep: 8, Oct: 9, Nov: 10, Dec: 11,
14
+ };
15
+ class NginxParser {
16
+ parse(line, lineNumber, byteOffset) {
17
+ const match = line.match(NGINX_PATTERN);
18
+ if (!match)
19
+ return null;
20
+ const [, remoteAddr, , remoteUser, timeLocal, request, status, bodyBytesSent, httpReferer = '', httpUserAgent = ''] = match;
21
+ // Parse timestamp: "10/Oct/2000:13:55:36 -0700"
22
+ let timestamp;
23
+ try {
24
+ const [datePart, timePart, tzPart] = timeLocal.split(/[\s:]/);
25
+ const [day, mon, year] = datePart.split('/');
26
+ const [hh, mm, ss] = timePart ? [timePart, ...timeLocal.split(':').slice(1)] : ['0', '0', '0'];
27
+ timestamp = new Date(`${year}-${String(MONTHS[mon] + 1).padStart(2, '0')}-${day}T${hh}:${mm}:${ss}${tzPart ?? ''}`);
28
+ if (isNaN(timestamp.getTime()))
29
+ timestamp = undefined;
30
+ }
31
+ catch {
32
+ timestamp = undefined;
33
+ }
34
+ // Parse request line: "GET /path HTTP/1.1"
35
+ let method;
36
+ let path;
37
+ let protocol;
38
+ const reqParts = request.split(' ');
39
+ if (reqParts.length === 3) {
40
+ [method, path, protocol] = reqParts;
41
+ }
42
+ return {
43
+ raw: line,
44
+ lineNumber,
45
+ byteOffset,
46
+ format: 'nginx',
47
+ timestamp,
48
+ remoteAddr,
49
+ remoteUser: remoteUser === '-' ? '' : remoteUser,
50
+ timeLocal,
51
+ request,
52
+ method,
53
+ path,
54
+ protocol,
55
+ status: parseInt(status, 10),
56
+ bodyBytesSent: parseInt(bodyBytesSent, 10),
57
+ httpReferer: httpReferer === '-' ? '' : httpReferer,
58
+ httpUserAgent,
59
+ level: this.statusToLevel(parseInt(status, 10)),
60
+ message: `${method} ${path} ${status}`,
61
+ };
62
+ }
63
+ statusToLevel(status) {
64
+ if (status >= 500)
65
+ return 'ERROR';
66
+ if (status >= 400)
67
+ return 'WARN';
68
+ return 'INFO';
69
+ }
70
+ /**
71
+ * Test if a line looks like Nginx format.
72
+ */
73
+ static test(line) {
74
+ return NGINX_PATTERN.test(line);
75
+ }
76
+ }
77
+ exports.NginxParser = NginxParser;
78
+ //# sourceMappingURL=NginxParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NginxParser.js","sourceRoot":"","sources":["../../../src/formats/parsers/NginxParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * SyslogParser.ts
3
+ * Parses RFC 3164 and RFC 5424 Syslog formats.
4
+ */
5
+ import type { SyslogEntry } from '../schemas/LogSchema';
6
+ export declare class SyslogParser {
7
+ parse(line: string, lineNumber?: number, byteOffset?: number): SyslogEntry | null;
8
+ static test(line: string): boolean;
9
+ }
10
+ //# sourceMappingURL=SyslogParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SyslogParser.d.ts","sourceRoot":"","sources":["../../../src/formats/parsers/SyslogParser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAoBxD,qBAAa,YAAY;IACvB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAoDjF,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAGnC"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ /**
3
+ * SyslogParser.ts
4
+ * Parses RFC 3164 and RFC 5424 Syslog formats.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.SyslogParser = void 0;
8
+ // RFC 5424: <priority>version timestamp hostname app-name proc-id msg-id msg
9
+ const RFC5424 = /^<(\d+)>(\d+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(.*)/;
10
+ // RFC 3164: <priority>Mmm dd hh:mm:ss hostname message
11
+ const RFC3164 = /^(?:<(\d+)>)?(\w{3}\s+\d{1,2}\s+\d{2}:\d{2}:\d{2})\s+(\S+)\s+(.*)/;
12
+ // Common app log: 2024-01-15T10:00:00Z [LEVEL] message
13
+ const COMMON_LOG = /^(\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})?)\s+(?:\[?(\w+)\]?\s+)?(.*)/;
14
+ const FACILITY_NAMES = [
15
+ 'kern', 'user', 'mail', 'daemon', 'auth', 'syslog', 'lpr', 'news',
16
+ 'uucp', 'cron', 'authpriv', 'ftp', 'ntp', 'security', 'console', 'clockd',
17
+ ];
18
+ const SEVERITY_NAMES = ['EMERG', 'ALERT', 'CRITICAL', 'ERROR', 'WARN', 'NOTICE', 'INFO', 'DEBUG'];
19
+ class SyslogParser {
20
+ parse(line, lineNumber, byteOffset) {
21
+ // Try RFC 5424
22
+ let match = line.match(RFC5424);
23
+ if (match) {
24
+ const [, priority, , timestamp, hostname, appName, procId, msgId, message] = match;
25
+ const pri = parseInt(priority, 10);
26
+ return {
27
+ raw: line, lineNumber, byteOffset,
28
+ format: 'syslog',
29
+ timestamp: new Date(timestamp),
30
+ level: SEVERITY_NAMES[pri & 7] ?? 'INFO',
31
+ facility: FACILITY_NAMES[pri >> 3] ?? 'user',
32
+ severity: SEVERITY_NAMES[pri & 7],
33
+ hostname: hostname === '-' ? undefined : hostname,
34
+ appName: appName === '-' ? undefined : appName,
35
+ procId: procId === '-' ? undefined : procId,
36
+ msgId: msgId === '-' ? undefined : msgId,
37
+ message,
38
+ };
39
+ }
40
+ // Try RFC 3164
41
+ match = line.match(RFC3164);
42
+ if (match) {
43
+ const [, priority, timestamp, hostname, message] = match;
44
+ const pri = priority ? parseInt(priority, 10) : 0;
45
+ return {
46
+ raw: line, lineNumber, byteOffset,
47
+ format: 'syslog',
48
+ timestamp: new Date(`${new Date().getFullYear()} ${timestamp}`),
49
+ level: SEVERITY_NAMES[pri & 7] ?? 'INFO',
50
+ hostname,
51
+ message,
52
+ };
53
+ }
54
+ // Try common log format with ISO timestamp
55
+ match = line.match(COMMON_LOG);
56
+ if (match) {
57
+ const [, timestamp, level, message] = match;
58
+ return {
59
+ raw: line, lineNumber, byteOffset,
60
+ format: 'syslog',
61
+ timestamp: new Date(timestamp),
62
+ level: level?.toUpperCase(),
63
+ message,
64
+ };
65
+ }
66
+ return null;
67
+ }
68
+ static test(line) {
69
+ return RFC5424.test(line) || RFC3164.test(line) || COMMON_LOG.test(line);
70
+ }
71
+ }
72
+ exports.SyslogParser = SyslogParser;
73
+ //# sourceMappingURL=SyslogParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SyslogParser.js","sourceRoot":"","sources":["../../../src/formats/parsers/SyslogParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * LogSchema.ts
3
+ * Defines parsed log entry structures for all supported formats.
4
+ */
5
+ export interface BaseLogEntry {
6
+ raw: string;
7
+ lineNumber?: number;
8
+ byteOffset?: number;
9
+ timestamp?: Date;
10
+ level?: string;
11
+ message?: string;
12
+ format: string;
13
+ }
14
+ export interface NginxLogEntry extends BaseLogEntry {
15
+ format: 'nginx';
16
+ remoteAddr: string;
17
+ remoteUser: string;
18
+ timeLocal: string;
19
+ request: string;
20
+ method?: string;
21
+ path?: string;
22
+ protocol?: string;
23
+ status: number;
24
+ bodyBytesSent: number;
25
+ httpReferer: string;
26
+ httpUserAgent: string;
27
+ }
28
+ export interface ApacheLogEntry extends BaseLogEntry {
29
+ format: 'apache';
30
+ remoteHost: string;
31
+ ident: string;
32
+ authUser: string;
33
+ timestamp: Date;
34
+ request: string;
35
+ method?: string;
36
+ path?: string;
37
+ statusCode: number;
38
+ responseSize: number;
39
+ }
40
+ export interface JsonLogEntry extends BaseLogEntry {
41
+ format: 'json';
42
+ [key: string]: unknown;
43
+ }
44
+ export interface SyslogEntry extends BaseLogEntry {
45
+ format: 'syslog';
46
+ facility?: string;
47
+ severity?: string;
48
+ hostname?: string;
49
+ appName?: string;
50
+ procId?: string;
51
+ msgId?: string;
52
+ }
53
+ export interface KubernetesLogEntry extends BaseLogEntry {
54
+ format: 'kubernetes';
55
+ namespace?: string;
56
+ pod?: string;
57
+ container?: string;
58
+ stream?: string;
59
+ }
60
+ export interface DockerLogEntry extends BaseLogEntry {
61
+ format: 'docker';
62
+ stream?: 'stdout' | 'stderr';
63
+ containerId?: string;
64
+ }
65
+ export interface GenericLogEntry extends BaseLogEntry {
66
+ format: 'generic';
67
+ fields: string[];
68
+ }
69
+ export type AnyLogEntry = NginxLogEntry | ApacheLogEntry | JsonLogEntry | SyslogEntry | KubernetesLogEntry | DockerLogEntry | GenericLogEntry;
70
+ //# sourceMappingURL=LogSchema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogSchema.d.ts","sourceRoot":"","sources":["../../../src/formats/schemas/LogSchema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAc,SAAQ,YAAY;IACjD,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,MAAM,EAAE,QAAQ,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAa,SAAQ,YAAY;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,WAAY,SAAQ,YAAY;IAC/C,MAAM,EAAE,QAAQ,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACtD,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,MAAM,EAAE,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,MAAM,WAAW,GACnB,aAAa,GACb,cAAc,GACd,YAAY,GACZ,WAAW,GACX,kBAAkB,GAClB,cAAc,GACd,eAAe,CAAC"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ /**
3
+ * LogSchema.ts
4
+ * Defines parsed log entry structures for all supported formats.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ //# sourceMappingURL=LogSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogSchema.js","sourceRoot":"","sources":["../../../src/formats/schemas/LogSchema.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * CacheManager.ts
3
+ * LRU in-memory cache for loaded InvertedIndex objects.
4
+ * Prevents reloading the same index from disk repeatedly.
5
+ */
6
+ import type { InvertedIndex } from '../types/IndexTypes';
7
+ export declare class CacheManager {
8
+ private cache;
9
+ private maxSize;
10
+ constructor(maxSize?: number);
11
+ /**
12
+ * Get a cached index by its index file path.
13
+ */
14
+ get(indexPath: string): InvertedIndex | null;
15
+ /**
16
+ * Store an index in the cache.
17
+ * Evicts the least recently used entry if at capacity.
18
+ */
19
+ set(indexPath: string, index: InvertedIndex): void;
20
+ /**
21
+ * Remove a specific index from the cache.
22
+ */
23
+ evict(indexPath: string): boolean;
24
+ /**
25
+ * Clear all cached indexes.
26
+ */
27
+ clear(): void;
28
+ /**
29
+ * Check if an index is cached.
30
+ */
31
+ has(indexPath: string): boolean;
32
+ /**
33
+ * Get cache statistics.
34
+ */
35
+ stats(): {
36
+ size: number;
37
+ maxSize: number;
38
+ entries: Array<{
39
+ indexPath: string;
40
+ accessCount: number;
41
+ loadedAt: string;
42
+ }>;
43
+ };
44
+ }
45
+ //# sourceMappingURL=CacheManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheManager.d.ts","sourceRoot":"","sources":["../../src/index-store/CacheManager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAUzD,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,MAAW;IAIhC;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAe5C;;;OAGG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI;IAkBlD;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIjC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI/B;;OAEG;IACH,KAAK,IAAI;QACP,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,KAAK,CAAC;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC9E;CAWF"}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ /**
3
+ * CacheManager.ts
4
+ * LRU in-memory cache for loaded InvertedIndex objects.
5
+ * Prevents reloading the same index from disk repeatedly.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.CacheManager = void 0;
9
+ class CacheManager {
10
+ cache = new Map();
11
+ maxSize;
12
+ constructor(maxSize = 10) {
13
+ this.maxSize = maxSize;
14
+ }
15
+ /**
16
+ * Get a cached index by its index file path.
17
+ */
18
+ get(indexPath) {
19
+ const entry = this.cache.get(indexPath);
20
+ if (!entry)
21
+ return null;
22
+ // Update LRU metadata
23
+ entry.accessCount++;
24
+ entry.lastAccessed = Date.now();
25
+ // Move to end (most recently used)
26
+ this.cache.delete(indexPath);
27
+ this.cache.set(indexPath, entry);
28
+ return entry.index;
29
+ }
30
+ /**
31
+ * Store an index in the cache.
32
+ * Evicts the least recently used entry if at capacity.
33
+ */
34
+ set(indexPath, index) {
35
+ // Evict LRU if at capacity
36
+ if (this.cache.size >= this.maxSize && !this.cache.has(indexPath)) {
37
+ const lruKey = this.cache.keys().next().value;
38
+ if (lruKey)
39
+ this.cache.delete(lruKey);
40
+ }
41
+ const entry = {
42
+ index,
43
+ indexPath,
44
+ loadedAt: Date.now(),
45
+ accessCount: 1,
46
+ lastAccessed: Date.now(),
47
+ };
48
+ this.cache.set(indexPath, entry);
49
+ }
50
+ /**
51
+ * Remove a specific index from the cache.
52
+ */
53
+ evict(indexPath) {
54
+ return this.cache.delete(indexPath);
55
+ }
56
+ /**
57
+ * Clear all cached indexes.
58
+ */
59
+ clear() {
60
+ this.cache.clear();
61
+ }
62
+ /**
63
+ * Check if an index is cached.
64
+ */
65
+ has(indexPath) {
66
+ return this.cache.has(indexPath);
67
+ }
68
+ /**
69
+ * Get cache statistics.
70
+ */
71
+ stats() {
72
+ return {
73
+ size: this.cache.size,
74
+ maxSize: this.maxSize,
75
+ entries: [...this.cache.values()].map((e) => ({
76
+ indexPath: e.indexPath,
77
+ accessCount: e.accessCount,
78
+ loadedAt: new Date(e.loadedAt).toISOString(),
79
+ })),
80
+ };
81
+ }
82
+ }
83
+ exports.CacheManager = CacheManager;
84
+ //# sourceMappingURL=CacheManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheManager.js","sourceRoot":"","sources":["../../src/index-store/CacheManager.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAYH,MAAa,YAAY;IACf,KAAK,GAA4B,IAAI,GAAG,EAAE,CAAC;IAC3C,OAAO,CAAS;IAExB,YAAY,UAAkB,EAAE;QAC9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,SAAiB;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,sBAAsB;QACtB,KAAK,CAAC,WAAW,EAAE,CAAC;QACpB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEhC,mCAAmC;QACnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAEjC,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,GAAG,CAAC,SAAiB,EAAE,KAAoB;QACzC,2BAA2B;QAC3B,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAClE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAC9C,IAAI,MAAM;gBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,KAAK,GAAe;YACxB,KAAK;YACL,SAAS;YACT,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;YACpB,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;SACzB,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAiB;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,SAAiB;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK;QAKH,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC5C,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE;aAC7C,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;CACF;AAvFD,oCAuFC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * FileWatcher.ts
3
+ * Watches a log file for changes and notifies when it grows.
4
+ * Uses chokidar (inotify/FSEvents) for efficient OS-level file watching.
5
+ */
6
+ import { EventEmitter } from 'events';
7
+ export interface FileChangeEvent {
8
+ filePath: string;
9
+ previousSize: number;
10
+ currentSize: number;
11
+ addedBytes: number;
12
+ timestamp: Date;
13
+ }
14
+ export declare class FileWatcher extends EventEmitter {
15
+ private watcher;
16
+ private fileSizes;
17
+ /**
18
+ * Start watching a file (or glob pattern).
19
+ * Emits:
20
+ * - 'change' (event: FileChangeEvent) — when the file grows
21
+ * - 'add' (filePath: string) — when a new file is added
22
+ * - 'unlink' (filePath: string) — when a file is removed
23
+ * - 'error' (err: Error) — on watcher error
24
+ */
25
+ watch(filePathOrGlob: string | string[]): void;
26
+ /**
27
+ * Add more files to watch without restarting.
28
+ */
29
+ add(filePath: string): void;
30
+ /**
31
+ * Stop watching.
32
+ */
33
+ stop(): Promise<void>;
34
+ /**
35
+ * Check if currently watching.
36
+ */
37
+ isWatching(): boolean;
38
+ }
39
+ //# sourceMappingURL=FileWatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileWatcher.d.ts","sourceRoot":"","sources":["../../src/index-store/FileWatcher.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,SAAS,CAAkC;IAEnD;;;;;;;OAOG;IACH,KAAK,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAiD9C;;OAEG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI3B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B;;OAEG;IACH,UAAU,IAAI,OAAO;CAGtB"}