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,267 @@
1
+ /**
2
+ * Go Environment Variable Extractor
3
+ *
4
+ * Extracts environment variable access patterns from Go.
5
+ *
6
+ * Supports:
7
+ * - os.Getenv("VAR_NAME")
8
+ * - os.LookupEnv("VAR_NAME")
9
+ * - viper patterns
10
+ * - envconfig patterns
11
+ */
12
+ import { BaseEnvExtractor } from './base-env-extractor.js';
13
+ /**
14
+ * Go environment variable extractor
15
+ */
16
+ export class GoEnvExtractor extends BaseEnvExtractor {
17
+ language = 'go';
18
+ extensions = ['.go'];
19
+ /**
20
+ * Extract environment variable access from Go source
21
+ */
22
+ extract(source, filePath) {
23
+ const result = this.createEmptyResult(filePath);
24
+ try {
25
+ // Extract os.Getenv patterns
26
+ this.extractOsGetenv(source, filePath, result);
27
+ // Extract os.LookupEnv patterns
28
+ this.extractOsLookupEnv(source, filePath, result);
29
+ // Extract viper patterns
30
+ this.extractViperPatterns(source, filePath, result);
31
+ // Extract envconfig patterns
32
+ this.extractEnvconfigPatterns(source, filePath, result);
33
+ }
34
+ catch (error) {
35
+ result.errors.push(error instanceof Error ? error.message : 'Unknown parse error');
36
+ }
37
+ return result;
38
+ }
39
+ /**
40
+ * Extract os.Getenv("VAR") patterns
41
+ */
42
+ extractOsGetenv(source, filePath, result) {
43
+ // Pattern: os.Getenv("VAR_NAME")
44
+ const pattern = /os\.Getenv\(\s*"([A-Z_][A-Z0-9_]*)"\s*\)/g;
45
+ let match;
46
+ while ((match = pattern.exec(source)) !== null) {
47
+ const varName = match[1];
48
+ if (!varName)
49
+ continue;
50
+ const pos = this.getPosition(source, match.index);
51
+ const context = this.getContext(source, match.index);
52
+ const { hasDefault, defaultValue } = this.detectDefault(source, match.index, match[0].length);
53
+ result.accessPoints.push(this.createAccessPoint({
54
+ varName,
55
+ method: 'os.Getenv',
56
+ file: filePath,
57
+ line: pos.line,
58
+ column: pos.column,
59
+ context,
60
+ hasDefault,
61
+ defaultValue,
62
+ isRequired: !hasDefault,
63
+ }));
64
+ }
65
+ }
66
+ /**
67
+ * Extract os.LookupEnv("VAR") patterns
68
+ */
69
+ extractOsLookupEnv(source, filePath, result) {
70
+ // Pattern: os.LookupEnv("VAR_NAME")
71
+ const pattern = /os\.LookupEnv\(\s*"([A-Z_][A-Z0-9_]*)"\s*\)/g;
72
+ let match;
73
+ while ((match = pattern.exec(source)) !== null) {
74
+ const varName = match[1];
75
+ if (!varName)
76
+ continue;
77
+ const pos = this.getPosition(source, match.index);
78
+ const context = this.getContext(source, match.index);
79
+ // LookupEnv returns (value, ok) so it's typically used with a check
80
+ // This means it's usually not required (has implicit handling)
81
+ result.accessPoints.push(this.createAccessPoint({
82
+ varName,
83
+ method: 'os.LookupEnv',
84
+ file: filePath,
85
+ line: pos.line,
86
+ column: pos.column,
87
+ context,
88
+ hasDefault: true, // LookupEnv implies handling of missing case
89
+ isRequired: false,
90
+ confidence: 0.9,
91
+ }));
92
+ }
93
+ }
94
+ /**
95
+ * Extract viper patterns
96
+ */
97
+ extractViperPatterns(source, filePath, result) {
98
+ // Pattern: viper.GetString("VAR") or viper.Get("VAR")
99
+ const getPatterns = [
100
+ /viper\.GetString\(\s*"([a-zA-Z_][a-zA-Z0-9_.]*)"\s*\)/g,
101
+ /viper\.GetInt\(\s*"([a-zA-Z_][a-zA-Z0-9_.]*)"\s*\)/g,
102
+ /viper\.GetBool\(\s*"([a-zA-Z_][a-zA-Z0-9_.]*)"\s*\)/g,
103
+ /viper\.Get\(\s*"([a-zA-Z_][a-zA-Z0-9_.]*)"\s*\)/g,
104
+ /viper\.GetDuration\(\s*"([a-zA-Z_][a-zA-Z0-9_.]*)"\s*\)/g,
105
+ ];
106
+ for (const pattern of getPatterns) {
107
+ let match;
108
+ while ((match = pattern.exec(source)) !== null) {
109
+ const varName = match[1];
110
+ if (!varName)
111
+ continue;
112
+ const pos = this.getPosition(source, match.index);
113
+ const context = this.getContext(source, match.index);
114
+ result.accessPoints.push(this.createAccessPoint({
115
+ varName,
116
+ method: 'viper',
117
+ file: filePath,
118
+ line: pos.line,
119
+ column: pos.column,
120
+ context,
121
+ hasDefault: false,
122
+ isRequired: true,
123
+ confidence: 0.9,
124
+ }));
125
+ }
126
+ }
127
+ // Pattern: viper.SetDefault("key", value)
128
+ const setDefaultPattern = /viper\.SetDefault\(\s*"([a-zA-Z_][a-zA-Z0-9_.]*)"\s*,\s*([^)]+)\s*\)/g;
129
+ let match;
130
+ while ((match = setDefaultPattern.exec(source)) !== null) {
131
+ const varName = match[1];
132
+ if (!varName)
133
+ continue;
134
+ const pos = this.getPosition(source, match.index);
135
+ const context = this.getContext(source, match.index);
136
+ const defaultValue = match[2]?.trim();
137
+ result.accessPoints.push(this.createAccessPoint({
138
+ varName,
139
+ method: 'viper',
140
+ file: filePath,
141
+ line: pos.line,
142
+ column: pos.column,
143
+ context,
144
+ hasDefault: true,
145
+ defaultValue,
146
+ isRequired: false,
147
+ confidence: 0.85,
148
+ }));
149
+ }
150
+ // Pattern: viper.BindEnv("key", "ENV_VAR")
151
+ const bindEnvPattern = /viper\.BindEnv\(\s*"([a-zA-Z_][a-zA-Z0-9_.]*)"\s*(?:,\s*"([A-Z_][A-Z0-9_]*)")?\s*\)/g;
152
+ while ((match = bindEnvPattern.exec(source)) !== null) {
153
+ const configKey = match[1];
154
+ const envVar = match[2] ?? configKey?.toUpperCase().replace(/\./g, '_');
155
+ if (!envVar)
156
+ continue;
157
+ const pos = this.getPosition(source, match.index);
158
+ const context = this.getContext(source, match.index);
159
+ result.accessPoints.push(this.createAccessPoint({
160
+ varName: envVar,
161
+ method: 'viper',
162
+ file: filePath,
163
+ line: pos.line,
164
+ column: pos.column,
165
+ context,
166
+ hasDefault: false,
167
+ isRequired: true,
168
+ confidence: 0.9,
169
+ }));
170
+ }
171
+ // Pattern: viper.AutomaticEnv()
172
+ const autoEnvPattern = /viper\.AutomaticEnv\(\)/g;
173
+ while ((match = autoEnvPattern.exec(source)) !== null) {
174
+ const pos = this.getPosition(source, match.index);
175
+ const context = this.getContext(source, match.index);
176
+ result.accessPoints.push(this.createAccessPoint({
177
+ varName: '__VIPER_AUTO_ENV__',
178
+ method: 'viper',
179
+ file: filePath,
180
+ line: pos.line,
181
+ column: pos.column,
182
+ context,
183
+ hasDefault: true,
184
+ isRequired: false,
185
+ confidence: 0.7,
186
+ }));
187
+ }
188
+ }
189
+ /**
190
+ * Extract envconfig patterns
191
+ */
192
+ extractEnvconfigPatterns(source, filePath, result) {
193
+ // Pattern: envconfig.Process("prefix", &config)
194
+ const processPattern = /envconfig\.Process\(\s*"([a-zA-Z_][a-zA-Z0-9_]*)"\s*,/g;
195
+ let match;
196
+ while ((match = processPattern.exec(source)) !== null) {
197
+ const prefix = match[1];
198
+ if (!prefix)
199
+ continue;
200
+ const pos = this.getPosition(source, match.index);
201
+ const context = this.getContext(source, match.index);
202
+ result.accessPoints.push(this.createAccessPoint({
203
+ varName: `${prefix.toUpperCase()}_*`,
204
+ method: 'envconfig',
205
+ file: filePath,
206
+ line: pos.line,
207
+ column: pos.column,
208
+ context,
209
+ hasDefault: true,
210
+ isRequired: false,
211
+ confidence: 0.8,
212
+ }));
213
+ }
214
+ // Pattern: struct tags `envconfig:"VAR_NAME"`
215
+ const tagPattern = /`[^`]*envconfig:"([A-Z_][A-Z0-9_]*)(?:,([^"]*))?"[^`]*`/g;
216
+ while ((match = tagPattern.exec(source)) !== null) {
217
+ const varName = match[1];
218
+ if (!varName)
219
+ continue;
220
+ const pos = this.getPosition(source, match.index);
221
+ const context = this.getContext(source, match.index);
222
+ const options = match[2] ?? '';
223
+ const isRequired = options.includes('required');
224
+ const hasDefault = options.includes('default');
225
+ result.accessPoints.push(this.createAccessPoint({
226
+ varName,
227
+ method: 'envconfig',
228
+ file: filePath,
229
+ line: pos.line,
230
+ column: pos.column,
231
+ context,
232
+ hasDefault,
233
+ isRequired,
234
+ confidence: 0.95,
235
+ }));
236
+ }
237
+ }
238
+ /**
239
+ * Detect if a default value is provided
240
+ */
241
+ detectDefault(source, matchIndex, matchLength) {
242
+ const afterMatch = source.slice(matchIndex + matchLength, matchIndex + matchLength + 100);
243
+ // Check for if val == "" { val = "default" } pattern
244
+ const ifEmptyMatch = afterMatch.match(/^\s*\)\s*\n?\s*if\s+\w+\s*==\s*""\s*\{\s*\w+\s*=\s*"([^"]*)"/);
245
+ if (ifEmptyMatch) {
246
+ return { hasDefault: true, defaultValue: ifEmptyMatch[1] };
247
+ }
248
+ // Check for inline default: val := os.Getenv("X"); if val == "" { val = "default" }
249
+ // This is harder to detect without full parsing
250
+ return { hasDefault: false };
251
+ }
252
+ /**
253
+ * Get context around a match
254
+ */
255
+ getContext(source, index) {
256
+ const start = Math.max(0, index - 20);
257
+ const end = Math.min(source.length, index + 80);
258
+ return source.slice(start, end).replace(/\n/g, ' ').trim();
259
+ }
260
+ }
261
+ /**
262
+ * Create a Go environment extractor
263
+ */
264
+ export function createGoEnvExtractor() {
265
+ return new GoEnvExtractor();
266
+ }
267
+ //# sourceMappingURL=go-env-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go-env-extractor.js","sourceRoot":"","sources":["../../../src/environment/extractors/go-env-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Environment Variable Extractors
3
+ *
4
+ * Language-specific extractors for detecting environment variable access patterns.
5
+ */
6
+ export { BaseEnvExtractor } from './base-env-extractor.js';
7
+ export { TypeScriptEnvExtractor, createTypeScriptEnvExtractor } from './typescript-env-extractor.js';
8
+ export { PythonEnvExtractor, createPythonEnvExtractor } from './python-env-extractor.js';
9
+ export { JavaEnvExtractor, createJavaEnvExtractor } from './java-env-extractor.js';
10
+ export { CSharpEnvExtractor, createCSharpEnvExtractor } from './csharp-env-extractor.js';
11
+ export { PhpEnvExtractor, createPhpEnvExtractor } from './php-env-extractor.js';
12
+ export { GoEnvExtractor, createGoEnvExtractor } from './go-env-extractor.js';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/environment/extractors/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AACrG,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Environment Variable Extractors
3
+ *
4
+ * Language-specific extractors for detecting environment variable access patterns.
5
+ */
6
+ export { BaseEnvExtractor } from './base-env-extractor.js';
7
+ export { TypeScriptEnvExtractor, createTypeScriptEnvExtractor } from './typescript-env-extractor.js';
8
+ export { PythonEnvExtractor, createPythonEnvExtractor } from './python-env-extractor.js';
9
+ export { JavaEnvExtractor, createJavaEnvExtractor } from './java-env-extractor.js';
10
+ export { CSharpEnvExtractor, createCSharpEnvExtractor } from './csharp-env-extractor.js';
11
+ export { PhpEnvExtractor, createPhpEnvExtractor } from './php-env-extractor.js';
12
+ export { GoEnvExtractor, createGoEnvExtractor } from './go-env-extractor.js';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/environment/extractors/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AACrG,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Java Environment Variable Extractor
3
+ *
4
+ * Extracts environment variable access patterns from Java.
5
+ *
6
+ * Supports:
7
+ * - System.getenv("VAR_NAME")
8
+ * - System.getProperty("VAR_NAME")
9
+ * - @Value("${VAR_NAME}") Spring annotations
10
+ * - @ConfigurationProperties Spring patterns
11
+ * - Environment.getProperty() Spring patterns
12
+ */
13
+ import { BaseEnvExtractor } from './base-env-extractor.js';
14
+ import type { EnvLanguage, EnvExtractionResult } from '../types.js';
15
+ /**
16
+ * Java environment variable extractor
17
+ */
18
+ export declare class JavaEnvExtractor extends BaseEnvExtractor {
19
+ readonly language: EnvLanguage;
20
+ readonly extensions: string[];
21
+ /**
22
+ * Extract environment variable access from Java source
23
+ */
24
+ extract(source: string, filePath: string): EnvExtractionResult;
25
+ /**
26
+ * Extract System.getenv("VAR") patterns
27
+ */
28
+ private extractSystemGetenv;
29
+ /**
30
+ * Extract System.getProperty("VAR") patterns
31
+ */
32
+ private extractSystemGetProperty;
33
+ /**
34
+ * Extract Spring @Value("${VAR}") patterns
35
+ */
36
+ private extractSpringValue;
37
+ /**
38
+ * Extract Spring Environment.getProperty patterns
39
+ */
40
+ private extractSpringEnvironment;
41
+ /**
42
+ * Extract @ConfigurationProperties patterns
43
+ */
44
+ private extractConfigurationProperties;
45
+ /**
46
+ * Detect if a default value is provided via Optional or ternary
47
+ */
48
+ private detectDefault;
49
+ /**
50
+ * Get context around a match
51
+ */
52
+ private getContext;
53
+ }
54
+ /**
55
+ * Create a Java environment extractor
56
+ */
57
+ export declare function createJavaEnvExtractor(): JavaEnvExtractor;
58
+ //# sourceMappingURL=java-env-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"java-env-extractor.d.ts","sourceRoot":"","sources":["../../../src/environment/extractors/java-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,gBAAiB,SAAQ,gBAAgB;IACpD,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAU;IACxC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAa;IAE1C;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,mBAAmB;IA0B9D;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA2B3B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA4BhC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA6B1B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAoChC;;OAEG;IACH,OAAO,CAAC,8BAA8B;IA0BtC;;OAEG;IACH,OAAO,CAAC,aAAa;IAqBrB;;OAEG;IACH,OAAO,CAAC,UAAU;CAKnB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAEzD"}
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Java Environment Variable Extractor
3
+ *
4
+ * Extracts environment variable access patterns from Java.
5
+ *
6
+ * Supports:
7
+ * - System.getenv("VAR_NAME")
8
+ * - System.getProperty("VAR_NAME")
9
+ * - @Value("${VAR_NAME}") Spring annotations
10
+ * - @ConfigurationProperties Spring patterns
11
+ * - Environment.getProperty() Spring patterns
12
+ */
13
+ import { BaseEnvExtractor } from './base-env-extractor.js';
14
+ /**
15
+ * Java environment variable extractor
16
+ */
17
+ export class JavaEnvExtractor extends BaseEnvExtractor {
18
+ language = 'java';
19
+ extensions = ['.java'];
20
+ /**
21
+ * Extract environment variable access from Java source
22
+ */
23
+ extract(source, filePath) {
24
+ const result = this.createEmptyResult(filePath);
25
+ try {
26
+ // Extract System.getenv patterns
27
+ this.extractSystemGetenv(source, filePath, result);
28
+ // Extract System.getProperty patterns
29
+ this.extractSystemGetProperty(source, filePath, result);
30
+ // Extract Spring @Value patterns
31
+ this.extractSpringValue(source, filePath, result);
32
+ // Extract Spring Environment patterns
33
+ this.extractSpringEnvironment(source, filePath, result);
34
+ // Extract @ConfigurationProperties patterns
35
+ this.extractConfigurationProperties(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 System.getenv("VAR") patterns
44
+ */
45
+ extractSystemGetenv(source, filePath, result) {
46
+ // Pattern: System.getenv("VAR_NAME")
47
+ const pattern = /System\.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: 'System.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 System.getProperty("VAR") patterns
71
+ */
72
+ extractSystemGetProperty(source, filePath, result) {
73
+ // Pattern: System.getProperty("property.name") or System.getProperty("property.name", "default")
74
+ const pattern = /System\.getProperty\(\s*"([a-zA-Z_][a-zA-Z0-9_.]*)"(?:\s*,\s*"([^"]*)")?\s*\)/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 defaultValue = match[2];
83
+ const hasDefault = defaultValue !== undefined;
84
+ result.accessPoints.push(this.createAccessPoint({
85
+ varName,
86
+ method: 'System.getProperty',
87
+ file: filePath,
88
+ line: pos.line,
89
+ column: pos.column,
90
+ context,
91
+ hasDefault,
92
+ defaultValue,
93
+ isRequired: !hasDefault,
94
+ }));
95
+ }
96
+ }
97
+ /**
98
+ * Extract Spring @Value("${VAR}") patterns
99
+ */
100
+ extractSpringValue(source, filePath, result) {
101
+ // Pattern: @Value("${VAR_NAME}") or @Value("${VAR_NAME:default}")
102
+ const pattern = /@Value\(\s*"\$\{([a-zA-Z_][a-zA-Z0-9_.]*)(?::([^}]*))?\}"\s*\)/g;
103
+ let match;
104
+ while ((match = pattern.exec(source)) !== null) {
105
+ const varName = match[1];
106
+ if (!varName)
107
+ continue;
108
+ const pos = this.getPosition(source, match.index);
109
+ const context = this.getContext(source, match.index);
110
+ const defaultValue = match[2];
111
+ const hasDefault = defaultValue !== undefined;
112
+ result.accessPoints.push(this.createAccessPoint({
113
+ varName,
114
+ method: '@Value',
115
+ file: filePath,
116
+ line: pos.line,
117
+ column: pos.column,
118
+ context,
119
+ hasDefault,
120
+ defaultValue,
121
+ isRequired: !hasDefault,
122
+ confidence: 0.95,
123
+ }));
124
+ }
125
+ }
126
+ /**
127
+ * Extract Spring Environment.getProperty patterns
128
+ */
129
+ extractSpringEnvironment(source, filePath, result) {
130
+ // Pattern: environment.getProperty("VAR") or env.getProperty("VAR", "default")
131
+ const patterns = [
132
+ /(?:environment|env)\.getProperty\(\s*"([a-zA-Z_][a-zA-Z0-9_.]*)"(?:\s*,\s*"([^"]*)")?\s*\)/gi,
133
+ /(?:environment|env)\.getRequiredProperty\(\s*"([a-zA-Z_][a-zA-Z0-9_.]*)"\s*\)/gi,
134
+ ];
135
+ for (const pattern of patterns) {
136
+ let match;
137
+ const isRequired = pattern.source.includes('Required');
138
+ while ((match = pattern.exec(source)) !== null) {
139
+ const varName = match[1];
140
+ if (!varName)
141
+ continue;
142
+ const pos = this.getPosition(source, match.index);
143
+ const context = this.getContext(source, match.index);
144
+ const defaultValue = match[2];
145
+ const hasDefault = defaultValue !== undefined && !isRequired;
146
+ result.accessPoints.push(this.createAccessPoint({
147
+ varName,
148
+ method: 'Environment',
149
+ file: filePath,
150
+ line: pos.line,
151
+ column: pos.column,
152
+ context,
153
+ hasDefault,
154
+ defaultValue,
155
+ isRequired: isRequired || !hasDefault,
156
+ confidence: 0.9,
157
+ }));
158
+ }
159
+ }
160
+ }
161
+ /**
162
+ * Extract @ConfigurationProperties patterns
163
+ */
164
+ extractConfigurationProperties(source, filePath, result) {
165
+ // Pattern: @ConfigurationProperties(prefix = "app.config")
166
+ const pattern = /@ConfigurationProperties\(\s*(?:prefix\s*=\s*)?"([a-zA-Z_][a-zA-Z0-9_.]*)"\s*\)/g;
167
+ let match;
168
+ while ((match = pattern.exec(source)) !== null) {
169
+ const prefix = match[1];
170
+ if (!prefix)
171
+ continue;
172
+ const pos = this.getPosition(source, match.index);
173
+ const context = this.getContext(source, match.index);
174
+ result.accessPoints.push(this.createAccessPoint({
175
+ varName: `${prefix}.*`,
176
+ method: '@ConfigurationProperties',
177
+ file: filePath,
178
+ line: pos.line,
179
+ column: pos.column,
180
+ context,
181
+ hasDefault: true,
182
+ isRequired: false,
183
+ confidence: 0.85,
184
+ }));
185
+ }
186
+ }
187
+ /**
188
+ * Detect if a default value is provided via Optional or ternary
189
+ */
190
+ detectDefault(source, matchIndex, matchLength) {
191
+ const afterMatch = source.slice(matchIndex + matchLength, matchIndex + matchLength + 100);
192
+ // Check for Optional.ofNullable(...).orElse("default")
193
+ const orElseMatch = afterMatch.match(/^\s*\)\s*\.orElse\(\s*"([^"]*)"\s*\)/);
194
+ if (orElseMatch) {
195
+ return { hasDefault: true, defaultValue: orElseMatch[1] };
196
+ }
197
+ // Check for ternary: != null ? ... : "default"
198
+ const ternaryMatch = afterMatch.match(/^\s*!=\s*null\s*\?\s*[^:]+\s*:\s*"([^"]*)"/);
199
+ if (ternaryMatch) {
200
+ return { hasDefault: true, defaultValue: ternaryMatch[1] };
201
+ }
202
+ return { hasDefault: false };
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 Java environment extractor
215
+ */
216
+ export function createJavaEnvExtractor() {
217
+ return new JavaEnvExtractor();
218
+ }
219
+ //# sourceMappingURL=java-env-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"java-env-extractor.js","sourceRoot":"","sources":["../../../src/environment/extractors/java-env-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
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
+ import type { EnvLanguage, EnvExtractionResult } from '../types.js';
15
+ /**
16
+ * PHP environment variable extractor
17
+ */
18
+ export declare class PhpEnvExtractor extends BaseEnvExtractor {
19
+ readonly language: EnvLanguage;
20
+ readonly extensions: string[];
21
+ /**
22
+ * Extract environment variable access from PHP source
23
+ */
24
+ extract(source: string, filePath: string): EnvExtractionResult;
25
+ /**
26
+ * Extract getenv('VAR') patterns
27
+ */
28
+ private extractGetenv;
29
+ /**
30
+ * Extract $_ENV['VAR'] patterns
31
+ */
32
+ private extractEnvSuperglobal;
33
+ /**
34
+ * Extract $_SERVER['VAR'] patterns (for env vars passed via server)
35
+ */
36
+ private extractServerSuperglobal;
37
+ /**
38
+ * Extract Laravel env('VAR') patterns
39
+ */
40
+ private extractLaravelEnv;
41
+ /**
42
+ * Extract Laravel config('key') patterns
43
+ */
44
+ private extractLaravelConfig;
45
+ /**
46
+ * Detect if a default value is provided via ternary or null coalescing
47
+ */
48
+ private detectDefault;
49
+ /**
50
+ * Get context around a match
51
+ */
52
+ private getContext;
53
+ }
54
+ /**
55
+ * Create a PHP environment extractor
56
+ */
57
+ export declare function createPhpEnvExtractor(): PhpEnvExtractor;
58
+ //# sourceMappingURL=php-env-extractor.d.ts.map