dotenv-diff 2.7.8 → 2.7.10

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 (403) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/src/commands/compare.js +1 -1
  3. package/dist/src/commands/compare.js.map +1 -1
  4. package/dist/src/commands/prompts/promptEnsureFiles.d.ts.map +1 -1
  5. package/dist/src/commands/prompts/promptEnsureFiles.js +10 -5
  6. package/dist/src/commands/prompts/promptEnsureFiles.js.map +1 -1
  7. package/dist/src/commands/scanUsage.js +9 -9
  8. package/dist/src/commands/scanUsage.js.map +1 -1
  9. package/dist/src/config/types.d.ts +2 -1
  10. package/dist/src/config/types.d.ts.map +1 -1
  11. package/dist/src/core/filterIgnoredKeys.d.ts.map +1 -1
  12. package/dist/src/core/filterIgnoredKeys.js +10 -0
  13. package/dist/src/core/filterIgnoredKeys.js.map +1 -1
  14. package/dist/src/core/fixEnv.d.ts.map +1 -1
  15. package/dist/src/core/fixEnv.js +8 -5
  16. package/dist/src/core/fixEnv.js.map +1 -1
  17. package/dist/src/core/helpers/isLikelyMinified.d.ts +8 -0
  18. package/dist/src/core/helpers/isLikelyMinified.d.ts.map +1 -0
  19. package/dist/src/core/helpers/isLikelyMinified.js +10 -0
  20. package/dist/src/core/helpers/isLikelyMinified.js.map +1 -0
  21. package/dist/src/core/scan/patterns.d.ts +9 -1
  22. package/dist/src/core/scan/patterns.d.ts.map +1 -1
  23. package/dist/src/core/scan/patterns.js +52 -0
  24. package/dist/src/core/scan/patterns.js.map +1 -1
  25. package/dist/src/core/scan/scanFile.d.ts.map +1 -1
  26. package/dist/src/core/scan/scanFile.js +13 -2
  27. package/dist/src/core/scan/scanFile.js.map +1 -1
  28. package/dist/src/core/security/secretDetectors.d.ts.map +1 -1
  29. package/dist/src/core/security/secretDetectors.js +27 -14
  30. package/dist/src/core/security/secretDetectors.js.map +1 -1
  31. package/dist/src/services/detectEnvExpirations.js +0 -2
  32. package/dist/src/services/detectEnvExpirations.js.map +1 -1
  33. package/dist/src/services/envDiscovery.js +6 -6
  34. package/dist/src/services/envDiscovery.js.map +1 -1
  35. package/dist/src/services/fileWalker.d.ts.map +1 -1
  36. package/dist/src/services/fileWalker.js +22 -4
  37. package/dist/src/services/fileWalker.js.map +1 -1
  38. package/dist/src/services/processComparisonFile.d.ts +1 -2
  39. package/dist/src/services/processComparisonFile.d.ts.map +1 -1
  40. package/dist/src/services/scanCodebase.d.ts.map +1 -1
  41. package/dist/src/services/scanCodebase.js +3 -0
  42. package/dist/src/services/scanCodebase.js.map +1 -1
  43. package/dist/test/e2e/cli.autoscan.e2e.test.d.ts +2 -0
  44. package/dist/test/e2e/cli.autoscan.e2e.test.d.ts.map +1 -0
  45. package/dist/test/e2e/cli.autoscan.e2e.test.js +263 -0
  46. package/dist/test/e2e/cli.autoscan.e2e.test.js.map +1 -0
  47. package/dist/test/e2e/cli.compare.e2e.test.d.ts +2 -0
  48. package/dist/test/e2e/cli.compare.e2e.test.d.ts.map +1 -0
  49. package/dist/test/e2e/cli.compare.e2e.test.js +94 -0
  50. package/dist/test/e2e/cli.compare.e2e.test.js.map +1 -0
  51. package/dist/test/e2e/cli.detectExpired.e2e.test.d.ts +2 -0
  52. package/dist/test/e2e/cli.detectExpired.e2e.test.d.ts.map +1 -0
  53. package/dist/test/e2e/cli.detectExpired.e2e.test.js +148 -0
  54. package/dist/test/e2e/cli.detectExpired.e2e.test.js.map +1 -0
  55. package/dist/test/e2e/cli.flags.e2e.test.d.ts +2 -0
  56. package/dist/test/e2e/cli.flags.e2e.test.d.ts.map +1 -0
  57. package/dist/test/e2e/cli.flags.e2e.test.js +424 -0
  58. package/dist/test/e2e/cli.flags.e2e.test.js.map +1 -0
  59. package/dist/test/e2e/cli.healthscore.test.d.ts +2 -0
  60. package/dist/test/e2e/cli.healthscore.test.d.ts.map +1 -0
  61. package/dist/test/e2e/cli.healthscore.test.js +79 -0
  62. package/dist/test/e2e/cli.healthscore.test.js.map +1 -0
  63. package/dist/test/e2e/cli.ignore.e2e.test.d.ts +2 -0
  64. package/dist/test/e2e/cli.ignore.e2e.test.d.ts.map +1 -0
  65. package/dist/test/e2e/cli.ignore.e2e.test.js +88 -0
  66. package/dist/test/e2e/cli.ignore.e2e.test.js.map +1 -0
  67. package/dist/test/e2e/cli.inconsistentNaming.e2e.test.d.ts +2 -0
  68. package/dist/test/e2e/cli.inconsistentNaming.e2e.test.d.ts.map +1 -0
  69. package/dist/test/e2e/cli.inconsistentNaming.e2e.test.js +94 -0
  70. package/dist/test/e2e/cli.inconsistentNaming.e2e.test.js.map +1 -0
  71. package/dist/test/e2e/cli.jsonOutput.e2e.test.d.ts +2 -0
  72. package/dist/test/e2e/cli.jsonOutput.e2e.test.d.ts.map +1 -0
  73. package/dist/test/e2e/cli.jsonOutput.e2e.test.js +39 -0
  74. package/dist/test/e2e/cli.jsonOutput.e2e.test.js.map +1 -0
  75. package/dist/test/e2e/cli.loggedWarnings.e2e.test.d.ts +2 -0
  76. package/dist/test/e2e/cli.loggedWarnings.e2e.test.d.ts.map +1 -0
  77. package/dist/test/e2e/cli.loggedWarnings.e2e.test.js +118 -0
  78. package/dist/test/e2e/cli.loggedWarnings.e2e.test.js.map +1 -0
  79. package/dist/test/e2e/cli.secrets.e2e.test.d.ts +2 -0
  80. package/dist/test/e2e/cli.secrets.e2e.test.d.ts.map +1 -0
  81. package/dist/test/e2e/cli.secrets.e2e.test.js +344 -0
  82. package/dist/test/e2e/cli.secrets.e2e.test.js.map +1 -0
  83. package/dist/test/e2e/cli.strict.e2e.test.d.ts +2 -0
  84. package/dist/test/e2e/cli.strict.e2e.test.d.ts.map +1 -0
  85. package/dist/test/e2e/cli.strict.e2e.test.js +76 -0
  86. package/dist/test/e2e/cli.strict.e2e.test.js.map +1 -0
  87. package/dist/test/e2e/cli.uppercaseWarnings.e2e.test.d.ts +2 -0
  88. package/dist/test/e2e/cli.uppercaseWarnings.e2e.test.d.ts.map +1 -0
  89. package/dist/test/e2e/cli.uppercaseWarnings.e2e.test.js +59 -0
  90. package/dist/test/e2e/cli.uppercaseWarnings.e2e.test.js.map +1 -0
  91. package/dist/test/e2e/cli.warningsCount.e2e.test.d.ts +2 -0
  92. package/dist/test/e2e/cli.warningsCount.e2e.test.d.ts.map +1 -0
  93. package/dist/test/e2e/cli.warningsCount.e2e.test.js +54 -0
  94. package/dist/test/e2e/cli.warningsCount.e2e.test.js.map +1 -0
  95. package/dist/test/e2e/frameworks/cli.nextJs.e2e.test.d.ts +2 -0
  96. package/dist/test/e2e/frameworks/cli.nextJs.e2e.test.d.ts.map +1 -0
  97. package/dist/test/e2e/frameworks/cli.nextJs.e2e.test.js +182 -0
  98. package/dist/test/e2e/frameworks/cli.nextJs.e2e.test.js.map +1 -0
  99. package/dist/test/e2e/frameworks/cli.sveltekit.e2e.test.d.ts +2 -0
  100. package/dist/test/e2e/frameworks/cli.sveltekit.e2e.test.d.ts.map +1 -0
  101. package/dist/test/e2e/frameworks/cli.sveltekit.e2e.test.js +333 -0
  102. package/dist/test/e2e/frameworks/cli.sveltekit.e2e.test.js.map +1 -0
  103. package/dist/test/integration/compare-flow.integration.test.d.ts +2 -0
  104. package/dist/test/integration/compare-flow.integration.test.d.ts.map +1 -0
  105. package/dist/test/integration/compare-flow.integration.test.js +26 -0
  106. package/dist/test/integration/compare-flow.integration.test.js.map +1 -0
  107. package/dist/test/unit/cli/program.test.d.ts +2 -0
  108. package/dist/test/unit/cli/program.test.d.ts.map +1 -0
  109. package/dist/test/unit/cli/program.test.js +49 -0
  110. package/dist/test/unit/cli/program.test.js.map +1 -0
  111. package/dist/test/unit/cli/run.test.d.ts +2 -0
  112. package/dist/test/unit/cli/run.test.d.ts.map +1 -0
  113. package/dist/test/unit/cli/run.test.js +331 -0
  114. package/dist/test/unit/cli/run.test.js.map +1 -0
  115. package/dist/test/unit/commands/compare.test.d.ts +2 -0
  116. package/dist/test/unit/commands/compare.test.d.ts.map +1 -0
  117. package/dist/test/unit/commands/compare.test.js +664 -0
  118. package/dist/test/unit/commands/compare.test.js.map +1 -0
  119. package/dist/test/unit/commands/init.test.d.ts +2 -0
  120. package/dist/test/unit/commands/init.test.d.ts.map +1 -0
  121. package/dist/test/unit/commands/init.test.js +54 -0
  122. package/dist/test/unit/commands/init.test.js.map +1 -0
  123. package/dist/test/unit/commands/prompts/promptEnsureFiles.test.d.ts +2 -0
  124. package/dist/test/unit/commands/prompts/promptEnsureFiles.test.d.ts.map +1 -0
  125. package/dist/test/unit/commands/prompts/promptEnsureFiles.test.js +225 -0
  126. package/dist/test/unit/commands/prompts/promptEnsureFiles.test.js.map +1 -0
  127. package/dist/test/unit/commands/prompts/promptNoEnvScenario.test.d.ts +2 -0
  128. package/dist/test/unit/commands/prompts/promptNoEnvScenario.test.d.ts.map +1 -0
  129. package/dist/test/unit/commands/prompts/promptNoEnvScenario.test.js +109 -0
  130. package/dist/test/unit/commands/prompts/promptNoEnvScenario.test.js.map +1 -0
  131. package/dist/test/unit/commands/prompts/prompts.test.d.ts +2 -0
  132. package/dist/test/unit/commands/prompts/prompts.test.d.ts.map +1 -0
  133. package/dist/test/unit/commands/prompts/prompts.test.js +75 -0
  134. package/dist/test/unit/commands/prompts/prompts.test.js.map +1 -0
  135. package/dist/test/unit/commands/scanUsage.test.d.ts +2 -0
  136. package/dist/test/unit/commands/scanUsage.test.d.ts.map +1 -0
  137. package/dist/test/unit/commands/scanUsage.test.js +639 -0
  138. package/dist/test/unit/commands/scanUsage.test.js.map +1 -0
  139. package/dist/test/unit/config/loadConfig.test.d.ts +2 -0
  140. package/dist/test/unit/config/loadConfig.test.d.ts.map +1 -0
  141. package/dist/test/unit/config/loadConfig.test.js +106 -0
  142. package/dist/test/unit/config/loadConfig.test.js.map +1 -0
  143. package/dist/test/unit/config/options.test.d.ts +2 -0
  144. package/dist/test/unit/config/options.test.d.ts.map +1 -0
  145. package/dist/test/unit/config/options.test.js +69 -0
  146. package/dist/test/unit/config/options.test.js.map +1 -0
  147. package/dist/test/unit/core/compare/calculateStats.test.d.ts +2 -0
  148. package/dist/test/unit/core/compare/calculateStats.test.d.ts.map +1 -0
  149. package/dist/test/unit/core/compare/calculateStats.test.js +33 -0
  150. package/dist/test/unit/core/compare/calculateStats.test.js.map +1 -0
  151. package/dist/test/unit/core/compare/parseAndFilterEnv.test.d.ts +2 -0
  152. package/dist/test/unit/core/compare/parseAndFilterEnv.test.d.ts.map +1 -0
  153. package/dist/test/unit/core/compare/parseAndFilterEnv.test.js +227 -0
  154. package/dist/test/unit/core/compare/parseAndFilterEnv.test.js.map +1 -0
  155. package/dist/test/unit/core/compare/updateTotals.test.d.ts +2 -0
  156. package/dist/test/unit/core/compare/updateTotals.test.d.ts.map +1 -0
  157. package/dist/test/unit/core/compare/updateTotals.test.js +106 -0
  158. package/dist/test/unit/core/compare/updateTotals.test.js.map +1 -0
  159. package/dist/test/unit/core/detectInconsistentNaming.test.d.ts +2 -0
  160. package/dist/test/unit/core/detectInconsistentNaming.test.d.ts.map +1 -0
  161. package/dist/test/unit/core/detectInconsistentNaming.test.js +79 -0
  162. package/dist/test/unit/core/detectInconsistentNaming.test.js.map +1 -0
  163. package/dist/test/unit/core/diffEnv.test.d.ts +2 -0
  164. package/dist/test/unit/core/diffEnv.test.d.ts.map +1 -0
  165. package/dist/test/unit/core/diffEnv.test.js +74 -0
  166. package/dist/test/unit/core/diffEnv.test.js.map +1 -0
  167. package/dist/test/unit/core/duplicates.unit.test.d.ts +2 -0
  168. package/dist/test/unit/core/duplicates.unit.test.d.ts.map +1 -0
  169. package/dist/test/unit/core/duplicates.unit.test.js +91 -0
  170. package/dist/test/unit/core/duplicates.unit.test.js.map +1 -0
  171. package/dist/test/unit/core/filterIgnoredKeys.test.d.ts +2 -0
  172. package/dist/test/unit/core/filterIgnoredKeys.test.d.ts.map +1 -0
  173. package/dist/test/unit/core/filterIgnoredKeys.test.js +61 -0
  174. package/dist/test/unit/core/filterIgnoredKeys.test.js.map +1 -0
  175. package/dist/test/unit/core/fixEnv.test.d.ts +2 -0
  176. package/dist/test/unit/core/fixEnv.test.d.ts.map +1 -0
  177. package/dist/test/unit/core/fixEnv.test.js +323 -0
  178. package/dist/test/unit/core/fixEnv.test.js.map +1 -0
  179. package/dist/test/unit/core/frameworks/frameworkDetector.test.d.ts +2 -0
  180. package/dist/test/unit/core/frameworks/frameworkDetector.test.d.ts.map +1 -0
  181. package/dist/test/unit/core/frameworks/frameworkDetector.test.js +44 -0
  182. package/dist/test/unit/core/frameworks/frameworkDetector.test.js.map +1 -0
  183. package/dist/test/unit/core/frameworks/frameworkValidator.test.d.ts +2 -0
  184. package/dist/test/unit/core/frameworks/frameworkValidator.test.d.ts.map +1 -0
  185. package/dist/test/unit/core/frameworks/frameworkValidator.test.js +51 -0
  186. package/dist/test/unit/core/frameworks/frameworkValidator.test.js.map +1 -0
  187. package/dist/test/unit/core/frameworks/nextJsRules.test.d.ts +2 -0
  188. package/dist/test/unit/core/frameworks/nextJsRules.test.d.ts.map +1 -0
  189. package/dist/test/unit/core/frameworks/nextJsRules.test.js +97 -0
  190. package/dist/test/unit/core/frameworks/nextJsRules.test.js.map +1 -0
  191. package/dist/test/unit/core/frameworks/sveltekitRules.test.d.ts +2 -0
  192. package/dist/test/unit/core/frameworks/sveltekitRules.test.d.ts.map +1 -0
  193. package/dist/test/unit/core/frameworks/sveltekitRules.test.js +177 -0
  194. package/dist/test/unit/core/frameworks/sveltekitRules.test.js.map +1 -0
  195. package/dist/test/unit/core/helpers/resolveFromCwd.test.d.ts +2 -0
  196. package/dist/test/unit/core/helpers/resolveFromCwd.test.d.ts.map +1 -0
  197. package/dist/test/unit/core/helpers/resolveFromCwd.test.js +35 -0
  198. package/dist/test/unit/core/helpers/resolveFromCwd.test.js.map +1 -0
  199. package/dist/test/unit/core/helpers/toUpperSnakeCase.test.d.ts +2 -0
  200. package/dist/test/unit/core/helpers/toUpperSnakeCase.test.d.ts.map +1 -0
  201. package/dist/test/unit/core/helpers/toUpperSnakeCase.test.js +47 -0
  202. package/dist/test/unit/core/helpers/toUpperSnakeCase.test.js.map +1 -0
  203. package/dist/test/unit/core/parseEnv.test.d.ts +2 -0
  204. package/dist/test/unit/core/parseEnv.test.d.ts.map +1 -0
  205. package/dist/test/unit/core/parseEnv.test.js +169 -0
  206. package/dist/test/unit/core/parseEnv.test.js.map +1 -0
  207. package/dist/test/unit/core/scan/compareScan.test.d.ts +2 -0
  208. package/dist/test/unit/core/scan/compareScan.test.d.ts.map +1 -0
  209. package/dist/test/unit/core/scan/compareScan.test.js +40 -0
  210. package/dist/test/unit/core/scan/compareScan.test.js.map +1 -0
  211. package/dist/test/unit/core/scan/computeHealthScore.test.d.ts +2 -0
  212. package/dist/test/unit/core/scan/computeHealthScore.test.d.ts.map +1 -0
  213. package/dist/test/unit/core/scan/computeHealthScore.test.js +41 -0
  214. package/dist/test/unit/core/scan/computeHealthScore.test.js.map +1 -0
  215. package/dist/test/unit/core/scan/determineComparisonFile.test.d.ts +2 -0
  216. package/dist/test/unit/core/scan/determineComparisonFile.test.d.ts.map +1 -0
  217. package/dist/test/unit/core/scan/determineComparisonFile.test.js +162 -0
  218. package/dist/test/unit/core/scan/determineComparisonFile.test.js.map +1 -0
  219. package/dist/test/unit/core/scan/patterns.test.d.ts +2 -0
  220. package/dist/test/unit/core/scan/patterns.test.d.ts.map +1 -0
  221. package/dist/test/unit/core/scan/patterns.test.js +483 -0
  222. package/dist/test/unit/core/scan/patterns.test.js.map +1 -0
  223. package/dist/test/unit/core/scan/scanFile.test.d.ts +2 -0
  224. package/dist/test/unit/core/scan/scanFile.test.d.ts.map +1 -0
  225. package/dist/test/unit/core/scan/scanFile.test.js +258 -0
  226. package/dist/test/unit/core/scan/scanFile.test.js.map +1 -0
  227. package/dist/test/unit/core/security/entropy.test.d.ts +2 -0
  228. package/dist/test/unit/core/security/entropy.test.d.ts.map +1 -0
  229. package/dist/test/unit/core/security/entropy.test.js +34 -0
  230. package/dist/test/unit/core/security/entropy.test.js.map +1 -0
  231. package/dist/test/unit/core/security/exampleSecretDetector.test.d.ts +2 -0
  232. package/dist/test/unit/core/security/exampleSecretDetector.test.d.ts.map +1 -0
  233. package/dist/test/unit/core/security/exampleSecretDetector.test.js +57 -0
  234. package/dist/test/unit/core/security/exampleSecretDetector.test.js.map +1 -0
  235. package/dist/test/unit/core/security/secretDetectors.test.d.ts +2 -0
  236. package/dist/test/unit/core/security/secretDetectors.test.d.ts.map +1 -0
  237. package/dist/test/unit/core/security/secretDetectors.test.js +490 -0
  238. package/dist/test/unit/core/security/secretDetectors.test.js.map +1 -0
  239. package/dist/test/unit/index.test.d.ts +2 -0
  240. package/dist/test/unit/index.test.d.ts.map +1 -0
  241. package/dist/test/unit/index.test.js +17 -0
  242. package/dist/test/unit/index.test.js.map +1 -0
  243. package/dist/test/unit/services/detectEnvExpirations.test.d.ts +2 -0
  244. package/dist/test/unit/services/detectEnvExpirations.test.d.ts.map +1 -0
  245. package/dist/test/unit/services/detectEnvExpirations.test.js +120 -0
  246. package/dist/test/unit/services/detectEnvExpirations.test.js.map +1 -0
  247. package/dist/test/unit/services/envDiscovery.test.d.ts +2 -0
  248. package/dist/test/unit/services/envDiscovery.test.d.ts.map +1 -0
  249. package/dist/test/unit/services/envDiscovery.test.js +177 -0
  250. package/dist/test/unit/services/envDiscovery.test.js.map +1 -0
  251. package/dist/test/unit/services/envPairing.test.d.ts +2 -0
  252. package/dist/test/unit/services/envPairing.test.d.ts.map +1 -0
  253. package/dist/test/unit/services/envPairing.test.js +103 -0
  254. package/dist/test/unit/services/envPairing.test.js.map +1 -0
  255. package/dist/test/unit/services/filewalker.test.d.ts +2 -0
  256. package/dist/test/unit/services/filewalker.test.d.ts.map +1 -0
  257. package/dist/test/unit/services/filewalker.test.js +422 -0
  258. package/dist/test/unit/services/filewalker.test.js.map +1 -0
  259. package/dist/test/unit/services/git.test.d.ts +2 -0
  260. package/dist/test/unit/services/git.test.d.ts.map +1 -0
  261. package/dist/test/unit/services/git.test.js +357 -0
  262. package/dist/test/unit/services/git.test.js.map +1 -0
  263. package/dist/test/unit/services/printScanResult.test.d.ts +2 -0
  264. package/dist/test/unit/services/printScanResult.test.d.ts.map +1 -0
  265. package/dist/test/unit/services/printScanResult.test.js +275 -0
  266. package/dist/test/unit/services/printScanResult.test.js.map +1 -0
  267. package/dist/test/unit/services/processComparisonFile.test.d.ts +2 -0
  268. package/dist/test/unit/services/processComparisonFile.test.d.ts.map +1 -0
  269. package/dist/test/unit/services/processComparisonFile.test.js +261 -0
  270. package/dist/test/unit/services/processComparisonFile.test.js.map +1 -0
  271. package/dist/test/unit/services/scanCodebase.test.d.ts +2 -0
  272. package/dist/test/unit/services/scanCodebase.test.d.ts.map +1 -0
  273. package/dist/test/unit/services/scanCodebase.test.js +433 -0
  274. package/dist/test/unit/services/scanCodebase.test.js.map +1 -0
  275. package/dist/test/unit/ui/compare/compareJsonOutput.test.d.ts +2 -0
  276. package/dist/test/unit/ui/compare/compareJsonOutput.test.d.ts.map +1 -0
  277. package/dist/test/unit/ui/compare/compareJsonOutput.test.js +137 -0
  278. package/dist/test/unit/ui/compare/compareJsonOutput.test.js.map +1 -0
  279. package/dist/test/unit/ui/compare/printErrorNotFound.test.d.ts +2 -0
  280. package/dist/test/unit/ui/compare/printErrorNotFound.test.d.ts.map +1 -0
  281. package/dist/test/unit/ui/compare/printErrorNotFound.test.js +36 -0
  282. package/dist/test/unit/ui/compare/printErrorNotFound.test.js.map +1 -0
  283. package/dist/test/unit/ui/compare/printHeader.test.d.ts +2 -0
  284. package/dist/test/unit/ui/compare/printHeader.test.d.ts.map +1 -0
  285. package/dist/test/unit/ui/compare/printHeader.test.js +23 -0
  286. package/dist/test/unit/ui/compare/printHeader.test.js.map +1 -0
  287. package/dist/test/unit/ui/compare/printIssues.test.d.ts +2 -0
  288. package/dist/test/unit/ui/compare/printIssues.test.d.ts.map +1 -0
  289. package/dist/test/unit/ui/compare/printIssues.test.js +69 -0
  290. package/dist/test/unit/ui/compare/printIssues.test.js.map +1 -0
  291. package/dist/test/unit/ui/compare/printPrompt.test.d.ts +2 -0
  292. package/dist/test/unit/ui/compare/printPrompt.test.d.ts.map +1 -0
  293. package/dist/test/unit/ui/compare/printPrompt.test.js +40 -0
  294. package/dist/test/unit/ui/compare/printPrompt.test.js.map +1 -0
  295. package/dist/test/unit/ui/compare/printStats.test.d.ts +2 -0
  296. package/dist/test/unit/ui/compare/printStats.test.d.ts.map +1 -0
  297. package/dist/test/unit/ui/compare/printStats.test.js +52 -0
  298. package/dist/test/unit/ui/compare/printStats.test.js.map +1 -0
  299. package/dist/test/unit/ui/scan/printComparisonError.test.d.ts +2 -0
  300. package/dist/test/unit/ui/scan/printComparisonError.test.d.ts.map +1 -0
  301. package/dist/test/unit/ui/scan/printComparisonError.test.js +28 -0
  302. package/dist/test/unit/ui/scan/printComparisonError.test.js.map +1 -0
  303. package/dist/test/unit/ui/scan/printConsolelogWarning.test.d.ts +2 -0
  304. package/dist/test/unit/ui/scan/printConsolelogWarning.test.d.ts.map +1 -0
  305. package/dist/test/unit/ui/scan/printConsolelogWarning.test.js +118 -0
  306. package/dist/test/unit/ui/scan/printConsolelogWarning.test.js.map +1 -0
  307. package/dist/test/unit/ui/scan/printExampleWarnings.test.d.ts +2 -0
  308. package/dist/test/unit/ui/scan/printExampleWarnings.test.d.ts.map +1 -0
  309. package/dist/test/unit/ui/scan/printExampleWarnings.test.js +63 -0
  310. package/dist/test/unit/ui/scan/printExampleWarnings.test.js.map +1 -0
  311. package/dist/test/unit/ui/scan/printExpireWarnings.test.d.ts +2 -0
  312. package/dist/test/unit/ui/scan/printExpireWarnings.test.d.ts.map +1 -0
  313. package/dist/test/unit/ui/scan/printExpireWarnings.test.js +100 -0
  314. package/dist/test/unit/ui/scan/printExpireWarnings.test.js.map +1 -0
  315. package/dist/test/unit/ui/scan/printFrameworkWarnings.test.d.ts +2 -0
  316. package/dist/test/unit/ui/scan/printFrameworkWarnings.test.d.ts.map +1 -0
  317. package/dist/test/unit/ui/scan/printFrameworkWarnings.test.js +95 -0
  318. package/dist/test/unit/ui/scan/printFrameworkWarnings.test.js.map +1 -0
  319. package/dist/test/unit/ui/scan/printHeader.test.d.ts +2 -0
  320. package/dist/test/unit/ui/scan/printHeader.test.d.ts.map +1 -0
  321. package/dist/test/unit/ui/scan/printHeader.test.js +23 -0
  322. package/dist/test/unit/ui/scan/printHeader.test.js.map +1 -0
  323. package/dist/test/unit/ui/scan/printHealthScore.test.d.ts +2 -0
  324. package/dist/test/unit/ui/scan/printHealthScore.test.d.ts.map +1 -0
  325. package/dist/test/unit/ui/scan/printHealthScore.test.js +44 -0
  326. package/dist/test/unit/ui/scan/printHealthScore.test.js.map +1 -0
  327. package/dist/test/unit/ui/scan/printInconsistentNamingWarning.test.d.ts +2 -0
  328. package/dist/test/unit/ui/scan/printInconsistentNamingWarning.test.d.ts.map +1 -0
  329. package/dist/test/unit/ui/scan/printInconsistentNamingWarning.test.js +55 -0
  330. package/dist/test/unit/ui/scan/printInconsistentNamingWarning.test.js.map +1 -0
  331. package/dist/test/unit/ui/scan/printMissing.test.d.ts +2 -0
  332. package/dist/test/unit/ui/scan/printMissing.test.d.ts.map +1 -0
  333. package/dist/test/unit/ui/scan/printMissing.test.js +71 -0
  334. package/dist/test/unit/ui/scan/printMissing.test.js.map +1 -0
  335. package/dist/test/unit/ui/scan/printMissingExample.test.d.ts +2 -0
  336. package/dist/test/unit/ui/scan/printMissingExample.test.d.ts.map +1 -0
  337. package/dist/test/unit/ui/scan/printMissingExample.test.js +77 -0
  338. package/dist/test/unit/ui/scan/printMissingExample.test.js.map +1 -0
  339. package/dist/test/unit/ui/scan/printSecrets.test.d.ts +2 -0
  340. package/dist/test/unit/ui/scan/printSecrets.test.d.ts.map +1 -0
  341. package/dist/test/unit/ui/scan/printSecrets.test.js +108 -0
  342. package/dist/test/unit/ui/scan/printSecrets.test.js.map +1 -0
  343. package/dist/test/unit/ui/scan/printStats.test.d.ts +2 -0
  344. package/dist/test/unit/ui/scan/printStats.test.d.ts.map +1 -0
  345. package/dist/test/unit/ui/scan/printStats.test.js +42 -0
  346. package/dist/test/unit/ui/scan/printStats.test.js.map +1 -0
  347. package/dist/test/unit/ui/scan/printUnused.test.d.ts +2 -0
  348. package/dist/test/unit/ui/scan/printUnused.test.d.ts.map +1 -0
  349. package/dist/test/unit/ui/scan/printUnused.test.js +35 -0
  350. package/dist/test/unit/ui/scan/printUnused.test.js.map +1 -0
  351. package/dist/test/unit/ui/scan/printUppercaseWarning.test.d.ts +2 -0
  352. package/dist/test/unit/ui/scan/printUppercaseWarning.test.d.ts.map +1 -0
  353. package/dist/test/unit/ui/scan/printUppercaseWarning.test.js +44 -0
  354. package/dist/test/unit/ui/scan/printUppercaseWarning.test.js.map +1 -0
  355. package/dist/test/unit/ui/scan/scanJsonOutput.test.d.ts +2 -0
  356. package/dist/test/unit/ui/scan/scanJsonOutput.test.d.ts.map +1 -0
  357. package/dist/test/unit/ui/scan/scanJsonOutput.test.js +270 -0
  358. package/dist/test/unit/ui/scan/scanJsonOutput.test.js.map +1 -0
  359. package/dist/test/unit/ui/shared/printAutoFix.test.d.ts +2 -0
  360. package/dist/test/unit/ui/shared/printAutoFix.test.d.ts.map +1 -0
  361. package/dist/test/unit/ui/shared/printAutoFix.test.js +54 -0
  362. package/dist/test/unit/ui/shared/printAutoFix.test.js.map +1 -0
  363. package/dist/test/unit/ui/shared/printConfigStatus.test.d.ts +2 -0
  364. package/dist/test/unit/ui/shared/printConfigStatus.test.d.ts.map +1 -0
  365. package/dist/test/unit/ui/shared/printConfigStatus.test.js +44 -0
  366. package/dist/test/unit/ui/shared/printConfigStatus.test.js.map +1 -0
  367. package/dist/test/unit/ui/shared/printDuplicates.test.d.ts +2 -0
  368. package/dist/test/unit/ui/shared/printDuplicates.test.d.ts.map +1 -0
  369. package/dist/test/unit/ui/shared/printDuplicates.test.js +43 -0
  370. package/dist/test/unit/ui/shared/printDuplicates.test.js.map +1 -0
  371. package/dist/test/unit/ui/shared/printFixTips.test.d.ts +2 -0
  372. package/dist/test/unit/ui/shared/printFixTips.test.d.ts.map +1 -0
  373. package/dist/test/unit/ui/shared/printFixTips.test.js +67 -0
  374. package/dist/test/unit/ui/shared/printFixTips.test.js.map +1 -0
  375. package/dist/test/unit/ui/shared/printGitignore.test.d.ts +2 -0
  376. package/dist/test/unit/ui/shared/printGitignore.test.d.ts.map +1 -0
  377. package/dist/test/unit/ui/shared/printGitignore.test.js +59 -0
  378. package/dist/test/unit/ui/shared/printGitignore.test.js.map +1 -0
  379. package/dist/test/unit/ui/shared/printInitStatus.test.d.ts +2 -0
  380. package/dist/test/unit/ui/shared/printInitStatus.test.d.ts.map +1 -0
  381. package/dist/test/unit/ui/shared/printInitStatus.test.js +43 -0
  382. package/dist/test/unit/ui/shared/printInitStatus.test.js.map +1 -0
  383. package/dist/test/unit/ui/shared/printOptionErrors.test.d.ts +2 -0
  384. package/dist/test/unit/ui/shared/printOptionErrors.test.d.ts.map +1 -0
  385. package/dist/test/unit/ui/shared/printOptionErrors.test.js +57 -0
  386. package/dist/test/unit/ui/shared/printOptionErrors.test.js.map +1 -0
  387. package/dist/test/unit/ui/shared/setupGlobalConfig.test.d.ts +2 -0
  388. package/dist/test/unit/ui/shared/setupGlobalConfig.test.d.ts.map +1 -0
  389. package/dist/test/unit/ui/shared/setupGlobalConfig.test.js +27 -0
  390. package/dist/test/unit/ui/shared/setupGlobalConfig.test.js.map +1 -0
  391. package/dist/test/unit/ui/theme.test.d.ts +2 -0
  392. package/dist/test/unit/ui/theme.test.d.ts.map +1 -0
  393. package/dist/test/unit/ui/theme.test.js +61 -0
  394. package/dist/test/unit/ui/theme.test.js.map +1 -0
  395. package/dist/test/utils/cli-helpers.d.ts +27 -0
  396. package/dist/test/utils/cli-helpers.d.ts.map +1 -0
  397. package/dist/test/utils/cli-helpers.js +46 -0
  398. package/dist/test/utils/cli-helpers.js.map +1 -0
  399. package/dist/test/utils/fs-helpers.d.ts +20 -0
  400. package/dist/test/utils/fs-helpers.d.ts.map +1 -0
  401. package/dist/test/utils/fs-helpers.js +30 -0
  402. package/dist/test/utils/fs-helpers.js.map +1 -0
  403. package/package.json +3 -1
