@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 +4 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/fix.d.ts.map +1 -1
- package/dist/commands/fix.js +17 -13
- package/dist/commands/fix.js.map +1 -1
- package/dist/commands/scan.d.ts.map +1 -1
- package/dist/commands/scan.js +56 -46
- package/dist/commands/scan.js.map +1 -1
- package/dist/utils/logger.d.ts +71 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +136 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +1 -1
- package/src/cli.ts +4 -3
- package/src/commands/fix.ts +18 -10
- package/src/commands/scan.ts +57 -43
- package/src/utils/logger.ts +146 -0
- package/test-project/src/lambda1/.env.example +2 -2
- package/test-project/src/lambda2/.env.example +6 -2
- package/test-project/src/payment/.env.example +5 -5
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
|
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;;
|
|
1
|
+
{"version":3,"file":"fix.d.ts","sourceRoot":"","sources":["../../src/commands/fix.ts"],"names":[],"mappings":"AAOA,wBAAsB,UAAU;;GAwE/B"}
|
package/dist/commands/fix.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
69
|
+
logger_1.Logger.info('No environment variables found in code', true);
|
|
70
|
+
logger_1.Logger.blank();
|
|
70
71
|
continue;
|
|
71
72
|
}
|
|
72
|
-
|
|
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
|
-
|
|
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
|
-
|
|
89
|
+
logger_1.Logger.warning(`Missing from .env: ${missingFromEnv.join(', ')}`, true);
|
|
90
|
+
logger_1.Logger.blank();
|
|
87
91
|
}
|
|
88
92
|
}
|
|
89
|
-
|
|
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) {
|
package/dist/commands/fix.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fix.js","sourceRoot":"","sources":["../../src/commands/fix.ts"],"names":[],"mappings":"
|
|
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":"
|
|
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"}
|
package/dist/commands/scan.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
112
|
-
unusedServerlessVars.forEach((varName
|
|
113
|
-
|
|
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
|
-
|
|
122
|
+
logger_1.Logger.blank();
|
|
121
123
|
}
|
|
122
124
|
if (missingFromServerless.length > 0) {
|
|
123
|
-
|
|
124
|
-
missingFromServerless.forEach((item
|
|
125
|
-
|
|
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
|
-
|
|
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
|
-
|
|
138
|
+
logger_1.Logger.blank();
|
|
137
139
|
}
|
|
138
140
|
if (unusedServerlessVars.length === 0 && missingFromServerless.length === 0) {
|
|
139
|
-
|
|
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
|
-
|
|
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
|
-
|
|
156
|
+
logger_1.Logger.info(`${category}: ${vars.join(', ')}`, true);
|
|
154
157
|
}
|
|
155
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
183
|
-
missingIssues.forEach((issue
|
|
184
|
-
|
|
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
|
-
|
|
191
|
+
logger_1.Logger.info(`Used in: ${issue.locations.slice(0, 2).join(', ')}`, true);
|
|
187
192
|
}
|
|
188
193
|
});
|
|
189
|
-
|
|
194
|
+
logger_1.Logger.blank();
|
|
190
195
|
}
|
|
191
196
|
if (unusedIssues.length > 0) {
|
|
192
|
-
|
|
193
|
-
unusedIssues.forEach((issue
|
|
194
|
-
|
|
197
|
+
logger_1.Logger.warning('Unused variables:', true);
|
|
198
|
+
unusedIssues.forEach((issue) => {
|
|
199
|
+
logger_1.Logger.warningItem(issue.varName, 2);
|
|
195
200
|
});
|
|
196
|
-
|
|
201
|
+
logger_1.Logger.blank();
|
|
197
202
|
}
|
|
198
203
|
if (undocumentedIssues.length > 0) {
|
|
199
|
-
|
|
200
|
-
undocumentedIssues.forEach((issue
|
|
201
|
-
|
|
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
|
-
|
|
208
|
+
logger_1.Logger.blank();
|
|
204
209
|
}
|
|
205
210
|
allIssues.push(...result.issues);
|
|
206
211
|
}
|
|
207
212
|
else {
|
|
208
|
-
|
|
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
|
-
|
|
218
|
+
logger_1.Logger.divider();
|
|
213
219
|
if (allIssues.length === 0) {
|
|
214
|
-
|
|
220
|
+
logger_1.Logger.summary('No issues found! All environment variables are in sync.');
|
|
215
221
|
return { success: true, issues: [] };
|
|
216
222
|
}
|
|
217
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
50
|
+
Logger.error(`${error}`);
|
|
50
51
|
process.exit(1);
|
|
51
52
|
}
|
|
52
53
|
});
|
package/src/commands/fix.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
20
|
+
Logger.warning('No .env files found in the project');
|
|
21
|
+
Logger.blank();
|
|
19
22
|
return { success: false };
|
|
20
23
|
}
|
|
21
24
|
|
|
22
|
-
|
|
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
|
-
|
|
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
|
-
|
|
44
|
+
Logger.info('No environment variables found in code', true);
|
|
45
|
+
Logger.blank();
|
|
41
46
|
continue;
|
|
42
47
|
}
|
|
43
48
|
|
|
44
|
-
|
|
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
|
-
|
|
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
|
-
|
|
72
|
+
Logger.warning(`Missing from .env: ${missingFromEnv.join(', ')}`, true);
|
|
73
|
+
Logger.blank();
|
|
66
74
|
}
|
|
67
75
|
}
|
|
68
76
|
|
|
69
|
-
|
|
77
|
+
Logger.summary(`Generated ${envFiles.length} .env.example file(s) with ${totalVars} total variables`);
|
|
70
78
|
|
|
71
79
|
return { success: true };
|
|
72
80
|
}
|
package/src/commands/scan.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
50
|
+
Logger.path(`Checking ${relativePath}`);
|
|
51
|
+
Logger.blank();
|
|
47
52
|
|
|
48
53
|
// Parse serverless.yml
|
|
49
54
|
const serverlessVars = serverlessParser.parse(serverlessFilePath);
|
|
50
|
-
|
|
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
|
-
|
|
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
|
-
|
|
91
|
-
unusedServerlessVars.forEach((varName
|
|
92
|
-
|
|
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
|
-
|
|
105
|
+
Logger.blank();
|
|
100
106
|
}
|
|
101
107
|
|
|
102
108
|
if (missingFromServerless.length > 0) {
|
|
103
|
-
|
|
104
|
-
missingFromServerless.forEach((item
|
|
105
|
-
|
|
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
|
-
|
|
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
|
-
|
|
122
|
+
Logger.blank();
|
|
117
123
|
}
|
|
118
124
|
|
|
119
125
|
if (unusedServerlessVars.length === 0 && missingFromServerless.length === 0) {
|
|
120
|
-
|
|
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
|
-
|
|
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
|
-
|
|
142
|
+
Logger.info(`${category}: ${vars.join(', ')}`, true);
|
|
136
143
|
}
|
|
137
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
174
|
-
missingIssues.forEach((issue
|
|
175
|
-
|
|
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
|
-
|
|
186
|
+
Logger.info(`Used in: ${issue.locations.slice(0, 2).join(', ')}`, true);
|
|
178
187
|
}
|
|
179
188
|
});
|
|
180
|
-
|
|
189
|
+
Logger.blank();
|
|
181
190
|
}
|
|
182
191
|
|
|
183
192
|
if (unusedIssues.length > 0) {
|
|
184
|
-
|
|
185
|
-
unusedIssues.forEach((issue
|
|
186
|
-
|
|
193
|
+
Logger.warning('Unused variables:', true);
|
|
194
|
+
unusedIssues.forEach((issue) => {
|
|
195
|
+
Logger.warningItem(issue.varName, 2);
|
|
187
196
|
});
|
|
188
|
-
|
|
197
|
+
Logger.blank();
|
|
189
198
|
}
|
|
190
199
|
|
|
191
200
|
if (undocumentedIssues.length > 0) {
|
|
192
|
-
|
|
193
|
-
undocumentedIssues.forEach((issue
|
|
194
|
-
|
|
201
|
+
Logger.info('Missing from .env.example:', true);
|
|
202
|
+
undocumentedIssues.forEach((issue) => {
|
|
203
|
+
Logger.infoItem(issue.varName, 2);
|
|
195
204
|
});
|
|
196
|
-
|
|
205
|
+
Logger.blank();
|
|
197
206
|
}
|
|
198
207
|
|
|
199
208
|
allIssues.push(...result.issues);
|
|
200
209
|
} else {
|
|
201
|
-
|
|
210
|
+
Logger.success('No issues in this directory', true);
|
|
211
|
+
Logger.blank();
|
|
202
212
|
}
|
|
203
213
|
}
|
|
204
214
|
|
|
205
215
|
// Display summary
|
|
206
|
-
|
|
216
|
+
Logger.divider();
|
|
207
217
|
if (allIssues.length === 0) {
|
|
208
|
-
|
|
218
|
+
Logger.summary('No issues found! All environment variables are in sync.');
|
|
209
219
|
return { success: true, issues: [] };
|
|
210
220
|
}
|
|
211
221
|
|
|
212
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
4
|
+
# Used in: src/lambda1/handler.js
|
|
5
5
|
# Format: your-secret-here
|
|
6
6
|
CUSTOM_KEY=
|
|
7
7
|
|
|
8
|
-
# Used in:
|
|
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:
|
|
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:
|
|
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:
|
|
4
|
+
# Used in: src/payment/server.ts
|
|
5
5
|
# Format: your-api-key-here
|
|
6
6
|
API_KEY=
|
|
7
7
|
|
|
8
|
-
# Used in:
|
|
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:
|
|
12
|
+
# Used in: src/payment/server.ts
|
|
13
13
|
# Format: 3000
|
|
14
14
|
PORT=
|
|
15
15
|
|
|
16
|
-
# Used in:
|
|
16
|
+
# Used in: src/payment/payment.js
|
|
17
17
|
# Format: your-secret-here
|
|
18
18
|
STRIPE_SECRET_KEY=
|
|
19
19
|
|
|
20
|
-
# Used in:
|
|
20
|
+
# Used in: src/payment/payment.js
|
|
21
21
|
# Format: your-secret-here
|
|
22
22
|
STRIPE_WEBHOOK_SECRET=
|
|
23
23
|
|