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,285 @@
1
+ /**
2
+ * Base Constant Extractor
3
+ *
4
+ * Abstract base class for hybrid constant extractors that combine
5
+ * tree-sitter (primary) with regex fallback for enterprise-grade coverage.
6
+ *
7
+ * Follows the same pattern as call-graph/extractors/hybrid-extractor-base.ts
8
+ */
9
+ import { DEFAULT_CONSTANT_HYBRID_CONFIG, CONSTANT_EXTRACTION_CONFIDENCE, } from '../types.js';
10
+ /**
11
+ * Abstract base class for hybrid constant extractors
12
+ */
13
+ export class BaseConstantExtractor {
14
+ /** Configuration */
15
+ config;
16
+ constructor(config) {
17
+ this.config = { ...DEFAULT_CONSTANT_HYBRID_CONFIG, ...config };
18
+ }
19
+ /**
20
+ * Check if this extractor can handle a file
21
+ */
22
+ canHandle(filePath) {
23
+ const ext = this.getExtension(filePath);
24
+ return this.extensions.includes(ext);
25
+ }
26
+ /**
27
+ * Extract constants with hybrid approach: tree-sitter first, regex fallback
28
+ */
29
+ extract(source, filePath) {
30
+ const startTime = performance.now();
31
+ // Try tree-sitter first if enabled
32
+ if (this.config.enableTreeSitter) {
33
+ try {
34
+ const treeSitterResult = this.extractWithTreeSitter(source, filePath);
35
+ // If tree-sitter succeeded with good results, return them
36
+ if (treeSitterResult && treeSitterResult.errors.length === 0) {
37
+ const quality = this.createTreeSitterQuality(treeSitterResult, startTime);
38
+ // Check if we got meaningful results
39
+ if (this.hasGoodCoverage(treeSitterResult)) {
40
+ return { ...treeSitterResult, quality };
41
+ }
42
+ }
43
+ // Tree-sitter had errors or poor coverage - try regex fallback
44
+ if (this.config.enableRegexFallback) {
45
+ return this.extractWithFallback(source, filePath, treeSitterResult, startTime);
46
+ }
47
+ // No fallback enabled, return tree-sitter result as-is
48
+ if (treeSitterResult) {
49
+ const quality = this.createTreeSitterQuality(treeSitterResult, startTime);
50
+ return { ...treeSitterResult, quality };
51
+ }
52
+ }
53
+ catch (error) {
54
+ // Tree-sitter failed completely - use regex fallback
55
+ if (this.config.enableRegexFallback) {
56
+ return this.extractWithRegexOnly(source, filePath, startTime, error);
57
+ }
58
+ // No fallback, return error result
59
+ return this.createErrorResult(filePath, error, startTime);
60
+ }
61
+ }
62
+ // Tree-sitter disabled - use regex only
63
+ if (this.config.enableRegexFallback) {
64
+ return this.extractWithRegexOnly(source, filePath, startTime);
65
+ }
66
+ // Nothing enabled - return empty result
67
+ return this.createEmptyResult(filePath, startTime);
68
+ }
69
+ /**
70
+ * Extract with regex fallback, merging with tree-sitter results
71
+ */
72
+ extractWithFallback(source, filePath, treeSitterResult, startTime) {
73
+ // Get regex results
74
+ const regexResult = this.regexExtractor.extract(source, filePath);
75
+ if (!treeSitterResult) {
76
+ // No tree-sitter result - use regex only
77
+ regexResult.quality.extractionTimeMs = performance.now() - startTime;
78
+ return regexResult;
79
+ }
80
+ // Merge results
81
+ const merged = this.mergeResults(treeSitterResult, regexResult);
82
+ // Create merged quality
83
+ const quality = this.createMergedQuality(treeSitterResult, regexResult, startTime);
84
+ return { ...merged, quality };
85
+ }
86
+ /**
87
+ * Extract using regex only
88
+ */
89
+ extractWithRegexOnly(source, filePath, startTime, treeSitterError) {
90
+ const result = this.regexExtractor.extract(source, filePath);
91
+ // Add tree-sitter error to warnings if present
92
+ if (treeSitterError) {
93
+ const errorMsg = treeSitterError instanceof Error
94
+ ? treeSitterError.message
95
+ : 'Tree-sitter unavailable';
96
+ result.quality.warnings.push(`Tree-sitter fallback: ${errorMsg}`);
97
+ }
98
+ result.quality.usedFallback = true;
99
+ result.quality.extractionTimeMs = performance.now() - startTime;
100
+ return result;
101
+ }
102
+ /**
103
+ * Merge tree-sitter and regex results
104
+ */
105
+ mergeResults(primary, fallback) {
106
+ return {
107
+ file: primary.file,
108
+ language: primary.language,
109
+ constants: this.mergeUniqueConstants(primary.constants, fallback.constants),
110
+ enums: this.mergeUniqueEnums(primary.enums, fallback.enums),
111
+ references: this.mergeUniqueReferences(primary.references, fallback.references),
112
+ errors: [...primary.errors],
113
+ quality: primary.quality, // Will be replaced by caller
114
+ };
115
+ }
116
+ /**
117
+ * Merge constants, avoiding duplicates
118
+ */
119
+ mergeUniqueConstants(primary, fallback) {
120
+ const seen = new Set(primary.map((c) => `${c.name}:${c.line}`));
121
+ const result = [...primary];
122
+ for (const constant of fallback) {
123
+ const key = `${constant.name}:${constant.line}`;
124
+ if (!seen.has(key)) {
125
+ seen.add(key);
126
+ result.push(constant);
127
+ }
128
+ }
129
+ return result;
130
+ }
131
+ /**
132
+ * Merge enums, avoiding duplicates
133
+ */
134
+ mergeUniqueEnums(primary, fallback) {
135
+ const seen = new Set(primary.map((e) => `${e.name}:${e.line}`));
136
+ const result = [...primary];
137
+ for (const enumDef of fallback) {
138
+ const key = `${enumDef.name}:${enumDef.line}`;
139
+ if (!seen.has(key)) {
140
+ seen.add(key);
141
+ result.push(enumDef);
142
+ }
143
+ }
144
+ return result;
145
+ }
146
+ /**
147
+ * Merge references, avoiding duplicates
148
+ */
149
+ mergeUniqueReferences(primary, fallback) {
150
+ const seen = new Set(primary.map((r) => `${r.constantId}:${r.line}:${r.column}`));
151
+ const result = [...primary];
152
+ for (const ref of fallback) {
153
+ const key = `${ref.constantId}:${ref.line}:${ref.column}`;
154
+ if (!seen.has(key)) {
155
+ seen.add(key);
156
+ result.push(ref);
157
+ }
158
+ }
159
+ return result;
160
+ }
161
+ /**
162
+ * Check if extraction result has good coverage
163
+ */
164
+ hasGoodCoverage(result) {
165
+ // Consider it good if we found at least some constants or enums
166
+ // or if there were no errors (file might just have no constants)
167
+ return (result.constants.length > 0 ||
168
+ result.enums.length > 0 ||
169
+ result.errors.length === 0);
170
+ }
171
+ /**
172
+ * Create quality metrics for tree-sitter extraction
173
+ */
174
+ createTreeSitterQuality(result, startTime) {
175
+ return {
176
+ method: 'tree-sitter',
177
+ confidence: result.errors.length === 0
178
+ ? CONSTANT_EXTRACTION_CONFIDENCE.TREE_SITTER
179
+ : CONSTANT_EXTRACTION_CONFIDENCE.REGEX,
180
+ coveragePercent: result.errors.length === 0 ? 95 : 70,
181
+ itemsExtracted: result.constants.length + result.enums.length,
182
+ parseErrors: result.errors.length,
183
+ warnings: [],
184
+ usedFallback: false,
185
+ extractionTimeMs: performance.now() - startTime,
186
+ };
187
+ }
188
+ /**
189
+ * Create merged quality metrics
190
+ */
191
+ createMergedQuality(treeSitterResult, regexResult, startTime) {
192
+ const treeSitterItems = treeSitterResult.constants.length + treeSitterResult.enums.length;
193
+ const regexItems = regexResult.constants.length + regexResult.enums.length;
194
+ const totalItems = Math.max(treeSitterItems, regexItems);
195
+ return {
196
+ method: 'hybrid',
197
+ confidence: CONSTANT_EXTRACTION_CONFIDENCE.HYBRID,
198
+ coveragePercent: 90,
199
+ itemsExtracted: totalItems,
200
+ parseErrors: treeSitterResult.errors.length,
201
+ warnings: [
202
+ ...regexResult.quality.warnings,
203
+ `Merged ${treeSitterItems} tree-sitter + ${regexItems} regex items`,
204
+ ],
205
+ usedFallback: true,
206
+ extractionTimeMs: performance.now() - startTime,
207
+ };
208
+ }
209
+ /**
210
+ * Create error result
211
+ */
212
+ createErrorResult(filePath, error, startTime) {
213
+ const errorMsg = error instanceof Error ? error.message : 'Unknown extraction error';
214
+ return {
215
+ file: filePath,
216
+ language: this.language,
217
+ constants: [],
218
+ enums: [],
219
+ references: [],
220
+ errors: [errorMsg],
221
+ quality: {
222
+ method: 'tree-sitter',
223
+ confidence: CONSTANT_EXTRACTION_CONFIDENCE.UNKNOWN,
224
+ coveragePercent: 0,
225
+ itemsExtracted: 0,
226
+ parseErrors: 1,
227
+ warnings: [],
228
+ usedFallback: false,
229
+ extractionTimeMs: performance.now() - startTime,
230
+ },
231
+ };
232
+ }
233
+ /**
234
+ * Create empty result
235
+ */
236
+ createEmptyResult(filePath, startTime) {
237
+ return {
238
+ file: filePath,
239
+ language: this.language,
240
+ constants: [],
241
+ enums: [],
242
+ references: [],
243
+ errors: ['No extraction method available'],
244
+ quality: {
245
+ method: 'tree-sitter',
246
+ confidence: 0,
247
+ coveragePercent: 0,
248
+ itemsExtracted: 0,
249
+ parseErrors: 0,
250
+ warnings: ['No extraction method enabled'],
251
+ usedFallback: false,
252
+ extractionTimeMs: performance.now() - startTime,
253
+ },
254
+ };
255
+ }
256
+ /**
257
+ * Get file extension
258
+ */
259
+ getExtension(filePath) {
260
+ const lastDot = filePath.lastIndexOf('.');
261
+ return lastDot >= 0 ? filePath.slice(lastDot) : '';
262
+ }
263
+ /**
264
+ * Generate constant ID
265
+ */
266
+ generateConstantId(file, name, line) {
267
+ return `${file}:${name}:${line}`;
268
+ }
269
+ /**
270
+ * Create default quality metrics
271
+ */
272
+ createDefaultQuality() {
273
+ return {
274
+ method: 'tree-sitter',
275
+ confidence: CONSTANT_EXTRACTION_CONFIDENCE.TREE_SITTER,
276
+ coveragePercent: 0,
277
+ itemsExtracted: 0,
278
+ parseErrors: 0,
279
+ warnings: [],
280
+ usedFallback: false,
281
+ extractionTimeMs: 0,
282
+ };
283
+ }
284
+ }
285
+ //# sourceMappingURL=base-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-extractor.js","sourceRoot":"","sources":["../../../src/constants/extractors/base-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,OAAO,EACL,8BAA8B,EAC9B,8BAA8B,GAC/B,MAAM,aAAa,CAAC;AAGrB;;GAEG;AACH,MAAM,OAAgB,qBAAqB;IAOzC,oBAAoB;IACV,MAAM,CAAiC;IAKjD,YAAY,MAA6B;QACvC,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,8BAA8B,EAAE,GAAG,MAAM,EAAE,CAAC;IACjE,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,QAAgB;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,MAAc,EAAE,QAAgB;QACtC,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAEpC,mCAAmC;QACnC,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBAEtE,0DAA0D;gBAC1D,IAAI,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;oBAE1E,qCAAqC;oBACrC,IAAI,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,EAAE,CAAC;wBAC3C,OAAO,EAAE,GAAG,gBAAgB,EAAE,OAAO,EAAE,CAAC;oBAC1C,CAAC;gBACH,CAAC;gBAED,+DAA+D;gBAC/D,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;oBACpC,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC;gBACjF,CAAC;gBAED,uDAAuD;gBACvD,IAAI,gBAAgB,EAAE,CAAC;oBACrB,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;oBAC1E,OAAO,EAAE,GAAG,gBAAgB,EAAE,OAAO,EAAE,CAAC;gBAC1C,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,qDAAqD;gBACrD,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;oBACpC,OAAO,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;gBACvE,CAAC;gBAED,mCAAmC;gBACnC,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAChE,CAAC;QAED,wCAAwC;QACxC,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;IAeD;;OAEG;IACK,mBAAmB,CACzB,MAAc,EACd,QAAgB,EAChB,gBAA2C,EAC3C,SAAiB;QAEjB,oBAAoB;QACpB,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAElE,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,yCAAyC;YACzC,WAAW,CAAC,OAAO,CAAC,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACrE,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,gBAAgB;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;QAEhE,wBAAwB;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QAEnF,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACK,oBAAoB,CAC1B,MAAc,EACd,QAAgB,EAChB,SAAiB,EACjB,eAAyB;QAEzB,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE7D,+CAA+C;QAC/C,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,QAAQ,GACZ,eAAe,YAAY,KAAK;gBAC9B,CAAC,CAAC,eAAe,CAAC,OAAO;gBACzB,CAAC,CAAC,yBAAyB,CAAC;YAChC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;QACnC,MAAM,CAAC,OAAO,CAAC,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAEhE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,YAAY,CAClB,OAA2B,EAC3B,QAA4B;QAE5B,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,SAAS,EAAE,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC;YAC3E,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC;YAC3D,UAAU,EAAE,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;YAC/E,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;YAC3B,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,6BAA6B;SACxD,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,oBAAoB,CAC1B,OAA6B,EAC7B,QAA8B;QAE9B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;QAE5B,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,gBAAgB,CACtB,OAAyB,EACzB,QAA0B;QAE1B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;QAE5B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,qBAAqB,CAC3B,OAA4B,EAC5B,QAA6B;QAE7B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAClF,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;QAE5B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAC1D,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,MAA0B;QAChD,gEAAgE;QAChE,iEAAiE;QACjE,OAAO,CACL,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YACvB,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAC3B,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,uBAAuB,CAC7B,MAA0B,EAC1B,SAAiB;QAEjB,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,UAAU,EACR,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;gBACxB,CAAC,CAAC,8BAA8B,CAAC,WAAW;gBAC5C,CAAC,CAAC,8BAA8B,CAAC,KAAK;YAC1C,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YACrD,cAAc,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM;YAC7D,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;YACjC,QAAQ,EAAE,EAAE;YACZ,YAAY,EAAE,KAAK;YACnB,gBAAgB,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS;SAChD,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,mBAAmB,CACzB,gBAAoC,EACpC,WAA+B,EAC/B,SAAiB;QAEjB,MAAM,eAAe,GAAG,gBAAgB,CAAC,SAAS,CAAC,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC;QAC1F,MAAM,UAAU,GAAG,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC;QAC3E,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QAEzD,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE,8BAA8B,CAAC,MAAM;YACjD,eAAe,EAAE,EAAE;YACnB,cAAc,EAAE,UAAU;YAC1B,WAAW,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM;YAC3C,QAAQ,EAAE;gBACR,GAAG,WAAW,CAAC,OAAO,CAAC,QAAQ;gBAC/B,UAAU,eAAe,kBAAkB,UAAU,cAAc;aACpE;YACD,YAAY,EAAE,IAAI;YAClB,gBAAgB,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS;SAChD,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,iBAAiB,CACvB,QAAgB,EAChB,KAAc,EACd,SAAiB;QAEjB,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC;QAErF,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,EAAE;YACT,UAAU,EAAE,EAAE;YACd,MAAM,EAAE,CAAC,QAAQ,CAAC;YAClB,OAAO,EAAE;gBACP,MAAM,EAAE,aAAa;gBACrB,UAAU,EAAE,8BAA8B,CAAC,OAAO;gBAClD,eAAe,EAAE,CAAC;gBAClB,cAAc,EAAE,CAAC;gBACjB,WAAW,EAAE,CAAC;gBACd,QAAQ,EAAE,EAAE;gBACZ,YAAY,EAAE,KAAK;gBACnB,gBAAgB,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS;aAChD;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,QAAgB,EAAE,SAAiB;QAC3D,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,EAAE;YACT,UAAU,EAAE,EAAE;YACd,MAAM,EAAE,CAAC,gCAAgC,CAAC;YAC1C,OAAO,EAAE;gBACP,MAAM,EAAE,aAAa;gBACrB,UAAU,EAAE,CAAC;gBACb,eAAe,EAAE,CAAC;gBAClB,cAAc,EAAE,CAAC;gBACjB,WAAW,EAAE,CAAC;gBACd,QAAQ,EAAE,CAAC,8BAA8B,CAAC;gBAC1C,YAAY,EAAE,KAAK;gBACnB,gBAAgB,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS;aAChD;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACO,YAAY,CAAC,QAAgB;QACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1C,OAAO,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,CAAC;IAED;;OAEG;IACO,kBAAkB,CAAC,IAAY,EAAE,IAAY,EAAE,IAAY;QACnE,OAAO,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;IACnC,CAAC;IAED;;OAEG;IACO,oBAAoB;QAC5B,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,UAAU,EAAE,8BAA8B,CAAC,WAAW;YACtD,eAAe,EAAE,CAAC;YAClB,cAAc,EAAE,CAAC;YACjB,WAAW,EAAE,CAAC;YACd,QAAQ,EAAE,EAAE;YACZ,YAAY,EAAE,KAAK;YACnB,gBAAgB,EAAE,CAAC;SACpB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Base Constant Regex Extractor
3
+ *
4
+ * Abstract base class for regex-based constant extraction.
5
+ * Used as fallback when tree-sitter is unavailable.
6
+ */
7
+ import type { ConstantLanguage, FileConstantResult, ConstantExtraction, EnumExtraction, ConstantKind } from '../../types.js';
8
+ /**
9
+ * Abstract base class for regex-based constant extractors
10
+ */
11
+ export declare abstract class BaseConstantRegexExtractor {
12
+ /** Language this extractor handles */
13
+ abstract readonly language: ConstantLanguage;
14
+ /**
15
+ * Extract constants using regex patterns
16
+ */
17
+ extract(source: string, filePath: string): FileConstantResult;
18
+ /**
19
+ * Extract constants (implemented by subclass)
20
+ */
21
+ protected abstract extractConstants(source: string, filePath: string): ConstantExtraction[];
22
+ /**
23
+ * Extract enums (implemented by subclass)
24
+ */
25
+ protected abstract extractEnums(source: string, filePath: string): EnumExtraction[];
26
+ /**
27
+ * Create quality metrics
28
+ */
29
+ private createQuality;
30
+ /**
31
+ * Generate constant ID
32
+ */
33
+ protected generateId(file: string, name: string, line: number): string;
34
+ /**
35
+ * Get line number from character index
36
+ */
37
+ protected getLineNumber(source: string, index: number): number;
38
+ /**
39
+ * Get column number from character index
40
+ */
41
+ protected getColumnNumber(source: string, index: number): number;
42
+ /**
43
+ * Extract value from a string literal
44
+ */
45
+ protected extractStringValue(raw: string): string;
46
+ /**
47
+ * Extract value from a numeric literal
48
+ */
49
+ protected extractNumericValue(raw: string): number | null;
50
+ /**
51
+ * Determine constant kind from value
52
+ */
53
+ protected inferKind(value: string): ConstantKind;
54
+ /**
55
+ * Check if a name looks like a constant (UPPER_CASE)
56
+ */
57
+ protected isConstantName(name: string): boolean;
58
+ /**
59
+ * Extract doc comment before a line
60
+ */
61
+ protected extractDocComment(source: string, lineIndex: number): string | undefined;
62
+ /**
63
+ * Truncate value for storage (max 500 chars)
64
+ */
65
+ protected truncateValue(value: string, maxLength?: number): string;
66
+ }
67
+ //# sourceMappingURL=base-regex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-regex.d.ts","sourceRoot":"","sources":["../../../../src/constants/extractors/regex/base-regex.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EAEd,YAAY,EACb,MAAM,gBAAgB,CAAC;AAIxB;;GAEG;AACH,8BAAsB,0BAA0B;IAC9C,sCAAsC;IACtC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IAE7C;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,kBAAkB;IAuC7D;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAE3F;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,EAAE;IAEnF;;OAEG;IACH,OAAO,CAAC,aAAa;IAkBrB;;OAEG;IACH,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAItE;;OAEG;IACH,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAK9D;;OAEG;IACH,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAKhE;;OAEG;IACH,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAajD;;OAEG;IACH,SAAS,CAAC,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKzD;;OAEG;IACH,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY;IAyBhD;;OAEG;IACH,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAY/C;;OAEG;IACH,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAsDlF;;OAEG;IACH,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,MAAM;CAMxE"}
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Base Constant Regex Extractor
3
+ *
4
+ * Abstract base class for regex-based constant extraction.
5
+ * Used as fallback when tree-sitter is unavailable.
6
+ */
7
+ import { CONSTANT_EXTRACTION_CONFIDENCE } from '../../types.js';
8
+ import { inferCategory } from '../../analysis/categorizer.js';
9
+ /**
10
+ * Abstract base class for regex-based constant extractors
11
+ */
12
+ export class BaseConstantRegexExtractor {
13
+ /**
14
+ * Extract constants using regex patterns
15
+ */
16
+ extract(source, filePath) {
17
+ const startTime = performance.now();
18
+ const constants = [];
19
+ const enums = [];
20
+ const errors = [];
21
+ try {
22
+ // Extract constants
23
+ const extractedConstants = this.extractConstants(source, filePath);
24
+ constants.push(...extractedConstants);
25
+ // Extract enums
26
+ const extractedEnums = this.extractEnums(source, filePath);
27
+ enums.push(...extractedEnums);
28
+ // Infer categories for constants
29
+ for (const constant of constants) {
30
+ if (constant.category === 'uncategorized') {
31
+ constant.category = inferCategory(constant);
32
+ }
33
+ }
34
+ }
35
+ catch (error) {
36
+ const errorMsg = error instanceof Error ? error.message : 'Unknown regex extraction error';
37
+ errors.push(errorMsg);
38
+ }
39
+ const quality = this.createQuality(constants, enums, errors, startTime);
40
+ return {
41
+ file: filePath,
42
+ language: this.language,
43
+ constants,
44
+ enums,
45
+ references: [], // Regex doesn't track references
46
+ errors,
47
+ quality,
48
+ };
49
+ }
50
+ /**
51
+ * Create quality metrics
52
+ */
53
+ createQuality(constants, enums, errors, startTime) {
54
+ return {
55
+ method: 'regex',
56
+ confidence: errors.length === 0 ? CONSTANT_EXTRACTION_CONFIDENCE.REGEX : 0.5,
57
+ coveragePercent: 75, // Regex typically catches ~75% of constants
58
+ itemsExtracted: constants.length + enums.length,
59
+ parseErrors: errors.length,
60
+ warnings: [],
61
+ usedFallback: true,
62
+ extractionTimeMs: performance.now() - startTime,
63
+ };
64
+ }
65
+ /**
66
+ * Generate constant ID
67
+ */
68
+ generateId(file, name, line) {
69
+ return `${file}:${name}:${line}`;
70
+ }
71
+ /**
72
+ * Get line number from character index
73
+ */
74
+ getLineNumber(source, index) {
75
+ const lines = source.slice(0, index).split('\n');
76
+ return lines.length;
77
+ }
78
+ /**
79
+ * Get column number from character index
80
+ */
81
+ getColumnNumber(source, index) {
82
+ const lastNewline = source.lastIndexOf('\n', index - 1);
83
+ return index - lastNewline;
84
+ }
85
+ /**
86
+ * Extract value from a string literal
87
+ */
88
+ extractStringValue(raw) {
89
+ // Remove quotes
90
+ if ((raw.startsWith('"') && raw.endsWith('"')) ||
91
+ (raw.startsWith("'") && raw.endsWith("'"))) {
92
+ return raw.slice(1, -1);
93
+ }
94
+ // Template literals
95
+ if (raw.startsWith('`') && raw.endsWith('`')) {
96
+ return raw.slice(1, -1);
97
+ }
98
+ return raw;
99
+ }
100
+ /**
101
+ * Extract value from a numeric literal
102
+ */
103
+ extractNumericValue(raw) {
104
+ const num = parseFloat(raw);
105
+ return isNaN(num) ? null : num;
106
+ }
107
+ /**
108
+ * Determine constant kind from value
109
+ */
110
+ inferKind(value) {
111
+ // Check for object literal
112
+ if (value.trim().startsWith('{')) {
113
+ return 'object';
114
+ }
115
+ // Check for array literal
116
+ if (value.trim().startsWith('[')) {
117
+ return 'array';
118
+ }
119
+ // Check for string
120
+ if (value.startsWith('"') || value.startsWith("'") || value.startsWith('`')) {
121
+ return 'primitive';
122
+ }
123
+ // Check for number
124
+ if (/^-?\d+(\.\d+)?$/.test(value.trim())) {
125
+ return 'primitive';
126
+ }
127
+ // Check for boolean
128
+ if (value === 'true' || value === 'false') {
129
+ return 'primitive';
130
+ }
131
+ // Otherwise it's computed
132
+ return 'computed';
133
+ }
134
+ /**
135
+ * Check if a name looks like a constant (UPPER_CASE)
136
+ */
137
+ isConstantName(name) {
138
+ // All uppercase with underscores
139
+ if (/^[A-Z][A-Z0-9_]*$/.test(name)) {
140
+ return true;
141
+ }
142
+ // PascalCase constants (common in C#, Go)
143
+ if (/^[A-Z][a-zA-Z0-9]*$/.test(name)) {
144
+ return true;
145
+ }
146
+ return false;
147
+ }
148
+ /**
149
+ * Extract doc comment before a line
150
+ */
151
+ extractDocComment(source, lineIndex) {
152
+ const lines = source.split('\n');
153
+ if (lineIndex <= 0 || lineIndex > lines.length) {
154
+ return undefined;
155
+ }
156
+ const comments = [];
157
+ let i = lineIndex - 2; // Line before the constant (0-indexed)
158
+ // Look for JSDoc/JavaDoc style comments
159
+ while (i >= 0) {
160
+ const line = lines[i]?.trim();
161
+ if (!line && line !== '')
162
+ break; // undefined check
163
+ // End of block comment
164
+ if (line.endsWith('*/')) {
165
+ // Find start of block comment
166
+ while (i >= 0) {
167
+ const blockLine = lines[i]?.trim();
168
+ if (!blockLine && blockLine !== '')
169
+ break;
170
+ comments.unshift(blockLine);
171
+ if (blockLine.startsWith('/*') || blockLine.startsWith('/**')) {
172
+ break;
173
+ }
174
+ i--;
175
+ }
176
+ break;
177
+ }
178
+ // Single line comment
179
+ if (line.startsWith('//') || line.startsWith('#')) {
180
+ comments.unshift(line);
181
+ i--;
182
+ continue;
183
+ }
184
+ // Empty line or non-comment - stop
185
+ if (line !== '') {
186
+ break;
187
+ }
188
+ i--;
189
+ }
190
+ if (comments.length === 0) {
191
+ return undefined;
192
+ }
193
+ // Clean up the comment
194
+ return comments
195
+ .map(c => c.replace(/^\/\*\*?|\*\/$/g, '').replace(/^\s*\*\s?/g, '').replace(/^\/\/\s?/g, '').replace(/^#\s?/g, '').trim())
196
+ .filter(c => c.length > 0)
197
+ .join('\n');
198
+ }
199
+ /**
200
+ * Truncate value for storage (max 500 chars)
201
+ */
202
+ truncateValue(value, maxLength = 500) {
203
+ if (value.length <= maxLength) {
204
+ return value;
205
+ }
206
+ return value.slice(0, maxLength - 3) + '...';
207
+ }
208
+ }
209
+ //# sourceMappingURL=base-regex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-regex.js","sourceRoot":"","sources":["../../../../src/constants/extractors/regex/base-regex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * C# Constant Regex Extractor
3
+ *
4
+ * Regex-based extraction for C# constants and enums.
5
+ * Used as fallback when tree-sitter is unavailable.
6
+ */
7
+ import type { ConstantExtraction, EnumExtraction } from '../../types.js';
8
+ import { BaseConstantRegexExtractor } from './base-regex.js';
9
+ /**
10
+ * C# constant regex extractor
11
+ */
12
+ export declare class CSharpConstantRegexExtractor extends BaseConstantRegexExtractor {
13
+ readonly language: "csharp";
14
+ /**
15
+ * Extract constants from C# source
16
+ */
17
+ protected extractConstants(source: string, filePath: string): ConstantExtraction[];
18
+ /**
19
+ * Extract enums from C# source
20
+ */
21
+ protected extractEnums(source: string, filePath: string): EnumExtraction[];
22
+ /**
23
+ * Parse C# enum members
24
+ */
25
+ private parseCSharpEnumMembers;
26
+ /**
27
+ * Infer kind from C# value and type
28
+ */
29
+ private inferCSharpKind;
30
+ /**
31
+ * Extract value from C# literal
32
+ */
33
+ private extractCSharpValue;
34
+ /**
35
+ * Find the containing class/struct name
36
+ */
37
+ private findContainingClass;
38
+ }
39
+ //# sourceMappingURL=csharp-regex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csharp-regex.d.ts","sourceRoot":"","sources":["../../../../src/constants/extractors/regex/csharp-regex.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAClB,cAAc,EAGf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAE7D;;GAEG;AACH,qBAAa,4BAA6B,SAAQ,0BAA0B;IAC1E,QAAQ,CAAC,QAAQ,EAAG,QAAQ,CAAU;IAEtC;;OAEG;IACH,SAAS,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,kBAAkB,EAAE;IA8GlF;;OAEG;IACH,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,EAAE;IA4C1E;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAyD9B;;OAEG;IACH,OAAO,CAAC,eAAe;IAuCvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA+D1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAU5B"}