@danielszlaski/envguard 0.1.3 → 0.1.4

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 (38) 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 +243 -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 +25 -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/scan.d.ts +1 -0
  16. package/dist/commands/scan.d.ts.map +1 -1
  17. package/dist/commands/scan.js +150 -41
  18. package/dist/commands/scan.js.map +1 -1
  19. package/dist/config/configLoader.d.ts +6 -0
  20. package/dist/config/configLoader.d.ts.map +1 -1
  21. package/dist/config/configLoader.js +1 -0
  22. package/dist/config/configLoader.js.map +1 -1
  23. package/dist/scanner/codeScanner.d.ts +5 -2
  24. package/dist/scanner/codeScanner.d.ts.map +1 -1
  25. package/dist/scanner/codeScanner.js +72 -25
  26. package/dist/scanner/codeScanner.js.map +1 -1
  27. package/dist/types.d.ts +6 -1
  28. package/dist/types.d.ts.map +1 -1
  29. package/package.json +1 -1
  30. package/src/analyzer/envAnalyzer.ts +27 -10
  31. package/src/cli.ts +29 -3
  32. package/src/commands/fix.ts +40 -9
  33. package/src/commands/scan.ts +168 -47
  34. package/src/config/configLoader.ts +8 -0
  35. package/src/scanner/codeScanner.ts +97 -28
  36. package/src/types.ts +3 -1
  37. package/test-project/src/lambda2/handler2.js +1 -1
  38. package/test-project/.envguardrc.json +0 -7
