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,121 @@
1
+ "use strict";
2
+ /**
3
+ * FileWatcher.ts
4
+ * Watches a log file for changes and notifies when it grows.
5
+ * Uses chokidar (inotify/FSEvents) for efficient OS-level file watching.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.FileWatcher = void 0;
42
+ const chokidar = __importStar(require("chokidar"));
43
+ const events_1 = require("events");
44
+ class FileWatcher extends events_1.EventEmitter {
45
+ watcher = null;
46
+ fileSizes = new Map();
47
+ /**
48
+ * Start watching a file (or glob pattern).
49
+ * Emits:
50
+ * - 'change' (event: FileChangeEvent) — when the file grows
51
+ * - 'add' (filePath: string) — when a new file is added
52
+ * - 'unlink' (filePath: string) — when a file is removed
53
+ * - 'error' (err: Error) — on watcher error
54
+ */
55
+ watch(filePathOrGlob) {
56
+ if (this.watcher) {
57
+ this.stop();
58
+ }
59
+ this.watcher = chokidar.watch(filePathOrGlob, {
60
+ persistent: true,
61
+ ignoreInitial: false,
62
+ usePolling: false,
63
+ awaitWriteFinish: {
64
+ stabilityThreshold: 100,
65
+ pollInterval: 50,
66
+ },
67
+ atomic: false,
68
+ });
69
+ this.watcher.on('add', (filePath, stats) => {
70
+ const size = stats?.size ?? 0;
71
+ this.fileSizes.set(filePath, size);
72
+ this.emit('add', filePath);
73
+ });
74
+ this.watcher.on('change', (filePath, stats) => {
75
+ const previousSize = this.fileSizes.get(filePath) ?? 0;
76
+ const currentSize = stats?.size ?? previousSize;
77
+ if (currentSize > previousSize) {
78
+ const event = {
79
+ filePath,
80
+ previousSize,
81
+ currentSize,
82
+ addedBytes: currentSize - previousSize,
83
+ timestamp: new Date(),
84
+ };
85
+ this.fileSizes.set(filePath, currentSize);
86
+ this.emit('change', event);
87
+ }
88
+ });
89
+ this.watcher.on('unlink', (filePath) => {
90
+ this.fileSizes.delete(filePath);
91
+ this.emit('unlink', filePath);
92
+ });
93
+ this.watcher.on('error', (err) => {
94
+ this.emit('error', err);
95
+ });
96
+ }
97
+ /**
98
+ * Add more files to watch without restarting.
99
+ */
100
+ add(filePath) {
101
+ this.watcher?.add(filePath);
102
+ }
103
+ /**
104
+ * Stop watching.
105
+ */
106
+ async stop() {
107
+ if (this.watcher) {
108
+ await this.watcher.close();
109
+ this.watcher = null;
110
+ }
111
+ this.fileSizes.clear();
112
+ }
113
+ /**
114
+ * Check if currently watching.
115
+ */
116
+ isWatching() {
117
+ return this.watcher !== null;
118
+ }
119
+ }
120
+ exports.FileWatcher = FileWatcher;
121
+ //# sourceMappingURL=FileWatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileWatcher.js","sourceRoot":"","sources":["../../src/index-store/FileWatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * IncrementalUpdater.ts
3
+ * Incrementally updates an existing index when new lines are appended to a log file.
4
+ * Only processes the newly added bytes — no full rebuild needed.
5
+ */
6
+ import type { InvertedIndex, IndexConfig } from '../types/IndexTypes';
7
+ export declare class IncrementalUpdater {
8
+ private serializer;
9
+ private config;
10
+ constructor(config?: IndexConfig);
11
+ /**
12
+ * Update the index with any new content added to the file since the index was built.
13
+ * @param filePath Path to the log file
14
+ * @param indexPath Path to the existing .lsi index file
15
+ * @returns Updated index, or null if no updates were needed
16
+ */
17
+ update(filePath: string, indexPath: string): Promise<InvertedIndex | null>;
18
+ }
19
+ //# sourceMappingURL=IncrementalUpdater.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IncrementalUpdater.d.ts","sourceRoot":"","sources":["../../src/index-store/IncrementalUpdater.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEtE,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,MAAM,CAAc;gBAEhB,MAAM,GAAE,WAAgB;IAKpC;;;;;OAKG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;CA4CjF"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ /**
3
+ * IncrementalUpdater.ts
4
+ * Incrementally updates an existing index when new lines are appended to a log file.
5
+ * Only processes the newly added bytes — no full rebuild needed.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.IncrementalUpdater = void 0;
9
+ const promises_1 = require("fs/promises");
10
+ const ChunkProcessor_1 = require("../core/indexer/ChunkProcessor");
11
+ const IndexSerializer_1 = require("../core/indexer/IndexSerializer");
12
+ class IncrementalUpdater {
13
+ serializer;
14
+ config;
15
+ constructor(config = {}) {
16
+ this.config = config;
17
+ this.serializer = new IndexSerializer_1.IndexSerializer();
18
+ }
19
+ /**
20
+ * Update the index with any new content added to the file since the index was built.
21
+ * @param filePath Path to the log file
22
+ * @param indexPath Path to the existing .lsi index file
23
+ * @returns Updated index, or null if no updates were needed
24
+ */
25
+ async update(filePath, indexPath) {
26
+ const index = await this.serializer.load(indexPath);
27
+ const { size: currentSize } = await (0, promises_1.stat)(filePath);
28
+ const indexedSize = index.metadata.fileSize;
29
+ if (currentSize <= indexedSize) {
30
+ // No new data
31
+ return null;
32
+ }
33
+ // Process only the new bytes
34
+ const processor = new ChunkProcessor_1.ChunkProcessor(filePath, this.config);
35
+ const chunkResult = await processor.process(indexedSize, currentSize - 1, 999999 // sentinel chunkId for incremental
36
+ );
37
+ if (chunkResult.lineCount === 0)
38
+ return null;
39
+ // Merge new terms into existing index
40
+ for (const [term, offsets] of Object.entries(chunkResult.termOffsets)) {
41
+ if (index.invertedIndex[term]) {
42
+ index.invertedIndex[term].push(...offsets);
43
+ }
44
+ else {
45
+ index.invertedIndex[term] = offsets;
46
+ }
47
+ }
48
+ // Append new line offsets
49
+ index.lineOffsets.push(...chunkResult.lineOffsets);
50
+ index.lineOffsets.sort((a, b) => a - b); // keep sorted
51
+ // Update metadata
52
+ index.metadata.totalLines += chunkResult.lineCount;
53
+ index.metadata.fileSize = currentSize;
54
+ index.metadata.uniqueTerms = Object.keys(index.invertedIndex).length;
55
+ index.metadata.builtAt = new Date().toISOString();
56
+ // Persist updated index
57
+ await this.serializer.save(index, indexPath, this.config.compression ?? 'gzip');
58
+ return index;
59
+ }
60
+ }
61
+ exports.IncrementalUpdater = IncrementalUpdater;
62
+ //# sourceMappingURL=IncrementalUpdater.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IncrementalUpdater.js","sourceRoot":"","sources":["../../src/index-store/IncrementalUpdater.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,0CAAmC;AACnC,mEAAgE;AAChE,qEAAkE;AAGlE,MAAa,kBAAkB;IACrB,UAAU,CAAkB;IAC5B,MAAM,CAAc;IAE5B,YAAY,SAAsB,EAAE;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,IAAI,iCAAe,EAAE,CAAC;IAC1C,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAM,CAAC,QAAgB,EAAE,SAAiB;QAC9C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpD,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,IAAA,eAAI,EAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAE5C,IAAI,WAAW,IAAI,WAAW,EAAE,CAAC;YAC/B,cAAc;YACd,OAAO,IAAI,CAAC;QACd,CAAC;QAED,6BAA6B;QAC7B,MAAM,SAAS,GAAG,IAAI,+BAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,OAAO,CACzC,WAAW,EACX,WAAW,GAAG,CAAC,EACf,MAAM,CAAC,mCAAmC;SAC3C,CAAC;QAEF,IAAI,WAAW,CAAC,SAAS,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAE7C,sCAAsC;QACtC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;YACtE,IAAI,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9B,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;YAC7C,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;YACtC,CAAC;QACH,CAAC;QAED,0BAA0B;QAC1B,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QACnD,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc;QAEvD,kBAAkB;QAClB,KAAK,CAAC,QAAQ,CAAC,UAAU,IAAI,WAAW,CAAC,SAAS,CAAC;QACnD,KAAK,CAAC,QAAQ,CAAC,QAAQ,GAAG,WAAW,CAAC;QACtC,KAAK,CAAC,QAAQ,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC;QACrE,KAAK,CAAC,QAAQ,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAElD,wBAAwB;QACxB,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,CAAC;QAEhF,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AA3DD,gDA2DC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * IndexStore.ts
3
+ * Manages the registry of built indexes.
4
+ * Maps source file paths to their corresponding .lsi index paths.
5
+ * Persists the registry to ~/.log-search/registry.json.
6
+ */
7
+ import type { IndexInfo, InvertedIndex } from '../types/IndexTypes';
8
+ interface RegistryEntry {
9
+ filePath: string;
10
+ indexPath: string;
11
+ builtAt: string;
12
+ fileSize: number;
13
+ totalLines: number;
14
+ }
15
+ export declare class IndexStore {
16
+ private registryPath;
17
+ private registry;
18
+ private serializer;
19
+ private cache;
20
+ constructor(cacheSize?: number);
21
+ /**
22
+ * Load the registry from disk. Creates it if it doesn't exist.
23
+ */
24
+ loadRegistry(): Promise<void>;
25
+ private saveRegistry;
26
+ private fileKey;
27
+ /**
28
+ * Get the index path for a source file, or null if not indexed.
29
+ */
30
+ getIndexPath(filePath: string): Promise<string | null>;
31
+ /**
32
+ * Register a new index for a source file.
33
+ */
34
+ saveIndexPath(filePath: string, indexPath: string, meta?: {
35
+ totalLines: number;
36
+ fileSize: number;
37
+ }): Promise<void>;
38
+ /**
39
+ * Remove an index entry from the registry.
40
+ */
41
+ removeEntry(filePath: string): Promise<void>;
42
+ /**
43
+ * List all registered indexes.
44
+ */
45
+ listAll(): Promise<RegistryEntry[]>;
46
+ /**
47
+ * Load an InvertedIndex, using the in-memory cache when available.
48
+ */
49
+ loadIndex(indexPath: string): Promise<InvertedIndex>;
50
+ /**
51
+ * Get detailed info about a file's index.
52
+ */
53
+ getIndexInfo(filePath: string): Promise<IndexInfo | null>;
54
+ private ensureRegistryLoaded;
55
+ getCacheStats(): {
56
+ size: number;
57
+ maxSize: number;
58
+ entries: Array<{
59
+ indexPath: string;
60
+ accessCount: number;
61
+ loadedAt: string;
62
+ }>;
63
+ };
64
+ }
65
+ export {};
66
+ //# sourceMappingURL=IndexStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndexStore.d.ts","sourceRoot":"","sources":["../../src/index-store/IndexStore.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpE,UAAU,aAAa;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAOD,qBAAa,UAAU;IACrB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,KAAK,CAAe;gBAEhB,SAAS,GAAE,MAAW;IASlC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;YASrB,YAAY;IAM1B,OAAO,CAAC,OAAO;IAIf;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAiB5D;;OAEG;IACG,aAAa,CACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAC9C,OAAO,CAAC,IAAI,CAAC;IAgBhB;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAOzC;;OAEG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAa1D;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;YA6BjD,oBAAoB;IAIlC,aAAa;;;;;;;;;CAGd"}
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ /**
3
+ * IndexStore.ts
4
+ * Manages the registry of built indexes.
5
+ * Maps source file paths to their corresponding .lsi index paths.
6
+ * Persists the registry to ~/.log-search/registry.json.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.IndexStore = void 0;
43
+ const path = __importStar(require("path"));
44
+ const os = __importStar(require("os"));
45
+ const crypto = __importStar(require("crypto"));
46
+ const promises_1 = require("fs/promises");
47
+ const IndexSerializer_1 = require("../core/indexer/IndexSerializer");
48
+ const CacheManager_1 = require("./CacheManager");
49
+ class IndexStore {
50
+ registryPath;
51
+ registry = null;
52
+ serializer;
53
+ cache;
54
+ constructor(cacheSize = 10) {
55
+ const baseDir = path.join(os.homedir(), '.log-search');
56
+ this.registryPath = path.join(baseDir, 'registry.json');
57
+ this.serializer = new IndexSerializer_1.IndexSerializer();
58
+ this.cache = new CacheManager_1.CacheManager(cacheSize);
59
+ }
60
+ // ─── Registry Operations ──────────────────────────────────────────────────
61
+ /**
62
+ * Load the registry from disk. Creates it if it doesn't exist.
63
+ */
64
+ async loadRegistry() {
65
+ try {
66
+ const raw = await (0, promises_1.readFile)(this.registryPath, 'utf8');
67
+ this.registry = JSON.parse(raw);
68
+ }
69
+ catch {
70
+ this.registry = { version: 1, entries: {} };
71
+ }
72
+ }
73
+ async saveRegistry() {
74
+ const dir = path.dirname(this.registryPath);
75
+ await (0, promises_1.mkdir)(dir, { recursive: true });
76
+ await (0, promises_1.writeFile)(this.registryPath, JSON.stringify(this.registry, null, 2), 'utf8');
77
+ }
78
+ fileKey(filePath) {
79
+ return crypto.createHash('md5').update(path.resolve(filePath)).digest('hex');
80
+ }
81
+ /**
82
+ * Get the index path for a source file, or null if not indexed.
83
+ */
84
+ async getIndexPath(filePath) {
85
+ await this.ensureRegistryLoaded();
86
+ const key = this.fileKey(filePath);
87
+ const entry = this.registry.entries[key];
88
+ if (!entry)
89
+ return null;
90
+ // Verify the index file still exists
91
+ const exists = await this.serializer.exists(entry.indexPath);
92
+ if (!exists) {
93
+ delete this.registry.entries[key];
94
+ await this.saveRegistry();
95
+ return null;
96
+ }
97
+ return entry.indexPath;
98
+ }
99
+ /**
100
+ * Register a new index for a source file.
101
+ */
102
+ async saveIndexPath(filePath, indexPath, meta) {
103
+ await this.ensureRegistryLoaded();
104
+ const key = this.fileKey(filePath);
105
+ const fileStats = await (0, promises_1.stat)(filePath);
106
+ this.registry.entries[key] = {
107
+ filePath: path.resolve(filePath),
108
+ indexPath,
109
+ builtAt: new Date().toISOString(),
110
+ fileSize: meta?.fileSize ?? fileStats.size,
111
+ totalLines: meta?.totalLines ?? 0,
112
+ };
113
+ await this.saveRegistry();
114
+ }
115
+ /**
116
+ * Remove an index entry from the registry.
117
+ */
118
+ async removeEntry(filePath) {
119
+ await this.ensureRegistryLoaded();
120
+ const key = this.fileKey(filePath);
121
+ delete this.registry.entries[key];
122
+ this.cache.evict(filePath);
123
+ await this.saveRegistry();
124
+ }
125
+ /**
126
+ * List all registered indexes.
127
+ */
128
+ async listAll() {
129
+ await this.ensureRegistryLoaded();
130
+ return Object.values(this.registry.entries);
131
+ }
132
+ // ─── Index Loading with Cache ─────────────────────────────────────────────
133
+ /**
134
+ * Load an InvertedIndex, using the in-memory cache when available.
135
+ */
136
+ async loadIndex(indexPath) {
137
+ // Check cache first
138
+ const cached = this.cache.get(indexPath);
139
+ if (cached)
140
+ return cached;
141
+ // Load from disk
142
+ const index = await this.serializer.load(indexPath);
143
+ this.cache.set(indexPath, index);
144
+ return index;
145
+ }
146
+ // ─── Index Info ───────────────────────────────────────────────────────────
147
+ /**
148
+ * Get detailed info about a file's index.
149
+ */
150
+ async getIndexInfo(filePath) {
151
+ const indexPath = await this.getIndexPath(filePath);
152
+ if (!indexPath)
153
+ return null;
154
+ const [fileStats, indexSizeBytes] = await Promise.all([
155
+ (0, promises_1.stat)(filePath).catch(() => null),
156
+ this.serializer.getSize(indexPath),
157
+ ]);
158
+ const index = await this.loadIndex(indexPath);
159
+ const fileSize = fileStats?.size ?? 0;
160
+ const isStale = fileSize !== index.metadata.fileSize;
161
+ return {
162
+ indexPath,
163
+ filePath: path.resolve(filePath),
164
+ fileSize,
165
+ indexSize: indexSizeBytes,
166
+ totalLines: index.metadata.totalLines,
167
+ uniqueTerms: index.metadata.uniqueTerms,
168
+ builtAt: index.metadata.builtAt,
169
+ compressionRatio: index.metadata.compressionRatio,
170
+ isStale,
171
+ };
172
+ }
173
+ // ─── Helpers ──────────────────────────────────────────────────────────────
174
+ async ensureRegistryLoaded() {
175
+ if (!this.registry)
176
+ await this.loadRegistry();
177
+ }
178
+ getCacheStats() {
179
+ return this.cache.stats();
180
+ }
181
+ }
182
+ exports.IndexStore = IndexStore;
183
+ //# sourceMappingURL=IndexStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndexStore.js","sourceRoot":"","sources":["../../src/index-store/IndexStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * src/index.ts
3
+ * Public API exports for programmatic use.
4
+ *
5
+ * @example
6
+ * import { IndexBuilder, IndexSearcher } from 'log-search';
7
+ *
8
+ * const builder = new IndexBuilder('./app.log');
9
+ * const result = await builder.build();
10
+ *
11
+ * const searcher = new IndexSearcher('./app.log');
12
+ * await searcher.loadIndex(result.indexPath);
13
+ * const hits = await searcher.search('ERROR AND timeout');
14
+ */
15
+ export { IndexBuilder } from './core/indexer/IndexBuilder';
16
+ export { IndexSearcher } from './core/searcher/IndexSearcher';
17
+ export { ResultFetcher } from './core/searcher/ResultFetcher';
18
+ export { RankEngine } from './core/searcher/RankEngine';
19
+ export { TokenExtractor } from './core/indexer/TokenExtractor';
20
+ export { OffsetMapper } from './core/indexer/OffsetMapper';
21
+ export { ChunkProcessor } from './core/indexer/ChunkProcessor';
22
+ export { IndexSerializer } from './core/indexer/IndexSerializer';
23
+ export { WorkerPool } from './core/workers/WorkerPool';
24
+ export { FileStreamer } from './core/streaming/FileStreamer';
25
+ export { LineBuffer } from './core/streaming/LineBuffer';
26
+ export { ChunkSplitter } from './core/streaming/ChunkSplitter';
27
+ export { IndexStore } from './index-store/IndexStore';
28
+ export { CacheManager } from './index-store/CacheManager';
29
+ export { FileWatcher } from './index-store/FileWatcher';
30
+ export { IncrementalUpdater } from './index-store/IncrementalUpdater';
31
+ export { LogFormatDetector } from './formats/LogFormatDetector';
32
+ export { NginxParser } from './formats/parsers/NginxParser';
33
+ export { ApacheParser } from './formats/parsers/ApacheParser';
34
+ export { JsonParser } from './formats/parsers/JsonParser';
35
+ export { SyslogParser } from './formats/parsers/SyslogParser';
36
+ export { GenericParser } from './formats/parsers/GenericParser';
37
+ export { QueryParser } from './query/QueryEngine';
38
+ export { RegexMatcher } from './query/regex/RegexMatcher';
39
+ export { FuzzyMatcher } from './query/regex/FuzzyMatcher';
40
+ export { AndOperator } from './query/operators/AndOperator';
41
+ export { OrOperator } from './query/operators/OrOperator';
42
+ export { NotOperator } from './query/operators/NotOperator';
43
+ export { RangeOperator } from './query/operators/RangeOperator';
44
+ export * from './types/IndexTypes';
45
+ export * from './types/SearchTypes';
46
+ export * from './types/ConfigTypes';
47
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAG/D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAGtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAGhE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAGhE,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ /**
3
+ * src/index.ts
4
+ * Public API exports for programmatic use.
5
+ *
6
+ * @example
7
+ * import { IndexBuilder, IndexSearcher } from 'log-search';
8
+ *
9
+ * const builder = new IndexBuilder('./app.log');
10
+ * const result = await builder.build();
11
+ *
12
+ * const searcher = new IndexSearcher('./app.log');
13
+ * await searcher.loadIndex(result.indexPath);
14
+ * const hits = await searcher.search('ERROR AND timeout');
15
+ */
16
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ var desc = Object.getOwnPropertyDescriptor(m, k);
19
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
20
+ desc = { enumerable: true, get: function() { return m[k]; } };
21
+ }
22
+ Object.defineProperty(o, k2, desc);
23
+ }) : (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ o[k2] = m[k];
26
+ }));
27
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
28
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
29
+ };
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ exports.RangeOperator = exports.NotOperator = exports.OrOperator = exports.AndOperator = exports.FuzzyMatcher = exports.RegexMatcher = exports.QueryParser = exports.GenericParser = exports.SyslogParser = exports.JsonParser = exports.ApacheParser = exports.NginxParser = exports.LogFormatDetector = exports.IncrementalUpdater = exports.FileWatcher = exports.CacheManager = exports.IndexStore = exports.ChunkSplitter = exports.LineBuffer = exports.FileStreamer = exports.WorkerPool = exports.IndexSerializer = exports.ChunkProcessor = exports.OffsetMapper = exports.TokenExtractor = exports.RankEngine = exports.ResultFetcher = exports.IndexSearcher = exports.IndexBuilder = void 0;
32
+ // Core
33
+ var IndexBuilder_1 = require("./core/indexer/IndexBuilder");
34
+ Object.defineProperty(exports, "IndexBuilder", { enumerable: true, get: function () { return IndexBuilder_1.IndexBuilder; } });
35
+ var IndexSearcher_1 = require("./core/searcher/IndexSearcher");
36
+ Object.defineProperty(exports, "IndexSearcher", { enumerable: true, get: function () { return IndexSearcher_1.IndexSearcher; } });
37
+ var ResultFetcher_1 = require("./core/searcher/ResultFetcher");
38
+ Object.defineProperty(exports, "ResultFetcher", { enumerable: true, get: function () { return ResultFetcher_1.ResultFetcher; } });
39
+ var RankEngine_1 = require("./core/searcher/RankEngine");
40
+ Object.defineProperty(exports, "RankEngine", { enumerable: true, get: function () { return RankEngine_1.RankEngine; } });
41
+ var TokenExtractor_1 = require("./core/indexer/TokenExtractor");
42
+ Object.defineProperty(exports, "TokenExtractor", { enumerable: true, get: function () { return TokenExtractor_1.TokenExtractor; } });
43
+ var OffsetMapper_1 = require("./core/indexer/OffsetMapper");
44
+ Object.defineProperty(exports, "OffsetMapper", { enumerable: true, get: function () { return OffsetMapper_1.OffsetMapper; } });
45
+ var ChunkProcessor_1 = require("./core/indexer/ChunkProcessor");
46
+ Object.defineProperty(exports, "ChunkProcessor", { enumerable: true, get: function () { return ChunkProcessor_1.ChunkProcessor; } });
47
+ var IndexSerializer_1 = require("./core/indexer/IndexSerializer");
48
+ Object.defineProperty(exports, "IndexSerializer", { enumerable: true, get: function () { return IndexSerializer_1.IndexSerializer; } });
49
+ var WorkerPool_1 = require("./core/workers/WorkerPool");
50
+ Object.defineProperty(exports, "WorkerPool", { enumerable: true, get: function () { return WorkerPool_1.WorkerPool; } });
51
+ // Streaming
52
+ var FileStreamer_1 = require("./core/streaming/FileStreamer");
53
+ Object.defineProperty(exports, "FileStreamer", { enumerable: true, get: function () { return FileStreamer_1.FileStreamer; } });
54
+ var LineBuffer_1 = require("./core/streaming/LineBuffer");
55
+ Object.defineProperty(exports, "LineBuffer", { enumerable: true, get: function () { return LineBuffer_1.LineBuffer; } });
56
+ var ChunkSplitter_1 = require("./core/streaming/ChunkSplitter");
57
+ Object.defineProperty(exports, "ChunkSplitter", { enumerable: true, get: function () { return ChunkSplitter_1.ChunkSplitter; } });
58
+ // Index Store
59
+ var IndexStore_1 = require("./index-store/IndexStore");
60
+ Object.defineProperty(exports, "IndexStore", { enumerable: true, get: function () { return IndexStore_1.IndexStore; } });
61
+ var CacheManager_1 = require("./index-store/CacheManager");
62
+ Object.defineProperty(exports, "CacheManager", { enumerable: true, get: function () { return CacheManager_1.CacheManager; } });
63
+ var FileWatcher_1 = require("./index-store/FileWatcher");
64
+ Object.defineProperty(exports, "FileWatcher", { enumerable: true, get: function () { return FileWatcher_1.FileWatcher; } });
65
+ var IncrementalUpdater_1 = require("./index-store/IncrementalUpdater");
66
+ Object.defineProperty(exports, "IncrementalUpdater", { enumerable: true, get: function () { return IncrementalUpdater_1.IncrementalUpdater; } });
67
+ // Formats
68
+ var LogFormatDetector_1 = require("./formats/LogFormatDetector");
69
+ Object.defineProperty(exports, "LogFormatDetector", { enumerable: true, get: function () { return LogFormatDetector_1.LogFormatDetector; } });
70
+ var NginxParser_1 = require("./formats/parsers/NginxParser");
71
+ Object.defineProperty(exports, "NginxParser", { enumerable: true, get: function () { return NginxParser_1.NginxParser; } });
72
+ var ApacheParser_1 = require("./formats/parsers/ApacheParser");
73
+ Object.defineProperty(exports, "ApacheParser", { enumerable: true, get: function () { return ApacheParser_1.ApacheParser; } });
74
+ var JsonParser_1 = require("./formats/parsers/JsonParser");
75
+ Object.defineProperty(exports, "JsonParser", { enumerable: true, get: function () { return JsonParser_1.JsonParser; } });
76
+ var SyslogParser_1 = require("./formats/parsers/SyslogParser");
77
+ Object.defineProperty(exports, "SyslogParser", { enumerable: true, get: function () { return SyslogParser_1.SyslogParser; } });
78
+ var GenericParser_1 = require("./formats/parsers/GenericParser");
79
+ Object.defineProperty(exports, "GenericParser", { enumerable: true, get: function () { return GenericParser_1.GenericParser; } });
80
+ // Query
81
+ var QueryEngine_1 = require("./query/QueryEngine");
82
+ Object.defineProperty(exports, "QueryParser", { enumerable: true, get: function () { return QueryEngine_1.QueryParser; } });
83
+ var RegexMatcher_1 = require("./query/regex/RegexMatcher");
84
+ Object.defineProperty(exports, "RegexMatcher", { enumerable: true, get: function () { return RegexMatcher_1.RegexMatcher; } });
85
+ var FuzzyMatcher_1 = require("./query/regex/FuzzyMatcher");
86
+ Object.defineProperty(exports, "FuzzyMatcher", { enumerable: true, get: function () { return FuzzyMatcher_1.FuzzyMatcher; } });
87
+ var AndOperator_1 = require("./query/operators/AndOperator");
88
+ Object.defineProperty(exports, "AndOperator", { enumerable: true, get: function () { return AndOperator_1.AndOperator; } });
89
+ var OrOperator_1 = require("./query/operators/OrOperator");
90
+ Object.defineProperty(exports, "OrOperator", { enumerable: true, get: function () { return OrOperator_1.OrOperator; } });
91
+ var NotOperator_1 = require("./query/operators/NotOperator");
92
+ Object.defineProperty(exports, "NotOperator", { enumerable: true, get: function () { return NotOperator_1.NotOperator; } });
93
+ var RangeOperator_1 = require("./query/operators/RangeOperator");
94
+ Object.defineProperty(exports, "RangeOperator", { enumerable: true, get: function () { return RangeOperator_1.RangeOperator; } });
95
+ // Types
96
+ __exportStar(require("./types/IndexTypes"), exports);
97
+ __exportStar(require("./types/SearchTypes"), exports);
98
+ __exportStar(require("./types/ConfigTypes"), exports);
99
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;;;;;;;;;;;;;;;AAEH,OAAO;AACP,4DAA2D;AAAlD,4GAAA,YAAY,OAAA;AACrB,+DAA8D;AAArD,8GAAA,aAAa,OAAA;AACtB,+DAA8D;AAArD,8GAAA,aAAa,OAAA;AACtB,yDAAwD;AAA/C,wGAAA,UAAU,OAAA;AACnB,gEAA+D;AAAtD,gHAAA,cAAc,OAAA;AACvB,4DAA2D;AAAlD,4GAAA,YAAY,OAAA;AACrB,gEAA+D;AAAtD,gHAAA,cAAc,OAAA;AACvB,kEAAiE;AAAxD,kHAAA,eAAe,OAAA;AACxB,wDAAuD;AAA9C,wGAAA,UAAU,OAAA;AAEnB,YAAY;AACZ,8DAA6D;AAApD,4GAAA,YAAY,OAAA;AACrB,0DAAyD;AAAhD,wGAAA,UAAU,OAAA;AACnB,gEAA+D;AAAtD,8GAAA,aAAa,OAAA;AAEtB,cAAc;AACd,uDAAsD;AAA7C,wGAAA,UAAU,OAAA;AACnB,2DAA0D;AAAjD,4GAAA,YAAY,OAAA;AACrB,yDAAwD;AAA/C,0GAAA,WAAW,OAAA;AACpB,uEAAsE;AAA7D,wHAAA,kBAAkB,OAAA;AAE3B,UAAU;AACV,iEAAgE;AAAvD,sHAAA,iBAAiB,OAAA;AAC1B,6DAA4D;AAAnD,0GAAA,WAAW,OAAA;AACpB,+DAA8D;AAArD,4GAAA,YAAY,OAAA;AACrB,2DAA0D;AAAjD,wGAAA,UAAU,OAAA;AACnB,+DAA8D;AAArD,4GAAA,YAAY,OAAA;AACrB,iEAAgE;AAAvD,8GAAA,aAAa,OAAA;AAEtB,QAAQ;AACR,mDAAkD;AAAzC,0GAAA,WAAW,OAAA;AACpB,2DAA0D;AAAjD,4GAAA,YAAY,OAAA;AACrB,2DAA0D;AAAjD,4GAAA,YAAY,OAAA;AACrB,6DAA4D;AAAnD,0GAAA,WAAW,OAAA;AACpB,2DAA0D;AAAjD,wGAAA,UAAU,OAAA;AACnB,6DAA4D;AAAnD,0GAAA,WAAW,OAAA;AACpB,iEAAgE;AAAvD,8GAAA,aAAa,OAAA;AAEtB,QAAQ;AACR,qDAAmC;AACnC,sDAAoC;AACpC,sDAAoC"}