codevault 1.8.4 → 1.8.5

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 (351) hide show
  1. package/README.md +3 -2
  2. package/dist/chunking/token-counter.d.ts.map +1 -1
  3. package/dist/chunking/token-counter.js +16 -10
  4. package/dist/chunking/token-counter.js.map +1 -1
  5. package/dist/cli/commands/index-cmd.d.ts.map +1 -1
  6. package/dist/cli/commands/index-cmd.js +108 -97
  7. package/dist/cli/commands/index-cmd.js.map +1 -1
  8. package/dist/cli/commands/interactive-config.d.ts.map +1 -1
  9. package/dist/cli/commands/interactive-config.js +40 -3
  10. package/dist/cli/commands/interactive-config.js.map +1 -1
  11. package/dist/cli/commands/search-cmd.d.ts.map +1 -1
  12. package/dist/cli/commands/search-cmd.js +11 -7
  13. package/dist/cli/commands/search-cmd.js.map +1 -1
  14. package/dist/cli/commands/search-with-code-cmd.d.ts.map +1 -1
  15. package/dist/cli/commands/search-with-code-cmd.js +3 -1
  16. package/dist/cli/commands/search-with-code-cmd.js.map +1 -1
  17. package/dist/cli/utils.d.ts +56 -0
  18. package/dist/cli/utils.d.ts.map +1 -0
  19. package/dist/cli/utils.js +98 -0
  20. package/dist/cli/utils.js.map +1 -0
  21. package/dist/config/constants.d.ts +4 -0
  22. package/dist/config/constants.d.ts.map +1 -1
  23. package/dist/config/constants.js +2 -0
  24. package/dist/config/constants.js.map +1 -1
  25. package/dist/context/packs.d.ts.map +1 -1
  26. package/dist/context/packs.js +3 -1
  27. package/dist/context/packs.js.map +1 -1
  28. package/dist/core/IndexerEngine.d.ts +2 -0
  29. package/dist/core/IndexerEngine.d.ts.map +1 -1
  30. package/dist/core/IndexerEngine.js +34 -26
  31. package/dist/core/IndexerEngine.js.map +1 -1
  32. package/dist/core/SearchService.d.ts +1 -0
  33. package/dist/core/SearchService.d.ts.map +1 -1
  34. package/dist/core/SearchService.js +18 -12
  35. package/dist/core/SearchService.js.map +1 -1
  36. package/dist/core/batch-indexer.d.ts.map +1 -1
  37. package/dist/core/batch-indexer.js +5 -13
  38. package/dist/core/batch-indexer.js.map +1 -1
  39. package/dist/core/indexing/IndexFinalizationStage.d.ts.map +1 -1
  40. package/dist/core/indexing/IndexFinalizationStage.js +21 -2
  41. package/dist/core/indexing/IndexFinalizationStage.js.map +1 -1
  42. package/dist/core/indexing/IndexState.d.ts +3 -8
  43. package/dist/core/indexing/IndexState.d.ts.map +1 -1
  44. package/dist/core/indexing/IndexState.js.map +1 -1
  45. package/dist/core/indexing/PersistManager.d.ts +1 -1
  46. package/dist/core/indexing/PersistManager.d.ts.map +1 -1
  47. package/dist/core/indexing/PersistManager.js +17 -17
  48. package/dist/core/indexing/PersistManager.js.map +1 -1
  49. package/dist/core/search/HybridFusion.d.ts +0 -1
  50. package/dist/core/search/HybridFusion.d.ts.map +1 -1
  51. package/dist/core/search/HybridFusion.js +2 -14
  52. package/dist/core/search/HybridFusion.js.map +1 -1
  53. package/dist/core/search/ResultMapper.d.ts +0 -1
  54. package/dist/core/search/ResultMapper.d.ts.map +1 -1
  55. package/dist/core/search/ResultMapper.js +2 -13
  56. package/dist/core/search/ResultMapper.js.map +1 -1
  57. package/dist/core/search/SearchContextManager.d.ts +3 -0
  58. package/dist/core/search/SearchContextManager.d.ts.map +1 -1
  59. package/dist/core/search/SearchContextManager.js +15 -2
  60. package/dist/core/search/SearchContextManager.js.map +1 -1
  61. package/dist/core/search.d.ts.map +1 -1
  62. package/dist/core/search.js +9 -4
  63. package/dist/core/search.js.map +1 -1
  64. package/dist/languages/rules.d.ts.map +1 -1
  65. package/dist/languages/rules.js +14 -5
  66. package/dist/languages/rules.js.map +1 -1
  67. package/dist/mcp/schemas.d.ts +2 -2
  68. package/dist/mcp-server.d.ts +1 -0
  69. package/dist/mcp-server.d.ts.map +1 -1
  70. package/dist/mcp-server.js +32 -21
  71. package/dist/mcp-server.js.map +1 -1
  72. package/dist/providers/base.d.ts +3 -2
  73. package/dist/providers/base.d.ts.map +1 -1
  74. package/dist/providers/base.js +3 -1
  75. package/dist/providers/base.js.map +1 -1
  76. package/dist/providers/chat-llm.d.ts +2 -2
  77. package/dist/providers/chat-llm.d.ts.map +1 -1
  78. package/dist/providers/chat-llm.js +4 -1
  79. package/dist/providers/chat-llm.js.map +1 -1
  80. package/dist/providers/openai.d.ts.map +1 -1
  81. package/dist/providers/openai.js +4 -1
  82. package/dist/providers/openai.js.map +1 -1
  83. package/dist/ranking/api-reranker.d.ts.map +1 -1
  84. package/dist/ranking/api-reranker.js +27 -8
  85. package/dist/ranking/api-reranker.js.map +1 -1
  86. package/dist/ranking/symbol-boost.d.ts.map +1 -1
  87. package/dist/ranking/symbol-boost.js +4 -11
  88. package/dist/ranking/symbol-boost.js.map +1 -1
  89. package/dist/search/bm25.d.ts +10 -0
  90. package/dist/search/bm25.d.ts.map +1 -1
  91. package/dist/search/bm25.js +16 -0
  92. package/dist/search/bm25.js.map +1 -1
  93. package/dist/storage/encrypted-chunks.d.ts +3 -0
  94. package/dist/storage/encrypted-chunks.d.ts.map +1 -1
  95. package/dist/storage/encrypted-chunks.js +108 -16
  96. package/dist/storage/encrypted-chunks.js.map +1 -1
  97. package/dist/synthesis/conversational-synthesizer.d.ts +2 -1
  98. package/dist/synthesis/conversational-synthesizer.d.ts.map +1 -1
  99. package/dist/synthesis/conversational-synthesizer.js +6 -1
  100. package/dist/synthesis/conversational-synthesizer.js.map +1 -1
  101. package/dist/synthesis/prompt-builder.d.ts.map +1 -1
  102. package/dist/synthesis/prompt-builder.js +40 -13
  103. package/dist/synthesis/prompt-builder.js.map +1 -1
  104. package/dist/synthesis/synthesizer.d.ts.map +1 -1
  105. package/dist/synthesis/synthesizer.js +14 -2
  106. package/dist/synthesis/synthesizer.js.map +1 -1
  107. package/dist/tests/api-reranker.test.d.ts +2 -0
  108. package/dist/tests/api-reranker.test.d.ts.map +1 -0
  109. package/dist/tests/api-reranker.test.js +575 -0
  110. package/dist/tests/api-reranker.test.js.map +1 -0
  111. package/dist/tests/bm25.test.d.ts +2 -0
  112. package/dist/tests/bm25.test.d.ts.map +1 -0
  113. package/dist/tests/bm25.test.js +340 -0
  114. package/dist/tests/bm25.test.js.map +1 -0
  115. package/dist/tests/chunking/file-grouper.test.d.ts +2 -0
  116. package/dist/tests/chunking/file-grouper.test.d.ts.map +1 -0
  117. package/dist/tests/chunking/file-grouper.test.js +495 -0
  118. package/dist/tests/chunking/file-grouper.test.js.map +1 -0
  119. package/dist/tests/chunking/semantic-chunker.test.d.ts +2 -0
  120. package/dist/tests/chunking/semantic-chunker.test.d.ts.map +1 -0
  121. package/dist/tests/chunking/semantic-chunker.test.js +509 -0
  122. package/dist/tests/chunking/semantic-chunker.test.js.map +1 -0
  123. package/dist/tests/chunking/token-counter.test.d.ts +2 -0
  124. package/dist/tests/chunking/token-counter.test.d.ts.map +1 -0
  125. package/dist/tests/chunking/token-counter.test.js +441 -0
  126. package/dist/tests/chunking/token-counter.test.js.map +1 -0
  127. package/dist/tests/cli/ask-cmd.test.d.ts +2 -0
  128. package/dist/tests/cli/ask-cmd.test.d.ts.map +1 -0
  129. package/dist/tests/cli/ask-cmd.test.js +152 -0
  130. package/dist/tests/cli/ask-cmd.test.js.map +1 -0
  131. package/dist/tests/cli/chat-cmd.test.d.ts +2 -0
  132. package/dist/tests/cli/chat-cmd.test.d.ts.map +1 -0
  133. package/dist/tests/cli/chat-cmd.test.js +118 -0
  134. package/dist/tests/cli/chat-cmd.test.js.map +1 -0
  135. package/dist/tests/cli/config-cmd.test.d.ts +2 -0
  136. package/dist/tests/cli/config-cmd.test.d.ts.map +1 -0
  137. package/dist/tests/cli/config-cmd.test.js +226 -0
  138. package/dist/tests/cli/config-cmd.test.js.map +1 -0
  139. package/dist/tests/cli/context.test.d.ts +2 -0
  140. package/dist/tests/cli/context.test.d.ts.map +1 -0
  141. package/dist/tests/cli/context.test.js +158 -0
  142. package/dist/tests/cli/context.test.js.map +1 -0
  143. package/dist/tests/cli/index-cmd.test.d.ts +2 -0
  144. package/dist/tests/cli/index-cmd.test.d.ts.map +1 -0
  145. package/dist/tests/cli/index-cmd.test.js +89 -0
  146. package/dist/tests/cli/index-cmd.test.js.map +1 -0
  147. package/dist/tests/cli/index.test.d.ts +2 -0
  148. package/dist/tests/cli/index.test.d.ts.map +1 -0
  149. package/dist/tests/cli/index.test.js +167 -0
  150. package/dist/tests/cli/index.test.js.map +1 -0
  151. package/dist/tests/cli/info-cmd.test.d.ts +2 -0
  152. package/dist/tests/cli/info-cmd.test.d.ts.map +1 -0
  153. package/dist/tests/cli/info-cmd.test.js +47 -0
  154. package/dist/tests/cli/info-cmd.test.js.map +1 -0
  155. package/dist/tests/cli/interactive-config.test.d.ts +2 -0
  156. package/dist/tests/cli/interactive-config.test.d.ts.map +1 -0
  157. package/dist/tests/cli/interactive-config.test.js +30 -0
  158. package/dist/tests/cli/interactive-config.test.js.map +1 -0
  159. package/dist/tests/cli/mcp-cmd.test.d.ts +2 -0
  160. package/dist/tests/cli/mcp-cmd.test.d.ts.map +1 -0
  161. package/dist/tests/cli/mcp-cmd.test.js +47 -0
  162. package/dist/tests/cli/mcp-cmd.test.js.map +1 -0
  163. package/dist/tests/cli/search-cmd.test.d.ts +2 -0
  164. package/dist/tests/cli/search-cmd.test.d.ts.map +1 -0
  165. package/dist/tests/cli/search-cmd.test.js +120 -0
  166. package/dist/tests/cli/search-cmd.test.js.map +1 -0
  167. package/dist/tests/cli/search-with-code-cmd.test.d.ts +2 -0
  168. package/dist/tests/cli/search-with-code-cmd.test.d.ts.map +1 -0
  169. package/dist/tests/cli/search-with-code-cmd.test.js +140 -0
  170. package/dist/tests/cli/search-with-code-cmd.test.js.map +1 -0
  171. package/dist/tests/cli/update-cmd.test.d.ts +2 -0
  172. package/dist/tests/cli/update-cmd.test.d.ts.map +1 -0
  173. package/dist/tests/cli/update-cmd.test.js +75 -0
  174. package/dist/tests/cli/update-cmd.test.js.map +1 -0
  175. package/dist/tests/cli/utils.test.d.ts +2 -0
  176. package/dist/tests/cli/utils.test.d.ts.map +1 -0
  177. package/dist/tests/cli/utils.test.js +119 -0
  178. package/dist/tests/cli/utils.test.js.map +1 -0
  179. package/dist/tests/cli/watch-cmd.test.d.ts +2 -0
  180. package/dist/tests/cli/watch-cmd.test.d.ts.map +1 -0
  181. package/dist/tests/cli/watch-cmd.test.js +84 -0
  182. package/dist/tests/cli/watch-cmd.test.js.map +1 -0
  183. package/dist/tests/cli-ui.test.d.ts +2 -0
  184. package/dist/tests/cli-ui.test.d.ts.map +1 -0
  185. package/dist/tests/cli-ui.test.js +608 -0
  186. package/dist/tests/cli-ui.test.js.map +1 -0
  187. package/dist/tests/codemap-io.test.d.ts +2 -0
  188. package/dist/tests/codemap-io.test.d.ts.map +1 -0
  189. package/dist/tests/codemap-io.test.js +992 -0
  190. package/dist/tests/codemap-io.test.js.map +1 -0
  191. package/dist/tests/config/apply-env.test.d.ts +2 -0
  192. package/dist/tests/config/apply-env.test.d.ts.map +1 -0
  193. package/dist/tests/config/apply-env.test.js +717 -0
  194. package/dist/tests/config/apply-env.test.js.map +1 -0
  195. package/dist/tests/config/constants.test.d.ts +2 -0
  196. package/dist/tests/config/constants.test.d.ts.map +1 -0
  197. package/dist/tests/config/constants.test.js +406 -0
  198. package/dist/tests/config/constants.test.js.map +1 -0
  199. package/dist/tests/config/loader.test.d.ts +2 -0
  200. package/dist/tests/config/loader.test.d.ts.map +1 -0
  201. package/dist/tests/config/loader.test.js +716 -0
  202. package/dist/tests/config/loader.test.js.map +1 -0
  203. package/dist/tests/config/resolver.test.d.ts +2 -0
  204. package/dist/tests/config/resolver.test.d.ts.map +1 -0
  205. package/dist/tests/config/resolver.test.js +402 -0
  206. package/dist/tests/config/resolver.test.js.map +1 -0
  207. package/dist/tests/config/types.test.d.ts +2 -0
  208. package/dist/tests/config/types.test.d.ts.map +1 -0
  209. package/dist/tests/config/types.test.js +460 -0
  210. package/dist/tests/config/types.test.js.map +1 -0
  211. package/dist/tests/context-packs.test.d.ts +2 -0
  212. package/dist/tests/context-packs.test.d.ts.map +1 -0
  213. package/dist/tests/context-packs.test.js +826 -0
  214. package/dist/tests/context-packs.test.js.map +1 -0
  215. package/dist/tests/conversational-synthesizer.test.d.ts +2 -0
  216. package/dist/tests/conversational-synthesizer.test.d.ts.map +1 -0
  217. package/dist/tests/conversational-synthesizer.test.js +595 -0
  218. package/dist/tests/conversational-synthesizer.test.js.map +1 -0
  219. package/dist/tests/database.test.d.ts +2 -0
  220. package/dist/tests/database.test.d.ts.map +1 -0
  221. package/dist/tests/database.test.js +965 -0
  222. package/dist/tests/database.test.js.map +1 -0
  223. package/dist/tests/encrypted-chunks.test.d.ts +2 -0
  224. package/dist/tests/encrypted-chunks.test.d.ts.map +1 -0
  225. package/dist/tests/encrypted-chunks.test.js +1470 -0
  226. package/dist/tests/encrypted-chunks.test.js.map +1 -0
  227. package/dist/tests/hybrid.test.d.ts +2 -0
  228. package/dist/tests/hybrid.test.d.ts.map +1 -0
  229. package/dist/tests/hybrid.test.js +456 -0
  230. package/dist/tests/hybrid.test.js.map +1 -0
  231. package/dist/tests/indexer/ChangeQueue.test.d.ts +12 -0
  232. package/dist/tests/indexer/ChangeQueue.test.d.ts.map +1 -0
  233. package/dist/tests/indexer/ChangeQueue.test.js +441 -0
  234. package/dist/tests/indexer/ChangeQueue.test.js.map +1 -0
  235. package/dist/tests/indexer/ProviderManager.test.d.ts +12 -0
  236. package/dist/tests/indexer/ProviderManager.test.d.ts.map +1 -0
  237. package/dist/tests/indexer/ProviderManager.test.js +290 -0
  238. package/dist/tests/indexer/ProviderManager.test.js.map +1 -0
  239. package/dist/tests/indexer/WatchService.test.d.ts +14 -0
  240. package/dist/tests/indexer/WatchService.test.d.ts.map +1 -0
  241. package/dist/tests/indexer/WatchService.test.js +667 -0
  242. package/dist/tests/indexer/WatchService.test.js.map +1 -0
  243. package/dist/tests/indexer/merkle.test.d.ts +11 -0
  244. package/dist/tests/indexer/merkle.test.d.ts.map +1 -0
  245. package/dist/tests/indexer/merkle.test.js +497 -0
  246. package/dist/tests/indexer/merkle.test.js.map +1 -0
  247. package/dist/tests/indexer/update.test.d.ts +10 -0
  248. package/dist/tests/indexer/update.test.d.ts.map +1 -0
  249. package/dist/tests/indexer/update.test.js +317 -0
  250. package/dist/tests/indexer/update.test.js.map +1 -0
  251. package/dist/tests/indexer/watch.test.d.ts +8 -0
  252. package/dist/tests/indexer/watch.test.d.ts.map +1 -0
  253. package/dist/tests/indexer/watch.test.js +95 -0
  254. package/dist/tests/indexer/watch.test.js.map +1 -0
  255. package/dist/tests/integration/index-search.integration.test.js +1 -0
  256. package/dist/tests/integration/index-search.integration.test.js.map +1 -1
  257. package/dist/tests/languages.test.d.ts +2 -0
  258. package/dist/tests/languages.test.d.ts.map +1 -0
  259. package/dist/tests/languages.test.js +575 -0
  260. package/dist/tests/languages.test.js.map +1 -0
  261. package/dist/tests/logger-redaction.test.d.ts +2 -0
  262. package/dist/tests/logger-redaction.test.d.ts.map +1 -0
  263. package/dist/tests/logger-redaction.test.js +48 -0
  264. package/dist/tests/logger-redaction.test.js.map +1 -0
  265. package/dist/tests/logger.test.d.ts +2 -0
  266. package/dist/tests/logger.test.d.ts.map +1 -0
  267. package/dist/tests/logger.test.js +468 -0
  268. package/dist/tests/logger.test.js.map +1 -0
  269. package/dist/tests/markdown-formatter.test.d.ts +2 -0
  270. package/dist/tests/markdown-formatter.test.d.ts.map +1 -0
  271. package/dist/tests/markdown-formatter.test.js +453 -0
  272. package/dist/tests/markdown-formatter.test.js.map +1 -0
  273. package/dist/tests/mcp/tools/use-context-pack.test.d.ts +7 -0
  274. package/dist/tests/mcp/tools/use-context-pack.test.d.ts.map +1 -0
  275. package/dist/tests/mcp/tools/use-context-pack.test.js +505 -0
  276. package/dist/tests/mcp/tools/use-context-pack.test.js.map +1 -0
  277. package/dist/tests/mutex.test.d.ts +2 -0
  278. package/dist/tests/mutex.test.d.ts.map +1 -0
  279. package/dist/tests/mutex.test.js +489 -0
  280. package/dist/tests/mutex.test.js.map +1 -0
  281. package/dist/tests/path-helpers.test.d.ts +2 -0
  282. package/dist/tests/path-helpers.test.d.ts.map +1 -0
  283. package/dist/tests/path-helpers.test.js +332 -0
  284. package/dist/tests/path-helpers.test.js.map +1 -0
  285. package/dist/tests/prompt-builder.test.d.ts +2 -0
  286. package/dist/tests/prompt-builder.test.d.ts.map +1 -0
  287. package/dist/tests/prompt-builder.test.js +417 -0
  288. package/dist/tests/prompt-builder.test.js.map +1 -0
  289. package/dist/tests/providers/base.test.d.ts +2 -0
  290. package/dist/tests/providers/base.test.d.ts.map +1 -0
  291. package/dist/tests/providers/base.test.js +299 -0
  292. package/dist/tests/providers/base.test.js.map +1 -0
  293. package/dist/tests/providers/chat-llm.test.d.ts +2 -0
  294. package/dist/tests/providers/chat-llm.test.d.ts.map +1 -0
  295. package/dist/tests/providers/chat-llm.test.js +435 -0
  296. package/dist/tests/providers/chat-llm.test.js.map +1 -0
  297. package/dist/tests/providers/index.test.d.ts +2 -0
  298. package/dist/tests/providers/index.test.d.ts.map +1 -0
  299. package/dist/tests/providers/index.test.js +204 -0
  300. package/dist/tests/providers/index.test.js.map +1 -0
  301. package/dist/tests/providers/mock.test.d.ts +2 -0
  302. package/dist/tests/providers/mock.test.d.ts.map +1 -0
  303. package/dist/tests/providers/mock.test.js +225 -0
  304. package/dist/tests/providers/mock.test.js.map +1 -0
  305. package/dist/tests/providers/openai.test.d.ts +2 -0
  306. package/dist/tests/providers/openai.test.d.ts.map +1 -0
  307. package/dist/tests/providers/openai.test.js +408 -0
  308. package/dist/tests/providers/openai.test.js.map +1 -0
  309. package/dist/tests/providers/token-counter.test.d.ts +2 -0
  310. package/dist/tests/providers/token-counter.test.d.ts.map +1 -0
  311. package/dist/tests/providers/token-counter.test.js +247 -0
  312. package/dist/tests/providers/token-counter.test.js.map +1 -0
  313. package/dist/tests/rate-limiter.test.js +392 -1
  314. package/dist/tests/rate-limiter.test.js.map +1 -1
  315. package/dist/tests/scope.test.d.ts +2 -0
  316. package/dist/tests/scope.test.d.ts.map +1 -0
  317. package/dist/tests/scope.test.js +529 -0
  318. package/dist/tests/scope.test.js.map +1 -0
  319. package/dist/tests/simple-lru.test.js +377 -0
  320. package/dist/tests/simple-lru.test.js.map +1 -1
  321. package/dist/tests/symbol-boost.test.js +730 -10
  322. package/dist/tests/symbol-boost.test.js.map +1 -1
  323. package/dist/tests/symbols-extract.test.d.ts +2 -0
  324. package/dist/tests/symbols-extract.test.d.ts.map +1 -0
  325. package/dist/tests/symbols-extract.test.js +536 -0
  326. package/dist/tests/symbols-extract.test.js.map +1 -0
  327. package/dist/tests/symbols-graph.test.d.ts +2 -0
  328. package/dist/tests/symbols-graph.test.d.ts.map +1 -0
  329. package/dist/tests/symbols-graph.test.js +656 -0
  330. package/dist/tests/symbols-graph.test.js.map +1 -0
  331. package/dist/tests/synthesizer.test.d.ts +2 -0
  332. package/dist/tests/synthesizer.test.d.ts.map +1 -0
  333. package/dist/tests/synthesizer.test.js +381 -0
  334. package/dist/tests/synthesizer.test.js.map +1 -0
  335. package/dist/types/context-pack.d.ts +3 -3
  336. package/dist/utils/logger.d.ts +5 -1
  337. package/dist/utils/logger.d.ts.map +1 -1
  338. package/dist/utils/logger.js +149 -4
  339. package/dist/utils/logger.js.map +1 -1
  340. package/dist/utils/mutex.d.ts +7 -2
  341. package/dist/utils/mutex.d.ts.map +1 -1
  342. package/dist/utils/mutex.js +31 -7
  343. package/dist/utils/mutex.js.map +1 -1
  344. package/dist/utils/path-helpers.d.ts.map +1 -1
  345. package/dist/utils/path-helpers.js +5 -2
  346. package/dist/utils/path-helpers.js.map +1 -1
  347. package/dist/utils/simple-lru.d.ts +6 -0
  348. package/dist/utils/simple-lru.d.ts.map +1 -1
  349. package/dist/utils/simple-lru.js +26 -0
  350. package/dist/utils/simple-lru.js.map +1 -1
  351. package/package.json +1 -1
