@danielszlaski/envguard 0.1.0 → 0.1.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.
package/dist/cli.js CHANGED
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  const commander_1 = require("commander");
5
5
  const scan_1 = require("./commands/scan");
6
6
  const fix_1 = require("./commands/fix");
7
+ const logger_1 = require("./utils/logger");
7
8
  const program = new commander_1.Command();
8
9
  program
9
10
  .name('envguard')
@@ -19,7 +20,7 @@ program
19
20
  await (0, scan_1.scanCommand)(options);
20
21
  }
21
22
  catch (error) {
22
- console.error('Error:', error);
23
+ logger_1.Logger.error(`${error}`);
23
24
  process.exit(1);
24
25
  }
25
26
  });
@@ -31,7 +32,7 @@ program
31
32
  await (0, fix_1.fixCommand)();
32
33
  }
33
34
  catch (error) {
34
- console.error('Error:', error);
35
+ logger_1.Logger.error(`${error}`);
35
36
  process.exit(1);
36
37
  }
37
38
  });
@@ -44,7 +45,7 @@ program
44
45
  await (0, scan_1.scanCommand)({ ci: true, strict: options.strict });
45
46
  }
46
47
  catch (error) {
47
- console.error('Error:', error);
48
+ logger_1.Logger.error(`${error}`);
48
49
  process.exit(1);
49
50
  }
50
51
  });
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,0CAA8C;AAC9C,wCAA4C;AAG5C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,4DAA4D,CAAC;KACzE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,MAAM,EAAE,kDAAkD,CAAC;KAClE,MAAM,CAAC,UAAU,EAAE,qFAAqF,CAAC;KACzG,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,IAAA,kBAAW,EAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,IAAA,gBAAU,GAAE,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,UAAU,EAAE,qFAAqF,CAAC;KACzG,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,IAAA,kBAAW,EAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,0CAA8C;AAC9C,wCAA4C;AAE5C,2CAAwC;AAExC,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,4DAA4D,CAAC;KACzE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,MAAM,EAAE,kDAAkD,CAAC;KAClE,MAAM,CAAC,UAAU,EAAE,qFAAqF,CAAC;KACzG,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,IAAA,kBAAW,EAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAM,CAAC,KAAK,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,IAAA,gBAAU,GAAE,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAM,CAAC,KAAK,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,UAAU,EAAE,qFAAqF,CAAC;KACzG,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,IAAA,kBAAW,EAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAM,CAAC,KAAK,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"fix.d.ts","sourceRoot":"","sources":["../../src/commands/fix.ts"],"names":[],"mappings":"AAOA,wBAAsB,UAAU;;GAgE/B"}
1
+ {"version":3,"file":"fix.d.ts","sourceRoot":"","sources":["../../src/commands/fix.ts"],"names":[],"mappings":"AAOA,wBAAsB,UAAU;;GAwE/B"}
@@ -32,28 +32,28 @@ var __importStar = (this && this.__importStar) || (function () {
32
32
  return result;
33
33
  };
34
34
  })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
35
  Object.defineProperty(exports, "__esModule", { value: true });
39
36
  exports.fixCommand = fixCommand;
40
37
  const path = __importStar(require("path"));
41
38
  const fs = __importStar(require("fs"));
42
- const chalk_1 = __importDefault(require("chalk"));
43
39
  const codeScanner_1 = require("../scanner/codeScanner");
44
40
  const envParser_1 = require("../parser/envParser");
45
41
  const envAnalyzer_1 = require("../analyzer/envAnalyzer");
