dotenv-diff 2.4.6 → 2.4.8

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 (192) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +8 -2
  3. package/dist/src/cli/run.d.ts.map +1 -1
  4. package/dist/src/cli/run.js +7 -8
  5. package/dist/src/cli/run.js.map +1 -1
  6. package/dist/src/commands/compare.d.ts +2 -2
  7. package/dist/src/commands/compare.d.ts.map +1 -1
  8. package/dist/src/commands/compare.js +16 -2
  9. package/dist/src/commands/compare.js.map +1 -1
  10. package/dist/src/commands/ensureFilesOrPrompt.d.ts +22 -0
  11. package/dist/src/commands/ensureFilesOrPrompt.d.ts.map +1 -0
  12. package/dist/src/commands/ensureFilesOrPrompt.js +76 -0
  13. package/dist/src/commands/ensureFilesOrPrompt.js.map +1 -0
  14. package/dist/src/commands/scanUsage.d.ts +3 -5
  15. package/dist/src/commands/scanUsage.d.ts.map +1 -1
  16. package/dist/src/commands/scanUsage.js +7 -7
  17. package/dist/src/commands/scanUsage.js.map +1 -1
  18. package/dist/src/config/constants.d.ts +42 -0
  19. package/dist/src/config/constants.d.ts.map +1 -0
  20. package/dist/src/config/constants.js +54 -0
  21. package/dist/src/config/constants.js.map +1 -0
  22. package/dist/src/config/options.d.ts +1 -1
  23. package/dist/src/config/options.d.ts.map +1 -1
  24. package/dist/src/config/options.js +1 -1
  25. package/dist/src/config/options.js.map +1 -1
  26. package/dist/src/config/types.d.ts +156 -201
  27. package/dist/src/config/types.d.ts.map +1 -1
  28. package/dist/src/config/types.js +3 -11
  29. package/dist/src/config/types.js.map +1 -1
  30. package/dist/src/core/compareScan.d.ts +1 -0
  31. package/dist/src/core/compareScan.d.ts.map +1 -1
  32. package/dist/src/core/compareScan.js +1 -0
  33. package/dist/src/core/compareScan.js.map +1 -1
  34. package/dist/src/core/computeHealthScore.d.ts.map +1 -1
  35. package/dist/src/core/computeHealthScore.js +3 -0
  36. package/dist/src/core/computeHealthScore.js.map +1 -1
  37. package/dist/src/core/detectInconsistentNaming.js +0 -7
  38. package/dist/src/core/detectInconsistentNaming.js.map +1 -1
  39. package/dist/src/core/determineComparisonFile.d.ts +1 -1
  40. package/dist/src/core/determineComparisonFile.d.ts.map +1 -1
  41. package/dist/src/core/determineComparisonFile.js +2 -8
  42. package/dist/src/core/determineComparisonFile.js.map +1 -1
  43. package/dist/src/core/duplicates.d.ts +5 -4
  44. package/dist/src/core/duplicates.d.ts.map +1 -0
  45. package/dist/src/core/duplicates.js +5 -2
  46. package/dist/src/core/duplicates.js.map +1 -0
  47. package/dist/src/core/envDiscovery.d.ts +19 -0
  48. package/dist/src/core/envDiscovery.d.ts.map +1 -0
  49. package/dist/src/core/envDiscovery.js +81 -0
  50. package/dist/src/core/envDiscovery.js.map +1 -0
  51. package/dist/src/core/envPairing.d.ts.map +1 -1
  52. package/dist/src/core/envPairing.js +5 -2
  53. package/dist/src/core/envPairing.js.map +1 -1
  54. package/dist/src/core/exampleSecretDetector.d.ts.map +1 -1
  55. package/dist/src/core/exampleSecretDetector.js +2 -2
  56. package/dist/src/core/exampleSecretDetector.js.map +1 -1
  57. package/dist/src/core/fixEnv.d.ts.map +1 -1
  58. package/dist/src/core/fixEnv.js +2 -1
  59. package/dist/src/core/fixEnv.js.map +1 -1
  60. package/dist/src/core/frameworkDetector.d.ts +2 -2
  61. package/dist/src/core/frameworkDetector.d.ts.map +1 -1
  62. package/dist/src/core/frameworkDetector.js +0 -1
  63. package/dist/src/core/frameworkDetector.js.map +1 -1
  64. package/dist/src/core/frameworkValidator.d.ts +2 -2
  65. package/dist/src/core/frameworkValidator.d.ts.map +1 -1
  66. package/dist/src/core/frameworkValidator.js +0 -1
  67. package/dist/src/core/frameworkValidator.js.map +1 -1
  68. package/dist/src/core/frameworks/frameworkDetector.d.ts +14 -0
  69. package/dist/src/core/frameworks/frameworkDetector.d.ts.map +1 -0
  70. package/dist/src/core/frameworks/frameworkDetector.js +40 -0
  71. package/dist/src/core/frameworks/frameworkDetector.js.map +1 -0
  72. package/dist/src/core/frameworks/frameworkValidator.d.ts +10 -0
  73. package/dist/src/core/frameworks/frameworkValidator.d.ts.map +1 -0
  74. package/dist/src/core/frameworks/frameworkValidator.js +21 -0
  75. package/dist/src/core/frameworks/frameworkValidator.js.map +1 -0
  76. package/dist/src/core/frameworks/nextJsRules.d.ts +2 -2
  77. package/dist/src/core/frameworks/nextJsRules.d.ts.map +1 -1
  78. package/dist/src/core/frameworks/nextJsRules.js +12 -39
  79. package/dist/src/core/frameworks/nextJsRules.js.map +1 -1
  80. package/dist/src/core/frameworks/sveltekitRules.d.ts +2 -2
  81. package/dist/src/core/frameworks/sveltekitRules.d.ts.map +1 -1
  82. package/dist/src/core/frameworks/sveltekitRules.js +57 -45
  83. package/dist/src/core/frameworks/sveltekitRules.js.map +1 -1
  84. package/dist/src/core/helpers/normalizePath.d.ts +6 -0
  85. package/dist/src/core/helpers/normalizePath.d.ts.map +1 -0
  86. package/dist/src/core/helpers/normalizePath.js +8 -0
  87. package/dist/src/core/helpers/normalizePath.js.map +1 -0
  88. package/dist/src/core/helpers/updateTotals.d.ts +1 -2
  89. package/dist/src/core/helpers/updateTotals.d.ts.map +1 -1
  90. package/dist/src/core/helpers/updateTotals.js.map +1 -1
  91. package/dist/src/core/parseEnv.d.ts.map +1 -1
  92. package/dist/src/core/parseEnv.js +19 -1
  93. package/dist/src/core/parseEnv.js.map +1 -1
  94. package/dist/src/core/patterns.d.ts.map +1 -1
  95. package/dist/src/core/patterns.js +24 -1
  96. package/dist/src/core/patterns.js.map +1 -1
  97. package/dist/src/core/processComparisonFile.d.ts +6 -14
  98. package/dist/src/core/processComparisonFile.d.ts.map +1 -1
  99. package/dist/src/core/processComparisonFile.js +1 -1
  100. package/dist/src/core/processComparisonFile.js.map +1 -1
  101. package/dist/src/core/scan/scanJsonOutput.d.ts +85 -0
  102. package/dist/src/core/scan/scanJsonOutput.d.ts.map +1 -0
  103. package/dist/src/core/scan/scanJsonOutput.js +97 -0
  104. package/dist/src/core/scan/scanJsonOutput.js.map +1 -0
  105. package/dist/src/core/scan/secretDetectors.d.ts +28 -0
  106. package/dist/src/core/scan/secretDetectors.d.ts.map +1 -0
  107. package/dist/src/core/scan/secretDetectors.js +272 -0
  108. package/dist/src/core/scan/secretDetectors.js.map +1 -0
  109. package/dist/src/core/scanFile.d.ts.map +1 -1
  110. package/dist/src/core/scanFile.js +11 -1
  111. package/dist/src/core/scanFile.js.map +1 -1
  112. package/dist/src/core/scanJsonOutput.d.ts +78 -2
  113. package/dist/src/core/scanJsonOutput.d.ts.map +1 -1
  114. package/dist/src/core/scanJsonOutput.js +5 -4
  115. package/dist/src/core/scanJsonOutput.js.map +1 -1
  116. package/dist/src/core/security/entropy.d.ts +8 -0
  117. package/dist/src/core/security/entropy.d.ts.map +1 -0
  118. package/dist/src/core/security/entropy.js +23 -0
  119. package/dist/src/core/security/entropy.js.map +1 -0
  120. package/dist/src/core/security/exampleSecretDetector.d.ts +13 -0
  121. package/dist/src/core/security/exampleSecretDetector.d.ts.map +1 -0
  122. package/dist/src/core/security/exampleSecretDetector.js +61 -0
  123. package/dist/src/core/security/exampleSecretDetector.js.map +1 -0
  124. package/dist/src/core/security/secretDetectors.d.ts +28 -0
  125. package/dist/src/core/security/secretDetectors.d.ts.map +1 -0
  126. package/dist/src/core/security/secretDetectors.js +292 -0
  127. package/dist/src/core/security/secretDetectors.js.map +1 -0
  128. package/dist/src/services/codeBaseScanner.d.ts.map +1 -1
  129. package/dist/src/services/codeBaseScanner.js +59 -22
  130. package/dist/src/services/codeBaseScanner.js.map +1 -1
  131. package/dist/src/services/ensureFilesOrPrompt.d.ts.map +1 -1
  132. package/dist/src/services/ensureFilesOrPrompt.js +5 -2
  133. package/dist/src/services/ensureFilesOrPrompt.js.map +1 -1
  134. package/dist/src/services/envDiscovery.d.ts.map +1 -1
  135. package/dist/src/services/envDiscovery.js +22 -9
  136. package/dist/src/services/envDiscovery.js.map +1 -1
  137. package/dist/src/services/git.d.ts.map +1 -1
  138. package/dist/src/services/git.js +10 -9
  139. package/dist/src/services/git.js.map +1 -1
  140. package/dist/src/services/printScanResult.d.ts +17 -0
  141. package/dist/src/services/printScanResult.d.ts.map +1 -0
  142. package/dist/src/services/printScanResult.js +127 -0
  143. package/dist/src/services/printScanResult.js.map +1 -0
  144. package/dist/src/services/scanCodebase.d.ts +8 -0
  145. package/dist/src/services/scanCodebase.d.ts.map +1 -0
  146. package/dist/src/services/scanCodebase.js +110 -0
  147. package/dist/src/services/scanCodebase.js.map +1 -0
  148. package/dist/src/services/scanOutputToConsole.d.ts +2 -4
  149. package/dist/src/services/scanOutputToConsole.d.ts.map +1 -1
  150. package/dist/src/services/scanOutputToConsole.js +5 -4
  151. package/dist/src/services/scanOutputToConsole.js.map +1 -1
  152. package/dist/src/ui/compare/printIssues.d.ts +1 -1
  153. package/dist/src/ui/compare/printIssues.d.ts.map +1 -1
  154. package/dist/src/ui/compare/printIssues.js +0 -1
  155. package/dist/src/ui/compare/printIssues.js.map +1 -1
  156. package/dist/src/ui/compare/printStats.d.ts +1 -1
  157. package/dist/src/ui/compare/printStats.d.ts.map +1 -1
  158. package/dist/src/ui/compare/printStats.js +0 -1
  159. package/dist/src/ui/compare/printStats.js.map +1 -1
  160. package/dist/src/ui/scan/printConsolelogWarning.d.ts.map +1 -1
  161. package/dist/src/ui/scan/printConsolelogWarning.js +8 -5
  162. package/dist/src/ui/scan/printConsolelogWarning.js.map +1 -1
  163. package/dist/src/ui/scan/printExampleWarnings.d.ts +1 -1
  164. package/dist/src/ui/scan/printExampleWarnings.d.ts.map +1 -1
  165. package/dist/src/ui/scan/printFrameworkWarnings.d.ts +2 -2
  166. package/dist/src/ui/scan/printFrameworkWarnings.d.ts.map +1 -1
  167. package/dist/src/ui/scan/printFrameworkWarnings.js +4 -3
  168. package/dist/src/ui/scan/printFrameworkWarnings.js.map +1 -1
  169. package/dist/src/ui/scan/printMissing.d.ts.map +1 -1
  170. package/dist/src/ui/scan/printMissing.js +3 -1
  171. package/dist/src/ui/scan/printMissing.js.map +1 -1
  172. package/dist/src/ui/scan/printProgress.d.ts +15 -0
  173. package/dist/src/ui/scan/printProgress.d.ts.map +1 -0
  174. package/dist/src/ui/scan/printProgress.js +35 -0
  175. package/dist/src/ui/scan/printProgress.js.map +1 -0
  176. package/dist/src/ui/scan/printSecrets.d.ts +1 -1
  177. package/dist/src/ui/scan/printSecrets.d.ts.map +1 -1
  178. package/dist/src/ui/scan/printSecrets.js +3 -2
  179. package/dist/src/ui/scan/printSecrets.js.map +1 -1
  180. package/dist/src/ui/shared/printFixTips.d.ts +1 -1
  181. package/dist/src/ui/shared/printFixTips.d.ts.map +1 -1
  182. package/dist/src/ui/shared/printFixTips.js +0 -1
  183. package/dist/src/ui/shared/printFixTips.js.map +1 -1
  184. package/dist/src/ui/shared/printProgress.d.ts +24 -0
  185. package/dist/src/ui/shared/printProgress.d.ts.map +1 -0
  186. package/dist/src/ui/shared/printProgress.js +43 -0
  187. package/dist/src/ui/shared/printProgress.js.map +1 -0
  188. package/dist/src/ui/shared/setupGlobalConfig.d.ts +1 -1
  189. package/dist/src/ui/shared/setupGlobalConfig.d.ts.map +1 -1
  190. package/dist/src/ui/shared/setupGlobalConfig.js +0 -1
  191. package/dist/src/ui/shared/setupGlobalConfig.js.map +1 -1
  192. package/package.json +7 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secretDetectors.d.ts","sourceRoot":"","sources":["../../../../src/core/security/secretDetectors.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAGvD,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,cAAc,CAAC;CAC1B,CAAC;AAGF,eAAO,MAAM,eAAe,QAC6E,CAAC;AAG1G,eAAO,MAAM,iBAAiB,EAAE,MAAM,EAYrC,CAAC;AAoFF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAUtD;AAmGD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAC/B,aAAa,EAAE,CAgIjB"}
