@danielszlaski/envguard 0.1.3 → 0.1.5

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 (43) hide show
  1. package/.envguardrc.example.json +1 -0
  2. package/.envguardrc.json +16 -0
  3. package/.github/FUNDING.yml +15 -0
  4. package/LICENSE +1 -1
  5. package/README.md +285 -10
  6. package/dist/analyzer/envAnalyzer.d.ts +8 -2
  7. package/dist/analyzer/envAnalyzer.d.ts.map +1 -1
  8. package/dist/analyzer/envAnalyzer.js +22 -8
  9. package/dist/analyzer/envAnalyzer.js.map +1 -1
  10. package/dist/cli.js +58 -3
  11. package/dist/cli.js.map +1 -1
  12. package/dist/commands/fix.d.ts.map +1 -1
  13. package/dist/commands/fix.js +32 -7
  14. package/dist/commands/fix.js.map +1 -1
  15. package/dist/commands/install-hook.d.ts +18 -0
  16. package/dist/commands/install-hook.d.ts.map +1 -0
  17. package/dist/commands/install-hook.js +148 -0
  18. package/dist/commands/install-hook.js.map +1 -0
  19. package/dist/commands/scan.d.ts +1 -0
  20. package/dist/commands/scan.d.ts.map +1 -1
  21. package/dist/commands/scan.js +150 -41
  22. package/dist/commands/scan.js.map +1 -1
  23. package/dist/config/configLoader.d.ts +6 -0
  24. package/dist/config/configLoader.d.ts.map +1 -1
  25. package/dist/config/configLoader.js +1 -0
  26. package/dist/config/configLoader.js.map +1 -1
  27. package/dist/scanner/codeScanner.d.ts +5 -2
  28. package/dist/scanner/codeScanner.d.ts.map +1 -1
  29. package/dist/scanner/codeScanner.js +72 -25
  30. package/dist/scanner/codeScanner.js.map +1 -1
  31. package/dist/types.d.ts +6 -1
  32. package/dist/types.d.ts.map +1 -1
  33. package/package.json +1 -1
  34. package/src/analyzer/envAnalyzer.ts +27 -10
  35. package/src/cli.ts +62 -3
  36. package/src/commands/fix.ts +40 -9
  37. package/src/commands/install-hook.ts +128 -0
  38. package/src/commands/scan.ts +168 -47
  39. package/src/config/configLoader.ts +8 -0
  40. package/src/scanner/codeScanner.ts +97 -28
  41. package/src/types.ts +3 -1
  42. package/test-project/src/lambda2/handler2.js +1 -1
  43. package/test-project/.envguardrc.json +0 -7