@@ -0,0 +1,433 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import path from 'path';
3
+ import os from 'os';
4
+ import fsSync from 'fs';
5
+ import { scanCodebase } from '../../../src/services/scanCodebase.js';
6
+ // Mock dependencies
7
+ vi.mock('../../../src/services/fileWalker.js', () => ({
8
+ findFiles: vi.fn(),
9
+ }));
10
+ vi.mock('../../../src/core/scan/scanFile.js', () => ({
11
+ scanFile: vi.fn(),
12
+ }));
13
+ vi.mock('../../../src/core/security/secretDetectors.js', () => ({
14
+ detectSecretsInSource: vi.fn(),
15
+ }));
16
+ vi.mock('../../../src/ui/scan/printProgress.js', () => ({
17
+ printProgress: vi.fn(),
18
+ }));
19
+ import { findFiles } from '../../../src/services/fileWalker.js';
20
+ import { scanFile } from '../../../src/core/scan/scanFile.js';
21
+ import { detectSecretsInSource } from '../../../src/core/security/secretDetectors.js';
22
+ describe('scanCodebase', () => {
23
+ let tmpDir;
24
+ let defaultOpts;
25
+ beforeEach(() => {
26
+ tmpDir = fsSync.mkdtempSync(path.join(os.tmpdir(), 'scan-test-'));
27
+ defaultOpts = {
28
+ cwd: tmpDir,
29
+ include: [],
30
+ exclude: [],
31
+ ignore: [],
32
+ ignoreRegex: [],
33
+ files: [],
34
+ secrets: false,
35
+ ignoreUrls: [],
36
+ json: false,
37
+ };
38
+ // Reset all mocks
39
+ vi.clearAllMocks();
40
+ });
41
+ afterEach(() => {
42
+ fsSync.rmSync(tmpDir, { recursive: true, force: true });
43
+ });
44
+ describe('basic scanning', () => {
45
+ it('scans files and returns usages', async () => {
46
+ const testFile = path.join(tmpDir, 'app.js');
47
+ fsSync.writeFileSync(testFile, 'const x = process.env.API_KEY;');
48
+ vi.mocked(findFiles).mockResolvedValue([testFile]);
49
+ vi.mocked(scanFile).mockReturnValue([
50
+ {
51
+ variable: 'API_KEY',
52
+ file: testFile,
53
+ line: 1,
54
+ column: 10,
55
+ pattern: 'process.env',
56
+ context: 'const x = process.env.API_KEY;',
57
+ },
58
+ ]);
59
+ const result = await scanCodebase(defaultOpts);
60
+ expect(result.used).toHaveLength(1);
61
+ expect(result.used[0].variable).toBe('API_KEY');
62
+ expect(result.stats.filesScanned).toBe(1);
63
+ expect(result.stats.totalUsages).toBe(1);
64
+ expect(result.stats.uniqueVariables).toBe(1);
65
+ });
66
+ it('handles empty file list', async () => {
67
+ vi.mocked(findFiles).mockResolvedValue([]);
68
+ const result = await scanCodebase(defaultOpts);
69
+ expect(result.used).toHaveLength(0);
70
+ expect(result.stats.filesScanned).toBe(0);
71
+ expect(result.stats.totalUsages).toBe(0);
72
+ expect(result.stats.uniqueVariables).toBe(0);
73
+ });
74
+ it('handles files with no usages', async () => {
75
+ const testFile = path.join(tmpDir, 'app.js');
76
+ fsSync.writeFileSync(testFile, 'const x = 42;');
77
+ vi.mocked(findFiles).mockResolvedValue([testFile]);
78
+ vi.mocked(scanFile).mockReturnValue([]);
79
+ const result = await scanCodebase(defaultOpts);
80
+ expect(result.used).toHaveLength(0);
81
+ expect(result.stats.filesScanned).toBe(1);
82
+ });
83
+ });
84
+ describe('file reading', () => {
85
+ it.skipIf(process.platform === 'win32')('skips files that cannot be read', async () => {
86
+ const testFile = path.join(tmpDir, 'unreadable.js');
87
+ fsSync.writeFileSync(testFile, 'content');
88
+ fsSync.chmodSync(testFile, 0o000); // Make file unreadable
89
+ vi.mocked(findFiles).mockResolvedValue([testFile]);
90
+ const result = await scanCodebase(defaultOpts);
91
+ expect(result.stats.filesScanned).toBe(0);
92
+ // Restore permissions for cleanup
93
+ fsSync.chmodSync(testFile, 0o644);
94
+ });
95
+ it.skipIf(process.platform === 'win32')('continues scanning after encountering unreadable file', async () => {
96
+ const unreadableFile = path.join(tmpDir, 'unreadable.js');
97
+ const readableFile = path.join(tmpDir, 'readable.js');
98
+ fsSync.writeFileSync(unreadableFile, 'content');
99
+ fsSync.writeFileSync(readableFile, 'const x = process.env.KEY;');
100
+ fsSync.chmodSync(unreadableFile, 0o000);
101
+ vi.mocked(findFiles).mockResolvedValue([unreadableFile, readableFile]);
102
+ vi.mocked(scanFile).mockReturnValue([
103
+ {
104
+ variable: 'KEY',
105
+ file: readableFile,
106
+ line: 1,
107
+ column: 10,
108
+ pattern: 'process.env',
109
+ context: 'const x = process.env.KEY;',
110
+ },
111
+ ]);
112
+ const result = await scanCodebase(defaultOpts);
113
+ expect(result.stats.filesScanned).toBe(1);
114
+ expect(result.used).toHaveLength(1);
115
+ fsSync.chmodSync(unreadableFile, 0o644);
116
+ });
117
+ it.runIf(process.platform === 'win32')('skips files that cannot be read (Windows)', async () => {
118
+ // On Windows, we test file read errors by providing a non-existent file path
119
+ const nonExistentFile = path.join(tmpDir, 'non-existent-dir', 'file.js');
120
+ vi.mocked(findFiles).mockResolvedValue([nonExistentFile]);
121
+ const result = await scanCodebase(defaultOpts);
122
+ expect(result.stats.filesScanned).toBe(0);
123
+ });
124
+ it.runIf(process.platform === 'win32')('continues scanning after encountering unreadable file (Windows)', async () => {
125
+ const nonExistentFile = path.join(tmpDir, 'non-existent-dir', 'file.js');
126
+ const readableFile = path.join(tmpDir, 'readable.js');
127
+ fsSync.writeFileSync(readableFile, 'const x = process.env.KEY;');
128
+ vi.mocked(findFiles).mockResolvedValue([nonExistentFile, readableFile]);
129
+ vi.mocked(scanFile).mockReturnValue([
130
+ {
131
+ variable: 'KEY',
132
+ file: readableFile,
133
+ line: 1,
134
+ column: 10,
135
+ pattern: 'process.env',
136
+ context: 'const x = process.env.KEY;',
137
+ },
138
+ ]);
139
+ const result = await scanCodebase(defaultOpts);
140
+ expect(result.stats.filesScanned).toBe(1);
141
+ expect(result.used).toHaveLength(1);
142
+ });
143
+ });
144
+ describe('ignored variables', () => {
145
+ it('filters out ignored variables', async () => {
146
+ const testFile = path.join(tmpDir, 'app.js');
147
+ fsSync.writeFileSync(testFile, 'const x = process.env.API_KEY;');
148
+ vi.mocked(findFiles).mockResolvedValue([testFile]);
149
+ vi.mocked(scanFile).mockReturnValue([
150
+ {
151
+ variable: 'API_KEY',
152
+ file: testFile,
153
+ line: 1,
154
+ column: 10,
155
+ pattern: 'process.env',
156
+ context: 'const x = process.env.API_KEY;',
157
+ },
158
+ ]);
159
+ const result = await scanCodebase({
160
+ ...defaultOpts,
161
+ ignore: ['API_KEY'],
162
+ });
163
+ expect(result.used).toHaveLength(0);
164
+ });
165
+ it('filters out variables matching ignore regex', async () => {
166
+ const testFile = path.join(tmpDir, 'app.js');
167
+ fsSync.writeFileSync(testFile, 'const x = process.env.VITE_API_KEY;');
168
+ vi.mocked(findFiles).mockResolvedValue([testFile]);
169
+ vi.mocked(scanFile).mockReturnValue([
170
+ {
171
+ variable: 'VITE_API_KEY',
172
+ file: testFile,
173
+ line: 1,
174
+ column: 10,
175
+ pattern: 'process.env',
176
+ context: 'const x = process.env.VITE_API_KEY;',
177
+ },
178
+ ]);
179
+ const result = await scanCodebase({
180
+ ...defaultOpts,
181
+ ignoreRegex: [/^VITE_/],
182
+ });
183
+ expect(result.used).toHaveLength(0);
184
+ });
185
+ it('keeps variables that do not match ignore patterns', async () => {
186
+ const testFile = path.join(tmpDir, 'app.js');
187
+ fsSync.writeFileSync(testFile, 'const x = process.env.API_KEY;');
188
+ vi.mocked(findFiles).mockResolvedValue([testFile]);
189
+ vi.mocked(scanFile).mockReturnValue([
190
+ {
191
+ variable: 'API_KEY',
192
+ file: testFile,
193
+ line: 1,
194
+ column: 10,
195
+ pattern: 'process.env',
196
+ context: 'const x = process.env.API_KEY;',
197
+ },
198
+ ]);
199
+ const result = await scanCodebase({
200
+ ...defaultOpts,
201
+ ignore: ['OTHER_KEY'],
202
+ ignoreRegex: [/^VITE_/],
203
+ });
204
+ expect(result.used).toHaveLength(1);
205
+ expect(result.used[0].variable).toBe('API_KEY');
206
+ });
207
+ });
208
+ describe('secret detection', () => {
209
+ it('does not detect secrets when secrets option is false', async () => {
210
+ const testFile = path.join(tmpDir, 'app.js');
211
+ fsSync.writeFileSync(testFile, 'const key = "secret123";');
212
+ vi.mocked(findFiles).mockResolvedValue([testFile]);
213
+ vi.mocked(scanFile).mockReturnValue([]);
214
+ const result = await scanCodebase({
215
+ ...defaultOpts,
216
+ secrets: false,
217
+ });
218
+ expect(detectSecretsInSource).not.toHaveBeenCalled();
219
+ expect(result.secrets).toHaveLength(0);
220
+ });
221
+ it('filters out low severity secrets', async () => {
222
+ const testFile = path.join(tmpDir, 'app.js');
223
+ fsSync.writeFileSync(testFile, 'const key = "secret123";');
224
+ vi.mocked(findFiles).mockResolvedValue([testFile]);
225
+ vi.mocked(scanFile).mockReturnValue([]);
226
+ vi.mocked(detectSecretsInSource).mockReturnValue([
227
+ {
228
+ file: 'app.js',
229
+ line: 1,
230
+ severity: 'low',
231
+ message: 'Low severity secret',
232
+ kind: 'pattern',
233
+ snippet: 'const key = "secret123";',
234
+ },
235
+ {
236
+ file: 'app.js',
237
+ line: 2,
238
+ severity: 'high',
239
+ message: 'High severity secret',
240
+ kind: 'pattern',
241
+ snippet: 'const key = "secret456";',
242
+ },
243
+ ]);
244
+ const result = await scanCodebase({
245
+ ...defaultOpts,
246
+ secrets: true,
247
+ });
248
+ expect(result.secrets).toHaveLength(1);
249
+ expect(result.secrets[0].severity).toBe('high');
250
+ });
251
+ it('handles secret detection errors gracefully', async () => {
252
+ const testFile = path.join(tmpDir, 'app.js');
253
+ fsSync.writeFileSync(testFile, 'const key = "secret123";');
254
+ vi.mocked(findFiles).mockResolvedValue([testFile]);
255
+ vi.mocked(scanFile).mockReturnValue([]);
256
+ vi.mocked(detectSecretsInSource).mockImplementation(() => {
257
+ throw new Error('Detection failed');
258
+ });
259
+ const result = await scanCodebase({
260
+ ...defaultOpts,
261
+ secrets: true,
262
+ });
263
+ expect(result.secrets).toHaveLength(0);
264
+ });
265
+ });
266
+ describe('logged variables', () => {
267
+ it('tracks logged variables', async () => {
268
+ const testFile = path.join(tmpDir, 'app.js');
269
+ fsSync.writeFileSync(testFile, 'console.log(process.env.API_KEY);');
270
+ vi.mocked(findFiles).mockResolvedValue([testFile]);
271
+ vi.mocked(scanFile).mockReturnValue([
272
+ {
273
+ variable: 'API_KEY',
274
+ file: testFile,
275
+ line: 1,
276
+ column: 10,
277
+ pattern: 'process.env',
278
+ context: 'console.log(process.env.API_KEY);',
279
+ isLogged: true,
280
+ },
281
+ ]);
282
+ const result = await scanCodebase(defaultOpts);
283
+ expect(result.logged).toHaveLength(1);
284
+ expect(result.logged[0].variable).toBe('API_KEY');
285
+ expect(result.logged[0].isLogged).toBe(true);
286
+ });
287
+ it('does not track non-logged variables', async () => {
288
+ const testFile = path.join(tmpDir, 'app.js');
289
+ fsSync.writeFileSync(testFile, 'const x = process.env.API_KEY;');
290
+ vi.mocked(findFiles).mockResolvedValue([testFile]);
291
+ vi.mocked(scanFile).mockReturnValue([
292
+ {
293
+ variable: 'API_KEY',
294
+ file: testFile,
295
+ line: 1,
296
+ column: 10,
297
+ pattern: 'process.env',
298
+ context: 'const x = process.env.API_KEY;',
299
+ isLogged: false,
300
+ },
301
+ ]);
302
+ const result = await scanCodebase(defaultOpts);
303
+ expect(result.logged).toHaveLength(0);
304
+ });
305
+ });
306
+ describe('file content map', () => {
307
+ it('stores file content in map', async () => {
308
+ const testFile = path.join(tmpDir, 'app.js');
309
+ const content = 'const x = process.env.API_KEY;';
310
+ fsSync.writeFileSync(testFile, content);
311
+ vi.mocked(findFiles).mockResolvedValue([testFile]);
312
+ vi.mocked(scanFile).mockReturnValue([]);
313
+ const result = await scanCodebase(defaultOpts);
314
+ expect(result.fileContentMap).toBeDefined();
315
+ expect(result.fileContentMap.size).toBe(1);
316
+ expect(result.fileContentMap.get('app.js')).toBe(content);
317
+ });
318
+ it('normalizes file paths in content map', async () => {
319
+ const srcDir = path.join(tmpDir, 'src');
320
+ fsSync.mkdirSync(srcDir);
321
+ const testFile = path.join(srcDir, 'app.js');
322
+ fsSync.writeFileSync(testFile, 'const x = 1;');
323
+ vi.mocked(findFiles).mockResolvedValue([testFile]);
324
+ vi.mocked(scanFile).mockReturnValue([]);
325
+ const result = await scanCodebase(defaultOpts);
326
+ // Should use forward slashes even on Windows
327
+ const keys = Array.from(result.fileContentMap.keys());
328
+ expect(keys[0]).toBe('src/app.js');
329
+ });
330
+ });
331
+ describe('statistics', () => {
332
+ it('counts unique variables correctly', async () => {
333
+ const testFile = path.join(tmpDir, 'app.js');
334
+ fsSync.writeFileSync(testFile, 'const x = process.env.API_KEY;');
335
+ vi.mocked(findFiles).mockResolvedValue([testFile]);
336
+ vi.mocked(scanFile).mockReturnValue([
337
+ {
338
+ variable: 'API_KEY',
339
+ file: testFile,
340
+ line: 1,
341
+ column: 10,
342
+ pattern: 'process.env',
343
+ context: 'const x = process.env.API_KEY;',
344
+ },
345
+ {
346
+ variable: 'API_KEY',
347
+ file: testFile,
348
+ line: 2,
349
+ column: 10,
350
+ pattern: 'process.env',
351
+ context: 'const y = process.env.API_KEY;',
352
+ },
353
+ {
354
+ variable: 'DB_URL',
355
+ file: testFile,
356
+ line: 3,
357
+ column: 10,
358
+ pattern: 'process.env',
359
+ context: 'const z = process.env.DB_URL;',
360
+ },
361
+ ]);
362
+ const result = await scanCodebase(defaultOpts);
363
+ expect(result.stats.totalUsages).toBe(3);
364
+ expect(result.stats.uniqueVariables).toBe(2);
365
+ });
366
+ });
367
+ describe('minified file detection', () => {
368
+ it('skips files detected as likely minified (line 34)', async () => {
369
+ const testFile = path.join(tmpDir, 'bundle.min.js');
370
+ // A single line > 500 chars triggers isLikelyMinified
371
+ fsSync.writeFileSync(testFile, 'x'.repeat(520) + 'process.env.API_KEY');
372
+ vi.mocked(findFiles).mockResolvedValue([testFile]);
373
+ const result = await scanCodebase(defaultOpts);
374
+ expect(scanFile).not.toHaveBeenCalled();
375
+ expect(result.stats.filesScanned).toBe(0);
376
+ });
377
+ });
378
+ describe('files option', () => {
379
+ it('passes files option to findFiles when provided', async () => {
380
+ vi.mocked(findFiles).mockResolvedValue([]);
381
+ await scanCodebase({
382
+ ...defaultOpts,
383
+ files: ['src/**/*.js'],
384
+ });
385
+ expect(findFiles).toHaveBeenCalledWith(tmpDir, expect.objectContaining({
386
+ files: ['src/**/*.js'],
387
+ }));
388
+ });
389
+ it('does not pass files option when undefined', async () => {
390
+ vi.mocked(findFiles).mockResolvedValue([]);
391
+ const { files: _files, ...optsWithoutFiles } = defaultOpts;
392
+ await scanCodebase(optsWithoutFiles);
393
+ expect(findFiles).toHaveBeenCalledWith(tmpDir, expect.not.objectContaining({
394
+ files: expect.anything(),
395
+ }));
396
+ });
397
+ });
398
+ describe('integration scenarios', () => {
399
+ it('handles multiple files with mixed usages', async () => {
400
+ const file1 = path.join(tmpDir, 'app.js');
401
+ const file2 = path.join(tmpDir, 'config.js');
402
+ fsSync.writeFileSync(file1, 'const x = process.env.API_KEY;');
403
+ fsSync.writeFileSync(file2, 'const y = process.env.DB_URL;');
404
+ vi.mocked(findFiles).mockResolvedValue([file1, file2]);
405
+ vi.mocked(scanFile)
406
+ .mockReturnValueOnce([
407
+ {
408
+ variable: 'API_KEY',
409
+ file: file1,
410
+ line: 1,
411
+ column: 10,
412
+ pattern: 'process.env',
413
+ context: 'const x = process.env.API_KEY;',
414
+ },
415
+ ])
416
+ .mockReturnValueOnce([
417
+ {
418
+ variable: 'DB_URL',
419
+ file: file2,
420
+ line: 1,
421
+ column: 10,
422
+ pattern: 'process.env',
423
+ context: 'const y = process.env.DB_URL;',
424
+ },
425
+ ]);
426
+ const result = await scanCodebase(defaultOpts);
427
+ expect(result.used).toHaveLength(2);
428
+ expect(result.stats.filesScanned).toBe(2);
429
+ expect(result.stats.uniqueVariables).toBe(2);
430
+ });
431
+ });
432
+ });
433
+ //# sourceMappingURL=scanCodebase.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanCodebase.test.js","sourceRoot":"","sources":["../../../../test/unit/services/scanCodebase.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=compareJsonOutput.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compareJsonOutput.test.d.ts","sourceRoot":"","sources":["../../../../../test/unit/ui/compare/compareJsonOutput.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,137 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { compareJsonOutput } from '../../../../src/ui/compare/compareJsonOutput.js';
3
+ describe('compareJsonOutput', () => {
4
+ const baseParams = {
5
+ envName: '.env',
6
+ exampleName: '.env.example',
7
+ dupsEnv: [],
8
+ dupsEx: [],
9
+ gitignoreIssue: null,
10
+ };
11
+ it('returns minimal entry when only required fields are provided', () => {
12
+ const result = compareJsonOutput(baseParams);
13
+ expect(result).toEqual({
14
+ env: '.env',
15
+ example: '.env.example',
16
+ });
17
+ });
18
+ it('adds stats when provided', () => {
19
+ const result = compareJsonOutput({
20
+ ...baseParams,
21
+ stats: {
22
+ envCount: 5,
23
+ exampleCount: 4,
24
+ sharedCount: 3,
25
+ },
26
+ });
27
+ expect(result.stats).toEqual({
28
+ envCount: 5,
29
+ exampleCount: 4,
30
+ sharedCount: 3,
31
+ });
32
+ });
33
+ it('adds filtered properties when arrays contain values', () => {
34
+ const filtered = {
35
+ missing: ['A'],
36
+ extra: ['B'],
37
+ empty: ['C'],
38
+ mismatches: [
39
+ {
40
+ key: 'D',
41
+ expected: '1',
42
+ actual: '2',
43
+ },
44
+ ],
45
+ duplicatesEnv: [],
46
+ duplicatesEx: [],
47
+ gitignoreIssue: null,
48
+ };
49
+ const result = compareJsonOutput({
50
+ ...baseParams,
51
+ filtered,
52
+ });
53
+ expect(result.missing).toEqual(['A']);
54
+ expect(result.extra).toEqual(['B']);
55
+ expect(result.empty).toEqual(['C']);
56
+ expect(result.valueMismatches).toEqual([
57
+ { key: 'D', expected: '1', actual: '2' },
58
+ ]);
59
+ });
60
+ it('does not add filtered properties when arrays are empty', () => {
61
+ const filtered = {
62
+ missing: [],
63
+ extra: [],
64
+ empty: [],
65
+ mismatches: [],
66
+ duplicatesEnv: [],
67
+ duplicatesEx: [],
68
+ gitignoreIssue: null,
69
+ };
70
+ const result = compareJsonOutput({
71
+ ...baseParams,
72
+ filtered,
73
+ });
74
+ expect(result.missing).toBeUndefined();
75
+ expect(result.extra).toBeUndefined();
76
+ expect(result.empty).toBeUndefined();
77
+ expect(result.valueMismatches).toBeUndefined();
78
+ });
79
+ it('adds duplicates when both env and example contain duplicates', () => {
80
+ const dupsEnv = [{ key: 'A', count: 2 }];
81
+ const dupsEx = [{ key: 'B', count: 3 }];
82
+ const result = compareJsonOutput({
83
+ ...baseParams,
84
+ dupsEnv,
85
+ dupsEx,
86
+ });
87
+ expect(result.duplicates).toEqual({
88
+ env: dupsEnv,
89
+ example: dupsEx,
90
+ });
91
+ });
92
+ it('adds duplicates only for env', () => {
93
+ const dupsEnv = [{ key: 'A', count: 2 }];
94
+ const result = compareJsonOutput({
95
+ ...baseParams,
96
+ dupsEnv,
97
+ });
98
+ expect(result.duplicates).toEqual({
99
+ env: dupsEnv,
100
+ });
101
+ });
102
+ it('adds duplicates only for example', () => {
103
+ const dupsEx = [{ key: 'B', count: 3 }];
104
+ const result = compareJsonOutput({
105
+ ...baseParams,
106
+ dupsEx,
107
+ });
108
+ expect(result.duplicates).toEqual({
109
+ example: dupsEx,
110
+ });
111
+ });
112
+ it('adds gitignoreIssue when provided', () => {
113
+ const issue = {
114
+ reason: 'MISSING_ENV_IN_GITIGNORE',
115
+ };
116
+ const result = compareJsonOutput({
117
+ ...baseParams,
118
+ gitignoreIssue: issue,
119
+ });
120
+ expect(result.gitignoreIssue).toEqual(issue);
121
+ });
122
+ it('adds ok when true', () => {
123
+ const result = compareJsonOutput({
124
+ ...baseParams,
125
+ ok: true,
126
+ });
127
+ expect(result.ok).toBe(true);
128
+ });
129
+ it('does not add ok when false', () => {
130
+ const result = compareJsonOutput({
131
+ ...baseParams,
132
+ ok: false,
133
+ });
134
+ expect(result.ok).toBeUndefined();
135
+ });
136
+ });
137
+ //# sourceMappingURL=compareJsonOutput.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compareJsonOutput.test.js","sourceRoot":"","sources":["../../../../../test/unit/ui/compare/compareJsonOutput.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=printErrorNotFound.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"printErrorNotFound.test.d.ts","sourceRoot":"","sources":["../../../../../test/unit/ui/compare/printErrorNotFound.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,36 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { printErrorNotFound } from '../../../../src/ui/compare/printErrorNotFound.js';
3
+ import { UI_LABEL_WIDTH, error, label, value, header, } from '../../../../src/ui/theme.js';
4
+ describe('printErrorNotFound', () => {
5
+ let logSpy;
6
+ beforeEach(() => {
7
+ logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
8
+ });
9
+ afterEach(() => {
10
+ vi.restoreAllMocks();
11
+ });
12
+ it('prints error when only env file is missing', () => {
13
+ printErrorNotFound(false, true, '/path/.env', '/path/.env.example');
14
+ expect(logSpy).toHaveBeenCalledWith(`${error('▸')} ${header('File not found')}`);
15
+ expect(logSpy).toHaveBeenCalledWith(`${label('Missing env'.padEnd(UI_LABEL_WIDTH))}${error('.env')}`);
16
+ expect(logSpy).toHaveBeenCalledWith(`${label('Suggestion'.padEnd(UI_LABEL_WIDTH))}${value('ensure both files exist before comparing')}`);
17
+ });
18
+ it('prints error when only example file is missing', () => {
19
+ printErrorNotFound(true, false, '/path/.env', '/path/.env.example');
20
+ expect(logSpy).toHaveBeenCalledWith(`${error('▸')} ${header('File not found')}`);
21
+ expect(logSpy).toHaveBeenCalledWith(`${label('Missing example'.padEnd(UI_LABEL_WIDTH))}${error('.env.example')}`);
22
+ expect(logSpy).toHaveBeenCalledWith(`${label('Suggestion'.padEnd(UI_LABEL_WIDTH))}${value('ensure both files exist before comparing')}`);
23
+ });
24
+ it('prints errors when both files are missing', () => {
25
+ printErrorNotFound(false, false, '/path/.env', '/path/.env.example');
26
+ expect(logSpy).toHaveBeenCalledWith(`${error('▸')} ${header('File not found')}`);
27
+ expect(logSpy).toHaveBeenCalledWith(`${label('Missing env'.padEnd(UI_LABEL_WIDTH))}${error('.env')}`);
28
+ expect(logSpy).toHaveBeenCalledWith(`${label('Missing example'.padEnd(UI_LABEL_WIDTH))}${error('.env.example')}`);
29
+ expect(logSpy).toHaveBeenCalledWith(`${label('Suggestion'.padEnd(UI_LABEL_WIDTH))}${value('ensure both files exist before comparing')}`);
30
+ });
31
+ it('prints nothing when both files exist', () => {
32
+ printErrorNotFound(true, true, '/path/.env', '/path/.env.example');
33
+ expect(logSpy).not.toHaveBeenCalled();
34
+ });
35
+ });
36
+ //# sourceMappingURL=printErrorNotFound.test.js.map