dotenv-diff 2.7.9 → 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 (393) hide show
  1. package/CHANGELOG.md +9 -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/fixEnv.d.ts.map +1 -1
  12. package/dist/src/core/fixEnv.js +8 -5
  13. package/dist/src/core/fixEnv.js.map +1 -1
  14. package/dist/src/core/helpers/isLikelyMinified.d.ts +2 -0
  15. package/dist/src/core/helpers/isLikelyMinified.d.ts.map +1 -1
  16. package/dist/src/core/helpers/isLikelyMinified.js +2 -0
  17. package/dist/src/core/helpers/isLikelyMinified.js.map +1 -1
  18. package/dist/src/core/scan/patterns.d.ts +9 -1
  19. package/dist/src/core/scan/patterns.d.ts.map +1 -1
  20. package/dist/src/core/scan/patterns.js +32 -0
  21. package/dist/src/core/scan/patterns.js.map +1 -1
  22. package/dist/src/core/scan/scanFile.d.ts.map +1 -1
  23. package/dist/src/core/scan/scanFile.js +9 -2
  24. package/dist/src/core/scan/scanFile.js.map +1 -1
  25. package/dist/src/core/security/secretDetectors.js +1 -1
  26. package/dist/src/core/security/secretDetectors.js.map +1 -1
  27. package/dist/src/services/detectEnvExpirations.js +0 -2
  28. package/dist/src/services/detectEnvExpirations.js.map +1 -1
  29. package/dist/src/services/envDiscovery.js +6 -6
  30. package/dist/src/services/envDiscovery.js.map +1 -1
  31. package/dist/src/services/processComparisonFile.d.ts +1 -2
  32. package/dist/src/services/processComparisonFile.d.ts.map +1 -1
  33. package/dist/test/e2e/cli.autoscan.e2e.test.d.ts +2 -0
  34. package/dist/test/e2e/cli.autoscan.e2e.test.d.ts.map +1 -0
  35. package/dist/test/e2e/cli.autoscan.e2e.test.js +263 -0
  36. package/dist/test/e2e/cli.autoscan.e2e.test.js.map +1 -0
  37. package/dist/test/e2e/cli.compare.e2e.test.d.ts +2 -0
  38. package/dist/test/e2e/cli.compare.e2e.test.d.ts.map +1 -0
  39. package/dist/test/e2e/cli.compare.e2e.test.js +94 -0
  40. package/dist/test/e2e/cli.compare.e2e.test.js.map +1 -0
  41. package/dist/test/e2e/cli.detectExpired.e2e.test.d.ts +2 -0
  42. package/dist/test/e2e/cli.detectExpired.e2e.test.d.ts.map +1 -0
  43. package/dist/test/e2e/cli.detectExpired.e2e.test.js +148 -0
  44. package/dist/test/e2e/cli.detectExpired.e2e.test.js.map +1 -0
  45. package/dist/test/e2e/cli.flags.e2e.test.d.ts +2 -0
  46. package/dist/test/e2e/cli.flags.e2e.test.d.ts.map +1 -0
  47. package/dist/test/e2e/cli.flags.e2e.test.js +424 -0
  48. package/dist/test/e2e/cli.flags.e2e.test.js.map +1 -0
  49. package/dist/test/e2e/cli.healthscore.test.d.ts +2 -0
  50. package/dist/test/e2e/cli.healthscore.test.d.ts.map +1 -0
  51. package/dist/test/e2e/cli.healthscore.test.js +79 -0
  52. package/dist/test/e2e/cli.healthscore.test.js.map +1 -0
  53. package/dist/test/e2e/cli.ignore.e2e.test.d.ts +2 -0
  54. package/dist/test/e2e/cli.ignore.e2e.test.d.ts.map +1 -0
  55. package/dist/test/e2e/cli.ignore.e2e.test.js +88 -0
  56. package/dist/test/e2e/cli.ignore.e2e.test.js.map +1 -0
  57. package/dist/test/e2e/cli.inconsistentNaming.e2e.test.d.ts +2 -0
  58. package/dist/test/e2e/cli.inconsistentNaming.e2e.test.d.ts.map +1 -0
  59. package/dist/test/e2e/cli.inconsistentNaming.e2e.test.js +94 -0
  60. package/dist/test/e2e/cli.inconsistentNaming.e2e.test.js.map +1 -0
  61. package/dist/test/e2e/cli.jsonOutput.e2e.test.d.ts +2 -0
  62. package/dist/test/e2e/cli.jsonOutput.e2e.test.d.ts.map +1 -0
  63. package/dist/test/e2e/cli.jsonOutput.e2e.test.js +39 -0
  64. package/dist/test/e2e/cli.jsonOutput.e2e.test.js.map +1 -0
  65. package/dist/test/e2e/cli.loggedWarnings.e2e.test.d.ts +2 -0
  66. package/dist/test/e2e/cli.loggedWarnings.e2e.test.d.ts.map +1 -0
  67. package/dist/test/e2e/cli.loggedWarnings.e2e.test.js +118 -0
  68. package/dist/test/e2e/cli.loggedWarnings.e2e.test.js.map +1 -0
  69. package/dist/test/e2e/cli.secrets.e2e.test.d.ts +2 -0
  70. package/dist/test/e2e/cli.secrets.e2e.test.d.ts.map +1 -0
  71. package/dist/test/e2e/cli.secrets.e2e.test.js +344 -0
  72. package/dist/test/e2e/cli.secrets.e2e.test.js.map +1 -0
  73. package/dist/test/e2e/cli.strict.e2e.test.d.ts +2 -0
  74. package/dist/test/e2e/cli.strict.e2e.test.d.ts.map +1 -0
  75. package/dist/test/e2e/cli.strict.e2e.test.js +76 -0
  76. package/dist/test/e2e/cli.strict.e2e.test.js.map +1 -0
  77. package/dist/test/e2e/cli.uppercaseWarnings.e2e.test.d.ts +2 -0
  78. package/dist/test/e2e/cli.uppercaseWarnings.e2e.test.d.ts.map +1 -0
  79. package/dist/test/e2e/cli.uppercaseWarnings.e2e.test.js +59 -0
  80. package/dist/test/e2e/cli.uppercaseWarnings.e2e.test.js.map +1 -0
  81. package/dist/test/e2e/cli.warningsCount.e2e.test.d.ts +2 -0
  82. package/dist/test/e2e/cli.warningsCount.e2e.test.d.ts.map +1 -0
  83. package/dist/test/e2e/cli.warningsCount.e2e.test.js +54 -0
  84. package/dist/test/e2e/cli.warningsCount.e2e.test.js.map +1 -0
  85. package/dist/test/e2e/frameworks/cli.nextJs.e2e.test.d.ts +2 -0
  86. package/dist/test/e2e/frameworks/cli.nextJs.e2e.test.d.ts.map +1 -0
  87. package/dist/test/e2e/frameworks/cli.nextJs.e2e.test.js +182 -0
  88. package/dist/test/e2e/frameworks/cli.nextJs.e2e.test.js.map +1 -0
  89. package/dist/test/e2e/frameworks/cli.sveltekit.e2e.test.d.ts +2 -0
  90. package/dist/test/e2e/frameworks/cli.sveltekit.e2e.test.d.ts.map +1 -0
  91. package/dist/test/e2e/frameworks/cli.sveltekit.e2e.test.js +333 -0
  92. package/dist/test/e2e/frameworks/cli.sveltekit.e2e.test.js.map +1 -0
  93. package/dist/test/integration/compare-flow.integration.test.d.ts +2 -0
  94. package/dist/test/integration/compare-flow.integration.test.d.ts.map +1 -0
  95. package/dist/test/integration/compare-flow.integration.test.js +26 -0
  96. package/dist/test/integration/compare-flow.integration.test.js.map +1 -0
  97. package/dist/test/unit/cli/program.test.d.ts +2 -0
  98. package/dist/test/unit/cli/program.test.d.ts.map +1 -0
  99. package/dist/test/unit/cli/program.test.js +49 -0
  100. package/dist/test/unit/cli/program.test.js.map +1 -0
  101. package/dist/test/unit/cli/run.test.d.ts +2 -0
  102. package/dist/test/unit/cli/run.test.d.ts.map +1 -0
  103. package/dist/test/unit/cli/run.test.js +331 -0
  104. package/dist/test/unit/cli/run.test.js.map +1 -0
  105. package/dist/test/unit/commands/compare.test.d.ts +2 -0
  106. package/dist/test/unit/commands/compare.test.d.ts.map +1 -0
  107. package/dist/test/unit/commands/compare.test.js +664 -0
  108. package/dist/test/unit/commands/compare.test.js.map +1 -0
  109. package/dist/test/unit/commands/init.test.d.ts +2 -0
  110. package/dist/test/unit/commands/init.test.d.ts.map +1 -0
  111. package/dist/test/unit/commands/init.test.js +54 -0
  112. package/dist/test/unit/commands/init.test.js.map +1 -0
  113. package/dist/test/unit/commands/prompts/promptEnsureFiles.test.d.ts +2 -0
  114. package/dist/test/unit/commands/prompts/promptEnsureFiles.test.d.ts.map +1 -0
  115. package/dist/test/unit/commands/prompts/promptEnsureFiles.test.js +225 -0
  116. package/dist/test/unit/commands/prompts/promptEnsureFiles.test.js.map +1 -0
  117. package/dist/test/unit/commands/prompts/promptNoEnvScenario.test.d.ts +2 -0
  118. package/dist/test/unit/commands/prompts/promptNoEnvScenario.test.d.ts.map +1 -0
  119. package/dist/test/unit/commands/prompts/promptNoEnvScenario.test.js +109 -0
  120. package/dist/test/unit/commands/prompts/promptNoEnvScenario.test.js.map +1 -0
  121. package/dist/test/unit/commands/prompts/prompts.test.d.ts +2 -0
  122. package/dist/test/unit/commands/prompts/prompts.test.d.ts.map +1 -0
  123. package/dist/test/unit/commands/prompts/prompts.test.js +75 -0
  124. package/dist/test/unit/commands/prompts/prompts.test.js.map +1 -0
  125. package/dist/test/unit/commands/scanUsage.test.d.ts +2 -0
  126. package/dist/test/unit/commands/scanUsage.test.d.ts.map +1 -0
  127. package/dist/test/unit/commands/scanUsage.test.js +639 -0
  128. package/dist/test/unit/commands/scanUsage.test.js.map +1 -0
  129. package/dist/test/unit/config/loadConfig.test.d.ts +2 -0
  130. package/dist/test/unit/config/loadConfig.test.d.ts.map +1 -0
  131. package/dist/test/unit/config/loadConfig.test.js +106 -0
  132. package/dist/test/unit/config/loadConfig.test.js.map +1 -0
  133. package/dist/test/unit/config/options.test.d.ts +2 -0
  134. package/dist/test/unit/config/options.test.d.ts.map +1 -0
  135. package/dist/test/unit/config/options.test.js +69 -0
  136. package/dist/test/unit/config/options.test.js.map +1 -0
  137. package/dist/test/unit/core/compare/calculateStats.test.d.ts +2 -0
  138. package/dist/test/unit/core/compare/calculateStats.test.d.ts.map +1 -0
  139. package/dist/test/unit/core/compare/calculateStats.test.js +33 -0
  140. package/dist/test/unit/core/compare/calculateStats.test.js.map +1 -0
  141. package/dist/test/unit/core/compare/parseAndFilterEnv.test.d.ts +2 -0
  142. package/dist/test/unit/core/compare/parseAndFilterEnv.test.d.ts.map +1 -0
  143. package/dist/test/unit/core/compare/parseAndFilterEnv.test.js +227 -0
  144. package/dist/test/unit/core/compare/parseAndFilterEnv.test.js.map +1 -0
  145. package/dist/test/unit/core/compare/updateTotals.test.d.ts +2 -0
  146. package/dist/test/unit/core/compare/updateTotals.test.d.ts.map +1 -0
  147. package/dist/test/unit/core/compare/updateTotals.test.js +106 -0
  148. package/dist/test/unit/core/compare/updateTotals.test.js.map +1 -0
  149. package/dist/test/unit/core/detectInconsistentNaming.test.d.ts +2 -0
  150. package/dist/test/unit/core/detectInconsistentNaming.test.d.ts.map +1 -0
  151. package/dist/test/unit/core/detectInconsistentNaming.test.js +79 -0
  152. package/dist/test/unit/core/detectInconsistentNaming.test.js.map +1 -0
  153. package/dist/test/unit/core/diffEnv.test.d.ts +2 -0
  154. package/dist/test/unit/core/diffEnv.test.d.ts.map +1 -0
  155. package/dist/test/unit/core/diffEnv.test.js +74 -0
  156. package/dist/test/unit/core/diffEnv.test.js.map +1 -0
  157. package/dist/test/unit/core/duplicates.unit.test.d.ts +2 -0
  158. package/dist/test/unit/core/duplicates.unit.test.d.ts.map +1 -0
  159. package/dist/test/unit/core/duplicates.unit.test.js +91 -0
  160. package/dist/test/unit/core/duplicates.unit.test.js.map +1 -0
  161. package/dist/test/unit/core/filterIgnoredKeys.test.d.ts +2 -0
  162. package/dist/test/unit/core/filterIgnoredKeys.test.d.ts.map +1 -0
  163. package/dist/test/unit/core/filterIgnoredKeys.test.js +61 -0
  164. package/dist/test/unit/core/filterIgnoredKeys.test.js.map +1 -0
  165. package/dist/test/unit/core/fixEnv.test.d.ts +2 -0
  166. package/dist/test/unit/core/fixEnv.test.d.ts.map +1 -0
  167. package/dist/test/unit/core/fixEnv.test.js +323 -0
  168. package/dist/test/unit/core/fixEnv.test.js.map +1 -0
  169. package/dist/test/unit/core/frameworks/frameworkDetector.test.d.ts +2 -0
  170. package/dist/test/unit/core/frameworks/frameworkDetector.test.d.ts.map +1 -0
  171. package/dist/test/unit/core/frameworks/frameworkDetector.test.js +44 -0
  172. package/dist/test/unit/core/frameworks/frameworkDetector.test.js.map +1 -0
  173. package/dist/test/unit/core/frameworks/frameworkValidator.test.d.ts +2 -0
  174. package/dist/test/unit/core/frameworks/frameworkValidator.test.d.ts.map +1 -0
  175. package/dist/test/unit/core/frameworks/frameworkValidator.test.js +51 -0
  176. package/dist/test/unit/core/frameworks/frameworkValidator.test.js.map +1 -0
  177. package/dist/test/unit/core/frameworks/nextJsRules.test.d.ts +2 -0
  178. package/dist/test/unit/core/frameworks/nextJsRules.test.d.ts.map +1 -0
  179. package/dist/test/unit/core/frameworks/nextJsRules.test.js +97 -0
  180. package/dist/test/unit/core/frameworks/nextJsRules.test.js.map +1 -0
  181. package/dist/test/unit/core/frameworks/sveltekitRules.test.d.ts +2 -0
  182. package/dist/test/unit/core/frameworks/sveltekitRules.test.d.ts.map +1 -0
  183. package/dist/test/unit/core/frameworks/sveltekitRules.test.js +177 -0
  184. package/dist/test/unit/core/frameworks/sveltekitRules.test.js.map +1 -0
  185. package/dist/test/unit/core/helpers/resolveFromCwd.test.d.ts +2 -0
  186. package/dist/test/unit/core/helpers/resolveFromCwd.test.d.ts.map +1 -0
  187. package/dist/test/unit/core/helpers/resolveFromCwd.test.js +35 -0
  188. package/dist/test/unit/core/helpers/resolveFromCwd.test.js.map +1 -0
  189. package/dist/test/unit/core/helpers/toUpperSnakeCase.test.d.ts +2 -0
  190. package/dist/test/unit/core/helpers/toUpperSnakeCase.test.d.ts.map +1 -0
  191. package/dist/test/unit/core/helpers/toUpperSnakeCase.test.js +47 -0
  192. package/dist/test/unit/core/helpers/toUpperSnakeCase.test.js.map +1 -0
  193. package/dist/test/unit/core/parseEnv.test.d.ts +2 -0
  194. package/dist/test/unit/core/parseEnv.test.d.ts.map +1 -0
  195. package/dist/test/unit/core/parseEnv.test.js +169 -0
  196. package/dist/test/unit/core/parseEnv.test.js.map +1 -0
  197. package/dist/test/unit/core/scan/compareScan.test.d.ts +2 -0
  198. package/dist/test/unit/core/scan/compareScan.test.d.ts.map +1 -0
  199. package/dist/test/unit/core/scan/compareScan.test.js +40 -0
  200. package/dist/test/unit/core/scan/compareScan.test.js.map +1 -0
  201. package/dist/test/unit/core/scan/computeHealthScore.test.d.ts +2 -0
  202. package/dist/test/unit/core/scan/computeHealthScore.test.d.ts.map +1 -0
  203. package/dist/test/unit/core/scan/computeHealthScore.test.js +41 -0
  204. package/dist/test/unit/core/scan/computeHealthScore.test.js.map +1 -0
  205. package/dist/test/unit/core/scan/determineComparisonFile.test.d.ts +2 -0
  206. package/dist/test/unit/core/scan/determineComparisonFile.test.d.ts.map +1 -0
  207. package/dist/test/unit/core/scan/determineComparisonFile.test.js +162 -0
  208. package/dist/test/unit/core/scan/determineComparisonFile.test.js.map +1 -0
  209. package/dist/test/unit/core/scan/patterns.test.d.ts +2 -0
  210. package/dist/test/unit/core/scan/patterns.test.d.ts.map +1 -0
  211. package/dist/test/unit/core/scan/patterns.test.js +483 -0
  212. package/dist/test/unit/core/scan/patterns.test.js.map +1 -0
  213. package/dist/test/unit/core/scan/scanFile.test.d.ts +2 -0
  214. package/dist/test/unit/core/scan/scanFile.test.d.ts.map +1 -0
  215. package/dist/test/unit/core/scan/scanFile.test.js +258 -0
  216. package/dist/test/unit/core/scan/scanFile.test.js.map +1 -0
  217. package/dist/test/unit/core/security/entropy.test.d.ts +2 -0
  218. package/dist/test/unit/core/security/entropy.test.d.ts.map +1 -0
  219. package/dist/test/unit/core/security/entropy.test.js +34 -0
  220. package/dist/test/unit/core/security/entropy.test.js.map +1 -0
  221. package/dist/test/unit/core/security/exampleSecretDetector.test.d.ts +2 -0
  222. package/dist/test/unit/core/security/exampleSecretDetector.test.d.ts.map +1 -0
  223. package/dist/test/unit/core/security/exampleSecretDetector.test.js +57 -0
  224. package/dist/test/unit/core/security/exampleSecretDetector.test.js.map +1 -0
  225. package/dist/test/unit/core/security/secretDetectors.test.d.ts +2 -0
  226. package/dist/test/unit/core/security/secretDetectors.test.d.ts.map +1 -0
  227. package/dist/test/unit/core/security/secretDetectors.test.js +490 -0
  228. package/dist/test/unit/core/security/secretDetectors.test.js.map +1 -0
  229. package/dist/test/unit/index.test.d.ts +2 -0
  230. package/dist/test/unit/index.test.d.ts.map +1 -0
  231. package/dist/test/unit/index.test.js +17 -0
  232. package/dist/test/unit/index.test.js.map +1 -0
  233. package/dist/test/unit/services/detectEnvExpirations.test.d.ts +2 -0
  234. package/dist/test/unit/services/detectEnvExpirations.test.d.ts.map +1 -0
  235. package/dist/test/unit/services/detectEnvExpirations.test.js +120 -0
  236. package/dist/test/unit/services/detectEnvExpirations.test.js.map +1 -0
  237. package/dist/test/unit/services/envDiscovery.test.d.ts +2 -0
  238. package/dist/test/unit/services/envDiscovery.test.d.ts.map +1 -0
  239. package/dist/test/unit/services/envDiscovery.test.js +177 -0
  240. package/dist/test/unit/services/envDiscovery.test.js.map +1 -0
  241. package/dist/test/unit/services/envPairing.test.d.ts +2 -0
  242. package/dist/test/unit/services/envPairing.test.d.ts.map +1 -0
  243. package/dist/test/unit/services/envPairing.test.js +103 -0
  244. package/dist/test/unit/services/envPairing.test.js.map +1 -0
  245. package/dist/test/unit/services/filewalker.test.d.ts +2 -0
  246. package/dist/test/unit/services/filewalker.test.d.ts.map +1 -0
  247. package/dist/test/unit/services/filewalker.test.js +422 -0
  248. package/dist/test/unit/services/filewalker.test.js.map +1 -0
  249. package/dist/test/unit/services/git.test.d.ts +2 -0
  250. package/dist/test/unit/services/git.test.d.ts.map +1 -0
  251. package/dist/test/unit/services/git.test.js +357 -0
  252. package/dist/test/unit/services/git.test.js.map +1 -0
  253. package/dist/test/unit/services/printScanResult.test.d.ts +2 -0
  254. package/dist/test/unit/services/printScanResult.test.d.ts.map +1 -0
  255. package/dist/test/unit/services/printScanResult.test.js +275 -0
  256. package/dist/test/unit/services/printScanResult.test.js.map +1 -0
  257. package/dist/test/unit/services/processComparisonFile.test.d.ts +2 -0
  258. package/dist/test/unit/services/processComparisonFile.test.d.ts.map +1 -0
  259. package/dist/test/unit/services/processComparisonFile.test.js +261 -0
  260. package/dist/test/unit/services/processComparisonFile.test.js.map +1 -0
  261. package/dist/test/unit/services/scanCodebase.test.d.ts +2 -0
  262. package/dist/test/unit/services/scanCodebase.test.d.ts.map +1 -0
  263. package/dist/test/unit/services/scanCodebase.test.js +433 -0
  264. package/dist/test/unit/services/scanCodebase.test.js.map +1 -0
  265. package/dist/test/unit/ui/compare/compareJsonOutput.test.d.ts +2 -0
  266. package/dist/test/unit/ui/compare/compareJsonOutput.test.d.ts.map +1 -0
  267. package/dist/test/unit/ui/compare/compareJsonOutput.test.js +137 -0
  268. package/dist/test/unit/ui/compare/compareJsonOutput.test.js.map +1 -0
  269. package/dist/test/unit/ui/compare/printErrorNotFound.test.d.ts +2 -0
  270. package/dist/test/unit/ui/compare/printErrorNotFound.test.d.ts.map +1 -0
  271. package/dist/test/unit/ui/compare/printErrorNotFound.test.js +36 -0
  272. package/dist/test/unit/ui/compare/printErrorNotFound.test.js.map +1 -0
  273. package/dist/test/unit/ui/compare/printHeader.test.d.ts +2 -0
  274. package/dist/test/unit/ui/compare/printHeader.test.d.ts.map +1 -0
  275. package/dist/test/unit/ui/compare/printHeader.test.js +23 -0
  276. package/dist/test/unit/ui/compare/printHeader.test.js.map +1 -0
  277. package/dist/test/unit/ui/compare/printIssues.test.d.ts +2 -0
  278. package/dist/test/unit/ui/compare/printIssues.test.d.ts.map +1 -0
  279. package/dist/test/unit/ui/compare/printIssues.test.js +69 -0
  280. package/dist/test/unit/ui/compare/printIssues.test.js.map +1 -0
  281. package/dist/test/unit/ui/compare/printPrompt.test.d.ts +2 -0
  282. package/dist/test/unit/ui/compare/printPrompt.test.d.ts.map +1 -0
  283. package/dist/test/unit/ui/compare/printPrompt.test.js +40 -0
  284. package/dist/test/unit/ui/compare/printPrompt.test.js.map +1 -0
  285. package/dist/test/unit/ui/compare/printStats.test.d.ts +2 -0
  286. package/dist/test/unit/ui/compare/printStats.test.d.ts.map +1 -0
  287. package/dist/test/unit/ui/compare/printStats.test.js +52 -0
  288. package/dist/test/unit/ui/compare/printStats.test.js.map +1 -0
  289. package/dist/test/unit/ui/scan/printComparisonError.test.d.ts +2 -0
  290. package/dist/test/unit/ui/scan/printComparisonError.test.d.ts.map +1 -0
  291. package/dist/test/unit/ui/scan/printComparisonError.test.js +28 -0
  292. package/dist/test/unit/ui/scan/printComparisonError.test.js.map +1 -0
  293. package/dist/test/unit/ui/scan/printConsolelogWarning.test.d.ts +2 -0
  294. package/dist/test/unit/ui/scan/printConsolelogWarning.test.d.ts.map +1 -0
  295. package/dist/test/unit/ui/scan/printConsolelogWarning.test.js +118 -0
  296. package/dist/test/unit/ui/scan/printConsolelogWarning.test.js.map +1 -0
  297. package/dist/test/unit/ui/scan/printExampleWarnings.test.d.ts +2 -0
  298. package/dist/test/unit/ui/scan/printExampleWarnings.test.d.ts.map +1 -0
  299. package/dist/test/unit/ui/scan/printExampleWarnings.test.js +63 -0
  300. package/dist/test/unit/ui/scan/printExampleWarnings.test.js.map +1 -0
  301. package/dist/test/unit/ui/scan/printExpireWarnings.test.d.ts +2 -0
  302. package/dist/test/unit/ui/scan/printExpireWarnings.test.d.ts.map +1 -0
  303. package/dist/test/unit/ui/scan/printExpireWarnings.test.js +100 -0
  304. package/dist/test/unit/ui/scan/printExpireWarnings.test.js.map +1 -0
  305. package/dist/test/unit/ui/scan/printFrameworkWarnings.test.d.ts +2 -0
  306. package/dist/test/unit/ui/scan/printFrameworkWarnings.test.d.ts.map +1 -0
  307. package/dist/test/unit/ui/scan/printFrameworkWarnings.test.js +95 -0
  308. package/dist/test/unit/ui/scan/printFrameworkWarnings.test.js.map +1 -0
  309. package/dist/test/unit/ui/scan/printHeader.test.d.ts +2 -0
  310. package/dist/test/unit/ui/scan/printHeader.test.d.ts.map +1 -0
  311. package/dist/test/unit/ui/scan/printHeader.test.js +23 -0
  312. package/dist/test/unit/ui/scan/printHeader.test.js.map +1 -0
  313. package/dist/test/unit/ui/scan/printHealthScore.test.d.ts +2 -0
  314. package/dist/test/unit/ui/scan/printHealthScore.test.d.ts.map +1 -0
  315. package/dist/test/unit/ui/scan/printHealthScore.test.js +44 -0
  316. package/dist/test/unit/ui/scan/printHealthScore.test.js.map +1 -0
  317. package/dist/test/unit/ui/scan/printInconsistentNamingWarning.test.d.ts +2 -0
  318. package/dist/test/unit/ui/scan/printInconsistentNamingWarning.test.d.ts.map +1 -0
  319. package/dist/test/unit/ui/scan/printInconsistentNamingWarning.test.js +55 -0
  320. package/dist/test/unit/ui/scan/printInconsistentNamingWarning.test.js.map +1 -0
  321. package/dist/test/unit/ui/scan/printMissing.test.d.ts +2 -0
  322. package/dist/test/unit/ui/scan/printMissing.test.d.ts.map +1 -0
  323. package/dist/test/unit/ui/scan/printMissing.test.js +71 -0
  324. package/dist/test/unit/ui/scan/printMissing.test.js.map +1 -0
  325. package/dist/test/unit/ui/scan/printMissingExample.test.d.ts +2 -0
  326. package/dist/test/unit/ui/scan/printMissingExample.test.d.ts.map +1 -0
  327. package/dist/test/unit/ui/scan/printMissingExample.test.js +77 -0
  328. package/dist/test/unit/ui/scan/printMissingExample.test.js.map +1 -0
  329. package/dist/test/unit/ui/scan/printSecrets.test.d.ts +2 -0
  330. package/dist/test/unit/ui/scan/printSecrets.test.d.ts.map +1 -0
  331. package/dist/test/unit/ui/scan/printSecrets.test.js +108 -0
  332. package/dist/test/unit/ui/scan/printSecrets.test.js.map +1 -0
  333. package/dist/test/unit/ui/scan/printStats.test.d.ts +2 -0
  334. package/dist/test/unit/ui/scan/printStats.test.d.ts.map +1 -0
  335. package/dist/test/unit/ui/scan/printStats.test.js +42 -0
  336. package/dist/test/unit/ui/scan/printStats.test.js.map +1 -0
  337. package/dist/test/unit/ui/scan/printUnused.test.d.ts +2 -0
  338. package/dist/test/unit/ui/scan/printUnused.test.d.ts.map +1 -0
  339. package/dist/test/unit/ui/scan/printUnused.test.js +35 -0
  340. package/dist/test/unit/ui/scan/printUnused.test.js.map +1 -0
  341. package/dist/test/unit/ui/scan/printUppercaseWarning.test.d.ts +2 -0
  342. package/dist/test/unit/ui/scan/printUppercaseWarning.test.d.ts.map +1 -0
  343. package/dist/test/unit/ui/scan/printUppercaseWarning.test.js +44 -0
  344. package/dist/test/unit/ui/scan/printUppercaseWarning.test.js.map +1 -0
  345. package/dist/test/unit/ui/scan/scanJsonOutput.test.d.ts +2 -0
  346. package/dist/test/unit/ui/scan/scanJsonOutput.test.d.ts.map +1 -0
  347. package/dist/test/unit/ui/scan/scanJsonOutput.test.js +270 -0
  348. package/dist/test/unit/ui/scan/scanJsonOutput.test.js.map +1 -0
  349. package/dist/test/unit/ui/shared/printAutoFix.test.d.ts +2 -0
  350. package/dist/test/unit/ui/shared/printAutoFix.test.d.ts.map +1 -0
  351. package/dist/test/unit/ui/shared/printAutoFix.test.js +54 -0
  352. package/dist/test/unit/ui/shared/printAutoFix.test.js.map +1 -0
  353. package/dist/test/unit/ui/shared/printConfigStatus.test.d.ts +2 -0
  354. package/dist/test/unit/ui/shared/printConfigStatus.test.d.ts.map +1 -0
  355. package/dist/test/unit/ui/shared/printConfigStatus.test.js +44 -0
  356. package/dist/test/unit/ui/shared/printConfigStatus.test.js.map +1 -0
  357. package/dist/test/unit/ui/shared/printDuplicates.test.d.ts +2 -0
  358. package/dist/test/unit/ui/shared/printDuplicates.test.d.ts.map +1 -0
  359. package/dist/test/unit/ui/shared/printDuplicates.test.js +43 -0
  360. package/dist/test/unit/ui/shared/printDuplicates.test.js.map +1 -0
  361. package/dist/test/unit/ui/shared/printFixTips.test.d.ts +2 -0
  362. package/dist/test/unit/ui/shared/printFixTips.test.d.ts.map +1 -0
  363. package/dist/test/unit/ui/shared/printFixTips.test.js +67 -0
  364. package/dist/test/unit/ui/shared/printFixTips.test.js.map +1 -0
  365. package/dist/test/unit/ui/shared/printGitignore.test.d.ts +2 -0
  366. package/dist/test/unit/ui/shared/printGitignore.test.d.ts.map +1 -0
  367. package/dist/test/unit/ui/shared/printGitignore.test.js +59 -0
  368. package/dist/test/unit/ui/shared/printGitignore.test.js.map +1 -0
  369. package/dist/test/unit/ui/shared/printInitStatus.test.d.ts +2 -0
  370. package/dist/test/unit/ui/shared/printInitStatus.test.d.ts.map +1 -0
  371. package/dist/test/unit/ui/shared/printInitStatus.test.js +43 -0
  372. package/dist/test/unit/ui/shared/printInitStatus.test.js.map +1 -0
  373. package/dist/test/unit/ui/shared/printOptionErrors.test.d.ts +2 -0
  374. package/dist/test/unit/ui/shared/printOptionErrors.test.d.ts.map +1 -0
  375. package/dist/test/unit/ui/shared/printOptionErrors.test.js +57 -0
  376. package/dist/test/unit/ui/shared/printOptionErrors.test.js.map +1 -0
  377. package/dist/test/unit/ui/shared/setupGlobalConfig.test.d.ts +2 -0
  378. package/dist/test/unit/ui/shared/setupGlobalConfig.test.d.ts.map +1 -0
  379. package/dist/test/unit/ui/shared/setupGlobalConfig.test.js +27 -0
  380. package/dist/test/unit/ui/shared/setupGlobalConfig.test.js.map +1 -0
  381. package/dist/test/unit/ui/theme.test.d.ts +2 -0
  382. package/dist/test/unit/ui/theme.test.d.ts.map +1 -0
  383. package/dist/test/unit/ui/theme.test.js +61 -0
  384. package/dist/test/unit/ui/theme.test.js.map +1 -0
  385. package/dist/test/utils/cli-helpers.d.ts +27 -0
  386. package/dist/test/utils/cli-helpers.d.ts.map +1 -0
  387. package/dist/test/utils/cli-helpers.js +46 -0
  388. package/dist/test/utils/cli-helpers.js.map +1 -0
  389. package/dist/test/utils/fs-helpers.d.ts +20 -0
  390. package/dist/test/utils/fs-helpers.d.ts.map +1 -0
  391. package/dist/test/utils/fs-helpers.js +30 -0
  392. package/dist/test/utils/fs-helpers.js.map +1 -0
  393. package/package.json +3 -1