42
+ const logger_1 = require("../utils/logger");
46
43
  async function fixCommand() {
47
44
  const rootDir = process.cwd();
48
- console.log(chalk_1.default.blue('🔧 Generating .env.example files...\n'));
45
+ logger_1.Logger.startSpinner('Generating .env.example files...');
49
46
  // Step 1: Find all .env files
50
47
  const scanner = new codeScanner_1.CodeScanner(rootDir);
51
48
  const envFiles = await scanner.findEnvFiles();
49
+ logger_1.Logger.stopSpinner();
52
50
  if (envFiles.length === 0) {
53
- console.log(chalk_1.default.yellow('⚠️ No .env files found in the project\n'));
51
+ logger_1.Logger.warning('No .env files found in the project');
52
+ logger_1.Logger.blank();
54
53
  return { success: false };
55
54
  }
56
- console.log(chalk_1.default.green(`✓ Found ${envFiles.length} .env file(s)\n`));
55
+ logger_1.Logger.success(`Found ${envFiles.length} .env file(s)`);
56
+ logger_1.Logger.blank();
57
57
  const parser = new envParser_1.EnvParser();
58
58
  const analyzer = new envAnalyzer_1.EnvAnalyzer();
59
59
  let totalVars = 0;
@@ -62,14 +62,16 @@ async function fixCommand() {
62
62
  const envDir = path.dirname(envFilePath);
63
63
  const relativePath = path.relative(rootDir, envDir);
64
64
  const displayPath = relativePath || '.';
65
- console.log(chalk_1.default.cyan(`📂 Processing ${displayPath}/`));
65
+ logger_1.Logger.path(`Processing ${displayPath}/`);
66
66
  // Step 3: Scan code files in this directory and subdirectories
67
67
  const usedVars = await scanDirectoryForVars(rootDir, envDir, scanner);
68
68
  if (usedVars.size === 0) {
69
- console.log(chalk_1.default.gray(` No environment variables found in code\n`));
69
+ logger_1.Logger.info('No environment variables found in code', true);
70
+ logger_1.Logger.blank();
70
71
  continue;
71
72
  }
72
- console.log(chalk_1.default.green(`Found ${usedVars.size} variable(s) used in this directory\n`));
73
+ logger_1.Logger.success(`Found ${usedVars.size} variable(s) used in this directory`, true);
74
+ logger_1.Logger.blank();
73
75
  // Step 4: Parse existing .env.example to preserve comments
74
76
  const examplePath = path.join(envDir, '.env.example');
75
77
  const existingEntries = parser.parse(examplePath);
@@ -77,16 +79,18 @@ async function fixCommand() {
77
79
  const newContent = analyzer.generateExampleContent(usedVars, existingEntries);
78
80
  // Step 6: Write to .env.example
79
81
  fs.writeFileSync(examplePath, newContent, 'utf-8');
80
- console.log(chalk_1.default.green(`Generated ${path.relative(rootDir, examplePath)}\n`));
82
+ logger_1.Logger.success(`Generated ${path.relative(rootDir, examplePath)}`, true);
83
+ logger_1.Logger.blank();
81
84
  totalVars += usedVars.size;
82
85
  // Step 7: Show summary for this directory
83
86
  const definedVars = parser.parse(envFilePath);
84
87
  const missingFromEnv = Array.from(usedVars.keys()).filter(v => !definedVars.has(v));
85
88
  if (missingFromEnv.length > 0) {
86
- console.log(chalk_1.default.yellow(` ⚠️ Missing from .env: ${missingFromEnv.join(', ')}\n`));
89
+ logger_1.Logger.warning(`Missing from .env: ${missingFromEnv.join(', ')}`, true);
90
+ logger_1.Logger.blank();
87
91
  }
88
92
  }
89
- console.log(chalk_1.default.green(`🎉 Done! Generated ${envFiles.length} .env.example file(s) with ${totalVars} total variables\n`));
93
+ logger_1.Logger.summary(`Generated ${envFiles.length} .env.example file(s) with ${totalVars} total variables`);
90
94
  return { success: true };
91
95
  }
92
96
  async function scanDirectoryForVars(rootDir, targetDir, scanner) {
@@ -1 +1 @@
1
- {"version":3,"file":"fix.js","sourceRoot":"","sources":["../../src/commands/fix.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fix.js","sourceRoot":"","sources":["../../src/commands/fix.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAIjC,wBAAsB,WAAW,CAAC,OAAO,EAAE;IAAE,EAAE,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE;;;GAqN5E"}
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAKjC,wBAAsB,WAAW,CAAC,OAAO,EAAE;IAAE,EAAE,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE;;;GAmO5E"}
@@ -32,13 +32,9 @@ var __importStar = (this && this.__importStar) || (function () {
32
32
  return result;
33
33
  };
34
34
  })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
35
  Object.defineProperty(exports, "__esModule", { value: true });
39
36
  exports.scanCommand = scanCommand;
40
37
  const path = __importStar(require("path"));
41
- const chalk_1 = __importDefault(require("chalk"));
42
38
  const glob_1 = require("glob");
43
39
  const codeScanner_1 = require("../scanner/codeScanner");
44
40
  const envParser_1 = require("../parser/envParser");
@@ -46,22 +42,26 @@ const serverlessParser_1 = require("../parser/serverlessParser");
46
42
  const envAnalyzer_1 = require("../analyzer/envAnalyzer");
47
43
  const knownEnvVars_1 = require("../constants/knownEnvVars");
48
44
  const configLoader_1 = require("../config/configLoader");
45
+ const logger_1 = require("../utils/logger");
49
46
  async function scanCommand(options) {
50
47
  const rootDir = process.cwd();
51
48
  // Load configuration
52
49
  const config = configLoader_1.ConfigLoader.loadConfig(rootDir);
53
50
  // CLI options override config file
54
51
  const strictMode = options.strict !== undefined ? options.strict : config.strict;
55
- console.log(chalk_1.default.blue('🔍 Scanning codebase for environment variables...\n'));
52
+ logger_1.Logger.startSpinner('Scanning codebase for environment variables...');
56
53
  // Step 1: Find all .env files and serverless.yml files
57
54
  const scanner = new codeScanner_1.CodeScanner(rootDir);
58
55
  const envFiles = await scanner.findEnvFiles();
59
56
  const serverlessFiles = await scanner.findServerlessFiles();
57
+ logger_1.Logger.stopSpinner();
60
58
  if (envFiles.length === 0 && serverlessFiles.length === 0) {
61
- console.log(chalk_1.default.yellow('⚠️ No .env or serverless.yml files found in the project\n'));
59
+ logger_1.Logger.warning('No .env or serverless.yml files found in the project');
60
+ logger_1.Logger.blank();
62
61
  return { success: false, issues: [] };
63
62
  }
64
- console.log(chalk_1.default.green(`✓ Found ${envFiles.length} .env file(s) and ${serverlessFiles.length} serverless.yml file(s)\n`));
63
+ logger_1.Logger.success(`Found ${envFiles.length} .env file(s) and ${serverlessFiles.length} serverless.yml file(s)`);
64
+ logger_1.Logger.blank();
65
65
  const parser = new envParser_1.EnvParser();
66
66
  const serverlessParser = new serverlessParser_1.ServerlessParser();
67
67
  const analyzer = new envAnalyzer_1.EnvAnalyzer();
@@ -70,13 +70,15 @@ async function scanCommand(options) {
70
70
  for (const serverlessFilePath of serverlessFiles) {
71
71
  const serverlessDir = path.dirname(serverlessFilePath);
72
72
  const relativePath = path.relative(rootDir, serverlessFilePath);
73
- console.log(chalk_1.default.cyan(`📂 Checking ${relativePath}\n`));
73
+ logger_1.Logger.path(`Checking ${relativePath}`);
74
+ logger_1.Logger.blank();
74
75
  // Parse serverless.yml
75
76
  const serverlessVars = serverlessParser.parse(serverlessFilePath);
76
- console.log(chalk_1.default.gray(` Found ${serverlessVars.size} variable(s) in serverless.yml`));
77
+ logger_1.Logger.info(`Found ${serverlessVars.size} variable(s) in serverless.yml`, true);
77
78
  // Scan code files in this directory to see what's actually used
78
79
  const usedVars = await scanDirectoryForCodeVars(rootDir, serverlessDir, scanner);
79
- console.log(chalk_1.default.gray(` Found ${usedVars.size} variable(s) used in code\n`));
80
+ logger_1.Logger.info(`Found ${usedVars.size} variable(s) used in code`, true);
81
+ logger_1.Logger.blank();
80
82
  // Check for unused variables in serverless.yml
81
83
  const unusedServerlessVars = [];
82
84
  for (const [varName] of serverlessVars.entries()) {
@@ -108,23 +110,23 @@ async function scanCommand(options) {
108
110
  }
109
111
  }
110
112
  if (unusedServerlessVars.length > 0) {
111
- console.log(chalk_1.default.yellow.bold(' ⚠️ Unused variables in serverless.yml:'));
112
- unusedServerlessVars.forEach((varName, index) => {
113
- console.log(chalk_1.default.yellow(` ${index + 1}. ${varName}`));
113
+ logger_1.Logger.warning('Unused variables in serverless.yml:', true);
114
+ unusedServerlessVars.forEach((varName) => {
115
+ logger_1.Logger.warningItem(varName, 2);
114
116
  allIssues.push({
115
117
  type: 'unused',
116
118
  varName,
117
119
  details: `Defined in serverless.yml but never used in code`,
118
120
  });
119
121
  });
120
- console.log();
122
+ logger_1.Logger.blank();
121
123
  }
122
124
  if (missingFromServerless.length > 0) {
123
- console.log(chalk_1.default.red.bold(' 🚨 Missing from serverless.yml:'));
124
- missingFromServerless.forEach((item, index) => {
125
- console.log(chalk_1.default.red(` ${index + 1}. ${item.varName}`));
125
+ logger_1.Logger.error('Missing from serverless.yml:', true);
126
+ missingFromServerless.forEach((item) => {
127
+ logger_1.Logger.errorItem(item.varName, 2);
126
128
  if (item.locations && item.locations.length > 0) {
127
- console.log(chalk_1.default.gray(` Used in: ${item.locations.slice(0, 2).join(', ')}`));
129
+ logger_1.Logger.info(`Used in: ${item.locations.slice(0, 2).join(', ')}`, true);
128
130
  }
129
131
  allIssues.push({
130
132
  type: 'missing',
@@ -133,14 +135,15 @@ async function scanCommand(options) {
133
135
  locations: item.locations,
134
136
  });
135
137
  });
136
- console.log();
138
+ logger_1.Logger.blank();
137
139
  }
138
140
  if (unusedServerlessVars.length === 0 && missingFromServerless.length === 0) {
139
- console.log(chalk_1.default.green('No issues in this serverless.yml\n'));
141
+ logger_1.Logger.success('No issues in this serverless.yml', true);
142
+ logger_1.Logger.blank();
140
143
  }
141
144
  // Show skipped runtime variables in non-strict mode
142
145
  if (!strictMode && skippedRuntimeVars.length > 0) {
143
- console.log(chalk_1.default.gray(' ℹ️ Skipped known runtime variables (use --strict to show):'));
146
+ logger_1.Logger.info('Skipped known runtime variables (use --strict to show):', true);
144
147
  // Group by category
145
148
  const grouped = new Map();
146
149
  for (const { varName, category } of skippedRuntimeVars) {
@@ -150,9 +153,9 @@ async function scanCommand(options) {
150
153
  grouped.get(category).push(varName);
151
154
  }
152
155
  for (const [category, vars] of grouped.entries()) {
153
- console.log(chalk_1.default.gray(` ${category}: ${vars.join(', ')}`));
156
+ logger_1.Logger.info(`${category}: ${vars.join(', ')}`, true);
154
157
  }
155
- console.log();
158
+ logger_1.Logger.blank();
156
159
  }
157
160
  }
158
161
  // Step 2b: Process each .env file (including directories that also have serverless.yml)
@@ -160,17 +163,19 @@ async function scanCommand(options) {
160
163
  const envDir = path.dirname(envFilePath);
161
164
  const relativePath = path.relative(rootDir, envDir);
162
165
  const displayPath = relativePath || '.';
163
- console.log(chalk_1.default.cyan(`📂 Checking ${displayPath}/\n`));
166
+ logger_1.Logger.path(`Checking ${displayPath}/`);
167
+ logger_1.Logger.blank();
164
168
  // Step 3: Scan code files in this directory and subdirectories
165
169
  const usedVars = await scanDirectoryForVars(rootDir, envDir, scanner);
166
- console.log(chalk_1.default.gray(` Found ${usedVars.size} variable(s) used in this scope`));
170
+ logger_1.Logger.info(`Found ${usedVars.size} variable(s) used in this scope`, true);
167
171
  // Step 4: Parse .env file
168
172
  const definedVars = parser.parse(envFilePath);
169
- console.log(chalk_1.default.gray(` Found ${definedVars.size} variable(s) in .env`));
173
+ logger_1.Logger.info(`Found ${definedVars.size} variable(s) in .env`, true);
170
174
  // Step 5: Parse .env.example
171
175
  const examplePath = path.join(envDir, '.env.example');
172
176
  const exampleVars = parser.parseExample(examplePath);
173
- console.log(chalk_1.default.gray(` Found ${exampleVars.size} variable(s) in .env.example\n`));
177
+ logger_1.Logger.info(`Found ${exampleVars.size} variable(s) in .env.example`, true);
178
+ logger_1.Logger.blank();
174
179
  // Step 6: Analyze and find issues
175
180
  const result = analyzer.analyze(usedVars, definedVars, exampleVars);
176
181
  if (result.issues.length > 0) {
@@ -179,49 +184,54 @@ async function scanCommand(options) {
179
184
  const unusedIssues = result.issues.filter(i => i.type === 'unused');
180
185
  const undocumentedIssues = result.issues.filter(i => i.type === 'undocumented');
181
186
  if (missingIssues.length > 0) {
182
- console.log(chalk_1.default.red.bold(' 🚨 Missing from .env:'));
183
- missingIssues.forEach((issue, index) => {
184
- console.log(chalk_1.default.red(` ${index + 1}. ${issue.varName}`));
187
+ logger_1.Logger.error('Missing from .env:', true);
188
+ missingIssues.forEach((issue) => {
189
+ logger_1.Logger.errorItem(issue.varName, 2);
185
190
  if (issue.locations && issue.locations.length > 0) {
186
- console.log(chalk_1.default.gray(` Used in: ${issue.locations.slice(0, 2).join(', ')}`));
191
+ logger_1.Logger.info(`Used in: ${issue.locations.slice(0, 2).join(', ')}`, true);
187
192
  }
188
193
  });
189
- console.log();
194
+ logger_1.Logger.blank();
190
195
  }
191
196
  if (unusedIssues.length > 0) {
192
- console.log(chalk_1.default.yellow.bold(' ⚠️ Unused variables:'));
193
- unusedIssues.forEach((issue, index) => {
194
- console.log(chalk_1.default.yellow(` ${index + 1}. ${issue.varName}`));
197
+ logger_1.Logger.warning('Unused variables:', true);
198
+ unusedIssues.forEach((issue) => {
199
+ logger_1.Logger.warningItem(issue.varName, 2);
195
200
  });
196
- console.log();
201
+ logger_1.Logger.blank();
197
202
  }
198
203
  if (undocumentedIssues.length > 0) {
199
- console.log(chalk_1.default.blue.bold(' 📝 Missing from .env.example:'));
200
- undocumentedIssues.forEach((issue, index) => {
201
- console.log(chalk_1.default.blue(` ${index + 1}. ${issue.varName}`));
204
+ logger_1.Logger.info('Missing from .env.example:', true);
205
+ undocumentedIssues.forEach((issue) => {
206
+ logger_1.Logger.infoItem(issue.varName, 2);
202
207
  });
203
- console.log();
208
+ logger_1.Logger.blank();
204
209
  }
205
210
  allIssues.push(...result.issues);
206
211
  }
207
212
  else {
208
- console.log(chalk_1.default.green('No issues in this directory\n'));
213
+ logger_1.Logger.success('No issues in this directory', true);
214
+ logger_1.Logger.blank();
209
215
  }
210
216
  }
211
217
  // Display summary
212
- console.log(chalk_1.default.bold('─'.repeat(50)));
218
+ logger_1.Logger.divider();
213
219
  if (allIssues.length === 0) {
214
- console.log(chalk_1.default.green('\n✅ No issues found! All environment variables are in sync.\n'));
220
+ logger_1.Logger.summary('No issues found! All environment variables are in sync.');
215
221
  return { success: true, issues: [] };
216
222
  }
217
- console.log(chalk_1.default.yellow(`\n⚠️ Total: ${allIssues.length} issue(s) across ${envFiles.length} location(s)\n`));
223
+ logger_1.Logger.blank();
224
+ logger_1.Logger.warning(`Total: ${allIssues.length} issue(s) across ${envFiles.length} location(s)`);
225
+ logger_1.Logger.blank();
218
226
  // Suggest fix
219
227
  if (!options.ci) {
220
- console.log(chalk_1.default.cyan('💡 Run `envguard fix` to auto-generate .env.example files\n'));
228
+ logger_1.Logger.info('Run `envguard fix` to auto-generate .env.example files');
229
+ logger_1.Logger.blank();
221
230
  }
222
231
  // Exit with error code in CI mode
223
232
  if (options.ci) {
224
- console.log(chalk_1.default.red('Issues found. Exiting with error code 1.\n'));
233
+ logger_1.Logger.error('Issues found. Exiting with error code 1.');
234
+ logger_1.Logger.blank();
225
235
  process.exit(1);
226
236
  }
227
237
  return { success: false, issues: allIssues };
@@ -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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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Minimalist red-themed logger inspired by Serverless Framework v4
3
+ * Uses minimal colors and simple symbols for a clean, professional look
4
+ */
5
+ export declare class Logger {
6
+ private static spinnerFrames;
7
+ private static spinnerInterval;
8
+ private static currentFrame;
9
+ private static spinnerMessage;
10
+ /**
11
+ * Start an animated spinner with a message
12
+ */
13
+ static startSpinner(message: string): void;
14
+ /**
15
+ * Stop the spinner and clear the line
16
+ */
17
+ static stopSpinner(finalMessage?: string): void;
18
+ /**
19
+ * Log a header/section message (minimalist, no icons)
20
+ */
21
+ static header(message: string): void;
22
+ /**
23
+ * Log a success message with checkmark
24
+ */
25
+ static success(message: string, indent?: boolean): void;
26
+ /**
27
+ * Log an error message (red themed)
28
+ */
29
+ static error(message: string, indent?: boolean): void;
30
+ /**
31
+ * Log a warning message (yellow/amber)
32
+ */
33
+ static warning(message: string, indent?: boolean): void;
34
+ /**
35
+ * Log an info message (very minimal)
36
+ */
37
+ static info(message: string, indent?: boolean): void;
38
+ /**
39
+ * Log a list item (error themed in red)
40
+ */
41
+ static errorItem(message: string, indent?: number): void;
42
+ /**
43
+ * Log a list item (warning themed, yellow/amber)
44
+ */
45
+ static warningItem(message: string, indent?: number): void;
46
+ /**
47
+ * Log a list item (info themed, very dim)
48
+ */
49
+ static infoItem(message: string, indent?: number): void;
50
+ /**
51
+ * Log a divider
52
+ */
53
+ static divider(): void;
54
+ /**
55
+ * Log a blank line
56
+ */
57
+ static blank(): void;
58
+ /**
59
+ * Log a final summary message (Serverless-style)
60
+ */
61
+ static summary(message: string): void;
62
+ /**
63
+ * Log a path/file reference (dimmed)
64
+ */
65
+ static path(message: string, indent?: boolean): void;
66
+ /**
67
+ * Log deployment-style message (like "Deploying to stage dev")
68
+ */
69
+ static deployment(message: string): void;
70
+ }
71
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,aAAa,CAAsD;IAClF,OAAO,CAAC,MAAM,CAAC,eAAe,CAA+B;IAC7D,OAAO,CAAC,MAAM,CAAC,YAAY,CAAK;IAChC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAM;IAEnC;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM;IAgBnC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,MAAM;IAaxC;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM;IAI7B;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAQ;IAK9C;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAQ;IAK5C;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAQ;IAK9C;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAQ;IAK3C;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAI;IAK5C;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAI;IAK9C;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAI;IAK3C;;OAEG;IACH,MAAM,CAAC,OAAO;IAId;;OAEG;IACH,MAAM,CAAC,KAAK;IAIZ;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM;IAI9B;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAQ;IAK3C;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM;CAGlC"}
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Logger = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ /**
9
+ * Minimalist red-themed logger inspired by Serverless Framework v4
10
+ * Uses minimal colors and simple symbols for a clean, professional look
11
+ */
12
+ class Logger {
13
+ /**
14
+ * Start an animated spinner with a message
15
+ */
16
+ static startSpinner(message) {
17
+ this.spinnerMessage = message;
18
+ this.currentFrame = 0;
19
+ if (this.spinnerInterval) {
20
+ this.stopSpinner();
21
+ }
22
+ process.stdout.write('\n');
23
+ this.spinnerInterval = setInterval(() => {
24
+ const frame = this.spinnerFrames[this.currentFrame];
25
+ process.stdout.write(`\r${chalk_1.default.dim(frame)} ${this.spinnerMessage}`);
26
+ this.currentFrame = (this.currentFrame + 1) % this.spinnerFrames.length;
27
+ }, 80);
28
+ }
29
+ /**
30
+ * Stop the spinner and clear the line
31
+ */
32
+ static stopSpinner(finalMessage) {
33
+ if (this.spinnerInterval) {
34
+ clearInterval(this.spinnerInterval);
35
+ this.spinnerInterval = null;
36
+ }
37
+ if (finalMessage) {
38
+ process.stdout.write(`\r${finalMessage}\n`);
39
+ }
40
+ else {
41
+ process.stdout.write('\r\x1b[K'); // Clear line
42
+ }
43
+ }
44
+ /**
45
+ * Log a header/section message (minimalist, no icons)
46
+ */
47
+ static header(message) {
48
+ console.log(chalk_1.default.dim(message));
49
+ }
50
+ /**
51
+ * Log a success message with checkmark
52
+ */
53
+ static success(message, indent = false) {
54
+ const prefix = indent ? ' ' : '';
55
+ console.log(`${prefix}${chalk_1.default.dim('✔')} ${message}`);
56
+ }
57
+ /**
58
+ * Log an error message (red themed)
59
+ */
60
+ static error(message, indent = false) {
61
+ const prefix = indent ? ' ' : '';
62
+ console.log(`${prefix}${chalk_1.default.red('✖')} ${chalk_1.default.red(message)}`);
63
+ }
64
+ /**
65
+ * Log a warning message (yellow/amber)
66
+ */
67
+ static warning(message, indent = false) {
68
+ const prefix = indent ? ' ' : '';
69
+ console.log(`${prefix}${chalk_1.default.hex('#FFA500')('⚠')} ${chalk_1.default.hex('#FFA500')(message)}`);
70
+ }
71
+ /**
72
+ * Log an info message (very minimal)
73
+ */
74
+ static info(message, indent = false) {
75
+ const prefix = indent ? ' ' : '';
76
+ console.log(`${prefix}${chalk_1.default.dim(message)}`);
77
+ }
78
+ /**
79
+ * Log a list item (error themed in red)
80
+ */
81
+ static errorItem(message, indent = 1) {
82
+ const prefix = ' '.repeat(indent);
83
+ console.log(`${prefix}${chalk_1.default.red('•')} ${chalk_1.default.red(message)}`);
84
+ }
85
+ /**
86
+ * Log a list item (warning themed, yellow/amber)
87
+ */
88
+ static warningItem(message, indent = 1) {
89
+ const prefix = ' '.repeat(indent);
90
+ console.log(`${prefix}${chalk_1.default.hex('#FFA500')('•')} ${chalk_1.default.hex('#FFA500')(message)}`);
91
+ }
92
+ /**
93
+ * Log a list item (info themed, very dim)
94
+ */
95
+ static infoItem(message, indent = 1) {
96
+ const prefix = ' '.repeat(indent);
97
+ console.log(`${prefix}${chalk_1.default.dim('•')} ${chalk_1.default.dim(message)}`);
98
+ }
99
+ /**
100
+ * Log a divider
101
+ */
102
+ static divider() {
103
+ console.log(chalk_1.default.dim('─'.repeat(50)));
104
+ }
105
+ /**
106
+ * Log a blank line
107
+ */
108
+ static blank() {
109
+ console.log();
110
+ }
111
+ /**
112
+ * Log a final summary message (Serverless-style)
113
+ */
114
+ static summary(message) {
115
+ console.log(`\n${chalk_1.default.dim('✔')} ${message}\n`);
116
+ }
117
+ /**
118
+ * Log a path/file reference (dimmed)
119
+ */
120
+ static path(message, indent = false) {
121
+ const prefix = indent ? ' ' : '';
122
+ console.log(`${prefix}${chalk_1.default.dim(message)}`);
123
+ }
124
+ /**
125
+ * Log deployment-style message (like "Deploying to stage dev")
126
+ */
127
+ static deployment(message) {
128
+ console.log(`\n${message}\n`);
129
+ }
130
+ }
131
+ exports.Logger = Logger;
132
+ Logger.spinnerFrames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
133
+ Logger.spinnerInterval = null;
134
+ Logger.currentFrame = 0;
135
+ Logger.spinnerMessage = '';
136
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@danielszlaski/envguard",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "CLI tool to keep environment variables in sync with your codebase",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
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 { Logger } from './utils/logger';
7
8
 
8
9
  const program = new Command();
9
10
 
@@ -21,7 +22,7 @@ program
21
22
  try {
22
23
  await scanCommand(options);
23
24
  } catch (error) {
24
- console.error('Error:', error);
25
+ Logger.error(`${error}`);
25
26
  process.exit(1);
26
27
  }
27
28
  });
@@ -33,7 +34,7 @@ program
33
34
  try {
34
35
  await fixCommand();
35
36
  } catch (error) {
36
- console.error('Error:', error);
37
+ Logger.error(`${error}`);
37
38
  process.exit(1);
38
39
  }
39
40
  });
@@ -46,7 +47,7 @@ program
46
47
  try {
47
48
  await scanCommand({ ci: true, strict: options.strict });
48
49
  } catch (error) {
49
- console.error('Error:', error);
50
+ Logger.error(`${error}`);
50
51
  process.exit(1);
51
52
  }
52
53
  });
@@ -1,25 +1,29 @@
1
1
  import * as path from 'path';
2
2
  import * as fs from 'fs';
3
- import chalk from 'chalk';
4
3
  import { CodeScanner } from '../scanner/codeScanner';
5
4
  import { EnvParser } from '../parser/envParser';
6
5
  import { EnvAnalyzer } from '../analyzer/envAnalyzer';
6
+ import { Logger } from '../utils/logger';
7
7
 
8
8
  export async function fixCommand() {
9
9
  const rootDir = process.cwd();
10
10
 
11
- console.log(chalk.blue('🔧 Generating .env.example files...\n'));
11
+ Logger.startSpinner('Generating .env.example files...');
12
12
 
13
13
  // Step 1: Find all .env files
14
14
  const scanner = new CodeScanner(rootDir);
15
15
  const envFiles = await scanner.findEnvFiles();
16
16
 
17
+ Logger.stopSpinner();
18
+
17
19
  if (envFiles.length === 0) {
18
- console.log(chalk.yellow('⚠️ No .env files found in the project\n'));
20
+ Logger.warning('No .env files found in the project');
21
+ Logger.blank();
19
22
  return { success: false };
20
23
  }
21
24
 
22
- console.log(chalk.green(`✓ Found ${envFiles.length} .env file(s)\n`));
25
+ Logger.success(`Found ${envFiles.length} .env file(s)`);
26
+ Logger.blank();
23
27
 
24
28
  const parser = new EnvParser();
25
29
  const analyzer = new EnvAnalyzer();
@@ -31,17 +35,19 @@ export async function fixCommand() {
31
35
  const relativePath = path.relative(rootDir, envDir);
32
36
  const displayPath = relativePath || '.';
33
37
 
34
- console.log(chalk.cyan(`📂 Processing ${displayPath}/`));
38
+ Logger.path(`Processing ${displayPath}/`);
35
39
 
36
40
  // Step 3: Scan code files in this directory and subdirectories
37
41
  const usedVars = await scanDirectoryForVars(rootDir, envDir, scanner);
38
42
 
39
43
  if (usedVars.size === 0) {
40
- console.log(chalk.gray(` No environment variables found in code\n`));
44
+ Logger.info('No environment variables found in code', true);
45
+ Logger.blank();
41
46
  continue;
42
47
  }
43
48
 
44
- console.log(chalk.green(`Found ${usedVars.size} variable(s) used in this directory\n`));
49
+ Logger.success(`Found ${usedVars.size} variable(s) used in this directory`, true);
50
+ Logger.blank();
45
51
 
46
52
  // Step 4: Parse existing .env.example to preserve comments
47
53
  const examplePath = path.join(envDir, '.env.example');
@@ -53,7 +59,8 @@ export async function fixCommand() {
53
59
  // Step 6: Write to .env.example
54
60
  fs.writeFileSync(examplePath, newContent, 'utf-8');
55
61
 
56
- console.log(chalk.green(`Generated ${path.relative(rootDir, examplePath)}\n`));
62
+ Logger.success(`Generated ${path.relative(rootDir, examplePath)}`, true);
63
+ Logger.blank();
57
64
 
58
65
  totalVars += usedVars.size;
59
66
 
@@ -62,11 +69,12 @@ export async function fixCommand() {
62
69
  const missingFromEnv = Array.from(usedVars.keys()).filter(v => !definedVars.has(v));
63
70
 
64
71
  if (missingFromEnv.length > 0) {
65
- console.log(chalk.yellow(` ⚠️ Missing from .env: ${missingFromEnv.join(', ')}\n`));
72
+ Logger.warning(`Missing from .env: ${missingFromEnv.join(', ')}`, true);
73
+ Logger.blank();
66
74
  }
67
75
  }
68
76
 
69
- console.log(chalk.green(`🎉 Done! Generated ${envFiles.length} .env.example file(s) with ${totalVars} total variables\n`));
77
+ Logger.summary(`Generated ${envFiles.length} .env.example file(s) with ${totalVars} total variables`);
70
78
 
71
79
  return { success: true };
72
80
  }
@@ -1,6 +1,5 @@
1
1
  import * as path from 'path';
2
2
  import * as fs from 'fs';
3
- import chalk from 'chalk';
4
3
  import { glob } from 'glob';
5
4
  import { CodeScanner } from '../scanner/codeScanner';
6
5
  import { EnvParser, EnvEntry } from '../parser/envParser';
@@ -9,6 +8,7 @@ import { EnvAnalyzer } from '../analyzer/envAnalyzer';
9
8
  import { Issue } from '../types';
10
9
  import { isKnownRuntimeVar, getRuntimeVarCategory } from '../constants/knownEnvVars';
11
10
  import { ConfigLoader } from '../config/configLoader';
11
+ import { Logger } from '../utils/logger';
12
12
 
13
13
  export async function scanCommand(options: { ci?: boolean; strict?: boolean }) {
14
14
  const rootDir = process.cwd();
@@ -19,19 +19,23 @@ export async function scanCommand(options: { ci?: boolean; strict?: boolean }) {
19
19
  // CLI options override config file
20
20
  const strictMode = options.strict !== undefined ? options.strict : config.strict;
21
21
 
22
- console.log(chalk.blue('🔍 Scanning codebase for environment variables...\n'));
22
+ Logger.startSpinner('Scanning codebase for environment variables...');
23
23
 
24
24
  // Step 1: Find all .env files and serverless.yml files
25
25
  const scanner = new CodeScanner(rootDir);
26
26
  const envFiles = await scanner.findEnvFiles();
27
27
  const serverlessFiles = await scanner.findServerlessFiles();
28
28
 
29
+ Logger.stopSpinner();
30
+
29
31
  if (envFiles.length === 0 && serverlessFiles.length === 0) {
30
- console.log(chalk.yellow('⚠️ No .env or serverless.yml files found in the project\n'));
32
+ Logger.warning('No .env or serverless.yml files found in the project');
33
+ Logger.blank();
31
34
  return { success: false, issues: [] };
32
35
  }
33
36
 
34
- console.log(chalk.green(`✓ Found ${envFiles.length} .env file(s) and ${serverlessFiles.length} serverless.yml file(s)\n`));
37
+ Logger.success(`Found ${envFiles.length} .env file(s) and ${serverlessFiles.length} serverless.yml file(s)`);
38
+ Logger.blank();
35
39
 
36
40
  const parser = new EnvParser();
37
41
  const serverlessParser = new ServerlessParser();
@@ -43,15 +47,17 @@ export async function scanCommand(options: { ci?: boolean; strict?: boolean }) {
43
47
  const serverlessDir = path.dirname(serverlessFilePath);
44
48
  const relativePath = path.relative(rootDir, serverlessFilePath);
45
49
 
46
- console.log(chalk.cyan(`📂 Checking ${relativePath}\n`));
50
+ Logger.path(`Checking ${relativePath}`);
51
+ Logger.blank();
47
52
 
48
53
  // Parse serverless.yml
49
54
  const serverlessVars = serverlessParser.parse(serverlessFilePath);
50
- console.log(chalk.gray(` Found ${serverlessVars.size} variable(s) in serverless.yml`));
55
+ Logger.info(`Found ${serverlessVars.size} variable(s) in serverless.yml`, true);
51
56
 
52
57
  // Scan code files in this directory to see what's actually used
53
58
  const usedVars = await scanDirectoryForCodeVars(rootDir, serverlessDir, scanner);
54
- console.log(chalk.gray(` Found ${usedVars.size} variable(s) used in code\n`));
59
+ Logger.info(`Found ${usedVars.size} variable(s) used in code`, true);
60
+ Logger.blank();
55
61
 
56
62
  // Check for unused variables in serverless.yml
57
63
  const unusedServerlessVars: string[] = [];
@@ -87,24 +93,24 @@ export async function scanCommand(options: { ci?: boolean; strict?: boolean }) {
87
93
  }
88
94
 
89
95
  if (unusedServerlessVars.length > 0) {
90
- console.log(chalk.yellow.bold(' ⚠️ Unused variables in serverless.yml:'));
91
- unusedServerlessVars.forEach((varName, index) => {
92
- console.log(chalk.yellow(` ${index + 1}. ${varName}`));
96
+ Logger.warning('Unused variables in serverless.yml:', true);
97
+ unusedServerlessVars.forEach((varName) => {
98
+ Logger.warningItem(varName, 2);
93
99
  allIssues.push({
94
100
  type: 'unused',
95
101
  varName,
96
102
  details: `Defined in serverless.yml but never used in code`,
97
103
  });
98
104
  });
99
- console.log();
105
+ Logger.blank();
100
106
  }
101
107
 
102
108
  if (missingFromServerless.length > 0) {
103
- console.log(chalk.red.bold(' 🚨 Missing from serverless.yml:'));
104
- missingFromServerless.forEach((item, index) => {
105
- console.log(chalk.red(` ${index + 1}. ${item.varName}`));
109
+ Logger.error('Missing from serverless.yml:', true);
110
+ missingFromServerless.forEach((item) => {
111
+ Logger.errorItem(item.varName, 2);
106
112
  if (item.locations && item.locations.length > 0) {
107
- console.log(chalk.gray(` Used in: ${item.locations.slice(0, 2).join(', ')}`));
113
+ Logger.info(`Used in: ${item.locations.slice(0, 2).join(', ')}`, true);
108
114
  }
109
115
  allIssues.push({
110
116
  type: 'missing',
@@ -113,16 +119,17 @@ export async function scanCommand(options: { ci?: boolean; strict?: boolean }) {
113
119
  locations: item.locations,
114
120
  });
115
121
  });
116
- console.log();
122
+ Logger.blank();
117
123
  }
118
124
 
119
125
  if (unusedServerlessVars.length === 0 && missingFromServerless.length === 0) {
120
- console.log(chalk.green('No issues in this serverless.yml\n'));
126
+ Logger.success('No issues in this serverless.yml', true);
127
+ Logger.blank();
121
128
  }
122
129
 
123
130
  // Show skipped runtime variables in non-strict mode
124
131
  if (!strictMode && skippedRuntimeVars.length > 0) {
125
- console.log(chalk.gray(' ℹ️ Skipped known runtime variables (use --strict to show):'));
132
+ Logger.info('Skipped known runtime variables (use --strict to show):', true);
126
133
  // Group by category
127
134
  const grouped = new Map<string, string[]>();
128
135
  for (const { varName, category } of skippedRuntimeVars) {
@@ -132,9 +139,9 @@ export async function scanCommand(options: { ci?: boolean; strict?: boolean }) {
132
139
  grouped.get(category)!.push(varName);
133
140
  }
134
141
  for (const [category, vars] of grouped.entries()) {
135
- console.log(chalk.gray(` ${category}: ${vars.join(', ')}`));
142
+ Logger.info(`${category}: ${vars.join(', ')}`, true);
136
143
  }
137
- console.log();
144
+ Logger.blank();
138
145
  }
139
146
  }
140
147
 
@@ -144,21 +151,23 @@ export async function scanCommand(options: { ci?: boolean; strict?: boolean }) {
144
151
  const relativePath = path.relative(rootDir, envDir);
145
152
  const displayPath = relativePath || '.';
146
153
 
147
- console.log(chalk.cyan(`📂 Checking ${displayPath}/\n`));
154
+ Logger.path(`Checking ${displayPath}/`);
155
+ Logger.blank();
148
156
 
149
157
  // Step 3: Scan code files in this directory and subdirectories
150
158
  const usedVars = await scanDirectoryForVars(rootDir, envDir, scanner);
151
159
 
152
- console.log(chalk.gray(` Found ${usedVars.size} variable(s) used in this scope`));
160
+ Logger.info(`Found ${usedVars.size} variable(s) used in this scope`, true);
153
161
 
154
162
  // Step 4: Parse .env file
155
163
  const definedVars = parser.parse(envFilePath);
156
- console.log(chalk.gray(` Found ${definedVars.size} variable(s) in .env`));
164
+ Logger.info(`Found ${definedVars.size} variable(s) in .env`, true);
157
165
 
158
166
  // Step 5: Parse .env.example
159
167
  const examplePath = path.join(envDir, '.env.example');
160
168
  const exampleVars = parser.parseExample(examplePath);
161
- console.log(chalk.gray(` Found ${exampleVars.size} variable(s) in .env.example\n`));
169
+ Logger.info(`Found ${exampleVars.size} variable(s) in .env.example`, true);
170
+ Logger.blank();
162
171
 
163
172
  // Step 6: Analyze and find issues
164
173
  const result = analyzer.analyze(usedVars, definedVars, exampleVars);
@@ -170,55 +179,60 @@ export async function scanCommand(options: { ci?: boolean; strict?: boolean }) {
170
179
  const undocumentedIssues = result.issues.filter(i => i.type === 'undocumented');
171
180
 
172
181
  if (missingIssues.length > 0) {
173
- console.log(chalk.red.bold(' 🚨 Missing from .env:'));
174
- missingIssues.forEach((issue, index) => {
175
- console.log(chalk.red(` ${index + 1}. ${issue.varName}`));
182
+ Logger.error('Missing from .env:', true);
183
+ missingIssues.forEach((issue) => {
184
+ Logger.errorItem(issue.varName, 2);
176
185
  if (issue.locations && issue.locations.length > 0) {
177
- console.log(chalk.gray(` Used in: ${issue.locations.slice(0, 2).join(', ')}`));
186
+ Logger.info(`Used in: ${issue.locations.slice(0, 2).join(', ')}`, true);
178
187
  }
179
188
  });
180
- console.log();
189
+ Logger.blank();
181
190
  }
182
191
 
183
192
  if (unusedIssues.length > 0) {
184
- console.log(chalk.yellow.bold(' ⚠️ Unused variables:'));
185
- unusedIssues.forEach((issue, index) => {
186
- console.log(chalk.yellow(` ${index + 1}. ${issue.varName}`));
193
+ Logger.warning('Unused variables:', true);
194
+ unusedIssues.forEach((issue) => {
195
+ Logger.warningItem(issue.varName, 2);
187
196
  });
188
- console.log();
197
+ Logger.blank();
189
198
  }
190
199
 
191
200
  if (undocumentedIssues.length > 0) {
192
- console.log(chalk.blue.bold(' 📝 Missing from .env.example:'));
193
- undocumentedIssues.forEach((issue, index) => {
194
- console.log(chalk.blue(` ${index + 1}. ${issue.varName}`));
201
+ Logger.info('Missing from .env.example:', true);
202
+ undocumentedIssues.forEach((issue) => {
203
+ Logger.infoItem(issue.varName, 2);
195
204
  });
196
- console.log();
205
+ Logger.blank();
197
206
  }
198
207
 
199
208
  allIssues.push(...result.issues);
200
209
  } else {
201
- console.log(chalk.green('No issues in this directory\n'));
210
+ Logger.success('No issues in this directory', true);
211
+ Logger.blank();
202
212
  }
203
213
  }
204
214
 
205
215
  // Display summary
206
- console.log(chalk.bold('─'.repeat(50)));
216
+ Logger.divider();
207
217
  if (allIssues.length === 0) {
208
- console.log(chalk.green('\n✅ No issues found! All environment variables are in sync.\n'));
218
+ Logger.summary('No issues found! All environment variables are in sync.');
209
219
  return { success: true, issues: [] };
210
220
  }
211
221
 
212
- console.log(chalk.yellow(`\n⚠️ Total: ${allIssues.length} issue(s) across ${envFiles.length} location(s)\n`));
222
+ Logger.blank();
223
+ Logger.warning(`Total: ${allIssues.length} issue(s) across ${envFiles.length} location(s)`);
224
+ Logger.blank();
213
225
 
214
226
  // Suggest fix
215
227
  if (!options.ci) {
216
- console.log(chalk.cyan('💡 Run `envguard fix` to auto-generate .env.example files\n'));
228
+ Logger.info('Run `envguard fix` to auto-generate .env.example files');
229
+ Logger.blank();
217
230
  }
218
231
 
219
232
  // Exit with error code in CI mode
220
233
  if (options.ci) {
221
- console.log(chalk.red('Issues found. Exiting with error code 1.\n'));
234
+ Logger.error('Issues found. Exiting with error code 1.');
235
+ Logger.blank();
222
236
  process.exit(1);
223
237
  }
224
238
 
@@ -0,0 +1,146 @@
1
+ import chalk from 'chalk';
2
+
3
+ /**
4
+ * Minimalist red-themed logger inspired by Serverless Framework v4
5
+ * Uses minimal colors and simple symbols for a clean, professional look
6
+ */
7
+ export class Logger {
8
+ private static spinnerFrames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
9
+ private static spinnerInterval: NodeJS.Timeout | null = null;
10
+ private static currentFrame = 0;
11
+ private static spinnerMessage = '';
12
+
13
+ /**
14
+ * Start an animated spinner with a message
15
+ */
16
+ static startSpinner(message: string) {
17
+ this.spinnerMessage = message;
18
+ this.currentFrame = 0;
19
+
20
+ if (this.spinnerInterval) {
21
+ this.stopSpinner();
22
+ }
23
+
24
+ process.stdout.write('\n');
25
+ this.spinnerInterval = setInterval(() => {
26
+ const frame = this.spinnerFrames[this.currentFrame];
27
+ process.stdout.write(`\r${chalk.dim(frame)} ${this.spinnerMessage}`);
28
+ this.currentFrame = (this.currentFrame + 1) % this.spinnerFrames.length;
29
+ }, 80);
30
+ }
31
+
32
+ /**
33
+ * Stop the spinner and clear the line
34
+ */
35
+ static stopSpinner(finalMessage?: string) {
36
+ if (this.spinnerInterval) {
37
+ clearInterval(this.spinnerInterval);
38
+ this.spinnerInterval = null;
39
+ }
40
+
41
+ if (finalMessage) {
42
+ process.stdout.write(`\r${finalMessage}\n`);
43
+ } else {
44
+ process.stdout.write('\r\x1b[K'); // Clear line
45
+ }
46
+ }
47
+
48
+ /**
49
+ * Log a header/section message (minimalist, no icons)
50
+ */
51
+ static header(message: string) {
52
+ console.log(chalk.dim(message));
53
+ }
54
+
55
+ /**
56
+ * Log a success message with checkmark
57
+ */
58
+ static success(message: string, indent = false) {
59
+ const prefix = indent ? ' ' : '';
60
+ console.log(`${prefix}${chalk.dim('✔')} ${message}`);
61
+ }
62
+
63
+ /**
64
+ * Log an error message (red themed)
65
+ */
66
+ static error(message: string, indent = false) {
67
+ const prefix = indent ? ' ' : '';
68
+ console.log(`${prefix}${chalk.red('✖')} ${chalk.red(message)}`);
69
+ }
70
+
71
+ /**
72
+ * Log a warning message (yellow/amber)
73
+ */
74
+ static warning(message: string, indent = false) {
75
+ const prefix = indent ? ' ' : '';
76
+ console.log(`${prefix}${chalk.hex('#FFA500')('⚠')} ${chalk.hex('#FFA500')(message)}`);
77
+ }
78
+
79
+ /**
80
+ * Log an info message (very minimal)
81
+ */
82
+ static info(message: string, indent = false) {
83
+ const prefix = indent ? ' ' : '';
84
+ console.log(`${prefix}${chalk.dim(message)}`);
85
+ }
86
+
87
+ /**
88
+ * Log a list item (error themed in red)
89
+ */
90
+ static errorItem(message: string, indent = 1) {
91
+ const prefix = ' '.repeat(indent);
92
+ console.log(`${prefix}${chalk.red('•')} ${chalk.red(message)}`);
93
+ }
94
+
95
+ /**
96
+ * Log a list item (warning themed, yellow/amber)
97
+ */
98
+ static warningItem(message: string, indent = 1) {
99
+ const prefix = ' '.repeat(indent);
100
+ console.log(`${prefix}${chalk.hex('#FFA500')('•')} ${chalk.hex('#FFA500')(message)}`);
101
+ }
102
+
103
+ /**
104
+ * Log a list item (info themed, very dim)
105
+ */
106
+ static infoItem(message: string, indent = 1) {
107
+ const prefix = ' '.repeat(indent);
108
+ console.log(`${prefix}${chalk.dim('•')} ${chalk.dim(message)}`);
109
+ }
110
+
111
+ /**
112
+ * Log a divider
113
+ */
114
+ static divider() {
115
+ console.log(chalk.dim('─'.repeat(50)));
116
+ }
117
+
118
+ /**
119
+ * Log a blank line
120
+ */
121
+ static blank() {
122
+ console.log();
123
+ }
124
+
125
+ /**
126
+ * Log a final summary message (Serverless-style)
127
+ */
128
+ static summary(message: string) {
129
+ console.log(`\n${chalk.dim('✔')} ${message}\n`);
130
+ }
131
+
132
+ /**
133
+ * Log a path/file reference (dimmed)
134
+ */
135
+ static path(message: string, indent = false) {
136
+ const prefix = indent ? ' ' : '';
137
+ console.log(`${prefix}${chalk.dim(message)}`);
138
+ }
139
+
140
+ /**
141
+ * Log deployment-style message (like "Deploying to stage dev")
142
+ */
143
+ static deployment(message: string) {
144
+ console.log(`\n${message}\n`);
145
+ }
146
+ }
@@ -1,11 +1,11 @@
1
1
  # Auto-generated by envguard
2
2
  # Do not put actual secrets in this file - use .env instead
3
3
 
4
- # Used in: test-project/src/lambda1/handler.js
4
+ # Used in: src/lambda1/handler.js
5
5
  # Format: your-secret-here
6
6
  CUSTOM_KEY=
7
7
 
8
- # Used in: test-project/src/lambda1/handler.js
8
+ # Used in: src/lambda1/handler.js
9
9
  # Format: your-secret-here
10
10
  STRIPE_SECRET_KEY=
11
11
 
@@ -1,9 +1,13 @@
1
1
  # Auto-generated by envguard
2
2
  # Do not put actual secrets in this file - use .env instead
3
3
 
4
- # Used in: test-project/src/lambda2/handler.js
4
+ # Used in: src/lambda2/handler2.js
5
+ # Format: aws-credentials
6
+ AWS_REGION=
7
+
8
+ # Used in: src/lambda2/handler.js
5
9
  OKTA_CLIENT_ID=
6
10
 
7
- # Used in: test-project/src/lambda2/handler2.js
11
+ # Used in: src/lambda2/handler2.js
8
12
  OKTA_DEV_CLIENT_ID=
9
13
 
@@ -1,23 +1,23 @@
1
1
  # Auto-generated by envguard
2
2
  # Do not put actual secrets in this file - use .env instead
3
3
 
4
- # Used in: test-project/src/payment/server.ts
4
+ # Used in: src/payment/server.ts
5
5
  # Format: your-api-key-here
6
6
  API_KEY=
7
7
 
8
- # Used in: test-project/src/payment/server.ts
8
+ # Used in: src/payment/server.ts
9
9
  # Format: postgresql://user:pass@host:5432/db
10
10
  DATABASE_URL=
11
11
 
12
- # Used in: test-project/src/payment/server.ts
12
+ # Used in: src/payment/server.ts
13
13
  # Format: 3000
14
14
  PORT=
15
15
 
16
- # Used in: test-project/src/payment/payment.js
16
+ # Used in: src/payment/payment.js
17
17
  # Format: your-secret-here
18
18
  STRIPE_SECRET_KEY=
19
19
 
20
- # Used in: test-project/src/payment/payment.js
20
+ # Used in: src/payment/payment.js
21
21
  # Format: your-secret-here
22
22
  STRIPE_WEBHOOK_SECRET=
23
23