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.
Files changed (141) hide show
  1. package/LICENSE +21 -0
  2. package/dist/constants/analysis/categorizer.d.ts +27 -0
  3. package/dist/constants/analysis/categorizer.d.ts.map +1 -0
  4. package/dist/constants/analysis/categorizer.js +364 -0
  5. package/dist/constants/analysis/categorizer.js.map +1 -0
  6. package/dist/constants/analysis/consistency-analyzer.d.ts +77 -0
  7. package/dist/constants/analysis/consistency-analyzer.d.ts.map +1 -0
  8. package/dist/constants/analysis/consistency-analyzer.js +176 -0
  9. package/dist/constants/analysis/consistency-analyzer.js.map +1 -0
  10. package/dist/constants/analysis/dead-constant-detector.d.ts +79 -0
  11. package/dist/constants/analysis/dead-constant-detector.d.ts.map +1 -0
  12. package/dist/constants/analysis/dead-constant-detector.js +242 -0
  13. package/dist/constants/analysis/dead-constant-detector.js.map +1 -0
  14. package/dist/constants/analysis/magic-detector.d.ts +116 -0
  15. package/dist/constants/analysis/magic-detector.d.ts.map +1 -0
  16. package/dist/constants/analysis/magic-detector.js +425 -0
  17. package/dist/constants/analysis/magic-detector.js.map +1 -0
  18. package/dist/constants/analysis/reference-finder.d.ts +87 -0
  19. package/dist/constants/analysis/reference-finder.d.ts.map +1 -0
  20. package/dist/constants/analysis/reference-finder.js +269 -0
  21. package/dist/constants/analysis/reference-finder.js.map +1 -0
  22. package/dist/constants/analysis/security-scanner.d.ts +115 -0
  23. package/dist/constants/analysis/security-scanner.d.ts.map +1 -0
  24. package/dist/constants/analysis/security-scanner.js +429 -0
  25. package/dist/constants/analysis/security-scanner.js.map +1 -0
  26. package/dist/constants/extractors/base-extractor.d.ts +97 -0
  27. package/dist/constants/extractors/base-extractor.d.ts.map +1 -0
  28. package/dist/constants/extractors/base-extractor.js +285 -0
  29. package/dist/constants/extractors/base-extractor.js.map +1 -0
  30. package/dist/constants/extractors/regex/base-regex.d.ts +67 -0
  31. package/dist/constants/extractors/regex/base-regex.d.ts.map +1 -0
  32. package/dist/constants/extractors/regex/base-regex.js +209 -0
  33. package/dist/constants/extractors/regex/base-regex.js.map +1 -0
  34. package/dist/constants/extractors/regex/csharp-regex.d.ts +39 -0
  35. package/dist/constants/extractors/regex/csharp-regex.d.ts.map +1 -0
  36. package/dist/constants/extractors/regex/csharp-regex.js +316 -0
  37. package/dist/constants/extractors/regex/csharp-regex.js.map +1 -0
  38. package/dist/constants/extractors/regex/go-regex.d.ts +40 -0
  39. package/dist/constants/extractors/regex/go-regex.d.ts.map +1 -0
  40. package/dist/constants/extractors/regex/go-regex.js +297 -0
  41. package/dist/constants/extractors/regex/go-regex.js.map +1 -0
  42. package/dist/constants/extractors/regex/java-regex.d.ts +43 -0
  43. package/dist/constants/extractors/regex/java-regex.d.ts.map +1 -0
  44. package/dist/constants/extractors/regex/java-regex.js +276 -0
  45. package/dist/constants/extractors/regex/java-regex.js.map +1 -0
  46. package/dist/constants/extractors/regex/php-regex.d.ts +39 -0
  47. package/dist/constants/extractors/regex/php-regex.d.ts.map +1 -0
  48. package/dist/constants/extractors/regex/php-regex.js +270 -0
  49. package/dist/constants/extractors/regex/php-regex.js.map +1 -0
  50. package/dist/constants/extractors/regex/python-regex.d.ts +39 -0
  51. package/dist/constants/extractors/regex/python-regex.d.ts.map +1 -0
  52. package/dist/constants/extractors/regex/python-regex.js +287 -0
  53. package/dist/constants/extractors/regex/python-regex.js.map +1 -0
  54. package/dist/constants/extractors/regex/typescript-regex.d.ts +35 -0
  55. package/dist/constants/extractors/regex/typescript-regex.d.ts.map +1 -0
  56. package/dist/constants/extractors/regex/typescript-regex.js +313 -0
  57. package/dist/constants/extractors/regex/typescript-regex.js.map +1 -0
  58. package/dist/constants/index.d.ts +26 -0
  59. package/dist/constants/index.d.ts.map +1 -0
  60. package/dist/constants/index.js +36 -0
  61. package/dist/constants/index.js.map +1 -0
  62. package/dist/constants/integration/callgraph-adapter.d.ts +167 -0
  63. package/dist/constants/integration/callgraph-adapter.d.ts.map +1 -0
  64. package/dist/constants/integration/callgraph-adapter.js +287 -0
  65. package/dist/constants/integration/callgraph-adapter.js.map +1 -0
  66. package/dist/constants/integration/index.d.ts +10 -0
  67. package/dist/constants/integration/index.d.ts.map +1 -0
  68. package/dist/constants/integration/index.js +13 -0
  69. package/dist/constants/integration/index.js.map +1 -0
  70. package/dist/constants/integration/pattern-adapter.d.ts +171 -0
  71. package/dist/constants/integration/pattern-adapter.d.ts.map +1 -0
  72. package/dist/constants/integration/pattern-adapter.js +331 -0
  73. package/dist/constants/integration/pattern-adapter.js.map +1 -0
  74. package/dist/constants/integration/scanner-adapter.d.ts +153 -0
  75. package/dist/constants/integration/scanner-adapter.d.ts.map +1 -0
  76. package/dist/constants/integration/scanner-adapter.js +337 -0
  77. package/dist/constants/integration/scanner-adapter.js.map +1 -0
  78. package/dist/constants/store/constant-store.d.ts +117 -0
  79. package/dist/constants/store/constant-store.d.ts.map +1 -0
  80. package/dist/constants/store/constant-store.js +367 -0
  81. package/dist/constants/store/constant-store.js.map +1 -0
  82. package/dist/constants/types.d.ts +423 -0
  83. package/dist/constants/types.d.ts.map +1 -0
  84. package/dist/constants/types.js +43 -0
  85. package/dist/constants/types.js.map +1 -0
  86. package/dist/constraints/store/constraint-store.d.ts.map +1 -1
  87. package/dist/constraints/store/constraint-store.js +37 -2
  88. package/dist/constraints/store/constraint-store.js.map +1 -1
  89. package/dist/environment/env-scanner.d.ts +53 -0
  90. package/dist/environment/env-scanner.d.ts.map +1 -0
  91. package/dist/environment/env-scanner.js +290 -0
  92. package/dist/environment/env-scanner.js.map +1 -0
  93. package/dist/environment/env-store.d.ts +70 -0
  94. package/dist/environment/env-store.d.ts.map +1 -0
  95. package/dist/environment/env-store.js +201 -0
  96. package/dist/environment/env-store.js.map +1 -0
  97. package/dist/environment/extractors/base-env-extractor.d.ts +56 -0
  98. package/dist/environment/extractors/base-env-extractor.d.ts.map +1 -0
  99. package/dist/environment/extractors/base-env-extractor.js +74 -0
  100. package/dist/environment/extractors/base-env-extractor.js.map +1 -0
  101. package/dist/environment/extractors/csharp-env-extractor.d.ts +49 -0
  102. package/dist/environment/extractors/csharp-env-extractor.d.ts.map +1 -0
  103. package/dist/environment/extractors/csharp-env-extractor.js +240 -0
  104. package/dist/environment/extractors/csharp-env-extractor.js.map +1 -0
  105. package/dist/environment/extractors/go-env-extractor.d.ts +53 -0
  106. package/dist/environment/extractors/go-env-extractor.d.ts.map +1 -0
  107. package/dist/environment/extractors/go-env-extractor.js +267 -0
  108. package/dist/environment/extractors/go-env-extractor.js.map +1 -0
  109. package/dist/environment/extractors/index.d.ts +13 -0
  110. package/dist/environment/extractors/index.d.ts.map +1 -0
  111. package/dist/environment/extractors/index.js +13 -0
  112. package/dist/environment/extractors/index.js.map +1 -0
  113. package/dist/environment/extractors/java-env-extractor.d.ts +58 -0
  114. package/dist/environment/extractors/java-env-extractor.d.ts.map +1 -0
  115. package/dist/environment/extractors/java-env-extractor.js +219 -0
  116. package/dist/environment/extractors/java-env-extractor.js.map +1 -0
  117. package/dist/environment/extractors/php-env-extractor.d.ts +58 -0
  118. package/dist/environment/extractors/php-env-extractor.d.ts.map +1 -0
  119. package/dist/environment/extractors/php-env-extractor.js +231 -0
  120. package/dist/environment/extractors/php-env-extractor.js.map +1 -0
  121. package/dist/environment/extractors/python-env-extractor.d.ts +50 -0
  122. package/dist/environment/extractors/python-env-extractor.d.ts.map +1 -0
  123. package/dist/environment/extractors/python-env-extractor.js +219 -0
  124. package/dist/environment/extractors/python-env-extractor.js.map +1 -0
  125. package/dist/environment/extractors/typescript-env-extractor.d.ts +54 -0
  126. package/dist/environment/extractors/typescript-env-extractor.d.ts.map +1 -0
  127. package/dist/environment/extractors/typescript-env-extractor.js +228 -0
  128. package/dist/environment/extractors/typescript-env-extractor.js.map +1 -0
  129. package/dist/environment/index.d.ts +11 -0
  130. package/dist/environment/index.d.ts.map +1 -0
  131. package/dist/environment/index.js +15 -0
  132. package/dist/environment/index.js.map +1 -0
  133. package/dist/environment/types.d.ts +145 -0
  134. package/dist/environment/types.d.ts.map +1 -0
  135. package/dist/environment/types.js +84 -0
  136. package/dist/environment/types.js.map +1 -0
  137. package/dist/index.d.ts +4 -0
  138. package/dist/index.d.ts.map +1 -1
  139. package/dist/index.js +40 -0
  140. package/dist/index.js.map +1 -1
  141. package/package.json +13 -13