@@ -0,0 +1,48 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { redactLogData } from '../utils/logger.js';
4
+ test('redacts obvious secrets in messages and metadata', () => {
5
+ const apiKey = 'sk-1234567890abcdef12345678';
6
+ const bearer = 'Bearer abcdefghijklmnopqrstuvwxyz1234567890';
7
+ const jwt = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.payload.signature';
8
+ const meta = {
9
+ apiKey,
10
+ headers: { Authorization: bearer },
11
+ nested: [{ refreshToken: jwt }]
12
+ };
13
+ const { message, meta: redactedMeta } = redactLogData(`sending ${apiKey}`, meta);
14
+ assert.ok(!message.includes(apiKey));
15
+ assert.ok(message.includes('[REDACTED]'));
16
+ assert.equal(redactedMeta?.apiKey, '[REDACTED]');
17
+ const headers = (redactedMeta?.headers ?? {});
18
+ assert.equal(headers.Authorization, '[REDACTED]');
19
+ const nested = redactedMeta?.nested;
20
+ assert.deepStrictEqual(nested, [{ refreshToken: '[REDACTED]' }]);
21
+ });
22
+ test('leaves safe metadata untouched', () => {
23
+ const meta = { file: 'index.ts', count: 2, dryRun: false };
24
+ const originalMessage = 'Processing index.ts';
25
+ const { message, meta: redactedMeta } = redactLogData(originalMessage, meta);
26
+ assert.equal(message, originalMessage);
27
+ assert.deepStrictEqual(redactedMeta, meta);
28
+ });
29
+ test('redacts configured env var names in message and metadata', () => {
30
+ const previousEnv = process.env.CODEVAULT_REDACT_ENV_VARS;
31
+ process.env.CODEVAULT_REDACT_ENV_VARS = 'CUSTOM_SECRET,ANOTHER_TOKEN';
32
+ try {
33
+ const meta = { CUSTOM_SECRET: 'abc123', note: 'ok' };
34
+ const { message, meta: redactedMeta } = redactLogData('CUSTOM_SECRET=abc123 safe', meta);
35
+ assert.ok(message.includes('[REDACTED]'));
36
+ assert.equal(redactedMeta?.CUSTOM_SECRET, '[REDACTED]');
37
+ assert.equal(redactedMeta?.note, 'ok');
38
+ }
39
+ finally {
40
+ if (previousEnv === undefined) {
41
+ delete process.env.CODEVAULT_REDACT_ENV_VARS;
42
+ }
43
+ else {
44
+ process.env.CODEVAULT_REDACT_ENV_VARS = previousEnv;
45
+ }
46
+ }
47
+ });
48
+ //# sourceMappingURL=logger-redaction.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger-redaction.test.js","sourceRoot":"","sources":["../../src/tests/logger-redaction.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=logger.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.test.d.ts","sourceRoot":"","sources":["../../src/tests/logger.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,468 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { LogLevel, logger, log, print, redactLogData } from '../utils/logger.js';
4
+ // ============================================================================
5
+ // LogLevel Enum Tests
6
+ // ============================================================================
7
+ test('LogLevel enum has correct values', () => {
8
+ assert.equal(LogLevel.DEBUG, 0);
9
+ assert.equal(LogLevel.INFO, 1);
10
+ assert.equal(LogLevel.WARN, 2);
11
+ assert.equal(LogLevel.ERROR, 3);
12
+ assert.equal(LogLevel.SILENT, 4);
13
+ });
14
+ test('LogLevel values are in ascending order', () => {
15
+ assert.ok(LogLevel.DEBUG < LogLevel.INFO);
16
+ assert.ok(LogLevel.INFO < LogLevel.WARN);
17
+ assert.ok(LogLevel.WARN < LogLevel.ERROR);
18
+ assert.ok(LogLevel.ERROR < LogLevel.SILENT);
19
+ });
20
+ // ============================================================================
21
+ // redactLogData Tests - Secret Pattern Matching
22
+ // ============================================================================
23
+ test('redactLogData redacts OpenAI style API keys', () => {
24
+ const result = redactLogData('Using key sk-abc123def456ghi789jkl');
25
+ assert.ok(!result.message.includes('sk-abc123def456ghi789jkl'));
26
+ assert.ok(result.message.includes('[REDACTED]'));
27
+ });
28
+ test('redactLogData redacts GitHub tokens', () => {
29
+ const ghpResult = redactLogData('Token: ghp_abcdefghijklmnopqrstuvwxyz');
30
+ assert.ok(!ghpResult.message.includes('ghp_abcdefghijklmnopqrstuvwxyz'));
31
+ assert.ok(ghpResult.message.includes('[REDACTED]'));
32
+ const ghoResult = redactLogData('Token: gho_abcdefghijklmnopqrstuvwxyz');
33
+ assert.ok(!ghoResult.message.includes('gho_abcdefghijklmnopqrstuvwxyz'));
34
+ });
35
+ test('redactLogData redacts Slack tokens', () => {
36
+ const result = redactLogData('Slack: xoxb-123456789012-abcdefghij');
37
+ assert.ok(!result.message.includes('xoxb-123456789012-abcdefghij'));
38
+ assert.ok(result.message.includes('[REDACTED]'));
39
+ });
40
+ test('redactLogData redacts JWT tokens', () => {
41
+ const jwt = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c';
42
+ const result = redactLogData(`Bearer ${jwt}`);
43
+ assert.ok(!result.message.includes(jwt));
44
+ assert.ok(result.message.includes('[REDACTED]'));
45
+ });
46
+ test('redactLogData redacts Bearer tokens', () => {
47
+ const result = redactLogData('Authorization: Bearer abcdefghijklmnopqrstuvwxyz123456');
48
+ assert.ok(!result.message.includes('abcdefghijklmnopqrstuvwxyz123456'));
49
+ assert.ok(result.message.includes('[REDACTED]'));
50
+ });
51
+ test('redactLogData redacts AWS access key IDs', () => {
52
+ const result = redactLogData('AWS Key: AKIAIOSFODNN7EXAMPLE');
53
+ assert.ok(!result.message.includes('AKIAIOSFODNN7EXAMPLE'));
54
+ assert.ok(result.message.includes('[REDACTED]'));
55
+ });
56
+ test('redactLogData redacts PEM private keys', () => {
57
+ const pemKey = '-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC7o5fkj\n-----END PRIVATE KEY-----';
58
+ const result = redactLogData(`Key: ${pemKey}`);
59
+ assert.ok(!result.message.includes('MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC7o5fkj'));
60
+ assert.ok(result.message.includes('[REDACTED]'));
61
+ });
62
+ test('redactLogData redacts generic api_key patterns', () => {
63
+ const result = redactLogData('api_key=mySecretApiKey123456');
64
+ assert.ok(result.message.includes('[REDACTED]'));
65
+ });
66
+ test('redactLogData redacts password patterns', () => {
67
+ const result = redactLogData('password: mysecretpassword');
68
+ assert.ok(result.message.includes('[REDACTED]'));
69
+ });
70
+ // ============================================================================
71
+ // redactLogData Tests - Environment Variable Names
72
+ // ============================================================================
73
+ test('redactLogData redacts OPENAI_API_KEY values', () => {
74
+ const result = redactLogData('OPENAI_API_KEY=sk-myapikey123456789');
75
+ assert.equal(result.message, 'OPENAI_API_KEY=[REDACTED]');
76
+ });
77
+ test('redactLogData redacts NPM_TOKEN values', () => {
78
+ const result = redactLogData('NPM_TOKEN=npm_token_value_here');
79
+ assert.equal(result.message, 'NPM_TOKEN=[REDACTED]');
80
+ });
81
+ test('redactLogData redacts GITHUB_TOKEN values', () => {
82
+ const result = redactLogData('GITHUB_TOKEN=ghp_tokenvalue123');
83
+ assert.equal(result.message, 'GITHUB_TOKEN=[REDACTED]');
84
+ });
85
+ test('redactLogData redacts DATABASE_URL values', () => {
86
+ const result = redactLogData('DATABASE_URL=postgresql://user:pass@host/db');
87
+ assert.equal(result.message, 'DATABASE_URL=[REDACTED]');
88
+ });
89
+ // ============================================================================
90
+ // redactLogData Tests - Metadata Redaction
91
+ // ============================================================================
92
+ test('redactLogData redacts sensitive key names in metadata', () => {
93
+ const result = redactLogData('Log message', {
94
+ apiKey: 'secret123',
95
+ normalField: 'visible'
96
+ });
97
+ assert.equal(result.meta?.apiKey, '[REDACTED]');
98
+ assert.equal(result.meta?.normalField, 'visible');
99
+ });
100
+ test('redactLogData redacts password field in metadata', () => {
101
+ const result = redactLogData('Log message', {
102
+ password: 'secret123',
103
+ username: 'admin'
104
+ });
105
+ assert.equal(result.meta?.password, '[REDACTED]');
106
+ assert.equal(result.meta?.username, 'admin');
107
+ });
108
+ test('redactLogData redacts token field in metadata', () => {
109
+ const result = redactLogData('Log message', {
110
+ token: 'bearer_xyz123',
111
+ count: 42
112
+ });
113
+ assert.equal(result.meta?.token, '[REDACTED]');
114
+ assert.equal(result.meta?.count, 42);
115
+ });
116
+ test('redactLogData redacts client_secret in metadata', () => {
117
+ const result = redactLogData('OAuth', {
118
+ client_secret: 'my-client-secret',
119
+ client_id: 'my-client-id'
120
+ });
121
+ assert.equal(result.meta?.client_secret, '[REDACTED]');
122
+ assert.equal(result.meta?.client_id, 'my-client-id');
123
+ });
124
+ test('redactLogData redacts nested sensitive fields', () => {
125
+ const result = redactLogData('Nested', {
126
+ config: {
127
+ apiKey: 'secret',
128
+ url: 'https://example.com'
129
+ }
130
+ });
131
+ const config = result.meta?.config;
132
+ assert.equal(config.apiKey, '[REDACTED]');
133
+ assert.equal(config.url, 'https://example.com');
134
+ });
135
+ test('redactLogData handles arrays in metadata', () => {
136
+ const result = redactLogData('Array test', {
137
+ items: ['one', 'two', 'three'],
138
+ tokens: ['secret1', 'secret2'] // This is an array, not a token field
139
+ });
140
+ assert.deepEqual(result.meta?.items, ['one', 'two', 'three']);
141
+ // tokens as a key should be redacted
142
+ assert.equal(result.meta?.tokens, '[REDACTED]');
143
+ });
144
+ test('redactLogData handles null and undefined in metadata', () => {
145
+ const result = redactLogData('Null test', {
146
+ nullField: null,
147
+ undefinedField: undefined,
148
+ normalField: 'value'
149
+ });
150
+ assert.equal(result.meta?.nullField, null);
151
+ assert.equal(result.meta?.undefinedField, undefined);
152
+ assert.equal(result.meta?.normalField, 'value');
153
+ });
154
+ test('redactLogData handles empty metadata', () => {
155
+ const result = redactLogData('Empty meta', {});
156
+ assert.deepEqual(result.meta, {});
157
+ });
158
+ test('redactLogData handles undefined metadata', () => {
159
+ const result = redactLogData('No meta');
160
+ assert.equal(result.meta, undefined);
161
+ });
162
+ // ============================================================================
163
+ // redactLogData Tests - Combination Patterns
164
+ // ============================================================================
165
+ test('redactLogData redacts api_key combinations', () => {
166
+ const result = redactLogData('Setting', {
167
+ my_api_key: 'secret'
168
+ });
169
+ assert.equal(result.meta?.my_api_key, '[REDACTED]');
170
+ });
171
+ test('redactLogData redacts access_token combinations', () => {
172
+ const result = redactLogData('Token', {
173
+ user_access_token: 'token123'
174
+ });
175
+ assert.equal(result.meta?.user_access_token, '[REDACTED]');
176
+ });
177
+ test('redactLogData redacts camelCase sensitive keys', () => {
178
+ const result = redactLogData('CamelCase', {
179
+ clientSecret: 'secret',
180
+ accessToken: 'token',
181
+ refreshToken: 'refresh'
182
+ });
183
+ assert.equal(result.meta?.clientSecret, '[REDACTED]');
184
+ assert.equal(result.meta?.accessToken, '[REDACTED]');
185
+ assert.equal(result.meta?.refreshToken, '[REDACTED]');
186
+ });
187
+ // ============================================================================
188
+ // Logger Level Tests
189
+ // ============================================================================
190
+ test('logger getLevel returns current level', () => {
191
+ const currentLevel = logger.getLevel();
192
+ assert.ok(Object.values(LogLevel).includes(currentLevel));
193
+ });
194
+ test('logger setLevel changes level', () => {
195
+ const originalLevel = logger.getLevel();
196
+ logger.setLevel(LogLevel.DEBUG);
197
+ assert.equal(logger.getLevel(), LogLevel.DEBUG);
198
+ logger.setLevel(LogLevel.ERROR);
199
+ assert.equal(logger.getLevel(), LogLevel.ERROR);
200
+ // Restore original level
201
+ logger.setLevel(originalLevel);
202
+ });
203
+ test('logger isQuiet returns boolean', () => {
204
+ const quiet = logger.isQuiet();
205
+ assert.equal(typeof quiet, 'boolean');
206
+ });
207
+ test('logger setQuiet enables quiet mode', () => {
208
+ const originalQuiet = logger.isQuiet();
209
+ const originalLevel = logger.getLevel();
210
+ logger.setQuiet(true);
211
+ assert.equal(logger.isQuiet(), true);
212
+ assert.ok(logger.getLevel() >= LogLevel.WARN);
213
+ // Restore
214
+ logger.setQuiet(originalQuiet);
215
+ logger.setLevel(originalLevel);
216
+ });
217
+ test('logger setQuiet false does not automatically lower level', () => {
218
+ const originalLevel = logger.getLevel();
219
+ logger.setLevel(LogLevel.ERROR);
220
+ logger.setQuiet(false);
221
+ // Level should stay at ERROR, not automatically lowered
222
+ assert.equal(logger.getLevel(), LogLevel.ERROR);
223
+ logger.setLevel(originalLevel);
224
+ });
225
+ // ============================================================================
226
+ // Logger Output Tests (with captured output)
227
+ // ============================================================================
228
+ test('logger.debug does not output when level is INFO', () => {
229
+ const originalLevel = logger.getLevel();
230
+ logger.setLevel(LogLevel.INFO);
231
+ // This should not throw, just not output
232
+ logger.debug('Debug message');
233
+ logger.setLevel(originalLevel);
234
+ });
235
+ test('logger.info does not output when level is WARN', () => {
236
+ const originalLevel = logger.getLevel();
237
+ logger.setLevel(LogLevel.WARN);
238
+ // This should not throw, just not output
239
+ logger.info('Info message');
240
+ logger.setLevel(originalLevel);
241
+ });
242
+ test('logger.warn does not output when level is ERROR', () => {
243
+ const originalLevel = logger.getLevel();
244
+ logger.setLevel(LogLevel.ERROR);
245
+ // This should not throw, just not output
246
+ logger.warn('Warn message');
247
+ logger.setLevel(originalLevel);
248
+ });
249
+ test('logger.error does not output when level is SILENT', () => {
250
+ const originalLevel = logger.getLevel();
251
+ logger.setLevel(LogLevel.SILENT);
252
+ // This should not throw, just not output
253
+ logger.error('Error message');
254
+ logger.setLevel(originalLevel);
255
+ });
256
+ // ============================================================================
257
+ // Logger Error Method Tests
258
+ // ============================================================================
259
+ test('logger.error handles Error objects', () => {
260
+ const originalLevel = logger.getLevel();
261
+ logger.setLevel(LogLevel.SILENT); // Suppress output
262
+ const error = new Error('Test error');
263
+ // Should not throw
264
+ logger.error('Operation failed', error);
265
+ logger.setLevel(originalLevel);
266
+ });
267
+ test('logger.error handles string errors', () => {
268
+ const originalLevel = logger.getLevel();
269
+ logger.setLevel(LogLevel.SILENT);
270
+ // Should not throw
271
+ logger.error('Operation failed', 'string error');
272
+ logger.setLevel(originalLevel);
273
+ });
274
+ test('logger.error handles null/undefined errors', () => {
275
+ const originalLevel = logger.getLevel();
276
+ logger.setLevel(LogLevel.SILENT);
277
+ // Should not throw
278
+ logger.error('Operation failed', null);
279
+ logger.error('Operation failed', undefined);
280
+ logger.setLevel(originalLevel);
281
+ });
282
+ test('logger.error handles additional metadata', () => {
283
+ const originalLevel = logger.getLevel();
284
+ logger.setLevel(LogLevel.SILENT);
285
+ // Should not throw
286
+ logger.error('Operation failed', new Error('Test'), { requestId: '123' });
287
+ logger.setLevel(originalLevel);
288
+ });
289
+ // ============================================================================
290
+ // log Convenience Object Tests
291
+ // ============================================================================
292
+ test('log.debug calls logger.debug', () => {
293
+ const originalLevel = logger.getLevel();
294
+ logger.setLevel(LogLevel.SILENT);
295
+ // Should not throw
296
+ log.debug('Debug message', { key: 'value' });
297
+ logger.setLevel(originalLevel);
298
+ });
299
+ test('log.info calls logger.info', () => {
300
+ const originalLevel = logger.getLevel();
301
+ logger.setLevel(LogLevel.SILENT);
302
+ // Should not throw
303
+ log.info('Info message', { key: 'value' });
304
+ logger.setLevel(originalLevel);
305
+ });
306
+ test('log.warn calls logger.warn', () => {
307
+ const originalLevel = logger.getLevel();
308
+ logger.setLevel(LogLevel.SILENT);
309
+ // Should not throw
310
+ log.warn('Warn message', { key: 'value' });
311
+ logger.setLevel(originalLevel);
312
+ });
313
+ test('log.error calls logger.error', () => {
314
+ const originalLevel = logger.getLevel();
315
+ logger.setLevel(LogLevel.SILENT);
316
+ // Should not throw
317
+ log.error('Error message', new Error('test'), { key: 'value' });
318
+ logger.setLevel(originalLevel);
319
+ });
320
+ test('log.isQuiet returns logger.isQuiet result', () => {
321
+ assert.equal(log.isQuiet(), logger.isQuiet());
322
+ });
323
+ test('log.setQuiet sets quiet mode', () => {
324
+ const originalQuiet = logger.isQuiet();
325
+ const originalLevel = logger.getLevel();
326
+ log.setQuiet(true);
327
+ assert.equal(logger.isQuiet(), true);
328
+ logger.setQuiet(originalQuiet);
329
+ logger.setLevel(originalLevel);
330
+ });
331
+ // ============================================================================
332
+ // print Function Tests
333
+ // ============================================================================
334
+ test('print does not throw', () => {
335
+ // print writes to stdout, just verify it does not throw
336
+ assert.doesNotThrow(() => {
337
+ // Capture stdout to prevent actual output in tests
338
+ const originalWrite = process.stdout.write;
339
+ process.stdout.write = () => true;
340
+ print('Test message');
341
+ process.stdout.write = originalWrite;
342
+ });
343
+ });
344
+ test('print handles empty string', () => {
345
+ const originalWrite = process.stdout.write;
346
+ let output = '';
347
+ process.stdout.write = (chunk) => {
348
+ output += chunk.toString();
349
+ return true;
350
+ };
351
+ print('');
352
+ process.stdout.write = originalWrite;
353
+ assert.equal(output, '\n');
354
+ });
355
+ test('print handles special characters', () => {
356
+ const originalWrite = process.stdout.write;
357
+ let output = '';
358
+ process.stdout.write = (chunk) => {
359
+ output += chunk.toString();
360
+ return true;
361
+ };
362
+ print('Tab:\tNewline in print');
363
+ process.stdout.write = originalWrite;
364
+ assert.ok(output.includes('Tab:\tNewline in print'));
365
+ });
366
+ // ============================================================================
367
+ // Edge Cases
368
+ // ============================================================================
369
+ test('redactLogData preserves non-sensitive data', () => {
370
+ const result = redactLogData('Normal log message', {
371
+ userId: 123,
372
+ action: 'login',
373
+ timestamp: '2024-01-01T00:00:00Z'
374
+ });
375
+ assert.equal(result.message, 'Normal log message');
376
+ assert.equal(result.meta?.userId, 123);
377
+ assert.equal(result.meta?.action, 'login');
378
+ assert.equal(result.meta?.timestamp, '2024-01-01T00:00:00Z');
379
+ });
380
+ test('redactLogData handles boolean values in metadata', () => {
381
+ const result = redactLogData('Boolean test', {
382
+ enabled: true,
383
+ disabled: false
384
+ });
385
+ assert.equal(result.meta?.enabled, true);
386
+ assert.equal(result.meta?.disabled, false);
387
+ });
388
+ test('redactLogData handles numeric values in metadata', () => {
389
+ const result = redactLogData('Number test', {
390
+ count: 42,
391
+ rate: 3.14,
392
+ negative: -100
393
+ });
394
+ assert.equal(result.meta?.count, 42);
395
+ assert.equal(result.meta?.rate, 3.14);
396
+ assert.equal(result.meta?.negative, -100);
397
+ });
398
+ test('redactLogData handles deeply nested objects', () => {
399
+ const result = redactLogData('Deep nesting', {
400
+ level1: {
401
+ level2: {
402
+ level3: {
403
+ apiKey: 'secret',
404
+ data: 'visible'
405
+ }
406
+ }
407
+ }
408
+ });
409
+ const level1 = result.meta?.level1;
410
+ const level2 = level1?.level2;
411
+ const level3 = level2?.level3;
412
+ assert.equal(level3.apiKey, '[REDACTED]');
413
+ assert.equal(level3.data, 'visible');
414
+ });
415
+ test('redactLogData handles mixed arrays', () => {
416
+ const result = redactLogData('Mixed array', {
417
+ mixed: [1, 'string', { key: 'value' }, null]
418
+ });
419
+ const mixed = result.meta?.mixed;
420
+ assert.deepEqual(mixed, [1, 'string', { key: 'value' }, null]);
421
+ });
422
+ test('redactLogData does not modify original metadata', () => {
423
+ const original = {
424
+ apiKey: 'secret',
425
+ data: 'visible'
426
+ };
427
+ const result = redactLogData('Test', original);
428
+ // Original should be unchanged
429
+ assert.equal(original.apiKey, 'secret');
430
+ // Result should have redacted version
431
+ assert.equal(result.meta?.apiKey, '[REDACTED]');
432
+ });
433
+ // ============================================================================
434
+ // Sensitive Field Detection Tests
435
+ // ============================================================================
436
+ test('redactLogData detects authorization field', () => {
437
+ const result = redactLogData('Auth', { authorization: 'Bearer xyz' });
438
+ assert.equal(result.meta?.authorization, '[REDACTED]');
439
+ });
440
+ test('redactLogData detects session field', () => {
441
+ const result = redactLogData('Session', { session: 'session123' });
442
+ assert.equal(result.meta?.session, '[REDACTED]');
443
+ });
444
+ test('redactLogData detects cookie field', () => {
445
+ const result = redactLogData('Cookie', { cookie: 'sessionid=abc123' });
446
+ assert.equal(result.meta?.cookie, '[REDACTED]');
447
+ });
448
+ test('redactLogData detects secret field', () => {
449
+ const result = redactLogData('Secret', { secret: 'mysecret' });
450
+ assert.equal(result.meta?.secret, '[REDACTED]');
451
+ });
452
+ test('redactLogData detects passwd field', () => {
453
+ const result = redactLogData('Passwd', { passwd: 'mypasswd' });
454
+ assert.equal(result.meta?.passwd, '[REDACTED]');
455
+ });
456
+ test('redactLogData detects pwd field', () => {
457
+ const result = redactLogData('Pwd', { pwd: 'mypwd' });
458
+ assert.equal(result.meta?.pwd, '[REDACTED]');
459
+ });
460
+ test('redactLogData detects auth field', () => {
461
+ const result = redactLogData('Auth field', { auth: 'auth_value' });
462
+ assert.equal(result.meta?.auth, '[REDACTED]');
463
+ });
464
+ test('redactLogData detects bearer field', () => {
465
+ const result = redactLogData('Bearer', { bearer: 'token' });
466
+ assert.equal(result.meta?.bearer, '[REDACTED]');
467
+ });
468
+ //# sourceMappingURL=logger.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.test.js","sourceRoot":"","sources":["../../src/tests/logger.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=markdown-formatter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-formatter.test.d.ts","sourceRoot":"","sources":["../../src/tests/markdown-formatter.test.ts"],"names":[],"mappings":""}