dotenv-diff 2.1.7 → 2.2.1

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 (86) hide show
  1. package/README.md +46 -77
  2. package/dist/bin/dotenv-diff.d.ts +1 -0
  3. package/dist/bin/dotenv-diff.d.ts.map +1 -0
  4. package/dist/bin/dotenv-diff.js +1 -0
  5. package/dist/bin/dotenv-diff.js.map +1 -0
  6. package/dist/src/cli/program.d.ts +1 -0
  7. package/dist/src/cli/program.d.ts.map +1 -0
  8. package/dist/src/cli/program.js +8 -5
  9. package/dist/src/cli/program.js.map +1 -0
  10. package/dist/src/cli/run.d.ts +5 -0
  11. package/dist/src/cli/run.d.ts.map +1 -0
  12. package/dist/src/cli/run.js +14 -8
  13. package/dist/src/cli/run.js.map +1 -0
  14. package/dist/src/commands/compare.d.ts +7 -0
  15. package/dist/src/commands/compare.d.ts.map +1 -0
  16. package/dist/src/commands/compare.js +9 -5
  17. package/dist/src/commands/compare.js.map +1 -0
  18. package/dist/src/commands/init.d.ts +6 -0
  19. package/dist/src/commands/init.d.ts.map +1 -0
  20. package/dist/src/commands/init.js +6 -0
  21. package/dist/src/commands/init.js.map +1 -0
  22. package/dist/src/commands/scanUsage.d.ts +11 -2
  23. package/dist/src/commands/scanUsage.d.ts.map +1 -0
  24. package/dist/src/commands/scanUsage.js +58 -14
  25. package/dist/src/commands/scanUsage.js.map +1 -0
  26. package/dist/src/config/options.d.ts +7 -1
  27. package/dist/src/config/options.d.ts.map +1 -0
  28. package/dist/src/config/options.js +29 -6
  29. package/dist/src/config/options.js.map +1 -0
  30. package/dist/src/config/types.d.ts +18 -2
  31. package/dist/src/config/types.d.ts.map +1 -0
  32. package/dist/src/config/types.js +2 -0
  33. package/dist/src/config/types.js.map +1 -0
  34. package/dist/src/core/entropy.d.ts +8 -0
  35. package/dist/src/core/entropy.d.ts.map +1 -0
  36. package/dist/src/core/entropy.js +23 -0
  37. package/dist/src/core/entropy.js.map +1 -0
  38. package/dist/src/core/filterIgnoredKeys.d.ts +8 -0
  39. package/dist/src/core/filterIgnoredKeys.d.ts.map +1 -0
  40. package/dist/src/core/filterIgnoredKeys.js +8 -0
  41. package/dist/src/core/filterIgnoredKeys.js.map +1 -0
  42. package/dist/src/core/fixEnv.d.ts +9 -0
  43. package/dist/src/core/fixEnv.d.ts.map +1 -0
  44. package/dist/src/core/fixEnv.js +12 -1
  45. package/dist/src/core/fixEnv.js.map +1 -0
  46. package/dist/src/core/secretDetectors.d.ts +15 -0
  47. package/dist/src/core/secretDetectors.d.ts.map +1 -0
  48. package/dist/src/core/secretDetectors.js +90 -0
  49. package/dist/src/core/secretDetectors.js.map +1 -0
  50. package/dist/src/index.d.ts +2 -1
  51. package/dist/src/index.d.ts.map +1 -0
  52. package/dist/src/index.js +3 -2
  53. package/dist/src/index.js.map +1 -0
  54. package/dist/src/lib/diffEnv.d.ts +1 -0
  55. package/dist/src/lib/diffEnv.d.ts.map +1 -0
  56. package/dist/src/lib/diffEnv.js +4 -2
  57. package/dist/src/lib/diffEnv.js.map +1 -0
  58. package/dist/src/lib/parseEnv.d.ts +1 -0
  59. package/dist/src/lib/parseEnv.d.ts.map +1 -0
  60. package/dist/src/lib/parseEnv.js +1 -0
  61. package/dist/src/lib/parseEnv.js.map +1 -0
  62. package/dist/src/services/codeBaseScanner.d.ts +4 -0
  63. package/dist/src/services/codeBaseScanner.d.ts.map +1 -0
  64. package/dist/src/services/codeBaseScanner.js +20 -2
  65. package/dist/src/services/codeBaseScanner.js.map +1 -0
  66. package/dist/src/services/duplicates.d.ts +3 -0
  67. package/dist/src/services/duplicates.d.ts.map +1 -0
  68. package/dist/src/services/duplicates.js +3 -0
  69. package/dist/src/services/duplicates.js.map +1 -0
  70. package/dist/src/services/envDiscovery.d.ts +13 -0
  71. package/dist/src/services/envDiscovery.d.ts.map +1 -0
  72. package/dist/src/services/envDiscovery.js +8 -0
  73. package/dist/src/services/envDiscovery.js.map +1 -0
  74. package/dist/src/services/envPairing.d.ts +6 -0
  75. package/dist/src/services/envPairing.d.ts.map +1 -0
  76. package/dist/src/services/envPairing.js +6 -0
  77. package/dist/src/services/envPairing.js.map +1 -0
  78. package/dist/src/services/git.d.ts +5 -0
  79. package/dist/src/services/git.d.ts.map +1 -0
  80. package/dist/src/services/git.js +5 -0
  81. package/dist/src/services/git.js.map +1 -0
  82. package/dist/src/ui/prompts.d.ts +12 -0
  83. package/dist/src/ui/prompts.d.ts.map +1 -0
  84. package/dist/src/ui/prompts.js +12 -0
  85. package/dist/src/ui/prompts.js.map +1 -0
  86. package/package.json +2 -2