@@ -0,0 +1,292 @@
1
+ import { shannonEntropyNormalized } from './entropy.js';
2
+ // Regular expressions for detecting suspicious keys and provider patterns
3
+ export const SUSPICIOUS_KEYS = /\b(pass(word)?|secret|token|apikey|api_key|key|auth|bearer|private|client_secret|access[_-]?token)\b/i;
4
+ // Regular expressions for detecting provider patterns
5
+ export const PROVIDER_PATTERNS = [
6
+ /\bAKIA[0-9A-Z]{16}\b/, // AWS access key id
7
+ /\bASIA[0-9A-Z]{16}\b/, // AWS temp key
8
+ /\bghp_[0-9A-Za-z]{30,}\b/, // GitHub token
9
+ /\bsk_live_[0-9a-zA-Z]{24,}\b/, // Stripe live secret
10
+ /\bsk_test_[0-9a-zA-Z]{24,}\b/, // Stripe test secret
11
+ /\bAIza[0-9A-Za-z\-_]{20,}\b/, // Google API key
12
+ /\bya29\.[0-9A-Za-z\-_]+\b/, // Google OAuth access token
13
+ /\b[A-Za-z0-9_-]{21}:[A-Za-z0-9_-]{140}\b/, // Firebase token
14
+ /\b0x[a-fA-F0-9]{40}\b/, // Ethereum address
15
+ /\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/, // JWT token
16
+ /\bAC[0-9a-fA-F]{32}\b/, // Twilio Account SID
17
+ ];
18
+ const LONG_LITERAL = /["'`]{1}([A-Za-z0-9+/_\-]{24,})["'`]{1}/g;
19
+ const HTTPS_PATTERN = /["'`](https?:\/\/(?!localhost)[^"'`]*)["'`]/g;
20
+ // List of harmless URL patterns to ignore
21
+ const HARMLESS_URLS = [
22
+ /https?:\/\/(www\.)?placeholder\.com/i,
23
+ /https?:\/\/(www\.)?example\.com/i,
24
+ /https?:\/\/127\.0\.0\.1(:\d+)?/i,
25
+ /http:\/\/www\.w3\.org\/2000\/svg/i,
26
+ /xmlns=["']http:\/\/www\.w3\.org\/2000\/svg["']/i, // SVG namespace
27
+ ];
28
+ // Known harmless attribute keys commonly used in UI / analytics
29
+ const HARMLESS_ATTRIBUTE_KEYS = /\b(trackingId|trackingContext|data-testid|data-test|aria-label)\b/i;
30
+ // Checks if a line is an HTML text node
31
+ // Checks if a line is an HTML text node or tag
32
+ function isHtmlTextNode(line) {
33
+ const trimmed = line.trim();
34
+ // Empty line
35
+ if (!trimmed)
36
+ return false;
37
+ // Starts with <tag> and ends with </tag> with text inside
38
+ // OR is a self-contained HTML tag (even without closing tag on same line)
39
+ return ((/^<[^>]+>[^<]*<\/[^>]+>$/.test(trimmed) &&
40
+ !/=["'`][^"'`]*["'`]/.test(trimmed)) || // complete tag without suspicious assignment
41
+ /^<[a-z][a-z0-9-]*(?:\s+[a-z-]+(?:=["'][^"']*["'])?)*\s*\/?>$/i.test(trimmed) // opening or self-closing tag
42
+ );
43
+ }
44
+ /**
45
+ * Determines the severity of a secret finding.
46
+ * @param kind 'pattern' | 'entropy'
47
+ * @param message The message describing the finding
48
+ * @param literalLength The length of the literal string (if applicable)
49
+ * @returns The severity level of the secret finding
50
+ */
51
+ function determineSeverity(kind, message, literalLength) {
52
+ // HIGH: Known provider key patterns
53
+ if (message.includes('known provider key pattern')) {
54
+ return 'high';
55
+ }
56
+ // HIGH: Very high-entropy long strings
57
+ if (kind === 'entropy' && literalLength && literalLength >= 48) {
58
+ return 'high';
59
+ }
60
+ // MEDIUM: Password/secret/token patterns
61
+ if (message.includes('password/secret/token-like')) {
62
+ return 'medium';
63
+ }
64
+ // MEDIUM: Medium high-entropy strings
65
+ if (kind === 'entropy' && literalLength && literalLength >= 32) {
66
+ return 'medium';
67
+ }
68
+ // MEDIUM: HTTP URLs
69
+ if (message.includes('HTTP URL detected')) {
70
+ return 'medium';
71
+ }
72
+ // LOW: HTTPS URLs
73
+ if (message.includes('HTTPS URL detected')) {
74
+ return 'low';
75
+ }
76
+ // Default to medium if we can't determine
77
+ return 'medium';
78
+ }
79
+ /**
80
+ * Checks if a line has an ignore comment
81
+ * fx: // dotenv-diff-ignore or /* dotenv-diff-ignore *\/ or <!-- dotenv-diff-ignore -->
82
+ * @param line - The line to check
83
+ * @returns True if the line should be ignored
84
+ */
85
+ export function hasIgnoreComment(line) {
86
+ const normalized = line.trim();
87
+ // Allow mixed casing, extra spaces, and optional dashes
88
+ return (/\/\/.*dotenv[\s-]*diff[\s-]*ignore/i.test(normalized) ||
89
+ /\/\*.*dotenv[\s-]*diff[\s-]*ignore.*\*\//i.test(normalized) ||
90
+ /<!--.*dotenv[\s-]*diff[\s-]*ignore.*-->/i.test(normalized) ||
91
+ /\bdotenv[\s-]*diff[\s-]*ignore\b/i.test(normalized));
92
+ }
93
+ /**
94
+ * Checks if a URL should be ignored based on ignoreUrls from config.
95
+ * @param url - The URL that might be a potential secret
96
+ * @param ignoreUrls - List of URLs to ignore (from config)
97
+ * @returns true if the URL matches any ignore pattern
98
+ */
99
+ function ignoreUrlsMatch(url, ignoreUrls) {
100
+ if (!ignoreUrls?.length)
101
+ return false;
102
+ // case-insensitive substring match
103
+ return ignoreUrls.some((pattern) => url.toLowerCase().includes(pattern.toLowerCase()));
104
+ }
105
+ /**
106
+ * Checks if a string looks like a harmless literal.
107
+ * @param s - The string to check.
108
+ * @returns True if the string looks harmless, false otherwise.
109
+ */
110
+ function looksHarmlessLiteral(s) {
111
+ return (/\S+@\S+/.test(s) || // emails
112
+ /^data:[a-z]+\/[a-z0-9.+-]+;base64,/i.test(s) || // data URIs
113
+ /^\.{0,2}\//.test(s) || // relative paths
114
+ /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(s) || // UUID
115
+ /^[0-9a-f]{32,128}$/i.test(s) || // MD5, SHA1, SHA256, etc.
116
+ /^[A-Za-z0-9+/_\-]{16,20}={0,2}$/.test(s) || // short base64
117
+ /^[A-Za-z0-9+/_\-]*(_PUBLIC|_PRIVATE|VITE_|NEXT_PUBLIC|VUE_)[A-Za-z0-9+/_\-]*={0,2}$/.test(s) || // env-like keys
118
+ /^[MmZzLlHhVvCcSsQqTtAa][0-9eE+.\- ,MmZzLlHhVvCcSsQqTtAa]*$/.test(s) || // SVG path data
119
+ /<svg[\s\S]*?>[\s\S]*?<\/svg>/i.test(s) || // SVG markup
120
+ HARMLESS_URLS.some((rx) => rx.test(s)) // Allowlisted URLs
121
+ );
122
+ }
123
+ /**
124
+ * Checks if a line looks like a URL construction pattern.
125
+ * @param line - The line to check.
126
+ * @returns True if the line looks like URL construction, false otherwise.
127
+ */
128
+ function looksLikeUrlConstruction(line) {
129
+ // Check for template literals or string concatenation that looks like URLs
130
+ return (
131
+ // Template literals with URL-like patterns
132
+ /=\s*`[^`]*\$\{[^}]+\}[^`]*\/[^`]*`/.test(line) ||
133
+ // String concatenation with slashes
134
+ /=\s*["'][^"']*\/[^"']*["']\s*\+/.test(line) ||
135
+ // Contains common URL patterns
136
+ /=\s*["'`][^"'`]*\/[^"'`]*(auth|api|login|redirect|callback|protocol)[^"'`]*\/[^"'`]*["'`]/.test(line) ||
137
+ // Keycloak-specific patterns
138
+ /realms\/.*\/protocol\/openid-connect/.test(line));
139
+ }
140
+ /**
141
+ * Checks if a file path is probably a test path.
142
+ * This is determined by looking for common test folder names and file extensions.
143
+ * @param p - The file path to check.
144
+ * @returns True if the file path is probably a test path, false otherwise.
145
+ */
146
+ function isProbablyTestPath(p) {
147
+ return (/\b(__tests__|__mocks__|fixtures|sandbox|samples)\b/i.test(p) ||
148
+ /\.(spec|test)\.[jt]sx?$/.test(p));
149
+ }
150
+ /**
151
+ * Checks if a string is a pure interpolation template.
152
+ * @param s - The string to check.
153
+ * @returns True if the string is a pure interpolation template, false otherwise.
154
+ */
155
+ function isPureInterpolationTemplate(s) {
156
+ // Matches templates like `${a}`, `${a}:${b}`, `${a}|${b}|${c}`
157
+ // i.e. no meaningful static content
158
+ const withoutInterpolations = s.replace(/\$\{[^}]+\}/g, '');
159
+ return /^[\s:|,._-]*$/.test(withoutInterpolations);
160
+ }
161
+ // Threshold is the value between 0 and 1 that determines the sensitivity of the detection.
162
+ const DEFAULT_SECRET_THRESHOLD = 0.85;
163
+ /**
164
+ * Optimized for sveltekit and vite env accessors
165
+ * @param line - A line of code to check.
166
+ * @returns True if the line is an environment variable accessor, false otherwise.
167
+ */
168
+ function isEnvAccessor(line) {
169
+ return /\b(process\.env|import\.meta\.env|\$env\/(static|dynamic)\/(public|private))\b/.test(line);
170
+ }
171
+ /**
172
+ * Detects secrets in the source code of a file.
173
+ * @param file - The file path to check.
174
+ * @param source - The source code to scan for secrets.
175
+ * @returns An array of secret findings.
176
+ */
177
+ export function detectSecretsInSource(file, source, opts) {
178
+ const threshold = isProbablyTestPath(file) ? 0.95 : DEFAULT_SECRET_THRESHOLD;
179
+ const findings = [];
180
+ const lines = source.split(/\r?\n/);
181
+ let insideIgnoreBlock = false;
182
+ for (let i = 0; i < lines.length; i++) {
183
+ const lineNo = i + 1;
184
+ const line = lines[i] || '';
185
+ if (/<!--\s*dotenv[\s-]*diff[\s-]*ignore[\s-]*start\s*-->/i.test(line)) {
186
+ insideIgnoreBlock = true;
187
+ continue;
188
+ }
189
+ if (/<!--\s*dotenv[\s-]*diff[\s-]*ignore[\s-]*end\s*-->/i.test(line)) {
190
+ insideIgnoreBlock = false;
191
+ continue;
192
+ }
193
+ // Skip if inside ignore block
194
+ if (insideIgnoreBlock)
195
+ continue;
196
+ // Skip comments
197
+ if (/^\s*\/\//.test(line))
198
+ continue;
199
+ // Check if line has ignore comment
200
+ if (hasIgnoreComment(line))
201
+ continue;
202
+ // Check for HTTPS URLs
203
+ HTTPS_PATTERN.lastIndex = 0;
204
+ let httpsMatch;
205
+ while ((httpsMatch = HTTPS_PATTERN.exec(line))) {
206
+ const url = httpsMatch[1] || '';
207
+ if (url && !looksHarmlessLiteral(url)) {
208
+ if (ignoreUrlsMatch(url, opts?.ignoreUrls))
209
+ continue;
210
+ const protocol = url.startsWith('https') ? 'HTTPS' : 'HTTP';
211
+ findings.push({
212
+ file,
213
+ line: lineNo,
214
+ kind: 'pattern',
215
+ message: `${protocol} URL detected – consider moving to an environment variable`,
216
+ snippet: line.trim().slice(0, 180),
217
+ severity: protocol === 'HTTP' ? 'medium' : 'low',
218
+ });
219
+ }
220
+ }
221
+ // 1) Suspicious key literal assignments
222
+ if (SUSPICIOUS_KEYS.test(line)) {
223
+ // Ignore known harmless UI / analytics attributes
224
+ if (HARMLESS_ATTRIBUTE_KEYS.test(line))
225
+ continue;
226
+ // Ignore HTML text nodes
227
+ if (isHtmlTextNode(line))
228
+ continue;
229
+ // Ignore if inside HTML tag content
230
+ if (/<[^>]*>.*<\/[^>]*>/.test(line.trim()))
231
+ continue;
232
+ const m = line.match(/=\s*["'`](.+?)["'`]/);
233
+ if (m &&
234
+ m[1] &&
235
+ !looksHarmlessLiteral(m[1]) &&
236
+ !looksLikeUrlConstruction(line) &&
237
+ m[1].length >= 12 &&
238
+ !isEnvAccessor(line) &&
239
+ !isPureInterpolationTemplate(m[1])) {
240
+ findings.push({
241
+ file,
242
+ line: lineNo,
243
+ kind: 'pattern',
244
+ message: 'matches password/secret/token-like literal assignment',
245
+ snippet: line.trim().slice(0, 180),
246
+ severity: 'medium',
247
+ });
248
+ }
249
+ }
250
+ // 2) Provider patterns
251
+ for (const rx of PROVIDER_PATTERNS) {
252
+ if (rx.test(line)) {
253
+ findings.push({
254
+ file,
255
+ line: lineNo,
256
+ kind: 'pattern',
257
+ message: 'matches known provider key pattern',
258
+ snippet: line.trim().slice(0, 180),
259
+ severity: 'high',
260
+ });
261
+ }
262
+ }
263
+ // 3) High-entropy long literals
264
+ LONG_LITERAL.lastIndex = 0;
265
+ let lm;
266
+ while ((lm = LONG_LITERAL.exec(line))) {
267
+ const literal = lm[1] || '';
268
+ if (looksHarmlessLiteral(literal))
269
+ continue;
270
+ if (literal.length < 32)
271
+ continue;
272
+ const ent = shannonEntropyNormalized(literal);
273
+ if (ent >= threshold) {
274
+ const message = `found high-entropy string (len ${literal.length}, H≈${ent.toFixed(2)})`;
275
+ findings.push({
276
+ file,
277
+ line: lineNo,
278
+ kind: 'entropy',
279
+ message,
280
+ snippet: line.trim().slice(0, 180),
281
+ severity: determineSeverity('entropy', message, literal.length),
282
+ });
283
+ }
284
+ }
285
+ }
286
+ const uniqueFindings = findings.filter((f, idx, arr) => idx ===
287
+ arr.findIndex((other) => other.file === f.file &&
288
+ other.line === f.line &&
289
+ other.snippet === f.snippet));
290
+ return uniqueFindings;
291
+ }
292
+ //# sourceMappingURL=secretDetectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secretDetectors.js","sourceRoot":"","sources":["../../../../src/core/security/secretDetectors.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"codeBaseScanner.d.ts","sourceRoot":"","sources":["../../../src/services/codeBaseScanner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAY,WAAW,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAS5E;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAuEzE"}
1
+ {"version":3,"file":"codeBaseScanner.d.ts","sourceRoot":"","sources":["../../../src/services/codeBaseScanner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAY,WAAW,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAU5E;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAsEzE"}
@@ -4,6 +4,7 @@ import { detectSecretsInSource, } from '../core/secretDetectors.js';
4
4
  import { DEFAULT_EXCLUDE_PATTERNS } from '../core/patterns.js';
5
5
  import { scanFile } from '../core/scanFile.js';
6
6
  import { findFiles } from './fileWalker.js';
7
+ import { printProgress } from '../ui/scan/printProgress.js';
7
8
  /**
8
9
  * Scans the codebase for environment variable usage based on the provided options.
9
10
  * @param opts - Options for scanning the codebase.
@@ -20,29 +21,27 @@ export async function scanCodebase(opts) {
20
21
  const allSecrets = [];
21
22
  const fileContentMap = new Map();
22
23
  for (const filePath of files) {
23
- try {
24
- const content = await fs.readFile(filePath, 'utf-8');
25
- const fileUsages = scanFile(filePath, content, opts);
26
- allUsages.push(...fileUsages);
27
- // Store file content for framework validation
28
- const relativePath = path.relative(opts.cwd, filePath);
29
- fileContentMap.set(relativePath, content);
30
- if (opts.secrets) {
31
- try {
32
- const sec = detectSecretsInSource(relativePath, content, opts).filter((s) => s.severity !== 'low');
33
- if (sec.length)
34
- allSecrets.push(...sec);
35
- }
36
- catch {
37
- // Ignore secret detection errors
38
- }
39
- }
40
- // Count successfully scanned files
41
- filesScanned++;
42
- }
43
- catch {
44
- // Skip files we can't read (binary, permissions, etc.)
24
+ const content = await safeReadFile(filePath);
25
+ if (!content)
45
26
  continue;
27
+ // Scan the file for environment variable usages
28
+ const fileUsages = scanFile(filePath, content, opts);
29
+ allUsages.push(...fileUsages);
30
+ // Store file content for later use (e.g., framework validation 'use client')
31
+ const relativePath = path.relative(opts.cwd, filePath);
32
+ fileContentMap.set(relativePath, content);
33
+ // Detect secrets in the file content
34
+ const secrets = safeDetectSecrets(relativePath, content, opts);
35
+ if (secrets.length)
36
+ allSecrets.push(...secrets);
37
+ // Count successfully scanned files
38
+ filesScanned++;
39
+ if (shouldPrintProgress(filesScanned, files.length)) {
40
+ printProgress({
41
+ isJson: opts.json,
42
+ current: filesScanned,
43
+ total: files.length,
44
+ });
46
45
  }
47
46
  }
48
47
  // Filter out ignored variables
@@ -70,4 +69,42 @@ export async function scanCodebase(opts) {
70
69
  fileContentMap,
71
70
  };
72
71
  }
72
+ /**
73
+ * Detects secrets in the given file content if secret detection is enabled.
74
+ * @param relativePath - The relative path of the file being scanned.
75
+ * @param content - The content of the file.
76
+ * @param opts - The scan options.
77
+ * @returns An array of secret findings.
78
+ */
79
+ function safeDetectSecrets(relativePath, content, opts) {
80
+ if (!opts.secrets)
81
+ return [];
82
+ try {
83
+ return detectSecretsInSource(relativePath, content, opts).filter((s) => s.severity !== 'low');
84
+ }
85
+ catch {
86
+ return [];
87
+ }
88
+ }
89
+ /**
90
+ * Safely reads a file and returns its content or null if reading fails.
91
+ * @param filePath - The path to the file to read.
92
+ * @returns The file content as a string, or null if an error occurs.
93
+ */
94
+ async function safeReadFile(filePath) {
95
+ try {
96
+ return await fs.readFile(filePath, 'utf-8');
97
+ }
98
+ catch {
99
+ return null;
100
+ }
101
+ }
102
+ /** * Determines whether to print progress based on the number of files scanned.
103
+ * @param scanned - The number of files scanned so far.
104
+ * @param total - The total number of files to scan.
105
+ * @returns True if progress should be printed, false otherwise.
106
+ */
107
+ function shouldPrintProgress(scanned, total) {
108
+ return scanned === 1 || scanned % 10 === 0 || scanned === total;
109
+ }
73
110
  //# sourceMappingURL=codeBaseScanner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codeBaseScanner.js","sourceRoot":"","sources":["../../../src/services/codeBaseScanner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codeBaseScanner.js","sourceRoot":"","sources":["../../../src/services/codeBaseScanner.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ensureFilesOrPrompt.d.ts","sourceRoot":"","sources":["../../../src/services/ensureFilesOrPrompt.ts"],"names":[],"mappings":"AAMA,UAAU,iBAAiB;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,eAAe;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,uBAAuB,EAAE,OAAO,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AACD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAqF5B"}
1
+ {"version":3,"file":"ensureFilesOrPrompt.d.ts","sourceRoot":"","sources":["../../../src/services/ensureFilesOrPrompt.ts"],"names":[],"mappings":"AAOA,UAAU,iBAAiB;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,eAAe;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,uBAAuB,EAAE,OAAO,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AACD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAuF5B"}
@@ -3,6 +3,7 @@ import path from 'path';
3
3
  import { confirmYesNo } from '../ui/prompts.js';
4
4
  import { warnIfEnvNotIgnored } from './git.js';
5
5
  import { printPrompt } from '../ui/compare/printPrompt.js';
6
+ import { DEFAULT_ENV_FILE } from '../config/constants.js';
6
7
  /**
7
8
  * Ensures that the necessary .env files exist or prompts the user to create them.
8
9
  * This function handles only scenarios where the --compare flag is set
@@ -17,7 +18,9 @@ export async function ensureFilesOrPrompt(args) {
17
18
  const exampleExists = fs.existsSync(examplePath);
18
19
  // Case 1: no .env and no .env.example
19
20
  if (!envExists && !exampleExists) {
20
- const hasAnyEnv = fs.readdirSync(cwd).some((f) => f.startsWith('.env'));
21
+ const hasAnyEnv = fs
22
+ .readdirSync(cwd)
23
+ .some((f) => f.startsWith(DEFAULT_ENV_FILE));
21
24
  if (!hasAnyEnv) {
22
25
  printPrompt.noEnvFound();
23
26
  return { didCreate: false, shouldExit: true, exitCode: 0 };
@@ -34,7 +37,7 @@ export async function ensureFilesOrPrompt(args) {
34
37
  ? false
35
38
  : await confirmYesNo(`❓ Do you want to create a new ${path.basename(envPath)} file from ${path.basename(examplePath)}?`, { isCiMode, isYesMode });
36
39
  if (!createEnv) {
37
- printPrompt.skipCreation('.env');
40
+ printPrompt.skipCreation(DEFAULT_ENV_FILE);
38
41
  return { didCreate: false, shouldExit: true, exitCode: 0 };
39
42
  }
40
43
  const exampleContent = fs.readFileSync(examplePath, 'utf-8');
@@ -1 +1 @@
1
- {"version":3,"file":"ensureFilesOrPrompt.js","sourceRoot":"","sources":["../../../src/services/ensureFilesOrPrompt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ensureFilesOrPrompt.js","sourceRoot":"","sources":["../../../src/services/ensureFilesOrPrompt.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"envDiscovery.d.ts","sourceRoot":"","sources":["../../../src/services/envDiscovery.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;GAEG;AACH,UAAU,oBAAoB;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,GAAG,EACH,OAAO,EACP,WAAW,GACZ,EAAE,oBAAoB,GAAG,SAAS,CAiElC"}
1
+ {"version":3,"file":"envDiscovery.d.ts","sourceRoot":"","sources":["../../../src/services/envDiscovery.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGpD;;GAEG;AACH,UAAU,oBAAoB;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,GAAG,EACH,OAAO,EACP,WAAW,GACZ,EAAE,oBAAoB,GAAG,SAAS,CAgFlC"}
@@ -1,5 +1,6 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
+ import { DEFAULT_ENV_FILE, DEFAULT_EXAMPLE_FILE } from '../config/constants.js';
3
4
  /**
4
5
  * Discovers environment files in the specified directory.
5
6
  * @param cwd - The current working directory.
@@ -11,10 +12,16 @@ export function discoverEnvFiles({ cwd, envFlag, exampleFlag, }) {
11
12
  // Find all .env* files in the current directory except .env.example*
12
13
  const envFiles = fs
13
14
  .readdirSync(cwd)
14
- .filter((f) => f.startsWith('.env') && !f.startsWith('.env.example'))
15
- .sort((a, b) => a === '.env' ? -1 : b === '.env' ? 1 : a.localeCompare(b));
16
- let primaryEnv = envFiles.includes('.env') ? '.env' : envFiles[0] || '.env';
17
- let primaryExample = '.env.example';
15
+ .filter((f) => f.startsWith(DEFAULT_ENV_FILE) && !f.startsWith(DEFAULT_EXAMPLE_FILE))
16
+ .sort((a, b) => a === DEFAULT_ENV_FILE
17
+ ? -1
18
+ : b === DEFAULT_ENV_FILE
19
+ ? 1
20
+ : a.localeCompare(b));
21
+ let primaryEnv = envFiles.includes(DEFAULT_ENV_FILE)
22
+ ? DEFAULT_ENV_FILE
23
+ : envFiles[0] || DEFAULT_ENV_FILE;
24
+ let primaryExample = DEFAULT_EXAMPLE_FILE;
18
25
  let alreadyWarnedMissingEnv = false;
19
26
  // --env (without --example): force primaryEnv and try to find a matching example name via suffix
20
27
  if (envFlag && !exampleFlag) {
@@ -27,8 +34,12 @@ export function discoverEnvFiles({ cwd, envFlag, exampleFlag, }) {
27
34
  envFiles.push(...Array.from(set));
28
35
  }
29
36
  // try to find a matching example name based on the suffix
30
- const suffix = envNameFromFlag === '.env' ? '' : envNameFromFlag.replace('.env', '');
31
- const potentialExample = suffix ? `.env.example${suffix}` : '.env.example';
37
+ const suffix = envNameFromFlag === DEFAULT_ENV_FILE
38
+ ? ''
39
+ : envNameFromFlag.replace(DEFAULT_ENV_FILE, '');
40
+ const potentialExample = suffix
41
+ ? `${DEFAULT_EXAMPLE_FILE}${suffix}`
42
+ : DEFAULT_EXAMPLE_FILE;
32
43
  if (fs.existsSync(path.resolve(cwd, potentialExample))) {
33
44
  primaryExample = potentialExample;
34
45
  }
@@ -37,9 +48,11 @@ export function discoverEnvFiles({ cwd, envFlag, exampleFlag, }) {
37
48
  if (exampleFlag && !envFlag) {
38
49
  const exampleNameFromFlag = path.basename(exampleFlag);
39
50
  primaryExample = exampleNameFromFlag;
40
- if (exampleNameFromFlag.startsWith('.env.example')) {
41
- const suffix = exampleNameFromFlag.slice('.env.example'.length);
42
- const matchedEnv = suffix ? `.env${suffix}` : '.env';
51
+ if (exampleNameFromFlag.startsWith(DEFAULT_EXAMPLE_FILE)) {
52
+ const suffix = exampleNameFromFlag.slice(DEFAULT_EXAMPLE_FILE.length);
53
+ const matchedEnv = suffix
54
+ ? `${DEFAULT_ENV_FILE}${suffix}`
55
+ : DEFAULT_ENV_FILE;
43
56
  if (fs.existsSync(path.resolve(cwd, matchedEnv))) {
44
57
  primaryEnv = matchedEnv;
45
58
  envFiles.length = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"envDiscovery.js","sourceRoot":"","sources":["../../../src/services/envDiscovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"envDiscovery.js","sourceRoot":"","sources":["../../../src/services/envDiscovery.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../../src/services/git.ts"],"names":[],"mappings":"AAIA,UAAU,qBAAqB;IAC7B,sDAAsD;IACtD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,+DAA+D;AAC/D,wBAAgB,SAAS,CAAC,GAAG,SAAgB,GAAG,OAAO,CAEtD;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE,qBAA0B,GAClC,OAAO,GAAG,IAAI,CAsBhB;AAmCD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,qBAA0B,GAAG,IAAI,CA0B7E;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG;IACzE,MAAM,EAAE,cAAc,GAAG,aAAa,CAAC;CACxC,GAAG,IAAI,CAmBP;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAU3D"}
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../../src/services/git.ts"],"names":[],"mappings":"AASA,UAAU,qBAAqB;IAC7B,sDAAsD;IACtD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,+DAA+D;AAC/D,wBAAgB,SAAS,CAAC,GAAG,SAAgB,GAAG,OAAO,CAEtD;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE,qBAA0B,GAClC,OAAO,GAAG,IAAI,CAsBhB;AAmCD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,qBAA0B,GAAG,IAAI,CA8B7E;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG;IACzE,MAAM,EAAE,cAAc,GAAG,aAAa,CAAC;CACxC,GAAG,IAAI,CAmBP;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAU3D"}
@@ -1,9 +1,10 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
3
  import { printGitignoreWarning } from '../ui/shared/printGitignore.js';
4
+ import { DEFAULT_ENV_FILE, GITIGNORE_FILE, GIT_DIR, } from '../config/constants.js';
4
5
  /** Are we in a git repo? (checks for .git directory in cwd) */
5
6
  export function isGitRepo(cwd = process.cwd()) {
6
- return fs.existsSync(path.resolve(cwd, '.git'));
7
+ return fs.existsSync(path.resolve(cwd, GIT_DIR));
7
8
  }
8
9
  /**
9
10
  * Returns:
@@ -14,8 +15,8 @@ export function isGitRepo(cwd = process.cwd()) {
14
15
  * @returns True if the env file is ignored, false if not, or null if no .gitignore exists.
15
16
  */
16
17
  export function isEnvIgnoredByGit(options = {}) {
17
- const { cwd = process.cwd(), envFile = '.env' } = options;
18
- const gitignorePath = path.resolve(cwd, '.gitignore');
18
+ const { cwd = process.cwd(), envFile = DEFAULT_ENV_FILE } = options;
19
+ const gitignorePath = path.resolve(cwd, GITIGNORE_FILE);
19
20
  if (!fs.existsSync(gitignorePath))
20
21
  return null;
21
22
  const raw = fs.readFileSync(gitignorePath, 'utf8');
@@ -35,7 +36,7 @@ export function isEnvIgnoredByGit(options = {}) {
35
36
  * @param envFile - The env file name (default: ".env")
36
37
  * @returns A set of candidate patterns
37
38
  */
38
- function getCandidatePatterns(envFile = '.env') {
39
+ function getCandidatePatterns(envFile = DEFAULT_ENV_FILE) {
39
40
  const base = envFile; // ".env"
40
41
  const star = `${base}*`; // ".env*"
41
42
  const dotStar = `${base}.*`; // ".env.*"
@@ -68,13 +69,13 @@ function matchesCandidate(pattern, envFile) {
68
69
  * @returns console.log messages or void
69
70
  */
70
71
  export function warnIfEnvNotIgnored(options = {}) {
71
- const { cwd = process.cwd(), envFile = '.env', log = console.log } = options;
72
+ const { cwd = process.cwd(), envFile = DEFAULT_ENV_FILE, log = console.log, } = options;
72
73
  const envPath = path.resolve(cwd, envFile);
73
74
  if (!fs.existsSync(envPath))
74
75
  return; // No .env file → nothing to warn about
75
76
  if (!isGitRepo(cwd))
76
77
  return; // Not a git repo → skip
77
- const gitignorePath = path.resolve(cwd, '.gitignore');
78
+ const gitignorePath = path.resolve(cwd, GITIGNORE_FILE);
78
79
  if (!fs.existsSync(gitignorePath)) {
79
80
  printGitignoreWarning({
80
81
  envFile,
@@ -99,13 +100,13 @@ export function warnIfEnvNotIgnored(options = {}) {
99
100
  * @returns Null if no issue, otherwise the reason for the issue.
100
101
  */
101
102
  export function checkGitignoreStatus(options = {}) {
102
- const { cwd = process.cwd(), envFile = '.env' } = options;
103
+ const { cwd = process.cwd(), envFile = DEFAULT_ENV_FILE } = options;
103
104
  const envPath = path.resolve(cwd, envFile);
104
105
  if (!fs.existsSync(envPath))
105
106
  return null;
106
107
  if (!isGitRepo(cwd))
107
108
  return null;
108
- const gitignorePath = path.resolve(cwd, '.gitignore');
109
+ const gitignorePath = path.resolve(cwd, GITIGNORE_FILE);
109
110
  if (!fs.existsSync(gitignorePath)) {
110
111
  return { reason: 'no-gitignore' };
111
112
  }
@@ -122,7 +123,7 @@ export function checkGitignoreStatus(options = {}) {
122
123
  export function findGitRoot(startDir) {
123
124
  let dir = path.resolve(startDir);
124
125
  while (true) {
125
- const gitDir = path.join(dir, '.git');
126
+ const gitDir = path.join(dir, GIT_DIR);
126
127
  if (fs.existsSync(gitDir))
127
128
  return dir;
128
129
  const parent = path.dirname(dir);