@@ -0,0 +1 @@
1
+ {"version":3,"file":"php-env-extractor.d.ts","sourceRoot":"","sources":["../../../src/environment/extractors/php-env-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEpE;;GAEG;AACH,qBAAa,eAAgB,SAAQ,gBAAgB;IACnD,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAS;IACvC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAY;IAEzC;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,mBAAmB;IA0B9D;;OAEG;IACH,OAAO,CAAC,aAAa;IA2BrB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA2B7B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAuChC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA8BzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA8B5B;;OAEG;IACH,OAAO,CAAC,aAAa;IA2BrB;;OAEG;IACH,OAAO,CAAC,UAAU;CAKnB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,eAAe,CAEvD"}
@@ -0,0 +1,231 @@
1
+ /**
2
+ * PHP Environment Variable Extractor
3
+ *
4
+ * Extracts environment variable access patterns from PHP.
5
+ *
6
+ * Supports:
7
+ * - getenv('VAR_NAME')
8
+ * - $_ENV['VAR_NAME']
9
+ * - $_SERVER['VAR_NAME']
10
+ * - env('VAR_NAME') Laravel helper
11
+ * - config('key') Laravel config
12
+ */
13
+ import { BaseEnvExtractor } from './base-env-extractor.js';
14
+ /**
15
+ * PHP environment variable extractor
16
+ */
17
+ export class PhpEnvExtractor extends BaseEnvExtractor {
18
+ language = 'php';
19
+ extensions = ['.php'];
20
+ /**
21
+ * Extract environment variable access from PHP source
22
+ */
23
+ extract(source, filePath) {
24
+ const result = this.createEmptyResult(filePath);
25
+ try {
26
+ // Extract getenv() patterns
27
+ this.extractGetenv(source, filePath, result);
28
+ // Extract $_ENV patterns
29
+ this.extractEnvSuperglobal(source, filePath, result);
30
+ // Extract $_SERVER patterns
31
+ this.extractServerSuperglobal(source, filePath, result);
32
+ // Extract Laravel env() patterns
33
+ this.extractLaravelEnv(source, filePath, result);
34
+ // Extract Laravel config() patterns
35
+ this.extractLaravelConfig(source, filePath, result);
36
+ }
37
+ catch (error) {
38
+ result.errors.push(error instanceof Error ? error.message : 'Unknown parse error');
39
+ }
40
+ return result;
41
+ }
42
+ /**
43
+ * Extract getenv('VAR') patterns
44
+ */
45
+ extractGetenv(source, filePath, result) {
46
+ // Pattern: getenv('VAR_NAME') or getenv("VAR_NAME")
47
+ const pattern = /getenv\(\s*['"]([A-Z_][A-Z0-9_]*)['"]\s*\)/g;
48
+ let match;
49
+ while ((match = pattern.exec(source)) !== null) {
50
+ const varName = match[1];
51
+ if (!varName)
52
+ continue;
53
+ const pos = this.getPosition(source, match.index);
54
+ const context = this.getContext(source, match.index);
55
+ const { hasDefault, defaultValue } = this.detectDefault(source, match.index, match[0].length);
56
+ result.accessPoints.push(this.createAccessPoint({
57
+ varName,
58
+ method: 'getenv',
59
+ file: filePath,
60
+ line: pos.line,
61
+ column: pos.column,
62
+ context,
63
+ hasDefault,
64
+ defaultValue,
65
+ isRequired: !hasDefault,
66
+ }));
67
+ }
68
+ }
69
+ /**
70
+ * Extract $_ENV['VAR'] patterns
71
+ */
72
+ extractEnvSuperglobal(source, filePath, result) {
73
+ // Pattern: $_ENV['VAR_NAME'] or $_ENV["VAR_NAME"]
74
+ const pattern = /\$_ENV\[['"]([A-Z_][A-Z0-9_]*)['"]\]/g;
75
+ let match;
76
+ while ((match = pattern.exec(source)) !== null) {
77
+ const varName = match[1];
78
+ if (!varName)
79
+ continue;
80
+ const pos = this.getPosition(source, match.index);
81
+ const context = this.getContext(source, match.index);
82
+ const { hasDefault, defaultValue } = this.detectDefault(source, match.index, match[0].length);
83
+ result.accessPoints.push(this.createAccessPoint({
84
+ varName,
85
+ method: '$_ENV',
86
+ file: filePath,
87
+ line: pos.line,
88
+ column: pos.column,
89
+ context,
90
+ hasDefault,
91
+ defaultValue,
92
+ isRequired: !hasDefault,
93
+ }));
94
+ }
95
+ }
96
+ /**
97
+ * Extract $_SERVER['VAR'] patterns (for env vars passed via server)
98
+ */
99
+ extractServerSuperglobal(source, filePath, result) {
100
+ // Pattern: $_SERVER['VAR_NAME'] - only for env-like vars
101
+ const pattern = /\$_SERVER\[['"]([A-Z_][A-Z0-9_]*)['"]\]/g;
102
+ let match;
103
+ // Common server vars that are NOT env vars
104
+ const serverVars = new Set([
105
+ 'REQUEST_METHOD', 'REQUEST_URI', 'QUERY_STRING', 'HTTP_HOST',
106
+ 'HTTP_USER_AGENT', 'HTTP_ACCEPT', 'HTTP_REFERER', 'REMOTE_ADDR',
107
+ 'SERVER_NAME', 'SERVER_PORT', 'SCRIPT_NAME', 'SCRIPT_FILENAME',
108
+ 'DOCUMENT_ROOT', 'PATH_INFO', 'PHP_SELF', 'CONTENT_TYPE', 'CONTENT_LENGTH',
109
+ ]);
110
+ while ((match = pattern.exec(source)) !== null) {
111
+ const varName = match[1];
112
+ if (!varName)
113
+ continue;
114
+ // Skip common server variables
115
+ if (serverVars.has(varName))
116
+ continue;
117
+ const pos = this.getPosition(source, match.index);
118
+ const context = this.getContext(source, match.index);
119
+ const { hasDefault, defaultValue } = this.detectDefault(source, match.index, match[0].length);
120
+ result.accessPoints.push(this.createAccessPoint({
121
+ varName,
122
+ method: '$_SERVER',
123
+ file: filePath,
124
+ line: pos.line,
125
+ column: pos.column,
126
+ context,
127
+ hasDefault,
128
+ defaultValue,
129
+ isRequired: !hasDefault,
130
+ confidence: 0.7, // Lower confidence as $_SERVER can be server vars
131
+ }));
132
+ }
133
+ }
134
+ /**
135
+ * Extract Laravel env('VAR') patterns
136
+ */
137
+ extractLaravelEnv(source, filePath, result) {
138
+ // Pattern: env('VAR_NAME') or env('VAR_NAME', 'default')
139
+ const pattern = /\benv\(\s*['"]([A-Z_][A-Z0-9_]*)['"](?:\s*,\s*(['"][^'"]*['"]|[^)]+))?\s*\)/g;
140
+ let match;
141
+ while ((match = pattern.exec(source)) !== null) {
142
+ const varName = match[1];
143
+ if (!varName)
144
+ continue;
145
+ const pos = this.getPosition(source, match.index);
146
+ const context = this.getContext(source, match.index);
147
+ const defaultArg = match[2];
148
+ const hasDefault = defaultArg !== undefined && defaultArg.trim() !== '';
149
+ const defaultValue = hasDefault ? this.extractStringValue(defaultArg.trim()) ?? defaultArg.trim() : undefined;
150
+ result.accessPoints.push(this.createAccessPoint({
151
+ varName,
152
+ method: 'env()',
153
+ file: filePath,
154
+ line: pos.line,
155
+ column: pos.column,
156
+ context,
157
+ hasDefault,
158
+ defaultValue,
159
+ isRequired: !hasDefault,
160
+ confidence: 0.95,
161
+ }));
162
+ }
163
+ }
164
+ /**
165
+ * Extract Laravel config('key') patterns
166
+ */
167
+ extractLaravelConfig(source, filePath, result) {
168
+ // Pattern: config('app.key') or config('app.key', 'default')
169
+ const pattern = /\bconfig\(\s*['"]([a-zA-Z_][a-zA-Z0-9_.]*)['"](?:\s*,\s*(['"][^'"]*['"]|[^)]+))?\s*\)/g;
170
+ let match;
171
+ while ((match = pattern.exec(source)) !== null) {
172
+ const varName = match[1];
173
+ if (!varName)
174
+ continue;
175
+ const pos = this.getPosition(source, match.index);
176
+ const context = this.getContext(source, match.index);
177
+ const defaultArg = match[2];
178
+ const hasDefault = defaultArg !== undefined && defaultArg.trim() !== '';
179
+ const defaultValue = hasDefault ? this.extractStringValue(defaultArg.trim()) ?? defaultArg.trim() : undefined;
180
+ result.accessPoints.push(this.createAccessPoint({
181
+ varName,
182
+ method: 'config()',
183
+ file: filePath,
184
+ line: pos.line,
185
+ column: pos.column,
186
+ context,
187
+ hasDefault,
188
+ defaultValue,
189
+ isRequired: !hasDefault,
190
+ confidence: 0.9,
191
+ }));
192
+ }
193
+ }
194
+ /**
195
+ * Detect if a default value is provided via ternary or null coalescing
196
+ */
197
+ detectDefault(source, matchIndex, matchLength) {
198
+ const afterMatch = source.slice(matchIndex + matchLength, matchIndex + matchLength + 100);
199
+ // Check for null coalescing: ?? 'default'
200
+ const nullCoalesceMatch = afterMatch.match(/^\s*\?\?\s*['"]([^'"]*)['"]/);
201
+ if (nullCoalesceMatch) {
202
+ return { hasDefault: true, defaultValue: nullCoalesceMatch[1] };
203
+ }
204
+ // Check for ternary: ?: 'default'
205
+ const elvisMatch = afterMatch.match(/^\s*\?:\s*['"]([^'"]*)['"]/);
206
+ if (elvisMatch) {
207
+ return { hasDefault: true, defaultValue: elvisMatch[1] };
208
+ }
209
+ // Check for || 'default'
210
+ const orMatch = afterMatch.match(/^\s*\|\|\s*['"]([^'"]*)['"]/);
211
+ if (orMatch) {
212
+ return { hasDefault: true, defaultValue: orMatch[1] };
213
+ }
214
+ return { hasDefault: false };
215
+ }
216
+ /**
217
+ * Get context around a match
218
+ */
219
+ getContext(source, index) {
220
+ const start = Math.max(0, index - 20);
221
+ const end = Math.min(source.length, index + 80);
222
+ return source.slice(start, end).replace(/\n/g, ' ').trim();
223
+ }
224
+ }
225
+ /**
226
+ * Create a PHP environment extractor
227
+ */
228
+ export function createPhpEnvExtractor() {
229
+ return new PhpEnvExtractor();
230
+ }
231
+ //# sourceMappingURL=php-env-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"php-env-extractor.js","sourceRoot":"","sources":["../../../src/environment/extractors/php-env-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Python Environment Variable Extractor
3
+ *
4
+ * Extracts environment variable access patterns from Python.
5
+ *
6
+ * Supports:
7
+ * - os.environ['VAR_NAME']
8
+ * - os.environ.get('VAR_NAME')
9
+ * - os.getenv('VAR_NAME')
10
+ * - dotenv patterns
11
+ * - pydantic Settings patterns
12
+ */
13
+ import { BaseEnvExtractor } from './base-env-extractor.js';
14
+ import type { EnvLanguage, EnvExtractionResult } from '../types.js';
15
+ /**
16
+ * Python environment variable extractor
17
+ */
18
+ export declare class PythonEnvExtractor extends BaseEnvExtractor {
19
+ readonly language: EnvLanguage;
20
+ readonly extensions: string[];
21
+ /**
22
+ * Extract environment variable access from Python source
23
+ */
24
+ extract(source: string, filePath: string): EnvExtractionResult;
25
+ /**
26
+ * Extract os.environ['VAR'] and os.environ.get('VAR') patterns
27
+ */
28
+ private extractOsEnviron;
29
+ /**
30
+ * Extract os.getenv('VAR') patterns
31
+ */
32
+ private extractOsGetenv;
33
+ /**
34
+ * Extract python-dotenv patterns
35
+ */
36
+ private extractDotenvPatterns;
37
+ /**
38
+ * Extract pydantic Settings patterns
39
+ */
40
+ private extractPydanticSettings;
41
+ /**
42
+ * Get context around a match
43
+ */
44
+ private getContext;
45
+ }
46
+ /**
47
+ * Create a Python environment extractor
48
+ */
49
+ export declare function createPythonEnvExtractor(): PythonEnvExtractor;
50
+ //# sourceMappingURL=python-env-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python-env-extractor.d.ts","sourceRoot":"","sources":["../../../src/environment/extractors/python-env-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEpE;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,gBAAgB;IACtD,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAY;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAmB;IAEhD;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,mBAAmB;IAuB9D;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAmDxB;;OAEG;IACH,OAAO,CAAC,eAAe;IA6BvB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA2C7B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAkD/B;;OAEG;IACH,OAAO,CAAC,UAAU;CAKnB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,kBAAkB,CAE7D"}
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Python Environment Variable Extractor
3
+ *
4
+ * Extracts environment variable access patterns from Python.
5
+ *
6
+ * Supports:
7
+ * - os.environ['VAR_NAME']
8
+ * - os.environ.get('VAR_NAME')
9
+ * - os.getenv('VAR_NAME')
10
+ * - dotenv patterns
11
+ * - pydantic Settings patterns
12
+ */
13
+ import { BaseEnvExtractor } from './base-env-extractor.js';
14
+ /**
15
+ * Python environment variable extractor
16
+ */
17
+ export class PythonEnvExtractor extends BaseEnvExtractor {
18
+ language = 'python';
19
+ extensions = ['.py', '.pyw'];
20
+ /**
21
+ * Extract environment variable access from Python source
22
+ */
23
+ extract(source, filePath) {
24
+ const result = this.createEmptyResult(filePath);
25
+ try {
26
+ // Extract os.environ patterns
27
+ this.extractOsEnviron(source, filePath, result);
28
+ // Extract os.getenv patterns
29
+ this.extractOsGetenv(source, filePath, result);
30
+ // Extract dotenv patterns
31
+ this.extractDotenvPatterns(source, filePath, result);
32
+ // Extract pydantic Settings patterns
33
+ this.extractPydanticSettings(source, filePath, result);
34
+ }
35
+ catch (error) {
36
+ result.errors.push(error instanceof Error ? error.message : 'Unknown parse error');
37
+ }
38
+ return result;
39
+ }
40
+ /**
41
+ * Extract os.environ['VAR'] and os.environ.get('VAR') patterns
42
+ */
43
+ extractOsEnviron(source, filePath, result) {
44
+ // Pattern: os.environ['VAR_NAME'] or os.environ["VAR_NAME"]
45
+ const bracketPattern = /os\.environ\[['"]([A-Z_][A-Z0-9_]*)['"]\]/g;
46
+ let match;
47
+ while ((match = bracketPattern.exec(source)) !== null) {
48
+ const varName = match[1];
49
+ if (!varName)
50
+ continue;
51
+ const pos = this.getPosition(source, match.index);
52
+ const context = this.getContext(source, match.index);
53
+ result.accessPoints.push(this.createAccessPoint({
54
+ varName,
55
+ method: 'os.environ',
56
+ file: filePath,
57
+ line: pos.line,
58
+ column: pos.column,
59
+ context,
60
+ hasDefault: false,
61
+ isRequired: true, // Direct bracket access raises KeyError if missing
62
+ }));
63
+ }
64
+ // Pattern: os.environ.get('VAR_NAME') or os.environ.get('VAR_NAME', 'default')
65
+ const getPattern = /os\.environ\.get\(\s*['"]([A-Z_][A-Z0-9_]*)['"](?:\s*,\s*(['"][^'"]*['"]|[^)]+))?\s*\)/g;
66
+ while ((match = getPattern.exec(source)) !== null) {
67
+ const varName = match[1];
68
+ if (!varName)
69
+ continue;
70
+ const pos = this.getPosition(source, match.index);
71
+ const context = this.getContext(source, match.index);
72
+ const defaultArg = match[2];
73
+ const hasDefault = defaultArg !== undefined && defaultArg.trim() !== '';
74
+ const defaultValue = hasDefault ? this.extractStringValue(defaultArg.trim()) ?? defaultArg.trim() : undefined;
75
+ result.accessPoints.push(this.createAccessPoint({
76
+ varName,
77
+ method: 'os.environ',
78
+ file: filePath,
79
+ line: pos.line,
80
+ column: pos.column,
81
+ context,
82
+ hasDefault,
83
+ defaultValue,
84
+ isRequired: !hasDefault,
85
+ }));
86
+ }
87
+ }
88
+ /**
89
+ * Extract os.getenv('VAR') patterns
90
+ */
91
+ extractOsGetenv(source, filePath, result) {
92
+ // Pattern: os.getenv('VAR_NAME') or os.getenv('VAR_NAME', 'default')
93
+ const pattern = /os\.getenv\(\s*['"]([A-Z_][A-Z0-9_]*)['"](?:\s*,\s*(['"][^'"]*['"]|[^)]+))?\s*\)/g;
94
+ let match;
95
+ while ((match = pattern.exec(source)) !== null) {
96
+ const varName = match[1];
97
+ if (!varName)
98
+ continue;
99
+ const pos = this.getPosition(source, match.index);
100
+ const context = this.getContext(source, match.index);
101
+ const defaultArg = match[2];
102
+ const hasDefault = defaultArg !== undefined && defaultArg.trim() !== '';
103
+ const defaultValue = hasDefault ? this.extractStringValue(defaultArg.trim()) ?? defaultArg.trim() : undefined;
104
+ result.accessPoints.push(this.createAccessPoint({
105
+ varName,
106
+ method: 'os.getenv',
107
+ file: filePath,
108
+ line: pos.line,
109
+ column: pos.column,
110
+ context,
111
+ hasDefault,
112
+ defaultValue,
113
+ isRequired: !hasDefault,
114
+ }));
115
+ }
116
+ }
117
+ /**
118
+ * Extract python-dotenv patterns
119
+ */
120
+ extractDotenvPatterns(source, filePath, result) {
121
+ // Pattern: load_dotenv() or dotenv.load_dotenv()
122
+ const loadPattern = /(?:dotenv\.)?load_dotenv\(/g;
123
+ let match;
124
+ while ((match = loadPattern.exec(source)) !== null) {
125
+ const pos = this.getPosition(source, match.index);
126
+ const context = this.getContext(source, match.index);
127
+ result.accessPoints.push(this.createAccessPoint({
128
+ varName: '__DOTENV_LOAD__',
129
+ method: 'dotenv',
130
+ file: filePath,
131
+ line: pos.line,
132
+ column: pos.column,
133
+ context,
134
+ hasDefault: true,
135
+ isRequired: false,
136
+ confidence: 0.7,
137
+ }));
138
+ }
139
+ // Pattern: dotenv_values() or dotenv.dotenv_values()
140
+ const valuesPattern = /(?:dotenv\.)?dotenv_values\(/g;
141
+ while ((match = valuesPattern.exec(source)) !== null) {
142
+ const pos = this.getPosition(source, match.index);
143
+ const context = this.getContext(source, match.index);
144
+ result.accessPoints.push(this.createAccessPoint({
145
+ varName: '__DOTENV_VALUES__',
146
+ method: 'dotenv',
147
+ file: filePath,
148
+ line: pos.line,
149
+ column: pos.column,
150
+ context,
151
+ hasDefault: true,
152
+ isRequired: false,
153
+ confidence: 0.7,
154
+ }));
155
+ }
156
+ }
157
+ /**
158
+ * Extract pydantic Settings patterns
159
+ */
160
+ extractPydanticSettings(source, filePath, result) {
161
+ // Pattern: class Settings(BaseSettings): with Field(env='VAR_NAME')
162
+ // This is a simplified pattern - full parsing would need AST
163
+ const fieldPattern = /Field\([^)]*env\s*=\s*['"]([A-Z_][A-Z0-9_]*)['"]/g;
164
+ let match;
165
+ while ((match = fieldPattern.exec(source)) !== null) {
166
+ const varName = match[1];
167
+ if (!varName)
168
+ continue;
169
+ const pos = this.getPosition(source, match.index);
170
+ const context = this.getContext(source, match.index);
171
+ result.accessPoints.push(this.createAccessPoint({
172
+ varName,
173
+ method: 'pydantic-settings',
174
+ file: filePath,
175
+ line: pos.line,
176
+ column: pos.column,
177
+ context,
178
+ hasDefault: false, // Would need more context to determine
179
+ isRequired: true,
180
+ confidence: 0.85,
181
+ }));
182
+ }
183
+ // Pattern: model_config with env_prefix
184
+ const prefixPattern = /env_prefix\s*=\s*['"]([A-Z_][A-Z0-9_]*)['"]/g;
185
+ while ((match = prefixPattern.exec(source)) !== null) {
186
+ const prefix = match[1];
187
+ if (!prefix)
188
+ continue;
189
+ const pos = this.getPosition(source, match.index);
190
+ const context = this.getContext(source, match.index);
191
+ result.accessPoints.push(this.createAccessPoint({
192
+ varName: `${prefix}*`,
193
+ method: 'pydantic-settings',
194
+ file: filePath,
195
+ line: pos.line,
196
+ column: pos.column,
197
+ context,
198
+ hasDefault: true,
199
+ isRequired: false,
200
+ confidence: 0.7,
201
+ }));
202
+ }
203
+ }
204
+ /**
205
+ * Get context around a match
206
+ */
207
+ getContext(source, index) {
208
+ const start = Math.max(0, index - 20);
209
+ const end = Math.min(source.length, index + 80);
210
+ return source.slice(start, end).replace(/\n/g, ' ').trim();
211
+ }
212
+ }
213
+ /**
214
+ * Create a Python environment extractor
215
+ */
216
+ export function createPythonEnvExtractor() {
217
+ return new PythonEnvExtractor();
218
+ }
219
+ //# sourceMappingURL=python-env-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python-env-extractor.js","sourceRoot":"","sources":["../../../src/environment/extractors/python-env-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * TypeScript/JavaScript Environment Variable Extractor
3
+ *
4
+ * Extracts environment variable access patterns from TypeScript/JavaScript.
5
+ *
6
+ * Supports:
7
+ * - process.env.VAR_NAME
8
+ * - process.env['VAR_NAME']
9
+ * - import.meta.env.VAR_NAME
10
+ * - dotenv config patterns
11
+ * - Vite/Next.js env patterns
12
+ */
13
+ import { BaseEnvExtractor } from './base-env-extractor.js';
14
+ import type { EnvLanguage, EnvExtractionResult } from '../types.js';
15
+ /**
16
+ * TypeScript/JavaScript environment variable extractor
17
+ */
18
+ export declare class TypeScriptEnvExtractor extends BaseEnvExtractor {
19
+ readonly language: EnvLanguage;
20
+ readonly extensions: string[];
21
+ /**
22
+ * Extract environment variable access from TypeScript/JavaScript source
23
+ */
24
+ extract(source: string, filePath: string): EnvExtractionResult;
25
+ /**
26
+ * Extract process.env.VAR_NAME and process.env['VAR_NAME'] patterns
27
+ */
28
+ private extractProcessEnv;
29
+ /**
30
+ * Extract import.meta.env patterns (Vite, Astro)
31
+ */
32
+ private extractImportMetaEnv;
33
+ /**
34
+ * Extract dotenv config patterns
35
+ */
36
+ private extractDotenvPatterns;
37
+ /**
38
+ * Extract config() patterns from config libraries
39
+ */
40
+ private extractConfigPatterns;
41
+ /**
42
+ * Detect if a default value is provided
43
+ */
44
+ private detectDefault;
45
+ /**
46
+ * Get context around a match
47
+ */
48
+ private getContext;
49
+ }
50
+ /**
51
+ * Create a TypeScript environment extractor
52
+ */
53
+ export declare function createTypeScriptEnvExtractor(): TypeScriptEnvExtractor;
54
+ //# sourceMappingURL=typescript-env-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript-env-extractor.d.ts","sourceRoot":"","sources":["../../../src/environment/extractors/typescript-env-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEpE;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,gBAAgB;IAC1D,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAgB;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAkE;IAE/F;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,mBAAmB;IA6B9D;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAyDzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA2B5B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAyB7B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAgC7B;;OAEG;IACH,OAAO,CAAC,aAAa;IAwCrB;;OAEG;IACH,OAAO,CAAC,UAAU;CAKnB;AAED;;GAEG;AACH,wBAAgB,4BAA4B,IAAI,sBAAsB,CAErE"}