@@ -1 +1 @@
1
- {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,12 @@ export interface EnvGuardConfig {
12
12
  * Enable strict mode by default
13
13
  */
14
14
  strict?: boolean;
15
+ /**
16
+ * Detect fallback patterns in code (||, ??, conditionals, etc.)
17
+ * When enabled, variables with fallbacks are treated as warnings instead of errors
18
+ * Default: true
19
+ */
20
+ detectFallbacks?: boolean;
15
21
  }
16
22
  /**
17
23
  * Load EnvGuard configuration from various sources
@@ -1 +1 @@
1
- {"version":3,"file":"configLoader.d.ts","sourceRoot":"","sources":["../../src/config/configLoader.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAEtB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAcD;;;GAGG;AACH,qBAAa,YAAY;IACvB;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc;IAuDlD;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAwB7B;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO;CAGzE"}
1
+ {"version":3,"file":"configLoader.d.ts","sourceRoot":"","sources":["../../src/config/configLoader.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAEtB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAeD;;;GAGG;AACH,qBAAa,YAAY;IACvB;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc;IAuDlD;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAwB7B;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO;CAGzE"}
@@ -40,6 +40,7 @@ const DEFAULT_CONFIG = {
40
40
  ignoreVars: [],
41
41
  exclude: [],
42
42
  strict: false,
43
+ detectFallbacks: true,
43
44
  };
44
45
  const CONFIG_FILE_NAMES = [
45
46
  '.envguardrc.json',
@@ -1 +1 @@
1
- {"version":3,"file":"configLoader.js","sourceRoot":"","sources":["../../src/config/configLoader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"configLoader.js","sourceRoot":"","sources":["../../src/config/configLoader.ts"],"names":[],"mappings":"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"}
@@ -3,8 +3,11 @@ export declare class CodeScanner {
3
3
  private excludePatterns;
4
4
  private serverlessParser;
5
5
  constructor(rootDir: string, excludePatterns?: string[]);
6
- scan(): Promise<Map<string, string[]>>;
7
- scanFile(filePath: string): Promise<Set<string>>;
6
+ scan(): Promise<Map<string, {
7
+ locations: string[];
8
+ hasFallback: boolean;
9
+ }>>;
10
+ scanFile(filePath: string): Promise<Map<string, boolean>>;
8
11
  findEnvFiles(): Promise<string[]>;
9
12
  findServerlessFiles(): Promise<string[]>;
10
13
  scanServerlessFile(filePath: string): Map<string, any>;
@@ -1 +1 @@
1
- {"version":3,"file":"codeScanner.d.ts","sourceRoot":"","sources":["../../src/scanner/codeScanner.ts"],"names":[],"mappings":"AAKA,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAW;IAClC,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,OAAO,EAAE,MAAM,EAAE,eAAe,GAAE,MAAM,EAA8C;IAM5F,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAqCtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAwChD,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAUjC,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAU9C,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;IAIhD,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;CA8BrE"}
1
+ {"version":3,"file":"codeScanner.d.ts","sourceRoot":"","sources":["../../src/scanner/codeScanner.ts"],"names":[],"mappings":"AAOA,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAW;IAClC,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,OAAO,EAAE,MAAM,EAAE,eAAe,GAAE,MAAM,EAA8C;IAM5F,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IA6C3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAuFzD,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAcjC,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAc9C,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;IAIhD,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;CAkCrE"}
@@ -47,19 +47,24 @@ class CodeScanner {
47
47
  async scan() {
48
48
  const envVars = new Map();
49
49
  // Scan for JavaScript/TypeScript files
50
+ // Handle both simple names (e.g., 'node_modules') and glob patterns (e.g., '**/tmp/**')
51
+ const ignorePatterns = this.excludePatterns.map(p => p.includes('*') ? p : `**/${p}/**`);
50
52
  const files = await (0, glob_1.glob)('**/*.{js,ts,jsx,tsx,mjs,cjs}', {
51
53
  cwd: this.rootDir,
52
- ignore: this.excludePatterns.map(p => `**/${p}/**`),
54
+ ignore: ignorePatterns,
53
55
  absolute: true,
54
56
  });
55
57
  for (const file of files) {
56
58
  const vars = await this.scanFile(file);
57
- for (const varName of vars) {
59
+ for (const [varName, hasFallback] of vars.entries()) {
58
60
  const relativePath = path.relative(this.rootDir, file);
59
61
  if (!envVars.has(varName)) {
60
- envVars.set(varName, []);
62
+ envVars.set(varName, { locations: [], hasFallback: false });
61
63
  }
62
- envVars.get(varName).push(relativePath);
64
+ const entry = envVars.get(varName);
65
+ entry.locations.push(relativePath);
66
+ // If ANY usage has a fallback, mark it as having a fallback
67
+ entry.hasFallback = entry.hasFallback || hasFallback;
63
68
  }
64
69
  }
65
70
  // Also scan serverless.yml files for environment variable definitions
@@ -69,38 +74,77 @@ class CodeScanner {
69
74
  for (const [varName, entry] of vars.entries()) {
70
75
  const relativePath = path.relative(this.rootDir, file);
71
76
  if (!envVars.has(varName)) {
72
- envVars.set(varName, []);
77
+ envVars.set(varName, { locations: [], hasFallback: false });
73
78
  }
74
- envVars.get(varName).push(`${relativePath} (serverless config)`);
79
+ envVars.get(varName).locations.push(`${relativePath} (serverless config)`);
75
80
  }
76
81
  }
77
82
  return envVars;
78
83
  }
