dotenv-diff 2.2.6 → 2.2.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 (158) hide show
  1. package/README.md +11 -0
  2. package/dist/src/cli/run.d.ts.map +1 -1
  3. package/dist/src/cli/run.js +133 -102
  4. package/dist/src/cli/run.js.map +1 -1
  5. package/dist/src/commands/compare.d.ts +2 -20
  6. package/dist/src/commands/compare.d.ts.map +1 -1
  7. package/dist/src/commands/compare.js +107 -173
  8. package/dist/src/commands/compare.js.map +1 -1
  9. package/dist/src/commands/scanUsage.d.ts.map +1 -1
  10. package/dist/src/commands/scanUsage.js +61 -182
  11. package/dist/src/commands/scanUsage.js.map +1 -1
  12. package/dist/src/config/loadConfig.d.ts +2 -0
  13. package/dist/src/config/loadConfig.d.ts.map +1 -0
  14. package/dist/src/config/options.d.ts.map +1 -1
  15. package/dist/src/config/options.js +42 -32
  16. package/dist/src/config/options.js.map +1 -1
  17. package/dist/src/config/types.d.ts +58 -0
  18. package/dist/src/config/types.d.ts.map +1 -1
  19. package/dist/src/core/fixEnv.d.ts +23 -15
  20. package/dist/src/core/fixEnv.d.ts.map +1 -1
  21. package/dist/src/core/fixEnv.js +70 -11
  22. package/dist/src/core/fixEnv.js.map +1 -1
  23. package/dist/src/core/helpers/isAllOk.d.ts +8 -0
  24. package/dist/src/core/helpers/isAllOk.d.ts.map +1 -0
  25. package/dist/src/core/helpers/isAllOk.js +15 -0
  26. package/dist/src/core/helpers/isAllOk.js.map +1 -0
  27. package/dist/src/core/helpers/updateTotals.d.ts +20 -0
  28. package/dist/src/core/helpers/updateTotals.d.ts.map +1 -0
  29. package/dist/src/core/helpers/updateTotals.js +37 -0
  30. package/dist/src/core/helpers/updateTotals.js.map +1 -0
  31. package/dist/src/core/processComparisonFile.d.ts +36 -0
  32. package/dist/src/core/processComparisonFile.d.ts.map +1 -0
  33. package/dist/src/core/processComparisonFile.js +124 -0
  34. package/dist/src/core/processComparisonFile.js.map +1 -0
  35. package/dist/src/core/secretDetectors.d.ts.map +1 -1
  36. package/dist/src/core/secretDetectors.js +13 -0
  37. package/dist/src/core/secretDetectors.js.map +1 -1
  38. package/dist/src/services/ensureFilesOrPrompt.d.ts +19 -0
  39. package/dist/src/services/ensureFilesOrPrompt.d.ts.map +1 -0
  40. package/dist/src/services/ensureFilesOrPrompt.js +73 -0
  41. package/dist/src/services/ensureFilesOrPrompt.js.map +1 -0
  42. package/dist/src/services/git.d.ts +9 -0
  43. package/dist/src/services/git.d.ts.map +1 -1
  44. package/dist/src/services/git.js +46 -3
  45. package/dist/src/services/git.js.map +1 -1
  46. package/dist/src/services/scanOutputToConsole.d.ts +6 -1
  47. package/dist/src/services/scanOutputToConsole.d.ts.map +1 -1
  48. package/dist/src/services/scanOutputToConsole.js +71 -112
  49. package/dist/src/services/scanOutputToConsole.js.map +1 -1
  50. package/dist/src/ui/compare/printAutoFix.d.ts +16 -0
  51. package/dist/src/ui/compare/printAutoFix.d.ts.map +1 -0
  52. package/dist/src/ui/compare/printAutoFix.js +34 -0
  53. package/dist/src/ui/compare/printAutoFix.js.map +1 -0
  54. package/dist/src/ui/compare/printAutoFixApplied.d.ts +7 -0
  55. package/dist/src/ui/compare/printAutoFixApplied.d.ts.map +1 -0
  56. package/dist/src/ui/compare/printAutoFixApplied.js +22 -0
  57. package/dist/src/ui/compare/printAutoFixApplied.js.map +1 -0
  58. package/dist/src/ui/compare/printDuplicates.d.ts +17 -0
  59. package/dist/src/ui/compare/printDuplicates.d.ts.map +1 -0
  60. package/dist/src/ui/compare/printDuplicates.js +25 -0
  61. package/dist/src/ui/compare/printDuplicates.js.map +1 -0
  62. package/dist/src/ui/compare/printErrorNotFound.d.ts +9 -0
  63. package/dist/src/ui/compare/printErrorNotFound.d.ts.map +1 -0
  64. package/dist/src/ui/compare/printErrorNotFound.js +18 -0
  65. package/dist/src/ui/compare/printErrorNotFound.js.map +1 -0
  66. package/dist/src/ui/compare/printFixTips.d.ts +11 -0
  67. package/dist/src/ui/compare/printFixTips.d.ts.map +1 -0
  68. package/dist/src/ui/compare/printFixTips.js +46 -0
  69. package/dist/src/ui/compare/printFixTips.js.map +1 -0
  70. package/dist/src/ui/compare/printHeader.d.ts +10 -0
  71. package/dist/src/ui/compare/printHeader.d.ts.map +1 -0
  72. package/dist/src/ui/compare/printHeader.js +20 -0
  73. package/dist/src/ui/compare/printHeader.js.map +1 -0
  74. package/dist/src/ui/compare/printIssues.d.ts +9 -0
  75. package/dist/src/ui/compare/printIssues.d.ts.map +1 -0
  76. package/dist/src/ui/compare/printIssues.js +34 -0
  77. package/dist/src/ui/compare/printIssues.js.map +1 -0
  78. package/dist/src/ui/compare/printPrompt.d.ts +11 -0
  79. package/dist/src/ui/compare/printPrompt.d.ts.map +1 -0
  80. package/dist/src/ui/compare/printPrompt.js +24 -0
  81. package/dist/src/ui/compare/printPrompt.js.map +1 -0
  82. package/dist/src/ui/compare/printStats.d.ts +19 -0
  83. package/dist/src/ui/compare/printStats.d.ts.map +1 -0
  84. package/dist/src/ui/compare/printStats.js +30 -0
  85. package/dist/src/ui/compare/printStats.js.map +1 -0
  86. package/dist/src/ui/compare/printSuccess.d.ts +11 -0
  87. package/dist/src/ui/compare/printSuccess.d.ts.map +1 -0
  88. package/dist/src/ui/compare/printSuccess.js +27 -0
  89. package/dist/src/ui/compare/printSuccess.js.map +1 -0
  90. package/dist/src/ui/scan/printComparisonError.d.ts +11 -0
  91. package/dist/src/ui/scan/printComparisonError.d.ts.map +1 -0
  92. package/dist/src/ui/scan/printComparisonError.js +20 -0
  93. package/dist/src/ui/scan/printComparisonError.js.map +1 -0
  94. package/dist/src/ui/scan/printHeader.d.ts +7 -0
  95. package/dist/src/ui/scan/printHeader.d.ts.map +1 -0
  96. package/dist/src/ui/scan/printHeader.js +16 -0
  97. package/dist/src/ui/scan/printHeader.js.map +1 -0
  98. package/dist/src/ui/scan/printMissing.d.ts +13 -0
  99. package/dist/src/ui/scan/printMissing.d.ts.map +1 -0
  100. package/dist/src/ui/scan/printMissing.js +43 -0
  101. package/dist/src/ui/scan/printMissing.js.map +1 -0
  102. package/dist/src/ui/scan/printMissingExample.d.ts +9 -0
  103. package/dist/src/ui/scan/printMissingExample.d.ts.map +1 -0
  104. package/dist/src/ui/scan/printMissingExample.js +27 -0
  105. package/dist/src/ui/scan/printMissingExample.js.map +1 -0
  106. package/dist/src/ui/scan/printSecrets.d.ts +14 -0
  107. package/dist/src/ui/scan/printSecrets.d.ts.map +1 -0
  108. package/dist/src/ui/scan/printSecrets.js +29 -0
  109. package/dist/src/ui/scan/printSecrets.js.map +1 -0
  110. package/dist/src/ui/scan/printStats.d.ts +13 -0
  111. package/dist/src/ui/scan/printStats.d.ts.map +1 -0
  112. package/dist/src/ui/scan/printStats.js +17 -0
  113. package/dist/src/ui/scan/printStats.js.map +1 -0
  114. package/dist/src/ui/scan/printUniqueVariables.d.ts +7 -0
  115. package/dist/src/ui/scan/printUniqueVariables.d.ts.map +1 -0
  116. package/dist/src/ui/scan/printUniqueVariables.js +14 -0
  117. package/dist/src/ui/scan/printUniqueVariables.js.map +1 -0
  118. package/dist/src/ui/scan/printUnused.d.ts +10 -0
  119. package/dist/src/ui/scan/printUnused.d.ts.map +1 -0
  120. package/dist/src/ui/scan/printUnused.js +22 -0
  121. package/dist/src/ui/scan/printUnused.js.map +1 -0
  122. package/dist/src/ui/scan/printVariables.d.ts +10 -0
  123. package/dist/src/ui/scan/printVariables.d.ts.map +1 -0
  124. package/dist/src/ui/scan/printVariables.js +37 -0
  125. package/dist/src/ui/scan/printVariables.js.map +1 -0
  126. package/dist/src/ui/shared/printAutoFix.d.ts +16 -0
  127. package/dist/src/ui/shared/printAutoFix.d.ts.map +1 -0
  128. package/dist/src/ui/shared/printAutoFix.js +34 -0
  129. package/dist/src/ui/shared/printAutoFix.js.map +1 -0
  130. package/dist/src/ui/shared/printDuplicates.d.ts +17 -0
  131. package/dist/src/ui/shared/printDuplicates.d.ts.map +1 -0
  132. package/dist/src/ui/shared/printDuplicates.js +25 -0
  133. package/dist/src/ui/shared/printDuplicates.js.map +1 -0
  134. package/dist/src/ui/shared/printFixTips.d.ts +11 -0
  135. package/dist/src/ui/shared/printFixTips.d.ts.map +1 -0
  136. package/dist/src/ui/shared/printFixTips.js +46 -0
  137. package/dist/src/ui/shared/printFixTips.js.map +1 -0
  138. package/dist/src/ui/shared/printGitignore.d.ts +13 -0
  139. package/dist/src/ui/shared/printGitignore.d.ts.map +1 -0
  140. package/dist/src/ui/shared/printGitignore.js +22 -0
  141. package/dist/src/ui/shared/printGitignore.js.map +1 -0
  142. package/dist/src/ui/shared/printOptionErrors.d.ts +17 -0
  143. package/dist/src/ui/shared/printOptionErrors.d.ts.map +1 -0
  144. package/dist/src/ui/shared/printOptionErrors.js +27 -0
  145. package/dist/src/ui/shared/printOptionErrors.js.map +1 -0
  146. package/dist/src/ui/shared/printStrictModeError.d.ts +16 -0
  147. package/dist/src/ui/shared/printStrictModeError.d.ts.map +1 -0
  148. package/dist/src/ui/shared/printStrictModeError.js +29 -0
  149. package/dist/src/ui/shared/printStrictModeError.js.map +1 -0
  150. package/dist/src/ui/shared/printSuccess.d.ts +11 -0
  151. package/dist/src/ui/shared/printSuccess.d.ts.map +1 -0
  152. package/dist/src/ui/shared/printSuccess.js +27 -0
  153. package/dist/src/ui/shared/printSuccess.js.map +1 -0
  154. package/dist/src/ui/shared/setupGlobalConfig.d.ts +7 -0
  155. package/dist/src/ui/shared/setupGlobalConfig.d.ts.map +1 -0
  156. package/dist/src/ui/shared/setupGlobalConfig.js +12 -0
  157. package/dist/src/ui/shared/setupGlobalConfig.js.map +1 -0
  158. package/package.json +3 -3
