dotenv-diff 2.3.7 → 2.3.9
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/CHANGELOG.md +301 -0
- package/README.md +44 -0
- package/dist/src/cli/program.d.ts.map +1 -1
- package/dist/src/cli/program.js +10 -1
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/cli/run.d.ts.map +1 -1
- package/dist/src/cli/run.js +4 -0
- package/dist/src/cli/run.js.map +1 -1
- package/dist/src/commands/scanUsage.d.ts.map +1 -1
- package/dist/src/commands/scanUsage.js +14 -1
- package/dist/src/commands/scanUsage.js.map +1 -1
- package/dist/src/config/options.d.ts.map +1 -1
- package/dist/src/config/options.js +6 -0
- package/dist/src/config/options.js.map +1 -1
- package/dist/src/config/types.d.ts +44 -2
- package/dist/src/config/types.d.ts.map +1 -1
- package/dist/src/core/computeHealthScore.d.ts +8 -0
- package/dist/src/core/computeHealthScore.d.ts.map +1 -0
- package/dist/src/core/computeHealthScore.js +30 -0
- package/dist/src/core/computeHealthScore.js.map +1 -0
- package/dist/src/core/detectExpirations.d.ts +14 -0
- package/dist/src/core/detectExpirations.d.ts.map +1 -0
- package/dist/src/core/detectExpirations.js +44 -0
- package/dist/src/core/detectExpirations.js.map +1 -0
- package/dist/src/core/detectInconsistentNaming.d.ts +9 -0
- package/dist/src/core/detectInconsistentNaming.d.ts.map +1 -0
- package/dist/src/core/detectInconsistentNaming.js +61 -0
- package/dist/src/core/detectInconsistentNaming.js.map +1 -0
- package/dist/src/core/detectUppercaseKeys.d.ts +9 -0
- package/dist/src/core/detectUppercaseKeys.d.ts.map +1 -0
- package/dist/src/core/detectUppercaseKeys.js +28 -0
- package/dist/src/core/detectUppercaseKeys.js.map +1 -0
- package/dist/src/core/helpers/toUpperSnakeCase.d.ts +6 -0
- package/dist/src/core/helpers/toUpperSnakeCase.d.ts.map +1 -0
- package/dist/src/core/helpers/toUpperSnakeCase.js +11 -0
- package/dist/src/core/helpers/toUpperSnakeCase.js.map +1 -0
- package/dist/src/core/processComparisonFile.d.ts +14 -0
- package/dist/src/core/processComparisonFile.d.ts.map +1 -1
- package/dist/src/core/processComparisonFile.js +31 -0
- package/dist/src/core/processComparisonFile.js.map +1 -1
- package/dist/src/core/scanJsonOutput.d.ts.map +1 -1
- package/dist/src/core/scanJsonOutput.js +17 -0
- package/dist/src/core/scanJsonOutput.js.map +1 -1
- package/dist/src/index.js +0 -6
- package/dist/src/index.js.map +1 -1
- package/dist/src/services/codeBaseScanner.d.ts.map +1 -1
- package/dist/src/services/codeBaseScanner.js +0 -6
- package/dist/src/services/codeBaseScanner.js.map +1 -1
- package/dist/src/services/scanOutputToConsole.d.ts.map +1 -1
- package/dist/src/services/scanOutputToConsole.js +19 -3
- package/dist/src/services/scanOutputToConsole.js.map +1 -1
- package/dist/src/ui/scan/printExpireWarnings.d.ts +9 -0
- package/dist/src/ui/scan/printExpireWarnings.d.ts.map +1 -0
- package/dist/src/ui/scan/printExpireWarnings.js +30 -0
- package/dist/src/ui/scan/printExpireWarnings.js.map +1 -0
- package/dist/src/ui/scan/printHealthScore.d.ts +8 -0
- package/dist/src/ui/scan/printHealthScore.d.ts.map +1 -0
- package/dist/src/ui/scan/printHealthScore.js +30 -0
- package/dist/src/ui/scan/printHealthScore.js.map +1 -0
- package/dist/src/ui/scan/printInconsistentNamingWarning.d.ts +9 -0
- package/dist/src/ui/scan/printInconsistentNamingWarning.d.ts.map +1 -0
- package/dist/src/ui/scan/printInconsistentNamingWarning.js +19 -0
- package/dist/src/ui/scan/printInconsistentNamingWarning.js.map +1 -0
- package/dist/src/ui/scan/printUppercaseWarning.d.ts +10 -0
- package/dist/src/ui/scan/printUppercaseWarning.d.ts.map +1 -0
- package/dist/src/ui/scan/printUppercaseWarning.js +19 -0
- package/dist/src/ui/scan/printUppercaseWarning.js.map +1 -0
- package/dist/src/ui/shared/printStrictModeError.d.ts +3 -0
- package/dist/src/ui/shared/printStrictModeError.d.ts.map +1 -1
- package/dist/src/ui/shared/printStrictModeError.js +6 -0
- package/dist/src/ui/shared/printStrictModeError.js.map +1 -1
- package/package.json +4 -3
|
@@ -39,6 +39,9 @@ export type Options = {
|
|
|
39
39
|
strict: boolean | undefined;
|
|
40
40
|
ignoreUrls?: string[];
|
|
41
41
|
noCompare: boolean;
|
|
42
|
+
uppercaseKeys: boolean;
|
|
43
|
+
expireWarnings: boolean;
|
|
44
|
+
inconsistentNamingWarnings: boolean;
|
|
42
45
|
};
|
|
43
46
|
/** Type representing the raw options for the comparison
|
|
44
47
|
* These are the options that are directly passed to the comparison function without any processing or validation.
|
|
@@ -68,6 +71,9 @@ export type RawOptions = {
|
|
|
68
71
|
ignoreUrls?: string[];
|
|
69
72
|
noCompare?: boolean;
|
|
70
73
|
init?: boolean;
|
|
74
|
+
uppercaseKeys?: boolean;
|
|
75
|
+
expireWarnings?: boolean;
|
|
76
|
+
inconsistentNamingWarnings?: boolean;
|
|
71
77
|
};
|
|
72
78
|
/**
|
|
73
79
|
* Type representing a single entry in the comparison results
|
|
@@ -143,10 +149,12 @@ export interface ScanResult {
|
|
|
143
149
|
count: number;
|
|
144
150
|
}>;
|
|
145
151
|
};
|
|
146
|
-
hasCsp?: boolean;
|
|
147
152
|
frameworkWarnings?: frameworkWarning[];
|
|
148
153
|
exampleWarnings?: ExampleSecretWarning[];
|
|
149
154
|
logged: EnvUsage[];
|
|
155
|
+
uppercaseWarnings?: UppercaseWarning[];
|
|
156
|
+
expireWarnings?: ExpireWarning[];
|
|
157
|
+
inconsistentNamingWarnings?: InconsistentNamingWarning[];
|
|
150
158
|
}
|
|
151
159
|
/** Options for scanning the codebase for environment variable usage. */
|
|
152
160
|
export interface ScanUsageOptions extends ScanOptions {
|
|
@@ -160,6 +168,9 @@ export interface ScanUsageOptions extends ScanOptions {
|
|
|
160
168
|
files?: string[];
|
|
161
169
|
allowDuplicates?: boolean;
|
|
162
170
|
strict?: boolean;
|
|
171
|
+
uppercaseKeys?: boolean;
|
|
172
|
+
expireWarnings?: boolean;
|
|
173
|
+
inconsistentNamingWarnings?: boolean;
|
|
163
174
|
}
|
|
164
175
|
export interface ScanJsonEntry {
|
|
165
176
|
stats: {
|
|
@@ -168,6 +179,7 @@ export interface ScanJsonEntry {
|
|
|
168
179
|
uniqueVariables: number;
|
|
169
180
|
duration: number;
|
|
170
181
|
};
|
|
182
|
+
healthScore: number;
|
|
171
183
|
missing: Array<{
|
|
172
184
|
variable: string;
|
|
173
185
|
usages: Array<{
|
|
@@ -203,13 +215,26 @@ export interface ScanJsonEntry {
|
|
|
203
215
|
count: number;
|
|
204
216
|
}>;
|
|
205
217
|
};
|
|
206
|
-
hasCsp?: boolean;
|
|
207
218
|
logged?: Array<{
|
|
208
219
|
variable: string;
|
|
209
220
|
file: string;
|
|
210
221
|
line: number;
|
|
211
222
|
context: string;
|
|
212
223
|
}>;
|
|
224
|
+
expireWarnings?: Array<{
|
|
225
|
+
key: string;
|
|
226
|
+
date: string;
|
|
227
|
+
daysLeft: number;
|
|
228
|
+
}>;
|
|
229
|
+
uppercaseWarnings?: Array<{
|
|
230
|
+
key: string;
|
|
231
|
+
suggestion: string;
|
|
232
|
+
}>;
|
|
233
|
+
inconsistentNamingWarnings?: Array<{
|
|
234
|
+
key1: string;
|
|
235
|
+
key2: string;
|
|
236
|
+
suggestion: string;
|
|
237
|
+
}>;
|
|
213
238
|
}
|
|
214
239
|
export interface VariableUsages {
|
|
215
240
|
[variable: string]: EnvUsage[];
|
|
@@ -226,6 +251,9 @@ export interface ComparisonOptions {
|
|
|
226
251
|
only?: Category[];
|
|
227
252
|
showStats?: boolean;
|
|
228
253
|
strict?: boolean;
|
|
254
|
+
uppercaseKeys?: boolean;
|
|
255
|
+
expireWarnings?: boolean;
|
|
256
|
+
inconsistentNamingWarnings?: boolean;
|
|
229
257
|
}
|
|
230
258
|
export interface FilePair {
|
|
231
259
|
envName: string;
|
|
@@ -272,4 +300,18 @@ export type Filtered = {
|
|
|
272
300
|
reason: 'no-gitignore' | 'not-ignored';
|
|
273
301
|
} | null;
|
|
274
302
|
};
|
|
303
|
+
export interface UppercaseWarning {
|
|
304
|
+
key: string;
|
|
305
|
+
suggestion: string;
|
|
306
|
+
}
|
|
307
|
+
export interface ExpireWarning {
|
|
308
|
+
key: string;
|
|
309
|
+
date: string;
|
|
310
|
+
daysLeft: number;
|
|
311
|
+
}
|
|
312
|
+
export interface InconsistentNamingWarning {
|
|
313
|
+
key1: string;
|
|
314
|
+
key2: string;
|
|
315
|
+
suggestion: string;
|
|
316
|
+
}
|
|
275
317
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAG7E,MAAM,MAAM,SAAS,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAGvD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAGD,eAAO,MAAM,kBAAkB,8EAOrB,CAAC;AAGX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,GAAG,EAAE,OAAO,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ScanResult } from '../config/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Computes a health score based on the scan results.
|
|
4
|
+
* @param scan - The result of the scan.
|
|
5
|
+
* @returns The computed health score as a number between 0 and 100.
|
|
6
|
+
*/
|
|
7
|
+
export declare function computeHealthScore(scan: ScanResult): number;
|
|
8
|
+
//# sourceMappingURL=computeHealthScore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computeHealthScore.d.ts","sourceRoot":"","sources":["../../../src/core/computeHealthScore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAiC3D"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Computes a health score based on the scan results.
|
|
3
|
+
* @param scan - The result of the scan.
|
|
4
|
+
* @returns The computed health score as a number between 0 and 100.
|
|
5
|
+
*/
|
|
6
|
+
export function computeHealthScore(scan) {
|
|
7
|
+
let score = 100;
|
|
8
|
+
// === 1. Secrets detected ===
|
|
9
|
+
const highSecrets = scan.secrets?.filter((s) => s.severity === 'high') ?? [];
|
|
10
|
+
const medSecrets = scan.secrets?.filter((s) => s.severity === 'medium') ?? [];
|
|
11
|
+
score -= highSecrets.length * 20;
|
|
12
|
+
score -= medSecrets.length * 10;
|
|
13
|
+
// === 2. Missing environment variables ===
|
|
14
|
+
score -= scan.missing.length * 20;
|
|
15
|
+
// === 3. Uppercase naming issues ===
|
|
16
|
+
score -= (scan.uppercaseWarnings?.length ?? 0) * 2;
|
|
17
|
+
// === 4. Console logging ===
|
|
18
|
+
score -= (scan.logged?.length ?? 0) * 10;
|
|
19
|
+
// === 5. Unused vars (less important) ===
|
|
20
|
+
score -= (scan.unused?.length ?? 0) * 1;
|
|
21
|
+
// === 6. Framework warnings ===
|
|
22
|
+
score -= (scan.frameworkWarnings?.length ?? 0) * 5;
|
|
23
|
+
// === 7. Example secrets ===
|
|
24
|
+
score -= (scan.exampleWarnings?.length ?? 0) * 10;
|
|
25
|
+
// === 8. Expiration warnings ===
|
|
26
|
+
score -= (scan.expireWarnings?.length ?? 0) * 5;
|
|
27
|
+
// Never go below 0 or above 100
|
|
28
|
+
return Math.max(0, Math.min(100, score));
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=computeHealthScore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computeHealthScore.js","sourceRoot":"","sources":["../../../src/core/computeHealthScore.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAgB;IACjD,IAAI,KAAK,GAAG,GAAG,CAAC;IAEhB,8BAA8B;IAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;IAC7E,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;IAE9E,KAAK,IAAI,WAAW,CAAC,MAAM,GAAG,EAAE,CAAC;IACjC,KAAK,IAAI,UAAU,CAAC,MAAM,GAAG,EAAE,CAAC;IAEhC,2CAA2C;IAC3C,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC;IAElC,qCAAqC;IACrC,KAAK,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAEnD,6BAA6B;IAC7B,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;IAEzC,0CAA0C;IAC1C,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAExC,gCAAgC;IAChC,KAAK,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAEnD,6BAA6B;IAC7B,KAAK,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;IAElD,iCAAiC;IACjC,KAAK,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAEhD,gCAAgC;IAChC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ExpireWarning } from '../config/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Detects expiration warnings in a dotenv file.
|
|
4
|
+
* fx:
|
|
5
|
+
*
|
|
6
|
+
* # @expire 2024-12-31
|
|
7
|
+
* API_KEY=
|
|
8
|
+
*
|
|
9
|
+
* This will generate a warning that API_KEY expires on 2024-12-31.
|
|
10
|
+
* @param filePath - Path to the dotenv file
|
|
11
|
+
* @returns Array of expiration warnings
|
|
12
|
+
*/
|
|
13
|
+
export declare function detectExpirations(filePath: string): ExpireWarning[];
|
|
14
|
+
//# sourceMappingURL=detectExpirations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectExpirations.d.ts","sourceRoot":"","sources":["../../../src/core/detectExpirations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CA0CnE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
/**
|
|
3
|
+
* Detects expiration warnings in a dotenv file.
|
|
4
|
+
* fx:
|
|
5
|
+
*
|
|
6
|
+
* # @expire 2024-12-31
|
|
7
|
+
* API_KEY=
|
|
8
|
+
*
|
|
9
|
+
* This will generate a warning that API_KEY expires on 2024-12-31.
|
|
10
|
+
* @param filePath - Path to the dotenv file
|
|
11
|
+
* @returns Array of expiration warnings
|
|
12
|
+
*/
|
|
13
|
+
export function detectExpirations(filePath) {
|
|
14
|
+
const lines = fs.readFileSync(filePath, 'utf8').split('\n');
|
|
15
|
+
const warnings = [];
|
|
16
|
+
const reg = /(\/\/|#)?\s*@?expire\s+(\d{4}-\d{2}-\d{2})/i;
|
|
17
|
+
let pendingExpire = null;
|
|
18
|
+
for (const raw of lines) {
|
|
19
|
+
const line = raw.trim();
|
|
20
|
+
const expireMatch = line.match(reg);
|
|
21
|
+
if (expireMatch) {
|
|
22
|
+
pendingExpire = expireMatch[2] ?? null; // capture dato
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const isEnvKey = /^[A-Za-z0-9_.-]+=/.test(line);
|
|
26
|
+
if (isEnvKey) {
|
|
27
|
+
const key = line.split('=')[0];
|
|
28
|
+
if (key && pendingExpire) {
|
|
29
|
+
const expireDate = new Date(pendingExpire);
|
|
30
|
+
const now = new Date();
|
|
31
|
+
const diffMs = expireDate.getTime() - now.getTime();
|
|
32
|
+
const diffDays = Math.ceil(diffMs / (1000 * 60 * 60 * 24));
|
|
33
|
+
warnings.push({
|
|
34
|
+
key,
|
|
35
|
+
date: pendingExpire,
|
|
36
|
+
daysLeft: diffDays,
|
|
37
|
+
});
|
|
38
|
+
pendingExpire = null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return warnings;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=detectExpirations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectExpirations.js","sourceRoot":"","sources":["../../../src/core/detectExpirations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAGpB;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE5D,MAAM,QAAQ,GAAoB,EAAE,CAAC;IAErC,MAAM,GAAG,GAAG,6CAA6C,CAAC;IAE1D,IAAI,aAAa,GAAkB,IAAI,CAAC;IAExC,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAExB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEpC,IAAI,WAAW,EAAE,CAAC;YAChB,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,eAAe;YACvD,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEhD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAE/B,IAAI,GAAG,IAAI,aAAa,EAAE,CAAC;gBACzB,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC;gBAC3C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;gBACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;gBAE3D,QAAQ,CAAC,IAAI,CAAC;oBACZ,GAAG;oBACH,IAAI,EAAE,aAAa;oBACnB,QAAQ,EAAE,QAAQ;iBACnB,CAAC,CAAC;gBAEH,aAAa,GAAG,IAAI,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { InconsistentNamingWarning } from '../config/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Detects inconsistent naming patterns in environment variable keys.
|
|
4
|
+
* For example: API_KEY vs APIKEY, DATABASE_URL vs DATABASEURL, etc.
|
|
5
|
+
* @param keys - Array of environment variable keys to analyze
|
|
6
|
+
* @returns Array of inconsistent naming warnings
|
|
7
|
+
*/
|
|
8
|
+
export declare function detectInconsistentNaming(keys: string[]): InconsistentNamingWarning[];
|
|
9
|
+
//# sourceMappingURL=detectInconsistentNaming.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectInconsistentNaming.d.ts","sourceRoot":"","sources":["../../../src/core/detectInconsistentNaming.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAEpE;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EAAE,GACb,yBAAyB,EAAE,CAgC7B"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detects inconsistent naming patterns in environment variable keys.
|
|
3
|
+
* For example: API_KEY vs APIKEY, DATABASE_URL vs DATABASEURL, etc.
|
|
4
|
+
* @param keys - Array of environment variable keys to analyze
|
|
5
|
+
* @returns Array of inconsistent naming warnings
|
|
6
|
+
*/
|
|
7
|
+
export function detectInconsistentNaming(keys) {
|
|
8
|
+
const warnings = [];
|
|
9
|
+
const processedPairs = new Set();
|
|
10
|
+
for (let i = 0; i < keys.length; i++) {
|
|
11
|
+
for (let j = i + 1; j < keys.length; j++) {
|
|
12
|
+
const key1 = keys[i];
|
|
13
|
+
const key2 = keys[j];
|
|
14
|
+
// Skip if either key is undefined
|
|
15
|
+
if (!key1 || !key2)
|
|
16
|
+
continue;
|
|
17
|
+
// Create a sorted pair key to avoid duplicate checking
|
|
18
|
+
const pairKey = [key1, key2].sort().join('|');
|
|
19
|
+
if (processedPairs.has(pairKey))
|
|
20
|
+
continue;
|
|
21
|
+
processedPairs.add(pairKey);
|
|
22
|
+
if (areInconsistentlyNamed(key1, key2)) {
|
|
23
|
+
// Always suggest the snake_case version (the one with underscores)
|
|
24
|
+
const snakeCaseKey = key1.includes('_') ? key1 : key2;
|
|
25
|
+
const suggestion = `Consider using snake_case naming: '${snakeCaseKey}'`;
|
|
26
|
+
warnings.push({
|
|
27
|
+
key1,
|
|
28
|
+
key2,
|
|
29
|
+
suggestion,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return warnings;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Determines if two keys have inconsistent naming patterns.
|
|
38
|
+
* @param key1 - First key to compare
|
|
39
|
+
* @param key2 - Second key to compare
|
|
40
|
+
* @returns True if the keys are inconsistently named
|
|
41
|
+
*/
|
|
42
|
+
function areInconsistentlyNamed(key1, key2) {
|
|
43
|
+
// Convert both to lowercase for comparison
|
|
44
|
+
const normalized1 = key1.toLowerCase().replace(/_/g, '');
|
|
45
|
+
const normalized2 = key2.toLowerCase().replace(/_/g, '');
|
|
46
|
+
// Check if they are the same when underscores are removed
|
|
47
|
+
if (normalized1 === normalized2 && key1 !== key2) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
// Check for common patterns like API_KEY vs APIKEY
|
|
51
|
+
const withoutUnderscores1 = key1.replace(/_/g, '');
|
|
52
|
+
const withoutUnderscores2 = key2.replace(/_/g, '');
|
|
53
|
+
if (withoutUnderscores1.toLowerCase() === withoutUnderscores2.toLowerCase() &&
|
|
54
|
+
key1 !== key2) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
// Check for partial matches that might indicate inconsistency
|
|
58
|
+
// e.g., DATABASE_URL vs DATABASEURL, JWT_SECRET vs JWTSECRET
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=detectInconsistentNaming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectInconsistentNaming.js","sourceRoot":"","sources":["../../../src/core/detectInconsistentNaming.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CACtC,IAAc;IAEd,MAAM,QAAQ,GAAgC,EAAE,CAAC;IACjD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACrB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAErB,kCAAkC;YAClC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;gBAAE,SAAS;YAE7B,uDAAuD;YACvD,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9C,IAAI,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC;gBAAE,SAAS;YAC1C,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAE5B,IAAI,sBAAsB,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;gBACvC,mEAAmE;gBACnE,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;gBACtD,MAAM,UAAU,GAAG,sCAAsC,YAAY,GAAG,CAAC;gBAEzE,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI;oBACJ,IAAI;oBACJ,UAAU;iBACX,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,SAAS,sBAAsB,CAAC,IAAY,EAAE,IAAY;IACxD,2CAA2C;IAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEzD,0DAA0D;IAC1D,IAAI,WAAW,KAAK,WAAW,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mDAAmD;IACnD,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACnD,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEnD,IACE,mBAAmB,CAAC,WAAW,EAAE,KAAK,mBAAmB,CAAC,WAAW,EAAE;QACvE,IAAI,KAAK,IAAI,EACb,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8DAA8D;IAC9D,6DAA6D;IAC7D,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { EnvUsage } from '../config/types.js';
|
|
2
|
+
import type { UppercaseWarning } from '../config/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Detects environment variable keys that are not in uppercase format.
|
|
5
|
+
* @param usages - List of environment variable usages
|
|
6
|
+
* @returns List of warnings for non-uppercase keys
|
|
7
|
+
*/
|
|
8
|
+
export declare function detectUppercaseKeys(usages: EnvUsage[]): UppercaseWarning[];
|
|
9
|
+
//# sourceMappingURL=detectUppercaseKeys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectUppercaseKeys.d.ts","sourceRoot":"","sources":["../../../src/core/detectUppercaseKeys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAa3D;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,gBAAgB,EAAE,CAa1E"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** Convert key to proper UPPER_SNAKE_CASE
|
|
2
|
+
* @param name - The environment variable name
|
|
3
|
+
* @returns The name converted to UPPER_SNAKE_CASE
|
|
4
|
+
*/
|
|
5
|
+
function toUpperSnakeCase(name) {
|
|
6
|
+
return name
|
|
7
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1_$2') // camelCase → camel_Case
|
|
8
|
+
.replace(/[-\s]+/g, '_') // dashes/spaces → underscore
|
|
9
|
+
.toUpperCase();
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Detects environment variable keys that are not in uppercase format.
|
|
13
|
+
* @param usages - List of environment variable usages
|
|
14
|
+
* @returns List of warnings for non-uppercase keys
|
|
15
|
+
*/
|
|
16
|
+
export function detectUppercaseKeys(usages) {
|
|
17
|
+
const warnings = [];
|
|
18
|
+
for (const u of usages) {
|
|
19
|
+
if (!/^[A-Z0-9_]+$/.test(u.variable)) {
|
|
20
|
+
warnings.push({
|
|
21
|
+
key: u.variable,
|
|
22
|
+
suggestion: toUpperSnakeCase(u.variable),
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return warnings;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=detectUppercaseKeys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectUppercaseKeys.js","sourceRoot":"","sources":["../../../src/core/detectUppercaseKeys.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO,IAAI;SACR,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,yBAAyB;SAChE,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,6BAA6B;SACrD,WAAW,EAAE,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAkB;IACpD,MAAM,QAAQ,GAAuB,EAAE,CAAC;IAExC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,QAAQ,CAAC,IAAI,CAAC;gBACZ,GAAG,EAAE,CAAC,CAAC,QAAQ;gBACf,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC;aACzC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toUpperSnakeCase.d.ts","sourceRoot":"","sources":["../../../../src/core/helpers/toUpperSnakeCase.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKrD"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Convert key to proper UPPER_SNAKE_CASE
|
|
2
|
+
* @param name - The environment variable name
|
|
3
|
+
* @returns The name converted to UPPER_SNAKE_CASE
|
|
4
|
+
*/
|
|
5
|
+
export function toUpperSnakeCase(name) {
|
|
6
|
+
return name
|
|
7
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1_$2') // camelCase → camel_Case
|
|
8
|
+
.replace(/[-\s]+/g, '_') // dashes/spaces → underscore
|
|
9
|
+
.toUpperCase();
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=toUpperSnakeCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toUpperSnakeCase.js","sourceRoot":"","sources":["../../../../src/core/helpers/toUpperSnakeCase.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,IAAI;SACR,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,yBAAyB;SAChE,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,6BAA6B;SACrD,WAAW,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -18,6 +18,20 @@ export interface ProcessComparisonResult {
|
|
|
18
18
|
addedExample: string[];
|
|
19
19
|
gitignoreUpdated: boolean;
|
|
20
20
|
exampleFull?: Record<string, string> | undefined;
|
|
21
|
+
uppercaseWarnings?: Array<{
|
|
22
|
+
key: string;
|
|
23
|
+
suggestion: string;
|
|
24
|
+
}>;
|
|
25
|
+
expireWarnings?: Array<{
|
|
26
|
+
key: string;
|
|
27
|
+
date: string;
|
|
28
|
+
daysLeft: number;
|
|
29
|
+
}>;
|
|
30
|
+
inconsistentNamingWarnings?: Array<{
|
|
31
|
+
key1: string;
|
|
32
|
+
key2: string;
|
|
33
|
+
suggestion: string;
|
|
34
|
+
}>;
|
|
21
35
|
error?: {
|
|
22
36
|
message: string;
|
|
23
37
|
shouldExit: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processComparisonFile.d.ts","sourceRoot":"","sources":["../../../src/core/processComparisonFile.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"processComparisonFile.d.ts","sourceRoot":"","sources":["../../../src/core/processComparisonFile.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,gBAAgB,EAChB,UAAU,EAGX,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,MAAM,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,UAAU,EAAE,OAAO,CAAC;IACpB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACjD,iBAAiB,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/D,cAAc,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,0BAA0B,CAAC,EAAE,KAAK,CAAC;QACjC,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;IACH,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,CAAC;CAClD;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAC3C,IAAI,EAAE,gBAAgB,GACrB,uBAAuB,CAsJzB"}
|
|
@@ -4,7 +4,10 @@ import { filterIgnoredKeys } from './filterIgnoredKeys.js';
|
|
|
4
4
|
import { compareWithEnvFiles } from './compareScan.js';
|
|
5
5
|
import { findDuplicateKeys } from '../services/duplicates.js';
|
|
6
6
|
import { applyFixes } from './fixEnv.js';
|
|
7
|
+
import { toUpperSnakeCase } from './helpers/toUpperSnakeCase.js';
|
|
7
8
|
import { resolveFromCwd } from './helpers/resolveFromCwd.js';
|
|
9
|
+
import { detectExpirations } from './detectExpirations.js';
|
|
10
|
+
import { detectInconsistentNaming } from './detectInconsistentNaming.js';
|
|
8
11
|
/**
|
|
9
12
|
* Process comparison file: parse env, check duplicates, check missing keys, apply fixes
|
|
10
13
|
* @param scanResult - Current scan result
|
|
@@ -24,6 +27,9 @@ export function processComparisonFile(scanResult, compareFile, opts) {
|
|
|
24
27
|
let addedExample = [];
|
|
25
28
|
let gitignoreUpdated = false;
|
|
26
29
|
let exampleFull = undefined;
|
|
30
|
+
let uppercaseWarnings = [];
|
|
31
|
+
let expireWarnings = [];
|
|
32
|
+
let inconsistentNamingWarnings = [];
|
|
27
33
|
try {
|
|
28
34
|
// Load .env.example (if exists)
|
|
29
35
|
if (opts.examplePath) {
|
|
@@ -38,6 +44,14 @@ export function processComparisonFile(scanResult, compareFile, opts) {
|
|
|
38
44
|
envVariables = Object.fromEntries(envKeys.map((k) => [k, envFull[k]]));
|
|
39
45
|
scanResult = compareWithEnvFiles(scanResult, envVariables);
|
|
40
46
|
comparedAgainst = compareFile.name;
|
|
47
|
+
// Detect uppercase keys
|
|
48
|
+
if (opts.uppercaseKeys) {
|
|
49
|
+
for (const key of envKeys) {
|
|
50
|
+
if (!/^[A-Z0-9_]+$/.test(key)) {
|
|
51
|
+
uppercaseWarnings.push({ key, suggestion: toUpperSnakeCase(key) });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
41
55
|
// Find duplicates
|
|
42
56
|
if (!opts.allowDuplicates) {
|
|
43
57
|
const duplicateResults = checkDuplicates(compareFile, opts);
|
|
@@ -45,6 +59,17 @@ export function processComparisonFile(scanResult, compareFile, opts) {
|
|
|
45
59
|
dupsEx = duplicateResults.dupsEx;
|
|
46
60
|
duplicatesFound = dupsEnv.length > 0 || dupsEx.length > 0;
|
|
47
61
|
}
|
|
62
|
+
if (opts.expireWarnings) {
|
|
63
|
+
expireWarnings = detectExpirations(compareFile.path);
|
|
64
|
+
}
|
|
65
|
+
// Check for inconsistent naming across env + example keys
|
|
66
|
+
if (opts.inconsistentNamingWarnings) {
|
|
67
|
+
const envKeysList = Object.keys(envFull);
|
|
68
|
+
const exampleKeysList = exampleFull ? Object.keys(exampleFull) : [];
|
|
69
|
+
// Combine all keys for naming analysis
|
|
70
|
+
const allKeys = [...envKeysList, ...exampleKeysList];
|
|
71
|
+
inconsistentNamingWarnings = detectInconsistentNaming(allKeys);
|
|
72
|
+
}
|
|
48
73
|
// Apply fixes (both duplicates + missing keys + gitignore)
|
|
49
74
|
if (opts.fix &&
|
|
50
75
|
(duplicatesFound || scanResult.missing.length > 0 || true)) {
|
|
@@ -94,6 +119,9 @@ export function processComparisonFile(scanResult, compareFile, opts) {
|
|
|
94
119
|
addedExample,
|
|
95
120
|
gitignoreUpdated,
|
|
96
121
|
exampleFull,
|
|
122
|
+
uppercaseWarnings,
|
|
123
|
+
expireWarnings,
|
|
124
|
+
inconsistentNamingWarnings,
|
|
97
125
|
error: {
|
|
98
126
|
message: errorMessage,
|
|
99
127
|
shouldExit: opts.isCiMode ?? false,
|
|
@@ -113,6 +141,9 @@ export function processComparisonFile(scanResult, compareFile, opts) {
|
|
|
113
141
|
addedExample,
|
|
114
142
|
gitignoreUpdated,
|
|
115
143
|
exampleFull,
|
|
144
|
+
uppercaseWarnings,
|
|
145
|
+
expireWarnings,
|
|
146
|
+
inconsistentNamingWarnings,
|
|
116
147
|
};
|
|
117
148
|
}
|
|
118
149
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processComparisonFile.js","sourceRoot":"","sources":["../../../src/core/processComparisonFile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"processComparisonFile.js","sourceRoot":"","sources":["../../../src/core/processComparisonFile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AA+BzE;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CACnC,UAAsB,EACtB,WAA2C,EAC3C,IAAsB;IAEtB,IAAI,YAAY,GAAuC,EAAE,CAAC;IAC1D,IAAI,eAAe,GAAG,EAAE,CAAC;IACzB,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,IAAI,OAAO,GAA0C,EAAE,CAAC;IACxD,IAAI,MAAM,GAA0C,EAAE,CAAC;IACvD,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,iBAAiB,GAAa,EAAE,CAAC;IACrC,IAAI,QAAQ,GAAa,EAAE,CAAC;IAC5B,IAAI,YAAY,GAAa,EAAE,CAAC;IAChC,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAC7B,IAAI,WAAW,GAAuC,SAAS,CAAC;IAChE,IAAI,iBAAiB,GAA+C,EAAE,CAAC;IACvE,IAAI,cAAc,GAChB,EAAE,CAAC;IACL,IAAI,0BAA0B,GAIzB,EAAE,CAAC;IAER,IAAI,CAAC;QACH,gCAAgC;QAChC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAC/D,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC/B,WAAW,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,4BAA4B;QAC5B,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,iBAAiB,CAC/B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EACpB,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,WAAW,CACjB,CAAC;QACF,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,UAAU,GAAG,mBAAmB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAC3D,eAAe,GAAG,WAAW,CAAC,IAAI,CAAC;QAEnC,wBAAwB;QACxB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC1B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC9B,iBAAiB,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACrE,CAAC;YACH,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,MAAM,gBAAgB,GAAG,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAC5D,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC;YACnC,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC;YACjC,eAAe,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,cAAc,GAAG,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACvD,CAAC;QAED,0DAA0D;QAC1D,IAAI,IAAI,CAAC,0BAA0B,EAAE,CAAC;YACpC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzC,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAEpE,uCAAuC;YACvC,MAAM,OAAO,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,eAAe,CAAC,CAAC;YAErD,0BAA0B,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;QACjE,CAAC;QAED,2DAA2D;QAC3D,IACE,IAAI,CAAC,GAAG;YACR,CAAC,eAAe,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,EAC1D,CAAC;YACD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC;gBACrC,OAAO,EAAE,WAAW,CAAC,IAAI;gBACzB,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC3B,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC;oBAC5C,CAAC,CAAC,EAAE;gBACN,WAAW,EAAE,UAAU,CAAC,OAAO;gBAC/B,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;gBACxC,eAAe,EAAE,IAAI;aACtB,CAAC,CAAC;YAEH,IAAI,OAAO,EAAE,CAAC;gBACZ,UAAU,GAAG,IAAI,CAAC;gBAClB,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;gBAC7C,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;gBAC3B,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;gBACnC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;gBAE3C,UAAU,CAAC,OAAO,GAAG,EAAE,CAAC;gBACxB,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,EAAE,CAAC;gBACZ,eAAe,GAAG,KAAK,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,0CAA0C;QAC1C,IAAI,eAAe,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,UAAU,CAAC,UAAU;gBAAE,UAAU,CAAC,UAAU,GAAG,EAAE,CAAC;YACvD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;gBAAE,UAAU,CAAC,UAAU,CAAC,GAAG,GAAG,OAAO,CAAC;YAC5D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,UAAU,CAAC,UAAU,CAAC,OAAO,GAAG,MAAM,CAAC;QAChE,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,kBAAkB,WAAW,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,MAAM,KAAK,EAAE,CAAC;QAC1F,OAAO;YACL,UAAU;YACV,YAAY;YACZ,eAAe;YACf,eAAe;YACf,OAAO;YACP,MAAM;YACN,UAAU;YACV,iBAAiB;YACjB,QAAQ;YACR,YAAY;YACZ,gBAAgB;YAChB,WAAW;YACX,iBAAiB;YACjB,cAAc;YACd,0BAA0B;YAC1B,KAAK,EAAE;gBACL,OAAO,EAAE,YAAY;gBACrB,UAAU,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK;aACnC;SACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,UAAU;QACV,YAAY;QACZ,eAAe;QACf,eAAe;QACf,OAAO;QACP,MAAM;QACN,UAAU;QACV,iBAAiB;QACjB,QAAQ;QACR,YAAY;QACZ,gBAAgB;QAChB,WAAW;QACX,iBAAiB;QACjB,cAAc;QACd,0BAA0B;KAC3B,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,eAAe,CACtB,WAA2C,EAC3C,IAAsB;IAEtB,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,EAAE,CAChC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7E,8BAA8B;IAC9B,MAAM,OAAO,GAAG,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CACrE,SAAS,CAAC,GAAG,CAAC,CACf,CAAC;IAEF,6BAA6B;IAC7B,IAAI,MAAM,GAAgB,EAAE,CAAC;IAE7B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAE/D,MAAM,sBAAsB,GAC1B,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,WAAW,KAAK,WAAW,CAAC,IAAI,CAAC;QAEjE,IAAI,sBAAsB,EAAE,CAAC;YAC3B,MAAM,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CACzD,SAAS,CAAC,GAAG,CAAC,CACf,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAA4B,CAAC;AACvD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanJsonOutput.d.ts","sourceRoot":"","sources":["../../../src/core/scanJsonOutput.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,UAAU,EAEV,aAAa,EACd,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"scanJsonOutput.d.ts","sourceRoot":"","sources":["../../../src/core/scanJsonOutput.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,UAAU,EAEV,aAAa,EACd,MAAM,oBAAoB,CAAC;AAG5B;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,gBAAgB,EACtB,eAAe,EAAE,MAAM,EACvB,iBAAiB,EAAE,MAAM,GACxB,aAAa,CAuEf"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { computeHealthScore } from './computeHealthScore.js';
|
|
1
2
|
/**
|
|
2
3
|
* Creates a JSON output for the scan results.
|
|
3
4
|
* @param scanResult - The result of the scan.
|
|
@@ -19,8 +20,10 @@ export function createJsonOutput(scanResult, opts, comparedAgainst, totalEnvVari
|
|
|
19
20
|
context: u.context,
|
|
20
21
|
})),
|
|
21
22
|
}));
|
|
23
|
+
const healthScore = computeHealthScore(scanResult);
|
|
22
24
|
const output = {
|
|
23
25
|
stats: scanResult.stats,
|
|
26
|
+
healthScore,
|
|
24
27
|
missing: missingGrouped,
|
|
25
28
|
unused: scanResult.unused,
|
|
26
29
|
};
|
|
@@ -32,6 +35,20 @@ export function createJsonOutput(scanResult, opts, comparedAgainst, totalEnvVari
|
|
|
32
35
|
snippet: s.snippet,
|
|
33
36
|
}));
|
|
34
37
|
}
|
|
38
|
+
if (scanResult.uppercaseWarnings?.length) {
|
|
39
|
+
output.uppercaseWarnings = scanResult.uppercaseWarnings.map((w) => ({
|
|
40
|
+
key: w.key,
|
|
41
|
+
suggestion: w.suggestion,
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
if (scanResult.inconsistentNamingWarnings?.length) {
|
|
45
|
+
output.inconsistentNamingWarnings =
|
|
46
|
+
scanResult.inconsistentNamingWarnings.map((w) => ({
|
|
47
|
+
key1: w.key1,
|
|
48
|
+
key2: w.key2,
|
|
49
|
+
suggestion: w.suggestion,
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
35
52
|
// Add duplicates if found
|
|
36
53
|
if (scanResult.duplicates) {
|
|
37
54
|
output.duplicates = scanResult.duplicates;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanJsonOutput.js","sourceRoot":"","sources":["../../../src/core/scanJsonOutput.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scanJsonOutput.js","sourceRoot":"","sources":["../../../src/core/scanJsonOutput.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
@@ -1,9 +1,3 @@
|
|
|
1
1
|
export { parseEnvFile } from './core/parseEnv.js';
|
|
2
2
|
export { diffEnv } from './core/diffEnv.js';
|
|
3
|
-
console.log(process.env.API_KEY);
|
|
4
|
-
const api = process.env.API_KEY1;
|
|
5
|
-
const api2 = process.env.API_KEY2;
|
|
6
|
-
const secret = 'sk_fegedqsg34t34t3sfht642scbr43wsdfbthrgef';
|
|
7
|
-
// high severity secret
|
|
8
|
-
const secret2 = 'AKIAIOSFODNN7EXAMPLE';
|
|
9
3
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAmB,MAAM,mBAAmB,CAAC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAmB,MAAM,mBAAmB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codeBaseScanner.d.ts","sourceRoot":"","sources":["../../../src/services/codeBaseScanner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAY,WAAW,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"codeBaseScanner.d.ts","sourceRoot":"","sources":["../../../src/services/codeBaseScanner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAY,WAAW,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAS5E;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA6DzE"}
|