@@ -4,6 +4,7 @@ import path from 'path';
4
4
  import { parseEnvFile } from '../lib/parseEnv.js';
5
5
  import { scanCodebase, compareWithEnvFiles, } from '../services/codeBaseScanner.js';
6
6
  import { filterIgnoredKeys } from '../core/filterIgnoredKeys.js';
7
+ // Helper to resolve paths relative to cwd
7
8
  const resolveFromCwd = (cwd, p) => path.isAbsolute(p) ? p : path.resolve(cwd, p);
8
9
  /**
9
10
  * Scans codebase for environment variable usage and compares with .env file
@@ -18,7 +19,8 @@ const resolveFromCwd = (cwd, p) => path.isAbsolute(p) ? p : path.resolve(cwd, p)
18
19
  */
19
20
  export async function scanUsage(opts) {
20
21
  if (!opts.json) {
21
- console.log(chalk.bold('🔍 Scanning codebase for environment variable usage...'));
22
+ console.log();
23
+ console.log(chalk.blue('🔍 Scanning codebase for environment variable usage...'));
22
24
  console.log();
23
25
  }
24
26
  // Scan the codebase
@@ -125,10 +127,16 @@ export async function scanUsage(opts) {
125
127
  console.log(chalk.green('✅ Auto-fix applied: no changes needed.'));
126
128
  console.log();
127
129
  }
130
+ if (scanResult.missing.length > 0 && !opts.json && !opts.fix) {
131
+ console.log(chalk.gray('💡 Tip: Run with `--fix` to add missing keys'));
132
+ console.log();
133
+ }
128
134
  return result;
129
135
  }
130
136
  /**
131
137
  * Determines which file to use for comparison based on provided options
138
+ * @param {ScanUsageOptions} opts - Scan configuration options
139
+ * @returns {Object|null} - The comparison file information or undefined if not found
132
140
  */
133
141
  function determineComparisonFile(opts) {
134
142
  // Priority: explicit flags first, then auto-discovery
@@ -152,8 +160,16 @@ function determineComparisonFile(opts) {
152
160
  return { path: fullPath, name: candidate };
153
161
  }
154
162
  }
155
- return null;
163
+ return undefined;
156
164
  }