@@ -0,0 +1,162 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { determineComparisonFile } from '../../../../src/core/scan/determineComparisonFile.js';
3
+ import { normalizePath } from '../../../../src/core/helpers/normalizePath.js';
4
+ import fs from 'fs';
5
+ import path from 'path';
6
+ vi.mock('fs');
7
+ describe('determineComparisonFile', () => {
8
+ const mockExistsSync = vi.mocked(fs.existsSync);
9
+ const baseOpts = {
10
+ cwd: '/project',
11
+ include: [],
12
+ exclude: [],
13
+ ignore: [],
14
+ ignoreRegex: [],
15
+ secrets: false,
16
+ json: false,
17
+ };
18
+ beforeEach(() => {
19
+ mockExistsSync.mockClear();
20
+ });
21
+ afterEach(() => {
22
+ vi.clearAllMocks();
23
+ });
24
+ it('returns examplePath when it exists', async () => {
25
+ const expectedPath = normalizePath(path.resolve('/project/.env.example'));
26
+ mockExistsSync.mockReturnValue(true);
27
+ const opts = {
28
+ ...baseOpts,
29
+ examplePath: '.env.example',
30
+ };
31
+ const result = await determineComparisonFile(opts);
32
+ expect(result).toEqual({
33
+ type: 'found',
34
+ file: {
35
+ path: expectedPath,
36
+ name: '.env.example',
37
+ },
38
+ });
39
+ expect(mockExistsSync).toHaveBeenCalled();
40
+ });
41
+ it('returns envPath when it exists and no examplePath provided', async () => {
42
+ const expectedPath = normalizePath(path.resolve('/project/.env.local'));
43
+ mockExistsSync.mockReturnValue(true);
44
+ const opts = {
45
+ ...baseOpts,
46
+ envPath: '.env.local',
47
+ };
48
+ const result = await determineComparisonFile(opts);
49
+ expect(result).toEqual({
50
+ type: 'found',
51
+ file: {
52
+ path: expectedPath,
53
+ name: '.env.local',
54
+ },
55
+ });
56
+ expect(mockExistsSync).toHaveBeenCalled();
57
+ });
58
+ it('prioritizes examplePath over envPath when both exist', async () => {
59
+ const expectedPath = normalizePath(path.resolve('/project/.env.example'));
60
+ mockExistsSync.mockReturnValue(true);
61
+ const opts = {
62
+ ...baseOpts,
63
+ examplePath: '.env.example',
64
+ envPath: '.env',
65
+ };
66
+ const result = await determineComparisonFile(opts);
67
+ expect(result).toEqual({
68
+ type: 'found',
69
+ file: {
70
+ path: expectedPath,
71
+ name: '.env.example',
72
+ },
73
+ });
74
+ expect(mockExistsSync).toHaveBeenCalled();
75
+ });
76
+ it('falls back to envPath when examplePath does not exist', async () => {
77
+ const expectedPath = path.resolve('/project/.env');
78
+ mockExistsSync.mockImplementation((p) => p === expectedPath);
79
+ const opts = {
80
+ ...baseOpts,
81
+ examplePath: '.env.example',
82
+ envPath: '.env',
83
+ };
84
+ const result = await determineComparisonFile(opts);
85
+ expect(result).toEqual({
86
+ type: 'found',
87
+ file: {
88
+ path: normalizePath(expectedPath),
89
+ name: '.env',
90
+ },
91
+ });
92
+ });
93
+ it('falls back to auto-discovery when envPath does not exist', async () => {
94
+ const expectedPath = path.resolve('/project/.env');
95
+ mockExistsSync.mockImplementation((p) => p === expectedPath);
96
+ const opts = {
97
+ ...baseOpts,
98
+ envPath: '.env.missing',
99
+ };
100
+ const result = await determineComparisonFile(opts);
101
+ expect(result).toEqual({
102
+ type: 'found',
103
+ file: {
104
+ path: normalizePath(expectedPath),
105
+ name: '.env',
106
+ },
107
+ });
108
+ });
109
+ it('auto-discovers first available candidate when no paths provided', async () => {
110
+ const expectedPath = path.resolve('/project/.env.local');
111
+ mockExistsSync.mockImplementation((p) => p === expectedPath);
112
+ const result = await determineComparisonFile(baseOpts);
113
+ expect(result).toEqual({
114
+ type: 'found',
115
+ file: {
116
+ path: normalizePath(expectedPath),
117
+ name: '.env.local',
118
+ },
119
+ });
120
+ });
121
+ it('returns type none when no files exist', async () => {
122
+ mockExistsSync.mockReturnValue(false);
123
+ const result = await determineComparisonFile(baseOpts);
124
+ expect(result).toEqual({ type: 'none' });
125
+ });
126
+ it('resolves relative paths correctly', async () => {
127
+ const expectedPath = normalizePath(path.resolve('/home/user/project/config/.env.example'));
128
+ mockExistsSync.mockReturnValue(true);
129
+ const opts = {
130
+ ...baseOpts,
131
+ cwd: '/home/user/project',
132
+ examplePath: 'config/.env.example',
133
+ };
134
+ const result = await determineComparisonFile(opts);
135
+ expect(result).toEqual({
136
+ type: 'found',
137
+ file: {
138
+ path: expectedPath,
139
+ name: '.env.example',
140
+ },
141
+ });
142
+ });
143
+ it('handles absolute paths correctly', async () => {
144
+ const absolutePath = '/absolute/path/.env.example';
145
+ const expectedPath = normalizePath(absolutePath);
146
+ mockExistsSync.mockReturnValue(true);
147
+ const opts = {
148
+ ...baseOpts,
149
+ examplePath: absolutePath,
150
+ };
151
+ const result = await determineComparisonFile(opts);
152
+ expect(result).toEqual({
153
+ type: 'found',
154
+ file: {
155
+ path: expectedPath,
156
+ name: '.env.example',
157
+ },
158
+ });
159
+ expect(mockExistsSync).toHaveBeenCalled();
160
+ });
161
+ });
162
+ //# sourceMappingURL=determineComparisonFile.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"determineComparisonFile.test.js","sourceRoot":"","sources":["../../../../../test/unit/core/scan/determineComparisonFile.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=patterns.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.test.d.ts","sourceRoot":"","sources":["../../../../../test/unit/core/scan/patterns.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,483 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { scanFile } from '../../../../src/core/scan/scanFile';
3
+ import { DEFAULT_INCLUDE_EXTENSIONS, DEFAULT_EXCLUDE_PATTERNS, ENV_PATTERNS, buildSveltekitAliasPatterns, } from '../../../../src/core/scan/patterns';
4
+ describe('scanFile - Pattern Detection', () => {
5
+ const baseOpts = {
6
+ cwd: '/test/project',
7
+ include: [],
8
+ exclude: [],
9
+ ignore: [],
10
+ ignoreRegex: [],
11
+ files: [],
12
+ secrets: false,
13
+ ignoreUrls: [],
14
+ json: false,
15
+ };
16
+ describe('Node.js Dot and Bracket Notation', () => {
17
+ it('detects standard dot notation: process.env.MY_KEY', () => {
18
+ const code = 'const val = process.env.MY_KEY;';
19
+ const result = scanFile('test.js', code, baseOpts);
20
+ expect(result).toHaveLength(1);
21
+ expect(result[0]).toMatchObject({
22
+ variable: 'MY_KEY',
23
+ pattern: 'process.env',
24
+ });
25
+ });
26
+ it('detects bracket notation with double quotes: process.env["MY_KEY"]', () => {
27
+ const code = 'const val = process.env["MY_KEY"];';
28
+ const result = scanFile('test.js', code, baseOpts);
29
+ expect(result).toHaveLength(1);
30
+ expect(result[0]).toMatchObject({
31
+ variable: 'MY_KEY',
32
+ pattern: 'process.env',
33
+ });
34
+ });
35
+ it("detects bracket notation with single quotes: process.env['MY_KEY']", () => {
36
+ const code = "const val = process.env['MY_KEY'];";
37
+ const result = scanFile('test.js', code, baseOpts);
38
+ expect(result).toHaveLength(1);
39
+ expect(result[0]).toMatchObject({
40
+ variable: 'MY_KEY',
41
+ pattern: 'process.env',
42
+ });
43
+ });
44
+ });
45
+ describe('Node.js Destructuring', () => {
46
+ it('detects simple destructuring: const { MY_KEY } = process.env', () => {
47
+ const code = 'const { MY_KEY } = process.env;';
48
+ const result = scanFile('test.js', code, baseOpts);
49
+ expect(result).toHaveLength(1);
50
+ expect(result[0]).toMatchObject({
51
+ variable: 'MY_KEY',
52
+ pattern: 'process.env',
53
+ });
54
+ });
55
+ it('detects aliased destructuring: const { MY_KEY: alias } = process.env', () => {
56
+ const code = 'const { MY_KEY: alias } = process.env;';
57
+ const result = scanFile('test.js', code, baseOpts);
58
+ expect(result).toHaveLength(1);
59
+ expect(result[0]).toMatchObject({
60
+ variable: 'MY_KEY',
61
+ pattern: 'process.env',
62
+ });
63
+ });
64
+ it('detects destructuring with default values: const { MY_KEY = "val" } = process.env', () => {
65
+ const code = 'const { MY_KEY = "default" } = process.env;';
66
+ const result = scanFile('test.js', code, baseOpts);
67
+ expect(result).toHaveLength(1);
68
+ expect(result[0]).toMatchObject({
69
+ variable: 'MY_KEY',
70
+ pattern: 'process.env',
71
+ });
72
+ });
73
+ it('detects multiple mixed destructuring', () => {
74
+ const code = 'const { MY_KEY, OTHER_KEY: alias, THIRD_KEY = "fallback" } = process.env;';
75
+ const result = scanFile('test.js', code, baseOpts);
76
+ expect(result).toHaveLength(3);
77
+ const variables = result.map((u) => u.variable).sort();
78
+ expect(variables).toEqual(['MY_KEY', 'OTHER_KEY', 'THIRD_KEY']);
79
+ });
80
+ it('detects multiline destructuring', () => {
81
+ const code = `
82
+ const {
83
+ MY_KEY,
84
+ OTHER_KEY
85
+ } = process.env;
86
+ `;
87
+ const result = scanFile('test.js', code, baseOpts);
88
+ expect(result).toHaveLength(2);
89
+ const variables = result.map((u) => u.variable).sort();
90
+ expect(variables).toEqual(['MY_KEY', 'OTHER_KEY']);
91
+ });
92
+ it('handles empty destructuring gracefully', () => {
93
+ const code = 'const {} = process.env;';
94
+ const result = scanFile('test.js', code, baseOpts);
95
+ expect(result).toHaveLength(0);
96
+ });
97
+ it('handles complex whitespace and empty parts in destructuring', () => {
98
+ const code = 'const { KEY_1, , KEY_2 } = process.env;';
99
+ const result = scanFile('test.js', code, baseOpts);
100
+ expect(result).toHaveLength(2);
101
+ expect(result.map((r) => r.variable).sort()).toEqual(['KEY_1', 'KEY_2']);
102
+ });
103
+ });
104
+ describe('import.meta.env Dot and Bracket Notation', () => {
105
+ it('detects standard dot notation: import.meta.env.MY_KEY', () => {
106
+ const code = 'const val = import.meta.env.MY_KEY;';
107
+ const result = scanFile('test.js', code, baseOpts);
108
+ expect(result).toHaveLength(1);
109
+ expect(result[0]).toMatchObject({
110
+ variable: 'MY_KEY',
111
+ pattern: 'import.meta.env',
112
+ });
113
+ });
114
+ it('detects bracket notation with double quotes: import.meta.env["MY_KEY"]', () => {
115
+ const code = 'const val = import.meta.env["MY_KEY"];';
116
+ const result = scanFile('test.js', code, baseOpts);
117
+ expect(result).toHaveLength(1);
118
+ expect(result[0]).toMatchObject({
119
+ variable: 'MY_KEY',
120
+ pattern: 'import.meta.env',
121
+ });
122
+ });
123
+ it("detects bracket notation with single quotes: import.meta.env['MY_KEY']", () => {
124
+ const code = "const val = import.meta.env['MY_KEY'];";
125
+ const result = scanFile('test.js', code, baseOpts);
126
+ expect(result).toHaveLength(1);
127
+ expect(result[0]).toMatchObject({
128
+ variable: 'MY_KEY',
129
+ pattern: 'import.meta.env',
130
+ });
131
+ });
132
+ });
133
+ describe('Default include extensions', () => {
134
+ it('includes .mts in default scan extensions', () => {
135
+ expect(DEFAULT_INCLUDE_EXTENSIONS).toContain('.mts');
136
+ });
137
+ it('includes .cts in default scan extensions', () => {
138
+ expect(DEFAULT_INCLUDE_EXTENSIONS).toContain('.cts');
139
+ });
140
+ it('includes all expected extensions', () => {
141
+ expect(DEFAULT_INCLUDE_EXTENSIONS).toEqual(expect.arrayContaining([
142
+ '.js',
143
+ '.ts',
144
+ '.jsx',
145
+ '.tsx',
146
+ '.vue',
147
+ '.svelte',
148
+ '.mjs',
149
+ '.mts',
150
+ '.cjs',
151
+ '.cts',
152
+ ]));
153
+ });
154
+ it('will detect patterns in .mts files', () => {
155
+ const code = 'const val = process.env.MY_KEY;';
156
+ const result = scanFile('test.mts', code, baseOpts);
157
+ expect(result).toHaveLength(1);
158
+ expect(result[0]).toMatchObject({
159
+ variable: 'MY_KEY',
160
+ pattern: 'process.env',
161
+ });
162
+ });
163
+ it('will detect patterns in .vue files', () => {
164
+ const code = 'const val = import.meta.env.VITE_KEY;';
165
+ const result = scanFile('component.vue', code, baseOpts);
166
+ expect(result).toHaveLength(1);
167
+ expect(result[0]).toMatchObject({ variable: 'VITE_KEY' });
168
+ });
169
+ it('will detect patterns in .svelte files', () => {
170
+ const code = "import { MY_VAR } from '$env/static/private';";
171
+ const result = scanFile('page.svelte', code, baseOpts);
172
+ expect(result).toHaveLength(1);
173
+ expect(result[0]).toMatchObject({ variable: 'MY_VAR' });
174
+ });
175
+ });
176
+ describe('Default exclude patterns', () => {
177
+ it('excludes node_modules', () => {
178
+ expect(DEFAULT_EXCLUDE_PATTERNS).toContain('node_modules');
179
+ });
180
+ it('excludes dist', () => {
181
+ expect(DEFAULT_EXCLUDE_PATTERNS).toContain('dist');
182
+ });
183
+ it('excludes build', () => {
184
+ expect(DEFAULT_EXCLUDE_PATTERNS).toContain('build');
185
+ });
186
+ it('excludes test files by extension', () => {
187
+ expect(DEFAULT_EXCLUDE_PATTERNS).toContain('.test.');
188
+ expect(DEFAULT_EXCLUDE_PATTERNS).toContain('.spec.');
189
+ });
190
+ it('excludes __tests__ and __mocks__ directories', () => {
191
+ expect(DEFAULT_EXCLUDE_PATTERNS).toContain('__tests__');
192
+ expect(DEFAULT_EXCLUDE_PATTERNS).toContain('__mocks__');
193
+ });
194
+ it('excludes framework build dirs', () => {
195
+ expect(DEFAULT_EXCLUDE_PATTERNS).toContain('.next');
196
+ expect(DEFAULT_EXCLUDE_PATTERNS).toContain('.nuxt');
197
+ expect(DEFAULT_EXCLUDE_PATTERNS).toContain('.sveltekit');
198
+ expect(DEFAULT_EXCLUDE_PATTERNS).toContain('.svelte-kit');
199
+ });
200
+ it('excludes common fixture/sample paths', () => {
201
+ expect(DEFAULT_EXCLUDE_PATTERNS).toContain('fixtures');
202
+ expect(DEFAULT_EXCLUDE_PATTERNS).toContain('examples');
203
+ expect(DEFAULT_EXCLUDE_PATTERNS).toContain('samples');
204
+ expect(DEFAULT_EXCLUDE_PATTERNS).toContain('sandbox');
205
+ });
206
+ });
207
+ describe('ENV_PATTERNS export', () => {
208
+ it('exports an array', () => {
209
+ expect(Array.isArray(ENV_PATTERNS)).toBe(true);
210
+ });
211
+ it('contains patterns for all three pattern names', () => {
212
+ const names = ENV_PATTERNS.map((p) => p.name);
213
+ expect(names).toContain('process.env');
214
+ expect(names).toContain('import.meta.env');
215
+ expect(names).toContain('sveltekit');
216
+ });
217
+ it('every pattern has a regex', () => {
218
+ for (const p of ENV_PATTERNS) {
219
+ expect(p.regex).toBeInstanceOf(RegExp);
220
+ }
221
+ });
222
+ });
223
+ describe('Processor branch coverage', () => {
224
+ // Helper to build a minimal RegExpExecArray
225
+ function makeMatch(fullMatch, ...groups) {
226
+ return Object.assign([fullMatch, ...groups], {
227
+ index: 0,
228
+ input: fullMatch,
229
+ });
230
+ }
231
+ it('process.env processor returns [] when both capture groups are undefined (line 31)', () => {
232
+ const processor = ENV_PATTERNS.find((p) => p.name === 'process.env' && p.regex.source.includes('\\['))?.processor;
233
+ expect(processor?.(makeMatch('process.env.', undefined, undefined))).toEqual([]);
234
+ });
235
+ it('process.env destructuring processor returns empty string for part starting with : (line 58)', () => {
236
+ // `:ALIAS` splits to key='' which is falsy → returns '' → filtered out by uppercase check
237
+ const code = 'const { :ALIAS } = process.env;';
238
+ const result = scanFile('test.js', code, baseOpts);
239
+ expect(result).toHaveLength(0);
240
+ });
241
+ it('import.meta.env processor returns [] when both capture groups are undefined (line 79)', () => {
242
+ const processor = ENV_PATTERNS.find((p) => p.name === 'import.meta.env')?.processor;
243
+ expect(processor?.(makeMatch('import.meta.env.', undefined, undefined))).toEqual([]);
244
+ });
245
+ it('env destructuring processor returns [] for empty braces: const {} = env (line 106)', () => {
246
+ const code = 'const {} = env;';
247
+ const result = scanFile('test.ts', code, baseOpts);
248
+ expect(result).toHaveLength(0);
249
+ });
250
+ it('env destructuring processor returns empty string for part starting with : (line 117)', () => {
251
+ // `:ALIAS` splits to key='' which is falsy → returns '' → filtered out by uppercase check
252
+ const code = 'const { :ALIAS } = env;';
253
+ const result = scanFile('test.ts', code, baseOpts);
254
+ expect(result).toHaveLength(0);
255
+ });
256
+ });
257
+ describe('Pattern edge cases', () => {
258
+ it('does not detect lowercase process.env keys', () => {
259
+ const code = 'const val = process.env.myKey;';
260
+ const result = scanFile('test.js', code, baseOpts);
261
+ expect(result).toHaveLength(0);
262
+ });
263
+ it('does not detect lowercase import.meta.env keys', () => {
264
+ const code = 'const val = import.meta.env.myKey;';
265
+ const result = scanFile('test.js', code, baseOpts);
266
+ expect(result).toHaveLength(0);
267
+ });
268
+ it('does not match env.lowercase (sveltekit pattern requires uppercase)', () => {
269
+ const code = 'const val = env.myKey;';
270
+ const result = scanFile('test.ts', code, baseOpts);
271
+ expect(result).toHaveLength(0);
272
+ });
273
+ it('detects keys with numbers: MY_KEY_123', () => {
274
+ const code = 'const val = process.env.MY_KEY_123;';
275
+ const result = scanFile('test.js', code, baseOpts);
276
+ expect(result).toHaveLength(1);
277
+ expect(result[0]).toMatchObject({ variable: 'MY_KEY_123' });
278
+ });
279
+ it('detects multiple keys on different lines', () => {
280
+ const code = [
281
+ 'const a = process.env.KEY_ONE;',
282
+ 'const b = process.env.KEY_TWO;',
283
+ ].join('\n');
284
+ const result = scanFile('test.js', code, baseOpts);
285
+ expect(result).toHaveLength(2);
286
+ const variables = result.map((r) => r.variable).sort();
287
+ expect(variables).toEqual(['KEY_ONE', 'KEY_TWO']);
288
+ });
289
+ });
290
+ describe('SvelteKit Static Named Imports', () => {
291
+ it('detects import from $env/static/private', () => {
292
+ const code = "import { SECRET_KEY } from '$env/static/private';";
293
+ const result = scanFile('test.ts', code, baseOpts);
294
+ expect(result).toHaveLength(1);
295
+ expect(result[0]).toMatchObject({
296
+ variable: 'SECRET_KEY',
297
+ pattern: 'sveltekit',
298
+ });
299
+ });
300
+ it('detects import from $env/static/public', () => {
301
+ const code = "import { PUBLIC_API_URL } from '$env/static/public';";
302
+ const result = scanFile('test.ts', code, baseOpts);
303
+ expect(result).toHaveLength(1);
304
+ expect(result[0]).toMatchObject({
305
+ variable: 'PUBLIC_API_URL',
306
+ pattern: 'sveltekit',
307
+ });
308
+ });
309
+ it('detects import with double quotes', () => {
310
+ const code = 'import { SECRET_KEY } from "$env/static/private";';
311
+ const result = scanFile('test.ts', code, baseOpts);
312
+ expect(result).toHaveLength(1);
313
+ expect(result[0]).toMatchObject({ variable: 'SECRET_KEY' });
314
+ });
315
+ });
316
+ describe('SvelteKit Invalid Dynamic Named Imports', () => {
317
+ it('detects invalid named import from $env/dynamic/private', () => {
318
+ const code = "import { SECRET_KEY } from '$env/dynamic/private';";
319
+ const result = scanFile('test.ts', code, baseOpts);
320
+ expect(result).toHaveLength(1);
321
+ expect(result[0]).toMatchObject({
322
+ variable: 'SECRET_KEY',
323
+ pattern: 'sveltekit',
324
+ });
325
+ });
326
+ it('detects invalid named import from $env/dynamic/public', () => {
327
+ const code = "import { PUBLIC_KEY } from '$env/dynamic/public';";
328
+ const result = scanFile('test.ts', code, baseOpts);
329
+ expect(result).toHaveLength(1);
330
+ expect(result[0]).toMatchObject({
331
+ variable: 'PUBLIC_KEY',
332
+ pattern: 'sveltekit',
333
+ });
334
+ });
335
+ });
336
+ describe('SvelteKit Invalid Default Imports', () => {
337
+ it('detects invalid default import from $env/static/private', () => {
338
+ const code = "import SECRET_KEY from '$env/static/private';";
339
+ const result = scanFile('test.ts', code, baseOpts);
340
+ expect(result).toHaveLength(1);
341
+ expect(result[0]).toMatchObject({
342
+ variable: 'SECRET_KEY',
343
+ pattern: 'sveltekit',
344
+ });
345
+ });
346
+ it('detects invalid default import from $env/static/public', () => {
347
+ const code = "import PUBLIC_URL from '$env/static/public';";
348
+ const result = scanFile('test.ts', code, baseOpts);
349
+ expect(result).toHaveLength(1);
350
+ expect(result[0]).toMatchObject({
351
+ variable: 'PUBLIC_URL',
352
+ pattern: 'sveltekit',
353
+ });
354
+ });
355
+ it('detects invalid default import from $env/dynamic/private', () => {
356
+ const code = "import SECRET_KEY from '$env/dynamic/private';";
357
+ const result = scanFile('test.ts', code, baseOpts);
358
+ expect(result).toHaveLength(1);
359
+ expect(result[0]).toMatchObject({
360
+ variable: 'SECRET_KEY',
361
+ pattern: 'sveltekit',
362
+ });
363
+ });
364
+ });
365
+ describe('buildSveltekitAliasPatterns', () => {
366
+ function makeMatch(fullMatch, ...groups) {
367
+ return Object.assign([fullMatch, ...groups], {
368
+ index: 0,
369
+ input: fullMatch,
370
+ });
371
+ }
372
+ it('returns two patterns for a given alias', () => {
373
+ const patterns = buildSveltekitAliasPatterns('privateEnv');
374
+ expect(patterns).toHaveLength(2);
375
+ expect(patterns[0]?.regex).toBeInstanceOf(RegExp);
376
+ expect(patterns[1]?.regex).toBeInstanceOf(RegExp);
377
+ expect(patterns.every((p) => p.name === 'sveltekit')).toBe(true);
378
+ });
379
+ it('dot notation pattern matches alias.VAR', () => {
380
+ const [dotPattern] = buildSveltekitAliasPatterns('privateEnv');
381
+ expect(dotPattern.regex.test('privateEnv.MY_SECRET')).toBe(true);
382
+ expect(dotPattern.regex.test('env.MY_SECRET')).toBe(false);
383
+ });
384
+ it('destructuring processor returns [] for empty content (if !content branch)', () => {
385
+ const [, destructurePattern] = buildSveltekitAliasPatterns('privateEnv');
386
+ const result = destructurePattern.processor(makeMatch('{}', ''));
387
+ expect(result).toEqual([]);
388
+ });
389
+ it('destructuring processor returns [] when content is undefined', () => {
390
+ const [, destructurePattern] = buildSveltekitAliasPatterns('privateEnv');
391
+ const result = destructurePattern.processor(makeMatch('{}', undefined));
392
+ expect(result).toEqual([]);
393
+ });
394
+ it('destructuring processor returns empty string for part starting with : (key falsy branch)', () => {
395
+ // ':ALIAS' splits to key='' which is falsy → '' → filtered by uppercase check
396
+ const code = `import { env as privateEnv } from '$env/dynamic/private';
397
+ const { :ALIAS } = privateEnv;`;
398
+ const result = scanFile('test.ts', code, baseOpts);
399
+ expect(result).toHaveLength(0);
400
+ });
401
+ it('destructuring processor extracts multiple vars from aliased import', () => {
402
+ const code = `import { env as privateEnv } from '$env/dynamic/private';
403
+ const { SECRET_KEY, API_TOKEN } = privateEnv;`;
404
+ const result = scanFile('test.ts', code, baseOpts);
405
+ expect(result.map((u) => u.variable).sort()).toEqual([
406
+ 'API_TOKEN',
407
+ 'SECRET_KEY',
408
+ ]);
409
+ });
410
+ it('destructuring processor handles aliased keys: { VAR: alias } = privateEnv', () => {
411
+ const code = `import { env as privateEnv } from '$env/dynamic/private';
412
+ const { SECRET_KEY: secret } = privateEnv;`;
413
+ const result = scanFile('test.ts', code, baseOpts);
414
+ expect(result).toHaveLength(1);
415
+ expect(result[0]?.variable).toBe('SECRET_KEY');
416
+ });
417
+ });
418
+ describe('SvelteKit env Object Access', () => {
419
+ it('detects env.VARIABLE_NAME access', () => {
420
+ const code = 'const token = env.KEYCLOAK_SECRET;';
421
+ const result = scanFile('test.ts', code, baseOpts);
422
+ expect(result).toHaveLength(1);
423
+ expect(result[0]).toMatchObject({
424
+ variable: 'KEYCLOAK_SECRET',
425
+ pattern: 'sveltekit',
426
+ });
427
+ });
428
+ it('detects destructuring from env: const { VAR1, VAR2 } = env', () => {
429
+ const code = 'const { KEYCLOAK_URL, KEYCLOAK_REALM } = env;';
430
+ const result = scanFile('test.ts', code, baseOpts);
431
+ expect(result).toHaveLength(2);
432
+ const variables = result.map((u) => u.variable).sort();
433
+ expect(variables).toEqual(['KEYCLOAK_REALM', 'KEYCLOAK_URL']);
434
+ });
435
+ it('detects destructuring with aliasing: const { VAR: alias } = env', () => {
436
+ const code = 'const { KEYCLOAK_URL: url } = env;';
437
+ const result = scanFile('test.ts', code, baseOpts);
438
+ expect(result).toHaveLength(1);
439
+ expect(result[0]).toMatchObject({
440
+ variable: 'KEYCLOAK_URL',
441
+ pattern: 'sveltekit',
442
+ });
443
+ });
444
+ it('detects destructuring with default values: const { VAR = "default" } = env', () => {
445
+ const code = 'const { KEYCLOAK_URL = "http://localhost:8080" } = env;';
446
+ const result = scanFile('test.ts', code, baseOpts);
447
+ expect(result).toHaveLength(1);
448
+ expect(result[0]).toMatchObject({
449
+ variable: 'KEYCLOAK_URL',
450
+ pattern: 'sveltekit',
451
+ });
452
+ });
453
+ it('detects multiple mixed destructuring from env', () => {
454
+ const code = 'const { KEYCLOAK_URL, KEYCLOAK_REALM: realm, CLIENT_SECRET = "default" } = env;';
455
+ const result = scanFile('test.ts', code, baseOpts);
456
+ expect(result).toHaveLength(3);
457
+ const variables = result.map((u) => u.variable).sort();
458
+ expect(variables).toEqual([
459
+ 'CLIENT_SECRET',
460
+ 'KEYCLOAK_REALM',
461
+ 'KEYCLOAK_URL',
462
+ ]);
463
+ });
464
+ it('detects multiline destructuring from env', () => {
465
+ const code = `
466
+ const {
467
+ KEYCLOAK_URL,
468
+ KEYCLOAK_REALM,
469
+ CLIENT_ID
470
+ } = env;
471
+ `;
472
+ const result = scanFile('test.ts', code, baseOpts);
473
+ expect(result).toHaveLength(3);
474
+ const variables = result.map((u) => u.variable).sort();
475
+ expect(variables).toEqual([
476
+ 'CLIENT_ID',
477
+ 'KEYCLOAK_REALM',
478
+ 'KEYCLOAK_URL',
479
+ ]);
480
+ });
481
+ });
482
+ });
483
+ //# sourceMappingURL=patterns.test.js.map