dotenv-diff 2.2.5 → 2.2.7

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 (79) hide show
  1. package/README.md +11 -0
  2. package/dist/src/cli/program.d.ts +4 -0
  3. package/dist/src/cli/program.d.ts.map +1 -1
  4. package/dist/src/cli/program.js +4 -0
  5. package/dist/src/cli/program.js.map +1 -1
  6. package/dist/src/cli/run.d.ts.map +1 -1
  7. package/dist/src/cli/run.js +137 -94
  8. package/dist/src/cli/run.js.map +1 -1
  9. package/dist/src/commands/compare.d.ts.map +1 -1
  10. package/dist/src/commands/compare.js +2 -2
  11. package/dist/src/commands/compare.js.map +1 -1
  12. package/dist/src/commands/scanUsage.d.ts +1 -57
  13. package/dist/src/commands/scanUsage.d.ts.map +1 -1
  14. package/dist/src/commands/scanUsage.js +8 -225
  15. package/dist/src/commands/scanUsage.js.map +1 -1
  16. package/dist/src/config/loadConfig.d.ts +2 -0
  17. package/dist/src/config/loadConfig.d.ts.map +1 -0
  18. package/dist/src/config/types.d.ts +100 -0
  19. package/dist/src/config/types.d.ts.map +1 -1
  20. package/dist/src/config/types.js +1 -0
  21. package/dist/src/config/types.js.map +1 -1
  22. package/dist/src/core/compareScan.d.ts +9 -0
  23. package/dist/src/core/compareScan.d.ts.map +1 -0
  24. package/dist/src/core/compareScan.js +18 -0
  25. package/dist/src/core/compareScan.js.map +1 -0
  26. package/dist/src/core/determineComparisonFile.d.ts +11 -0
  27. package/dist/src/core/determineComparisonFile.d.ts.map +1 -0
  28. package/dist/src/core/determineComparisonFile.js +34 -0
  29. package/dist/src/core/determineComparisonFile.js.map +1 -0
  30. package/dist/src/core/diffEnv.d.ts +19 -0
  31. package/dist/src/core/diffEnv.d.ts.map +1 -0
  32. package/dist/src/core/diffEnv.js +31 -0
  33. package/dist/src/core/diffEnv.js.map +1 -0
  34. package/dist/src/core/helpers/resolveFromCwd.d.ts +8 -0
  35. package/dist/src/core/helpers/resolveFromCwd.d.ts.map +1 -0
  36. package/dist/src/core/helpers/resolveFromCwd.js +9 -0
  37. package/dist/src/core/helpers/resolveFromCwd.js.map +1 -0
  38. package/dist/src/core/parseEnv.d.ts +11 -0
  39. package/dist/src/core/parseEnv.d.ts.map +1 -0
  40. package/dist/src/core/parseEnv.js +26 -0
  41. package/dist/src/core/parseEnv.js.map +1 -0
  42. package/dist/src/core/patterns.d.ts +32 -0
  43. package/dist/src/core/patterns.d.ts.map +1 -0
  44. package/dist/src/core/patterns.js +69 -0
  45. package/dist/src/core/patterns.js.map +1 -0
  46. package/dist/src/core/scanFile.d.ts +10 -0
  47. package/dist/src/core/scanFile.d.ts.map +1 -0
  48. package/dist/src/core/scanFile.js +41 -0
  49. package/dist/src/core/scanFile.js.map +1 -0
  50. package/dist/src/core/scanJsonOutput.d.ts +11 -0
  51. package/dist/src/core/scanJsonOutput.d.ts.map +1 -0
  52. package/dist/src/core/scanJsonOutput.js +56 -0
  53. package/dist/src/core/scanJsonOutput.js.map +1 -0
  54. package/dist/src/core/secretDetectors.d.ts.map +1 -1
  55. package/dist/src/core/secretDetectors.js +33 -15
  56. package/dist/src/core/secretDetectors.js.map +1 -1
  57. package/dist/src/index.d.ts +2 -2
  58. package/dist/src/index.d.ts.map +1 -1
  59. package/dist/src/index.js +2 -3
  60. package/dist/src/index.js.map +1 -1
  61. package/dist/src/services/codeBaseScanner.d.ts +1 -40
  62. package/dist/src/services/codeBaseScanner.d.ts.map +1 -1
  63. package/dist/src/services/codeBaseScanner.js +4 -315
  64. package/dist/src/services/codeBaseScanner.js.map +1 -1
  65. package/dist/src/services/ensureFilesOrPrompt.d.ts +19 -0
  66. package/dist/src/services/ensureFilesOrPrompt.d.ts.map +1 -0
  67. package/dist/src/services/ensureFilesOrPrompt.js +74 -0
  68. package/dist/src/services/ensureFilesOrPrompt.js.map +1 -0
  69. package/dist/src/services/fileWalker.d.ts +62 -0
  70. package/dist/src/services/fileWalker.d.ts.map +1 -0
  71. package/dist/src/services/fileWalker.js +238 -0
  72. package/dist/src/services/fileWalker.js.map +1 -0
  73. package/dist/src/services/scanOutputToConsole.d.ts +12 -0
  74. package/dist/src/services/scanOutputToConsole.d.ts.map +1 -0
  75. package/dist/src/services/scanOutputToConsole.js +166 -0
  76. package/dist/src/services/scanOutputToConsole.js.map +1 -0
  77. package/dist/types/scanUsage.d.ts +43 -0
  78. package/dist/types/scanUsage.d.ts.map +1 -0
  79. package/package.json +3 -3
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Parses a `.env` file and returns an object with key-value pairs.
3
+ *
4
+ * @param path - The file path to the `.env` file.
5
+ * @returns A record object representing parsed environment variables.
6
+ *
7
+ * Lines that are empty or start with `#` (comments) are ignored.
8
+ * Multi-line or quoted values are not supported.
9
+ */
10
+ export declare function parseEnvFile(path: string): Record<string, string>;
11
+ //# sourceMappingURL=parseEnv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseEnv.d.ts","sourceRoot":"","sources":["../../../src/core/parseEnv.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiBjE"}
@@ -0,0 +1,26 @@
1
+ import fs from 'fs';
2
+ /**
3
+ * Parses a `.env` file and returns an object with key-value pairs.
4
+ *
5
+ * @param path - The file path to the `.env` file.
6
+ * @returns A record object representing parsed environment variables.
7
+ *
8
+ * Lines that are empty or start with `#` (comments) are ignored.
9
+ * Multi-line or quoted values are not supported.
10
+ */
11
+ export function parseEnvFile(path) {
12
+ const content = fs.readFileSync(path, 'utf-8');
13
+ const lines = content.split('\n');
14
+ const result = {};
15
+ for (const line of lines) {
16
+ const trimmed = line.trim();
17
+ if (!trimmed || trimmed.startsWith('#'))
18
+ continue;
19
+ const [key, ...rest] = trimmed.split('=');
20
+ if (!key)
21
+ continue;
22
+ result[key.trim()] = rest.join('=').trim();
23
+ }
24
+ return result;
25
+ }
26
+ //# sourceMappingURL=parseEnv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseEnv.js","sourceRoot":"","sources":["../../../src/core/parseEnv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,MAAM,MAAM,GAA2B,EAAE,CAAC;IAE1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAElD,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG;YAAE,SAAS;QAEnB,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,32 @@
1
+ export declare const ENV_PATTERNS: ({
2
+ name: "process.env";
3
+ regex: RegExp;
4
+ frameworks: string[];
5
+ } | {
6
+ name: "import.meta.env";
7
+ regex: RegExp;
8
+ frameworks: string[];
9
+ } | {
10
+ name: "sveltekit";
11
+ regex: RegExp;
12
+ frameworks: string[];
13
+ } | {
14
+ name: "deno";
15
+ regex: RegExp;
16
+ frameworks: string[];
17
+ } | {
18
+ name: "next";
19
+ regex: RegExp;
20
+ frameworks: string[];
21
+ } | {
22
+ name: "nuxt";
23
+ regex: RegExp;
24
+ frameworks: string[];
25
+ } | {
26
+ name: "php";
27
+ regex: RegExp;
28
+ frameworks: string[];
29
+ })[];
30
+ export declare const DEFAULT_INCLUDE_EXTENSIONS: string[];
31
+ export declare const DEFAULT_EXCLUDE_PATTERNS: string[];
32
+ //# sourceMappingURL=patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../../src/core/patterns.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAqCxB,CAAC;AAGF,eAAO,MAAM,0BAA0B,UAStC,CAAC;AAGF,eAAO,MAAM,wBAAwB,UAiBpC,CAAC"}
@@ -0,0 +1,69 @@
1
+ // Framework-specific patterns for finding environment variable usage
2
+ export const ENV_PATTERNS = [
3
+ {
4
+ name: 'process.env',
5
+ regex: /process\.env\.([A-Z_][A-Z0-9_]*)/g,
6
+ frameworks: ['node', 'next', 'general'],
7
+ },
8
+ {
9
+ name: 'import.meta.env',
10
+ regex: /import\.meta\.env\.([A-Z_][A-Z0-9_]*)/g,
11
+ frameworks: ['vite', 'svelte', 'vue'],
12
+ },
13
+ {
14
+ name: 'sveltekit',
15
+ regex: /\$env\/(?:static|dynamic)\/(?:private|public)\/([A-Z_][A-Z0-9_]*)/g,
16
+ frameworks: ['sveltekit'],
17
+ },
18
+ {
19
+ name: 'deno',
20
+ regex: /Deno\.env\.get\(['"`]([A-Z_][A-Z0-9_]*)['"`]\)/g,
21
+ frameworks: ['deno'],
22
+ },
23
+ {
24
+ name: 'next',
25
+ regex: /process\.env\.(NEXT_PUBLIC_[A-Z_][A-Z0-9_]*)/g,
26
+ frameworks: ['next'],
27
+ },
28
+ {
29
+ name: 'nuxt',
30
+ regex: /(?:\$config|useRuntimeConfig\(\))\.([A-Z_][A-Z0-9_]*)/g,
31
+ frameworks: ['nuxt'],
32
+ },
33
+ {
34
+ name: 'php',
35
+ regex: /(getenv\(['"`]([A-Z_][A-Z0-9_]*)['"`]\)|\$_ENV\[['"`]([A-Z_][A-Z0-9_]*)['"`]\])/g,
36
+ frameworks: ['php'],
37
+ },
38
+ ];
39
+ // Default file extensions to include in scans
40
+ export const DEFAULT_INCLUDE_EXTENSIONS = [
41
+ '.js',
42
+ '.ts',
43
+ '.jsx',
44
+ '.tsx',
45
+ '.vue',
46
+ '.svelte',
47
+ '.mjs',
48
+ '.cjs',
49
+ ];
50
+ // Default patterns to exclude from scans
51
+ export const DEFAULT_EXCLUDE_PATTERNS = [
52
+ 'node_modules',
53
+ '.sveltekit',
54
+ '.svelte-kit',
55
+ '_actions',
56
+ 'dist',
57
+ 'build',
58
+ '.next',
59
+ '.nuxt',
60
+ 'coverage',
61
+ '.git',
62
+ '.vscode',
63
+ '.idea',
64
+ '.test.',
65
+ '.spec.',
66
+ '__tests__',
67
+ '__mocks__',
68
+ ];
69
+ //# sourceMappingURL=patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../../src/core/patterns.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B;QACE,IAAI,EAAE,aAAsB;QAC5B,KAAK,EAAE,mCAAmC;QAC1C,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC;KACxC;IACD;QACE,IAAI,EAAE,iBAA0B;QAChC,KAAK,EAAE,wCAAwC;QAC/C,UAAU,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC;KACtC;IACD;QACE,IAAI,EAAE,WAAoB;QAC1B,KAAK,EAAE,oEAAoE;QAC3E,UAAU,EAAE,CAAC,WAAW,CAAC;KAC1B;IACD;QACE,IAAI,EAAE,MAAe;QACrB,KAAK,EAAE,iDAAiD;QACxD,UAAU,EAAE,CAAC,MAAM,CAAC;KACrB;IACD;QACE,IAAI,EAAE,MAAe;QACrB,KAAK,EAAE,+CAA+C;QACtD,UAAU,EAAE,CAAC,MAAM,CAAC;KACrB;IACD;QACE,IAAI,EAAE,MAAe;QACrB,KAAK,EAAE,wDAAwD;QAC/D,UAAU,EAAE,CAAC,MAAM,CAAC;KACrB;IACD;QACE,IAAI,EAAE,KAAc;QACpB,KAAK,EACH,kFAAkF;QACpF,UAAU,EAAE,CAAC,KAAK,CAAC;KACpB;CACF,CAAC;AAEF,8CAA8C;AAC9C,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,SAAS;IACT,MAAM;IACN,MAAM;CACP,CAAC;AAEF,yCAAyC;AACzC,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,cAAc;IACd,YAAY;IACZ,aAAa;IACb,UAAU;IACV,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,UAAU;IACV,MAAM;IACN,SAAS;IACT,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,WAAW;CACZ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { EnvUsage, ScanOptions } from '../config/types.js';
2
+ /**
3
+ * Scans a file for environment variable usage.
4
+ * @param filePath - The path to the file being scanned.
5
+ * @param content - The content of the file.
6
+ * @param opts - The scan options.
7
+ * @returns An array of environment variable usages found in the file.
8
+ */
9
+ export declare function scanFile(filePath: string, content: string, opts: ScanOptions): Promise<EnvUsage[]>;
10
+ //# sourceMappingURL=scanFile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanFile.d.ts","sourceRoot":"","sources":["../../../src/core/scanFile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGhE;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAmCrB"}
@@ -0,0 +1,41 @@
1
+ import path from 'path';
2
+ import { ENV_PATTERNS } from './patterns.js';
3
+ /**
4
+ * Scans a file for environment variable usage.
5
+ * @param filePath - The path to the file being scanned.
6
+ * @param content - The content of the file.
7
+ * @param opts - The scan options.
8
+ * @returns An array of environment variable usages found in the file.
9
+ */
10
+ export async function scanFile(filePath, content, opts) {
11
+ const usages = [];
12
+ const lines = content.split('\n');
13
+ const relativePath = path.relative(opts.cwd, filePath);
14
+ for (const pattern of ENV_PATTERNS) {
15
+ let match;
16
+ const regex = new RegExp(pattern.regex.source, pattern.regex.flags);
17
+ while ((match = regex.exec(content)) !== null) {
18
+ const variable = match[1];
19
+ if (!variable)
20
+ continue;
21
+ const matchIndex = match.index;
22
+ // Find line and column
23
+ const beforeMatch = content.substring(0, matchIndex);
24
+ const lineNumber = beforeMatch.split('\n').length;
25
+ const lastNewlineIndex = beforeMatch.lastIndexOf('\n');
26
+ const column = matchIndex - lastNewlineIndex;
27
+ // Get the context (the actual line)
28
+ const contextLine = lines[lineNumber - 1]?.trim() || '';
29
+ usages.push({
30
+ variable,
31
+ file: relativePath,
32
+ line: lineNumber,
33
+ column,
34
+ pattern: pattern.name,
35
+ context: contextLine,
36
+ });
37
+ }
38
+ }
39
+ return usages;
40
+ }
41
+ //# sourceMappingURL=scanFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanFile.js","sourceRoot":"","sources":["../../../src/core/scanFile.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,QAAgB,EAChB,OAAe,EACf,IAAiB;IAEjB,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAEvD,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC;QACV,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEpE,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,QAAQ;gBAAE,SAAS;YACxB,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;YAE/B,uBAAuB;YACvB,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;YAClD,MAAM,gBAAgB,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,UAAU,GAAG,gBAAgB,CAAC;YAE7C,oCAAoC;YACpC,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAExD,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ;gBACR,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,UAAU;gBAChB,MAAM;gBACN,OAAO,EAAE,OAAO,CAAC,IAAI;gBACrB,OAAO,EAAE,WAAW;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { ScanUsageOptions, ScanResult, ScanJsonEntry } from '../config/types.js';
2
+ /**
3
+ * Creates a JSON output for the scan results.
4
+ * @param scanResult - The result of the scan.
5
+ * @param opts - The scan options.
6
+ * @param comparedAgainst - The file being compared against.
7
+ * @param totalEnvVariables - The total number of environment variables.
8
+ * @returns The JSON output.
9
+ */
10
+ export declare function createJsonOutput(scanResult: ScanResult, opts: ScanUsageOptions, comparedAgainst: string, totalEnvVariables: number): ScanJsonEntry;
11
+ //# sourceMappingURL=scanJsonOutput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanJsonOutput.d.ts","sourceRoot":"","sources":["../../../src/core/scanJsonOutput.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,UAAU,EAEV,aAAa,EACd,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,gBAAgB,EACtB,eAAe,EAAE,MAAM,EACvB,iBAAiB,EAAE,MAAM,GACxB,aAAa,CAoDf"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Creates a JSON output for the scan results.
3
+ * @param scanResult - The result of the scan.
4
+ * @param opts - The scan options.
5
+ * @param comparedAgainst - The file being compared against.
6
+ * @param totalEnvVariables - The total number of environment variables.
7
+ * @returns The JSON output.
8
+ */
9
+ export function createJsonOutput(scanResult, opts, comparedAgainst, totalEnvVariables) {
10
+ // Group usages by variable for missing variables
11
+ const missingGrouped = scanResult.missing.map((variable) => ({
12
+ variable,
13
+ usages: scanResult.used
14
+ .filter((u) => u.variable === variable)
15
+ .map((u) => ({
16
+ file: u.file,
17
+ line: u.line,
18
+ pattern: u.pattern,
19
+ context: u.context,
20
+ })),
21
+ }));
22
+ const output = {
23
+ stats: scanResult.stats,
24
+ missing: missingGrouped,
25
+ unused: scanResult.unused,
26
+ };
27
+ if (scanResult.secrets?.length) {
28
+ output.secrets = scanResult.secrets.map((s) => ({
29
+ file: s.file,
30
+ line: s.line,
31
+ message: s.message,
32
+ snippet: s.snippet,
33
+ }));
34
+ }
35
+ // Add duplicates if found
36
+ if (scanResult.duplicates) {
37
+ output.duplicates = scanResult.duplicates;
38
+ }
39
+ // Add comparison info if we compared against a file
40
+ if (comparedAgainst) {
41
+ output.comparedAgainst = comparedAgainst;
42
+ output.totalEnvVariables = totalEnvVariables;
43
+ }
44
+ // Optionally include all usages
45
+ if (opts.showStats) {
46
+ output.allUsages = scanResult.used.map((u) => ({
47
+ variable: u.variable,
48
+ file: u.file,
49
+ line: u.line,
50
+ pattern: u.pattern,
51
+ context: u.context,
52
+ }));
53
+ }
54
+ return output;
55
+ }
56
+ //# sourceMappingURL=scanJsonOutput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanJsonOutput.js","sourceRoot":"","sources":["../../../src/core/scanJsonOutput.ts"],"names":[],"mappings":"AAOA;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAC9B,UAAsB,EACtB,IAAsB,EACtB,eAAuB,EACvB,iBAAyB;IAEzB,iDAAiD;IACjD,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAgB,EAAE,EAAE,CAAC,CAAC;QACnE,QAAQ;QACR,MAAM,EAAE,UAAU,CAAC,IAAI;aACpB,MAAM,CAAC,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC;aAChD,GAAG,CAAC,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;YACrB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,OAAO,EAAE,CAAC,CAAC,OAAO;SACnB,CAAC,CAAC;KACN,CAAC,CAAC,CAAC;IAEJ,MAAM,MAAM,GAAkB;QAC5B,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,OAAO,EAAE,cAAc;QACvB,MAAM,EAAE,UAAU,CAAC,MAAM;KAC1B,CAAC;IAEF,IAAI,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAC9B,MAAwB,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjE,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,OAAO,EAAE,CAAC,CAAC,OAAO;SACnB,CAAC,CAAC,CAAC;IACN,CAAC;IAED,0BAA0B;IAC1B,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC;IAC5C,CAAC;IAED,oDAAoD;IACpD,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,CAAC,eAAe,GAAG,eAAe,CAAC;QACzC,MAAM,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC/C,CAAC;IAED,gCAAgC;IAChC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,MAAM,CAAC,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;YACvD,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,OAAO,EAAE,CAAC,CAAC,OAAO;SACnB,CAAC,CAAC,CAAC;IACN,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -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;AAiGF;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,aAAa,EAAE,CA8FjB"}
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;AAoHF;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,aAAa,EAAE,CAmGjB"}
@@ -17,25 +17,39 @@ const PROVIDER_PATTERNS = [
17
17
  ];
18
18
  const LONG_LITERAL = /["'`]{1}([A-Za-z0-9+/_\-]{24,})["'`]{1}/g;
19
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
+ /**
29
+ * Checks if a line has an ignore comment
30
+ * @param line - The line to check
31
+ * @returns True if the line should be ignored
32
+ */
33
+ function hasIgnoreComment(line) {
34
+ return (/\/\/\s*dotenv-diff-ignore/.test(line) ||
35
+ /\/\*\s*dotenv-diff-ignore\s*\*\//.test(line));
36
+ }
20
37
  /**
21
38
  * Checks if a string looks like a harmless literal.
22
39
  * @param s - The string to check.
23
40
  * @returns True if the string looks harmless, false otherwise.
24
41
  */
25
42
  function looksHarmlessLiteral(s) {
26
- return (
27
- // Remove localhost check from here - we want to flag localhost URLs now
28
- /^https?:\/\/(?!localhost)/i.test(s) ||
29
- /\S+@\S+/.test(s) ||
30
- /^data:[a-z]+\/[a-z0-9.+-]+;base64,/i.test(s) ||
31
- /^\.{0,2}\//.test(s) ||
32
- /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(s) ||
43
+ return (/\S+@\S+/.test(s) || // emails
44
+ /^data:[a-z]+\/[a-z0-9.+-]+;base64,/i.test(s) || // data URIs
45
+ /^\.{0,2}\//.test(s) || // relative paths
46
+ /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(s) || // UUID
33
47
  /^[0-9a-f]{32,128}$/i.test(s) || // MD5, SHA1, SHA256, etc.
34
- /^[A-Za-z0-9+/_\-]{16,20}={0,2}$/.test(s) ||
35
- /^[A-Za-z0-9+/_\-]*(_PUBLIC|_PRIVATE|VITE_|NEXT_PUBLIC|VUE_)[A-Za-z0-9+/_\-]*={0,2}$/.test(s) ||
36
- /^[MmZzLlHhVvCcSsQqTtAa][0-9eE+.\- ,MmZzLlHhVvCcSsQqTtAa]*$/.test(s) ||
37
- /<svg[\s\S]*?>[\s\S]*?<\/svg>/i.test(s) || // Ignore SVG markup
38
- /xmlns=["']http:\/\/www\.w3\.org\/2000\/svg["']/i.test(s) // Ignore SVG namespace
48
+ /^[A-Za-z0-9+/_\-]{16,20}={0,2}$/.test(s) || // short base64
49
+ /^[A-Za-z0-9+/_\-]*(_PUBLIC|_PRIVATE|VITE_|NEXT_PUBLIC|VUE_)[A-Za-z0-9+/_\-]*={0,2}$/.test(s) || // env-like keys
50
+ /^[MmZzLlHhVvCcSsQqTtAa][0-9eE+.\- ,MmZzLlHhVvCcSsQqTtAa]*$/.test(s) || // SVG path data
51
+ /<svg[\s\S]*?>[\s\S]*?<\/svg>/i.test(s) || // SVG markup
52
+ HARMLESS_URLS.some((rx) => rx.test(s)) // Allowlisted URLs
39
53
  );
40
54
  }
41
55
  /**
@@ -91,17 +105,21 @@ export function detectSecretsInSource(file, source) {
91
105
  // Skip comments
92
106
  if (/^\s*\/\//.test(line))
93
107
  continue;
108
+ // Check if line has ignore comment
109
+ if (hasIgnoreComment(line))
110
+ continue;
94
111
  // Check for HTTPS URLs
95
112
  HTTPS_PATTERN.lastIndex = 0;
96
113
  let httpsMatch;
97
114
  while ((httpsMatch = HTTPS_PATTERN.exec(line))) {
98
- const url = httpsMatch[1];
99
- if (!url?.includes('localhost') && url !== 'http://www.w3.org/2000/svg') {
115
+ const url = httpsMatch[1] || '';
116
+ if (url && !looksHarmlessLiteral(url)) {
117
+ const protocol = url.startsWith('https') ? 'HTTPS' : 'HTTP';
100
118
  findings.push({
101
119
  file,
102
120
  line: lineNo,
103
121
  kind: 'pattern',
104
- message: 'HTTPS URL detected - consider using environment variable',
122
+ message: `${protocol} URL detected consider moving to an environment variable`,
105
123
  snippet: line.trim().slice(0, 180),
106
124
  });
107
125
  }
@@ -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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"}
@@ -1,3 +1,3 @@
1
- export { parseEnvFile } from './lib/parseEnv.js';
2
- export { diffEnv, type DiffResult } from './lib/diffEnv.js';
1
+ export { parseEnvFile } from './core/parseEnv.js';
2
+ export { diffEnv, type DiffResult } from './core/diffEnv.js';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/src/index.js CHANGED
@@ -1,4 +1,3 @@
1
- export { parseEnvFile } from './lib/parseEnv.js';
2
- export { diffEnv } from './lib/diffEnv.js';
3
- process.env.API_KEY = 'sds';
1
+ export { parseEnvFile } from './core/parseEnv.js';
2
+ export { diffEnv } from './core/diffEnv.js';
4
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAmB,MAAM,kBAAkB,CAAC;AAE5D,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAmB,MAAM,mBAAmB,CAAC"}
@@ -1,47 +1,8 @@
1
- import { type SecretFinding } from '../core/secretDetectors.js';
2
- export interface EnvUsage {
3
- variable: string;
4
- file: string;
5
- line: number;
6
- column: number;
7
- pattern: 'process.env' | 'import.meta.env' | 'sveltekit' | 'deno' | 'next' | 'nuxt' | 'php';
8
- context: string;
9
- }
10
- export interface ScanOptions {
11
- cwd: string;
12
- include: string[];
13
- exclude: string[];
14
- ignore: string[];
15
- ignoreRegex: RegExp[];
16
- files?: string[];
17
- secrets?: boolean;
18
- }
19
- export interface ScanResult {
20
- used: EnvUsage[];
21
- missing: string[];
22
- unused: string[];
23
- stats: {
24
- filesScanned: number;
25
- totalUsages: number;
26
- uniqueVariables: number;
27
- };
28
- secrets: SecretFinding[];
29
- duplicates: {
30
- env?: Array<{
31
- key: string;
32
- count: number;
33
- }>;
34
- example?: Array<{
35
- key: string;
36
- count: number;
37
- }>;
38
- };
39
- }
1
+ import type { ScanOptions, ScanResult } from '../config/types.js';
40
2
  /**
41
3
  * Scans the codebase for environment variable usage based on the provided options.
42
4
  * @param opts - Options for scanning the codebase.
43
5
  * @returns A promise that resolves to the scan result containing used, missing, and unused variables.
44
6
  */
45
7
  export declare function scanCodebase(opts: ScanOptions): Promise<ScanResult>;
46
- export declare function compareWithEnvFiles(scanResult: ScanResult, envVariables: Record<string, string | undefined>): ScanResult;
47
8
  //# sourceMappingURL=codeBaseScanner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"codeBaseScanner.d.ts","sourceRoot":"","sources":["../../../src/services/codeBaseScanner.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EACH,aAAa,GACb,iBAAiB,GACjB,WAAW,GACX,MAAM,GACN,MAAM,GACN,MAAM,GACN,KAAK,CAAC;IACV,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE;QACL,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,UAAU,EAAE;QACV,GAAG,CAAC,EAAE,KAAK,CAAC;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,EAAE,KAAK,CAAC;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACjD,CAAC;CACH;AAwED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAyDzE;AA2RD,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAC/C,UAAU,CAYZ"}
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,CAwDzE"}