165
+ /**
166
+ * Creates a JSON output for the scan results.
167
+ * @param scanResult - The result of the scan.
168
+ * @param opts - The scan options.
169
+ * @param comparedAgainst - The file being compared against.
170
+ * @param totalEnvVariables - The total number of environment variables.
171
+ * @returns The JSON output.
172
+ */
157
173
  function createJsonOutput(scanResult, opts, comparedAgainst, totalEnvVariables) {
158
174
  // Group usages by variable for missing variables
159
175
  const missingGrouped = scanResult.missing.map((variable) => ({
@@ -172,6 +188,14 @@ function createJsonOutput(scanResult, opts, comparedAgainst, totalEnvVariables)
172
188
  missing: missingGrouped,
173
189
  unused: scanResult.unused,
174
190
  };
191
+ if (scanResult.secrets?.length) {
192
+ output.secrets = scanResult.secrets.map((s) => ({
193
+ file: s.file,
194
+ line: s.line,
195
+ message: s.message,
196
+ snippet: s.snippet,
197
+ }));
198
+ }
175
199
  // Add comparison info if we compared against a file
176
200
  if (comparedAgainst) {
177
201
  output.comparedAgainst = comparedAgainst;
@@ -189,24 +213,31 @@ function createJsonOutput(scanResult, opts, comparedAgainst, totalEnvVariables)
189
213
  }
190
214
  return output;
191
215
  }
216
+ /**
217
+ * Outputs the scan results to the console.
218
+ * @param scanResult - The result of the scan.
219
+ * @param opts - The scan options.
220
+ * @param comparedAgainst - The file being compared against.
221
+ * @returns An object indicating whether to exit with an error.
222
+ */
192
223
  function outputToConsole(scanResult, opts, comparedAgainst) {
193
224
  let exitWithError = false;
194
225
  // Show what we're comparing against
195
226
  if (comparedAgainst) {
196
- console.log(chalk.gray(`📋 Comparing codebase usage against: ${comparedAgainst}`));
227
+ console.log(chalk.magenta(`📋 Comparing codebase usage against: ${comparedAgainst}`));
197
228
  console.log();
198
229
  }
199
230
  // Show stats if requested
200
231
  if (opts.showStats) {
201
- console.log(chalk.bold('📊 Scan Statistics:'));
202
- console.log(chalk.gray(` Files scanned: ${scanResult.stats.filesScanned}`));
203
- console.log(chalk.gray(` Total usages found: ${scanResult.stats.totalUsages}`));
204
- console.log(chalk.gray(` Unique variables: ${scanResult.stats.uniqueVariables}`));
232
+ console.log(chalk.magenta('📊 Scan Statistics:'));
233
+ console.log(chalk.magenta.dim(` Files scanned: ${scanResult.stats.filesScanned}`));
234
+ console.log(chalk.magenta.dim(` Total usages found: ${scanResult.stats.totalUsages}`));
235
+ console.log(chalk.magenta.dim(` Unique variables: ${scanResult.stats.uniqueVariables}`));
205
236
  console.log();
206
237
  }
207
238
  // Always show found variables when not comparing or when no missing variables
208
239
  if (!comparedAgainst || scanResult.missing.length === 0) {
209
- console.log(chalk.green(`✅ Found ${scanResult.stats.uniqueVariables} unique environment variables in use`));
240
+ console.log(chalk.blue(`🌐 Found ${scanResult.stats.uniqueVariables} unique environment variables in use`));
210
241
  console.log();
211
242
  // List all variables found (if any)
212
243
  if (scanResult.stats.uniqueVariables > 0) {
@@ -225,7 +256,7 @@ function outputToConsole(scanResult, opts, comparedAgainst) {
225
256
  if (opts.showStats) {
226
257
  const displayUsages = usages.slice(0, 2);
227
258
  displayUsages.forEach((usage) => {
228
- console.log(chalk.gray(` Used in: ${usage.file}:${usage.line} (${usage.pattern})`));
259
+ console.log(chalk.blue.dim(` Used in: ${usage.file}:${usage.line} (${usage.pattern})`));
229
260
  });
230
261
  if (usages.length > 2) {
231
262
  console.log(chalk.gray(` ... and ${usages.length - 2} more locations`));
@@ -250,7 +281,7 @@ function outputToConsole(scanResult, opts, comparedAgainst) {
250
281
  // Show first few usages
251
282
  const maxShow = 3;
252
283
  usages.slice(0, maxShow).forEach((usage) => {
253
- console.log(chalk.gray(` Used in: ${usage.file}:${usage.line} (${usage.pattern})`));
284
+ console.log(chalk.red.dim(` Used in: ${usage.file}:${usage.line} (${usage.pattern})`));
254
285
  });
255
286
  if (usages.length > maxShow) {
256
287
  console.log(chalk.gray(` ... and ${usages.length - maxShow} more locations`));
@@ -273,6 +304,22 @@ function outputToConsole(scanResult, opts, comparedAgainst) {
273
304
  });
274
305
  console.log();
275
306
  }
307
+ if (scanResult.secrets && scanResult.secrets.length > 0) {
308
+ console.log(chalk.yellow('🔒 Potential secrets detected in codebase:'));
309
+ const byFile = new Map();
310
+ for (const f of scanResult.secrets) {
311
+ if (!byFile.has(f.file))
312
+ byFile.set(f.file, []);
313
+ byFile.get(f.file).push(f);
314
+ }
315
+ for (const [file, findings] of byFile) {
316
+ console.log(chalk.bold(` ${file}`));
317
+ for (const f of findings) {
318
+ console.log(chalk.yellow(` - Line ${f.line}: ${f.message}\n ${chalk.dim(f.snippet)}`));
319
+ }
320
+ }
321
+ console.log();
322
+ }
276
323
  // Success message for env file comparison
277
324
  if (comparedAgainst && scanResult.missing.length === 0) {
278
325
  console.log(chalk.green(`✅ All used environment variables are defined in ${comparedAgainst}`));
@@ -281,9 +328,6 @@ function outputToConsole(scanResult, opts, comparedAgainst) {
281
328
  }
282
329
  console.log();
283
330
  }
284
- if (scanResult.missing.length > 0 && !opts.json && !opts.fix) {
285
- console.log(chalk.gray('💡 Tip: Run with `--fix` to add these missing keys to your .env file automatically.'));
286
- console.log();
287
- }
288
331
  return { exitWithError };
289
332
  }
333
+ //# sourceMappingURL=scanUsage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanUsage.js","sourceRoot":"","sources":["../../../src/commands/scanUsage.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,8 @@
1
- import { Options, RawOptions } from './types.js';
1
+ import { type Options, type RawOptions } from './types.js';
2
+ /**
3
+ * Normalizes the raw options by providing default values and parsing specific fields.
4
+ * @param raw - The raw options to normalize.
5
+ * @returns The normalized options.
6
+ */
2
7
  export declare function normalizeOptions(raw: RawOptions): Options;
8
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../src/config/options.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqC,KAAK,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAmC9F;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAoEzD"}
@@ -1,6 +1,11 @@
1
1
  import chalk from 'chalk';
2
2
  import path from 'path';
3
3
  import { ALLOWED_CATEGORIES } from './types.js';
4
+ /**
5
+ * Parses a comma-separated list of strings into an array of strings.
6
+ * @param val - The input value, which can be a string, an array of strings, or undefined.
7
+ * @returns An array of strings.
8
+ */
4
9
  function parseList(val) {
5
10
  const arr = Array.isArray(val) ? val : val ? [val] : [];
6
11
  return arr
@@ -8,6 +13,12 @@ function parseList(val) {
8
13
  .map((s) => s.trim())
9
14
  .filter(Boolean);
10
15
  }
16
+ /**
17
+ * Parses a comma-separated list of strings into an array of strings.
18
+ * @param val - The input value, which can be a string, an array of strings, or undefined.
19
+ * @param flagName - The name of the flag being parsed (for error messages).
20
+ * @returns An array of categories.
21
+ */
11
22
  function parseCategories(val, flagName = '') {
12
23
  const raw = parseList(val);
13
24
  const bad = raw.filter((c) => !ALLOWED_CATEGORIES.includes(c));
@@ -17,6 +28,11 @@ function parseCategories(val, flagName = '') {
17
28
  }
18
29
  return raw;
19
30
  }
31
+ /**
32
+ * Normalizes the raw options by providing default values and parsing specific fields.
33
+ * @param raw - The raw options to normalize.
34
+ * @returns The normalized options.
35
+ */
20
36
  export function normalizeOptions(raw) {
21
37
  const checkValues = raw.checkValues ?? false;
22
38
  const isCiMode = Boolean(raw.ci);
@@ -25,13 +41,16 @@ export function normalizeOptions(raw) {
25
41
  const fix = Boolean(raw.fix);
26
42
  const json = Boolean(raw.json);
27
43
  const onlyParsed = parseCategories(raw.only, '--only');
28
- const only = onlyParsed.length ? onlyParsed : undefined;
29
- const scanUsage = Boolean(raw.scanUsage);
44
+ const only = onlyParsed.length ? onlyParsed : [];
45
+ const noColor = Boolean(raw.noColor);
46
+ const compare = Boolean(raw.compare);
47
+ const scanUsage = raw.scanUsage ?? !compare;
30
48
  const includeFiles = parseList(raw.includeFiles);
31
49
  const excludeFiles = parseList(raw.excludeFiles);
32
- const showUnused = Boolean(raw.showUnused);
33
- const showStats = Boolean(raw.showStats);
50
+ const showUnused = raw.showUnused === false ? false : true;
51
+ const showStats = raw.showStats === false ? false : true;
34
52
  const files = parseList(raw.files);
53
+ const secrets = raw.secrets === false ? false : true;
35
54
  const ignore = parseList(raw.ignore);
36
55
  const ignoreRegex = [];
37
56
  for (const pattern of parseList(raw.ignoreRegex)) {
@@ -47,8 +66,8 @@ export function normalizeOptions(raw) {
47
66
  console.log(chalk.yellow('⚠️ Both --ci and --yes provided; proceeding with --yes.'));
48
67
  }
49
68
  const cwd = process.cwd();
50
- const envFlag = typeof raw.env === 'string' ? path.resolve(cwd, raw.env) : null;
51
- const exampleFlag = typeof raw.example === 'string' ? path.resolve(cwd, raw.example) : null;
69
+ const envFlag = typeof raw.env === 'string' ? path.resolve(cwd, raw.env) : undefined;
70
+ const exampleFlag = typeof raw.example === 'string' ? path.resolve(cwd, raw.example) : undefined;
52
71
  return {
53
72
  checkValues,
54
73
  isCiMode,
@@ -62,11 +81,15 @@ export function normalizeOptions(raw) {
62
81
  ignoreRegex,
63
82
  cwd,
64
83
  only,
84
+ compare,
85
+ noColor,
65
86
  scanUsage,
66
87
  includeFiles,
67
88
  excludeFiles,
68
89
  showUnused,
69
90
  showStats,
70
91
  files,
92
+ secrets,
71
93
  };
72
94
  }
95
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/config/options.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,8 @@
1
1
  export declare const ALLOWED_CATEGORIES: readonly ["missing", "extra", "empty", "mismatch", "duplicate", "gitignore"];
2
2
  export type Category = (typeof ALLOWED_CATEGORIES)[number];
3
+ /** Type representing the options for the comparison
4
+ * These are the options that are processed and validated before being used in the comparison.
5
+ */
3
6
  export type Options = {
4
7
  checkValues: boolean;
5
8
  isCiMode: boolean;
@@ -7,12 +10,13 @@ export type Options = {
7
10
  allowDuplicates: boolean;
8
11
  fix: boolean;
9
12
  json: boolean;
10
- envFlag: string | null;
11
- exampleFlag: string | null;
13
+ envFlag: string | undefined;
14
+ exampleFlag: string | undefined;
12
15
  ignore: string[];
13
16
  ignoreRegex: RegExp[];
14
17
  cwd: string;
15
18
  only?: Category[];
19
+ compare: boolean;
16
20
  scanUsage: boolean;
17
21
  includeFiles: string[];
18
22
  excludeFiles: string[];
@@ -20,7 +24,11 @@ export type Options = {
20
24
  showStats: boolean;
21
25
  files?: string[];
22
26
  noColor?: boolean;
27
+ secrets: boolean;
23
28
  };
29
+ /** Type representing the raw options for the comparison
30
+ * These are the options that are directly passed to the comparison function without any processing or validation.
31
+ */
24
32
  export type RawOptions = {
25
33
  checkValues?: boolean;
26
34
  ci?: boolean;
@@ -33,13 +41,20 @@ export type RawOptions = {
33
41
  ignore?: string | string[];
34
42
  ignoreRegex?: string | string[];
35
43
  only?: string | string[];
44
+ compare?: boolean;
45
+ noColor?: boolean;
36
46
  scanUsage?: boolean;
37
47
  includeFiles?: string | string[];
38
48
  excludeFiles?: string | string[];
39
49
  showUnused?: boolean;
40
50
  showStats?: boolean;
41
51
  files?: string | string[];
52
+ secrets?: boolean;
42
53
  };
54
+ /**
55
+ * Type representing a single entry in the comparison results
56
+ * This entry contains the environment variable and its example value.
57
+ */
43
58
  export type CompareJsonEntry = {
44
59
  env: string;
45
60
  example: string;
@@ -66,3 +81,4 @@ export type CompareJsonEntry = {
66
81
  }>;
67
82
  ok?: boolean;
68
83
  };
84
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ // Allowed categories for comparison
1
2
  export const ALLOWED_CATEGORIES = [
2
3
  'missing',
3
4
  'extra',
@@ -6,3 +7,4 @@ export const ALLOWED_CATEGORIES = [
6
7
  'duplicate',
7
8
  'gitignore',
8
9
  ];
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,SAAS;IACT,OAAO;IACP,OAAO;IACP,UAAU;IACV,WAAW;IACX,WAAW;CACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Calculates the normalized Shannon entropy of a string.
3
+ * Shannon entropy is a measure of the unpredictability or randomness of a string.
4
+ * @param s - The input string.
5
+ * @returns The normalized Shannon entropy (between 0 and 1).
6
+ */
7
+ export declare function shannonEntropyNormalized(s: string): number;
8
+ //# sourceMappingURL=entropy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entropy.d.ts","sourceRoot":"","sources":["../../../src/core/entropy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAa1D"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Calculates the normalized Shannon entropy of a string.
3
+ * Shannon entropy is a measure of the unpredictability or randomness of a string.
4
+ * @param s - The input string.
5
+ * @returns The normalized Shannon entropy (between 0 and 1).
6
+ */
7
+ export function shannonEntropyNormalized(s) {
8
+ if (!s)
9
+ return 0;
10
+ const freq = new Map();
11
+ for (const ch of s)
12
+ freq.set(ch, (freq.get(ch) ?? 0) + 1);
13
+ const len = s.length;
14
+ let H = 0;
15
+ for (const [, c] of freq) {
16
+ const p = c / len;
17
+ H += -p * Math.log2(p);
18
+ }
19
+ // Antag alfabet ~72 tegn (A-Za-z0-9+/_- mv.)
20
+ const maxH = Math.log2(72);
21
+ return Math.min(1, H / maxH);
22
+ }
23
+ //# sourceMappingURL=entropy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entropy.js","sourceRoot":"","sources":["../../../src/core/entropy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,CAAS;IAChD,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACjB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,KAAK,MAAM,EAAE,IAAI,CAAC;QAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC;IACrB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;QAClB,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IACD,6CAA6C;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;AAC/B,CAAC"}
@@ -1 +1,9 @@
1
+ /**
2
+ * Filters out keys that are in the ignore list or match any of the ignore regex patterns.
3
+ * @param keys - The list of keys to filter.
4
+ * @param ignore - The list of keys to ignore.
5
+ * @param ignoreRegex - The list of regex patterns to ignore.
6
+ * @returns The filtered list of keys.
7
+ */
1
8
  export declare function filterIgnoredKeys(keys: string[], ignore: string[], ignoreRegex: RegExp[]): string[];
9
+ //# sourceMappingURL=filterIgnoredKeys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterIgnoredKeys.d.ts","sourceRoot":"","sources":["../../../src/core/filterIgnoredKeys.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,MAAM,EAAE,EAChB,WAAW,EAAE,MAAM,EAAE,GACpB,MAAM,EAAE,CAIV"}
@@ -1,3 +1,11 @@
1
+ /**
2
+ * Filters out keys that are in the ignore list or match any of the ignore regex patterns.
3
+ * @param keys - The list of keys to filter.
4
+ * @param ignore - The list of keys to ignore.
5
+ * @param ignoreRegex - The list of regex patterns to ignore.
6
+ * @returns The filtered list of keys.
7
+ */
1
8
  export function filterIgnoredKeys(keys, ignore, ignoreRegex) {
2
9
  return keys.filter((k) => !ignore.includes(k) && !ignoreRegex.some((rx) => rx.test(k)));
3
10
  }
11
+ //# sourceMappingURL=filterIgnoredKeys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterIgnoredKeys.js","sourceRoot":"","sources":["../../../src/core/filterIgnoredKeys.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAc,EACd,MAAgB,EAChB,WAAqB;IAErB,OAAO,IAAI,CAAC,MAAM,CAChB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CACpE,CAAC;AACJ,CAAC"}
@@ -1,3 +1,11 @@
1
+ /**
2
+ * Applies fixes to the .env and .env.example files based on the detected issues.
3
+ * @param envPath - The path to the .env file.
4
+ * @param examplePath - The path to the .env.example file.
5
+ * @param missingKeys - The list of missing keys to add.
6
+ * @param duplicateKeys - The list of duplicate keys to remove.
7
+ * @returns An object indicating whether changes were made and details of the changes.
8
+ */
1
9
  export declare function applyFixes({ envPath, examplePath, missingKeys, duplicateKeys, }: {
2
10
  envPath: string;
3
11
  examplePath: string;
@@ -11,3 +19,4 @@ export declare function applyFixes({ envPath, examplePath, missingKeys, duplicat
11
19
  addedExample: string[];
12
20
  };
13
21
  };
22
+ //# sourceMappingURL=fixEnv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixEnv.d.ts","sourceRoot":"","sources":["../../../src/core/fixEnv.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,EACzB,OAAO,EACP,WAAW,EACX,WAAW,EACX,aAAa,GACd,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;;;2BAE4B,MAAM,EAAE;kBACjB,MAAM,EAAE;sBACJ,MAAM,EAAE;;EAgE/B"}
@@ -1,4 +1,12 @@
1
1
  import fs from 'fs';
2
+ /**
3
+ * 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.
9
+ */
2
10
  export function applyFixes({ envPath, examplePath, missingKeys, duplicateKeys, }) {
3
11
  const result = {
4
12
  removedDuplicates: [],
@@ -12,9 +20,11 @@ export function applyFixes({ envPath, examplePath, missingKeys, duplicateKeys, }
12
20
  const newLines = [];
13
21
  for (let i = lines.length - 1; i >= 0; i--) {
14
22
  const line = lines[i];
23
+ if (line === undefined)
24
+ continue;
15
25
  const match = line.match(/^\s*([\w.-]+)\s*=/);
16
26
  if (match) {
17
- const key = match[1];
27
+ const key = match[1] || '';
18
28
  if (duplicateKeys.includes(key)) {
19
29
  if (seen.has(key))
20
30
  continue; // skip duplicate
@@ -58,3 +68,4 @@ export function applyFixes({ envPath, examplePath, missingKeys, duplicateKeys, }
58
68
  result.addedExample.length > 0;
59
69
  return { changed, result };
60
70
  }
71
+ //# sourceMappingURL=fixEnv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixEnv.js","sourceRoot":"","sources":["../../../src/core/fixEnv.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export type SecretFinding = {
2
+ file: string;
3
+ line: number;
4
+ kind: 'pattern' | 'entropy';
5
+ message: string;
6
+ snippet: string;
7
+ };
8
+ /**
9
+ * Detects secrets in the source code of a file.
10
+ * @param file - The file path to check.
11
+ * @param source - The source code to scan for secrets.
12
+ * @returns An array of secret findings.
13
+ */
14
+ export declare function detectSecretsInSource(file: string, source: string): SecretFinding[];
15
+ //# sourceMappingURL=secretDetectors.d.ts.map
@@ -0,0 +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;AAsCF;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,aAAa,EAAE,CAyDjB"}
@@ -0,0 +1,90 @@
1
+ import { shannonEntropyNormalized } from './entropy.js';
2
+ // Regular expressions for detecting suspicious keys and provider patterns
3
+ 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
+ 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
+ ];
13
+ const LONG_LITERAL = /["'`]{1}([A-Za-z0-9+/_\-]{24,})["'`]{1}/g;
14
+ function looksHarmlessLiteral(s) {
15
+ return /^https?:\/\//i.test(s) || /\S+@\S+/.test(s);
16
+ }
17
+ /**
18
+ * Checks if a file path is probably a test path.
19
+ * This is determined by looking for common test folder names and file extensions.
20
+ * @param p - The file path to check.
21
+ * @returns True if the file path is probably a test path, false otherwise.
22
+ */
23
+ function isProbablyTestPath(p) {
24
+ return (/\b(__tests__|__mocks__|fixtures|sandbox|samples)\b/i.test(p) ||
25
+ /\.(spec|test)\.[jt]sx?$/.test(p));
26
+ }
27
+ // Threshold is the value between 0 and 1 that determines the sensitivity of the detection.
28
+ const DEFAULT_SECRET_THRESHOLD = 0.9;
29
+ /**
30
+ * Detects secrets in the source code of a file.
31
+ * @param file - The file path to check.
32
+ * @param source - The source code to scan for secrets.
33
+ * @returns An array of secret findings.
34
+ */
35
+ export function detectSecretsInSource(file, source) {
36
+ const threshold = isProbablyTestPath(file) ? 0.95 : DEFAULT_SECRET_THRESHOLD;
37
+ const findings = [];
38
+ const lines = source.split(/\r?\n/);
39
+ for (let i = 0; i < lines.length; i++) {
40
+ const lineNo = i + 1;
41
+ const line = lines[i] || '';
42
+ // 1) Suspicious key literal assignments
43
+ if (SUSPICIOUS_KEYS.test(line)) {
44
+ const m = line.match(/=\s*["'`](.+?)["'`]/);
45
+ if (m && m[1] && !looksHarmlessLiteral(m[1]) && m[1].length >= 12) {
46
+ findings.push({
47
+ file,
48
+ line: lineNo,
49
+ kind: 'pattern',
50
+ message: 'matches password/secret/token-like literal assignment',
51
+ snippet: line.trim().slice(0, 180),
52
+ });
53
+ }
54
+ }
55
+ // 2) Provider patterns
56
+ for (const rx of PROVIDER_PATTERNS) {
57
+ if (rx.test(line)) {
58
+ findings.push({
59
+ file,
60
+ line: lineNo,
61
+ kind: 'pattern',
62
+ message: 'matches known provider key pattern',
63
+ snippet: line.trim().slice(0, 180),
64
+ });
65
+ }
66
+ }
67
+ // 3) High-entropy long literals
68
+ LONG_LITERAL.lastIndex = 0;
69
+ let lm;
70
+ while ((lm = LONG_LITERAL.exec(line))) {
71
+ const literal = lm[1] || '';
72
+ if (looksHarmlessLiteral(literal))
73
+ continue;
74
+ if (literal.length < 32)
75
+ continue; // ekstra støjfilter
76
+ const ent = shannonEntropyNormalized(literal);
77
+ if (ent >= threshold) {
78
+ findings.push({
79
+ file,
80
+ line: lineNo,
81
+ kind: 'entropy',
82
+ message: `found high-entropy string (len ${literal.length}, H≈${ent.toFixed(2)})`,
83
+ snippet: line.trim().slice(0, 180),
84
+ });
85
+ }
86
+ }
87
+ }
88
+ return findings;
89
+ }
90
+ //# sourceMappingURL=secretDetectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secretDetectors.js","sourceRoot":"","sources":["../../../src/core/secretDetectors.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,3 @@
1
1
  export { parseEnvFile } from './lib/parseEnv.js';
2
- export { diffEnv, DiffResult } from './lib/diffEnv.js';
2
+ export { diffEnv, type DiffResult } from './lib/diffEnv.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC"}