@@ -49,9 +49,17 @@ async function scanCommand(options) {
49
49
  const config = configLoader_1.ConfigLoader.loadConfig(rootDir);
50
50
  // CLI options override config file
51
51
  const strictMode = options.strict !== undefined ? options.strict : config.strict;
52
+ const detectFallbacks = options.detectFallbacks !== undefined ? options.detectFallbacks : (config.detectFallbacks !== undefined ? config.detectFallbacks : true);
52
53
  logger_1.Logger.startSpinner('Scanning codebase for environment variables...');
53
54
  // Step 1: Find all .env files and serverless.yml files
54
- const scanner = new codeScanner_1.CodeScanner(rootDir);
55
+ const excludePatterns = [
56
+ 'node_modules',
57
+ 'dist',
58
+ 'build',
59
+ '.git',
60
+ ...(config.exclude || []),
61
+ ];
62
+ const scanner = new codeScanner_1.CodeScanner(rootDir, excludePatterns);
55
63
  const envFiles = await scanner.findEnvFiles();
56
64
  const serverlessFiles = await scanner.findServerlessFiles();
57
65
  logger_1.Logger.stopSpinner();
@@ -76,7 +84,7 @@ async function scanCommand(options) {
76
84
  const serverlessVars = serverlessParser.parse(serverlessFilePath);
77
85
  logger_1.Logger.info(`Found ${serverlessVars.size} variable(s) in serverless.yml`, true);
78
86
  // Scan code files in this directory to see what's actually used
79
- const usedVars = await scanDirectoryForCodeVars(rootDir, serverlessDir, scanner);
87
+ const usedVars = await scanDirectoryForCodeVars(rootDir, serverlessDir, scanner, config.exclude);
80
88
  logger_1.Logger.info(`Found ${usedVars.size} variable(s) used in code`, true);
81
89
  logger_1.Logger.blank();
82
90
  // Check for unused variables in serverless.yml
@@ -93,7 +101,7 @@ async function scanCommand(options) {
93
101
  // Check for variables used in code but not defined in serverless.yml
94
102
  const missingFromServerless = [];
95
103
  const skippedRuntimeVars = [];
96
- for (const [varName, locations] of usedVars.entries()) {
104
+ for (const [varName, usage] of usedVars.entries()) {
97
105
  if (!serverlessVars.has(varName)) {
98
106
  // In non-strict mode, skip known runtime variables and custom ignore vars
99
107
  const isCustomIgnored = configLoader_1.ConfigLoader.shouldIgnoreVar(varName, config);
@@ -105,16 +113,17 @@ async function scanCommand(options) {
105
113
  }
106
114
  }
107
115
  else {
108
- missingFromServerless.push({ varName, locations });
116
+ missingFromServerless.push({ varName, locations: usage.locations, hasFallback: usage.hasFallback });
109
117
  }
110
118
  }
111
119
  }
112
120
  if (unusedServerlessVars.length > 0) {
113
- logger_1.Logger.warning('Unused variables in serverless.yml:', true);
121
+ logger_1.Logger.info('Unused variables in serverless.yml:', true);
114
122
  unusedServerlessVars.forEach((varName) => {
115
- logger_1.Logger.warningItem(varName, 2);
123
+ logger_1.Logger.infoItem(varName, 2);
116
124
  allIssues.push({
117
125
  type: 'unused',
126
+ severity: 'info',
118
127
  varName,
119
128
  details: `Defined in serverless.yml but never used in code`,
120
129
  });
@@ -122,20 +131,46 @@ async function scanCommand(options) {
122
131
  logger_1.Logger.blank();
123
132
  }
124
133
  if (missingFromServerless.length > 0) {
125
- logger_1.Logger.error('Missing from serverless.yml:', true);
126
- missingFromServerless.forEach((item) => {
127
- logger_1.Logger.errorItem(item.varName, 2);
128
- if (item.locations && item.locations.length > 0) {
129
- logger_1.Logger.info(`Used in: ${item.locations.slice(0, 2).join(', ')}`, true);
130
- }
131
- allIssues.push({
132
- type: 'missing',
133
- varName: item.varName,
134
- details: `Used in code but not defined in serverless.yml`,
135
- locations: item.locations,
134
+ // Group by severity (respect detectFallbacks config)
135
+ const errors = missingFromServerless.filter(item => !detectFallbacks || !item.hasFallback);
136
+ const warnings = missingFromServerless.filter(item => detectFallbacks && item.hasFallback);
137
+ if (errors.length > 0) {
138
+ logger_1.Logger.error('Missing from serverless.yml:', true);
139
+ errors.forEach((item) => {
140
+ logger_1.Logger.errorItem(item.varName, 2);
141
+ if (item.locations && item.locations.length > 0) {
142
+ logger_1.Logger.info(`Used in: ${item.locations.slice(0, 2).join(', ')}`, true);
143
+ }
144
+ const details = (detectFallbacks && item.hasFallback)
145
+ ? `Used in code with fallback but not defined in serverless.yml`
146
+ : `Used in code but not defined in serverless.yml`;
147
+ allIssues.push({
148
+ type: 'missing',
149
+ severity: 'error',
150
+ varName: item.varName,
151
+ details,
152
+ locations: item.locations,
153
+ });
136
154
  });
137
- });
138
- logger_1.Logger.blank();
155
+ logger_1.Logger.blank();
156
+ }
157
+ if (warnings.length > 0) {
158
+ logger_1.Logger.warning('Missing from serverless.yml (with fallback):', true);
159
+ warnings.forEach((item) => {
160
+ logger_1.Logger.warningItem(item.varName, 2);
161
+ if (item.locations && item.locations.length > 0) {
162
+ logger_1.Logger.info(`Used in: ${item.locations.slice(0, 2).join(', ')}`, true);
163
+ }
164
+ allIssues.push({
165
+ type: 'missing',
166
+ severity: 'warning',
167
+ varName: item.varName,
168
+ details: `Used in code with fallback but not defined in serverless.yml`,
169
+ locations: item.locations,
170
+ });
171
+ });
172
+ logger_1.Logger.blank();
173
+ }
139
174
  }
140
175
  if (unusedServerlessVars.length === 0 && missingFromServerless.length === 0) {
141
176
  logger_1.Logger.success('No issues in this serverless.yml', true);
@@ -166,7 +201,24 @@ async function scanCommand(options) {
166
201
  logger_1.Logger.path(`Checking ${displayPath}/`);
167
202
  logger_1.Logger.blank();
168
203
  // Step 3: Scan code files in this directory and subdirectories
169
- const usedVars = await scanDirectoryForVars(rootDir, envDir, scanner);
204
+ const allUsedVars = await scanDirectoryForVars(rootDir, envDir, scanner, config.exclude);
205
+ // Filter out ignored variables based on config
206
+ const usedVars = new Map();
207
+ const skippedVarsInScope = [];
208
+ for (const [varName, usage] of allUsedVars.entries()) {
209
+ const isCustomIgnored = configLoader_1.ConfigLoader.shouldIgnoreVar(varName, config);
210
+ const isRuntimeVar = (0, knownEnvVars_1.isKnownRuntimeVar)(varName);
211
+ // In non-strict mode, skip known runtime variables and custom ignore vars
212
+ if (strictMode || (!isRuntimeVar && !isCustomIgnored)) {
213
+ usedVars.set(varName, usage);
214
+ }
215
+ else {
216
+ const category = isCustomIgnored ? 'Custom (from config)' : (0, knownEnvVars_1.getRuntimeVarCategory)(varName);
217
+ if (category) {
218
+ skippedVarsInScope.push({ varName, category });
219
+ }
220
+ }
221
+ }
170
222
  logger_1.Logger.info(`Found ${usedVars.size} variable(s) used in this scope`, true);
171
223
  // Step 4: Parse .env file
172
224
  const definedVars = parser.parse(envFilePath);
@@ -177,15 +229,17 @@ async function scanCommand(options) {
177
229
  logger_1.Logger.info(`Found ${exampleVars.size} variable(s) in .env.example`, true);
178
230
  logger_1.Logger.blank();
179
231
  // Step 6: Analyze and find issues
180
- const result = analyzer.analyze(usedVars, definedVars, exampleVars);
232
+ const result = analyzer.analyze(usedVars, definedVars, exampleVars, detectFallbacks);
181
233
  if (result.issues.length > 0) {
182
- // Group issues by type
183
- const missingIssues = result.issues.filter(i => i.type === 'missing');
234
+ // Group issues by type and severity
235
+ const missingErrors = result.issues.filter(i => i.type === 'missing' && i.severity === 'error');
236
+ const missingWarnings = result.issues.filter(i => i.type === 'missing' && i.severity === 'warning');
184
237
  const unusedIssues = result.issues.filter(i => i.type === 'unused');
185
- const undocumentedIssues = result.issues.filter(i => i.type === 'undocumented');
186
- if (missingIssues.length > 0) {
238
+ const undocumentedWarnings = result.issues.filter(i => i.type === 'undocumented' && i.severity === 'warning');
239
+ const undocumentedInfo = result.issues.filter(i => i.type === 'undocumented' && i.severity === 'info');
240
+ if (missingErrors.length > 0) {
187
241
  logger_1.Logger.error('Missing from .env:', true);
188
- missingIssues.forEach((issue) => {
242
+ missingErrors.forEach((issue) => {
189
243
  logger_1.Logger.errorItem(issue.varName, 2);
190
244
  if (issue.locations && issue.locations.length > 0) {
191
245
  logger_1.Logger.info(`Used in: ${issue.locations.slice(0, 2).join(', ')}`, true);
@@ -193,16 +247,33 @@ async function scanCommand(options) {
193
247
  });
194
248
  logger_1.Logger.blank();
195
249
  }
250
+ if (missingWarnings.length > 0) {
251
+ logger_1.Logger.warning('Missing from .env (with fallback):', true);
252
+ missingWarnings.forEach((issue) => {
253
+ logger_1.Logger.warningItem(issue.varName, 2);
254
+ if (issue.locations && issue.locations.length > 0) {
255
+ logger_1.Logger.info(`Used in: ${issue.locations.slice(0, 2).join(', ')}`, true);
256
+ }
257
+ });
258
+ logger_1.Logger.blank();
259
+ }
196
260
  if (unusedIssues.length > 0) {
197
- logger_1.Logger.warning('Unused variables:', true);
261
+ logger_1.Logger.info('Unused variables:', true);
198
262
  unusedIssues.forEach((issue) => {
263
+ logger_1.Logger.infoItem(issue.varName, 2);
264
+ });
265
+ logger_1.Logger.blank();
266
+ }
267
+ if (undocumentedWarnings.length > 0) {
268
+ logger_1.Logger.warning('Missing from .env.example:', true);
269
+ undocumentedWarnings.forEach((issue) => {
199
270
  logger_1.Logger.warningItem(issue.varName, 2);
200
271
  });
201
272
  logger_1.Logger.blank();
202
273
  }
203
- if (undocumentedIssues.length > 0) {
204
- logger_1.Logger.info('Missing from .env.example:', true);
205
- undocumentedIssues.forEach((issue) => {
274
+ if (undocumentedInfo.length > 0) {
275
+ logger_1.Logger.info('Missing from .env.example (with fallback):', true);
276
+ undocumentedInfo.forEach((issue) => {
206
277
  logger_1.Logger.infoItem(issue.varName, 2);
207
278
  });
208
279
  logger_1.Logger.blank();
@@ -213,6 +284,22 @@ async function scanCommand(options) {
213
284
  logger_1.Logger.success('No issues in this directory', true);
214
285
  logger_1.Logger.blank();
215
286
  }
287
+ // Show skipped variables in non-strict mode
288
+ if (!strictMode && skippedVarsInScope.length > 0) {
289
+ logger_1.Logger.info('Skipped known runtime/ignored variables (use --strict to show):', true);
290
+ // Group by category
291
+ const grouped = new Map();
292
+ for (const { varName, category } of skippedVarsInScope) {
293
+ if (!grouped.has(category)) {
294
+ grouped.set(category, []);
295
+ }
296
+ grouped.get(category).push(varName);
297
+ }
298
+ for (const [category, vars] of grouped.entries()) {
299
+ logger_1.Logger.info(`${category}: ${vars.join(', ')}`, true);
300
+ }
301
+ logger_1.Logger.blank();
302
+ }
216
303
  }
217
304
  // Display summary
218
305
  logger_1.Logger.divider();
@@ -220,8 +307,22 @@ async function scanCommand(options) {
220
307
  logger_1.Logger.summary('No issues found! All environment variables are in sync.');
221
308
  return { success: true, issues: [] };
222
309
  }
310
+ // Count issues by severity
311
+ const errorCount = allIssues.filter(i => i.severity === 'error').length;
312
+ const warningCount = allIssues.filter(i => i.severity === 'warning').length;
313
+ const infoCount = allIssues.filter(i => i.severity === 'info').length;
314
+ logger_1.Logger.blank();
315
+ if (errorCount > 0) {
316
+ logger_1.Logger.error(`Errors: ${errorCount}`, false);
317
+ }
318
+ if (warningCount > 0) {
319
+ logger_1.Logger.warning(`Warnings: ${warningCount}`, false);
320
+ }
321
+ if (infoCount > 0) {
322
+ logger_1.Logger.info(`Info: ${infoCount}`, false);
323
+ }
223
324
  logger_1.Logger.blank();
224
- logger_1.Logger.warning(`Total: ${allIssues.length} issue(s) across ${envFiles.length} location(s)`);
325
+ logger_1.Logger.warning(`Total: ${allIssues.length} issue(s) across ${envFiles.length + serverlessFiles.length} location(s)`);
225
326
  logger_1.Logger.blank();
226
327
  // Suggest fix
227
328
  if (!options.ci) {
@@ -236,47 +337,55 @@ async function scanCommand(options) {
236
337
  }
237
338
  return { success: false, issues: allIssues };
238
339
  }
239
- async function scanDirectoryForVars(rootDir, targetDir, scanner) {
340
+ async function scanDirectoryForVars(rootDir, targetDir, scanner, excludePatterns = []) {
240
341
  const envVars = new Map();
241
342
  // Find all code files in this directory and subdirectories
242
343
  const relativeDir = path.relative(rootDir, targetDir);
243
344
  const pattern = relativeDir ? `${relativeDir}/**/*.{js,ts,jsx,tsx,mjs,cjs}` : '**/*.{js,ts,jsx,tsx,mjs,cjs}';
345
+ const defaultIgnore = ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.git/**'];
346
+ const customIgnore = excludePatterns.map(p => p.includes('*') ? p : `**/${p}/**`);
244
347
  const files = await (0, glob_1.glob)(pattern, {
245
348
  cwd: rootDir,
246
- ignore: ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.git/**'],
349
+ ignore: [...defaultIgnore, ...customIgnore],
247
350
  absolute: true,
248
351
  });
249
352
  for (const file of files) {
250
353
  const vars = await scanner.scanFile(file);
251
- for (const varName of vars) {
354
+ for (const [varName, hasFallback] of vars.entries()) {
252
355
  const relativePath = path.relative(rootDir, file);
253
356
  if (!envVars.has(varName)) {
254
- envVars.set(varName, []);
357
+ envVars.set(varName, { locations: [], hasFallback: false });
255
358
  }
256
- envVars.get(varName).push(relativePath);
359
+ const entry = envVars.get(varName);
360
+ entry.locations.push(relativePath);
361
+ entry.hasFallback = entry.hasFallback || hasFallback;
257
362
  }
258
363
  }
259
364
  return envVars;
260
365
  }
261
366
  // Scan only code files (JS/TS), not including serverless.yml as a source
262
- async function scanDirectoryForCodeVars(rootDir, targetDir, scanner) {
367
+ async function scanDirectoryForCodeVars(rootDir, targetDir, scanner, excludePatterns = []) {
263
368
  const envVars = new Map();
264
369
  // Find all code files in this directory only (not subdirectories for serverless)
265
370
  const relativeDir = path.relative(rootDir, targetDir);
266
371
  const pattern = relativeDir ? `${relativeDir}/**/*.{js,ts,jsx,tsx,mjs,cjs}` : '**/*.{js,ts,jsx,tsx,mjs,cjs}';
372
+ const defaultIgnore = ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.git/**'];
373
+ const customIgnore = excludePatterns.map(p => p.includes('*') ? p : `**/${p}/**`);
267
374
  const files = await (0, glob_1.glob)(pattern, {
268
375
  cwd: rootDir,
269
- ignore: ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.git/**'],
376
+ ignore: [...defaultIgnore, ...customIgnore],
270
377
  absolute: true,
271
378
  });
272
379
  for (const file of files) {
273
380
  const vars = await scanner.scanFile(file);
274
- for (const varName of vars) {
381
+ for (const [varName, hasFallback] of vars.entries()) {
275
382
  const relativePath = path.relative(rootDir, file);
276
383
  if (!envVars.has(varName)) {
277
- envVars.set(varName, []);
384
+ envVars.set(varName, { locations: [], hasFallback: false });
278
385
  }
279
- envVars.get(varName).push(relativePath);
386
+ const entry = envVars.get(varName);
387
+ entry.locations.push(relativePath);
388
+ entry.hasFallback = entry.hasFallback || hasFallback;
280
389
  }
281
390
  }
282
391
  return envVars;
@@ -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
  }