driftdetect-core 0.6.1 → 0.7.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/LICENSE +21 -0
- package/dist/constants/analysis/categorizer.d.ts +27 -0
- package/dist/constants/analysis/categorizer.d.ts.map +1 -0
- package/dist/constants/analysis/categorizer.js +364 -0
- package/dist/constants/analysis/categorizer.js.map +1 -0
- package/dist/constants/analysis/consistency-analyzer.d.ts +77 -0
- package/dist/constants/analysis/consistency-analyzer.d.ts.map +1 -0
- package/dist/constants/analysis/consistency-analyzer.js +176 -0
- package/dist/constants/analysis/consistency-analyzer.js.map +1 -0
- package/dist/constants/analysis/dead-constant-detector.d.ts +79 -0
- package/dist/constants/analysis/dead-constant-detector.d.ts.map +1 -0
- package/dist/constants/analysis/dead-constant-detector.js +242 -0
- package/dist/constants/analysis/dead-constant-detector.js.map +1 -0
- package/dist/constants/analysis/magic-detector.d.ts +116 -0
- package/dist/constants/analysis/magic-detector.d.ts.map +1 -0
- package/dist/constants/analysis/magic-detector.js +425 -0
- package/dist/constants/analysis/magic-detector.js.map +1 -0
- package/dist/constants/analysis/reference-finder.d.ts +87 -0
- package/dist/constants/analysis/reference-finder.d.ts.map +1 -0
- package/dist/constants/analysis/reference-finder.js +269 -0
- package/dist/constants/analysis/reference-finder.js.map +1 -0
- package/dist/constants/analysis/security-scanner.d.ts +115 -0
- package/dist/constants/analysis/security-scanner.d.ts.map +1 -0
- package/dist/constants/analysis/security-scanner.js +429 -0
- package/dist/constants/analysis/security-scanner.js.map +1 -0
- package/dist/constants/extractors/base-extractor.d.ts +97 -0
- package/dist/constants/extractors/base-extractor.d.ts.map +1 -0
- package/dist/constants/extractors/base-extractor.js +285 -0
- package/dist/constants/extractors/base-extractor.js.map +1 -0
- package/dist/constants/extractors/regex/base-regex.d.ts +67 -0
- package/dist/constants/extractors/regex/base-regex.d.ts.map +1 -0
- package/dist/constants/extractors/regex/base-regex.js +209 -0
- package/dist/constants/extractors/regex/base-regex.js.map +1 -0
- package/dist/constants/extractors/regex/csharp-regex.d.ts +39 -0
- package/dist/constants/extractors/regex/csharp-regex.d.ts.map +1 -0
- package/dist/constants/extractors/regex/csharp-regex.js +316 -0
- package/dist/constants/extractors/regex/csharp-regex.js.map +1 -0
- package/dist/constants/extractors/regex/go-regex.d.ts +40 -0
- package/dist/constants/extractors/regex/go-regex.d.ts.map +1 -0
- package/dist/constants/extractors/regex/go-regex.js +297 -0
- package/dist/constants/extractors/regex/go-regex.js.map +1 -0
- package/dist/constants/extractors/regex/java-regex.d.ts +43 -0
- package/dist/constants/extractors/regex/java-regex.d.ts.map +1 -0
- package/dist/constants/extractors/regex/java-regex.js +276 -0
- package/dist/constants/extractors/regex/java-regex.js.map +1 -0
- package/dist/constants/extractors/regex/php-regex.d.ts +39 -0
- package/dist/constants/extractors/regex/php-regex.d.ts.map +1 -0
- package/dist/constants/extractors/regex/php-regex.js +270 -0
- package/dist/constants/extractors/regex/php-regex.js.map +1 -0
- package/dist/constants/extractors/regex/python-regex.d.ts +39 -0
- package/dist/constants/extractors/regex/python-regex.d.ts.map +1 -0
- package/dist/constants/extractors/regex/python-regex.js +287 -0
- package/dist/constants/extractors/regex/python-regex.js.map +1 -0
- package/dist/constants/extractors/regex/typescript-regex.d.ts +35 -0
- package/dist/constants/extractors/regex/typescript-regex.d.ts.map +1 -0
- package/dist/constants/extractors/regex/typescript-regex.js +313 -0
- package/dist/constants/extractors/regex/typescript-regex.js.map +1 -0
- package/dist/constants/index.d.ts +26 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +36 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/constants/integration/callgraph-adapter.d.ts +167 -0
- package/dist/constants/integration/callgraph-adapter.d.ts.map +1 -0
- package/dist/constants/integration/callgraph-adapter.js +287 -0
- package/dist/constants/integration/callgraph-adapter.js.map +1 -0
- package/dist/constants/integration/index.d.ts +10 -0
- package/dist/constants/integration/index.d.ts.map +1 -0
- package/dist/constants/integration/index.js +13 -0
- package/dist/constants/integration/index.js.map +1 -0
- package/dist/constants/integration/pattern-adapter.d.ts +171 -0
- package/dist/constants/integration/pattern-adapter.d.ts.map +1 -0
- package/dist/constants/integration/pattern-adapter.js +331 -0
- package/dist/constants/integration/pattern-adapter.js.map +1 -0
- package/dist/constants/integration/scanner-adapter.d.ts +153 -0
- package/dist/constants/integration/scanner-adapter.d.ts.map +1 -0
- package/dist/constants/integration/scanner-adapter.js +337 -0
- package/dist/constants/integration/scanner-adapter.js.map +1 -0
- package/dist/constants/store/constant-store.d.ts +117 -0
- package/dist/constants/store/constant-store.d.ts.map +1 -0
- package/dist/constants/store/constant-store.js +367 -0
- package/dist/constants/store/constant-store.js.map +1 -0
- package/dist/constants/types.d.ts +423 -0
- package/dist/constants/types.d.ts.map +1 -0
- package/dist/constants/types.js +43 -0
- package/dist/constants/types.js.map +1 -0
- package/dist/constraints/store/constraint-store.d.ts.map +1 -1
- package/dist/constraints/store/constraint-store.js +37 -2
- package/dist/constraints/store/constraint-store.js.map +1 -1
- package/dist/environment/env-scanner.d.ts +53 -0
- package/dist/environment/env-scanner.d.ts.map +1 -0
- package/dist/environment/env-scanner.js +290 -0
- package/dist/environment/env-scanner.js.map +1 -0
- package/dist/environment/env-store.d.ts +70 -0
- package/dist/environment/env-store.d.ts.map +1 -0
- package/dist/environment/env-store.js +201 -0
- package/dist/environment/env-store.js.map +1 -0
- package/dist/environment/extractors/base-env-extractor.d.ts +56 -0
- package/dist/environment/extractors/base-env-extractor.d.ts.map +1 -0
- package/dist/environment/extractors/base-env-extractor.js +74 -0
- package/dist/environment/extractors/base-env-extractor.js.map +1 -0
- package/dist/environment/extractors/csharp-env-extractor.d.ts +49 -0
- package/dist/environment/extractors/csharp-env-extractor.d.ts.map +1 -0
- package/dist/environment/extractors/csharp-env-extractor.js +240 -0
- package/dist/environment/extractors/csharp-env-extractor.js.map +1 -0
- package/dist/environment/extractors/go-env-extractor.d.ts +53 -0
- package/dist/environment/extractors/go-env-extractor.d.ts.map +1 -0
- package/dist/environment/extractors/go-env-extractor.js +267 -0
- package/dist/environment/extractors/go-env-extractor.js.map +1 -0
- package/dist/environment/extractors/index.d.ts +13 -0
- package/dist/environment/extractors/index.d.ts.map +1 -0
- package/dist/environment/extractors/index.js +13 -0
- package/dist/environment/extractors/index.js.map +1 -0
- package/dist/environment/extractors/java-env-extractor.d.ts +58 -0
- package/dist/environment/extractors/java-env-extractor.d.ts.map +1 -0
- package/dist/environment/extractors/java-env-extractor.js +219 -0
- package/dist/environment/extractors/java-env-extractor.js.map +1 -0
- package/dist/environment/extractors/php-env-extractor.d.ts +58 -0
- package/dist/environment/extractors/php-env-extractor.d.ts.map +1 -0
- package/dist/environment/extractors/php-env-extractor.js +231 -0
- package/dist/environment/extractors/php-env-extractor.js.map +1 -0
- package/dist/environment/extractors/python-env-extractor.d.ts +50 -0
- package/dist/environment/extractors/python-env-extractor.d.ts.map +1 -0
- package/dist/environment/extractors/python-env-extractor.js +219 -0
- package/dist/environment/extractors/python-env-extractor.js.map +1 -0
- package/dist/environment/extractors/typescript-env-extractor.d.ts +54 -0
- package/dist/environment/extractors/typescript-env-extractor.d.ts.map +1 -0
- package/dist/environment/extractors/typescript-env-extractor.js +228 -0
- package/dist/environment/extractors/typescript-env-extractor.js.map +1 -0
- package/dist/environment/index.d.ts +11 -0
- package/dist/environment/index.d.ts.map +1 -0
- package/dist/environment/index.js +15 -0
- package/dist/environment/index.js.map +1 -0
- package/dist/environment/types.d.ts +145 -0
- package/dist/environment/types.d.ts.map +1 -0
- package/dist/environment/types.js +84 -0
- package/dist/environment/types.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -1
- package/package.json +13 -13
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment Variable Scanner
|
|
3
|
+
*
|
|
4
|
+
* Unified scanner for detecting environment variable access patterns
|
|
5
|
+
* across all supported languages.
|
|
6
|
+
*/
|
|
7
|
+
import type { EnvScanResult } from './types.js';
|
|
8
|
+
export interface EnvScannerConfig {
|
|
9
|
+
rootDir: string;
|
|
10
|
+
verbose?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Environment Variable Scanner
|
|
14
|
+
*
|
|
15
|
+
* Scans codebases for environment variable access patterns.
|
|
16
|
+
*/
|
|
17
|
+
export declare class EnvScanner {
|
|
18
|
+
private readonly config;
|
|
19
|
+
private readonly extractors;
|
|
20
|
+
constructor(config: EnvScannerConfig);
|
|
21
|
+
/**
|
|
22
|
+
* Scan files for environment variable access patterns
|
|
23
|
+
*/
|
|
24
|
+
scanFiles(files: string[]): Promise<EnvScanResult>;
|
|
25
|
+
/**
|
|
26
|
+
* Scan directory with glob patterns
|
|
27
|
+
*/
|
|
28
|
+
scanDirectory(options?: {
|
|
29
|
+
patterns?: string[];
|
|
30
|
+
ignorePatterns?: string[];
|
|
31
|
+
}): Promise<EnvScanResult>;
|
|
32
|
+
/**
|
|
33
|
+
* Get the appropriate extractor for a file
|
|
34
|
+
*/
|
|
35
|
+
private getExtractor;
|
|
36
|
+
/**
|
|
37
|
+
* Quick check if file might have environment access
|
|
38
|
+
*/
|
|
39
|
+
private mightHaveEnvAccess;
|
|
40
|
+
/**
|
|
41
|
+
* Build the access map from extracted access points
|
|
42
|
+
*/
|
|
43
|
+
private buildAccessMap;
|
|
44
|
+
/**
|
|
45
|
+
* Find files matching patterns
|
|
46
|
+
*/
|
|
47
|
+
private findFiles;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Create a new EnvScanner instance
|
|
51
|
+
*/
|
|
52
|
+
export declare function createEnvScanner(config: EnvScannerConfig): EnvScanner;
|
|
53
|
+
//# sourceMappingURL=env-scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-scanner.d.ts","sourceRoot":"","sources":["../../src/environment/env-scanner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAIV,aAAa,EACd,MAAM,YAAY,CAAC;AAapB,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAMD;;;;GAIG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;gBAEpC,MAAM,EAAE,gBAAgB;IAcpC;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC;IA2DxD;;OAEG;IACG,aAAa,CAAC,OAAO,GAAE;QAC3B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;KACtB,GAAG,OAAO,CAAC,aAAa,CAAC;IA+B/B;;OAEG;IACH,OAAO,CAAC,YAAY;IASpB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAuC1B;;OAEG;IACH,OAAO,CAAC,cAAc;IAwEtB;;OAEG;YACW,SAAS;CAiCxB;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CAErE"}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment Variable Scanner
|
|
3
|
+
*
|
|
4
|
+
* Unified scanner for detecting environment variable access patterns
|
|
5
|
+
* across all supported languages.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from 'node:fs/promises';
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
import { minimatch } from 'minimatch';
|
|
10
|
+
import { TypeScriptEnvExtractor } from './extractors/typescript-env-extractor.js';
|
|
11
|
+
import { PythonEnvExtractor } from './extractors/python-env-extractor.js';
|
|
12
|
+
import { JavaEnvExtractor } from './extractors/java-env-extractor.js';
|
|
13
|
+
import { CSharpEnvExtractor } from './extractors/csharp-env-extractor.js';
|
|
14
|
+
import { PhpEnvExtractor } from './extractors/php-env-extractor.js';
|
|
15
|
+
import { GoEnvExtractor } from './extractors/go-env-extractor.js';
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Environment Scanner
|
|
18
|
+
// ============================================================================
|
|
19
|
+
/**
|
|
20
|
+
* Environment Variable Scanner
|
|
21
|
+
*
|
|
22
|
+
* Scans codebases for environment variable access patterns.
|
|
23
|
+
*/
|
|
24
|
+
export class EnvScanner {
|
|
25
|
+
config;
|
|
26
|
+
extractors;
|
|
27
|
+
constructor(config) {
|
|
28
|
+
this.config = config;
|
|
29
|
+
// Initialize all extractors
|
|
30
|
+
this.extractors = [
|
|
31
|
+
new TypeScriptEnvExtractor(),
|
|
32
|
+
new PythonEnvExtractor(),
|
|
33
|
+
new JavaEnvExtractor(),
|
|
34
|
+
new CSharpEnvExtractor(),
|
|
35
|
+
new PhpEnvExtractor(),
|
|
36
|
+
new GoEnvExtractor(),
|
|
37
|
+
];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Scan files for environment variable access patterns
|
|
41
|
+
*/
|
|
42
|
+
async scanFiles(files) {
|
|
43
|
+
const startTime = Date.now();
|
|
44
|
+
const accessPoints = new Map();
|
|
45
|
+
const errors = [];
|
|
46
|
+
const stats = {
|
|
47
|
+
filesScanned: 0,
|
|
48
|
+
variablesFound: 0,
|
|
49
|
+
accessPointsFound: 0,
|
|
50
|
+
secretsFound: 0,
|
|
51
|
+
scanDurationMs: 0,
|
|
52
|
+
};
|
|
53
|
+
for (const file of files) {
|
|
54
|
+
// Skip type definition files
|
|
55
|
+
if (file.endsWith('.d.ts'))
|
|
56
|
+
continue;
|
|
57
|
+
const extractor = this.getExtractor(file);
|
|
58
|
+
if (!extractor)
|
|
59
|
+
continue;
|
|
60
|
+
try {
|
|
61
|
+
const filePath = path.join(this.config.rootDir, file);
|
|
62
|
+
const source = await fs.readFile(filePath, 'utf-8');
|
|
63
|
+
// Quick check if file might have env access
|
|
64
|
+
if (!this.mightHaveEnvAccess(source))
|
|
65
|
+
continue;
|
|
66
|
+
stats.filesScanned++;
|
|
67
|
+
const result = extractor.extract(source, file);
|
|
68
|
+
if (result.accessPoints.length > 0) {
|
|
69
|
+
accessPoints.set(file, result.accessPoints);
|
|
70
|
+
stats.accessPointsFound += result.accessPoints.length;
|
|
71
|
+
}
|
|
72
|
+
if (result.errors.length > 0) {
|
|
73
|
+
for (const error of result.errors) {
|
|
74
|
+
errors.push({ file, error });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
80
|
+
errors.push({ file, error: errorMsg });
|
|
81
|
+
if (this.config.verbose) {
|
|
82
|
+
console.error(`Error scanning ${file}:`, errorMsg);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Build access map
|
|
87
|
+
const accessMap = this.buildAccessMap(accessPoints);
|
|
88
|
+
stats.variablesFound = accessMap.stats.totalVariables;
|
|
89
|
+
stats.secretsFound = accessMap.stats.secretVariables;
|
|
90
|
+
stats.scanDurationMs = Date.now() - startTime;
|
|
91
|
+
return { accessMap, stats };
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Scan directory with glob patterns
|
|
95
|
+
*/
|
|
96
|
+
async scanDirectory(options = {}) {
|
|
97
|
+
const patterns = options.patterns ?? [
|
|
98
|
+
'**/*.ts',
|
|
99
|
+
'**/*.tsx',
|
|
100
|
+
'**/*.js',
|
|
101
|
+
'**/*.jsx',
|
|
102
|
+
'**/*.py',
|
|
103
|
+
'**/*.cs',
|
|
104
|
+
'**/*.java',
|
|
105
|
+
'**/*.php',
|
|
106
|
+
'**/*.go',
|
|
107
|
+
];
|
|
108
|
+
const ignorePatterns = options.ignorePatterns ?? [
|
|
109
|
+
'node_modules',
|
|
110
|
+
'.git',
|
|
111
|
+
'dist',
|
|
112
|
+
'build',
|
|
113
|
+
'__pycache__',
|
|
114
|
+
'.drift',
|
|
115
|
+
'.venv',
|
|
116
|
+
'venv',
|
|
117
|
+
'bin',
|
|
118
|
+
'obj',
|
|
119
|
+
'target',
|
|
120
|
+
'vendor',
|
|
121
|
+
];
|
|
122
|
+
const files = await this.findFiles(patterns, ignorePatterns);
|
|
123
|
+
return this.scanFiles(files);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get the appropriate extractor for a file
|
|
127
|
+
*/
|
|
128
|
+
getExtractor(file) {
|
|
129
|
+
for (const extractor of this.extractors) {
|
|
130
|
+
if (extractor.canHandle(file)) {
|
|
131
|
+
return extractor;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Quick check if file might have environment access
|
|
138
|
+
*/
|
|
139
|
+
mightHaveEnvAccess(content) {
|
|
140
|
+
const patterns = [
|
|
141
|
+
// JavaScript/TypeScript
|
|
142
|
+
'process.env',
|
|
143
|
+
'import.meta.env',
|
|
144
|
+
'dotenv',
|
|
145
|
+
'config(',
|
|
146
|
+
// Python
|
|
147
|
+
'os.environ',
|
|
148
|
+
'os.getenv',
|
|
149
|
+
'load_dotenv',
|
|
150
|
+
'BaseSettings',
|
|
151
|
+
// Java
|
|
152
|
+
'System.getenv',
|
|
153
|
+
'System.getProperty',
|
|
154
|
+
'@Value',
|
|
155
|
+
'Environment.',
|
|
156
|
+
'@ConfigurationProperties',
|
|
157
|
+
// C#
|
|
158
|
+
'Environment.GetEnvironmentVariable',
|
|
159
|
+
'IConfiguration',
|
|
160
|
+
'ConfigurationManager',
|
|
161
|
+
'GetConnectionString',
|
|
162
|
+
// PHP
|
|
163
|
+
'getenv(',
|
|
164
|
+
'$_ENV',
|
|
165
|
+
'$_SERVER',
|
|
166
|
+
'env(',
|
|
167
|
+
'config(',
|
|
168
|
+
// Go
|
|
169
|
+
'os.Getenv',
|
|
170
|
+
'os.LookupEnv',
|
|
171
|
+
'viper.',
|
|
172
|
+
'envconfig',
|
|
173
|
+
];
|
|
174
|
+
return patterns.some(p => content.includes(p));
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Build the access map from extracted access points
|
|
178
|
+
*/
|
|
179
|
+
buildAccessMap(accessPoints) {
|
|
180
|
+
const variables = {};
|
|
181
|
+
const allAccessPoints = {};
|
|
182
|
+
const stats = {
|
|
183
|
+
totalVariables: 0,
|
|
184
|
+
totalAccessPoints: 0,
|
|
185
|
+
secretVariables: 0,
|
|
186
|
+
credentialVariables: 0,
|
|
187
|
+
configVariables: 0,
|
|
188
|
+
byLanguage: {},
|
|
189
|
+
byMethod: {},
|
|
190
|
+
};
|
|
191
|
+
for (const [file, points] of accessPoints) {
|
|
192
|
+
for (const point of points) {
|
|
193
|
+
// Skip internal markers
|
|
194
|
+
if (point.varName.startsWith('__'))
|
|
195
|
+
continue;
|
|
196
|
+
// Add to all access points
|
|
197
|
+
allAccessPoints[point.id] = point;
|
|
198
|
+
stats.totalAccessPoints++;
|
|
199
|
+
// Track by language
|
|
200
|
+
stats.byLanguage[point.language] = (stats.byLanguage[point.language] ?? 0) + 1;
|
|
201
|
+
// Track by method
|
|
202
|
+
stats.byMethod[point.method] = (stats.byMethod[point.method] ?? 0) + 1;
|
|
203
|
+
// Add to variable info
|
|
204
|
+
if (!variables[point.varName]) {
|
|
205
|
+
variables[point.varName] = {
|
|
206
|
+
name: point.varName,
|
|
207
|
+
sensitivity: point.sensitivity,
|
|
208
|
+
accessedBy: [],
|
|
209
|
+
files: [],
|
|
210
|
+
hasDefault: false,
|
|
211
|
+
isRequired: true,
|
|
212
|
+
};
|
|
213
|
+
stats.totalVariables++;
|
|
214
|
+
// Track by sensitivity
|
|
215
|
+
if (point.sensitivity === 'secret')
|
|
216
|
+
stats.secretVariables++;
|
|
217
|
+
else if (point.sensitivity === 'credential')
|
|
218
|
+
stats.credentialVariables++;
|
|
219
|
+
else if (point.sensitivity === 'config')
|
|
220
|
+
stats.configVariables++;
|
|
221
|
+
}
|
|
222
|
+
const varInfo = variables[point.varName];
|
|
223
|
+
if (varInfo) {
|
|
224
|
+
varInfo.accessedBy.push(point);
|
|
225
|
+
if (!varInfo.files.includes(file)) {
|
|
226
|
+
varInfo.files.push(file);
|
|
227
|
+
}
|
|
228
|
+
if (point.hasDefault) {
|
|
229
|
+
varInfo.hasDefault = true;
|
|
230
|
+
}
|
|
231
|
+
if (!point.isRequired) {
|
|
232
|
+
varInfo.isRequired = false;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return {
|
|
238
|
+
version: '1.0',
|
|
239
|
+
generatedAt: new Date().toISOString(),
|
|
240
|
+
projectRoot: this.config.rootDir,
|
|
241
|
+
variables,
|
|
242
|
+
accessPoints: allAccessPoints,
|
|
243
|
+
stats,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Find files matching patterns
|
|
248
|
+
*/
|
|
249
|
+
async findFiles(patterns, ignorePatterns) {
|
|
250
|
+
const files = [];
|
|
251
|
+
const walk = async (dir, relativePath = '') => {
|
|
252
|
+
let entries;
|
|
253
|
+
try {
|
|
254
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
for (const entry of entries) {
|
|
260
|
+
const fullPath = path.join(dir, entry.name);
|
|
261
|
+
const relPath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
|
|
262
|
+
if (entry.isDirectory()) {
|
|
263
|
+
if (!ignorePatterns.includes(entry.name) && !entry.name.startsWith('.')) {
|
|
264
|
+
await walk(fullPath, relPath);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
else if (entry.isFile()) {
|
|
268
|
+
for (const pattern of patterns) {
|
|
269
|
+
if (minimatch(relPath, pattern)) {
|
|
270
|
+
files.push(relPath);
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
await walk(this.config.rootDir);
|
|
278
|
+
return files;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
// ============================================================================
|
|
282
|
+
// Factory Functions
|
|
283
|
+
// ============================================================================
|
|
284
|
+
/**
|
|
285
|
+
* Create a new EnvScanner instance
|
|
286
|
+
*/
|
|
287
|
+
export function createEnvScanner(config) {
|
|
288
|
+
return new EnvScanner(config);
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=env-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-scanner.js","sourceRoot":"","sources":["../../src/environment/env-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment Variable Store
|
|
3
|
+
*
|
|
4
|
+
* Persistent storage for environment variable access patterns.
|
|
5
|
+
*/
|
|
6
|
+
import type { EnvAccessMap, EnvVarInfo, FileEnvInfo, EnvStoreConfig, EnvSensitivity } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Environment Variable Store
|
|
9
|
+
*
|
|
10
|
+
* Manages persistent storage of environment variable access patterns.
|
|
11
|
+
*/
|
|
12
|
+
export declare class EnvStore {
|
|
13
|
+
private readonly config;
|
|
14
|
+
private accessMap;
|
|
15
|
+
private initialized;
|
|
16
|
+
constructor(config: EnvStoreConfig);
|
|
17
|
+
/**
|
|
18
|
+
* Initialize the store
|
|
19
|
+
*/
|
|
20
|
+
initialize(): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Get the current access map
|
|
23
|
+
*/
|
|
24
|
+
getAccessMap(): EnvAccessMap;
|
|
25
|
+
/**
|
|
26
|
+
* Update the access map
|
|
27
|
+
*/
|
|
28
|
+
updateAccessMap(accessMap: EnvAccessMap): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Get information about a specific variable
|
|
31
|
+
*/
|
|
32
|
+
getVariable(varName: string): EnvVarInfo | null;
|
|
33
|
+
/**
|
|
34
|
+
* Get all variables by sensitivity
|
|
35
|
+
*/
|
|
36
|
+
getVariablesBySensitivity(sensitivity: EnvSensitivity): EnvVarInfo[];
|
|
37
|
+
/**
|
|
38
|
+
* Get all secret variables
|
|
39
|
+
*/
|
|
40
|
+
getSecrets(): EnvVarInfo[];
|
|
41
|
+
/**
|
|
42
|
+
* Get all credential variables
|
|
43
|
+
*/
|
|
44
|
+
getCredentials(): EnvVarInfo[];
|
|
45
|
+
/**
|
|
46
|
+
* Get environment access for a file
|
|
47
|
+
*/
|
|
48
|
+
getFileAccess(filePattern: string): FileEnvInfo[];
|
|
49
|
+
/**
|
|
50
|
+
* Get required variables (no default, marked as required)
|
|
51
|
+
*/
|
|
52
|
+
getRequiredVariables(): EnvVarInfo[];
|
|
53
|
+
/**
|
|
54
|
+
* Get variables without defaults
|
|
55
|
+
*/
|
|
56
|
+
getVariablesWithoutDefaults(): EnvVarInfo[];
|
|
57
|
+
/**
|
|
58
|
+
* Check if store has data
|
|
59
|
+
*/
|
|
60
|
+
hasData(): boolean;
|
|
61
|
+
private createEmptyAccessMap;
|
|
62
|
+
private loadAccessMap;
|
|
63
|
+
private saveAccessMap;
|
|
64
|
+
private matchesPattern;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Create a new EnvStore instance
|
|
68
|
+
*/
|
|
69
|
+
export declare function createEnvStore(config: EnvStoreConfig): EnvStore;
|
|
70
|
+
//# sourceMappingURL=env-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-store.d.ts","sourceRoot":"","sources":["../../src/environment/env-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EACV,YAAY,EAEZ,UAAU,EACV,WAAW,EACX,cAAc,EACd,cAAc,EACf,MAAM,YAAY,CAAC;AAcpB;;;;GAIG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,cAAc;IAIlC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAajC;;OAEG;IACH,YAAY,IAAI,YAAY;IAO5B;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7D;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAK/C;;OAEG;IACH,yBAAyB,CAAC,WAAW,EAAE,cAAc,GAAG,UAAU,EAAE;IAMpE;;OAEG;IACH,UAAU,IAAI,UAAU,EAAE;IAI1B;;OAEG;IACH,cAAc,IAAI,UAAU,EAAE;IAI9B;;OAEG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE;IAkCjD;;OAEG;IACH,oBAAoB,IAAI,UAAU,EAAE;IAMpC;;OAEG;IACH,2BAA2B,IAAI,UAAU,EAAE;IAM3C;;OAEG;IACH,OAAO,IAAI,OAAO;IAQlB,OAAO,CAAC,oBAAoB;YAmBd,aAAa;YAMb,aAAa;IAU3B,OAAO,CAAC,cAAc;CAWvB;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,QAAQ,CAE/D"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment Variable Store
|
|
3
|
+
*
|
|
4
|
+
* Persistent storage for environment variable access patterns.
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'node:fs/promises';
|
|
7
|
+
import * as path from 'node:path';
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Constants
|
|
10
|
+
// ============================================================================
|
|
11
|
+
const DRIFT_DIR = '.drift';
|
|
12
|
+
const ENV_DIR = 'environment';
|
|
13
|
+
const ACCESS_MAP_FILE = 'access-map.json';
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// Environment Store
|
|
16
|
+
// ============================================================================
|
|
17
|
+
/**
|
|
18
|
+
* Environment Variable Store
|
|
19
|
+
*
|
|
20
|
+
* Manages persistent storage of environment variable access patterns.
|
|
21
|
+
*/
|
|
22
|
+
export class EnvStore {
|
|
23
|
+
config;
|
|
24
|
+
accessMap = null;
|
|
25
|
+
initialized = false;
|
|
26
|
+
constructor(config) {
|
|
27
|
+
this.config = config;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Initialize the store
|
|
31
|
+
*/
|
|
32
|
+
async initialize() {
|
|
33
|
+
if (this.initialized)
|
|
34
|
+
return;
|
|
35
|
+
try {
|
|
36
|
+
await this.loadAccessMap();
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// No existing data, start fresh
|
|
40
|
+
this.accessMap = this.createEmptyAccessMap();
|
|
41
|
+
}
|
|
42
|
+
this.initialized = true;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get the current access map
|
|
46
|
+
*/
|
|
47
|
+
getAccessMap() {
|
|
48
|
+
if (!this.accessMap) {
|
|
49
|
+
return this.createEmptyAccessMap();
|
|
50
|
+
}
|
|
51
|
+
return this.accessMap;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Update the access map
|
|
55
|
+
*/
|
|
56
|
+
async updateAccessMap(accessMap) {
|
|
57
|
+
this.accessMap = accessMap;
|
|
58
|
+
await this.saveAccessMap();
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get information about a specific variable
|
|
62
|
+
*/
|
|
63
|
+
getVariable(varName) {
|
|
64
|
+
if (!this.accessMap)
|
|
65
|
+
return null;
|
|
66
|
+
return this.accessMap.variables[varName] ?? null;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get all variables by sensitivity
|
|
70
|
+
*/
|
|
71
|
+
getVariablesBySensitivity(sensitivity) {
|
|
72
|
+
if (!this.accessMap)
|
|
73
|
+
return [];
|
|
74
|
+
return Object.values(this.accessMap.variables)
|
|
75
|
+
.filter(v => v.sensitivity === sensitivity);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get all secret variables
|
|
79
|
+
*/
|
|
80
|
+
getSecrets() {
|
|
81
|
+
return this.getVariablesBySensitivity('secret');
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get all credential variables
|
|
85
|
+
*/
|
|
86
|
+
getCredentials() {
|
|
87
|
+
return this.getVariablesBySensitivity('credential');
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get environment access for a file
|
|
91
|
+
*/
|
|
92
|
+
getFileAccess(filePattern) {
|
|
93
|
+
if (!this.accessMap)
|
|
94
|
+
return [];
|
|
95
|
+
const results = [];
|
|
96
|
+
const fileAccessMap = new Map();
|
|
97
|
+
// Group access points by file
|
|
98
|
+
for (const point of Object.values(this.accessMap.accessPoints)) {
|
|
99
|
+
if (this.matchesPattern(point.file, filePattern)) {
|
|
100
|
+
if (!fileAccessMap.has(point.file)) {
|
|
101
|
+
fileAccessMap.set(point.file, []);
|
|
102
|
+
}
|
|
103
|
+
fileAccessMap.get(point.file).push(point);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Build file info
|
|
107
|
+
for (const [file, accessPoints] of fileAccessMap) {
|
|
108
|
+
const variables = [...new Set(accessPoints.map(ap => ap.varName))];
|
|
109
|
+
const sensitiveVars = accessPoints
|
|
110
|
+
.filter(ap => ap.sensitivity === 'secret' || ap.sensitivity === 'credential')
|
|
111
|
+
.map(ap => ap.varName);
|
|
112
|
+
results.push({
|
|
113
|
+
file,
|
|
114
|
+
variables,
|
|
115
|
+
accessPoints,
|
|
116
|
+
sensitiveVars: [...new Set(sensitiveVars)],
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
return results;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get required variables (no default, marked as required)
|
|
123
|
+
*/
|
|
124
|
+
getRequiredVariables() {
|
|
125
|
+
if (!this.accessMap)
|
|
126
|
+
return [];
|
|
127
|
+
return Object.values(this.accessMap.variables)
|
|
128
|
+
.filter(v => v.isRequired && !v.hasDefault);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get variables without defaults
|
|
132
|
+
*/
|
|
133
|
+
getVariablesWithoutDefaults() {
|
|
134
|
+
if (!this.accessMap)
|
|
135
|
+
return [];
|
|
136
|
+
return Object.values(this.accessMap.variables)
|
|
137
|
+
.filter(v => !v.hasDefault);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Check if store has data
|
|
141
|
+
*/
|
|
142
|
+
hasData() {
|
|
143
|
+
return this.accessMap !== null && this.accessMap.stats.totalVariables > 0;
|
|
144
|
+
}
|
|
145
|
+
// ============================================================================
|
|
146
|
+
// Private Methods
|
|
147
|
+
// ============================================================================
|
|
148
|
+
createEmptyAccessMap() {
|
|
149
|
+
return {
|
|
150
|
+
version: '1.0',
|
|
151
|
+
generatedAt: new Date().toISOString(),
|
|
152
|
+
projectRoot: this.config.rootDir,
|
|
153
|
+
variables: {},
|
|
154
|
+
accessPoints: {},
|
|
155
|
+
stats: {
|
|
156
|
+
totalVariables: 0,
|
|
157
|
+
totalAccessPoints: 0,
|
|
158
|
+
secretVariables: 0,
|
|
159
|
+
credentialVariables: 0,
|
|
160
|
+
configVariables: 0,
|
|
161
|
+
byLanguage: {},
|
|
162
|
+
byMethod: {},
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
async loadAccessMap() {
|
|
167
|
+
const filePath = path.join(this.config.rootDir, DRIFT_DIR, ENV_DIR, ACCESS_MAP_FILE);
|
|
168
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
169
|
+
this.accessMap = JSON.parse(content);
|
|
170
|
+
}
|
|
171
|
+
async saveAccessMap() {
|
|
172
|
+
if (!this.accessMap)
|
|
173
|
+
return;
|
|
174
|
+
const dirPath = path.join(this.config.rootDir, DRIFT_DIR, ENV_DIR);
|
|
175
|
+
await fs.mkdir(dirPath, { recursive: true });
|
|
176
|
+
const filePath = path.join(dirPath, ACCESS_MAP_FILE);
|
|
177
|
+
await fs.writeFile(filePath, JSON.stringify(this.accessMap, null, 2));
|
|
178
|
+
}
|
|
179
|
+
matchesPattern(file, pattern) {
|
|
180
|
+
// Simple pattern matching
|
|
181
|
+
if (pattern === '*' || pattern === '**/*')
|
|
182
|
+
return true;
|
|
183
|
+
if (pattern.startsWith('**/')) {
|
|
184
|
+
return file.includes(pattern.slice(3));
|
|
185
|
+
}
|
|
186
|
+
if (pattern.endsWith('*')) {
|
|
187
|
+
return file.startsWith(pattern.slice(0, -1));
|
|
188
|
+
}
|
|
189
|
+
return file === pattern || file.includes(pattern);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// ============================================================================
|
|
193
|
+
// Factory Functions
|
|
194
|
+
// ============================================================================
|
|
195
|
+
/**
|
|
196
|
+
* Create a new EnvStore instance
|
|
197
|
+
*/
|
|
198
|
+
export function createEnvStore(config) {
|
|
199
|
+
return new EnvStore(config);
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=env-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-store.js","sourceRoot":"","sources":["../../src/environment/env-store.ts"],"names":[],"mappings":"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"}
|