79
84
  async scanFile(filePath) {
80
- const envVars = new Set();
85
+ const envVars = new Map();
81
86
  try {
82
87
  const content = fs.readFileSync(filePath, 'utf-8');
83
- // Pattern 1: process.env.VAR_NAME
84
- const processEnvPattern = /process\.env\.([A-Z_][A-Z0-9_]*)/g;
88
+ // Pattern 1: process.env.VAR_NAME with fallback checks
89
+ // Matches: process.env.VAR || 'default'
90
+ // process.env.VAR ?? 'default'
91
+ // process.env.VAR ? x : y
92
+ const processEnvWithFallbackPattern = /process\.env\.([A-Z_][A-Z0-9_]*)\s*(\|\||&&|\?\?|\?)/g;
85
93
  let match;
86
- while ((match = processEnvPattern.exec(content)) !== null) {
87
- envVars.add(match[1]);
94
+ while ((match = processEnvWithFallbackPattern.exec(content)) !== null) {
95
+ envVars.set(match[1], true); // Has fallback
88
96
  }
89
- // Pattern 2: process.env['VAR_NAME'] or process.env["VAR_NAME"]
90
- const processEnvBracketPattern = /process\.env\[['"]([A-Z_][A-Z0-9_]*)['"\]]/g;
91
- while ((match = processEnvBracketPattern.exec(content)) !== null) {
92
- envVars.add(match[1]);
97
+ // Pattern 2: process.env.VAR in conditional checks
98
+ // Matches: if (process.env.VAR)
99
+ // if (!process.env.VAR)
100
+ const conditionalPattern = /if\s*\(\s*!?\s*process\.env\.([A-Z_][A-Z0-9_]*)\s*\)/g;
101
+ while ((match = conditionalPattern.exec(content)) !== null) {
102
+ if (!envVars.has(match[1])) {
103
+ envVars.set(match[1], true); // Has conditional check
104
+ }
93
105
  }
94
- // Pattern 3: Destructuring - const { VAR_NAME } = process.env
95
- const destructuringPattern = /const\s+\{\s*([^}]+)\s*\}\s*=\s*process\.env/g;
96
- while ((match = destructuringPattern.exec(content)) !== null) {
97
- const vars = match[1].split(',').map(v => v.trim().split(':')[0].trim());
106
+ // Pattern 3: Destructuring with defaults - const { VAR = 'default' } = process.env
107
+ const destructuringWithDefaultPattern = /const\s+\{\s*([^}]+)\s*\}\s*=\s*process\.env/g;
108
+ while ((match = destructuringWithDefaultPattern.exec(content)) !== null) {
109
+ const vars = match[1].split(',').map(v => v.trim());
98
110
  vars.forEach(v => {
99
- if (/^[A-Z_][A-Z0-9_]*$/.test(v)) {
100
- envVars.add(v);
111
+ const parts = v.split('=');
112
+ const varName = parts[0].split(':')[0].trim();
113
+ const hasDefault = parts.length > 1;
114
+ if (/^[A-Z_][A-Z0-9_]*$/.test(varName)) {
115
+ if (!envVars.has(varName)) {
116
+ envVars.set(varName, hasDefault);
117
+ }
101
118
  }
102
119
  });
103
120
  }
121
+ // Pattern 4: Optional chaining - process.env?.VAR
122
+ const optionalChainingPattern = /process\.env\?\.([A-Z_][A-Z0-9_]*)/g;
123
+ while ((match = optionalChainingPattern.exec(content)) !== null) {
124
+ if (!envVars.has(match[1])) {
125
+ envVars.set(match[1], true); // Has optional chaining
126
+ }
127
+ }
128
+ // Pattern 5: process.env['VAR_NAME'] or process.env["VAR_NAME"] with fallback
129
+ const processEnvBracketWithFallbackPattern = /process\.env\[['"]([A-Z_][A-Z0-9_]*)['"\]]\s*(\|\||&&|\?\?|\?)/g;
130
+ while ((match = processEnvBracketWithFallbackPattern.exec(content)) !== null) {
131
+ envVars.set(match[1], true); // Has fallback
132
+ }
133
+ // Pattern 6: Basic usage without any safety (process.env.VAR)
134
+ // This should come AFTER all the fallback patterns so we don't override them
135
+ const basicProcessEnvPattern = /process\.env\.([A-Z_][A-Z0-9_]*)/g;
136
+ while ((match = basicProcessEnvPattern.exec(content)) !== null) {
137
+ if (!envVars.has(match[1])) {
138
+ envVars.set(match[1], false); // No fallback detected
139
+ }
140
+ }
141
+ // Pattern 7: Basic bracket notation without safety
142
+ const basicBracketPattern = /process\.env\[['"]([A-Z_][A-Z0-9_]*)['"\]]/g;
143
+ while ((match = basicBracketPattern.exec(content)) !== null) {
144
+ if (!envVars.has(match[1])) {
145
+ envVars.set(match[1], false); // No fallback detected
146
+ }
147
+ }
104
148
  }
105
149
  catch (error) {
106
150
  console.error(`Error scanning file ${filePath}:`, error);
@@ -108,17 +152,19 @@ class CodeScanner {
108
152
  return envVars;
109
153
  }
110
154
  async findEnvFiles() {
155
+ const ignorePatterns = this.excludePatterns.map(p => p.includes('*') ? p : `**/${p}/**`);
111
156
  const envFiles = await (0, glob_1.glob)('**/.env', {
112
157
  cwd: this.rootDir,
113
- ignore: this.excludePatterns.map(p => `**/${p}/**`),
158
+ ignore: ignorePatterns,
114
159
  absolute: true,
115
160
  });
116
161
  return envFiles;
117
162
  }
118
163
  async findServerlessFiles() {
164
+ const ignorePatterns = this.excludePatterns.map(p => p.includes('*') ? p : `**/${p}/**`);
119
165
  const serverlessFiles = await (0, glob_1.glob)('**/serverless.{yml,yaml}', {
120
166
  cwd: this.rootDir,
121
- ignore: this.excludePatterns.map(p => `**/${p}/**`),
167
+ ignore: ignorePatterns,
122
168
  absolute: true,
123
169
  });
124
170
  return serverlessFiles;
@@ -130,16 +176,17 @@ class CodeScanner {
130
176
  // Returns a map of directory -> (varName -> file locations)
131
177
  const dirMap = new Map();
132
178
  // Scan for JavaScript/TypeScript files
179
+ const ignorePatterns = this.excludePatterns.map(p => p.includes('*') ? p : `**/${p}/**`);
133
180
  const files = await (0, glob_1.glob)('**/*.{js,ts,jsx,tsx,mjs,cjs}', {
134
181
  cwd: this.rootDir,
135
- ignore: this.excludePatterns.map(p => `**/${p}/**`),
182
+ ignore: ignorePatterns,
136
183
  absolute: true,
137
184
  });
138
185
  for (const file of files) {
139
186
  const vars = await this.scanFile(file);
140
187
  const fileDir = path.dirname(file);
141
188
  const relativePath = path.relative(this.rootDir, file);
142
- for (const varName of vars) {
189
+ for (const [varName, hasFallback] of vars.entries()) {
143
190
  if (!dirMap.has(fileDir)) {
144
191
  dirMap.set(fileDir, new Map());
145
192
  }
@@ -1 +1 @@
1
- {"version":3,"file":"codeScanner.js","sourceRoot":"","sources":["../../src/scanner/codeScanner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codeScanner.js","sourceRoot":"","sources":["../../src/scanner/codeScanner.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export interface EnvUsage {
2
2
  varName: string;
3
3
  locations: string[];
4
+ hasFallback?: boolean;
4
5
  }
5
6
  export interface EnvDefinition {
6
7
  varName: string;
@@ -11,13 +12,17 @@ export interface EnvDefinition {
11
12
  }
12
13
  export interface Issue {
13
14
  type: 'missing' | 'unused' | 'undocumented';
15
+ severity: 'error' | 'warning' | 'info';
14
16
  varName: string;
15
17
  details: string;
16
18
  locations?: string[];
17
19
  }
18
20
  export interface ScanResult {
19
21
  issues: Issue[];
20
- usedVars: Map<string, string[]>;
22
+ usedVars: Map<string, {
23
+ locations: string[];
24
+ hasFallback: boolean;
25
+ }>;
21
26
  definedVars: Set<string>;
22
27
  exampleVars: Set<string>;
23
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,QAAQ,GAAG,YAAY,GAAG,MAAM,CAAC;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,cAAc,CAAC;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAChC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC1B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,QAAQ,GAAG,YAAY,GAAG,MAAM,CAAC;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,cAAc,CAAC;IAC5C,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACrE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC1B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@danielszlaski/envguard",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "CLI tool to keep environment variables in sync with your codebase",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -3,20 +3,28 @@ import { EnvEntry } from '../parser/envParser';
3
3
 
4
4
  export class EnvAnalyzer {
5
5
  analyze(
6
- usedVars: Map<string, string[]>,
6
+ usedVars: Map<string, { locations: string[], hasFallback: boolean }>,
7
7
  definedVars: Map<string, EnvEntry>,
8
- exampleVars: Set<string>
8
+ exampleVars: Set<string>,
9
+ detectFallbacks: boolean = true
9
10
  ): ScanResult {
10
11
  const issues: Issue[] = [];
11
12
 
12
13
  // Issue 1: Variables used in code but missing from .env
13
- for (const [varName, locations] of usedVars.entries()) {
14
+ for (const [varName, usage] of usedVars.entries()) {
14
15
  if (!definedVars.has(varName)) {
16
+ // If detectFallbacks is enabled and variable has a fallback, it's a WARNING, otherwise ERROR
17
+ const severity = (detectFallbacks && usage.hasFallback) ? 'warning' : 'error';
18
+ const details = (detectFallbacks && usage.hasFallback)
19
+ ? `Used in code with fallback/default but not defined in .env`
20
+ : `Used in code but not defined in .env`;
21
+
15
22
  issues.push({
16
23
  type: 'missing',
24
+ severity,
17
25
  varName,
18
- details: `Used in code but not defined in .env`,
19
- locations,
26
+ details,
27
+ locations: usage.locations,
20
28
  });
21
29
  }
22
30
  }
@@ -26,6 +34,7 @@ export class EnvAnalyzer {
26
34
  if (!usedVars.has(varName)) {
27
35
  issues.push({
28
36
  type: 'unused',
37
+ severity: 'info',
29
38
  varName,
30
39
  details: `Defined in .env but never used in code`,
31
40
  });
@@ -33,13 +42,20 @@ export class EnvAnalyzer {
33
42
  }
34
43
 
35
44
  // Issue 3: Variables used in code but not in .env.example
36
- for (const [varName, locations] of usedVars.entries()) {
45
+ for (const [varName, usage] of usedVars.entries()) {
37
46
  if (!exampleVars.has(varName)) {
47
+ // If detectFallbacks is enabled and variable has a fallback, it's less critical for documentation
48
+ const severity = (detectFallbacks && usage.hasFallback) ? 'info' : 'warning';
49
+ const details = (detectFallbacks && usage.hasFallback)
50
+ ? `Used in code with fallback but missing from .env.example`
51
+ : `Used in code but missing from .env.example`;
52
+
38
53
  issues.push({
39
54
  type: 'undocumented',
55
+ severity,
40
56
  varName,
41
- details: `Used in code but missing from .env.example`,
42
- locations,
57
+ details,
58
+ locations: usage.locations,
43
59
  });
44
60
  }
45
61
  }
@@ -53,7 +69,7 @@ export class EnvAnalyzer {
53
69
  }
54
70
 
55
71
  generateExampleContent(
56
- usedVars: Map<string, string[]>,
72
+ usedVars: Map<string, { locations: string[], hasFallback: boolean }>,
57
73
  existingEntries: Map<string, EnvEntry>
58
74
  ): string {
59
75
  let content = '# Auto-generated by envguard\n';
@@ -62,7 +78,8 @@ export class EnvAnalyzer {
62
78
  const sortedVars = Array.from(usedVars.keys()).sort();
63
79
 
64
80
  for (const varName of sortedVars) {
65
- const locations = usedVars.get(varName)!;
81
+ const usage = usedVars.get(varName)!;
82
+ const locations = usage.locations;
66
83
  const existingEntry = existingEntries.get(varName);
67
84
 
68
85
  // Add location comments
package/src/cli.ts CHANGED
@@ -4,6 +4,7 @@ import { Command } from 'commander';
4
4
  import { scanCommand } from './commands/scan';
5
5
  import { fixCommand } from './commands/fix';
6
6
  import { checkCommand } from './commands/check';
7
+ import { installHookCommand, uninstallHookCommand } from './commands/install-hook';
7
8
  import { Logger } from './utils/logger';
8
9
 
9
10
  const program = new Command();
@@ -18,8 +19,22 @@ program
18
19
  .description('Scan codebase and compare with .env files')
19
20
  .option('--ci', 'Exit with error code if issues found (for CI/CD)')
20
21
  .option('--strict', 'Report all variables including known runtime variables (AWS_REGION, NODE_ENV, etc.)')
21
- .action(async (options) => {
22
+ .option('--no-detect-fallbacks', 'Treat all missing variables as errors, ignoring fallback detection')
23
+ .action(async (cmd, command) => {
22
24
  try {
25
+ // Build options object, only including detectFallbacks if the flag was used
26
+ const options: any = {
27
+ ci: cmd.ci,
28
+ strict: cmd.strict
29
+ };
30
+
31
+ // Check if the --no-detect-fallbacks flag was explicitly provided
32
+ // Commander adds it to the command's options when the flag is used
33
+ const flagProvided = command.parent?.rawArgs.some((arg: string) => arg.includes('detect-fallback'));
34
+ if (flagProvided) {
35
+ options.detectFallbacks = cmd.detectFallbacks;
36
+ }
37
+
23
38
  await scanCommand(options);
24
39
  } catch (error) {
25
40
  Logger.error(`${error}`);
@@ -43,9 +58,53 @@ program
43
58
  .command('check')
44
59
  .description('Check for issues (alias for scan --ci)')
45
60
  .option('--strict', 'Report all variables including known runtime variables (AWS_REGION, NODE_ENV, etc.)')
46
- .action(async (options) => {
61
+ .option('--no-detect-fallbacks', 'Treat all missing variables as errors, ignoring fallback detection')
62
+ .action(async (cmd, command) => {
63
+ try {
64
+ const options: any = {
65
+ ci: true,
66
+ strict: cmd.strict
67
+ };
68
+
69
+ // Check if the --no-detect-fallbacks flag was explicitly provided
70
+ const flagProvided = command.parent?.rawArgs.some((arg: string) => arg.includes('detect-fallback'));
71
+ if (flagProvided) {
72
+ options.detectFallbacks = cmd.detectFallbacks;
73
+ }
74
+
75
+ await scanCommand(options);
76
+ } catch (error) {
77
+ Logger.error(`${error}`);
78
+ process.exit(1);
79
+ }
80
+ });
81
+
82
+ program
83
+ .command('install-hook')
84
+ .description('Install a Git hook to run envguard automatically')
85
+ .option('--type <type>', 'Hook type: pre-commit or pre-push (default: pre-commit)')
86
+ .option('--force', 'Overwrite existing hook if present')
87
+ .action(async (cmd) => {
88
+ try {
89
+ await installHookCommand({
90
+ type: cmd.type,
91
+ force: cmd.force
92
+ });
93
+ } catch (error) {
94
+ Logger.error(`${error}`);
95
+ process.exit(1);
96
+ }
97
+ });
98
+
99
+ program
100
+ .command('uninstall-hook')
101
+ .description('Remove the envguard Git hook')
102
+ .option('--type <type>', 'Hook type: pre-commit or pre-push (default: pre-commit)')
103
+ .action(async (cmd) => {
47
104
  try {
48
- await scanCommand({ ci: true, strict: options.strict });
105
+ await uninstallHookCommand({
106
+ type: cmd.type
107
+ });
49
108
  } catch (error) {
50
109
  Logger.error(`${error}`);
51
110
  process.exit(1);
@@ -10,8 +10,19 @@ export async function fixCommand() {
10
10
 
11
11
  Logger.startSpinner('Generating .env.example files...');
12
12
 
13
+ // Load configuration
14
+ const { ConfigLoader } = require('../config/configLoader');
15
+ const config = ConfigLoader.loadConfig(rootDir);
16
+
13
17
  // Step 1: Find all .env files
14
- const scanner = new CodeScanner(rootDir);
18
+ const excludePatterns = [
19
+ 'node_modules',
20
+ 'dist',
21
+ 'build',
22
+ '.git',
23
+ ...(config.exclude || []),
24
+ ];
25
+ const scanner = new CodeScanner(rootDir, excludePatterns);
15
26
  const envFiles = await scanner.findEnvFiles();
16
27
 
17
28
  Logger.stopSpinner();
@@ -38,7 +49,21 @@ export async function fixCommand() {
38
49
  Logger.path(`Processing ${displayPath}/`);
39
50
 
40
51
  // Step 3: Scan code files in this directory and subdirectories
41
- const usedVars = await scanDirectoryForVars(rootDir, envDir, scanner);
52
+ const allUsedVars = await scanDirectoryForVars(rootDir, envDir, scanner, config.exclude);
53
+
54
+ // Filter out ignored variables based on config (they shouldn't be in .env.example)
55
+ const { isKnownRuntimeVar } = require('../constants/knownEnvVars');
56
+ const usedVars = new Map<string, { locations: string[], hasFallback: boolean }>();
57
+
58
+ for (const [varName, usage] of allUsedVars.entries()) {
59
+ const isCustomIgnored = ConfigLoader.shouldIgnoreVar(varName, config);
60
+ const isRuntimeVar = isKnownRuntimeVar(varName);
61
+
62
+ // Skip known runtime variables and custom ignore vars
63
+ if (!isRuntimeVar && !isCustomIgnored) {
64
+ usedVars.set(varName, usage);
65
+ }
66
+ }
42
67
 
43
68
  if (usedVars.size === 0) {
44
69
  Logger.info('No environment variables found in code', true);
@@ -82,29 +107,35 @@ export async function fixCommand() {
82
107
  async function scanDirectoryForVars(
83
108
  rootDir: string,
84
109
  targetDir: string,
85
- scanner: CodeScanner
86
- ): Promise<Map<string, string[]>> {
87
- const envVars = new Map<string, string[]>();
110
+ scanner: CodeScanner,
111
+ excludePatterns: string[] = []
112
+ ): Promise<Map<string, { locations: string[], hasFallback: boolean }>> {
113
+ const envVars = new Map<string, { locations: string[], hasFallback: boolean }>();
88
114
  const { glob } = require('glob');
89
115
 
90
116
  // Find all code files in this directory and subdirectories
91
117
  const relativeDir = path.relative(rootDir, targetDir);
92
118
  const pattern = relativeDir ? `${relativeDir}/**/*.{js,ts,jsx,tsx,mjs,cjs}` : '**/*.{js,ts,jsx,tsx,mjs,cjs}';
93
119
 
120
+ const defaultIgnore = ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.git/**'];
121
+ const customIgnore = excludePatterns.map(p => p.includes('*') ? p : `**/${p}/**`);
122
+
94
123
  const files = await glob(pattern, {
95
124
  cwd: rootDir,
96
- ignore: ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.git/**'],
125
+ ignore: [...defaultIgnore, ...customIgnore],
97
126
  absolute: true,
98
127
  });
99
128
 
100
129
  for (const file of files) {
101
130
  const vars = await (scanner as any).scanFile(file);
102
- for (const varName of vars) {
131
+ for (const [varName, hasFallback] of vars.entries()) {
103
132
  const relativePath = path.relative(rootDir, file);
104
133
  if (!envVars.has(varName)) {
105
- envVars.set(varName, []);
134
+ envVars.set(varName, { locations: [], hasFallback: false });
106
135
  }
107
- envVars.get(varName)!.push(relativePath);
136
+ const entry = envVars.get(varName)!;
137
+ entry.locations.push(relativePath);
138
+ entry.hasFallback = entry.hasFallback || hasFallback;
108
139
  }
109
140
  }
110
141