@@ -1,23 +1,32 @@
1
1
  import fs from 'fs';
2
+ import path from 'path';
3
+ import { isEnvIgnoredByGit, isGitRepo, findGitRoot } from '../services/git.js';
2
4
  /**
3
5
  * Applies fixes to the .env and .env.example files based on the detected issues.
4
- * @param envPath - The path to the .env file.
5
- * @param examplePath - The path to the .env.example file.
6
- * @param missingKeys - The list of missing keys to add.
7
- * @param duplicateKeys - The list of duplicate keys to remove.
8
- * @returns An object indicating whether changes were made and details of the changes.
6
+ *
7
+ * This function will:
8
+ * - Remove duplicate keys from .env (keeping the last occurrence)
9
+ * - Add missing keys to .env with empty values
10
+ * - Add missing keys to .env.example (if not already present)
11
+ * - Ensure .env is ignored in .gitignore (if in a git repo and ensureGitignore is true)
12
+ *
13
+ * @param options - Fix options including file paths and keys to fix
14
+ * @returns An object indicating whether changes were made and details of the changes
9
15
  */
10
- export function applyFixes({ envPath, examplePath, missingKeys, duplicateKeys, }) {
16
+ export function applyFixes(options) {
17
+ const { envPath, examplePath, missingKeys, duplicateKeys, ensureGitignore } = options;
11
18
  const result = {
12
19
  removedDuplicates: [],
13
20
  addedEnv: [],
14
21
  addedExample: [],
22
+ gitignoreUpdated: false,
15
23
  };
16
24
  // --- Remove duplicates ---
17
25
  if (duplicateKeys.length) {
18
26
  const lines = fs.readFileSync(envPath, 'utf-8').split('\n');
19
27
  const seen = new Set();
20
28
  const newLines = [];
29
+ // Process from bottom to top, keeping last occurrence
21
30
  for (let i = lines.length - 1; i >= 0; i--) {
22
31
  const line = lines[i];
23
32
  if (line === undefined)
@@ -27,14 +36,14 @@ export function applyFixes({ envPath, examplePath, missingKeys, duplicateKeys, }
27
36
  const key = match[1] || '';
28
37
  if (duplicateKeys.includes(key)) {
29
38
  if (seen.has(key))
30
- continue; // skip duplicate
39
+ continue; // Skip duplicate
31
40
  seen.add(key);
32
41
  }
33
42
  }
34
43
  newLines.unshift(line);
35
44
  }
36
45
  fs.writeFileSync(envPath, newLines.join('\n'));
37
- result.removedDuplicates = duplicateKeys; // save all dupe keys
46
+ result.removedDuplicates = duplicateKeys;
38
47
  }
39
48
  // --- Add missing keys to .env ---
40
49
  if (missingKeys.length) {
@@ -44,7 +53,7 @@ export function applyFixes({ envPath, examplePath, missingKeys, duplicateKeys, }
44
53
  missingKeys.map((k) => `${k}=`).join('\n') +
45
54
  '\n';
46
55
  fs.writeFileSync(envPath, newContent);
47
- result.addedEnv = missingKeys; // save all missing keys
56
+ result.addedEnv = missingKeys;
48
57
  }
49
58
  // --- Add missing keys to .env.example ---
50
59
  if (examplePath && missingKeys.length) {
@@ -60,12 +69,62 @@ export function applyFixes({ envPath, examplePath, missingKeys, duplicateKeys, }
60
69
  newExampleKeys.join('\n') +
61
70
  '\n';
62
71
  fs.writeFileSync(examplePath, newExContent);
63
- result.addedExample = newExampleKeys; // save all keys actually added
72
+ result.addedExample = newExampleKeys;
64
73
  }
65
74
  }
75
+ // --- Ensure .env is ignored in .gitignore ---
76
+ if (ensureGitignore) {
77
+ result.gitignoreUpdated = updateGitignoreForEnv(envPath);
78
+ }
66
79
  const changed = result.removedDuplicates.length > 0 ||
67
80
  result.addedEnv.length > 0 ||
68
- result.addedExample.length > 0;
81
+ result.addedExample.length > 0 ||
82
+ result.gitignoreUpdated;
69
83
  return { changed, result };
70
84
  }
85
+ /**
86
+ * Ensures .env patterns are present in .gitignore at the git repository root.
87
+ * This is a best-effort operation and will not throw errors.
88
+ *
89
+ * @param envPath - Path to the .env file to check gitignore for
90
+ * @returns true if .gitignore was updated, false otherwise
91
+ */
92
+ function updateGitignoreForEnv(envPath) {
93
+ try {
94
+ const startDir = path.dirname(envPath);
95
+ const gitRoot = findGitRoot(startDir);
96
+ if (!gitRoot || !isGitRepo(gitRoot)) {
97
+ return false;
98
+ }
99
+ const gitignorePath = path.join(gitRoot, '.gitignore');
100
+ const envFileName = path.basename(envPath);
101
+ const ignored = isEnvIgnoredByGit({ cwd: gitRoot, envFile: envFileName });
102
+ // Already properly ignored
103
+ if (ignored === true) {
104
+ return false;
105
+ }
106
+ // Need to add patterns
107
+ const patterns = ['.env', '.env.*'];
108
+ if (fs.existsSync(gitignorePath)) {
109
+ const current = fs.readFileSync(gitignorePath, 'utf8');
110
+ const existingLines = current.split(/\r?\n/).map((l) => l.trim());
111
+ const missingPatterns = patterns.filter((pattern) => !existingLines.includes(pattern));
112
+ if (missingPatterns.length) {
113
+ const toAppend = `${current.endsWith('\n') ? '' : '\n'}${missingPatterns.join('\n')}\n`;
114
+ fs.appendFileSync(gitignorePath, toAppend);
115
+ return true;
116
+ }
117
+ }
118
+ else {
119
+ // Create new .gitignore
120
+ fs.writeFileSync(gitignorePath, patterns.join('\n') + '\n');
121
+ return true;
122
+ }
123
+ return false;
124
+ }
125
+ catch {
126
+ // Non-blocking: ignore errors
127
+ return false;
128
+ }
129
+ }
71
130
  //# sourceMappingURL=fixEnv.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fixEnv.js","sourceRoot":"","sources":["../../../src/core/fixEnv.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fixEnv.js","sourceRoot":"","sources":["../../../src/core/fixEnv.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Filtered } from '../../config/types.js';
2
+ /**
3
+ * Checks if all filtered comparison results are okay (i.e., no issues found).
4
+ * @param filtered - The filtered comparison results.
5
+ * @returns True if all checks pass, false otherwise.
6
+ */
7
+ export declare function isAllOk(filtered: Filtered): boolean;
8
+ //# sourceMappingURL=isAllOk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isAllOk.d.ts","sourceRoot":"","sources":["../../../../src/core/helpers/isAllOk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAUnD"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Checks if all filtered comparison results are okay (i.e., no issues found).
3
+ * @param filtered - The filtered comparison results.
4
+ * @returns True if all checks pass, false otherwise.
5
+ */
6
+ export function isAllOk(filtered) {
7
+ return (filtered.missing.length === 0 &&
8
+ filtered.extra?.length === 0 &&
9
+ filtered.empty?.length === 0 &&
10
+ filtered.duplicatesEnv.length === 0 &&
11
+ filtered.duplicatesEx.length === 0 &&
12
+ filtered.mismatches?.length === 0 &&
13
+ !filtered.gitignoreIssue);
14
+ }
15
+ //# sourceMappingURL=isAllOk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isAllOk.js","sourceRoot":"","sources":["../../../../src/core/helpers/isAllOk.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,QAAkB;IACxC,OAAO,CACL,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,KAAK,CAAC;QAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,KAAK,CAAC;QAC5B,QAAQ,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;QACnC,QAAQ,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;QAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,KAAK,CAAC;QACjC,CAAC,QAAQ,CAAC,cAAc,CACzB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { CompareJsonEntry } from '../../config/types.js';
2
+ import type { Filtered } from '../../config/types.js';
3
+ export interface Totals {
4
+ missing: number;
5
+ extra: number;
6
+ empty: number;
7
+ mismatch: number;
8
+ duplicate: number;
9
+ gitignore: number;
10
+ }
11
+ /**
12
+ * Update totals and entry fields based on filtered issues.
13
+ * Returns true if any issue requires exitWithError.
14
+ * @param filtered filtered issues
15
+ * @param totals overall totals
16
+ * @param entry current entry to update
17
+ * @returns exitWithError
18
+ */
19
+ export declare function updateTotals(filtered: Filtered, totals: Totals, entry: CompareJsonEntry): boolean;
20
+ //# sourceMappingURL=updateTotals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateTotals.d.ts","sourceRoot":"","sources":["../../../../src/core/helpers/updateTotals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAkCT"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Update totals and entry fields based on filtered issues.
3
+ * Returns true if any issue requires exitWithError.
4
+ * @param filtered filtered issues
5
+ * @param totals overall totals
6
+ * @param entry current entry to update
7
+ * @returns exitWithError
8
+ */
9
+ export function updateTotals(filtered, totals, entry) {
10
+ let exitWithError = false;
11
+ if (filtered.missing.length) {
12
+ entry.missing = filtered.missing;
13
+ totals.missing += filtered.missing.length;
14
+ exitWithError = true;
15
+ }
16
+ if (filtered.extra?.length) {
17
+ entry.extra = filtered.extra;
18
+ totals.extra += filtered.extra.length;
19
+ }
20
+ if (filtered.empty?.length) {
21
+ entry.empty = filtered.empty;
22
+ totals.empty += filtered.empty.length;
23
+ }
24
+ if (filtered.mismatches?.length) {
25
+ entry.valueMismatches = filtered.mismatches;
26
+ totals.mismatch += filtered.mismatches.length;
27
+ }
28
+ if (filtered.duplicatesEnv.length || filtered.duplicatesEx.length) {
29
+ totals.duplicate +=
30
+ filtered.duplicatesEnv.length + filtered.duplicatesEx.length;
31
+ }
32
+ if (filtered.gitignoreIssue) {
33
+ totals.gitignore += 1;
34
+ }
35
+ return exitWithError;
36
+ }
37
+ //# sourceMappingURL=updateTotals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateTotals.js","sourceRoot":"","sources":["../../../../src/core/helpers/updateTotals.ts"],"names":[],"mappings":"AAYA;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAC1B,QAAkB,EAClB,MAAc,EACd,KAAuB;IAEvB,IAAI,aAAa,GAAG,KAAK,CAAC;IAE1B,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC5B,KAAK,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;QACjC,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;QAC1C,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QAC3B,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC7B,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;IACxC,CAAC;IAED,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QAC3B,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC7B,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;IACxC,CAAC;IAED,IAAI,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAChC,KAAK,CAAC,eAAe,GAAG,QAAQ,CAAC,UAAU,CAAC;QAC5C,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;IAChD,CAAC;IAED,IAAI,QAAQ,CAAC,aAAa,CAAC,MAAM,IAAI,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QAClE,MAAM,CAAC,SAAS;YACd,QAAQ,CAAC,aAAa,CAAC,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC;IACjE,CAAC;IAED,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { ScanUsageOptions, ScanResult } from '../config/types.js';
2
+ export interface ProcessComparisonResult {
3
+ scanResult: ScanResult;
4
+ envVariables: Record<string, string | undefined>;
5
+ comparedAgainst: string;
6
+ duplicatesFound: boolean;
7
+ dupsEnv: Array<{
8
+ key: string;
9
+ count: number;
10
+ }>;
11
+ dupsExample: Array<{
12
+ key: string;
13
+ count: number;
14
+ }>;
15
+ fixApplied: boolean;
16
+ removedDuplicates: string[];
17
+ addedEnv: string[];
18
+ addedExample: string[];
19
+ gitignoreUpdated: boolean;
20
+ error?: {
21
+ message: string;
22
+ shouldExit: boolean;
23
+ };
24
+ }
25
+ /**
26
+ * Process comparison file: parse env, check duplicates, check missing keys, apply fixes
27
+ * @param scanResult - Current scan result
28
+ * @param compareFile - File to compare against
29
+ * @param opts - Scan options
30
+ * @returns Processed comparison result
31
+ */
32
+ export declare function processComparisonFile(scanResult: ScanResult, compareFile: {
33
+ path: string;
34
+ name: string;
35
+ }, opts: ScanUsageOptions): ProcessComparisonResult;
36
+ //# sourceMappingURL=processComparisonFile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processComparisonFile.d.ts","sourceRoot":"","sources":["../../../src/core/processComparisonFile.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEvE,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,WAAW,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,UAAU,EAAE,OAAO,CAAC;IACpB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,CAAC;CAClD;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAC3C,IAAI,EAAE,gBAAgB,GACrB,uBAAuB,CAqGzB"}
@@ -0,0 +1,124 @@
1
+ import fs from 'fs';
2
+ import { parseEnvFile } from './parseEnv.js';
3
+ import { filterIgnoredKeys } from './filterIgnoredKeys.js';
4
+ import { compareWithEnvFiles } from './compareScan.js';
5
+ import { findDuplicateKeys } from '../services/duplicates.js';
6
+ import { applyFixes } from './fixEnv.js';
7
+ import { resolveFromCwd } from './helpers/resolveFromCwd.js';
8
+ /**
9
+ * Process comparison file: parse env, check duplicates, check missing keys, apply fixes
10
+ * @param scanResult - Current scan result
11
+ * @param compareFile - File to compare against
12
+ * @param opts - Scan options
13
+ * @returns Processed comparison result
14
+ */
15
+ export function processComparisonFile(scanResult, compareFile, opts) {
16
+ let envVariables = {};
17
+ let comparedAgainst = '';
18
+ let duplicatesFound = false;
19
+ let dupsEnv = [];
20
+ let dupsExample = [];
21
+ let fixApplied = false;
22
+ let removedDuplicates = [];
23
+ let addedEnv = [];
24
+ let addedExample = [];
25
+ let gitignoreUpdated = false;
26
+ try {
27
+ // Parse and filter env file
28
+ const envFull = parseEnvFile(compareFile.path);
29
+ const envKeys = filterIgnoredKeys(Object.keys(envFull), opts.ignore, opts.ignoreRegex);
30
+ envVariables = Object.fromEntries(envKeys.map((k) => [k, envFull[k]]));
31
+ scanResult = compareWithEnvFiles(scanResult, envVariables);
32
+ comparedAgainst = compareFile.name;
33
+ // Find duplicates
34
+ if (!opts.allowDuplicates) {
35
+ const duplicateResults = checkDuplicates(compareFile, opts);
36
+ dupsEnv = duplicateResults.dupsEnv;
37
+ dupsExample = duplicateResults.dupsExample;
38
+ duplicatesFound = dupsEnv.length > 0 || dupsExample.length > 0;
39
+ }
40
+ // Apply fixes (both duplicates + missing keys + gitignore)
41
+ if (opts.fix &&
42
+ (duplicatesFound || scanResult.missing.length > 0 || true)) {
43
+ const { changed, result } = applyFixes({
44
+ envPath: compareFile.path,
45
+ examplePath: opts.examplePath
46
+ ? resolveFromCwd(opts.cwd, opts.examplePath)
47
+ : '',
48
+ missingKeys: scanResult.missing,
49
+ duplicateKeys: dupsEnv.map((d) => d.key),
50
+ ensureGitignore: true,
51
+ });
52
+ if (changed) {
53
+ fixApplied = true;
54
+ removedDuplicates = result.removedDuplicates;
55
+ addedEnv = result.addedEnv;
56
+ addedExample = result.addedExample;
57
+ gitignoreUpdated = result.gitignoreUpdated;
58
+ scanResult.missing = [];
59
+ dupsEnv = [];
60
+ dupsExample = [];
61
+ duplicatesFound = false;
62
+ }
63
+ }
64
+ // Keep duplicates for output if not fixed
65
+ if (duplicatesFound && (!opts.fix || !fixApplied)) {
66
+ if (!scanResult.duplicates)
67
+ scanResult.duplicates = {};
68
+ if (dupsEnv.length > 0)
69
+ scanResult.duplicates.env = dupsEnv;
70
+ if (dupsExample.length > 0)
71
+ scanResult.duplicates.example = dupsExample;
72
+ }
73
+ }
74
+ catch (error) {
75
+ const errorMessage = `Could not read ${compareFile.name}: ${compareFile.path} - ${error}`;
76
+ return {
77
+ scanResult,
78
+ envVariables,
79
+ comparedAgainst,
80
+ duplicatesFound,
81
+ dupsEnv,
82
+ dupsExample,
83
+ fixApplied,
84
+ removedDuplicates,
85
+ addedEnv,
86
+ addedExample,
87
+ gitignoreUpdated,
88
+ error: {
89
+ message: errorMessage,
90
+ shouldExit: opts.isCiMode ?? false,
91
+ },
92
+ };
93
+ }
94
+ return {
95
+ scanResult,
96
+ envVariables,
97
+ comparedAgainst,
98
+ duplicatesFound,
99
+ dupsEnv,
100
+ dupsExample,
101
+ fixApplied,
102
+ removedDuplicates,
103
+ addedEnv,
104
+ addedExample,
105
+ gitignoreUpdated,
106
+ };
107
+ }
108
+ /**
109
+ * Check for duplicate keys in env and example files
110
+ */
111
+ function checkDuplicates(compareFile, opts) {
112
+ const dupsEnv = findDuplicateKeys(compareFile.path).filter(({ key }) => !opts.ignore.includes(key) &&
113
+ !opts.ignoreRegex.some((rx) => rx.test(key)));
114
+ let dupsExample = [];
115
+ if (opts.examplePath) {
116
+ const examplePath = resolveFromCwd(opts.cwd, opts.examplePath);
117
+ if (fs.existsSync(examplePath) && examplePath !== compareFile.path) {
118
+ dupsExample = findDuplicateKeys(examplePath).filter(({ key }) => !opts.ignore.includes(key) &&
119
+ !opts.ignoreRegex.some((rx) => rx.test(key)));
120
+ }
121
+ }
122
+ return { dupsEnv, dupsExample };
123
+ }
124
+ //# sourceMappingURL=processComparisonFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processComparisonFile.js","sourceRoot":"","sources":["../../../src/core/processComparisonFile.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"secretDetectors.d.ts","sourceRoot":"","sources":["../../../src/core/secretDetectors.ts"],"names":[],"mappings":"AAGA,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;CACjB,CAAC;AAwGF;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,aAAa,EAAE,CAgGjB"}
1
+ {"version":3,"file":"secretDetectors.d.ts","sourceRoot":"","sources":["../../../src/core/secretDetectors.ts"],"names":[],"mappings":"AAGA,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;CACjB,CAAC;AAqHF;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,aAAa,EAAE,CAmGjB"}
@@ -25,6 +25,16 @@ const HARMLESS_URLS = [
25
25
  /http:\/\/www\.w3\.org\/2000\/svg/i,
26
26
  /xmlns=["']http:\/\/www\.w3\.org\/2000\/svg["']/i, // SVG namespace
27
27
  ];
28
+ /**
29
+ * Checks if a line has an ignore comment
30
+ * fx: // dotenv-diff-ignore or /* dotenv-diff-ignore
31
+ * @param line - The line to check
32
+ * @returns True if the line should be ignored
33
+ */
34
+ function hasIgnoreComment(line) {
35
+ return (/\/\/\s*dotenv-diff-ignore/.test(line) ||
36
+ /\/\*\s*dotenv-diff-ignore\s*\*\//.test(line));
37
+ }
28
38
  /**
29
39
  * Checks if a string looks like a harmless literal.
30
40
  * @param s - The string to check.
@@ -96,6 +106,9 @@ export function detectSecretsInSource(file, source) {
96
106
  // Skip comments
97
107
  if (/^\s*\/\//.test(line))
98
108
  continue;
109
+ // Check if line has ignore comment
110
+ if (hasIgnoreComment(line))
111
+ continue;
99
112
  // Check for HTTPS URLs
100
113
  HTTPS_PATTERN.lastIndex = 0;
101
114
  let httpsMatch;
@@ -1 +1 @@
1
- {"version":3,"file":"secretDetectors.js","sourceRoot":"","sources":["../../../src/core/secretDetectors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"secretDetectors.js","sourceRoot":"","sources":["../../../src/core/secretDetectors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Ensures that the necessary .env files exist or prompts the user to create them.
3
+ * This function handles only scenarios where the --compare flag is set
4
+ * @param args - The arguments for the function.
5
+ * @returns An object indicating whether a file was created or if the process should exit.
6
+ */
7
+ export declare function ensureFilesOrPrompt(args: {
8
+ cwd: string;
9
+ primaryEnv: string;
10
+ primaryExample: string;
11
+ alreadyWarnedMissingEnv: boolean;
12
+ isYesMode: boolean;
13
+ isCiMode: boolean;
14
+ }): Promise<{
15
+ didCreate: boolean;
16
+ shouldExit: boolean;
17
+ exitCode: number;
18
+ }>;
19
+ //# sourceMappingURL=ensureFilesOrPrompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensureFilesOrPrompt.d.ts","sourceRoot":"","sources":["../../../src/services/ensureFilesOrPrompt.ts"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,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;;;;GAqFA"}
@@ -0,0 +1,73 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { confirmYesNo } from '../ui/prompts.js';
4
+ import { warnIfEnvNotIgnored } from './git.js';
5
+ import { printPrompt } from '../ui/compare/printPrompt.js';
6
+ /**
7
+ * Ensures that the necessary .env files exist or prompts the user to create them.
8
+ * This function handles only scenarios where the --compare flag is set
9
+ * @param args - The arguments for the function.
10
+ * @returns An object indicating whether a file was created or if the process should exit.
11
+ */
12
+ export async function ensureFilesOrPrompt(args) {
13
+ const { cwd, primaryEnv, primaryExample, alreadyWarnedMissingEnv, isYesMode, isCiMode, } = args;
14
+ const envPath = path.resolve(cwd, primaryEnv);
15
+ const examplePath = path.resolve(cwd, primaryExample);
16
+ const envExists = fs.existsSync(envPath);
17
+ const exampleExists = fs.existsSync(examplePath);
18
+ // Case 1: no .env and no .env.example
19
+ if (!envExists && !exampleExists) {
20
+ const hasAnyEnv = fs.readdirSync(cwd).some((f) => f.startsWith('.env'));
21
+ if (!hasAnyEnv) {
22
+ printPrompt.noEnvFound();
23
+ return { didCreate: false, shouldExit: true, exitCode: 0 };
24
+ }
25
+ }
26
+ // Case 2: missing .env but has .env.example
27
+ if (!envExists && exampleExists) {
28
+ if (!alreadyWarnedMissingEnv) {
29
+ printPrompt.missingEnv(envPath);
30
+ }
31
+ const createEnv = isYesMode
32
+ ? true
33
+ : isCiMode
34
+ ? false
35
+ : await confirmYesNo(`❓ Do you want to create a new ${path.basename(envPath)} file from ${path.basename(examplePath)}?`, { isCiMode, isYesMode });
36
+ if (!createEnv) {
37
+ printPrompt.skipCreation('.env');
38
+ return { didCreate: false, shouldExit: true, exitCode: 0 };
39
+ }
40
+ const exampleContent = fs.readFileSync(examplePath, 'utf-8');
41
+ fs.writeFileSync(envPath, exampleContent);
42
+ printPrompt.envCreated(envPath, examplePath);
43
+ warnIfEnvNotIgnored({ envFile: path.basename(envPath) });
44
+ }
45
+ // Case 3: has .env but is missing .env.example
46
+ if (envExists && !exampleExists) {
47
+ printPrompt.missingEnv(examplePath);
48
+ const createExample = isYesMode
49
+ ? true
50
+ : isCiMode
51
+ ? false
52
+ : await confirmYesNo(`❓ Do you want to create a new ${path.basename(examplePath)} file from ${path.basename(envPath)}?`, { isCiMode, isYesMode });
53
+ if (!createExample) {
54
+ printPrompt.skipCreation('.env.example');
55
+ return { didCreate: false, shouldExit: true, exitCode: 0 };
56
+ }
57
+ const envContent = fs
58
+ .readFileSync(envPath, 'utf-8')
59
+ .split('\n')
60
+ .map((line) => {
61
+ const trimmed = line.trim();
62
+ if (!trimmed || trimmed.startsWith('#'))
63
+ return trimmed;
64
+ const [key] = trimmed.split('=');
65
+ return `${key}=`;
66
+ })
67
+ .join('\n');
68
+ fs.writeFileSync(examplePath, envContent);
69
+ printPrompt.exampleCreated(examplePath, envPath);
70
+ }
71
+ return { didCreate: true, shouldExit: false, exitCode: 0 };
72
+ }
73
+ //# sourceMappingURL=ensureFilesOrPrompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensureFilesOrPrompt.js","sourceRoot":"","sources":["../../../src/services/ensureFilesOrPrompt.ts"],"names":[],"mappings":"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"}
@@ -25,4 +25,13 @@ export declare function isEnvIgnoredByGit(options?: GitignoreCheckOptions): bool
25
25
  * @returns console.log messages or void
26
26
  */
27
27
  export declare function warnIfEnvNotIgnored(options?: GitignoreCheckOptions): void;
28
+ /**
29
+ * Checks if .env file has gitignore issues.
30
+ * Returns null if no issue, otherwise returns the reason.
31
+ */
32
+ export declare function checkGitignoreStatus(options?: GitignoreCheckOptions): {
33
+ reason: 'no-gitignore' | 'not-ignored';
34
+ } | null;
35
+ /** Find the git repository root starting from startDir (walk up until ".git"). */
36
+ export declare function findGitRoot(startDir: string): string | null;
28
37
  //# sourceMappingURL=git.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../../src/services/git.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,qBAAqB,GAAG;IAClC,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,CAAC;AAEF,+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;AA0BD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,qBAA0B,GAAG,IAAI,CA2B7E"}
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../../src/services/git.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,qBAAqB,GAAG;IAClC,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,CAAC;AAEF,+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;AA0BD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,qBAA0B,GAAG,IAAI,CA0B7E;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG;IACzE,MAAM,EAAE,cAAc,GAAG,aAAa,CAAC;CACxC,GAAG,IAAI,CAmBP;AAED,kFAAkF;AAClF,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAU3D"}