dotenv-diff 2.5.0 → 2.5.2
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 +341 -536
- package/dist/bin/dotenv-diff.js +0 -0
- package/package.json +5 -1
- package/dist/cli.d.ts +0 -9
- package/dist/cli.js +0 -294
- package/dist/diffEnv.d.ts +0 -5
- package/dist/diffEnv.js +0 -7
- package/dist/index.d.ts +0 -2
- package/dist/index.js +0 -2
- package/dist/lib/checkGitignore.d.ts +0 -23
- package/dist/lib/checkGitignore.js +0 -73
- package/dist/lib/diffEnv.d.ts +0 -18
- package/dist/lib/diffEnv.js +0 -29
- package/dist/lib/parseEnv.d.ts +0 -10
- package/dist/lib/parseEnv.js +0 -25
- package/dist/parseEnv.d.ts +0 -1
- package/dist/parseEnv.js +0 -16
- package/dist/src/core/compareScan.d.ts +0 -10
- package/dist/src/core/compareScan.d.ts.map +0 -1
- package/dist/src/core/compareScan.js +0 -19
- package/dist/src/core/compareScan.js.map +0 -1
- package/dist/src/core/computeHealthScore.d.ts +0 -8
- package/dist/src/core/computeHealthScore.d.ts.map +0 -1
- package/dist/src/core/computeHealthScore.js +0 -35
- package/dist/src/core/computeHealthScore.js.map +0 -1
- package/dist/src/core/cspDetector.d.ts +0 -7
- package/dist/src/core/cspDetector.d.ts.map +0 -1
- package/dist/src/core/cspDetector.js +0 -38
- package/dist/src/core/cspDetector.js.map +0 -1
- package/dist/src/core/defaultExcludeKeys.d.ts +0 -7
- package/dist/src/core/defaultExcludeKeys.d.ts.map +0 -1
- package/dist/src/core/detectClientExposure.d.ts +0 -12
- package/dist/src/core/detectClientExposure.d.ts.map +0 -1
- package/dist/src/core/detectClientExposure.js +0 -62
- package/dist/src/core/detectClientExposure.js.map +0 -1
- package/dist/src/core/detectExpirations.d.ts +0 -14
- package/dist/src/core/detectExpirations.d.ts.map +0 -1
- package/dist/src/core/detectExpirations.js +0 -44
- package/dist/src/core/detectExpirations.js.map +0 -1
- package/dist/src/core/detectUppercaseKeys.d.ts +0 -9
- package/dist/src/core/detectUppercaseKeys.d.ts.map +0 -1
- package/dist/src/core/detectUppercaseKeys.js +0 -28
- package/dist/src/core/detectUppercaseKeys.js.map +0 -1
- package/dist/src/core/determineComparisonFile.d.ts +0 -13
- package/dist/src/core/determineComparisonFile.d.ts.map +0 -1
- package/dist/src/core/determineComparisonFile.js +0 -33
- package/dist/src/core/determineComparisonFile.js.map +0 -1
- package/dist/src/core/entropy.d.ts +0 -8
- package/dist/src/core/entropy.d.ts.map +0 -1
- package/dist/src/core/entropy.js +0 -23
- package/dist/src/core/entropy.js.map +0 -1
- package/dist/src/core/envDiscovery.d.ts +0 -19
- package/dist/src/core/envDiscovery.d.ts.map +0 -1
- package/dist/src/core/envDiscovery.js +0 -81
- package/dist/src/core/envDiscovery.js.map +0 -1
- package/dist/src/core/envPairing.d.ts +0 -8
- package/dist/src/core/envPairing.d.ts.map +0 -1
- package/dist/src/core/envPairing.js +0 -36
- package/dist/src/core/envPairing.js.map +0 -1
- package/dist/src/core/envValidator.d.ts +0 -9
- package/dist/src/core/envValidator.d.ts.map +0 -1
- package/dist/src/core/envValidator.js +0 -103
- package/dist/src/core/envValidator.js.map +0 -1
- package/dist/src/core/exampleSecretDetector.d.ts +0 -13
- package/dist/src/core/exampleSecretDetector.d.ts.map +0 -1
- package/dist/src/core/exampleSecretDetector.js +0 -61
- package/dist/src/core/exampleSecretDetector.js.map +0 -1
- package/dist/src/core/frameworkDetector.d.ts +0 -14
- package/dist/src/core/frameworkDetector.d.ts.map +0 -1
- package/dist/src/core/frameworkDetector.js +0 -40
- package/dist/src/core/frameworkDetector.js.map +0 -1
- package/dist/src/core/frameworkValidator.d.ts +0 -10
- package/dist/src/core/frameworkValidator.d.ts.map +0 -1
- package/dist/src/core/frameworkValidator.js +0 -21
- package/dist/src/core/frameworkValidator.js.map +0 -1
- package/dist/src/core/frameworks/angularRules.d.ts +0 -4
- package/dist/src/core/frameworks/angularRules.d.ts.map +0 -1
- package/dist/src/core/helpers/isAllOk.d.ts +0 -9
- package/dist/src/core/helpers/isAllOk.d.ts.map +0 -1
- package/dist/src/core/helpers/isAllOk.js +0 -16
- package/dist/src/core/helpers/isAllOk.js.map +0 -1
- package/dist/src/core/helpers/updateTotals.d.ts +0 -19
- package/dist/src/core/helpers/updateTotals.d.ts.map +0 -1
- package/dist/src/core/helpers/updateTotals.js +0 -37
- package/dist/src/core/helpers/updateTotals.js.map +0 -1
- package/dist/src/core/parseAndFilterEnv.d.ts +0 -20
- package/dist/src/core/parseAndFilterEnv.d.ts.map +0 -1
- package/dist/src/core/parseAndFilterEnv.js +0 -22
- package/dist/src/core/parseAndFilterEnv.js.map +0 -1
- package/dist/src/core/processComparisonFile.d.ts +0 -43
- package/dist/src/core/processComparisonFile.d.ts.map +0 -1
- package/dist/src/core/processComparisonFile.js +0 -170
- package/dist/src/core/processComparisonFile.js.map +0 -1
- package/dist/src/core/scan/scanJsonOutput.d.ts +0 -85
- package/dist/src/core/scan/scanJsonOutput.d.ts.map +0 -1
- package/dist/src/core/scan/scanJsonOutput.js +0 -97
- package/dist/src/core/scan/scanJsonOutput.js.map +0 -1
- package/dist/src/core/scan/secretDetectors.d.ts +0 -28
- package/dist/src/core/scan/secretDetectors.d.ts.map +0 -1
- package/dist/src/core/scan/secretDetectors.js +0 -272
- package/dist/src/core/scan/secretDetectors.js.map +0 -1
- package/dist/src/core/scanFile.d.ts +0 -10
- package/dist/src/core/scanFile.d.ts.map +0 -1
- package/dist/src/core/scanFile.js +0 -65
- package/dist/src/core/scanFile.js.map +0 -1
- package/dist/src/core/scanJsonOutput.d.ts +0 -85
- package/dist/src/core/scanJsonOutput.d.ts.map +0 -1
- package/dist/src/core/scanJsonOutput.js +0 -97
- package/dist/src/core/scanJsonOutput.js.map +0 -1
- package/dist/src/core/secretDetectors.d.ts +0 -28
- package/dist/src/core/secretDetectors.d.ts.map +0 -1
- package/dist/src/core/secretDetectors.js +0 -272
- package/dist/src/core/secretDetectors.js.map +0 -1
- package/dist/src/core/t3env/detectT3Env.d.ts +0 -12
- package/dist/src/core/t3env/detectT3Env.d.ts.map +0 -1
- package/dist/src/core/t3env/detectT3Env.js +0 -113
- package/dist/src/core/t3env/detectT3Env.js.map +0 -1
- package/dist/src/core/t3env/t3EnvRules.d.ts +0 -10
- package/dist/src/core/t3env/t3EnvRules.d.ts.map +0 -1
- package/dist/src/core/t3env/t3EnvRules.js +0 -61
- package/dist/src/core/t3env/t3EnvRules.js.map +0 -1
- package/dist/src/core/t3env/t3EnvValidator.d.ts +0 -9
- package/dist/src/core/t3env/t3EnvValidator.d.ts.map +0 -1
- package/dist/src/core/t3env/t3EnvValidator.js +0 -32
- package/dist/src/core/t3env/t3EnvValidator.js.map +0 -1
- package/dist/src/lib/diffEnv.d.ts +0 -19
- package/dist/src/lib/diffEnv.d.ts.map +0 -1
- package/dist/src/lib/diffEnv.js +0 -31
- package/dist/src/lib/diffEnv.js.map +0 -1
- package/dist/src/lib/parseEnv.d.ts +0 -11
- package/dist/src/lib/parseEnv.d.ts.map +0 -1
- package/dist/src/lib/parseEnv.js +0 -26
- package/dist/src/lib/parseEnv.js.map +0 -1
- package/dist/src/services/codeBaseScanner.d.ts +0 -8
- package/dist/src/services/codeBaseScanner.d.ts.map +0 -1
- package/dist/src/services/codeBaseScanner.js +0 -110
- package/dist/src/services/codeBaseScanner.js.map +0 -1
- package/dist/src/services/duplicates.d.ts +0 -12
- package/dist/src/services/duplicates.d.ts.map +0 -1
- package/dist/src/services/duplicates.js +0 -36
- package/dist/src/services/duplicates.js.map +0 -1
- package/dist/src/services/ensureFilesOrPrompt.d.ts +0 -22
- package/dist/src/services/ensureFilesOrPrompt.d.ts.map +0 -1
- package/dist/src/services/ensureFilesOrPrompt.js +0 -76
- package/dist/src/services/ensureFilesOrPrompt.js.map +0 -1
- package/dist/src/services/scanOutputToConsole.d.ts +0 -17
- package/dist/src/services/scanOutputToConsole.d.ts.map +0 -1
- package/dist/src/services/scanOutputToConsole.js +0 -127
- package/dist/src/services/scanOutputToConsole.js.map +0 -1
- package/dist/src/ui/compare/printAutoFix.d.ts +0 -16
- package/dist/src/ui/compare/printAutoFix.d.ts.map +0 -1
- package/dist/src/ui/compare/printAutoFix.js +0 -34
- package/dist/src/ui/compare/printAutoFix.js.map +0 -1
- package/dist/src/ui/compare/printAutoFixApplied.d.ts +0 -7
- package/dist/src/ui/compare/printAutoFixApplied.d.ts.map +0 -1
- package/dist/src/ui/compare/printAutoFixApplied.js +0 -22
- package/dist/src/ui/compare/printAutoFixApplied.js.map +0 -1
- package/dist/src/ui/compare/printDuplicates.d.ts +0 -17
- package/dist/src/ui/compare/printDuplicates.d.ts.map +0 -1
- package/dist/src/ui/compare/printDuplicates.js +0 -25
- package/dist/src/ui/compare/printDuplicates.js.map +0 -1
- package/dist/src/ui/compare/printFixTips.d.ts +0 -11
- package/dist/src/ui/compare/printFixTips.d.ts.map +0 -1
- package/dist/src/ui/compare/printFixTips.js +0 -46
- package/dist/src/ui/compare/printFixTips.js.map +0 -1
- package/dist/src/ui/compare/printSuccess.d.ts +0 -11
- package/dist/src/ui/compare/printSuccess.d.ts.map +0 -1
- package/dist/src/ui/compare/printSuccess.js +0 -27
- package/dist/src/ui/compare/printSuccess.js.map +0 -1
- package/dist/src/ui/scan/printCspWarning.d.ts +0 -9
- package/dist/src/ui/scan/printCspWarning.d.ts.map +0 -1
- package/dist/src/ui/scan/printCspWarning.js +0 -20
- package/dist/src/ui/scan/printCspWarning.js.map +0 -1
- package/dist/src/ui/scan/printEnvWarnings.d.ts +0 -8
- package/dist/src/ui/scan/printEnvWarnings.d.ts.map +0 -1
- package/dist/src/ui/scan/printEnvWarnings.js +0 -20
- package/dist/src/ui/scan/printEnvWarnings.js.map +0 -1
- package/dist/src/ui/scan/printExposedVars.d.ts +0 -8
- package/dist/src/ui/scan/printExposedVars.d.ts.map +0 -1
- package/dist/src/ui/scan/printExposedVars.js +0 -24
- package/dist/src/ui/scan/printExposedVars.js.map +0 -1
- package/dist/src/ui/scan/printT3EnvWarnings.d.ts +0 -8
- package/dist/src/ui/scan/printT3EnvWarnings.d.ts.map +0 -1
- package/dist/src/ui/scan/printT3EnvWarnings.js +0 -20
- package/dist/src/ui/scan/printT3EnvWarnings.js.map +0 -1
- package/dist/src/ui/scan/printUniqueVariables.d.ts +0 -7
- package/dist/src/ui/scan/printUniqueVariables.d.ts.map +0 -1
- package/dist/src/ui/scan/printUniqueVariables.js +0 -14
- package/dist/src/ui/scan/printUniqueVariables.js.map +0 -1
- package/dist/src/ui/scan/printVariables.d.ts +0 -10
- package/dist/src/ui/scan/printVariables.d.ts.map +0 -1
- package/dist/src/ui/scan/printVariables.js +0 -37
- package/dist/src/ui/scan/printVariables.js.map +0 -1
- package/dist/src/ui/shared/printProgress.d.ts +0 -24
- package/dist/src/ui/shared/printProgress.d.ts.map +0 -1
- package/dist/src/ui/shared/printProgress.js +0 -43
- package/dist/src/ui/shared/printProgress.js.map +0 -1
- package/dist/types/scanUsage.d.ts +0 -43
- package/dist/types/scanUsage.d.ts.map +0 -1
|
@@ -1,272 +0,0 @@
|
|
|
1
|
-
import { shannonEntropyNormalized } from './entropy.js';
|
|
2
|
-
// Regular expressions for detecting suspicious keys and provider patterns
|
|
3
|
-
export const SUSPICIOUS_KEYS = /\b(pass(word)?|secret|token|apikey|api_key|key|auth|bearer|private|client_secret|access[_-]?token)\b/i;
|
|
4
|
-
// Regular expressions for detecting provider patterns
|
|
5
|
-
export const PROVIDER_PATTERNS = [
|
|
6
|
-
/\bAKIA[0-9A-Z]{16}\b/, // AWS access key id
|
|
7
|
-
/\bASIA[0-9A-Z]{16}\b/, // AWS temp key
|
|
8
|
-
/\bghp_[0-9A-Za-z]{30,}\b/, // GitHub token
|
|
9
|
-
/\bsk_live_[0-9a-zA-Z]{24,}\b/, // Stripe live secret
|
|
10
|
-
/\bsk_test_[0-9a-zA-Z]{24,}\b/, // Stripe test secret
|
|
11
|
-
/\bAIza[0-9A-Za-z\-_]{20,}\b/, // Google API key
|
|
12
|
-
/\bya29\.[0-9A-Za-z\-_]+\b/, // Google OAuth access token
|
|
13
|
-
/\b[A-Za-z0-9_-]{21}:[A-Za-z0-9_-]{140}\b/, // Firebase token
|
|
14
|
-
/\b0x[a-fA-F0-9]{40}\b/, // Ethereum address
|
|
15
|
-
/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/, // JWT token
|
|
16
|
-
/\bAC[0-9a-fA-F]{32}\b/, // Twilio Account SID
|
|
17
|
-
];
|
|
18
|
-
const LONG_LITERAL = /["'`]{1}([A-Za-z0-9+/_\-]{24,})["'`]{1}/g;
|
|
19
|
-
const HTTPS_PATTERN = /["'`](https?:\/\/(?!localhost)[^"'`]*)["'`]/g;
|
|
20
|
-
// List of harmless URL patterns to ignore
|
|
21
|
-
const HARMLESS_URLS = [
|
|
22
|
-
/https?:\/\/(www\.)?placeholder\.com/i,
|
|
23
|
-
/https?:\/\/(www\.)?example\.com/i,
|
|
24
|
-
/https?:\/\/127\.0\.0\.1(:\d+)?/i,
|
|
25
|
-
/http:\/\/www\.w3\.org\/2000\/svg/i,
|
|
26
|
-
/xmlns=["']http:\/\/www\.w3\.org\/2000\/svg["']/i, // SVG namespace
|
|
27
|
-
];
|
|
28
|
-
// Known harmless attribute keys commonly used in UI / analytics
|
|
29
|
-
const HARMLESS_ATTRIBUTE_KEYS = /\b(trackingId|trackingContext|data-testid|data-test|aria-label)\b/i;
|
|
30
|
-
/**
|
|
31
|
-
* Determines the severity of a secret finding.
|
|
32
|
-
* @param kind 'pattern' | 'entropy'
|
|
33
|
-
* @param message The message describing the finding
|
|
34
|
-
* @param literalLength The length of the literal string (if applicable)
|
|
35
|
-
* @returns The severity level of the secret finding
|
|
36
|
-
*/
|
|
37
|
-
function determineSeverity(kind, message, literalLength) {
|
|
38
|
-
// HIGH: Known provider key patterns
|
|
39
|
-
if (message.includes('known provider key pattern')) {
|
|
40
|
-
return 'high';
|
|
41
|
-
}
|
|
42
|
-
// HIGH: Very high-entropy long strings
|
|
43
|
-
if (kind === 'entropy' && literalLength && literalLength >= 48) {
|
|
44
|
-
return 'high';
|
|
45
|
-
}
|
|
46
|
-
// MEDIUM: Password/secret/token patterns
|
|
47
|
-
if (message.includes('password/secret/token-like')) {
|
|
48
|
-
return 'medium';
|
|
49
|
-
}
|
|
50
|
-
// MEDIUM: Medium high-entropy strings
|
|
51
|
-
if (kind === 'entropy' && literalLength && literalLength >= 32) {
|
|
52
|
-
return 'medium';
|
|
53
|
-
}
|
|
54
|
-
// MEDIUM: HTTP URLs
|
|
55
|
-
if (message.includes('HTTP URL detected')) {
|
|
56
|
-
return 'medium';
|
|
57
|
-
}
|
|
58
|
-
// LOW: HTTPS URLs
|
|
59
|
-
if (message.includes('HTTPS URL detected')) {
|
|
60
|
-
return 'low';
|
|
61
|
-
}
|
|
62
|
-
// Default to medium if we can't determine
|
|
63
|
-
return 'medium';
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Checks if a line has an ignore comment
|
|
67
|
-
* fx: // dotenv-diff-ignore or /* dotenv-diff-ignore *\/ or <!-- dotenv-diff-ignore -->
|
|
68
|
-
* @param line - The line to check
|
|
69
|
-
* @returns True if the line should be ignored
|
|
70
|
-
*/
|
|
71
|
-
export function hasIgnoreComment(line) {
|
|
72
|
-
const normalized = line.trim();
|
|
73
|
-
// Allow mixed casing, extra spaces, and optional dashes
|
|
74
|
-
return (/\/\/.*dotenv[\s-]*diff[\s-]*ignore/i.test(normalized) ||
|
|
75
|
-
/\/\*.*dotenv[\s-]*diff[\s-]*ignore.*\*\//i.test(normalized) ||
|
|
76
|
-
/<!--.*dotenv[\s-]*diff[\s-]*ignore.*-->/i.test(normalized) ||
|
|
77
|
-
/\bdotenv[\s-]*diff[\s-]*ignore\b/i.test(normalized));
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Checks if a URL should be ignored based on ignoreUrls from config.
|
|
81
|
-
* @param url - The URL that might be a potential secret
|
|
82
|
-
* @param ignoreUrls - List of URLs to ignore (from config)
|
|
83
|
-
* @returns true if the URL matches any ignore pattern
|
|
84
|
-
*/
|
|
85
|
-
function ignoreUrlsMatch(url, ignoreUrls) {
|
|
86
|
-
if (!ignoreUrls?.length)
|
|
87
|
-
return false;
|
|
88
|
-
// case-insensitive substring match
|
|
89
|
-
return ignoreUrls.some((pattern) => url.toLowerCase().includes(pattern.toLowerCase()));
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Checks if a string looks like a harmless literal.
|
|
93
|
-
* @param s - The string to check.
|
|
94
|
-
* @returns True if the string looks harmless, false otherwise.
|
|
95
|
-
*/
|
|
96
|
-
function looksHarmlessLiteral(s) {
|
|
97
|
-
return (/\S+@\S+/.test(s) || // emails
|
|
98
|
-
/^data:[a-z]+\/[a-z0-9.+-]+;base64,/i.test(s) || // data URIs
|
|
99
|
-
/^\.{0,2}\//.test(s) || // relative paths
|
|
100
|
-
/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(s) || // UUID
|
|
101
|
-
/^[0-9a-f]{32,128}$/i.test(s) || // MD5, SHA1, SHA256, etc.
|
|
102
|
-
/^[A-Za-z0-9+/_\-]{16,20}={0,2}$/.test(s) || // short base64
|
|
103
|
-
/^[A-Za-z0-9+/_\-]*(_PUBLIC|_PRIVATE|VITE_|NEXT_PUBLIC|VUE_)[A-Za-z0-9+/_\-]*={0,2}$/.test(s) || // env-like keys
|
|
104
|
-
/^[MmZzLlHhVvCcSsQqTtAa][0-9eE+.\- ,MmZzLlHhVvCcSsQqTtAa]*$/.test(s) || // SVG path data
|
|
105
|
-
/<svg[\s\S]*?>[\s\S]*?<\/svg>/i.test(s) || // SVG markup
|
|
106
|
-
HARMLESS_URLS.some((rx) => rx.test(s)) // Allowlisted URLs
|
|
107
|
-
);
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Checks if a line looks like a URL construction pattern.
|
|
111
|
-
* @param line - The line to check.
|
|
112
|
-
* @returns True if the line looks like URL construction, false otherwise.
|
|
113
|
-
*/
|
|
114
|
-
function looksLikeUrlConstruction(line) {
|
|
115
|
-
// Check for template literals or string concatenation that looks like URLs
|
|
116
|
-
return (
|
|
117
|
-
// Template literals with URL-like patterns
|
|
118
|
-
/=\s*`[^`]*\$\{[^}]+\}[^`]*\/[^`]*`/.test(line) ||
|
|
119
|
-
// String concatenation with slashes
|
|
120
|
-
/=\s*["'][^"']*\/[^"']*["']\s*\+/.test(line) ||
|
|
121
|
-
// Contains common URL patterns
|
|
122
|
-
/=\s*["'`][^"'`]*\/[^"'`]*(auth|api|login|redirect|callback|protocol)[^"'`]*\/[^"'`]*["'`]/.test(line) ||
|
|
123
|
-
// Keycloak-specific patterns
|
|
124
|
-
/realms\/.*\/protocol\/openid-connect/.test(line));
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Checks if a file path is probably a test path.
|
|
128
|
-
* This is determined by looking for common test folder names and file extensions.
|
|
129
|
-
* @param p - The file path to check.
|
|
130
|
-
* @returns True if the file path is probably a test path, false otherwise.
|
|
131
|
-
*/
|
|
132
|
-
function isProbablyTestPath(p) {
|
|
133
|
-
return (/\b(__tests__|__mocks__|fixtures|sandbox|samples)\b/i.test(p) ||
|
|
134
|
-
/\.(spec|test)\.[jt]sx?$/.test(p));
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Checks if a string is a pure interpolation template.
|
|
138
|
-
* @param s - The string to check.
|
|
139
|
-
* @returns True if the string is a pure interpolation template, false otherwise.
|
|
140
|
-
*/
|
|
141
|
-
function isPureInterpolationTemplate(s) {
|
|
142
|
-
// Matches templates like `${a}`, `${a}:${b}`, `${a}|${b}|${c}`
|
|
143
|
-
// i.e. no meaningful static content
|
|
144
|
-
const withoutInterpolations = s.replace(/\$\{[^}]+\}/g, '');
|
|
145
|
-
return /^[\s:|,._-]*$/.test(withoutInterpolations);
|
|
146
|
-
}
|
|
147
|
-
// Threshold is the value between 0 and 1 that determines the sensitivity of the detection.
|
|
148
|
-
const DEFAULT_SECRET_THRESHOLD = 0.85;
|
|
149
|
-
/**
|
|
150
|
-
* Optimized for sveltekit and vite env accessors
|
|
151
|
-
* @param line - A line of code to check.
|
|
152
|
-
* @returns True if the line is an environment variable accessor, false otherwise.
|
|
153
|
-
*/
|
|
154
|
-
function isEnvAccessor(line) {
|
|
155
|
-
return /\b(process\.env|import\.meta\.env|\$env\/(static|dynamic)\/(public|private))\b/.test(line);
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Detects secrets in the source code of a file.
|
|
159
|
-
* @param file - The file path to check.
|
|
160
|
-
* @param source - The source code to scan for secrets.
|
|
161
|
-
* @returns An array of secret findings.
|
|
162
|
-
*/
|
|
163
|
-
export function detectSecretsInSource(file, source, opts) {
|
|
164
|
-
const threshold = isProbablyTestPath(file) ? 0.95 : DEFAULT_SECRET_THRESHOLD;
|
|
165
|
-
const findings = [];
|
|
166
|
-
const lines = source.split(/\r?\n/);
|
|
167
|
-
let insideIgnoreBlock = false;
|
|
168
|
-
for (let i = 0; i < lines.length; i++) {
|
|
169
|
-
const lineNo = i + 1;
|
|
170
|
-
const line = lines[i] || '';
|
|
171
|
-
if (/<!--\s*dotenv[\s-]*diff[\s-]*ignore[\s-]*start\s*-->/i.test(line)) {
|
|
172
|
-
insideIgnoreBlock = true;
|
|
173
|
-
continue;
|
|
174
|
-
}
|
|
175
|
-
if (/<!--\s*dotenv[\s-]*diff[\s-]*ignore[\s-]*end\s*-->/i.test(line)) {
|
|
176
|
-
insideIgnoreBlock = false;
|
|
177
|
-
continue;
|
|
178
|
-
}
|
|
179
|
-
// Skip if inside ignore block
|
|
180
|
-
if (insideIgnoreBlock)
|
|
181
|
-
continue;
|
|
182
|
-
// Skip comments
|
|
183
|
-
if (/^\s*\/\//.test(line))
|
|
184
|
-
continue;
|
|
185
|
-
// Check if line has ignore comment
|
|
186
|
-
if (hasIgnoreComment(line))
|
|
187
|
-
continue;
|
|
188
|
-
// Check for HTTPS URLs
|
|
189
|
-
HTTPS_PATTERN.lastIndex = 0;
|
|
190
|
-
let httpsMatch;
|
|
191
|
-
while ((httpsMatch = HTTPS_PATTERN.exec(line))) {
|
|
192
|
-
const url = httpsMatch[1] || '';
|
|
193
|
-
if (url && !looksHarmlessLiteral(url)) {
|
|
194
|
-
if (ignoreUrlsMatch(url, opts?.ignoreUrls))
|
|
195
|
-
continue;
|
|
196
|
-
const protocol = url.startsWith('https') ? 'HTTPS' : 'HTTP';
|
|
197
|
-
findings.push({
|
|
198
|
-
file,
|
|
199
|
-
line: lineNo,
|
|
200
|
-
kind: 'pattern',
|
|
201
|
-
message: `${protocol} URL detected – consider moving to an environment variable`,
|
|
202
|
-
snippet: line.trim().slice(0, 180),
|
|
203
|
-
severity: protocol === 'HTTP' ? 'medium' : 'low',
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
// 1) Suspicious key literal assignments
|
|
208
|
-
if (SUSPICIOUS_KEYS.test(line)) {
|
|
209
|
-
// Ignore known harmless UI / analytics attributes
|
|
210
|
-
if (HARMLESS_ATTRIBUTE_KEYS.test(line))
|
|
211
|
-
continue;
|
|
212
|
-
const m = line.match(/=\s*["'`](.+?)["'`]/);
|
|
213
|
-
if (m &&
|
|
214
|
-
m[1] &&
|
|
215
|
-
!looksHarmlessLiteral(m[1]) &&
|
|
216
|
-
!looksLikeUrlConstruction(line) &&
|
|
217
|
-
m[1].length >= 12 &&
|
|
218
|
-
!isEnvAccessor(line) &&
|
|
219
|
-
!isPureInterpolationTemplate(m[1])) {
|
|
220
|
-
findings.push({
|
|
221
|
-
file,
|
|
222
|
-
line: lineNo,
|
|
223
|
-
kind: 'pattern',
|
|
224
|
-
message: 'matches password/secret/token-like literal assignment',
|
|
225
|
-
snippet: line.trim().slice(0, 180),
|
|
226
|
-
severity: 'medium',
|
|
227
|
-
});
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
// 2) Provider patterns
|
|
231
|
-
for (const rx of PROVIDER_PATTERNS) {
|
|
232
|
-
if (rx.test(line)) {
|
|
233
|
-
findings.push({
|
|
234
|
-
file,
|
|
235
|
-
line: lineNo,
|
|
236
|
-
kind: 'pattern',
|
|
237
|
-
message: 'matches known provider key pattern',
|
|
238
|
-
snippet: line.trim().slice(0, 180),
|
|
239
|
-
severity: 'high',
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
// 3) High-entropy long literals
|
|
244
|
-
LONG_LITERAL.lastIndex = 0;
|
|
245
|
-
let lm;
|
|
246
|
-
while ((lm = LONG_LITERAL.exec(line))) {
|
|
247
|
-
const literal = lm[1] || '';
|
|
248
|
-
if (looksHarmlessLiteral(literal))
|
|
249
|
-
continue;
|
|
250
|
-
if (literal.length < 32)
|
|
251
|
-
continue;
|
|
252
|
-
const ent = shannonEntropyNormalized(literal);
|
|
253
|
-
if (ent >= threshold) {
|
|
254
|
-
const message = `found high-entropy string (len ${literal.length}, H≈${ent.toFixed(2)})`;
|
|
255
|
-
findings.push({
|
|
256
|
-
file,
|
|
257
|
-
line: lineNo,
|
|
258
|
-
kind: 'entropy',
|
|
259
|
-
message,
|
|
260
|
-
snippet: line.trim().slice(0, 180),
|
|
261
|
-
severity: determineSeverity('entropy', message, literal.length),
|
|
262
|
-
});
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
const uniqueFindings = findings.filter((f, idx, arr) => idx ===
|
|
267
|
-
arr.findIndex((other) => other.file === f.file &&
|
|
268
|
-
other.line === f.line &&
|
|
269
|
-
other.snippet === f.snippet));
|
|
270
|
-
return uniqueFindings;
|
|
271
|
-
}
|
|
272
|
-
//# sourceMappingURL=secretDetectors.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"secretDetectors.js","sourceRoot":"","sources":["../../../src/core/secretDetectors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAcxD,0EAA0E;AAC1E,MAAM,CAAC,MAAM,eAAe,GAC1B,uGAAuG,CAAC;AAE1G,sDAAsD;AACtD,MAAM,CAAC,MAAM,iBAAiB,GAAa;IACzC,sBAAsB,EAAE,oBAAoB;IAC5C,sBAAsB,EAAE,eAAe;IACvC,0BAA0B,EAAE,eAAe;IAC3C,8BAA8B,EAAE,qBAAqB;IACrD,8BAA8B,EAAE,qBAAqB;IACrD,6BAA6B,EAAE,iBAAiB;IAChD,2BAA2B,EAAE,4BAA4B;IACzD,0CAA0C,EAAE,iBAAiB;IAC7D,uBAAuB,EAAE,mBAAmB;IAC5C,uDAAuD,EAAE,YAAY;IACrE,uBAAuB,EAAE,qBAAqB;CAC/C,CAAC;AAEF,MAAM,YAAY,GAAG,0CAA0C,CAAC;AAEhE,MAAM,aAAa,GAAG,8CAA8C,CAAC;AAErE,0CAA0C;AAC1C,MAAM,aAAa,GAAG;IACpB,sCAAsC;IACtC,kCAAkC;IAClC,iCAAiC;IACjC,mCAAmC;IACnC,iDAAiD,EAAE,gBAAgB;CACpE,CAAC;AAEF,gEAAgE;AAChE,MAAM,uBAAuB,GAC3B,oEAAoE,CAAC;AAEvE;;;;;;GAMG;AACH,SAAS,iBAAiB,CACxB,IAA2B,EAC3B,OAAe,EACf,aAAsB;IAEtB,oCAAoC;IACpC,IAAI,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAC,EAAE,CAAC;QACnD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,uCAAuC;IACvC,IAAI,IAAI,KAAK,SAAS,IAAI,aAAa,IAAI,aAAa,IAAI,EAAE,EAAE,CAAC;QAC/D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,yCAAyC;IACzC,IAAI,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAC,EAAE,CAAC;QACnD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,sCAAsC;IACtC,IAAI,IAAI,KAAK,SAAS,IAAI,aAAa,IAAI,aAAa,IAAI,EAAE,EAAE,CAAC;QAC/D,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,oBAAoB;IACpB,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC1C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,kBAAkB;IAClB,IAAI,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,0CAA0C;IAC1C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAE/B,wDAAwD;IACxD,OAAO,CACL,qCAAqC,CAAC,IAAI,CAAC,UAAU,CAAC;QACtD,2CAA2C,CAAC,IAAI,CAAC,UAAU,CAAC;QAC5D,0CAA0C,CAAC,IAAI,CAAC,UAAU,CAAC;QAC3D,mCAAmC,CAAC,IAAI,CAAC,UAAU,CAAC,CACrD,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,eAAe,CAAC,GAAW,EAAE,UAAqB;IACzD,IAAI,CAAC,UAAU,EAAE,MAAM;QAAE,OAAO,KAAK,CAAC;IAEtC,mCAAmC;IACnC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CACjC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAClD,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,CAAS;IACrC,OAAO,CACL,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,SAAS;QAC9B,qCAAqC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,YAAY;QAC7D,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,iBAAiB;QACzC,iEAAiE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO;QACpF,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,0BAA0B;QAC3D,iCAAiC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,eAAe;QAC5D,qFAAqF,CAAC,IAAI,CACxF,CAAC,CACF,IAAI,gBAAgB;QACrB,4DAA4D,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,gBAAgB;QACxF,+BAA+B,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,aAAa;QACxD,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB;KAC3D,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,wBAAwB,CAAC,IAAY;IAC5C,2EAA2E;IAC3E,OAAO;IACL,2CAA2C;IAC3C,oCAAoC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/C,oCAAoC;QACpC,iCAAiC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5C,+BAA+B;QAC/B,2FAA2F,CAAC,IAAI,CAC9F,IAAI,CACL;QACD,6BAA6B;QAC7B,sCAAsC,CAAC,IAAI,CAAC,IAAI,CAAC,CAClD,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,CAAS;IACnC,OAAO,CACL,qDAAqD,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7D,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,CAClC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,2BAA2B,CAAC,CAAS;IAC5C,+DAA+D;IAC/D,oCAAoC;IACpC,MAAM,qBAAqB,GAAG,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAC5D,OAAO,eAAe,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;AACrD,CAAC;AAED,2FAA2F;AAC3F,MAAM,wBAAwB,GAAG,IAAa,CAAC;AAE/C;;;;GAIG;AACH,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,gFAAgF,CAAC,IAAI,CAC1F,IAAI,CACL,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAY,EACZ,MAAc,EACd,IAAgC;IAEhC,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC;IAE7E,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEpC,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;QACrB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAE5B,IAAI,uDAAuD,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvE,iBAAiB,GAAG,IAAI,CAAC;YACzB,SAAS;QACX,CAAC;QAED,IAAI,qDAAqD,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrE,iBAAiB,GAAG,KAAK,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,8BAA8B;QAC9B,IAAI,iBAAiB;YAAE,SAAS;QAEhC,gBAAgB;QAChB,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAEpC,mCAAmC;QACnC,IAAI,gBAAgB,CAAC,IAAI,CAAC;YAAE,SAAS;QAErC,uBAAuB;QACvB,aAAa,CAAC,SAAS,GAAG,CAAC,CAAC;QAC5B,IAAI,UAAkC,CAAC;QACvC,OAAO,CAAC,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC/C,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAChC,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtC,IAAI,eAAe,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC;oBAAE,SAAS;gBACrD,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;gBAE5D,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI;oBACJ,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,GAAG,QAAQ,4DAA4D;oBAChF,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;oBAClC,QAAQ,EAAE,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK;iBACjD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,kDAAkD;YAClD,IAAI,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,SAAS;YAEjD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YAC5C,IACE,CAAC;gBACD,CAAC,CAAC,CAAC,CAAC;gBACJ,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3B,CAAC,wBAAwB,CAAC,IAAI,CAAC;gBAC/B,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE;gBACjB,CAAC,aAAa,CAAC,IAAI,CAAC;gBACpB,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAClC,CAAC;gBACD,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI;oBACJ,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,uDAAuD;oBAChE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;oBAClC,QAAQ,EAAE,QAAQ;iBACnB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,uBAAuB;QACvB,KAAK,MAAM,EAAE,IAAI,iBAAiB,EAAE,CAAC;YACnC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClB,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI;oBACJ,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,oCAAoC;oBAC7C,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;oBAClC,QAAQ,EAAE,MAAM;iBACjB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,gCAAgC;QAChC,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC;QAC3B,IAAI,EAA0B,CAAC;QAC/B,OAAO,CAAC,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,oBAAoB,CAAC,OAAO,CAAC;gBAAE,SAAS;YAC5C,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE;gBAAE,SAAS;YAClC,MAAM,GAAG,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;YAC9C,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;gBACrB,MAAM,OAAO,GAAG,kCAAkC,OAAO,CAAC,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;gBACzF,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI;oBACJ,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,SAAS;oBACf,OAAO;oBACP,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;oBAClC,QAAQ,EAAE,iBAAiB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC;iBAChE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CACpC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CACd,GAAG;QACH,GAAG,CAAC,SAAS,CACX,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;YACrB,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;YACrB,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,CAC9B,CACJ,CAAC;IAEF,OAAO,cAAc,CAAC;AACxB,CAAC"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { T3EnvDetectionResult, T3EnvSchema } from '../../config/types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Detects if a project uses t3-env by looking for env.ts files
|
|
4
|
-
* @param cwd - Current working directory to scan
|
|
5
|
-
* @returns Detection result with schema if found
|
|
6
|
-
*/
|
|
7
|
-
export declare function detectT3Env(cwd: string): Promise<T3EnvDetectionResult>;
|
|
8
|
-
/**
|
|
9
|
-
* Parses t3-env schema from file content
|
|
10
|
-
*/
|
|
11
|
-
export declare function parseT3EnvFromContent(content: string): T3EnvSchema | null;
|
|
12
|
-
//# sourceMappingURL=detectT3Env.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"detectT3Env.d.ts","sourceRoot":"","sources":["../../../../src/core/t3env/detectT3Env.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAE/E;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAiD5E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CA8BzE"}
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
/**
|
|
4
|
-
* Detects if a project uses t3-env by looking for env.ts files
|
|
5
|
-
* @param cwd - Current working directory to scan
|
|
6
|
-
* @returns Detection result with schema if found
|
|
7
|
-
*/
|
|
8
|
-
export async function detectT3Env(cwd) {
|
|
9
|
-
const hasT3EnvDependency = await checkPackageJson(cwd);
|
|
10
|
-
if (!hasT3EnvDependency) {
|
|
11
|
-
return {
|
|
12
|
-
detected: false,
|
|
13
|
-
detectionMethod: null,
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
// Check common locations for env config files
|
|
17
|
-
const envFilePaths = [
|
|
18
|
-
'src/env.ts',
|
|
19
|
-
'src/env.mjs',
|
|
20
|
-
'src/env.js',
|
|
21
|
-
'env.ts',
|
|
22
|
-
'env.mjs',
|
|
23
|
-
'env.js',
|
|
24
|
-
'lib/env.ts',
|
|
25
|
-
'lib/env.mjs',
|
|
26
|
-
'lib/env.js',
|
|
27
|
-
];
|
|
28
|
-
for (const envPath of envFilePaths) {
|
|
29
|
-
const fullPath = path.join(cwd, envPath);
|
|
30
|
-
if (fs.existsSync(fullPath)) {
|
|
31
|
-
const content = fs.readFileSync(fullPath, 'utf8');
|
|
32
|
-
// Check if file contains t3-env usage
|
|
33
|
-
if (content.includes('createEnv')) {
|
|
34
|
-
const schema = parseT3EnvFromContent(content);
|
|
35
|
-
if (schema) {
|
|
36
|
-
return {
|
|
37
|
-
detected: true,
|
|
38
|
-
schema,
|
|
39
|
-
detectionMethod: 'config',
|
|
40
|
-
configPath: envPath,
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return {
|
|
47
|
-
detected: true,
|
|
48
|
-
schema: { server: [], client: [] },
|
|
49
|
-
detectionMethod: 'package.json',
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Parses t3-env schema from file content
|
|
54
|
-
*/
|
|
55
|
-
export function parseT3EnvFromContent(content) {
|
|
56
|
-
try {
|
|
57
|
-
// Find server and client schema sections
|
|
58
|
-
const serverMatch = content.match(/server\s*:\s*\{([^}]*(?:\{[^}]*\}[^}]*)*)\}/s);
|
|
59
|
-
const clientMatch = content.match(/client\s*:\s*\{([^}]*(?:\{[^}]*\}[^}]*)*)\}/s);
|
|
60
|
-
if (!serverMatch && !clientMatch) {
|
|
61
|
-
return null;
|
|
62
|
-
}
|
|
63
|
-
const serverKeys = serverMatch && serverMatch[1]
|
|
64
|
-
? extractKeysFromSchema(serverMatch[1])
|
|
65
|
-
: [];
|
|
66
|
-
const clientKeys = clientMatch && clientMatch[1]
|
|
67
|
-
? extractKeysFromSchema(clientMatch[1])
|
|
68
|
-
: [];
|
|
69
|
-
return {
|
|
70
|
-
server: serverKeys,
|
|
71
|
-
client: clientKeys,
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
catch {
|
|
75
|
-
return null;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Extracts variable keys from schema block
|
|
80
|
-
*/
|
|
81
|
-
function extractKeysFromSchema(schemaBlock) {
|
|
82
|
-
const keys = [];
|
|
83
|
-
// Match patterns like: VARIABLE_NAME: z.string()
|
|
84
|
-
const keyPattern = /([A-Z_][A-Z0-9_]*)\s*:/g;
|
|
85
|
-
let match;
|
|
86
|
-
while ((match = keyPattern.exec(schemaBlock)) !== null) {
|
|
87
|
-
if (match[1]) {
|
|
88
|
-
keys.push(match[1]);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
return keys;
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Checks if t3-env is listed in package.json dependencies
|
|
95
|
-
*/
|
|
96
|
-
async function checkPackageJson(cwd) {
|
|
97
|
-
const packageJsonPath = path.join(cwd, 'package.json');
|
|
98
|
-
if (!fs.existsSync(packageJsonPath)) {
|
|
99
|
-
return false;
|
|
100
|
-
}
|
|
101
|
-
try {
|
|
102
|
-
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
103
|
-
const allDeps = {
|
|
104
|
-
...packageJson.dependencies,
|
|
105
|
-
...packageJson.devDependencies,
|
|
106
|
-
};
|
|
107
|
-
return !!(allDeps['@t3-oss/env-core'] || allDeps['@t3-oss/env-nextjs']);
|
|
108
|
-
}
|
|
109
|
-
catch {
|
|
110
|
-
return false;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
//# sourceMappingURL=detectT3Env.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"detectT3Env.js","sourceRoot":"","sources":["../../../../src/core/t3env/detectT3Env.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { EnvUsage, T3EnvSchema } from '../../config/types.js';
|
|
2
|
-
import type { T3EnvWarning } from '../../config/types.js';
|
|
3
|
-
/**
|
|
4
|
-
* Applies t3-env specific validation rules
|
|
5
|
-
* @param u - The environment variable usage information
|
|
6
|
-
* @param warnings - The array to push warnings into
|
|
7
|
-
* @param schema - The t3-env schema to validate against
|
|
8
|
-
*/
|
|
9
|
-
export declare function applyT3EnvRules(u: EnvUsage, warnings: T3EnvWarning[], schema: T3EnvSchema): void;
|
|
10
|
-
//# sourceMappingURL=t3EnvRules.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"t3EnvRules.d.ts","sourceRoot":"","sources":["../../../../src/core/t3env/t3EnvRules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,CAAC,EAAE,QAAQ,EACX,QAAQ,EAAE,YAAY,EAAE,EACxB,MAAM,EAAE,WAAW,GAClB,IAAI,CAqDN"}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Applies t3-env specific validation rules
|
|
3
|
-
* @param u - The environment variable usage information
|
|
4
|
-
* @param warnings - The array to push warnings into
|
|
5
|
-
* @param schema - The t3-env schema to validate against
|
|
6
|
-
*/
|
|
7
|
-
export function applyT3EnvRules(u, warnings, schema) {
|
|
8
|
-
// Ignore env definition files (can be in root or subdirectories)
|
|
9
|
-
const fileName = u.file.split(/[/\\]/).pop() || '';
|
|
10
|
-
if (fileName === 'env.ts' ||
|
|
11
|
-
fileName === 'env.mjs' ||
|
|
12
|
-
fileName === 'env.js') {
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
// Ignore node_modules
|
|
16
|
-
if (u.file.includes('node_modules')) {
|
|
17
|
-
return;
|
|
18
|
-
}
|
|
19
|
-
const allServerVars = schema.server;
|
|
20
|
-
const allClientVars = schema.client;
|
|
21
|
-
const isClientContext = u.context.includes('use client') ||
|
|
22
|
-
u.context.includes('"use client"') ||
|
|
23
|
-
u.context.includes("'use client'") ||
|
|
24
|
-
u.pattern === 'import.meta.env';
|
|
25
|
-
// Client using server-only variable (SECURITY ISSUE!)
|
|
26
|
-
if (isClientContext &&
|
|
27
|
-
(allServerVars.includes(u.variable) || !allClientVars.includes(u.variable))) {
|
|
28
|
-
pushUniqueWarning(warnings, {
|
|
29
|
-
variable: u.variable,
|
|
30
|
-
reason: `Variable "${u.variable}" is used in client code but is not defined in the client schema. This may expose secrets. Add it to the client schema or move usage to server-only code.`,
|
|
31
|
-
file: u.file,
|
|
32
|
-
line: u.line,
|
|
33
|
-
framework: 't3-env',
|
|
34
|
-
});
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
// Variable not defined in any schema
|
|
38
|
-
if (!allServerVars.includes(u.variable) &&
|
|
39
|
-
!allClientVars.includes(u.variable)) {
|
|
40
|
-
pushUniqueWarning(warnings, {
|
|
41
|
-
variable: u.variable,
|
|
42
|
-
reason: `Variable "${u.variable}" is not defined in t3-env schema. Add it to either server or client schema for type safety.`,
|
|
43
|
-
file: u.file,
|
|
44
|
-
line: u.line,
|
|
45
|
-
framework: 't3-env',
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Pushes a warning into the warnings array if it's not already present
|
|
51
|
-
* @param warnings - The array to push warnings into
|
|
52
|
-
* @param warning - The warning to push
|
|
53
|
-
* @returns void
|
|
54
|
-
*/
|
|
55
|
-
function pushUniqueWarning(warnings, warning) {
|
|
56
|
-
const key = `${warning.variable}:${warning.file}:${warning.line}:${warning.reason}`;
|
|
57
|
-
if (!warnings.some((w) => `${w.variable}:${w.file}:${w.line}:${w.reason}` === key)) {
|
|
58
|
-
warnings.push(warning);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=t3EnvRules.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"t3EnvRules.js","sourceRoot":"","sources":["../../../../src/core/t3env/t3EnvRules.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,CAAW,EACX,QAAwB,EACxB,MAAmB;IAEnB,iEAAiE;IACjE,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IACnD,IACE,QAAQ,KAAK,QAAQ;QACrB,QAAQ,KAAK,SAAS;QACtB,QAAQ,KAAK,QAAQ,EACrB,CAAC;QACD,OAAO;IACT,CAAC;IAED,sBAAsB;IACtB,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QACpC,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;IACpC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;IAEpC,MAAM,eAAe,GACnB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;QAChC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;QAClC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;QAClC,CAAC,CAAC,OAAO,KAAK,iBAAiB,CAAC;IAElC,sDAAsD;IACtD,IACE,eAAe;QACf,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAC3E,CAAC;QACD,iBAAiB,CAAC,QAAQ,EAAE;YAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,MAAM,EAAE,aAAa,CAAC,CAAC,QAAQ,2JAA2J;YAC1L,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,qCAAqC;IACrC,IACE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;QACnC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,EACnC,CAAC;QACD,iBAAiB,CAAC,QAAQ,EAAE;YAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,MAAM,EAAE,aAAa,CAAC,CAAC,QAAQ,8FAA8F;YAC7H,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CACxB,QAAwB,EACxB,OAAqB;IAErB,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IACpF,IACE,CAAC,QAAQ,CAAC,IAAI,CACZ,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,GAAG,CAC/D,EACD,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;AACH,CAAC"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { EnvUsage, T3EnvWarning } from '../../config/types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Validates environment variable usages against t3-env schema and returns deduplicated warnings
|
|
4
|
-
* @param usages - Array of environment variable usages
|
|
5
|
-
* @param cwd - Current working directory to detect t3-env
|
|
6
|
-
* @returns Array of deduplicated t3-env warnings
|
|
7
|
-
*/
|
|
8
|
-
export declare function t3EnvValidator(usages: EnvUsage[], cwd: string): Promise<T3EnvWarning[]>;
|
|
9
|
-
//# sourceMappingURL=t3EnvValidator.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"t3EnvValidator.d.ts","sourceRoot":"","sources":["../../../../src/core/t3env/t3EnvValidator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAIpE;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,QAAQ,EAAE,EAClB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,YAAY,EAAE,CAAC,CA4BzB"}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { detectT3Env } from './detectT3Env.js';
|
|
2
|
-
import { applyT3EnvRules } from './t3EnvRules.js';
|
|
3
|
-
/**
|
|
4
|
-
* Validates environment variable usages against t3-env schema and returns deduplicated warnings
|
|
5
|
-
* @param usages - Array of environment variable usages
|
|
6
|
-
* @param cwd - Current working directory to detect t3-env
|
|
7
|
-
* @returns Array of deduplicated t3-env warnings
|
|
8
|
-
*/
|
|
9
|
-
export async function t3EnvValidator(usages, cwd) {
|
|
10
|
-
const t3Detection = await detectT3Env(cwd);
|
|
11
|
-
if (!t3Detection.detected || !t3Detection.schema) {
|
|
12
|
-
return [];
|
|
13
|
-
}
|
|
14
|
-
const warnings = [];
|
|
15
|
-
for (const usage of usages) {
|
|
16
|
-
applyT3EnvRules(usage, warnings, t3Detection.schema);
|
|
17
|
-
}
|
|
18
|
-
// Deduplicate warnings based on variable + reason only (not file or line)
|
|
19
|
-
// This ensures one warning per variable across all files
|
|
20
|
-
if (warnings.length === 0) {
|
|
21
|
-
return [];
|
|
22
|
-
}
|
|
23
|
-
const seen = new Map();
|
|
24
|
-
for (const w of warnings) {
|
|
25
|
-
const key = `${w.variable}|${w.reason}`;
|
|
26
|
-
if (!seen.has(key)) {
|
|
27
|
-
seen.set(key, w);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
return Array.from(seen.values());
|
|
31
|
-
}
|
|
32
|
-
//# sourceMappingURL=t3EnvValidator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"t3EnvValidator.js","sourceRoot":"","sources":["../../../../src/core/t3env/t3EnvValidator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAkB,EAClB,GAAW;IAEX,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IAE3C,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QACjD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAmB,EAAE,CAAC;IAEpC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC;IAED,0EAA0E;IAC1E,yDAAyD;IACzD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
export type DiffResult = {
|
|
2
|
-
missing: string[];
|
|
3
|
-
extra: string[];
|
|
4
|
-
valueMismatches: {
|
|
5
|
-
key: string;
|
|
6
|
-
expected: string;
|
|
7
|
-
actual: string;
|
|
8
|
-
}[];
|
|
9
|
-
};
|
|
10
|
-
/**
|
|
11
|
-
* Compares two .env files and returns their differences.
|
|
12
|
-
*
|
|
13
|
-
* @param current - An object representing the current `.env` file (key-value pairs).
|
|
14
|
-
* @param example - An object representing the `.env.example` file (key-value pairs).
|
|
15
|
-
* @param checkValues - If true, compare values when the example has a non-empty value.
|
|
16
|
-
* @returns A `DiffResult` object containing missing, extra, and mismatched keys.
|
|
17
|
-
*/
|
|
18
|
-
export declare function diffEnv(current: Record<string, string>, example: Record<string, string>, checkValues?: boolean): DiffResult;
|
|
19
|
-
//# sourceMappingURL=diffEnv.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"diffEnv.d.ts","sourceRoot":"","sources":["../../../src/lib/diffEnv.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,eAAe,EAAE;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,EAAE,CAAC;CACL,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,OAAO,CACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,WAAW,UAAQ,GAClB,UAAU,CA2BZ"}
|
package/dist/src/lib/diffEnv.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Compares two .env files and returns their differences.
|
|
3
|
-
*
|
|
4
|
-
* @param current - An object representing the current `.env` file (key-value pairs).
|
|
5
|
-
* @param example - An object representing the `.env.example` file (key-value pairs).
|
|
6
|
-
* @param checkValues - If true, compare values when the example has a non-empty value.
|
|
7
|
-
* @returns A `DiffResult` object containing missing, extra, and mismatched keys.
|
|
8
|
-
*/
|
|
9
|
-
export function diffEnv(current, example, checkValues = false) {
|
|
10
|
-
const currentKeys = Object.keys(current);
|
|
11
|
-
const exampleKeys = Object.keys(example);
|
|
12
|
-
const missing = exampleKeys.filter((key) => !currentKeys.includes(key));
|
|
13
|
-
const extra = currentKeys.filter((key) => !exampleKeys.includes(key));
|
|
14
|
-
let valueMismatches = [];
|
|
15
|
-
if (checkValues) {
|
|
16
|
-
valueMismatches = exampleKeys
|
|
17
|
-
.filter((key) => {
|
|
18
|
-
return (currentKeys.includes(key) &&
|
|
19
|
-
typeof example[key] === 'string' &&
|
|
20
|
-
example[key].trim() !== '' &&
|
|
21
|
-
current[key] !== example[key]);
|
|
22
|
-
})
|
|
23
|
-
.map((key) => ({
|
|
24
|
-
key,
|
|
25
|
-
expected: example[key] ?? '',
|
|
26
|
-
actual: current[key] ?? '',
|
|
27
|
-
}));
|
|
28
|
-
}
|
|
29
|
-
return { missing, extra, valueMismatches };
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=diffEnv.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"diffEnv.js","sourceRoot":"","sources":["../../../src/lib/diffEnv.ts"],"names":[],"mappings":"AAUA;;;;;;;GAOG;AACH,MAAM,UAAU,OAAO,CACrB,OAA+B,EAC/B,OAA+B,EAC/B,WAAW,GAAG,KAAK;IAEnB,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEzC,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IACxE,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAEtE,IAAI,eAAe,GAAkC,EAAE,CAAC;IAExD,IAAI,WAAW,EAAE,CAAC;QAChB,eAAe,GAAG,WAAW;aAC1B,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YACd,OAAO,CACL,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACzB,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ;gBAChC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE;gBAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,CAC9B,CAAC;QACJ,CAAC,CAAC;aACD,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACb,GAAG;YACH,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE;YAC5B,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE;SAC3B,CAAC,CAAC,CAAC;IACR,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;AAC7C,CAAC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Parses a `.env` file and returns an object with key-value pairs.
|
|
3
|
-
*
|
|
4
|
-
* @param path - The file path to the `.env` file.
|
|
5
|
-
* @returns A record object representing parsed environment variables.
|
|
6
|
-
*
|
|
7
|
-
* Lines that are empty or start with `#` (comments) are ignored.
|
|
8
|
-
* Multi-line or quoted values are not supported.
|
|
9
|
-
*/
|
|
10
|
-
export declare function parseEnvFile(path: string): Record<string, string>;
|
|
11
|
-
//# sourceMappingURL=parseEnv.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parseEnv.d.ts","sourceRoot":"","sources":["../../../src/lib/parseEnv.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiBjE"}
|